stitchkit 0.67.0 → 0.68.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/dist/agent-runtime.js +5 -6
- package/dist/application/admission.d.ts +131 -0
- package/dist/application/admission.d.ts.map +1 -0
- package/dist/application/channel.d.ts +106 -0
- package/dist/application/channel.d.ts.map +1 -0
- package/dist/application/latest-sink.d.ts.map +1 -1
- package/dist/application-grammy.js +1 -1
- package/dist/application-opentelemetry.js +1 -1
- package/dist/application.d.ts +2 -0
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +386 -17
- package/dist/browser/client.d.ts +2 -3
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/contract-stream.d.ts +5 -0
- package/dist/browser/contract-stream.d.ts.map +1 -0
- package/dist/browser/http.d.ts +3 -0
- package/dist/browser/http.d.ts.map +1 -1
- package/dist/browser/stream.d.ts +4 -1
- package/dist/browser/stream.d.ts.map +1 -1
- package/dist/browser/transport.d.ts +3 -0
- package/dist/browser/transport.d.ts.map +1 -0
- package/dist/cli.js +6 -7
- package/dist/contract/define.d.ts +34 -2
- package/dist/contract/define.d.ts.map +1 -1
- package/dist/contract/errors.d.ts +4 -0
- package/dist/contract/errors.d.ts.map +1 -1
- package/dist/contract/index.d.ts +2 -1
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +5 -1
- package/dist/contract/stream.d.ts +19 -0
- package/dist/contract/stream.d.ts.map +1 -0
- package/dist/{index-xxye8j3k.js → index-0w9abg87.js} +4 -0
- package/dist/index-69m2278y.js +115 -0
- package/dist/{index-physbf4z.js → index-6wzr93cg.js} +1 -1
- package/dist/{index-1pgeyyee.js → index-7pn02bgv.js} +4 -6
- package/dist/index-9ky9hhg3.js +484 -0
- package/dist/{index-wrhf06ak.js → index-avjd67h6.js} +8 -8
- package/dist/{index-413xk7ga.js → index-cq9q73nf.js} +50 -1
- package/dist/{index-6taryy00.js → index-dafax5md.js} +1 -1
- package/dist/{index-8mxadm34.js → index-nymn7wbg.js} +1092 -19
- package/dist/{index-y91zd0ch.js → index-pr0qsmjy.js} +3 -2
- package/dist/index-v5bayx1z.js +138 -0
- package/dist/{index-mfw1pec7.js → index-wqyrvhzz.js} +3 -3
- package/dist/{index-svqhcrrj.js → index-zd4v31v2.js} +156 -10
- package/dist/{index-x8v8b7rc.js → index-zpyj7hsv.js} +330 -58
- package/dist/index.js +270 -105
- package/dist/internal/bounded-lines.d.ts +4 -0
- package/dist/internal/bounded-lines.d.ts.map +1 -0
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +11 -8
- package/dist/observability/index.js +6 -7
- package/dist/remote.js +5 -6
- package/dist/server/contract-stream.d.ts +5 -0
- package/dist/server/contract-stream.d.ts.map +1 -0
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/implement.d.ts.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +41 -283
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/stream.d.ts +3 -1
- package/dist/server/stream.d.ts.map +1 -1
- package/dist/server/streaming-route.d.ts +2 -0
- package/dist/server/streaming-route.d.ts.map +1 -1
- package/dist/server/types.d.ts +13 -3
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/unix-client-body.d.ts +4 -0
- package/dist/server/unix-client-body.d.ts.map +1 -0
- package/dist/server/unix-client-bun.d.ts +13 -0
- package/dist/server/unix-client-bun.d.ts.map +1 -0
- package/dist/server/unix-client-error.d.ts +9 -0
- package/dist/server/unix-client-error.d.ts.map +1 -0
- package/dist/server/unix-client.d.ts +25 -0
- package/dist/server/unix-client.d.ts.map +1 -0
- package/dist/testing.js +6 -5
- package/dist/tools.js +14 -16
- package/llms-full.txt +337 -17
- package/package.json +1 -1
- package/dist/index-48ffdxgk.js +0 -6
- package/dist/index-pzyt11ch.js +0 -127
- package/dist/index-tvwcrx2d.js +0 -224
- package/dist/index-wd8g8z6e.js +0 -206
|
@@ -2,19 +2,279 @@ import {
|
|
|
2
2
|
ApplicationIdSchema
|
|
3
3
|
} from "./index-8eywc9zv.js";
|
|
4
4
|
|
|
5
|
-
// src/application/
|
|
5
|
+
// src/application/channel.ts
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
var PositiveSafeIntegerSchema = z.number().int().positive().safe();
|
|
8
|
+
var BoundedChannelPolicySchema = z.enum(["ordered", "latest"]);
|
|
9
|
+
var BoundedChannelStateSchema = z.enum(["open", "draining", "closed", "failed"]);
|
|
10
|
+
var BoundedChannelSnapshotSchema = z.object({
|
|
11
|
+
state: BoundedChannelStateSchema,
|
|
12
|
+
policy: BoundedChannelPolicySchema,
|
|
13
|
+
queuedItems: z.number().int().nonnegative(),
|
|
14
|
+
queuedBytes: z.number().int().nonnegative(),
|
|
15
|
+
waitingReader: z.boolean(),
|
|
16
|
+
offered: z.number().int().nonnegative(),
|
|
13
17
|
delivered: z.number().int().nonnegative(),
|
|
18
|
+
queued: z.number().int().nonnegative(),
|
|
14
19
|
coalesced: z.number().int().nonnegative(),
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
refused: z.number().int().nonnegative(),
|
|
21
|
+
discarded: z.number().int().nonnegative()
|
|
22
|
+
}).strict().readonly();
|
|
23
|
+
|
|
24
|
+
class BoundedChannelReaderError extends Error {
|
|
25
|
+
constructor() {
|
|
26
|
+
super("A bounded channel permits only one pending next() call");
|
|
27
|
+
this.name = "BoundedChannelReaderError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function createBoundedChannel(config) {
|
|
31
|
+
const policy = BoundedChannelPolicySchema.parse(config.policy);
|
|
32
|
+
const maxItems = PositiveSafeIntegerSchema.parse(config.maxItems);
|
|
33
|
+
const maxBytes = PositiveSafeIntegerSchema.parse(config.maxBytes);
|
|
34
|
+
const queue = [];
|
|
35
|
+
let state = "open";
|
|
36
|
+
let queuedBytes = 0;
|
|
37
|
+
let waiting;
|
|
38
|
+
let failure;
|
|
39
|
+
let hasFailure = false;
|
|
40
|
+
let offered = 0;
|
|
41
|
+
let delivered = 0;
|
|
42
|
+
let queued = 0;
|
|
43
|
+
let coalesced = 0;
|
|
44
|
+
let refused = 0;
|
|
45
|
+
let discarded = 0;
|
|
46
|
+
const removeAbortListener = () => {
|
|
47
|
+
config.signal?.removeEventListener("abort", abortChannel);
|
|
48
|
+
};
|
|
49
|
+
const snapshot = () => BoundedChannelSnapshotSchema.parse({
|
|
50
|
+
state,
|
|
51
|
+
policy,
|
|
52
|
+
queuedItems: queue.length,
|
|
53
|
+
queuedBytes,
|
|
54
|
+
waitingReader: waiting !== undefined,
|
|
55
|
+
offered,
|
|
56
|
+
delivered,
|
|
57
|
+
queued,
|
|
58
|
+
coalesced,
|
|
59
|
+
refused,
|
|
60
|
+
discarded
|
|
61
|
+
});
|
|
62
|
+
const clearQueue = () => {
|
|
63
|
+
discarded += queue.length;
|
|
64
|
+
queue.length = 0;
|
|
65
|
+
queuedBytes = 0;
|
|
66
|
+
};
|
|
67
|
+
const settleClosed = () => {
|
|
68
|
+
if (state !== "draining" || queue.length > 0)
|
|
69
|
+
return;
|
|
70
|
+
state = "closed";
|
|
71
|
+
removeAbortListener();
|
|
72
|
+
const reader = waiting;
|
|
73
|
+
waiting = undefined;
|
|
74
|
+
reader?.resolve({ done: true, value: undefined });
|
|
75
|
+
};
|
|
76
|
+
const close = (options = {}) => {
|
|
77
|
+
if (state === "closed" || state === "failed")
|
|
78
|
+
return snapshot();
|
|
79
|
+
const mode = options.mode ?? "drain";
|
|
80
|
+
if (mode !== "drain" && mode !== "discard") {
|
|
81
|
+
throw new TypeError("Bounded channel close mode must be drain or discard");
|
|
82
|
+
}
|
|
83
|
+
if (mode === "discard") {
|
|
84
|
+
clearQueue();
|
|
85
|
+
state = "closed";
|
|
86
|
+
removeAbortListener();
|
|
87
|
+
const reader = waiting;
|
|
88
|
+
waiting = undefined;
|
|
89
|
+
reader?.resolve({ done: true, value: undefined });
|
|
90
|
+
return snapshot();
|
|
91
|
+
}
|
|
92
|
+
state = "draining";
|
|
93
|
+
settleClosed();
|
|
94
|
+
return snapshot();
|
|
95
|
+
};
|
|
96
|
+
function abortChannel() {
|
|
97
|
+
close({ mode: "discard" });
|
|
98
|
+
}
|
|
99
|
+
const channel = {
|
|
100
|
+
[Symbol.asyncIterator]() {
|
|
101
|
+
return channel;
|
|
102
|
+
},
|
|
103
|
+
offer(value) {
|
|
104
|
+
offered += 1;
|
|
105
|
+
if (state !== "open") {
|
|
106
|
+
refused += 1;
|
|
107
|
+
return { outcome: "refused", reason: "not-open" };
|
|
108
|
+
}
|
|
109
|
+
const bytes = config.sizeOf(value);
|
|
110
|
+
if (!Number.isSafeInteger(bytes) || bytes < 0) {
|
|
111
|
+
throw new TypeError("Bounded channel sizeOf() must return a non-negative safe integer");
|
|
112
|
+
}
|
|
113
|
+
if (bytes > maxBytes) {
|
|
114
|
+
refused += 1;
|
|
115
|
+
return { outcome: "refused", reason: "item-too-large" };
|
|
116
|
+
}
|
|
117
|
+
const reader = waiting;
|
|
118
|
+
if (reader) {
|
|
119
|
+
waiting = undefined;
|
|
120
|
+
delivered += 1;
|
|
121
|
+
reader.resolve({ done: false, value });
|
|
122
|
+
return { outcome: "delivered" };
|
|
123
|
+
}
|
|
124
|
+
if (policy === "latest" && queue.length > 0) {
|
|
125
|
+
const previous = queue[0];
|
|
126
|
+
if (!previous)
|
|
127
|
+
throw new Error("Bounded latest channel lost its pending value");
|
|
128
|
+
queue[0] = { value, bytes };
|
|
129
|
+
queuedBytes += bytes - previous.bytes;
|
|
130
|
+
coalesced += 1;
|
|
131
|
+
return { outcome: "coalesced", replaced: 1 };
|
|
132
|
+
}
|
|
133
|
+
if (queue.length >= maxItems) {
|
|
134
|
+
refused += 1;
|
|
135
|
+
return { outcome: "refused", reason: "item-capacity" };
|
|
136
|
+
}
|
|
137
|
+
if (queuedBytes + bytes > maxBytes) {
|
|
138
|
+
refused += 1;
|
|
139
|
+
return { outcome: "refused", reason: "byte-capacity" };
|
|
140
|
+
}
|
|
141
|
+
queue.push({ value, bytes });
|
|
142
|
+
queuedBytes += bytes;
|
|
143
|
+
queued += 1;
|
|
144
|
+
return { outcome: "queued" };
|
|
145
|
+
},
|
|
146
|
+
next() {
|
|
147
|
+
if (hasFailure)
|
|
148
|
+
return Promise.reject(failure);
|
|
149
|
+
const next = queue.shift();
|
|
150
|
+
if (next) {
|
|
151
|
+
queuedBytes -= next.bytes;
|
|
152
|
+
delivered += 1;
|
|
153
|
+
settleClosed();
|
|
154
|
+
return Promise.resolve({ done: false, value: next.value });
|
|
155
|
+
}
|
|
156
|
+
if (state === "closed" || state === "draining") {
|
|
157
|
+
settleClosed();
|
|
158
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
159
|
+
}
|
|
160
|
+
if (waiting)
|
|
161
|
+
return Promise.reject(new BoundedChannelReaderError);
|
|
162
|
+
return new Promise((resolve, reject) => {
|
|
163
|
+
waiting = { resolve, reject };
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
return() {
|
|
167
|
+
close({ mode: "discard" });
|
|
168
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
169
|
+
},
|
|
170
|
+
throw(error) {
|
|
171
|
+
channel.fail(error);
|
|
172
|
+
return Promise.reject(error);
|
|
173
|
+
},
|
|
174
|
+
close,
|
|
175
|
+
fail(error) {
|
|
176
|
+
if (state === "closed" || state === "failed")
|
|
177
|
+
return snapshot();
|
|
178
|
+
failure = error;
|
|
179
|
+
hasFailure = true;
|
|
180
|
+
state = "failed";
|
|
181
|
+
clearQueue();
|
|
182
|
+
removeAbortListener();
|
|
183
|
+
const reader = waiting;
|
|
184
|
+
waiting = undefined;
|
|
185
|
+
reader?.reject(error);
|
|
186
|
+
return snapshot();
|
|
187
|
+
},
|
|
188
|
+
getSnapshot: snapshot
|
|
189
|
+
};
|
|
190
|
+
if (config.signal?.aborted)
|
|
191
|
+
abortChannel();
|
|
192
|
+
else
|
|
193
|
+
config.signal?.addEventListener("abort", abortChannel, { once: true });
|
|
194
|
+
return channel;
|
|
195
|
+
}
|
|
196
|
+
var CreditWindowSnapshotSchema = z.object({
|
|
197
|
+
state: z.enum(["open", "closed"]),
|
|
198
|
+
capacityBytes: PositiveSafeIntegerSchema,
|
|
199
|
+
availableBytes: z.number().int().nonnegative(),
|
|
200
|
+
leasedBytes: z.number().int().nonnegative(),
|
|
201
|
+
acquired: z.number().int().nonnegative(),
|
|
202
|
+
refused: z.number().int().nonnegative(),
|
|
203
|
+
replenishedBytes: z.number().int().nonnegative()
|
|
204
|
+
}).strict().readonly();
|
|
205
|
+
function createCreditWindow(config) {
|
|
206
|
+
const capacityBytes = PositiveSafeIntegerSchema.parse(config.capacityBytes);
|
|
207
|
+
let availableBytes = capacityBytes;
|
|
208
|
+
let state = "open";
|
|
209
|
+
let acquired = 0;
|
|
210
|
+
let refused = 0;
|
|
211
|
+
let replenishedBytes = 0;
|
|
212
|
+
const snapshot = () => CreditWindowSnapshotSchema.parse({
|
|
213
|
+
state,
|
|
214
|
+
capacityBytes,
|
|
215
|
+
availableBytes,
|
|
216
|
+
leasedBytes: capacityBytes - availableBytes,
|
|
217
|
+
acquired,
|
|
218
|
+
refused,
|
|
219
|
+
replenishedBytes
|
|
220
|
+
});
|
|
221
|
+
return {
|
|
222
|
+
acquire(bytes) {
|
|
223
|
+
const requested = PositiveSafeIntegerSchema.parse(bytes);
|
|
224
|
+
if (state === "closed") {
|
|
225
|
+
refused += 1;
|
|
226
|
+
return { outcome: "refused", reason: "closed" };
|
|
227
|
+
}
|
|
228
|
+
if (requested > capacityBytes) {
|
|
229
|
+
refused += 1;
|
|
230
|
+
return { outcome: "refused", reason: "larger-than-window" };
|
|
231
|
+
}
|
|
232
|
+
if (requested > availableBytes) {
|
|
233
|
+
refused += 1;
|
|
234
|
+
return { outcome: "refused", reason: "insufficient-credit" };
|
|
235
|
+
}
|
|
236
|
+
availableBytes -= requested;
|
|
237
|
+
acquired += 1;
|
|
238
|
+
let leaseReleased = false;
|
|
239
|
+
const lease = {
|
|
240
|
+
bytes: requested,
|
|
241
|
+
get released() {
|
|
242
|
+
return leaseReleased;
|
|
243
|
+
},
|
|
244
|
+
release() {
|
|
245
|
+
if (leaseReleased)
|
|
246
|
+
return;
|
|
247
|
+
leaseReleased = true;
|
|
248
|
+
availableBytes += requested;
|
|
249
|
+
replenishedBytes += requested;
|
|
250
|
+
if (availableBytes > capacityBytes) {
|
|
251
|
+
throw new Error("Credit window accounting exceeded its capacity");
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
return { outcome: "leased", lease };
|
|
256
|
+
},
|
|
257
|
+
close() {
|
|
258
|
+
state = "closed";
|
|
259
|
+
return snapshot();
|
|
260
|
+
},
|
|
261
|
+
getSnapshot: snapshot
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// src/application/latest-sink.ts
|
|
266
|
+
import { z as z2 } from "zod";
|
|
267
|
+
var SnapshotRevisionSchema = z2.number().int().nonnegative();
|
|
268
|
+
var ApplicationSnapshotSinkStatusSchema = z2.object({
|
|
269
|
+
accepting: z2.boolean(),
|
|
270
|
+
received: z2.number().int().nonnegative(),
|
|
271
|
+
accepted: z2.number().int().nonnegative(),
|
|
272
|
+
rejected: z2.number().int().nonnegative(),
|
|
273
|
+
delivered: z2.number().int().nonnegative(),
|
|
274
|
+
coalesced: z2.number().int().nonnegative(),
|
|
275
|
+
failed: z2.number().int().nonnegative(),
|
|
276
|
+
inFlight: z2.boolean(),
|
|
277
|
+
pending: z2.boolean(),
|
|
18
278
|
lastAcceptedRevision: SnapshotRevisionSchema.optional(),
|
|
19
279
|
lastDeliveredRevision: SnapshotRevisionSchema.optional()
|
|
20
280
|
}).strict().readonly();
|
|
@@ -29,9 +289,14 @@ function createApplicationSnapshotSink(config) {
|
|
|
29
289
|
let lastAcceptedRevision;
|
|
30
290
|
let lastDeliveredRevision;
|
|
31
291
|
let inFlight;
|
|
32
|
-
let pending;
|
|
33
292
|
let closePromise;
|
|
34
293
|
let resolveClose;
|
|
294
|
+
const pending = createBoundedChannel({
|
|
295
|
+
policy: "latest",
|
|
296
|
+
maxItems: 1,
|
|
297
|
+
maxBytes: 1,
|
|
298
|
+
sizeOf: () => 1
|
|
299
|
+
});
|
|
35
300
|
const getStatus = () => ApplicationSnapshotSinkStatusSchema.parse({
|
|
36
301
|
accepting,
|
|
37
302
|
received,
|
|
@@ -41,7 +306,7 @@ function createApplicationSnapshotSink(config) {
|
|
|
41
306
|
coalesced,
|
|
42
307
|
failed,
|
|
43
308
|
inFlight: inFlight !== undefined,
|
|
44
|
-
pending: pending
|
|
309
|
+
pending: pending.getSnapshot().queuedItems > 0,
|
|
45
310
|
...lastAcceptedRevision !== undefined && { lastAcceptedRevision },
|
|
46
311
|
...lastDeliveredRevision !== undefined && { lastDeliveredRevision }
|
|
47
312
|
});
|
|
@@ -53,7 +318,7 @@ function createApplicationSnapshotSink(config) {
|
|
|
53
318
|
});
|
|
54
319
|
};
|
|
55
320
|
const settleCloseIfIdle = () => {
|
|
56
|
-
if (accepting || inFlight || pending || !resolveClose)
|
|
321
|
+
if (accepting || inFlight || pending.getSnapshot().queuedItems > 0 || !resolveClose)
|
|
57
322
|
return;
|
|
58
323
|
const resolve = resolveClose;
|
|
59
324
|
resolveClose = undefined;
|
|
@@ -67,13 +332,19 @@ function createApplicationSnapshotSink(config) {
|
|
|
67
332
|
failed += 1;
|
|
68
333
|
reportFailure(error, snapshot);
|
|
69
334
|
}).finally(() => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
335
|
+
if (pending.getSnapshot().queuedItems > 0) {
|
|
336
|
+
pending.next().then((next) => {
|
|
337
|
+
if (next.done) {
|
|
338
|
+
inFlight = undefined;
|
|
339
|
+
settleCloseIfIdle();
|
|
340
|
+
} else {
|
|
341
|
+
startWrite(next.value);
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
} else {
|
|
345
|
+
inFlight = undefined;
|
|
76
346
|
settleCloseIfIdle();
|
|
347
|
+
}
|
|
77
348
|
});
|
|
78
349
|
inFlight = write;
|
|
79
350
|
};
|
|
@@ -90,9 +361,9 @@ function createApplicationSnapshotSink(config) {
|
|
|
90
361
|
if (!inFlight) {
|
|
91
362
|
startWrite(snapshot);
|
|
92
363
|
} else {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
364
|
+
const offered = pending.offer(snapshot);
|
|
365
|
+
if (offered.outcome === "coalesced")
|
|
366
|
+
coalesced += offered.replaced;
|
|
96
367
|
}
|
|
97
368
|
return true;
|
|
98
369
|
},
|
|
@@ -101,6 +372,7 @@ function createApplicationSnapshotSink(config) {
|
|
|
101
372
|
if (closePromise)
|
|
102
373
|
return closePromise;
|
|
103
374
|
accepting = false;
|
|
375
|
+
pending.close({ mode: "drain" });
|
|
104
376
|
closePromise = new Promise((resolve) => {
|
|
105
377
|
resolveClose = resolve;
|
|
106
378
|
settleCloseIfIdle();
|
|
@@ -111,34 +383,34 @@ function createApplicationSnapshotSink(config) {
|
|
|
111
383
|
}
|
|
112
384
|
|
|
113
385
|
// src/application/activity.ts
|
|
114
|
-
import { z as
|
|
115
|
-
var BoundedOperationalIdSchema =
|
|
116
|
-
var NonNegativeIntegerSchema =
|
|
386
|
+
import { z as z3 } from "zod";
|
|
387
|
+
var BoundedOperationalIdSchema = z3.string().min(1).max(64).regex(/^[a-zA-Z0-9][a-zA-Z0-9._:-]*$/);
|
|
388
|
+
var NonNegativeIntegerSchema = z3.number().int().nonnegative();
|
|
117
389
|
var ActivityIdSchema = BoundedOperationalIdSchema;
|
|
118
390
|
var ActivityStageIdSchema = BoundedOperationalIdSchema;
|
|
119
|
-
var ActivityStageSnapshotSchema =
|
|
391
|
+
var ActivityStageSnapshotSchema = z3.object({
|
|
120
392
|
id: ActivityStageIdSchema,
|
|
121
393
|
active: NonNegativeIntegerSchema,
|
|
122
394
|
queued: NonNegativeIntegerSchema,
|
|
123
395
|
completed: NonNegativeIntegerSchema,
|
|
124
396
|
failed: NonNegativeIntegerSchema
|
|
125
397
|
}).strict().readonly();
|
|
126
|
-
var ActivityTotalsSchema =
|
|
398
|
+
var ActivityTotalsSchema = z3.object({
|
|
127
399
|
active: NonNegativeIntegerSchema,
|
|
128
400
|
queued: NonNegativeIntegerSchema,
|
|
129
401
|
completed: NonNegativeIntegerSchema,
|
|
130
402
|
failed: NonNegativeIntegerSchema
|
|
131
403
|
}).strict().readonly();
|
|
132
|
-
var ActivitySnapshotSchema =
|
|
404
|
+
var ActivitySnapshotSchema = z3.object({
|
|
133
405
|
id: ActivityIdSchema,
|
|
134
|
-
epoch:
|
|
406
|
+
epoch: z3.string().uuid(),
|
|
135
407
|
revision: NonNegativeIntegerSchema,
|
|
136
|
-
capturedAt:
|
|
137
|
-
changedAt:
|
|
138
|
-
stages:
|
|
408
|
+
capturedAt: z3.string().datetime({ offset: true }),
|
|
409
|
+
changedAt: z3.string().datetime({ offset: true }),
|
|
410
|
+
stages: z3.array(ActivityStageSnapshotSchema).min(1).max(64).readonly(),
|
|
139
411
|
totals: ActivityTotalsSchema
|
|
140
412
|
}).strict().readonly();
|
|
141
|
-
var ActivityLiveStateSchema =
|
|
413
|
+
var ActivityLiveStateSchema = z3.enum(["active", "queued"]);
|
|
142
414
|
var ActivityTokenBrand = Symbol("stitchkit.application.activity");
|
|
143
415
|
function emptyCounters() {
|
|
144
416
|
return { active: 0, queued: 0, completed: 0, failed: 0 };
|
|
@@ -153,12 +425,12 @@ function totalsOf(stages) {
|
|
|
153
425
|
}
|
|
154
426
|
function createActivityProjection(config) {
|
|
155
427
|
const id = ActivityIdSchema.parse(config.id);
|
|
156
|
-
const declaredStages =
|
|
428
|
+
const declaredStages = z3.array(ActivityStageIdSchema).min(1).max(64).parse(config.stages);
|
|
157
429
|
const uniqueStages = new Set(declaredStages);
|
|
158
430
|
if (uniqueStages.size !== declaredStages.length) {
|
|
159
431
|
throw new Error("[stitchkit] createActivityProjection: stage ids must be unique");
|
|
160
432
|
}
|
|
161
|
-
const epoch =
|
|
433
|
+
const epoch = z3.string().uuid().parse(config.epoch ?? crypto.randomUUID());
|
|
162
434
|
const now = config.now ?? (() => new Date);
|
|
163
435
|
const counters = new Map(declaredStages.map((stage) => [stage, emptyCounters()]));
|
|
164
436
|
const activities = new WeakMap;
|
|
@@ -263,42 +535,42 @@ function createActivityProjection(config) {
|
|
|
263
535
|
}
|
|
264
536
|
|
|
265
537
|
// src/application/schedule.ts
|
|
266
|
-
import { z as
|
|
267
|
-
var NonNegativeSafeIntegerSchema =
|
|
268
|
-
var
|
|
269
|
-
var ManagedScheduleOverlapSchema =
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
mode:
|
|
274
|
-
maxConcurrent:
|
|
538
|
+
import { z as z4 } from "zod";
|
|
539
|
+
var NonNegativeSafeIntegerSchema = z4.number().int().nonnegative().refine(Number.isSafeInteger, "Expected a safe integer");
|
|
540
|
+
var PositiveSafeIntegerSchema2 = NonNegativeSafeIntegerSchema.refine((value) => value > 0, "Expected a positive integer");
|
|
541
|
+
var ManagedScheduleOverlapSchema = z4.discriminatedUnion("mode", [
|
|
542
|
+
z4.object({ mode: z4.literal("skip") }).readonly(),
|
|
543
|
+
z4.object({ mode: z4.literal("queue-one") }).readonly(),
|
|
544
|
+
z4.object({
|
|
545
|
+
mode: z4.literal("parallel"),
|
|
546
|
+
maxConcurrent: PositiveSafeIntegerSchema2
|
|
275
547
|
}).readonly()
|
|
276
548
|
]);
|
|
277
|
-
var ManagedScheduleErrorPolicySchema =
|
|
278
|
-
var ManagedScheduleDescriptorSchema =
|
|
549
|
+
var ManagedScheduleErrorPolicySchema = z4.enum(["continue", "stop-schedule"]);
|
|
550
|
+
var ManagedScheduleDescriptorSchema = z4.object({
|
|
279
551
|
id: ApplicationIdSchema,
|
|
280
|
-
everyMs:
|
|
552
|
+
everyMs: PositiveSafeIntegerSchema2,
|
|
281
553
|
startAfterMs: NonNegativeSafeIntegerSchema,
|
|
282
554
|
overlap: ManagedScheduleOverlapSchema,
|
|
283
555
|
errorPolicy: ManagedScheduleErrorPolicySchema
|
|
284
556
|
}).readonly();
|
|
285
|
-
var ManagedScheduleStatusSchema =
|
|
557
|
+
var ManagedScheduleStatusSchema = z4.object({
|
|
286
558
|
descriptor: ManagedScheduleDescriptorSchema,
|
|
287
|
-
state:
|
|
559
|
+
state: z4.enum(["inactive", "scheduled", "running", "draining", "stopped"]),
|
|
288
560
|
revision: NonNegativeSafeIntegerSchema,
|
|
289
|
-
capturedAt:
|
|
290
|
-
changedAt:
|
|
291
|
-
accepting:
|
|
561
|
+
capturedAt: z4.string().datetime({ offset: true }),
|
|
562
|
+
changedAt: z4.string().datetime({ offset: true }),
|
|
563
|
+
accepting: z4.boolean(),
|
|
292
564
|
active: NonNegativeSafeIntegerSchema,
|
|
293
|
-
queued:
|
|
565
|
+
queued: z4.boolean(),
|
|
294
566
|
runsStarted: NonNegativeSafeIntegerSchema,
|
|
295
567
|
runsCompleted: NonNegativeSafeIntegerSchema,
|
|
296
568
|
runsFailed: NonNegativeSafeIntegerSchema,
|
|
297
569
|
ticksSkipped: NonNegativeSafeIntegerSchema,
|
|
298
|
-
nextRunAt:
|
|
299
|
-
lastScheduledAt:
|
|
300
|
-
lastStartedAt:
|
|
301
|
-
lastFinishedAt:
|
|
570
|
+
nextRunAt: z4.string().datetime({ offset: true }).nullable(),
|
|
571
|
+
lastScheduledAt: z4.string().datetime({ offset: true }).nullable(),
|
|
572
|
+
lastStartedAt: z4.string().datetime({ offset: true }).nullable(),
|
|
573
|
+
lastFinishedAt: z4.string().datetime({ offset: true }).nullable()
|
|
302
574
|
}).readonly();
|
|
303
575
|
var systemClock = {
|
|
304
576
|
now: () => performance.now(),
|
|
@@ -557,4 +829,4 @@ function createManagedSchedule(config) {
|
|
|
557
829
|
};
|
|
558
830
|
}
|
|
559
831
|
|
|
560
|
-
export { ApplicationSnapshotSinkStatusSchema, createApplicationSnapshotSink, ActivityIdSchema, ActivityStageIdSchema, ActivityStageSnapshotSchema, ActivitySnapshotSchema, ActivityLiveStateSchema, ActivityTokenBrand, createActivityProjection, ManagedScheduleOverlapSchema, ManagedScheduleErrorPolicySchema, ManagedScheduleDescriptorSchema, ManagedScheduleStatusSchema, createManagedSchedule };
|
|
832
|
+
export { BoundedChannelPolicySchema, BoundedChannelStateSchema, BoundedChannelSnapshotSchema, BoundedChannelReaderError, createBoundedChannel, CreditWindowSnapshotSchema, createCreditWindow, ApplicationSnapshotSinkStatusSchema, createApplicationSnapshotSink, ActivityIdSchema, ActivityStageIdSchema, ActivityStageSnapshotSchema, ActivitySnapshotSchema, ActivityLiveStateSchema, ActivityTokenBrand, createActivityProjection, ManagedScheduleOverlapSchema, ManagedScheduleErrorPolicySchema, ManagedScheduleDescriptorSchema, ManagedScheduleStatusSchema, createManagedSchedule };
|