@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.
- package/dist/commonjs/v3/apiClient/runStream.d.ts +3 -0
- package/dist/commonjs/v3/apiClient/runStream.js +1 -0
- package/dist/commonjs/v3/apiClient/runStream.js.map +1 -1
- package/dist/commonjs/v3/apiClient/runStream.test.js +1 -0
- package/dist/commonjs/v3/apiClient/runStream.test.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.d.ts +64 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.js +179 -12
- package/dist/commonjs/v3/isomorphic/friendlyId.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.test.js +283 -1
- package/dist/commonjs/v3/isomorphic/friendlyId.test.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/index.d.ts +1 -0
- package/dist/commonjs/v3/isomorphic/index.js +1 -0
- package/dist/commonjs/v3/isomorphic/index.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/runOpsResidency.d.ts +21 -7
- package/dist/commonjs/v3/isomorphic/runOpsResidency.js +23 -7
- package/dist/commonjs/v3/isomorphic/runOpsResidency.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js +85 -2
- package/dist/commonjs/v3/isomorphic/runOpsResidency.test.js.map +1 -1
- package/dist/commonjs/v3/isomorphic/waitpointMint.d.ts +9 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.js +22 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.js.map +1 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.test.d.ts +1 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.test.js +97 -0
- package/dist/commonjs/v3/isomorphic/waitpointMint.test.js.map +1 -0
- package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +54 -54
- package/dist/commonjs/v3/schemas/api.d.ts +45 -3
- package/dist/commonjs/v3/schemas/api.js +18 -5
- package/dist/commonjs/v3/schemas/api.js.map +1 -1
- package/dist/commonjs/v3/session-streams-api.d.ts +1 -0
- package/dist/commonjs/v3/session-streams-api.js +1 -0
- package/dist/commonjs/v3/session-streams-api.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/index.d.ts +9 -1
- package/dist/commonjs/v3/sessionStreams/index.js +38 -0
- package/dist/commonjs/v3/sessionStreams/index.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/manager.d.ts +27 -2
- package/dist/commonjs/v3/sessionStreams/manager.js +202 -108
- package/dist/commonjs/v3/sessionStreams/manager.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/manager.test.js +253 -0
- package/dist/commonjs/v3/sessionStreams/manager.test.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/noopManager.d.ts +9 -1
- package/dist/commonjs/v3/sessionStreams/noopManager.js +18 -0
- package/dist/commonjs/v3/sessionStreams/noopManager.js.map +1 -1
- package/dist/commonjs/v3/sessionStreams/router.d.ts +241 -0
- package/dist/commonjs/v3/sessionStreams/router.js +402 -0
- package/dist/commonjs/v3/sessionStreams/router.js.map +1 -0
- package/dist/commonjs/v3/sessionStreams/router.test.d.ts +1 -0
- package/dist/commonjs/v3/sessionStreams/router.test.js +463 -0
- package/dist/commonjs/v3/sessionStreams/router.test.js.map +1 -0
- package/dist/commonjs/v3/sessionStreams/types.d.ts +42 -6
- package/dist/commonjs/v3/sessionStreams/wireProtocol.d.ts +11 -0
- package/dist/commonjs/v3/sessionStreams/wireProtocol.js +12 -1
- package/dist/commonjs/v3/sessionStreams/wireProtocol.js.map +1 -1
- package/dist/commonjs/v3/test/mock-task-context.d.ts +4 -1
- package/dist/commonjs/v3/test/mock-task-context.js +2 -2
- package/dist/commonjs/v3/test/mock-task-context.js.map +1 -1
- package/dist/commonjs/v3/test/session-waitpoint-backend.js +17 -3
- package/dist/commonjs/v3/test/session-waitpoint-backend.js.map +1 -1
- package/dist/commonjs/v3/test/test-session-stream-manager.d.ts +13 -2
- package/dist/commonjs/v3/test/test-session-stream-manager.js +173 -67
- package/dist/commonjs/v3/test/test-session-stream-manager.js.map +1 -1
- package/dist/commonjs/v3/utils/globals.js +5 -1
- package/dist/commonjs/v3/utils/globals.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/apiClient/runStream.d.ts +3 -0
- package/dist/esm/v3/apiClient/runStream.js +1 -0
- package/dist/esm/v3/apiClient/runStream.js.map +1 -1
- package/dist/esm/v3/apiClient/runStream.test.js +1 -0
- package/dist/esm/v3/apiClient/runStream.test.js.map +1 -1
- package/dist/esm/v3/isomorphic/friendlyId.d.ts +64 -1
- package/dist/esm/v3/isomorphic/friendlyId.js +170 -11
- package/dist/esm/v3/isomorphic/friendlyId.js.map +1 -1
- package/dist/esm/v3/isomorphic/friendlyId.test.js +284 -2
- package/dist/esm/v3/isomorphic/friendlyId.test.js.map +1 -1
- package/dist/esm/v3/isomorphic/index.d.ts +1 -0
- package/dist/esm/v3/isomorphic/index.js +1 -0
- package/dist/esm/v3/isomorphic/index.js.map +1 -1
- package/dist/esm/v3/isomorphic/runOpsResidency.d.ts +21 -7
- package/dist/esm/v3/isomorphic/runOpsResidency.js +23 -8
- package/dist/esm/v3/isomorphic/runOpsResidency.js.map +1 -1
- package/dist/esm/v3/isomorphic/runOpsResidency.test.js +87 -4
- package/dist/esm/v3/isomorphic/runOpsResidency.test.js.map +1 -1
- package/dist/esm/v3/isomorphic/waitpointMint.d.ts +9 -0
- package/dist/esm/v3/isomorphic/waitpointMint.js +18 -0
- package/dist/esm/v3/isomorphic/waitpointMint.js.map +1 -0
- package/dist/esm/v3/isomorphic/waitpointMint.test.d.ts +1 -0
- package/dist/esm/v3/isomorphic/waitpointMint.test.js +95 -0
- package/dist/esm/v3/isomorphic/waitpointMint.test.js.map +1 -0
- package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +54 -54
- package/dist/esm/v3/schemas/api.d.ts +45 -3
- package/dist/esm/v3/schemas/api.js +15 -2
- package/dist/esm/v3/schemas/api.js.map +1 -1
- package/dist/esm/v3/session-streams-api.d.ts +1 -0
- package/dist/esm/v3/session-streams-api.js +1 -0
- package/dist/esm/v3/session-streams-api.js.map +1 -1
- package/dist/esm/v3/sessionStreams/index.d.ts +9 -1
- package/dist/esm/v3/sessionStreams/index.js +38 -0
- package/dist/esm/v3/sessionStreams/index.js.map +1 -1
- package/dist/esm/v3/sessionStreams/manager.d.ts +27 -2
- package/dist/esm/v3/sessionStreams/manager.js +202 -108
- package/dist/esm/v3/sessionStreams/manager.js.map +1 -1
- package/dist/esm/v3/sessionStreams/manager.test.js +253 -0
- package/dist/esm/v3/sessionStreams/manager.test.js.map +1 -1
- package/dist/esm/v3/sessionStreams/noopManager.d.ts +9 -1
- package/dist/esm/v3/sessionStreams/noopManager.js +18 -0
- package/dist/esm/v3/sessionStreams/noopManager.js.map +1 -1
- package/dist/esm/v3/sessionStreams/router.d.ts +241 -0
- package/dist/esm/v3/sessionStreams/router.js +398 -0
- package/dist/esm/v3/sessionStreams/router.js.map +1 -0
- package/dist/esm/v3/sessionStreams/router.test.d.ts +1 -0
- package/dist/esm/v3/sessionStreams/router.test.js +461 -0
- package/dist/esm/v3/sessionStreams/router.test.js.map +1 -0
- package/dist/esm/v3/sessionStreams/types.d.ts +42 -6
- package/dist/esm/v3/sessionStreams/wireProtocol.d.ts +11 -0
- package/dist/esm/v3/sessionStreams/wireProtocol.js +11 -0
- package/dist/esm/v3/sessionStreams/wireProtocol.js.map +1 -1
- package/dist/esm/v3/test/mock-task-context.d.ts +4 -1
- package/dist/esm/v3/test/mock-task-context.js +2 -2
- package/dist/esm/v3/test/mock-task-context.js.map +1 -1
- package/dist/esm/v3/test/session-waitpoint-backend.js +17 -3
- package/dist/esm/v3/test/session-waitpoint-backend.js.map +1 -1
- package/dist/esm/v3/test/test-session-stream-manager.d.ts +13 -2
- package/dist/esm/v3/test/test-session-stream-manager.js +173 -67
- package/dist/esm/v3/test/test-session-stream-manager.js.map +1 -1
- package/dist/esm/v3/utils/globals.js +5 -1
- package/dist/esm/v3/utils/globals.js.map +1 -1
- package/dist/esm/version.js +1 -1
- 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 {};
|