UNPKG

6.8 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10Object.defineProperty(exports, "__esModule", { value: true });
11const debug = require("debug");
12const express = require("express");
13const expressSession = require("express-session");
14const http_1 = require("http");
15const neweb_core_1 = require("neweb-core");
16const neweb_pack_1 = require("neweb-pack");
17const server_1 = require("neweb-react/server");
18const neweb_server_1 = require("neweb-server");
19const path_1 = require("path");
20const SessionFileStore = require("session-file-store");
21const SocketIO = require("socket.io");
22const ExpressHttpHandler_1 = require("./ExpressHttpHandler");
23const ModulesServer_1 = require("./ModulesServer");
24const PageRenderer_1 = require("./neweb-components/server/PageRenderer");
25const SessionsManager_1 = require("./SessionsManager");
26const SocketIOClient_1 = require("./SocketIOClient");
27class ServerBootstrap {
28 constructor(config) {
29 this.config = config;
30 this.engine = "neweb";
31 this.engine = this.config.engine || "neweb";
32 }
33 start() {
34 return __awaiter(this, void 0, void 0, function* () {
35 const rootPath = this.config.rootPath;
36 const port = this.config.port;
37 const env = this.config.env;
38 // settings
39 const appPath = path_1.resolve(path_1.join(rootPath, "app"));
40 const modulesPath = path_1.join(appPath, "..", "modules");
41 const sessionsPath = path_1.join(appPath, "..", "sessions");
42 // logs
43 if (env === "development") {
44 debug.enable("*,-engine:*,-engine,-socket.io-parser,-socket.io:*");
45 }
46 const expressApp = this.config.expressApp ? this.config.expressApp : express();
47 // neweb-pack
48 const modulePacker = new neweb_pack_1.ModulePacker({
49 appRoot: appPath,
50 excludedModules: ["react", "react-dom", "neweb", "neweb-components"],
51 modulesPath,
52 REQUIRE_FUNC_NAME: neweb_core_1.REQUIRE_FUNC_NAME,
53 disableCacheForLocalModules: env === "development",
54 webpackConfig: {
55 module: {
56 rules: [{
57 test: /\.html$/,
58 use: [{
59 loader: require.resolve("html-loader"),
60 options: {
61 minimize: true,
62 },
63 }],
64 }],
65 },
66 },
67 });
68 // create app
69 const app = new neweb_server_1.Application({
70 appDir: appPath,
71 env,
72 modulePacker,
73 });
74 yield app.init();
75 const appConfig = yield app.getConfig();
76 const sessionsFileStore = SessionFileStore(expressSession);
77 const sessionsStorage = new sessionsFileStore({
78 path: sessionsPath,
79 retries: 1,
80 ttl: appConfig.session.ttl || 86400 * 100000,
81 });
82 const session = expressSession({
83 secret: appConfig.session.secret,
84 saveUninitialized: true,
85 resave: true,
86 store: sessionsStorage,
87 });
88 // static
89 expressApp.use(express.static(path_1.resolve(path_1.join(appPath, "public"))));
90 expressApp.get("/bundle." + env + ".js", (_, res) => res.sendFile(path_1.resolve(path_1.join(__dirname, "..", "dist", "bundle." + env + "." + this.engine + ".js"))));
91 const sessionsManager = new SessionsManager_1.default({
92 sessionsPath,
93 sessionsStorage,
94 });
95 const seancesManager = new neweb_server_1.SeancesManager({
96 app,
97 sessionsManager,
98 });
99 // neweb
100 const pageRenderer = this.engine === "react" ? new server_1.ServerPageRenderer({
101 app,
102 }) : new PageRenderer_1.default({
103 app,
104 });
105 const server = new neweb_server_1.Server({
106 app,
107 seancesManager,
108 pageRenderer,
109 });
110 const modulesServer = new ModulesServer_1.default({
111 modulesPath,
112 });
113 expressApp.get("/modules/:type/:name/:version.js", modulesServer.handle);
114 const expressHandler = new ExpressHttpHandler_1.default({
115 app: expressApp,
116 server,
117 });
118 expressApp.use(session, expressHandler.handle);
119 const httpServer = http_1.createServer(expressApp);
120 // Setup SocketIO
121 const io = SocketIO();
122 io.use((socket, next) => {
123 session(socket.request, socket.request.res, next);
124 });
125 io.on("connection", (socket) => {
126 socket.on(neweb_core_1.RemoteMessageType.Initialize, ({ seanceId }) => __awaiter(this, void 0, void 0, function* () {
127 const socketClient = new SocketIOClient_1.default({
128 socket,
129 seanceId,
130 });
131 const request = yield socketClient.getRequest();
132 server.connectClient({
133 seanceId,
134 client: socketClient,
135 request,
136 });
137 }));
138 });
139 io.attach(httpServer);
140 // Start listening
141 httpServer.listen(port, (err) => {
142 if (err) {
143 debug("http")("Error server starting", err);
144 process.exit(1);
145 return;
146 }
147 debug("http")("Http server at port ", port);
148 });
149 });
150 }
151}
152exports.default = ServerBootstrap;