hikoutei 0.3.3 → 0.3.5
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/README.md +88 -15
- package/apps-script/gateway/appsscript.json +17 -0
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts +9 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/index.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js +9 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/index.js.map +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/effect/effectOperationScript.js +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/observation/observationOperation.js +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.d.ts +18 -10
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.js +157 -27
- package/dist/adapter/sheets/providers/apps-script-gateway/operations/write/batchAppendOperation.js.map +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts +4 -2
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.d.ts.map +1 -1
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js +4 -2
- package/dist/adapter/sheets/providers/apps-script-gateway/transport/operationSyncGateway.js.map +1 -1
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiEffectGateway.d.ts +27 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiEffectGateway.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiEffectGateway.js +14 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiEffectGateway.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts +156 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js +1138 -0
- package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/constants.d.ts +87 -0
- package/dist/adapter/sheets/providers/google-sheets-api/constants.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/constants.js +97 -0
- package/dist/adapter/sheets/providers/google-sheets-api/constants.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/errors.d.ts +53 -0
- package/dist/adapter/sheets/providers/google-sheets-api/errors.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/errors.js +61 -0
- package/dist/adapter/sheets/providers/google-sheets-api/errors.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/index.d.ts +18 -0
- package/dist/adapter/sheets/providers/google-sheets-api/index.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/index.js +14 -0
- package/dist/adapter/sheets/providers/google-sheets-api/index.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.d.ts +83 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.js +413 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/batchBuilder.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.d.ts +86 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.js +439 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/observation.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts +115 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js +522 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.d.ts +17 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.js +99 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/postcondition.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts +242 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js +707 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.d.ts +16 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.js +29 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/sheetIdAllocator.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.d.ts +26 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.js +57 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/tableRead.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.d.ts +102 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.js +375 -0
- package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.d.ts +168 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.js +247 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.js.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.d.ts +47 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.d.ts.map +1 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.js +60 -0
- package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.js.map +1 -0
- package/dist/application/sync/gateway/RoutedSyncGateway.d.ts +59 -0
- package/dist/application/sync/gateway/RoutedSyncGateway.d.ts.map +1 -0
- package/dist/application/sync/gateway/RoutedSyncGateway.js +86 -0
- package/dist/application/sync/gateway/RoutedSyncGateway.js.map +1 -0
- package/dist/application/sync/gateway/transportClassification.d.ts +12 -0
- package/dist/application/sync/gateway/transportClassification.d.ts.map +1 -1
- package/dist/application/sync/gateway/transportClassification.js +37 -0
- package/dist/application/sync/gateway/transportClassification.js.map +1 -1
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts +16 -0
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.d.ts.map +1 -1
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js +26 -0
- package/dist/application/sync/outbound/effects/AdaptiveEffectBatchController.js.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.d.ts.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js +23 -3
- package/dist/application/sync/outbound/effects/SyncEffectSupervisor.js.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts +15 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorker.d.ts.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js +61 -8
- package/dist/application/sync/outbound/effects/SyncEffectWorker.js.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts +15 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.d.ts.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js +15 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerConstants.js.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts +4 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.d.ts.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js +16 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerDispatch.js.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts +8 -0
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.d.ts.map +1 -1
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js +22 -2
- package/dist/application/sync/outbound/effects/SyncEffectWorkerRouting.js.map +1 -1
- package/dist/application/sync/service/SyncServiceBootstrap.d.ts +23 -1
- package/dist/application/sync/service/SyncServiceBootstrap.d.ts.map +1 -1
- package/dist/application/sync/service/SyncServiceBootstrap.js +162 -8
- package/dist/application/sync/service/SyncServiceBootstrap.js.map +1 -1
- package/dist/infrastructure/storage/index.d.ts +1 -1
- package/dist/infrastructure/storage/index.d.ts.map +1 -1
- package/dist/infrastructure/storage/index.js +1 -1
- package/dist/infrastructure/storage/index.js.map +1 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts +12 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.d.ts.map +1 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js +22 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutbox.js.map +1 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts +10 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.d.ts.map +1 -1
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js +38 -0
- package/dist/infrastructure/storage/sync/outbound/effectOutboxSql.js.map +1 -1
- package/docs/architecture.md +57 -13
- package/docs/ci.md +47 -23
- package/docs/development.md +35 -5
- package/docs/quick-start.md +43 -11
- package/docs/sync-bulk-write-benchmark.md +561 -0
- package/docs/write-and-synchronization-flow.md +70 -14
- package/package.json +6 -3
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript planner: the Apps Script effect judgment semantics in TS.
|
|
3
|
+
*
|
|
4
|
+
* This module ports `effectOperationScript.ts`'s `requireEffect_`,
|
|
5
|
+
* `findRow_`, `currentHash_`, `validateDeletion_`, `result_`,
|
|
6
|
+
* `makeReceipt_`, and the apply-effects planning loop. Every decision that
|
|
7
|
+
* the Code.gs source makes before mutation (receipt replay, row lookup,
|
|
8
|
+
* create-if-missing, visible/candidate/repair guards, deletion shape) is
|
|
9
|
+
* reproduced here against the typed preflight context. Outcomes are
|
|
10
|
+
* discriminated unions, never nullable status markers.
|
|
11
|
+
*/
|
|
12
|
+
import { computeSyncVisibleHash } from "../../../../../application/sync/gateway/syncGateway.js";
|
|
13
|
+
import { EFFECT_KINDS } from "../../../../../domain/model/constants.js";
|
|
14
|
+
import { SYNC_GATEWAY_EFFECT_RESULT_STATUSES, SYNC_GATEWAY_POSTCONDITION_STATUSES } from "../../../../../application/sync/gateway/constants.js";
|
|
15
|
+
import { APPLICABILITY_KINDS, PRESENCE_KINDS } from "../../../../../shared/state/index.js";
|
|
16
|
+
import { presentValue, absentValue } from "../../../../../shared/state/index.js";
|
|
17
|
+
import { isNormalizedCell } from "../../../../../shared/encoding/index.js";
|
|
18
|
+
import { GOOGLE_SHEETS_API_EFFECT_REASONS, fullRowDeletionReason } from "../constants.js";
|
|
19
|
+
import { invalidProviderRequest } from "../errors.js";
|
|
20
|
+
/**
|
|
21
|
+
* Plans one applyEffects request against a preflight context.
|
|
22
|
+
*
|
|
23
|
+
* All effects are planned (including beyond the transport byte budget); the
|
|
24
|
+
* batch builder decides which prefix is actually sent. Deleted working rows
|
|
25
|
+
* are removed from the anchor/identity indexes so later effects in the same
|
|
26
|
+
* batch observe the mutations of earlier ones.
|
|
27
|
+
*/
|
|
28
|
+
export function planEffectBatch(request, context) {
|
|
29
|
+
const plans = [];
|
|
30
|
+
const working = new Map();
|
|
31
|
+
const byAnchor = new Map();
|
|
32
|
+
const byIdentity = new Map();
|
|
33
|
+
for (const row of context.rows) {
|
|
34
|
+
const copy = toWorkingRow(row);
|
|
35
|
+
working.set(copy.rowNumber, copy);
|
|
36
|
+
if (copy.anchor.kind === PRESENCE_KINDS.PRESENT) {
|
|
37
|
+
byAnchor.set(copy.anchor.value, copy);
|
|
38
|
+
}
|
|
39
|
+
if (copy.identity.kind === PRESENCE_KINDS.PRESENT) {
|
|
40
|
+
byIdentity.set(copy.identity.value, copy);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const pendingReceipts = new Map();
|
|
44
|
+
let nextAppendRow = context.nextAppendRow;
|
|
45
|
+
for (const effect of request.effects) {
|
|
46
|
+
requireGatewayEffect(effect, request, context);
|
|
47
|
+
const existingReceipt = pendingReceipts.get(effect.effectId) ?? context.receipts.get(effect.effectId);
|
|
48
|
+
if (existingReceipt !== undefined) {
|
|
49
|
+
plans.push(planReceiptReplay(effect, existingReceipt, context, byAnchor, byIdentity));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
let row = findWorkingRow(byAnchor, byIdentity, effect.payload.targetAnchor, effect.targetId);
|
|
53
|
+
let created = false;
|
|
54
|
+
if (row === undefined) {
|
|
55
|
+
if (!effect.payload.createIfMissing) {
|
|
56
|
+
plans.push({
|
|
57
|
+
outcome: {
|
|
58
|
+
kind: "guard_mismatch",
|
|
59
|
+
effect,
|
|
60
|
+
rowNumber: absentValue(),
|
|
61
|
+
reason: GOOGLE_SHEETS_API_EFFECT_REASONS.TARGET_ANCHOR_MISSING,
|
|
62
|
+
},
|
|
63
|
+
mutation: undefined,
|
|
64
|
+
receipt: undefined,
|
|
65
|
+
verify: false,
|
|
66
|
+
});
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (effect.expectedVisibleRevision !== 0 || effect.expectedVisibleHash !== "") {
|
|
70
|
+
plans.push({
|
|
71
|
+
outcome: {
|
|
72
|
+
kind: "guard_mismatch",
|
|
73
|
+
effect,
|
|
74
|
+
rowNumber: absentValue(),
|
|
75
|
+
reason: GOOGLE_SHEETS_API_EFFECT_REASONS.INSERT_REQUIRES_EMPTY_VISIBLE_BASELINE,
|
|
76
|
+
},
|
|
77
|
+
mutation: undefined,
|
|
78
|
+
receipt: undefined,
|
|
79
|
+
verify: false,
|
|
80
|
+
});
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
row = createWorkingRow(effect, nextAppendRow);
|
|
84
|
+
nextAppendRow += 1;
|
|
85
|
+
working.set(row.rowNumber, row);
|
|
86
|
+
if (row.anchor.kind === PRESENCE_KINDS.PRESENT) {
|
|
87
|
+
byAnchor.set(row.anchor.value, row);
|
|
88
|
+
}
|
|
89
|
+
if (row.identity.kind === PRESENCE_KINDS.PRESENT) {
|
|
90
|
+
byIdentity.set(row.identity.value, row);
|
|
91
|
+
}
|
|
92
|
+
created = true;
|
|
93
|
+
}
|
|
94
|
+
if (isDeletionEffect(effect.effectKind)) {
|
|
95
|
+
const deletionError = validateDeletion(context, effect);
|
|
96
|
+
if (deletionError !== null) {
|
|
97
|
+
plans.push({
|
|
98
|
+
outcome: {
|
|
99
|
+
kind: "schema_error",
|
|
100
|
+
effect,
|
|
101
|
+
rowNumber: presentValue(row.rowNumber),
|
|
102
|
+
reason: deletionError,
|
|
103
|
+
},
|
|
104
|
+
mutation: undefined,
|
|
105
|
+
receipt: undefined,
|
|
106
|
+
verify: false,
|
|
107
|
+
});
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const deletionHash = currentHash(row, effect.payload.fields);
|
|
111
|
+
if (deletionHash !== effect.expectedVisibleHash) {
|
|
112
|
+
plans.push({
|
|
113
|
+
outcome: {
|
|
114
|
+
kind: "guard_mismatch",
|
|
115
|
+
effect,
|
|
116
|
+
rowNumber: presentValue(row.rowNumber),
|
|
117
|
+
reason: GOOGLE_SHEETS_API_EFFECT_REASONS.VISIBLE_GUARD_MISMATCH,
|
|
118
|
+
},
|
|
119
|
+
mutation: undefined,
|
|
120
|
+
receipt: undefined,
|
|
121
|
+
verify: false,
|
|
122
|
+
});
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const receipt = makeReceipt(effect, deletionHash, effect.expectedVisibleRevision);
|
|
126
|
+
row.deleted = true;
|
|
127
|
+
if (row.anchor.kind === PRESENCE_KINDS.PRESENT) {
|
|
128
|
+
byAnchor.delete(row.anchor.value);
|
|
129
|
+
}
|
|
130
|
+
if (row.identity.kind === PRESENCE_KINDS.PRESENT) {
|
|
131
|
+
byIdentity.delete(row.identity.value);
|
|
132
|
+
}
|
|
133
|
+
pendingReceipts.set(receipt.effectId, receipt);
|
|
134
|
+
plans.push({
|
|
135
|
+
outcome: {
|
|
136
|
+
kind: "applied",
|
|
137
|
+
effect,
|
|
138
|
+
rowNumber: absentValue(),
|
|
139
|
+
receipt,
|
|
140
|
+
created: false,
|
|
141
|
+
deletion: true,
|
|
142
|
+
},
|
|
143
|
+
mutation: { kind: "delete", row },
|
|
144
|
+
receipt,
|
|
145
|
+
verify: false,
|
|
146
|
+
});
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// A newly created row is still the empty visible baseline. Its in-memory
|
|
150
|
+
// cells are blank, so hashing them would incorrectly turn the first
|
|
151
|
+
// candidate reconcile into a guard mismatch before the requested fields
|
|
152
|
+
// are written.
|
|
153
|
+
const current = created
|
|
154
|
+
? effect.expectedVisibleHash
|
|
155
|
+
: currentHash(row, effect.payload.fields);
|
|
156
|
+
if (effect.effectKind === EFFECT_KINDS.CANDIDATE_RECONCILE &&
|
|
157
|
+
!created &&
|
|
158
|
+
effect.payload.expectedCandidateHash.kind === APPLICABILITY_KINDS.APPLICABLE &&
|
|
159
|
+
current !== effect.expectedVisibleHash) {
|
|
160
|
+
plans.push({
|
|
161
|
+
outcome: {
|
|
162
|
+
kind: "guard_mismatch",
|
|
163
|
+
effect,
|
|
164
|
+
rowNumber: presentValue(row.rowNumber),
|
|
165
|
+
reason: GOOGLE_SHEETS_API_EFFECT_REASONS.CANDIDATE_GUARD_MISMATCH,
|
|
166
|
+
},
|
|
167
|
+
mutation: undefined,
|
|
168
|
+
receipt: undefined,
|
|
169
|
+
verify: false,
|
|
170
|
+
});
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (current === effect.payload.targetVisibleHash) {
|
|
174
|
+
const receipt = makeReceipt(effect, current, effect.expectedVisibleRevision + 1);
|
|
175
|
+
pendingReceipts.set(receipt.effectId, receipt);
|
|
176
|
+
plans.push({
|
|
177
|
+
outcome: {
|
|
178
|
+
kind: created ? "applied" : "already_applied",
|
|
179
|
+
effect,
|
|
180
|
+
rowNumber: presentValue(row.rowNumber),
|
|
181
|
+
receipt,
|
|
182
|
+
created,
|
|
183
|
+
deletion: false,
|
|
184
|
+
},
|
|
185
|
+
mutation: created ? { kind: "append", row } : undefined,
|
|
186
|
+
receipt,
|
|
187
|
+
verify: false,
|
|
188
|
+
});
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (effect.effectKind === EFFECT_KINDS.SYSTEM_REPAIR) {
|
|
192
|
+
if (effect.repairGuardHash.kind !== PRESENCE_KINDS.PRESENT ||
|
|
193
|
+
current !== effect.repairGuardHash.value) {
|
|
194
|
+
plans.push({
|
|
195
|
+
outcome: {
|
|
196
|
+
kind: "repair_reobserve",
|
|
197
|
+
effect,
|
|
198
|
+
rowNumber: presentValue(row.rowNumber),
|
|
199
|
+
reason: GOOGLE_SHEETS_API_EFFECT_REASONS.REPAIR_GUARD_MISMATCH,
|
|
200
|
+
},
|
|
201
|
+
mutation: undefined,
|
|
202
|
+
receipt: undefined,
|
|
203
|
+
verify: false,
|
|
204
|
+
});
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else if (current !== effect.expectedVisibleHash) {
|
|
209
|
+
plans.push({
|
|
210
|
+
outcome: {
|
|
211
|
+
kind: "guard_mismatch",
|
|
212
|
+
effect,
|
|
213
|
+
rowNumber: presentValue(row.rowNumber),
|
|
214
|
+
reason: GOOGLE_SHEETS_API_EFFECT_REASONS.VISIBLE_GUARD_MISMATCH,
|
|
215
|
+
},
|
|
216
|
+
mutation: undefined,
|
|
217
|
+
receipt: undefined,
|
|
218
|
+
verify: false,
|
|
219
|
+
});
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
for (const [fieldName, cell] of Object.entries(effect.payload.fields)) {
|
|
223
|
+
row.cells[fieldName] = cell;
|
|
224
|
+
if (!row.appended) {
|
|
225
|
+
row.writeFields[fieldName] = cell;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const receipt = makeReceipt(effect, effect.payload.targetVisibleHash, effect.expectedVisibleRevision + 1);
|
|
229
|
+
// Register the receipt for same-request replays: a duplicate effect ID
|
|
230
|
+
// later in this request must replay against it (payload-hash mismatch
|
|
231
|
+
// becomes schema_error, a matching payload becomes already_applied with
|
|
232
|
+
// this same receipt), exactly like the Apps Script queueReceipt_.
|
|
233
|
+
pendingReceipts.set(receipt.effectId, receipt);
|
|
234
|
+
plans.push({
|
|
235
|
+
outcome: {
|
|
236
|
+
kind: "applied",
|
|
237
|
+
effect,
|
|
238
|
+
rowNumber: presentValue(row.rowNumber),
|
|
239
|
+
receipt,
|
|
240
|
+
created,
|
|
241
|
+
deletion: false,
|
|
242
|
+
},
|
|
243
|
+
mutation: created ? { kind: "append", row } : { kind: "update", row },
|
|
244
|
+
receipt,
|
|
245
|
+
// Inline mode re-reads every non-deletion write (created rows included),
|
|
246
|
+
// exactly like the Apps Script postcondition phase.
|
|
247
|
+
verify: true,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return plans;
|
|
251
|
+
}
|
|
252
|
+
/** Runtime validation of one effect against its request route (fail closed). */
|
|
253
|
+
export function requireGatewayEffect(effect, request, context) {
|
|
254
|
+
if (effect.effectId.length === 0) {
|
|
255
|
+
invalidProviderRequest("apply effects", "effectId is required");
|
|
256
|
+
}
|
|
257
|
+
if (effect.payloadHash.length === 0) {
|
|
258
|
+
invalidProviderRequest("apply effects", "payloadHash is required");
|
|
259
|
+
}
|
|
260
|
+
if (!isSyncEffectKind(effect.effectKind)) {
|
|
261
|
+
invalidProviderRequest("apply effects", "effectKind is unsupported");
|
|
262
|
+
}
|
|
263
|
+
if (effect.physicalSheetId !== request.physicalSheetId) {
|
|
264
|
+
invalidProviderRequest("apply effects", "effect does not target the requested physical sheet");
|
|
265
|
+
}
|
|
266
|
+
if (effect.projection !== request.projection) {
|
|
267
|
+
invalidProviderRequest("apply effects", "effect projection is not registered for this request");
|
|
268
|
+
}
|
|
269
|
+
if (effect.effectKind === EFFECT_KINDS.RESOLUTION_DELETE &&
|
|
270
|
+
request.projection !== "sync_conflicts") {
|
|
271
|
+
invalidProviderRequest("apply effects", "resolution_delete is only allowed on sync_conflicts");
|
|
272
|
+
}
|
|
273
|
+
if (effect.effectKind === EFFECT_KINDS.USER_INPUT_DELETE &&
|
|
274
|
+
request.projection !== "user_input") {
|
|
275
|
+
invalidProviderRequest("apply effects", "user_input_delete is only allowed on user_input");
|
|
276
|
+
}
|
|
277
|
+
const payload = effect.payload;
|
|
278
|
+
if (payload.sheetName !== request.sheetName ||
|
|
279
|
+
payload.registeredRange !== request.registeredRange ||
|
|
280
|
+
payload.schemaVersion !== request.schemaVersion) {
|
|
281
|
+
invalidProviderRequest("apply effects", "effect payload does not match the registered projection");
|
|
282
|
+
}
|
|
283
|
+
if (payload.targetAnchor.length === 0) {
|
|
284
|
+
invalidProviderRequest("apply effects", "effect targetAnchor is required");
|
|
285
|
+
}
|
|
286
|
+
const fieldNames = Object.keys(payload.fields);
|
|
287
|
+
if (fieldNames.length === 0) {
|
|
288
|
+
invalidProviderRequest("apply effects", "effect fields must contain a field");
|
|
289
|
+
}
|
|
290
|
+
for (const fieldName of fieldNames) {
|
|
291
|
+
if (!context.positions.has(fieldName)) {
|
|
292
|
+
invalidProviderRequest("apply effects", `effect field is not a registered header: ${fieldName}`);
|
|
293
|
+
}
|
|
294
|
+
if (!isNormalizedCell(payload.fields[fieldName])) {
|
|
295
|
+
invalidProviderRequest("apply effects", "effect fields contain an invalid normalized cell");
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (computeSyncVisibleHash(payload.fields) !== payload.targetVisibleHash) {
|
|
299
|
+
invalidProviderRequest("apply effects", "effect targetVisibleHash does not match fields");
|
|
300
|
+
}
|
|
301
|
+
if (typeof payload.createIfMissing !== "boolean") {
|
|
302
|
+
invalidProviderRequest("apply effects", "effect createIfMissing must be boolean");
|
|
303
|
+
}
|
|
304
|
+
if (!Number.isSafeInteger(effect.expectedVisibleRevision) ||
|
|
305
|
+
effect.expectedVisibleRevision < 0) {
|
|
306
|
+
invalidProviderRequest("apply effects", "effect expectedVisibleRevision must be a non-negative integer");
|
|
307
|
+
}
|
|
308
|
+
if (typeof effect.expectedVisibleHash !== "string") {
|
|
309
|
+
invalidProviderRequest("apply effects", "effect expectedVisibleHash must be a string");
|
|
310
|
+
}
|
|
311
|
+
if (effect.expectedVisibleHash.length === 0 &&
|
|
312
|
+
!(effect.expectedVisibleRevision === 0 && payload.createIfMissing === true)) {
|
|
313
|
+
invalidProviderRequest("apply effects", "empty expectedVisibleHash is only valid for a new row");
|
|
314
|
+
}
|
|
315
|
+
if (effect.repairGuardHash.kind !== PRESENCE_KINDS.PRESENT &&
|
|
316
|
+
effect.repairGuardHash.kind !== PRESENCE_KINDS.ABSENT) {
|
|
317
|
+
invalidProviderRequest("apply effects", "effect repairGuardHash is invalid");
|
|
318
|
+
}
|
|
319
|
+
if (effect.payload.expectedCandidateHash.kind !== APPLICABILITY_KINDS.APPLICABLE &&
|
|
320
|
+
effect.payload.expectedCandidateHash.kind !== APPLICABILITY_KINDS.NOT_APPLICABLE) {
|
|
321
|
+
invalidProviderRequest("apply effects", "effect expectedCandidateHash is invalid");
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/** Receipt replay branch: a receipt already exists for this effect ID. */
|
|
325
|
+
function planReceiptReplay(effect, receipt, context, byAnchor, byIdentity) {
|
|
326
|
+
if (receipt.payloadHash !== effect.payloadHash) {
|
|
327
|
+
return rejectionPlan(effect, "schema_error", GOOGLE_SHEETS_API_EFFECT_REASONS.EFFECT_ID_REUSED_WITH_DIFFERENT_PAYLOAD);
|
|
328
|
+
}
|
|
329
|
+
const receiptRow = findWorkingRow(byAnchor, byIdentity, effect.payload.targetAnchor, effect.targetId);
|
|
330
|
+
if (isDeletionEffect(effect.effectKind)) {
|
|
331
|
+
if (receiptRow === undefined) {
|
|
332
|
+
return {
|
|
333
|
+
outcome: {
|
|
334
|
+
kind: "already_applied",
|
|
335
|
+
effect,
|
|
336
|
+
rowNumber: absentValue(),
|
|
337
|
+
receipt,
|
|
338
|
+
},
|
|
339
|
+
mutation: undefined,
|
|
340
|
+
receipt,
|
|
341
|
+
verify: false,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return rejectionPlan(effect, "guard_mismatch", GOOGLE_SHEETS_API_EFFECT_REASONS.RECEIPT_TARGET_REAPPEARED, presentValue(receiptRow.rowNumber));
|
|
345
|
+
}
|
|
346
|
+
if (receiptRow === undefined) {
|
|
347
|
+
const repair = effect.effectKind === EFFECT_KINDS.SYSTEM_REPAIR;
|
|
348
|
+
return rejectionPlan(effect, repair ? "repair_reobserve" : "guard_mismatch", GOOGLE_SHEETS_API_EFFECT_REASONS.RECEIPT_TARGET_MISSING);
|
|
349
|
+
}
|
|
350
|
+
const receiptCurrentHash = currentHash(receiptRow, effect.payload.fields);
|
|
351
|
+
if (receiptCurrentHash === effect.payload.targetVisibleHash) {
|
|
352
|
+
return {
|
|
353
|
+
outcome: {
|
|
354
|
+
kind: "already_applied",
|
|
355
|
+
effect,
|
|
356
|
+
rowNumber: presentValue(receiptRow.rowNumber),
|
|
357
|
+
receipt,
|
|
358
|
+
},
|
|
359
|
+
mutation: undefined,
|
|
360
|
+
receipt,
|
|
361
|
+
verify: false,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
const repair = effect.effectKind === EFFECT_KINDS.SYSTEM_REPAIR;
|
|
365
|
+
return rejectionPlan(effect, repair ? "repair_reobserve" : "guard_mismatch", GOOGLE_SHEETS_API_EFFECT_REASONS.RECEIPT_POSTCONDITION_CHANGED, presentValue(receiptRow.rowNumber));
|
|
366
|
+
}
|
|
367
|
+
/** Validates the full-row deletion guard exactly like `validateDeletion_`. */
|
|
368
|
+
export function validateDeletion(context, effect) {
|
|
369
|
+
if (effect.payload.createIfMissing ||
|
|
370
|
+
effect.expectedVisibleRevision < 1 ||
|
|
371
|
+
effect.payload.targetVisibleHash !== effect.expectedVisibleHash) {
|
|
372
|
+
return GOOGLE_SHEETS_API_EFFECT_REASONS.INVALID_DELETION_GUARD;
|
|
373
|
+
}
|
|
374
|
+
const actual = Object.keys(effect.payload.fields).sort();
|
|
375
|
+
const expected = [...context.headers].sort();
|
|
376
|
+
if (actual.length !== expected.length ||
|
|
377
|
+
actual.some((fieldName, index) => fieldName !== expected[index])) {
|
|
378
|
+
return fullRowDeletionReason(effect.effectKind);
|
|
379
|
+
}
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
/** Computes the visible hash of a row restricted to the effect's fields. */
|
|
383
|
+
export function currentHash(row, fields) {
|
|
384
|
+
const values = {};
|
|
385
|
+
for (const fieldName of Object.keys(fields)) {
|
|
386
|
+
values[fieldName] = row.cells[fieldName] ?? null;
|
|
387
|
+
}
|
|
388
|
+
return computeSyncVisibleHash(values);
|
|
389
|
+
}
|
|
390
|
+
/** Builds a receipt record exactly like `makeReceipt_`. */
|
|
391
|
+
export function makeReceipt(effect, visibleHash, visibleRevision) {
|
|
392
|
+
return {
|
|
393
|
+
effectId: effect.effectId,
|
|
394
|
+
payloadHash: effect.payloadHash,
|
|
395
|
+
status: "applied",
|
|
396
|
+
visibleHash,
|
|
397
|
+
visibleRevision,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
/** Finds a row by anchor first, then visible identity, then the targetId tail. */
|
|
401
|
+
export function findWorkingRow(byAnchor, byIdentity, anchor, targetId) {
|
|
402
|
+
const anchored = byAnchor.get(anchor);
|
|
403
|
+
if (anchored !== undefined)
|
|
404
|
+
return anchored;
|
|
405
|
+
const direct = byIdentity.get(targetId);
|
|
406
|
+
if (direct !== undefined)
|
|
407
|
+
return direct;
|
|
408
|
+
const separator = targetId.lastIndexOf(":");
|
|
409
|
+
if (separator < 0)
|
|
410
|
+
return undefined;
|
|
411
|
+
const visibleIdentity = targetId.slice(separator + 1);
|
|
412
|
+
if (visibleIdentity.length === 0)
|
|
413
|
+
return undefined;
|
|
414
|
+
return byIdentity.get(visibleIdentity);
|
|
415
|
+
}
|
|
416
|
+
/** Builds a rejection plan (no mutation, no receipt). */
|
|
417
|
+
function rejectionPlan(effect, kind, reason, rowNumber = absentValue()) {
|
|
418
|
+
return {
|
|
419
|
+
outcome: { kind, effect, rowNumber, reason },
|
|
420
|
+
mutation: undefined,
|
|
421
|
+
receipt: undefined,
|
|
422
|
+
verify: false,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/** Converts one preflight row into a working row for planning/probing. */
|
|
426
|
+
export function toWorkingRow(row) {
|
|
427
|
+
return {
|
|
428
|
+
rowNumber: row.rowNumber,
|
|
429
|
+
anchor: row.physicalAnchor,
|
|
430
|
+
cells: { ...row.cells },
|
|
431
|
+
identity: row.identity,
|
|
432
|
+
appended: false,
|
|
433
|
+
deleted: false,
|
|
434
|
+
writeFields: {},
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
function createWorkingRow(effect, rowNumber) {
|
|
438
|
+
const cells = {};
|
|
439
|
+
return {
|
|
440
|
+
rowNumber,
|
|
441
|
+
anchor: presentValue(effect.payload.targetAnchor),
|
|
442
|
+
cells,
|
|
443
|
+
// Key the created row by its full targetId (Apps Script `createRow_`
|
|
444
|
+
// registers byIdentity[targetId] when targetId is non-empty) so a later
|
|
445
|
+
// effect in the same request that targets the same entity finds this row
|
|
446
|
+
// through findWorkingRow's direct targetId lookup instead of creating a
|
|
447
|
+
// second physical row. The caller registers it in byIdentity under
|
|
448
|
+
// effect.targetId via the identity value below.
|
|
449
|
+
identity: effect.targetId.length > 0 ? presentValue(effect.targetId) : absentValue(),
|
|
450
|
+
appended: true,
|
|
451
|
+
deleted: false,
|
|
452
|
+
writeFields: {},
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
export function isDeletionEffect(effectKind) {
|
|
456
|
+
return effectKind === EFFECT_KINDS.RESOLUTION_DELETE ||
|
|
457
|
+
effectKind === EFFECT_KINDS.USER_INPUT_DELETE;
|
|
458
|
+
}
|
|
459
|
+
function isSyncEffectKind(value) {
|
|
460
|
+
return value === "system_projection" ||
|
|
461
|
+
value === "candidate_reconcile" ||
|
|
462
|
+
value === "system_repair" ||
|
|
463
|
+
value === "resolution_projection" ||
|
|
464
|
+
value === EFFECT_KINDS.RESOLUTION_DELETE ||
|
|
465
|
+
value === EFFECT_KINDS.USER_INPUT_DELETE;
|
|
466
|
+
}
|
|
467
|
+
/** Encodes a planned outcome as a gateway result (Apps Script `result_`). */
|
|
468
|
+
export function encodeOutcomeResult(outcome) {
|
|
469
|
+
switch (outcome.kind) {
|
|
470
|
+
case "applied":
|
|
471
|
+
case "already_applied":
|
|
472
|
+
return {
|
|
473
|
+
effectId: outcome.effect.effectId,
|
|
474
|
+
payloadHash: outcome.effect.payloadHash,
|
|
475
|
+
status: outcome.kind === "applied"
|
|
476
|
+
? SYNC_GATEWAY_EFFECT_RESULT_STATUSES.APPLIED
|
|
477
|
+
: SYNC_GATEWAY_EFFECT_RESULT_STATUSES.ALREADY_APPLIED,
|
|
478
|
+
visibleRevision: presentValue(outcome.receipt.visibleRevision),
|
|
479
|
+
visibleHash: presentValue(outcome.receipt.visibleHash),
|
|
480
|
+
snapshotHash: absentValue(),
|
|
481
|
+
reason: absentValue(),
|
|
482
|
+
postcondition: SYNC_GATEWAY_POSTCONDITION_STATUSES.VERIFIED,
|
|
483
|
+
};
|
|
484
|
+
case "guard_mismatch":
|
|
485
|
+
case "repair_reobserve":
|
|
486
|
+
case "schema_error":
|
|
487
|
+
case "retryable_error":
|
|
488
|
+
return {
|
|
489
|
+
effectId: outcome.effect.effectId,
|
|
490
|
+
payloadHash: outcome.effect.payloadHash,
|
|
491
|
+
status: outcome.kind,
|
|
492
|
+
visibleRevision: absentValue(),
|
|
493
|
+
visibleHash: absentValue(),
|
|
494
|
+
snapshotHash: absentValue(),
|
|
495
|
+
reason: presentValue(outcome.reason),
|
|
496
|
+
postcondition: SYNC_GATEWAY_POSTCONDITION_STATUSES.UNAVAILABLE,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/** Builds a schema_error result without any receipt-backed evidence. */
|
|
501
|
+
export function encodeSchemaErrorResult(effect, reason) {
|
|
502
|
+
return {
|
|
503
|
+
effectId: effect.effectId,
|
|
504
|
+
payloadHash: effect.payloadHash,
|
|
505
|
+
status: SYNC_GATEWAY_EFFECT_RESULT_STATUSES.SCHEMA_ERROR,
|
|
506
|
+
visibleRevision: absentValue(),
|
|
507
|
+
visibleHash: absentValue(),
|
|
508
|
+
snapshotHash: absentValue(),
|
|
509
|
+
reason: presentValue(reason),
|
|
510
|
+
postcondition: SYNC_GATEWAY_POSTCONDITION_STATUSES.UNAVAILABLE,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
/** Applies the deferred-mode postcondition relabeling for applied results. */
|
|
514
|
+
export function withDeferredPostcondition(result) {
|
|
515
|
+
if ((result.status === SYNC_GATEWAY_EFFECT_RESULT_STATUSES.APPLIED ||
|
|
516
|
+
result.status === SYNC_GATEWAY_EFFECT_RESULT_STATUSES.ALREADY_APPLIED) &&
|
|
517
|
+
result.postcondition === SYNC_GATEWAY_POSTCONDITION_STATUSES.VERIFIED) {
|
|
518
|
+
return { ...result, postcondition: SYNC_GATEWAY_POSTCONDITION_STATUSES.ACKNOWLEDGED };
|
|
519
|
+
}
|
|
520
|
+
return result;
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/model/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response-loss postcondition classifier (Apps Script `classifyPostcondition_`).
|
|
3
|
+
*
|
|
4
|
+
* Recovery probes classify one effect against a fresh target+receipt read.
|
|
5
|
+
* The classifier never assumes success: a receipt proves the effect reached
|
|
6
|
+
* the sheet, a matching visible hash proves the target content, and anything
|
|
7
|
+
* else is `unapplied`, `changed`, or `unavailable` so the worker redrives,
|
|
8
|
+
* fails, or keeps probing instead of closing the outbox on weak evidence.
|
|
9
|
+
*/
|
|
10
|
+
import type { SyncEffectPostcondition, SyncGatewayEffect } from "../../../../../application/sync/gateway/syncGateway.js";
|
|
11
|
+
import type { PreflightContext, PreflightReceipt } from "./preflight.js";
|
|
12
|
+
/**
|
|
13
|
+
* Classifies one effect's delivery state. `context` must come from the same
|
|
14
|
+
* read pass as `receipts` so the classification is a single consistent view.
|
|
15
|
+
*/
|
|
16
|
+
export declare function classifyPostcondition(context: PreflightContext, effect: SyncGatewayEffect, receipts: ReadonlyMap<string, PreflightReceipt>): SyncEffectPostcondition;
|
|
17
|
+
//# sourceMappingURL=postcondition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postcondition.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/model/postcondition.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,wDAAwD,CAAC;AAGzH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAUzE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC9C,uBAAuB,CA+DzB"}
|