@indigoai-us/hq-cloud 6.15.0 → 6.15.2
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/bin/sync-mutation.d.ts +16 -0
- package/dist/bin/sync-mutation.d.ts.map +1 -0
- package/dist/bin/sync-mutation.js +60 -0
- package/dist/bin/sync-mutation.js.map +1 -0
- package/dist/bin/sync-mutation.test.d.ts +2 -0
- package/dist/bin/sync-mutation.test.d.ts.map +1 -0
- package/dist/bin/sync-mutation.test.js +165 -0
- package/dist/bin/sync-mutation.test.js.map +1 -0
- package/dist/bin/sync-runner-company.d.ts +8 -0
- package/dist/bin/sync-runner-company.d.ts.map +1 -1
- package/dist/bin/sync-runner-company.js +16 -0
- package/dist/bin/sync-runner-company.js.map +1 -1
- package/dist/bin/sync-runner-company.test.d.ts +2 -0
- package/dist/bin/sync-runner-company.test.d.ts.map +1 -0
- package/dist/bin/sync-runner-company.test.js +36 -0
- package/dist/bin/sync-runner-company.test.js.map +1 -0
- package/dist/bin/sync-runner-watch-loop.d.ts.map +1 -1
- package/dist/bin/sync-runner-watch-loop.js +98 -8
- package/dist/bin/sync-runner-watch-loop.js.map +1 -1
- package/dist/bin/sync-runner.d.ts +17 -0
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +109 -0
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/conflict-recovery.test.d.ts +2 -0
- package/dist/cli/conflict-recovery.test.d.ts.map +1 -0
- package/dist/cli/conflict-recovery.test.js +201 -0
- package/dist/cli/conflict-recovery.test.js.map +1 -0
- package/dist/cli/conflict.d.ts +60 -0
- package/dist/cli/conflict.d.ts.map +1 -1
- package/dist/cli/conflict.js +333 -0
- package/dist/cli/conflict.js.map +1 -1
- package/dist/cli/sync.d.ts +35 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +100 -0
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +85 -1
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/skill-telemetry.d.ts +6 -0
- package/dist/skill-telemetry.d.ts.map +1 -1
- package/dist/skill-telemetry.js +14 -2
- package/dist/skill-telemetry.js.map +1 -1
- package/dist/skill-telemetry.test.js +79 -0
- package/dist/skill-telemetry.test.js.map +1 -1
- package/dist/sync/candidate-uploader.d.ts +88 -0
- package/dist/sync/candidate-uploader.d.ts.map +1 -0
- package/dist/sync/candidate-uploader.js +212 -0
- package/dist/sync/candidate-uploader.js.map +1 -0
- package/dist/sync/candidate-uploader.test.d.ts +2 -0
- package/dist/sync/candidate-uploader.test.d.ts.map +1 -0
- package/dist/sync/candidate-uploader.test.js +132 -0
- package/dist/sync/candidate-uploader.test.js.map +1 -0
- package/dist/sync/delta-client.d.ts +73 -0
- package/dist/sync/delta-client.d.ts.map +1 -0
- package/dist/sync/delta-client.js +201 -0
- package/dist/sync/delta-client.js.map +1 -0
- package/dist/sync/delta-client.test.d.ts +2 -0
- package/dist/sync/delta-client.test.d.ts.map +1 -0
- package/dist/sync/delta-client.test.js +97 -0
- package/dist/sync/delta-client.test.js.map +1 -0
- package/dist/sync/durable-apply.d.ts +76 -0
- package/dist/sync/durable-apply.d.ts.map +1 -0
- package/dist/sync/durable-apply.js +530 -0
- package/dist/sync/durable-apply.js.map +1 -0
- package/dist/sync/durable-apply.test.d.ts +2 -0
- package/dist/sync/durable-apply.test.d.ts.map +1 -0
- package/dist/sync/durable-apply.test.js +180 -0
- package/dist/sync/durable-apply.test.js.map +1 -0
- package/dist/sync/event-sync.d.ts +33 -1
- package/dist/sync/event-sync.d.ts.map +1 -1
- package/dist/sync/event-sync.js +149 -1
- package/dist/sync/event-sync.js.map +1 -1
- package/dist/sync/event-sync.test.js +142 -1
- package/dist/sync/event-sync.test.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/multipart-uploader.d.ts +99 -0
- package/dist/sync/multipart-uploader.d.ts.map +1 -0
- package/dist/sync/multipart-uploader.js +447 -0
- package/dist/sync/multipart-uploader.js.map +1 -0
- package/dist/sync/multipart-uploader.test.d.ts +2 -0
- package/dist/sync/multipart-uploader.test.d.ts.map +1 -0
- package/dist/sync/multipart-uploader.test.js +119 -0
- package/dist/sync/multipart-uploader.test.js.map +1 -0
- package/dist/sync/mutation-client.d.ts +85 -0
- package/dist/sync/mutation-client.d.ts.map +1 -0
- package/dist/sync/mutation-client.js +245 -0
- package/dist/sync/mutation-client.js.map +1 -0
- package/dist/sync/mutation-client.test.d.ts +2 -0
- package/dist/sync/mutation-client.test.d.ts.map +1 -0
- package/dist/sync/mutation-client.test.js +51 -0
- package/dist/sync/mutation-client.test.js.map +1 -0
- package/dist/sync/push-receiver.d.ts +45 -0
- package/dist/sync/push-receiver.d.ts.map +1 -1
- package/dist/sync/push-receiver.js +101 -0
- package/dist/sync/push-receiver.js.map +1 -1
- package/dist/sync/push-receiver.test.js +54 -2
- package/dist/sync/push-receiver.test.js.map +1 -1
- package/dist/sync/scope-inventory-client.d.ts +69 -0
- package/dist/sync/scope-inventory-client.d.ts.map +1 -0
- package/dist/sync/scope-inventory-client.js +210 -0
- package/dist/sync/scope-inventory-client.js.map +1 -0
- package/dist/sync/scope-inventory-client.test.d.ts +2 -0
- package/dist/sync/scope-inventory-client.test.d.ts.map +1 -0
- package/dist/sync/scope-inventory-client.test.js +94 -0
- package/dist/sync/scope-inventory-client.test.js.map +1 -0
- package/dist/sync/snapshot-client.d.ts +98 -0
- package/dist/sync/snapshot-client.d.ts.map +1 -0
- package/dist/sync/snapshot-client.js +402 -0
- package/dist/sync/snapshot-client.js.map +1 -0
- package/dist/sync/snapshot-client.test.d.ts +2 -0
- package/dist/sync/snapshot-client.test.d.ts.map +1 -0
- package/dist/sync/snapshot-client.test.js +169 -0
- package/dist/sync/snapshot-client.test.js.map +1 -0
- package/dist/sync/uploader-finalization.d.ts +97 -0
- package/dist/sync/uploader-finalization.d.ts.map +1 -0
- package/dist/sync/uploader-finalization.js +273 -0
- package/dist/sync/uploader-finalization.js.map +1 -0
- package/dist/sync/uploader-finalization.test.d.ts +2 -0
- package/dist/sync/uploader-finalization.test.d.ts.map +1 -0
- package/dist/sync/uploader-finalization.test.js +92 -0
- package/dist/sync/uploader-finalization.test.js.map +1 -0
- package/dist/telemetry.d.ts +11 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +21 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/telemetry.test.js +80 -0
- package/dist/telemetry.test.js.map +1 -1
- package/package.json +6 -1
- package/.claude/policies/hq-cloud-esm-cannot-spy-fs-builtins.md +0 -30
- package/.claude/policies/hq-cloud-strip-types-no-parameter-properties.md +0 -22
- package/.github/workflows/ci.yml +0 -84
- package/.github/workflows/publish.yml +0 -56
- package/.github/workflows/unreleased-commits-nag.yml +0 -256
- package/eslint.config.js +0 -67
- package/pnpm-workspace.yaml +0 -2
- package/scripts/presign-transport-e2e.mjs +0 -250
- package/scripts/vault-rebaseline.sh +0 -323
- package/scripts/vault-rescue.sh +0 -332
- package/src/active-company.test.ts +0 -188
- package/src/active-company.ts +0 -168
- package/src/agent-codex-instructions.test.ts +0 -332
- package/src/agent-codex-instructions.ts +0 -309
- package/src/auth.ts +0 -146
- package/src/backup-prune.test.ts +0 -98
- package/src/backup-prune.ts +0 -182
- package/src/bin/backup-prune-runner.ts +0 -33
- package/src/bin/rescue-runner.ts +0 -25
- package/src/bin/sync-runner-company.ts +0 -695
- package/src/bin/sync-runner-events.test.ts +0 -143
- package/src/bin/sync-runner-events.ts +0 -55
- package/src/bin/sync-runner-planning.test.ts +0 -311
- package/src/bin/sync-runner-planning.ts +0 -258
- package/src/bin/sync-runner-rollup.test.ts +0 -37
- package/src/bin/sync-runner-rollup.ts +0 -97
- package/src/bin/sync-runner-telemetry.ts +0 -15
- package/src/bin/sync-runner-watch-loop.ts +0 -1235
- package/src/bin/sync-runner-watch-routes.test.ts +0 -71
- package/src/bin/sync-runner-watch-routes.ts +0 -184
- package/src/bin/sync-runner.test.ts +0 -8767
- package/src/bin/sync-runner.ts +0 -2190
- package/src/cli/accept.ts +0 -124
- package/src/cli/conflict.ts +0 -119
- package/src/cli/doctor.test.ts +0 -581
- package/src/cli/doctor.ts +0 -642
- package/src/cli/index.ts +0 -49
- package/src/cli/invite.test.ts +0 -250
- package/src/cli/invite.ts +0 -214
- package/src/cli/promote.ts +0 -157
- package/src/cli/reindex-knowledge.test.ts +0 -307
- package/src/cli/reindex-knowledge.ts +0 -450
- package/src/cli/reindex.test.ts +0 -957
- package/src/cli/reindex.ts +0 -979
- package/src/cli/rescue-classify-ordering.test.ts +0 -548
- package/src/cli/rescue-clone-diagnostics.test.ts +0 -120
- package/src/cli/rescue-core.ts +0 -3011
- package/src/cli/rescue-drift-reconcile.test.ts +0 -179
- package/src/cli/rescue-drop-dir-symlink.test.ts +0 -224
- package/src/cli/rescue-exec-bit-preserve.test.ts +0 -187
- package/src/cli/rescue-hq-root-guard.test.ts +0 -232
- package/src/cli/rescue-journal-reconcile.test.ts +0 -215
- package/src/cli/rescue-mtime-preserve.test.ts +0 -203
- package/src/cli/rescue-settings-reconcile.test.ts +0 -637
- package/src/cli/rescue-snapshot.test.ts +0 -57
- package/src/cli/rescue-snapshot.ts +0 -51
- package/src/cli/rescue.reindex.test.ts +0 -63
- package/src/cli/rescue.test.ts +0 -131
- package/src/cli/rescue.ts +0 -182
- package/src/cli/share.test.ts +0 -7843
- package/src/cli/share.ts +0 -3663
- package/src/cli/sync-scope.test.ts +0 -652
- package/src/cli/sync.test.ts +0 -5207
- package/src/cli/sync.ts +0 -3470
- package/src/cli/tombstones.ts +0 -106
- package/src/cli/watch-event-push-conflict.test.ts +0 -234
- package/src/client-info.test.ts +0 -214
- package/src/client-info.ts +0 -121
- package/src/cognito-auth.test.ts +0 -712
- package/src/cognito-auth.ts +0 -1422
- package/src/company-resolver.test.ts +0 -618
- package/src/company-resolver.ts +0 -521
- package/src/context.test.ts +0 -583
- package/src/context.ts +0 -378
- package/src/daemon-worker.ts +0 -26
- package/src/daemon.ts +0 -99
- package/src/entity-resolver.test.ts +0 -315
- package/src/entity-resolver.ts +0 -180
- package/src/ignore.test.ts +0 -466
- package/src/ignore.ts +0 -469
- package/src/index.ts +0 -439
- package/src/journal.test.ts +0 -968
- package/src/journal.ts +0 -765
- package/src/lib/cloud-authoritative.test.ts +0 -45
- package/src/lib/cloud-authoritative.ts +0 -59
- package/src/lib/conflict-file.ts +0 -86
- package/src/lib/conflict-index.ts +0 -289
- package/src/lib/conflict.test.ts +0 -348
- package/src/lib/describe-error.test.ts +0 -100
- package/src/lib/describe-error.ts +0 -58
- package/src/lib/exit-codes.ts +0 -24
- package/src/lib/machine-id.test.ts +0 -231
- package/src/lib/machine-id.ts +0 -175
- package/src/lib/net-errors.test.ts +0 -65
- package/src/lib/net-errors.ts +0 -86
- package/src/lib/readlink-safe.test.ts +0 -43
- package/src/lib/readlink-safe.ts +0 -29
- package/src/local-path-codec.test.ts +0 -138
- package/src/local-path-codec.ts +0 -161
- package/src/machine-auth.test.ts +0 -1323
- package/src/manifest-reconcile.test.ts +0 -1123
- package/src/manifest-reconcile.ts +0 -518
- package/src/object-io.test.ts +0 -1221
- package/src/object-io.ts +0 -1306
- package/src/operation-lock.test.ts +0 -484
- package/src/operation-lock.ts +0 -680
- package/src/outcome-telemetry.test.ts +0 -498
- package/src/outcome-telemetry.ts +0 -639
- package/src/personal-vault-exclusions.test.ts +0 -308
- package/src/personal-vault-exclusions.ts +0 -354
- package/src/personal-vault.test.ts +0 -756
- package/src/personal-vault.ts +0 -496
- package/src/prefix-coalesce.test.ts +0 -240
- package/src/prefix-coalesce.ts +0 -273
- package/src/public-surface.test.ts +0 -117
- package/src/qmd-reindex.test.ts +0 -877
- package/src/qmd-reindex.ts +0 -842
- package/src/read-only-state-dir.test.ts +0 -188
- package/src/remote-pull.test.ts +0 -1130
- package/src/remote-pull.ts +0 -618
- package/src/s3.symlink-materialize.test.ts +0 -492
- package/src/s3.test.ts +0 -1789
- package/src/s3.ts +0 -1532
- package/src/schemas/signal-types.test.ts +0 -82
- package/src/schemas/signal-types.ts +0 -38
- package/src/schemas/source-channels.test.ts +0 -82
- package/src/schemas/source-channels.ts +0 -53
- package/src/scope-shrink.test.ts +0 -633
- package/src/scope-shrink.ts +0 -481
- package/src/signals/get.test.ts +0 -310
- package/src/signals/get.ts +0 -75
- package/src/signals/internals.ts +0 -195
- package/src/signals/list.test.ts +0 -420
- package/src/signals/list.ts +0 -79
- package/src/signals/parse.ts +0 -8
- package/src/signals/types.ts +0 -91
- package/src/skill-telemetry.test.ts +0 -1825
- package/src/skill-telemetry.ts +0 -1439
- package/src/sources/get.test.ts +0 -293
- package/src/sources/get.ts +0 -66
- package/src/sources/internals.ts +0 -198
- package/src/sources/list.test.ts +0 -402
- package/src/sources/list.ts +0 -84
- package/src/sources/parse.ts +0 -43
- package/src/sources/types.ts +0 -84
- package/src/sync/event-sync.test.ts +0 -594
- package/src/sync/event-sync.ts +0 -545
- package/src/sync/feature-flags.test.ts +0 -378
- package/src/sync/feature-flags.ts +0 -62
- package/src/sync/index.ts +0 -76
- package/src/sync/lease-client.test.ts +0 -128
- package/src/sync/lease-client.ts +0 -207
- package/src/sync/logger.test.ts +0 -242
- package/src/sync/logger.ts +0 -79
- package/src/sync/metrics.test.ts +0 -462
- package/src/sync/metrics.ts +0 -213
- package/src/sync/pull-scope.ts +0 -265
- package/src/sync/push-event.test.ts +0 -266
- package/src/sync/push-event.ts +0 -224
- package/src/sync/push-receiver.test.ts +0 -566
- package/src/sync/push-receiver.ts +0 -1048
- package/src/sync/push-transport.ts +0 -231
- package/src/sync/realtime-rollout.test.ts +0 -86
- package/src/sync/realtime-rollout.ts +0 -262
- package/src/sync/state-store.test.ts +0 -194
- package/src/sync/state-store.ts +0 -727
- package/src/sync-core.ts +0 -58
- package/src/sync-progress.test.ts +0 -94
- package/src/sync-progress.ts +0 -140
- package/src/telemetry-events.test.ts +0 -88
- package/src/telemetry-events.ts +0 -205
- package/src/telemetry.test.ts +0 -1280
- package/src/telemetry.ts +0 -1109
- package/src/types.ts +0 -314
- package/src/vault-client.test.ts +0 -1380
- package/src/vault-client.ts +0 -1694
- package/src/version.ts +0 -24
- package/src/watch-roots.test.ts +0 -278
- package/src/watch-roots.ts +0 -162
- package/src/watcher-event-gate.test.ts +0 -212
- package/src/watcher.test.ts +0 -1079
- package/src/watcher.ts +0 -1741
- package/test/e2e/sync/cross-tenant-isolation.test.ts +0 -630
- package/test/e2e/sync/skill-telemetry-oversized-transcript.test.ts +0 -124
- package/test/e2e/sync/transient-company-leg.test.ts +0 -384
- package/test/e2e/sync/windows-unreadable-link-leg.test.ts +0 -191
- package/test/e2e/watcher-real-chokidar.test.ts +0 -165
- package/test/e2e/watcher-recursive-backend.test.ts +0 -181
- package/test/e2e/watcher-scoped-coverage.test.ts +0 -381
- package/test/invite-flow.integration.test.ts +0 -244
- package/test/joiner-manifest-reconcile.integration.test.ts +0 -322
- package/test/share-sync.integration.test.ts +0 -213
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -22
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-client.js","sourceRoot":"","sources":["../../src/sync/snapshot-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-client.test.d.ts","sourceRoot":"","sources":["../../src/sync/snapshot-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { DurableApplyEngine } from "./durable-apply.js";
|
|
7
|
+
import { SnapshotClient } from "./snapshot-client.js";
|
|
8
|
+
const NOW = Date.parse("2026-08-14T00:00:00.000Z");
|
|
9
|
+
const roots = [];
|
|
10
|
+
const bytes = Buffer.from("snapshot bytes\n", "utf8");
|
|
11
|
+
const contentSha = `sha256:${crypto.createHash("sha256").update(bytes).digest("hex")}`;
|
|
12
|
+
const projection = `sha256:${"a".repeat(64)}`;
|
|
13
|
+
const authorization = {
|
|
14
|
+
bearer: "access-token", deviceId: "device_a",
|
|
15
|
+
capabilityVector: { hqCloud: "6.15.0", hqDesktop: "none", protocol: 2, journal: 3, durableApply: 2 },
|
|
16
|
+
lease: { lease: "lease_a", issuedAt: "2026-08-14T00:00:00.000Z", expiresAt: "2026-08-14T00:01:00.000Z", authorizationEpoch: "epoch_a" },
|
|
17
|
+
};
|
|
18
|
+
function canonical(value) {
|
|
19
|
+
if (value === null || typeof value === "boolean" || typeof value === "string" || typeof value === "number")
|
|
20
|
+
return JSON.stringify(value);
|
|
21
|
+
if (Array.isArray(value))
|
|
22
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
23
|
+
return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, entry]) => `${canonical(key)}:${canonical(entry)}`).join(",")}}`;
|
|
24
|
+
}
|
|
25
|
+
const manifest = {
|
|
26
|
+
contractVersion: 3,
|
|
27
|
+
scopeUid: "prs_snapshot",
|
|
28
|
+
projectionDigest: projection,
|
|
29
|
+
authorizationContextDigest: `sha256:${"b".repeat(64)}`,
|
|
30
|
+
barrier: { epoch: "4", sequence: "41" },
|
|
31
|
+
entries: [{ canonicalPath: "notes/a.md", headState: "present", versionId: "version_17", deltaId: "delta_17", source: { kind: "regular", mode: 0o640 }, sha256: contentSha, size: bytes.length }],
|
|
32
|
+
};
|
|
33
|
+
const manifestChecksum = `sha256:${crypto.createHash("sha256").update(canonical(manifest), "utf8").digest("hex")}`;
|
|
34
|
+
const descriptor = { descriptorId: "snapshot_17", projectionDigest: projection, checksum: manifestChecksum, barrier: { epoch: "4", sequence: "41" }, cursor: "cursor_at_H", url: "https://s3.example.test/snapshot-17", expiresAt: new Date(NOW + 30_000).toISOString(), versionId: "snapshot-version-17" };
|
|
35
|
+
function response(status, value = "", headers = {}, body = null) {
|
|
36
|
+
const lowered = new Map(Object.entries(headers).map(([name, entry]) => [name.toLowerCase(), entry]));
|
|
37
|
+
return { ok: status >= 200 && status < 300, status, headers: { get: (name) => lowered.get(name.toLowerCase()) ?? null }, body, text: async () => typeof value === "string" ? value : JSON.stringify(value) };
|
|
38
|
+
}
|
|
39
|
+
async function* stream(value) { yield value; }
|
|
40
|
+
function root() {
|
|
41
|
+
const value = fs.mkdtempSync(path.join(os.tmpdir(), "hq-snapshot-client-"));
|
|
42
|
+
roots.push(value);
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function apply(rootDir, afterStep) {
|
|
46
|
+
return new DurableApplyEngine({ rootDir: path.join(rootDir, "projection"), stateRootDir: path.join(rootDir, "state"), scopeId: "prs_snapshot", initialCursor: "cursor_old", afterStep });
|
|
47
|
+
}
|
|
48
|
+
function client(rootDir, fetchImpl) {
|
|
49
|
+
return new SnapshotClient({ apiUrl: "https://api.example.test", stateRootDir: path.join(rootDir, "state"), scopeId: "prs_snapshot", fetchImpl, now: () => NOW });
|
|
50
|
+
}
|
|
51
|
+
function normalFetch() {
|
|
52
|
+
return vi.fn()
|
|
53
|
+
.mockResolvedValueOnce(response(200, descriptor))
|
|
54
|
+
.mockResolvedValueOnce(response(200, manifest, { "x-amz-version-id": descriptor.versionId }))
|
|
55
|
+
.mockResolvedValueOnce(response(200, { url: "https://s3.example.test/content-17", expiresAt: new Date(NOW + 30_000).toISOString(), versionId: "version_17", sha256: contentSha, size: bytes.length }))
|
|
56
|
+
.mockResolvedValueOnce(response(200, "", { "x-amz-version-id": "version_17" }, stream(bytes)))
|
|
57
|
+
.mockResolvedValueOnce(response(204))
|
|
58
|
+
.mockResolvedValueOnce(response(200, { untilCursor: "cursor_after_H", nextPageToken: null, deltas: [] }));
|
|
59
|
+
}
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
for (const value of roots.splice(0))
|
|
62
|
+
fs.rmSync(value, { recursive: true, force: true });
|
|
63
|
+
});
|
|
64
|
+
describe("SnapshotClient", () => {
|
|
65
|
+
it("persists and validates the immutable manifest, acknowledges H, then drains only post-H deltas", async () => {
|
|
66
|
+
const dir = root();
|
|
67
|
+
const fetchImpl = normalFetch();
|
|
68
|
+
const durable = apply(dir);
|
|
69
|
+
await expect(client(dir, fetchImpl).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: descriptor.descriptorId, resetId: "reset_17", durableApply: durable })).resolves.toMatchObject({ descriptorId: descriptor.descriptorId, cursor: descriptor.cursor, manifestEntries: 1, resetAcknowledged: true, postSnapshotDrain: { untilCursor: "cursor_after_H", pages: 1, deltas: 0 } });
|
|
70
|
+
expect(durable.getState().cursor).toBe("cursor_after_H");
|
|
71
|
+
expect(fs.readFileSync(path.join(dir, "projection", "notes", "a.md"))).toEqual(bytes);
|
|
72
|
+
expect(fs.statSync(path.join(dir, "projection", "notes", "a.md")).mode & 0o777).toBe(0o640);
|
|
73
|
+
expect(fetchImpl.mock.calls[4]?.[0]).toBe("https://api.example.test/v2/sync/resets/reset_17/ack");
|
|
74
|
+
expect(JSON.parse(fetchImpl.mock.calls[4]?.[1]?.body)).toEqual({ checksum: manifestChecksum, cursor: descriptor.cursor });
|
|
75
|
+
expect(fetchImpl.mock.calls[5]?.[0]).toContain(`cursor=${descriptor.cursor}`);
|
|
76
|
+
for (const [url] of fetchImpl.mock.calls)
|
|
77
|
+
expect(url).not.toMatch(/list|bucket|\.hq-control/i);
|
|
78
|
+
});
|
|
79
|
+
it("fails before filesystem mutation or reset acknowledgement when the manifest checksum is wrong", async () => {
|
|
80
|
+
const dir = root();
|
|
81
|
+
const fetchImpl = vi.fn()
|
|
82
|
+
.mockResolvedValueOnce(response(200, { ...descriptor, checksum: `sha256:${"c".repeat(64)}` }))
|
|
83
|
+
.mockResolvedValueOnce(response(200, manifest, { "x-amz-version-id": descriptor.versionId }));
|
|
84
|
+
const durable = apply(dir);
|
|
85
|
+
await expect(client(dir, fetchImpl).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: descriptor.descriptorId, resetId: "reset_17", durableApply: durable })).rejects.toThrow(/manifest does not match/);
|
|
86
|
+
expect(durable.getState().cursor).toBe("cursor_old");
|
|
87
|
+
expect(fs.existsSync(path.join(dir, "projection", "notes", "a.md"))).toBe(false);
|
|
88
|
+
expect(fetchImpl).toHaveBeenCalledTimes(2);
|
|
89
|
+
});
|
|
90
|
+
it("resumes a persisted descriptor after a crash and does not acknowledge before H is durable", async () => {
|
|
91
|
+
const dir = root();
|
|
92
|
+
const firstFetch = vi.fn()
|
|
93
|
+
.mockResolvedValueOnce(response(200, descriptor))
|
|
94
|
+
.mockResolvedValueOnce(response(200, manifest, { "x-amz-version-id": descriptor.versionId }))
|
|
95
|
+
.mockResolvedValueOnce(response(200, { url: "https://s3.example.test/content-17", expiresAt: new Date(NOW + 30_000).toISOString(), versionId: "version_17", sha256: contentSha, size: bytes.length }))
|
|
96
|
+
.mockResolvedValueOnce(response(200, "", { "x-amz-version-id": "version_17" }, stream(bytes)));
|
|
97
|
+
const crashed = apply(dir, (step) => { if (step === "cursor-durable")
|
|
98
|
+
throw new Error("crash at cursor boundary"); });
|
|
99
|
+
await expect(client(dir, firstFetch).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: descriptor.descriptorId, resetId: "reset_17", durableApply: crashed })).rejects.toThrow("crash at cursor boundary");
|
|
100
|
+
expect(firstFetch).toHaveBeenCalledTimes(4);
|
|
101
|
+
const resumed = apply(dir);
|
|
102
|
+
const secondFetch = vi.fn()
|
|
103
|
+
.mockResolvedValueOnce(response(200, descriptor))
|
|
104
|
+
.mockResolvedValueOnce(response(200, manifest, { "x-amz-version-id": descriptor.versionId }))
|
|
105
|
+
.mockResolvedValueOnce(response(204))
|
|
106
|
+
.mockResolvedValueOnce(response(200, { untilCursor: "cursor_after_H", nextPageToken: null, deltas: [] }));
|
|
107
|
+
await client(dir, secondFetch).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: descriptor.descriptorId, resetId: "reset_17", durableApply: resumed });
|
|
108
|
+
expect(resumed.getState().cursor).toBe("cursor_after_H");
|
|
109
|
+
expect(secondFetch.mock.calls[2]?.[0]).toContain("/resets/reset_17/ack");
|
|
110
|
+
});
|
|
111
|
+
it("treats a completed bootstrap snapshot as replaceable by a later reset", async () => {
|
|
112
|
+
const dir = root();
|
|
113
|
+
const durable = apply(dir);
|
|
114
|
+
const bootstrapFetch = vi.fn()
|
|
115
|
+
.mockResolvedValueOnce(response(200, descriptor))
|
|
116
|
+
.mockResolvedValueOnce(response(200, manifest, { "x-amz-version-id": descriptor.versionId }))
|
|
117
|
+
.mockResolvedValueOnce(response(200, { url: "https://s3.example.test/content-17", expiresAt: new Date(NOW + 30_000).toISOString(), versionId: "version_17", sha256: contentSha, size: bytes.length }))
|
|
118
|
+
.mockResolvedValueOnce(response(200, "", { "x-amz-version-id": "version_17" }, stream(bytes)))
|
|
119
|
+
.mockResolvedValueOnce(response(200, { untilCursor: "cursor_after_bootstrap", nextPageToken: null, deltas: [] }));
|
|
120
|
+
const bootstrap = client(dir, bootstrapFetch);
|
|
121
|
+
await bootstrap.reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: descriptor.descriptorId, durableApply: durable });
|
|
122
|
+
expect(bootstrap.getState().resetAcknowledged).toBe(true);
|
|
123
|
+
const resetDescriptor = { ...descriptor, descriptorId: "snapshot_18", cursor: "cursor_at_next_H" };
|
|
124
|
+
const resetFetch = vi.fn()
|
|
125
|
+
.mockResolvedValueOnce(response(200, resetDescriptor))
|
|
126
|
+
.mockResolvedValueOnce(response(200, manifest, { "x-amz-version-id": resetDescriptor.versionId }))
|
|
127
|
+
.mockResolvedValueOnce(response(204))
|
|
128
|
+
.mockResolvedValueOnce(response(200, { untilCursor: "cursor_after_reset", nextPageToken: null, deltas: [] }));
|
|
129
|
+
await expect(client(dir, resetFetch).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: resetDescriptor.descriptorId, resetId: "reset_18", durableApply: durable })).resolves.toMatchObject({ descriptorId: resetDescriptor.descriptorId, resetAcknowledged: true });
|
|
130
|
+
expect(resetFetch.mock.calls[2]?.[0]).toContain("/resets/reset_18/ack");
|
|
131
|
+
});
|
|
132
|
+
it("rejects a manifest for a different scope before filesystem mutation", async () => {
|
|
133
|
+
const dir = root();
|
|
134
|
+
const foreignManifest = { ...manifest, scopeUid: "other_scope" };
|
|
135
|
+
const foreignDescriptor = { ...descriptor, checksum: `sha256:${crypto.createHash("sha256").update(canonical(foreignManifest), "utf8").digest("hex")}` };
|
|
136
|
+
const fetchImpl = vi.fn()
|
|
137
|
+
.mockResolvedValueOnce(response(200, foreignDescriptor))
|
|
138
|
+
.mockResolvedValueOnce(response(200, foreignManifest, { "x-amz-version-id": foreignDescriptor.versionId }));
|
|
139
|
+
const durable = apply(dir);
|
|
140
|
+
await expect(client(dir, fetchImpl).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: foreignDescriptor.descriptorId, durableApply: durable })).rejects.toThrow("manifest scope does not match this client");
|
|
141
|
+
expect(durable.getState().cursor).toBe("cursor_old");
|
|
142
|
+
expect(fetchImpl).toHaveBeenCalledTimes(2);
|
|
143
|
+
});
|
|
144
|
+
it("rejects a manifest URL that would outlive its lease", async () => {
|
|
145
|
+
const dir = root();
|
|
146
|
+
const shortLeaseAuthorization = { ...authorization, lease: { ...authorization.lease, expiresAt: new Date(NOW + 20_000).toISOString() } };
|
|
147
|
+
const fetchImpl = vi.fn().mockResolvedValueOnce(response(200, descriptor));
|
|
148
|
+
await expect(client(dir, fetchImpl).reconcile({ authorization: shortLeaseAuthorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: descriptor.descriptorId, durableApply: apply(dir) })).rejects.toThrow("descriptor lifetime exceeds its authorization bound");
|
|
149
|
+
expect(fetchImpl).toHaveBeenCalledTimes(1);
|
|
150
|
+
});
|
|
151
|
+
it("deletes stale ancestors before applying snapshot children", async () => {
|
|
152
|
+
const dir = root();
|
|
153
|
+
const durable = apply(dir);
|
|
154
|
+
const prior = { deltaId: "delta_file_a", canonicalPath: "a", operation: "upsert", versionId: "version_17", source: { kind: "regular", mode: 0o600 } };
|
|
155
|
+
await durable.applyPage({ untilCursor: "cursor_old", nextPageToken: null, deltas: [prior] }, async () => ({ kind: "regular", bytes, sha256: contentSha.slice("sha256:".length) }));
|
|
156
|
+
const childManifest = { ...manifest, entries: [{ ...manifest.entries[0], canonicalPath: "a/b", deltaId: "delta_child" }] };
|
|
157
|
+
const childDescriptor = { ...descriptor, descriptorId: "snapshot_child", checksum: `sha256:${crypto.createHash("sha256").update(canonical(childManifest), "utf8").digest("hex")}` };
|
|
158
|
+
const fetchImpl = vi.fn()
|
|
159
|
+
.mockResolvedValueOnce(response(200, childDescriptor))
|
|
160
|
+
.mockResolvedValueOnce(response(200, childManifest, { "x-amz-version-id": childDescriptor.versionId }))
|
|
161
|
+
.mockResolvedValueOnce(response(200, { url: "https://s3.example.test/content-17", expiresAt: new Date(NOW + 30_000).toISOString(), versionId: "version_17", sha256: contentSha, size: bytes.length }))
|
|
162
|
+
.mockResolvedValueOnce(response(200, "", { "x-amz-version-id": "version_17" }, stream(bytes)))
|
|
163
|
+
.mockResolvedValueOnce(response(200, { untilCursor: "cursor_after_H", nextPageToken: null, deltas: [] }));
|
|
164
|
+
await client(dir, fetchImpl).reconcile({ authorization, scopeHandle: "handle_1", scopeRevision: "revision_1", descriptorId: childDescriptor.descriptorId, durableApply: durable });
|
|
165
|
+
expect(fs.readFileSync(path.join(dir, "projection", "a", "b"))).toEqual(bytes);
|
|
166
|
+
expect(fs.lstatSync(path.join(dir, "projection", "a")).isDirectory()).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=snapshot-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-client.test.js","sourceRoot":"","sources":["../../src/sync/snapshot-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable post-commit bookkeeping for a V2 uploader.
|
|
3
|
+
*
|
|
4
|
+
* A server commit is not the point at which the local cursor may move. This
|
|
5
|
+
* module first makes the server result and its self-delta durable in one WAL
|
|
6
|
+
* record, then lets the ordered delta consumer acknowledge that delta later.
|
|
7
|
+
* Keeping those transitions separate is what makes a generation that changes
|
|
8
|
+
* while an older upload is in flight rebase instead of becoming a conflict.
|
|
9
|
+
*/
|
|
10
|
+
import { StateStore, type StateStoreRecord } from "./state-store.js";
|
|
11
|
+
export interface UploaderFinalizationOptions {
|
|
12
|
+
rootDir: string;
|
|
13
|
+
scopeId: string;
|
|
14
|
+
maxRecordsBeforeCompaction?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface DirtyGeneration {
|
|
17
|
+
path: string;
|
|
18
|
+
generation: number;
|
|
19
|
+
sha256: `sha256:${string}`;
|
|
20
|
+
/** The exact canonical version on which this generation was prepared. */
|
|
21
|
+
baseVersionId: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface LocalAttempt extends DirtyGeneration {
|
|
24
|
+
attemptId: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CommittedMutation {
|
|
27
|
+
attemptId: string;
|
|
28
|
+
path: string;
|
|
29
|
+
generation: number;
|
|
30
|
+
sha256: `sha256:${string}`;
|
|
31
|
+
versionId: string | null;
|
|
32
|
+
deltaId: string;
|
|
33
|
+
}
|
|
34
|
+
export interface SelfDeltaDrain {
|
|
35
|
+
/** Durable cursor before this ordered page was applied. */
|
|
36
|
+
cursorBefore: string | null;
|
|
37
|
+
/** Cursor emitted by the ordered delta response after this delta. */
|
|
38
|
+
cursorAfter: string;
|
|
39
|
+
/** The contiguous delta IDs consumed by this drain, ending with deltaId. */
|
|
40
|
+
contiguousDeltaIds: readonly string[];
|
|
41
|
+
}
|
|
42
|
+
export interface PendingSelfDelta {
|
|
43
|
+
attemptId: string;
|
|
44
|
+
path: string;
|
|
45
|
+
generation: number;
|
|
46
|
+
versionId: string | null;
|
|
47
|
+
consumed: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface UploaderPathState {
|
|
50
|
+
generation: number;
|
|
51
|
+
sha256: `sha256:${string}`;
|
|
52
|
+
baseVersionId: string | null;
|
|
53
|
+
synchronizedVersionId: string | null;
|
|
54
|
+
pendingAttemptId?: string;
|
|
55
|
+
attempts: Record<string, LocalAttempt>;
|
|
56
|
+
}
|
|
57
|
+
export interface UploaderFinalizationState {
|
|
58
|
+
cursor: string | null;
|
|
59
|
+
paths: Record<string, UploaderPathState>;
|
|
60
|
+
finalizedAttempts: Record<string, CommittedMutation>;
|
|
61
|
+
selfDeltas: Record<string, PendingSelfDelta>;
|
|
62
|
+
/** Commit order is the only ordering information available before U53. */
|
|
63
|
+
selfDeltaOrder: string[];
|
|
64
|
+
}
|
|
65
|
+
export type FinalizationOutcome = "rebased-current-generation" | "rebased-later-generation" | "already-finalized";
|
|
66
|
+
export interface FinalizationResult {
|
|
67
|
+
outcome: FinalizationOutcome;
|
|
68
|
+
rebasedGeneration: number;
|
|
69
|
+
cursor: string | null;
|
|
70
|
+
}
|
|
71
|
+
export declare function initialUploaderFinalizationState(): UploaderFinalizationState;
|
|
72
|
+
/** Opens the state-store generation used exclusively by uploader bookkeeping. */
|
|
73
|
+
export declare function openUploaderFinalizationStore(options: UploaderFinalizationOptions): StateStore<UploaderFinalizationState>;
|
|
74
|
+
/**
|
|
75
|
+
* The public writer-side finalization seam. Its calls intentionally append
|
|
76
|
+
* exactly one frame per logical transition; StateStore fdatasyncs that frame
|
|
77
|
+
* before this method returns.
|
|
78
|
+
*/
|
|
79
|
+
export declare class UploaderFinalizer {
|
|
80
|
+
private readonly store;
|
|
81
|
+
constructor(store: StateStore<UploaderFinalizationState>);
|
|
82
|
+
getState(): UploaderFinalizationState;
|
|
83
|
+
recordDirty(input: DirtyGeneration): void;
|
|
84
|
+
recordAttempt(input: LocalAttempt): void;
|
|
85
|
+
/**
|
|
86
|
+
* Atomically records the logical server result and the self-delta marker.
|
|
87
|
+
* It never changes the scope cursor: only consumeSelfDelta may do that.
|
|
88
|
+
*/
|
|
89
|
+
finalize(input: CommittedMutation): FinalizationResult;
|
|
90
|
+
/**
|
|
91
|
+
* Called only by the ordered delta drain after it has durably handled a
|
|
92
|
+
* contiguous self delta. Calling finalize can therefore never jump cursor.
|
|
93
|
+
*/
|
|
94
|
+
consumeSelfDelta(deltaId: string, drain: SelfDeltaDrain): void;
|
|
95
|
+
}
|
|
96
|
+
export declare function reduceUploaderFinalization(state: UploaderFinalizationState, record: StateStoreRecord): UploaderFinalizationState;
|
|
97
|
+
//# sourceMappingURL=uploader-finalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader-finalization.d.ts","sourceRoot":"","sources":["../../src/sync/uploader-finalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable post-commit bookkeeping for a V2 uploader.
|
|
3
|
+
*
|
|
4
|
+
* A server commit is not the point at which the local cursor may move. This
|
|
5
|
+
* module first makes the server result and its self-delta durable in one WAL
|
|
6
|
+
* record, then lets the ordered delta consumer acknowledge that delta later.
|
|
7
|
+
* Keeping those transitions separate is what makes a generation that changes
|
|
8
|
+
* while an older upload is in flight rebase instead of becoming a conflict.
|
|
9
|
+
*/
|
|
10
|
+
import { StateStore } from "./state-store.js";
|
|
11
|
+
const RECORD_DIRTY = 0x5201;
|
|
12
|
+
const RECORD_ATTEMPT = 0x5202;
|
|
13
|
+
const RECORD_FINALIZED = 0x5203;
|
|
14
|
+
const RECORD_SELF_DELTA_CONSUMED = 0x5204;
|
|
15
|
+
const SHA256 = /^sha256:[a-f0-9]{64}$/;
|
|
16
|
+
export function initialUploaderFinalizationState() {
|
|
17
|
+
return { cursor: null, paths: {}, finalizedAttempts: {}, selfDeltas: {}, selfDeltaOrder: [] };
|
|
18
|
+
}
|
|
19
|
+
/** Opens the state-store generation used exclusively by uploader bookkeeping. */
|
|
20
|
+
export function openUploaderFinalizationStore(options) {
|
|
21
|
+
return StateStore.open({
|
|
22
|
+
rootDir: options.rootDir,
|
|
23
|
+
scopeId: options.scopeId,
|
|
24
|
+
initialState: initialUploaderFinalizationState(),
|
|
25
|
+
reduce: reduceUploaderFinalization,
|
|
26
|
+
maxRecordsBeforeCompaction: options.maxRecordsBeforeCompaction,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The public writer-side finalization seam. Its calls intentionally append
|
|
31
|
+
* exactly one frame per logical transition; StateStore fdatasyncs that frame
|
|
32
|
+
* before this method returns.
|
|
33
|
+
*/
|
|
34
|
+
export class UploaderFinalizer {
|
|
35
|
+
store;
|
|
36
|
+
constructor(store) {
|
|
37
|
+
this.store = store;
|
|
38
|
+
}
|
|
39
|
+
getState() {
|
|
40
|
+
return structuredClone(this.store.getState());
|
|
41
|
+
}
|
|
42
|
+
recordDirty(input) {
|
|
43
|
+
validateDirty(input, "dirty generation");
|
|
44
|
+
this.store.append(RECORD_DIRTY, input);
|
|
45
|
+
}
|
|
46
|
+
recordAttempt(input) {
|
|
47
|
+
validateAttempt(input);
|
|
48
|
+
this.store.append(RECORD_ATTEMPT, input);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Atomically records the logical server result and the self-delta marker.
|
|
52
|
+
* It never changes the scope cursor: only consumeSelfDelta may do that.
|
|
53
|
+
*/
|
|
54
|
+
finalize(input) {
|
|
55
|
+
validateCommitted(input);
|
|
56
|
+
const existing = this.store.getState().finalizedAttempts[input.attemptId];
|
|
57
|
+
if (existing) {
|
|
58
|
+
if (!sameCommitted(existing, input))
|
|
59
|
+
throw new Error("uploader finalization: attempt replay does not match its committed result");
|
|
60
|
+
const path = this.store.getState().paths[input.path];
|
|
61
|
+
if (!path)
|
|
62
|
+
throw new Error("uploader finalization: committed attempt has no path state");
|
|
63
|
+
return { outcome: "already-finalized", rebasedGeneration: path.generation, cursor: this.store.getState().cursor };
|
|
64
|
+
}
|
|
65
|
+
this.store.append(RECORD_FINALIZED, input);
|
|
66
|
+
const state = this.store.getState();
|
|
67
|
+
const path = state.paths[input.path];
|
|
68
|
+
if (!path)
|
|
69
|
+
throw new Error("uploader finalization: finalization did not persist a path state");
|
|
70
|
+
return {
|
|
71
|
+
outcome: path.generation === input.generation ? "rebased-current-generation" : "rebased-later-generation",
|
|
72
|
+
rebasedGeneration: path.generation,
|
|
73
|
+
cursor: state.cursor,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Called only by the ordered delta drain after it has durably handled a
|
|
78
|
+
* contiguous self delta. Calling finalize can therefore never jump cursor.
|
|
79
|
+
*/
|
|
80
|
+
consumeSelfDelta(deltaId, drain) {
|
|
81
|
+
if (!nonEmpty(deltaId) || !nonEmpty(drain.cursorAfter) || drain.cursorAfter === drain.cursorBefore) {
|
|
82
|
+
throw new Error("uploader finalization: self-delta drain is invalid");
|
|
83
|
+
}
|
|
84
|
+
if (!Array.isArray(drain.contiguousDeltaIds) || drain.contiguousDeltaIds.length === 0 || drain.contiguousDeltaIds.at(-1) !== deltaId || drain.contiguousDeltaIds.some((id) => !nonEmpty(id))) {
|
|
85
|
+
throw new Error("uploader finalization: self delta must end a non-empty contiguous drain");
|
|
86
|
+
}
|
|
87
|
+
const marker = this.store.getState().selfDeltas[deltaId];
|
|
88
|
+
if (marker?.consumed) {
|
|
89
|
+
if (this.store.getState().cursor !== drain.cursorAfter)
|
|
90
|
+
throw new Error("uploader finalization: self delta was already consumed at a different cursor");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.store.append(RECORD_SELF_DELTA_CONSUMED, { deltaId, ...drain });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function reduceUploaderFinalization(state, record) {
|
|
97
|
+
assertState(state);
|
|
98
|
+
switch (record.type) {
|
|
99
|
+
case RECORD_DIRTY:
|
|
100
|
+
return reduceDirty(state, asDirty(record.payload, "dirty WAL record"));
|
|
101
|
+
case RECORD_ATTEMPT:
|
|
102
|
+
return reduceAttempt(state, asAttempt(record.payload));
|
|
103
|
+
case RECORD_FINALIZED:
|
|
104
|
+
return reduceFinalized(state, asCommitted(record.payload));
|
|
105
|
+
case RECORD_SELF_DELTA_CONSUMED:
|
|
106
|
+
return reduceSelfDeltaConsumed(state, asSelfDeltaDrain(record.payload));
|
|
107
|
+
default:
|
|
108
|
+
throw new Error(`uploader finalization: unsupported WAL record type ${record.type}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function reduceDirty(state, input) {
|
|
112
|
+
const existing = state.paths[input.path];
|
|
113
|
+
if (!existing) {
|
|
114
|
+
return { ...state, paths: { ...state.paths, [input.path]: { ...input, synchronizedVersionId: input.baseVersionId, attempts: {} } } };
|
|
115
|
+
}
|
|
116
|
+
if (input.generation < existing.generation)
|
|
117
|
+
throw new Error("uploader finalization: dirty generation moved backwards");
|
|
118
|
+
if (input.generation === existing.generation) {
|
|
119
|
+
if (existing.sha256 !== input.sha256 || existing.baseVersionId !== input.baseVersionId)
|
|
120
|
+
throw new Error("uploader finalization: dirty generation was mutated");
|
|
121
|
+
return state;
|
|
122
|
+
}
|
|
123
|
+
// A later edit preserves its bytes and is initially based on the old head.
|
|
124
|
+
// A later committed older generation will replace this baseVersionId only.
|
|
125
|
+
return {
|
|
126
|
+
...state,
|
|
127
|
+
paths: {
|
|
128
|
+
...state.paths,
|
|
129
|
+
[input.path]: {
|
|
130
|
+
...input,
|
|
131
|
+
synchronizedVersionId: existing.synchronizedVersionId,
|
|
132
|
+
attempts: existing.attempts,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function reduceAttempt(state, input) {
|
|
138
|
+
const path = state.paths[input.path];
|
|
139
|
+
if (!path || path.generation !== input.generation || path.sha256 !== input.sha256 || path.baseVersionId !== input.baseVersionId) {
|
|
140
|
+
throw new Error("uploader finalization: attempt does not match a durable dirty generation");
|
|
141
|
+
}
|
|
142
|
+
const existing = path.attempts[input.attemptId];
|
|
143
|
+
if (existing) {
|
|
144
|
+
if (!sameAttempt(existing, input))
|
|
145
|
+
throw new Error("uploader finalization: attempt ID was reused for different bytes");
|
|
146
|
+
return state;
|
|
147
|
+
}
|
|
148
|
+
if (path.pendingAttemptId && path.pendingAttemptId !== input.attemptId)
|
|
149
|
+
throw new Error("uploader finalization: current generation already has an attempt");
|
|
150
|
+
return {
|
|
151
|
+
...state,
|
|
152
|
+
paths: { ...state.paths, [input.path]: { ...path, pendingAttemptId: input.attemptId, attempts: { ...path.attempts, [input.attemptId]: input } } },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function reduceFinalized(state, input) {
|
|
156
|
+
const already = state.finalizedAttempts[input.attemptId];
|
|
157
|
+
if (already) {
|
|
158
|
+
if (!sameCommitted(already, input))
|
|
159
|
+
throw new Error("uploader finalization: committed attempt replay differs");
|
|
160
|
+
return state;
|
|
161
|
+
}
|
|
162
|
+
const path = state.paths[input.path];
|
|
163
|
+
const attempt = path?.attempts[input.attemptId];
|
|
164
|
+
if (!path || !attempt || attempt.generation !== input.generation || attempt.sha256 !== input.sha256) {
|
|
165
|
+
throw new Error("uploader finalization: committed result has no matching durable attempt");
|
|
166
|
+
}
|
|
167
|
+
if (state.selfDeltas[input.deltaId])
|
|
168
|
+
throw new Error("uploader finalization: delta ID belongs to another committed attempt");
|
|
169
|
+
const laterGeneration = path.generation > input.generation;
|
|
170
|
+
if (path.generation < input.generation)
|
|
171
|
+
throw new Error("uploader finalization: committed generation is ahead of local state");
|
|
172
|
+
const rebasedAttempt = path.pendingAttemptId && path.pendingAttemptId !== input.attemptId
|
|
173
|
+
? path.attempts[path.pendingAttemptId]
|
|
174
|
+
: undefined;
|
|
175
|
+
const rebasedPath = {
|
|
176
|
+
...path,
|
|
177
|
+
baseVersionId: input.versionId,
|
|
178
|
+
synchronizedVersionId: input.versionId,
|
|
179
|
+
pendingAttemptId: laterGeneration ? path.pendingAttemptId : undefined,
|
|
180
|
+
attempts: rebasedAttempt
|
|
181
|
+
? { ...path.attempts, [rebasedAttempt.attemptId]: { ...rebasedAttempt, baseVersionId: input.versionId } }
|
|
182
|
+
: path.attempts,
|
|
183
|
+
};
|
|
184
|
+
return {
|
|
185
|
+
...state,
|
|
186
|
+
paths: { ...state.paths, [input.path]: rebasedPath },
|
|
187
|
+
finalizedAttempts: { ...state.finalizedAttempts, [input.attemptId]: input },
|
|
188
|
+
selfDeltas: {
|
|
189
|
+
...state.selfDeltas,
|
|
190
|
+
[input.deltaId]: { attemptId: input.attemptId, path: input.path, generation: input.generation, versionId: input.versionId, consumed: false },
|
|
191
|
+
},
|
|
192
|
+
selfDeltaOrder: [...state.selfDeltaOrder, input.deltaId],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function reduceSelfDeltaConsumed(state, value) {
|
|
196
|
+
const marker = state.selfDeltas[value.deltaId];
|
|
197
|
+
if (!marker)
|
|
198
|
+
throw new Error("uploader finalization: unknown self delta");
|
|
199
|
+
if (marker.consumed) {
|
|
200
|
+
if (state.cursor === value.cursorAfter)
|
|
201
|
+
return state;
|
|
202
|
+
throw new Error("uploader finalization: self delta was already consumed at a different cursor");
|
|
203
|
+
}
|
|
204
|
+
if (state.cursor !== value.cursorBefore)
|
|
205
|
+
throw new Error("uploader finalization: self-delta drain cursor is not contiguous");
|
|
206
|
+
const firstPending = state.selfDeltaOrder.find((id) => !state.selfDeltas[id].consumed);
|
|
207
|
+
if (firstPending !== value.deltaId)
|
|
208
|
+
throw new Error("uploader finalization: self delta drain would skip an earlier self delta");
|
|
209
|
+
return { ...state, cursor: value.cursorAfter, selfDeltas: { ...state.selfDeltas, [value.deltaId]: { ...marker, consumed: true } } };
|
|
210
|
+
}
|
|
211
|
+
function validateDirty(input, label) {
|
|
212
|
+
if (!isRecord(input) || !nonEmpty(input.path) || !Number.isSafeInteger(input.generation) || input.generation < 0 || !isSha256(input.sha256) || (input.baseVersionId !== null && !nonEmpty(input.baseVersionId))) {
|
|
213
|
+
throw new Error(`uploader finalization: ${label} is invalid`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function validateAttempt(input) {
|
|
217
|
+
validateDirty(input, "attempt");
|
|
218
|
+
if (!nonEmpty(input.attemptId))
|
|
219
|
+
throw new Error("uploader finalization: attempt ID is required");
|
|
220
|
+
}
|
|
221
|
+
function validateCommitted(input) {
|
|
222
|
+
if (!isRecord(input) || !nonEmpty(input.attemptId) || !nonEmpty(input.path) || !Number.isSafeInteger(input.generation) || input.generation < 0 || !isSha256(input.sha256) || (input.versionId !== null && !nonEmpty(input.versionId)) || !nonEmpty(input.deltaId)) {
|
|
223
|
+
throw new Error("uploader finalization: committed result is invalid");
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function asDirty(value, label) {
|
|
227
|
+
if (!isRecord(value))
|
|
228
|
+
throw new Error(`uploader finalization: ${label} is invalid`);
|
|
229
|
+
const input = value;
|
|
230
|
+
validateDirty(input, label);
|
|
231
|
+
return input;
|
|
232
|
+
}
|
|
233
|
+
function asAttempt(value) {
|
|
234
|
+
if (!isRecord(value))
|
|
235
|
+
throw new Error("uploader finalization: attempt WAL record is invalid");
|
|
236
|
+
const input = value;
|
|
237
|
+
validateAttempt(input);
|
|
238
|
+
return input;
|
|
239
|
+
}
|
|
240
|
+
function asCommitted(value) {
|
|
241
|
+
if (!isRecord(value))
|
|
242
|
+
throw new Error("uploader finalization: committed WAL record is invalid");
|
|
243
|
+
const input = value;
|
|
244
|
+
validateCommitted(input);
|
|
245
|
+
return input;
|
|
246
|
+
}
|
|
247
|
+
function asSelfDeltaDrain(value) {
|
|
248
|
+
if (!isRecord(value) || !nonEmpty(value.deltaId) || (value.cursorBefore !== null && !nonEmpty(value.cursorBefore)) || !nonEmpty(value.cursorAfter) || !Array.isArray(value.contiguousDeltaIds) || value.contiguousDeltaIds.some((id) => !nonEmpty(id)) || value.contiguousDeltaIds.at(-1) !== value.deltaId) {
|
|
249
|
+
throw new Error("uploader finalization: self-delta WAL record is invalid");
|
|
250
|
+
}
|
|
251
|
+
return { deltaId: value.deltaId, cursorBefore: value.cursorBefore, cursorAfter: value.cursorAfter, contiguousDeltaIds: [...value.contiguousDeltaIds] };
|
|
252
|
+
}
|
|
253
|
+
function assertState(state) {
|
|
254
|
+
if (!isRecord(state) || (state.cursor !== null && !nonEmpty(state.cursor)) || !isRecord(state.paths) || !isRecord(state.finalizedAttempts) || !isRecord(state.selfDeltas) || !Array.isArray(state.selfDeltaOrder)) {
|
|
255
|
+
throw new Error("uploader finalization: persisted state has an invalid shape");
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function sameAttempt(left, right) {
|
|
259
|
+
return left.attemptId === right.attemptId && left.path === right.path && left.generation === right.generation && left.sha256 === right.sha256 && left.baseVersionId === right.baseVersionId;
|
|
260
|
+
}
|
|
261
|
+
function sameCommitted(left, right) {
|
|
262
|
+
return left.attemptId === right.attemptId && left.path === right.path && left.generation === right.generation && left.sha256 === right.sha256 && left.versionId === right.versionId && left.deltaId === right.deltaId;
|
|
263
|
+
}
|
|
264
|
+
function isRecord(value) {
|
|
265
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
266
|
+
}
|
|
267
|
+
function nonEmpty(value) {
|
|
268
|
+
return typeof value === "string" && value.length > 0;
|
|
269
|
+
}
|
|
270
|
+
function isSha256(value) {
|
|
271
|
+
return typeof value === "string" && SHA256.test(value);
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=uploader-finalization.js.map
|