@ewhauser/world-celld 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/README.md +61 -23
- package/dist/index.d.ts +126 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +206 -135
- package/dist/index.js.map +1 -1
- package/dist/{util-BvWlkqgV.js → retention-bLY1vcOu.js} +44 -2
- package/dist/retention-bLY1vcOu.js.map +1 -0
- package/dist/testing.d.ts +2 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +802 -174
- package/dist/testing.js.map +1 -1
- package/dist/worker.d.ts +133 -62
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +829 -170
- package/dist/worker.js.map +1 -1
- package/package.json +7 -7
- package/dist/util-BvWlkqgV.js.map +0 -1
package/dist/worker.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CreateEventRequest, Event, Hook, RunCreatedEventRequest, Step, ValidQueueName, WorkflowRun } from "@workflow/world";
|
|
1
|
+
import { CreateEventParams, CreateEventRequest, Event, Hook, RunCreatedEventRequest, Step, TerminalWorkflowRunStatus, ValidQueueName, Wait, WorkflowRun } from "@workflow/world";
|
|
2
2
|
//#region src/worker/router.d.ts
|
|
3
3
|
/** Minimal structural DO namespace type (celld provides the real thing). */
|
|
4
4
|
interface DONamespaceLike {
|
|
@@ -18,11 +18,78 @@ interface WorkerEnv {
|
|
|
18
18
|
}
|
|
19
19
|
declare function createRouter(env: WorkerEnv): (request: Request) => Promise<Response>;
|
|
20
20
|
//#endregion
|
|
21
|
+
//#region src/retention.d.ts
|
|
22
|
+
type CleanupPhase = 'retained' | 'index' | 'streams' | 'queues' | 'payload' | 'tombstoned';
|
|
23
|
+
interface CleanupRecord {
|
|
24
|
+
version: 1;
|
|
25
|
+
runId: string;
|
|
26
|
+
workflowName: string;
|
|
27
|
+
createdAt: Date;
|
|
28
|
+
completedAt: Date;
|
|
29
|
+
terminalStatus: TerminalWorkflowRunStatus;
|
|
30
|
+
dueAt: Date;
|
|
31
|
+
queueShards: number;
|
|
32
|
+
phase: CleanupPhase;
|
|
33
|
+
attempts: number;
|
|
34
|
+
lastError?: string;
|
|
35
|
+
lastAttemptAt?: Date;
|
|
36
|
+
tombstonedAt?: Date;
|
|
37
|
+
deletedPayloadKeys: number;
|
|
38
|
+
deletedStreams: number;
|
|
39
|
+
deletedQueueMessages: number;
|
|
40
|
+
}
|
|
41
|
+
interface RunTombstone {
|
|
42
|
+
version: 1;
|
|
43
|
+
runId: string;
|
|
44
|
+
terminalStatus: TerminalWorkflowRunStatus;
|
|
45
|
+
completedAt: Date;
|
|
46
|
+
expiredAt: Date;
|
|
47
|
+
tombstonedAt: Date;
|
|
48
|
+
}
|
|
49
|
+
type RunReadOutcome<T> = {
|
|
50
|
+
ok: true;
|
|
51
|
+
value: T;
|
|
52
|
+
} | {
|
|
53
|
+
ok: false;
|
|
54
|
+
code: 'RUN_EXPIRED';
|
|
55
|
+
message: string;
|
|
56
|
+
tombstone: RunTombstone;
|
|
57
|
+
};
|
|
58
|
+
interface HookIndexReference {
|
|
59
|
+
hookId: string;
|
|
60
|
+
token: string;
|
|
61
|
+
}
|
|
62
|
+
interface ExpireRunIndexesRequest {
|
|
63
|
+
runId: string;
|
|
64
|
+
keys: string[];
|
|
65
|
+
hooks: HookIndexReference[];
|
|
66
|
+
expiredAt: number;
|
|
67
|
+
}
|
|
68
|
+
interface ExpireRunIndexesResult {
|
|
69
|
+
deleted: number;
|
|
70
|
+
}
|
|
71
|
+
interface ExpireRunStreamsResult {
|
|
72
|
+
streams: string[];
|
|
73
|
+
}
|
|
74
|
+
interface ExpireStreamResult {
|
|
75
|
+
deleted: boolean;
|
|
76
|
+
chunks: number;
|
|
77
|
+
}
|
|
78
|
+
interface ExpireQueueRunResult {
|
|
79
|
+
deleted: number;
|
|
80
|
+
}
|
|
81
|
+
interface ScheduleCleanupRequest {
|
|
82
|
+
retentionMs: number;
|
|
83
|
+
queueShards: number;
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
21
86
|
//#region src/apply-event.d.ts
|
|
22
87
|
interface ApplyEventRequest {
|
|
23
88
|
/** The effective run id (already resolved / generated by the caller). */
|
|
24
89
|
runId: string;
|
|
25
90
|
data: CreateEventRequest | RunCreatedEventRequest;
|
|
91
|
+
/** Workflow 5 event-log position and preload options. */
|
|
92
|
+
params?: CreateEventParams;
|
|
26
93
|
/**
|
|
27
94
|
* Current holder of the hook token per the global KV token index
|
|
28
95
|
* (hook_created only). `null` means the token is unclaimed.
|
|
@@ -31,8 +98,10 @@ interface ApplyEventRequest {
|
|
|
31
98
|
runId: string;
|
|
32
99
|
hookId: string;
|
|
33
100
|
} | null;
|
|
101
|
+
/** Internal world-celld retention policy captured with the event. */
|
|
102
|
+
cleanup?: ScheduleCleanupRequest;
|
|
34
103
|
}
|
|
35
|
-
type ApplyEventErrorCode = 'RUN_NOT_FOUND' | 'STEP_NOT_FOUND' | 'HOOK_NOT_FOUND' | '
|
|
104
|
+
type ApplyEventErrorCode = 'RUN_NOT_FOUND' | 'STEP_NOT_FOUND' | 'HOOK_NOT_FOUND' | 'WAIT_NOT_FOUND' | 'ENTITY_CONFLICT' | 'RUN_EXPIRED' | 'TOO_EARLY' | 'RUN_NOT_SUPPORTED';
|
|
36
105
|
interface ApplyEventFailure {
|
|
37
106
|
ok: false;
|
|
38
107
|
code: ApplyEventErrorCode;
|
|
@@ -49,6 +118,9 @@ interface ApplyEventSuccess {
|
|
|
49
118
|
run?: WorkflowRun;
|
|
50
119
|
step?: Step;
|
|
51
120
|
hook?: Hook;
|
|
121
|
+
wait?: Wait;
|
|
122
|
+
/** True when a lazy step_started atomically created its step. */
|
|
123
|
+
stepCreated?: true;
|
|
52
124
|
/** Hooks whose tokens must be released from the global KV index. */
|
|
53
125
|
releasedHooks: Array<{
|
|
54
126
|
hookId: string;
|
|
@@ -63,11 +135,16 @@ interface ApplyEventSuccess {
|
|
|
63
135
|
hookToIndex?: Hook;
|
|
64
136
|
/** All events (ascending), preloaded for run_started responses. */
|
|
65
137
|
events?: Event[];
|
|
138
|
+
/** Pagination metadata required whenever events are returned. */
|
|
139
|
+
cursor?: string | null;
|
|
140
|
+
hasMore?: boolean;
|
|
141
|
+
/** Server-owned event ceiling advertised on run lifecycle writes. */
|
|
142
|
+
maxEvents?: number;
|
|
66
143
|
}
|
|
67
144
|
type ApplyEventOutcome = ApplyEventSuccess | ApplyEventFailure;
|
|
68
145
|
//#endregion
|
|
69
146
|
//#region src/queue.d.ts
|
|
70
|
-
type Pathname = 'flow'
|
|
147
|
+
type Pathname = 'flow';
|
|
71
148
|
/**
|
|
72
149
|
* Enqueue request accepted by a QueueDO cell. The message payload travels
|
|
73
150
|
* pre-encoded with the shared tagged-JSON codec (`body`), so the cell can
|
|
@@ -79,6 +156,8 @@ interface EnqueueRequest {
|
|
|
79
156
|
pathname: Pathname;
|
|
80
157
|
/** `stringify(message)` — the exact bytes POSTed to the app on delivery. */
|
|
81
158
|
body: string;
|
|
159
|
+
/** Owning workflow run; absent only for health-check messages. */
|
|
160
|
+
runId?: string;
|
|
82
161
|
idempotencyKey?: string;
|
|
83
162
|
delaySeconds?: number;
|
|
84
163
|
/**
|
|
@@ -88,7 +167,7 @@ interface EnqueueRequest {
|
|
|
88
167
|
config: QueueCellConfig;
|
|
89
168
|
}
|
|
90
169
|
interface QueueCellConfig {
|
|
91
|
-
/** Base URL of the app; deliveries POST to `${baseUrl}/.well-known/workflow/v1/
|
|
170
|
+
/** Base URL of the app; deliveries POST to `${baseUrl}/.well-known/workflow/v1/flow`. */
|
|
92
171
|
targetBaseUrl: string;
|
|
93
172
|
queueShards: number;
|
|
94
173
|
}
|
|
@@ -98,7 +177,7 @@ type EnqueueOutcome = {
|
|
|
98
177
|
deduped: boolean;
|
|
99
178
|
} | {
|
|
100
179
|
ok: false;
|
|
101
|
-
code: 'CONFIG_MISMATCH';
|
|
180
|
+
code: 'CONFIG_MISMATCH' | 'RUN_EXPIRED';
|
|
102
181
|
message: string;
|
|
103
182
|
};
|
|
104
183
|
//#endregion
|
|
@@ -141,6 +220,10 @@ declare class DurableObject<TEnv = unknown> {
|
|
|
141
220
|
declare class IndexDO extends DurableObject {
|
|
142
221
|
get(key: string): Promise<string | null>;
|
|
143
222
|
put(key: string, value: string): Promise<void>;
|
|
223
|
+
/** Publish a derived index only while its owning run is not expired. */
|
|
224
|
+
putOwned(runId: string, key: string, value: string): Promise<{
|
|
225
|
+
stored: boolean;
|
|
226
|
+
}>;
|
|
144
227
|
delete(key: string): Promise<void>;
|
|
145
228
|
list(options?: {
|
|
146
229
|
prefix?: string;
|
|
@@ -161,6 +244,12 @@ declare class IndexDO extends DurableObject {
|
|
|
161
244
|
finalizeHookIndexes(token: string, hookId: string, serializedHook: string, owner: HookTokenOwner): Promise<void>;
|
|
162
245
|
releaseHookToken(token: string, owner: HookTokenOwner): Promise<void>;
|
|
163
246
|
deleteHookIndexes(token: string, hookId: string, owner: HookTokenOwner): Promise<void>;
|
|
247
|
+
/**
|
|
248
|
+
* Fence a run and remove all of its known derived indexes atomically.
|
|
249
|
+
* Once the fence exists, putOwned() and hook finalization cannot resurrect
|
|
250
|
+
* entries from a delayed request.
|
|
251
|
+
*/
|
|
252
|
+
expireRun(request: ExpireRunIndexesRequest): Promise<ExpireRunIndexesResult>;
|
|
164
253
|
}
|
|
165
254
|
//#endregion
|
|
166
255
|
//#region src/worker/durable-objects/QueueDO.d.ts
|
|
@@ -179,6 +268,8 @@ declare class IndexDO extends DurableObject {
|
|
|
179
268
|
* inflight:<messageId> crash-recovery deadline (epoch ms)
|
|
180
269
|
* key:<idempotencyKey> active dedup claim -> messageId
|
|
181
270
|
* dlq:<paddedMs>:<messageId> DeadLetterRow
|
|
271
|
+
* run:<runId>:<messageId> QueueRunReference for retention cleanup
|
|
272
|
+
* expired-run:<runId> run fence preventing delayed enqueue
|
|
182
273
|
*
|
|
183
274
|
* celld gotchas designed around:
|
|
184
275
|
* - celld#144 (alarm handlers can overlap): the storage-only claim phase runs
|
|
@@ -196,6 +287,7 @@ interface MessageRow {
|
|
|
196
287
|
pathname: 'flow' | 'step';
|
|
197
288
|
/** Pre-encoded tagged-JSON payload — forwarded byte-identical. */
|
|
198
289
|
body: string;
|
|
290
|
+
runId?: string;
|
|
199
291
|
/**
|
|
200
292
|
* Delivery target captured at enqueue time. Carried per message (not
|
|
201
293
|
* pinned on the cell) so an app redeploy at a new URL never bricks the
|
|
@@ -245,6 +337,8 @@ declare class QueueDO extends DurableObject {
|
|
|
245
337
|
rearmAlarm(): Promise<{
|
|
246
338
|
alarmAt: number | null;
|
|
247
339
|
}>;
|
|
340
|
+
/** Fence a run and purge every live, inflight, and dead-letter message it owns. */
|
|
341
|
+
expireRun(runId: string, expiredAt: number): Promise<ExpireQueueRunResult>;
|
|
248
342
|
}
|
|
249
343
|
//#endregion
|
|
250
344
|
//#region src/worker/durable-objects/StreamDO.d.ts
|
|
@@ -260,16 +354,17 @@ declare class QueueDO extends DurableObject {
|
|
|
260
354
|
*/
|
|
261
355
|
declare class StreamDO extends DurableObject {
|
|
262
356
|
private getMeta;
|
|
357
|
+
private assertOwner;
|
|
263
358
|
/**
|
|
264
359
|
* Append a chunk. The index is allocated inside the transaction, so
|
|
265
360
|
* concurrent writers can never collide or skip.
|
|
266
361
|
*/
|
|
267
|
-
writeChunk(data: Uint8Array): Promise<number>;
|
|
362
|
+
writeChunk(runId: string, data: Uint8Array): Promise<number>;
|
|
268
363
|
/**
|
|
269
364
|
* Close the stream (idempotent). Readers observe `done: true` once all
|
|
270
365
|
* previously written chunks have been consumed.
|
|
271
366
|
*/
|
|
272
|
-
closeStream(): Promise<void>;
|
|
367
|
+
closeStream(runId: string): Promise<void>;
|
|
273
368
|
/**
|
|
274
369
|
* Read up to `limit` chunks starting at `startIndex` (0-based, inclusive).
|
|
275
370
|
*/
|
|
@@ -293,11 +388,17 @@ declare class StreamDO extends DurableObject {
|
|
|
293
388
|
/**
|
|
294
389
|
* Register a stream name against this per-run registry instance.
|
|
295
390
|
*/
|
|
296
|
-
registerStream(name: string): Promise<void>;
|
|
391
|
+
registerStream(runId: string, name: string): Promise<void>;
|
|
297
392
|
/**
|
|
298
393
|
* List stream names registered against this per-run registry instance.
|
|
299
394
|
*/
|
|
300
395
|
listStreams(): Promise<string[]>;
|
|
396
|
+
/** Fence a run's registry before any stream cells are removed. */
|
|
397
|
+
expireRegistry(runId: string, expiredAt: number): Promise<ExpireRunStreamsResult>;
|
|
398
|
+
/** Remove the registry payload after every referenced stream was fenced. */
|
|
399
|
+
finalizeRegistry(runId: string): Promise<void>;
|
|
400
|
+
/** Delete stream payload while leaving a small ownership tombstone. */
|
|
401
|
+
expireStream(runId: string, expiredAt: number): Promise<ExpireStreamResult>;
|
|
301
402
|
}
|
|
302
403
|
//#endregion
|
|
303
404
|
//#region src/worker/durable-objects/WorkflowRunDO.d.ts
|
|
@@ -312,88 +413,58 @@ declare class StreamDO extends DurableObject {
|
|
|
312
413
|
* queue-message dedup claims (see claimInflight/releaseInflight).
|
|
313
414
|
*/
|
|
314
415
|
declare class WorkflowRunDO extends DurableObject {
|
|
315
|
-
private
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
*/
|
|
320
|
-
private ensureSchema;
|
|
321
|
-
/**
|
|
322
|
-
* Apply an event: validate, guard, append the event and mutate the entity
|
|
323
|
-
* in ONE storage transaction. Guard failures are returned as structured
|
|
324
|
-
* outcomes (not thrown) because typed errors do not survive the RPC
|
|
325
|
-
* boundary with their `name` intact.
|
|
326
|
-
*/
|
|
416
|
+
private now;
|
|
417
|
+
private expiredTombstone;
|
|
418
|
+
private read;
|
|
419
|
+
/** Apply an event and capture all retention metadata in the same transaction. */
|
|
327
420
|
applyEvent(request: ApplyEventRequest): Promise<ApplyEventOutcome>;
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
*/
|
|
331
|
-
getRun(): Promise<WorkflowRun | null>;
|
|
332
|
-
/**
|
|
333
|
-
* Get a specific step
|
|
334
|
-
*/
|
|
335
|
-
getStep(stepId: string): Promise<Step | null>;
|
|
336
|
-
/**
|
|
337
|
-
* List steps with real limit/cursor pagination (cursor = last stepId).
|
|
338
|
-
*/
|
|
421
|
+
getRun(): Promise<RunReadOutcome<WorkflowRun | null>>;
|
|
422
|
+
getStep(stepId: string): Promise<RunReadOutcome<Step | null>>;
|
|
339
423
|
listSteps(params?: {
|
|
340
424
|
limit?: number;
|
|
341
425
|
cursor?: string;
|
|
342
426
|
sortOrder?: 'asc' | 'desc';
|
|
343
|
-
}): Promise<{
|
|
427
|
+
}): Promise<RunReadOutcome<{
|
|
344
428
|
data: Step[];
|
|
345
429
|
cursor: string | null;
|
|
346
430
|
hasMore: boolean;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
* Get a specific event
|
|
350
|
-
*/
|
|
351
|
-
getEvent(eventId: string): Promise<Event | null>;
|
|
352
|
-
/**
|
|
353
|
-
* List events with real limit/cursor pagination. Events are keyed by their
|
|
354
|
-
* monotonic ULID eventId, so storage order == event order.
|
|
355
|
-
*/
|
|
431
|
+
}>>;
|
|
432
|
+
getEvent(eventId: string): Promise<RunReadOutcome<Event | null>>;
|
|
356
433
|
listEvents(params?: {
|
|
357
434
|
limit?: number;
|
|
358
435
|
cursor?: string;
|
|
359
436
|
sortOrder?: 'asc' | 'desc';
|
|
360
|
-
}): Promise<{
|
|
437
|
+
}): Promise<RunReadOutcome<{
|
|
361
438
|
data: Event[];
|
|
362
439
|
cursor: string | null;
|
|
363
440
|
hasMore: boolean;
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* List hooks with real limit/cursor pagination (cursor = last hookId).
|
|
367
|
-
*/
|
|
441
|
+
}>>;
|
|
368
442
|
listHooks(params?: {
|
|
369
443
|
limit?: number;
|
|
370
444
|
cursor?: string;
|
|
371
445
|
sortOrder?: 'asc' | 'desc';
|
|
372
|
-
}): Promise<{
|
|
446
|
+
}): Promise<RunReadOutcome<{
|
|
373
447
|
data: Hook[];
|
|
374
448
|
cursor: string | null;
|
|
375
449
|
hasMore: boolean;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
450
|
+
}>>;
|
|
451
|
+
getCleanupStatus(): Promise<CleanupRecord | null>;
|
|
452
|
+
/** Explicitly schedule an existing terminal run, used for opt-in backfills. */
|
|
453
|
+
scheduleCleanup(request: ScheduleCleanupRequest): Promise<CleanupRecord | null>;
|
|
454
|
+
cleanupNow(request: ScheduleCleanupRequest): Promise<CleanupRecord | null>;
|
|
455
|
+
rearmCleanup(): Promise<CleanupRecord | null>;
|
|
456
|
+
alarm(): Promise<void>;
|
|
457
|
+
private namespace;
|
|
458
|
+
private setCleanupPhase;
|
|
459
|
+
private executeCleanup;
|
|
460
|
+
private deletePayloadBatch;
|
|
461
|
+
private recordCleanupFailure;
|
|
388
462
|
claimInflight(params: {
|
|
389
463
|
messageId: string;
|
|
390
464
|
staleMs: number;
|
|
391
465
|
}): Promise<{
|
|
392
466
|
claimed: boolean;
|
|
393
467
|
}>;
|
|
394
|
-
/**
|
|
395
|
-
* Release a queue-message dedup claim after the message was fully handled.
|
|
396
|
-
*/
|
|
397
468
|
releaseInflight(): Promise<void>;
|
|
398
469
|
}
|
|
399
470
|
//#endregion
|
package/dist/worker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker/router.ts","../src/apply-event.ts","../src/queue.ts","../src/config.ts","../src/worker/do-base.ts","../src/worker/durable-objects/IndexDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"mappings":";;;UAmBiB;EACf,WAAW;IAAiB;;EAC5B,IAAI;IAAM;;;UAGK;EACf,aAAa;EACb,kBAAkB;EAClB,gBAAgB;EAChB,gBAAgB;EAChB;;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker/router.ts","../src/retention.ts","../src/apply-event.ts","../src/queue.ts","../src/config.ts","../src/worker/do-base.ts","../src/worker/durable-objects/IndexDO.ts","../src/worker/durable-objects/QueueDO.ts","../src/worker/durable-objects/StreamDO.ts","../src/worker/durable-objects/WorkflowRunDO.ts","../src/worker/worker.ts"],"mappings":"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"}
|