@mnaoumov/obsidian-lib 6.3.0 → 7.1.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 (55) hide show
  1. package/components/incremental-file-index-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 +36 -1
  10. package/dist/lib/cjs/__merged.d.cts +7 -0
  11. package/dist/lib/cjs/components/incremental-file-index-component.cjs +340 -0
  12. package/dist/lib/cjs/components/incremental-file-index-component.d.cts +152 -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 +7 -1
  29. package/dist/lib/cjs/index.d.cts +2 -0
  30. package/dist/lib/cjs/obsidian-word-characters.cjs +231 -0
  31. package/dist/lib/cjs/obsidian-word-characters.d.cts +59 -0
  32. package/dist/lib/esm/__merged.d.mts +7 -0
  33. package/dist/lib/esm/__merged.mjs +35 -1
  34. package/dist/lib/esm/components/incremental-file-index-component.d.mts +152 -0
  35. package/dist/lib/esm/components/incremental-file-index-component.mjs +260 -0
  36. package/dist/lib/esm/components/index.d.mts +1 -0
  37. package/dist/lib/esm/components/index.mjs +3 -1
  38. package/dist/lib/esm/data-stores/data-store-replica.d.mts +112 -0
  39. package/dist/lib/esm/data-stores/data-store-replica.mjs +173 -0
  40. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +133 -0
  41. package/dist/lib/esm/data-stores/data-store-seeds.mjs +115 -0
  42. package/dist/lib/esm/data-stores/data-store-transport.d.mts +125 -0
  43. package/dist/lib/esm/data-stores/data-store-transport.mjs +259 -0
  44. package/dist/lib/esm/data-stores/index.d.mts +6 -0
  45. package/dist/lib/esm/data-stores/index.mjs +18 -0
  46. package/dist/lib/esm/data-stores/local-data-store.d.mts +119 -0
  47. package/dist/lib/esm/data-stores/local-data-store.mjs +170 -0
  48. package/dist/lib/esm/data-stores/shared-data-store.d.mts +137 -0
  49. package/dist/lib/esm/data-stores/shared-data-store.mjs +346 -0
  50. package/dist/lib/esm/generated-during-build.mjs +1 -1
  51. package/dist/lib/esm/index.d.mts +2 -0
  52. package/dist/lib/esm/index.mjs +5 -1
  53. package/dist/lib/esm/obsidian-word-characters.d.mts +59 -0
  54. package/dist/lib/esm/obsidian-word-characters.mjs +139 -0
  55. package/package.json +38 -17
@@ -0,0 +1,431 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault(module) {
45
+ return module && module.__esModule && "default" in module ? module.default : module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const module = originalRequire?.(id);
88
+ if (module) {
89
+ return extractDefault(module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __defProp = Object.defineProperty;
99
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
100
+ var __getOwnPropNames = Object.getOwnPropertyNames;
101
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
102
+ var __export = (target, all) => {
103
+ for (var name in all)
104
+ __defProp(target, name, { get: all[name], enumerable: true });
105
+ };
106
+ var __copyProps = (to, from, except, desc) => {
107
+ if (from && typeof from === "object" || typeof from === "function") {
108
+ for (let key of __getOwnPropNames(from))
109
+ if (!__hasOwnProp.call(to, key) && key !== except)
110
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
111
+ }
112
+ return to;
113
+ };
114
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
+ var shared_data_store_exports = {};
116
+ __export(shared_data_store_exports, {
117
+ SharedDataStore: () => SharedDataStore
118
+ });
119
+ module.exports = __toCommonJS(shared_data_store_exports);
120
+ var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
121
+ var import_data_store_replica = require('./data-store-replica.cjs');
122
+ var import_data_store_transport = require('./data-store-transport.cjs');
123
+ const DEFAULT_ACTIVE_DEVICE_MILLISECONDS = 2592e6;
124
+ const OWNER_PATH_INDEX = -2;
125
+ const VECTOR_ENTRY_LENGTH = 2;
126
+ const DEVICE_PATH_PARTS = 2;
127
+ const RECORD_PREFIX = "shared-record-v1:";
128
+ class SharedDataStore {
129
+ constructor(params, device) {
130
+ this.params = params;
131
+ this.device = device;
132
+ this.transport = new import_data_store_transport.DataStoreTransport(params);
133
+ this.replica = new import_data_store_replica.DataStoreReplica(params.kind);
134
+ this.activeDeviceMilliseconds = params.activeDeviceMilliseconds ?? DEFAULT_ACTIVE_DEVICE_MILLISECONDS;
135
+ if (!Number.isFinite(this.activeDeviceMilliseconds) || this.activeDeviceMilliseconds <= 0) {
136
+ throw new Error("Device retirement interval must be positive");
137
+ }
138
+ }
139
+ params;
140
+ device;
141
+ activeDeviceMilliseconds;
142
+ counter = 0;
143
+ localRecords = /* @__PURE__ */ new Map();
144
+ replica;
145
+ time = 0;
146
+ transport;
147
+ vector = /* @__PURE__ */ new Map();
148
+ /**
149
+ * Opens and synchronizes a store, restoring its device identity exclusively from IndexedDB.
150
+ *
151
+ * @param params - Persistence, transport and merge policy.
152
+ * @returns A synchronized query replica.
153
+ */
154
+ static async open(params) {
155
+ const device = await params.local.getOrCreate("shared-device-v1", window.crypto.randomUUID());
156
+ if (typeof device !== "string" || !/^[\w-]+$/.test(device)) {
157
+ throw new Error("Invalid local data-store identity");
158
+ }
159
+ const store = new SharedDataStore(params, device);
160
+ await store.synchronize();
161
+ return store;
162
+ }
163
+ /**
164
+ * Publishes a complete chunked snapshot and trims only this device's acknowledged journal segments.
165
+ * Retired devices rejoin by merging snapshots; tombstones remain in snapshots to prevent resurrection.
166
+ *
167
+ * @returns A promise that resolves when compaction finishes.
168
+ */
169
+ async compact() {
170
+ await this.params.local.exclusive(async () => {
171
+ await this.loadLocal();
172
+ await this.mergeFiles();
173
+ await this.persist();
174
+ const files = await this.transport.list();
175
+ const base = `${this.deviceRoot()}/snapshot-${window.crypto.randomUUID()}-manifest`;
176
+ await this.transport.writeSnapshot({ base, payload: this.checkpoint() });
177
+ const acknowledgements = await this.acknowledgements(files);
178
+ for (const path of files) {
179
+ if (!path.startsWith(`${this.deviceRoot()}/log-`)) {
180
+ continue;
181
+ }
182
+ const operations = await this.transport.read(path);
183
+ if (!Array.isArray(operations) || !operations.every(import_data_store_replica.isDataStoreOperation)) {
184
+ continue;
185
+ }
186
+ const last = Math.max(...operations.map((operation) => operation.sequence));
187
+ if (acknowledgements.every((vector) => (vector.get(this.device) ?? 0) >= last)) {
188
+ await this.transport.remove(path);
189
+ }
190
+ }
191
+ for (const path of files) {
192
+ if (path.startsWith(`${this.deviceRoot()}/snapshot-`)) {
193
+ await this.transport.remove(path);
194
+ }
195
+ }
196
+ });
197
+ }
198
+ /**
199
+ * Deletes a register or removes the currently observed additions of a set member.
200
+ *
201
+ * @param key - Record key or set member. Min/max registers deliberately cannot be deleted.
202
+ * @returns A promise that resolves after journal publication and local commit.
203
+ */
204
+ async delete(key) {
205
+ await this.change([{ deleted: true, key, value: null }]);
206
+ }
207
+ /**
208
+ * Reads the current local query replica.
209
+ *
210
+ * @returns Detached key/value pairs in deterministic order.
211
+ */
212
+ entries() {
213
+ return this.replica.entries();
214
+ }
215
+ /**
216
+ * Reads a register or set membership from the current local query replica.
217
+ *
218
+ * @param key - Record key or set member.
219
+ * @returns A detached value, or `undefined` when absent or deleted.
220
+ */
221
+ get(key) {
222
+ return this.replica.get(key);
223
+ }
224
+ /**
225
+ * Writes one register value, or adds a member to an observed-remove set.
226
+ *
227
+ * @param key - Record key or set member.
228
+ * @param value - JSON-compatible value (use `true` for a set).
229
+ * @returns A promise that resolves after journal publication and local commit.
230
+ */
231
+ async set(key, value) {
232
+ await this.setMany([[key, value]]);
233
+ }
234
+ /**
235
+ * Publishes a batch of register writes, split into bounded immutable segments.
236
+ * Segments are individually durable; a failed batch can have a published prefix and can be retried safely.
237
+ *
238
+ * @param entries - Register writes or set additions.
239
+ * @returns A promise that resolves after journal publication and local commit.
240
+ */
241
+ async setMany(entries) {
242
+ await this.change(entries.map(([key, value]) => ({ deleted: false, key, value })));
243
+ }
244
+ /**
245
+ * Merges complete snapshots and contiguous journal history, then publishes its durable acknowledgement.
246
+ * Partial deliveries remain pending; a later call retries them. No acknowledgement skips a missing sequence.
247
+ *
248
+ * @returns A promise that resolves after the local checkpoint and acknowledgement commit.
249
+ */
250
+ async synchronize() {
251
+ await this.params.local.exclusive(async () => {
252
+ await this.loadLocal();
253
+ await this.mergeFiles();
254
+ await this.persist();
255
+ });
256
+ }
257
+ async acknowledgements(files) {
258
+ const acknowledgements = [new Map(this.vector)];
259
+ const deviceFiles = files.filter((path) => path.startsWith(`${this.transport.root}/devices/`));
260
+ const devices = new Set(deviceFiles.map((path) => path.slice(this.transport.root.length + 1).split("/", DEVICE_PATH_PARTS)[1]).filter((device) => device !== void 0));
261
+ for (const device of devices) {
262
+ if (device === this.device) {
263
+ continue;
264
+ }
265
+ const have = await this.transport.read(`${this.transport.root}/devices/${device}/have.md`);
266
+ if (!isObject(have) || !isVector(have["vector"]) || typeof have["time"] !== "number") {
267
+ acknowledgements.push(/* @__PURE__ */ new Map());
268
+ } else if (Date.now() - have["time"] <= this.activeDeviceMilliseconds) {
269
+ acknowledgements.push(new Map(have["vector"]));
270
+ }
271
+ }
272
+ return acknowledgements;
273
+ }
274
+ apply(operation) {
275
+ this.replica.apply(operation);
276
+ this.vector.set(operation.device, operation.sequence);
277
+ this.observeClock(operation.time, operation.counter);
278
+ }
279
+ async change(changes) {
280
+ await this.params.local.exclusive(async () => {
281
+ await this.loadLocal();
282
+ await this.mergeFiles();
283
+ const operations = [];
284
+ const candidate = new import_data_store_replica.DataStoreReplica(this.params.kind);
285
+ for (const operation of this.replica.export()) {
286
+ candidate.apply(operation);
287
+ }
288
+ let sequence = this.vector.get(this.device) ?? 0;
289
+ for (const change of changes) {
290
+ const now = Date.now();
291
+ this.counter = now > this.time ? 0 : this.counter + 1;
292
+ this.time = Math.max(now, this.time);
293
+ const operation = {
294
+ ...change,
295
+ counter: this.counter,
296
+ device: this.device,
297
+ sequence: ++sequence,
298
+ tags: candidate.observedTags(change.key),
299
+ time: this.time
300
+ };
301
+ candidate.apply(operation);
302
+ operations.push(operation);
303
+ }
304
+ for (const operation of operations) {
305
+ if (!this.transport.fits([operation])) {
306
+ await this.transport.write(`${this.deviceRoot()}/log-${String(operation.sequence)}.md`, [operation]);
307
+ }
308
+ }
309
+ let batch = [];
310
+ for (const operation of operations) {
311
+ if (!this.transport.fits([...batch, operation])) {
312
+ await this.publish(batch);
313
+ batch = [];
314
+ }
315
+ batch.push(operation);
316
+ }
317
+ if (batch.length > 0) {
318
+ await this.publish(batch);
319
+ }
320
+ await this.persist();
321
+ });
322
+ }
323
+ checkpoint() {
324
+ return { counter: this.counter, format: 1, kind: this.params.kind, operations: this.replica.export(), time: this.time, vector: [...this.vector] };
325
+ }
326
+ deviceRoot() {
327
+ return `${this.transport.root}/devices/${this.device}`;
328
+ }
329
+ async loadLocal() {
330
+ this.replica = new import_data_store_replica.DataStoreReplica(this.params.kind);
331
+ this.vector.clear();
332
+ this.time = 0;
333
+ this.counter = 0;
334
+ this.localRecords.clear();
335
+ const records = await this.params.local.entries();
336
+ for (const [key, value] of records) {
337
+ if (key === "shared-checkpoint-v1") {
338
+ this.mergeCheckpoint(value);
339
+ } else if (key.startsWith(RECORD_PREFIX)) {
340
+ this.replica.apply(value);
341
+ this.localRecords.set(key, (0, import_type_guards.ensureNonNullable)(JSON.stringify(value)));
342
+ }
343
+ }
344
+ }
345
+ mergeCheckpoint(value) {
346
+ if (!isObject(value) || value["format"] !== 1 || value["kind"] !== this.params.kind || !Array.isArray(value["operations"]) || !value["operations"].every(import_data_store_replica.isDataStoreOperation) || !isVector(value["vector"]) || !Number.isSafeInteger(value["time"]) || !Number.isSafeInteger(value["counter"])) {
347
+ throw new Error("Invalid data-store checkpoint or incompatible merge rule");
348
+ }
349
+ for (const operation of value["operations"]) {
350
+ this.replica.apply(operation);
351
+ }
352
+ for (const [device, sequence] of value["vector"]) {
353
+ this.vector.set(device, Math.max(sequence, this.vector.get(device) ?? 0));
354
+ }
355
+ this.observeClock(Number(value["time"]), Number(value["counter"]));
356
+ }
357
+ async mergeFiles() {
358
+ const allFiles = await this.transport.list();
359
+ const files = allFiles.filter((path) => path.startsWith(`${this.transport.root}/devices/`));
360
+ const manifests = files.filter((file) => /\/snapshot-[\w-]+-manifest\.md$/.test(file));
361
+ for (const path of manifests) {
362
+ const snapshot = await this.transport.readSnapshot(path);
363
+ if (snapshot !== void 0) {
364
+ this.mergeCheckpoint(snapshot);
365
+ }
366
+ }
367
+ const operations = [];
368
+ const segments = files.filter((file) => /\/log-\d+\.md$/.test(file));
369
+ for (const path of segments) {
370
+ const segment = await this.transport.read(path);
371
+ if (segment === void 0) {
372
+ continue;
373
+ }
374
+ if (!Array.isArray(segment) || !segment.every(import_data_store_replica.isDataStoreOperation)) {
375
+ throw new Error("Invalid data-store journal segment");
376
+ }
377
+ const owner = path.split("/").at(OWNER_PATH_INDEX);
378
+ if (segment.some((operation) => operation.device !== owner)) {
379
+ throw new Error("Journal segment has a different writer");
380
+ }
381
+ operations.push(...segment);
382
+ }
383
+ operations.sort((first, second) => first.device.localeCompare(second.device) || first.sequence - second.sequence);
384
+ for (const operation of operations) {
385
+ if (operation.sequence === (this.vector.get(operation.device) ?? 0) + 1) {
386
+ this.apply(operation);
387
+ }
388
+ }
389
+ }
390
+ observeClock(time, counter) {
391
+ if (time > this.time) {
392
+ this.time = time;
393
+ this.counter = counter;
394
+ } else if (time === this.time) {
395
+ this.counter = Math.max(this.counter, counter);
396
+ }
397
+ }
398
+ async persist() {
399
+ const checkpoint = this.checkpoint();
400
+ const records = /* @__PURE__ */ new Map();
401
+ for (const operation of checkpoint.operations) {
402
+ const identity = this.params.kind === "observed-remove-set" ? `${operation.device}:${String(operation.sequence)}` : operation.key;
403
+ records.set(`${RECORD_PREFIX}${identity}`, operation);
404
+ }
405
+ const entries = [...records].filter(([key, value]) => this.localRecords.get(key) !== JSON.stringify(value));
406
+ const removedKeys = [...this.localRecords.keys()].filter((key) => !records.has(key));
407
+ entries.push(["shared-checkpoint-v1", { ...checkpoint, operations: [] }]);
408
+ await this.params.local.commit({ entries, removedKeys });
409
+ await this.transport.write(`${this.deviceRoot()}/have.md`, { format: 1, time: Date.now(), vector: [...this.vector] });
410
+ }
411
+ async publish(operations) {
412
+ const first = (0, import_type_guards.ensureNonNullable)(operations[0]);
413
+ await this.transport.write(`${this.deviceRoot()}/log-${String(first.sequence)}.md`, operations);
414
+ for (const operation of operations) {
415
+ this.apply(operation);
416
+ }
417
+ }
418
+ }
419
+ function isObject(value) {
420
+ return typeof value === "object" && value !== null && !Array.isArray(value);
421
+ }
422
+ function isVector(value) {
423
+ return Array.isArray(value) && value.every(
424
+ (entry) => Array.isArray(entry) && entry.length === VECTOR_ENTRY_LENGTH && typeof entry[0] === "string" && /^[\w-]+$/.test(entry[0]) && Number.isSafeInteger(entry[1]) && Number(entry[1]) >= 0
425
+ );
426
+ }
427
+ // Annotate the CommonJS export names for ESM import in node:
428
+ 0 && (module.exports = {
429
+ SharedDataStore
430
+ });
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQge1xuICBEYXRhU3RvcmVSZXBsaWNhLFxuICBpc0RhdGFTdG9yZU9wZXJhdGlvblxufSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgeyBEYXRhU3RvcmVUcmFuc3BvcnQgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuY29uc3QgREVGQVVMVF9BQ1RJVkVfREVWSUNFX01JTExJU0VDT05EUyA9IDJfNTkyXzAwMF8wMDA7XG5cbmNvbnN0IE9XTkVSX1BBVEhfSU5ERVggPSAtMjtcblxuY29uc3QgVkVDVE9SX0VOVFJZX0xFTkdUSCA9IDI7XG5jb25zdCBERVZJQ0VfUEFUSF9QQVJUUyA9IDI7XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyYWJsZSBub24tZG90IHZhdWx0IGZvbGRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbW11dGFibGUgbWVyZ2UgcnVsZTsgY2hhbmdpbmcgaXQgcmVxdWlyZXMgYSBuZXcgc3RvcmUgaWQuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEYXRhU3RvcmVNZXJnZUtpbmQ7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgbG9jYWwgc3RvcmUgc2NvcGVkIHRvIFRISVMgdmF1bHQsIHBsdWdpbiBhbmQgc2hhcmVkLXN0b3JlIHNjaGVtYS4gVGhlIGNhbGxlciBvd25zIGl0cyBjb25uZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWw6IExvY2FsRGF0YVN0b3JlO1xuICAvKipcbiAgICogTWF4aW11bSBVVEYtOCBieXRlcyBwZXIgZmlsZSwgd3JhcHBlciBpbmNsdWRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBtYXhGaWxlQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgaWQgaW5jbHVkaW5nIHRoZSBjb25zdW1lcidzIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbmludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgY291bnRlcjogbnVtYmVyO1xuICBmb3JtYXQ6IDE7XG4gIGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW107XG4gIHRpbWU6IG51bWJlcjtcbiAgdmVjdG9yOiBWZXJzaW9uVmVjdG9yO1xufVxuXG50eXBlIFZlcnNpb25WZWN0b3IgPSBbc3RyaW5nLCBudW1iZXJdW107XG5cbi8qKlxuICogQSBkZXZpY2UtbG9jYWwgcXVlcnkgcmVwbGljYSBiYWNrZWQgYnkgdmF1bHQgZmlsZXMuIENhbGwgYHN5bmNocm9uaXplYCBhZnRlciB0cmFuc3BvcnQgY2hhbmdlcyBvciBwZXJpb2RpY2FsbHkuXG4gKiBObyB0aW1lciBvciBldmVudCBoYW5kbGVyIG91dGxpdmVzIHRoZSBjb25zdW1lcjogdGhlIGNvbnN1bWVyIHNjaGVkdWxlcyBzeW5jaHJvbml6YXRpb24gYW5kIG93bnMgdW5sb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkRGF0YVN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEZXZpY2VNaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlcGxpY2E6IERhdGFTdG9yZVJlcGxpY2E7XG4gIHByaXZhdGUgdGltZSA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmVjdG9yID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMsIHByb3RlY3RlZCByZWFkb25seSBkZXZpY2U6IHN0cmluZykge1xuICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IERhdGFTdG9yZVRyYW5zcG9ydChwYXJhbXMpO1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHBhcmFtcy5raW5kKTtcbiAgICB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA9IHBhcmFtcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMgPz8gREVGQVVMVF9BQ1RJVkVfREVWSUNFX01JTExJU0VDT05EUztcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcykgfHwgdGhpcy5hY3RpdmVEZXZpY2VNaWxsaXNlY29uZHMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZXZpY2UgcmV0aXJlbWVudCBpbnRlcnZhbCBtdXN0IGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuZCBzeW5jaHJvbml6ZXMgYSBzdG9yZSwgcmVzdG9yaW5nIGl0cyBkZXZpY2UgaWRlbnRpdHkgZXhjbHVzaXZlbHkgZnJvbSBJbmRleGVkREIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQZXJzaXN0ZW5jZSwgdHJhbnNwb3J0IGFuZCBtZXJnZSBwb2xpY3kuXG4gICAqIEByZXR1cm5zIEEgc3luY2hyb25pemVkIHF1ZXJ5IHJlcGxpY2EuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG9wZW4ocGFyYW1zOiBTaGFyZWREYXRhU3RvcmVPcGVuUGFyYW1zKTogUHJvbWlzZTxTaGFyZWREYXRhU3RvcmU+IHtcbiAgICBjb25zdCBkZXZpY2UgPSBhd2FpdCBwYXJhbXMubG9jYWwuZ2V0T3JDcmVhdGUoJ3NoYXJlZC1kZXZpY2UtdjEnLCB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKSk7XG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgIT09ICdzdHJpbmcnIHx8ICEvXltcXHctXSskLy50ZXN0KGRldmljZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIGlkZW50aXR5Jyk7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JlID0gbmV3IFNoYXJlZERhdGFTdG9yZShwYXJhbXMsIGRldmljZSk7XG4gICAgYXdhaXQgc3RvcmUuc3luY2hyb25pemUoKTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGEgY29tcGxldGUgY2h1bmtlZCBzbmFwc2hvdCBhbmQgdHJpbXMgb25seSB0aGlzIGRldmljZSdzIGFja25vd2xlZGdlZCBqb3VybmFsIHNlZ21lbnRzLlxuICAgKiBSZXRpcmVkIGRldmljZXMgcmVqb2luIGJ5IG1lcmdpbmcgc25hcHNob3RzOyB0b21ic3RvbmVzIHJlbWFpbiBpbiBzbmFwc2hvdHMgdG8gcHJldmVudCByZXN1cnJlY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY29tcGFjdGlvbiBmaW5pc2hlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy50cmFuc3BvcnQubGlzdCgpO1xuICAgICAgY29uc3QgYmFzZSA9IGAke3RoaXMuZGV2aWNlUm9vdCgpfS9zbmFwc2hvdC0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfS1tYW5pZmVzdGA7XG4gICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVNuYXBzaG90KHsgYmFzZSwgcGF5bG9hZDogdGhpcy5jaGVja3BvaW50KCkgfSk7XG4gICAgICBjb25zdCBhY2tub3dsZWRnZW1lbnRzID0gYXdhaXQgdGhpcy5hY2tub3dsZWRnZW1lbnRzKGZpbGVzKTtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChgJHt0aGlzLmRldmljZVJvb3QoKX0vbG9nLWApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQocGF0aCk7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcGVyYXRpb25zKSB8fCAhb3BlcmF0aW9ucy5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0ID0gTWF0aC5tYXgoLi4ub3BlcmF0aW9ucy5tYXAoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLnNlcXVlbmNlKSk7XG4gICAgICAgIGlmIChhY2tub3dsZWRnZW1lbnRzLmV2ZXJ5KCh2ZWN0b3IpID0+ICh2ZWN0b3IuZ2V0KHRoaXMuZGV2aWNlKSA/PyAwKSA+PSBsYXN0KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlbW92ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGNvbXBsZXRlIG5ldyBzbmFwc2hvdCBjb3ZlcnMgZXZlcnkgZWFybGllciBzbmFwc2hvdCBmcm9tIHRoaXMgd3JpdGVyLlxuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LWApKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHJlZ2lzdGVyIG9yIHJlbW92ZXMgdGhlIGN1cnJlbnRseSBvYnNlcnZlZCBhZGRpdGlvbnMgb2YgYSBzZXQgbWVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLiBNaW4vbWF4IHJlZ2lzdGVycyBkZWxpYmVyYXRlbHkgY2Fubm90IGJlIGRlbGV0ZWQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNoYW5nZShbeyBkZWxldGVkOiB0cnVlLCBrZXksIHZhbHVlOiBudWxsIH1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY3VycmVudCBsb2NhbCBxdWVyeSByZXBsaWNhLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXRhY2hlZCBrZXkvdmFsdWUgcGFpcnMgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzKCk6IFtzdHJpbmcsIHVua25vd25dW10ge1xuICAgIHJldHVybiB0aGlzLnJlcGxpY2EuZW50cmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVnaXN0ZXIgb3Igc2V0IG1lbWJlcnNoaXAgZnJvbSB0aGUgY3VycmVudCBsb2NhbCBxdWVyeSByZXBsaWNhLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcmV0dXJucyBBIGRldGFjaGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudCBvciBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlcGxpY2EuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIG9uZSByZWdpc3RlciB2YWx1ZSwgb3IgYWRkcyBhIG1lbWJlciB0byBhbiBvYnNlcnZlZC1yZW1vdmUgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgdmFsdWUgKHVzZSBgdHJ1ZWAgZm9yIGEgc2V0KS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgam91cm5hbCBwdWJsaWNhdGlvbiBhbmQgbG9jYWwgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEpzb25WYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2V0TWFueShbW2tleSwgdmFsdWVdXSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGEgYmF0Y2ggb2YgcmVnaXN0ZXIgd3JpdGVzLCBzcGxpdCBpbnRvIGJvdW5kZWQgaW1tdXRhYmxlIHNlZ21lbnRzLlxuICAgKiBTZWdtZW50cyBhcmUgaW5kaXZpZHVhbGx5IGR1cmFibGU7IGEgZmFpbGVkIGJhdGNoIGNhbiBoYXZlIGEgcHVibGlzaGVkIHByZWZpeCBhbmQgY2FuIGJlIHJldHJpZWQgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZW50cmllcyAtIFJlZ2lzdGVyIHdyaXRlcyBvciBzZXQgYWRkaXRpb25zLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0TWFueShlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgSnNvblZhbHVlXSlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2hhbmdlKGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IGRlbGV0ZWQ6IGZhbHNlLCBrZXksIHZhbHVlIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIGNvbXBsZXRlIHNuYXBzaG90cyBhbmQgY29udGlndW91cyBqb3VybmFsIGhpc3RvcnksIHRoZW4gcHVibGlzaGVzIGl0cyBkdXJhYmxlIGFja25vd2xlZGdlbWVudC5cbiAgICogUGFydGlhbCBkZWxpdmVyaWVzIHJlbWFpbiBwZW5kaW5nOyBhIGxhdGVyIGNhbGwgcmV0cmllcyB0aGVtLiBObyBhY2tub3dsZWRnZW1lbnQgc2tpcHMgYSBtaXNzaW5nIHNlcXVlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgbG9jYWwgY2hlY2twb2ludCBhbmQgYWNrbm93bGVkZ2VtZW50IGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW5jaHJvbml6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFja25vd2xlZGdlbWVudHMoZmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+W10+IHtcbiAgICBjb25zdCBhY2tub3dsZWRnZW1lbnRzID0gW25ldyBNYXAodGhpcy52ZWN0b3IpXTtcbiAgICBjb25zdCBkZXZpY2VGaWxlcyA9IGZpbGVzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvYCkpO1xuICAgIGNvbnN0IGRldmljZXMgPSBuZXcgU2V0KGRldmljZUZpbGVzLm1hcCgocGF0aCkgPT4gcGF0aC5zbGljZSh0aGlzLnRyYW5zcG9ydC5yb290Lmxlbmd0aCArIDEpLnNwbGl0KCcvJywgREVWSUNFX1BBVEhfUEFSVFMpWzFdKS5maWx0ZXIoKGRldmljZSkgPT4gZGV2aWNlICE9PSB1bmRlZmluZWQpKTtcbiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICBpZiAoZGV2aWNlID09PSB0aGlzLmRldmljZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhdmUgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvJHtkZXZpY2V9L2hhdmUubWRgKTtcbiAgICAgIGlmICghaXNPYmplY3QoaGF2ZSkgfHwgIWlzVmVjdG9yKGhhdmVbJ3ZlY3RvciddKSB8fCB0eXBlb2YgaGF2ZVsndGltZSddICE9PSAnbnVtYmVyJykge1xuICAgICAgICBhY2tub3dsZWRnZW1lbnRzLnB1c2gobmV3IE1hcCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoRGF0ZS5ub3coKSAtIGhhdmVbJ3RpbWUnXSA8PSB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcykge1xuICAgICAgICBhY2tub3dsZWRnZW1lbnRzLnB1c2gobmV3IE1hcChoYXZlWyd2ZWN0b3InXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWNrbm93bGVkZ2VtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHkob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnJlcGxpY2EuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB0aGlzLnZlY3Rvci5zZXQob3BlcmF0aW9uLmRldmljZSwgb3BlcmF0aW9uLnNlcXVlbmNlKTtcbiAgICB0aGlzLm9ic2VydmVDbG9jayhvcGVyYXRpb24udGltZSwgb3BlcmF0aW9uLmNvdW50ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2UoY2hhbmdlczogcmVhZG9ubHkgQ2hhbmdlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10gPSBbXTtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdGhpcy5yZXBsaWNhLmV4cG9ydCgpKSB7XG4gICAgICAgIGNhbmRpZGF0ZS5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgICAgbGV0IHNlcXVlbmNlID0gdGhpcy52ZWN0b3IuZ2V0KHRoaXMuZGV2aWNlKSA/PyAwO1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSBub3cgPiB0aGlzLnRpbWUgPyAwIDogdGhpcy5jb3VudGVyICsgMTtcbiAgICAgICAgdGhpcy50aW1lID0gTWF0aC5tYXgobm93LCB0aGlzLnRpbWUpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbiA9IHtcbiAgICAgICAgICAuLi5jaGFuZ2UsXG4gICAgICAgICAgY291bnRlcjogdGhpcy5jb3VudGVyLFxuICAgICAgICAgIGRldmljZTogdGhpcy5kZXZpY2UsXG4gICAgICAgICAgc2VxdWVuY2U6ICsrc2VxdWVuY2UsXG4gICAgICAgICAgdGFnczogY2FuZGlkYXRlLm9ic2VydmVkVGFncyhjaGFuZ2Uua2V5KSxcbiAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVcbiAgICAgICAgfTtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gVmFsaWRhdGUgZXZlcnkgc2luZ2xlIG9wZXJhdGlvbiBiZWZvcmUgcHVibGlzaGluZyBhbnkgcHJlZml4IG9mIGEgYmF0Y2guXG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc3BvcnQuZml0cyhbb3BlcmF0aW9uXSkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vbG9nLSR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9Lm1kYCwgW29wZXJhdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgYmF0Y2g6IERhdGFTdG9yZU9wZXJhdGlvbltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc3BvcnQuZml0cyhbLi4uYmF0Y2gsIG9wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoKGJhdGNoKTtcbiAgICAgICAgICBiYXRjaCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGJhdGNoLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2twb2ludCgpOiBDaGVja3BvaW50IHtcbiAgICByZXR1cm4geyBjb3VudGVyOiB0aGlzLmNvdW50ZXIsIGZvcm1hdDogMSwga2luZDogdGhpcy5wYXJhbXMua2luZCwgb3BlcmF0aW9uczogdGhpcy5yZXBsaWNhLmV4cG9ydCgpLCB0aW1lOiB0aGlzLnRpbWUsIHZlY3RvcjogWy4uLnRoaXMudmVjdG9yXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXZpY2VSb290KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvJHt0aGlzLmRldmljZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTG9jYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXBsaWNhID0gbmV3IERhdGFTdG9yZVJlcGxpY2EodGhpcy5wYXJhbXMua2luZCk7XG4gICAgdGhpcy52ZWN0b3IuY2xlYXIoKTtcbiAgICB0aGlzLnRpbWUgPSAwO1xuICAgIHRoaXMuY291bnRlciA9IDA7XG4gICAgdGhpcy5sb2NhbFJlY29yZHMuY2xlYXIoKTtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZW50cmllcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlY29yZHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdzaGFyZWQtY2hlY2twb2ludC12MScpIHtcbiAgICAgICAgdGhpcy5tZXJnZUNoZWNrcG9pbnQodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChSRUNPUkRfUFJFRklYKSkge1xuICAgICAgICB0aGlzLnJlcGxpY2EuYXBwbHkodmFsdWUpO1xuICAgICAgICB0aGlzLmxvY2FsUmVjb3Jkcy5zZXQoa2V5LCBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ2hlY2twb2ludCh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbJ2Zvcm1hdCddICE9PSAxIHx8IHZhbHVlWydraW5kJ10gIT09IHRoaXMucGFyYW1zLmtpbmRcbiAgICAgIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlWydvcGVyYXRpb25zJ10pIHx8ICF2YWx1ZVsnb3BlcmF0aW9ucyddLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKVxuICAgICAgfHwgIWlzVmVjdG9yKHZhbHVlWyd2ZWN0b3InXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWyd0aW1lJ10pIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZVsnY291bnRlciddKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgY2hlY2twb2ludCBvciBpbmNvbXBhdGlibGUgbWVyZ2UgcnVsZScpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB2YWx1ZVsnb3BlcmF0aW9ucyddKSB7XG4gICAgICB0aGlzLnJlcGxpY2EuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZGV2aWNlLCBzZXF1ZW5jZV0gb2YgdmFsdWVbJ3ZlY3RvciddKSB7XG4gICAgICB0aGlzLnZlY3Rvci5zZXQoZGV2aWNlLCBNYXRoLm1heChzZXF1ZW5jZSwgdGhpcy52ZWN0b3IuZ2V0KGRldmljZSkgPz8gMCkpO1xuICAgIH1cbiAgICB0aGlzLm9ic2VydmVDbG9jayhOdW1iZXIodmFsdWVbJ3RpbWUnXSksIE51bWJlcih2YWx1ZVsnY291bnRlciddKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lcmdlRmlsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzL2ApKTtcbiAgICBjb25zdCBtYW5pZmVzdHMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IC9cXC9zbmFwc2hvdC1bXFx3LV0rLW1hbmlmZXN0XFwubWQkLy50ZXN0KGZpbGUpKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgbWFuaWZlc3RzKSB7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIGlmIChzbmFwc2hvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHNuYXBzaG90KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzZWdtZW50cyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gL1xcL2xvZy1cXGQrXFwubWQkLy50ZXN0KGZpbGUpKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2Ygc2VnbWVudHMpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnQgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWdtZW50KSB8fCAhc2VnbWVudC5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgam91cm5hbCBzZWdtZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHBhdGguc3BsaXQoJy8nKS5hdChPV05FUl9QQVRIX0lOREVYKTtcbiAgICAgIGlmIChzZWdtZW50LnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmRldmljZSAhPT0gb3duZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSm91cm5hbCBzZWdtZW50IGhhcyBhIGRpZmZlcmVudCB3cml0ZXInKTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdGlvbnMucHVzaCguLi5zZWdtZW50KTtcbiAgICB9XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdGhpcy5jaGVja3BvaW50KCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY2hlY2twb2ludC5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucGFyYW1zLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0JyA/IGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YCA6IG9wZXJhdGlvbi5rZXk7XG4gICAgICByZWNvcmRzLnNldChgJHtSRUNPUkRfUFJFRklYfSR7aWRlbnRpdHl9YCwgb3BlcmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFsuLi5yZWNvcmRzXS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5sb2NhbFJlY29yZHMuZ2V0KGtleSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSBbLi4udGhpcy5sb2NhbFJlY29yZHMua2V5cygpXS5maWx0ZXIoKGtleSkgPT4gIXJlY29yZHMuaGFzKGtleSkpO1xuICAgIGVudHJpZXMucHVzaChbJ3NoYXJlZC1jaGVja3BvaW50LXYxJywgeyAuLi5jaGVja3BvaW50LCBvcGVyYXRpb25zOiBbXSB9XSk7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuY29tbWl0KHsgZW50cmllcywgcmVtb3ZlZEtleXMgfSk7XG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2hhdmUubWRgLCB7IGZvcm1hdDogMSwgdGltZTogRGF0ZS5ub3coKSwgdmVjdG9yOiBbLi4udGhpcy52ZWN0b3JdIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwdWJsaXNoKG9wZXJhdGlvbnM6IERhdGFTdG9yZU9wZXJhdGlvbltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmlyc3QgPSBlbnN1cmVOb25OdWxsYWJsZShvcGVyYXRpb25zWzBdKTtcbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vbG9nLSR7U3RyaW5nKGZpcnN0LnNlcXVlbmNlKX0ubWRgLCBvcGVyYXRpb25zKTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICB0aGlzLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzVmVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVmVyc2lvblZlY3RvciB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoZW50cnk6IHVua25vd24pID0+XG4gICAgQXJyYXkuaXNBcnJheShlbnRyeSkgJiYgZW50cnkubGVuZ3RoID09PSBWRUNUT1JfRU5UUllfTEVOR1RIXG4gICAgJiYgdHlwZW9mIGVudHJ5WzBdID09PSAnc3RyaW5nJyAmJiAvXltcXHctXSskLy50ZXN0KGVudHJ5WzBdKSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihlbnRyeVsxXSkgJiYgTnVtYmVyKGVudHJ5WzFdKSA+PSAwXG4gICk7XG59XG5cbi8qIGVzbGludC1lbmFibGUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZXNlIGFyZSBPYnNpZGlh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
@@ -0,0 +1,137 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Mergeable plugin data, transported as single-writer journal segments and chunked snapshots.
6
+ */
7
+ import type { DataAdapter } from 'obsidian' with { 'resolution-mode': 'import' };
8
+ import type { JsonValue } from 'type-fest' with { 'resolution-mode': 'import' };
9
+ import type { DataStoreMergeKind } from './data-store-replica.cjs';
10
+ import type { LocalDataStore } from './local-data-store.cjs';
11
+ /**
12
+ * Parameters for opening a shared store.
13
+ */
14
+ export interface SharedDataStoreOpenParams {
15
+ /**
16
+ * Device retirement interval, measured from its last acknowledgement.
17
+ *
18
+ * @default `2592000000`
19
+ */
20
+ readonly activeDeviceMilliseconds?: number;
21
+ /**
22
+ * Vault adapter.
23
+ */
24
+ readonly adapter: DataAdapter;
25
+ /**
26
+ * Configurable non-dot vault folder.
27
+ *
28
+ * @default `'Plugin data'`
29
+ */
30
+ readonly folder?: string;
31
+ /**
32
+ * Immutable merge rule; changing it requires a new store id.
33
+ */
34
+ readonly kind: DataStoreMergeKind;
35
+ /**
36
+ * Dedicated local store scoped to THIS vault, plugin and shared-store schema. The caller owns its connection.
37
+ */
38
+ readonly local: LocalDataStore;
39
+ /**
40
+ * Maximum UTF-8 bytes per file, wrapper included.
41
+ *
42
+ * @default `1000000`
43
+ */
44
+ readonly maxFileBytes?: number;
45
+ /**
46
+ * Plugin manifest id.
47
+ */
48
+ readonly pluginId: string;
49
+ /**
50
+ * Store id including the consumer's schema version.
51
+ */
52
+ readonly storeId: string;
53
+ }
54
+ /**
55
+ * A device-local query replica backed by vault files. Call `synchronize` after transport changes or periodically.
56
+ * No timer or event handler outlives the consumer: the consumer schedules synchronization and owns unloading.
57
+ */
58
+ export declare class SharedDataStore {
59
+ protected readonly params: SharedDataStoreOpenParams;
60
+ protected readonly device: string;
61
+ private readonly activeDeviceMilliseconds;
62
+ private counter;
63
+ private readonly localRecords;
64
+ private replica;
65
+ private time;
66
+ private readonly transport;
67
+ private readonly vector;
68
+ private constructor();
69
+ /**
70
+ * Opens and synchronizes a store, restoring its device identity exclusively from IndexedDB.
71
+ *
72
+ * @param params - Persistence, transport and merge policy.
73
+ * @returns A synchronized query replica.
74
+ */
75
+ static open(params: SharedDataStoreOpenParams): Promise<SharedDataStore>;
76
+ /**
77
+ * Publishes a complete chunked snapshot and trims only this device's acknowledged journal segments.
78
+ * Retired devices rejoin by merging snapshots; tombstones remain in snapshots to prevent resurrection.
79
+ *
80
+ * @returns A promise that resolves when compaction finishes.
81
+ */
82
+ compact(): Promise<void>;
83
+ /**
84
+ * Deletes a register or removes the currently observed additions of a set member.
85
+ *
86
+ * @param key - Record key or set member. Min/max registers deliberately cannot be deleted.
87
+ * @returns A promise that resolves after journal publication and local commit.
88
+ */
89
+ delete(key: string): Promise<void>;
90
+ /**
91
+ * Reads the current local query replica.
92
+ *
93
+ * @returns Detached key/value pairs in deterministic order.
94
+ */
95
+ entries(): [string, unknown][];
96
+ /**
97
+ * Reads a register or set membership from the current local query replica.
98
+ *
99
+ * @param key - Record key or set member.
100
+ * @returns A detached value, or `undefined` when absent or deleted.
101
+ */
102
+ get(key: string): unknown;
103
+ /**
104
+ * Writes one register value, or adds a member to an observed-remove set.
105
+ *
106
+ * @param key - Record key or set member.
107
+ * @param value - JSON-compatible value (use `true` for a set).
108
+ * @returns A promise that resolves after journal publication and local commit.
109
+ */
110
+ set(key: string, value: JsonValue): Promise<void>;
111
+ /**
112
+ * Publishes a batch of register writes, split into bounded immutable segments.
113
+ * Segments are individually durable; a failed batch can have a published prefix and can be retried safely.
114
+ *
115
+ * @param entries - Register writes or set additions.
116
+ * @returns A promise that resolves after journal publication and local commit.
117
+ */
118
+ setMany(entries: readonly (readonly [string, JsonValue])[]): Promise<void>;
119
+ /**
120
+ * Merges complete snapshots and contiguous journal history, then publishes its durable acknowledgement.
121
+ * Partial deliveries remain pending; a later call retries them. No acknowledgement skips a missing sequence.
122
+ *
123
+ * @returns A promise that resolves after the local checkpoint and acknowledgement commit.
124
+ */
125
+ synchronize(): Promise<void>;
126
+ private acknowledgements;
127
+ private apply;
128
+ private change;
129
+ private checkpoint;
130
+ private deviceRoot;
131
+ private loadLocal;
132
+ private mergeCheckpoint;
133
+ private mergeFiles;
134
+ private observeClock;
135
+ private persist;
136
+ private publish;
137
+ }