@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,494 @@
|
|
|
1
|
+
// Durable jobs. PostgreSQL/SQLite are the source of truth; notifications merely
|
|
2
|
+
// shorten the time between commit and claim. Nothing here assumes the worker is
|
|
3
|
+
// in the same process as the code that enqueued the job.
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { KetError } from '../kernel/errors.js';
|
|
6
|
+
import { isDateText, parseType } from '../kernel/types.js';
|
|
7
|
+
export const JOB_CHANNEL = 'ket_job_ready';
|
|
8
|
+
const DDL_SQLITE = `
|
|
9
|
+
CREATE TABLE IF NOT EXISTS ket_job (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
job TEXT NOT NULL,
|
|
12
|
+
queue TEXT NOT NULL,
|
|
13
|
+
args TEXT NOT NULL,
|
|
14
|
+
state TEXT NOT NULL,
|
|
15
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
16
|
+
attempt INTEGER NOT NULL DEFAULT 0,
|
|
17
|
+
max_attempts INTEGER NOT NULL,
|
|
18
|
+
scheduled_at TEXT NOT NULL,
|
|
19
|
+
attempted_at TEXT,
|
|
20
|
+
completed_at TEXT,
|
|
21
|
+
worker_id TEXT,
|
|
22
|
+
lease_until TEXT,
|
|
23
|
+
actor TEXT,
|
|
24
|
+
company_id TEXT,
|
|
25
|
+
companies TEXT,
|
|
26
|
+
branch TEXT,
|
|
27
|
+
branches TEXT,
|
|
28
|
+
unique_key TEXT,
|
|
29
|
+
errors TEXT NOT NULL DEFAULT '[]',
|
|
30
|
+
inserted_at TEXT NOT NULL,
|
|
31
|
+
updated_at TEXT NOT NULL
|
|
32
|
+
);
|
|
33
|
+
`;
|
|
34
|
+
const DDL_POSTGRES = `
|
|
35
|
+
CREATE TABLE IF NOT EXISTS ket_job (
|
|
36
|
+
id TEXT PRIMARY KEY,
|
|
37
|
+
job TEXT NOT NULL,
|
|
38
|
+
queue TEXT NOT NULL,
|
|
39
|
+
args TEXT NOT NULL,
|
|
40
|
+
state TEXT NOT NULL,
|
|
41
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
42
|
+
attempt INTEGER NOT NULL DEFAULT 0,
|
|
43
|
+
max_attempts INTEGER NOT NULL,
|
|
44
|
+
scheduled_at TIMESTAMPTZ NOT NULL,
|
|
45
|
+
attempted_at TIMESTAMPTZ,
|
|
46
|
+
completed_at TIMESTAMPTZ,
|
|
47
|
+
worker_id TEXT,
|
|
48
|
+
lease_until TIMESTAMPTZ,
|
|
49
|
+
actor TEXT,
|
|
50
|
+
company_id TEXT,
|
|
51
|
+
companies TEXT,
|
|
52
|
+
branch TEXT,
|
|
53
|
+
branches TEXT,
|
|
54
|
+
unique_key TEXT,
|
|
55
|
+
errors TEXT NOT NULL DEFAULT '[]',
|
|
56
|
+
inserted_at TIMESTAMPTZ NOT NULL,
|
|
57
|
+
updated_at TIMESTAMPTZ NOT NULL
|
|
58
|
+
);
|
|
59
|
+
`;
|
|
60
|
+
// Only runnable states belong in the fetch and uniqueness indexes. This both
|
|
61
|
+
// gives claim a single ordering path across states and releases a unique key as
|
|
62
|
+
// soon as its job reaches a terminal state. Business idempotency remains the
|
|
63
|
+
// handler's responsibility; queue uniqueness only coalesces active delivery.
|
|
64
|
+
const INDEX_DDL = `
|
|
65
|
+
DROP INDEX IF EXISTS ket_job_fetch;
|
|
66
|
+
DROP INDEX IF EXISTS ket_job_unique;
|
|
67
|
+
CREATE INDEX IF NOT EXISTS ket_job_fetch_active
|
|
68
|
+
ON ket_job (queue, priority, scheduled_at, id)
|
|
69
|
+
WHERE state IN ('available', 'scheduled', 'retryable');
|
|
70
|
+
CREATE INDEX IF NOT EXISTS ket_job_rescue
|
|
71
|
+
ON ket_job (state, lease_until);
|
|
72
|
+
CREATE UNIQUE INDEX IF NOT EXISTS ket_job_unique_active
|
|
73
|
+
ON ket_job (job, unique_key)
|
|
74
|
+
WHERE unique_key IS NOT NULL AND state IN ('available', 'scheduled', 'executing', 'retryable');
|
|
75
|
+
`;
|
|
76
|
+
const encode = (value) => JSON.stringify(value ?? null);
|
|
77
|
+
let lastIdMs = -1;
|
|
78
|
+
let idSequence = 0;
|
|
79
|
+
const nextJobId = (at) => {
|
|
80
|
+
const milliseconds = at.getTime();
|
|
81
|
+
idSequence = milliseconds === lastIdMs ? idSequence + 1 : 0;
|
|
82
|
+
lastIdMs = milliseconds;
|
|
83
|
+
// The timestamp and per-process sequence retain FIFO for jobs inserted in one
|
|
84
|
+
// producer at the same priority/due time; UUID entropy keeps ids collision-safe
|
|
85
|
+
// across producers and nodes.
|
|
86
|
+
return `${milliseconds.toString(36).padStart(10, '0')}-${idSequence.toString(36).padStart(4, '0')}-${randomUUID()}`;
|
|
87
|
+
};
|
|
88
|
+
const decode = (value, fallback) => {
|
|
89
|
+
if (value == null)
|
|
90
|
+
return fallback;
|
|
91
|
+
if (typeof value !== 'string')
|
|
92
|
+
return value;
|
|
93
|
+
try {
|
|
94
|
+
return JSON.parse(value);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return fallback;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const iso = (value) => {
|
|
101
|
+
if (value == null)
|
|
102
|
+
return null;
|
|
103
|
+
return (value instanceof Date ? value : new Date(String(value))).toISOString();
|
|
104
|
+
};
|
|
105
|
+
const toJob = (r) => {
|
|
106
|
+
const args = decode(r.args, {});
|
|
107
|
+
const attempt = Number(r.attempt);
|
|
108
|
+
const companies = decode(r.companies, null);
|
|
109
|
+
const branches = decode(r.branches, null);
|
|
110
|
+
return {
|
|
111
|
+
id: String(r.id),
|
|
112
|
+
job: String(r.job),
|
|
113
|
+
queue: String(r.queue),
|
|
114
|
+
args,
|
|
115
|
+
payload: args,
|
|
116
|
+
state: String(r.state),
|
|
117
|
+
priority: Number(r.priority),
|
|
118
|
+
attempt,
|
|
119
|
+
attempts: attempt,
|
|
120
|
+
maxAttempts: Number(r.max_attempts),
|
|
121
|
+
scheduledAt: iso(r.scheduled_at),
|
|
122
|
+
attemptedAt: iso(r.attempted_at),
|
|
123
|
+
completedAt: iso(r.completed_at),
|
|
124
|
+
workerId: r.worker_id == null ? null : String(r.worker_id),
|
|
125
|
+
leaseUntil: iso(r.lease_until),
|
|
126
|
+
actor: r.actor == null ? null : String(r.actor),
|
|
127
|
+
scope: {
|
|
128
|
+
company: r.company_id == null ? null : String(r.company_id),
|
|
129
|
+
...(companies === null ? {} : { companies }),
|
|
130
|
+
...(r.branch == null ? {} : { branch: String(r.branch) }),
|
|
131
|
+
...(branches === null ? {} : { branches }),
|
|
132
|
+
},
|
|
133
|
+
uniqueKey: r.unique_key == null ? null : String(r.unique_key),
|
|
134
|
+
errors: decode(r.errors, []),
|
|
135
|
+
insertedAt: iso(r.inserted_at),
|
|
136
|
+
updatedAt: iso(r.updated_at),
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
const JS_OF = {
|
|
140
|
+
id: 'string',
|
|
141
|
+
text: 'string',
|
|
142
|
+
ref: 'string',
|
|
143
|
+
int: 'number',
|
|
144
|
+
float: 'number',
|
|
145
|
+
decimal: 'number',
|
|
146
|
+
bool: 'boolean',
|
|
147
|
+
date: 'string',
|
|
148
|
+
datetime: 'string',
|
|
149
|
+
json: 'object',
|
|
150
|
+
};
|
|
151
|
+
export function validateJobInput(job, manifest, args) {
|
|
152
|
+
const signature = manifest.jobs[job]?.input;
|
|
153
|
+
if (!signature)
|
|
154
|
+
throw new KetError({ code: 'E_UNKNOWN_JOB', message: `no background job "${job}"` });
|
|
155
|
+
const errors = [];
|
|
156
|
+
for (const [name, spec] of Object.entries(signature)) {
|
|
157
|
+
const type = parseType(spec);
|
|
158
|
+
const value = args[name];
|
|
159
|
+
if (value == null) {
|
|
160
|
+
if (type.ok && !type.optional)
|
|
161
|
+
errors.push(`missing required input "${name}" (${spec})`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (!type.ok)
|
|
165
|
+
continue;
|
|
166
|
+
const want = JS_OF[type.base];
|
|
167
|
+
if (want && typeof value !== want)
|
|
168
|
+
errors.push(`input "${name}" expects ${want}, got ${typeof value}`);
|
|
169
|
+
if (type.base === 'int' && typeof value === 'number' && !Number.isInteger(value))
|
|
170
|
+
errors.push(`input "${name}" expects an integer`);
|
|
171
|
+
if (type.base === 'date' && !isDateText(value))
|
|
172
|
+
errors.push(`input "${name}" expects a calendar date (YYYY-MM-DD)`);
|
|
173
|
+
}
|
|
174
|
+
for (const name of Object.keys(args))
|
|
175
|
+
if (!(name in signature))
|
|
176
|
+
errors.push(`unknown input "${name}"`);
|
|
177
|
+
if (errors.length)
|
|
178
|
+
throw new KetError({
|
|
179
|
+
code: 'E_INVALID_JOB_INPUT',
|
|
180
|
+
message: `${job}: ${errors.join('; ')}`,
|
|
181
|
+
hint: `signature: ${JSON.stringify(signature)}`,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const initialized = new WeakMap();
|
|
185
|
+
async function ensureSchema(adapter) {
|
|
186
|
+
let ready = initialized.get(adapter);
|
|
187
|
+
if (!ready) {
|
|
188
|
+
ready = (async () => {
|
|
189
|
+
const initialize = async (target) => {
|
|
190
|
+
// Every PostgreSQL replica takes the same transaction-scoped lock before it
|
|
191
|
+
// inspects or renames the legacy table. The lock and DDL share one reserved
|
|
192
|
+
// connection, so two pods cannot both decide they own the migration.
|
|
193
|
+
if (target.name === 'postgres')
|
|
194
|
+
await target.all('SELECT pg_advisory_xact_lock(1262835793)');
|
|
195
|
+
const before = await target.introspect();
|
|
196
|
+
let migrateLegacy = false;
|
|
197
|
+
if (before.ket_job && !before.ket_job.job) {
|
|
198
|
+
if (before.ket_job_legacy)
|
|
199
|
+
throw new Error('legacy ket_job and ket_job_legacy both exist; finish the queue migration manually');
|
|
200
|
+
await target.exec('ALTER TABLE ket_job RENAME TO ket_job_legacy');
|
|
201
|
+
migrateLegacy = true;
|
|
202
|
+
}
|
|
203
|
+
await target.exec(target.name === 'postgres' ? DDL_POSTGRES : DDL_SQLITE);
|
|
204
|
+
if (before.ket_job?.job && !before.ket_job.branch)
|
|
205
|
+
await target.exec('ALTER TABLE ket_job ADD COLUMN branch TEXT');
|
|
206
|
+
await target.exec(INDEX_DDL);
|
|
207
|
+
if (migrateLegacy) {
|
|
208
|
+
// V1 used queue as both routing key and operation name. Preserve its rows
|
|
209
|
+
// under stable string ids; workers will execute a still-declared qualified
|
|
210
|
+
// name or safely discard one whose code no longer exists.
|
|
211
|
+
await target.exec(`INSERT INTO ket_job
|
|
212
|
+
(id, job, queue, args, state, priority, attempt, max_attempts, scheduled_at,
|
|
213
|
+
completed_at, errors, inserted_at, updated_at)
|
|
214
|
+
SELECT 'legacy-' || CAST(id AS TEXT), queue, queue, COALESCE(payload, '{}'),
|
|
215
|
+
CASE state
|
|
216
|
+
WHEN 'ready' THEN 'available'
|
|
217
|
+
WHEN 'claimed' THEN 'retryable'
|
|
218
|
+
WHEN 'done' THEN 'completed'
|
|
219
|
+
ELSE 'retryable'
|
|
220
|
+
END,
|
|
221
|
+
0, attempts, 20, created_at,
|
|
222
|
+
CASE WHEN state = 'done' THEN created_at ELSE NULL END,
|
|
223
|
+
'[]', created_at, created_at
|
|
224
|
+
FROM ket_job_legacy WHERE true
|
|
225
|
+
ON CONFLICT DO NOTHING`);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
if (adapter.transaction)
|
|
229
|
+
await initialize(adapter);
|
|
230
|
+
else
|
|
231
|
+
await adapter.tx(initialize);
|
|
232
|
+
})();
|
|
233
|
+
initialized.set(adapter, ready);
|
|
234
|
+
ready.catch(() => initialized.delete(adapter));
|
|
235
|
+
}
|
|
236
|
+
return ready;
|
|
237
|
+
}
|
|
238
|
+
const workerGuard = (pg, parameter, workerId) => {
|
|
239
|
+
if (workerId === undefined)
|
|
240
|
+
return { sql: '', params: [] };
|
|
241
|
+
if (workerId === null)
|
|
242
|
+
return { sql: ' AND worker_id IS NULL', params: [] };
|
|
243
|
+
return { sql: ` AND worker_id = ${pg ? `$${parameter}` : '?'}`, params: [workerId] };
|
|
244
|
+
};
|
|
245
|
+
export async function createQueue(adapter, options = {}) {
|
|
246
|
+
await ensureSchema(adapter);
|
|
247
|
+
const now = options.now ?? (() => new Date());
|
|
248
|
+
const pg = adapter.name === 'postgres';
|
|
249
|
+
const p = (n) => (pg ? `$${n}` : '?');
|
|
250
|
+
const get = async (id) => {
|
|
251
|
+
const rows = await adapter.all(`SELECT * FROM ket_job WHERE id = ${p(1)}`, [id]);
|
|
252
|
+
return rows[0] ? toJob(rows[0]) : null;
|
|
253
|
+
};
|
|
254
|
+
const errorHistory = async (id, error, known) => {
|
|
255
|
+
const current = known ?? (await get(id));
|
|
256
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
257
|
+
return encode([
|
|
258
|
+
...(current?.errors ?? []),
|
|
259
|
+
{ at: now().toISOString(), attempt: current?.attempt ?? 0, message },
|
|
260
|
+
].slice(-20));
|
|
261
|
+
};
|
|
262
|
+
const retryExecuting = async (id, error, runAt, workerId, known) => {
|
|
263
|
+
const at = now().toISOString();
|
|
264
|
+
const errors = await errorHistory(id, error, known);
|
|
265
|
+
const guard = workerGuard(pg, 5, workerId);
|
|
266
|
+
const result = await adapter.run(`UPDATE ket_job SET state = 'retryable', scheduled_at = ${p(1)}, errors = ${p(2)},
|
|
267
|
+
lease_until = NULL, worker_id = NULL, updated_at = ${p(3)}
|
|
268
|
+
WHERE id = ${p(4)} AND state = 'executing'${guard.sql}`, [runAt.toISOString(), errors, at, id, ...guard.params]);
|
|
269
|
+
return result.changes === 1;
|
|
270
|
+
};
|
|
271
|
+
const discardExecuting = async (id, error, workerId, known) => {
|
|
272
|
+
const at = now().toISOString();
|
|
273
|
+
const errors = await errorHistory(id, error, known);
|
|
274
|
+
const guard = workerGuard(pg, 5, workerId);
|
|
275
|
+
const result = await adapter.run(`UPDATE ket_job SET state = 'discarded', errors = ${p(1)}, completed_at = ${p(2)},
|
|
276
|
+
lease_until = NULL, worker_id = NULL, updated_at = ${p(3)}
|
|
277
|
+
WHERE id = ${p(4)} AND state = 'executing'${guard.sql}`, [errors, at, at, id, ...guard.params]);
|
|
278
|
+
return result.changes === 1;
|
|
279
|
+
};
|
|
280
|
+
const queue = {
|
|
281
|
+
async enqueue(job, args, o = {}) {
|
|
282
|
+
const at = now();
|
|
283
|
+
const runAt = o.runAt ?? at;
|
|
284
|
+
if (Number.isNaN(runAt.getTime()))
|
|
285
|
+
throw new Error('job runAt must be a valid date');
|
|
286
|
+
if (!Number.isInteger(o.priority ?? 0) || (o.priority ?? 0) < 0)
|
|
287
|
+
throw new Error('job priority must be an integer >= 0 (zero is highest)');
|
|
288
|
+
if (!Number.isInteger(o.maxAttempts ?? 20) || (o.maxAttempts ?? 20) < 1)
|
|
289
|
+
throw new Error('job maxAttempts must be an integer >= 1');
|
|
290
|
+
const state = runAt.getTime() > at.getTime() ? 'scheduled' : 'available';
|
|
291
|
+
const id = nextJobId(at);
|
|
292
|
+
const scope = o.scope ?? { company: null };
|
|
293
|
+
const values = [
|
|
294
|
+
id,
|
|
295
|
+
job,
|
|
296
|
+
o.queue ?? job,
|
|
297
|
+
encode(args),
|
|
298
|
+
state,
|
|
299
|
+
o.priority ?? 0,
|
|
300
|
+
o.maxAttempts ?? 20,
|
|
301
|
+
runAt.toISOString(),
|
|
302
|
+
o.actor ?? null,
|
|
303
|
+
scope.company,
|
|
304
|
+
scope.companies == null ? null : encode(scope.companies),
|
|
305
|
+
scope.branch ?? null,
|
|
306
|
+
scope.branches == null ? null : encode(scope.branches),
|
|
307
|
+
o.uniqueKey ?? null,
|
|
308
|
+
at.toISOString(),
|
|
309
|
+
at.toISOString(),
|
|
310
|
+
];
|
|
311
|
+
const placeholders = values.map((_, index) => p(index + 1)).join(', ');
|
|
312
|
+
const insert = () => adapter.run(`INSERT INTO ket_job
|
|
313
|
+
(id, job, queue, args, state, priority, max_attempts, scheduled_at, actor,
|
|
314
|
+
company_id, companies, branch, branches, unique_key, inserted_at, updated_at)
|
|
315
|
+
VALUES (${placeholders}) ON CONFLICT DO NOTHING`, values);
|
|
316
|
+
let inserted = await insert();
|
|
317
|
+
let existing = false;
|
|
318
|
+
let actualId = id;
|
|
319
|
+
if (o.uniqueKey) {
|
|
320
|
+
// The conflicting job may reach a terminal state between INSERT and
|
|
321
|
+
// SELECT, releasing the partial unique key. Retry the insert in that
|
|
322
|
+
// window instead of returning no job (or throwing) for valid work.
|
|
323
|
+
for (let attempt = 0; inserted.changes === 0 && attempt < 3; attempt++) {
|
|
324
|
+
const rows = await adapter.all(`SELECT id FROM ket_job
|
|
325
|
+
WHERE job = ${p(1)} AND unique_key = ${p(2)}
|
|
326
|
+
AND state IN ('available', 'scheduled', 'executing', 'retryable')
|
|
327
|
+
LIMIT 1`, [job, o.uniqueKey]);
|
|
328
|
+
if (rows[0]) {
|
|
329
|
+
existing = true;
|
|
330
|
+
actualId = String(rows[0].id);
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
inserted = await insert();
|
|
334
|
+
}
|
|
335
|
+
if (inserted.changes === 0 && !existing)
|
|
336
|
+
throw new Error(`could not resolve unique job ${job}:${o.uniqueKey}`);
|
|
337
|
+
}
|
|
338
|
+
if (inserted.changes === 0 && !o.uniqueKey)
|
|
339
|
+
throw new Error(`job id collision while enqueueing "${job}"`);
|
|
340
|
+
if (!existing && options.notify !== false && adapter.notifications)
|
|
341
|
+
await adapter.notifications.publish(JOB_CHANNEL, o.queue ?? job);
|
|
342
|
+
return { id: actualId, existing };
|
|
343
|
+
},
|
|
344
|
+
async claim(name) {
|
|
345
|
+
return ((await queue.claimBatch(name, { limit: 1, workerId: `compat-${process.pid}`, leaseMs: 60_000 }))[0] ??
|
|
346
|
+
null);
|
|
347
|
+
},
|
|
348
|
+
async claimBatch(name, o) {
|
|
349
|
+
const at = now();
|
|
350
|
+
const until = new Date(at.getTime() + (o.leaseMs ?? 60_000)).toISOString();
|
|
351
|
+
const limit = Math.max(1, Math.min(100, o.limit ?? 10));
|
|
352
|
+
if (pg) {
|
|
353
|
+
const rows = await adapter.all(`WITH picked AS (
|
|
354
|
+
SELECT id FROM ket_job
|
|
355
|
+
WHERE queue = $1
|
|
356
|
+
AND state IN ('available', 'scheduled', 'retryable')
|
|
357
|
+
AND scheduled_at <= $2
|
|
358
|
+
ORDER BY priority, scheduled_at, id
|
|
359
|
+
FOR UPDATE SKIP LOCKED
|
|
360
|
+
LIMIT $3
|
|
361
|
+
)
|
|
362
|
+
UPDATE ket_job AS job
|
|
363
|
+
SET state = 'executing', attempt = attempt + 1, attempted_at = $2,
|
|
364
|
+
worker_id = $4, lease_until = $5, updated_at = $2
|
|
365
|
+
FROM picked WHERE job.id = picked.id RETURNING job.*`, [name, at.toISOString(), limit, o.workerId, until]);
|
|
366
|
+
return rows.map(toJob);
|
|
367
|
+
}
|
|
368
|
+
return adapter.tx(async (tx) => {
|
|
369
|
+
const ids = await tx.all(`SELECT id FROM ket_job
|
|
370
|
+
WHERE queue = ? AND state IN ('available', 'scheduled', 'retryable') AND scheduled_at <= ?
|
|
371
|
+
ORDER BY priority, scheduled_at, id LIMIT ?`, [name, at.toISOString(), limit]);
|
|
372
|
+
const claimed = [];
|
|
373
|
+
for (const row of ids) {
|
|
374
|
+
const result = await tx.run(`UPDATE ket_job SET state = 'executing', attempt = attempt + 1, attempted_at = ?,
|
|
375
|
+
worker_id = ?, lease_until = ?, updated_at = ?
|
|
376
|
+
WHERE id = ? AND state IN ('available', 'scheduled', 'retryable') AND scheduled_at <= ?`, [at.toISOString(), o.workerId, until, at.toISOString(), row.id, at.toISOString()]);
|
|
377
|
+
if (result.changes !== 1)
|
|
378
|
+
continue;
|
|
379
|
+
const found = await tx.all('SELECT * FROM ket_job WHERE id = ?', [row.id]);
|
|
380
|
+
if (found[0])
|
|
381
|
+
claimed.push(toJob(found[0]));
|
|
382
|
+
}
|
|
383
|
+
return claimed;
|
|
384
|
+
});
|
|
385
|
+
},
|
|
386
|
+
async heartbeat(id, workerId, leaseMs = 60_000) {
|
|
387
|
+
const at = now();
|
|
388
|
+
const result = await adapter.run(`UPDATE ket_job SET lease_until = ${p(1)}, updated_at = ${p(2)}
|
|
389
|
+
WHERE id = ${p(3)} AND state = 'executing' AND worker_id = ${p(4)}`, [new Date(at.getTime() + leaseMs).toISOString(), at.toISOString(), id, workerId]);
|
|
390
|
+
return result.changes === 1;
|
|
391
|
+
},
|
|
392
|
+
async complete(id, workerId) {
|
|
393
|
+
const at = now().toISOString();
|
|
394
|
+
const guard = workerGuard(pg, 4, workerId);
|
|
395
|
+
const result = await adapter.run(`UPDATE ket_job SET state = 'completed', completed_at = ${p(1)}, lease_until = NULL,
|
|
396
|
+
worker_id = NULL, updated_at = ${p(2)} WHERE id = ${p(3)} AND state = 'executing'${guard.sql}`, [at, at, id, ...guard.params]);
|
|
397
|
+
return result.changes === 1;
|
|
398
|
+
},
|
|
399
|
+
async retry(id, error, runAt, workerId) {
|
|
400
|
+
return retryExecuting(id, error, runAt, workerId);
|
|
401
|
+
},
|
|
402
|
+
async discard(id, error, workerId) {
|
|
403
|
+
return discardExecuting(id, error, workerId);
|
|
404
|
+
},
|
|
405
|
+
async cancel(id) {
|
|
406
|
+
const at = now().toISOString();
|
|
407
|
+
const result = await adapter.run(`UPDATE ket_job SET state = 'cancelled', completed_at = ${p(1)}, updated_at = ${p(2)}
|
|
408
|
+
WHERE id = ${p(3)} AND state NOT IN ('completed', 'discarded', 'cancelled')`, [at, at, id]);
|
|
409
|
+
return result.changes === 1;
|
|
410
|
+
},
|
|
411
|
+
async retryNow(id) {
|
|
412
|
+
const at = now().toISOString();
|
|
413
|
+
const result = await adapter.run(`UPDATE ket_job SET state = 'available', scheduled_at = ${p(1)}, completed_at = NULL,
|
|
414
|
+
worker_id = NULL, lease_until = NULL,
|
|
415
|
+
max_attempts = CASE WHEN max_attempts <= attempt THEN attempt + 1 ELSE max_attempts END,
|
|
416
|
+
updated_at = ${p(2)}
|
|
417
|
+
WHERE id = ${p(3)} AND state IN ('retryable', 'discarded')`, [at, at, id]);
|
|
418
|
+
if (result.changes === 1 && options.notify !== false && adapter.notifications)
|
|
419
|
+
await adapter.notifications.publish(JOB_CHANNEL, (await get(id))?.queue ?? '');
|
|
420
|
+
return result.changes === 1;
|
|
421
|
+
},
|
|
422
|
+
async rescue(o = {}) {
|
|
423
|
+
const at = now();
|
|
424
|
+
const limit = Math.max(1, Math.min(1_000, o.limit ?? 100));
|
|
425
|
+
const rows = await adapter.all(`SELECT * FROM ket_job
|
|
426
|
+
WHERE state = 'executing' AND lease_until < ${p(1)}
|
|
427
|
+
ORDER BY lease_until, id LIMIT ${p(2)}`, [at.toISOString(), limit]);
|
|
428
|
+
let retried = 0;
|
|
429
|
+
let discarded = 0;
|
|
430
|
+
for (const job of rows.map(toJob)) {
|
|
431
|
+
// The observed worker id acts as the lease token. Concurrent rescuers can
|
|
432
|
+
// both see this row, but only one guarded transition can still own it.
|
|
433
|
+
if (job.attempt >= job.maxAttempts) {
|
|
434
|
+
if (await discardExecuting(job.id, new Error('worker lease expired'), job.workerId, job))
|
|
435
|
+
discarded++;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
if (await retryExecuting(job.id, new Error('worker lease expired'), at, job.workerId, job))
|
|
439
|
+
retried++;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return { retried, discarded };
|
|
443
|
+
},
|
|
444
|
+
get,
|
|
445
|
+
async list(o = {}) {
|
|
446
|
+
const conditions = [];
|
|
447
|
+
const params = [];
|
|
448
|
+
if (o.state) {
|
|
449
|
+
params.push(o.state);
|
|
450
|
+
conditions.push(`state = ${p(params.length)}`);
|
|
451
|
+
}
|
|
452
|
+
if (o.queue) {
|
|
453
|
+
params.push(o.queue);
|
|
454
|
+
conditions.push(`queue = ${p(params.length)}`);
|
|
455
|
+
}
|
|
456
|
+
params.push(Math.max(1, Math.min(1_000, o.limit ?? 100)));
|
|
457
|
+
const rows = await adapter.all(`SELECT * FROM ket_job${conditions.length ? ` WHERE ${conditions.join(' AND ')}` : ''}
|
|
458
|
+
ORDER BY inserted_at DESC LIMIT ${p(params.length)}`, params);
|
|
459
|
+
return rows.map(toJob);
|
|
460
|
+
},
|
|
461
|
+
async prune(o = {}) {
|
|
462
|
+
const completed = (o.completedBefore ?? new Date(now().getTime() - 7 * 86_400_000)).toISOString();
|
|
463
|
+
const discarded = (o.discardedBefore ?? new Date(now().getTime() - 30 * 86_400_000)).toISOString();
|
|
464
|
+
const result = await adapter.run(`DELETE FROM ket_job
|
|
465
|
+
WHERE (state IN ('completed', 'cancelled') AND completed_at < ${p(1)})
|
|
466
|
+
OR (state = 'discarded' AND completed_at < ${p(2)})`, [completed, discarded]);
|
|
467
|
+
return result.changes;
|
|
468
|
+
},
|
|
469
|
+
async pending(name) {
|
|
470
|
+
const rows = await adapter.all(`SELECT COUNT(*) AS count FROM ket_job
|
|
471
|
+
WHERE queue = ${p(1)} AND state IN ('available', 'scheduled', 'retryable')`, [name]);
|
|
472
|
+
return Number(rows[0]?.count ?? 0);
|
|
473
|
+
},
|
|
474
|
+
async fail(id) {
|
|
475
|
+
await queue.retry(id, new Error('released after failure'), now());
|
|
476
|
+
},
|
|
477
|
+
async release(id) {
|
|
478
|
+
const at = now().toISOString();
|
|
479
|
+
await adapter.run(`UPDATE ket_job SET state = 'available', scheduled_at = ${p(1)}, worker_id = NULL,
|
|
480
|
+
lease_until = NULL, updated_at = ${p(2)} WHERE id = ${p(3)} AND state = 'executing'`, [at, at, id]);
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
return queue;
|
|
484
|
+
}
|
|
485
|
+
const cache = new WeakMap();
|
|
486
|
+
export function queueFor(adapter) {
|
|
487
|
+
let queue = cache.get(adapter);
|
|
488
|
+
if (!queue) {
|
|
489
|
+
queue = createQueue(adapter);
|
|
490
|
+
cache.set(adapter, queue);
|
|
491
|
+
}
|
|
492
|
+
return queue;
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/server/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { TemplateResult } from '@ketvietlab/ketjs-view';
|
|
2
|
+
import type { IncomingMessage } from 'node:http';
|
|
3
|
+
/** Markup that has been through the escaper. The only thing that may become HTML. */
|
|
4
|
+
export type Html = TemplateResult;
|
|
5
|
+
export type ResponseBody = string | Uint8Array | AsyncIterable<Uint8Array>;
|
|
6
|
+
export declare const NAVIGATION_HEADER = "x-ket-navigation";
|
|
7
|
+
export declare const NAVIGATION_VERSION = "fragment-v1";
|
|
8
|
+
export declare const NAVIGATION_TYPE = "text/vnd.ket.fragments+html";
|
|
9
|
+
declare const RESPONSE: unique symbol;
|
|
10
|
+
export type RouteResult = {
|
|
11
|
+
status?: number;
|
|
12
|
+
type?: string;
|
|
13
|
+
body: ResponseBody;
|
|
14
|
+
/** Extra response headers. A cookie is the reason this exists. */
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
readonly [RESPONSE]: true;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* A whole document. `<!doctype html>` is a constant rather than a hole, which is
|
|
20
|
+
* why it can be prepended: there is nothing to escape in it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function page(o: {
|
|
23
|
+
body: Html;
|
|
24
|
+
status?: number;
|
|
25
|
+
}): RouteResult;
|
|
26
|
+
/** A fragment: no doctype, for a partial response or an island. */
|
|
27
|
+
export declare function fragment(body: Html, o?: {
|
|
28
|
+
status?: number;
|
|
29
|
+
type?: string;
|
|
30
|
+
}): RouteResult;
|
|
31
|
+
/** Whether this browser asks for the progressive-navigation representation. */
|
|
32
|
+
export declare function isNavigationRequest(req: Pick<IncomingMessage, 'headers'>): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Serve either the full document or only its named, replaceable slot bodies.
|
|
35
|
+
* Thunks are deliberate: an island outside the selected representation is never
|
|
36
|
+
* constructed merely to be thrown away by the browser.
|
|
37
|
+
*/
|
|
38
|
+
export declare function navigablePage(req: Pick<IncomingMessage, 'headers'>, o: {
|
|
39
|
+
title: string;
|
|
40
|
+
document: () => Html;
|
|
41
|
+
slots: Record<string, () => Html>;
|
|
42
|
+
status?: number;
|
|
43
|
+
}): RouteResult;
|
|
44
|
+
export declare function json(value: unknown, o?: {
|
|
45
|
+
status?: number;
|
|
46
|
+
}): RouteResult;
|
|
47
|
+
export declare function text(body: string, o?: {
|
|
48
|
+
type?: string;
|
|
49
|
+
status?: number;
|
|
50
|
+
}): RouteResult;
|
|
51
|
+
/** Binary data already resident in memory. Unlike raw(), it can never become HTML by accident. */
|
|
52
|
+
export declare function bytes(body: Uint8Array, o: {
|
|
53
|
+
type: string;
|
|
54
|
+
status?: number;
|
|
55
|
+
}): RouteResult;
|
|
56
|
+
/** A backpressure-aware binary response; the HTTP layer consumes it chunk by chunk. */
|
|
57
|
+
export declare function streamed(body: AsyncIterable<Uint8Array>, o: {
|
|
58
|
+
type: string;
|
|
59
|
+
status?: number;
|
|
60
|
+
}): RouteResult;
|
|
61
|
+
/**
|
|
62
|
+
* The escape hatch, deliberately named so a search finds every use.
|
|
63
|
+
*
|
|
64
|
+
* Reach for it when the bytes did not come from the escaper and cannot: a sitemap
|
|
65
|
+
* assembled by a library, a cached response, markup from a source you have already
|
|
66
|
+
* decided to trust. Never for a value that came from a request.
|
|
67
|
+
*/
|
|
68
|
+
export declare function raw(body: string, o?: {
|
|
69
|
+
type?: string;
|
|
70
|
+
status?: number;
|
|
71
|
+
}): RouteResult;
|
|
72
|
+
/**
|
|
73
|
+
* Add headers to a response without rebuilding it, and without spreading — a
|
|
74
|
+
* spread would produce a plain object that only looks like a RouteResult, which
|
|
75
|
+
* is exactly the hole the brand exists to close.
|
|
76
|
+
*/
|
|
77
|
+
export declare function withHeaders(result: RouteResult, headers: Record<string, string>): RouteResult;
|
|
78
|
+
/**
|
|
79
|
+
* The document every screen sits in, as markup rather than as a string.
|
|
80
|
+
*
|
|
81
|
+
* `lang` reaches the first attribute on the page, which is where i18n starts and
|
|
82
|
+
* where the old concatenated shell put whatever the query string said.
|
|
83
|
+
*/
|
|
84
|
+
export declare function document(o: {
|
|
85
|
+
lang: string;
|
|
86
|
+
title?: string;
|
|
87
|
+
head?: Html;
|
|
88
|
+
body: Html;
|
|
89
|
+
}): Html;
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=respond.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/server/respond.ts"],"names":[],"mappings":"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"}
|