From 1a2dc40a93291bf9a68c3bb350a61e0a3977f8ac Mon Sep 17 00:00:00 2001 From: valzav <i@valzav.com> Date: Sun, 8 Oct 2017 16:25:58 -0400 Subject: [PATCH] cache onchain data in server render --- src/db/redis.js | 2 +- src/server/app_render.jsx | 10 +++++++++- src/shared/UniversalRender.jsx | 23 +++++++++++++++++++---- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/db/redis.js b/src/db/redis.js index c1f7405fb..eacf468fc 100644 --- a/src/db/redis.js +++ b/src/db/redis.js @@ -28,7 +28,7 @@ class Redis { if (err) { reject(err); } else { - resolve(res[0] === '{' ? JSON.parse(res) : res); + resolve(res && res.length > 0 && res[0] === '{' ? JSON.parse(res) : res); } }); this.client[call_name].apply(this.client, args); diff --git a/src/server/app_render.jsx b/src/server/app_render.jsx index 05a1171f5..7c7d70e1f 100644 --- a/src/server/app_render.jsx +++ b/src/server/app_render.jsx @@ -1,6 +1,7 @@ import React from 'react'; import { renderToString } from 'react-dom/server'; import Tarantool from 'db/tarantool'; +import Redis from 'db/redis'; import ServerHTML from './server-html'; import universalRender from '../shared/UniversalRender'; import models from 'db/models'; @@ -84,7 +85,14 @@ async function appRender(ctx) { } } - const { body, title, statusCode, meta } = await universalRender({location: ctx.request.url, store, offchain, ErrorPage, tarantool: Tarantool.instance()}); + const { body, title, statusCode, meta } = await universalRender({ + location: ctx.request.url, + store, + offchain, + ErrorPage, + tarantool: Tarantool.instance(), + redis: Redis.instance() + }); // Assets name are found in `webpack-stats` file const assets_filename = ROOT + (process.env.NODE_ENV === 'production' ? '/tmp/webpack-stats-prod.json' : '/tmp/webpack-stats-dev.json'); diff --git a/src/shared/UniversalRender.jsx b/src/shared/UniversalRender.jsx index e70af7ba0..9b84cba00 100644 --- a/src/shared/UniversalRender.jsx +++ b/src/shared/UniversalRender.jsx @@ -27,7 +27,6 @@ import Translator from 'app/Translator'; import {notificationsArrayToMap} from 'app/utils/Notifications'; import {routeRegex} from "app/ResolveRoute"; import {contentStats} from 'app/utils/StateFunctions' - import {api} from 'steem'; const sagaMiddleware = createSagaMiddleware( @@ -59,7 +58,7 @@ const onRouterError = (error) => { console.error('onRouterError', error); }; -async function universalRender({ location, initial_state, offchain, ErrorPage, tarantool }) { +async function universalRender({ location, initial_state, offchain, ErrorPage, tarantool, redis }) { let error, redirect, renderProps; try { [error, redirect, renderProps] = await runRouter(location, RootRoute); @@ -119,7 +118,14 @@ async function universalRender({ location, initial_state, offchain, ErrorPage, t if (url.indexOf('/curation-rewards') !== -1) url = url.replace(/\/curation-rewards$/, '/transfers'); if (url.indexOf('/author-rewards') !== -1) url = url.replace(/\/author-rewards$/, '/transfers'); - onchain = await api.getStateAsync(url); + try { + onchain = await redis.get(url); + } catch (error) { + } + if (!onchain) { + onchain = await api.getStateAsync(url); + redis.set(url, onchain); + } if (Object.getOwnPropertyNames(onchain.accounts).length === 0 && (url.match(routeRegex.UserProfile1) || url.match(routeRegex.UserProfile3))) { // protect for invalid account return { @@ -141,7 +147,16 @@ async function universalRender({ location, initial_state, offchain, ErrorPage, t if (!url.match(routeRegex.PostsIndex) && !url.match(routeRegex.UserProfile1) && !url.match(routeRegex.UserProfile2) && url.match(routeRegex.PostNoCategory)) { const params = url.substr(2, url.length - 1).split("/"); - const content = await api.getContentAsync(params[0], params[1]); + const content_key = `content/${params[0]}/${params[1]}`; + let content; + try { + content = await redis.get(content_key); + } catch (error) { + } + if (!content) { + content = await api.getContentAsync(params[0], params[1]); + redis.set(content_key, content); + } if (content.author && content.permlink) { // valid short post url onchain.content[url.substr(2, url.length - 1)] = content; } else { // protect on invalid user pages (i.e /user/transferss) -- GitLab