@fougere/http 0.4.0-alpha.0 → 0.5.0-alpha.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/dist/express.d.ts.map +1 -1
- package/dist/express.js +5 -16
- package/dist/express.js.map +1 -1
- package/dist/fastify.d.ts +0 -3
- package/dist/fastify.d.ts.map +1 -1
- package/dist/fastify.js +5 -18
- package/dist/fastify.js.map +1 -1
- package/dist/router.d.ts +11 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +16 -0
- package/dist/router.js.map +1 -1
- package/package.json +1 -1
- package/src/express.ts +5 -17
- package/src/fastify.ts +2 -23
- package/src/router.ts +25 -0
package/dist/express.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAA6B,KAAK,UAAU,EAA4F,MAAM,aAAa,CAAC;AAEnK,UAAU,WAAW;IACnB,GAAG,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACnC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC/C;AAeD,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAqB1D;AAoDD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,UAAU,CAuChE"}
|
package/dist/express.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* works when the host app is configured a particular way is a footgun, and this
|
|
12
12
|
* one is meant to be dropped into an app that already exists.
|
|
13
13
|
*/
|
|
14
|
-
import { MalformedJsonError } from './router.js';
|
|
14
|
+
import { MalformedJsonError, chain } from './router.js';
|
|
15
15
|
const METHOD_MAP = {
|
|
16
16
|
GET: 'get',
|
|
17
17
|
POST: 'post',
|
|
@@ -19,6 +19,9 @@ const METHOD_MAP = {
|
|
|
19
19
|
PATCH: 'patch',
|
|
20
20
|
DELETE: 'delete',
|
|
21
21
|
};
|
|
22
|
+
// Core declares this cap (`wire/call.ts`) and three doors read it there. This package
|
|
23
|
+
// declares NO Fougere dependency — a leaf port does not take one on the kernel for a
|
|
24
|
+
// number — so it keeps the fourth copy, deliberately.
|
|
22
25
|
const MAX_BODY_BYTES = 1024 * 1024;
|
|
23
26
|
/** Drain the Node stream. Only reached when no body parser ran before us. */
|
|
24
27
|
export function readRawBody(req) {
|
|
@@ -137,20 +140,6 @@ function sendResponse(res, result) {
|
|
|
137
140
|
export function createExpressRouter(app) {
|
|
138
141
|
const globalMiddlewares = [];
|
|
139
142
|
const scopedMiddlewares = [];
|
|
140
|
-
// Run matching middlewares as an onion chain around the handler
|
|
141
|
-
function runMiddlewares(ctx, handler) {
|
|
142
|
-
const matching = [
|
|
143
|
-
...globalMiddlewares,
|
|
144
|
-
...scopedMiddlewares.filter((s) => ctx.path.startsWith(s.path)).map((s) => s.mw),
|
|
145
|
-
];
|
|
146
|
-
let index = 0;
|
|
147
|
-
const next = () => {
|
|
148
|
-
if (index < matching.length)
|
|
149
|
-
return matching[index++](ctx, next);
|
|
150
|
-
return handler(ctx);
|
|
151
|
-
};
|
|
152
|
-
return next();
|
|
153
|
-
}
|
|
154
143
|
return {
|
|
155
144
|
use(...args) {
|
|
156
145
|
const [pathOrMw, maybeMw] = args;
|
|
@@ -166,7 +155,7 @@ export function createExpressRouter(app) {
|
|
|
166
155
|
on(method, path, handler) {
|
|
167
156
|
app[METHOD_MAP[method]](path, async (req, res, next) => {
|
|
168
157
|
try {
|
|
169
|
-
sendResponse(res, await
|
|
158
|
+
sendResponse(res, await chain(globalMiddlewares, scopedMiddlewares, buildContext(req), handler));
|
|
170
159
|
}
|
|
171
160
|
catch (err) {
|
|
172
161
|
// This adapter is the one that parses JSON, so it is the one that answers
|
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,kBAAkB,EAA6G,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
|
package/dist/fastify.d.ts
CHANGED
package/dist/fastify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAmE,MAAM,aAAa,CAAC;AAE/G,UAAU,WAAW;IACnB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC5C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC/C;AAoDD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAyBnE"}
|
package/dist/fastify.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fastify adapter — bridges a Fastify server to the HttpRouter interface.
|
|
3
|
+
*/
|
|
4
|
+
import { chain } from './router.js';
|
|
1
5
|
const METHOD_MAP = {
|
|
2
6
|
GET: 'get',
|
|
3
7
|
POST: 'post',
|
|
@@ -58,23 +62,6 @@ function sendResponse(reply, result) {
|
|
|
58
62
|
export function createFastifyRouter(server) {
|
|
59
63
|
const globalMiddlewares = [];
|
|
60
64
|
const scopedMiddlewares = [];
|
|
61
|
-
// Run matching middlewares as an onion chain around the handler
|
|
62
|
-
function runMiddlewares(ctx, handler) {
|
|
63
|
-
const matching = [
|
|
64
|
-
...globalMiddlewares,
|
|
65
|
-
...scopedMiddlewares
|
|
66
|
-
.filter((s) => ctx.path.startsWith(s.path))
|
|
67
|
-
.map((s) => s.mw),
|
|
68
|
-
];
|
|
69
|
-
let index = 0;
|
|
70
|
-
const next = () => {
|
|
71
|
-
if (index < matching.length) {
|
|
72
|
-
return matching[index++](ctx, next);
|
|
73
|
-
}
|
|
74
|
-
return handler(ctx);
|
|
75
|
-
};
|
|
76
|
-
return next();
|
|
77
|
-
}
|
|
78
65
|
return {
|
|
79
66
|
use(...args) {
|
|
80
67
|
const [pathOrMw, maybeMw] = args;
|
|
@@ -91,7 +78,7 @@ export function createFastifyRouter(server) {
|
|
|
91
78
|
const m = METHOD_MAP[method];
|
|
92
79
|
server[m](path, async (req, reply) => {
|
|
93
80
|
const ctx = buildContext(req);
|
|
94
|
-
const result = await
|
|
81
|
+
const result = await chain(globalMiddlewares, scopedMiddlewares, ctx, handler);
|
|
95
82
|
sendResponse(reply, result);
|
|
96
83
|
});
|
|
97
84
|
},
|
package/dist/fastify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"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"}
|
package/dist/router.d.ts
CHANGED
|
@@ -64,4 +64,15 @@ export interface HttpRouter {
|
|
|
64
64
|
/** Register a route handler. */
|
|
65
65
|
on(method: HttpMethod, path: string, handler: Handler): void;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* The onion chain both adapters run: matching middlewares around the handler.
|
|
69
|
+
*
|
|
70
|
+
* Stated once because it was stated twice, identically, in `express.ts` and `fastify.ts` —
|
|
71
|
+
* the same package, and the same place `PASSTHROUGH` already lives. A scoped middleware
|
|
72
|
+
* matches by `startsWith`, which is what makes the two adapters agree on a mounted path.
|
|
73
|
+
*/
|
|
74
|
+
export declare function chain(global: Middleware[], scoped: {
|
|
75
|
+
path: string;
|
|
76
|
+
mw: Middleware;
|
|
77
|
+
}[], ctx: RequestContext, handler: Handler): Promise<ResponseResult>;
|
|
67
78
|
//# sourceMappingURL=router.d.ts.map
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5C,4FAA4F;IAC5F,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,4EAA4E;AAC5E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,CAAC,EAAE,YAAY,EAGjC;CACF;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AACvE,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;AACjD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,MAA2C,CAAC;AAE7E,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEtF,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,qDAAqD;IACrD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAChD,gCAAgC;IAChC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9D"}
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5C,4FAA4F;IAC5F,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,4EAA4E;AAC5E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,CAAC,EAAE,YAAY,EAGjC;CACF;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AACvE,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;AACjD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,MAA2C,CAAC;AAE7E,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEtF,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,qDAAqD;IACrD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAChD,gCAAgC;IAChC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CACnB,MAAM,EAAE,UAAU,EAAE,EACpB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,UAAU,CAAA;CAAE,EAAE,EAC1C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,cAAc,CAAC,CAWzB"}
|
package/dist/router.js
CHANGED
|
@@ -26,4 +26,20 @@ export class MalformedJsonError extends Error {
|
|
|
26
26
|
* adapter that does not own its chain returns it from the `next` it hands out.
|
|
27
27
|
*/
|
|
28
28
|
export const PASSTHROUGH = Symbol('fougere.http.passthrough');
|
|
29
|
+
/**
|
|
30
|
+
* The onion chain both adapters run: matching middlewares around the handler.
|
|
31
|
+
*
|
|
32
|
+
* Stated once because it was stated twice, identically, in `express.ts` and `fastify.ts` —
|
|
33
|
+
* the same package, and the same place `PASSTHROUGH` already lives. A scoped middleware
|
|
34
|
+
* matches by `startsWith`, which is what makes the two adapters agree on a mounted path.
|
|
35
|
+
*/
|
|
36
|
+
export function chain(global, scoped, ctx, handler) {
|
|
37
|
+
const matching = [
|
|
38
|
+
...global,
|
|
39
|
+
...scoped.filter((s) => ctx.path.startsWith(s.path)).map((s) => s.mw),
|
|
40
|
+
];
|
|
41
|
+
let index = 0;
|
|
42
|
+
const next = () => index < matching.length ? matching[index++](ctx, next) : handler(ctx);
|
|
43
|
+
return next();
|
|
44
|
+
}
|
|
29
45
|
//# sourceMappingURL=router.js.map
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH,4EAA4E;AAC5E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAsB;QAChC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAID;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,0BAA0B,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH,4EAA4E;AAC5E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAsB;QAChC,KAAK,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAID;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAa7E;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CACnB,MAAoB,EACpB,MAA0C,EAC1C,GAAmB,EACnB,OAAgB;IAEhB,MAAM,QAAQ,GAAG;QACf,GAAG,MAAM;QACT,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC;IAEF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,IAAI,GAAG,GAA4B,EAAE,CACzC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAExE,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
package/src/express.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* works when the host app is configured a particular way is a footgun, and this
|
|
12
12
|
* one is meant to be dropped into an app that already exists.
|
|
13
13
|
*/
|
|
14
|
-
import { MalformedJsonError, type HttpRouter, type HttpMethod, type RequestContext, type ResponseResult, type Middleware, type Handler } from './router.js';
|
|
14
|
+
import { MalformedJsonError, chain, type HttpRouter, type HttpMethod, type RequestContext, type ResponseResult, type Middleware, type Handler } from './router.js';
|
|
15
15
|
|
|
16
16
|
interface ExpressLike {
|
|
17
17
|
use(...handlers: Function[]): void;
|
|
@@ -30,6 +30,9 @@ const METHOD_MAP: Record<HttpMethod, 'get' | 'post' | 'put' | 'patch' | 'delete'
|
|
|
30
30
|
DELETE: 'delete',
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
// Core declares this cap (`wire/call.ts`) and three doors read it there. This package
|
|
34
|
+
// declares NO Fougere dependency — a leaf port does not take one on the kernel for a
|
|
35
|
+
// number — so it keeps the fourth copy, deliberately.
|
|
33
36
|
const MAX_BODY_BYTES = 1024 * 1024;
|
|
34
37
|
|
|
35
38
|
/** Drain the Node stream. Only reached when no body parser ran before us. */
|
|
@@ -150,21 +153,6 @@ export function createExpressRouter(app: ExpressLike): HttpRouter {
|
|
|
150
153
|
const globalMiddlewares: Middleware[] = [];
|
|
151
154
|
const scopedMiddlewares: { path: string; mw: Middleware }[] = [];
|
|
152
155
|
|
|
153
|
-
// Run matching middlewares as an onion chain around the handler
|
|
154
|
-
function runMiddlewares(ctx: RequestContext, handler: Handler): Promise<ResponseResult> {
|
|
155
|
-
const matching = [
|
|
156
|
-
...globalMiddlewares,
|
|
157
|
-
...scopedMiddlewares.filter((s) => ctx.path.startsWith(s.path)).map((s) => s.mw),
|
|
158
|
-
];
|
|
159
|
-
|
|
160
|
-
let index = 0;
|
|
161
|
-
const next = (): Promise<ResponseResult> => {
|
|
162
|
-
if (index < matching.length) return matching[index++](ctx, next);
|
|
163
|
-
return handler(ctx);
|
|
164
|
-
};
|
|
165
|
-
return next();
|
|
166
|
-
}
|
|
167
|
-
|
|
168
156
|
return {
|
|
169
157
|
use(...args: [Middleware] | [string, Middleware]): void {
|
|
170
158
|
const [pathOrMw, maybeMw] = args;
|
|
@@ -180,7 +168,7 @@ export function createExpressRouter(app: ExpressLike): HttpRouter {
|
|
|
180
168
|
on(method: HttpMethod, path: string, handler: Handler): void {
|
|
181
169
|
app[METHOD_MAP[method]](path, async (req: any, res: any, next: Function) => {
|
|
182
170
|
try {
|
|
183
|
-
sendResponse(res, await
|
|
171
|
+
sendResponse(res, await chain(globalMiddlewares, scopedMiddlewares, buildContext(req), handler));
|
|
184
172
|
} catch (err) {
|
|
185
173
|
// This adapter is the one that parses JSON, so it is the one that answers
|
|
186
174
|
// for it — same 400 the Hono adapter gives, which is the other self-parsing
|
package/src/fastify.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fastify adapter — bridges a Fastify server to the HttpRouter interface.
|
|
3
3
|
*/
|
|
4
|
+
import { chain } from './router.js';
|
|
4
5
|
import type { HttpRouter, HttpMethod, RequestContext, ResponseResult, Middleware, Handler } from './router.js';
|
|
5
6
|
|
|
6
7
|
interface FastifyLike {
|
|
@@ -77,28 +78,6 @@ export function createFastifyRouter(server: FastifyLike): HttpRouter {
|
|
|
77
78
|
const globalMiddlewares: Middleware[] = [];
|
|
78
79
|
const scopedMiddlewares: { path: string; mw: Middleware }[] = [];
|
|
79
80
|
|
|
80
|
-
// Run matching middlewares as an onion chain around the handler
|
|
81
|
-
function runMiddlewares(
|
|
82
|
-
ctx: RequestContext,
|
|
83
|
-
handler: Handler,
|
|
84
|
-
): Promise<ResponseResult> {
|
|
85
|
-
const matching = [
|
|
86
|
-
...globalMiddlewares,
|
|
87
|
-
...scopedMiddlewares
|
|
88
|
-
.filter((s) => ctx.path.startsWith(s.path))
|
|
89
|
-
.map((s) => s.mw),
|
|
90
|
-
];
|
|
91
|
-
|
|
92
|
-
let index = 0;
|
|
93
|
-
const next = (): Promise<ResponseResult> => {
|
|
94
|
-
if (index < matching.length) {
|
|
95
|
-
return matching[index++](ctx, next);
|
|
96
|
-
}
|
|
97
|
-
return handler(ctx);
|
|
98
|
-
};
|
|
99
|
-
return next();
|
|
100
|
-
}
|
|
101
|
-
|
|
102
81
|
return {
|
|
103
82
|
use(...args: [Middleware] | [string, Middleware]): void {
|
|
104
83
|
const [pathOrMw, maybeMw] = args;
|
|
@@ -115,7 +94,7 @@ export function createFastifyRouter(server: FastifyLike): HttpRouter {
|
|
|
115
94
|
const m = METHOD_MAP[method];
|
|
116
95
|
server[m](path, async (req: any, reply: any) => {
|
|
117
96
|
const ctx = buildContext(req);
|
|
118
|
-
const result = await
|
|
97
|
+
const result = await chain(globalMiddlewares, scopedMiddlewares, ctx, handler);
|
|
119
98
|
sendResponse(reply, result);
|
|
120
99
|
});
|
|
121
100
|
},
|
package/src/router.ts
CHANGED
|
@@ -74,3 +74,28 @@ export interface HttpRouter {
|
|
|
74
74
|
/** Register a route handler. */
|
|
75
75
|
on(method: HttpMethod, path: string, handler: Handler): void;
|
|
76
76
|
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The onion chain both adapters run: matching middlewares around the handler.
|
|
80
|
+
*
|
|
81
|
+
* Stated once because it was stated twice, identically, in `express.ts` and `fastify.ts` —
|
|
82
|
+
* the same package, and the same place `PASSTHROUGH` already lives. A scoped middleware
|
|
83
|
+
* matches by `startsWith`, which is what makes the two adapters agree on a mounted path.
|
|
84
|
+
*/
|
|
85
|
+
export function chain(
|
|
86
|
+
global: Middleware[],
|
|
87
|
+
scoped: { path: string; mw: Middleware }[],
|
|
88
|
+
ctx: RequestContext,
|
|
89
|
+
handler: Handler,
|
|
90
|
+
): Promise<ResponseResult> {
|
|
91
|
+
const matching = [
|
|
92
|
+
...global,
|
|
93
|
+
...scoped.filter((s) => ctx.path.startsWith(s.path)).map((s) => s.mw),
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
let index = 0;
|
|
97
|
+
const next = (): Promise<ResponseResult> =>
|
|
98
|
+
index < matching.length ? matching[index++](ctx, next) : handler(ctx);
|
|
99
|
+
|
|
100
|
+
return next();
|
|
101
|
+
}
|