hikoutei 0.4.2 → 0.4.3

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 (140) hide show
  1. package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts +64 -0
  2. package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts.map +1 -0
  3. package/dist/application/sync/outbound/SheetsEffectDispatcher.js +440 -0
  4. package/dist/application/sync/outbound/SheetsEffectDispatcher.js.map +1 -0
  5. package/dist/application/sync/service/SyncServiceBootstrap.d.ts +3 -4
  6. package/dist/application/sync/service/SyncServiceBootstrap.d.ts.map +1 -1
  7. package/dist/application/sync/service/SyncServiceBootstrap.js +7 -4
  8. package/dist/application/sync/service/SyncServiceBootstrap.js.map +1 -1
  9. package/dist/application/sync/telemetry/syncTiming.d.ts +20 -33
  10. package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -1
  11. package/dist/application/sync/telemetry/syncTiming.js +14 -12
  12. package/dist/application/sync/telemetry/syncTiming.js.map +1 -1
  13. package/dist/infrastructure/storage/errors.d.ts +10 -5
  14. package/dist/infrastructure/storage/errors.d.ts.map +1 -1
  15. package/dist/infrastructure/storage/errors.js +10 -7
  16. package/dist/infrastructure/storage/errors.js.map +1 -1
  17. package/dist/infrastructure/storage/index.d.ts +6 -4
  18. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  19. package/dist/infrastructure/storage/index.js +3 -2
  20. package/dist/infrastructure/storage/index.js.map +1 -1
  21. package/dist/infrastructure/storage/sqlite/schema.d.ts +12 -11
  22. package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -1
  23. package/dist/infrastructure/storage/sqlite/schema.js +17 -109
  24. package/dist/infrastructure/storage/sqlite/schema.js.map +1 -1
  25. package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts +2 -2
  26. package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts.map +1 -1
  27. package/dist/infrastructure/storage/state/canonical/canonicalCommit.js +2 -2
  28. package/dist/infrastructure/storage/state/canonical/canonicalCommit.js.map +1 -1
  29. package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.d.ts +1 -2
  30. package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.d.ts.map +1 -1
  31. package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.js +1 -2
  32. package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.js.map +1 -1
  33. package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts +1 -1
  34. package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts.map +1 -1
  35. package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts +1 -1
  36. package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts.map +1 -1
  37. package/dist/infrastructure/storage/state/observation/observationQuarantine.js +1 -1
  38. package/dist/infrastructure/storage/state/observation/observationQuarantine.js.map +1 -1
  39. package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +1 -1
  40. package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -1
  41. package/dist/infrastructure/storage/state/observation/observationValidation.d.ts +1 -1
  42. package/dist/infrastructure/storage/state/observation/observationValidation.d.ts.map +1 -1
  43. package/dist/infrastructure/storage/state/observation/observationWriter.d.ts +1 -1
  44. package/dist/infrastructure/storage/state/observation/observationWriter.d.ts.map +1 -1
  45. package/dist/infrastructure/storage/state/observation/observationWriter.js +1 -2
  46. package/dist/infrastructure/storage/state/observation/observationWriter.js.map +1 -1
  47. package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts +1 -2
  48. package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts.map +1 -1
  49. package/dist/infrastructure/storage/state/resolution/resolutionWriter.js +1 -2
  50. package/dist/infrastructure/storage/state/resolution/resolutionWriter.js.map +1 -1
  51. package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts +1 -1
  52. package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts.map +1 -1
  53. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts +1 -1
  54. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts.map +1 -1
  55. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js +1 -1
  56. package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js.map +1 -1
  57. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts +1 -1
  58. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts.map +1 -1
  59. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js +2 -2
  60. package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js.map +1 -1
  61. package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.d.ts +1 -1
  62. package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.d.ts.map +1 -1
  63. package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.js +1 -1
  64. package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.js.map +1 -1
  65. package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +1 -1
  66. package/dist/infrastructure/storage/sync/shared/syncRegistry.js +1 -1
  67. package/package.json +13 -7
  68. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts +0 -66
  69. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts.map +0 -1
  70. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js +0 -123
  71. package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js.map +0 -1
  72. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +0 -111
  73. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +0 -1
  74. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +0 -369
  75. package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +0 -1
  76. package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +0 -127
  77. package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +0 -1
  78. package/dist/application/sync/outbound/effects/SyncEffectWorker.js +0 -552
  79. package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +0 -1
  80. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +0 -85
  81. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +0 -1
  82. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +0 -74
  83. package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +0 -1
  84. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +0 -31
  85. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +0 -1
  86. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +0 -222
  87. package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +0 -1
  88. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts +0 -14
  89. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts.map +0 -1
  90. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +0 -25
  91. package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +0 -1
  92. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +0 -61
  93. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +0 -1
  94. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +0 -296
  95. package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +0 -1
  96. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +0 -17
  97. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +0 -1
  98. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +0 -80
  99. package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +0 -1
  100. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +0 -13
  101. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +0 -1
  102. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +0 -248
  103. package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +0 -1
  104. package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +0 -141
  105. package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +0 -1
  106. package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +0 -318
  107. package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +0 -1
  108. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +0 -143
  109. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +0 -1
  110. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +0 -16
  111. package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +0 -1
  112. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +0 -33
  113. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +0 -1
  114. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +0 -259
  115. package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +0 -1
  116. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts +0 -27
  117. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts.map +0 -1
  118. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js +0 -316
  119. package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js.map +0 -1
  120. package/dist/infrastructure/storage/sync/shared/writerLease.d.ts +0 -76
  121. package/dist/infrastructure/storage/sync/shared/writerLease.d.ts.map +0 -1
  122. package/dist/infrastructure/storage/sync/shared/writerLease.js +0 -189
  123. package/dist/infrastructure/storage/sync/shared/writerLease.js.map +0 -1
  124. package/docs/advanced-sheets-gateway-concurrency-problem.md +0 -434
  125. package/docs/architecture.md +0 -224
  126. package/docs/ci.md +0 -293
  127. package/docs/code-guidelines.md +0 -248
  128. package/docs/development.md +0 -74
  129. package/docs/gateway-removal-inventory.md +0 -147
  130. package/docs/git-workflow.md +0 -224
  131. package/docs/google-sheets-sync-scaling-strategy.md +0 -459
  132. package/docs/mikro-orm-adapter-spike.md +0 -89
  133. package/docs/quick-start.md +0 -137
  134. package/docs/sql-layer-plan.md +0 -59
  135. package/docs/sync-bulk-write-benchmark.md +0 -2117
  136. package/docs/sync-observability.md +0 -100
  137. package/docs/task-queue-write-model.md +0 -640
  138. package/docs/typed-sheets-mvp-scope-2026-06-29.md +0 -490
  139. package/docs/typed-sheets-plan.md +0 -417
  140. package/docs/write-and-synchronization-flow.md +0 -179
@@ -1,552 +0,0 @@
1
- /**
2
- * Fenced outbox worker for projection effects.
3
- *
4
- * It owns only claim/result transitions. Canonical state and any repair
5
- * replan payload are supplied by the writer boundary; the provider is never
6
- * allowed to choose a winner or silently retry a response-lost write.
7
- */
8
- import { randomUUID } from "node:crypto";
9
- import { EMPTY_STRING_LENGTH_ZERO, NON_NEGATIVE_SAFE_INTEGER_MINIMUM, POSITIVE_SAFE_INTEGER_MINIMUM, } from "../../../../domain/index.js";
10
- import { CONFLICT_STATUSES } from "../../../../domain/model/constants.js";
11
- import { LOOKUP_RESULT_KINDS, absentValue, presentValue, } from "../../../../shared/state/index.js";
12
- import { applyEffectResultWithAdapter, claimEffectWithAdapter, claimWriterLeaseWithAdapter, markDeliveryUncertainWithAdapter, renewEffectLeaseWithAdapter, recoverExpiredLeasesWithAdapter, listReadyEffectsWithAdapter, listReadyFastAppendEffectsWithAdapter, releaseUnprocessedEffectWithAdapter, retryClaimedEffectWithAdapter, supersedeAndReplanWithAdapter, hasActiveUserInputCandidateWithSql, ensureSpreadsheetAuthorityWithAdapter, } from "../../../../infrastructure/storage/index.js";
13
- import { SYNC_EFFECT_RESULT_STATUSES, SYNC_PROJECTIONS, } from "../../sheets/constants.js";
14
- import { classifyTransportOutcome, TRANSPORT_OUTCOME_KINDS, } from "../../sheets/transportOutcome.js";
15
- import { WRITER_LEASE_CLAIM_RESULT_KINDS } from "../../../../infrastructure/storage/sync/shared/writerLease.js";
16
- import { SYNC_TIMING_SCOPES, } from "../../telemetry/syncTiming.js";
17
- import { DEFAULT_EFFECT_LEASE_DURATION_MS, DEFAULT_WORKER_ROLE, EFFECT_LEASE_PROVIDER_HEADROOM_MS, DEFAULT_WRITER_LEASE_DURATION_MS, EFFECT_BATCH_LIMIT, MAX_IN_FLIGHT_EFFECTS, OUTBOX_EFFECT_STATUSES, WORKER_ERROR_CODES, } from "./SyncEffectWorkerConstants.js";
18
- import { isAbsent, isPresent, lookupResult, safeErrorMessage, throwWorkerError, } from "./SyncEffectWorkerHelpers.js";
19
- import { countsForItems, countsForPendingEffects, emptyOperationCounts, emitProviderTiming, emitWorkerTiming, operationKindsForItems, operationKindsForPendingEffects, operationKindsForCounts, } from "./SyncEffectWorkerTiming.js";
20
- import { completeFailure, completeProviderResult, recoverUnknownResults, } from "./SyncEffectWorkerTransitions.js";
21
- import { dispatchFastAppendGroup, handleProviderDispatchError, rejectUnsupportedProviderEffects, } from "./SyncEffectWorkerDispatch.js";
22
- import { fenceFromLease, groupByFastAppendRequest, groupByProviderRequest, chunkFastAppendGroups, chunkProviderEffectGroups, routeKey, isCandidateProtectingUserInputEffect, isFastAppendCandidate, isFastAppendPendingEffect, isSuccessfulPostcondition, toProviderEffect, } from "./SyncEffectWorkerRouting.js";
23
- /**
24
- * Processes effects through an adapter-owned SQL connection.
25
- *
26
- * This is the MikroORM-compatible worker entrypoint. It never opens the
27
- * legacy synchronous `node:sqlite` database beside the ORM connection.
28
- */
29
- export async function runSyncEffectWorkerWithAdapter(options) {
30
- return runEffectWorker(options, createAdapterEffectWorkerStorage(options.storage));
31
- }
32
- async function runEffectWorker(options, storage) {
33
- const passStartedAt = Date.now();
34
- if (options.clock === undefined) {
35
- const baselineNow = options.now;
36
- options = {
37
- ...options,
38
- clock: () => baselineNow + Math.max(0, Date.now() - passStartedAt),
39
- };
40
- }
41
- validateOptions(options);
42
- const role = options.writerRole ?? DEFAULT_WORKER_ROLE;
43
- const leaseDuration = options.writerLeaseDurationMs ?? DEFAULT_WRITER_LEASE_DURATION_MS;
44
- const effectLeaseDuration = options.effectLeaseDurationMs ?? DEFAULT_EFFECT_LEASE_DURATION_MS;
45
- const leaseStartedAt = Date.now();
46
- const claimResult = await storage.claimWriterLease({
47
- role,
48
- writerId: options.workerId,
49
- leaseDurationMs: leaseDuration,
50
- now: options.now,
51
- });
52
- if (claimResult.kind !== WRITER_LEASE_CLAIM_RESULT_KINDS.CLAIMED) {
53
- const report = mutableReport(absentValue());
54
- emitWorkerTiming(options, {
55
- scope: SYNC_TIMING_SCOPES.WORKER,
56
- phase: "writer_lease_claim",
57
- durationMs: Date.now() - leaseStartedAt,
58
- operationKinds: [],
59
- operationCounts: emptyOperationCounts(),
60
- });
61
- emitWorkerTiming(options, {
62
- scope: SYNC_TIMING_SCOPES.WORKER,
63
- phase: "worker_total",
64
- durationMs: Date.now() - passStartedAt,
65
- operationKinds: [],
66
- operationCounts: emptyOperationCounts(),
67
- });
68
- return freezeReport(report);
69
- }
70
- const report = mutableReport(presentValue(claimResult.lease));
71
- emitWorkerTiming(options, {
72
- scope: SYNC_TIMING_SCOPES.WORKER,
73
- phase: "writer_lease_claim",
74
- durationMs: Date.now() - leaseStartedAt,
75
- operationKinds: [],
76
- operationCounts: emptyOperationCounts(),
77
- });
78
- let fence = fenceFromLease(claimResult.lease, options.now);
79
- const leaseNow = () => options.clock?.() ?? options.now + Math.max(0, Date.now() - passStartedAt);
80
- const currentFence = () => ({
81
- ...fence,
82
- // Direct worker callers may provide a deterministic `now` but no clock;
83
- // advance that baseline by elapsed wall time so a slow remote call cannot
84
- // reuse a pass-start timestamp after the writer lease has expired.
85
- now: leaseNow(),
86
- });
87
- const refreshDispatchLeases = async (items) => {
88
- const now = leaseNow();
89
- const writerRefresh = await storage.claimWriterLease({
90
- role,
91
- writerId: options.workerId,
92
- leaseDurationMs: leaseDuration,
93
- now,
94
- });
95
- if (writerRefresh.kind !== WRITER_LEASE_CLAIM_RESULT_KINDS.CLAIMED)
96
- return false;
97
- if (writerRefresh.lease.writerEpoch !== fence.writerEpoch ||
98
- writerRefresh.lease.fencingToken !== fence.fencingToken) {
99
- // The old fence expired and was taken over. Do not dispatch effects
100
- // claimed under that token; the next pass will recover them safely.
101
- fence = fenceFromLease(writerRefresh.lease, now);
102
- await storage.recoverExpiredLeases(currentFence());
103
- return false;
104
- }
105
- const authoritySheetIds = new Set(items.map((item) => item.pending.physical_sheet_id));
106
- for (const physicalSheetId of authoritySheetIds) {
107
- if (!(await storage.ensureSpreadsheetAuthority({
108
- ...currentFence(),
109
- physicalSheetId,
110
- ownerId: options.workerId,
111
- }))) {
112
- await storage.recoverExpiredLeases(currentFence());
113
- return false;
114
- }
115
- }
116
- const renewed = [];
117
- const notRenewed = [];
118
- for (const item of items) {
119
- if (await storage.renewEffectLease({
120
- ...currentFence(),
121
- effectId: item.pending.effect_id,
122
- claimToken: item.claimToken,
123
- leaseDurationMs: effectLeaseDuration,
124
- }))
125
- renewed.push(item);
126
- else
127
- notRenewed.push(item);
128
- }
129
- if (renewed.length === items.length)
130
- return true;
131
- await storage.recoverExpiredLeases(currentFence());
132
- for (const item of renewed) {
133
- if (await storage.releaseUnprocessedEffect({
134
- ...currentFence(),
135
- effectId: item.pending.effect_id,
136
- claimToken: item.claimToken,
137
- }))
138
- report.deferred += 1;
139
- }
140
- for (const item of notRenewed) {
141
- if (await storage.retryClaimedEffect({
142
- ...currentFence(),
143
- effectId: item.pending.effect_id,
144
- claimToken: item.claimToken,
145
- lastErrorCode: WORKER_ERROR_CODES.PROVIDER_RETRYABLE_ERROR,
146
- lastErrorMessage: "Effect lease could not be renewed before remote dispatch.",
147
- })) {
148
- report.requeued += 1;
149
- report.deferred += 1;
150
- }
151
- }
152
- return false;
153
- };
154
- const coalesceStartedAt = Date.now();
155
- const coalescedMs = await options.batchController?.waitForCoalescing(Date.now()) ?? 0;
156
- if (coalescedMs > 0) {
157
- emitWorkerTiming(options, {
158
- scope: SYNC_TIMING_SCOPES.WORKER,
159
- phase: "batch_coalesce_wait",
160
- durationMs: Date.now() - coalesceStartedAt,
161
- operationKinds: [],
162
- operationCounts: emptyOperationCounts(),
163
- });
164
- }
165
- const selectStartedAt = Date.now();
166
- report.expiredLeasesRecovered = await storage.recoverExpiredLeases(currentFence());
167
- // The bulk provider runtime selects ready append candidates through their
168
- // own bounded query and keeps the regular/recovery selection on the
169
- // head-of-line window; every other runtime keeps maxEffects as the SQLite
170
- // selection upper bound. Only the bounded in-flight window is ever leased
171
- // before the first remote dispatch; remaining rows stay durable and are
172
- // picked up on the next pass.
173
- const maxFastAppendCandidates = options.maxFastAppendCandidates;
174
- const selectionLimit = maxFastAppendCandidates === undefined
175
- ? options.maxEffects
176
- : Math.max(options.maxEffects, maxFastAppendCandidates + MAX_IN_FLIGHT_EFFECTS);
177
- const selected = await storage.listReadyEffects(selectionLimit, currentFence().now);
178
- let claimable;
179
- if (maxFastAppendCandidates === undefined) {
180
- claimable = selected.slice(0, MAX_IN_FLIGHT_EFFECTS);
181
- }
182
- else {
183
- // Append candidates are discovered independently of the head-of-queue
184
- // prefix: the dedicated query jumps past any regular/recovery backlog in
185
- // the same ready order, so an arbitrary number of rows before the first
186
- // append candidate cannot starve the bulk append path. Each returned row
187
- // is still payload-validated here before claiming, the claim CAS still
188
- // enforces per-target predecessor ordering, and the regular bucket stays
189
- // at the existing bounded window without leasing the claimed append rows
190
- // twice. The general selection can extend past the dedicated append
191
- // query's window, so the regular bucket excludes every pending fast-append
192
- // effect, not only the claimed IDs: an append candidate beyond the bulk
193
- // window stays on the outbox for the next pass instead of being
194
- // reclassified into a second append request. Payload-invalid potential
195
- // rows and recovery-status rows are not fast-append pending and remain
196
- // eligible for the regular path.
197
- const appendCandidates = (await storage.listReadyFastAppendEffects(maxFastAppendCandidates, currentFence().now)).filter(isFastAppendPendingEffect).slice(0, maxFastAppendCandidates);
198
- const regular = [];
199
- for (const pending of selected) {
200
- if (regular.length >= MAX_IN_FLIGHT_EFFECTS)
201
- break;
202
- if (isFastAppendPendingEffect(pending))
203
- continue;
204
- regular.push(pending);
205
- }
206
- claimable = [...appendCandidates, ...regular];
207
- }
208
- report.selected = claimable.length;
209
- emitWorkerTiming(options, {
210
- scope: SYNC_TIMING_SCOPES.WORKER,
211
- phase: "recover_and_select",
212
- durationMs: Date.now() - selectStartedAt,
213
- operationKinds: operationKindsForPendingEffects(claimable),
214
- operationCounts: countsForPendingEffects(claimable),
215
- });
216
- const claimed = [];
217
- const recoveryCandidates = [];
218
- const claimEffectsStartedAt = Date.now();
219
- for (const pending of claimable) {
220
- const claimToken = "claim:" + randomUUID();
221
- const claim = await storage.claimEffect({
222
- ...currentFence(),
223
- effectId: pending.effect_id,
224
- claimToken,
225
- dispatchId: "dispatch:" + randomUUID(),
226
- leaseDurationMs: effectLeaseDuration,
227
- });
228
- if (claim.status !== "claimed")
229
- continue;
230
- report.claimed += 1;
231
- let providerEffect;
232
- let invalidPayloadError;
233
- try {
234
- providerEffect = presentValue(toProviderEffect(pending));
235
- invalidPayloadError = absentValue();
236
- }
237
- catch (error) {
238
- providerEffect = absentValue();
239
- invalidPayloadError = presentValue(safeErrorMessage(error));
240
- }
241
- const item = { pending, claimToken, providerEffect, invalidPayloadError };
242
- if (pending.status === OUTBOX_EFFECT_STATUSES.FAILED ||
243
- pending.status === OUTBOX_EFFECT_STATUSES.DELIVERY_UNCERTAIN) {
244
- recoveryCandidates.push(item);
245
- continue;
246
- }
247
- claimed.push(item);
248
- }
249
- emitWorkerTiming(options, {
250
- scope: SYNC_TIMING_SCOPES.WORKER,
251
- phase: "effect_claims",
252
- durationMs: Date.now() - claimEffectsStartedAt,
253
- operationKinds: operationKindsForItems([...claimed, ...recoveryCandidates]),
254
- operationCounts: countsForItems([...claimed, ...recoveryCandidates]),
255
- });
256
- const fullProvider = isFullEffectProvider(options.provider)
257
- ? options.provider
258
- : undefined;
259
- if (fullProvider === undefined) {
260
- await rejectUnsupportedProviderEffects(storage, currentFence(), recoveryCandidates, report);
261
- }
262
- else if (await refreshDispatchLeases(recoveryCandidates)) {
263
- await recoverUnknownResults({ ...options, provider: fullProvider }, storage, currentFence(), recoveryCandidates, report);
264
- }
265
- const usable = claimed.filter((item) => isPresent(item.providerEffect));
266
- for (const invalid of claimed.filter((item) => isAbsent(item.providerEffect))) {
267
- await completeFailure(storage, currentFence(), invalid, WORKER_ERROR_CODES.INVALID_EFFECT_PAYLOAD, invalid.invalidPayloadError, report);
268
- }
269
- // A User_Input reconcile or physical delete is safe only while no unresolved
270
- // user candidate owns one of its fields. This local gate runs before the
271
- // remote CAS so stale canonical work cannot erase a candidate merely because
272
- // its Sheet baseline happens to still look unchanged.
273
- const dispatchable = [];
274
- const candidateGateStartedAt = Date.now();
275
- for (const item of usable) {
276
- if (!(await storage.isUserInputCandidateBlocked(item))) {
277
- dispatchable.push(item);
278
- continue;
279
- }
280
- if (await storage.applyEffectResult({
281
- ...currentFence(),
282
- effectId: item.pending.effect_id,
283
- claimToken: item.claimToken,
284
- status: OUTBOX_EFFECT_STATUSES.BLOCKED_CANDIDATE,
285
- lastErrorCode: presentValue(WORKER_ERROR_CODES.ACTIVE_CANDIDATE_PRESERVED),
286
- lastErrorMessage: presentValue("An unresolved User_Input candidate owns a projected field."),
287
- })) {
288
- report.blockedCandidate += 1;
289
- }
290
- }
291
- emitWorkerTiming(options, {
292
- scope: SYNC_TIMING_SCOPES.WORKER,
293
- phase: "candidate_gate",
294
- durationMs: Date.now() - candidateGateStartedAt,
295
- operationKinds: operationKindsForItems(usable),
296
- operationCounts: countsForItems(usable),
297
- });
298
- const fastAppendItems = dispatchable.filter(isFastAppendCandidate);
299
- const regularItems = dispatchable.filter((item) => !isFastAppendCandidate(item));
300
- const fastAppendGroups = chunkFastAppendGroups(groupByFastAppendRequest(fastAppendItems),
301
- // The bulk provider runtime sends one append request per route at the
302
- // bulk claim window; every other runtime keeps the adaptive/bounded
303
- // per-request chunking.
304
- (group) => options.maxFastAppendCandidates
305
- ?? options.batchController?.limitFor(routeKey(group.request))
306
- ?? EFFECT_BATCH_LIMIT);
307
- for (const group of fastAppendGroups) {
308
- if (!(await refreshDispatchLeases(group.items)))
309
- continue;
310
- await dispatchFastAppendGroup(options, storage, currentFence(), group, report, fullProvider, () => refreshDispatchLeases(group.items));
311
- }
312
- if (fullProvider === undefined) {
313
- await rejectUnsupportedProviderEffects(storage, currentFence(), regularItems, report);
314
- }
315
- else {
316
- // Chunk each physical route to the provider's bounded effect batch so one
317
- // applyEffects call returns a complete result set. An oversized configured
318
- // worker limit (maxEffects) would otherwise send more effects than the
319
- // provider acknowledges per call, producing hasMore partial prefixes and the
320
- // deferred/requeue churn they cause on every pass.
321
- const regularGroups = chunkProviderEffectGroups(groupByProviderRequest(regularItems), (group) => options.batchController?.limitFor(routeKey(group.request)) ?? EFFECT_BATCH_LIMIT);
322
- for (const group of regularGroups) {
323
- if (!(await refreshDispatchLeases(group.items)))
324
- continue;
325
- const deferredEffectIds = new Set();
326
- let response;
327
- const regularOperationCounts = countsForItems(group.items);
328
- const regularOperationKinds = operationKindsForCounts(regularOperationCounts);
329
- const providerStartedAt = Date.now();
330
- const requestRouteKey = routeKey(group.request);
331
- const batchLimit = options.batchController?.beginDispatch(requestRouteKey, providerStartedAt) ?? EFFECT_BATCH_LIMIT;
332
- try {
333
- response = await fullProvider.applyEffects(group.request);
334
- }
335
- catch (error) {
336
- const outcome = classifyTransportOutcome(error);
337
- options.batchController?.observe(requestRouteKey, {
338
- durationMs: Date.now() - providerStartedAt,
339
- responseSucceeded: false,
340
- responseLoss: outcome.kind === TRANSPORT_OUTCOME_KINDS.DELIVERY_UNCERTAIN,
341
- });
342
- const failedDurationMs = Date.now() - providerStartedAt;
343
- emitWorkerTiming(options, {
344
- scope: SYNC_TIMING_SCOPES.WORKER,
345
- phase: "regular_provider_dispatch",
346
- durationMs: failedDurationMs,
347
- operationKinds: regularOperationKinds,
348
- operationCounts: regularOperationCounts,
349
- routeKey: requestRouteKey,
350
- batchLimit,
351
- responseSucceeded: false,
352
- });
353
- // Remote side may have written the effect before an uncertain
354
- // transport failure. Explicit remote failures skip recovery because
355
- // the provider already proved that the operation was rejected.
356
- const resultFence = currentFence();
357
- await handleProviderDispatchError(options, storage, resultFence, group.items, report, outcome, fullProvider, () => refreshDispatchLeases(group.items));
358
- continue;
359
- }
360
- const regularProviderDurationMs = Date.now() - providerStartedAt;
361
- options.batchController?.observe(requestRouteKey, {
362
- durationMs: regularProviderDurationMs,
363
- responseSucceeded: response.results.length === group.items.length && !response.hasMore,
364
- responseLoss: response.results.length !== group.items.length || response.hasMore,
365
- });
366
- emitProviderTiming(options, response.timing);
367
- emitWorkerTiming(options, {
368
- scope: SYNC_TIMING_SCOPES.WORKER,
369
- phase: "regular_provider_dispatch",
370
- durationMs: regularProviderDurationMs,
371
- operationKinds: regularOperationKinds,
372
- operationCounts: regularOperationCounts,
373
- routeKey: requestRouteKey,
374
- batchLimit,
375
- responseSucceeded: response.results.length === group.items.length && !response.hasMore,
376
- });
377
- const resultPersistenceStartedAt = Date.now();
378
- const byEffectId = new Map(response.results.map((result) => [result.effectId, result]));
379
- for (const item of group.items) {
380
- const result = lookupResult(byEffectId.get(item.pending.effect_id));
381
- if (result.kind === LOOKUP_RESULT_KINDS.NOT_FOUND && response.hasMore) {
382
- if (await storage.releaseUnprocessedEffect({
383
- ...currentFence(),
384
- effectId: item.pending.effect_id,
385
- claimToken: item.claimToken,
386
- })) {
387
- report.deferred += 1;
388
- deferredEffectIds.add(item.pending.effect_id);
389
- }
390
- }
391
- }
392
- const recoveryItems = [];
393
- for (const item of group.items) {
394
- const result = lookupResult(byEffectId.get(item.pending.effect_id));
395
- if (result.kind === LOOKUP_RESULT_KINDS.NOT_FOUND &&
396
- deferredEffectIds.has(item.pending.effect_id))
397
- continue;
398
- if (result.kind === LOOKUP_RESULT_KINDS.NOT_FOUND ||
399
- result.value.payloadHash !== item.pending.payload_hash) {
400
- recoveryItems.push(item);
401
- continue;
402
- }
403
- if ((result.value.status === SYNC_EFFECT_RESULT_STATUSES.APPLIED ||
404
- result.value.status === SYNC_EFFECT_RESULT_STATUSES.ALREADY_APPLIED) &&
405
- (!isSuccessfulPostcondition(result.value.postcondition) ||
406
- !isPresent(result.value.visibleRevision) ||
407
- !isPresent(result.value.visibleHash) ||
408
- !isPresent(item.providerEffect) ||
409
- result.value.visibleHash.value !== item.providerEffect.value.payload.targetVisibleHash)) {
410
- // A success label without the acknowledged target state is not enough
411
- // to close a durable effect. Treat it like a lost response and read
412
- // back first.
413
- recoveryItems.push(item);
414
- continue;
415
- }
416
- await completeProviderResult(options, storage, currentFence(), item, result.value, report);
417
- }
418
- if (await refreshDispatchLeases(recoveryItems)) {
419
- await recoverUnknownResults({ ...options, provider: fullProvider }, storage, currentFence(), recoveryItems, report);
420
- }
421
- emitWorkerTiming(options, {
422
- scope: SYNC_TIMING_SCOPES.WORKER,
423
- phase: "regular_result_persistence",
424
- durationMs: Date.now() - resultPersistenceStartedAt,
425
- operationKinds: regularOperationKinds,
426
- operationCounts: regularOperationCounts,
427
- });
428
- }
429
- }
430
- emitWorkerTiming(options, {
431
- scope: SYNC_TIMING_SCOPES.WORKER,
432
- phase: "worker_total",
433
- durationMs: Date.now() - passStartedAt,
434
- operationKinds: operationKindsForItems(dispatchable),
435
- operationCounts: countsForItems(dispatchable),
436
- });
437
- return freezeReport(report);
438
- }
439
- function createAdapterEffectWorkerStorage(storage) {
440
- return {
441
- claimWriterLease: (options) => claimWriterLeaseWithAdapter(storage, options),
442
- recoverExpiredLeases: (fence) => recoverExpiredLeasesWithAdapter(storage, fence),
443
- listReadyEffects: (limit, now) => listReadyEffectsWithAdapter(storage, limit, now),
444
- listReadyFastAppendEffects: (limit, now) => listReadyFastAppendEffectsWithAdapter(storage, limit, now),
445
- claimEffect: (options) => claimEffectWithAdapter(storage, options),
446
- ensureSpreadsheetAuthority: async (options) => {
447
- const result = await ensureSpreadsheetAuthorityWithAdapter(storage, options);
448
- return result.kind === "claimed";
449
- },
450
- markDeliveryUncertain: (options) => markDeliveryUncertainWithAdapter(storage, options),
451
- renewEffectLease: (options) => renewEffectLeaseWithAdapter(storage, options),
452
- applyEffectResult: (options) => applyEffectResultWithAdapter(storage, options),
453
- releaseUnprocessedEffect: (options) => releaseUnprocessedEffectWithAdapter(storage, options),
454
- retryClaimedEffect: (options) => retryClaimedEffectWithAdapter(storage, options),
455
- supersedeAndReplan: (fence, oldEffectId, newEffect) => {
456
- return supersedeAndReplanWithAdapter(storage, fence, oldEffectId, newEffect);
457
- },
458
- isUserInputCandidateBlocked: (item) => {
459
- const effect = item.providerEffect;
460
- if (!isPresent(effect) ||
461
- !isCandidateProtectingUserInputEffect(effect.value)) {
462
- return Promise.resolve(false);
463
- }
464
- const rowBinding = effect.value.rowBindingId;
465
- if (!isPresent(rowBinding))
466
- return Promise.resolve(false);
467
- const providerEffect = effect.value;
468
- const rowBindingId = rowBinding.value;
469
- const fieldNames = Object.keys(providerEffect.payload.fields);
470
- return storage.read(({ sql }) => hasActiveUserInputCandidateWithSql(sql, {
471
- physicalSheetId: providerEffect.physicalSheetId,
472
- projection: SYNC_PROJECTIONS.USER_INPUT,
473
- rowBindingId,
474
- fieldNames,
475
- openConflictStatus: CONFLICT_STATUSES.OPEN,
476
- rebasedConflictStatus: CONFLICT_STATUSES.NEEDS_REBASE,
477
- }));
478
- },
479
- };
480
- }
481
- /** Returns the full provider only when every regular recovery capability exists. */
482
- function isFullEffectProvider(provider) {
483
- return "applyEffects" in provider &&
484
- typeof provider.applyEffects === "function" &&
485
- "readEffectPostcondition" in provider &&
486
- typeof provider.readEffectPostcondition === "function" &&
487
- "readEffectPostconditions" in provider &&
488
- typeof provider.readEffectPostconditions === "function";
489
- }
490
- function mutableReport(lease) {
491
- return {
492
- lease,
493
- expiredLeasesRecovered: 0,
494
- selected: 0,
495
- claimed: 0,
496
- applied: 0,
497
- blockedCandidate: 0,
498
- superseded: 0,
499
- conflicted: 0,
500
- failed: 0,
501
- deferred: 0,
502
- requeued: 0,
503
- replanned: 0,
504
- responseLossRecovered: 0,
505
- };
506
- }
507
- function freezeReport(report) {
508
- return { ...report };
509
- }
510
- function validateOptions(options) {
511
- if (options.workerId.length === EMPTY_STRING_LENGTH_ZERO) {
512
- throwWorkerError("effect worker ID is required");
513
- }
514
- if (!Number.isSafeInteger(options.now) ||
515
- options.now < NON_NEGATIVE_SAFE_INTEGER_MINIMUM) {
516
- throwWorkerError("effect worker time must be a non-negative safe integer");
517
- }
518
- if (!Number.isSafeInteger(options.maxEffects) ||
519
- options.maxEffects < POSITIVE_SAFE_INTEGER_MINIMUM) {
520
- throwWorkerError("effect worker maxEffects must be a positive safe integer");
521
- }
522
- if (options.maxFastAppendCandidates !== undefined &&
523
- (!Number.isSafeInteger(options.maxFastAppendCandidates) ||
524
- options.maxFastAppendCandidates < POSITIVE_SAFE_INTEGER_MINIMUM)) {
525
- throwWorkerError("effect worker maxFastAppendCandidates must be a positive safe integer");
526
- }
527
- if (options.appendDispatchIntervalMs !== undefined &&
528
- (!Number.isSafeInteger(options.appendDispatchIntervalMs) ||
529
- options.appendDispatchIntervalMs < NON_NEGATIVE_SAFE_INTEGER_MINIMUM)) {
530
- throwWorkerError("effect worker appendDispatchIntervalMs must be a non-negative safe integer");
531
- }
532
- for (const [name, value] of [
533
- ["writerLeaseDurationMs", options.writerLeaseDurationMs],
534
- ["effectLeaseDurationMs", options.effectLeaseDurationMs],
535
- ["requestTimeoutMs", options.requestTimeoutMs],
536
- ]) {
537
- if (value !== undefined &&
538
- (!Number.isSafeInteger(value) || value < POSITIVE_SAFE_INTEGER_MINIMUM)) {
539
- throwWorkerError(name + " must be a positive safe integer");
540
- }
541
- }
542
- const writerLeaseDuration = options.writerLeaseDurationMs ?? DEFAULT_WRITER_LEASE_DURATION_MS;
543
- const effectLeaseDuration = options.effectLeaseDurationMs ?? DEFAULT_EFFECT_LEASE_DURATION_MS;
544
- if (writerLeaseDuration <= effectLeaseDuration) {
545
- throwWorkerError("writerLeaseDurationMs must exceed effectLeaseDurationMs");
546
- }
547
- if (options.requestTimeoutMs !== undefined &&
548
- effectLeaseDuration <= options.requestTimeoutMs + EFFECT_LEASE_PROVIDER_HEADROOM_MS) {
549
- throwWorkerError("effectLeaseDurationMs must exceed requestTimeoutMs by 30 seconds");
550
- }
551
- }
552
- //# sourceMappingURL=SyncEffectWorker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SyncEffectWorker.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/effects/SyncEffectWorker.ts"],"names":[],"mappings":"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"}