@mnaoumov/obsidian-lib 6.2.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/components/file-explorer-root-menu-component/package.json +6 -0
  2. package/data-stores/data-store-replica/package.json +6 -0
  3. package/data-stores/data-store-seeds/package.json +6 -0
  4. package/data-stores/data-store-transport/package.json +6 -0
  5. package/data-stores/index/package.json +6 -0
  6. package/data-stores/local-data-store/package.json +6 -0
  7. package/data-stores/package.json +6 -0
  8. package/data-stores/shared-data-store/package.json +6 -0
  9. package/dist/lib/cjs/__merged.cjs +29 -1
  10. package/dist/lib/cjs/__merged.d.cts +6 -0
  11. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +343 -0
  12. package/dist/lib/cjs/components/file-explorer-root-menu-component.d.cts +125 -0
  13. package/dist/lib/cjs/components/index.cjs +4 -1
  14. package/dist/lib/cjs/components/index.d.cts +1 -0
  15. package/dist/lib/cjs/data-stores/data-store-replica.cjs +263 -0
  16. package/dist/lib/cjs/data-stores/data-store-replica.d.cts +112 -0
  17. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +204 -0
  18. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +133 -0
  19. package/dist/lib/cjs/data-stores/data-store-transport.cjs +347 -0
  20. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +125 -0
  21. package/dist/lib/cjs/data-stores/index.cjs +120 -0
  22. package/dist/lib/cjs/data-stores/index.d.cts +6 -0
  23. package/dist/lib/cjs/data-stores/local-data-store.cjs +258 -0
  24. package/dist/lib/cjs/data-stores/local-data-store.d.cts +119 -0
  25. package/dist/lib/cjs/data-stores/shared-data-store.cjs +431 -0
  26. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +137 -0
  27. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  28. package/dist/lib/cjs/index.cjs +4 -1
  29. package/dist/lib/cjs/index.d.cts +1 -0
  30. package/dist/lib/esm/__merged.d.mts +6 -0
  31. package/dist/lib/esm/__merged.mjs +29 -1
  32. package/dist/lib/esm/components/file-explorer-root-menu-component.d.mts +125 -0
  33. package/dist/lib/esm/components/file-explorer-root-menu-component.mjs +257 -0
  34. package/dist/lib/esm/components/index.d.mts +1 -0
  35. package/dist/lib/esm/components/index.mjs +3 -1
  36. package/dist/lib/esm/data-stores/data-store-replica.d.mts +112 -0
  37. package/dist/lib/esm/data-stores/data-store-replica.mjs +173 -0
  38. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +133 -0
  39. package/dist/lib/esm/data-stores/data-store-seeds.mjs +115 -0
  40. package/dist/lib/esm/data-stores/data-store-transport.d.mts +125 -0
  41. package/dist/lib/esm/data-stores/data-store-transport.mjs +259 -0
  42. package/dist/lib/esm/data-stores/index.d.mts +6 -0
  43. package/dist/lib/esm/data-stores/index.mjs +18 -0
  44. package/dist/lib/esm/data-stores/local-data-store.d.mts +119 -0
  45. package/dist/lib/esm/data-stores/local-data-store.mjs +170 -0
  46. package/dist/lib/esm/data-stores/shared-data-store.d.mts +137 -0
  47. package/dist/lib/esm/data-stores/shared-data-store.mjs +346 -0
  48. package/dist/lib/esm/generated-during-build.mjs +1 -1
  49. package/dist/lib/esm/index.d.mts +1 -0
  50. package/dist/lib/esm/index.mjs +3 -1
  51. package/package.json +38 -17
@@ -0,0 +1,173 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ class DataStoreReplica {
7
+ /**
8
+ * Creates an empty replica.
9
+ *
10
+ * @param kind - Immutable merge rule for the store.
11
+ */
12
+ constructor(kind) {
13
+ this.kind = kind;
14
+ }
15
+ kind;
16
+ additions = /* @__PURE__ */ new Map();
17
+ registers = /* @__PURE__ */ new Map();
18
+ removals = /* @__PURE__ */ new Map();
19
+ /**
20
+ * Validates and joins one journal or snapshot operation.
21
+ *
22
+ * @param value - Untrusted parsed operation.
23
+ */
24
+ apply(value) {
25
+ if (!isDataStoreOperation(value)) {
26
+ throw new Error("Invalid data-store operation");
27
+ }
28
+ const operation = window.structuredClone(value);
29
+ if (this.kind === "observed-remove-set") {
30
+ this.applySet(operation);
31
+ return;
32
+ }
33
+ const previous = this.registers.get(operation.key);
34
+ if (this.kind !== "last-write-wins" && (operation.deleted || rankOf(operation.value) === void 0)) {
35
+ throw new Error("Min/max stores accept finite numbers or ranked JSON values and do not support deletion");
36
+ }
37
+ if (!previous || this.wins(operation, previous)) {
38
+ this.registers.set(operation.key, operation);
39
+ }
40
+ }
41
+ /**
42
+ * Reads visible records, detached from internal state.
43
+ *
44
+ * @returns Pairs in deterministic key order.
45
+ */
46
+ entries() {
47
+ if (this.kind === "observed-remove-set") {
48
+ const keys = new Set(this.activeAdditions().map((operation) => operation.key));
49
+ return [...keys].sort().map((key) => [key, true]);
50
+ }
51
+ return [...this.registers.values()].filter((operation) => !operation.deleted).sort((first, second) => first.key.localeCompare(second.key)).map((operation) => [operation.key, window.structuredClone(operation.value)]);
52
+ }
53
+ /**
54
+ * Exports mergeable state, retaining tombstones for late or retired replicas.
55
+ *
56
+ * @returns Deterministically ordered operations sufficient to reconstruct this state.
57
+ */
58
+ export() {
59
+ return [...this.registers.values(), ...this.activeAdditions(), ...this.removals.values()].sort((first, second) => tag(first).localeCompare(tag(second))).map((operation) => window.structuredClone(operation));
60
+ }
61
+ /**
62
+ * Reads a register or set membership without enumerating register keys.
63
+ *
64
+ * @param key - Record key or set member.
65
+ * @returns A detached value, or `undefined` when absent or deleted.
66
+ */
67
+ get(key) {
68
+ if (this.kind === "observed-remove-set") {
69
+ return this.activeAdditions().some((operation2) => operation2.key === key) || void 0;
70
+ }
71
+ const operation = this.registers.get(key);
72
+ return operation && !operation.deleted ? window.structuredClone(operation.value) : void 0;
73
+ }
74
+ /**
75
+ * Finds additions observed for a set member, for an observed removal.
76
+ *
77
+ * @param key - Set member.
78
+ * @returns Addition identities. Concurrent unseen additions survive removal.
79
+ */
80
+ observedTags(key) {
81
+ return [...this.additions.values()].filter((operation) => operation.key === key).map((operation) => tag(operation)).sort();
82
+ }
83
+ activeAdditions() {
84
+ return [...this.additions.values()].filter((operation) => {
85
+ const removed = tagVector(this.removals.get(operation.key)?.tags ?? []);
86
+ return operation.sequence > (removed.get(operation.device) ?? 0);
87
+ });
88
+ }
89
+ applySet(operation) {
90
+ if (operation.deleted) {
91
+ const previous = this.removals.get(operation.key);
92
+ const vector = tagVector([...previous?.tags ?? [], ...operation.tags ?? []]);
93
+ const winner = previous && this.wins(previous, operation) ? previous : operation;
94
+ this.removals.set(operation.key, { ...winner, tags: [...vector].sort(([first], [second]) => first.localeCompare(second)).map(([device, sequence]) => `${device}:${String(sequence)}`) });
95
+ } else {
96
+ if (operation.value !== true) {
97
+ throw new Error("Set additions use true as their value");
98
+ }
99
+ const key = `${operation.key}:${operation.device}`;
100
+ const previous = this.additions.get(key);
101
+ if (!previous || operation.sequence > previous.sequence) {
102
+ this.additions.set(key, operation);
103
+ }
104
+ }
105
+ }
106
+ wins(next, previous) {
107
+ const nextRank = rankOf(next.value);
108
+ const previousRank = rankOf(previous.value);
109
+ if (this.kind === "minimum" && nextRank !== previousRank) {
110
+ return Number(nextRank) < Number(previousRank);
111
+ }
112
+ return this.kind === "maximum" && nextRank !== previousRank ? Number(nextRank) > Number(previousRank) : next.time > previous.time || next.time === previous.time && (next.counter > previous.counter || next.counter === previous.counter && next.device > previous.device);
113
+ }
114
+ }
115
+ function isDataStoreJsonValue(value) {
116
+ return isJsonValue(value, /* @__PURE__ */ new Set());
117
+ }
118
+ function isDataStoreOperation(value) {
119
+ return typeof value === "object" && value !== null && "key" in value && typeof value.key === "string" && "device" in value && typeof value.device === "string" && /^[\w-]+$/.test(value.device) && "sequence" in value && isPositiveInteger(value.sequence) && "time" in value && isNonNegativeInteger(value.time) && "counter" in value && isNonNegativeInteger(value.counter) && "deleted" in value && typeof value.deleted === "boolean" && "value" in value && isDataStoreJsonValue(value.value) && (!("tags" in value) || Array.isArray(value.tags) && value.tags.every((item) => typeof item === "string"));
120
+ }
121
+ function isJsonValue(value, ancestors) {
122
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
123
+ return true;
124
+ }
125
+ if (typeof value === "number") {
126
+ return Number.isFinite(value);
127
+ }
128
+ if (typeof value !== "object" || ancestors.has(value)) {
129
+ return false;
130
+ }
131
+ if (!Array.isArray(value) && Object.prototype.toString.call(value) !== "[object Object]") {
132
+ return false;
133
+ }
134
+ ancestors.add(value);
135
+ const values = Array.isArray(value) ? [...value] : Object.values(value);
136
+ const isValid = values.every((child) => isJsonValue(child, ancestors));
137
+ ancestors.delete(value);
138
+ return isValid;
139
+ }
140
+ function isNonNegativeInteger(value) {
141
+ return Number.isSafeInteger(value) && Number(value) >= 0;
142
+ }
143
+ function isPositiveInteger(value) {
144
+ return Number.isSafeInteger(value) && Number(value) > 0;
145
+ }
146
+ function rankOf(value) {
147
+ if (typeof value === "number" && Number.isFinite(value)) {
148
+ return value;
149
+ }
150
+ return typeof value === "object" && value !== null && "rank" in value && "value" in value && typeof value.rank === "number" && Number.isFinite(value.rank) ? value.rank : void 0;
151
+ }
152
+ function tag(operation) {
153
+ return `${operation.device}:${String(operation.sequence)}`;
154
+ }
155
+ function tagVector(tags) {
156
+ const vector = /* @__PURE__ */ new Map();
157
+ for (const value of tags) {
158
+ const separator = value.lastIndexOf(":");
159
+ const device = value.slice(0, separator);
160
+ const sequence = Number(value.slice(separator + 1));
161
+ if (!device || !Number.isSafeInteger(sequence) || sequence <= 0) {
162
+ throw new Error("Invalid observed-remove tag");
163
+ }
164
+ vector.set(device, Math.max(sequence, vector.get(device) ?? 0));
165
+ }
166
+ return vector;
167
+ }
168
+ export {
169
+ DataStoreReplica,
170
+ isDataStoreJsonValue,
171
+ isDataStoreOperation
172
+ };
173
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2RhdGEtc3RvcmUtcmVwbGljYS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogZXNsaW50LWRpc2FibGUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZXNlIGFyZSBPYnNpZGlhbiByZW5kZXJlciBXZWIgQVBJcywgbm90IE5vZGUgYnVpbHRpbnMuICovXG4vKipcbiAqIEBmaWxlXG4gKlxuICogTWVyZ2Utc2FmZSByZWdpc3RlcnMgYW5kIG9ic2VydmVkLXJlbW92ZSBzZXRzIHVzZWQgYnkgc2hhcmVkIGRhdGEgc3RvcmVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBBIHN0b3JlIGZpeGVzIGl0cyBtZXJnZSBydWxlIGZvciBpdHMgZW50aXJlIGxpZmV0aW1lIGFuZCBzY2hlbWEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YVN0b3JlTWVyZ2VLaW5kID0gJ2xhc3Qtd3JpdGUtd2lucycgfCAnbWF4aW11bScgfCAnbWluaW11bScgfCAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCc7XG5cbi8qKlxuICogQSB2ZXJzaW9uLW9uZSBqb3VybmFsIG9wZXJhdGlvbi4gVGhlc2UgZmllbGRzIGZvcm0gYSBwdWJsaXNoZWQgd2lyZSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlT3BlcmF0aW9uIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgY291bnRlciB3aXRoaW4gdGhlIHdhbGwtY2xvY2sgbWlsbGlzZWNvbmQuXG4gICAqL1xuICByZWFkb25seSBjb3VudGVyOiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSByZW1vdmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFVuaXF1ZSB3cml0ZXIgaW5jYXJuYXRpb24sIHN0b3JlZCBsb2NhbGx5IHJhdGhlciB0aGFuIGluIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZTogc3RyaW5nO1xuICAvKipcbiAgICogUmVjb3JkIGtleSwgb3Igc2V0IG1lbWJlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKipcbiAgICogU3RyaWN0bHkgaW5jcmVhc2luZyB3cml0ZXIgc2VxdWVuY2UsIHN0YXJ0aW5nIGF0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPYnNlcnZlZCBhZGRpdGlvbiB0YWdzIHJlbW92ZWQgYnkgYSBzZXQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogSHlicmlkIGxvZ2ljYWwgY2xvY2sgd2FsbCB0aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHZhbHVlOyBzZXQgbWVtYmVycyB1c2UgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IENSRFQgc3RhdGUuIEV4cG9ydGVkIG9wZXJhdGlvbnMgY2FuIGJlIGpvaW5lZCBpbiBhbnkgb3JkZXIsIHJlcGVhdGVkbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVSZXBsaWNhIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHJlcGxpY2EuXG4gICAqXG4gICAqIEBwYXJhbSBraW5kIC0gSW1tdXRhYmxlIG1lcmdlIHJ1bGUgZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kKSB7fVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGpvaW5zIG9uZSBqb3VybmFsIG9yIHNuYXBzaG90IG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVW50cnVzdGVkIHBhcnNlZCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXBwbHkodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIWlzRGF0YVN0b3JlT3BlcmF0aW9uKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgb3BlcmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHdpbmRvdy5zdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgdGhpcy5hcHBseVNldChvcGVyYXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucmVnaXN0ZXJzLmdldChvcGVyYXRpb24ua2V5KTtcbiAgICBpZiAodGhpcy5raW5kICE9PSAnbGFzdC13cml0ZS13aW5zJyAmJiAob3BlcmF0aW9uLmRlbGV0ZWQgfHwgcmFua09mKG9wZXJhdGlvbi52YWx1ZSkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWluL21heCBzdG9yZXMgYWNjZXB0IGZpbml0ZSBudW1iZXJzIG9yIHJhbmtlZCBKU09OIHZhbHVlcyBhbmQgZG8gbm90IHN1cHBvcnQgZGVsZXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2aW91cyB8fCB0aGlzLndpbnMob3BlcmF0aW9uLCBwcmV2aW91cykpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJzLnNldChvcGVyYXRpb24ua2V5LCBvcGVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB2aXNpYmxlIHJlY29yZHMsIGRldGFjaGVkIGZyb20gaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFBhaXJzIGluIGRldGVybWluaXN0aWMga2V5IG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGVudHJpZXMoKTogW3N0cmluZywgdW5rbm93bl1bXSB7XG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ29ic2VydmVkLXJlbW92ZS1zZXQnKSB7XG4gICAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmFjdGl2ZUFkZGl0aW9ucygpLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5KSk7XG4gICAgICByZXR1cm4gWy4uLmtleXNdLnNvcnQoKS5tYXAoKGtleSkgPT4gW2tleSwgdHJ1ZV0pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLnRoaXMucmVnaXN0ZXJzLnZhbHVlcygpXS5maWx0ZXIoKG9wZXJhdGlvbikgPT4gIW9wZXJhdGlvbi5kZWxldGVkKVxuICAgICAgLnNvcnQoKGZpcnN0LCBzZWNvbmQpID0+IGZpcnN0LmtleS5sb2NhbGVDb21wYXJlKHNlY29uZC5rZXkpKVxuICAgICAgLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmtleSwgd2luZG93LnN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24udmFsdWUpXSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyBtZXJnZWFibGUgc3RhdGUsIHJldGFpbmluZyB0b21ic3RvbmVzIGZvciBsYXRlIG9yIHJldGlyZWQgcmVwbGljYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGVybWluaXN0aWNhbGx5IG9yZGVyZWQgb3BlcmF0aW9ucyBzdWZmaWNpZW50IHRvIHJlY29uc3RydWN0IHRoaXMgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZXhwb3J0KCk6IERhdGFTdG9yZU9wZXJhdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucmVnaXN0ZXJzLnZhbHVlcygpLCAuLi50aGlzLmFjdGl2ZUFkZGl0aW9ucygpLCAuLi50aGlzLnJlbW92YWxzLnZhbHVlcygpXVxuICAgICAgLnNvcnQoKGZpcnN0LCBzZWNvbmQpID0+IHRhZyhmaXJzdCkubG9jYWxlQ29tcGFyZSh0YWcoc2Vjb25kKSkpLm1hcCgob3BlcmF0aW9uKSA9PiB3aW5kb3cuc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVnaXN0ZXIgb3Igc2V0IG1lbWJlcnNoaXAgd2l0aG91dCBlbnVtZXJhdGluZyByZWdpc3RlciBrZXlzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcmV0dXJucyBBIGRldGFjaGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudCBvciBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlQWRkaXRpb25zKCkuc29tZSgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5ID09PSBrZXkpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5yZWdpc3RlcnMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbiAmJiAhb3BlcmF0aW9uLmRlbGV0ZWQgPyB3aW5kb3cuc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbi52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWRkaXRpb25zIG9ic2VydmVkIGZvciBhIHNldCBtZW1iZXIsIGZvciBhbiBvYnNlcnZlZCByZW1vdmFsLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gU2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQWRkaXRpb24gaWRlbnRpdGllcy4gQ29uY3VycmVudCB1bnNlZW4gYWRkaXRpb25zIHN1cnZpdmUgcmVtb3ZhbC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlZFRhZ3Moa2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFkZGl0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5rZXkgPT09IGtleSkubWFwKChvcGVyYXRpb24pID0+IHRhZyhvcGVyYXRpb24pKS5zb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2ZUFkZGl0aW9ucygpOiBEYXRhU3RvcmVPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFkZGl0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0YWdWZWN0b3IodGhpcy5yZW1vdmFscy5nZXQob3BlcmF0aW9uLmtleSk/LnRhZ3MgPz8gW10pO1xuICAgICAgcmV0dXJuIG9wZXJhdGlvbi5zZXF1ZW5jZSA+IChyZW1vdmVkLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZXQob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAob3BlcmF0aW9uLmRlbGV0ZWQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5yZW1vdmFscy5nZXQob3BlcmF0aW9uLmtleSk7XG4gICAgICBjb25zdCB2ZWN0b3IgPSB0YWdWZWN0b3IoWy4uLihwcmV2aW91cz8udGFncyA/PyBbXSksIC4uLihvcGVyYXRpb24udGFncyA/PyBbXSldKTtcbiAgICAgIGNvbnN0IHdpbm5lciA9IHByZXZpb3VzICYmIHRoaXMud2lucyhwcmV2aW91cywgb3BlcmF0aW9uKSA/IHByZXZpb3VzIDogb3BlcmF0aW9uO1xuICAgICAgdGhpcy5yZW1vdmFscy5zZXQob3BlcmF0aW9uLmtleSwgeyAuLi53aW5uZXIsIHRhZ3M6IFsuLi52ZWN0b3JdLnNvcnQoKFtmaXJzdF0sIFtzZWNvbmRdKSA9PiBmaXJzdC5sb2NhbGVDb21wYXJlKHNlY29uZCkpLm1hcCgoW2RldmljZSwgc2VxdWVuY2VdKSA9PiBgJHtkZXZpY2V9OiR7U3RyaW5nKHNlcXVlbmNlKX1gKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wZXJhdGlvbi52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldCBhZGRpdGlvbnMgdXNlIHRydWUgYXMgdGhlaXIgdmFsdWUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IGAke29wZXJhdGlvbi5rZXl9OiR7b3BlcmF0aW9uLmRldmljZX1gO1xuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmFkZGl0aW9ucy5nZXQoa2V5KTtcbiAgICAgIGlmICghcHJldmlvdXMgfHwgb3BlcmF0aW9uLnNlcXVlbmNlID4gcHJldmlvdXMuc2VxdWVuY2UpIHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbnMuc2V0KGtleSwgb3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdpbnMobmV4dDogRGF0YVN0b3JlT3BlcmF0aW9uLCBwcmV2aW91czogRGF0YVN0b3JlT3BlcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmV4dFJhbmsgPSByYW5rT2YobmV4dC52YWx1ZSk7XG4gICAgY29uc3QgcHJldmlvdXNSYW5rID0gcmFua09mKHByZXZpb3VzLnZhbHVlKTtcbiAgICBpZiAodGhpcy5raW5kID09PSAnbWluaW11bScgJiYgbmV4dFJhbmsgIT09IHByZXZpb3VzUmFuaykge1xuICAgICAgcmV0dXJuIE51bWJlcihuZXh0UmFuaykgPCBOdW1iZXIocHJldmlvdXNSYW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2luZCA9PT0gJ21heGltdW0nICYmIG5leHRSYW5rICE9PSBwcmV2aW91c1JhbmsgPyBOdW1iZXIobmV4dFJhbmspID4gTnVtYmVyKHByZXZpb3VzUmFuaykgOiBuZXh0LnRpbWUgPiBwcmV2aW91cy50aW1lIHx8IChuZXh0LnRpbWUgPT09IHByZXZpb3VzLnRpbWUgJiYgKG5leHQuY291bnRlciA+IHByZXZpb3VzLmNvdW50ZXJcbiAgICAgIHx8IChuZXh0LmNvdW50ZXIgPT09IHByZXZpb3VzLmNvdW50ZXIgJiYgbmV4dC5kZXZpY2UgPiBwcmV2aW91cy5kZXZpY2UpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhIHZhbHVlIHN1cnZpdmVzIEpTT04gdHJhbnNwb3J0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQ2FuZGlkYXRlIGRhdGEtc3RvcmUgdmFsdWUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGl0IGlzIGZpbml0ZSwgYWN5Y2xpYyBKU09OIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25WYWx1ZSB7XG4gIHJldHVybiBpc0pzb25WYWx1ZSh2YWx1ZSwgbmV3IFNldCgpKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHZlcnNpb24tb25lIG9wZXJhdGlvbiB3aXJlIHNoYXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFBhcnNlZCBKU09OLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgb3BlcmF0aW9uIGhhcyB2YWxpZCBpZGVudGl0eSBhbmQgY2xvY2sgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhU3RvcmVPcGVyYXRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRhU3RvcmVPcGVyYXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAna2V5JyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUua2V5ID09PSAnc3RyaW5nJ1xuICAgICYmICdkZXZpY2UnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZXZpY2UgPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QodmFsdWUuZGV2aWNlKVxuICAgICYmICdzZXF1ZW5jZScgaW4gdmFsdWUgJiYgaXNQb3NpdGl2ZUludGVnZXIodmFsdWUuc2VxdWVuY2UpXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLnRpbWUpXG4gICAgJiYgJ2NvdW50ZXInIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLmNvdW50ZXIpXG4gICAgJiYgJ2RlbGV0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZWxldGVkID09PSAnYm9vbGVhbicgJiYgJ3ZhbHVlJyBpbiB2YWx1ZSAmJiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZS52YWx1ZSlcbiAgICAmJiAoISgndGFncycgaW4gdmFsdWUpIHx8IChBcnJheS5pc0FycmF5KHZhbHVlLnRhZ3MpICYmIHZhbHVlLnRhZ3MuZXZlcnkoKGl0ZW06IHVua25vd24pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpKTtcbn1cblxuZnVuY3Rpb24gaXNKc29uVmFsdWUodmFsdWU6IHVua25vd24sIGFuY2VzdG9yczogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGFuY2VzdG9ycy5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSk7XG4gIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZXMuZXZlcnkoKGNoaWxkKSA9PiBpc0pzb25WYWx1ZShjaGlsZCwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gaXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gaXNOb25OZWdhdGl2ZUludGVnZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpID49IDA7XG59XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgTnVtYmVyKHZhbHVlKSA+IDA7XG59XG5cbmZ1bmN0aW9uIHJhbmtPZih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ3JhbmsnIGluIHZhbHVlICYmICd2YWx1ZScgaW4gdmFsdWVcbiAgICAgICYmIHR5cGVvZiB2YWx1ZS5yYW5rID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUucmFuaylcbiAgICA/IHZhbHVlLnJhbmtcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdGFnKG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YDtcbn1cblxuZnVuY3Rpb24gdGFnVmVjdG9yKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IHZlY3RvciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdGFncykge1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IHZhbHVlLmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgY29uc3QgZGV2aWNlID0gdmFsdWUuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IE51bWJlcih2YWx1ZS5zbGljZShzZXBhcmF0b3IgKyAxKSk7XG4gICAgaWYgKCFkZXZpY2UgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHNlcXVlbmNlKSB8fCBzZXF1ZW5jZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb2JzZXJ2ZWQtcmVtb3ZlIHRhZycpO1xuICAgIH1cbiAgICB2ZWN0b3Iuc2V0KGRldmljZSwgTWF0aC5tYXgoc2VxdWVuY2UsIHZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gIH1cbiAgcmV0dXJuIHZlY3Rvcjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLAog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O0FBQ0EsTUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixXQUFPLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFDOUI7QUFDQSxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsSUFBSSxLQUFLLEdBQUc7QUFDckQsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLENBQUMsTUFBTSxRQUFRLEtBQUssS0FBSyxPQUFPLFVBQVUsU0FBUyxLQUFLLEtBQUssTUFBTSxtQkFBbUI7QUFDeEYsV0FBTztBQUFBLEVBQ1Q7QUFDQSxZQUFVLElBQUksS0FBSztBQUNuQixRQUFNLFNBQW9CLE1BQU0sUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxPQUFPLE9BQU8sS0FBSztBQUNqRixRQUFNLFVBQVUsT0FBTyxNQUFNLENBQUMsVUFBVSxZQUFZLE9BQU8sU0FBUyxDQUFDO0FBQ3JFLFlBQVUsT0FBTyxLQUFLO0FBQ3RCLFNBQU87QUFDVDtBQUVBLFNBQVMscUJBQXFCLE9BQXlCO0FBQ3JELFNBQU8sT0FBTyxjQUFjLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSztBQUN6RDtBQUVBLFNBQVMsa0JBQWtCLE9BQXlCO0FBQ2xELFNBQU8sT0FBTyxjQUFjLEtBQUssS0FBSyxPQUFPLEtBQUssSUFBSTtBQUN4RDtBQUVBLFNBQVMsT0FBTyxPQUFvQztBQUNsRCxNQUFJLE9BQU8sVUFBVSxZQUFZLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFDdkQsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxVQUFVLFNBQVMsV0FBVyxTQUM3RSxPQUFPLE1BQU0sU0FBUyxZQUFZLE9BQU8sU0FBUyxNQUFNLElBQUksSUFDL0QsTUFBTSxPQUNOO0FBQ047QUFFQSxTQUFTLElBQUksV0FBdUM7QUFDbEQsU0FBTyxHQUFHLFVBQVUsTUFBTSxJQUFJLE9BQU8sVUFBVSxRQUFRLENBQUM7QUFDMUQ7QUFFQSxTQUFTLFVBQVUsTUFBOEM7QUFDL0QsUUFBTSxTQUFTLG9CQUFJLElBQW9CO0FBQ3ZDLGFBQVcsU0FBUyxNQUFNO0FBQ3hCLFVBQU0sWUFBWSxNQUFNLFlBQVksR0FBRztBQUN2QyxVQUFNLFNBQVMsTUFBTSxNQUFNLEdBQUcsU0FBUztBQUN2QyxVQUFNLFdBQVcsT0FBTyxNQUFNLE1BQU0sWUFBWSxDQUFDLENBQUM7QUFDbEQsUUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLGNBQWMsUUFBUSxLQUFLLFlBQVksR0FBRztBQUMvRCxZQUFNLElBQUksTUFBTSw2QkFBNkI7QUFBQSxJQUMvQztBQUNBLFdBQU8sSUFBSSxRQUFRLEtBQUssSUFBSSxVQUFVLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQUEsRUFDaEU7QUFDQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIm9wZXJhdGlvbiJdCn0K
@@ -0,0 +1,133 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Optional chunked seeds for expensive derived caches, with per-file validation before reuse.
6
+ */
7
+ import type { JsonValue } from 'type-fest';
8
+ import type { LocalDataStore } from './local-data-store.mjs';
9
+ import { DataStoreTransport } from './data-store-transport.mjs';
10
+ /**
11
+ * A derived record tagged with both cheap statistics and a content hash.
12
+ */
13
+ export interface DataStoreSeedEntry extends DataStoreSeedFile {
14
+ /**
15
+ * Content hash, using the same algorithm on every device.
16
+ */
17
+ readonly hash: string;
18
+ /**
19
+ * Consumer-defined JSON cache record.
20
+ */
21
+ readonly value: JsonValue;
22
+ }
23
+ /**
24
+ * Cheap file identity already available from the vault's file tree.
25
+ */
26
+ export interface DataStoreSeedFile {
27
+ /**
28
+ * Last modification time.
29
+ */
30
+ readonly mtime: number;
31
+ /**
32
+ * Vault-relative path.
33
+ */
34
+ readonly path: string;
35
+ /**
36
+ * File size in bytes.
37
+ */
38
+ readonly size: number;
39
+ }
40
+ /**
41
+ * Parameters for optional cache-seed sharing.
42
+ */
43
+ export interface DataStoreSeedsConstructorParams {
44
+ /**
45
+ * Dedicated device-local store that owns the seed publisher identity.
46
+ */
47
+ readonly local: LocalDataStore;
48
+ /**
49
+ * Per-store user setting. Disabled means neither publishing nor adopting seeds.
50
+ */
51
+ readonly share: boolean;
52
+ /**
53
+ * Store-scoped, bounded Markdown transport. Include the consumer schema version in its store id.
54
+ */
55
+ readonly transport: DataStoreTransport;
56
+ }
57
+ /**
58
+ * Results of validating a shared cache seed against the local vault.
59
+ */
60
+ export interface DataStoreSeedValidation {
61
+ /**
62
+ * Files absent from the seed, or with different content.
63
+ */
64
+ readonly rebuild: string[];
65
+ /**
66
+ * Validated seed records, with local file statistics.
67
+ */
68
+ readonly reusable: DataStoreSeedEntry[];
69
+ }
70
+ /**
71
+ * Parameters for per-file seed validation.
72
+ */
73
+ export interface ValidateDataStoreSeedParams {
74
+ /**
75
+ * Seed entries from a recognized consumer schema.
76
+ */
77
+ readonly entries: readonly DataStoreSeedEntry[];
78
+ /**
79
+ * Current file tree, available without reading note text.
80
+ */
81
+ readonly files: readonly DataStoreSeedFile[];
82
+ /**
83
+ * Hashes text only when size matches but mtime differs.
84
+ *
85
+ * @param path - File requiring validation.
86
+ * @returns Its content hash.
87
+ */
88
+ readonly hashFile: (path: string) => Promise<string>;
89
+ }
90
+ /**
91
+ * Optional performance hints. Seeds are never authoritative state and must be validated before reuse.
92
+ */
93
+ export declare class DataStoreSeeds {
94
+ /**
95
+ * Device-local identity and serialization boundary.
96
+ */
97
+ protected readonly local: LocalDataStore;
98
+ /**
99
+ * Whether this store shares cache seeds.
100
+ */
101
+ protected readonly share: boolean;
102
+ /**
103
+ * Store-scoped snapshot transport.
104
+ */
105
+ protected readonly transport: DataStoreTransport;
106
+ /**
107
+ * Creates a cache-seed publisher and reader.
108
+ *
109
+ * @param params - Local identity, transport and the per-store sharing setting.
110
+ */
111
+ constructor(params: DataStoreSeedsConstructorParams);
112
+ /**
113
+ * Publishes a bounded seed, replacing only this device's earlier publications.
114
+ *
115
+ * @param entries - Derived records with file statistics and hashes.
116
+ * @returns Whether sharing was enabled and the seed was published.
117
+ */
118
+ publish(entries: readonly DataStoreSeedEntry[]): Promise<boolean>;
119
+ /**
120
+ * Reads the newest complete seed for this transport's schema.
121
+ *
122
+ * @returns Seed records, or `undefined` if sharing is disabled or no complete seed is available yet.
123
+ */
124
+ readLatest(): Promise<DataStoreSeedEntry[] | undefined>;
125
+ }
126
+ /**
127
+ * Validates a seed using free file statistics first, hashing only size-equal mtime mismatches.
128
+ * Files absent locally are discarded. Consumers index only the returned rebuild paths.
129
+ *
130
+ * @param params - Seed, current file tree and content-hash reader.
131
+ * @returns Reusable records and the paths that still need indexing.
132
+ */
133
+ export declare function validateDataStoreSeed(params: ValidateDataStoreSeedParams): Promise<DataStoreSeedValidation>;
@@ -0,0 +1,115 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { isDataStoreJsonValue } from "./data-store-replica.mjs";
7
+ import { DataStoreTransport } from "./data-store-transport.mjs";
8
+ class DataStoreSeeds {
9
+ /**
10
+ * Device-local identity and serialization boundary.
11
+ */
12
+ local;
13
+ /**
14
+ * Whether this store shares cache seeds.
15
+ */
16
+ share;
17
+ /**
18
+ * Store-scoped snapshot transport.
19
+ */
20
+ transport;
21
+ /**
22
+ * Creates a cache-seed publisher and reader.
23
+ *
24
+ * @param params - Local identity, transport and the per-store sharing setting.
25
+ */
26
+ constructor(params) {
27
+ this.local = params.local;
28
+ this.share = params.share;
29
+ this.transport = params.transport;
30
+ }
31
+ /**
32
+ * Publishes a bounded seed, replacing only this device's earlier publications.
33
+ *
34
+ * @param entries - Derived records with file statistics and hashes.
35
+ * @returns Whether sharing was enabled and the seed was published.
36
+ */
37
+ async publish(entries) {
38
+ if (!this.share) {
39
+ return false;
40
+ }
41
+ return await this.local.exclusive(async () => {
42
+ const device = await this.local.getOrCreate("seed-device-v1", window.crypto.randomUUID());
43
+ if (typeof device !== "string" || !/^[\w-]+$/.test(device)) {
44
+ throw new Error("Invalid local seed identity");
45
+ }
46
+ const root = `${this.transport.root}/seeds/${device}`;
47
+ const files = await this.transport.list();
48
+ const base = `${root}/seed-${window.crypto.randomUUID()}-manifest`;
49
+ await this.transport.writeSnapshot({ base, payload: { entries, format: 1, time: Date.now() } });
50
+ for (const path of files) {
51
+ if (path.startsWith(`${root}/seed-`)) {
52
+ await this.transport.remove(path);
53
+ }
54
+ }
55
+ return true;
56
+ });
57
+ }
58
+ /**
59
+ * Reads the newest complete seed for this transport's schema.
60
+ *
61
+ * @returns Seed records, or `undefined` if sharing is disabled or no complete seed is available yet.
62
+ */
63
+ async readLatest() {
64
+ if (!this.share) {
65
+ return void 0;
66
+ }
67
+ const files = await this.transport.list();
68
+ let newest = -Infinity;
69
+ let entries;
70
+ for (const path of files) {
71
+ if (!/\/seed-[\w-]+-manifest\.md$/.test(path)) {
72
+ continue;
73
+ }
74
+ let seed;
75
+ try {
76
+ seed = await this.transport.readSnapshot(path);
77
+ } catch (error) {
78
+ if (error instanceof SyntaxError) {
79
+ continue;
80
+ }
81
+ throw error;
82
+ }
83
+ if (!(isSeed(seed) && seed.time > newest)) {
84
+ continue;
85
+ }
86
+ newest = seed.time;
87
+ entries = seed.entries;
88
+ }
89
+ return entries;
90
+ }
91
+ }
92
+ async function validateDataStoreSeed(params) {
93
+ const seed = new Map(params.entries.map((entry) => [entry.path, entry]));
94
+ const reusable = [];
95
+ const rebuild = [];
96
+ for (const file of params.files) {
97
+ const entry = seed.get(file.path);
98
+ if (entry?.size === file.size && (entry.mtime === file.mtime || entry.hash === await params.hashFile(file.path))) {
99
+ reusable.push({ ...entry, ...file });
100
+ } else {
101
+ rebuild.push(file.path);
102
+ }
103
+ }
104
+ return { rebuild, reusable };
105
+ }
106
+ function isSeed(value) {
107
+ return typeof value === "object" && value !== null && "format" in value && value.format === 1 && "time" in value && typeof value.time === "number" && Number.isFinite(value.time) && "entries" in value && Array.isArray(value.entries) && value.entries.every(
108
+ (entry) => typeof entry === "object" && entry !== null && "path" in entry && typeof entry.path === "string" && "mtime" in entry && typeof entry.mtime === "number" && Number.isFinite(entry.mtime) && "size" in entry && typeof entry.size === "number" && Number.isFinite(entry.size) && "hash" in entry && typeof entry.hash === "string" && "value" in entry && isDataStoreJsonValue(entry.value)
109
+ );
110
+ }
111
+ export {
112
+ DataStoreSeeds,
113
+ validateDataStoreSeed
114
+ };
115
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2RhdGEtc3RvcmUtc2VlZHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9wdGlvbmFsIGNodW5rZWQgc2VlZHMgZm9yIGV4cGVuc2l2ZSBkZXJpdmVkIGNhY2hlcywgd2l0aCBwZXItZmlsZSB2YWxpZGF0aW9uIGJlZm9yZSByZXVzZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBpc0RhdGFTdG9yZUpzb25WYWx1ZSB9IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG4vKipcbiAqIEEgZGVyaXZlZCByZWNvcmQgdGFnZ2VkIHdpdGggYm90aCBjaGVhcCBzdGF0aXN0aWNzIGFuZCBhIGNvbnRlbnQgaGFzaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkRW50cnkgZXh0ZW5kcyBEYXRhU3RvcmVTZWVkRmlsZSB7XG4gIC8qKlxuICAgKiBDb250ZW50IGhhc2gsIHVzaW5nIHRoZSBzYW1lIGFsZ29yaXRobSBvbiBldmVyeSBkZXZpY2UuXG4gICAqL1xuICByZWFkb25seSBoYXNoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25zdW1lci1kZWZpbmVkIEpTT04gY2FjaGUgcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTtcbn1cblxuLyoqXG4gKiBDaGVhcCBmaWxlIGlkZW50aXR5IGFscmVhZHkgYXZhaWxhYmxlIGZyb20gdGhlIHZhdWx0J3MgZmlsZSB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVNlZWRGaWxlIHtcbiAgLyoqXG4gICAqIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUuXG4gICAqL1xuICByZWFkb25seSBtdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEZpbGUgc2l6ZSBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcHRpb25hbCBjYWNoZS1zZWVkIHNoYXJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlU2VlZHNDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgZGV2aWNlLWxvY2FsIHN0b3JlIHRoYXQgb3ducyB0aGUgc2VlZCBwdWJsaXNoZXIgaWRlbnRpdHkuXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBQZXItc3RvcmUgdXNlciBzZXR0aW5nLiBEaXNhYmxlZCBtZWFucyBuZWl0aGVyIHB1Ymxpc2hpbmcgbm9yIGFkb3B0aW5nIHNlZWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdG9yZS1zY29wZWQsIGJvdW5kZWQgTWFya2Rvd24gdHJhbnNwb3J0LiBJbmNsdWRlIHRoZSBjb25zdW1lciBzY2hlbWEgdmVyc2lvbiBpbiBpdHMgc3RvcmUgaWQuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IERhdGFTdG9yZVRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBSZXN1bHRzIG9mIHZhbGlkYXRpbmcgYSBzaGFyZWQgY2FjaGUgc2VlZCBhZ2FpbnN0IHRoZSBsb2NhbCB2YXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkVmFsaWRhdGlvbiB7XG4gIC8qKlxuICAgKiBGaWxlcyBhYnNlbnQgZnJvbSB0aGUgc2VlZCwgb3Igd2l0aCBkaWZmZXJlbnQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYnVpbGQ6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVmFsaWRhdGVkIHNlZWQgcmVjb3Jkcywgd2l0aCBsb2NhbCBmaWxlIHN0YXRpc3RpY3MuXG4gICAqL1xuICByZWFkb25seSByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcGVyLWZpbGUgc2VlZCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZWVkIGVudHJpZXMgZnJvbSBhIHJlY29nbml6ZWQgY29uc3VtZXIgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cmllczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEVudHJ5W107XG4gIC8qKlxuICAgKiBDdXJyZW50IGZpbGUgdHJlZSwgYXZhaWxhYmxlIHdpdGhvdXQgcmVhZGluZyBub3RlIHRleHQuXG4gICAqL1xuICByZWFkb25seSBmaWxlczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEZpbGVbXTtcbiAgLyoqXG4gICAqIEhhc2hlcyB0ZXh0IG9ubHkgd2hlbiBzaXplIG1hdGNoZXMgYnV0IG10aW1lIGRpZmZlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSByZXF1aXJpbmcgdmFsaWRhdGlvbi5cbiAgICogQHJldHVybnMgSXRzIGNvbnRlbnQgaGFzaC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc2hGaWxlOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBTZWVkIHtcbiAgZW50cmllczogRGF0YVN0b3JlU2VlZEVudHJ5W107XG4gIGZvcm1hdDogMTtcbiAgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHBlcmZvcm1hbmNlIGhpbnRzLiBTZWVkcyBhcmUgbmV2ZXIgYXV0aG9yaXRhdGl2ZSBzdGF0ZSBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlIHJldXNlLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlU2VlZHMge1xuICAvKipcbiAgICogRGV2aWNlLWxvY2FsIGlkZW50aXR5IGFuZCBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvY2FsOiBMb2NhbERhdGFTdG9yZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdG9yZSBzaGFyZXMgY2FjaGUgc2VlZHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdG9yZS1zY29wZWQgc25hcHNob3QgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zcG9ydDogRGF0YVN0b3JlVHJhbnNwb3J0O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNhY2hlLXNlZWQgcHVibGlzaGVyIGFuZCByZWFkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBMb2NhbCBpZGVudGl0eSwgdHJhbnNwb3J0IGFuZCB0aGUgcGVyLXN0b3JlIHNoYXJpbmcgc2V0dGluZy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERhdGFTdG9yZVNlZWRzQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmxvY2FsID0gcGFyYW1zLmxvY2FsO1xuICAgIHRoaXMuc2hhcmUgPSBwYXJhbXMuc2hhcmU7XG4gICAgdGhpcy50cmFuc3BvcnQgPSBwYXJhbXMudHJhbnNwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJvdW5kZWQgc2VlZCwgcmVwbGFjaW5nIG9ubHkgdGhpcyBkZXZpY2UncyBlYXJsaWVyIHB1YmxpY2F0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGVudHJpZXMgLSBEZXJpdmVkIHJlY29yZHMgd2l0aCBmaWxlIHN0YXRpc3RpY3MgYW5kIGhhc2hlcy5cbiAgICogQHJldHVybnMgV2hldGhlciBzaGFyaW5nIHdhcyBlbmFibGVkIGFuZCB0aGUgc2VlZCB3YXMgcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2goZW50cmllczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEVudHJ5W10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuc2hhcmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHRoaXMubG9jYWwuZ2V0T3JDcmVhdGUoJ3NlZWQtZGV2aWNlLXYxJywgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCkpO1xuICAgICAgaWYgKHR5cGVvZiBkZXZpY2UgIT09ICdzdHJpbmcnIHx8ICEvXltcXHctXSskLy50ZXN0KGRldmljZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIHNlZWQgaWRlbnRpdHknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvb3QgPSBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9zZWVkcy8ke2RldmljZX1gO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7cm9vdH0vc2VlZC0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfS1tYW5pZmVzdGA7XG4gICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVNuYXBzaG90KHsgYmFzZSwgcGF5bG9hZDogeyBlbnRyaWVzLCBmb3JtYXQ6IDEsIHRpbWU6IERhdGUubm93KCkgfSB9KTtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke3Jvb3R9L3NlZWQtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBuZXdlc3QgY29tcGxldGUgc2VlZCBmb3IgdGhpcyB0cmFuc3BvcnQncyBzY2hlbWEuXG4gICAqXG4gICAqIEByZXR1cm5zIFNlZWQgcmVjb3Jkcywgb3IgYHVuZGVmaW5lZGAgaWYgc2hhcmluZyBpcyBkaXNhYmxlZCBvciBubyBjb21wbGV0ZSBzZWVkIGlzIGF2YWlsYWJsZSB5ZXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZExhdGVzdCgpOiBQcm9taXNlPERhdGFTdG9yZVNlZWRFbnRyeVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLnNoYXJlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmxpc3QoKTtcbiAgICBsZXQgbmV3ZXN0ID0gLUluZmluaXR5O1xuICAgIGxldCBlbnRyaWVzOiBEYXRhU3RvcmVTZWVkRW50cnlbXSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghL1xcL3NlZWQtW1xcdy1dKy1tYW5pZmVzdFxcLm1kJC8udGVzdChwYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWVkOiB1bmtub3duO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoIShpc1NlZWQoc2VlZCkgJiYgc2VlZC50aW1lID4gbmV3ZXN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3ZXN0ID0gc2VlZC50aW1lO1xuICAgICAgZW50cmllcyA9IHNlZWQuZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzZWVkIHVzaW5nIGZyZWUgZmlsZSBzdGF0aXN0aWNzIGZpcnN0LCBoYXNoaW5nIG9ubHkgc2l6ZS1lcXVhbCBtdGltZSBtaXNtYXRjaGVzLlxuICogRmlsZXMgYWJzZW50IGxvY2FsbHkgYXJlIGRpc2NhcmRlZC4gQ29uc3VtZXJzIGluZGV4IG9ubHkgdGhlIHJldHVybmVkIHJlYnVpbGQgcGF0aHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNlZWQsIGN1cnJlbnQgZmlsZSB0cmVlIGFuZCBjb250ZW50LWhhc2ggcmVhZGVyLlxuICogQHJldHVybnMgUmV1c2FibGUgcmVjb3JkcyBhbmQgdGhlIHBhdGhzIHRoYXQgc3RpbGwgbmVlZCBpbmRleGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YVN0b3JlU2VlZChwYXJhbXM6IFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyk6IFByb21pc2U8RGF0YVN0b3JlU2VlZFZhbGlkYXRpb24+IHtcbiAgY29uc3Qgc2VlZCA9IG5ldyBNYXAocGFyYW1zLmVudHJpZXMubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBhdGgsIGVudHJ5XSkpO1xuICBjb25zdCByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcmVidWlsZDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIHBhcmFtcy5maWxlcykge1xuICAgIGNvbnN0IGVudHJ5ID0gc2VlZC5nZXQoZmlsZS5wYXRoKTtcbiAgICBpZiAoZW50cnk/LnNpemUgPT09IGZpbGUuc2l6ZSAmJiAoZW50cnkubXRpbWUgPT09IGZpbGUubXRpbWUgfHwgZW50cnkuaGFzaCA9PT0gYXdhaXQgcGFyYW1zLmhhc2hGaWxlKGZpbGUucGF0aCkpKSB7XG4gICAgICByZXVzYWJsZS5wdXNoKHsgLi4uZW50cnksIC4uLmZpbGUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYnVpbGQucHVzaChmaWxlLnBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByZWJ1aWxkLCByZXVzYWJsZSB9O1xufVxuXG5mdW5jdGlvbiBpc1NlZWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZWVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2Zvcm1hdCcgaW4gdmFsdWUgJiYgdmFsdWUuZm9ybWF0ID09PSAxXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aW1lID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUudGltZSlcbiAgICAmJiAnZW50cmllcycgaW4gdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5lbnRyaWVzKSAmJiB2YWx1ZS5lbnRyaWVzLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3BhdGgnIGluIGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5wYXRoID09PSAnc3RyaW5nJ1xuICAgICAgJiYgJ210aW1lJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkubXRpbWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShlbnRyeS5tdGltZSlcbiAgICAgICYmICdzaXplJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkuc2l6ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGVudHJ5LnNpemUpXG4gICAgICAmJiAnaGFzaCcgaW4gZW50cnkgJiYgdHlwZW9mIGVudHJ5Lmhhc2ggPT09ICdzdHJpbmcnICYmICd2YWx1ZScgaW4gZW50cnkgJiYgaXNEYXRhU3RvcmVKc29uVmFsdWUoZW50cnkudmFsdWUpXG4gICAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBV0EsU0FBUyw0QkFBNEI7QUFDckMsU0FBUywwQkFBMEI7QUFnRzVCLE1BQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVA7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1aLFlBQVksUUFBeUM7QUFDMUQsU0FBSyxRQUFRLE9BQU87QUFDcEIsU0FBSyxRQUFRLE9BQU87QUFDcEIsU0FBSyxZQUFZLE9BQU87QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxRQUFRLFNBQTBEO0FBQzdFLFFBQUksQ0FBQyxLQUFLLE9BQU87QUFDZixhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sTUFBTSxLQUFLLE1BQU0sVUFBVSxZQUFZO0FBQzVDLFlBQU0sU0FBUyxNQUFNLEtBQUssTUFBTSxZQUFZLGtCQUFrQixPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQ3hGLFVBQUksT0FBTyxXQUFXLFlBQVksQ0FBQyxXQUFXLEtBQUssTUFBTSxHQUFHO0FBQzFELGNBQU0sSUFBSSxNQUFNLDZCQUE2QjtBQUFBLE1BQy9D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
@@ -0,0 +1,125 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Size-bounded Markdown transport carried by vault synchronization with default file types.
6
+ */
7
+ import type { DataAdapter } from 'obsidian';
8
+ /**
9
+ * Parameters for the shared-store vault transport.
10
+ */
11
+ export interface DataStoreTransportConstructorParams {
12
+ /**
13
+ * Vault adapter; no desktop filesystem APIs are used.
14
+ */
15
+ readonly adapter: DataAdapter;
16
+ /**
17
+ * Configurable non-dot vault folder.
18
+ *
19
+ * @default `'Plugin data'`
20
+ */
21
+ readonly folder?: string;
22
+ /**
23
+ * Maximum UTF-8 bytes in any file, including its Markdown wrapper.
24
+ *
25
+ * @default `1000000`
26
+ */
27
+ readonly maxFileBytes?: number;
28
+ /**
29
+ * Plugin manifest id.
30
+ */
31
+ readonly pluginId: string;
32
+ /**
33
+ * Store name including its consumer schema version.
34
+ */
35
+ readonly storeId: string;
36
+ }
37
+ /**
38
+ * Parameters for publishing a chunked snapshot.
39
+ */
40
+ export interface DataStoreTransportWriteSnapshotParams {
41
+ /**
42
+ * Vault-relative base path without the `.md` extension. Use a fresh unique name for every publication.
43
+ */
44
+ readonly base: string;
45
+ /**
46
+ * JSON-compatible snapshot, including its consumer schema and coverage metadata.
47
+ */
48
+ readonly payload: unknown;
49
+ }
50
+ /**
51
+ * A store-scoped transport. Every published document is immutable except device acknowledgements.
52
+ */
53
+ export declare class DataStoreTransport {
54
+ protected readonly params: DataStoreTransportConstructorParams;
55
+ /**
56
+ * Maximum encoded bytes per document.
57
+ */
58
+ readonly maxFileBytes: number;
59
+ /**
60
+ * Full vault-relative store root.
61
+ */
62
+ readonly root: string;
63
+ /**
64
+ * Vault adapter used by this transport.
65
+ */
66
+ protected readonly adapter: DataAdapter;
67
+ /**
68
+ * Creates a bounded vault transport.
69
+ *
70
+ * @param params - Adapter, identity and file bounds.
71
+ */
72
+ constructor(params: DataStoreTransportConstructorParams);
73
+ /**
74
+ * Tests the complete encoded size without writing.
75
+ *
76
+ * @param value - JSON payload.
77
+ * @returns Whether its document fits the configured cap.
78
+ */
79
+ fits(value: unknown): boolean;
80
+ /**
81
+ * Lists the store's files recursively, never leaving its folder.
82
+ *
83
+ * @returns Vault-relative paths.
84
+ */
85
+ list(): Promise<string[]>;
86
+ /**
87
+ * Reads a complete fenced JSON document. Partial or not-yet-delivered documents are ignored.
88
+ *
89
+ * @param path - Vault-relative file within this store.
90
+ * @returns Parsed JSON, or `undefined` for an incomplete document.
91
+ */
92
+ read(path: string): Promise<unknown>;
93
+ /**
94
+ * Reads a snapshot only after every numbered chunk arrives and passes its SHA-256 check.
95
+ *
96
+ * @param path - Vault-relative manifest path.
97
+ * @returns Its payload, or `undefined` while delivery is incomplete.
98
+ */
99
+ readSnapshot(path: string): Promise<unknown>;
100
+ /**
101
+ * Removes a document owned by the caller's device.
102
+ *
103
+ * @param path - Vault-relative file within this store.
104
+ * @returns A promise that resolves after removal.
105
+ */
106
+ remove(path: string): Promise<void>;
107
+ /**
108
+ * Writes a complete document, refusing an oversized write before adapter mutation.
109
+ *
110
+ * @param path - Vault-relative file within this store.
111
+ * @param value - JSON-compatible payload.
112
+ * @returns A promise that resolves once the adapter finishes writing.
113
+ */
114
+ write(path: string, value: unknown): Promise<void>;
115
+ /**
116
+ * Publishes bounded immutable chunks before their manifest. Readers verify delivery completeness.
117
+ *
118
+ * @param params - Unique base path and snapshot payload.
119
+ * @returns A promise that resolves when the manifest has been published.
120
+ */
121
+ writeSnapshot(params: DataStoreTransportWriteSnapshotParams): Promise<void>;
122
+ private checkPath;
123
+ private checkSize;
124
+ private encode;
125
+ }