@sentio/runtime 4.3.4-rc.1 → 4.3.5-rc.1
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/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{plugin-DnkcGTkw.d.ts → plugin-7YBR3bUA.d.ts} +2 -1
- package/dist/plugin-7YBR3bUA.d.ts.map +1 -0
- package/dist/processor-runner.js +1 -1
- package/dist/{service-v3-B5xtRpqz.js → service-v3-D6oVpUbL.js} +14 -1
- package/dist/{service-v3-B5xtRpqz.js.map → service-v3-D6oVpUbL.js.map} +1 -1
- package/package.json +1 -1
- package/src/db-context.ts +36 -0
- package/dist/plugin-DnkcGTkw.d.ts.map +0 -1
package/package.json
CHANGED
package/src/db-context.ts
CHANGED
|
@@ -61,6 +61,10 @@ export abstract class AbstractStoreContext implements IStoreContext {
|
|
|
61
61
|
>()
|
|
62
62
|
private statsInterval: NodeJS.Timeout | undefined
|
|
63
63
|
private pendings: Promise<unknown>[] = []
|
|
64
|
+
// Set once the process has finished and the context was closed. Guards
|
|
65
|
+
// against a lingering batch timer emitting after the final result (which
|
|
66
|
+
// would both lose the write and desync the reused processor stream).
|
|
67
|
+
private closed = false
|
|
64
68
|
|
|
65
69
|
constructor(readonly processId: number) {}
|
|
66
70
|
|
|
@@ -79,6 +83,12 @@ export abstract class AbstractStoreContext implements IStoreContext {
|
|
|
79
83
|
return this.sendUpsertInBatch(request.value as DBRequest_DBUpsert)
|
|
80
84
|
}
|
|
81
85
|
|
|
86
|
+
// Read-your-writes: any non-upsert op (get/list/delete) must observe the
|
|
87
|
+
// upserts issued before it. Flush the pending batch first so its dbRequest
|
|
88
|
+
// is sent ahead of this op on the same stream; the driver applies stream
|
|
89
|
+
// ops in arrival order, so the read/delete sees the buffered writes.
|
|
90
|
+
this.sendBatch()
|
|
91
|
+
|
|
82
92
|
const requestType = request.case as RequestType
|
|
83
93
|
const opId = StoreContext.opCounter++
|
|
84
94
|
const promise = this.newPromise<DBResponse>(opId, requestType)
|
|
@@ -160,6 +170,16 @@ export abstract class AbstractStoreContext implements IStoreContext {
|
|
|
160
170
|
}
|
|
161
171
|
|
|
162
172
|
close() {
|
|
173
|
+
this.closed = true
|
|
174
|
+
// Drop any un-flushed batch and cancel its timer so it can never emit
|
|
175
|
+
// after close. In the normal path awaitPendings() has already flushed it;
|
|
176
|
+
// reaching here with a pending batch means the process ended without
|
|
177
|
+
// awaiting the write (e.g. a handler error), so emitting it now would be
|
|
178
|
+
// both too late (lost from this checkpoint) and stream-corrupting.
|
|
179
|
+
if (this.upsertBatch) {
|
|
180
|
+
clearTimeout(this.upsertBatch.timer)
|
|
181
|
+
this.upsertBatch = undefined
|
|
182
|
+
}
|
|
163
183
|
for (const [opId, defer] of this.defers) {
|
|
164
184
|
// console.warn('context closed before db response', opId)
|
|
165
185
|
defer.reject(new Error('context closed before db response, processId: ' + this.processId + ' opId: ' + opId))
|
|
@@ -221,6 +241,11 @@ export abstract class AbstractStoreContext implements IStoreContext {
|
|
|
221
241
|
}
|
|
222
242
|
|
|
223
243
|
private sendBatch() {
|
|
244
|
+
// Never emit once the context is closed: the process already sent its
|
|
245
|
+
// final result and the stream may have been handed to another process.
|
|
246
|
+
if (this.closed) {
|
|
247
|
+
return
|
|
248
|
+
}
|
|
224
249
|
if (this.upsertBatch) {
|
|
225
250
|
const { request, opId, timer } = this.upsertBatch
|
|
226
251
|
// console.debug('sending batch upsert', opId, 'batch size', request?.entity.length)
|
|
@@ -242,6 +267,17 @@ export abstract class AbstractStoreContext implements IStoreContext {
|
|
|
242
267
|
}
|
|
243
268
|
|
|
244
269
|
async awaitPendings() {
|
|
270
|
+
// Flush any buffered upsert batch and wait for its ack before returning.
|
|
271
|
+
// Callers use this to guarantee every write has been sent AND applied by
|
|
272
|
+
// the driver before the process emits its final result. Without it the
|
|
273
|
+
// batch's setTimeout could fire after the result — losing the write and
|
|
274
|
+
// leaving a stray message on the pooled processor stream (surfacing to the
|
|
275
|
+
// driver as ERR200 "unexpected ProcessID").
|
|
276
|
+
if (this.upsertBatch) {
|
|
277
|
+
const { promise } = this.upsertBatch
|
|
278
|
+
this.sendBatch()
|
|
279
|
+
this.pendings.push(promise)
|
|
280
|
+
}
|
|
245
281
|
await Promise.all(this.pendings)
|
|
246
282
|
}
|
|
247
283
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-DnkcGTkw.d.ts","names":[],"sources":["../src/db-context.ts","../src/plugin.ts"],"mappings":"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"}
|