@ketvietlab/ketjs 0.1.1
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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/agent/capabilities.d.ts +62 -0
- package/dist/agent/capabilities.d.ts.map +1 -0
- package/dist/agent/capabilities.js +89 -0
- package/dist/agent/capabilities.js.map +1 -0
- package/dist/agent/permissions.d.ts +56 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +209 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +698 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen/dts.d.ts +3 -0
- package/dist/codegen/dts.d.ts.map +1 -0
- package/dist/codegen/dts.js +94 -0
- package/dist/codegen/dts.js.map +1 -0
- package/dist/data/adapter.d.ts +4 -0
- package/dist/data/adapter.d.ts.map +1 -0
- package/dist/data/adapter.js +18 -0
- package/dist/data/adapter.js.map +1 -0
- package/dist/data/changeset.d.ts +49 -0
- package/dist/data/changeset.d.ts.map +1 -0
- package/dist/data/changeset.js +206 -0
- package/dist/data/changeset.js.map +1 -0
- package/dist/data/expr.d.ts +59 -0
- package/dist/data/expr.d.ts.map +1 -0
- package/dist/data/expr.js +61 -0
- package/dist/data/expr.js.map +1 -0
- package/dist/data/fleet.d.ts +28 -0
- package/dist/data/fleet.d.ts.map +1 -0
- package/dist/data/fleet.js +82 -0
- package/dist/data/fleet.js.map +1 -0
- package/dist/data/list-search.d.ts +93 -0
- package/dist/data/list-search.d.ts.map +1 -0
- package/dist/data/list-search.js +268 -0
- package/dist/data/list-search.js.map +1 -0
- package/dist/data/migrate.d.ts +75 -0
- package/dist/data/migrate.d.ts.map +1 -0
- package/dist/data/migrate.js +136 -0
- package/dist/data/migrate.js.map +1 -0
- package/dist/data/pool.d.ts +20 -0
- package/dist/data/pool.d.ts.map +1 -0
- package/dist/data/pool.js +92 -0
- package/dist/data/pool.js.map +1 -0
- package/dist/data/query.d.ts +111 -0
- package/dist/data/query.d.ts.map +1 -0
- package/dist/data/query.js +268 -0
- package/dist/data/query.js.map +1 -0
- package/dist/data/sqlite.d.ts +3 -0
- package/dist/data/sqlite.d.ts.map +1 -0
- package/dist/data/sqlite.js +107 -0
- package/dist/data/sqlite.js.map +1 -0
- package/dist/data/time.d.ts +9 -0
- package/dist/data/time.d.ts.map +1 -0
- package/dist/data/time.js +107 -0
- package/dist/data/time.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/apps.d.ts +43 -0
- package/dist/kernel/apps.d.ts.map +1 -0
- package/dist/kernel/apps.js +234 -0
- package/dist/kernel/apps.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/compose.js +976 -0
- package/dist/kernel/compose.js.map +1 -0
- package/dist/kernel/define.d.ts +9 -0
- package/dist/kernel/define.d.ts.map +1 -0
- package/dist/kernel/define.js +140 -0
- package/dist/kernel/define.js.map +1 -0
- package/dist/kernel/diff.d.ts +11 -0
- package/dist/kernel/diff.d.ts.map +1 -0
- package/dist/kernel/diff.js +106 -0
- package/dist/kernel/diff.js.map +1 -0
- package/dist/kernel/errors.d.ts +17 -0
- package/dist/kernel/errors.d.ts.map +1 -0
- package/dist/kernel/errors.js +43 -0
- package/dist/kernel/errors.js.map +1 -0
- package/dist/kernel/graph.d.ts +3 -0
- package/dist/kernel/graph.d.ts.map +1 -0
- package/dist/kernel/graph.js +56 -0
- package/dist/kernel/graph.js.map +1 -0
- package/dist/kernel/i18n.d.ts +43 -0
- package/dist/kernel/i18n.d.ts.map +1 -0
- package/dist/kernel/i18n.js +79 -0
- package/dist/kernel/i18n.js.map +1 -0
- package/dist/kernel/index.d.ts +7 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +7 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/layout.d.ts +17 -0
- package/dist/kernel/layout.d.ts.map +1 -0
- package/dist/kernel/layout.js +77 -0
- package/dist/kernel/layout.js.map +1 -0
- package/dist/kernel/menu.d.ts +27 -0
- package/dist/kernel/menu.d.ts.map +1 -0
- package/dist/kernel/menu.js +65 -0
- package/dist/kernel/menu.js.map +1 -0
- package/dist/kernel/modules.d.ts +31 -0
- package/dist/kernel/modules.d.ts.map +1 -0
- package/dist/kernel/modules.js +322 -0
- package/dist/kernel/modules.js.map +1 -0
- package/dist/kernel/routes.d.ts +24 -0
- package/dist/kernel/routes.d.ts.map +1 -0
- package/dist/kernel/routes.js +98 -0
- package/dist/kernel/routes.js.map +1 -0
- package/dist/kernel/types.d.ts +8 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/types.js +67 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/workspace.d.ts +62 -0
- package/dist/kernel/workspace.d.ts.map +1 -0
- package/dist/kernel/workspace.js +156 -0
- package/dist/kernel/workspace.js.map +1 -0
- package/dist/scaffold/index.d.ts +2 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +49 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates/app.test.ts.tmpl +17 -0
- package/dist/scaffold/templates/biome.json.tmpl +30 -0
- package/dist/scaffold/templates/dev.mjs.tmpl +16 -0
- package/dist/scaffold/templates/gitignore.tmpl +24 -0
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +18 -0
- package/dist/scaffold/templates/module.ts.tmpl +27 -0
- package/dist/scaffold/templates/package.json.tmpl +25 -0
- package/dist/scaffold/templates/tsconfig.json.tmpl +15 -0
- package/dist/server/boot.d.ts +173 -0
- package/dist/server/boot.d.ts.map +1 -0
- package/dist/server/boot.js +659 -0
- package/dist/server/boot.js.map +1 -0
- package/dist/server/config.d.ts +48 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +82 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/ctx.d.ts +13 -0
- package/dist/server/ctx.d.ts.map +1 -0
- package/dist/server/ctx.js +496 -0
- package/dist/server/ctx.js.map +1 -0
- package/dist/server/fn.d.ts +34 -0
- package/dist/server/fn.d.ts.map +1 -0
- package/dist/server/fn.js +170 -0
- package/dist/server/fn.js.map +1 -0
- package/dist/server/http.d.ts +79 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +459 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/idem.d.ts +31 -0
- package/dist/server/idem.d.ts.map +1 -0
- package/dist/server/idem.js +68 -0
- package/dist/server/idem.js.map +1 -0
- package/dist/server/jobs.d.ts +5 -0
- package/dist/server/jobs.d.ts.map +1 -0
- package/dist/server/jobs.js +24 -0
- package/dist/server/jobs.js.map +1 -0
- package/dist/server/multipart.d.ts +18 -0
- package/dist/server/multipart.d.ts.map +1 -0
- package/dist/server/multipart.js +183 -0
- package/dist/server/multipart.js.map +1 -0
- package/dist/server/project.d.ts +9 -0
- package/dist/server/project.d.ts.map +1 -0
- package/dist/server/project.js +67 -0
- package/dist/server/project.js.map +1 -0
- package/dist/server/queue.d.ts +80 -0
- package/dist/server/queue.d.ts.map +1 -0
- package/dist/server/queue.js +494 -0
- package/dist/server/queue.js.map +1 -0
- package/dist/server/respond.d.ts +91 -0
- package/dist/server/respond.d.ts.map +1 -0
- package/dist/server/respond.js +99 -0
- package/dist/server/respond.js.map +1 -0
- package/dist/server/runtime.d.ts +14 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +25 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/session.d.ts +55 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +172 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/sessionstore.d.ts +54 -0
- package/dist/server/sessionstore.d.ts.map +1 -0
- package/dist/server/sessionstore.js +232 -0
- package/dist/server/sessionstore.js.map +1 -0
- package/dist/server/storage/index.d.ts +11 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +31 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/local.d.ts +5 -0
- package/dist/server/storage/local.d.ts.map +1 -0
- package/dist/server/storage/local.js +165 -0
- package/dist/server/storage/local.js.map +1 -0
- package/dist/server/storage/s3.d.ts +11 -0
- package/dist/server/storage/s3.d.ts.map +1 -0
- package/dist/server/storage/s3.js +133 -0
- package/dist/server/storage/s3.js.map +1 -0
- package/dist/server/storage/sigv4.d.ts +23 -0
- package/dist/server/storage/sigv4.d.ts.map +1 -0
- package/dist/server/storage/sigv4.js +79 -0
- package/dist/server/storage/sigv4.js.map +1 -0
- package/dist/server/storage/types.d.ts +37 -0
- package/dist/server/storage/types.d.ts.map +1 -0
- package/dist/server/storage/types.js +82 -0
- package/dist/server/storage/types.js.map +1 -0
- package/dist/server/stream.d.ts +43 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +117 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server/streamstore.d.ts +29 -0
- package/dist/server/streamstore.d.ts.map +1 -0
- package/dist/server/streamstore.js +140 -0
- package/dist/server/streamstore.js.map +1 -0
- package/dist/server/tenants.d.ts +108 -0
- package/dist/server/tenants.d.ts.map +1 -0
- package/dist/server/tenants.js +172 -0
- package/dist/server/tenants.js.map +1 -0
- package/dist/server/transport/index.d.ts +5 -0
- package/dist/server/transport/index.d.ts.map +1 -0
- package/dist/server/transport/index.js +3 -0
- package/dist/server/transport/index.js.map +1 -0
- package/dist/server/transport/memory.d.ts +14 -0
- package/dist/server/transport/memory.d.ts.map +1 -0
- package/dist/server/transport/memory.js +36 -0
- package/dist/server/transport/memory.js.map +1 -0
- package/dist/server/transport/types.d.ts +44 -0
- package/dist/server/transport/types.d.ts.map +1 -0
- package/dist/server/transport/types.js +79 -0
- package/dist/server/transport/types.js.map +1 -0
- package/dist/server/worker.d.ts +33 -0
- package/dist/server/worker.d.ts.map +1 -0
- package/dist/server/worker.js +428 -0
- package/dist/server/worker.js.map +1 -0
- package/dist/testing.d.ts +146 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +406 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme/contracts.d.ts +4 -0
- package/dist/theme/contracts.d.ts.map +1 -0
- package/dist/theme/contracts.js +87 -0
- package/dist/theme/contracts.js.map +1 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +7 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/joints.d.ts +19 -0
- package/dist/theme/joints.d.ts.map +1 -0
- package/dist/theme/joints.js +126 -0
- package/dist/theme/joints.js.map +1 -0
- package/dist/theme/ktl/compile.d.ts +26 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -0
- package/dist/theme/ktl/compile.js +226 -0
- package/dist/theme/ktl/compile.js.map +1 -0
- package/dist/theme/ktl/lexer.d.ts +20 -0
- package/dist/theme/ktl/lexer.d.ts.map +1 -0
- package/dist/theme/ktl/lexer.js +56 -0
- package/dist/theme/ktl/lexer.js.map +1 -0
- package/dist/theme/ktl/parser.d.ts +64 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -0
- package/dist/theme/ktl/parser.js +220 -0
- package/dist/theme/ktl/parser.js.map +1 -0
- package/dist/theme/render.d.ts +19 -0
- package/dist/theme/render.d.ts.map +1 -0
- package/dist/theme/render.js +246 -0
- package/dist/theme/render.js.map +1 -0
- package/dist/theme/templates.d.ts +2 -0
- package/dist/theme/templates.d.ts.map +1 -0
- package/dist/theme/templates.js +40 -0
- package/dist/theme/templates.js.map +1 -0
- package/dist/theme/tokens.d.ts +4 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +15 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme/viewmodel.d.ts +6 -0
- package/dist/theme/viewmodel.d.ts.map +1 -0
- package/dist/theme/viewmodel.js +40 -0
- package/dist/theme/viewmodel.js.map +1 -0
- package/dist/types.d.ts +614 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/multipart.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AA8GD;;;;GAIG;AACH,wBAAuB,SAAS,CAC9B,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,gBAAqB,GAC7B,cAAc,CAAC,aAAa,CAAC,CAuE/B"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { KetError } from '../kernel/errors.js';
|
|
2
|
+
const encoder = new TextEncoder();
|
|
3
|
+
const decoder = new TextDecoder();
|
|
4
|
+
const bytesOf = (value) => encoder.encode(value);
|
|
5
|
+
const concat = (a, b) => {
|
|
6
|
+
if (!a.length)
|
|
7
|
+
return b;
|
|
8
|
+
if (!b.length)
|
|
9
|
+
return a;
|
|
10
|
+
const out = new Uint8Array(a.length + b.length);
|
|
11
|
+
out.set(a);
|
|
12
|
+
out.set(b, a.length);
|
|
13
|
+
return out;
|
|
14
|
+
};
|
|
15
|
+
const indexOf = (haystack, needle) => {
|
|
16
|
+
outer: for (let i = 0; i <= haystack.length - needle.length; i++) {
|
|
17
|
+
for (let j = 0; j < needle.length; j++)
|
|
18
|
+
if (haystack[i + j] !== needle[j])
|
|
19
|
+
continue outer;
|
|
20
|
+
return i;
|
|
21
|
+
}
|
|
22
|
+
return -1;
|
|
23
|
+
};
|
|
24
|
+
class Reader {
|
|
25
|
+
source;
|
|
26
|
+
maxBytes;
|
|
27
|
+
buffer = new Uint8Array();
|
|
28
|
+
ended = false;
|
|
29
|
+
total = 0;
|
|
30
|
+
constructor(source, maxBytes) {
|
|
31
|
+
this.source = source[Symbol.asyncIterator]();
|
|
32
|
+
this.maxBytes = maxBytes;
|
|
33
|
+
}
|
|
34
|
+
async fill(minimum) {
|
|
35
|
+
while (!this.ended && this.buffer.length < minimum) {
|
|
36
|
+
const next = await this.source.next();
|
|
37
|
+
if (next.done) {
|
|
38
|
+
this.ended = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
const chunk = next.value instanceof Uint8Array ? next.value : new Uint8Array(next.value);
|
|
42
|
+
this.total += chunk.byteLength;
|
|
43
|
+
if (this.total > this.maxBytes) {
|
|
44
|
+
throw new KetError({
|
|
45
|
+
code: 'E_PAYLOAD_TOO_LARGE',
|
|
46
|
+
message: `multipart body exceeds ${this.maxBytes} bytes`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
this.buffer = concat(this.buffer, chunk);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
take(length) {
|
|
53
|
+
const value = this.buffer.slice(0, length);
|
|
54
|
+
this.buffer = this.buffer.slice(length);
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
async exact(expected) {
|
|
58
|
+
await this.fill(expected.length);
|
|
59
|
+
const actual = this.take(expected.length);
|
|
60
|
+
if (actual.length !== expected.length || indexOf(actual, expected) !== 0)
|
|
61
|
+
throw new KetError({ code: 'E_MULTIPART_SYNTAX', message: 'malformed multipart boundary' });
|
|
62
|
+
}
|
|
63
|
+
async until(marker, limit) {
|
|
64
|
+
for (;;) {
|
|
65
|
+
const found = indexOf(this.buffer, marker);
|
|
66
|
+
if (found >= 0) {
|
|
67
|
+
if (found > limit)
|
|
68
|
+
throw new KetError({ code: 'E_MULTIPART_HEADERS', message: 'multipart headers are too large' });
|
|
69
|
+
const value = this.take(found);
|
|
70
|
+
this.take(marker.length);
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
if (this.buffer.length > limit)
|
|
74
|
+
throw new KetError({ code: 'E_MULTIPART_HEADERS', message: 'multipart headers are too large' });
|
|
75
|
+
if (this.ended)
|
|
76
|
+
throw new KetError({ code: 'E_MULTIPART_SYNTAX', message: 'multipart body ended before a boundary' });
|
|
77
|
+
await this.fill(this.buffer.length + 1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const boundaryOf = (contentType) => {
|
|
82
|
+
if (!/^multipart\/form-data\b/i.test(contentType))
|
|
83
|
+
throw new KetError({ code: 'E_MULTIPART_TYPE', message: 'expected multipart/form-data' });
|
|
84
|
+
const match = /(?:^|;)\s*boundary=(?:"([^"]+)"|([^;\s]+))/i.exec(contentType);
|
|
85
|
+
const boundary = match?.[1] ?? match?.[2];
|
|
86
|
+
if (!boundary || boundary.length > 200 || /[\r\n]/.test(boundary))
|
|
87
|
+
throw new KetError({ code: 'E_MULTIPART_BOUNDARY', message: 'missing or invalid multipart boundary' });
|
|
88
|
+
return boundary;
|
|
89
|
+
};
|
|
90
|
+
const disposition = (value) => {
|
|
91
|
+
if (!/^form-data(?:;|$)/i.test(value))
|
|
92
|
+
throw new KetError({ code: 'E_MULTIPART_DISPOSITION', message: 'multipart part is not form-data' });
|
|
93
|
+
const params = new Map();
|
|
94
|
+
for (const match of value.matchAll(/;\s*([\w-]+)=(?:"((?:[^"\\]|\\.)*)"|([^;]*))/g)) {
|
|
95
|
+
const raw = match[2] ?? match[3] ?? '';
|
|
96
|
+
params.set(match[1].toLowerCase(), raw.replace(/\\(["\\])/g, '$1'));
|
|
97
|
+
}
|
|
98
|
+
const name = params.get('name');
|
|
99
|
+
if (!name)
|
|
100
|
+
throw new KetError({ code: 'E_MULTIPART_NAME', message: 'multipart part has no name' });
|
|
101
|
+
const filename = params.get('filename');
|
|
102
|
+
return { name, ...(filename === undefined ? {} : { filename }) };
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Parse multipart sequentially without buffering file bodies. A part body must be
|
|
106
|
+
* consumed before requesting the next part; if a caller stops early, the parser
|
|
107
|
+
* drains only to the next boundary so the remaining parts stay readable.
|
|
108
|
+
*/
|
|
109
|
+
export async function* multipart(source, contentType, options = {}) {
|
|
110
|
+
const boundary = boundaryOf(contentType);
|
|
111
|
+
const reader = new Reader(source, options.maxBytes ?? 25 * 1024 * 1024);
|
|
112
|
+
const first = bytesOf(`--${boundary}\r\n`);
|
|
113
|
+
const delimiter = bytesOf(`\r\n--${boundary}`);
|
|
114
|
+
const headerEnd = bytesOf('\r\n\r\n');
|
|
115
|
+
await reader.exact(first);
|
|
116
|
+
let final = false;
|
|
117
|
+
let parts = 0;
|
|
118
|
+
while (!final) {
|
|
119
|
+
parts++;
|
|
120
|
+
if (parts > (options.maxParts ?? 20))
|
|
121
|
+
throw new KetError({ code: 'E_MULTIPART_PARTS', message: 'multipart body has too many parts' });
|
|
122
|
+
const rawHeaders = decoder.decode(await reader.until(headerEnd, options.maxHeaderBytes ?? 16 * 1024));
|
|
123
|
+
const headers = new Map();
|
|
124
|
+
for (const line of rawHeaders.split('\r\n')) {
|
|
125
|
+
const colon = line.indexOf(':');
|
|
126
|
+
if (colon <= 0)
|
|
127
|
+
throw new KetError({ code: 'E_MULTIPART_HEADERS', message: 'malformed multipart part header' });
|
|
128
|
+
headers.set(line.slice(0, colon).trim().toLowerCase(), line.slice(colon + 1).trim());
|
|
129
|
+
}
|
|
130
|
+
const meta = disposition(headers.get('content-disposition') ?? '');
|
|
131
|
+
let bodyDone = false;
|
|
132
|
+
const readBody = async function* () {
|
|
133
|
+
if (bodyDone)
|
|
134
|
+
return;
|
|
135
|
+
for (;;) {
|
|
136
|
+
const found = indexOf(reader.buffer, delimiter);
|
|
137
|
+
if (found >= 0) {
|
|
138
|
+
await reader.fill(found + delimiter.length + 2);
|
|
139
|
+
const suffix = decoder.decode(reader.buffer.slice(found + delimiter.length, found + delimiter.length + 2));
|
|
140
|
+
// A file may legally contain "\\r\\n--boundary-like". It is a delimiter
|
|
141
|
+
// only when followed by CRLF or --; keep scanning instead of truncating.
|
|
142
|
+
if (suffix !== '--' && suffix !== '\r\n') {
|
|
143
|
+
yield reader.take(found + 2);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (found)
|
|
147
|
+
yield reader.take(found);
|
|
148
|
+
reader.take(delimiter.length);
|
|
149
|
+
reader.take(2);
|
|
150
|
+
if (suffix === '--') {
|
|
151
|
+
final = true;
|
|
152
|
+
await reader.fill(2);
|
|
153
|
+
if (decoder.decode(reader.buffer.slice(0, 2)) === '\r\n')
|
|
154
|
+
reader.take(2);
|
|
155
|
+
}
|
|
156
|
+
else if (suffix !== '\r\n') {
|
|
157
|
+
throw new KetError({ code: 'E_MULTIPART_SYNTAX', message: 'malformed multipart boundary suffix' });
|
|
158
|
+
}
|
|
159
|
+
bodyDone = true;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (reader.ended)
|
|
163
|
+
throw new KetError({
|
|
164
|
+
code: 'E_MULTIPART_SYNTAX',
|
|
165
|
+
message: 'multipart body ended before a boundary',
|
|
166
|
+
});
|
|
167
|
+
const safe = Math.max(0, reader.buffer.length - delimiter.length + 1);
|
|
168
|
+
if (safe)
|
|
169
|
+
yield reader.take(safe);
|
|
170
|
+
await reader.fill(reader.buffer.length + 1);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
yield {
|
|
174
|
+
...meta,
|
|
175
|
+
...(headers.has('content-type') ? { type: headers.get('content-type') } : {}),
|
|
176
|
+
body: { [Symbol.asyncIterator]: readBody },
|
|
177
|
+
};
|
|
178
|
+
if (!bodyDone)
|
|
179
|
+
for await (const _ of readBody())
|
|
180
|
+
void _;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=multipart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipart.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/multipart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAe9C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AACjC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;AACjC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAExD,MAAM,MAAM,GAAG,CAAC,CAAa,EAAE,CAAa,EAAc,EAAE;IAC1D,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAA;IACvB,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAA;IACvB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;IAC/C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACV,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACpB,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,QAAoB,EAAE,MAAkB,EAAU,EAAE;IACnE,KAAK,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;gBAAE,SAAS,KAAK,CAAA;QACzF,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,CAAC,CAAC,CAAA;AACX,CAAC,CAAA;AAED,MAAM,MAAM;IACO,MAAM,CAA2B;IACjC,QAAQ,CAAQ;IACjC,MAAM,GAAgC,IAAI,UAAU,EAAE,CAAA;IACtD,KAAK,GAAG,KAAK,CAAA;IACb,KAAK,GAAG,CAAC,CAAA;IAET,YAAY,MAAiC,EAAE,QAAgB;QAC7D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;YACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;gBACjB,MAAK;YACP,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACxF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;YAC9B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/B,MAAM,IAAI,QAAQ,CAAC;oBACjB,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,0BAA0B,IAAI,CAAC,QAAQ,QAAQ;iBACzD,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAoB;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;YACtE,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAA;IAC/F,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAkB,EAAE,KAAa;QAC3C,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC1C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,KAAK,GAAG,KAAK;oBACf,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAA;gBACjG,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACxB,OAAO,KAAK,CAAA;YACd,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK;gBAC5B,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAA;YACjG,IAAI,IAAI,CAAC,KAAK;gBACZ,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAA;YACvG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,GAAG,CAAC,WAAmB,EAAU,EAAE;IACjD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,WAAW,CAAC;QAC/C,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAA;IAC3F,MAAM,KAAK,GAAG,6CAA6C,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC7E,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/D,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAA;IACxG,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAAa,EAAuC,EAAE;IACzE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAA;IACrG,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,+CAA+C,CAAC,EAAE,CAAC;QACpF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACtC,MAAM,CAAC,GAAG,CAAE,KAAK,CAAC,CAAC,CAAY,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAA;IAClG,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACvC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;AAClE,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAC9B,MAAiC,EACjC,WAAmB,EACnB,OAAO,GAAqB,EAAE;IAE9B,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEzB,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,EAAE,CAAA;QACP,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAA;QACjG,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;QACrG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,KAAK,IAAI,CAAC;gBACZ,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAA;YACjG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACtF,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAA;QAClE,IAAI,QAAQ,GAAG,KAAK,CAAA;QAEpB,MAAM,QAAQ,GAAG,KAAK,SAAS,CAAC;YAC9B,IAAI,QAAQ;gBAAE,OAAM;YACpB,SAAS,CAAC;gBACR,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;gBAC/C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACf,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;oBAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAC5E,CAAA;oBACD,wEAAwE;oBACxE,yEAAyE;oBACzE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACzC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;wBAC5B,SAAQ;oBACV,CAAC;oBACD,IAAI,KAAK;wBAAE,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBACnC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;oBAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBACd,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBACpB,KAAK,GAAG,IAAI,CAAA;wBACZ,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;wBACpB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM;4BAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;oBAC1E,CAAC;yBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBAC7B,MAAM,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC,CAAA;oBACpG,CAAC;oBACD,QAAQ,GAAG,IAAI,CAAA;oBACf,OAAM;gBACR,CAAC;gBACD,IAAI,MAAM,CAAC,KAAK;oBACd,MAAM,IAAI,QAAQ,CAAC;wBACjB,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,wCAAwC;qBAClD,CAAC,CAAA;gBACJ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBACrE,IAAI,IAAI;oBAAE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACjC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC,CAAA;QAED,MAAM;YACJ,GAAG,IAAI;YACP,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE;SAC3C,CAAA;QACD,IAAI,CAAC,QAAQ;YAAE,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE;gBAAE,KAAK,CAAC,CAAA;IACzD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Narrow a handler's return value to the fields it declared.
|
|
3
|
+
*
|
|
4
|
+
* An undeclared output means no projection: every function would otherwise have to
|
|
5
|
+
* be rewritten at once, and a gap that is visible in `ket permissions` is a better
|
|
6
|
+
* trade than a migration nobody finishes. The count there is the progress bar.
|
|
7
|
+
*/
|
|
8
|
+
export declare function project(fnKey: string, output: Record<string, string>, value: unknown): unknown;
|
|
9
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/project.ts"],"names":[],"mappings":"AAgDA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAa9F"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// What a function is allowed to hand back.
|
|
2
|
+
//
|
|
3
|
+
// `output` was a comment: composed into the manifest and read by nothing, so a
|
|
4
|
+
// function could declare it returned three fields and return eight. That is not a
|
|
5
|
+
// small gap — a handler that preloads a relation to show a product's name hands
|
|
6
|
+
// back the whole product row, cost included, to whoever may call it.
|
|
7
|
+
//
|
|
8
|
+
// The mechanism to close it already existed and already ran: view models build a
|
|
9
|
+
// null-prototype frozen object holding exactly the declared fields, which is the
|
|
10
|
+
// boundary that stops a third-party theme reaching anything else. This is the same
|
|
11
|
+
// idea applied to the other boundary — the one between a function and its caller.
|
|
12
|
+
//
|
|
13
|
+
// Two properties, and they are worth telling apart:
|
|
14
|
+
//
|
|
15
|
+
// Nothing undeclared escapes. This is picking, so it holds for every value,
|
|
16
|
+
// every row, and an empty result — it cannot depend on the data.
|
|
17
|
+
//
|
|
18
|
+
// Everything declared is present. This can only be checked where there is a row
|
|
19
|
+
// to check, so an empty result proves nothing about it. It is a bug in the
|
|
20
|
+
// handler rather than a hole in the boundary, and it is reported as one.
|
|
21
|
+
import { KetError } from '../kernel/errors.js';
|
|
22
|
+
const isPlain = (v) => typeof v === 'object' && v !== null && !Array.isArray(v) && !(v instanceof Date);
|
|
23
|
+
const pick = (fnKey, output, row) => {
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const [f, type] of Object.entries(output)) {
|
|
26
|
+
if (f in row) {
|
|
27
|
+
out[f] = row[f];
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// `?` means the same here as everywhere else: it may be absent. A function that
|
|
31
|
+
// answers {ok:true, qty} or {ok:false, errors} needs it — the convention is a
|
|
32
|
+
// union, and a flat record can only describe one without it.
|
|
33
|
+
if (type.endsWith('?'))
|
|
34
|
+
continue;
|
|
35
|
+
throw new KetError({
|
|
36
|
+
code: 'E_OUTPUT_FIELD_MISSING',
|
|
37
|
+
message: `"${fnKey}" declares output field "${f}" but returned a row without it`,
|
|
38
|
+
hint: `mark it "${type}?" if it is sometimes absent, or build it — the handler returned: ${Object.keys(row).join(', ') || '(nothing)'}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Narrow a handler's return value to the fields it declared.
|
|
45
|
+
*
|
|
46
|
+
* An undeclared output means no projection: every function would otherwise have to
|
|
47
|
+
* be rewritten at once, and a gap that is visible in `ket permissions` is a better
|
|
48
|
+
* trade than a migration nobody finishes. The count there is the progress bar.
|
|
49
|
+
*/
|
|
50
|
+
export function project(fnKey, output, value) {
|
|
51
|
+
const fields = Object.keys(output);
|
|
52
|
+
if (!fields.length)
|
|
53
|
+
return value;
|
|
54
|
+
if (value === null || value === undefined)
|
|
55
|
+
return value;
|
|
56
|
+
if (Array.isArray(value))
|
|
57
|
+
return value.map((v) => project(fnKey, output, v));
|
|
58
|
+
if (!isPlain(value)) {
|
|
59
|
+
throw new KetError({
|
|
60
|
+
code: 'E_OUTPUT_NOT_SHAPED',
|
|
61
|
+
message: `"${fnKey}" declares an output shape but returned ${typeof value}`,
|
|
62
|
+
hint: `declared fields: ${fields.join(', ')} — return an object with those, or a list of them`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return pick(fnKey, output, value);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/project.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,+EAA+E;AAC/E,kFAAkF;AAClF,gFAAgF;AAChF,qEAAqE;AACrE,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,mFAAmF;AACnF,kFAAkF;AAClF,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,8EAA8E;AAC9E,mEAAmE;AACnE,EAAE;AACF,kFAAkF;AAClF,6EAA6E;AAC7E,2EAA2E;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAI9C,MAAM,OAAO,GAAG,CAAC,CAAU,EAAY,EAAE,CACvC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAA;AAElF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,MAA8B,EAAE,GAAQ,EAAO,EAAE;IAC5E,MAAM,GAAG,GAAQ,EAAE,CAAA;IACnB,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,gFAAgF;QAChF,8EAA8E;QAC9E,6DAA6D;QAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAQ;QAChC,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,IAAI,KAAK,4BAA4B,CAAC,iCAAiC;YAChF,IAAI,EAAE,YAAY,IAAI,qEAAqE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE;SACxI,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,MAA8B,EAAE,KAAc;IACnF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAChC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC;YACjB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,IAAI,KAAK,2CAA2C,OAAO,KAAK,EAAE;YAC3E,IAAI,EAAE,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mDAAmD;SAC/F,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Adapter, JobEnqueueOptions, JobEnqueueResult, Manifest, Scope } from '../types.ts';
|
|
2
|
+
export declare const JOB_CHANNEL = "ket_job_ready";
|
|
3
|
+
export type JobState = 'available' | 'scheduled' | 'executing' | 'retryable' | 'completed' | 'discarded' | 'cancelled';
|
|
4
|
+
export type DurableJob = {
|
|
5
|
+
id: string;
|
|
6
|
+
job: string;
|
|
7
|
+
queue: string;
|
|
8
|
+
args: Record<string, unknown>;
|
|
9
|
+
/** Compatibility spelling retained for the original createQueue callers. */
|
|
10
|
+
payload: unknown;
|
|
11
|
+
state: JobState;
|
|
12
|
+
priority: number;
|
|
13
|
+
attempt: number;
|
|
14
|
+
attempts: number;
|
|
15
|
+
maxAttempts: number;
|
|
16
|
+
scheduledAt: string;
|
|
17
|
+
attemptedAt: string | null;
|
|
18
|
+
completedAt: string | null;
|
|
19
|
+
workerId: string | null;
|
|
20
|
+
leaseUntil: string | null;
|
|
21
|
+
actor: string | null;
|
|
22
|
+
scope: Scope;
|
|
23
|
+
uniqueKey: string | null;
|
|
24
|
+
errors: Array<{
|
|
25
|
+
at: string;
|
|
26
|
+
attempt: number;
|
|
27
|
+
message: string;
|
|
28
|
+
}>;
|
|
29
|
+
insertedAt: string;
|
|
30
|
+
updatedAt: string;
|
|
31
|
+
};
|
|
32
|
+
export type EnqueueJobOptions = JobEnqueueOptions & {
|
|
33
|
+
queue?: string;
|
|
34
|
+
maxAttempts?: number;
|
|
35
|
+
actor?: string | null;
|
|
36
|
+
scope?: Scope;
|
|
37
|
+
};
|
|
38
|
+
export type QueueListOptions = {
|
|
39
|
+
state?: JobState;
|
|
40
|
+
queue?: string;
|
|
41
|
+
limit?: number;
|
|
42
|
+
};
|
|
43
|
+
export type Queue = {
|
|
44
|
+
enqueue(job: string, args: Record<string, unknown>, options?: EnqueueJobOptions): Promise<JobEnqueueResult>;
|
|
45
|
+
claim(queue: string): Promise<DurableJob | null>;
|
|
46
|
+
claimBatch(queue: string, options: {
|
|
47
|
+
limit?: number;
|
|
48
|
+
workerId: string;
|
|
49
|
+
leaseMs?: number;
|
|
50
|
+
}): Promise<DurableJob[]>;
|
|
51
|
+
heartbeat(id: string, workerId: string, leaseMs?: number): Promise<boolean>;
|
|
52
|
+
complete(id: string, workerId?: string): Promise<boolean>;
|
|
53
|
+
retry(id: string, error: unknown, runAt: Date, workerId?: string): Promise<boolean>;
|
|
54
|
+
discard(id: string, error: unknown, workerId?: string): Promise<boolean>;
|
|
55
|
+
cancel(id: string): Promise<boolean>;
|
|
56
|
+
/** Operator retry for retryable/discarded jobs; preserves attempt history. */
|
|
57
|
+
retryNow(id: string): Promise<boolean>;
|
|
58
|
+
rescue(options?: {
|
|
59
|
+
limit?: number;
|
|
60
|
+
}): Promise<{
|
|
61
|
+
retried: number;
|
|
62
|
+
discarded: number;
|
|
63
|
+
}>;
|
|
64
|
+
get(id: string): Promise<DurableJob | null>;
|
|
65
|
+
list(options?: QueueListOptions): Promise<DurableJob[]>;
|
|
66
|
+
prune(options?: {
|
|
67
|
+
completedBefore?: Date;
|
|
68
|
+
discardedBefore?: Date;
|
|
69
|
+
}): Promise<number>;
|
|
70
|
+
pending(queue: string): Promise<number>;
|
|
71
|
+
fail(id: string): Promise<void>;
|
|
72
|
+
release(id: string): Promise<void>;
|
|
73
|
+
};
|
|
74
|
+
export declare function validateJobInput(job: string, manifest: Manifest, args: Record<string, unknown>): void;
|
|
75
|
+
export declare function createQueue(adapter: Adapter, options?: {
|
|
76
|
+
now?: () => Date;
|
|
77
|
+
notify?: boolean;
|
|
78
|
+
}): Promise<Queue>;
|
|
79
|
+
export declare function queueFor(adapter: Adapter): Promise<Queue>;
|
|
80
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/queue.ts"],"names":[],"mappings":"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"}
|