barehttp 0.4.1 → 0.4.2
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/lib/context/execution.js +1 -1
- package/lib/logger/index.js +9 -27
- package/lib/logger/serializers.js +1 -1
- package/lib/middlewares/cookies/cookie-manager.js +1 -1
- package/lib/request.js +4 -4
- package/lib/server.js +5 -5
- package/lib/websocket.js +10 -10
- package/package.json +25 -23
package/lib/context/execution.js
CHANGED
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Execution = void 0;
|
|
7
7
|
const hyperid_1 = __importDefault(require("hyperid"));
|
|
8
|
-
const generateId = hyperid_1.default();
|
|
8
|
+
const generateId = (0, hyperid_1.default)();
|
|
9
9
|
class Execution {
|
|
10
10
|
id;
|
|
11
11
|
type;
|
package/lib/logger/index.js
CHANGED
|
@@ -23,7 +23,7 @@ exports.logMe = exports.logHttp = void 0;
|
|
|
23
23
|
const pino_1 = __importStar(require("pino"));
|
|
24
24
|
const serializers_1 = require("./serializers");
|
|
25
25
|
const env_1 = require("../env");
|
|
26
|
-
const asyncDest = env_1.envs.isProd ? [pino_1.destination({ sync: false })] : [];
|
|
26
|
+
const asyncDest = env_1.envs.isProd ? [(0, pino_1.destination)({ sync: false })] : [];
|
|
27
27
|
const pinoCommonOptions = {
|
|
28
28
|
timestamp: () => `,"time":"${new Date()[env_1.envs.isProd ? 'toISOString' : 'toLocaleTimeString']()}"`,
|
|
29
29
|
formatters: {
|
|
@@ -32,36 +32,18 @@ const pinoCommonOptions = {
|
|
|
32
32
|
messageKey: 'message',
|
|
33
33
|
prettyPrint: !env_1.envs.isProd,
|
|
34
34
|
};
|
|
35
|
-
const logger = pino_1.default(pinoCommonOptions, asyncDest[0]);
|
|
36
|
-
if (env_1.envs.isProd) {
|
|
37
|
-
setInterval(function () {
|
|
38
|
-
logger.flush();
|
|
39
|
-
}, 10000).unref();
|
|
40
|
-
const handler = pino_1.default.final(logger, (err, finalLogger, evt) => {
|
|
41
|
-
finalLogger.info(`${evt} caught`);
|
|
42
|
-
if (err)
|
|
43
|
-
finalLogger.error(err, 'error caused exit');
|
|
44
|
-
process.exit(err ? 1 : 0);
|
|
45
|
-
});
|
|
46
|
-
// catch all the ways node might exit
|
|
47
|
-
process.on('beforeExit', () => handler(null, 'beforeExit'));
|
|
48
|
-
process.on('exit', () => handler(null, 'exit'));
|
|
49
|
-
process.on('uncaughtException', (err) => handler(err, 'uncaughtException'));
|
|
50
|
-
process.on('SIGINT', () => handler(null, 'SIGINT'));
|
|
51
|
-
process.on('SIGQUIT', () => handler(null, 'SIGQUIT'));
|
|
52
|
-
process.on('SIGTERM', () => handler(null, 'SIGTERM'));
|
|
53
|
-
}
|
|
35
|
+
const logger = (0, pino_1.default)(pinoCommonOptions, asyncDest[0]);
|
|
54
36
|
const logHttp = (...params) => {
|
|
55
|
-
const { level, logObject } = serializers_1.serializeHttp(...params);
|
|
37
|
+
const { level, logObject } = (0, serializers_1.serializeHttp)(...params);
|
|
56
38
|
logger[level](logObject);
|
|
57
39
|
};
|
|
58
40
|
exports.logHttp = logHttp;
|
|
59
41
|
// TODO: remove the test condition
|
|
60
42
|
exports.logMe = {
|
|
61
|
-
debug: (...args) => !env_1.envs.isTest && logger.debug(serializers_1.serializeLog(...args)),
|
|
62
|
-
info: (...args) => !env_1.envs.isTest && logger.info(serializers_1.serializeLog(...args)),
|
|
63
|
-
warn: (...args) => !env_1.envs.isTest && logger.warn(serializers_1.serializeLog(...args)),
|
|
64
|
-
error: (...args) => !env_1.envs.isTest && logger.error(serializers_1.serializeLog(...args)),
|
|
65
|
-
fatal: (...args) => !env_1.envs.isTest && logger.fatal(serializers_1.serializeLog(...args)),
|
|
66
|
-
trace: (...args) => !env_1.envs.isTest && logger.trace(serializers_1.serializeLog(...args)),
|
|
43
|
+
debug: (...args) => !env_1.envs.isTest && logger.debug((0, serializers_1.serializeLog)(...args)),
|
|
44
|
+
info: (...args) => !env_1.envs.isTest && logger.info((0, serializers_1.serializeLog)(...args)),
|
|
45
|
+
warn: (...args) => !env_1.envs.isTest && logger.warn((0, serializers_1.serializeLog)(...args)),
|
|
46
|
+
error: (...args) => !env_1.envs.isTest && logger.error((0, serializers_1.serializeLog)(...args)),
|
|
47
|
+
fatal: (...args) => !env_1.envs.isTest && logger.fatal((0, serializers_1.serializeLog)(...args)),
|
|
48
|
+
trace: (...args) => !env_1.envs.isTest && logger.trace((0, serializers_1.serializeLog)(...args)),
|
|
67
49
|
};
|
|
@@ -26,7 +26,7 @@ const parseArgs = (argSlice) => argSlice.map((arg) => {
|
|
|
26
26
|
return arg;
|
|
27
27
|
});
|
|
28
28
|
function serializeLog(...args) {
|
|
29
|
-
const site = callsites_1.default()[2];
|
|
29
|
+
const site = (0, callsites_1.default)()[2];
|
|
30
30
|
const meta = {
|
|
31
31
|
timestamp: Date.now(),
|
|
32
32
|
location: `${site.getFileName()}:${site.getLineNumber()}:${site.getColumnNumber()}`,
|
|
@@ -16,7 +16,7 @@ class CookiesManager {
|
|
|
16
16
|
this.flow = flow;
|
|
17
17
|
const secret = this.options.secret || '';
|
|
18
18
|
const enableRotation = Array.isArray(secret);
|
|
19
|
-
this.signer = typeof secret === 'string' || enableRotation ? signer_1.secretsOperator(secret) : null;
|
|
19
|
+
this.signer = typeof secret === 'string' || enableRotation ? (0, signer_1.secretsOperator)(secret) : null;
|
|
20
20
|
}
|
|
21
21
|
setCookie(name, value, options, signer) {
|
|
22
22
|
const localSigner = signer || this.signer;
|
package/lib/request.js
CHANGED
|
@@ -12,7 +12,7 @@ const cookie_manager_1 = require("./middlewares/cookies/cookie-manager");
|
|
|
12
12
|
const util_1 = require("util");
|
|
13
13
|
const stream_1 = require("stream");
|
|
14
14
|
const url_1 = __importDefault(require("url"));
|
|
15
|
-
const generateId = hyperid_1.default();
|
|
15
|
+
const generateId = (0, hyperid_1.default)();
|
|
16
16
|
const statusTuples = Object.entries(utils_1.StatusCodes).reduce((acc, [name, status]) => {
|
|
17
17
|
acc[status] = utils_1.StatusPhrases[name];
|
|
18
18
|
return acc;
|
|
@@ -59,7 +59,7 @@ class BareRequest {
|
|
|
59
59
|
}
|
|
60
60
|
// call logging section
|
|
61
61
|
if (options?.logging === true) {
|
|
62
|
-
_originalResponse.on('close', () => logger_1.logHttp(this.headers, this.startDate, this.remoteClient, _originalRequest, _originalResponse));
|
|
62
|
+
_originalResponse.on('close', () => (0, logger_1.logHttp)(this.headers, this.startDate, this.remoteClient, _originalRequest, _originalResponse));
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
readBody() {
|
|
@@ -90,7 +90,7 @@ class BareRequest {
|
|
|
90
90
|
case 'text/plain':
|
|
91
91
|
return wholeChunk.toString();
|
|
92
92
|
case 'application/json':
|
|
93
|
-
return safe_json_1.JSONParse(wholeChunk.toString());
|
|
93
|
+
return (0, safe_json_1.JSONParse)(wholeChunk.toString());
|
|
94
94
|
case 'application/x-www-form-urlencoded':
|
|
95
95
|
const store = {};
|
|
96
96
|
for (const curr of wholeChunk.toString().split('&')) {
|
|
@@ -194,7 +194,7 @@ class BareRequest {
|
|
|
194
194
|
}
|
|
195
195
|
json(data) {
|
|
196
196
|
// to generate with fast-json-stringify schema issue #1
|
|
197
|
-
const jsoned = safe_json_1.JSONStringify(data);
|
|
197
|
+
const jsoned = (0, safe_json_1.JSONStringify)(data);
|
|
198
198
|
this.setHeader('Content-Type', 'application/json');
|
|
199
199
|
this._send(jsoned ? jsoned : undefined);
|
|
200
200
|
}
|
package/lib/server.js
CHANGED
|
@@ -21,7 +21,7 @@ class BareServer {
|
|
|
21
21
|
#middlewares = [];
|
|
22
22
|
#routes = new Map();
|
|
23
23
|
#routesLib = new Map();
|
|
24
|
-
#router = find_my_way_1.default({ ignoreTrailingSlash: true });
|
|
24
|
+
#router = (0, find_my_way_1.default)({ ignoreTrailingSlash: true });
|
|
25
25
|
#errorHandler = this.basicErrorHandler;
|
|
26
26
|
#corsInstance;
|
|
27
27
|
#port = 3000;
|
|
@@ -30,7 +30,7 @@ class BareServer {
|
|
|
30
30
|
constructor(bareOptions = {}) {
|
|
31
31
|
this.bareOptions = bareOptions;
|
|
32
32
|
// init
|
|
33
|
-
this.server = http_1.createServer(this.#listener.bind(this));
|
|
33
|
+
this.server = (0, http_1.createServer)(this.#listener.bind(this));
|
|
34
34
|
this.attachGracefulHandlers();
|
|
35
35
|
this.attachRoutesDeclarator();
|
|
36
36
|
this.mainOptionsSetter();
|
|
@@ -41,7 +41,7 @@ class BareServer {
|
|
|
41
41
|
const flow = new request_1.BareRequest(request, response, { logging, requestTimeFormat });
|
|
42
42
|
// init and attach request uuid to the context
|
|
43
43
|
if (this.bareOptions.context) {
|
|
44
|
-
context_1.newContext('request');
|
|
44
|
+
(0, context_1.newContext)('request');
|
|
45
45
|
context_1.context.current?.store.set('id', flow.ID.code);
|
|
46
46
|
}
|
|
47
47
|
// attach a flow to the flow memory storage
|
|
@@ -71,7 +71,7 @@ class BareServer {
|
|
|
71
71
|
this.#host = typeof bo.serverAddress === 'string' ? bo.serverAddress : '0.0.0.0';
|
|
72
72
|
// context setting
|
|
73
73
|
if (bo.context)
|
|
74
|
-
context_1.enableContext();
|
|
74
|
+
(0, context_1.enableContext)();
|
|
75
75
|
// ws attachment
|
|
76
76
|
if (bo.ws) {
|
|
77
77
|
this.ws = new websocket_1.WebSocketServer(this.server, bo.wsOptions);
|
|
@@ -151,7 +151,7 @@ class BareServer {
|
|
|
151
151
|
registerReport() {
|
|
152
152
|
this.setRoute('GET', '/_report', false, (flow) => {
|
|
153
153
|
flow.setHeader('Content-Type', 'text/html');
|
|
154
|
-
flow.send(report_1.generateReport(this.#routes));
|
|
154
|
+
flow.send((0, report_1.generateReport)(this.#routes));
|
|
155
155
|
});
|
|
156
156
|
}
|
|
157
157
|
handleRoute(req, routeParams, handle, encodedRoute, opts) {
|
package/lib/websocket.js
CHANGED
|
@@ -9,7 +9,7 @@ const callsites_1 = __importDefault(require("callsites"));
|
|
|
9
9
|
const hyperid_1 = __importDefault(require("hyperid"));
|
|
10
10
|
const logger_1 = require("./logger");
|
|
11
11
|
const utils_1 = require("./utils");
|
|
12
|
-
const generateId = hyperid_1.default();
|
|
12
|
+
const generateId = (0, hyperid_1.default)();
|
|
13
13
|
class WebSocketServer {
|
|
14
14
|
opts;
|
|
15
15
|
_internal;
|
|
@@ -42,21 +42,21 @@ class WebSocketServer {
|
|
|
42
42
|
if (response instanceof Promise) {
|
|
43
43
|
response
|
|
44
44
|
.then((answer) => this.doUpgrade(answer, request, socket, head))
|
|
45
|
-
.catch((e) => this.rejectUpgrade(socket, e?.message, e));
|
|
45
|
+
.catch((e) => this.rejectUpgrade(request, socket, e?.message, e));
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
48
|
this.doUpgrade(response, request, socket, head);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
catch (e) {
|
|
52
|
-
this.rejectUpgrade(socket, e?.message, e);
|
|
52
|
+
this.rejectUpgrade(request, socket, e?.message, e);
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
this.customUpgradeDone = true;
|
|
56
56
|
}
|
|
57
57
|
doUpgrade(answer, request, socket, head) {
|
|
58
58
|
if (!answer.access)
|
|
59
|
-
this.rejectUpgrade(socket, answer.message);
|
|
59
|
+
this.rejectUpgrade(request, socket, answer.message);
|
|
60
60
|
else {
|
|
61
61
|
this._internal.handleUpgrade(request, socket, head, (ws) => {
|
|
62
62
|
const userClient = {
|
|
@@ -68,15 +68,15 @@ class WebSocketServer {
|
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
rejectUpgrade(socket, message = 'Not Authorized', data) {
|
|
72
|
-
logger_1.logMe.warn(message || `Upgrade rejected for the client from ${socket.remoteAddress}`, data);
|
|
71
|
+
rejectUpgrade(request, socket, message = 'Not Authorized', data) {
|
|
72
|
+
logger_1.logMe.warn(message || `Upgrade rejected for the client from ${request.socket.remoteAddress}`, data);
|
|
73
73
|
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); // TODO: enhance to be able to personalize this
|
|
74
74
|
socket.destroy();
|
|
75
75
|
}
|
|
76
76
|
attachTypesHandling() {
|
|
77
77
|
this._internal.on('connection', (ws, _, client) => {
|
|
78
78
|
ws.onmessage = (event) => {
|
|
79
|
-
const decode = utils_1.JSONParse(event.data);
|
|
79
|
+
const decode = (0, utils_1.JSONParse)(event.data);
|
|
80
80
|
if (decode === null) {
|
|
81
81
|
logger_1.logMe.error('Incorrect data received from the client', {
|
|
82
82
|
data: event.data,
|
|
@@ -105,7 +105,7 @@ class WebSocketServer {
|
|
|
105
105
|
.then((resolvedResponse) => {
|
|
106
106
|
if (!resolvedResponse)
|
|
107
107
|
return;
|
|
108
|
-
this.send({ ws, client }, utils_1.JSONStringify({ type: `${decode.type}_RESPONSE`, ...resolvedResponse }));
|
|
108
|
+
this.send({ ws, client }, (0, utils_1.JSONStringify)({ type: `${decode.type}_RESPONSE`, ...resolvedResponse }));
|
|
109
109
|
})
|
|
110
110
|
.catch((e) => logger_1.logMe.error(`Error working out a handler for type ${decode.type}`, {
|
|
111
111
|
error: e,
|
|
@@ -116,7 +116,7 @@ class WebSocketServer {
|
|
|
116
116
|
else {
|
|
117
117
|
if (!response)
|
|
118
118
|
return;
|
|
119
|
-
this.send({ ws, client }, utils_1.JSONStringify({ type: `${decode.type}_RESPONSE`, ...response }));
|
|
119
|
+
this.send({ ws, client }, (0, utils_1.JSONStringify)({ type: `${decode.type}_RESPONSE`, ...response }));
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
catch (e) {
|
|
@@ -147,7 +147,7 @@ class WebSocketServer {
|
|
|
147
147
|
if (typeof receiver.handler !== 'function') {
|
|
148
148
|
throw new Error(`Can't declare a handler with type ${typeof receiver.handler}, should be a function with following signature: WsMessageHandler<T,?>`);
|
|
149
149
|
}
|
|
150
|
-
const place = callsites_1.default()[2];
|
|
150
|
+
const place = (0, callsites_1.default)()[2];
|
|
151
151
|
const loc = `${place.getFileName()}:${place.getLineNumber()}:${place.getColumnNumber()}`;
|
|
152
152
|
this.#types.set(receiver.type, { loc, handler: receiver.handler });
|
|
153
153
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "barehttp",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Lightweight and fast Node.js web server",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"directories": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"build:dev": "rm -rf ./dev-lib && tsc -p tsconfig.dev.json",
|
|
16
16
|
"test": "jest --runInBand --coverage",
|
|
17
17
|
"lint": "eslint ./src --fix",
|
|
18
|
-
"release": "semantic-release"
|
|
18
|
+
"release": "semantic-release -e ./.releaserc.json"
|
|
19
19
|
},
|
|
20
20
|
"keywords": [
|
|
21
21
|
"nodejs",
|
|
@@ -36,34 +36,36 @@
|
|
|
36
36
|
"callsites": "^3.1.0",
|
|
37
37
|
"cookie": "^0.4.1",
|
|
38
38
|
"cookie-signature": "^1.1.0",
|
|
39
|
-
"find-my-way": "^
|
|
40
|
-
"hyperid": "^2.1
|
|
41
|
-
"pino": "^
|
|
42
|
-
"pino-pretty": "^
|
|
43
|
-
"ws": "^
|
|
39
|
+
"find-my-way": "^5.0.0",
|
|
40
|
+
"hyperid": "^2.3.1",
|
|
41
|
+
"pino": "^7.5.1",
|
|
42
|
+
"pino-pretty": "^7.2.0",
|
|
43
|
+
"ws": "^8.3.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@
|
|
47
|
-
"@
|
|
46
|
+
"@semantic-release/git": "^10.0.1",
|
|
47
|
+
"@semantic-release/github": "^8.0.2",
|
|
48
|
+
"@ts-morph/bootstrap": "^0.12.2",
|
|
49
|
+
"@types/cookie": "^0.4.1",
|
|
48
50
|
"@types/cookie-signature": "^1.0.3",
|
|
49
|
-
"@types/jest": "^
|
|
50
|
-
"@types/node": "^
|
|
51
|
-
"@types/pino": "^
|
|
52
|
-
"@types/ws": "^
|
|
53
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
54
|
-
"@typescript-eslint/parser": "^
|
|
51
|
+
"@types/jest": "^27.0.3",
|
|
52
|
+
"@types/node": "^14.17.0",
|
|
53
|
+
"@types/pino": "^7.0.5",
|
|
54
|
+
"@types/ws": "^8.2.1",
|
|
55
|
+
"@typescript-eslint/eslint-plugin": "^5.5.0",
|
|
56
|
+
"@typescript-eslint/parser": "^5.5.0",
|
|
55
57
|
"axios": "^0.21.1",
|
|
56
|
-
"eslint": "^
|
|
57
|
-
"eslint-plugin-import": "^2.
|
|
58
|
-
"eslint-plugin-jest": "^
|
|
58
|
+
"eslint": "^8.3.0",
|
|
59
|
+
"eslint-plugin-import": "^2.25.3",
|
|
60
|
+
"eslint-plugin-jest": "^25.3.0",
|
|
59
61
|
"express": "^4.17.1",
|
|
60
|
-
"fastify": "^3.
|
|
61
|
-
"jest": "^
|
|
62
|
-
"semantic-release": "^
|
|
62
|
+
"fastify": "^3.24.1",
|
|
63
|
+
"jest": "^27.4.3",
|
|
64
|
+
"semantic-release": "^18.0.1",
|
|
63
65
|
"supertest": "^6.1.3",
|
|
64
|
-
"ts-jest": "^
|
|
66
|
+
"ts-jest": "^27.0.7",
|
|
65
67
|
"ts-node-dev": "^1.1.6",
|
|
66
|
-
"typescript": "^4.
|
|
68
|
+
"typescript": "^4.5.2"
|
|
67
69
|
},
|
|
68
70
|
"optionalDependencies": {
|
|
69
71
|
"bufferutil": "^4.0.3",
|