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.
- package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts +64 -0
- package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts.map +1 -0
- package/dist/application/sync/outbound/SheetsEffectDispatcher.js +440 -0
- package/dist/application/sync/outbound/SheetsEffectDispatcher.js.map +1 -0
- package/dist/application/sync/service/SyncServiceBootstrap.d.ts +3 -4
- package/dist/application/sync/service/SyncServiceBootstrap.d.ts.map +1 -1
- package/dist/application/sync/service/SyncServiceBootstrap.js +7 -4
- package/dist/application/sync/service/SyncServiceBootstrap.js.map +1 -1
- package/dist/application/sync/telemetry/syncTiming.d.ts +20 -33
- package/dist/application/sync/telemetry/syncTiming.d.ts.map +1 -1
- package/dist/application/sync/telemetry/syncTiming.js +14 -12
- package/dist/application/sync/telemetry/syncTiming.js.map +1 -1
- package/dist/infrastructure/storage/errors.d.ts +10 -5
- package/dist/infrastructure/storage/errors.d.ts.map +1 -1
- package/dist/infrastructure/storage/errors.js +10 -7
- package/dist/infrastructure/storage/errors.js.map +1 -1
- package/dist/infrastructure/storage/index.d.ts +6 -4
- package/dist/infrastructure/storage/index.d.ts.map +1 -1
- package/dist/infrastructure/storage/index.js +3 -2
- package/dist/infrastructure/storage/index.js.map +1 -1
- package/dist/infrastructure/storage/sqlite/schema.d.ts +12 -11
- package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -1
- package/dist/infrastructure/storage/sqlite/schema.js +17 -109
- package/dist/infrastructure/storage/sqlite/schema.js.map +1 -1
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts +2 -2
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js +2 -2
- package/dist/infrastructure/storage/state/canonical/canonicalCommit.js.map +1 -1
- package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.d.ts +1 -2
- package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.js +1 -2
- package/dist/infrastructure/storage/state/mapped/mappedPersistenceContext.js.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts +1 -1
- package/dist/infrastructure/storage/state/observation/observationCanonical.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts +1 -1
- package/dist/infrastructure/storage/state/observation/observationQuarantine.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js +1 -1
- package/dist/infrastructure/storage/state/observation/observationQuarantine.js.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts +1 -1
- package/dist/infrastructure/storage/state/observation/observationTypes.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts +1 -1
- package/dist/infrastructure/storage/state/observation/observationValidation.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts +1 -1
- package/dist/infrastructure/storage/state/observation/observationWriter.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/observation/observationWriter.js +1 -2
- package/dist/infrastructure/storage/state/observation/observationWriter.js.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts +1 -2
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js +1 -2
- package/dist/infrastructure/storage/state/resolution/resolutionWriter.js.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterContracts.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterHelpers.js.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.d.ts.map +1 -1
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js +2 -2
- package/dist/infrastructure/storage/state/resolution/resolutionWriterSql.js.map +1 -1
- package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.d.ts +1 -1
- package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.d.ts.map +1 -1
- package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.js +1 -1
- package/dist/infrastructure/storage/sync/shared/spreadsheetAuthority.js.map +1 -1
- package/dist/infrastructure/storage/sync/shared/syncRegistry.d.ts +1 -1
- package/dist/infrastructure/storage/sync/shared/syncRegistry.js +1 -1
- package/package.json +13 -7
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts +0 -66
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js +0 -123
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts +0 -111
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +0 -369
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +0 -127
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js +0 -552
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +0 -85
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +0 -74
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +0 -31
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +0 -222
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts +0 -14
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js +0 -25
- package/dist/application/sync/outbound/effects/SyncEffectWorkerHelpers.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +0 -61
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +0 -296
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts +0 -17
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js +0 -80
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTiming.js.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts +0 -13
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.d.ts.map +0 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js +0 -248
- package/dist/application/sync/outbound/effects/SyncEffectWorkerTransitions.js.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +0 -141
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +0 -318
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts +0 -143
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.d.ts.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js +0 -16
- package/dist/infrastructure/storage/sync/outbound/effectOutboxContracts.js.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +0 -33
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +0 -259
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts +0 -27
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.d.ts.map +0 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js +0 -316
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSupport.js.map +0 -1
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts +0 -76
- package/dist/infrastructure/storage/sync/shared/writerLease.d.ts.map +0 -1
- package/dist/infrastructure/storage/sync/shared/writerLease.js +0 -189
- package/dist/infrastructure/storage/sync/shared/writerLease.js.map +0 -1
- package/docs/advanced-sheets-gateway-concurrency-problem.md +0 -434
- package/docs/architecture.md +0 -224
- package/docs/ci.md +0 -293
- package/docs/code-guidelines.md +0 -248
- package/docs/development.md +0 -74
- package/docs/gateway-removal-inventory.md +0 -147
- package/docs/git-workflow.md +0 -224
- package/docs/google-sheets-sync-scaling-strategy.md +0 -459
- package/docs/mikro-orm-adapter-spike.md +0 -89
- package/docs/quick-start.md +0 -137
- package/docs/sql-layer-plan.md +0 -59
- package/docs/sync-bulk-write-benchmark.md +0 -2117
- package/docs/sync-observability.md +0 -100
- package/docs/task-queue-write-model.md +0 -640
- package/docs/typed-sheets-mvp-scope-2026-06-29.md +0 -490
- package/docs/typed-sheets-plan.md +0 -417
- 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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"}
|