@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.
Files changed (59) hide show
  1. package/README.md +3 -0
  2. package/dist/benchmark.d.ts +1 -0
  3. package/dist/benchmark.js +94 -0
  4. package/dist/benchmark.js.map +1 -0
  5. package/dist/cors.d.ts +35 -0
  6. package/dist/cors.js +138 -0
  7. package/dist/cors.js.map +1 -0
  8. package/dist/helpers.d.ts +1 -0
  9. package/dist/helpers.js +3 -0
  10. package/dist/helpers.js.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.js +25 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/injectors.d.ts +5 -0
  15. package/dist/injectors.js +22 -0
  16. package/dist/injectors.js.map +1 -0
  17. package/dist/layer.d.ts +58 -0
  18. package/dist/layer.js +102 -0
  19. package/dist/layer.js.map +1 -0
  20. package/dist/logic.d.ts +12 -0
  21. package/dist/logic.js +288 -0
  22. package/dist/logic.js.map +1 -0
  23. package/dist/methods.d.ts +6 -0
  24. package/dist/methods.js +16 -0
  25. package/dist/methods.js.map +1 -0
  26. package/dist/metrics.d.ts +36 -0
  27. package/dist/metrics.js +107 -0
  28. package/dist/metrics.js.map +1 -0
  29. package/dist/middleware.d.ts +9 -0
  30. package/dist/middleware.js +35 -0
  31. package/dist/middleware.js.map +1 -0
  32. package/dist/router.d.ts +190 -0
  33. package/dist/router.js +516 -0
  34. package/dist/router.js.map +1 -0
  35. package/dist/server-handler.d.ts +1 -0
  36. package/dist/server-handler.js +34 -0
  37. package/dist/server-handler.js.map +1 -0
  38. package/dist/server.d.ts +17 -0
  39. package/dist/server.js +176 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/status-checks.d.ts +33 -0
  42. package/dist/status-checks.js +154 -0
  43. package/dist/status-checks.js.map +1 -0
  44. package/dist/terminator.d.ts +18 -0
  45. package/dist/terminator.js +128 -0
  46. package/dist/terminator.js.map +1 -0
  47. package/dist/test-component.d.ts +22 -0
  48. package/dist/test-component.js +89 -0
  49. package/dist/test-component.js.map +1 -0
  50. package/dist/test-server.d.ts +21 -0
  51. package/dist/test-server.js +81 -0
  52. package/dist/test-server.js.map +1 -0
  53. package/dist/types.d.ts +32 -0
  54. package/dist/types.js +3 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/ws.d.ts +8 -0
  57. package/dist/ws.js +32 -0
  58. package/dist/ws.js.map +1 -0
  59. 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>;
@@ -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 {};
@@ -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"}