1 | const Hapi = require("hapi");
|
2 | import { EventBus } from "./lib/eventBus";
|
3 | import { createHistory as createInMemoryHistory } from "./lib/InMemoryEventHistory";
|
4 | import * as jobs from "./lib/jobs";
|
5 | import logger from "./lib/logger";
|
6 | import { ClientConfig, load } from "./lib/clientConfig";
|
7 | import { install as installHttpsEnforcement } from "./server/forceHttps";
|
8 | import { install as installRoutes } from "./server/routes";
|
9 | import { install as installLogging } from "./server/logging";
|
10 | import { install as installBasicAuth } from "./server/basicAuth";
|
11 |
|
12 | const installAssetHandling = async (
|
13 | environment: string,
|
14 | server: any,
|
15 | clientConfig: ClientConfig
|
16 | ) => {
|
17 | if (environment === "development") {
|
18 | const devMiddleware = await import("@dashbling/build-support/webpackDevMiddleware");
|
19 | return devMiddleware.install(server, clientConfig);
|
20 | } else {
|
21 | const compiledAssets = await import("./server/compiledAssets");
|
22 | return compiledAssets.install(server, clientConfig.projectPath);
|
23 | }
|
24 | };
|
25 |
|
26 | const createEventHistory = (config: ClientConfig) => {
|
27 | if (config.eventHistory instanceof Promise) {
|
28 | return config.eventHistory;
|
29 | }
|
30 |
|
31 | if (config.eventHistory === false) {
|
32 | return createInMemoryHistory();
|
33 | }
|
34 |
|
35 | throw new Error(`Invalid eventHistory: ${config.eventHistory}`);
|
36 | };
|
37 |
|
38 | export const start = async (projectPath: string, eventBus?: EventBus) => {
|
39 | const clientConfig: ClientConfig = load(projectPath);
|
40 | const environment = process.env.NODE_ENV || "production";
|
41 |
|
42 | const history = await createEventHistory(clientConfig);
|
43 | eventBus = eventBus || new EventBus(history);
|
44 |
|
45 | const server = new Hapi.Server({
|
46 | port: clientConfig.port
|
47 | });
|
48 |
|
49 | installLogging(server);
|
50 | installHttpsEnforcement(server, clientConfig);
|
51 | await installBasicAuth(server, clientConfig);
|
52 | await installAssetHandling(environment, server, clientConfig);
|
53 | installRoutes(server, eventBus, clientConfig);
|
54 |
|
55 | const sendEvent = eventBus.publish.bind(eventBus);
|
56 | jobs.start(clientConfig, sendEvent);
|
57 | clientConfig.onStart(sendEvent);
|
58 |
|
59 | await server.initialize();
|
60 | await server.start();
|
61 |
|
62 | logger.info("Server running at: %s", server.info.uri);
|
63 | return server;
|
64 | };
|