@proteinjs/server 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/generated/index.d.ts +1 -1
- package/dist/generated/index.d.ts.map +1 -1
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/Request.d.ts +13 -0
- package/dist/src/Request.d.ts.map +1 -0
- package/dist/src/Request.js +47 -0
- package/dist/src/Request.js.map +1 -0
- package/dist/src/loadRoutes.d.ts.map +1 -1
- package/dist/src/loadRoutes.js +145 -103
- package/dist/src/loadRoutes.js.map +1 -1
- package/dist/src/startServer.js +52 -44
- package/dist/src/startServer.js.map +1 -1
- package/generated/index.ts +1 -1
- package/index.ts +1 -0
- package/package.json +7 -7
- package/src/Request.ts +50 -0
- package/src/loadRoutes.ts +80 -49
- package/src/startServer.ts +39 -45
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.7.0](https://github.com/proteinjs/server/compare/@proteinjs/server@1.6.1...@proteinjs/server@1.7.0) (2024-08-16)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* added `Request` to track request metadata in an async_hook ([c87cb0a](https://github.com/proteinjs/server/commit/c87cb0aaf1da85f36ca560e8e2c5e062bb98bf1c))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
# [1.6.0](https://github.com/proteinjs/server/compare/@proteinjs/server@1.5.3...@proteinjs/server@1.6.0) (2024-08-02)
|
|
7
18
|
|
|
8
19
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** Load Dependency Source Graphs */
|
|
2
2
|
import '@pmmmwh/react-refresh-webpack-plugin';
|
|
3
|
+
import '@proteinjs/logger';
|
|
3
4
|
import '@proteinjs/reflection';
|
|
4
5
|
import '@proteinjs/server-api';
|
|
5
|
-
import '@proteinjs/util';
|
|
6
6
|
import '@proteinjs/util-node';
|
|
7
7
|
import 'body-parser';
|
|
8
8
|
import 'buffer';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,OAAO,sCAAsC,CAAC;AAC9C,OAAO,mBAAmB,CAAC;AAC3B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,aAAa,CAAC;AACrB,OAAO,QAAQ,CAAC;AAChB,OAAO,eAAe,CAAC;AACvB,OAAO,mBAAmB,CAAC;AAC3B,OAAO,YAAY,CAAC;AACpB,OAAO,QAAQ,CAAC;AAChB,OAAO,SAAS,CAAC;AACjB,OAAO,iBAAiB,CAAC;AACzB,OAAO,aAAa,CAAC;AACrB,OAAO,UAAU,CAAC;AAClB,OAAO,gBAAgB,CAAC;AACxB,OAAO,iBAAiB,CAAC;AACzB,OAAO,SAAS,CAAC;AACjB,OAAO,OAAO,CAAC;AACf,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,0BAA0B,CAAC;AAClC,OAAO,WAAW,CAAC;AACnB,OAAO,mBAAmB,CAAC;AAC3B,OAAO,cAAc,CAAC;AACtB,OAAO,WAAW,CAAC;AACnB,OAAO,YAAY,CAAC;AACpB,OAAO,KAAK,CAAC;AACb,OAAO,MAAM,CAAC;AACd,OAAO,SAAS,CAAC;AACjB,OAAO,wBAAwB,CAAC;AAChC,OAAO,wBAAwB,CAAC;AA6BhC,cAAc,UAAU,CAAC"}
|
package/dist/generated/index.js
CHANGED
|
@@ -16,9 +16,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
};
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
require("@pmmmwh/react-refresh-webpack-plugin");
|
|
19
|
+
require("@proteinjs/logger");
|
|
19
20
|
require("@proteinjs/reflection");
|
|
20
21
|
require("@proteinjs/server-api");
|
|
21
|
-
require("@proteinjs/util");
|
|
22
22
|
require("@proteinjs/util-node");
|
|
23
23
|
require("body-parser");
|
|
24
24
|
require("buffer");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;AAEpC,gDAA8C;AAC9C,iCAA+B;AAC/B,iCAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;AAEpC,gDAA8C;AAC9C,6BAA2B;AAC3B,iCAA+B;AAC/B,iCAA+B;AAC/B,gCAA8B;AAC9B,uBAAqB;AACrB,kBAAgB;AAChB,yBAAuB;AACvB,6BAA2B;AAC3B,sBAAoB;AACpB,kBAAgB;AAChB,mBAAiB;AACjB,2BAAyB;AACzB,uBAAqB;AACrB,oBAAkB;AAClB,0BAAwB;AACxB,2BAAyB;AACzB,mBAAiB;AACjB,iBAAe;AACf,wBAAsB;AACtB,yBAAuB;AACvB,oCAAkC;AAClC,qBAAmB;AACnB,6BAA2B;AAC3B,wBAAsB;AACtB,qBAAmB;AACnB,sBAAoB;AACpB,eAAa;AACb,gBAAc;AACd,mBAAiB;AACjB,kCAAgC;AAChC,kCAAgC;AAGhC,4BAA4B;AAE5B,IAAM,WAAW,GAAG,g/MAAg/M,CAAC;AAGrgN,4BAA4B;AAE5B,sEAAqE;AACrE,wEAAuE;AACvE,4CAAmD;AACnD,yDAAwD;AAExD,IAAM,WAAW,GAAG;IACnB,yCAAyC,EAAE,6CAAqB;IAChE,0CAA0C,EAAE,+CAAsB;IAClE,oCAAoC,EAAE,2BAAgB;IACtD,+BAA+B,EAAE,yBAAW;CAC5C,CAAC;AAGF,kCAAkC;AAElC,oDAAyD;AACzD,6BAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAGjD,2CAAyB"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./src/startServer"), exports);
|
|
18
18
|
__exportStar(require("./src/envCache"), exports);
|
|
19
|
+
__exportStar(require("./src/Request"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,iDAA+B;AAC/B,gDAA8B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RequestMetadata = {
|
|
2
|
+
number: number;
|
|
3
|
+
id: string;
|
|
4
|
+
url: string;
|
|
5
|
+
};
|
|
6
|
+
export declare class Request {
|
|
7
|
+
private static HOOK_INITIALIZED;
|
|
8
|
+
private static readonly REQUEST_METADATA;
|
|
9
|
+
setMetadata(data: RequestMetadata): void;
|
|
10
|
+
getMetadata(): RequestMetadata;
|
|
11
|
+
private initHook;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=Request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/Request.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAS;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAEjF,WAAW,CAAC,IAAI,EAAE,eAAe;IAYjC,WAAW,IAAI,eAAe;IAQ9B,OAAO,CAAC,QAAQ;CAiBjB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Request = void 0;
|
|
7
|
+
var async_hooks_1 = __importDefault(require("async_hooks"));
|
|
8
|
+
var Request = /** @class */ (function () {
|
|
9
|
+
function Request() {
|
|
10
|
+
}
|
|
11
|
+
Request.prototype.setMetadata = function (data) {
|
|
12
|
+
if (!Request.HOOK_INITIALIZED) {
|
|
13
|
+
this.initHook();
|
|
14
|
+
}
|
|
15
|
+
if (Request.REQUEST_METADATA[async_hooks_1.default.executionAsyncId()]) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
Request.REQUEST_METADATA[async_hooks_1.default.executionAsyncId()] = data;
|
|
19
|
+
};
|
|
20
|
+
Request.prototype.getMetadata = function () {
|
|
21
|
+
if (!Request.HOOK_INITIALIZED) {
|
|
22
|
+
this.initHook();
|
|
23
|
+
}
|
|
24
|
+
return Request.REQUEST_METADATA[async_hooks_1.default.executionAsyncId()];
|
|
25
|
+
};
|
|
26
|
+
Request.prototype.initHook = function () {
|
|
27
|
+
async_hooks_1.default
|
|
28
|
+
.createHook({
|
|
29
|
+
init: function (asyncId, type, triggerAsyncId, resource) {
|
|
30
|
+
if (!Request.REQUEST_METADATA[triggerAsyncId]) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
Request.REQUEST_METADATA[asyncId] = Request.REQUEST_METADATA[triggerAsyncId];
|
|
34
|
+
},
|
|
35
|
+
destroy: function (asyncId) {
|
|
36
|
+
delete Request.REQUEST_METADATA[asyncId];
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
.enable();
|
|
40
|
+
Request.HOOK_INITIALIZED = true;
|
|
41
|
+
};
|
|
42
|
+
Request.HOOK_INITIALIZED = false;
|
|
43
|
+
Request.REQUEST_METADATA = {};
|
|
44
|
+
return Request;
|
|
45
|
+
}());
|
|
46
|
+
exports.Request = Request;
|
|
47
|
+
//# sourceMappingURL=Request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Request.js","sourceRoot":"","sources":["../../src/Request.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAqC;AAQrC;IAAA;IAyCA,CAAC;IArCC,6BAAW,GAAX,UAAY,IAAqB;QAC/B,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;QAED,IAAI,OAAO,CAAC,gBAAgB,CAAC,qBAAU,CAAC,gBAAgB,EAAE,CAAC,EAAE;YAC3D,OAAO;SACR;QAED,OAAO,CAAC,gBAAgB,CAAC,qBAAU,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,CAAC;IACjE,CAAC;IAED,6BAAW,GAAX;QACE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;QAED,OAAO,OAAO,CAAC,gBAAgB,CAAC,qBAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACjE,CAAC;IAEO,0BAAQ,GAAhB;QACE,qBAAU;aACP,UAAU,CAAC;YACV,IAAI,EAAE,UAAC,OAAe,EAAE,IAAY,EAAE,cAAsB,EAAE,QAAgB;gBAC5E,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE;oBAC7C,OAAO;iBACR;gBAED,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,EAAE,UAAC,OAAe;gBACvB,OAAO,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC;aACD,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAClC,CAAC;IAvCc,wBAAgB,GAAG,KAAK,CAAC;IAChB,wBAAgB,GAAsC,EAAE,CAAC;IAuCnF,cAAC;CAAA,AAzCD,IAyCC;AAzCY,0BAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadRoutes.d.ts","sourceRoot":"","sources":["../../src/loadRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,KAAK,EAKN,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"loadRoutes.d.ts","sourceRoot":"","sources":["../../src/loadRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,KAAK,EAKN,MAAM,uBAAuB,CAAC;AAQ/B,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,QA4BxF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,QAalG"}
|
package/dist/src/loadRoutes.js
CHANGED
|
@@ -40,17 +40,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
40
40
|
};
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
42
|
exports.loadDefaultStarRoute = exports.loadRoutes = void 0;
|
|
43
|
-
var
|
|
43
|
+
var crypto_1 = __importDefault(require("crypto"));
|
|
44
44
|
var server_api_1 = require("@proteinjs/server-api");
|
|
45
45
|
var reactApp_1 = require("./routes/reactApp");
|
|
46
|
-
var
|
|
47
|
-
var
|
|
46
|
+
var logger_1 = require("@proteinjs/logger");
|
|
47
|
+
var Request_1 = require("./Request");
|
|
48
|
+
var logger = new logger_1.Logger({ name: 'Server' });
|
|
49
|
+
var requestCounter = 0;
|
|
48
50
|
function loadRoutes(routes, server, config) {
|
|
49
51
|
var starRoute = null;
|
|
50
52
|
var wildcardRoutes = [];
|
|
51
53
|
for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {
|
|
52
54
|
var route = routes_1[_i];
|
|
53
|
-
logger.info("Loading route: ".concat(route.path));
|
|
55
|
+
logger.info({ message: "Loading route: ".concat(route.path) });
|
|
54
56
|
if (route.path == '*') {
|
|
55
57
|
starRoute = route;
|
|
56
58
|
continue;
|
|
@@ -82,7 +84,7 @@ function loadDefaultStarRoute(routes, server, config) {
|
|
|
82
84
|
}
|
|
83
85
|
if (!starRouteSpecified && (((_a = config.staticContent) === null || _a === void 0 ? void 0 : _a.bundlePaths) || ((_b = config.staticContent) === null || _b === void 0 ? void 0 : _b.bundlesDir))) {
|
|
84
86
|
var reactApp = (0, reactApp_1.createReactApp)(config);
|
|
85
|
-
server[reactApp.method](reactApp.path, wrapRoute(reactApp.onRequest, config));
|
|
87
|
+
server[reactApp.method](reactApp.path, wrapRoute(reactApp.onRequest.bind(reactApp), config));
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
90
|
exports.loadDefaultStarRoute = loadDefaultStarRoute;
|
|
@@ -91,116 +93,74 @@ function getPath(path) {
|
|
|
91
93
|
}
|
|
92
94
|
function wrapRoute(route, config) {
|
|
93
95
|
return function (request, response, next) {
|
|
94
|
-
var _a;
|
|
95
96
|
return __awaiter(this, void 0, void 0, function () {
|
|
96
|
-
var
|
|
97
|
-
return __generator(this, function (
|
|
98
|
-
switch (
|
|
97
|
+
var requestNumber, requestId, sessionData, _i, _a, sessionDataCache, _b, _c, message, error_1, message;
|
|
98
|
+
return __generator(this, function (_d) {
|
|
99
|
+
switch (_d.label) {
|
|
99
100
|
case 0:
|
|
100
101
|
if (response.locals['responseHandled']) {
|
|
101
102
|
next();
|
|
102
103
|
return [2 /*return*/];
|
|
103
104
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
105
|
+
requestNumber = ++requestCounter;
|
|
106
|
+
requestId = crypto_1.default.randomBytes(8).toString('hex');
|
|
107
|
+
// Set metadata into request async-hook storage
|
|
108
|
+
new Request_1.Request().setMetadata({
|
|
109
|
+
number: requestNumber,
|
|
110
|
+
id: requestId,
|
|
111
|
+
url: request.originalUrl,
|
|
112
|
+
});
|
|
113
|
+
sessionData = { sessionId: request.sessionID, user: request.user, data: {} };
|
|
114
|
+
_i = 0, _a = (0, server_api_1.getSessionDataCaches)();
|
|
115
|
+
_d.label = 1;
|
|
113
116
|
case 1:
|
|
114
|
-
|
|
115
|
-
|
|
117
|
+
if (!(_i < _a.length)) return [3 /*break*/, 4];
|
|
118
|
+
sessionDataCache = _a[_i];
|
|
119
|
+
_b = sessionData.data;
|
|
120
|
+
_c = sessionDataCache.key;
|
|
121
|
+
return [4 /*yield*/, sessionDataCache.create(sessionData.sessionId, sessionData.user)];
|
|
116
122
|
case 2:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
_g.label = 3;
|
|
123
|
+
_b[_c] = _d.sent();
|
|
124
|
+
_d.label = 3;
|
|
120
125
|
case 3:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
_c = sessionData.data;
|
|
124
|
-
_d = sessionDataCache.key;
|
|
125
|
-
return [4 /*yield*/, sessionDataCache.create(sessionData.sessionId, sessionData.user)];
|
|
126
|
+
_i++;
|
|
127
|
+
return [3 /*break*/, 1];
|
|
126
128
|
case 4:
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
server_api_1.Session.setData(sessionData);
|
|
130
|
+
if (shouldLogRequest(request, config)) {
|
|
131
|
+
message = "Started ".concat(request.originalUrl);
|
|
132
|
+
if (process.env.DEVELOPMENT) {
|
|
133
|
+
message = "[#".concat(requestNumber, "] ").concat(message);
|
|
134
|
+
}
|
|
135
|
+
logger.info({ message: message });
|
|
136
|
+
}
|
|
137
|
+
return [4 /*yield*/, runBeforeRequestListeners(request, response)];
|
|
129
138
|
case 5:
|
|
130
|
-
|
|
131
|
-
|
|
139
|
+
_d.sent();
|
|
140
|
+
setRequestTimeout(request, config, requestNumber);
|
|
141
|
+
_d.label = 6;
|
|
132
142
|
case 6:
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
_e = 0, requestListeners_1 = requestListeners;
|
|
136
|
-
_g.label = 7;
|
|
143
|
+
_d.trys.push([6, 8, , 9]);
|
|
144
|
+
return [4 /*yield*/, route(request, response)];
|
|
137
145
|
case 7:
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (!listener.beforeRequest) {
|
|
141
|
-
return [3 /*break*/, 11];
|
|
142
|
-
}
|
|
143
|
-
_g.label = 8;
|
|
146
|
+
_d.sent();
|
|
147
|
+
return [3 /*break*/, 9];
|
|
144
148
|
case 8:
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
error_1 = _d.sent();
|
|
150
|
+
console.error(error_1);
|
|
151
|
+
return [3 /*break*/, 9];
|
|
147
152
|
case 9:
|
|
148
|
-
|
|
149
|
-
return [
|
|
153
|
+
response.locals['responseHandled'] = true;
|
|
154
|
+
return [4 /*yield*/, runAfterRequestListeners(request, response)];
|
|
150
155
|
case 10:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return [3 /*break*/, 7];
|
|
157
|
-
case 12:
|
|
158
|
-
sixtyMinutes = 1000 * 60 * 60;
|
|
159
|
-
timeout = typeof ((_a = config.request) === null || _a === void 0 ? void 0 : _a.timeoutMs) !== 'undefined' ? config.request.timeoutMs : sixtyMinutes;
|
|
160
|
-
request.setTimeout(timeout, function () {
|
|
161
|
-
if (response.locals.requestNumber) {
|
|
162
|
-
logger.warn("[#".concat(response.locals.requestNumber, "] Timed out ").concat(request.originalUrl));
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
logger.warn("Timed out ".concat(request.originalUrl));
|
|
156
|
+
_d.sent();
|
|
157
|
+
if (shouldLogRequest(request, config)) {
|
|
158
|
+
message = "Finished ".concat(request.originalUrl);
|
|
159
|
+
if (process.env.DEVELOPMENT) {
|
|
160
|
+
message = "[#".concat(requestNumber, "] ").concat(message);
|
|
166
161
|
}
|
|
167
|
-
|
|
168
|
-
_g.label = 13;
|
|
169
|
-
case 13:
|
|
170
|
-
_g.trys.push([13, 15, , 16]);
|
|
171
|
-
return [4 /*yield*/, route(request, response)];
|
|
172
|
-
case 14:
|
|
173
|
-
_g.sent();
|
|
174
|
-
return [3 /*break*/, 16];
|
|
175
|
-
case 15:
|
|
176
|
-
error_2 = _g.sent();
|
|
177
|
-
console.error(error_2);
|
|
178
|
-
return [3 /*break*/, 16];
|
|
179
|
-
case 16:
|
|
180
|
-
response.locals['responseHandled'] = true;
|
|
181
|
-
_f = 0, requestListeners_2 = requestListeners;
|
|
182
|
-
_g.label = 17;
|
|
183
|
-
case 17:
|
|
184
|
-
if (!(_f < requestListeners_2.length)) return [3 /*break*/, 22];
|
|
185
|
-
listener = requestListeners_2[_f];
|
|
186
|
-
if (!listener.afterRequest) {
|
|
187
|
-
return [3 /*break*/, 21];
|
|
162
|
+
logger.info({ message: message });
|
|
188
163
|
}
|
|
189
|
-
_g.label = 18;
|
|
190
|
-
case 18:
|
|
191
|
-
_g.trys.push([18, 20, , 21]);
|
|
192
|
-
return [4 /*yield*/, listener.afterRequest(request, response)];
|
|
193
|
-
case 19:
|
|
194
|
-
_g.sent();
|
|
195
|
-
return [3 /*break*/, 21];
|
|
196
|
-
case 20:
|
|
197
|
-
error_3 = _g.sent();
|
|
198
|
-
logger.error("Caught error when running listener after request", error_3);
|
|
199
|
-
return [3 /*break*/, 21];
|
|
200
|
-
case 21:
|
|
201
|
-
_f++;
|
|
202
|
-
return [3 /*break*/, 17];
|
|
203
|
-
case 22:
|
|
204
164
|
next();
|
|
205
165
|
return [2 /*return*/];
|
|
206
166
|
}
|
|
@@ -208,12 +168,94 @@ function wrapRoute(route, config) {
|
|
|
208
168
|
});
|
|
209
169
|
};
|
|
210
170
|
}
|
|
211
|
-
function
|
|
212
|
-
var
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
171
|
+
function shouldLogRequest(request, config) {
|
|
172
|
+
var _a;
|
|
173
|
+
if ((_a = config.request) === null || _a === void 0 ? void 0 : _a.disableRequestLogging) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
if (request.path.startsWith('/static') || request.path.startsWith('/favicon.ico')) {
|
|
177
|
+
return false;
|
|
216
178
|
}
|
|
217
|
-
return
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
function setRequestTimeout(request, config, requestNumber) {
|
|
182
|
+
var _a;
|
|
183
|
+
var sixtyMinutes = 1000 * 60 * 60;
|
|
184
|
+
var timeout = typeof ((_a = config.request) === null || _a === void 0 ? void 0 : _a.timeoutMs) !== 'undefined' ? config.request.timeoutMs : sixtyMinutes;
|
|
185
|
+
request.setTimeout(timeout, function () {
|
|
186
|
+
var message = "Timed out ".concat(request.originalUrl);
|
|
187
|
+
if (process.env.DEVELOPMENT) {
|
|
188
|
+
message = "[#".concat(requestNumber, "] ").concat(message);
|
|
189
|
+
}
|
|
190
|
+
logger.warn({ message: message });
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function runBeforeRequestListeners(request, response) {
|
|
194
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
195
|
+
var requestListeners, _i, requestListeners_1, listener, error_2;
|
|
196
|
+
return __generator(this, function (_a) {
|
|
197
|
+
switch (_a.label) {
|
|
198
|
+
case 0:
|
|
199
|
+
requestListeners = (0, server_api_1.getRequestListeners)();
|
|
200
|
+
_i = 0, requestListeners_1 = requestListeners;
|
|
201
|
+
_a.label = 1;
|
|
202
|
+
case 1:
|
|
203
|
+
if (!(_i < requestListeners_1.length)) return [3 /*break*/, 6];
|
|
204
|
+
listener = requestListeners_1[_i];
|
|
205
|
+
if (!listener.beforeRequest) {
|
|
206
|
+
return [3 /*break*/, 5];
|
|
207
|
+
}
|
|
208
|
+
_a.label = 2;
|
|
209
|
+
case 2:
|
|
210
|
+
_a.trys.push([2, 4, , 5]);
|
|
211
|
+
return [4 /*yield*/, listener.beforeRequest(request, response)];
|
|
212
|
+
case 3:
|
|
213
|
+
_a.sent();
|
|
214
|
+
return [3 /*break*/, 5];
|
|
215
|
+
case 4:
|
|
216
|
+
error_2 = _a.sent();
|
|
217
|
+
logger.error({ message: "Caught error when running listener before request", error: error_2 });
|
|
218
|
+
return [3 /*break*/, 5];
|
|
219
|
+
case 5:
|
|
220
|
+
_i++;
|
|
221
|
+
return [3 /*break*/, 1];
|
|
222
|
+
case 6: return [2 /*return*/];
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
function runAfterRequestListeners(request, response) {
|
|
228
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
229
|
+
var requestListeners, _i, requestListeners_2, listener, error_3;
|
|
230
|
+
return __generator(this, function (_a) {
|
|
231
|
+
switch (_a.label) {
|
|
232
|
+
case 0:
|
|
233
|
+
requestListeners = (0, server_api_1.getRequestListeners)();
|
|
234
|
+
_i = 0, requestListeners_2 = requestListeners;
|
|
235
|
+
_a.label = 1;
|
|
236
|
+
case 1:
|
|
237
|
+
if (!(_i < requestListeners_2.length)) return [3 /*break*/, 6];
|
|
238
|
+
listener = requestListeners_2[_i];
|
|
239
|
+
if (!listener.afterRequest) {
|
|
240
|
+
return [3 /*break*/, 5];
|
|
241
|
+
}
|
|
242
|
+
_a.label = 2;
|
|
243
|
+
case 2:
|
|
244
|
+
_a.trys.push([2, 4, , 5]);
|
|
245
|
+
return [4 /*yield*/, listener.afterRequest(request, response)];
|
|
246
|
+
case 3:
|
|
247
|
+
_a.sent();
|
|
248
|
+
return [3 /*break*/, 5];
|
|
249
|
+
case 4:
|
|
250
|
+
error_3 = _a.sent();
|
|
251
|
+
logger.error({ message: "Caught error when running listener after request", error: error_3 });
|
|
252
|
+
return [3 /*break*/, 5];
|
|
253
|
+
case 5:
|
|
254
|
+
_i++;
|
|
255
|
+
return [3 /*break*/, 1];
|
|
256
|
+
case 6: return [2 /*return*/];
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
});
|
|
218
260
|
}
|
|
219
261
|
//# sourceMappingURL=loadRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadRoutes.js","sourceRoot":"","sources":["../../src/loadRoutes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"loadRoutes.js","sourceRoot":"","sources":["../../src/loadRoutes.ts"],"names":[],"mappings":"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"}
|
package/dist/src/startServer.js
CHANGED
|
@@ -53,10 +53,10 @@ var http_1 = require("http");
|
|
|
53
53
|
var socket_io_1 = require("socket.io");
|
|
54
54
|
var server_api_1 = require("@proteinjs/server-api");
|
|
55
55
|
var loadRoutes_1 = require("./loadRoutes");
|
|
56
|
-
var
|
|
56
|
+
var logger_1 = require("@proteinjs/logger");
|
|
57
57
|
var nodeModulesPath_1 = require("./nodeModulesPath");
|
|
58
58
|
var staticContentPath = '/static/';
|
|
59
|
-
var logger = new
|
|
59
|
+
var logger = new logger_1.Logger({ name: 'Server' });
|
|
60
60
|
var app = (0, express_1.default)();
|
|
61
61
|
var server = new http_1.Server(app);
|
|
62
62
|
exports.io = new socket_io_1.Server(server);
|
|
@@ -71,11 +71,11 @@ function startServer(config) {
|
|
|
71
71
|
routes = (0, server_api_1.getRoutes)();
|
|
72
72
|
configureRequests(app);
|
|
73
73
|
initializeHotReloading(app, config);
|
|
74
|
+
configureSession(app, config);
|
|
74
75
|
beforeRequest(app, config);
|
|
75
76
|
(0, loadRoutes_1.loadRoutes)(routes.filter(function (route) { return route.useHttp; }), app, config);
|
|
76
77
|
configureHttps(app); // registering here forces static content to be redirected to https
|
|
77
|
-
configureStaticContentRouter(app, config);
|
|
78
|
-
configureSession(app, config);
|
|
78
|
+
configureStaticContentRouter(app, config);
|
|
79
79
|
(0, loadRoutes_1.loadRoutes)(routes.filter(function (route) { return !route.useHttp; }), app, config);
|
|
80
80
|
globalData = {};
|
|
81
81
|
_i = 0, _a = (0, server_api_1.getGlobalDataCaches)();
|
|
@@ -101,11 +101,11 @@ function startServer(config) {
|
|
|
101
101
|
case 6:
|
|
102
102
|
_d.sent();
|
|
103
103
|
if (!config.onStartup) return [3 /*break*/, 8];
|
|
104
|
-
logger.info("Starting ServerConfig.onStartup");
|
|
104
|
+
logger.info({ message: "Starting ServerConfig.onStartup" });
|
|
105
105
|
return [4 /*yield*/, config.onStartup()];
|
|
106
106
|
case 7:
|
|
107
107
|
_d.sent();
|
|
108
|
-
logger.info("Finished ServerConfig.onStartup");
|
|
108
|
+
logger.info({ message: "Finished ServerConfig.onStartup" });
|
|
109
109
|
_d.label = 8;
|
|
110
110
|
case 8:
|
|
111
111
|
start(server, config);
|
|
@@ -129,23 +129,27 @@ function runStartupTasks(when) {
|
|
|
129
129
|
if (filteredTasks.length === 0) {
|
|
130
130
|
return [2 /*return*/];
|
|
131
131
|
}
|
|
132
|
-
logger.info(
|
|
132
|
+
logger.info({
|
|
133
|
+
message: "Starting ".concat(filteredTasks.length, " `").concat(when, "` startup task").concat(filteredTasks.length > 1 ? 's' : ''),
|
|
134
|
+
});
|
|
133
135
|
return [4 /*yield*/, Promise.all(filteredTasks.map(function (task) { return __awaiter(_this, void 0, void 0, function () {
|
|
134
136
|
return __generator(this, function (_a) {
|
|
135
137
|
switch (_a.label) {
|
|
136
138
|
case 0:
|
|
137
|
-
logger.info("Starting task: ".concat(task.name));
|
|
139
|
+
logger.info({ message: "Starting task: ".concat(task.name) });
|
|
138
140
|
return [4 /*yield*/, task.run()];
|
|
139
141
|
case 1:
|
|
140
142
|
_a.sent();
|
|
141
|
-
logger.info("Finished task: ".concat(task.name));
|
|
143
|
+
logger.info({ message: "Finished task: ".concat(task.name) });
|
|
142
144
|
return [2 /*return*/];
|
|
143
145
|
}
|
|
144
146
|
});
|
|
145
147
|
}); }))];
|
|
146
148
|
case 1:
|
|
147
149
|
_a.sent();
|
|
148
|
-
logger.info(
|
|
150
|
+
logger.info({
|
|
151
|
+
message: "Finished ".concat(filteredTasks.length, " `").concat(when, "` startup task").concat(filteredTasks.length > 1 ? 's' : ''),
|
|
152
|
+
});
|
|
149
153
|
return [2 /*return*/];
|
|
150
154
|
}
|
|
151
155
|
});
|
|
@@ -191,7 +195,7 @@ function configureHttps(app) {
|
|
|
191
195
|
next();
|
|
192
196
|
return;
|
|
193
197
|
}
|
|
194
|
-
logger.debug("Redirecting to https: ".concat(request.headers.host + request.url));
|
|
198
|
+
logger.debug({ message: "Redirecting to https: ".concat(request.headers.host + request.url) });
|
|
195
199
|
response.redirect('https://' + request.headers.host + request.url);
|
|
196
200
|
});
|
|
197
201
|
}
|
|
@@ -201,7 +205,9 @@ function configureStaticContentRouter(app, config) {
|
|
|
201
205
|
return;
|
|
202
206
|
}
|
|
203
207
|
app.use(staticContentPath, express_1.default.static(config.staticContent.staticContentDir));
|
|
204
|
-
logger.info(
|
|
208
|
+
logger.info({
|
|
209
|
+
message: "Serving static content on path: ".concat(staticContentPath, ", serving from directory: ").concat(config.staticContent.staticContentDir),
|
|
210
|
+
});
|
|
205
211
|
}
|
|
206
212
|
function configureSession(app, config) {
|
|
207
213
|
var sixtyDays = 1000 * 60 * 60 * 24 * 60;
|
|
@@ -241,7 +247,7 @@ function initializeAuthentication(authenticate) {
|
|
|
241
247
|
return __generator(this, function (_a) {
|
|
242
248
|
switch (_a.label) {
|
|
243
249
|
case 0:
|
|
244
|
-
logger.info("Authenticating");
|
|
250
|
+
logger.info({ message: "Authenticating" });
|
|
245
251
|
return [4 /*yield*/, authenticate(username, password)];
|
|
246
252
|
case 1:
|
|
247
253
|
result = _a.sent();
|
|
@@ -261,42 +267,44 @@ function initializeAuthentication(authenticate) {
|
|
|
261
267
|
});
|
|
262
268
|
}
|
|
263
269
|
function beforeRequest(app, config) {
|
|
270
|
+
var _this = this;
|
|
264
271
|
var _a, _b, _c;
|
|
265
|
-
var requestCounter = 0;
|
|
266
272
|
if (((_a = config.request) === null || _a === void 0 ? void 0 : _a.disableRequestLogging) == false || typeof ((_b = config.request) === null || _b === void 0 ? void 0 : _b.disableRequestLogging) === 'undefined') {
|
|
267
|
-
app.use(function (request, response, next) {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
273
|
+
app.use(function (request, response, next) { return __awaiter(_this, void 0, void 0, function () {
|
|
274
|
+
return __generator(this, function (_a) {
|
|
275
|
+
switch (_a.label) {
|
|
276
|
+
case 0:
|
|
277
|
+
if (!config.authenticate) return [3 /*break*/, 2];
|
|
278
|
+
return [4 /*yield*/, new Promise(function (resolve, reject) {
|
|
279
|
+
passport_1.default.authenticate('local', function (err, user, info) {
|
|
280
|
+
if (err) {
|
|
281
|
+
reject(err);
|
|
282
|
+
}
|
|
283
|
+
resolve();
|
|
284
|
+
})(request, response, next);
|
|
285
|
+
})];
|
|
286
|
+
case 1:
|
|
287
|
+
_a.sent();
|
|
288
|
+
_a.label = 2;
|
|
289
|
+
case 2:
|
|
290
|
+
next();
|
|
291
|
+
return [2 /*return*/];
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}); });
|
|
277
295
|
}
|
|
278
296
|
if ((_c = config.request) === null || _c === void 0 ? void 0 : _c.beforeRequest) {
|
|
279
297
|
app.use(config.request.beforeRequest);
|
|
280
298
|
}
|
|
281
299
|
}
|
|
282
300
|
function afterRequest(app, config) {
|
|
283
|
-
var _a
|
|
301
|
+
var _a;
|
|
284
302
|
if ((_a = config.request) === null || _a === void 0 ? void 0 : _a.afterRequest) {
|
|
285
303
|
app.use(config.request.afterRequest);
|
|
286
304
|
}
|
|
287
|
-
if (((_b = config.request) === null || _b === void 0 ? void 0 : _b.disableRequestLogging) == false || typeof ((_c = config.request) === null || _c === void 0 ? void 0 : _c.disableRequestLogging) === 'undefined') {
|
|
288
|
-
app.use(function (request, response, next) {
|
|
289
|
-
if (request.path.startsWith('/static') || request.path.startsWith('/favicon.ico')) {
|
|
290
|
-
next();
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
logger.info("[#".concat(response.locals.requestNumber, "] Finished ").concat(request.originalUrl));
|
|
294
|
-
next();
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
305
|
}
|
|
298
306
|
function initializeSocketIO(io, app) {
|
|
299
|
-
var
|
|
307
|
+
var socketLogger = new logger_1.Logger({ name: 'SocketIOServer' });
|
|
300
308
|
// Share session and passport middleware with Socket.IO
|
|
301
309
|
var wrapMiddleware = function (middleware) { return function (socket, next) { return middleware(socket.request, {}, next); }; };
|
|
302
310
|
var sessionMiddleware = app.get('sessionMiddleware');
|
|
@@ -315,34 +323,34 @@ function initializeSocketIO(io, app) {
|
|
|
315
323
|
// Initialize Socket.IO event handlers
|
|
316
324
|
io.on('connection', function (socket) {
|
|
317
325
|
var userInfo = "".concat(socket.request.user, " (").concat(socket.id, ")");
|
|
318
|
-
|
|
326
|
+
socketLogger.info({ message: "User connected: ".concat(userInfo) });
|
|
319
327
|
// Map this socket to the session id so it can be closed when the session is destroyed
|
|
320
328
|
var sessionId = socket.request.sessionID;
|
|
321
329
|
if (sessionId) {
|
|
322
330
|
socket.join(sessionId);
|
|
323
331
|
}
|
|
324
332
|
socket.on('disconnect', function (reason) {
|
|
325
|
-
|
|
333
|
+
socketLogger.info({ message: "User disconnected: ".concat(userInfo, ". Reason: ").concat(reason) });
|
|
326
334
|
});
|
|
327
335
|
socket.on('error', function (error) {
|
|
328
|
-
|
|
336
|
+
socketLogger.error({ message: "Socket error for user: ".concat(userInfo), error: error });
|
|
329
337
|
});
|
|
330
338
|
socket.conn.on('error', function (error) {
|
|
331
|
-
|
|
339
|
+
socketLogger.error({ message: "Socket connection error for user: ".concat(userInfo), error: error });
|
|
332
340
|
});
|
|
333
341
|
});
|
|
334
342
|
// Handle server-level errors
|
|
335
|
-
io.engine.on('connection_error', function (
|
|
336
|
-
|
|
343
|
+
io.engine.on('connection_error', function (error) {
|
|
344
|
+
socketLogger.error({ message: 'Connection error', error: error });
|
|
337
345
|
});
|
|
338
346
|
}
|
|
339
347
|
function start(server, config) {
|
|
340
348
|
var port = config.port ? config.port : 3000;
|
|
341
349
|
server.listen(port, function () {
|
|
342
350
|
if (process.env.DEVELOPMENT) {
|
|
343
|
-
logger.info("Starting in development mode");
|
|
351
|
+
logger.info({ message: "Starting in development mode" });
|
|
344
352
|
}
|
|
345
|
-
logger.info("Server listening on port: ".concat(port));
|
|
353
|
+
logger.info({ message: "Server listening on port: ".concat(port) });
|
|
346
354
|
});
|
|
347
355
|
}
|
|
348
356
|
//# sourceMappingURL=startServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startServer.js","sourceRoot":"","sources":["../../src/startServer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAA8B;AAC9B,oEAA6C;AAC7C,gEAAyC;AACzC,4DAAqC;AACrC,sDAAgC;AAChC,kEAA2C;AAC3C,oDAA8B;AAC9B,kFAA0D;AAC1D,kFAA0D;AAC1D,6BAA6D;AAC7D,uCAA6D;AAC7D,oDAQ+B;AAC/B,2CAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"startServer.js","sourceRoot":"","sources":["../../src/startServer.ts"],"names":[],"mappings":"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"}
|
package/generated/index.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/** Load Dependency Source Graphs */
|
|
2
2
|
|
|
3
3
|
import '@pmmmwh/react-refresh-webpack-plugin';
|
|
4
|
+
import '@proteinjs/logger';
|
|
4
5
|
import '@proteinjs/reflection';
|
|
5
6
|
import '@proteinjs/server-api';
|
|
6
|
-
import '@proteinjs/util';
|
|
7
7
|
import '@proteinjs/util-node';
|
|
8
8
|
import 'body-parser';
|
|
9
9
|
import 'buffer';
|
package/index.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proteinjs/server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "A server impl",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@pmmmwh/react-refresh-webpack-plugin": "0.5.11",
|
|
25
|
-
"@proteinjs/
|
|
26
|
-
"@proteinjs/
|
|
27
|
-
"@proteinjs/
|
|
28
|
-
"@proteinjs/util-node": "1.
|
|
25
|
+
"@proteinjs/logger": "1.0.1",
|
|
26
|
+
"@proteinjs/reflection": "1.1.8",
|
|
27
|
+
"@proteinjs/server-api": "^1.4.2",
|
|
28
|
+
"@proteinjs/util-node": "1.4.0",
|
|
29
29
|
"body-parser": "1.19.0",
|
|
30
30
|
"buffer": "6.0.3",
|
|
31
31
|
"cookie-parser": "1.4.5",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"webpack-hot-middleware": "2.26.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@proteinjs/reflection-build": "1.0.
|
|
58
|
+
"@proteinjs/reflection-build": "1.0.23",
|
|
59
59
|
"@types/body-parser": "1.19.0",
|
|
60
60
|
"@types/cookie-parser": "1.4.2",
|
|
61
61
|
"@types/express": "4.17.7",
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
},
|
|
75
75
|
"main": "./dist/generated/index.js",
|
|
76
76
|
"types": "./dist/generated/index.d.ts",
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "a99fe86adf96be6b52c0740dba3b4c49b47468a5"
|
|
78
78
|
}
|
package/src/Request.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import asyncHooks from 'async_hooks';
|
|
2
|
+
|
|
3
|
+
export type RequestMetadata = {
|
|
4
|
+
number: number;
|
|
5
|
+
id: string;
|
|
6
|
+
url: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export class Request {
|
|
10
|
+
private static HOOK_INITIALIZED = false;
|
|
11
|
+
private static readonly REQUEST_METADATA: { [id: string]: RequestMetadata } = {};
|
|
12
|
+
|
|
13
|
+
setMetadata(data: RequestMetadata) {
|
|
14
|
+
if (!Request.HOOK_INITIALIZED) {
|
|
15
|
+
this.initHook();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (Request.REQUEST_METADATA[asyncHooks.executionAsyncId()]) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
Request.REQUEST_METADATA[asyncHooks.executionAsyncId()] = data;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getMetadata(): RequestMetadata {
|
|
26
|
+
if (!Request.HOOK_INITIALIZED) {
|
|
27
|
+
this.initHook();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return Request.REQUEST_METADATA[asyncHooks.executionAsyncId()];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private initHook() {
|
|
34
|
+
asyncHooks
|
|
35
|
+
.createHook({
|
|
36
|
+
init: (asyncId: number, type: string, triggerAsyncId: number, resource: Object) => {
|
|
37
|
+
if (!Request.REQUEST_METADATA[triggerAsyncId]) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Request.REQUEST_METADATA[asyncId] = Request.REQUEST_METADATA[triggerAsyncId];
|
|
42
|
+
},
|
|
43
|
+
destroy: (asyncId: number) => {
|
|
44
|
+
delete Request.REQUEST_METADATA[asyncId];
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
.enable();
|
|
48
|
+
Request.HOOK_INITIALIZED = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
package/src/loadRoutes.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import
|
|
2
|
+
import crypto from 'crypto';
|
|
3
3
|
import {
|
|
4
4
|
ServerConfig,
|
|
5
5
|
Route,
|
|
@@ -9,15 +9,17 @@ import {
|
|
|
9
9
|
getSessionDataCaches,
|
|
10
10
|
} from '@proteinjs/server-api';
|
|
11
11
|
import { createReactApp } from './routes/reactApp';
|
|
12
|
-
import { Logger } from '@proteinjs/
|
|
12
|
+
import { Logger } from '@proteinjs/logger';
|
|
13
|
+
import { Request } from './Request';
|
|
13
14
|
|
|
14
|
-
const logger = new Logger('Server');
|
|
15
|
+
const logger = new Logger({ name: 'Server' });
|
|
16
|
+
let requestCounter: number = 0;
|
|
15
17
|
|
|
16
18
|
export function loadRoutes(routes: Route[], server: express.Express, config: ServerConfig) {
|
|
17
19
|
let starRoute: Route | null = null;
|
|
18
20
|
const wildcardRoutes: Route[] = [];
|
|
19
21
|
for (const route of routes) {
|
|
20
|
-
logger.info(`Loading route: ${route.path}`);
|
|
22
|
+
logger.info({ message: `Loading route: ${route.path}` });
|
|
21
23
|
if (route.path == '*') {
|
|
22
24
|
starRoute = route;
|
|
23
25
|
continue;
|
|
@@ -54,7 +56,7 @@ export function loadDefaultStarRoute(routes: Route[], server: express.Express, c
|
|
|
54
56
|
|
|
55
57
|
if (!starRouteSpecified && (config.staticContent?.bundlePaths || config.staticContent?.bundlesDir)) {
|
|
56
58
|
const reactApp = createReactApp(config);
|
|
57
|
-
server[reactApp.method](reactApp.path, wrapRoute(reactApp.onRequest, config));
|
|
59
|
+
server[reactApp.method](reactApp.path, wrapRoute(reactApp.onRequest.bind(reactApp), config));
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
62
|
|
|
@@ -72,47 +74,34 @@ function wrapRoute(
|
|
|
72
74
|
return;
|
|
73
75
|
}
|
|
74
76
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
passport.authenticate('local', function (err, user, info) {
|
|
78
|
-
if (err) {
|
|
79
|
-
reject(err);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
resolve();
|
|
83
|
-
})(request, response, next);
|
|
84
|
-
});
|
|
85
|
-
}
|
|
77
|
+
const requestNumber = ++requestCounter;
|
|
78
|
+
const requestId = crypto.randomBytes(8).toString('hex');
|
|
86
79
|
|
|
80
|
+
// Set metadata into request async-hook storage
|
|
81
|
+
new Request().setMetadata({
|
|
82
|
+
number: requestNumber,
|
|
83
|
+
id: requestId,
|
|
84
|
+
url: request.originalUrl,
|
|
85
|
+
});
|
|
87
86
|
const sessionData: SessionData = { sessionId: request.sessionID, user: request.user as string, data: {} };
|
|
88
87
|
for (const sessionDataCache of getSessionDataCaches()) {
|
|
89
88
|
sessionData.data[sessionDataCache.key] = await sessionDataCache.create(sessionData.sessionId, sessionData.user);
|
|
90
89
|
}
|
|
91
90
|
Session.setData(sessionData);
|
|
92
91
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
await listener.beforeRequest(request, response);
|
|
101
|
-
} catch (error: any) {
|
|
102
|
-
logger.error(`Caught error when running listener before request`, error);
|
|
92
|
+
if (shouldLogRequest(request, config)) {
|
|
93
|
+
let message = `Started ${request.originalUrl}`;
|
|
94
|
+
if (process.env.DEVELOPMENT) {
|
|
95
|
+
message = `[#${requestNumber}] ${message}`;
|
|
103
96
|
}
|
|
97
|
+
logger.info({ message });
|
|
104
98
|
}
|
|
105
99
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
request
|
|
109
|
-
if (response.locals.requestNumber) {
|
|
110
|
-
logger.warn(`[#${response.locals.requestNumber}] Timed out ${request.originalUrl}`);
|
|
111
|
-
} else {
|
|
112
|
-
logger.warn(`Timed out ${request.originalUrl}`);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
100
|
+
await runBeforeRequestListeners(request, response);
|
|
101
|
+
|
|
102
|
+
setRequestTimeout(request, config, requestNumber);
|
|
115
103
|
|
|
104
|
+
// Run route
|
|
116
105
|
try {
|
|
117
106
|
await route(request, response);
|
|
118
107
|
} catch (error) {
|
|
@@ -120,28 +109,70 @@ function wrapRoute(
|
|
|
120
109
|
}
|
|
121
110
|
response.locals['responseHandled'] = true;
|
|
122
111
|
|
|
123
|
-
|
|
124
|
-
if (!listener.afterRequest) {
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
112
|
+
await runAfterRequestListeners(request, response);
|
|
127
113
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
114
|
+
if (shouldLogRequest(request, config)) {
|
|
115
|
+
let message = `Finished ${request.originalUrl}`;
|
|
116
|
+
if (process.env.DEVELOPMENT) {
|
|
117
|
+
message = `[#${requestNumber}] ${message}`;
|
|
132
118
|
}
|
|
119
|
+
logger.info({ message });
|
|
133
120
|
}
|
|
134
121
|
|
|
135
122
|
next();
|
|
136
123
|
};
|
|
137
124
|
}
|
|
138
125
|
|
|
139
|
-
function
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
126
|
+
function shouldLogRequest(request: express.Request, config: ServerConfig) {
|
|
127
|
+
if (config.request?.disableRequestLogging) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (request.path.startsWith('/static') || request.path.startsWith('/favicon.ico')) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function setRequestTimeout(request: express.Request, config: ServerConfig, requestNumber: number) {
|
|
139
|
+
const sixtyMinutes = 1000 * 60 * 60;
|
|
140
|
+
const timeout = typeof config.request?.timeoutMs !== 'undefined' ? config.request.timeoutMs : sixtyMinutes;
|
|
141
|
+
request.setTimeout(timeout, () => {
|
|
142
|
+
let message = `Timed out ${request.originalUrl}`;
|
|
143
|
+
if (process.env.DEVELOPMENT) {
|
|
144
|
+
message = `[#${requestNumber}] ${message}`;
|
|
145
|
+
}
|
|
146
|
+
logger.warn({ message });
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function runBeforeRequestListeners(request: express.Request, response: express.Response) {
|
|
151
|
+
const requestListeners = getRequestListeners();
|
|
152
|
+
for (const listener of requestListeners) {
|
|
153
|
+
if (!listener.beforeRequest) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
await listener.beforeRequest(request, response);
|
|
159
|
+
} catch (error: any) {
|
|
160
|
+
logger.error({ message: `Caught error when running listener before request`, error });
|
|
161
|
+
}
|
|
144
162
|
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function runAfterRequestListeners(request: express.Request, response: express.Response) {
|
|
166
|
+
const requestListeners = getRequestListeners();
|
|
167
|
+
for (const listener of requestListeners) {
|
|
168
|
+
if (!listener.afterRequest) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
145
171
|
|
|
146
|
-
|
|
172
|
+
try {
|
|
173
|
+
await listener.afterRequest(request, response);
|
|
174
|
+
} catch (error: any) {
|
|
175
|
+
logger.error({ message: `Caught error when running listener after request`, error });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
147
178
|
}
|
package/src/startServer.ts
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
getStartupTasks,
|
|
20
20
|
} from '@proteinjs/server-api';
|
|
21
21
|
import { loadRoutes, loadDefaultStarRoute } from './loadRoutes';
|
|
22
|
-
import { Logger } from '@proteinjs/
|
|
22
|
+
import { Logger } from '@proteinjs/logger';
|
|
23
23
|
import { setNodeModulesPath } from './nodeModulesPath';
|
|
24
24
|
|
|
25
25
|
interface ExtendedIncomingMessage extends IncomingMessage {
|
|
@@ -32,7 +32,7 @@ interface ExtendedSocket extends Socket {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
const staticContentPath = '/static/';
|
|
35
|
-
const logger = new Logger('Server');
|
|
35
|
+
const logger = new Logger({ name: 'Server' });
|
|
36
36
|
const app = express();
|
|
37
37
|
const server = new HttpServer(app);
|
|
38
38
|
export const io = new SocketIOServer(server);
|
|
@@ -42,6 +42,7 @@ export async function startServer(config: ServerConfig) {
|
|
|
42
42
|
const routes = getRoutes();
|
|
43
43
|
configureRequests(app);
|
|
44
44
|
initializeHotReloading(app, config);
|
|
45
|
+
configureSession(app, config);
|
|
45
46
|
beforeRequest(app, config);
|
|
46
47
|
loadRoutes(
|
|
47
48
|
routes.filter((route) => route.useHttp),
|
|
@@ -49,8 +50,7 @@ export async function startServer(config: ServerConfig) {
|
|
|
49
50
|
config
|
|
50
51
|
);
|
|
51
52
|
configureHttps(app); // registering here forces static content to be redirected to https
|
|
52
|
-
configureStaticContentRouter(app, config);
|
|
53
|
-
configureSession(app, config);
|
|
53
|
+
configureStaticContentRouter(app, config);
|
|
54
54
|
loadRoutes(
|
|
55
55
|
routes.filter((route) => !route.useHttp),
|
|
56
56
|
app,
|
|
@@ -69,9 +69,9 @@ export async function startServer(config: ServerConfig) {
|
|
|
69
69
|
|
|
70
70
|
await runStartupTasks('after server config');
|
|
71
71
|
if (config.onStartup) {
|
|
72
|
-
logger.info(`Starting ServerConfig.onStartup`);
|
|
72
|
+
logger.info({ message: `Starting ServerConfig.onStartup` });
|
|
73
73
|
await config.onStartup();
|
|
74
|
-
logger.info(`Finished ServerConfig.onStartup`);
|
|
74
|
+
logger.info({ message: `Finished ServerConfig.onStartup` });
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
start(server, config);
|
|
@@ -85,15 +85,19 @@ async function runStartupTasks(when: StartupTask['when']) {
|
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
logger.info(
|
|
88
|
+
logger.info({
|
|
89
|
+
message: `Starting ${filteredTasks.length} \`${when}\` startup task${filteredTasks.length > 1 ? 's' : ''}`,
|
|
90
|
+
});
|
|
89
91
|
await Promise.all(
|
|
90
92
|
filteredTasks.map(async (task) => {
|
|
91
|
-
logger.info(`Starting task: ${task.name}`);
|
|
93
|
+
logger.info({ message: `Starting task: ${task.name}` });
|
|
92
94
|
await task.run();
|
|
93
|
-
logger.info(`Finished task: ${task.name}`);
|
|
95
|
+
logger.info({ message: `Finished task: ${task.name}` });
|
|
94
96
|
})
|
|
95
97
|
);
|
|
96
|
-
logger.info(
|
|
98
|
+
logger.info({
|
|
99
|
+
message: `Finished ${filteredTasks.length} \`${when}\` startup task${filteredTasks.length > 1 ? 's' : ''}`,
|
|
100
|
+
});
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
function configureRequests(app: express.Express) {
|
|
@@ -145,7 +149,7 @@ function configureHttps(app: express.Express) {
|
|
|
145
149
|
return;
|
|
146
150
|
}
|
|
147
151
|
|
|
148
|
-
logger.debug(`Redirecting to https: ${request.headers.host + request.url}`);
|
|
152
|
+
logger.debug({ message: `Redirecting to https: ${request.headers.host + request.url}` });
|
|
149
153
|
response.redirect('https://' + request.headers.host + request.url);
|
|
150
154
|
});
|
|
151
155
|
}
|
|
@@ -156,9 +160,9 @@ function configureStaticContentRouter(app: express.Express, config: ServerConfig
|
|
|
156
160
|
}
|
|
157
161
|
|
|
158
162
|
app.use(staticContentPath, express.static(config.staticContent.staticContentDir));
|
|
159
|
-
logger.info(
|
|
160
|
-
`Serving static content on path: ${staticContentPath}, serving from directory: ${config.staticContent.staticContentDir}
|
|
161
|
-
);
|
|
163
|
+
logger.info({
|
|
164
|
+
message: `Serving static content on path: ${staticContentPath}, serving from directory: ${config.staticContent.staticContentDir}`,
|
|
165
|
+
});
|
|
162
166
|
}
|
|
163
167
|
|
|
164
168
|
function configureSession(app: express.Express, config: ServerConfig) {
|
|
@@ -200,7 +204,7 @@ function configureSession(app: express.Express, config: ServerConfig) {
|
|
|
200
204
|
function initializeAuthentication(authenticate: (username: string, password: string) => Promise<true | string>) {
|
|
201
205
|
passport.use(
|
|
202
206
|
new passportLocal.Strategy(async function (username, password, done) {
|
|
203
|
-
logger.info(`Authenticating`);
|
|
207
|
+
logger.info({ message: `Authenticating` });
|
|
204
208
|
const result = await authenticate(username, password);
|
|
205
209
|
if (result === true) {
|
|
206
210
|
return done(null, { username });
|
|
@@ -220,17 +224,19 @@ function initializeAuthentication(authenticate: (username: string, password: str
|
|
|
220
224
|
}
|
|
221
225
|
|
|
222
226
|
function beforeRequest(app: express.Express, config: ServerConfig) {
|
|
223
|
-
let requestCounter: number = 0;
|
|
224
227
|
if (config.request?.disableRequestLogging == false || typeof config.request?.disableRequestLogging === 'undefined') {
|
|
225
|
-
app.use((request: express.Request, response: express.Response, next: express.NextFunction) => {
|
|
226
|
-
if (
|
|
227
|
-
|
|
228
|
-
|
|
228
|
+
app.use(async (request: express.Request, response: express.Response, next: express.NextFunction) => {
|
|
229
|
+
if (config.authenticate) {
|
|
230
|
+
await new Promise<void>((resolve, reject) => {
|
|
231
|
+
passport.authenticate('local', function (err, user, info) {
|
|
232
|
+
if (err) {
|
|
233
|
+
reject(err);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
resolve();
|
|
237
|
+
})(request, response, next);
|
|
238
|
+
});
|
|
229
239
|
}
|
|
230
|
-
|
|
231
|
-
const requestNumber = ++requestCounter;
|
|
232
|
-
logger.info(`[#${requestNumber}] Started ${request.originalUrl}`);
|
|
233
|
-
response.locals = { requestNumber };
|
|
234
240
|
next();
|
|
235
241
|
});
|
|
236
242
|
}
|
|
@@ -244,22 +250,10 @@ function afterRequest(app: express.Express, config: ServerConfig) {
|
|
|
244
250
|
if (config.request?.afterRequest) {
|
|
245
251
|
app.use(config.request.afterRequest);
|
|
246
252
|
}
|
|
247
|
-
|
|
248
|
-
if (config.request?.disableRequestLogging == false || typeof config.request?.disableRequestLogging === 'undefined') {
|
|
249
|
-
app.use((request: express.Request, response: express.Response, next: express.NextFunction) => {
|
|
250
|
-
if (request.path.startsWith('/static') || request.path.startsWith('/favicon.ico')) {
|
|
251
|
-
next();
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
logger.info(`[#${response.locals.requestNumber}] Finished ${request.originalUrl}`);
|
|
256
|
-
next();
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
253
|
}
|
|
260
254
|
|
|
261
255
|
function initializeSocketIO(io: SocketIOServer, app: express.Express) {
|
|
262
|
-
const
|
|
256
|
+
const socketLogger = new Logger({ name: 'SocketIOServer' });
|
|
263
257
|
|
|
264
258
|
// Share session and passport middleware with Socket.IO
|
|
265
259
|
const wrapMiddleware = (middleware: any) => (socket: any, next: any) => middleware(socket.request, {}, next);
|
|
@@ -280,7 +274,7 @@ function initializeSocketIO(io: SocketIOServer, app: express.Express) {
|
|
|
280
274
|
// Initialize Socket.IO event handlers
|
|
281
275
|
io.on('connection', (socket: ExtendedSocket) => {
|
|
282
276
|
const userInfo = `${socket.request.user} (${socket.id})`;
|
|
283
|
-
|
|
277
|
+
socketLogger.info({ message: `User connected: ${userInfo}` });
|
|
284
278
|
|
|
285
279
|
// Map this socket to the session id so it can be closed when the session is destroyed
|
|
286
280
|
const sessionId = socket.request.sessionID;
|
|
@@ -289,21 +283,21 @@ function initializeSocketIO(io: SocketIOServer, app: express.Express) {
|
|
|
289
283
|
}
|
|
290
284
|
|
|
291
285
|
socket.on('disconnect', (reason) => {
|
|
292
|
-
|
|
286
|
+
socketLogger.info({ message: `User disconnected: ${userInfo}. Reason: ${reason}` });
|
|
293
287
|
});
|
|
294
288
|
|
|
295
289
|
socket.on('error', (error) => {
|
|
296
|
-
|
|
290
|
+
socketLogger.error({ message: `Socket error for user: ${userInfo}`, error });
|
|
297
291
|
});
|
|
298
292
|
|
|
299
293
|
socket.conn.on('error', (error) => {
|
|
300
|
-
|
|
294
|
+
socketLogger.error({ message: `Socket connection error for user: ${userInfo}`, error });
|
|
301
295
|
});
|
|
302
296
|
});
|
|
303
297
|
|
|
304
298
|
// Handle server-level errors
|
|
305
|
-
io.engine.on('connection_error', (
|
|
306
|
-
|
|
299
|
+
io.engine.on('connection_error', (error) => {
|
|
300
|
+
socketLogger.error({ message: 'Connection error', error });
|
|
307
301
|
});
|
|
308
302
|
}
|
|
309
303
|
|
|
@@ -311,9 +305,9 @@ function start(server: HttpServer, config: ServerConfig) {
|
|
|
311
305
|
const port = config.port ? config.port : 3000;
|
|
312
306
|
server.listen(port, () => {
|
|
313
307
|
if (process.env.DEVELOPMENT) {
|
|
314
|
-
logger.info(`Starting in development mode`);
|
|
308
|
+
logger.info({ message: `Starting in development mode` });
|
|
315
309
|
}
|
|
316
310
|
|
|
317
|
-
logger.info(`Server listening on port: ${port}`);
|
|
311
|
+
logger.info({ message: `Server listening on port: ${port}` });
|
|
318
312
|
});
|
|
319
313
|
}
|