@dcl/http-server 1.0.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/README.md +3 -0
- package/dist/benchmark.d.ts +1 -0
- package/dist/benchmark.js +94 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cors.d.ts +35 -0
- package/dist/cors.js +138 -0
- package/dist/cors.js.map +1 -0
- package/dist/helpers.d.ts +1 -0
- package/dist/helpers.js +3 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/injectors.d.ts +5 -0
- package/dist/injectors.js +22 -0
- package/dist/injectors.js.map +1 -0
- package/dist/layer.d.ts +58 -0
- package/dist/layer.js +102 -0
- package/dist/layer.js.map +1 -0
- package/dist/logic.d.ts +12 -0
- package/dist/logic.js +288 -0
- package/dist/logic.js.map +1 -0
- package/dist/methods.d.ts +6 -0
- package/dist/methods.js +16 -0
- package/dist/methods.js.map +1 -0
- package/dist/metrics.d.ts +36 -0
- package/dist/metrics.js +107 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware.d.ts +9 -0
- package/dist/middleware.js +35 -0
- package/dist/middleware.js.map +1 -0
- package/dist/router.d.ts +190 -0
- package/dist/router.js +516 -0
- package/dist/router.js.map +1 -0
- package/dist/server-handler.d.ts +1 -0
- package/dist/server-handler.js +34 -0
- package/dist/server-handler.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.js +176 -0
- package/dist/server.js.map +1 -0
- package/dist/status-checks.d.ts +33 -0
- package/dist/status-checks.js +154 -0
- package/dist/status-checks.js.map +1 -0
- package/dist/terminator.d.ts +18 -0
- package/dist/terminator.js +128 -0
- package/dist/terminator.js.map +1 -0
- package/dist/test-component.d.ts +22 -0
- package/dist/test-component.js +89 -0
- package/dist/test-component.js.map +1 -0
- package/dist/test-server.d.ts +21 -0
- package/dist/test-server.js +81 -0
- package/dist/test-server.js.map +1 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ws.d.ts +8 -0
- package/dist/ws.js +32 -0
- package/dist/ws.js.map +1 -0
- package/package.json +49 -0
package/dist/logic.js
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.coerceErrorsMiddleware = exports.getRequestFromNodeMessage = exports.isBlob = void 0;
|
|
40
|
+
exports.getServer = getServer;
|
|
41
|
+
exports.success = success;
|
|
42
|
+
exports.getDefaultMiddlewares = getDefaultMiddlewares;
|
|
43
|
+
exports.defaultHandler = defaultHandler;
|
|
44
|
+
exports.normalizeResponseBody = normalizeResponseBody;
|
|
45
|
+
exports.contextFromRequest = contextFromRequest;
|
|
46
|
+
const fetch = __importStar(require("node-fetch"));
|
|
47
|
+
const stream_1 = require("stream");
|
|
48
|
+
const http = __importStar(require("http"));
|
|
49
|
+
const https = __importStar(require("https"));
|
|
50
|
+
const destroy_1 = __importDefault(require("destroy"));
|
|
51
|
+
const on_finished_1 = __importDefault(require("on-finished"));
|
|
52
|
+
const http_errors_1 = require("http-errors");
|
|
53
|
+
const ws_1 = require("./ws");
|
|
54
|
+
/**
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
function getServer(options, listener) {
|
|
58
|
+
let server;
|
|
59
|
+
if ('https' in options && options.https)
|
|
60
|
+
server = https.createServer(options.https, listener);
|
|
61
|
+
if ('http' in options && options.http)
|
|
62
|
+
server = http.createServer(options.http, listener);
|
|
63
|
+
else
|
|
64
|
+
server = http.createServer(listener);
|
|
65
|
+
server.keepAliveTimeout = options.keepAliveTimeout ?? 70000;
|
|
66
|
+
server.headersTimeout = options.headersTimeout ?? 75000;
|
|
67
|
+
return server;
|
|
68
|
+
}
|
|
69
|
+
const NAME = Symbol.toStringTag;
|
|
70
|
+
/**
|
|
71
|
+
* Check if `object` is a W3C `Blob` object (which `File` inherits from)
|
|
72
|
+
*
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
const isBlob = (object) => {
|
|
76
|
+
return (object !== null &&
|
|
77
|
+
typeof object === 'object' &&
|
|
78
|
+
typeof object.arrayBuffer === 'function' &&
|
|
79
|
+
typeof object.type === 'string' &&
|
|
80
|
+
typeof object.stream === 'function' &&
|
|
81
|
+
typeof object.constructor === 'function' &&
|
|
82
|
+
/^(Blob|File)$/.test(object[NAME]));
|
|
83
|
+
};
|
|
84
|
+
exports.isBlob = isBlob;
|
|
85
|
+
/**
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
88
|
+
function success(data, res) {
|
|
89
|
+
if (data.statusText)
|
|
90
|
+
res.statusMessage = data.statusText;
|
|
91
|
+
if (data.status)
|
|
92
|
+
res.statusCode = data.status;
|
|
93
|
+
if (data.headers) {
|
|
94
|
+
const headers = new fetch.Headers(data.headers);
|
|
95
|
+
headers.forEach((value, key) => {
|
|
96
|
+
if (value !== undefined) {
|
|
97
|
+
res.setHeader(key, value);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const body = data.body;
|
|
102
|
+
if (Buffer.isBuffer(body)) {
|
|
103
|
+
res.end(body);
|
|
104
|
+
}
|
|
105
|
+
else if ((0, exports.isBlob)(body)) {
|
|
106
|
+
// const blob = body as Blob
|
|
107
|
+
// const stream = blob.stream()
|
|
108
|
+
// if (stream.pipeTo) {
|
|
109
|
+
// stream.pipeTo(res as any)
|
|
110
|
+
// } else {
|
|
111
|
+
// ;(blob.stream() as any).pipe(res)
|
|
112
|
+
// }
|
|
113
|
+
throw new Error('Unknown response body (Blob)');
|
|
114
|
+
}
|
|
115
|
+
else if (body && body.pipe) {
|
|
116
|
+
body.pipe(res);
|
|
117
|
+
// Note: for context about why this is necessary, check https://github.com/nodejs/node/issues/1180
|
|
118
|
+
// @ts-expect-error - body.pipe check ensures this is a Node.js Stream, not web ReadableStream
|
|
119
|
+
(0, on_finished_1.default)(res, () => (0, destroy_1.default)(body));
|
|
120
|
+
}
|
|
121
|
+
else if (body !== undefined && body !== null) {
|
|
122
|
+
throw new Error('Unknown response body');
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
res.end();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// @internal
|
|
129
|
+
function getDefaultMiddlewares() {
|
|
130
|
+
return [exports.coerceErrorsMiddleware];
|
|
131
|
+
}
|
|
132
|
+
const getRequestFromNodeMessage = (request, host) => {
|
|
133
|
+
const headers = new fetch.Headers();
|
|
134
|
+
for (let key in request.headers) {
|
|
135
|
+
if (request.headers.hasOwnProperty(key)) {
|
|
136
|
+
const h = request.headers[key];
|
|
137
|
+
if (typeof h == 'string') {
|
|
138
|
+
headers.append(key, h);
|
|
139
|
+
}
|
|
140
|
+
else if (Array.isArray(h)) {
|
|
141
|
+
h.forEach(($) => headers.append(key, $));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const requestInit = {
|
|
146
|
+
headers: headers,
|
|
147
|
+
method: request.method.toUpperCase()
|
|
148
|
+
};
|
|
149
|
+
if (requestInit.method != 'GET' && requestInit.method != 'HEAD') {
|
|
150
|
+
requestInit.body = request;
|
|
151
|
+
}
|
|
152
|
+
const protocol = headers.get('X-Forwarded-Proto') == 'https' ? 'https' : 'http';
|
|
153
|
+
const baseUrl = protocol + '://' + (headers.get('X-Forwarded-Host') || headers.get('host') || host || '0.0.0.0');
|
|
154
|
+
// Note: Express.js overwrite `req.url` freely for internal routing
|
|
155
|
+
// purposes and retains the original value on `req.originalUrl`
|
|
156
|
+
// @see https://expressjs.com/en/api.html#req.originalUrl
|
|
157
|
+
const originalUrl = request.originalUrl ?? request.url;
|
|
158
|
+
let url = new URL(baseUrl + originalUrl);
|
|
159
|
+
try {
|
|
160
|
+
url = new URL(originalUrl, baseUrl);
|
|
161
|
+
}
|
|
162
|
+
catch { }
|
|
163
|
+
const ret = new fetch.Request(url.toString(), requestInit);
|
|
164
|
+
return ret;
|
|
165
|
+
};
|
|
166
|
+
exports.getRequestFromNodeMessage = getRequestFromNodeMessage;
|
|
167
|
+
const coerceErrorsMiddleware = async (_, next) => {
|
|
168
|
+
try {
|
|
169
|
+
return await next();
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
if (e instanceof http_errors_1.HttpError ||
|
|
173
|
+
(('status' in e || 'statusCode' in e) && (typeof e.status == 'number' || typeof e.statusCode == 'number'))) {
|
|
174
|
+
return {
|
|
175
|
+
status: e.status || e.statusCode,
|
|
176
|
+
body: e.body || e.message,
|
|
177
|
+
headers: e.headers
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
throw e;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
exports.coerceErrorsMiddleware = coerceErrorsMiddleware;
|
|
184
|
+
function respondBuffer(buffer, response, mutableHeaders) {
|
|
185
|
+
// TODO: test
|
|
186
|
+
mutableHeaders.set('Content-Length', buffer.byteLength.toFixed());
|
|
187
|
+
return new fetch.Response(buffer, {
|
|
188
|
+
...response,
|
|
189
|
+
headers: mutableHeaders
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function respondJson(json, response, mutableHeaders) {
|
|
193
|
+
// TODO: test
|
|
194
|
+
if (!mutableHeaders.has('content-type')) {
|
|
195
|
+
mutableHeaders.set('content-type', 'application/json');
|
|
196
|
+
}
|
|
197
|
+
return respondString(JSON.stringify(json), response, mutableHeaders);
|
|
198
|
+
}
|
|
199
|
+
function respondString(txt, response, mutableHeaders) {
|
|
200
|
+
// TODO: test
|
|
201
|
+
// TODO: accept encoding
|
|
202
|
+
const returnEncoding = 'utf-8';
|
|
203
|
+
const retBuffer = Buffer.from(txt, returnEncoding);
|
|
204
|
+
if (!mutableHeaders.has('content-type')) {
|
|
205
|
+
mutableHeaders.set('content-type', `text/plain; charset=${returnEncoding}`);
|
|
206
|
+
}
|
|
207
|
+
return respondBuffer(retBuffer, response, mutableHeaders);
|
|
208
|
+
}
|
|
209
|
+
const initialResponse = {
|
|
210
|
+
status: 404,
|
|
211
|
+
body: 'Not found'
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Default middleware
|
|
215
|
+
* @public
|
|
216
|
+
*/
|
|
217
|
+
async function defaultHandler() {
|
|
218
|
+
return initialResponse;
|
|
219
|
+
}
|
|
220
|
+
// @internal
|
|
221
|
+
function normalizeResponseBody(request, response) {
|
|
222
|
+
if (!response) {
|
|
223
|
+
// Not Implemented
|
|
224
|
+
return new fetch.Response(undefined, { status: 501, statusText: 'Server did not produce a valid response' });
|
|
225
|
+
}
|
|
226
|
+
if (response.status == 101) {
|
|
227
|
+
const cb = (0, ws_1.getWebSocketCallback)(response);
|
|
228
|
+
return (0, ws_1.withWebSocketCallback)(new fetch.Response(void 0, { ...response, body: undefined }), cb);
|
|
229
|
+
}
|
|
230
|
+
if (response instanceof fetch.Response) {
|
|
231
|
+
return new fetch.Response(response.body, {
|
|
232
|
+
headers: response.headers,
|
|
233
|
+
status: response.status,
|
|
234
|
+
statusText: response.statusText
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
const is1xx = response.status && response.status >= 100 && response.status < 200;
|
|
238
|
+
const is204 = response.status == 204;
|
|
239
|
+
const is304 = response.status == 304;
|
|
240
|
+
const isHEAD = request.method == 'HEAD';
|
|
241
|
+
const mutableHeaders = new fetch.Headers(response.headers);
|
|
242
|
+
if (is204 || is304) {
|
|
243
|
+
// TODO: TEST this code path
|
|
244
|
+
mutableHeaders.delete('Content-Type');
|
|
245
|
+
mutableHeaders.delete('Content-Length');
|
|
246
|
+
mutableHeaders.delete('Transfer-Encoding');
|
|
247
|
+
}
|
|
248
|
+
// https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4
|
|
249
|
+
// the following responses must not contain any content nor content-length
|
|
250
|
+
if (is1xx || is204 || is304 || isHEAD) {
|
|
251
|
+
// TODO: TEST this code path
|
|
252
|
+
return new fetch.Response(undefined, { ...response, headers: mutableHeaders, body: undefined });
|
|
253
|
+
}
|
|
254
|
+
if (Buffer.isBuffer(response.body)) {
|
|
255
|
+
return respondBuffer(response.body, response, mutableHeaders);
|
|
256
|
+
}
|
|
257
|
+
else if (response.body instanceof ArrayBuffer || response.body instanceof Uint8Array) {
|
|
258
|
+
return respondBuffer(response.body, response, mutableHeaders);
|
|
259
|
+
}
|
|
260
|
+
else if (typeof response.body == 'string') {
|
|
261
|
+
return respondString(response.body, response, mutableHeaders);
|
|
262
|
+
}
|
|
263
|
+
else if (response.body instanceof stream_1.Stream) {
|
|
264
|
+
return new fetch.Response(response.body, response);
|
|
265
|
+
}
|
|
266
|
+
else if (response.body != undefined) {
|
|
267
|
+
// TODO: test
|
|
268
|
+
return respondJson(response.body, response, mutableHeaders);
|
|
269
|
+
}
|
|
270
|
+
// Applications SHOULD use this field to indicate the transfer-length of the
|
|
271
|
+
// message-body, unless this is prohibited by the rules in section 4.4.
|
|
272
|
+
// (https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4)
|
|
273
|
+
if (!mutableHeaders.has('content-length')) {
|
|
274
|
+
mutableHeaders.set('content-length', '0');
|
|
275
|
+
}
|
|
276
|
+
return new fetch.Response(undefined, { ...response, headers: mutableHeaders });
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* @internal
|
|
280
|
+
*/
|
|
281
|
+
function contextFromRequest(baseCtx, request) {
|
|
282
|
+
const newContext = Object.create(baseCtx);
|
|
283
|
+
// hidrate context with the request
|
|
284
|
+
newContext.request = request;
|
|
285
|
+
newContext.url = new URL(request.url);
|
|
286
|
+
return newContext;
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { IHttpServerComponent as http } from '@well-known-components/interfaces';
|
|
2
|
+
export type MethodsMapType = {
|
|
3
|
+
[key in http.HTTPMethod]: key;
|
|
4
|
+
};
|
|
5
|
+
export declare const methodsMap: MethodsMapType;
|
|
6
|
+
export declare const methodsList: ReadonlyArray<http.HTTPMethod>;
|
package/dist/methods.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.methodsList = exports.methodsMap = void 0;
|
|
4
|
+
exports.methodsMap = Object.seal({
|
|
5
|
+
CONNECT: 'CONNECT',
|
|
6
|
+
DELETE: 'DELETE',
|
|
7
|
+
GET: 'GET',
|
|
8
|
+
HEAD: 'HEAD',
|
|
9
|
+
OPTIONS: 'OPTIONS',
|
|
10
|
+
PATCH: 'PATCH',
|
|
11
|
+
POST: 'POST',
|
|
12
|
+
PUT: 'PUT',
|
|
13
|
+
TRACE: 'TRACE'
|
|
14
|
+
});
|
|
15
|
+
exports.methodsList = Object.seal(Object.keys(exports.methodsMap));
|
|
16
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":";;;AAMa,QAAA,UAAU,GAAmB,MAAM,CAAC,IAAI,CAAC;IACpD,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;CACf,CAAC,CAAA;AAEW,QAAA,WAAW,GAAmC,MAAM,CAAC,IAAI,CACpE,MAAM,CAAC,IAAI,CAAC,kBAAU,CAAC,CACU,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { IConfigComponent, IHttpServerComponent, IMetricsComponent } from '@well-known-components/interfaces';
|
|
2
|
+
declare const metrics: {
|
|
3
|
+
http_request_duration_seconds: {
|
|
4
|
+
type: "histogram";
|
|
5
|
+
help: string;
|
|
6
|
+
labelNames: readonly ["method", "handler", "code"];
|
|
7
|
+
};
|
|
8
|
+
http_requests_total: {
|
|
9
|
+
type: "counter";
|
|
10
|
+
help: string;
|
|
11
|
+
labelNames: readonly ["method", "handler", "code"];
|
|
12
|
+
};
|
|
13
|
+
http_request_size_bytes: {
|
|
14
|
+
type: "histogram";
|
|
15
|
+
help: string;
|
|
16
|
+
labelNames: readonly ["method", "handler", "code"];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export type HttpMetrics = keyof typeof metrics;
|
|
23
|
+
/**
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export declare function getDefaultHttpMetrics(): IMetricsComponent.MetricsRecordDefinition<HttpMetrics>;
|
|
27
|
+
/**
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
export declare function instrumentHttpServerWithPromClientRegistry<K extends string>(options: {
|
|
31
|
+
server: IHttpServerComponent<IHttpServerComponent.DefaultContext<any>>;
|
|
32
|
+
config: IConfigComponent;
|
|
33
|
+
metrics: IMetricsComponent<K | HttpMetrics>;
|
|
34
|
+
registry: IMetricsComponent.Registry;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
export {};
|
package/dist/metrics.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultHttpMetrics = getDefaultHttpMetrics;
|
|
4
|
+
exports.instrumentHttpServerWithPromClientRegistry = instrumentHttpServerWithPromClientRegistry;
|
|
5
|
+
const interfaces_1 = require("@well-known-components/interfaces");
|
|
6
|
+
const router_1 = require("./router");
|
|
7
|
+
const httpLabels = ['method', 'handler', 'code'];
|
|
8
|
+
const metrics = {
|
|
9
|
+
http_request_duration_seconds: {
|
|
10
|
+
type: interfaces_1.IMetricsComponent.HistogramType,
|
|
11
|
+
help: 'Request duration in seconds.',
|
|
12
|
+
labelNames: httpLabels
|
|
13
|
+
},
|
|
14
|
+
http_requests_total: {
|
|
15
|
+
type: interfaces_1.IMetricsComponent.CounterType,
|
|
16
|
+
help: 'Total number of HTTP requests',
|
|
17
|
+
labelNames: httpLabels
|
|
18
|
+
},
|
|
19
|
+
http_request_size_bytes: {
|
|
20
|
+
type: interfaces_1.IMetricsComponent.HistogramType,
|
|
21
|
+
help: 'Duration of HTTP requests size in bytes',
|
|
22
|
+
labelNames: httpLabels
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
function getDefaultHttpMetrics() {
|
|
29
|
+
return metrics;
|
|
30
|
+
}
|
|
31
|
+
const noopStartTimer = { end() { } };
|
|
32
|
+
/**
|
|
33
|
+
* Metrics configuration prefix.
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
const CONFIG_PREFIX = 'WKC_METRICS';
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
function _configKey(key) {
|
|
41
|
+
return `${CONFIG_PREFIX}_${key.toUpperCase().replace(/^(_*)/, '')}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
async function instrumentHttpServerWithPromClientRegistry(options) {
|
|
47
|
+
const { config, registry } = options;
|
|
48
|
+
const metricsPath = (await config.getString(_configKey('PUBLIC_PATH'))) || '/metrics';
|
|
49
|
+
const bearerToken = await config.getString(_configKey('BEARER_TOKEN'));
|
|
50
|
+
const resetEveryNight = (await config.getString(_configKey('RESET_AT_NIGHT'))) == 'true';
|
|
51
|
+
const router = new router_1.Router();
|
|
52
|
+
function calculateNextReset() {
|
|
53
|
+
return new Date(new Date(new Date().toDateString()).getTime() + 86400000).getTime();
|
|
54
|
+
}
|
|
55
|
+
let nextReset = calculateNextReset();
|
|
56
|
+
// TODO: optional basic auth for /metrics
|
|
57
|
+
router.get(metricsPath, async (ctx) => {
|
|
58
|
+
if (bearerToken) {
|
|
59
|
+
const header = ctx.request.headers.get('authorization');
|
|
60
|
+
if (!header)
|
|
61
|
+
return { status: 401 };
|
|
62
|
+
const [_, value] = header.split(' ');
|
|
63
|
+
if (value != bearerToken) {
|
|
64
|
+
return { status: 401 };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const body = await registry.metrics();
|
|
68
|
+
// heavy-metric servers that run for long hours tend to generate precision problems
|
|
69
|
+
// and memory degradation for histograms if not cleared enough. this method
|
|
70
|
+
// resets the metrics once per day at 00.00UTC
|
|
71
|
+
if (resetEveryNight && Date.now() > nextReset) {
|
|
72
|
+
nextReset = calculateNextReset();
|
|
73
|
+
options.metrics.resetAll();
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
status: 200,
|
|
77
|
+
body,
|
|
78
|
+
headers: {
|
|
79
|
+
'content-type': registry.contentType
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
options.server.use(async (ctx, next) => {
|
|
84
|
+
let labels = {
|
|
85
|
+
method: ctx.request.method,
|
|
86
|
+
handler: '',
|
|
87
|
+
code: 200
|
|
88
|
+
};
|
|
89
|
+
const startTimerResult = options.metrics.startTimer('http_request_duration_seconds', labels);
|
|
90
|
+
const end = startTimerResult?.end || noopStartTimer.end;
|
|
91
|
+
let res;
|
|
92
|
+
try {
|
|
93
|
+
return (res = await next());
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
labels.code = (res && res.status) || labels.code;
|
|
97
|
+
if (ctx.routerPath) {
|
|
98
|
+
labels.handler = ctx.routerPath;
|
|
99
|
+
}
|
|
100
|
+
options.metrics.observe('http_request_size_bytes', labels, ctx.request.size);
|
|
101
|
+
options.metrics.increment('http_requests_total', labels);
|
|
102
|
+
end(labels);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
options.server.use(router.middleware());
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IHttpServerComponent as http, IMiddlewareAdapterHandler } from '@well-known-components/interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export type Middleware<Ctx> = IMiddlewareAdapterHandler<Ctx, http.IResponse>;
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare function compose<Ctx>(...middlewares: Middleware<Ctx>[]): Middleware<Ctx>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compose = compose;
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
function compose(...middlewares) {
|
|
8
|
+
if (!Array.isArray(middlewares))
|
|
9
|
+
throw new TypeError('Middleware stack must be an array!');
|
|
10
|
+
for (const fn of middlewares) {
|
|
11
|
+
if (typeof fn !== 'function')
|
|
12
|
+
throw new TypeError('Middleware must be composed of functions!');
|
|
13
|
+
}
|
|
14
|
+
if (middlewares.length == 1) {
|
|
15
|
+
return middlewares[0];
|
|
16
|
+
}
|
|
17
|
+
return function (context, next) {
|
|
18
|
+
// last called middleware #
|
|
19
|
+
let index = -1;
|
|
20
|
+
return dispatch(0);
|
|
21
|
+
async function dispatch(i) {
|
|
22
|
+
if (i <= index) {
|
|
23
|
+
throw new Error('next() called multiple times');
|
|
24
|
+
}
|
|
25
|
+
index = i;
|
|
26
|
+
let fn = middlewares[i];
|
|
27
|
+
if (i === middlewares.length)
|
|
28
|
+
fn = next;
|
|
29
|
+
if (!fn)
|
|
30
|
+
return {};
|
|
31
|
+
return fn(context, dispatch.bind(null, i + 1));
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":";;AAUA,0BA6BC;AAhCD;;GAEG;AACH,SAAgB,OAAO,CAAM,GAAG,WAA8B;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;IAE1F,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,OAAO,EAAE,KAAK,UAAU;YAAE,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAA;IAChG,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC;IAED,OAAO,UAAU,OAAY,EAAE,IAAsB;QACnD,2BAA2B;QAC3B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;QACd,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;QAClB,KAAK,UAAU,QAAQ,CAAC,CAAS;YAC/B,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACjD,CAAC;YACD,KAAK,GAAG,CAAC,CAAA;YACT,IAAI,EAAE,GAAgC,WAAW,CAAC,CAAC,CAAC,CAAA;YAEpD,IAAI,CAAC,KAAK,WAAW,CAAC,MAAM;gBAAE,EAAE,GAAG,IAAI,CAAA;YAEvC,IAAI,CAAC,EAAE;gBAAE,OAAO,EAAoB,CAAA;YAEpC,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|