@prabhask5/stellar-engine 1.1.18 → 1.2.1
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/README.md +448 -321
- package/dist/bin/commands.d.ts +14 -0
- package/dist/bin/commands.d.ts.map +1 -0
- package/dist/bin/commands.js +68 -0
- package/dist/bin/commands.js.map +1 -0
- package/dist/bin/install-pwa.d.ts +20 -6
- package/dist/bin/install-pwa.d.ts.map +1 -1
- package/dist/bin/install-pwa.js +111 -184
- package/dist/bin/install-pwa.js.map +1 -1
- package/dist/config.d.ts +67 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +265 -24
- package/dist/config.js.map +1 -1
- package/dist/crdt/awareness.d.ts +128 -0
- package/dist/crdt/awareness.d.ts.map +1 -0
- package/dist/crdt/awareness.js +284 -0
- package/dist/crdt/awareness.js.map +1 -0
- package/dist/crdt/channel.d.ts +165 -0
- package/dist/crdt/channel.d.ts.map +1 -0
- package/dist/crdt/channel.js +522 -0
- package/dist/crdt/channel.js.map +1 -0
- package/dist/crdt/config.d.ts +58 -0
- package/dist/crdt/config.d.ts.map +1 -0
- package/dist/crdt/config.js +123 -0
- package/dist/crdt/config.js.map +1 -0
- package/dist/crdt/helpers.d.ts +104 -0
- package/dist/crdt/helpers.d.ts.map +1 -0
- package/dist/crdt/helpers.js +116 -0
- package/dist/crdt/helpers.js.map +1 -0
- package/dist/crdt/offline.d.ts +58 -0
- package/dist/crdt/offline.d.ts.map +1 -0
- package/dist/crdt/offline.js +130 -0
- package/dist/crdt/offline.js.map +1 -0
- package/dist/crdt/persistence.d.ts +65 -0
- package/dist/crdt/persistence.d.ts.map +1 -0
- package/dist/crdt/persistence.js +171 -0
- package/dist/crdt/persistence.js.map +1 -0
- package/dist/crdt/provider.d.ts +109 -0
- package/dist/crdt/provider.d.ts.map +1 -0
- package/dist/crdt/provider.js +543 -0
- package/dist/crdt/provider.js.map +1 -0
- package/dist/crdt/store.d.ts +111 -0
- package/dist/crdt/store.d.ts.map +1 -0
- package/dist/crdt/store.js +158 -0
- package/dist/crdt/store.js.map +1 -0
- package/dist/crdt/types.d.ts +281 -0
- package/dist/crdt/types.d.ts.map +1 -0
- package/dist/crdt/types.js +26 -0
- package/dist/crdt/types.js.map +1 -0
- package/dist/database.d.ts +66 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +133 -7
- package/dist/database.js.map +1 -1
- package/dist/diagnostics.d.ts +75 -0
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +114 -2
- package/dist/diagnostics.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +21 -1
- package/dist/engine.js.map +1 -1
- package/dist/entries/crdt.d.ts +32 -0
- package/dist/entries/crdt.d.ts.map +1 -0
- package/dist/entries/crdt.js +52 -0
- package/dist/entries/crdt.js.map +1 -0
- package/dist/entries/types.d.ts +5 -3
- package/dist/entries/types.d.ts.map +1 -1
- package/dist/entries/utils.d.ts +1 -0
- package/dist/entries/utils.d.ts.map +1 -1
- package/dist/entries/utils.js +8 -0
- package/dist/entries/utils.js.map +1 -1
- package/dist/entries/vite.d.ts +1 -1
- package/dist/entries/vite.d.ts.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +150 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +891 -0
- package/dist/schema.js.map +1 -0
- package/dist/sw/build/vite-plugin.d.ts +93 -18
- package/dist/sw/build/vite-plugin.d.ts.map +1 -1
- package/dist/sw/build/vite-plugin.js +356 -22
- package/dist/sw/build/vite-plugin.js.map +1 -1
- package/dist/types.d.ts +139 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -3
- package/dist/operations.d.ts +0 -73
- package/dist/operations.d.ts.map +0 -1
- package/dist/operations.js +0 -227
- package/dist/operations.js.map +0 -1
- package/dist/reconnectHandler.d.ts +0 -16
- package/dist/reconnectHandler.d.ts.map +0 -1
- package/dist/reconnectHandler.js +0 -21
- package/dist/reconnectHandler.js.map +0 -1
package/dist/database.js
CHANGED
|
@@ -22,6 +22,24 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import Dexie from 'dexie';
|
|
24
24
|
// =============================================================================
|
|
25
|
+
// System Indexes
|
|
26
|
+
// =============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Dexie indexes automatically appended to every app table when using the
|
|
29
|
+
* schema-driven API (`initEngine({ schema: {...} })`).
|
|
30
|
+
*
|
|
31
|
+
* These correspond to the system columns that every synced table has:
|
|
32
|
+
* - `id` — UUID primary key
|
|
33
|
+
* - `user_id` — ownership filter for RLS
|
|
34
|
+
* - `created_at` — creation timestamp
|
|
35
|
+
* - `updated_at` — last modification timestamp (sync cursor)
|
|
36
|
+
* - `deleted` — soft-delete flag
|
|
37
|
+
* - `_version` — optimistic concurrency version counter
|
|
38
|
+
*
|
|
39
|
+
* @see {@link config.ts#generateDatabaseFromSchema} for usage
|
|
40
|
+
*/
|
|
41
|
+
export const SYSTEM_INDEXES = 'id, user_id, created_at, updated_at, deleted, _version';
|
|
42
|
+
// =============================================================================
|
|
25
43
|
// System Tables
|
|
26
44
|
// =============================================================================
|
|
27
45
|
/**
|
|
@@ -41,6 +59,22 @@ const SYSTEM_TABLES = {
|
|
|
41
59
|
offlineSession: 'id',
|
|
42
60
|
singleUserConfig: 'id'
|
|
43
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* CRDT tables — only included when the CRDT subsystem is enabled via
|
|
64
|
+
* `initEngine({ crdt: {...} })`.
|
|
65
|
+
*
|
|
66
|
+
* - `crdtDocuments` — Full Yjs document state snapshots for offline access
|
|
67
|
+
* and cross-session recovery
|
|
68
|
+
* - `crdtPendingUpdates` — Incremental Yjs update deltas for crash safety
|
|
69
|
+
* (replayed if browser crashes between full saves)
|
|
70
|
+
*
|
|
71
|
+
* @see {@link ./crdt/types.ts} for record shapes
|
|
72
|
+
* @see {@link ./crdt/store.ts} for CRUD operations on these tables
|
|
73
|
+
*/
|
|
74
|
+
const CRDT_SYSTEM_TABLES = {
|
|
75
|
+
crdtDocuments: 'documentId, pageId, offlineEnabled',
|
|
76
|
+
crdtPendingUpdates: '++id, documentId, timestamp'
|
|
77
|
+
};
|
|
44
78
|
// =============================================================================
|
|
45
79
|
// Module State
|
|
46
80
|
// =============================================================================
|
|
@@ -67,8 +101,8 @@ let managedDb = null;
|
|
|
67
101
|
* @param config - Database name and version declarations.
|
|
68
102
|
* @returns The opened Dexie instance, ready for use.
|
|
69
103
|
*/
|
|
70
|
-
export async function createDatabase(config) {
|
|
71
|
-
let db = buildDexie(config);
|
|
104
|
+
export async function createDatabase(config, crdtEnabled = false) {
|
|
105
|
+
let db = buildDexie(config, crdtEnabled);
|
|
72
106
|
try {
|
|
73
107
|
/*
|
|
74
108
|
* Open eagerly to trigger version upgrade NOW, not lazily on first access.
|
|
@@ -94,7 +128,7 @@ export async function createDatabase(config) {
|
|
|
94
128
|
`DB version: ${idb.version}, Dexie version: ${db.verno}. Deleting and recreating...`);
|
|
95
129
|
db.close();
|
|
96
130
|
await Dexie.delete(config.name);
|
|
97
|
-
db = buildDexie(config);
|
|
131
|
+
db = buildDexie(config, crdtEnabled);
|
|
98
132
|
await db.open();
|
|
99
133
|
}
|
|
100
134
|
}
|
|
@@ -113,7 +147,7 @@ export async function createDatabase(config) {
|
|
|
113
147
|
/* Ignore close errors — the connection may already be broken. */
|
|
114
148
|
}
|
|
115
149
|
await Dexie.delete(config.name);
|
|
116
|
-
db = buildDexie(config);
|
|
150
|
+
db = buildDexie(config, crdtEnabled);
|
|
117
151
|
await db.open();
|
|
118
152
|
}
|
|
119
153
|
managedDb = db;
|
|
@@ -128,11 +162,16 @@ export async function createDatabase(config) {
|
|
|
128
162
|
* @param config - Database name and version declarations.
|
|
129
163
|
* @returns An unopened Dexie instance with all versions declared.
|
|
130
164
|
*/
|
|
131
|
-
function buildDexie(config) {
|
|
165
|
+
function buildDexie(config, crdtEnabled = false) {
|
|
132
166
|
const db = new Dexie(config.name);
|
|
133
167
|
for (const ver of config.versions) {
|
|
134
|
-
/* Merge app tables with system tables — system tables always included.
|
|
135
|
-
|
|
168
|
+
/* Merge app tables with system tables — system tables always included.
|
|
169
|
+
* CRDT tables are only included when the CRDT subsystem is enabled. */
|
|
170
|
+
const mergedStores = {
|
|
171
|
+
...ver.stores,
|
|
172
|
+
...SYSTEM_TABLES,
|
|
173
|
+
...(crdtEnabled ? CRDT_SYSTEM_TABLES : {})
|
|
174
|
+
};
|
|
136
175
|
if (ver.upgrade) {
|
|
137
176
|
db.version(ver.version).stores(mergedStores).upgrade(ver.upgrade);
|
|
138
177
|
}
|
|
@@ -169,6 +208,93 @@ export function getDb() {
|
|
|
169
208
|
export function _setManagedDb(db) {
|
|
170
209
|
managedDb = db;
|
|
171
210
|
}
|
|
211
|
+
/**
|
|
212
|
+
* Compute a stable Dexie version number from a merged store schema.
|
|
213
|
+
*
|
|
214
|
+
* Uses a localStorage-backed hash comparison to detect schema changes:
|
|
215
|
+
* 1. Compute a deterministic hash of the stringified stores object.
|
|
216
|
+
* 2. Compare to the previously stored hash in localStorage.
|
|
217
|
+
* 3. If changed → increment the stored version, persist both hash and
|
|
218
|
+
* previous stores schema, and return the upgrade info.
|
|
219
|
+
* 4. If unchanged → return the stored version.
|
|
220
|
+
* 5. If first run → return version 1.
|
|
221
|
+
*
|
|
222
|
+
* When a schema change is detected, the previous stores schema is returned
|
|
223
|
+
* so that the caller can declare both versions. This gives Dexie a proper
|
|
224
|
+
* upgrade path (version N → version N+1) instead of requiring a full
|
|
225
|
+
* database rebuild.
|
|
226
|
+
*
|
|
227
|
+
* @param prefix - Application prefix for namespacing localStorage keys.
|
|
228
|
+
* @param mergedStores - The complete Dexie store schema (app + system tables).
|
|
229
|
+
* @returns Version info including previous stores for upgrade path.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* const result = computeSchemaVersion('stellar', {
|
|
233
|
+
* goals: 'id, user_id, goal_list_id, order',
|
|
234
|
+
* });
|
|
235
|
+
* // First run: { version: 1, previousStores: null, previousVersion: null }
|
|
236
|
+
* // On change: { version: 2, previousStores: { goals: '...' }, previousVersion: 1 }
|
|
237
|
+
*
|
|
238
|
+
* @see {@link config.ts#generateDatabaseFromSchema} for the caller
|
|
239
|
+
*/
|
|
240
|
+
export function computeSchemaVersion(prefix, mergedStores) {
|
|
241
|
+
/* 1. Build a stable, sorted string representation of the schema. */
|
|
242
|
+
const schemaString = JSON.stringify(Object.keys(mergedStores)
|
|
243
|
+
.sort()
|
|
244
|
+
.map((k) => `${k}:${mergedStores[k]}`));
|
|
245
|
+
const hash = djb2Hash(schemaString);
|
|
246
|
+
/* 2. Compare to the stored hash. */
|
|
247
|
+
const hashKey = `${prefix}_schema_hash`;
|
|
248
|
+
const versionKey = `${prefix}_schema_version`;
|
|
249
|
+
const storesKey = `${prefix}_schema_stores`;
|
|
250
|
+
/* Guard for SSR or environments without localStorage. */
|
|
251
|
+
if (typeof localStorage === 'undefined') {
|
|
252
|
+
return { version: 1, previousStores: null, previousVersion: null };
|
|
253
|
+
}
|
|
254
|
+
const storedHash = localStorage.getItem(hashKey);
|
|
255
|
+
const storedVersion = parseInt(localStorage.getItem(versionKey) || '0', 10);
|
|
256
|
+
if (storedHash === hash) {
|
|
257
|
+
/* Schema unchanged — use the stored version. */
|
|
258
|
+
return { version: storedVersion || 1, previousStores: null, previousVersion: null };
|
|
259
|
+
}
|
|
260
|
+
/* 3. Schema changed (or first run) — bump version. */
|
|
261
|
+
const newVersion = (storedVersion || 0) + 1;
|
|
262
|
+
/* Retrieve the previous stores schema for the upgrade path. */
|
|
263
|
+
let previousStores = null;
|
|
264
|
+
const previousVersion = storedVersion || null;
|
|
265
|
+
const storedStores = localStorage.getItem(storesKey);
|
|
266
|
+
if (storedStores) {
|
|
267
|
+
try {
|
|
268
|
+
previousStores = JSON.parse(storedStores);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
/* Corrupted — treat as first run. */
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/* Persist the new state. */
|
|
275
|
+
localStorage.setItem(hashKey, hash);
|
|
276
|
+
localStorage.setItem(versionKey, String(newVersion));
|
|
277
|
+
localStorage.setItem(storesKey, JSON.stringify(mergedStores));
|
|
278
|
+
return { version: newVersion, previousStores, previousVersion };
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* DJB2 hash function — fast, deterministic string hash.
|
|
282
|
+
*
|
|
283
|
+
* Produces a hex string from an arbitrary input string. Not cryptographic,
|
|
284
|
+
* but sufficient for detecting schema changes across app restarts.
|
|
285
|
+
*
|
|
286
|
+
* @param str - The input string to hash.
|
|
287
|
+
* @returns A hex string representation of the hash.
|
|
288
|
+
* @internal
|
|
289
|
+
*/
|
|
290
|
+
function djb2Hash(str) {
|
|
291
|
+
let hash = 5381;
|
|
292
|
+
for (let i = 0; i < str.length; i++) {
|
|
293
|
+
hash = (hash * 33) ^ str.charCodeAt(i);
|
|
294
|
+
}
|
|
295
|
+
/* Convert to unsigned 32-bit integer, then to hex. */
|
|
296
|
+
return (hash >>> 0).toString(16);
|
|
297
|
+
}
|
|
172
298
|
// =============================================================================
|
|
173
299
|
// Recovery
|
|
174
300
|
// =============================================================================
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AA+B1B,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,aAAa,GAA2B;IAC5C,SAAS,EAAE,kCAAkC;IAC7C,eAAe,EAAE,uCAAuC;IACxD,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,kFAAkF;AAClF,IAAI,SAAS,GAAiB,IAAI,CAAC;AAEnC,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAsB;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
package/dist/diagnostics.d.ts
CHANGED
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
import type { ConflictHistoryEntry, SyncStatus } from './types';
|
|
27
27
|
import type { RealtimeConnectionState } from './realtime';
|
|
28
28
|
import type { SyncError } from './stores/sync';
|
|
29
|
+
import type { CRDTConnectionState } from './crdt/types';
|
|
29
30
|
/**
|
|
30
31
|
* Comprehensive diagnostics snapshot returned by {@link getDiagnostics}.
|
|
31
32
|
*
|
|
@@ -120,6 +121,68 @@ export interface DiagnosticsSnapshot {
|
|
|
120
121
|
lastErrorDetails: string | null;
|
|
121
122
|
recentErrors: SyncError[];
|
|
122
123
|
};
|
|
124
|
+
/** CRDT collaborative editing subsystem diagnostics */
|
|
125
|
+
crdt: {
|
|
126
|
+
/** Whether the CRDT subsystem is enabled (crdt config provided to initEngine). */
|
|
127
|
+
enabled: boolean;
|
|
128
|
+
/** Resolved CRDT configuration (null if not enabled). */
|
|
129
|
+
config: {
|
|
130
|
+
supabaseTable: string;
|
|
131
|
+
persistIntervalMs: number;
|
|
132
|
+
broadcastDebounceMs: number;
|
|
133
|
+
localSaveDebounceMs: number;
|
|
134
|
+
cursorDebounceMs: number;
|
|
135
|
+
maxOfflineDocuments: number;
|
|
136
|
+
maxBroadcastPayloadBytes: number;
|
|
137
|
+
syncPeerTimeoutMs: number;
|
|
138
|
+
maxReconnectAttempts: number;
|
|
139
|
+
reconnectBaseDelayMs: number;
|
|
140
|
+
} | null;
|
|
141
|
+
/** Currently active (open) CRDT documents. */
|
|
142
|
+
activeDocuments: Array<{
|
|
143
|
+
documentId: string;
|
|
144
|
+
pageId: string;
|
|
145
|
+
connectionState: CRDTConnectionState;
|
|
146
|
+
isDirty: boolean;
|
|
147
|
+
/** Current Y.Doc state size in bytes. */
|
|
148
|
+
stateSizeBytes: number;
|
|
149
|
+
stateSizeFormatted: string;
|
|
150
|
+
/** Number of remote collaborators currently connected. */
|
|
151
|
+
collaboratorCount: number;
|
|
152
|
+
/** Names of connected collaborators. */
|
|
153
|
+
collaboratorNames: string[];
|
|
154
|
+
}>;
|
|
155
|
+
/** Total number of active documents. */
|
|
156
|
+
activeDocumentCount: number;
|
|
157
|
+
/** Offline storage statistics. */
|
|
158
|
+
offline: {
|
|
159
|
+
/** Number of documents stored for offline access. */
|
|
160
|
+
documentCount: number;
|
|
161
|
+
/** Max offline documents allowed. */
|
|
162
|
+
maxDocuments: number;
|
|
163
|
+
/** Total bytes stored across all offline documents. */
|
|
164
|
+
totalSizeBytes: number;
|
|
165
|
+
totalSizeFormatted: string;
|
|
166
|
+
/** Per-document offline storage details. */
|
|
167
|
+
documents: Array<{
|
|
168
|
+
documentId: string;
|
|
169
|
+
pageId: string;
|
|
170
|
+
stateSizeBytes: number;
|
|
171
|
+
stateSizeFormatted: string;
|
|
172
|
+
localUpdatedAt: string;
|
|
173
|
+
lastPersistedAt: string | null;
|
|
174
|
+
/** Whether this document has been persisted to Supabase since last local edit. */
|
|
175
|
+
syncedWithRemote: boolean;
|
|
176
|
+
}>;
|
|
177
|
+
};
|
|
178
|
+
/** Pending crash-recovery updates per active document. */
|
|
179
|
+
pendingUpdates: Array<{
|
|
180
|
+
documentId: string;
|
|
181
|
+
updateCount: number;
|
|
182
|
+
}>;
|
|
183
|
+
/** Total pending updates across all documents. */
|
|
184
|
+
totalPendingUpdates: number;
|
|
185
|
+
};
|
|
123
186
|
/** Engine configuration summary */
|
|
124
187
|
config: {
|
|
125
188
|
tableCount: number;
|
|
@@ -145,6 +208,18 @@ export interface DiagnosticsSnapshot {
|
|
|
145
208
|
* ```
|
|
146
209
|
*/
|
|
147
210
|
export declare function getDiagnostics(): Promise<DiagnosticsSnapshot>;
|
|
211
|
+
/**
|
|
212
|
+
* Get CRDT subsystem diagnostics (async — reads IndexedDB for offline and pending data).
|
|
213
|
+
*
|
|
214
|
+
* Returns a comprehensive snapshot of the CRDT subsystem including active documents,
|
|
215
|
+
* their state sizes, connection states, collaborator counts, offline storage usage,
|
|
216
|
+
* and pending crash-recovery updates.
|
|
217
|
+
*
|
|
218
|
+
* If CRDT is not enabled, returns a minimal object with `enabled: false`.
|
|
219
|
+
*
|
|
220
|
+
* @returns CRDT diagnostics section of the {@link DiagnosticsSnapshot}.
|
|
221
|
+
*/
|
|
222
|
+
export declare function getCRDTDiagnostics(): Promise<DiagnosticsSnapshot['crdt']>;
|
|
148
223
|
/**
|
|
149
224
|
* Get sync cycle and egress diagnostics (synchronous).
|
|
150
225
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/diagnostics.js
CHANGED
|
@@ -33,6 +33,11 @@ import { syncStatusStore } from './stores/sync';
|
|
|
33
33
|
import { isOnline } from './stores/network';
|
|
34
34
|
import { formatBytes } from './utils';
|
|
35
35
|
import { get } from 'svelte/store';
|
|
36
|
+
import { isCRDTEnabled, getCRDTConfig } from './crdt/config';
|
|
37
|
+
import { getActiveProviderEntries } from './crdt/provider';
|
|
38
|
+
import { getOfflineDocuments, loadPendingUpdates } from './crdt/store';
|
|
39
|
+
import { getCollaborators } from './crdt/awareness';
|
|
40
|
+
import { encodeStateAsUpdate } from 'yjs';
|
|
36
41
|
// =============================================================================
|
|
37
42
|
// Main Diagnostics Function
|
|
38
43
|
// =============================================================================
|
|
@@ -57,9 +62,10 @@ export async function getDiagnostics() {
|
|
|
57
62
|
const realtimeState = _getRealtimeDiagnostics();
|
|
58
63
|
const syncState = get(syncStatusStore);
|
|
59
64
|
// Run async operations in parallel
|
|
60
|
-
const [queueData, conflictData] = await Promise.all([
|
|
65
|
+
const [queueData, conflictData, crdtData] = await Promise.all([
|
|
61
66
|
getQueueDiagnostics(),
|
|
62
|
-
getConflictDiagnostics()
|
|
67
|
+
getConflictDiagnostics(),
|
|
68
|
+
getCRDTDiagnostics()
|
|
63
69
|
]);
|
|
64
70
|
// Build egress section with formatted values
|
|
65
71
|
const egressByTable = {};
|
|
@@ -115,6 +121,7 @@ export async function getDiagnostics() {
|
|
|
115
121
|
authValidatedAfterReconnect: engineState.authValidatedAfterReconnect
|
|
116
122
|
},
|
|
117
123
|
conflicts: conflictData,
|
|
124
|
+
crdt: crdtData,
|
|
118
125
|
errors: getErrorDiagnostics(),
|
|
119
126
|
config: {
|
|
120
127
|
tableCount: config.tables.length,
|
|
@@ -126,6 +133,111 @@ export async function getDiagnostics() {
|
|
|
126
133
|
};
|
|
127
134
|
}
|
|
128
135
|
// =============================================================================
|
|
136
|
+
// CRDT Diagnostics
|
|
137
|
+
// =============================================================================
|
|
138
|
+
/**
|
|
139
|
+
* Get CRDT subsystem diagnostics (async — reads IndexedDB for offline and pending data).
|
|
140
|
+
*
|
|
141
|
+
* Returns a comprehensive snapshot of the CRDT subsystem including active documents,
|
|
142
|
+
* their state sizes, connection states, collaborator counts, offline storage usage,
|
|
143
|
+
* and pending crash-recovery updates.
|
|
144
|
+
*
|
|
145
|
+
* If CRDT is not enabled, returns a minimal object with `enabled: false`.
|
|
146
|
+
*
|
|
147
|
+
* @returns CRDT diagnostics section of the {@link DiagnosticsSnapshot}.
|
|
148
|
+
*/
|
|
149
|
+
export async function getCRDTDiagnostics() {
|
|
150
|
+
if (!isCRDTEnabled()) {
|
|
151
|
+
return {
|
|
152
|
+
enabled: false,
|
|
153
|
+
config: null,
|
|
154
|
+
activeDocuments: [],
|
|
155
|
+
activeDocumentCount: 0,
|
|
156
|
+
offline: {
|
|
157
|
+
documentCount: 0,
|
|
158
|
+
maxDocuments: 0,
|
|
159
|
+
totalSizeBytes: 0,
|
|
160
|
+
totalSizeFormatted: '0 B',
|
|
161
|
+
documents: []
|
|
162
|
+
},
|
|
163
|
+
pendingUpdates: [],
|
|
164
|
+
totalPendingUpdates: 0
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const config = getCRDTConfig();
|
|
168
|
+
/* Gather active document diagnostics. */
|
|
169
|
+
const activeDocuments = [];
|
|
170
|
+
const entries = getActiveProviderEntries();
|
|
171
|
+
/* Collect documentIds for pending update queries. */
|
|
172
|
+
const activeDocumentIds = [];
|
|
173
|
+
for (const [documentId, provider] of entries) {
|
|
174
|
+
activeDocumentIds.push(documentId);
|
|
175
|
+
/* Get Y.Doc state size (encode to measure byte length). */
|
|
176
|
+
const state = encodeStateAsUpdate(provider.doc);
|
|
177
|
+
const stateSizeBytes = state.byteLength;
|
|
178
|
+
/* Get collaborators for this document. */
|
|
179
|
+
const collaborators = getCollaborators(documentId);
|
|
180
|
+
activeDocuments.push({
|
|
181
|
+
documentId: provider.documentId,
|
|
182
|
+
pageId: provider.pageId,
|
|
183
|
+
connectionState: provider.connectionState,
|
|
184
|
+
isDirty: provider.isDirty,
|
|
185
|
+
stateSizeBytes,
|
|
186
|
+
stateSizeFormatted: formatBytes(stateSizeBytes),
|
|
187
|
+
collaboratorCount: collaborators.length,
|
|
188
|
+
collaboratorNames: collaborators.map((c) => c.name)
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/* Gather pending updates for each active document. */
|
|
192
|
+
const pendingUpdatesResults = await Promise.all(activeDocumentIds.map(async (documentId) => {
|
|
193
|
+
const updates = await loadPendingUpdates(documentId);
|
|
194
|
+
return { documentId, updateCount: updates.length };
|
|
195
|
+
}));
|
|
196
|
+
const pendingUpdates = pendingUpdatesResults.filter((p) => p.updateCount > 0);
|
|
197
|
+
const totalPendingUpdates = pendingUpdates.reduce((sum, p) => sum + p.updateCount, 0);
|
|
198
|
+
/* Gather offline document diagnostics. */
|
|
199
|
+
const offlineDocs = await getOfflineDocuments();
|
|
200
|
+
let offlineTotalSize = 0;
|
|
201
|
+
const offlineDocDetails = offlineDocs.map((doc) => {
|
|
202
|
+
offlineTotalSize += doc.stateSize;
|
|
203
|
+
return {
|
|
204
|
+
documentId: doc.documentId,
|
|
205
|
+
pageId: doc.pageId,
|
|
206
|
+
stateSizeBytes: doc.stateSize,
|
|
207
|
+
stateSizeFormatted: formatBytes(doc.stateSize),
|
|
208
|
+
localUpdatedAt: doc.localUpdatedAt,
|
|
209
|
+
lastPersistedAt: doc.lastPersistedAt,
|
|
210
|
+
syncedWithRemote: doc.lastPersistedAt !== null && doc.lastPersistedAt >= doc.localUpdatedAt
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
return {
|
|
214
|
+
enabled: true,
|
|
215
|
+
config: {
|
|
216
|
+
supabaseTable: config.supabaseTable,
|
|
217
|
+
persistIntervalMs: config.persistIntervalMs,
|
|
218
|
+
broadcastDebounceMs: config.broadcastDebounceMs,
|
|
219
|
+
localSaveDebounceMs: config.localSaveDebounceMs,
|
|
220
|
+
cursorDebounceMs: config.cursorDebounceMs,
|
|
221
|
+
maxOfflineDocuments: config.maxOfflineDocuments,
|
|
222
|
+
maxBroadcastPayloadBytes: config.maxBroadcastPayloadBytes,
|
|
223
|
+
syncPeerTimeoutMs: config.syncPeerTimeoutMs,
|
|
224
|
+
maxReconnectAttempts: config.maxReconnectAttempts,
|
|
225
|
+
reconnectBaseDelayMs: config.reconnectBaseDelayMs
|
|
226
|
+
},
|
|
227
|
+
activeDocuments,
|
|
228
|
+
activeDocumentCount: activeDocuments.length,
|
|
229
|
+
offline: {
|
|
230
|
+
documentCount: offlineDocs.length,
|
|
231
|
+
maxDocuments: config.maxOfflineDocuments,
|
|
232
|
+
totalSizeBytes: offlineTotalSize,
|
|
233
|
+
totalSizeFormatted: formatBytes(offlineTotalSize),
|
|
234
|
+
documents: offlineDocDetails
|
|
235
|
+
},
|
|
236
|
+
pendingUpdates,
|
|
237
|
+
totalPendingUpdates
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
// =============================================================================
|
|
129
241
|
// Sub-Category Diagnostics Functions
|
|
130
242
|
// =============================================================================
|
|
131
243
|
/**
|
package/dist/diagnostics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAgLH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAW7D;AAuCD,uDAAuD;AACvD,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAgLD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB;;;;;;uBAxLF,MAAM;yBAAW,MAAM;;;oBAF5C,MAAM;sBACJ,MAAM;sBAEN,MAAM;;;;;;;;;;;;EAuMrB;AAgLD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAO/D;AAuCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAcvC;AAm8BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,GAAE,OAAe,EACtB,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CA2Mf;AAolBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAwYrD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DpD;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAgLH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAW7D;AAuCD,uDAAuD;AACvD,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAgLD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB;;;;;;uBAxLF,MAAM;yBAAW,MAAM;;;oBAF5C,MAAM;sBACJ,MAAM;sBAEN,MAAM;;;;;;;;;;;;EAuMrB;AAgLD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAO/D;AAuCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAcvC;AAm8BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,GAAE,OAAe,EACtB,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CA2Mf;AAolBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAwYrD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DpD;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAkDrD"}
|
package/dist/engine.js
CHANGED
|
@@ -2596,14 +2596,34 @@ export async function clearLocalCache() {
|
|
|
2596
2596
|
const db = config.db;
|
|
2597
2597
|
// Get user ID before clearing to remove their sync cursor
|
|
2598
2598
|
const userId = await getCurrentUserId();
|
|
2599
|
+
/*
|
|
2600
|
+
* Close all active CRDT documents before clearing the cache.
|
|
2601
|
+
* This ensures documents are properly saved and channels are cleaned up.
|
|
2602
|
+
* Uses a dynamic import to avoid circular dependency (engine ↔ crdt).
|
|
2603
|
+
*/
|
|
2604
|
+
if (config.crdt) {
|
|
2605
|
+
try {
|
|
2606
|
+
const { closeAllDocuments } = await import('./crdt/provider');
|
|
2607
|
+
await closeAllDocuments();
|
|
2608
|
+
}
|
|
2609
|
+
catch {
|
|
2610
|
+
/* CRDT module may not be available — non-critical. */
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2599
2613
|
const entityTables = config.tables.map((t) => db.table(getDexieTableFor(t)));
|
|
2600
2614
|
const metaTables = [db.table('syncQueue'), db.table('conflictHistory')];
|
|
2601
|
-
|
|
2615
|
+
/* Include CRDT tables if the subsystem is enabled. */
|
|
2616
|
+
const crdtTables = config.crdt ? [db.table('crdtDocuments'), db.table('crdtPendingUpdates')] : [];
|
|
2617
|
+
await db.transaction('rw', [...entityTables, ...metaTables, ...crdtTables], async () => {
|
|
2602
2618
|
for (const t of entityTables) {
|
|
2603
2619
|
await t.clear();
|
|
2604
2620
|
}
|
|
2605
2621
|
await db.table('syncQueue').clear();
|
|
2606
2622
|
await db.table('conflictHistory').clear();
|
|
2623
|
+
/* Clear CRDT tables if enabled. */
|
|
2624
|
+
for (const t of crdtTables) {
|
|
2625
|
+
await t.clear();
|
|
2626
|
+
}
|
|
2607
2627
|
});
|
|
2608
2628
|
// Reset sync cursor (user-specific) and hydration flag
|
|
2609
2629
|
if (typeof localStorage !== 'undefined') {
|