pipework 0.64.0 → 0.66.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/CHANGELOG.md +10 -0
- package/REFERENCE.md +87 -0
- package/dist/auth/tenant/in-tenant.d.ts +11 -0
- package/dist/auth/tenant/in-tenant.d.ts.map +1 -0
- package/dist/auth/tenant/in-tenant.js +23 -0
- package/dist/auth/tenant/in-tenant.js.map +1 -0
- package/dist/core/config/namespace.d.ts +1 -0
- package/dist/core/config/namespace.d.ts.map +1 -1
- package/dist/core/config/schema.d.ts +3 -0
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +2 -0
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/errors/http.d.ts +10 -0
- package/dist/core/errors/http.d.ts.map +1 -1
- package/dist/core/errors/http.js +14 -0
- package/dist/core/errors/http.js.map +1 -1
- package/dist/core/errors/index.d.ts +1 -1
- package/dist/core/errors/index.d.ts.map +1 -1
- package/dist/core/errors/index.js +1 -1
- package/dist/core/errors/index.js.map +1 -1
- package/dist/core/errors/namespace.d.ts +5 -1
- package/dist/core/errors/namespace.d.ts.map +1 -1
- package/dist/core/errors/namespace.js +5 -1
- package/dist/core/errors/namespace.js.map +1 -1
- package/dist/data/migrate/internal-definitions.d.ts.map +1 -1
- package/dist/data/migrate/internal-definitions.js +7 -0
- package/dist/data/migrate/internal-definitions.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/access-links/handle.d.ts.map +1 -1
- package/dist/infra/access-links/handle.js +3 -17
- package/dist/infra/access-links/handle.js.map +1 -1
- package/dist/infra/credits/handle.d.ts +149 -0
- package/dist/infra/credits/handle.d.ts.map +1 -0
- package/dist/infra/credits/handle.js +405 -0
- package/dist/infra/credits/handle.js.map +1 -0
- package/dist/infra/credits/index.d.ts +3 -0
- package/dist/infra/credits/index.d.ts.map +1 -0
- package/dist/infra/credits/index.js +2 -0
- package/dist/infra/credits/index.js.map +1 -0
- package/dist/infra/credits/namespace.d.ts +7 -0
- package/dist/infra/credits/namespace.d.ts.map +1 -0
- package/dist/infra/credits/namespace.js +7 -0
- package/dist/infra/credits/namespace.js.map +1 -0
- package/dist/infra/credits/schema.d.ts +132 -0
- package/dist/infra/credits/schema.d.ts.map +1 -0
- package/dist/infra/credits/schema.js +67 -0
- package/dist/infra/credits/schema.js.map +1 -0
- package/dist/request/di/builder.d.ts +43 -1
- package/dist/request/di/builder.d.ts.map +1 -1
- package/dist/request/di/builder.js +26 -0
- package/dist/request/di/builder.js.map +1 -1
- package/dist/request/di/index.d.ts +1 -1
- package/dist/request/di/index.d.ts.map +1 -1
- package/dist/request/di/resolve.d.ts +2 -1
- package/dist/request/di/resolve.d.ts.map +1 -1
- package/dist/request/di/resolve.js +8 -0
- package/dist/request/di/resolve.js.map +1 -1
- package/dist/request/di/types.d.ts +38 -0
- package/dist/request/di/types.d.ts.map +1 -1
- package/dist/request/di/types.js.map +1 -1
- package/dist/request/http/server.d.ts.map +1 -1
- package/dist/request/http/server.js +62 -3
- package/dist/request/http/server.js.map +1 -1
- package/dist/request/http/upload.d.ts +39 -0
- package/dist/request/http/upload.d.ts.map +1 -0
- package/dist/request/http/upload.js +140 -0
- package/dist/request/http/upload.js.map +1 -0
- package/dist/request/openapi/generate.d.ts.map +1 -1
- package/dist/request/openapi/generate.js +23 -0
- package/dist/request/openapi/generate.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// The four tables behind prepaid credits, all tenant-scoped (forced row-level
|
|
2
|
+
// security in generated migrations). Amounts are whole units in bigint columns.
|
|
3
|
+
import { define } from '../../data/domain/index.js';
|
|
4
|
+
import { field } from '../../data/domain/field.js';
|
|
5
|
+
import { schema } from '../../data/schema/namespace.js';
|
|
6
|
+
import { index, uniqueIndex } from '../../data/db/idx/index.js';
|
|
7
|
+
export const CREDIT_RESERVATION_STATUSES = ['held', 'settled', 'released'];
|
|
8
|
+
export const CREDIT_LEDGER_KINDS = ['grant', 'reserve', 'settle', 'release', 'expire'];
|
|
9
|
+
export const creditGrant = define('credit_grant', {
|
|
10
|
+
id: field.uuid().defaultRandom().primaryKey(),
|
|
11
|
+
tenantId: field.uuid().tenant(),
|
|
12
|
+
kind: field.text(),
|
|
13
|
+
amount: field.bigint(),
|
|
14
|
+
remaining: field.bigint(),
|
|
15
|
+
grantedAt: field.timestamp().default('now'),
|
|
16
|
+
expiresAt: field.timestamp().nullable(),
|
|
17
|
+
sourceRef: field.text().nullable(),
|
|
18
|
+
metadata: field.jsonb(schema.check.json()).nullable(),
|
|
19
|
+
}, {
|
|
20
|
+
indexes: (t) => ({
|
|
21
|
+
bySource: uniqueIndex('uq_credit_grant_source').on(t['tenantId'], t['sourceRef']),
|
|
22
|
+
byExpiry: index('idx_credit_grant_expiry').on(t['tenantId'], t['expiresAt']),
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
export const creditReservation = define('credit_reservation', {
|
|
26
|
+
id: field.uuid().defaultRandom().primaryKey(),
|
|
27
|
+
tenantId: field.uuid().tenant(),
|
|
28
|
+
jobId: field.text(),
|
|
29
|
+
amount: field.bigint(),
|
|
30
|
+
status: field.enum(CREDIT_RESERVATION_STATUSES),
|
|
31
|
+
settledAmount: field.bigint().nullable(),
|
|
32
|
+
overdraft: field.bigint().default(0n),
|
|
33
|
+
createdAt: field.timestamp().default('now'),
|
|
34
|
+
settledAt: field.timestamp().nullable(),
|
|
35
|
+
}, {
|
|
36
|
+
indexes: (t) => ({
|
|
37
|
+
byJob: uniqueIndex('uq_credit_reservation_job').on(t['tenantId'], t['jobId']),
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
export const creditDraw = define('credit_draw', {
|
|
41
|
+
id: field.uuid().defaultRandom().primaryKey(),
|
|
42
|
+
tenantId: field.uuid().tenant(),
|
|
43
|
+
reservationId: field.uuid(),
|
|
44
|
+
grantId: field.uuid(),
|
|
45
|
+
amount: field.bigint(),
|
|
46
|
+
seq: field.integer(),
|
|
47
|
+
}, {
|
|
48
|
+
indexes: (t) => ({
|
|
49
|
+
byReservation: index('idx_credit_draw_reservation').on(t['reservationId']),
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
export const creditLedger = define('credit_ledger', {
|
|
53
|
+
id: field.uuid().defaultRandom().primaryKey(),
|
|
54
|
+
tenantId: field.uuid().tenant(),
|
|
55
|
+
at: field.timestamp().default('now'),
|
|
56
|
+
kind: field.enum(CREDIT_LEDGER_KINDS),
|
|
57
|
+
amount: field.bigint(),
|
|
58
|
+
grantId: field.uuid().nullable(),
|
|
59
|
+
reservationId: field.uuid().nullable(),
|
|
60
|
+
jobId: field.text().nullable(),
|
|
61
|
+
availableAfter: field.bigint(),
|
|
62
|
+
}, {
|
|
63
|
+
indexes: (t) => ({
|
|
64
|
+
byTenantTime: index('idx_credit_ledger_tenant_at').on(t['tenantId'], t['at'], t['id']),
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/infra/credits/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Schema, Infer } from '../../data/schema/types.js';
|
|
2
2
|
import type { DB } from '../../data/db/index.js';
|
|
3
|
-
import type { Handler, HttpMethod, RouteMeta, AuthRequirement, PermissionMeta, JobRetryConfig, JobTransactionMode, Checkpoint, RouteScreen } from './types.js';
|
|
3
|
+
import type { Handler, HttpMethod, RouteMeta, AuthRequirement, PermissionMeta, JobRetryConfig, JobTransactionMode, Checkpoint, RouteScreen, UploadConfig, BinaryUploadConfig, MultipartUploadConfig, BinaryUpload, MultipartUpload } from './types.js';
|
|
4
4
|
import type { ResourceOperations, Resource, PaginationConfig } from '../fixture/types.js';
|
|
5
5
|
import type { HttpRequest, HttpResponse } from '../http/types.js';
|
|
6
6
|
interface BuilderState {
|
|
@@ -22,6 +22,7 @@ interface BuilderState {
|
|
|
22
22
|
wantsRequest: boolean;
|
|
23
23
|
wantsResponse: boolean;
|
|
24
24
|
wantsRawBody: boolean;
|
|
25
|
+
upload: UploadConfig | null;
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
28
|
* Deps shape after `.transaction('manual')`: the databases the handler declared
|
|
@@ -117,6 +118,47 @@ export declare class Builder<TDeps extends Record<string, unknown>, TDb extends
|
|
|
117
118
|
rawBody(): Builder<TDeps & {
|
|
118
119
|
rawBody: Buffer;
|
|
119
120
|
}, TDb>;
|
|
121
|
+
/**
|
|
122
|
+
* Makes this route accept a file upload and hands the handler the file as a
|
|
123
|
+
* stream in the `upload` dep. The body is never buffered whole.
|
|
124
|
+
*
|
|
125
|
+
* `{ kind: 'binary', mediaTypes, maxBytes }` takes the request body itself as
|
|
126
|
+
* the file: `upload` is `{ stream, mediaType, length }` (`length` is the
|
|
127
|
+
* declared Content-Length, null when chunked). `{ kind: 'multipart', file,
|
|
128
|
+
* mediaTypes, maxBytes, fields? }` takes the part named `file` of a
|
|
129
|
+
* `multipart/form-data` body: `upload` is `{ stream, mediaType, filename,
|
|
130
|
+
* fields }`. `mediaTypes` entries may be `type/*` wildcards.
|
|
131
|
+
*
|
|
132
|
+
* A body (binary) or file (multipart) over `maxBytes` gets 413: refused before
|
|
133
|
+
* reading when the declared Content-Length is over, and while streaming
|
|
134
|
+
* otherwise (the handler's read of `upload.stream` rejects with
|
|
135
|
+
* `errors.PayloadTooLarge`). A media type outside `mediaTypes` gets 415. The
|
|
136
|
+
* route's `screen`, when set, still runs first, and auth runs before any body
|
|
137
|
+
* is read.
|
|
138
|
+
*
|
|
139
|
+
* Multipart: text fields must come before the file part, only names listed in
|
|
140
|
+
* `fields` are accepted (another name gets 422), each at most 64 KiB; fields
|
|
141
|
+
* after the file part are not read, and only the first file part is handed
|
|
142
|
+
* over. A missing file part gets 422.
|
|
143
|
+
*
|
|
144
|
+
* The handler must consume or destroy `upload.stream`. If it returns with the
|
|
145
|
+
* stream unfinished the framework destroys it and closes the connection after
|
|
146
|
+
* the response. Errors from the stream reach the handler as rejected reads and
|
|
147
|
+
* become the response when the handler lets them propagate.
|
|
148
|
+
*
|
|
149
|
+
* In `'auto'` transaction mode the request transaction, and its pool
|
|
150
|
+
* connection, is held for the whole upload: for large files use
|
|
151
|
+
* `.transaction('manual')` and write to the database in a `checkpoint` after
|
|
152
|
+
* the bytes are stored.
|
|
153
|
+
*
|
|
154
|
+
* Cannot be combined with `.input()`, `.rawBody()` or `.job()`; each throws.
|
|
155
|
+
*/
|
|
156
|
+
upload(config: BinaryUploadConfig): Builder<TDeps & {
|
|
157
|
+
upload: BinaryUpload;
|
|
158
|
+
}, TDb>;
|
|
159
|
+
upload(config: MultipartUploadConfig): Builder<TDeps & {
|
|
160
|
+
upload: MultipartUpload;
|
|
161
|
+
}, TDb>;
|
|
120
162
|
fixture<TAuth>(name: string, operations: ResourceOperations<TAuth>): Resource<TAuth>;
|
|
121
163
|
fit<TReturn>(fn: (deps: TDeps) => Promise<TReturn>): Handler<TDeps, TReturn>;
|
|
122
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/request/di/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAe,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/request/di/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ export class Builder {
|
|
|
22
22
|
wantsRequest: state?.wantsRequest ?? false,
|
|
23
23
|
wantsResponse: state?.wantsResponse ?? false,
|
|
24
24
|
wantsRawBody: state?.wantsRawBody ?? false,
|
|
25
|
+
upload: state?.upload ?? null,
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -157,6 +158,22 @@ export class Builder {
|
|
|
157
158
|
wantsRawBody: true,
|
|
158
159
|
});
|
|
159
160
|
}
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
162
|
+
upload(config) {
|
|
163
|
+
if (config.mediaTypes.length === 0) {
|
|
164
|
+
throw new Error('[pipework] .upload() needs at least one entry in mediaTypes (e.g. ["application/pdf"] or ["image/*"]).');
|
|
165
|
+
}
|
|
166
|
+
if (!Number.isInteger(config.maxBytes) || config.maxBytes <= 0) {
|
|
167
|
+
throw new Error(`[pipework] .upload() maxBytes must be a positive integer number of bytes, got ${String(config.maxBytes)}.`);
|
|
168
|
+
}
|
|
169
|
+
if (config.kind === 'multipart' && config.file === '') {
|
|
170
|
+
throw new Error('[pipework] .upload({ kind: "multipart" }) needs the form field name of the file in `file`.');
|
|
171
|
+
}
|
|
172
|
+
return new Builder({
|
|
173
|
+
...this.state,
|
|
174
|
+
upload: config,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
160
177
|
fixture(name, operations) {
|
|
161
178
|
const dbName = this.state.databases[0];
|
|
162
179
|
if (dbName === undefined) {
|
|
@@ -176,6 +193,14 @@ export class Builder {
|
|
|
176
193
|
' declare which database(s) participate. Call .use("dbName") before\n' +
|
|
177
194
|
' .transaction("manual").\n');
|
|
178
195
|
}
|
|
196
|
+
if (this.state.upload !== null) {
|
|
197
|
+
const what = this.state.isJob ? '.job()' : this.state.inputSchema !== null ? '.input()' : this.state.wantsRawBody ? '.rawBody()' : null;
|
|
198
|
+
if (what !== null) {
|
|
199
|
+
throw new Error(`[pipework] .upload() cannot be combined with ${what}.\n\n` +
|
|
200
|
+
' An upload route\'s body is the file, delivered as a stream in the `upload` dep.\n' +
|
|
201
|
+
' Remove ' + what + (what === '.job()' ? ': a job has no request body to stream.' : ', or take the text fields from a multipart form (`fields`).') + '\n');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
179
204
|
const meta = {
|
|
180
205
|
databases: this.state.databases,
|
|
181
206
|
requiresAuth: this.state.requiresAuth,
|
|
@@ -194,6 +219,7 @@ export class Builder {
|
|
|
194
219
|
wantsRequest: this.state.wantsRequest,
|
|
195
220
|
wantsResponse: this.state.wantsResponse,
|
|
196
221
|
wantsRawBody: this.state.wantsRawBody,
|
|
222
|
+
upload: this.state.upload,
|
|
197
223
|
};
|
|
198
224
|
return {
|
|
199
225
|
async execute(deps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/request/di/builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/request/di/builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAgCrD,MAAM,OAAO,OAAO;IAID,KAAK,CAAc;IAEpC,YAAY,KAA6B;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE;YACjC,YAAY,EAAE,KAAK,EAAE,YAAY,IAAI,KAAK;YAC1C,eAAe,EAAE,KAAK,EAAE,eAAe,IAAI,MAAM;YACjD,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;YACvC,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,IAAI,GAAG,EAAE;YAChD,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;YACvC,YAAY,EAAE,KAAK,EAAE,YAAY,IAAI,IAAI;YACzC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI;YAC3B,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK;YAC5B,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI;YAC/B,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,IAAI;YACjC,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI;YACrC,cAAc,EAAE,KAAK,EAAE,cAAc,IAAI,MAAM;YAC/C,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI;YACrC,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI;YACrC,YAAY,EAAE,KAAK,EAAE,YAAY,IAAI,KAAK;YAC1C,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,KAAK;YAC5C,YAAY,EAAE,KAAK,EAAE,YAAY,IAAI,KAAK;YAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI;SAC9B,CAAA;IACH,CAAC;IAID,8DAA8D;IAC9D,GAAG,CAAC,IAAa;QACf,MAAM,QAAQ,GAAG,IAAI,IAAI,UAAU,CAAA;QACnC,OAAO,IAAI,OAAO,CAAC;YACjB,GAAG,IAAI,CAAC,KAAK;YACb,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC/C,CAAC,CAAA;IACJ,CAAC;IAED,IAAI;QACF,OAAO,IAAI,OAAO,CAA+B;YAC/C,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,UAAU;SAC5B,CAAC,CAAA;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,OAAO,CAAsC;YACtD,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,UAAU;SAC5B,CAAC,CAAA;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,MAAM;SACxB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAmB,MAAS;QAC/B,OAAO,IAAI,OAAO,CAAmC;YACnD,GAAG,IAAI,CAAC,KAAK;YACb,WAAW,EAAE,MAAM;SACpB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAmB,MAAS;QAC/B,OAAO,IAAI,OAAO,CAAmC;YACnD,GAAG,IAAI,CAAC,KAAK;YACb,WAAW,EAAE,MAAM;SACpB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAmB,MAAS;QAChC,OAAO,IAAI,OAAO,CAAoC;YACpD,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,MAAM;SACrB,CAAC,CAAA;IACJ,CAAC;IAID,MAAM,CAAC,cAA+B,EAAE,WAAoB;QAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QACjD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,WAAY,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,aAAa,EAAE,OAAO;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAkB,EAAE,IAAY,EAAE,OAAsD;QAC5F,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,KAAK,EAAE;gBACL,MAAM;gBACN,IAAI;gBACJ,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE;SACF,CAAC,CAAA;IACJ,CAAC;IAED,GAAG,CAAC,IAAa;QACf,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI,IAAI,IAAI;SACtB,CAAC,CAAA;IACJ,CAAC;IAuCD,8DAA8D;IAC9D,WAAW,CAAC,IAAwB;QAClC,OAAO,IAAI,OAAO,CAAC;YACjB,GAAG,IAAI,CAAC,KAAK;YACb,cAAc,EAAE,IAAI;SACrB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAsB;QAC1B,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,EAAE;SACf,CAAC,CAAA;IACJ,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAc;QACzD,MAAM,IAAI,GAAmB,KAAK,KAAK,SAAS;YAC9C,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;YAC7B,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;QACxB,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ,CAAC,SAAuD,EAAE;QAChE,OAAO,IAAI,OAAO,CAAa;YAC7B,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE;gBACV,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;gBACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG;aACjC;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,OAAO,IAAI,OAAO,CAAwC;YACxD,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,OAAO,CAA0C;YAC1D,GAAG,IAAI,CAAC,KAAK;YACb,aAAa,EAAE,IAAI;SACpB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,OAAO,IAAI,OAAO,CAAmC;YACnD,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC;IAuCD,8DAA8D;IAC9D,MAAM,CAAC,MAAoB;QACzB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,wGAAwG,CAAC,CAAA;QAC3H,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,iFAAiF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC9H,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAA;QAC/G,CAAC;QACD,OAAO,IAAI,OAAO,CAAC;YACjB,GAAG,IAAI,CAAC,KAAK;YACb,MAAM,EAAE,MAAM;SACf,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,CAAQ,IAAY,EAAE,UAAqC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,gEAAgE,CAC7F,CAAA;QACH,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE;YACrC,QAAQ,EAAE,MAAM;YAChB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;YAC3C,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;SAClC,CAAC,CAAA;IACJ,CAAC;IAED,GAAG,CAAU,EAAqC;QAChD,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CACb,uEAAuE;gBACvE,4EAA4E;gBAC5E,uEAAuE;gBACvE,6BAA6B,CAC9B,CAAA;QACH,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAA;YACvI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,OAAO;oBAC3D,qFAAqF;oBACrF,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,6DAA6D,CAAC,GAAG,IAAI,CAC3J,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAgB;YACxB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;YAC3C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YACnC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YACnC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;YACvB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAC7B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACzC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YACjC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;SAC1B,CAAA;QAED,OAAO;YACL,KAAK,CAAC,OAAO,CAAC,IAAW;gBACvB,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;YACjB,CAAC;YACD,IAAI;SACL,CAAA;IACH,CAAC;CACF;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,OAAO,EAAE,CAAA;AACtB,CAAC"}
|
|
@@ -2,5 +2,5 @@ export declare const fitting: import("./builder.js").Builder<Record<never, never
|
|
|
2
2
|
export { createBuilder, Builder } from './builder.js';
|
|
3
3
|
export { resolveAndExecute, type ResolveOptions } from './resolve.js';
|
|
4
4
|
export { DEFAULT_DB } from './types.js';
|
|
5
|
-
export type { Handler, HandlerMeta, RouteMeta, HttpMethod, InferDeps, InferReturn, DatabaseDeps, JobTransactionMode, Checkpoint } from './types.js';
|
|
5
|
+
export type { Handler, HandlerMeta, RouteMeta, HttpMethod, InferDeps, InferReturn, DatabaseDeps, JobTransactionMode, Checkpoint, UploadConfig, BinaryUploadConfig, MultipartUploadConfig, BinaryUpload, MultipartUpload } from './types.js';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/request/di/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,yHAAkB,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/request/di/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,yHAAkB,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Handler, CheckpointFn } from './types.js';
|
|
1
|
+
import type { Handler, CheckpointFn, BinaryUpload, MultipartUpload } from './types.js';
|
|
2
2
|
import type { DB } from '../../data/db/types.js';
|
|
3
3
|
import type { Flow } from '../context/types.js';
|
|
4
4
|
import type { Manifold } from '../../core/pipework.js';
|
|
@@ -8,6 +8,7 @@ export interface ResolveOptions {
|
|
|
8
8
|
readonly request?: HttpRequest;
|
|
9
9
|
readonly response?: HttpResponse;
|
|
10
10
|
readonly rawBody?: Buffer;
|
|
11
|
+
readonly upload?: BinaryUpload | MultipartUpload;
|
|
11
12
|
/**
|
|
12
13
|
* The `checkpoint` primitive for a manual-transaction handler — a job or a
|
|
13
14
|
* route. Injected as the `checkpoint` dep; the top-level database deps are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/request/di/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/request/di/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACtF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAOjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,eAAe,CAAA;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAA;CACnC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,GAAG,EAAE,IAAI,EACT,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAyBpB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EACpF,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,OAAO,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,SAAS,CAAC,EAAE,OAAO,EACnB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CAyGlB;AAOD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EACpF,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,QAAQ,GACjB,MAAM,EAAE,CAMV;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAC5E,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAChC,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,YAAY,CAUd"}
|
|
@@ -107,6 +107,14 @@ export async function resolveAndExecute(handler, rawInput, rawQuery, rawParams,
|
|
|
107
107
|
}
|
|
108
108
|
deps['rawBody'] = options.rawBody;
|
|
109
109
|
}
|
|
110
|
+
if (handler.meta.upload) {
|
|
111
|
+
if (options?.upload === undefined) {
|
|
112
|
+
throw new ValidationError('Handler declared .upload() but no uploaded file is available.\n\n' +
|
|
113
|
+
' An upload is supplied by the HTTP server for a route. This handler cannot be\n' +
|
|
114
|
+
' invoked as a background job or via direct resolveAndExecute() without one.\n');
|
|
115
|
+
}
|
|
116
|
+
deps['upload'] = options.upload;
|
|
117
|
+
}
|
|
110
118
|
const result = await handler.execute(deps);
|
|
111
119
|
if (handler.meta.outputSchemas.size > 0) {
|
|
112
120
|
if (isHandlerResponse(result)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/request/di/resolve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAMvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/request/di/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Schema } from '../../data/schema/types.js';
|
|
2
2
|
import type { DB } from '../../data/db/index.js';
|
|
3
|
+
import type { Readable } from 'node:stream';
|
|
3
4
|
import type { BackoffConfig } from '../../async/jobs/queue.js';
|
|
4
5
|
/** The default database name constant ('default') used when pipe() is called without a name argument. */
|
|
5
6
|
export declare const DEFAULT_DB: "__pipework_default__";
|
|
@@ -57,6 +58,43 @@ export interface HandlerMeta {
|
|
|
57
58
|
readonly wantsRequest: boolean;
|
|
58
59
|
readonly wantsResponse: boolean;
|
|
59
60
|
readonly wantsRawBody: boolean;
|
|
61
|
+
readonly upload?: UploadConfig | null;
|
|
62
|
+
}
|
|
63
|
+
/** Upload whose whole request body is the file's bytes. */
|
|
64
|
+
export interface BinaryUploadConfig {
|
|
65
|
+
readonly kind: 'binary';
|
|
66
|
+
/** Accepted request media types; `type/*` wildcards allowed. Others get 415. */
|
|
67
|
+
readonly mediaTypes: readonly string[];
|
|
68
|
+
/** Largest accepted body in bytes. Over it gets 413. */
|
|
69
|
+
readonly maxBytes: number;
|
|
70
|
+
}
|
|
71
|
+
/** Upload whose file is one part of a `multipart/form-data` body. */
|
|
72
|
+
export interface MultipartUploadConfig {
|
|
73
|
+
readonly kind: 'multipart';
|
|
74
|
+
/** Name of the form field carrying the file. */
|
|
75
|
+
readonly file: string;
|
|
76
|
+
/** Accepted media types of the file part; `type/*` wildcards allowed. Others get 415. */
|
|
77
|
+
readonly mediaTypes: readonly string[];
|
|
78
|
+
/** Largest accepted file in bytes. Over it gets 413. */
|
|
79
|
+
readonly maxBytes: number;
|
|
80
|
+
/** Text field names accepted ahead of the file part; any other field gets 422. */
|
|
81
|
+
readonly fields?: readonly string[];
|
|
82
|
+
}
|
|
83
|
+
export type UploadConfig = BinaryUploadConfig | MultipartUploadConfig;
|
|
84
|
+
/** The `upload` dep of a binary upload route. */
|
|
85
|
+
export interface BinaryUpload {
|
|
86
|
+
readonly stream: Readable;
|
|
87
|
+
readonly mediaType: string;
|
|
88
|
+
/** Declared Content-Length, or null for a chunked body. */
|
|
89
|
+
readonly length: number | null;
|
|
90
|
+
}
|
|
91
|
+
/** The `upload` dep of a multipart upload route. */
|
|
92
|
+
export interface MultipartUpload {
|
|
93
|
+
readonly stream: Readable;
|
|
94
|
+
readonly mediaType: string;
|
|
95
|
+
readonly filename: string | null;
|
|
96
|
+
/** Text fields that came before the file part. */
|
|
97
|
+
readonly fields: Readonly<Record<string, string>>;
|
|
60
98
|
}
|
|
61
99
|
/**
|
|
62
100
|
* What a route screen is shown: the request line and headers, plus the declared
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/request/di/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,yGAAyG;AACzG,eAAO,MAAM,UAAU,EAAG,sBAA+B,CAAA;AAEzD,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;AAE9D,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAA;CACjC;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAElD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAE7E,kGAAkG;AAClG,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAEzF,4GAA4G;AAC5G,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAA;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAA;IAC3C,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC9D,iFAAiF;IACjF,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CACtC;AAED,yFAAyF;AACzF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAClD;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,CAAA;AAElJ,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sGAAsG;IACtG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAE5C,iHAAiH;AACjH,MAAM,WAAW,OAAO,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IACrE,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAC3B;AAED,iHAAiH;AACjH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAC1E,kHAAkH;AAClH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE5F,0EAA0E;AAC1E,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/request/di/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/request/di/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/request/di/types.ts"],"names":[],"mappings":"AAKA,yGAAyG;AACzG,MAAM,CAAC,MAAM,UAAU,GAAG,sBAA+B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/request/http/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/request/http/server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAsC,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAoBjH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGnD,qGAAqG;AACrG,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAA;IAC7E,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IACpD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,wHAAwH;AACxH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAE,YAAiB,GAAG,cAAc,CA0X1F"}
|
|
@@ -4,6 +4,7 @@ import Fastify, {} from 'fastify';
|
|
|
4
4
|
import fastifyCors from '@fastify/cors';
|
|
5
5
|
import fastifyHelmet from '@fastify/helmet';
|
|
6
6
|
import fastifyRateLimit from '@fastify/rate-limit';
|
|
7
|
+
import fastifyMultipart from '@fastify/multipart';
|
|
7
8
|
import { runInContext } from '../context/store.js';
|
|
8
9
|
import { createRequestContext } from '../context/index.js';
|
|
9
10
|
import { executeInTransaction } from '../context/run-in-transaction.js';
|
|
@@ -12,6 +13,7 @@ import { buildContext } from './middleware.js';
|
|
|
12
13
|
import { closeTrace } from '../../trace/entry/close-trace.js';
|
|
13
14
|
import { buildErrorResponse, buildInternalErrorResponse } from './response.js';
|
|
14
15
|
import { isPipeworkError } from '../../core/errors/index.js';
|
|
16
|
+
import { checkUploadHeaders, uploadBodyLimit, binaryUpload, multipartUpload, settleUpload, MULTIPART_FIELD_LIMIT } from './upload.js';
|
|
15
17
|
import { toJsonSchema } from '../../data/schema/json-schema.js';
|
|
16
18
|
import { generateOpenAPI } from '../openapi/generate.js';
|
|
17
19
|
import { getBaseLogger, setLoggingConfig } from '../../core/logging/index.js';
|
|
@@ -126,7 +128,11 @@ export function createServer(instance, config = {}) {
|
|
|
126
128
|
schema['params'] = toJsonSchema(handler.meta.paramsSchema);
|
|
127
129
|
}
|
|
128
130
|
const opts = Object.keys(schema).length > 0 ? { schema } : {};
|
|
129
|
-
|
|
131
|
+
const upload = handler.meta.upload ?? null;
|
|
132
|
+
if (upload !== null) {
|
|
133
|
+
opts['bodyLimit'] = uploadBodyLimit(upload);
|
|
134
|
+
}
|
|
135
|
+
else if (handler.meta.route?.bodyLimit !== undefined) {
|
|
130
136
|
opts['bodyLimit'] = handler.meta.route.bodyLimit;
|
|
131
137
|
}
|
|
132
138
|
const screen = handler.meta.route?.screen;
|
|
@@ -169,6 +175,19 @@ export function createServer(instance, config = {}) {
|
|
|
169
175
|
return undefined;
|
|
170
176
|
};
|
|
171
177
|
}
|
|
178
|
+
if (upload !== null) {
|
|
179
|
+
// After the screen: a refusal from headers alone (415, or 413 on a declared
|
|
180
|
+
// length) before anything is read.
|
|
181
|
+
const headerCheck = async (req, reply) => {
|
|
182
|
+
const refusal = checkUploadHeaders(upload, req.headers);
|
|
183
|
+
if (refusal === null)
|
|
184
|
+
return undefined;
|
|
185
|
+
void reply.header('connection', 'close');
|
|
186
|
+
return reply.status(refusal.httpStatus).send(buildErrorResponse(refusal));
|
|
187
|
+
};
|
|
188
|
+
const existing = opts['onRequest'];
|
|
189
|
+
opts['onRequest'] = existing === undefined ? [headerCheck] : [existing, headerCheck];
|
|
190
|
+
}
|
|
172
191
|
if (handler.meta.wantsRawBody) {
|
|
173
192
|
opts['preParsing'] = async (req, _reply, payload) => {
|
|
174
193
|
const chunks = [];
|
|
@@ -179,8 +198,14 @@ export function createServer(instance, config = {}) {
|
|
|
179
198
|
return Readable.from(raw);
|
|
180
199
|
};
|
|
181
200
|
}
|
|
182
|
-
|
|
201
|
+
const routeHandler = async (req, reply) => {
|
|
183
202
|
let ctx;
|
|
203
|
+
let uploaded;
|
|
204
|
+
// Ends the upload stream and closes the connection if the body was left unread.
|
|
205
|
+
const finishUpload = (failed) => {
|
|
206
|
+
if (settleUpload(uploaded?.stream) || (failed && upload !== null))
|
|
207
|
+
void reply.header('connection', 'close');
|
|
208
|
+
};
|
|
184
209
|
try {
|
|
185
210
|
ctx = await buildContext(req, contextOptions, handler.meta.authRequirement);
|
|
186
211
|
if (handler.meta.permission && rbacInstance) {
|
|
@@ -197,6 +222,11 @@ export function createServer(instance, config = {}) {
|
|
|
197
222
|
if (rawBodyBuffer !== undefined) {
|
|
198
223
|
requestObj.rawBody = rawBodyBuffer;
|
|
199
224
|
}
|
|
225
|
+
if (upload !== null) {
|
|
226
|
+
uploaded = upload.kind === 'binary'
|
|
227
|
+
? binaryUpload(req, upload.maxBytes)
|
|
228
|
+
: await multipartUpload(req, upload);
|
|
229
|
+
}
|
|
200
230
|
const httpOptions = {
|
|
201
231
|
request: requestObj,
|
|
202
232
|
response: {
|
|
@@ -204,6 +234,7 @@ export function createServer(instance, config = {}) {
|
|
|
204
234
|
onFinish: (cb) => watchResponse(reply, cb, req.log),
|
|
205
235
|
},
|
|
206
236
|
...(rawBodyBuffer !== undefined ? { rawBody: rawBodyBuffer } : {}),
|
|
237
|
+
...(uploaded !== undefined ? { upload: uploaded } : {}),
|
|
207
238
|
};
|
|
208
239
|
let result;
|
|
209
240
|
if (handler.meta.jobTransaction === 'manual') {
|
|
@@ -222,10 +253,12 @@ export function createServer(instance, config = {}) {
|
|
|
222
253
|
else {
|
|
223
254
|
result = await runInContext(ctx, () => resolveAndExecute(handler, req.body, req.query, req.params, httpOptions));
|
|
224
255
|
}
|
|
256
|
+
finishUpload(false);
|
|
225
257
|
void closeTrace(instance, ctx.trace, 'closed');
|
|
226
258
|
return sendResult(reply, result);
|
|
227
259
|
}
|
|
228
260
|
catch (error) {
|
|
261
|
+
finishUpload(true);
|
|
229
262
|
if (ctx !== undefined)
|
|
230
263
|
void closeTrace(instance, ctx.trace, 'error');
|
|
231
264
|
if (isPipeworkError(error)) {
|
|
@@ -234,10 +267,36 @@ export function createServer(instance, config = {}) {
|
|
|
234
267
|
void reply.header('Retry-After', String(Math.max(0, Math.ceil(retryAfter))));
|
|
235
268
|
return reply.status(error.httpStatus).send(buildErrorResponse(error));
|
|
236
269
|
}
|
|
270
|
+
// A malformed multipart body surfaces as a Fastify client error (4xx).
|
|
271
|
+
const clientStatus = upload !== null ? error?.statusCode : undefined;
|
|
272
|
+
if (typeof clientStatus === 'number' && clientStatus >= 400 && clientStatus < 500) {
|
|
273
|
+
const e = error;
|
|
274
|
+
return reply.status(clientStatus).send({ error: { code: String(e.code ?? 'BAD_REQUEST'), message: String(e.message ?? 'Bad request') } });
|
|
275
|
+
}
|
|
237
276
|
req.log.error(error, 'Unhandled error in route handler');
|
|
238
277
|
return reply.status(500).send(buildInternalErrorResponse(error, config.exposeErrorDetails));
|
|
239
278
|
}
|
|
240
|
-
}
|
|
279
|
+
};
|
|
280
|
+
if (upload === null) {
|
|
281
|
+
app[fastifyMethod](path, opts, routeHandler);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// Its own plugin scope: the body parsers here replace the JSON parser for
|
|
285
|
+
// this route only, so no other route's parsing changes.
|
|
286
|
+
void app.register(async (child) => {
|
|
287
|
+
child.removeAllContentTypeParsers();
|
|
288
|
+
if (upload.kind === 'binary') {
|
|
289
|
+
child.addContentTypeParser('*', (_req, payload, done) => { done(null, payload); });
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
await child.register(fastifyMultipart, {
|
|
293
|
+
throwFileSizeLimit: false,
|
|
294
|
+
limits: { fileSize: upload.maxBytes + 1024, fieldSize: MULTIPART_FIELD_LIMIT, files: 1, fields: 100 },
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
child[fastifyMethod](path, opts, routeHandler);
|
|
298
|
+
});
|
|
299
|
+
}
|
|
241
300
|
}
|
|
242
301
|
function registerHandlers(handlers) {
|
|
243
302
|
for (const handler of handlers) {
|