1 | "use strict";
|
2 | var __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 | };
|
10 | Object.defineProperty(exports, "__esModule", { value: true });
|
11 | const debug = require("debug");
|
12 | const express = require("express");
|
13 | const expressSession = require("express-session");
|
14 | const http_1 = require("http");
|
15 | const neweb_core_1 = require("neweb-core");
|
16 | const neweb_pack_1 = require("neweb-pack");
|
17 | const server_1 = require("neweb-react/server");
|
18 | const neweb_server_1 = require("neweb-server");
|
19 | const path_1 = require("path");
|
20 | const SessionFileStore = require("session-file-store");
|
21 | const SocketIO = require("socket.io");
|
22 | const ExpressHttpHandler_1 = require("./ExpressHttpHandler");
|
23 | const ModulesServer_1 = require("./ModulesServer");
|
24 | const PageRenderer_1 = require("./neweb-components/server/PageRenderer");
|
25 | const SessionsManager_1 = require("./SessionsManager");
|
26 | const SocketIOClient_1 = require("./SocketIOClient");
|
27 | class 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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 | }
|
152 | exports.default = ServerBootstrap;
|