@mnaoumov/obsidian-lib 6.3.0 → 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.
- package/data-stores/data-store-replica/package.json +6 -0
- package/data-stores/data-store-seeds/package.json +6 -0
- package/data-stores/data-store-transport/package.json +6 -0
- package/data-stores/index/package.json +6 -0
- package/data-stores/local-data-store/package.json +6 -0
- package/data-stores/package.json +6 -0
- package/data-stores/shared-data-store/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +22 -1
- package/dist/lib/cjs/__merged.d.cts +5 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +263 -0
- package/dist/lib/cjs/data-stores/data-store-replica.d.cts +112 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +204 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +133 -0
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +347 -0
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +125 -0
- package/dist/lib/cjs/data-stores/index.cjs +120 -0
- package/dist/lib/cjs/data-stores/index.d.cts +6 -0
- package/dist/lib/cjs/data-stores/local-data-store.cjs +258 -0
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +119 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +431 -0
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +137 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/esm/__merged.d.mts +5 -0
- package/dist/lib/esm/__merged.mjs +21 -1
- package/dist/lib/esm/data-stores/data-store-replica.d.mts +112 -0
- package/dist/lib/esm/data-stores/data-store-replica.mjs +173 -0
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +133 -0
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +115 -0
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +125 -0
- package/dist/lib/esm/data-stores/data-store-transport.mjs +259 -0
- package/dist/lib/esm/data-stores/index.d.mts +6 -0
- package/dist/lib/esm/data-stores/index.mjs +18 -0
- package/dist/lib/esm/data-stores/local-data-store.d.mts +119 -0
- package/dist/lib/esm/data-stores/local-data-store.mjs +170 -0
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +137 -0
- package/dist/lib/esm/data-stores/shared-data-store.mjs +346 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/package.json +38 -17
|
@@ -0,0 +1,170 @@
|
|
|
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 LocalDataStore {
|
|
7
|
+
constructor(database) {
|
|
8
|
+
this.database = database;
|
|
9
|
+
}
|
|
10
|
+
database;
|
|
11
|
+
/**
|
|
12
|
+
* Opens an isolated database. Writes resolve only once their transaction commits.
|
|
13
|
+
*
|
|
14
|
+
* @param params - Store identity and optional IndexedDB implementation.
|
|
15
|
+
* @returns The connected store; close it when its owner unloads.
|
|
16
|
+
*/
|
|
17
|
+
static async open(params) {
|
|
18
|
+
const name = `obsidian-lib:${JSON.stringify([params.vaultId, params.pluginId, params.storeId])}`;
|
|
19
|
+
const request = (params.factory ?? indexedDB).open(name, 1);
|
|
20
|
+
return await new Promise((resolve, reject) => {
|
|
21
|
+
request.onupgradeneeded = () => {
|
|
22
|
+
request.result.createObjectStore("records");
|
|
23
|
+
};
|
|
24
|
+
request.addEventListener("error", () => {
|
|
25
|
+
reject(new Error("Could not open local data store", { cause: request.error }));
|
|
26
|
+
});
|
|
27
|
+
request.onsuccess = () => {
|
|
28
|
+
const database = request.result;
|
|
29
|
+
database.onversionchange = () => {
|
|
30
|
+
database.close();
|
|
31
|
+
};
|
|
32
|
+
resolve(new LocalDataStore(database));
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Deletes every record in this store only.
|
|
38
|
+
*
|
|
39
|
+
* @returns A promise that resolves after commit.
|
|
40
|
+
*/
|
|
41
|
+
async clear() {
|
|
42
|
+
await this.run("readwrite", (store) => store.clear());
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Closes this connection without deleting its records.
|
|
46
|
+
*/
|
|
47
|
+
close() {
|
|
48
|
+
this.database.close();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Commits several record changes atomically without serializing the rest of the database.
|
|
52
|
+
*
|
|
53
|
+
* @param params - Writes and deletions in one transaction.
|
|
54
|
+
* @returns A promise that resolves only after all changes commit.
|
|
55
|
+
*/
|
|
56
|
+
async commit(params) {
|
|
57
|
+
await this.run("readwrite", (store) => {
|
|
58
|
+
for (const key of params.removedKeys ?? []) {
|
|
59
|
+
store.delete(key);
|
|
60
|
+
}
|
|
61
|
+
for (const [key, value] of params.entries) {
|
|
62
|
+
store.put(value, key);
|
|
63
|
+
}
|
|
64
|
+
return store.count();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Deletes a record.
|
|
69
|
+
*
|
|
70
|
+
* @param key - Record key.
|
|
71
|
+
* @returns A promise that resolves after commit.
|
|
72
|
+
*/
|
|
73
|
+
async delete(key) {
|
|
74
|
+
await this.run("readwrite", (store) => store.delete(key));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Reads all records in key order.
|
|
78
|
+
*
|
|
79
|
+
* @returns Detached key/value pairs.
|
|
80
|
+
*/
|
|
81
|
+
async entries() {
|
|
82
|
+
const records = [];
|
|
83
|
+
await this.run("readonly", (store) => {
|
|
84
|
+
const request = store.openCursor();
|
|
85
|
+
request.onsuccess = () => {
|
|
86
|
+
const cursor = request.result;
|
|
87
|
+
if (!cursor) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (typeof cursor.key !== "string") {
|
|
91
|
+
throw new TypeError("Local data-store key is not a string");
|
|
92
|
+
}
|
|
93
|
+
records.push([cursor.key, cursor.value]);
|
|
94
|
+
cursor.continue();
|
|
95
|
+
};
|
|
96
|
+
return request;
|
|
97
|
+
});
|
|
98
|
+
return records;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Serializes a shared-store operation across connections, windows and bundled library copies.
|
|
102
|
+
*
|
|
103
|
+
* @typeParam T - Callback result.
|
|
104
|
+
* @param callback - Work performed while holding this database's Web Lock.
|
|
105
|
+
* @returns The callback result after releasing the lock.
|
|
106
|
+
*/
|
|
107
|
+
async exclusive(callback) {
|
|
108
|
+
return await window.navigator.locks.request(this.database.name, callback);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Reads a record.
|
|
112
|
+
*
|
|
113
|
+
* @param key - Record key.
|
|
114
|
+
* @returns Its value, or `undefined` when absent.
|
|
115
|
+
*/
|
|
116
|
+
async get(key) {
|
|
117
|
+
return await this.run("readonly", (store) => store.get(key));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Initializes a record once, atomically across connections.
|
|
121
|
+
*
|
|
122
|
+
* @param key - Record key.
|
|
123
|
+
* @param value - Value used only when the key is absent.
|
|
124
|
+
* @returns The existing or newly committed value.
|
|
125
|
+
*/
|
|
126
|
+
async getOrCreate(key, value) {
|
|
127
|
+
return await this.run("readwrite", (store) => {
|
|
128
|
+
const request = store.get(key);
|
|
129
|
+
request.onsuccess = () => {
|
|
130
|
+
if (request.result === void 0) {
|
|
131
|
+
store.put(value, key);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
return request;
|
|
135
|
+
}).then((existing) => existing === void 0 ? value : existing);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Writes a structured-cloneable value.
|
|
139
|
+
*
|
|
140
|
+
* @param key - Record key.
|
|
141
|
+
* @param value - Value to persist.
|
|
142
|
+
* @returns A promise that resolves after commit.
|
|
143
|
+
*/
|
|
144
|
+
async set(key, value) {
|
|
145
|
+
await this.run("readwrite", (store) => store.put(value, key));
|
|
146
|
+
}
|
|
147
|
+
async run(mode, action) {
|
|
148
|
+
return await new Promise((resolve, reject) => {
|
|
149
|
+
const transaction = this.database.transaction("records", mode);
|
|
150
|
+
let request;
|
|
151
|
+
try {
|
|
152
|
+
request = action(transaction.objectStore("records"));
|
|
153
|
+
} catch (error) {
|
|
154
|
+
transaction.abort();
|
|
155
|
+
reject(error instanceof Error ? error : new Error("Local data-store transaction failed", { cause: error }));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
transaction.oncomplete = () => {
|
|
159
|
+
resolve(request.result);
|
|
160
|
+
};
|
|
161
|
+
transaction.addEventListener("abort", () => {
|
|
162
|
+
reject(new Error("Local data-store transaction aborted", { cause: transaction.error }));
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
export {
|
|
168
|
+
LocalDataStore
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2xvY2FsLWRhdGEtc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlY29yZC1iYXNlZCBkZXZpY2UtbG9jYWwgcGVyc2lzdGVuY2UsIGlzb2xhdGVkIGJ5IHZhdWx0LCBwbHVnaW4gYW5kIHN0b3JlLlxuICovXG5cbi8qKlxuICogQXRvbWljIG11dGF0aW9ucyBvZiBhIGxvY2FsIHJlY29yZCBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBLZXkvdmFsdWUgcGFpcnMgdG8gd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl0pW107XG4gIC8qKlxuICAgKiBLZXlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgbG9jYWwgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zIHtcbiAgLyoqXG4gICAqIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbiwgaW5qZWN0YWJsZSBmb3IgdGVzdHMuXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5PzogSURCRmFjdG9yeTtcbiAgLyoqXG4gICAqIFBsdWdpbiBtYW5pZmVzdCBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yZSBuYW1lIGFuZCBzY2hlbWEgdmVyc2lvbiBjaG9zZW4gYnkgdGhlIGNvbnN1bWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlLCBkZXZpY2UtbG9jYWwgdmF1bHQgaWRlbnRpdHk7IG5ldmVyIHRoZSB2YXVsdCBkaXNwbGF5IG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBsb2NhbCBzdG9yZSBob2xkcyBzdHJ1Y3R1cmVkLWNsb25lYWJsZSB2YWx1ZXM7IGl0IG5ldmVyIHdyaXRlcyB0byB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbERhdGFTdG9yZSB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYXRhYmFzZTogSURCRGF0YWJhc2UpIHt9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuIGlzb2xhdGVkIGRhdGFiYXNlLiBXcml0ZXMgcmVzb2x2ZSBvbmx5IG9uY2UgdGhlaXIgdHJhbnNhY3Rpb24gY29tbWl0cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFN0b3JlIGlkZW50aXR5IGFuZCBvcHRpb25hbCBJbmRleGVkREIgaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBjb25uZWN0ZWQgc3RvcmU7IGNsb3NlIGl0IHdoZW4gaXRzIG93bmVyIHVubG9hZHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG9wZW4ocGFyYW1zOiBMb2NhbERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPExvY2FsRGF0YVN0b3JlPiB7XG4gICAgY29uc3QgbmFtZSA9IGBvYnNpZGlhbi1saWI6JHtKU09OLnN0cmluZ2lmeShbcGFyYW1zLnZhdWx0SWQsIHBhcmFtcy5wbHVnaW5JZCwgcGFyYW1zLnN0b3JlSWRdKX1gO1xuICAgIGNvbnN0IHJlcXVlc3QgPSAocGFyYW1zLmZhY3RvcnkgPz8gaW5kZXhlZERCKS5vcGVuKG5hbWUsIDEpO1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoJ3JlY29yZHMnKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3Qgb3BlbiBsb2NhbCBkYXRhIHN0b3JlJywgeyBjYXVzZTogcmVxdWVzdC5lcnJvciB9KSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICBkYXRhYmFzZS5vbnZlcnNpb25jaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgZGF0YWJhc2UuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVzb2x2ZShuZXcgTG9jYWxEYXRhU3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBldmVyeSByZWNvcmQgaW4gdGhpcyBzdG9yZSBvbmx5LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ydW4oJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4gc3RvcmUuY2xlYXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoaXMgY29ubmVjdGlvbiB3aXRob3V0IGRlbGV0aW5nIGl0cyByZWNvcmRzLlxuICAgKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YWJhc2UuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXRzIHNldmVyYWwgcmVjb3JkIGNoYW5nZXMgYXRvbWljYWxseSB3aXRob3V0IHNlcmlhbGl6aW5nIHRoZSByZXN0IG9mIHRoZSBkYXRhYmFzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFdyaXRlcyBhbmQgZGVsZXRpb25zIGluIG9uZSB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25seSBhZnRlciBhbGwgY2hhbmdlcyBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tbWl0KHBhcmFtczogTG9jYWxEYXRhU3RvcmVDb21taXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMucmVtb3ZlZEtleXMgPz8gW10pIHtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMuZW50cmllcykge1xuICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RvcmUuY291bnQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVjb3JkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgcmVjb3JkcyBpbiBrZXkgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGFjaGVkIGtleS92YWx1ZSBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnRyaWVzKCk6IFByb21pc2U8W3N0cmluZywgdW5rbm93bl1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5vcGVuQ3Vyc29yKCk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgY3Vyc29yID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXJzb3Iua2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUga2V5IGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHJlY29yZHMucHVzaChbY3Vyc29yLmtleSwgY3Vyc29yLnZhbHVlXSk7XG4gICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pO1xuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBzaGFyZWQtc3RvcmUgb3BlcmF0aW9uIGFjcm9zcyBjb25uZWN0aW9ucywgd2luZG93cyBhbmQgYnVuZGxlZCBsaWJyYXJ5IGNvcGllcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBXb3JrIHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoaXMgZGF0YWJhc2UncyBXZWIgTG9jay5cbiAgICogQHJldHVybnMgVGhlIGNhbGxiYWNrIHJlc3VsdCBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhjbHVzaXZlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IHdpbmRvdy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdCh0aGlzLmRhdGFiYXNlLm5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEl0cyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkb25seScsIChzdG9yZSkgPT4gc3RvcmUuZ2V0KGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgcmVjb3JkIG9uY2UsIGF0b21pY2FsbHkgYWNyb3NzIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdXNlZCBvbmx5IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQuXG4gICAqIEByZXR1cm5zIFRoZSBleGlzdGluZyBvciBuZXdseSBjb21taXR0ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3JDcmVhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pLnRoZW4oKGV4aXN0aW5nKSA9PiBleGlzdGluZyA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBleGlzdGluZyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBwZXJzaXN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dCh2YWx1ZSwga2V5KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oJ3JlY29yZHMnLCBtb2RlKTtcbiAgICAgIGxldCByZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdCA9IGFjdGlvbih0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgncmVjb3JkcycpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICAgIHJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUgdHJhbnNhY3Rpb24gZmFpbGVkJywgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICB0cmFuc2FjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTG9jYWwgZGF0YS1zdG9yZSB0cmFuc2FjdGlvbiBhYm9ydGVkJywgeyBjYXVzZTogdHJhbnNhY3Rpb24uZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBZ0RPLE1BQU0sZUFBZTtBQUFBLEVBQ2xCLFlBQTZCLFVBQXVCO0FBQXZCO0FBQUEsRUFBd0I7QUFBQSxFQUF4QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUXJDLGFBQW9CLEtBQUssUUFBMkQ7QUFDbEYsVUFBTSxPQUFPLGdCQUFnQixLQUFLLFVBQVUsQ0FBQyxP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
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Mergeable plugin data, transported as single-writer journal segments and chunked snapshots.
|
|
6
|
+
*/
|
|
7
|
+
import type { DataAdapter } from 'obsidian';
|
|
8
|
+
import type { JsonValue } from 'type-fest';
|
|
9
|
+
import type { DataStoreMergeKind } from './data-store-replica.mjs';
|
|
10
|
+
import type { LocalDataStore } from './local-data-store.mjs';
|
|
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
|
+
}
|