sietch 0.4.0 → 0.5.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/dist/index.d.ts CHANGED
@@ -9,4 +9,6 @@
9
9
  */
10
10
  export { createStore, Store, Cursor, SubtreeCursor } from './store.js';
11
11
  export { ValidationError, SietchError, StorageFullError, SyncError } from './errors.js';
12
+ export type { StorageBackend } from './storage.js';
13
+ export type { StorageType, StorageCapacity } from './types.js';
12
14
  export type { CollectionConfig, CrdtValue, MutationEvent, WriteConfirmation, ReadResult, SyncStatus, SubtreeSyncStatus, SyncConfig, AclMap, AclPermissions, StoreOptions, StorageMetrics, SearchQuery, SearchResult, SearchHit, VectorSearchOptions, VectorResult, TraverseOptions, TraverseResult, PublicIdentity, LinkRequest, CypherResult, AclReferenceNode, SubscribeOptions, StorePlugin, WriteContext, } from './store.js';
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Filesystem Storage Backend — Node.js persistence for Yjs state.
3
+ *
4
+ * Mirrors the OpfsBackend directory layout and write-serialization pattern,
5
+ * using node:fs/promises with atomic writes (write-to-tmp + rename).
6
+ *
7
+ * Directory layout:
8
+ * {basePath}/subdocs/{subtreeId}.yjs
9
+ * {basePath}/identity/keypair.enc
10
+ * {basePath}/refs/{safeRefId}.ref
11
+ * {basePath}/metadata.json
12
+ *
13
+ * Architecture: ADR-005 (OPFS-preferred storage with filesystem for Node.js)
14
+ */
15
+ import type { StorageCapacity } from './types.js';
16
+ import type { StorageBackend } from './storage.js';
17
+ import type { ObservabilityContext } from './observability.js';
18
+ export declare class FilesystemBackend implements StorageBackend {
19
+ private readonly obs;
20
+ readonly type: "filesystem";
21
+ private readonly basePath;
22
+ /** Per-file write locks — serializes writes to prevent corruption. */
23
+ private readonly writeLocks;
24
+ constructor(basePath: string, obs: ObservabilityContext);
25
+ init(): Promise<void>;
26
+ /**
27
+ * Serialize writes to the same file. Chains writes per file key so they
28
+ * execute sequentially — mirrors OpfsBackend.serializedWrite().
29
+ */
30
+ private serializedWrite;
31
+ /** Atomic write: write to .tmp then rename over target. */
32
+ private atomicWrite;
33
+ persistSubdoc(subtreeId: string, state: Uint8Array): Promise<void>;
34
+ loadSubdoc(subtreeId: string): Promise<Uint8Array | null>;
35
+ deleteSubdoc(subtreeId: string): Promise<void>;
36
+ listSubdocs(): Promise<string[]>;
37
+ capacity(): Promise<StorageCapacity>;
38
+ persistIdentity(encrypted: Uint8Array): Promise<void>;
39
+ loadIdentity(): Promise<Uint8Array | null>;
40
+ persistRef(refId: string, state: Uint8Array): Promise<void>;
41
+ loadRef(refId: string): Promise<Uint8Array | null>;
42
+ getSubdocMetadata(id: string): Promise<{
43
+ lastAccess: number;
44
+ byteSize: number;
45
+ } | null>;
46
+ setSubdocMetadata(id: string, meta: {
47
+ lastAccess: number;
48
+ byteSize: number;
49
+ }): Promise<void>;
50
+ listSubdocMetadata(): Promise<Array<{
51
+ id: string;
52
+ lastAccess: number;
53
+ byteSize: number;
54
+ }>>;
55
+ private readMetadataFile;
56
+ private writeMetadataFile;
57
+ close(): Promise<void>;
58
+ }
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Filesystem Storage Backend — Node.js persistence for Yjs state.
3
+ *
4
+ * Mirrors the OpfsBackend directory layout and write-serialization pattern,
5
+ * using node:fs/promises with atomic writes (write-to-tmp + rename).
6
+ *
7
+ * Directory layout:
8
+ * {basePath}/subdocs/{subtreeId}.yjs
9
+ * {basePath}/identity/keypair.enc
10
+ * {basePath}/refs/{safeRefId}.ref
11
+ * {basePath}/metadata.json
12
+ *
13
+ * Architecture: ADR-005 (OPFS-preferred storage with filesystem for Node.js)
14
+ */
15
+ import * as fs from 'node:fs/promises';
16
+ import * as path from 'node:path';
17
+ /** Check whether an error is an ENOENT (file/dir not found). */
18
+ function isEnoent(err) {
19
+ return (typeof err === 'object' &&
20
+ err !== null &&
21
+ 'code' in err &&
22
+ err.code === 'ENOENT');
23
+ }
24
+ // @req FR-02
25
+ // @req FR-03
26
+ export class FilesystemBackend {
27
+ obs;
28
+ type = 'filesystem';
29
+ basePath;
30
+ /** Per-file write locks — serializes writes to prevent corruption. */
31
+ writeLocks = new Map();
32
+ constructor(basePath, obs) {
33
+ this.obs = obs;
34
+ this.basePath = path.resolve(basePath);
35
+ }
36
+ async init() {
37
+ await fs.mkdir(path.join(this.basePath, 'subdocs'), { recursive: true });
38
+ await fs.mkdir(path.join(this.basePath, 'identity'), { recursive: true });
39
+ await fs.mkdir(path.join(this.basePath, 'refs'), { recursive: true });
40
+ this.obs.logger.info({ backend: 'filesystem', path: this.basePath }, 'storage initialized');
41
+ }
42
+ /**
43
+ * Serialize writes to the same file. Chains writes per file key so they
44
+ * execute sequentially — mirrors OpfsBackend.serializedWrite().
45
+ */
46
+ serializedWrite(fileKey, fn) {
47
+ const prev = this.writeLocks.get(fileKey) ?? Promise.resolve();
48
+ const next = prev.then(fn, fn);
49
+ this.writeLocks.set(fileKey, next);
50
+ next.then(() => { if (this.writeLocks.get(fileKey) === next)
51
+ this.writeLocks.delete(fileKey); }, () => { if (this.writeLocks.get(fileKey) === next)
52
+ this.writeLocks.delete(fileKey); });
53
+ return next;
54
+ }
55
+ /** Atomic write: write to .tmp then rename over target. */
56
+ async atomicWrite(filePath, data) {
57
+ // Ensure parent directory exists (guards against races with parallel inits)
58
+ try {
59
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
60
+ }
61
+ catch (err) {
62
+ if (!isEnoent(err))
63
+ throw err;
64
+ return; // Base directory gone (backend closed / test cleanup) — skip
65
+ }
66
+ const tmp = filePath + '.tmp';
67
+ try {
68
+ await fs.writeFile(tmp, data);
69
+ await fs.rename(tmp, filePath);
70
+ }
71
+ catch (err) {
72
+ if (!isEnoent(err))
73
+ throw err;
74
+ // Directory removed between mkdir and write — skip silently
75
+ }
76
+ }
77
+ async persistSubdoc(subtreeId, state) {
78
+ const filePath = path.join(this.basePath, 'subdocs', `${subtreeId}.yjs`);
79
+ return this.serializedWrite(`subdoc:${subtreeId}`, () => this.atomicWrite(filePath, state));
80
+ }
81
+ async loadSubdoc(subtreeId) {
82
+ try {
83
+ const filePath = path.join(this.basePath, 'subdocs', `${subtreeId}.yjs`);
84
+ const buf = await fs.readFile(filePath);
85
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
86
+ }
87
+ catch (err) {
88
+ if (isEnoent(err))
89
+ return null;
90
+ throw err;
91
+ }
92
+ }
93
+ async deleteSubdoc(subtreeId) {
94
+ try {
95
+ const filePath = path.join(this.basePath, 'subdocs', `${subtreeId}.yjs`);
96
+ await fs.unlink(filePath);
97
+ }
98
+ catch (err) {
99
+ if (!isEnoent(err))
100
+ throw err;
101
+ }
102
+ }
103
+ async listSubdocs() {
104
+ try {
105
+ const dir = path.join(this.basePath, 'subdocs');
106
+ const entries = await fs.readdir(dir);
107
+ return entries
108
+ .filter((name) => name.endsWith('.yjs'))
109
+ .map((name) => name.slice(0, -4));
110
+ }
111
+ catch (err) {
112
+ if (isEnoent(err))
113
+ return [];
114
+ throw err;
115
+ }
116
+ }
117
+ // @req FR-21
118
+ async capacity() {
119
+ try {
120
+ // fs.statfs available since Node 18.15
121
+ const stats = await fs.statfs(this.basePath);
122
+ const total = stats.blocks * stats.bsize;
123
+ const available = stats.bavail * stats.bsize;
124
+ const used = total - available;
125
+ return { used, total, available };
126
+ }
127
+ catch {
128
+ return { used: 0, total: 0, available: 0 };
129
+ }
130
+ }
131
+ // @req FR-30
132
+ async persistIdentity(encrypted) {
133
+ const filePath = path.join(this.basePath, 'identity', 'keypair.enc');
134
+ return this.serializedWrite('identity:keypair', () => this.atomicWrite(filePath, encrypted));
135
+ }
136
+ async loadIdentity() {
137
+ try {
138
+ const filePath = path.join(this.basePath, 'identity', 'keypair.enc');
139
+ const buf = await fs.readFile(filePath);
140
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
141
+ }
142
+ catch (err) {
143
+ if (isEnoent(err))
144
+ return null;
145
+ throw err;
146
+ }
147
+ }
148
+ async persistRef(refId, state) {
149
+ const safeId = refId.replace(/\//g, '__');
150
+ const filePath = path.join(this.basePath, 'refs', `${safeId}.ref`);
151
+ return this.serializedWrite(`ref:${safeId}`, () => this.atomicWrite(filePath, state));
152
+ }
153
+ async loadRef(refId) {
154
+ try {
155
+ const safeId = refId.replace(/\//g, '__');
156
+ const filePath = path.join(this.basePath, 'refs', `${safeId}.ref`);
157
+ const buf = await fs.readFile(filePath);
158
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
159
+ }
160
+ catch (err) {
161
+ if (isEnoent(err))
162
+ return null;
163
+ throw err;
164
+ }
165
+ }
166
+ async getSubdocMetadata(id) {
167
+ const all = await this.readMetadataFile();
168
+ return all[id] ?? null;
169
+ }
170
+ async setSubdocMetadata(id, meta) {
171
+ const all = await this.readMetadataFile();
172
+ all[id] = meta;
173
+ await this.writeMetadataFile(all);
174
+ }
175
+ async listSubdocMetadata() {
176
+ const all = await this.readMetadataFile();
177
+ return Object.entries(all).map(([id, meta]) => ({ id, ...meta }));
178
+ }
179
+ async readMetadataFile() {
180
+ try {
181
+ const filePath = path.join(this.basePath, 'metadata.json');
182
+ const text = await fs.readFile(filePath, 'utf8');
183
+ return JSON.parse(text);
184
+ }
185
+ catch (err) {
186
+ if (isEnoent(err))
187
+ return {};
188
+ throw err;
189
+ }
190
+ }
191
+ async writeMetadataFile(data) {
192
+ const filePath = path.join(this.basePath, 'metadata.json');
193
+ return this.serializedWrite('meta:all', () => this.atomicWrite(filePath, JSON.stringify(data)));
194
+ }
195
+ async close() {
196
+ if (this.writeLocks.size > 0) {
197
+ await Promise.allSettled([...this.writeLocks.values()]);
198
+ this.writeLocks.clear();
199
+ }
200
+ }
201
+ }
202
+ //# sourceMappingURL=storage-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-node.js","sourceRoot":"","sources":["../src/storage-node.ts"],"names":[],"mappings":"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"}
package/dist/storage.d.ts CHANGED
@@ -52,9 +52,9 @@ export interface StorageBackend {
52
52
  /**
53
53
  * Detect the best available storage backend.
54
54
  *
55
- * Priority: OPFS > IndexedDB > Memory (Node.js fallback)
55
+ * Priority: OPFS > IndexedDB > Filesystem (Node.js) > Memory
56
56
  */
57
- export declare function detectStorageType(preference?: 'opfs' | 'indexeddb' | 'auto'): StorageType;
57
+ export declare function detectStorageType(preference?: StorageType | 'auto'): StorageType;
58
58
  /**
59
59
  * Initialize a storage backend.
60
60
  *
@@ -63,7 +63,8 @@ export declare function detectStorageType(preference?: 'opfs' | 'indexeddb' | 'a
63
63
  * not 'auto' (auto falls back to memory).
64
64
  *
65
65
  * @param obs - Observability context for logging
66
- * @param preference - Storage preference ('opfs', 'indexeddb', 'auto')
66
+ * @param preference - Storage preference ('opfs', 'indexeddb', 'filesystem', 'auto')
67
+ * @param storagePath - Base directory for filesystem backend (default: '.sietch')
67
68
  * @returns Initialized storage backend
68
69
  */
69
- export declare function createStorageBackend(obs: ObservabilityContext, preference?: 'opfs' | 'indexeddb' | 'auto'): Promise<StorageBackend>;
70
+ export declare function createStorageBackend(obs: ObservabilityContext, preference?: StorageType | 'auto', storagePath?: string): Promise<StorageBackend>;
package/dist/storage.js CHANGED
@@ -36,18 +36,24 @@ async function wrapQuotaError(fn) {
36
36
  /**
37
37
  * Detect the best available storage backend.
38
38
  *
39
- * Priority: OPFS > IndexedDB > Memory (Node.js fallback)
39
+ * Priority: OPFS > IndexedDB > Filesystem (Node.js) > Memory
40
40
  */
41
41
  export function detectStorageType(preference) {
42
+ if (preference === 'memory')
43
+ return 'memory';
42
44
  if (preference === 'opfs' && hasOpfs())
43
45
  return 'opfs';
44
46
  if (preference === 'indexeddb' && hasIndexedDb())
45
47
  return 'indexeddb';
48
+ if (preference === 'filesystem' && hasNodeFs())
49
+ return 'filesystem';
46
50
  if (preference === undefined || preference === 'auto') {
47
51
  if (hasOpfs())
48
52
  return 'opfs';
49
53
  if (hasIndexedDb())
50
54
  return 'indexeddb';
55
+ if (hasNodeFs())
56
+ return 'filesystem';
51
57
  return 'memory';
52
58
  }
53
59
  // Requested backend unavailable — fall through to auto
@@ -57,10 +63,31 @@ export function detectStorageType(preference) {
57
63
  return 'indexeddb';
58
64
  return 'memory';
59
65
  }
66
+ function hasNodeFs() {
67
+ return typeof process !== 'undefined' && typeof process.versions?.node === 'string';
68
+ }
60
69
  function hasOpfs() {
61
70
  return (typeof globalThis.navigator !== 'undefined' &&
62
71
  typeof globalThis.navigator.storage?.getDirectory === 'function');
63
72
  }
73
+ /**
74
+ * Probe OPFS by actually calling getDirectory() with a timeout.
75
+ * Some browsers (Firefox) expose the API but hang or reject at runtime.
76
+ */
77
+ async function probeOpfs(timeoutMs = 2000) {
78
+ if (!hasOpfs())
79
+ return false;
80
+ try {
81
+ await Promise.race([
82
+ navigator.storage.getDirectory(),
83
+ new Promise((_, reject) => setTimeout(() => reject(new Error('OPFS probe timeout')), timeoutMs)),
84
+ ]);
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
64
91
  function hasIndexedDb() {
65
92
  return typeof globalThis.indexedDB !== 'undefined';
66
93
  }
@@ -71,14 +98,20 @@ class OpfsBackend {
71
98
  obs;
72
99
  type = 'opfs';
73
100
  root = null;
101
+ /** Per-file write locks — serializes OPFS writes to prevent NoModificationAllowedError. */
102
+ writeLocks = new Map();
74
103
  constructor(obs) {
75
104
  this.obs = obs;
76
105
  }
77
106
  async init() {
78
107
  this.root = await navigator.storage.getDirectory();
79
- // B-1: Request persistent storage to prevent silent eviction by the browser
108
+ // B-1: Request persistent storage to prevent silent eviction by the browser.
109
+ // Some browsers hang on persist() — race against a 3-second timeout.
80
110
  try {
81
- await navigator.storage?.persist?.();
111
+ await Promise.race([
112
+ navigator.storage?.persist?.(),
113
+ new Promise((resolve) => setTimeout(resolve, 3000)),
114
+ ]);
82
115
  }
83
116
  catch { /* persist() may not be available in all contexts */ }
84
117
  this.obs.logger.info({ backend: 'opfs' }, 'storage initialized');
@@ -87,14 +120,30 @@ class OpfsBackend {
87
120
  const sietchDir = await this.root.getDirectoryHandle('sietch', { create: true });
88
121
  return sietchDir.getDirectoryHandle(name, { create: true });
89
122
  }
123
+ /**
124
+ * Serialize writes to the same OPFS file. OPFS `createWritable()` takes an
125
+ * exclusive lock — concurrent writes to the same file throw
126
+ * NoModificationAllowedError. This chains writes per file key so they execute
127
+ * sequentially.
128
+ */
129
+ serializedWrite(fileKey, fn) {
130
+ const prev = this.writeLocks.get(fileKey) ?? Promise.resolve();
131
+ const next = prev.then(fn, fn); // run fn even if previous write failed
132
+ this.writeLocks.set(fileKey, next);
133
+ // Clean up entry when chain settles to avoid unbounded map growth
134
+ next.then(() => { if (this.writeLocks.get(fileKey) === next)
135
+ this.writeLocks.delete(fileKey); }, () => { if (this.writeLocks.get(fileKey) === next)
136
+ this.writeLocks.delete(fileKey); });
137
+ return next;
138
+ }
90
139
  async persistSubdoc(subtreeId, state) {
91
- await wrapQuotaError(async () => {
140
+ return this.serializedWrite(`subdoc:${subtreeId}`, () => wrapQuotaError(async () => {
92
141
  const dir = await this.getDir('subdocs');
93
142
  const file = await dir.getFileHandle(`${subtreeId}.yjs`, { create: true });
94
143
  const writable = await file.createWritable();
95
144
  await writable.write(toArrayBuffer(state));
96
145
  await writable.close();
97
- });
146
+ }));
98
147
  }
99
148
  async loadSubdoc(subtreeId) {
100
149
  try {
@@ -139,13 +188,13 @@ class OpfsBackend {
139
188
  }
140
189
  // @req FR-30
141
190
  async persistIdentity(encrypted) {
142
- await wrapQuotaError(async () => {
191
+ return this.serializedWrite('identity:keypair', () => wrapQuotaError(async () => {
143
192
  const dir = await this.getDir('identity');
144
193
  const file = await dir.getFileHandle('keypair.enc', { create: true });
145
194
  const writable = await file.createWritable();
146
195
  await writable.write(toArrayBuffer(encrypted));
147
196
  await writable.close();
148
- });
197
+ }));
149
198
  }
150
199
  async loadIdentity() {
151
200
  try {
@@ -160,14 +209,14 @@ class OpfsBackend {
160
209
  }
161
210
  }
162
211
  async persistRef(refId, state) {
163
- await wrapQuotaError(async () => {
212
+ const safeId = refId.replace(/\//g, '__');
213
+ return this.serializedWrite(`ref:${safeId}`, () => wrapQuotaError(async () => {
164
214
  const dir = await this.getDir('refs');
165
- const safeId = refId.replace(/\//g, '__');
166
215
  const file = await dir.getFileHandle(`${safeId}.ref`, { create: true });
167
216
  const writable = await file.createWritable();
168
217
  await writable.write(toArrayBuffer(state));
169
218
  await writable.close();
170
- });
219
+ }));
171
220
  }
172
221
  async loadRef(refId) {
173
222
  try {
@@ -201,6 +250,8 @@ class OpfsBackend {
201
250
  return Object.entries(all).map(([id, meta]) => ({ id, ...meta }));
202
251
  }
203
252
  async readMetadataFile() {
253
+ if (!this.root)
254
+ return {};
204
255
  try {
205
256
  const sietchDir = await this.root.getDirectoryHandle('sietch', { create: true });
206
257
  const file = await sietchDir.getFileHandle('metadata.json');
@@ -213,13 +264,24 @@ class OpfsBackend {
213
264
  }
214
265
  }
215
266
  async writeMetadataFile(data) {
216
- const sietchDir = await this.root.getDirectoryHandle('sietch', { create: true });
217
- const file = await sietchDir.getFileHandle('metadata.json', { create: true });
218
- const writable = await file.createWritable();
219
- await writable.write(JSON.stringify(data));
220
- await writable.close();
267
+ if (!this.root)
268
+ return; // Backend closed skip fire-and-forget writes
269
+ return this.serializedWrite('meta:all', async () => {
270
+ if (!this.root)
271
+ return;
272
+ const sietchDir = await this.root.getDirectoryHandle('sietch', { create: true });
273
+ const file = await sietchDir.getFileHandle('metadata.json', { create: true });
274
+ const writable = await file.createWritable();
275
+ await writable.write(JSON.stringify(data));
276
+ await writable.close();
277
+ });
221
278
  }
222
279
  async close() {
280
+ // Await all pending writes before releasing the root handle
281
+ if (this.writeLocks.size > 0) {
282
+ await Promise.allSettled([...this.writeLocks.values()]);
283
+ this.writeLocks.clear();
284
+ }
223
285
  this.root = null;
224
286
  }
225
287
  }
@@ -415,23 +477,42 @@ class MemoryBackend {
415
477
  * not 'auto' (auto falls back to memory).
416
478
  *
417
479
  * @param obs - Observability context for logging
418
- * @param preference - Storage preference ('opfs', 'indexeddb', 'auto')
480
+ * @param preference - Storage preference ('opfs', 'indexeddb', 'filesystem', 'auto')
481
+ * @param storagePath - Base directory for filesystem backend (default: '.sietch')
419
482
  * @returns Initialized storage backend
420
483
  */
421
- export async function createStorageBackend(obs, preference) {
484
+ export async function createStorageBackend(obs, preference, storagePath) {
422
485
  const type = detectStorageType(preference);
423
486
  if (type === 'opfs') {
424
- const backend = new OpfsBackend(obs);
425
- await backend.init();
426
- return backend;
487
+ // Probe OPFS with timeout — some browsers (Firefox) hang on getDirectory()
488
+ const opfsAvailable = await probeOpfs();
489
+ if (opfsAvailable) {
490
+ const backend = new OpfsBackend(obs);
491
+ await backend.init();
492
+ return backend;
493
+ }
494
+ obs.logger.warn('OPFS detected but probe failed; falling back to IndexedDB');
495
+ // Fall through to IndexedDB
496
+ if (hasIndexedDb()) {
497
+ const backend = new IndexedDbBackend(obs);
498
+ await backend.init();
499
+ return backend;
500
+ }
427
501
  }
428
502
  if (type === 'indexeddb') {
429
503
  const backend = new IndexedDbBackend(obs);
430
504
  await backend.init();
431
505
  return backend;
432
506
  }
507
+ if (type === 'filesystem') {
508
+ // Dynamic import keeps node:fs out of browser bundles
509
+ const { FilesystemBackend } = await import('./storage-node.js');
510
+ const backend = new FilesystemBackend(storagePath ?? '.sietch', obs);
511
+ await backend.init();
512
+ return backend;
513
+ }
433
514
  // Memory fallback — always available
434
- if (preference !== undefined && preference !== 'auto') {
515
+ if (preference !== undefined && preference !== 'auto' && preference !== 'memory') {
435
516
  throw new StorageUnavailableError(`Requested storage backend '${preference}' is not available`, [preference]);
436
517
  }
437
518
  const backend = new MemoryBackend(obs);
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -50,6 +50,10 @@ export declare class Store {
50
50
  private readonly syncSubRefCounts;
51
51
  /** When non-null, sync updates are collected here instead of pushed immediately. */
52
52
  private batchUpdates;
53
+ /** Microtask coalescing buffer — merges updates within the same event loop tick. */
54
+ private microBatch;
55
+ /** Whether a microtask flush is already scheduled. */
56
+ private microBatchScheduled;
53
57
  /** Status listeners registered before syncEngine is available. */
54
58
  private readonly pendingStatusListeners;
55
59
  /** Subtree status listeners registered before syncEngine is available. */
@@ -349,6 +353,8 @@ export declare class Store {
349
353
  private waitForSubtreeSync;
350
354
  /** Route a sync update through the batch collector or directly to the sync engine. */
351
355
  private pushOrBatchUpdate;
356
+ /** Flush coalesced updates — one merged update per subtree per tick. */
357
+ private flushMicroBatch;
352
358
  /**
353
359
  * Index remotely-written objects so full-text search covers sync data.
354
360
  *
@@ -377,4 +383,6 @@ export declare class Store {
377
383
  * Zero-config by default (NFR-09):
378
384
  * const db = await createStore();
379
385
  */
380
- export declare function createStore(options?: StoreOptions): Promise<Store>;
386
+ export declare function createStore(options?: StoreOptions & {
387
+ storageBackend?: StorageBackend;
388
+ }): Promise<Store>;