UNPKG

neweb

Version:

[![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage percentage][coveralls-image]][coveralls-url] [![experimental](http://badges.github.io/stability-badges/dist/ex

112 lines (111 loc) 5.32 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const PageRenderer_1 = require("./PageRenderer"); const seances_1 = require("./seances"); const sessions_1 = require("./sessions"); function onHttpRequest(store, req, response) { return __awaiter(this, void 0, void 0, function* () { const requestId = (+new Date()).toString() + Math.floor(Math.random() * 10000).toString(); yield store.setObject("http-request", requestId, { type: "object", objectType: "app", id: "default", }, req); yield store.setObject("http-response", requestId, { type: "object", objectType: "app", id: "default", }, response); const request = { cookies: req.cookies || {}, headers: req.headers || {}, hostname: req.hostname, url: req.url, clientIpAddress: req.ip, }; yield store.create("request", requestId, { type: "object", objectType: "http-request", id: requestId, }, request); yield onRequest(store, requestId); }); } exports.onHttpRequest = onHttpRequest; /** * Схема работы: * Получаем контекст сессии, который нужен для работы роутера * Создаем новый класс роутера, передаем в него запрос и ждем, когда появится маршрут * Очищаем роутер, он больше не понадобится * Если тип маршрута - NotFound или Redirect, то посылаем соответствующий ответ клиенту (404 или 302) * Создаем новый сеанс (Seans) и загружаем в него страницу, ждем формирования страницы * С помощью серверного рендеринга получаем код страницы в виде html-строки * Заполняем шаблон ответа кодом страницы, мета-информацией и информацией о сеансе * Отправляем ответ клиенту */ function onRequest(store, requestId) { return __awaiter(this, void 0, void 0, function* () { const request = yield store.get("request", requestId); // get session's context const sessionId = yield sessions_1.resolveSessionIdByRequest(store, request); const sesionContext = yield sessions_1.getSessionContext(store, { type: "data", dataType: "request", id: requestId, }, sessionId); const app = yield store.getObject("app", "default"); // get current route const RouterClass = yield app.getRouterClass(); const router = new RouterClass({ context: yield app.getContext(), session: sesionContext, request, }); router.navigate({ request }); const route = yield router.waitRoute(); router.dispose(); // Handling route const res = yield store.getObject("http-response", requestId); // Handling route if (route.type === "redirect") { res.header("location", route.url); res.sendStatus(302); return; } if (route.type === "notFound") { res.status(404).send(route.text); return; } // handling route of page // create new seans with RoutePage const seanceId = yield seances_1.createSeance(store, { sessionId, request }); yield seances_1.loadSeancePage(store, seanceId, route.page); // get info about seance const seanceDump = { seanceId, page: yield store.get("seance-current-page", seanceId), }; const page = seanceDump.page; // render page on server const pageRenderer = new PageRenderer_1.default({ app, }); const { html } = yield pageRenderer.render(seanceDump.page); const filledHtml = yield app.fillTemplate(html, { title: page.title, meta: page.meta }, seanceDump); // Add session info to response yield sessions_1.enrichResponseForSession(store, sessionId, res); // send html and seans'es info to client res.status(200).send(filledHtml); yield store.removeObject("http-request", requestId); yield store.removeObject("http-response", requestId); }); } exports.onRequest = onRequest;