@lostgradient/weft 0.22.0 → 0.23.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/README.md +2 -4
- package/dist/cli/console.js +5 -5
- package/dist/cli/generated/operation-catalog.snapshot.json +112 -38
- package/dist/cli/help-text.d.ts +1 -1
- package/dist/cli/help-text.js +1 -1
- package/dist/core/engine/errors.d.ts +1 -1
- package/dist/core/engine/errors.js +4 -1
- package/dist/core/engine/index.d.ts +23 -1
- package/dist/core/engine/index.js +1 -0
- package/dist/core/engine/persisted-data-version.js +1 -1
- package/dist/core/persisted-data-incompatible-error.d.ts +16 -2
- package/dist/core/persisted-data-incompatible-error.js +9 -1
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +1 -0
- package/dist/http.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -0
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +1 -1
- package/dist/runtime/portable.js +3 -3
- package/dist/server/fleet-event-feed.d.ts +14 -64
- package/dist/server/fleet-event-feed.js +228 -74
- package/dist/server/handler/index.d.ts +1 -1
- package/dist/server/index.d.ts +8 -6
- package/dist/server/operations/event-stream-contracts.js +15 -2
- package/dist/server/operations/fleet-events-sse.js +3 -0
- package/dist/server/operations/fleet-events-subscription.js +3 -0
- package/dist/server/replay-live-feed-internals.d.ts +7 -0
- package/dist/server/replay-live-feed-internals.js +107 -7
- package/dist/server/runtime/task-result-view.d.ts +31 -12
- package/dist/server/runtime/task-result-view.js +31 -9
- package/dist/server/task-ledger-transitions-cancellation.d.ts +2 -0
- package/dist/server/task-ledger-transitions-cancellation.js +1 -1
- package/dist/server/workflow-event-feed.d.ts +88 -0
- package/dist/server/workflow-event-feed.js +4 -1
- package/dist/storage/bun-sql.js +1 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/index.d.ts +2 -1
- package/dist/storage/interface.d.ts +1 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +1 -0
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +2 -2
- package/dist/storage/node-sqlite-loader.js +2 -0
- package/dist/storage/node-sqlite.js +4 -0
- package/dist/storage/postgres.js +2 -2
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/protocol.js +1 -1
- package/package.json +5 -7
|
@@ -1,3 +1,96 @@
|
|
|
1
|
+
export function createSerialOperationQueue() {
|
|
2
|
+
let queue = Promise.resolve();
|
|
3
|
+
return (operation) => {
|
|
4
|
+
const result = queue.then(operation, operation);
|
|
5
|
+
queue = result.then(() => {
|
|
6
|
+
return;
|
|
7
|
+
}, () => {
|
|
8
|
+
return;
|
|
9
|
+
});
|
|
10
|
+
return result;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function createDurableSubscription(backend, options, args) {
|
|
14
|
+
const requestedAfter = decodeRequestedCursor(args?.fromCursor), signal = args?.signal === void 0 ? options.lifecycleSignal : options.lifecycleSignal === void 0 ? args.signal : AbortSignal.any([args.signal, options.lifecycleSignal]);
|
|
15
|
+
let waker = null, cleanedUp = !1;
|
|
16
|
+
const wake = () => {
|
|
17
|
+
const pending = waker;
|
|
18
|
+
waker = null;
|
|
19
|
+
pending?.();
|
|
20
|
+
}, unsubscribe = backend.subscribeLive(wake), cleanup = () => {
|
|
21
|
+
if (cleanedUp)
|
|
22
|
+
return;
|
|
23
|
+
cleanedUp = !0;
|
|
24
|
+
signal?.removeEventListener("abort", cleanup);
|
|
25
|
+
unsubscribe();
|
|
26
|
+
wake();
|
|
27
|
+
};
|
|
28
|
+
signal?.addEventListener("abort", cleanup, { once: !0 });
|
|
29
|
+
if (signal?.aborted)
|
|
30
|
+
cleanup();
|
|
31
|
+
async function* generator() {
|
|
32
|
+
try {
|
|
33
|
+
if (signal?.aborted)
|
|
34
|
+
return;
|
|
35
|
+
const snapshot = await backend.snapshotTailSequence();
|
|
36
|
+
yield* replayUpTo(backend, requestedAfter, snapshot, signal, args);
|
|
37
|
+
if (signal?.aborted)
|
|
38
|
+
return;
|
|
39
|
+
args?.onReplayComplete?.();
|
|
40
|
+
yield* tailDurableEvents(backend, snapshot, signal, args, options.pollIntervalMs, (next) => {
|
|
41
|
+
waker = next;
|
|
42
|
+
});
|
|
43
|
+
} finally {
|
|
44
|
+
cleanup();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return generator();
|
|
48
|
+
}
|
|
49
|
+
async function* tailDurableEvents(backend, snapshot, signal, args, pollIntervalMs, installWaker) {
|
|
50
|
+
let deliveredSequence = snapshot;
|
|
51
|
+
while (!0) {
|
|
52
|
+
if (signal?.aborted)
|
|
53
|
+
break;
|
|
54
|
+
let found = !1;
|
|
55
|
+
for await (const envelope of backend.replay({ afterSequence: deliveredSequence })) {
|
|
56
|
+
if (signal?.aborted)
|
|
57
|
+
break;
|
|
58
|
+
found = !0;
|
|
59
|
+
deliveredSequence = Math.max(deliveredSequence, envelope.sequence);
|
|
60
|
+
if (shouldDeliverEnvelope(envelope, args))
|
|
61
|
+
yield envelope;
|
|
62
|
+
}
|
|
63
|
+
if (found)
|
|
64
|
+
continue;
|
|
65
|
+
await waitForAppendOrPoll(pollIntervalMs, signal, installWaker);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function decodeRequestedCursor(cursor) {
|
|
69
|
+
if (cursor === void 0)
|
|
70
|
+
return -1;
|
|
71
|
+
if (!/^(?:-1|\d+)$/.test(cursor))
|
|
72
|
+
throw Error("Invalid cursor");
|
|
73
|
+
const sequence = Number(cursor);
|
|
74
|
+
if (!Number.isSafeInteger(sequence) || sequence < -1)
|
|
75
|
+
throw Error("Invalid cursor");
|
|
76
|
+
return sequence;
|
|
77
|
+
}
|
|
78
|
+
async function waitForAppendOrPoll(pollIntervalMs, signal, installWaker) {
|
|
79
|
+
let timer;
|
|
80
|
+
await new Promise((resolve) => {
|
|
81
|
+
const finish = () => {
|
|
82
|
+
if (timer !== void 0)
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
installWaker(null);
|
|
85
|
+
resolve();
|
|
86
|
+
};
|
|
87
|
+
installWaker(finish);
|
|
88
|
+
timer = setTimeout(finish, pollIntervalMs);
|
|
89
|
+
if (signal?.aborted)
|
|
90
|
+
finish();
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
1
94
|
export class ReplayWindowExceededError extends Error {
|
|
2
95
|
count;
|
|
3
96
|
limit;
|
|
@@ -10,22 +103,29 @@ export class ReplayWindowExceededError extends Error {
|
|
|
10
103
|
}
|
|
11
104
|
export async function* replayUpTo(backend, afterSequence, snapshot, signal, replayOptions) {
|
|
12
105
|
let replayCount = 0;
|
|
13
|
-
|
|
106
|
+
const backendOptions = createBackendReplayOptions(afterSequence, replayOptions?.fromCursor);
|
|
107
|
+
for await (const envelope of backend.replay(backendOptions)) {
|
|
14
108
|
if (envelope.sequence > snapshot)
|
|
15
109
|
break;
|
|
16
110
|
if (signal?.aborted)
|
|
17
111
|
return;
|
|
18
112
|
if (!shouldDeliverEnvelope(envelope, replayOptions))
|
|
19
113
|
continue;
|
|
20
|
-
|
|
21
|
-
replayCount += 1;
|
|
22
|
-
const replayLimit = replayOptions?.replayLimit;
|
|
23
|
-
if (replayLimit !== void 0 && replayCount > replayLimit)
|
|
24
|
-
throw createReplayLimitError(replayOptions, replayCount, replayLimit);
|
|
25
|
-
}
|
|
114
|
+
replayCount = updateReplayCount(envelope, replayOptions, replayCount);
|
|
26
115
|
yield envelope;
|
|
27
116
|
}
|
|
28
117
|
}
|
|
118
|
+
function updateReplayCount(envelope, replayOptions, replayCount) {
|
|
119
|
+
if (!shouldCountReplayEnvelope(envelope, replayOptions))
|
|
120
|
+
return replayCount;
|
|
121
|
+
const nextCount = replayCount + 1, replayLimit = replayOptions?.replayLimit;
|
|
122
|
+
if (replayLimit !== void 0 && nextCount > replayLimit)
|
|
123
|
+
throw createReplayLimitError(replayOptions, nextCount, replayLimit);
|
|
124
|
+
return nextCount;
|
|
125
|
+
}
|
|
126
|
+
function createBackendReplayOptions(afterSequence, requestedCursor) {
|
|
127
|
+
return requestedCursor === void 0 ? { afterSequence } : { afterSequence, requestedCursor };
|
|
128
|
+
}
|
|
29
129
|
export function shouldDeliverEnvelope(envelope, replayOptions) {
|
|
30
130
|
return replayOptions?.filterEnvelope?.(envelope) ?? !0;
|
|
31
131
|
}
|
|
@@ -11,9 +11,11 @@
|
|
|
11
11
|
* from this view for the same reason it is absent from the ledger itself:
|
|
12
12
|
* `RemoteTaskTerminalResolved` only ever stores `resultDigest` (a content
|
|
13
13
|
* hash), never the value — the durable ledger proves which attempt won,
|
|
14
|
-
* it does not re-deliver the payload.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* it does not re-deliver the payload. Only resolved views expose that digest:
|
|
15
|
+
* cancelled and retry-exhausted records use internal synthetic digests that
|
|
16
|
+
* include the attempt token. A resolved `resultDigest` exists so a caller that
|
|
17
|
+
* already has the value through whatever channel actually delivered it can
|
|
18
|
+
* verify it matches before adopting.
|
|
17
19
|
*
|
|
18
20
|
* "Adoption" (`adoptTaskResultImpl`) is an explicit caller assertion, not
|
|
19
21
|
* something this module infers: nothing in the engine today automatically
|
|
@@ -38,8 +40,14 @@ import type { Storage } from '../../storage/interface.ts';
|
|
|
38
40
|
* await using server = serve({ engine, port: 0 });
|
|
39
41
|
*
|
|
40
42
|
* const view: TaskResultView | null = await server.getTaskResult('op-1');
|
|
41
|
-
* if (view?.status === 'terminal' && !view.adopted) {
|
|
43
|
+
* if (view?.status === 'terminal' && view.disposition === 'resolved' && !view.adopted) {
|
|
42
44
|
* await server.adoptTaskResult('op-1', view.resultDigest);
|
|
45
|
+
* } else if (
|
|
46
|
+
* view?.status === 'terminal' &&
|
|
47
|
+
* view.disposition !== 'resolved' &&
|
|
48
|
+
* !view.adopted
|
|
49
|
+
* ) {
|
|
50
|
+
* await server.adoptTaskResult('op-1', view.adoptionToken);
|
|
43
51
|
* }
|
|
44
52
|
* ```
|
|
45
53
|
*/
|
|
@@ -48,13 +56,22 @@ export type TaskResultView = Readonly<{
|
|
|
48
56
|
state: 'queued' | 'leased' | 'completing' | 'cancelling';
|
|
49
57
|
}> | Readonly<{
|
|
50
58
|
status: 'terminal';
|
|
51
|
-
disposition: 'resolved'
|
|
59
|
+
disposition: 'resolved';
|
|
52
60
|
resultDigest: string;
|
|
53
61
|
terminalAt: number;
|
|
54
62
|
adopted: boolean;
|
|
55
63
|
adoptedAt?: number;
|
|
56
|
-
/**
|
|
57
|
-
resultStatus
|
|
64
|
+
/** Whether the worker reported success or failure. */
|
|
65
|
+
resultStatus: 'completed' | 'failed';
|
|
66
|
+
error?: string;
|
|
67
|
+
}> | Readonly<{
|
|
68
|
+
status: 'terminal';
|
|
69
|
+
disposition: 'cancelled' | 'retryExhausted';
|
|
70
|
+
/** Token-safe fence for adopting this exact terminal incarnation. */
|
|
71
|
+
adoptionToken: string;
|
|
72
|
+
terminalAt: number;
|
|
73
|
+
adopted: boolean;
|
|
74
|
+
adoptedAt?: number;
|
|
58
75
|
error?: string;
|
|
59
76
|
}> | Readonly<{
|
|
60
77
|
status: 'deadLettered';
|
|
@@ -74,9 +91,11 @@ export declare function getTaskResultViewImpl(storage: Storage, operationId: str
|
|
|
74
91
|
* assertion that "the workflow checkpoint (or whatever consumed this
|
|
75
92
|
* result) has incorporated it," per the project brief's adoption/retention
|
|
76
93
|
* split. Returns `true` once adopted, `false` if the record is not
|
|
77
|
-
* currently `terminal
|
|
78
|
-
* record that no longer exists,
|
|
79
|
-
*
|
|
80
|
-
*
|
|
94
|
+
* currently `terminal`, or the supplied resolved digest/non-resolved
|
|
95
|
+
* adoption token does not match (including a record that no longer exists,
|
|
96
|
+
* e.g. already reaped). The adoption token is a one-way digest of the
|
|
97
|
+
* internal synthetic digest, fencing adoption to the observed incarnation
|
|
98
|
+
* without exposing the attempt token. Idempotent: adopting an already-adopted
|
|
99
|
+
* record succeeds again, refreshing `adoptedAt`.
|
|
81
100
|
*/
|
|
82
|
-
export declare function adoptTaskResultImpl(storage: Storage, operationId: string,
|
|
101
|
+
export declare function adoptTaskResultImpl(storage: Storage, operationId: string, adoptionKey: string): Promise<boolean>;
|
|
@@ -1,21 +1,38 @@
|
|
|
1
|
+
import { sha256Hex } from "../../worker/manifest/content-digest.js";
|
|
1
2
|
import { markWorkflowResultAdopted } from "../task-ledger-transitions.js";
|
|
2
3
|
import {
|
|
3
4
|
decodeRemoteTaskRecord,
|
|
4
5
|
taskLedgerKey
|
|
5
6
|
} from "../task-ledger.js";
|
|
6
7
|
import { commitTaskLedgerTransition } from "./task-ledger-runtime.js";
|
|
7
|
-
function terminalTaskResultView(decoded) {
|
|
8
|
+
async function terminalTaskResultView(decoded) {
|
|
9
|
+
if (decoded.disposition === "resolved")
|
|
10
|
+
return {
|
|
11
|
+
status: "terminal",
|
|
12
|
+
disposition: decoded.disposition,
|
|
13
|
+
resultDigest: decoded.resultDigest,
|
|
14
|
+
terminalAt: decoded.terminalAt,
|
|
15
|
+
adopted: decoded.adopted,
|
|
16
|
+
...decoded.adoptedAt !== void 0 ? { adoptedAt: decoded.adoptedAt } : {},
|
|
17
|
+
resultStatus: decoded.status,
|
|
18
|
+
...decoded.error !== void 0 ? { error: decoded.error } : {}
|
|
19
|
+
};
|
|
8
20
|
return {
|
|
9
21
|
status: "terminal",
|
|
10
22
|
disposition: decoded.disposition,
|
|
11
|
-
|
|
23
|
+
adoptionToken: await nonResolvedAdoptionToken(decoded),
|
|
12
24
|
terminalAt: decoded.terminalAt,
|
|
13
25
|
adopted: decoded.adopted,
|
|
14
26
|
...decoded.adoptedAt !== void 0 ? { adoptedAt: decoded.adoptedAt } : {},
|
|
15
|
-
...
|
|
16
|
-
..."error" in decoded && decoded.error !== void 0 ? { error: decoded.error } : {}
|
|
27
|
+
..."error" in decoded ? { error: decoded.error } : {}
|
|
17
28
|
};
|
|
18
29
|
}
|
|
30
|
+
function nonResolvedAdoptionToken(decoded) {
|
|
31
|
+
return sha256Hex(JSON.stringify({
|
|
32
|
+
createdAt: decoded.createdAt,
|
|
33
|
+
resultDigest: decoded.resultDigest
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
19
36
|
function deadLetteredTaskResultView(decoded) {
|
|
20
37
|
return {
|
|
21
38
|
status: "deadLettered",
|
|
@@ -36,13 +53,18 @@ export async function getTaskResultViewImpl(storage, operationId) {
|
|
|
36
53
|
case "cancelling":
|
|
37
54
|
return { status: "pending", state: decoded.state };
|
|
38
55
|
case "terminal":
|
|
39
|
-
return terminalTaskResultView(decoded);
|
|
56
|
+
return await terminalTaskResultView(decoded);
|
|
40
57
|
case "deadLettered":
|
|
41
58
|
return deadLetteredTaskResultView(decoded);
|
|
42
|
-
default:
|
|
43
|
-
return decoded;
|
|
44
59
|
}
|
|
45
60
|
}
|
|
46
|
-
export async function adoptTaskResultImpl(storage, operationId,
|
|
47
|
-
|
|
61
|
+
export async function adoptTaskResultImpl(storage, operationId, adoptionKey) {
|
|
62
|
+
const observed = decodeRemoteTaskRecord(await storage.get(taskLedgerKey(operationId)));
|
|
63
|
+
let expectedResultDigest = adoptionKey;
|
|
64
|
+
if (observed?.state === "terminal" && observed.disposition !== "resolved") {
|
|
65
|
+
if (await nonResolvedAdoptionToken(observed) !== adoptionKey)
|
|
66
|
+
return !1;
|
|
67
|
+
expectedResultDigest = observed.resultDigest;
|
|
68
|
+
}
|
|
69
|
+
return (await commitTaskLedgerTransition(storage, operationId, (current, now) => markWorkflowResultAdopted(current, { expectedResultDigest }, now), 1)).ok;
|
|
48
70
|
}
|
|
@@ -15,6 +15,8 @@ export type RecordCancellationIntentInput = Readonly<{
|
|
|
15
15
|
expectedGeneration: number;
|
|
16
16
|
expectedAttempt: number;
|
|
17
17
|
cancellationReason: string;
|
|
18
|
+
/** Unique per cancellation request; fences queued-origin terminal incarnations. */
|
|
19
|
+
cancellationToken: string;
|
|
18
20
|
}>;
|
|
19
21
|
export declare function recordCancellationIntent(current: RemoteTaskRecord | null, input: RecordCancellationIntentInput, now: number): TaskLedgerTransitionResult<RemoteTaskCancelling | RemoteTaskTerminalCancelled>;
|
|
20
22
|
export type CommitCancellationInput = Readonly<{
|
|
@@ -16,7 +16,7 @@ export function recordCancellationIntent(current, input, now) {
|
|
|
16
16
|
disposition: "cancelled",
|
|
17
17
|
attempt: current.attempt,
|
|
18
18
|
cancellationReason: input.cancellationReason,
|
|
19
|
-
resultDigest: `cancelled:${current.operationId}:${
|
|
19
|
+
resultDigest: `cancelled:${current.operationId}:${input.cancellationToken}`,
|
|
20
20
|
terminalAt: now,
|
|
21
21
|
adopted: !1,
|
|
22
22
|
retentionGeneration: 0
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WeftEventMap } from '../core/events.ts';
|
|
2
|
+
import type { BatchOperation, ConditionalBatchCondition } from '../storage/interface.ts';
|
|
2
3
|
/** Discriminator string carried on every feed envelope. */
|
|
3
4
|
export type FeedEventKind = keyof WeftEventMap | 'workflow:checkpoint' | 'stream:chunk' | (string & {});
|
|
4
5
|
/**
|
|
@@ -118,6 +119,92 @@ export type WorkflowEventFeedOptions = {
|
|
|
118
119
|
/** Max envelopes the live buffer holds before overflow terminates the subscription. */
|
|
119
120
|
liveBufferSize?: number;
|
|
120
121
|
};
|
|
122
|
+
/**
|
|
123
|
+
* A committed fleet-wide event, optionally scoped to one workflow.
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* import type { FleetEventEnvelope } from '@lostgradient/weft/server/handler';
|
|
127
|
+
* declare const event: FleetEventEnvelope;
|
|
128
|
+
* console.log(event.cursor);
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export type FleetEventEnvelope = {
|
|
132
|
+
readonly kind: FeedEventKind;
|
|
133
|
+
readonly workflowId?: string | undefined;
|
|
134
|
+
readonly sequence: number;
|
|
135
|
+
readonly cursor: Cursor;
|
|
136
|
+
readonly emittedAtMs: number;
|
|
137
|
+
readonly payload: unknown;
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* The caller-supplied fields for a new fleet event.
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* import type { FleetEventInput } from '@lostgradient/weft/server/handler';
|
|
144
|
+
* const event: FleetEventInput = { kind: 'worker:connected', emittedAtMs: 1, payload: {} };
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
export type FleetEventInput = {
|
|
148
|
+
readonly kind: FeedEventKind;
|
|
149
|
+
readonly workflowId?: string | undefined;
|
|
150
|
+
readonly emittedAtMs: number;
|
|
151
|
+
readonly payload: unknown;
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* A fleet event input guaranteed to identify its workflow.
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* import type { FleetWorkflowEventInput } from '@lostgradient/weft/server/handler';
|
|
158
|
+
* declare const event: FleetWorkflowEventInput;
|
|
159
|
+
* console.log(event.workflowId);
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
export type FleetWorkflowEventInput = FleetEventInput & {
|
|
163
|
+
readonly workflowId: string;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Caller-owned state operations committed atomically with an event.
|
|
167
|
+
* @example
|
|
168
|
+
* ```ts
|
|
169
|
+
* import type { FleetEventAppendOptions } from '@lostgradient/weft/server/handler';
|
|
170
|
+
* const options: FleetEventAppendOptions = { operations: [{ type: 'delete', key: 'app:pending' }] };
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export type FleetEventAppendOptions = {
|
|
174
|
+
readonly conditions?: readonly ConditionalBatchCondition[];
|
|
175
|
+
readonly operations?: readonly BatchOperation[];
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* The compaction boundary returned when a cursor predates retained history.
|
|
179
|
+
* @example
|
|
180
|
+
* ```ts
|
|
181
|
+
* import type { FleetEventGapEnvelope } from '@lostgradient/weft/server/handler';
|
|
182
|
+
* declare const gap: FleetEventGapEnvelope;
|
|
183
|
+
* console.log(gap.payload.firstRetainedSequence);
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
export type FleetEventGapEnvelope = {
|
|
187
|
+
readonly kind: 'fleet:gap';
|
|
188
|
+
readonly sequence: number;
|
|
189
|
+
readonly cursor: Cursor;
|
|
190
|
+
readonly emittedAtMs: number;
|
|
191
|
+
readonly payload: {
|
|
192
|
+
readonly requestedCursor: Cursor;
|
|
193
|
+
readonly firstRetainedSequence: number;
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Durable fleet-feed polling and replay handoff options.
|
|
198
|
+
* @example
|
|
199
|
+
* ```ts
|
|
200
|
+
* import type { FleetEventFeedOptions } from '@lostgradient/weft/server/handler';
|
|
201
|
+
* const options: FleetEventFeedOptions = { livePollIntervalMs: 100 };
|
|
202
|
+
* ```
|
|
203
|
+
*/
|
|
204
|
+
export type FleetEventFeedOptions = {
|
|
205
|
+
/** How often a subscriber checks durable storage for commits from another process. */
|
|
206
|
+
readonly livePollIntervalMs?: number;
|
|
207
|
+
};
|
|
121
208
|
export type SequencedEventEnvelope = {
|
|
122
209
|
readonly sequence: number;
|
|
123
210
|
readonly cursor: Cursor;
|
|
@@ -125,6 +212,7 @@ export type SequencedEventEnvelope = {
|
|
|
125
212
|
export type ReplayLiveFeedBackend<TEnvelope extends SequencedEventEnvelope> = {
|
|
126
213
|
replay(options: {
|
|
127
214
|
afterSequence: number;
|
|
215
|
+
requestedCursor?: Cursor;
|
|
128
216
|
}): AsyncIterable<TEnvelope>;
|
|
129
217
|
snapshotTailSequence(): Promise<number>;
|
|
130
218
|
subscribeLive(listener: (envelope: TEnvelope) => void): () => void;
|
|
@@ -25,7 +25,10 @@ export function createReplayLiveFeed(backend, options) {
|
|
|
25
25
|
async function* replay(args) {
|
|
26
26
|
const afterSequence = args?.fromCursor !== void 0 ? decodeCursorOrThrow(args.fromCursor) : -1;
|
|
27
27
|
let yielded = 0;
|
|
28
|
-
for await (const envelope of backend.replay({
|
|
28
|
+
for await (const envelope of backend.replay({
|
|
29
|
+
afterSequence,
|
|
30
|
+
...args?.fromCursor === void 0 ? {} : { requestedCursor: args.fromCursor }
|
|
31
|
+
})) {
|
|
29
32
|
if (args?.limit !== void 0 && yielded >= args.limit)
|
|
30
33
|
return;
|
|
31
34
|
yield envelope;
|
package/dist/storage/bun-sql.js
CHANGED
|
@@ -167,6 +167,7 @@ var KEYS = {
|
|
|
167
167
|
fleetEventPrefix: () => "fleet-event:",
|
|
168
168
|
fleetEvent: (sequence) => `fleet-event:${String(sequence).padStart(10, "0")}`,
|
|
169
169
|
fleetEventTail: () => "fleet-event-tail",
|
|
170
|
+
fleetEventWatermark: () => "fleet-event-watermark",
|
|
170
171
|
fleetEventByWorkflowPrefix: (workflowId) => `fleet-event-by-workflow:${encodeStorageKeyComponent(workflowId)}:`,
|
|
171
172
|
fleetEventByWorkflow: (workflowId, sequence) => `fleet-event-by-workflow:${encodeStorageKeyComponent(workflowId)}:${String(sequence).padStart(10, "0")}`,
|
|
172
173
|
signal: (workflowId, name, id) => signalStorageKey(workflowId, name, id, SIGNAL_SORT_CLASS_NORMAL),
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var Q=import.meta.require;function f(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function D(e){let t=e.capabilities(),n=[];if(t.persistence!=="local"&&t.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)n.push("atomicBatch must be true");if(!t.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}var m="default";async function S(e,t){return await e.get(t)!==null}async function*l(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function x(e,t){let n=0;for await(let i of l(e,t))n++;return n}async function C(e,t){let n=[];for await(let i of l(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function re(e,t,n){let i=[];for await(let p of l(e,t,n))i.push({type:"delete",key:p});if(i.length===0)return 0;return await e.batch(i),i.length}function r(e){return encodeURIComponent(e)}function M(e){return decodeURIComponent(e)}function N(e){try{return decodeURIComponent(e)}catch{return null}}var A={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var K=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var y=1e4,pe=1e4;class B extends Error{code="StorageBatchOperationLimitExceededError";cap=y;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${y}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function u(e,t){if(t>y)throw new B(e,t)}function fe(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function me(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function ye(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function he(e,t){if(e.has)return e.has(t);return S(e,t)}function be(e,t,n){if(e.keys)return e.keys(t,n);return l(e,t,n)}async function we(e,t){if(e.count)return e.count(t);return x(e,t)}async function Se(e,t){if(e.deletePrefix)return e.deletePrefix(t);return C(e,t)}async function $e(e,t){u("batch operations",t.length),await e.batch(t)}async function xe(e,t,n){if(u("conditionalBatch conditions",t.length),u("conditionalBatch operations",n.length),f(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var o=(e)=>String(e).padStart(16,"0"),H="0",V="1",v=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ce={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${o(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${o(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${o(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>v(e,t,n,V),startSignal:(e,t,n)=>v(e,t,n,H),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${o(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${o(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${o(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${o(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${o(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...A,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${m}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${o(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${o(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${o(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};var c;function q(){if(c&&"bun"in c)return c.bun;return globalThis.Bun}function P(){return typeof q()<"u"}function W(){if(c&&"process"in c)return c.process;return globalThis.process}function O(e){let n=W()?.getBuiltinModule;if(typeof n!=="function")return;return n(e)}function k(){let e=O("node:zlib");if(!e)throw Error("gzip/gunzip require Bun or Node 22.5+ (process.getBuiltinModule). "+"Not available in browser or edge runtimes \u2014 use CompressionStream directly.");return e}function E(e){if(P())return new Uint8Array(Bun.gzipSync(new Uint8Array(e)));return new Uint8Array(k().gzipSync(e))}function R(e){if(P())return new Uint8Array(Bun.gunzipSync(new Uint8Array(e)));return new Uint8Array(k().gunzipSync(e))}function T(){return O("node:zlib")}function U(){let e=T();if(!e)throw Error("Brotli compression requires Bun or Node 22.5+ with process.getBuiltinModule support. Use gzip compression for browser/edge runtimes.");return e}function F(e){return new Uint8Array(U().brotliCompressSync(e))}function G(e){return new Uint8Array(U().brotliDecompressSync(e))}var g=193,h=0,_=1,I=2,s=2;function z(e){return Y(e)}function Y(e){switch(e){case"gzip":return{algorithm:"gzip",compress(t){return E(t)}};case"brotli":return{algorithm:"brotli",compress(t){return F(t)}};case"none":return{algorithm:"none",compress(t){return t}}}}async function b(e,t,n){if(e.length<n||t.algorithm==="none"){let a=new Uint8Array(e.length+s);return a[0]=g,a[1]=h,a.set(e,s),a}let i=await t.compress(e);if(i.length+s>=e.length+s){let a=new Uint8Array(e.length+s);return a[0]=g,a[1]=h,a.set(e,s),a}let p=t.algorithm==="gzip"?_:I,d=new Uint8Array(i.length+s);return d[0]=g,d[1]=p,d.set(i,s),d}async function w(e){if(e.length<s)throw Error("Compression payload missing 2-byte header.");if(e[0]!==g)throw Error("Compression payload missing magic byte 0xC1.");let t=e[1],n=e.slice(s);switch(t){case h:return n;case _:return R(n);case I:return G(n);default:throw Error(`Compression payload uses unsupported algorithm byte 0x${t.toString(16).padStart(2,"0")}.`)}}var Z=4096,X="gzip";function L(e){return{threshold:e?.threshold??Z,algorithm:e?.algorithm??X}}class j{#e;#t;#r;constructor(e,t){this.#e=e;let n=L(t);if(this.#t=z(n.algorithm),this.#r=n.threshold,e.query){let i=e.query.bind(e);Object.defineProperty(this,"query",{value:i,enumerable:!0,configurable:!0})}}capabilities(){let e=this.#e.capabilities();return{persistence:e.persistence,readAfterWrite:e.readAfterWrite,scanConsistency:e.scanConsistency,atomicBatch:e.atomicBatch,conditionalBatch:!1,boundedRangeDelete:!1}}async get(e){let t=await this.#e.get(e);if(!t)return null;return w(t)}async put(e,t){let n=await b(t,this.#t,this.#r);return this.#e.put(e,n)}async delete(e){return this.#e.delete(e)}async*scan(e,t){for await(let[n,i]of this.#e.scan(e,t))yield[n,await w(i)]}async batch(e){u("batch operations",e.length);let t=await Promise.all(e.map(async(n)=>{if(n.type==="put")return{type:"put",key:n.key,value:await b(n.value,this.#t,this.#r)};return n}));return this.#e.batch(t)}[Symbol.dispose](){this.#e[Symbol.dispose]()}}export{j as CompressedStorage};
|
|
2
|
+
var Q=import.meta.require;function f(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function D(e){let t=e.capabilities(),n=[];if(t.persistence!=="local"&&t.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)n.push("atomicBatch must be true");if(!t.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}var m="default";async function S(e,t){return await e.get(t)!==null}async function*l(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function x(e,t){let n=0;for await(let i of l(e,t))n++;return n}async function C(e,t){let n=[];for await(let i of l(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function re(e,t,n){let i=[];for await(let p of l(e,t,n))i.push({type:"delete",key:p});if(i.length===0)return 0;return await e.batch(i),i.length}function r(e){return encodeURIComponent(e)}function M(e){return decodeURIComponent(e)}function N(e){try{return decodeURIComponent(e)}catch{return null}}var v={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var K=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var y=1e4,pe=1e4;class B extends Error{code="StorageBatchOperationLimitExceededError";cap=y;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${y}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function u(e,t){if(t>y)throw new B(e,t)}function fe(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function me(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function ye(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function he(e,t){if(e.has)return e.has(t);return S(e,t)}function be(e,t,n){if(e.keys)return e.keys(t,n);return l(e,t,n)}async function we(e,t){if(e.count)return e.count(t);return x(e,t)}async function Se(e,t){if(e.deletePrefix)return e.deletePrefix(t);return C(e,t)}async function $e(e,t){u("batch operations",t.length),await e.batch(t)}async function xe(e,t,n){if(u("conditionalBatch conditions",t.length),u("conditionalBatch operations",n.length),f(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var o=(e)=>String(e).padStart(16,"0"),H="0",V="1",A=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,Ce={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${o(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${o(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${o(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>A(e,t,n,V),startSignal:(e,t,n)=>A(e,t,n,H),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${o(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${o(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${o(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${o(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${o(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...v,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${m}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${o(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${o(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${o(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};var c;function q(){if(c&&"bun"in c)return c.bun;return globalThis.Bun}function P(){return typeof q()<"u"}function F(){if(c&&"process"in c)return c.process;return globalThis.process}function O(e){let t=F();if(typeof t?.getBuiltinModule!=="function")return;return t.getBuiltinModule(e)}function k(){let e=O("node:zlib");if(!e)throw Error("gzip/gunzip require Bun or Node 22.5+ (process.getBuiltinModule). "+"Not available in browser or edge runtimes \u2014 use CompressionStream directly.");return e}function E(e){if(P())return new Uint8Array(Bun.gzipSync(new Uint8Array(e)));return new Uint8Array(k().gzipSync(e))}function R(e){if(P())return new Uint8Array(Bun.gunzipSync(new Uint8Array(e)));return new Uint8Array(k().gunzipSync(e))}function T(){return O("node:zlib")}function U(){let e=T();if(!e)throw Error("Brotli compression requires Bun or Node 22.5+ with process.getBuiltinModule support. Use gzip compression for browser/edge runtimes.");return e}function W(e){return new Uint8Array(U().brotliCompressSync(e))}function G(e){return new Uint8Array(U().brotliDecompressSync(e))}var g=193,h=0,_=1,I=2,s=2;function z(e){return Y(e)}function Y(e){switch(e){case"gzip":return{algorithm:"gzip",compress(t){return E(t)}};case"brotli":return{algorithm:"brotli",compress(t){return W(t)}};case"none":return{algorithm:"none",compress(t){return t}}}}async function b(e,t,n){if(e.length<n||t.algorithm==="none"){let a=new Uint8Array(e.length+s);return a[0]=g,a[1]=h,a.set(e,s),a}let i=await t.compress(e);if(i.length+s>=e.length+s){let a=new Uint8Array(e.length+s);return a[0]=g,a[1]=h,a.set(e,s),a}let p=t.algorithm==="gzip"?_:I,d=new Uint8Array(i.length+s);return d[0]=g,d[1]=p,d.set(i,s),d}async function w(e){if(e.length<s)throw Error("Compression payload missing 2-byte header.");if(e[0]!==g)throw Error("Compression payload missing magic byte 0xC1.");let t=e[1],n=e.slice(s);switch(t){case h:return n;case _:return R(n);case I:return G(n);default:throw Error(`Compression payload uses unsupported algorithm byte 0x${t.toString(16).padStart(2,"0")}.`)}}var Z=4096,X="gzip";function L(e){return{threshold:e?.threshold??Z,algorithm:e?.algorithm??X}}class j{#e;#t;#r;constructor(e,t){this.#e=e;let n=L(t);if(this.#t=z(n.algorithm),this.#r=n.threshold,e.query){let i=e.query.bind(e);Object.defineProperty(this,"query",{value:i,enumerable:!0,configurable:!0})}}capabilities(){let e=this.#e.capabilities();return{persistence:e.persistence,readAfterWrite:e.readAfterWrite,scanConsistency:e.scanConsistency,atomicBatch:e.atomicBatch,conditionalBatch:!1,boundedRangeDelete:!1}}async get(e){let t=await this.#e.get(e);if(!t)return null;return w(t)}async put(e,t){let n=await b(t,this.#t,this.#r);return this.#e.put(e,n)}async delete(e){return this.#e.delete(e)}async*scan(e,t){for await(let[n,i]of this.#e.scan(e,t))yield[n,await w(i)]}async batch(e){u("batch operations",e.length);let t=await Promise.all(e.map(async(n)=>{if(n.type==="put")return{type:"put",key:n.key,value:await b(n.value,this.#t,this.#r)};return n}));return this.#e.batch(t)}[Symbol.dispose](){this.#e[Symbol.dispose]()}}export{j as CompressedStorage};
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -149,6 +149,7 @@ declare const exportedKeys: {
|
|
|
149
149
|
readonly fleetEventPrefix: () => string;
|
|
150
150
|
readonly fleetEvent: (sequence: number) => string;
|
|
151
151
|
readonly fleetEventTail: () => string;
|
|
152
|
+
readonly fleetEventWatermark: () => string;
|
|
152
153
|
readonly fleetEventByWorkflowPrefix: (workflowId: string) => string;
|
|
153
154
|
readonly fleetEventByWorkflow: (workflowId: string, sequence: number) => string;
|
|
154
155
|
readonly signal: (workflowId: string, name: string, id: string) => string;
|
|
@@ -356,7 +357,7 @@ declare const exportedTextValueStore: typeof textValueStore;
|
|
|
356
357
|
* void isWeftKey;
|
|
357
358
|
* ```
|
|
358
359
|
*/
|
|
359
|
-
declare const exportedWeftReservedKeyPrefixes: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "child-by-parent:", "ev:", "fleet-event-by-workflow:", "fleet-event:", "fleet-event-tail", "idx:", "lease:", "liveness:", "offload:", "ownership-mode-marker", "op:", "review:", "schedule:", "schedule-due:", "schedule-run-by-schedule:", "schedule-run-link:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-concurrency:", "wf-concurrency-holder:", "wf-deadline:", "wf-delayed:", "wf-finalizer-state:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-owner-epoch:", "wf-owner-holder:", "wf-teardown:", "wf-teardown-deadletter:", "wf-teardown-needed:", "wf-teardown-succeeded:", "wf-terminal:"];
|
|
360
|
+
declare const exportedWeftReservedKeyPrefixes: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "child-by-parent:", "ev:", "fleet-event-by-workflow:", "fleet-event:", "fleet-event-tail", "fleet-event-watermark", "idx:", "lease:", "liveness:", "offload:", "ownership-mode-marker", "op:", "review:", "schedule:", "schedule-due:", "schedule-run-by-schedule:", "schedule-run-link:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-concurrency:", "wf-concurrency-holder:", "wf-deadline:", "wf-delayed:", "wf-finalizer-state:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-owner-epoch:", "wf-owner-holder:", "wf-teardown:", "wf-teardown-deadletter:", "wf-teardown-needed:", "wf-teardown-succeeded:", "wf-terminal:"];
|
|
360
361
|
/**
|
|
361
362
|
* Re-exported {@link withCodec}. See the original declaration for full docs.
|
|
362
363
|
*
|
|
@@ -433,6 +433,7 @@ export declare const KEYS: {
|
|
|
433
433
|
readonly fleetEventPrefix: () => string;
|
|
434
434
|
readonly fleetEvent: (sequence: number) => string;
|
|
435
435
|
readonly fleetEventTail: () => string;
|
|
436
|
+
readonly fleetEventWatermark: () => string;
|
|
436
437
|
readonly fleetEventByWorkflowPrefix: (workflowId: string) => string;
|
|
437
438
|
readonly fleetEventByWorkflow: (workflowId: string, sequence: number) => string;
|
|
438
439
|
readonly signal: (workflowId: string, name: string, id: string) => string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var k=import.meta.require;function s(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function w(e){let t=e.capabilities(),n=[];if(t.persistence!=="local"&&t.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)n.push("atomicBatch must be true");if(!t.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}var l="default";async function d(e,t){return await e.get(t)!==null}async function*a(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function u(e,t){let n=0;for await(let i of a(e,t))n++;return n}async function f(e,t){let n=[];for await(let i of a(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function O(e,t,n){let i=[];for await(let y of a(e,t,n))i.push({type:"delete",key:y});if(i.length===0)return 0;return await e.batch(i),i.length}function r(e){return encodeURIComponent(e)}function b(e){return decodeURIComponent(e)}function S(e){try{return decodeURIComponent(e)}catch{return null}}var p={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var x=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var c=1e4,
|
|
2
|
+
var k=import.meta.require;function s(e,t,n){if(!e.capabilities()[t])throw Error(`Feature "${n}" requires storage capability "${t}", but this storage backend does not provide it.`)}function w(e){let t=e.capabilities(),n=[];if(t.persistence!=="local"&&t.persistence!=="remote")n.push(`persistence must be "local" or "remote" (got "${t.persistence}")`);if(t.readAfterWrite!=="linearizable")n.push(`readAfterWrite must be "linearizable" (got "${t.readAfterWrite}")`);if(t.scanConsistency!=="snapshot")n.push(`scanConsistency must be "snapshot" (got "${t.scanConsistency}")`);if(!t.atomicBatch)n.push("atomicBatch must be true");if(!t.conditionalBatch)n.push("conditionalBatch must be true");if(n.length>0)throw Error(`Storage is not durable enough for recovery: ${n.join("; ")}.`)}var l="default";async function d(e,t){return await e.get(t)!==null}async function*a(e,t,n){for await(let[i]of e.scan(t,n))yield i}async function u(e,t){let n=0;for await(let i of a(e,t))n++;return n}async function f(e,t){let n=[];for await(let i of a(e,t))n.push({type:"delete",key:i});if(n.length===0)return 0;return await e.batch(n),n.length}async function O(e,t,n){let i=[];for await(let y of a(e,t,n))i.push({type:"delete",key:y});if(i.length===0)return 0;return await e.batch(i),i.length}function r(e){return encodeURIComponent(e)}function b(e){return decodeURIComponent(e)}function S(e){try{return decodeURIComponent(e)}catch{return null}}var p={workflowOwnerEpoch:(e)=>`wf-owner-epoch:${r(e)}`,workflowOwnerHolder:(e)=>`wf-owner-holder:${r(e)}`,ownershipModeMarker:()=>"ownership-mode-marker"};var x=["actrec:","archive:","async-act:","attr:","audit:bulk:","blob:","budget:","budget-charged:","child-by-parent:","ev:","fleet-event-by-workflow:","fleet-event:","fleet-event-tail","fleet-event-watermark","idx:","lease:","liveness:","offload:","ownership-mode-marker","op:","review:","schedule:","schedule-due:","schedule-run-by-schedule:","schedule-run-link:","schedule-run:","sig:","sigres:","sigseq:","start-idem:","state:","tag:","tool-effect:","upd:","upk:","upr:","wf:","wf-cleanup:","wf-cleanup-needed:","wf-concurrency:","wf-concurrency-holder:","wf-deadline:","wf-delayed:","wf-finalizer-state:","wf-has-services:","wf-headers:","wf-idx-","wf-owner-epoch:","wf-owner-holder:","wf-teardown:","wf-teardown-deadletter:","wf-teardown-needed:","wf-teardown-succeeded:","wf-terminal:"];var c=1e4,M=1e4;class h extends Error{code="StorageBatchOperationLimitExceededError";cap=c;count;target;constructor(e,t){super(`${e} count ${t} exceeds MAX_BATCH_OPERATIONS (${c}).`);this.name="StorageBatchOperationLimitExceededError",this.target=e,this.count=t}}function g(e,t){if(t>c)throw new h(e,t)}function U(e){return e.length>0?e.slice(0,-1)+String.fromCharCode(e.charCodeAt(e.length-1)+1):"\xFF"}function V(e,t={}){if(t.gt!==void 0&&e<=t.gt)return!1;if(t.gte!==void 0&&e<t.gte)return!1;if(t.lt!==void 0&&e>=t.lt)return!1;if(t.lte!==void 0&&e>t.lte)return!1;return!0}function q(e,t){if(e===null||t===null)return e===t;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}async function N(e,t){if(e.has)return e.has(t);return d(e,t)}function F(e,t,n){if(e.keys)return e.keys(t,n);return a(e,t,n)}async function z(e,t){if(e.count)return e.count(t);return u(e,t)}async function G(e,t){if(e.deletePrefix)return e.deletePrefix(t);return f(e,t)}async function X(e,t){g("batch operations",t.length),await e.batch(t)}async function Y(e,t,n){if(g("conditionalBatch conditions",t.length),g("conditionalBatch operations",n.length),s(e,"conditionalBatch","storageConditionalBatch"),!e.conditionalBatch)throw Error("This storage backend reports conditionalBatch capability but does not implement the conditionalBatch() method.");return e.conditionalBatch(t,n)}var o=(e)=>String(e).padStart(16,"0"),v="0",C="1",m=(e,t,n,i)=>`sig:${r(e)}:${r(t)}:${i}:${r(n)}`,j={workflow:(e)=>`wf:${r(e)}`,checkpoint:(e)=>`wf:${r(e)}:ckpt`,checkpointHistory:(e,t)=>`wf:${r(e)}:ckpt:${String(t).padStart(10,"0")}`,timelinePrefix:(e)=>`wf:${r(e)}:timeline:`,timeline:(e,t)=>`wf:${r(e)}:timeline:${String(t).padStart(10,"0")}`,schedule:(e)=>`schedule:${r(e)}`,scheduleTick:(e,t)=>`schedule-due:${String(e).padStart(16,"0")}:${r(t)}`,scheduleRun:(e)=>`schedule-run:${r(e)}`,scheduleRunLink:(e)=>`schedule-run-link:${r(e)}`,scheduleRunBySchedulePrefix:(e)=>`schedule-run-by-schedule:${r(e)}:`,scheduleRunBySchedule:(e,t)=>`schedule-run-by-schedule:${r(e)}:${r(t)}`,operation:(e,t,n)=>`op:${e}:${o(t)}:${n}`,operationInflight:(e)=>`op:inflight:${e}`,operationQueued:(e)=>`op:queued:${e}`,operationResolved:(e)=>`op:resolved:${e}`,bulkOperationAuditPrefix:()=>"audit:bulk:",bulkOperationAudit:(e,t,n)=>`audit:bulk:${o(e)}:${r(t)}:${r(n)}`,operationResolvedByTimePrefix:()=>"op:resolved-by-time:",operationResolvedByTime:(e,t)=>`op:resolved-by-time:${o(e)}:${r(t)}`,asyncActivity:(e,t)=>`async-act:v1:${r(e)}:${r(t)}`,asyncActivityResolution:(e,t)=>`async-act:v1:${r(e)}:${r(t)}:resolution`,activityReconciliationPrefix:(e)=>`actrec:v1:${r(e)}:`,activityReconciliation:(e,t,n)=>`actrec:v1:${r(e)}:${r(t)}:${n}`,eventPrefix:(e)=>`ev:${r(e)}:`,event:(e,t)=>`ev:${r(e)}:${String(t).padStart(10,"0")}`,eventHead:(e)=>`ev:${r(e)}:head`,eventWatermark:(e)=>`ev:${r(e)}:watermark`,fleetEventPrefix:()=>"fleet-event:",fleetEvent:(e)=>`fleet-event:${String(e).padStart(10,"0")}`,fleetEventTail:()=>"fleet-event-tail",fleetEventWatermark:()=>"fleet-event-watermark",fleetEventByWorkflowPrefix:(e)=>`fleet-event-by-workflow:${r(e)}:`,fleetEventByWorkflow:(e,t)=>`fleet-event-by-workflow:${r(e)}:${String(t).padStart(10,"0")}`,signal:(e,t,n)=>m(e,t,n,C),startSignal:(e,t,n)=>m(e,t,n,v),signalSequence:(e)=>`sigseq:v1:${r(e)}`,signalAcceptedResponsePrefix:(e)=>`sigres:v1:${r(e)}:`,signalAcceptedResponse:(e,t,n)=>`sigres:v1:${r(e)}:${r(t)}:${r(n)}`,deadline:(e,t)=>`wf-deadline:${o(e)}:${r(t)}`,terminalCleanup:(e,t)=>`wf-cleanup:${o(e)}:${r(t)}`,teardownTimer:(e,t)=>`wf-teardown:${o(e)}:${r(t)}`,delayedStart:(e,t)=>`wf-delayed:${o(e)}:${r(t)}`,terminalWorkflowPrefix:()=>"wf-terminal:",terminalWorkflow:(e,t)=>`wf-terminal:${o(e)}:${r(t)}`,attribute:(e)=>`attr:${r(e)}`,attributeIndex:(e,t,n)=>`idx:${e}:${t}:${r(n)}`,tagIndex:(e,t)=>`tag:${r(e)}:${r(t)}`,updatePrefix:(e)=>`upd:${r(e)}:`,update:(e,t)=>`upd:${r(e)}:${t}`,updateResponse:(e)=>`upr:${e}`,updateIdempotency:(e,t)=>`upk:${r(e)}:${t}`,startIdempotency:(e)=>`start-idem:${r(e)}`,startIdempotencySignalId:(e)=>`start-idem:${e}`,livenessPrefix:()=>"liveness:",liveness:(e)=>`liveness:${r(e)}`,leasePrefix:()=>"lease:",leaseEpoch:()=>"lease:epoch",leaseHolder:()=>"lease:holder",...p,budget:(e,t,n)=>`budget:${e}:${t}:${n}`,review:(e,t)=>`review:${r(e)}:${t}`,workflowHeaders:(e)=>`wf-headers:${r(e)}`,childCancellationPrefix:(e)=>`child-cancel:${r(e)}:`,childCancellation:(e,t)=>`child-cancel:${r(e)}:${r(t)}`,childWorkflowByParentPrefix:(e,t)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}`,childWorkflowByParent:(e,t,n)=>`child-by-parent:${r(e)}:${t===void 0?"":`${r(t)}:`}${r(n)}`,terminalCleanupNeeded:(e)=>`wf-cleanup-needed:${r(e)}`,workflowConcurrency:(e,t)=>`wf-concurrency:${r(e)}:${r(t)}`,workflowConcurrencyHolder:(e)=>`wf-concurrency-holder:${r(e)}`,workflowHasServices:(e)=>`wf-has-services:${r(e)}`,finalizerState:(e)=>`wf-finalizer-state:${r(e)}`,teardownOwed:(e)=>`wf-teardown-needed:${r(e)}`,teardownSucceeded:(e)=>`wf-teardown-succeeded:${r(e)}`,teardownDeadLetter:(e)=>`wf-teardown-deadletter:${r(e)}`,offload:(e,t)=>`offload:${r(e)}:${t}`,archive:(e,t)=>`archive:${r(e)}:${t}`,stateExecution:(e,t)=>`state:execution:${r(e)}:${r(t)}`,stateWorkflow:(e,t)=>`state:workflow-scope:${l}:${r(e)}:${r(t)}`,streamChunkPrefix:(e,t)=>`blob:${r(e)}:${t}:chunk:`,streamChunk:(e,t,n)=>`blob:${r(e)}:${t}:chunk:${String(n).padStart(10,"0")}`,streamTail:(e,t)=>`blob:${r(e)}:${t}:tail`,streamMetadata:(e,t)=>`blob:${r(e)}:${t}:meta`,budgetCharged:(e)=>`budget-charged:${e}`,toolEffect:(e,t,n)=>`tool-effect:${r(e)}:${t}:${n}`,workflowVisibilityStatus:(e,t)=>`wf-idx-status:${r(e)}:${r(t)}`,workflowVisibilityType:(e,t)=>`wf-idx-type:${r(e)}:${r(t)}`,workflowVisibilityCreated:(e,t)=>`wf-idx-created:${o(e)}:${r(t)}`,workflowVisibilityUpdated:(e,t)=>`wf-idx-updated:${o(e)}:${r(t)}`,workflowVisibilityDeadline:(e,t)=>`wf-idx-deadline:${o(e)}:${r(t)}`,workflowVisibilityManifest:(e)=>`wf-idx-manifest:${r(e)}`,workflowVisibilityMetaVersion:()=>"wf-idx-meta:version",workflowVisibilityMetaBuiltAt:()=>"wf-idx-meta:built-at",workflowVisibilityMetaCursor:()=>"wf-idx-meta:cursor"};export{l as DEFAULT_SCOPE,j as KEYS,c as MAX_BATCH_OPERATIONS,M as MAX_SCAN_LIMIT,h as StorageBatchOperationLimitExceededError,x as WEFT_RESERVED_KEY_PREFIXES,w as assertDurableStorageForRecovery,g as assertStorageBatchOperationCount,b as decodeStorageKeyComponent,r as encodeStorageKeyComponent,V as matchesScanOptions,s as requireStorageCapability,U as resolvePrefixRangeEnd,X as storageBatch,Y as storageConditionalBatch,z as storageCount,G as storageDeletePrefix,N as storageHas,F as storageKeys,q as storageValuesEqual,S as tryDecodeStorageKeyComponent};
|
|
@@ -16,4 +16,4 @@
|
|
|
16
16
|
* console.log(isWeftKey); // true
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
export declare const WEFT_RESERVED_KEY_PREFIXES: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "child-by-parent:", "ev:", "fleet-event-by-workflow:", "fleet-event:", "fleet-event-tail", "idx:", "lease:", "liveness:", "offload:", "ownership-mode-marker", "op:", "review:", "schedule:", "schedule-due:", "schedule-run-by-schedule:", "schedule-run-link:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-concurrency:", "wf-concurrency-holder:", "wf-deadline:", "wf-delayed:", "wf-finalizer-state:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-owner-epoch:", "wf-owner-holder:", "wf-teardown:", "wf-teardown-deadletter:", "wf-teardown-needed:", "wf-teardown-succeeded:", "wf-terminal:"];
|
|
19
|
+
export declare const WEFT_RESERVED_KEY_PREFIXES: readonly ["actrec:", "archive:", "async-act:", "attr:", "audit:bulk:", "blob:", "budget:", "budget-charged:", "child-by-parent:", "ev:", "fleet-event-by-workflow:", "fleet-event:", "fleet-event-tail", "fleet-event-watermark", "idx:", "lease:", "liveness:", "offload:", "ownership-mode-marker", "op:", "review:", "schedule:", "schedule-due:", "schedule-run-by-schedule:", "schedule-run-link:", "schedule-run:", "sig:", "sigres:", "sigseq:", "start-idem:", "state:", "tag:", "tool-effect:", "upd:", "upk:", "upr:", "wf:", "wf-cleanup:", "wf-cleanup-needed:", "wf-concurrency:", "wf-concurrency-holder:", "wf-deadline:", "wf-delayed:", "wf-finalizer-state:", "wf-has-services:", "wf-headers:", "wf-idx-", "wf-owner-epoch:", "wf-owner-holder:", "wf-teardown:", "wf-teardown-deadletter:", "wf-teardown-needed:", "wf-teardown-succeeded:", "wf-terminal:"];
|