@zmdb/orm 1.0.0-beta.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 +674 -0
- package/README.md +30 -0
- package/dist/cache/index.d.ts +34 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +149 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/drivers/transactional.d.ts +6 -0
- package/dist/drivers/transactional.d.ts.map +1 -0
- package/dist/drivers/transactional.js +2 -0
- package/dist/drivers/transactional.js.map +1 -0
- package/dist/dto/index.d.ts +41 -0
- package/dist/dto/index.d.ts.map +1 -0
- package/dist/dto/index.js +334 -0
- package/dist/dto/index.js.map +1 -0
- package/dist/entity-modeling/index.d.ts +18 -0
- package/dist/entity-modeling/index.d.ts.map +1 -0
- package/dist/entity-modeling/index.js +26 -0
- package/dist/entity-modeling/index.js.map +1 -0
- package/dist/filters/index.d.ts +62 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/index.js +163 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/index.d.ts +413 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2003 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders/index.d.ts +38 -0
- package/dist/loaders/index.d.ts.map +1 -0
- package/dist/loaders/index.js +164 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/outbox/index.d.ts +59 -0
- package/dist/outbox/index.d.ts.map +1 -0
- package/dist/outbox/index.js +323 -0
- package/dist/outbox/index.js.map +1 -0
- package/dist/outbox/sql.d.ts +52 -0
- package/dist/outbox/sql.d.ts.map +1 -0
- package/dist/outbox/sql.js +115 -0
- package/dist/outbox/sql.js.map +1 -0
- package/dist/relations/index.d.ts +38 -0
- package/dist/relations/index.d.ts.map +1 -0
- package/dist/relations/index.js +164 -0
- package/dist/relations/index.js.map +1 -0
- package/dist/replicas/index.d.ts +10 -0
- package/dist/replicas/index.d.ts.map +1 -0
- package/dist/replicas/index.js +42 -0
- package/dist/replicas/index.js.map +1 -0
- package/dist/seeding/index.d.ts +18 -0
- package/dist/seeding/index.d.ts.map +1 -0
- package/dist/seeding/index.js +66 -0
- package/dist/seeding/index.js.map +1 -0
- package/dist/streaming/index.d.ts +7 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +67 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/testing/official-dialects.fixture.d.ts +16 -0
- package/dist/testing/official-dialects.fixture.d.ts.map +1 -0
- package/dist/testing/official-dialects.fixture.js +21 -0
- package/dist/testing/official-dialects.fixture.js.map +1 -0
- package/dist/testing/repository.fixture.d.ts +11 -0
- package/dist/testing/repository.fixture.d.ts.map +1 -0
- package/dist/testing/repository.fixture.js +33 -0
- package/dist/testing/repository.fixture.js.map +1 -0
- package/dist/transactions/index.d.ts +40 -0
- package/dist/transactions/index.d.ts.map +1 -0
- package/dist/transactions/index.js +249 -0
- package/dist/transactions/index.js.map +1 -0
- package/dist/typed-populate/nested.fixtures.d.ts +34 -0
- package/dist/typed-populate/nested.fixtures.d.ts.map +1 -0
- package/dist/typed-populate/nested.fixtures.js +4 -0
- package/dist/typed-populate/nested.fixtures.js.map +1 -0
- package/package.json +78 -0
- package/src/cache/index.ts +188 -0
- package/src/drivers/transactional.ts +6 -0
- package/src/dto/index.ts +379 -0
- package/src/entity-modeling/index.ts +38 -0
- package/src/filters/index.ts +267 -0
- package/src/index.ts +2757 -0
- package/src/loaders/index.ts +256 -0
- package/src/outbox/index.ts +409 -0
- package/src/outbox/sql.ts +179 -0
- package/src/relations/index.ts +221 -0
- package/src/replicas/index.ts +51 -0
- package/src/seeding/index.ts +72 -0
- package/src/streaming/index.ts +67 -0
- package/src/testing/repository.fixture.ts +44 -0
- package/src/transactions/index.ts +315 -0
- package/src/typed-populate/nested.fixtures.ts +59 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import {} from '@zmdb/schema';
|
|
2
|
+
import { schemaFromIR } from '@zmdb/schema/ir';
|
|
3
|
+
import {} from '@zmdb/schema/tags';
|
|
4
|
+
import { createQueryCompiler } from '@zmdb/sql';
|
|
5
|
+
import {} from '../index.js';
|
|
6
|
+
import {} from '../transactions/index.js';
|
|
7
|
+
import { outboxCandidatesQuery, outboxClaimQuery, outboxMarkDeadQuery, outboxMarkDeliveredQuery, outboxMarkRetryQuery, outboxReadBackQuery, } from './sql.js';
|
|
8
|
+
function requiredDialect(dialect, owner) {
|
|
9
|
+
if (dialect === undefined)
|
|
10
|
+
throw new TypeError(`${owner} requires an explicit database dialect object`);
|
|
11
|
+
return dialect;
|
|
12
|
+
}
|
|
13
|
+
export * from './sql.js';
|
|
14
|
+
const EMPTY_COLUMN = {
|
|
15
|
+
primaryKey: false,
|
|
16
|
+
serial: false,
|
|
17
|
+
unique: false,
|
|
18
|
+
sensitive: false,
|
|
19
|
+
constraints: {},
|
|
20
|
+
rules: [],
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* The built-in physical declaration applications include in schema snapshots.
|
|
24
|
+
*
|
|
25
|
+
* The public row type uses app-facing camelCase, while this value names the
|
|
26
|
+
* snake_case columns emitted by `outboxMigration` and used by the dispatcher.
|
|
27
|
+
*/
|
|
28
|
+
export const OutboxSchema = schemaFromIR({
|
|
29
|
+
table: 'zmdb_outbox',
|
|
30
|
+
physicalTable: 'zmdb_outbox',
|
|
31
|
+
primaryKey: ['id'],
|
|
32
|
+
relations: [],
|
|
33
|
+
foreignKeys: [],
|
|
34
|
+
columns: [
|
|
35
|
+
{
|
|
36
|
+
...EMPTY_COLUMN,
|
|
37
|
+
name: 'id',
|
|
38
|
+
physicalName: 'id',
|
|
39
|
+
sql: 'text',
|
|
40
|
+
nullable: false,
|
|
41
|
+
primaryKey: true,
|
|
42
|
+
hasDefault: false,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
...EMPTY_COLUMN,
|
|
46
|
+
name: 'topic',
|
|
47
|
+
physicalName: 'topic',
|
|
48
|
+
sql: 'text',
|
|
49
|
+
nullable: false,
|
|
50
|
+
hasDefault: false,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
...EMPTY_COLUMN,
|
|
54
|
+
name: 'payload',
|
|
55
|
+
physicalName: 'payload',
|
|
56
|
+
sql: 'text',
|
|
57
|
+
nullable: false,
|
|
58
|
+
hasDefault: false,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
...EMPTY_COLUMN,
|
|
62
|
+
name: 'status',
|
|
63
|
+
physicalName: 'status',
|
|
64
|
+
sql: 'jsonEnum',
|
|
65
|
+
nullable: false,
|
|
66
|
+
hasDefault: true,
|
|
67
|
+
enum: ['dead', 'delivered', 'pending'],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
...EMPTY_COLUMN,
|
|
71
|
+
name: 'attempts',
|
|
72
|
+
physicalName: 'attempts',
|
|
73
|
+
sql: 'integer',
|
|
74
|
+
nullable: false,
|
|
75
|
+
hasDefault: true,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
...EMPTY_COLUMN,
|
|
79
|
+
name: 'created_at',
|
|
80
|
+
physicalName: 'created_at',
|
|
81
|
+
sql: 'timestamp',
|
|
82
|
+
nullable: false,
|
|
83
|
+
hasDefault: true,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
...EMPTY_COLUMN,
|
|
87
|
+
name: 'lease_owner',
|
|
88
|
+
physicalName: 'lease_owner',
|
|
89
|
+
sql: 'text',
|
|
90
|
+
nullable: false,
|
|
91
|
+
hasDefault: true,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
...EMPTY_COLUMN,
|
|
95
|
+
name: 'lease_until',
|
|
96
|
+
physicalName: 'lease_until',
|
|
97
|
+
sql: 'timestamp',
|
|
98
|
+
nullable: false,
|
|
99
|
+
hasDefault: true,
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
...EMPTY_COLUMN,
|
|
103
|
+
name: 'delivered_at',
|
|
104
|
+
physicalName: 'delivered_at',
|
|
105
|
+
sql: 'timestamp',
|
|
106
|
+
nullable: true,
|
|
107
|
+
hasDefault: false,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
...EMPTY_COLUMN,
|
|
111
|
+
name: 'last_error',
|
|
112
|
+
physicalName: 'last_error',
|
|
113
|
+
sql: 'text',
|
|
114
|
+
nullable: true,
|
|
115
|
+
hasDefault: false,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
});
|
|
119
|
+
export function outboxWriter(tx) {
|
|
120
|
+
const dialect = requiredDialect(tx.dialect, 'outboxWriter');
|
|
121
|
+
return {
|
|
122
|
+
async write(topic, payload) {
|
|
123
|
+
const id = globalThis.crypto.randomUUID();
|
|
124
|
+
await tx.execute(createQueryCompiler(dialect)
|
|
125
|
+
.insertInto('zmdb_outbox')
|
|
126
|
+
.values({
|
|
127
|
+
id,
|
|
128
|
+
topic,
|
|
129
|
+
payload,
|
|
130
|
+
status: 'pending',
|
|
131
|
+
attempts: 0,
|
|
132
|
+
created_at: new Date(),
|
|
133
|
+
lease_owner: '',
|
|
134
|
+
lease_until: new Date(0),
|
|
135
|
+
delivered_at: null,
|
|
136
|
+
last_error: null,
|
|
137
|
+
})
|
|
138
|
+
.compile());
|
|
139
|
+
return id;
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function claimedRow(row) {
|
|
144
|
+
const { id, topic, payload, attempts } = row;
|
|
145
|
+
if (typeof id !== 'string' ||
|
|
146
|
+
typeof topic !== 'string' ||
|
|
147
|
+
typeof payload !== 'string' ||
|
|
148
|
+
typeof attempts !== 'number' ||
|
|
149
|
+
!Number.isInteger(attempts) ||
|
|
150
|
+
attempts < 0) {
|
|
151
|
+
throw new Error('@zmdb/orm: invalid outbox row returned by the driver');
|
|
152
|
+
}
|
|
153
|
+
return { id, topic, payload, attempts };
|
|
154
|
+
}
|
|
155
|
+
function errorMessage(error) {
|
|
156
|
+
return error instanceof Error ? error.message : String(error);
|
|
157
|
+
}
|
|
158
|
+
function deadRowFromInvalid(raw, attempts, lastError) {
|
|
159
|
+
return {
|
|
160
|
+
id: typeof raw['id'] === 'string' ? raw['id'] : String(raw['id']),
|
|
161
|
+
topic: typeof raw['topic'] === 'string' ? raw['topic'] : String(raw['topic']),
|
|
162
|
+
payload: typeof raw['payload'] === 'string' ? raw['payload'] : String(raw['payload']),
|
|
163
|
+
attempts,
|
|
164
|
+
lastError,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function positiveInteger(name, value) {
|
|
168
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
169
|
+
throw new Error(`@zmdb/orm: ${name} must be a positive safe integer`);
|
|
170
|
+
}
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
const MAX_TIMER_MS = 2_147_483_647;
|
|
174
|
+
function timerDelay(name, value) {
|
|
175
|
+
const delay = positiveInteger(name, value);
|
|
176
|
+
if (delay > MAX_TIMER_MS) {
|
|
177
|
+
throw new Error(`@zmdb/orm: ${name} must not exceed ${MAX_TIMER_MS}`);
|
|
178
|
+
}
|
|
179
|
+
return delay;
|
|
180
|
+
}
|
|
181
|
+
export function createOutboxDispatcher(options) {
|
|
182
|
+
const dialect = requiredDialect(options.driver.dialect, 'createOutboxDispatcher');
|
|
183
|
+
const batch = positiveInteger('batch', options.batch ?? 100);
|
|
184
|
+
const leaseMs = positiveInteger('leaseMs', options.leaseMs ?? 30_000);
|
|
185
|
+
const idleMs = timerDelay('idleMs', options.idleMs ?? 1_000);
|
|
186
|
+
const maxIdleMs = timerDelay('maxIdleMs', options.maxIdleMs ?? 30_000);
|
|
187
|
+
const maxAttempts = positiveInteger('maxAttempts', options.maxAttempts ?? 10);
|
|
188
|
+
if (maxIdleMs < idleMs) {
|
|
189
|
+
throw new Error('@zmdb/orm: maxIdleMs must be greater than or equal to idleMs');
|
|
190
|
+
}
|
|
191
|
+
const backoffMs = options.backoffMs ?? (attempts => Math.min(2 ** attempts * 1_000, 300_000));
|
|
192
|
+
let stopped = false;
|
|
193
|
+
let started = false;
|
|
194
|
+
let timer;
|
|
195
|
+
const activePasses = new Set();
|
|
196
|
+
let nextIdleMs = idleMs;
|
|
197
|
+
const runPass = async () => {
|
|
198
|
+
const now = new Date();
|
|
199
|
+
const candidates = await options.driver.execute(outboxCandidatesQuery(dialect, { now, batch }));
|
|
200
|
+
const ids = candidates.flatMap(row => (typeof row['id'] === 'string' ? [row['id']] : []));
|
|
201
|
+
if (ids.length === 0)
|
|
202
|
+
return { claimed: 0, delivered: 0, failed: 0 };
|
|
203
|
+
const token = globalThis.crypto.randomUUID();
|
|
204
|
+
const leaseUntil = new Date(now.getTime() + leaseMs);
|
|
205
|
+
await options.driver.execute(outboxClaimQuery(dialect, { now, token, leaseUntil, ids }));
|
|
206
|
+
const candidateOrder = new Map(ids.map((id, index) => [id, index]));
|
|
207
|
+
const rows = (await options.driver.execute(outboxReadBackQuery(dialect, { token }))).toSorted((left, right) => {
|
|
208
|
+
const leftIndex = typeof left['id'] === 'string' ? candidateOrder.get(left['id']) : undefined;
|
|
209
|
+
const rightIndex = typeof right['id'] === 'string' ? candidateOrder.get(right['id']) : undefined;
|
|
210
|
+
return (leftIndex ?? ids.length) - (rightIndex ?? ids.length);
|
|
211
|
+
});
|
|
212
|
+
let delivered = 0;
|
|
213
|
+
let failed = 0;
|
|
214
|
+
for (const raw of rows) {
|
|
215
|
+
let row;
|
|
216
|
+
try {
|
|
217
|
+
row = claimedRow(raw);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
failed += 1;
|
|
221
|
+
const id = raw['id'];
|
|
222
|
+
const previousAttempts = raw['attempts'];
|
|
223
|
+
if (typeof id !== 'string' || typeof previousAttempts !== 'number' || !Number.isInteger(previousAttempts)) {
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
const attempts = previousAttempts + 1;
|
|
227
|
+
const lastError = errorMessage(error);
|
|
228
|
+
await options.driver.execute(outboxMarkDeadQuery(dialect, { id, token, attempts, lastError }));
|
|
229
|
+
await options.onDead?.(deadRowFromInvalid(raw, attempts, lastError));
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const attempts = row.attempts + 1;
|
|
233
|
+
let publishError;
|
|
234
|
+
try {
|
|
235
|
+
await options.publish(row.topic, row.payload);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
publishError = error;
|
|
239
|
+
}
|
|
240
|
+
if (publishError === undefined) {
|
|
241
|
+
await options.driver.execute(outboxMarkDeliveredQuery(dialect, {
|
|
242
|
+
id: row.id,
|
|
243
|
+
token,
|
|
244
|
+
deliveredAt: new Date(),
|
|
245
|
+
attempts,
|
|
246
|
+
}));
|
|
247
|
+
delivered += 1;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
failed += 1;
|
|
251
|
+
const lastError = errorMessage(publishError);
|
|
252
|
+
if (attempts >= maxAttempts) {
|
|
253
|
+
await options.driver.execute(outboxMarkDeadQuery(dialect, { id: row.id, token, attempts, lastError }));
|
|
254
|
+
await options.onDead?.({ ...row, attempts, lastError });
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const delay = backoffMs(attempts);
|
|
258
|
+
if (!Number.isFinite(delay) || delay < 0) {
|
|
259
|
+
throw new Error('@zmdb/orm: backoffMs must return a finite non-negative number');
|
|
260
|
+
}
|
|
261
|
+
await options.driver.execute(outboxMarkRetryQuery(dialect, {
|
|
262
|
+
id: row.id,
|
|
263
|
+
token,
|
|
264
|
+
attempts,
|
|
265
|
+
lastError,
|
|
266
|
+
leaseUntil: new Date(Date.now() + delay),
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return { claimed: rows.length, delivered, failed };
|
|
272
|
+
};
|
|
273
|
+
const runOnce = () => {
|
|
274
|
+
if (stopped)
|
|
275
|
+
return Promise.resolve({ claimed: 0, delivered: 0, failed: 0 });
|
|
276
|
+
const pass = runPass();
|
|
277
|
+
activePasses.add(pass);
|
|
278
|
+
void pass.then(() => activePasses.delete(pass), () => activePasses.delete(pass));
|
|
279
|
+
return pass;
|
|
280
|
+
};
|
|
281
|
+
const schedule = (delay) => {
|
|
282
|
+
timer = setTimeout(() => {
|
|
283
|
+
if (stopped)
|
|
284
|
+
return;
|
|
285
|
+
const pass = runOnce();
|
|
286
|
+
void pass.then(report => {
|
|
287
|
+
if (stopped)
|
|
288
|
+
return;
|
|
289
|
+
if (report.claimed > 0) {
|
|
290
|
+
nextIdleMs = idleMs;
|
|
291
|
+
schedule(report.claimed >= batch ? 0 : nextIdleMs);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
nextIdleMs = Math.min(nextIdleMs * 2, maxIdleMs);
|
|
295
|
+
schedule(nextIdleMs);
|
|
296
|
+
}
|
|
297
|
+
}, () => {
|
|
298
|
+
if (!stopped)
|
|
299
|
+
schedule(nextIdleMs);
|
|
300
|
+
});
|
|
301
|
+
}, delay);
|
|
302
|
+
};
|
|
303
|
+
const start = () => {
|
|
304
|
+
if (started || stopped)
|
|
305
|
+
return;
|
|
306
|
+
started = true;
|
|
307
|
+
schedule(idleMs);
|
|
308
|
+
};
|
|
309
|
+
return {
|
|
310
|
+
runOnce,
|
|
311
|
+
start,
|
|
312
|
+
onModuleInit: start,
|
|
313
|
+
async onShutdown() {
|
|
314
|
+
stopped = true;
|
|
315
|
+
if (timer !== undefined)
|
|
316
|
+
clearTimeout(timer);
|
|
317
|
+
while (activePasses.size > 0) {
|
|
318
|
+
await Promise.allSettled(activePasses);
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type CompiledQuery, type DialectTarget } from '@zmdb/sql';
|
|
2
|
+
export declare const OUTBOX_TABLE = "zmdb_outbox";
|
|
3
|
+
export type OutboxStatus = 'pending' | 'delivered' | 'dead';
|
|
4
|
+
export interface OutboxMigration {
|
|
5
|
+
readonly version: number;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly up: string;
|
|
8
|
+
readonly down: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Most dialects index only pending rows. Dialects that cannot represent the
|
|
12
|
+
* predicate use the full composite index with `status` first to preserve a
|
|
13
|
+
* useful pending-row prefix instead of degrading to an unindexed scan.
|
|
14
|
+
*/
|
|
15
|
+
export declare function outboxPendingIndexDdl(dialect: DialectTarget): string;
|
|
16
|
+
/** The declared outbox table's migration DDL, including the defaults its type tags cannot carry. */
|
|
17
|
+
export declare function outboxTableDdl(dialect: DialectTarget): string;
|
|
18
|
+
/** A normal migration value applications can place in their ordered migration list. */
|
|
19
|
+
export declare function outboxMigration(version: number, dialect: DialectTarget): OutboxMigration;
|
|
20
|
+
export declare function outboxCandidatesQuery(dialect: DialectTarget, args: {
|
|
21
|
+
readonly now: Date;
|
|
22
|
+
readonly batch: number;
|
|
23
|
+
}): CompiledQuery;
|
|
24
|
+
export declare function outboxClaimQuery(dialect: DialectTarget, args: {
|
|
25
|
+
readonly now: Date;
|
|
26
|
+
readonly token: string;
|
|
27
|
+
readonly leaseUntil: Date;
|
|
28
|
+
readonly ids: readonly string[];
|
|
29
|
+
}): CompiledQuery;
|
|
30
|
+
export declare function outboxReadBackQuery(dialect: DialectTarget, args: {
|
|
31
|
+
readonly token: string;
|
|
32
|
+
}): CompiledQuery;
|
|
33
|
+
export declare function outboxMarkDeliveredQuery(dialect: DialectTarget, args: {
|
|
34
|
+
readonly id: string;
|
|
35
|
+
readonly token: string;
|
|
36
|
+
readonly deliveredAt: Date;
|
|
37
|
+
readonly attempts: number;
|
|
38
|
+
}): CompiledQuery;
|
|
39
|
+
export declare function outboxMarkRetryQuery(dialect: DialectTarget, args: {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly token: string;
|
|
42
|
+
readonly attempts: number;
|
|
43
|
+
readonly lastError: string;
|
|
44
|
+
readonly leaseUntil: Date;
|
|
45
|
+
}): CompiledQuery;
|
|
46
|
+
export declare function outboxMarkDeadQuery(dialect: DialectTarget, args: {
|
|
47
|
+
readonly id: string;
|
|
48
|
+
readonly token: string;
|
|
49
|
+
readonly attempts: number;
|
|
50
|
+
readonly lastError: string;
|
|
51
|
+
}): CompiledQuery;
|
|
52
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/outbox/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAElB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAI5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAepE;AASD,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAyB7D;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe,CAOxF;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD,aAAa,CASf;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IACJ,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GACA,aAAa,CAQf;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAM3G;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GACA,aAAa,CAOf;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;CAC3B,GACA,aAAa,CAOf;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GACA,aAAa,CAOf"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createQueryCompiler, dialectTraits, quoteIdentifier, } from '@zmdb/sql';
|
|
2
|
+
export const OUTBOX_TABLE = 'zmdb_outbox';
|
|
3
|
+
const PENDING = 'pending';
|
|
4
|
+
/**
|
|
5
|
+
* Most dialects index only pending rows. Dialects that cannot represent the
|
|
6
|
+
* predicate use the full composite index with `status` first to preserve a
|
|
7
|
+
* useful pending-row prefix instead of degrading to an unindexed scan.
|
|
8
|
+
*/
|
|
9
|
+
export function outboxPendingIndexDdl(dialect) {
|
|
10
|
+
const definition = {
|
|
11
|
+
name: 'zmdb_outbox_pending',
|
|
12
|
+
table: OUTBOX_TABLE,
|
|
13
|
+
columns: ['status', 'lease_until', 'created_at'],
|
|
14
|
+
...(outboxDialect(dialect).pendingIndex === 'full' ? {} : { where: "status = 'pending'" }),
|
|
15
|
+
};
|
|
16
|
+
const statements = dialect.migrations.emitSchemaObject({
|
|
17
|
+
kind: 'create_index',
|
|
18
|
+
definition,
|
|
19
|
+
});
|
|
20
|
+
if (statements.length !== 1 || statements[0] === undefined) {
|
|
21
|
+
throw new TypeError(`${dialect.name} outbox index emission must return exactly one statement`);
|
|
22
|
+
}
|
|
23
|
+
return statements[0];
|
|
24
|
+
}
|
|
25
|
+
function outboxDialect(dialect) {
|
|
26
|
+
if (dialect.outbox === undefined) {
|
|
27
|
+
throw new TypeError(`${dialect.name} does not provide an outbox DDL strategy`);
|
|
28
|
+
}
|
|
29
|
+
return dialect.outbox;
|
|
30
|
+
}
|
|
31
|
+
/** The declared outbox table's migration DDL, including the defaults its type tags cannot carry. */
|
|
32
|
+
export function outboxTableDdl(dialect) {
|
|
33
|
+
const q = (name) => quoteIdentifier(dialect, name);
|
|
34
|
+
const traits = dialectTraits(dialect);
|
|
35
|
+
const outbox = outboxDialect(dialect);
|
|
36
|
+
const timestamp = traits.types.timestamp;
|
|
37
|
+
// MySQL refuses TEXT primary keys and TEXT columns in an index without a prefix
|
|
38
|
+
// length. These three values are bounded by construction, so the migration uses
|
|
39
|
+
// bounded storage there while the application type remains string.
|
|
40
|
+
const text = traits.types.text;
|
|
41
|
+
const idType = outbox.boundedTextType(36);
|
|
42
|
+
const statusType = outbox.boundedTextType(16);
|
|
43
|
+
const leaseOwnerType = outbox.boundedTextType(36);
|
|
44
|
+
return (`${outbox.createTable} ${q(OUTBOX_TABLE)} (` +
|
|
45
|
+
`${q('id')} ${idType} PRIMARY KEY, ` +
|
|
46
|
+
`${q('topic')} ${text} NOT NULL, ` +
|
|
47
|
+
`${q('payload')} ${text} NOT NULL, ` +
|
|
48
|
+
`${q('status')} ${statusType} NOT NULL DEFAULT 'pending', ` +
|
|
49
|
+
`${q('attempts')} ${traits.types.integer} NOT NULL DEFAULT 0, ` +
|
|
50
|
+
`${q('created_at')} ${timestamp} NOT NULL DEFAULT ${outbox.createdAtDefault}, ` +
|
|
51
|
+
`${q('lease_owner')} ${leaseOwnerType} NOT NULL DEFAULT '', ` +
|
|
52
|
+
`${q('lease_until')} ${timestamp} NOT NULL DEFAULT ${outbox.epochLiteral}, ` +
|
|
53
|
+
`${q('delivered_at')} ${timestamp}, ` +
|
|
54
|
+
`${q('last_error')} ${text})`);
|
|
55
|
+
}
|
|
56
|
+
/** A normal migration value applications can place in their ordered migration list. */
|
|
57
|
+
export function outboxMigration(version, dialect) {
|
|
58
|
+
return {
|
|
59
|
+
version,
|
|
60
|
+
name: 'create_zmdb_outbox',
|
|
61
|
+
up: `${outboxTableDdl(dialect)}; ${outboxPendingIndexDdl(dialect)}`,
|
|
62
|
+
down: `DROP TABLE ${quoteIdentifier(dialect, OUTBOX_TABLE)}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function outboxCandidatesQuery(dialect, args) {
|
|
66
|
+
return createQueryCompiler(dialect)
|
|
67
|
+
.selectFrom(OUTBOX_TABLE)
|
|
68
|
+
.select(['id'])
|
|
69
|
+
.where('status', '=', PENDING)
|
|
70
|
+
.where('lease_until', '<', args.now)
|
|
71
|
+
.orderBy('created_at', 'asc')
|
|
72
|
+
.limit(args.batch)
|
|
73
|
+
.compile();
|
|
74
|
+
}
|
|
75
|
+
export function outboxClaimQuery(dialect, args) {
|
|
76
|
+
return createQueryCompiler(dialect)
|
|
77
|
+
.updateTable(OUTBOX_TABLE)
|
|
78
|
+
.set({ lease_owner: args.token, lease_until: args.leaseUntil })
|
|
79
|
+
.where('status', '=', PENDING)
|
|
80
|
+
.where('lease_until', '<', args.now)
|
|
81
|
+
.whereIn('id', args.ids)
|
|
82
|
+
.compile();
|
|
83
|
+
}
|
|
84
|
+
export function outboxReadBackQuery(dialect, args) {
|
|
85
|
+
return createQueryCompiler(dialect)
|
|
86
|
+
.selectFrom(OUTBOX_TABLE)
|
|
87
|
+
.select(['id', 'topic', 'payload', 'attempts'])
|
|
88
|
+
.where('lease_owner', '=', args.token)
|
|
89
|
+
.compile();
|
|
90
|
+
}
|
|
91
|
+
export function outboxMarkDeliveredQuery(dialect, args) {
|
|
92
|
+
return createQueryCompiler(dialect)
|
|
93
|
+
.updateTable(OUTBOX_TABLE)
|
|
94
|
+
.set({ status: 'delivered', delivered_at: args.deliveredAt, attempts: args.attempts })
|
|
95
|
+
.where('id', '=', args.id)
|
|
96
|
+
.where('lease_owner', '=', args.token)
|
|
97
|
+
.compile();
|
|
98
|
+
}
|
|
99
|
+
export function outboxMarkRetryQuery(dialect, args) {
|
|
100
|
+
return createQueryCompiler(dialect)
|
|
101
|
+
.updateTable(OUTBOX_TABLE)
|
|
102
|
+
.set({ attempts: args.attempts, last_error: args.lastError, lease_until: args.leaseUntil })
|
|
103
|
+
.where('id', '=', args.id)
|
|
104
|
+
.where('lease_owner', '=', args.token)
|
|
105
|
+
.compile();
|
|
106
|
+
}
|
|
107
|
+
export function outboxMarkDeadQuery(dialect, args) {
|
|
108
|
+
return createQueryCompiler(dialect)
|
|
109
|
+
.updateTable(OUTBOX_TABLE)
|
|
110
|
+
.set({ status: 'dead', attempts: args.attempts, last_error: args.lastError })
|
|
111
|
+
.where('id', '=', args.id)
|
|
112
|
+
.where('lease_owner', '=', args.token)
|
|
113
|
+
.compile();
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/outbox/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SchemaIR } from '@zmdb/schema/ir';
|
|
2
|
+
import { type ComparisonPredicate, type DialectTarget } from '@zmdb/sql';
|
|
3
|
+
export type PopulateDialect = DialectTarget;
|
|
4
|
+
export interface PopulateQuery {
|
|
5
|
+
readonly kind: 'join' | 'batched';
|
|
6
|
+
readonly sql: string;
|
|
7
|
+
readonly parameters: readonly unknown[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Compile a populate hint into SQL: a to-one becomes an `INNER JOIN`, a to-many a batched
|
|
11
|
+
* `IN (…)` select over the parent keys.
|
|
12
|
+
*
|
|
13
|
+
* Takes the declaring table's IR and a relation name rather than a relation object, which is
|
|
14
|
+
* what makes the two spellings one: the columns on either side of the `ON` come out of
|
|
15
|
+
* `resolveRelation`, the same call `@zmdb/orm`'s `populate` makes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function compilePopulate(ir: SchemaIR, relationName: string, dialect: PopulateDialect, parentIds?: readonly unknown[], targetFilters?: readonly ComparisonPredicate[], schemas?: readonly SchemaIR[]): PopulateQuery;
|
|
18
|
+
/**
|
|
19
|
+
* Attach a populated relation to a parent row, without mutating it.
|
|
20
|
+
*
|
|
21
|
+
* The type widening is `Populated<T, K>` in `../derive/query.ts`, which reads the declared
|
|
22
|
+
* relation property; this only puts the value there.
|
|
23
|
+
*/
|
|
24
|
+
export declare function attachPopulated<P extends Record<string, unknown>, N extends string, V>(parent: P, name: N, value: V): P & {
|
|
25
|
+
[K in N]: V;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A row from a join written against two tables directly. LEFT: the joined columns may be
|
|
29
|
+
* absent, so they come back optional.
|
|
30
|
+
*
|
|
31
|
+
* `../derive/query.ts` has a `JoinRow<T, K, Kind>` that names the joined side by relation
|
|
32
|
+
* key instead; this is the form for a join whose target is not a declared relation of the
|
|
33
|
+
* base table.
|
|
34
|
+
*/
|
|
35
|
+
export type JoinRow<Base, Joined, Kind extends 'inner' | 'left' = 'left'> = Kind extends 'inner' ? Base & Joined : Base & Partial<Joined>;
|
|
36
|
+
/** Rename aliased columns per a { alias: outKey } map (stable, non-mutating). */
|
|
37
|
+
export declare function aliasRow<Row extends Record<string, unknown>>(row: Row, map: Readonly<Record<string, string>>): Record<string, unknown>;
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAOL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAC;CACzC;AA6CD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,eAAe,EACxB,SAAS,GAAE,SAAS,OAAO,EAAO,EAClC,aAAa,GAAE,SAAS,mBAAmB,EAAO,EAClD,OAAO,GAAE,SAAS,QAAQ,EAAO,GAChC,aAAa,CAiGf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,EACpF,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,GACP,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,GAAG,CAAC;CAAE,CAKrB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAS,OAAO,GAAG,MAAM,GAAG,MAAM,IAAI,IAAI,SAAS,OAAO,GAC5F,IAAI,GAAG,MAAM,GACb,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE3B,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB"}
|