UNPKG

reiso

Version:
153 lines 11.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const React = require("react"); const mobx_react_1 = require("mobx-react"); const ReactDOMServer = require("react-dom/server"); const react_router_1 = require("react-router"); const ApolloReact = require("react-apollo"); const ApolloClient = require("apollo-client"); const ApolloCache = require("apollo-cache-inmemory"); const react_helmet_1 = require("react-helmet"); const apollo_link_batch_http_1 = require("apollo-link-batch-http"); const ApolloLink = require("apollo-link"); const Config_1 = require("../Modules/Config"); const Translation = require("../Modules/Translation"); const Router = require("../Modules/Router"); const Model = require("../Modules/Model"); const ServerHook_1 = require("../Modules/ServerHook"); const Log = require("../Modules/Log"); const Translation_1 = require("./Lib/Translation"); async function checkInteruptHook(req, res, next, stores, context, hooksRes) { for (let hook of ServerHook_1.getHooksRender()) { let hookRes = await hook(req, res, next, context, stores); if (!hookRes) return false; hooksRes.push(hookRes); } return true; } exports.checkInteruptHook = checkInteruptHook; function genLink(hooksRes) { const linkNetwork = new apollo_link_batch_http_1.BatchHttpLink({ uri: `http://${Config_1.getConfig().host}:${Config_1.getConfig().globalPort}/graphql`, }); let links = []; hooksRes.forEach(hook => { if (hook.linksBefore) links = links.concat(hook.linksBefore); }); links = links.concat(linkNetwork); hooksRes.forEach(hook => { if (hook.linksAfter) links = links.concat(hook.linksAfter); }); // TODO: Error processing // const linkError = onError(({ graphQLErrors, networkError, operation }) => { // if (graphQLErrors) { // graphQLErrors.map(({ message, locations, path }) => { // console.error( // `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`, // ); // store.dispatch(Header.setNotification({ // id: 'GraphQLError', // title: operation.operationName ? `Server has sended an error: ${operation.operationName}` : `Server has sended an error`, // message: `Message: ${message}`, // type: 'error' // })); // }); // } // if (networkError) { // console.error(`[Network error]: ${networkError}`); // store.dispatch(Header.setNotification({ // id: 'NetworkError', // title: operation.operationName ? `Network error: ${operation.operationName}` : `Network error`, // message: networkError.message, // type: 'error' // })); // } // }); // const link = linkError.concat(ApolloLink.ApolloLink.from(links)); let link = ApolloLink.ApolloLink.from(links); hooksRes.forEach(hook => { if (hook.linksWrap) link = hook.linksWrap.concat(link); }); return link; } exports.genLink = genLink; async function Render(req, res, next, language) { const context = { language: language || Translation.getLanguage() }; const stores = Model.getStores(); const hooksRes = []; if (!await checkInteruptHook(req, res, next, stores, context, hooksRes)) return; Translation_1.setLanguageContext(context); const link = genLink(hooksRes); const cache = new ApolloCache.InMemoryCache(); const gqlClient = new ApolloClient.ApolloClient({ link, cache, ssrMode: true, queryDeduplication: true, defaultOptions: { watchQuery: { fetchPolicy: 'cache-and-network', errorPolicy: 'ignore', }, query: { fetchPolicy: 'cache-and-network', errorPolicy: 'all', }, mutate: { errorPolicy: 'all' } } }); const Html = Router.GetHtml(); const component = (React.createElement(ApolloReact.ApolloProvider, { client: gqlClient }, React.createElement(mobx_react_1.Provider, Object.assign({}, stores), React.createElement(react_router_1.StaticRouter, { location: req.url, context: {} }, React.createElement(Html, { client: gqlClient, language: context.language }, Router.GetRoutes(stores, context.language)))))); // TODO: Fix server rendering with context (Fixed & need to test) let html; try { html = await ApolloReact.renderToStringWithData(component); // await ApolloReact.getDataFromTree(component); } catch (e) { Log.logError(e, { type: "server_render" }); html = ReactDOMServer.renderToString(component); } // html = ReactDOMServer.renderToString(component); const helmet = react_helmet_1.Helmet.renderStatic(); res.status(200); res.send(` <!doctype html> <html ${helmet.htmlAttributes.toString()}> <head> <meta charset="utf-8"/> ${helmet.title.toString()} ${helmet.meta.toString()} ${helmet.link.toString()} <script type="application/javascript"> window.__INITIAL_STATE__ = ${JSON.stringify(Model.serialize(stores))}; window.__TRANSLATION__ = ${JSON.stringify(Translation.getTranslation())}; window.__LANGUAGES__ = ${JSON.stringify(Translation.getLanguages())}; window.__LANGUAGE__ = "${context.language}"; window.__CONTEXT__ = ${JSON.stringify(context)}; window.__HOST__ = "${Config_1.getConfig().host}"; window.__WSADDRESS__ = ${Config_1.getConfig().globalPortWS}; window.__APOLLO_STATE__ = ${JSON.stringify(cache.extract())}; </script> </head> <body ${helmet.bodyAttributes.toString()}> <div style="min-height: 100vh; display: flex; flex-flow: column" id="body">${html}</div> <script src="/index.js"></script> </body> </html> `); } exports.Render = Render; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1NlcnZlci9SZW5kZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsK0JBQStCO0FBQy9CLDJDQUFzQztBQUN0QyxtREFBbUQ7QUFDbkQsK0NBQTRDO0FBQzVDLDRDQUE0QztBQUM1Qyw4Q0FBOEM7QUFDOUMscURBQXFEO0FBQ3JELCtDQUFzQztBQUN0QyxtRUFBdUQ7QUFDdkQsMENBQTBDO0FBSTFDLDhDQUE4QztBQUM5QyxzREFBc0Q7QUFDdEQsNENBQTRDO0FBQzVDLDBDQUEwQztBQUMxQyxzREFBNkQ7QUFDN0Qsc0NBQXNDO0FBQ3RDLG1EQUF1RDtBQUVoRCxLQUFLLDRCQUE0QixHQUFvQixFQUFFLEdBQXFCLEVBQUUsSUFBMEIsRUFBRSxNQUFXLEVBQUUsT0FBTyxFQUFFLFFBQWdCO0lBQ3JKLEtBQUssSUFBSSxJQUFJLElBQUksMkJBQWMsRUFBRSxFQUFFO1FBQ2pDLElBQUksT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFWRCw4Q0FVQztBQUVELGlCQUF3QixRQUFlO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLElBQUksc0NBQWEsQ0FBQztRQUNwQyxHQUFHLEVBQUUsVUFBVSxrQkFBUyxFQUFFLENBQUMsSUFBSSxJQUFJLGtCQUFTLEVBQUUsQ0FBQyxVQUFVLFVBQVU7S0FDcEUsQ0FBQyxDQUFDO0lBRUgsSUFBSSxLQUFLLEdBQTRCLEVBQUUsQ0FBQztJQUV4QyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3RCLElBQUks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