@c9up/ream 0.2.29 → 0.2.30
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 +5 -6
- package/dist/Codemods.d.ts +8 -0
- package/dist/Codemods.d.ts.map +1 -1
- package/dist/Codemods.js +29 -1
- package/dist/Codemods.js.map +1 -1
- package/dist/HttpKernel.d.ts.map +1 -1
- package/dist/HttpKernel.js +17 -5
- package/dist/HttpKernel.js.map +1 -1
- package/dist/Ignitor.d.ts +5 -0
- package/dist/Ignitor.d.ts.map +1 -1
- package/dist/Ignitor.js +12 -1
- package/dist/Ignitor.js.map +1 -1
- package/dist/bodyparser/BodyParserMiddleware.d.ts +4 -4
- package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -1
- package/dist/bodyparser/BodyParserMiddleware.js +38 -11
- package/dist/bodyparser/BodyParserMiddleware.js.map +1 -1
- package/dist/bodyparser/MultipartFile.d.ts +21 -15
- package/dist/bodyparser/MultipartFile.d.ts.map +1 -1
- package/dist/bodyparser/MultipartFile.js +40 -58
- package/dist/bodyparser/MultipartFile.js.map +1 -1
- package/dist/bodyparser/parseSize.d.ts +7 -4
- package/dist/bodyparser/parseSize.d.ts.map +1 -1
- package/dist/bodyparser/parseSize.js +12 -17
- package/dist/bodyparser/parseSize.js.map +1 -1
- package/dist/bodyparser/qsParse.d.ts +10 -0
- package/dist/bodyparser/qsParse.d.ts.map +1 -1
- package/dist/bodyparser/qsParse.js +27 -12
- package/dist/bodyparser/qsParse.js.map +1 -1
- package/dist/console/prompts.d.ts.map +1 -1
- package/dist/console/prompts.js +3 -1
- package/dist/console/prompts.js.map +1 -1
- package/dist/container/Container.d.ts.map +1 -1
- package/dist/container/Container.js +61 -71
- package/dist/container/Container.js.map +1 -1
- package/dist/events/Emitter.d.ts +12 -0
- package/dist/events/Emitter.d.ts.map +1 -1
- package/dist/events/Emitter.js +36 -9
- package/dist/events/Emitter.js.map +1 -1
- package/dist/events/helix/helpers.d.ts.map +1 -1
- package/dist/events/helix/helpers.js +19 -9
- package/dist/events/helix/helpers.js.map +1 -1
- package/dist/graphql/GraphQLEngine.d.ts +8 -0
- package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
- package/dist/graphql/GraphQLEngine.js +77 -11
- package/dist/graphql/GraphQLEngine.js.map +1 -1
- package/dist/helpers/MessageBuilder.d.ts +4 -2
- package/dist/helpers/MessageBuilder.d.ts.map +1 -1
- package/dist/helpers/MessageBuilder.js +4 -2
- package/dist/helpers/MessageBuilder.js.map +1 -1
- package/dist/helpers/errors.d.ts +11 -0
- package/dist/helpers/errors.d.ts.map +1 -0
- package/dist/helpers/errors.js +17 -0
- package/dist/helpers/errors.js.map +1 -0
- package/dist/helpers/napi-loader.d.ts.map +1 -1
- package/dist/helpers/napi-loader.js +3 -2
- package/dist/helpers/napi-loader.js.map +1 -1
- package/dist/http/HttpContext.d.ts +20 -2
- package/dist/http/HttpContext.d.ts.map +1 -1
- package/dist/http/HttpContext.js +10 -4
- package/dist/http/HttpContext.js.map +1 -1
- package/dist/http/RedirectBuilder.d.ts.map +1 -1
- package/dist/http/RedirectBuilder.js +4 -0
- package/dist/http/RedirectBuilder.js.map +1 -1
- package/dist/http/Request.d.ts.map +1 -1
- package/dist/http/Request.js +15 -29
- package/dist/http/Request.js.map +1 -1
- package/dist/http/Response.d.ts +7 -4
- package/dist/http/Response.d.ts.map +1 -1
- package/dist/http/Response.js +14 -6
- package/dist/http/Response.js.map +1 -1
- package/dist/http/permissions.d.ts +14 -8
- package/dist/http/permissions.d.ts.map +1 -1
- package/dist/http/permissions.js +26 -16
- package/dist/http/permissions.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/Pipeline.js +1 -1
- package/dist/middleware/Pipeline.js.map +1 -1
- package/dist/native/generated.d.ts +16 -30
- package/dist/native/generated.d.ts.map +1 -1
- package/dist/profiler/Profiler.d.ts.map +1 -1
- package/dist/profiler/Profiler.js +4 -1
- package/dist/profiler/Profiler.js.map +1 -1
- package/dist/profiler/client.generated.d.ts +5 -0
- package/dist/profiler/client.generated.d.ts.map +1 -0
- package/dist/profiler/client.generated.js +6 -0
- package/dist/profiler/client.generated.js.map +1 -0
- package/dist/profiler/collectors.d.ts +92 -13
- package/dist/profiler/collectors.d.ts.map +1 -1
- package/dist/profiler/collectors.js +106 -19
- package/dist/profiler/collectors.js.map +1 -1
- package/dist/profiler/endpoint.d.ts +2 -1
- package/dist/profiler/endpoint.d.ts.map +1 -1
- package/dist/profiler/endpoint.js +25 -1
- package/dist/profiler/endpoint.js.map +1 -1
- package/dist/profiler/index.d.ts +8 -4
- package/dist/profiler/index.d.ts.map +1 -1
- package/dist/profiler/index.js +11 -4
- package/dist/profiler/index.js.map +1 -1
- package/dist/profiler/middleware.d.ts.map +1 -1
- package/dist/profiler/middleware.js +76 -10
- package/dist/profiler/middleware.js.map +1 -1
- package/dist/profiler/preview.d.ts +17 -0
- package/dist/profiler/preview.d.ts.map +1 -0
- package/dist/profiler/preview.js +100 -0
- package/dist/profiler/preview.js.map +1 -0
- package/dist/profiler/toolbar.d.ts +15 -23
- package/dist/profiler/toolbar.d.ts.map +1 -1
- package/dist/profiler/toolbar.js +25 -91
- package/dist/profiler/toolbar.js.map +1 -1
- package/dist/profiler/types.d.ts +6 -1
- package/dist/profiler/types.d.ts.map +1 -1
- package/dist/router/Router.d.ts +6 -0
- package/dist/router/Router.d.ts.map +1 -1
- package/dist/router/Router.js +115 -12
- package/dist/router/Router.js.map +1 -1
- package/dist/rpc/RpcRouter.js +3 -3
- package/dist/rpc/RpcRouter.js.map +1 -1
- package/dist/scheduler/Scheduler.js +1 -1
- package/dist/scheduler/Scheduler.js.map +1 -1
- package/dist/security/CookieSigner.d.ts.map +1 -1
- package/dist/security/CookieSigner.js +15 -5
- package/dist/security/CookieSigner.js.map +1 -1
- package/dist/security/SignedUrl.d.ts.map +1 -1
- package/dist/security/SignedUrl.js +10 -18
- package/dist/security/SignedUrl.js.map +1 -1
- package/dist/server/Server.d.ts +4 -1
- package/dist/server/Server.d.ts.map +1 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/nativeLimits.d.ts +9 -1
- package/dist/server/nativeLimits.d.ts.map +1 -1
- package/dist/server/nativeLimits.js +8 -0
- package/dist/server/nativeLimits.js.map +1 -1
- package/dist/session/Session.d.ts.map +1 -1
- package/dist/session/Session.js +13 -4
- package/dist/session/Session.js.map +1 -1
- package/dist/session/drivers/MemoryDriver.d.ts.map +1 -1
- package/dist/session/drivers/MemoryDriver.js +14 -2
- package/dist/session/drivers/MemoryDriver.js.map +1 -1
- package/dist/storage/StaticMiddleware.d.ts.map +1 -1
- package/dist/storage/StaticMiddleware.js +20 -9
- package/dist/storage/StaticMiddleware.js.map +1 -1
- package/dist/testing/ApiResponse.d.ts.map +1 -1
- package/dist/testing/ApiResponse.js +7 -1
- package/dist/testing/ApiResponse.js.map +1 -1
- package/dist/testing/TestClient.d.ts.map +1 -1
- package/dist/testing/TestClient.js +16 -4
- package/dist/testing/TestClient.js.map +1 -1
- package/dist/utils/Macroable.d.ts +1 -1
- package/dist/utils/Macroable.js +2 -2
- package/dist/utils/Macroable.js.map +1 -1
- package/events.darwin-arm64.node +0 -0
- package/events.darwin-x64.node +0 -0
- package/events.linux-arm64-gnu.node +0 -0
- package/events.linux-x64-gnu.node +0 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +1 -2
- package/scheduler.darwin-arm64.node +0 -0
- package/scheduler.darwin-x64.node +0 -0
- package/scheduler.linux-arm64-gnu.node +0 -0
- package/scheduler.linux-x64-gnu.node +0 -0
- package/scheduler.win32-x64-msvc.node +0 -0
- package/src/Codemods.ts +49 -3
- package/src/HttpKernel.ts +18 -7
- package/src/Ignitor.ts +21 -4
- package/src/bodyparser/BodyParserMiddleware.ts +42 -16
- package/src/bodyparser/MultipartFile.ts +46 -67
- package/src/bodyparser/parseSize.ts +17 -17
- package/src/bodyparser/qsParse.ts +28 -13
- package/src/console/prompts.ts +3 -1
- package/src/container/Container.ts +97 -81
- package/src/events/Emitter.ts +37 -10
- package/src/events/helix/helpers.ts +24 -19
- package/src/graphql/GraphQLEngine.ts +89 -13
- package/src/helpers/MessageBuilder.ts +4 -2
- package/src/helpers/errors.ts +16 -0
- package/src/helpers/napi-loader.ts +3 -2
- package/src/http/HttpContext.ts +20 -4
- package/src/http/RedirectBuilder.ts +3 -0
- package/src/http/Request.ts +15 -29
- package/src/http/Response.ts +15 -7
- package/src/http/permissions.ts +31 -15
- package/src/index.ts +2 -1
- package/src/middleware/Pipeline.ts +1 -1
- package/src/native/generated.ts +18 -42
- package/src/profiler/Profiler.ts +4 -1
- package/src/profiler/client/toolbar.css +595 -0
- package/src/profiler/client/toolbar.js +1299 -0
- package/src/profiler/client.generated.ts +7 -0
- package/src/profiler/collectors.ts +156 -19
- package/src/profiler/endpoint.ts +27 -1
- package/src/profiler/index.ts +17 -3
- package/src/profiler/middleware.ts +74 -9
- package/src/profiler/preview.ts +104 -0
- package/src/profiler/toolbar.ts +28 -91
- package/src/profiler/types.ts +6 -1
- package/src/router/Router.ts +136 -13
- package/src/rpc/RpcRouter.ts +4 -4
- package/src/scheduler/Scheduler.ts +1 -1
- package/src/security/CookieSigner.ts +13 -5
- package/src/security/SignedUrl.ts +12 -16
- package/src/server/Server.ts +4 -1
- package/src/server/nativeLimits.ts +18 -1
- package/src/session/Session.ts +13 -4
- package/src/session/drivers/MemoryDriver.ts +15 -2
- package/src/storage/StaticMiddleware.ts +18 -9
- package/src/testing/ApiResponse.ts +7 -1
- package/src/testing/TestClient.ts +14 -5
- package/src/utils/Macroable.ts +2 -2
- package/scripts/build-napi-types.mjs +0 -69
- package/scripts/copy-napi.mjs +0 -121
- package/scripts/generate-mime.mjs +0 -119
- package/scripts/generate-napi-types.mjs +0 -187
|
@@ -142,7 +142,7 @@ export class TestClient {
|
|
|
142
142
|
// Boots on the first request and no earlier. `#port` is read here rather
|
|
143
143
|
// than captured, so it is the port this boot bound to.
|
|
144
144
|
await this.boot();
|
|
145
|
-
return sendRequest(this.#port, m, p, { ...this.#headers, ...init.headers }, init.body
|
|
145
|
+
return sendRequest(this.#port, m, p, { ...this.#headers, ...init.headers }, init.body, init.timeoutMs);
|
|
146
146
|
};
|
|
147
147
|
return new RequestBuilder(sender, method, path, this.#auth, this.#sessionSeeder);
|
|
148
148
|
}
|
|
@@ -213,7 +213,10 @@ async function sendRequest(port, method, path, headers, body, timeoutMs) {
|
|
|
213
213
|
const headerLines = Object.entries(headers)
|
|
214
214
|
.map(([k, v]) => `${k}: ${v}`)
|
|
215
215
|
.join('\r\n');
|
|
216
|
-
|
|
216
|
+
// The body stays a Buffer end to end: a multipart upload of a PNG or a
|
|
217
|
+
// PDF is not valid UTF-8, and a round trip through a string replaced
|
|
218
|
+
// every such byte with U+FFFD before the server ever saw it.
|
|
219
|
+
const contentLength = body.length;
|
|
217
220
|
let request = `${method} ${path} HTTP/1.1\r\n`;
|
|
218
221
|
request += `Host: localhost:${port}\r\n`;
|
|
219
222
|
request += `Connection: close\r\n`;
|
|
@@ -224,8 +227,9 @@ async function sendRequest(port, method, path, headers, body, timeoutMs) {
|
|
|
224
227
|
request += `${headerLines}\r\n`;
|
|
225
228
|
}
|
|
226
229
|
request += '\r\n';
|
|
227
|
-
request += body;
|
|
228
230
|
socket.write(request);
|
|
231
|
+
if (contentLength > 0)
|
|
232
|
+
socket.write(body);
|
|
229
233
|
});
|
|
230
234
|
const chunks = [];
|
|
231
235
|
socket.on('data', (chunk) => chunks.push(chunk));
|
|
@@ -276,6 +280,10 @@ export function parseHttpResponse(raw) {
|
|
|
276
280
|
const statusLine = lines[0] ?? '';
|
|
277
281
|
const [, statusDigits] = statusLine.match(/HTTP\/\d+\.\d+ (\d+)/) ?? [];
|
|
278
282
|
const status = statusDigits === undefined ? 0 : Number.parseInt(statusDigits, 10);
|
|
283
|
+
// A repeated header is never overwritten. Set-Cookie lines are joined with
|
|
284
|
+
// `\n`, the way `Response.getHeaders()` hands them to the serializer: a
|
|
285
|
+
// cookie's `Expires` holds a comma, so a comma cannot separate two of them
|
|
286
|
+
// (RFC 6265 §3). Any other field is combined with `, ` (RFC 9110 §5.3).
|
|
279
287
|
const headers = {};
|
|
280
288
|
for (const line of lines.slice(1)) {
|
|
281
289
|
const colonIdx = line.indexOf(':');
|
|
@@ -283,7 +291,11 @@ export function parseHttpResponse(raw) {
|
|
|
283
291
|
continue;
|
|
284
292
|
const key = line.slice(0, colonIdx).trim().toLowerCase();
|
|
285
293
|
const value = line.slice(colonIdx + 1).trim();
|
|
286
|
-
headers[key]
|
|
294
|
+
const existing = headers[key];
|
|
295
|
+
if (existing === undefined)
|
|
296
|
+
headers[key] = value;
|
|
297
|
+
else
|
|
298
|
+
headers[key] = `${existing}${key === 'set-cookie' ? '\n' : ', '}${value}`;
|
|
287
299
|
}
|
|
288
300
|
// RFC 7230 §4.1: when Transfer-Encoding includes `chunked`, the message body
|
|
289
301
|
// is a sequence of `<size-hex>[;ext]\r\n<bytes>\r\n` chunks terminated by
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestClient.js","sourceRoot":"","sources":["../../src/testing/TestClient.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TestClient.js","sourceRoot":"","sources":["../../src/testing/TestClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export declare class Macroable {
|
|
|
22
22
|
/**
|
|
23
23
|
* Attach a method to every instance of THIS class (AdonisJS `macro`).
|
|
24
24
|
*
|
|
25
|
-
* `this.prototype`, not `Macroable.prototype`:
|
|
25
|
+
* `this.prototype`, not `Macroable.prototype`: nine classes extend this one,
|
|
26
26
|
* and defining on the base put every macro on all of them — a
|
|
27
27
|
* `Response.macro('json', …)` also landed on `Request`, `Router` and
|
|
28
28
|
* `HttpContext`, and two subclasses declaring the same name clobbered each
|
package/dist/utils/Macroable.js
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
// is what scopes a macro to the subclass that declared it. Using
|
|
4
4
|
// `Macroable.prototype` put every macro on all eight subclasses at once.
|
|
5
5
|
// Removing the `this` reintroduces that bug.
|
|
6
|
-
// biome-ignore lint/complexity/noStaticOnlyClass:
|
|
6
|
+
// biome-ignore lint/complexity/noStaticOnlyClass: nine classes extend this one to inherit macro()/getter(); it is a base class, not a namespace.
|
|
7
7
|
export class Macroable {
|
|
8
8
|
/**
|
|
9
9
|
* Attach a method to every instance of THIS class (AdonisJS `macro`).
|
|
10
10
|
*
|
|
11
|
-
* `this.prototype`, not `Macroable.prototype`:
|
|
11
|
+
* `this.prototype`, not `Macroable.prototype`: nine classes extend this one,
|
|
12
12
|
* and defining on the base put every macro on all of them — a
|
|
13
13
|
* `Response.macro('json', …)` also landed on `Request`, `Router` and
|
|
14
14
|
* `HttpContext`, and two subclasses declaring the same name clobbered each
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Macroable.js","sourceRoot":"","sources":["../../src/utils/Macroable.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,iEAAiE;AACjE,yEAAyE;AACzE,6CAA6C;AAyB7C,
|
|
1
|
+
{"version":3,"file":"Macroable.js","sourceRoot":"","sources":["../../src/utils/Macroable.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gFAAgF;AAChF,iEAAiE;AACjE,yEAAyE;AACzE,6CAA6C;AAyB7C,iJAAiJ;AACjJ,MAAM,OAAO,SAAS;IACpB;;;;;;;;OAQG;IACH,oEAAoE;IACpE,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,MAAM,CAAC,KAAK,CAA8B,IAAY,EAAE,EAAW;QACjE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;YAC1C,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAA8B,IAAY,EAAE,EAAY,EAAE,SAAS,GAAG,KAAK;QACtF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5E,OAAM;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;YAC1C,YAAY,EAAE,IAAI;YAClB,GAAG;gBACD,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;gBACrF,CAAC;gBACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAA;YACvB,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;CACF"}
|
package/events.darwin-arm64.node
CHANGED
|
Binary file
|
package/events.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/index.darwin-arm64.node
CHANGED
|
Binary file
|
package/index.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
package/index.linux-x64-gnu.node
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/ream",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.30",
|
|
4
4
|
"description": "Ream — Rust-powered Node.js application framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -228,7 +228,6 @@
|
|
|
228
228
|
"index.*.node",
|
|
229
229
|
"scheduler.*.node",
|
|
230
230
|
"events.*.node",
|
|
231
|
-
"scripts",
|
|
232
231
|
"src",
|
|
233
232
|
"swcrc.app.json",
|
|
234
233
|
"tsconfig.app.json",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/Codemods.ts
CHANGED
|
@@ -43,7 +43,10 @@ export interface Codemods {
|
|
|
43
43
|
options?: { force?: boolean },
|
|
44
44
|
): Promise<GeneratedStub>
|
|
45
45
|
registerCommand(importPath: string): Promise<void>
|
|
46
|
-
registerMiddleware(
|
|
46
|
+
registerMiddleware(
|
|
47
|
+
importPath: string,
|
|
48
|
+
options?: { tier?: 'server' | 'router'; position?: MiddlewarePosition },
|
|
49
|
+
): Promise<void>
|
|
47
50
|
defineEnvValidations(definition: EnvValidationNode): Promise<string[]>
|
|
48
51
|
addPreloadFile(modulePath: string, environments?: PreloadEnvironment[]): Promise<void>
|
|
49
52
|
}
|
|
@@ -131,6 +134,40 @@ function findTierBlock(
|
|
|
131
134
|
return { start, end: start + closeMatch.index }
|
|
132
135
|
}
|
|
133
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Where a middleware entry goes in its tier's array: at the end (`after`, the
|
|
139
|
+
* default, as the upstream assembler does) or at the head (`before`). Order is
|
|
140
|
+
* execution order, so a middleware that needs another one's work — a CSRF
|
|
141
|
+
* guard reading the session — is appended after it.
|
|
142
|
+
*/
|
|
143
|
+
export type MiddlewarePosition = 'before' | 'after'
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Insert `text` after the last element of the array whose contents span
|
|
147
|
+
* `block`, adding the comma the previous element may lack. A trailing line
|
|
148
|
+
* comment is stepped over so the comma never lands inside it.
|
|
149
|
+
*/
|
|
150
|
+
function appendToArray(
|
|
151
|
+
content: string,
|
|
152
|
+
block: { start: number; end: number },
|
|
153
|
+
text: string,
|
|
154
|
+
): string {
|
|
155
|
+
const inner = content.slice(block.start, block.end)
|
|
156
|
+
const trimmed = inner.trimEnd()
|
|
157
|
+
const insertAt = block.start + trimmed.length
|
|
158
|
+
if (trimmed.trim() === '' || trimmed.endsWith(',')) {
|
|
159
|
+
return `${content.slice(0, insertAt)}${text}${content.slice(insertAt)}`
|
|
160
|
+
}
|
|
161
|
+
const lineStart = trimmed.lastIndexOf('\n') + 1
|
|
162
|
+
const commentAt = trimmed.indexOf('//', lineStart)
|
|
163
|
+
const code = (commentAt === -1 ? trimmed : trimmed.slice(0, commentAt)).trimEnd()
|
|
164
|
+
if (code.trim() === '' || code.endsWith(',')) {
|
|
165
|
+
return `${content.slice(0, insertAt)}${text}${content.slice(insertAt)}`
|
|
166
|
+
}
|
|
167
|
+
const commaAt = block.start + code.length
|
|
168
|
+
return `${content.slice(0, commaAt)},${content.slice(commaAt, insertAt)}${text}${content.slice(insertAt)}`
|
|
169
|
+
}
|
|
170
|
+
|
|
134
171
|
/**
|
|
135
172
|
* Detect line ending (CRLF on Windows checkouts, LF elsewhere) so codemods preserve the file's existing convention.
|
|
136
173
|
* Majority-based: a stray CRLF in an otherwise-LF file must not flip the whole insertion to CRLF.
|
|
@@ -566,8 +603,14 @@ export function createCodemods(options?: { force?: boolean; cwd?: string }): Cod
|
|
|
566
603
|
*/
|
|
567
604
|
async registerMiddleware(
|
|
568
605
|
importPath: string,
|
|
569
|
-
options?: { tier?: MiddlewareTier },
|
|
606
|
+
options?: { tier?: MiddlewareTier; position?: MiddlewarePosition },
|
|
570
607
|
): Promise<void> {
|
|
608
|
+
const position = options?.position ?? 'after'
|
|
609
|
+
if (position !== 'before' && position !== 'after') {
|
|
610
|
+
throw new Error(
|
|
611
|
+
`[configure] Invalid middleware position: '${String(position)}'. Expected 'before' or 'after'.`,
|
|
612
|
+
)
|
|
613
|
+
}
|
|
571
614
|
const requestedTier = options?.tier ?? 'router'
|
|
572
615
|
if (!isMiddlewareTier(requestedTier)) {
|
|
573
616
|
throw new Error(
|
|
@@ -612,7 +655,10 @@ export function createCodemods(options?: { force?: boolean; cwd?: string }): Cod
|
|
|
612
655
|
|
|
613
656
|
const eol = detectLineEnding(content)
|
|
614
657
|
const entry = ` () => import('${importPath}'),`
|
|
615
|
-
content =
|
|
658
|
+
content =
|
|
659
|
+
position === 'before'
|
|
660
|
+
? `${content.slice(0, targetBlock.start)}${eol}${entry}${content.slice(targetBlock.start)}`
|
|
661
|
+
: appendToArray(content, targetBlock, `${eol}${entry}`)
|
|
616
662
|
fs.writeFileSync(kernelPath, content)
|
|
617
663
|
},
|
|
618
664
|
|
package/src/HttpKernel.ts
CHANGED
|
@@ -200,7 +200,7 @@ export function createHttpKernel(
|
|
|
200
200
|
// read decorator metadata via Reflect. Absent for inline-arrow
|
|
201
201
|
// route handlers — that's intentional, decorators only apply
|
|
202
202
|
// to controller methods.
|
|
203
|
-
controller: match.route.controller?.target
|
|
203
|
+
controller: controllerPrototype(match.route.controller?.target),
|
|
204
204
|
action: match.route.controller?.method,
|
|
205
205
|
}
|
|
206
206
|
: { pattern: '', middleware: [] }
|
|
@@ -212,6 +212,7 @@ export function createHttpKernel(
|
|
|
212
212
|
// value bound for this request cannot be seen by any other.
|
|
213
213
|
const resolver = config.container?.createResolver()
|
|
214
214
|
const ctx = new HttpContext(correlationId, reqData, match?.params ?? {}, routeInfo, resolver)
|
|
215
|
+
ctx.subdomains = match?.subdomains ?? {}
|
|
215
216
|
// What Adonis binds on every request's resolver: the context itself, so a
|
|
216
217
|
// controller or service can take `HttpContext` as a constructor dependency.
|
|
217
218
|
resolver?.bindValue(HttpContext, ctx)
|
|
@@ -453,18 +454,25 @@ function createControllerHandler(
|
|
|
453
454
|
// `HttpContext` as a dependency must get this request's, not a stale one.
|
|
454
455
|
const resolve = ctx.containerResolver ?? container
|
|
455
456
|
const instance = resolve ? await resolve.make(controller.target) : new controller.target()
|
|
456
|
-
const method
|
|
457
|
-
|
|
458
|
-
|
|
457
|
+
const method: unknown =
|
|
458
|
+
typeof instance === 'object' && instance !== null
|
|
459
|
+
? Reflect.get(instance, controller.method)
|
|
460
|
+
: undefined
|
|
459
461
|
if (typeof method !== 'function') {
|
|
460
462
|
throw new Error(
|
|
461
463
|
`Controller method '${controller.method}' not found on ${controller.target.name}`,
|
|
462
464
|
)
|
|
463
465
|
}
|
|
464
|
-
await
|
|
466
|
+
await Reflect.apply(method, instance, [ctx])
|
|
465
467
|
}
|
|
466
468
|
}
|
|
467
469
|
|
|
470
|
+
/** A controller class's prototype, where its decorators keep their metadata. */
|
|
471
|
+
function controllerPrototype(target: AnyConstructor | undefined): object | undefined {
|
|
472
|
+
const prototype: unknown = target?.prototype
|
|
473
|
+
return typeof prototype === 'object' && prototype !== null ? prototype : undefined
|
|
474
|
+
}
|
|
475
|
+
|
|
468
476
|
/**
|
|
469
477
|
* Read @Guard, @Role, @Permission metadata from a controller method.
|
|
470
478
|
* Returns empty arrays if no decorators are present.
|
|
@@ -554,8 +562,10 @@ function reconcileRepresentation(
|
|
|
554
562
|
/**
|
|
555
563
|
* Append the development script to an HTML body.
|
|
556
564
|
*
|
|
557
|
-
* Only HTML, and never a stream
|
|
558
|
-
*
|
|
565
|
+
* Only HTML, and never a stream or a base64-encoded body (`sendBuffer`, a
|
|
566
|
+
* buffered download): appending to any of them corrupts it — Rust fails to
|
|
567
|
+
* decode the base64 and the client receives the encoded text — and a page is
|
|
568
|
+
* the only thing that can act on the script anyway.
|
|
559
569
|
* Before `</body>` when there is one, so the script is inside the document
|
|
560
570
|
* rather than trailing after it.
|
|
561
571
|
*/
|
|
@@ -567,6 +577,7 @@ function withDevScript(
|
|
|
567
577
|
): string {
|
|
568
578
|
if (script === undefined || streamId !== undefined || body === '') return body
|
|
569
579
|
if (!(headers['content-type'] ?? '').includes('text/html')) return body
|
|
580
|
+
if (headers['x-ream-body-encoding'] === 'base64') return body
|
|
570
581
|
const closing = body.lastIndexOf('</body>')
|
|
571
582
|
return closing === -1 ? body + script : body.slice(0, closing) + script + body.slice(closing)
|
|
572
583
|
}
|
package/src/Ignitor.ts
CHANGED
|
@@ -301,6 +301,11 @@ export interface HyperServerLike {
|
|
|
301
301
|
// a clean `STREAMING_UNSUPPORTED` error when called on such a host.
|
|
302
302
|
registerStream?(streamId: string): Promise<boolean>
|
|
303
303
|
writeStream?(streamId: string, chunk: string): Promise<boolean>
|
|
304
|
+
/**
|
|
305
|
+
* Byte-exact writes. Without it a download, `response.stream()` or a static
|
|
306
|
+
* file is buffered whole and shipped base64-encoded in one response.
|
|
307
|
+
*/
|
|
308
|
+
writeStreamBytes?(streamId: string, chunk: Uint8Array): Promise<boolean>
|
|
304
309
|
closeStream?(streamId: string): Promise<boolean>
|
|
305
310
|
onStreamDisconnect?(streamId: string, callback: () => void): void
|
|
306
311
|
}
|
|
@@ -874,6 +879,12 @@ export class Ignitor {
|
|
|
874
879
|
return {
|
|
875
880
|
registerStream: server.registerStream.bind(server),
|
|
876
881
|
writeStream: server.writeStream.bind(server),
|
|
882
|
+
// The byte channel is what lets a download be streamed rather
|
|
883
|
+
// than read whole into memory; a host without it still gets SSE.
|
|
884
|
+
writeStreamBytes:
|
|
885
|
+
typeof server.writeStreamBytes === 'function'
|
|
886
|
+
? server.writeStreamBytes.bind(server)
|
|
887
|
+
: undefined,
|
|
877
888
|
closeStream: server.closeStream.bind(server),
|
|
878
889
|
onStreamDisconnect: server.onStreamDisconnect.bind(server),
|
|
879
890
|
}
|
|
@@ -1021,7 +1032,7 @@ export class Ignitor {
|
|
|
1021
1032
|
'File change detected — a process restart is required to apply it (`ream dev` restarts automatically).',
|
|
1022
1033
|
severity: 'info',
|
|
1023
1034
|
timestamp: new Date().toISOString(),
|
|
1024
|
-
}
|
|
1035
|
+
})
|
|
1025
1036
|
},
|
|
1026
1037
|
logger: {
|
|
1027
1038
|
info: (msg) =>
|
|
@@ -1031,7 +1042,7 @@ export class Ignitor {
|
|
|
1031
1042
|
message: msg,
|
|
1032
1043
|
severity: 'info',
|
|
1033
1044
|
timestamp: new Date().toISOString(),
|
|
1034
|
-
}
|
|
1045
|
+
}),
|
|
1035
1046
|
},
|
|
1036
1047
|
})
|
|
1037
1048
|
}
|
|
@@ -1414,7 +1425,13 @@ export class Ignitor {
|
|
|
1414
1425
|
const events = this.#app.container.has('events')
|
|
1415
1426
|
? await this.#app.container.resolve<Emitter>('events')
|
|
1416
1427
|
: { on: () => undefined }
|
|
1417
|
-
|
|
1428
|
+
// Imported here, at start, rather than at the top: the barrel imports this
|
|
1429
|
+
// module, and its `VERSION` is what the release bump rewrites.
|
|
1430
|
+
const { VERSION } = await import('./index.js')
|
|
1431
|
+
this.#profiler = createProfiler(events, [], {
|
|
1432
|
+
version: VERSION,
|
|
1433
|
+
environment: process.env.REAM_ENV ?? process.env.NODE_ENV ?? 'development',
|
|
1434
|
+
})
|
|
1418
1435
|
}
|
|
1419
1436
|
|
|
1420
1437
|
#profiler?: Profiler
|
|
@@ -1468,7 +1485,7 @@ export class Ignitor {
|
|
|
1468
1485
|
message,
|
|
1469
1486
|
severity: kind === 'error' ? 'critical' : 'info',
|
|
1470
1487
|
timestamp: new Date().toISOString(),
|
|
1471
|
-
}
|
|
1488
|
+
})
|
|
1472
1489
|
}
|
|
1473
1490
|
}
|
|
1474
1491
|
|
|
@@ -21,11 +21,11 @@ export interface BodyParserConfig {
|
|
|
21
21
|
*/
|
|
22
22
|
allowedMethods?: string[]
|
|
23
23
|
json?: {
|
|
24
|
-
limit?: string // e.g. '1mb'
|
|
24
|
+
limit?: string | number // e.g. '1mb', '1.5 mb' or a number of bytes
|
|
25
25
|
types?: string[]
|
|
26
26
|
}
|
|
27
27
|
form?: {
|
|
28
|
-
limit?: string
|
|
28
|
+
limit?: string | number
|
|
29
29
|
types?: string[]
|
|
30
30
|
/**
|
|
31
31
|
* Turn `''` into `null`. AdonisJS defaults this to `true`, so an empty
|
|
@@ -39,12 +39,12 @@ export interface BodyParserConfig {
|
|
|
39
39
|
queryString?: QsParseOptions
|
|
40
40
|
}
|
|
41
41
|
raw?: {
|
|
42
|
-
limit?: string
|
|
42
|
+
limit?: string | number
|
|
43
43
|
types?: string[]
|
|
44
44
|
}
|
|
45
45
|
multipart?: {
|
|
46
46
|
/** Total multipart body size cap (sum of all file sizes). Default: '20mb'. */
|
|
47
|
-
limit?: string
|
|
47
|
+
limit?: string | number
|
|
48
48
|
/**
|
|
49
49
|
* Maximum number of files per request. AdonisJS has no such option — it
|
|
50
50
|
* bounds a multipart body by total size and field count only, so ten
|
|
@@ -98,6 +98,8 @@ const DEFAULT_CONFIG: ResolvedBodyParserConfig = {
|
|
|
98
98
|
|
|
99
99
|
export default class BodyParserMiddleware {
|
|
100
100
|
#config: ResolvedBodyParserConfig
|
|
101
|
+
/** Each section's limit in bytes, read once so a bad size fails at boot. */
|
|
102
|
+
readonly #limits: { json: number; form: number; raw: number; multipart: number }
|
|
101
103
|
|
|
102
104
|
constructor(explicitConfig: BodyParserConfig | undefined = undefined) {
|
|
103
105
|
// The default value is load-bearing: an OPTIONAL parameter still counts
|
|
@@ -118,6 +120,12 @@ export default class BodyParserMiddleware {
|
|
|
118
120
|
raw: { ...DEFAULT_CONFIG.raw, ...config?.raw },
|
|
119
121
|
multipart: { ...DEFAULT_CONFIG.multipart, ...config?.multipart },
|
|
120
122
|
}
|
|
123
|
+
this.#limits = {
|
|
124
|
+
json: parseSize(this.#config.json.limit),
|
|
125
|
+
form: parseSize(this.#config.form.limit),
|
|
126
|
+
raw: parseSize(this.#config.raw.limit),
|
|
127
|
+
multipart: parseSize(this.#config.multipart.limit),
|
|
128
|
+
}
|
|
121
129
|
}
|
|
122
130
|
|
|
123
131
|
async handle(ctx: HttpContext, next: () => Promise<void>) {
|
|
@@ -144,13 +152,14 @@ export default class BodyParserMiddleware {
|
|
|
144
152
|
// Size check. Thrown rather than written: the app's exception handler
|
|
145
153
|
// negotiates the response, so an HTML app gets an error page instead of a
|
|
146
154
|
// JSON envelope it never asked for — and can override the rendering.
|
|
147
|
-
if (Buffer.byteLength(rawBody, 'utf8') >
|
|
155
|
+
if (Buffer.byteLength(rawBody, 'utf8') > this.#getLimit(contentType)) {
|
|
148
156
|
throw entityTooLarge('request entity too large')
|
|
149
157
|
}
|
|
150
158
|
|
|
151
|
-
// JSON
|
|
159
|
+
// JSON — parsed here and only here, under one of `json.types`. A body
|
|
160
|
+
// with any other media type (or none) is never read as JSON.
|
|
152
161
|
if (matchesType(contentType, this.#config.json.types)) {
|
|
153
|
-
|
|
162
|
+
ctx.request.setParsedBody(parseJsonBody(rawBody))
|
|
154
163
|
}
|
|
155
164
|
|
|
156
165
|
// Form URL-encoded
|
|
@@ -191,11 +200,11 @@ export default class BodyParserMiddleware {
|
|
|
191
200
|
await next()
|
|
192
201
|
}
|
|
193
202
|
|
|
194
|
-
#getLimit(contentType: string):
|
|
195
|
-
if (matchesType(contentType, this.#config.json.types)) return this.#
|
|
196
|
-
if (matchesType(contentType, this.#config.form.types)) return this.#
|
|
197
|
-
if (matchesType(contentType, this.#config.multipart.types)) return this.#
|
|
198
|
-
return this.#
|
|
203
|
+
#getLimit(contentType: string): number {
|
|
204
|
+
if (matchesType(contentType, this.#config.json.types)) return this.#limits.json
|
|
205
|
+
if (matchesType(contentType, this.#config.form.types)) return this.#limits.form
|
|
206
|
+
if (matchesType(contentType, this.#config.multipart.types)) return this.#limits.multipart
|
|
207
|
+
return this.#limits.raw
|
|
199
208
|
}
|
|
200
209
|
|
|
201
210
|
/**
|
|
@@ -217,12 +226,30 @@ export default class BodyParserMiddleware {
|
|
|
217
226
|
}
|
|
218
227
|
|
|
219
228
|
const totalBytes = files.reduce((sum, f) => sum + f.size, 0)
|
|
220
|
-
if (totalBytes >
|
|
229
|
+
if (totalBytes > this.#limits.multipart) {
|
|
221
230
|
throw entityTooLarge('request entity too large')
|
|
222
231
|
}
|
|
223
232
|
}
|
|
224
233
|
}
|
|
225
234
|
|
|
235
|
+
/**
|
|
236
|
+
* A JSON body as the request body: an object as is, any other JSON value under
|
|
237
|
+
* `_body` (the shape the raw-text parser uses), and `{}` for malformed JSON.
|
|
238
|
+
*/
|
|
239
|
+
function parseJsonBody(raw: string): Record<string, unknown> {
|
|
240
|
+
if (raw.length === 0) return {}
|
|
241
|
+
let parsed: unknown
|
|
242
|
+
try {
|
|
243
|
+
parsed = JSON.parse(raw)
|
|
244
|
+
} catch {
|
|
245
|
+
return {}
|
|
246
|
+
}
|
|
247
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
248
|
+
return { ...parsed }
|
|
249
|
+
}
|
|
250
|
+
return { _body: parsed }
|
|
251
|
+
}
|
|
252
|
+
|
|
226
253
|
/** The one exception every body-size limit raises (AdonisJS parity). */
|
|
227
254
|
function entityTooLarge(message: string): Exception {
|
|
228
255
|
return new Exception(message, { status: 413, code: 'E_REQUEST_ENTITY_TOO_LARGE' })
|
|
@@ -250,8 +277,7 @@ function matchesType(contentType: string, types: string[]): boolean {
|
|
|
250
277
|
|
|
251
278
|
/**
|
|
252
279
|
* `enabled` was an atlas-era invention: AdonisJS has no such flag, and a parser
|
|
253
|
-
* is turned off by giving it no `types`.
|
|
254
|
-
* `Request` lazy-parses on first read regardless.
|
|
280
|
+
* is turned off by giving it no `types`.
|
|
255
281
|
*
|
|
256
282
|
* Silently ignoring a config key that used to mean something would re-enable a
|
|
257
283
|
* parser an app deliberately switched off, so it fails loudly with the
|
|
@@ -278,7 +304,7 @@ function assertNoEnabledFlag(config?: BodyParserConfig): void {
|
|
|
278
304
|
throw new Error(
|
|
279
305
|
'[E_BODYPARSER_CONFIG] `multipart.tmpDir` is not supported — uploaded files are held in ' +
|
|
280
306
|
'memory and never written to a temporary directory. Choose the destination when you ' +
|
|
281
|
-
'store the file: `await file.
|
|
307
|
+
'store the file: `await file.move(directory)`.',
|
|
282
308
|
)
|
|
283
309
|
}
|
|
284
310
|
}
|