@trigger.dev/core 4.5.12 → 4.5.13

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.
Files changed (127) hide show
  1. package/dist/commonjs/v3/apiClient/runStream.d.ts +3 -0
  2. package/dist/commonjs/v3/apiClient/runStream.js +1 -0
  3. package/dist/commonjs/v3/apiClient/runStream.js.map +1 -1
  4. package/dist/commonjs/v3/apiClient/runStream.test.js +1 -0
  5. package/dist/commonjs/v3/apiClient/runStream.test.js.map +1 -1
  6. package/dist/commonjs/v3/isomorphic/friendlyId.d.ts +64 -1
  7. package/dist/commonjs/v3/isomorphic/friendlyId.js +179 -12
  8. package/dist/commonjs/v3/isomorphic/friendlyId.js.map +1 -1
  9. package/dist/commonjs/v3/isomorphic/friendlyId.test.js +283 -1
  10. package/dist/commonjs/v3/isomorphic/friendlyId.test.js.map +1 -1
  11. package/dist/commonjs/v3/isomorphic/index.d.ts +1 -0
  12. package/dist/commonjs/v3/isomorphic/index.js +1 -0
  13. package/dist/commonjs/v3/isomorphic/index.js.map +1 -1
  14. package/dist/commonjs/v3/isomorphic/runOpsResidency.d.ts +21 -7
  15. package/dist/commonjs/v3/isomorphic/runOpsResidency.js +23 -7
  16. package/dist/commonjs/v3/isomorphic/runOpsResidency.js.map +1 -1
  17. package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js +85 -2
  18. package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js.map +1 -1
  19. package/dist/commonjs/v3/isomorphic/waitpointMint.d.ts +9 -0
  20. package/dist/commonjs/v3/isomorphic/waitpointMint.js +22 -0
  21. package/dist/commonjs/v3/isomorphic/waitpointMint.js.map +1 -0
  22. package/dist/commonjs/v3/isomorphic/waitpointMint.test.d.ts +1 -0
  23. package/dist/commonjs/v3/isomorphic/waitpointMint.test.js +97 -0
  24. package/dist/commonjs/v3/isomorphic/waitpointMint.test.js.map +1 -0
  25. package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +54 -54
  26. package/dist/commonjs/v3/schemas/api.d.ts +45 -3
  27. package/dist/commonjs/v3/schemas/api.js +18 -5
  28. package/dist/commonjs/v3/schemas/api.js.map +1 -1
  29. package/dist/commonjs/v3/session-streams-api.d.ts +1 -0
  30. package/dist/commonjs/v3/session-streams-api.js +1 -0
  31. package/dist/commonjs/v3/session-streams-api.js.map +1 -1
  32. package/dist/commonjs/v3/sessionStreams/index.d.ts +9 -1
  33. package/dist/commonjs/v3/sessionStreams/index.js +38 -0
  34. package/dist/commonjs/v3/sessionStreams/index.js.map +1 -1
  35. package/dist/commonjs/v3/sessionStreams/manager.d.ts +27 -2
  36. package/dist/commonjs/v3/sessionStreams/manager.js +202 -108
  37. package/dist/commonjs/v3/sessionStreams/manager.js.map +1 -1
  38. package/dist/commonjs/v3/sessionStreams/manager.test.js +253 -0
  39. package/dist/commonjs/v3/sessionStreams/manager.test.js.map +1 -1
  40. package/dist/commonjs/v3/sessionStreams/noopManager.d.ts +9 -1
  41. package/dist/commonjs/v3/sessionStreams/noopManager.js +18 -0
  42. package/dist/commonjs/v3/sessionStreams/noopManager.js.map +1 -1
  43. package/dist/commonjs/v3/sessionStreams/router.d.ts +241 -0
  44. package/dist/commonjs/v3/sessionStreams/router.js +402 -0
  45. package/dist/commonjs/v3/sessionStreams/router.js.map +1 -0
  46. package/dist/commonjs/v3/sessionStreams/router.test.d.ts +1 -0
  47. package/dist/commonjs/v3/sessionStreams/router.test.js +463 -0
  48. package/dist/commonjs/v3/sessionStreams/router.test.js.map +1 -0
  49. package/dist/commonjs/v3/sessionStreams/types.d.ts +42 -6
  50. package/dist/commonjs/v3/sessionStreams/wireProtocol.d.ts +11 -0
  51. package/dist/commonjs/v3/sessionStreams/wireProtocol.js +12 -1
  52. package/dist/commonjs/v3/sessionStreams/wireProtocol.js.map +1 -1
  53. package/dist/commonjs/v3/test/mock-task-context.d.ts +4 -1
  54. package/dist/commonjs/v3/test/mock-task-context.js +2 -2
  55. package/dist/commonjs/v3/test/mock-task-context.js.map +1 -1
  56. package/dist/commonjs/v3/test/session-waitpoint-backend.js +17 -3
  57. package/dist/commonjs/v3/test/session-waitpoint-backend.js.map +1 -1
  58. package/dist/commonjs/v3/test/test-session-stream-manager.d.ts +13 -2
  59. package/dist/commonjs/v3/test/test-session-stream-manager.js +173 -67
  60. package/dist/commonjs/v3/test/test-session-stream-manager.js.map +1 -1
  61. package/dist/commonjs/v3/utils/globals.js +5 -1
  62. package/dist/commonjs/v3/utils/globals.js.map +1 -1
  63. package/dist/commonjs/version.js +1 -1
  64. package/dist/esm/v3/apiClient/runStream.d.ts +3 -0
  65. package/dist/esm/v3/apiClient/runStream.js +1 -0
  66. package/dist/esm/v3/apiClient/runStream.js.map +1 -1
  67. package/dist/esm/v3/apiClient/runStream.test.js +1 -0
  68. package/dist/esm/v3/apiClient/runStream.test.js.map +1 -1
  69. package/dist/esm/v3/isomorphic/friendlyId.d.ts +64 -1
  70. package/dist/esm/v3/isomorphic/friendlyId.js +170 -11
  71. package/dist/esm/v3/isomorphic/friendlyId.js.map +1 -1
  72. package/dist/esm/v3/isomorphic/friendlyId.test.js +284 -2
  73. package/dist/esm/v3/isomorphic/friendlyId.test.js.map +1 -1
  74. package/dist/esm/v3/isomorphic/index.d.ts +1 -0
  75. package/dist/esm/v3/isomorphic/index.js +1 -0
  76. package/dist/esm/v3/isomorphic/index.js.map +1 -1
  77. package/dist/esm/v3/isomorphic/runOpsResidency.d.ts +21 -7
  78. package/dist/esm/v3/isomorphic/runOpsResidency.js +23 -8
  79. package/dist/esm/v3/isomorphic/runOpsResidency.js.map +1 -1
  80. package/dist/esm/v3/isomorphic/runOpsResidency.test.js +87 -4
  81. package/dist/esm/v3/isomorphic/runOpsResidency.test.js.map +1 -1
  82. package/dist/esm/v3/isomorphic/waitpointMint.d.ts +9 -0
  83. package/dist/esm/v3/isomorphic/waitpointMint.js +18 -0
  84. package/dist/esm/v3/isomorphic/waitpointMint.js.map +1 -0
  85. package/dist/esm/v3/isomorphic/waitpointMint.test.d.ts +1 -0
  86. package/dist/esm/v3/isomorphic/waitpointMint.test.js +95 -0
  87. package/dist/esm/v3/isomorphic/waitpointMint.test.js.map +1 -0
  88. package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +54 -54
  89. package/dist/esm/v3/schemas/api.d.ts +45 -3
  90. package/dist/esm/v3/schemas/api.js +15 -2
  91. package/dist/esm/v3/schemas/api.js.map +1 -1
  92. package/dist/esm/v3/session-streams-api.d.ts +1 -0
  93. package/dist/esm/v3/session-streams-api.js +1 -0
  94. package/dist/esm/v3/session-streams-api.js.map +1 -1
  95. package/dist/esm/v3/sessionStreams/index.d.ts +9 -1
  96. package/dist/esm/v3/sessionStreams/index.js +38 -0
  97. package/dist/esm/v3/sessionStreams/index.js.map +1 -1
  98. package/dist/esm/v3/sessionStreams/manager.d.ts +27 -2
  99. package/dist/esm/v3/sessionStreams/manager.js +202 -108
  100. package/dist/esm/v3/sessionStreams/manager.js.map +1 -1
  101. package/dist/esm/v3/sessionStreams/manager.test.js +253 -0
  102. package/dist/esm/v3/sessionStreams/manager.test.js.map +1 -1
  103. package/dist/esm/v3/sessionStreams/noopManager.d.ts +9 -1
  104. package/dist/esm/v3/sessionStreams/noopManager.js +18 -0
  105. package/dist/esm/v3/sessionStreams/noopManager.js.map +1 -1
  106. package/dist/esm/v3/sessionStreams/router.d.ts +241 -0
  107. package/dist/esm/v3/sessionStreams/router.js +398 -0
  108. package/dist/esm/v3/sessionStreams/router.js.map +1 -0
  109. package/dist/esm/v3/sessionStreams/router.test.d.ts +1 -0
  110. package/dist/esm/v3/sessionStreams/router.test.js +461 -0
  111. package/dist/esm/v3/sessionStreams/router.test.js.map +1 -0
  112. package/dist/esm/v3/sessionStreams/types.d.ts +42 -6
  113. package/dist/esm/v3/sessionStreams/wireProtocol.d.ts +11 -0
  114. package/dist/esm/v3/sessionStreams/wireProtocol.js +11 -0
  115. package/dist/esm/v3/sessionStreams/wireProtocol.js.map +1 -1
  116. package/dist/esm/v3/test/mock-task-context.d.ts +4 -1
  117. package/dist/esm/v3/test/mock-task-context.js +2 -2
  118. package/dist/esm/v3/test/mock-task-context.js.map +1 -1
  119. package/dist/esm/v3/test/session-waitpoint-backend.js +17 -3
  120. package/dist/esm/v3/test/session-waitpoint-backend.js.map +1 -1
  121. package/dist/esm/v3/test/test-session-stream-manager.d.ts +13 -2
  122. package/dist/esm/v3/test/test-session-stream-manager.js +173 -67
  123. package/dist/esm/v3/test/test-session-stream-manager.js.map +1 -1
  124. package/dist/esm/v3/utils/globals.js +5 -1
  125. package/dist/esm/v3/utils/globals.js.map +1 -1
  126. package/dist/esm/version.js +1 -1
  127. package/package.json +1 -1
@@ -0,0 +1,398 @@
1
+ /**
2
+ * One route's live state: its queue of records nobody has taken yet, the
3
+ * consumers waiting for the next one, and any attached push handlers.
4
+ *
5
+ * An `at-arrival` route never fills `queue`; a route that is not `replayable`
6
+ * fills it but is skipped when the floor is computed.
7
+ */
8
+ class RouteState {
9
+ route;
10
+ queue = [];
11
+ waiters = [];
12
+ handlers = new Set();
13
+ observers = new Set();
14
+ constructor(route) {
15
+ this.route = route;
16
+ }
17
+ /**
18
+ * Lowest sequence a *later boot* would still have to recover. A route that
19
+ * is not replayable never holds anything back, however much it has queued.
20
+ */
21
+ earliestUnrecovered() {
22
+ if (!this.route.replayable)
23
+ return undefined;
24
+ return this.queue.length > 0 ? this.queue[0].seqNum : undefined;
25
+ }
26
+ }
27
+ /**
28
+ * Reads one session channel and gives every record exactly one destination.
29
+ *
30
+ * The channel carries records for several independent consumers whose delivery
31
+ * needs differ: a message must be delivered eventually and so can lag
32
+ * arbitrarily far behind the newest record, while a stop only means anything to
33
+ * the turn that is live when it lands. Tracking that with a single scalar
34
+ * cursor is not possible — the true state is always "control applied through
35
+ * X, message Y still owed" — so the router tracks it per route and derives the
36
+ * published numbers from route state:
37
+ *
38
+ * - the resume floor is held back only by records a later boot would still have
39
+ * to recover, which is exactly the queued records on replayable routes;
40
+ * - a record whose route has declared it not replayable is never re-applied
41
+ * after a resume, because the route said a later boot has no use for it;
42
+ * - a record with no route is terminal by classification, so it never enters a
43
+ * queue and cannot park at the head of one.
44
+ *
45
+ * Those three properties are what previously needed a cursor-barrier
46
+ * predicate, a drop predicate with a second published header, and a
47
+ * discard-the-unclaimed drain respectively.
48
+ */
49
+ export class SessionChannelRouter {
50
+ table;
51
+ #routes = new Map();
52
+ #kindToRoute = new Map();
53
+ #highestSeq;
54
+ #resumeFrom;
55
+ #appliedThrough;
56
+ #onDrop;
57
+ constructor(table, options) {
58
+ this.table = table;
59
+ for (const route of table.routes) {
60
+ if (this.#routes.has(route.name)) {
61
+ throw new Error(`Duplicate route name "${route.name}" in session route table`);
62
+ }
63
+ if (route.delivery === "at-arrival" && route.replayable) {
64
+ throw new Error(`Route "${route.name}" is at-arrival and replayable, which cannot both hold: a record discarded because nobody was listening cannot also be recovered later`);
65
+ }
66
+ this.#routes.set(route.name, new RouteState(route));
67
+ for (const kind of route.kinds) {
68
+ const existing = this.#kindToRoute.get(kind);
69
+ if (existing) {
70
+ throw new Error(`Kind "${kind}" is claimed by both "${existing}" and "${route.name}" in session route table`);
71
+ }
72
+ this.#kindToRoute.set(kind, route.name);
73
+ }
74
+ }
75
+ this.#onDrop = options?.onDrop;
76
+ }
77
+ /**
78
+ * Seed the router from a previous run's turn boundary.
79
+ *
80
+ * An absent `appliedThrough` falls back to the floor, which leaves anything
81
+ * above the floor treated as live. A caller resuming a boundary that predates
82
+ * the published replay window should resolve the window from the channel
83
+ * instead, so it covers everything already there at boot: a missed stop is
84
+ * recoverable, while a stop applied to the wrong turn kills a live answer.
85
+ */
86
+ restore(checkpoint) {
87
+ this.#resumeFrom = checkpoint.resumeFrom;
88
+ this.#appliedThrough = checkpoint.appliedThrough ?? checkpoint.resumeFrom;
89
+ if (this.#resumeFrom !== undefined) {
90
+ this.#highestSeq = this.#resumeFrom;
91
+ }
92
+ }
93
+ /** Where a boot should subscribe from: just past this sequence. */
94
+ resumeFrom() {
95
+ return this.#resumeFrom;
96
+ }
97
+ /**
98
+ * Classify one record and act on it. The record's destination is decided
99
+ * here, once, and never by whichever consumer happens to be waiting.
100
+ *
101
+ * Queued routes serve a waiting consumer before a push handler, so a handler
102
+ * can never take a record out from under a consumer that is actively awaiting
103
+ * one. A record handed straight to either never enters the queue, so it never
104
+ * holds the floor back.
105
+ */
106
+ ingest(record) {
107
+ if (Number.isFinite(record.seqNum)) {
108
+ if (this.#highestSeq === undefined || record.seqNum > this.#highestSeq) {
109
+ this.#highestSeq = record.seqNum;
110
+ }
111
+ }
112
+ const kind = this.#kindOf(record.data);
113
+ if (kind === undefined) {
114
+ return this.#drop(record, "malformed");
115
+ }
116
+ const routeName = this.#kindToRoute.get(kind);
117
+ const state = routeName ? this.#routes.get(routeName) : undefined;
118
+ if (!state || !routeName) {
119
+ return this.#drop(record, "unroutable");
120
+ }
121
+ if (!state.route.replayable &&
122
+ this.#appliedThrough !== undefined &&
123
+ record.seqNum <= this.#appliedThrough) {
124
+ return this.#drop(record, "replayed", routeName);
125
+ }
126
+ if (state.route.delivery === "at-arrival" &&
127
+ state.handlers.size === 0 &&
128
+ state.waiters.length === 0) {
129
+ return this.#drop(record, "no-handler", routeName);
130
+ }
131
+ for (const observer of state.observers) {
132
+ try {
133
+ observer(record);
134
+ }
135
+ catch {
136
+ void 0;
137
+ }
138
+ }
139
+ const waiter = state.waiters.shift();
140
+ if (waiter) {
141
+ if (waiter.timer)
142
+ clearTimeout(waiter.timer);
143
+ waiter.resolve(record);
144
+ return { action: "deliver", route: routeName };
145
+ }
146
+ if (state.handlers.size > 0) {
147
+ this.#invokeHandlers(state, record);
148
+ return { action: "deliver", route: routeName };
149
+ }
150
+ state.queue.push(record);
151
+ return { action: "queue", route: routeName };
152
+ }
153
+ #kindOf(data) {
154
+ try {
155
+ const kind = this.table.kindOf(data);
156
+ return typeof kind === "string" && kind.length > 0 ? kind : undefined;
157
+ }
158
+ catch {
159
+ return undefined;
160
+ }
161
+ }
162
+ #drop(record, reason, route) {
163
+ try {
164
+ this.#onDrop?.(record, reason, route);
165
+ }
166
+ catch {
167
+ void 0;
168
+ }
169
+ return { action: "drop", route, reason };
170
+ }
171
+ #invokeHandlers(state, record) {
172
+ for (const handler of state.handlers) {
173
+ try {
174
+ handler(record);
175
+ }
176
+ catch {
177
+ void 0;
178
+ }
179
+ }
180
+ }
181
+ /**
182
+ * The highest sequence that can be resumed past without losing anything.
183
+ *
184
+ * Held back below the earliest record still queued anywhere, because those
185
+ * are exactly the records a replay has to recover. Everything else the
186
+ * router has seen was terminally decided, so the floor is free to sit at the
187
+ * high water when every queue is empty.
188
+ */
189
+ resumeFloor() {
190
+ if (this.#highestSeq === undefined)
191
+ return undefined;
192
+ let earliestPending = Infinity;
193
+ for (const state of this.#routes.values()) {
194
+ const pending = state.earliestUnrecovered();
195
+ if (pending !== undefined)
196
+ earliestPending = Math.min(earliestPending, pending);
197
+ }
198
+ if (earliestPending === Infinity)
199
+ return this.#highestSeq;
200
+ const floor = Math.min(this.#highestSeq, earliestPending - 1);
201
+ return floor >= 0 ? floor : undefined;
202
+ }
203
+ /**
204
+ * The high water: highest sequence observed, never held back. Published as
205
+ * the end of the replay window so the next boot can tell a re-read
206
+ * `at-arrival` record from one arriving live.
207
+ */
208
+ appliedThrough() {
209
+ return this.#highestSeq;
210
+ }
211
+ /** Both published numbers for a turn boundary. */
212
+ checkpoint() {
213
+ return { resumeFrom: this.resumeFloor(), appliedThrough: this.appliedThrough() };
214
+ }
215
+ #stateOrThrow(name) {
216
+ const state = this.#routes.get(name);
217
+ if (!state)
218
+ throw new Error(`Unknown session route "${name}"`);
219
+ return state;
220
+ }
221
+ /**
222
+ * Attach a push handler. A `queued` route with a handler attached delivers
223
+ * straight to it instead of queueing; an `at-arrival` route discards records
224
+ * whenever no handler is attached.
225
+ *
226
+ * Attaching re-offers anything already queued, so a consumer that attaches
227
+ * after records have piled up still sees them in order.
228
+ */
229
+ on(name, handler) {
230
+ const state = this.#stateOrThrow(name);
231
+ state.handlers.add(handler);
232
+ if (state.queue.length > 0) {
233
+ const pending = state.queue.splice(0, state.queue.length);
234
+ for (const record of pending) {
235
+ try {
236
+ handler(record);
237
+ }
238
+ catch {
239
+ void 0;
240
+ }
241
+ }
242
+ }
243
+ return {
244
+ off: () => {
245
+ state.handlers.delete(handler);
246
+ },
247
+ };
248
+ }
249
+ /**
250
+ * Watch a route without consuming from it.
251
+ *
252
+ * Notification and consumption are separate concerns: an observer is told
253
+ * that a record arrived and the record still queues, so the resume floor
254
+ * stays held behind it until something actually takes it. A push handler
255
+ * registered with {@link on} is the opposite, and a record handed to one
256
+ * counts as terminally decided.
257
+ *
258
+ * Only meaningful on a replayable route. On an `at-arrival` route an observer
259
+ * would either have to count as a listener, which would stop an unconsumed
260
+ * record being discarded, or watch records it cannot affect, so it is
261
+ * rejected rather than given one of those two meanings.
262
+ *
263
+ * Records already queued are not re-offered: an observer reports arrivals
264
+ * from the moment it attaches, so re-offering would fire twice for a record
265
+ * that arrived before a later consumer attached.
266
+ */
267
+ observe(name, observer) {
268
+ const state = this.#stateOrThrow(name);
269
+ if (state.route.delivery === "at-arrival") {
270
+ throw new Error(`Route "${name}" is at-arrival, which cannot be observed: an observer must not decide whether a record is discarded, and cannot be offered one that already was`);
271
+ }
272
+ state.observers.add(observer);
273
+ return {
274
+ off: () => {
275
+ state.observers.delete(observer);
276
+ },
277
+ };
278
+ }
279
+ /**
280
+ * Remove one queued record, identified by sequence.
281
+ *
282
+ * For a consumer that decided to take a record it had only observed. Returns
283
+ * whether it was still queued, so a caller can tell a real take from a record
284
+ * something else had already consumed.
285
+ */
286
+ take(name, seqNum) {
287
+ const state = this.#stateOrThrow(name);
288
+ const index = state.queue.findIndex((record) => record.seqNum === seqNum);
289
+ if (index === -1)
290
+ return undefined;
291
+ return state.queue.splice(index, 1)[0];
292
+ }
293
+ /**
294
+ * Put a taken record back, in sequence order.
295
+ *
296
+ * For a consumer that claimed a record and then could not use it. Returning
297
+ * it leaves the route as though the claim never happened, so the record is
298
+ * delivered later and goes back to holding the resume floor. Without this a
299
+ * failed claim-then-use is indistinguishable from a delivery, and the record
300
+ * is lost.
301
+ */
302
+ untake(name, record) {
303
+ const state = this.#stateOrThrow(name);
304
+ if (state.queue.some((queued) => queued.seqNum === record.seqNum))
305
+ return;
306
+ const at = state.queue.findIndex((queued) => queued.seqNum > record.seqNum);
307
+ if (at === -1)
308
+ state.queue.push(record);
309
+ else
310
+ state.queue.splice(at, 0, record);
311
+ }
312
+ /** Whether an `at-arrival` route currently has anywhere to deliver. */
313
+ hasHandler(name) {
314
+ return this.#stateOrThrow(name).handlers.size > 0;
315
+ }
316
+ /**
317
+ * Take the next record on a route.
318
+ *
319
+ * `timeoutMs: 0` is a non-blocking take. Omitted means wait indefinitely.
320
+ * Resolves `undefined` on timeout. An `at-arrival` route delivers to a
321
+ * waiting caller when one is already parked here, which is what makes a pull
322
+ * consumer possible on such a route without weakening the discard rule.
323
+ */
324
+ next(name, options) {
325
+ const state = this.#stateOrThrow(name);
326
+ const queued = state.queue.shift();
327
+ if (queued)
328
+ return Promise.resolve(queued);
329
+ if (options?.timeoutMs === 0)
330
+ return Promise.resolve(undefined);
331
+ return new Promise((resolve) => {
332
+ const waiter = { resolve };
333
+ if (options?.timeoutMs !== undefined) {
334
+ waiter.timer = setTimeout(() => {
335
+ const index = state.waiters.indexOf(waiter);
336
+ if (index !== -1)
337
+ state.waiters.splice(index, 1);
338
+ resolve(undefined);
339
+ }, options.timeoutMs);
340
+ }
341
+ state.waiters.push(waiter);
342
+ });
343
+ }
344
+ /** Head of a route's queue without consuming it. */
345
+ peek(name) {
346
+ return this.#stateOrThrow(name).queue[0];
347
+ }
348
+ /**
349
+ * Whether a route has anything queued. Exact, because it reads that route's
350
+ * own queue rather than the head of a buffer shared with every other kind on
351
+ * the channel.
352
+ */
353
+ hasPending(name) {
354
+ return this.#stateOrThrow(name).queue.length > 0;
355
+ }
356
+ /** Number of records queued on a route. Diagnostic use. */
357
+ pendingCount(name) {
358
+ return this.#stateOrThrow(name).queue.length;
359
+ }
360
+ /**
361
+ * Discard whatever one route has queued and wake its waiters empty.
362
+ *
363
+ * Closes a consumer window: a route that is not replayable has nothing owed
364
+ * to a later boot, so once its window is over anything still queued on it is
365
+ * dead and must not sit at the head of the queue for the rest of the run.
366
+ */
367
+ clearRoute(name) {
368
+ const state = this.#stateOrThrow(name);
369
+ if (state.route.replayable) {
370
+ throw new Error(`Route "${name}" is replayable, so its queue cannot be cleared: anything queued on it is still owed to a later boot, and discarding it would lose records the resume floor is holding back`);
371
+ }
372
+ state.queue.length = 0;
373
+ for (const waiter of state.waiters) {
374
+ if (waiter.timer)
375
+ clearTimeout(waiter.timer);
376
+ waiter.resolve(undefined);
377
+ }
378
+ state.waiters.length = 0;
379
+ }
380
+ /** Drop every waiter and queue. Called between task executions. */
381
+ reset() {
382
+ for (const state of this.#routes.values()) {
383
+ state.queue.length = 0;
384
+ state.handlers.clear();
385
+ state.observers.clear();
386
+ for (const waiter of state.waiters) {
387
+ if (waiter.timer)
388
+ clearTimeout(waiter.timer);
389
+ waiter.resolve(undefined);
390
+ }
391
+ state.waiters.length = 0;
392
+ }
393
+ this.#highestSeq = undefined;
394
+ this.#resumeFrom = undefined;
395
+ this.#appliedThrough = undefined;
396
+ }
397
+ }
398
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/v3/sessionStreams/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};