@lark-sh/client 0.1.13 → 0.1.14

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.
@@ -0,0 +1,459 @@
1
+ import {
2
+ DataSnapshot,
3
+ LarkDatabase,
4
+ LarkError,
5
+ OnDisconnect,
6
+ PendingWriteManager,
7
+ ServerValue,
8
+ generatePushId,
9
+ isVolatilePath
10
+ } from "../chunk-EK7OYLDG.mjs";
11
+
12
+ // src/fb-v8/index.ts
13
+ var DatabaseReference = class _DatabaseReference {
14
+ constructor(db, modernRef) {
15
+ this._db = db;
16
+ this._modernRef = modernRef;
17
+ }
18
+ // ============================================
19
+ // Properties (delegated)
20
+ // ============================================
21
+ get path() {
22
+ return this._modernRef.path;
23
+ }
24
+ get key() {
25
+ return this._modernRef.key;
26
+ }
27
+ get parent() {
28
+ const modernParent = this._modernRef.parent;
29
+ if (!modernParent) return null;
30
+ return new _DatabaseReference(this._db, modernParent);
31
+ }
32
+ get root() {
33
+ return new _DatabaseReference(this._db, this._modernRef.root);
34
+ }
35
+ get database() {
36
+ return this._db;
37
+ }
38
+ /**
39
+ * Get the underlying reference for a query.
40
+ * For queries, returns a reference without query constraints.
41
+ */
42
+ get ref() {
43
+ return new _DatabaseReference(this._db, this._modernRef.ref);
44
+ }
45
+ get queryIdentifier() {
46
+ return this._modernRef.queryIdentifier;
47
+ }
48
+ // ============================================
49
+ // Navigation
50
+ // ============================================
51
+ child(path) {
52
+ return new _DatabaseReference(this._db, this._modernRef.child(path));
53
+ }
54
+ // ============================================
55
+ // Write Operations (delegated)
56
+ // ============================================
57
+ async set(value) {
58
+ return this._modernRef.set(value);
59
+ }
60
+ async update(values) {
61
+ return this._modernRef.update(values);
62
+ }
63
+ async remove() {
64
+ return this._modernRef.remove();
65
+ }
66
+ push(value) {
67
+ const modernThenable = value === void 0 ? this._modernRef.push() : this._modernRef.push(value);
68
+ return new ThenableReference(this._db, modernThenable);
69
+ }
70
+ async setWithPriority(value, priority) {
71
+ return this._modernRef.setWithPriority(value, priority);
72
+ }
73
+ setPriority(priority) {
74
+ return this._modernRef.setPriority(priority);
75
+ }
76
+ async transaction(updateFunction, maxRetries) {
77
+ return this._modernRef.transaction(updateFunction, maxRetries);
78
+ }
79
+ // ============================================
80
+ // Read Operations
81
+ // ============================================
82
+ async get() {
83
+ return this._modernRef.get();
84
+ }
85
+ once(eventType = "value", successCallback, cancelCallback, context) {
86
+ const promise = this._modernRef.once(eventType);
87
+ if (successCallback) {
88
+ const boundCallback = context ? successCallback.bind(context) : successCallback;
89
+ promise.then(
90
+ (snapshot) => boundCallback(snapshot),
91
+ (error) => {
92
+ if (cancelCallback) {
93
+ const boundCancel = context ? cancelCallback.bind(context) : cancelCallback;
94
+ boundCancel(error);
95
+ }
96
+ }
97
+ );
98
+ }
99
+ return promise;
100
+ }
101
+ // ============================================
102
+ // Subscriptions (Firebase v8 style)
103
+ // ============================================
104
+ /**
105
+ * Subscribe to events at this location.
106
+ *
107
+ * **Firebase v8 behavior**: Returns the callback function (not an unsubscribe function).
108
+ * Use `off(eventType, callback, context?)` to remove the listener.
109
+ *
110
+ * Note: Callbacks are tracked globally by path, so off() on any ref at the same
111
+ * path can remove this callback by reference.
112
+ *
113
+ * @param eventType - The event type to listen for
114
+ * @param callback - The callback to invoke
115
+ * @param cancelCallbackOrContext - Optional cancel callback or context
116
+ * @param context - Optional context to bind `this` in callback
117
+ * @returns The callback function (for use with off())
118
+ */
119
+ on(eventType, callback, cancelCallbackOrContext, context) {
120
+ let cancelCallback;
121
+ let actualContext;
122
+ if (typeof cancelCallbackOrContext === "function") {
123
+ cancelCallback = cancelCallbackOrContext;
124
+ actualContext = context;
125
+ } else {
126
+ actualContext = cancelCallbackOrContext;
127
+ }
128
+ const boundCallback = actualContext ? callback.bind(actualContext) : callback;
129
+ const unsubscribe = this._modernRef.on(eventType, boundCallback);
130
+ this._db._registerCallback(this.path, this.queryIdentifier, eventType, callback, actualContext, unsubscribe);
131
+ return callback;
132
+ }
133
+ /**
134
+ * Unsubscribe from events.
135
+ *
136
+ * **Firebase v8 behavior**: Can remove specific listeners by callback reference.
137
+ *
138
+ * - `off()` - removes all listeners on this specific query (or all queries if base ref)
139
+ * - `off('value')` - removes all 'value' listeners on this specific query
140
+ * - `off('value', callback)` - removes callback (any context) from ANY query at this path
141
+ * - `off('value', callback, context)` - removes specific callback+context combo
142
+ */
143
+ off(eventType, callback, context) {
144
+ this._db._unregisterCallback(this.path, this.queryIdentifier, eventType, callback, context);
145
+ }
146
+ // ============================================
147
+ // OnDisconnect
148
+ // ============================================
149
+ onDisconnect() {
150
+ return this._modernRef.onDisconnect();
151
+ }
152
+ // ============================================
153
+ // Query Modifiers
154
+ // ============================================
155
+ orderByKey() {
156
+ return new _DatabaseReference(this._db, this._modernRef.orderByKey());
157
+ }
158
+ orderByPriority() {
159
+ return new _DatabaseReference(this._db, this._modernRef.orderByPriority());
160
+ }
161
+ orderByChild(path) {
162
+ return new _DatabaseReference(this._db, this._modernRef.orderByChild(path));
163
+ }
164
+ orderByValue() {
165
+ return new _DatabaseReference(this._db, this._modernRef.orderByValue());
166
+ }
167
+ limitToFirst(limit) {
168
+ return new _DatabaseReference(this._db, this._modernRef.limitToFirst(limit));
169
+ }
170
+ limitToLast(limit) {
171
+ return new _DatabaseReference(this._db, this._modernRef.limitToLast(limit));
172
+ }
173
+ startAt(value, key) {
174
+ return new _DatabaseReference(this._db, this._modernRef.startAt(value, key));
175
+ }
176
+ startAfter(value, key) {
177
+ return new _DatabaseReference(this._db, this._modernRef.startAfter(value, key));
178
+ }
179
+ endAt(value, key) {
180
+ return new _DatabaseReference(this._db, this._modernRef.endAt(value, key));
181
+ }
182
+ endBefore(value, key) {
183
+ return new _DatabaseReference(this._db, this._modernRef.endBefore(value, key));
184
+ }
185
+ equalTo(value, key) {
186
+ return new _DatabaseReference(this._db, this._modernRef.equalTo(value, key));
187
+ }
188
+ // ============================================
189
+ // Utility
190
+ // ============================================
191
+ isEqual(other) {
192
+ if (!other) return false;
193
+ return this._modernRef.isEqual(other._modernRef);
194
+ }
195
+ toString() {
196
+ return this._modernRef.toString();
197
+ }
198
+ toJSON() {
199
+ return this._modernRef.toJSON();
200
+ }
201
+ };
202
+ var ThenableReference = class extends DatabaseReference {
203
+ constructor(db, modernThenable) {
204
+ super(db, modernThenable);
205
+ this._modernThenable = modernThenable;
206
+ }
207
+ then(onfulfilled, onrejected) {
208
+ return this._modernThenable.then(
209
+ onfulfilled ? (ref) => onfulfilled(new DatabaseReference(this.database, ref)) : void 0,
210
+ onrejected
211
+ );
212
+ }
213
+ catch(onrejected) {
214
+ return this._modernThenable.catch(onrejected).then(
215
+ (ref) => new DatabaseReference(this.database, ref)
216
+ );
217
+ }
218
+ };
219
+ var LarkDatabase2 = class {
220
+ constructor() {
221
+ /**
222
+ * Global callback registry for Firebase v8 compatibility.
223
+ * Structure: path -> eventType -> callback -> unsubscribe function
224
+ */
225
+ this._callbackRegistry = /* @__PURE__ */ new Map();
226
+ this._modernDb = new LarkDatabase();
227
+ }
228
+ // ============================================
229
+ // Internal: Callback Registry Management
230
+ // ============================================
231
+ /**
232
+ * @internal Register a callback in the global registry.
233
+ */
234
+ _registerCallback(path, queryId, eventType, callback, context, unsubscribe) {
235
+ if (!this._callbackRegistry.has(path)) {
236
+ this._callbackRegistry.set(path, /* @__PURE__ */ new Map());
237
+ }
238
+ const pathMap = this._callbackRegistry.get(path);
239
+ if (!pathMap.has(queryId)) {
240
+ pathMap.set(queryId, /* @__PURE__ */ new Map());
241
+ }
242
+ const queryMap = pathMap.get(queryId);
243
+ if (!queryMap.has(eventType)) {
244
+ queryMap.set(eventType, []);
245
+ }
246
+ const registrations = queryMap.get(eventType);
247
+ registrations.push({ callback, context, unsubscribe });
248
+ }
249
+ /**
250
+ * @internal Unregister callbacks from the global registry.
251
+ *
252
+ * Behavior:
253
+ * - With callback+context: Finds and removes that specific callback+context combo from ANY query
254
+ * - With callback only: Removes ALL registrations of that callback (any context) from ANY query
255
+ * - Without callback: Removes all callbacks from the specified query only
256
+ * - If queryId is 'default' (base ref), removes from ALL queries at the path
257
+ */
258
+ _unregisterCallback(path, queryId, eventType, callback, context) {
259
+ const pathMap = this._callbackRegistry.get(path);
260
+ if (!pathMap) return;
261
+ if (callback) {
262
+ const hasContext = arguments.length >= 5;
263
+ for (const [qId, queryMap] of pathMap) {
264
+ const eventTypes = eventType ? [eventType] : Array.from(queryMap.keys());
265
+ for (const eType of eventTypes) {
266
+ const registrations = queryMap.get(eType);
267
+ if (!registrations) continue;
268
+ const indicesToRemove = [];
269
+ for (let i = 0; i < registrations.length; i++) {
270
+ const reg = registrations[i];
271
+ if (reg.callback === callback) {
272
+ if (!hasContext || reg.context === context) {
273
+ indicesToRemove.push(i);
274
+ }
275
+ }
276
+ }
277
+ for (let i = indicesToRemove.length - 1; i >= 0; i--) {
278
+ const idx = indicesToRemove[i];
279
+ registrations[idx].unsubscribe();
280
+ registrations.splice(idx, 1);
281
+ }
282
+ if (registrations.length === 0) {
283
+ queryMap.delete(eType);
284
+ }
285
+ }
286
+ this._cleanupEmptyMaps(path, qId);
287
+ }
288
+ return;
289
+ }
290
+ const isBaseRef = queryId === "default";
291
+ if (isBaseRef) {
292
+ if (!eventType) {
293
+ for (const [, queryMap] of pathMap) {
294
+ for (const [, registrations] of queryMap) {
295
+ for (const reg of registrations) {
296
+ reg.unsubscribe();
297
+ }
298
+ }
299
+ }
300
+ this._callbackRegistry.delete(path);
301
+ } else {
302
+ for (const [qId, queryMap] of pathMap) {
303
+ const registrations = queryMap.get(eventType);
304
+ if (registrations) {
305
+ for (const reg of registrations) {
306
+ reg.unsubscribe();
307
+ }
308
+ queryMap.delete(eventType);
309
+ this._cleanupEmptyMaps(path, qId);
310
+ }
311
+ }
312
+ }
313
+ } else {
314
+ const queryMap = pathMap.get(queryId);
315
+ if (!queryMap) return;
316
+ if (!eventType) {
317
+ for (const [, registrations] of queryMap) {
318
+ for (const reg of registrations) {
319
+ reg.unsubscribe();
320
+ }
321
+ }
322
+ pathMap.delete(queryId);
323
+ if (pathMap.size === 0) {
324
+ this._callbackRegistry.delete(path);
325
+ }
326
+ } else {
327
+ const registrations = queryMap.get(eventType);
328
+ if (registrations) {
329
+ for (const reg of registrations) {
330
+ reg.unsubscribe();
331
+ }
332
+ queryMap.delete(eventType);
333
+ this._cleanupEmptyMaps(path, queryId);
334
+ }
335
+ }
336
+ }
337
+ }
338
+ /**
339
+ * @internal Clean up empty nested maps in the registry.
340
+ */
341
+ _cleanupEmptyMaps(path, queryId) {
342
+ const pathMap = this._callbackRegistry.get(path);
343
+ if (!pathMap) return;
344
+ if (queryId) {
345
+ const queryMap = pathMap.get(queryId);
346
+ if (queryMap && queryMap.size === 0) {
347
+ pathMap.delete(queryId);
348
+ }
349
+ }
350
+ if (pathMap.size === 0) {
351
+ this._callbackRegistry.delete(path);
352
+ }
353
+ }
354
+ // ============================================
355
+ // Connection State (delegated)
356
+ // ============================================
357
+ get connected() {
358
+ return this._modernDb.connected;
359
+ }
360
+ get reconnecting() {
361
+ return this._modernDb.reconnecting;
362
+ }
363
+ get state() {
364
+ return this._modernDb.state;
365
+ }
366
+ get auth() {
367
+ return this._modernDb.auth;
368
+ }
369
+ get volatilePaths() {
370
+ return this._modernDb.volatilePaths;
371
+ }
372
+ get transportType() {
373
+ return this._modernDb.transportType;
374
+ }
375
+ get serverTimeOffset() {
376
+ return this._modernDb.serverTimeOffset;
377
+ }
378
+ hasPendingWrites() {
379
+ return this._modernDb.hasPendingWrites();
380
+ }
381
+ getPendingWriteCount() {
382
+ return this._modernDb.getPendingWriteCount();
383
+ }
384
+ clearPendingWrites() {
385
+ this._modernDb.clearPendingWrites();
386
+ }
387
+ // ============================================
388
+ // Connection Management (delegated)
389
+ // ============================================
390
+ async connect(databaseId, options) {
391
+ return this._modernDb.connect(databaseId, options);
392
+ }
393
+ async disconnect() {
394
+ this._callbackRegistry.clear();
395
+ return this._modernDb.disconnect();
396
+ }
397
+ goOffline() {
398
+ this._modernDb.goOffline();
399
+ }
400
+ goOnline() {
401
+ this._modernDb.goOnline();
402
+ }
403
+ // ============================================
404
+ // Reference Access
405
+ // ============================================
406
+ /**
407
+ * Get a Firebase v8 compatible reference to a path.
408
+ */
409
+ ref(path = "") {
410
+ return new DatabaseReference(this, this._modernDb.ref(path));
411
+ }
412
+ // ============================================
413
+ // Transactions (delegated)
414
+ // ============================================
415
+ async transaction(operations) {
416
+ return this._modernDb.transaction(operations);
417
+ }
418
+ // ============================================
419
+ // Connection Events (delegated)
420
+ // ============================================
421
+ onConnect(callback) {
422
+ return this._modernDb.onConnect(callback);
423
+ }
424
+ onDisconnect(callback) {
425
+ return this._modernDb.onDisconnect(callback);
426
+ }
427
+ onError(callback) {
428
+ return this._modernDb.onError(callback);
429
+ }
430
+ onReconnecting(callback) {
431
+ return this._modernDb.onReconnecting(callback);
432
+ }
433
+ onAuthStateChanged(callback) {
434
+ return this._modernDb.onAuthStateChanged(callback);
435
+ }
436
+ // ============================================
437
+ // Authentication Management (delegated)
438
+ // ============================================
439
+ async signIn(token) {
440
+ return this._modernDb.signIn(token);
441
+ }
442
+ async signOut() {
443
+ return this._modernDb.signOut();
444
+ }
445
+ };
446
+ LarkDatabase2.ServerValue = ServerValue;
447
+ export {
448
+ DataSnapshot,
449
+ DatabaseReference,
450
+ LarkDatabase2 as LarkDatabase,
451
+ LarkError,
452
+ OnDisconnect,
453
+ PendingWriteManager,
454
+ ServerValue,
455
+ ThenableReference,
456
+ generatePushId,
457
+ isVolatilePath
458
+ };
459
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/fb-v8/index.ts"],"sourcesContent":["/**\n * Firebase v8 Compatibility Layer\n *\n * This module provides Firebase v8-style behavior for users migrating from Firebase.\n *\n * Key differences from modern API:\n * 1. on() returns the callback (not an unsubscribe function)\n * 2. off(eventType, callback, context?) removes specific listener by callback reference\n * 3. once(eventType, successCallback, cancelCallback, context?) supports callback style\n * 4. Context parameter binds `this` inside callbacks\n *\n * @example\n * ```typescript\n * import { LarkDatabase, DatabaseReference } from '@lark-sh/client/fb-v8';\n *\n * const db = new LarkDatabase();\n * await db.connect('project/database', { anonymous: true });\n *\n * const ref = db.ref('players');\n * const callback = ref.on('value', (snap) => console.log(snap.val()));\n * // callback === the function you passed in\n *\n * // Later: remove by callback reference (works from any ref at same path)\n * ref.off('value', callback);\n *\n * // With context (binds `this`):\n * ref.on('value', this.handleValue, this);\n * ref.off('value', this.handleValue, this);\n * ```\n */\n\nimport {\n LarkDatabase as ModernLarkDatabase,\n DatabaseReference as ModernDatabaseReference,\n ThenableReference as ModernThenableReference,\n DataSnapshot,\n OnDisconnect,\n LarkError,\n ConnectOptions,\n AuthInfo,\n TransactionOp,\n TransactionSetOp,\n TransactionUpdateOp,\n TransactionDeleteOp,\n TransactionConditionOp,\n TransactionObject,\n SnapshotCallback,\n QueryState,\n TransactionResult,\n ServerValue,\n generatePushId,\n isVolatilePath,\n PendingWriteManager,\n} from '../index';\nimport type { EventType } from '../protocol/constants';\nimport type { QueryParams } from '../protocol/messages';\nimport type { TransportType } from '../connection/createTransport';\n\n/**\n * A single callback registration with optional context.\n */\ninterface CallbackRegistration {\n callback: SnapshotCallback;\n context: unknown;\n unsubscribe: () => void;\n}\n\n/**\n * Global callback registry for Firebase v8 compatibility.\n * In Firebase v8, callbacks are tracked at the path+query level.\n * The same callback can be registered multiple times with different contexts.\n *\n * Structure: path -> queryIdentifier -> eventType -> CallbackRegistration[]\n */\ntype CallbackRegistry = Map<string, Map<string, Map<string, CallbackRegistration[]>>>;\n\n/**\n * Firebase v8 compatible DatabaseReference.\n * Wraps the modern DatabaseReference with v8-style on/off behavior.\n */\nexport class DatabaseReference {\n private readonly _modernRef: ModernDatabaseReference;\n private readonly _db: LarkDatabase;\n\n constructor(db: LarkDatabase, modernRef: ModernDatabaseReference) {\n this._db = db;\n this._modernRef = modernRef;\n }\n\n // ============================================\n // Properties (delegated)\n // ============================================\n\n get path(): string {\n return this._modernRef.path;\n }\n\n get key(): string | null {\n return this._modernRef.key;\n }\n\n get parent(): DatabaseReference | null {\n const modernParent = this._modernRef.parent;\n if (!modernParent) return null;\n return new DatabaseReference(this._db, modernParent);\n }\n\n get root(): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.root);\n }\n\n get database(): LarkDatabase {\n return this._db;\n }\n\n /**\n * Get the underlying reference for a query.\n * For queries, returns a reference without query constraints.\n */\n get ref(): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.ref);\n }\n\n get queryIdentifier(): string {\n return this._modernRef.queryIdentifier;\n }\n\n // ============================================\n // Navigation\n // ============================================\n\n child(path: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.child(path));\n }\n\n // ============================================\n // Write Operations (delegated)\n // ============================================\n\n async set(value: unknown): Promise<void> {\n return this._modernRef.set(value);\n }\n\n async update(values: Record<string, unknown>): Promise<void> {\n return this._modernRef.update(values);\n }\n\n async remove(): Promise<void> {\n return this._modernRef.remove();\n }\n\n push(): ThenableReference;\n push(value: unknown): ThenableReference;\n push(value?: unknown): ThenableReference {\n const modernThenable = value === undefined\n ? this._modernRef.push()\n : this._modernRef.push(value);\n return new ThenableReference(this._db, modernThenable);\n }\n\n async setWithPriority(value: unknown, priority: number | string): Promise<void> {\n return this._modernRef.setWithPriority(value, priority);\n }\n\n setPriority(priority: number | string | null): Promise<void> {\n return this._modernRef.setPriority(priority);\n }\n\n async transaction(\n updateFunction: (currentValue: unknown) => unknown,\n maxRetries?: number\n ): Promise<TransactionResult> {\n return this._modernRef.transaction(updateFunction, maxRetries);\n }\n\n // ============================================\n // Read Operations\n // ============================================\n\n async get(): Promise<DataSnapshot> {\n return this._modernRef.get();\n }\n\n /**\n * Read data once.\n *\n * Supports both promise style and Firebase v8 callback style:\n * - `once('value')` - returns Promise<DataSnapshot>\n * - `once('value', callback)` - calls callback with snapshot, returns Promise\n * - `once('value', callback, cancelCallback)` - also handles errors\n * - `once('value', callback, cancelCallback, context)` - binds `this` to context\n */\n once(eventType?: EventType): Promise<DataSnapshot>;\n once(\n eventType: EventType,\n successCallback: SnapshotCallback,\n cancelCallback?: (error: Error) => void,\n context?: unknown\n ): Promise<DataSnapshot>;\n once(\n eventType: EventType = 'value',\n successCallback?: SnapshotCallback,\n cancelCallback?: (error: Error) => void,\n context?: unknown\n ): Promise<DataSnapshot> {\n const promise = this._modernRef.once(eventType);\n\n if (successCallback) {\n // Firebase v8 callback style - bind context if provided\n const boundCallback = context ? successCallback.bind(context) : successCallback;\n promise.then(\n (snapshot) => boundCallback(snapshot),\n (error) => {\n if (cancelCallback) {\n const boundCancel = context ? cancelCallback.bind(context) : cancelCallback;\n boundCancel(error);\n }\n }\n );\n }\n\n return promise;\n }\n\n // ============================================\n // Subscriptions (Firebase v8 style)\n // ============================================\n\n /**\n * Subscribe to events at this location.\n *\n * **Firebase v8 behavior**: Returns the callback function (not an unsubscribe function).\n * Use `off(eventType, callback, context?)` to remove the listener.\n *\n * Note: Callbacks are tracked globally by path, so off() on any ref at the same\n * path can remove this callback by reference.\n *\n * @param eventType - The event type to listen for\n * @param callback - The callback to invoke\n * @param cancelCallbackOrContext - Optional cancel callback or context\n * @param context - Optional context to bind `this` in callback\n * @returns The callback function (for use with off())\n */\n on(\n eventType: EventType,\n callback: SnapshotCallback,\n cancelCallbackOrContext?: ((error: Error) => void) | unknown,\n context?: unknown\n ): SnapshotCallback {\n // Handle overloaded parameters: on(type, cb, context) or on(type, cb, cancelCb, context)\n let cancelCallback: ((error: Error) => void) | undefined;\n let actualContext: unknown;\n\n if (typeof cancelCallbackOrContext === 'function') {\n cancelCallback = cancelCallbackOrContext as (error: Error) => void;\n actualContext = context;\n } else {\n actualContext = cancelCallbackOrContext;\n }\n\n // Create bound callback if context provided\n const boundCallback = actualContext ? callback.bind(actualContext) : callback;\n\n // Subscribe using modern API with the bound callback\n const unsubscribe = this._modernRef.on(eventType, boundCallback);\n\n // Store in the global callback registry (keyed by path and queryIdentifier)\n // We store the original callback and context so off() can match them\n this._db._registerCallback(this.path, this.queryIdentifier, eventType, callback, actualContext, unsubscribe);\n\n // Return the original callback (Firebase v8 behavior)\n return callback;\n }\n\n /**\n * Unsubscribe from events.\n *\n * **Firebase v8 behavior**: Can remove specific listeners by callback reference.\n *\n * - `off()` - removes all listeners on this specific query (or all queries if base ref)\n * - `off('value')` - removes all 'value' listeners on this specific query\n * - `off('value', callback)` - removes callback (any context) from ANY query at this path\n * - `off('value', callback, context)` - removes specific callback+context combo\n */\n off(eventType?: EventType, callback?: SnapshotCallback, context?: unknown): void {\n this._db._unregisterCallback(this.path, this.queryIdentifier, eventType, callback, context);\n }\n\n // ============================================\n // OnDisconnect\n // ============================================\n\n onDisconnect(): OnDisconnect {\n return this._modernRef.onDisconnect();\n }\n\n // ============================================\n // Query Modifiers\n // ============================================\n\n orderByKey(): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.orderByKey());\n }\n\n orderByPriority(): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.orderByPriority());\n }\n\n orderByChild(path: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.orderByChild(path));\n }\n\n orderByValue(): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.orderByValue());\n }\n\n limitToFirst(limit: number): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.limitToFirst(limit));\n }\n\n limitToLast(limit: number): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.limitToLast(limit));\n }\n\n startAt(value?: unknown, key?: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.startAt(value, key));\n }\n\n startAfter(value?: unknown, key?: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.startAfter(value, key));\n }\n\n endAt(value?: unknown, key?: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.endAt(value, key));\n }\n\n endBefore(value?: unknown, key?: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.endBefore(value, key));\n }\n\n equalTo(value: unknown, key?: string): DatabaseReference {\n return new DatabaseReference(this._db, this._modernRef.equalTo(value, key));\n }\n\n // ============================================\n // Utility\n // ============================================\n\n isEqual(other: DatabaseReference | null): boolean {\n if (!other) return false;\n return this._modernRef.isEqual(other._modernRef);\n }\n\n toString(): string {\n return this._modernRef.toString();\n }\n\n toJSON(): string {\n return this._modernRef.toJSON();\n }\n}\n\n/**\n * Firebase v8 compatible ThenableReference.\n */\nexport class ThenableReference extends DatabaseReference implements PromiseLike<DatabaseReference> {\n private readonly _modernThenable: ModernThenableReference;\n\n constructor(db: LarkDatabase, modernThenable: ModernThenableReference) {\n super(db, modernThenable);\n this._modernThenable = modernThenable;\n }\n\n then<TResult1 = DatabaseReference, TResult2 = never>(\n onfulfilled?: ((value: DatabaseReference) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null\n ): Promise<TResult1 | TResult2> {\n // Wrap the result in our compat DatabaseReference\n return this._modernThenable.then(\n onfulfilled ? (ref) => onfulfilled(new DatabaseReference(this.database, ref)) : undefined,\n onrejected\n );\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null\n ): Promise<DatabaseReference | TResult> {\n return this._modernThenable.catch(onrejected).then(\n (ref) => new DatabaseReference(this.database, ref as ModernDatabaseReference)\n );\n }\n}\n\n/**\n * Firebase v8 compatible LarkDatabase.\n * Returns Firebase v8 compatible references.\n */\nexport class LarkDatabase {\n private readonly _modernDb: ModernLarkDatabase;\n\n /**\n * Global callback registry for Firebase v8 compatibility.\n * Structure: path -> eventType -> callback -> unsubscribe function\n */\n private readonly _callbackRegistry: CallbackRegistry = new Map();\n\n static ServerValue = ServerValue;\n\n constructor() {\n this._modernDb = new ModernLarkDatabase();\n }\n\n // ============================================\n // Internal: Callback Registry Management\n // ============================================\n\n /**\n * @internal Register a callback in the global registry.\n */\n _registerCallback(\n path: string,\n queryId: string,\n eventType: EventType,\n callback: SnapshotCallback,\n context: unknown,\n unsubscribe: () => void\n ): void {\n if (!this._callbackRegistry.has(path)) {\n this._callbackRegistry.set(path, new Map());\n }\n const pathMap = this._callbackRegistry.get(path)!;\n\n if (!pathMap.has(queryId)) {\n pathMap.set(queryId, new Map());\n }\n const queryMap = pathMap.get(queryId)!;\n\n if (!queryMap.has(eventType)) {\n queryMap.set(eventType, []);\n }\n const registrations = queryMap.get(eventType)!;\n\n registrations.push({ callback, context, unsubscribe });\n }\n\n /**\n * @internal Unregister callbacks from the global registry.\n *\n * Behavior:\n * - With callback+context: Finds and removes that specific callback+context combo from ANY query\n * - With callback only: Removes ALL registrations of that callback (any context) from ANY query\n * - Without callback: Removes all callbacks from the specified query only\n * - If queryId is 'default' (base ref), removes from ALL queries at the path\n */\n _unregisterCallback(\n path: string,\n queryId: string,\n eventType?: EventType,\n callback?: SnapshotCallback,\n context?: unknown\n ): void {\n const pathMap = this._callbackRegistry.get(path);\n if (!pathMap) return;\n\n // If a specific callback is provided, search ALL queries at this path\n if (callback) {\n const hasContext = arguments.length >= 5; // context was explicitly passed\n\n for (const [qId, queryMap] of pathMap) {\n const eventTypes = eventType ? [eventType] : Array.from(queryMap.keys());\n\n for (const eType of eventTypes) {\n const registrations = queryMap.get(eType);\n if (!registrations) continue;\n\n // Find matching registrations\n const indicesToRemove: number[] = [];\n for (let i = 0; i < registrations.length; i++) {\n const reg = registrations[i];\n if (reg.callback === callback) {\n // If context was provided, must match; otherwise remove any context\n if (!hasContext || reg.context === context) {\n indicesToRemove.push(i);\n }\n }\n }\n\n // Remove in reverse order to preserve indices\n for (let i = indicesToRemove.length - 1; i >= 0; i--) {\n const idx = indicesToRemove[i];\n registrations[idx].unsubscribe();\n registrations.splice(idx, 1);\n }\n\n // Clean up empty arrays\n if (registrations.length === 0) {\n queryMap.delete(eType);\n }\n }\n\n this._cleanupEmptyMaps(path, qId);\n }\n return;\n }\n\n // No specific callback - remove based on queryId\n const isBaseRef = queryId === 'default';\n\n if (isBaseRef) {\n // Base ref: remove from ALL queries at this path\n if (!eventType) {\n // off() - remove everything at this path\n for (const [, queryMap] of pathMap) {\n for (const [, registrations] of queryMap) {\n for (const reg of registrations) {\n reg.unsubscribe();\n }\n }\n }\n this._callbackRegistry.delete(path);\n } else {\n // off('value') - remove all 'value' listeners from all queries\n for (const [qId, queryMap] of pathMap) {\n const registrations = queryMap.get(eventType);\n if (registrations) {\n for (const reg of registrations) {\n reg.unsubscribe();\n }\n queryMap.delete(eventType);\n this._cleanupEmptyMaps(path, qId);\n }\n }\n }\n } else {\n // Query ref: remove only from this specific query\n const queryMap = pathMap.get(queryId);\n if (!queryMap) return;\n\n if (!eventType) {\n // off() on query - remove all listeners for this query\n for (const [, registrations] of queryMap) {\n for (const reg of registrations) {\n reg.unsubscribe();\n }\n }\n pathMap.delete(queryId);\n if (pathMap.size === 0) {\n this._callbackRegistry.delete(path);\n }\n } else {\n // off('value') on query - remove all 'value' listeners for this query\n const registrations = queryMap.get(eventType);\n if (registrations) {\n for (const reg of registrations) {\n reg.unsubscribe();\n }\n queryMap.delete(eventType);\n this._cleanupEmptyMaps(path, queryId);\n }\n }\n }\n }\n\n /**\n * @internal Clean up empty nested maps in the registry.\n */\n private _cleanupEmptyMaps(path: string, queryId?: string): void {\n const pathMap = this._callbackRegistry.get(path);\n if (!pathMap) return;\n\n if (queryId) {\n const queryMap = pathMap.get(queryId);\n if (queryMap && queryMap.size === 0) {\n pathMap.delete(queryId);\n }\n }\n\n if (pathMap.size === 0) {\n this._callbackRegistry.delete(path);\n }\n }\n\n // ============================================\n // Connection State (delegated)\n // ============================================\n\n get connected(): boolean {\n return this._modernDb.connected;\n }\n\n get reconnecting(): boolean {\n return this._modernDb.reconnecting;\n }\n\n get state(): string {\n return this._modernDb.state;\n }\n\n get auth(): AuthInfo | null {\n return this._modernDb.auth;\n }\n\n get volatilePaths(): string[] {\n return this._modernDb.volatilePaths;\n }\n\n get transportType(): 'websocket' | 'webtransport' | null {\n return this._modernDb.transportType;\n }\n\n get serverTimeOffset(): number {\n return this._modernDb.serverTimeOffset;\n }\n\n hasPendingWrites(): boolean {\n return this._modernDb.hasPendingWrites();\n }\n\n getPendingWriteCount(): number {\n return this._modernDb.getPendingWriteCount();\n }\n\n clearPendingWrites(): void {\n this._modernDb.clearPendingWrites();\n }\n\n // ============================================\n // Connection Management (delegated)\n // ============================================\n\n async connect(databaseId: string, options?: ConnectOptions): Promise<void> {\n return this._modernDb.connect(databaseId, options);\n }\n\n async disconnect(): Promise<void> {\n // Clear the callback registry on disconnect\n this._callbackRegistry.clear();\n return this._modernDb.disconnect();\n }\n\n goOffline(): void {\n this._modernDb.goOffline();\n }\n\n goOnline(): void {\n this._modernDb.goOnline();\n }\n\n // ============================================\n // Reference Access\n // ============================================\n\n /**\n * Get a Firebase v8 compatible reference to a path.\n */\n ref(path: string = ''): DatabaseReference {\n return new DatabaseReference(this, this._modernDb.ref(path));\n }\n\n // ============================================\n // Transactions (delegated)\n // ============================================\n\n async transaction(operations: TransactionOp[] | TransactionObject): Promise<void> {\n return this._modernDb.transaction(operations);\n }\n\n // ============================================\n // Connection Events (delegated)\n // ============================================\n\n onConnect(callback: () => void): () => void {\n return this._modernDb.onConnect(callback);\n }\n\n onDisconnect(callback: () => void): () => void {\n return this._modernDb.onDisconnect(callback);\n }\n\n onError(callback: (error: Error) => void): () => void {\n return this._modernDb.onError(callback);\n }\n\n onReconnecting(callback: () => void): () => void {\n return this._modernDb.onReconnecting(callback);\n }\n\n onAuthStateChanged(callback: (auth: AuthInfo | null) => void): () => void {\n return this._modernDb.onAuthStateChanged(callback);\n }\n\n // ============================================\n // Authentication Management (delegated)\n // ============================================\n\n async signIn(token: string): Promise<void> {\n return this._modernDb.signIn(token);\n }\n\n async signOut(): Promise<void> {\n return this._modernDb.signOut();\n }\n}\n\n// Re-export types and utilities that don't need wrapping\nexport {\n DataSnapshot,\n OnDisconnect,\n LarkError,\n ServerValue,\n generatePushId,\n isVolatilePath,\n PendingWriteManager,\n};\n\nexport type {\n ConnectOptions,\n AuthInfo,\n TransactionOp,\n TransactionSetOp,\n TransactionUpdateOp,\n TransactionDeleteOp,\n TransactionConditionOp,\n TransactionObject,\n SnapshotCallback,\n QueryState,\n TransactionResult,\n EventType,\n QueryParams,\n TransportType,\n};\n"],"mappings":"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","names":["LarkDatabase"]}
package/dist/index.js CHANGED
@@ -3040,9 +3040,7 @@ var DatabaseReference = class _DatabaseReference {
3040
3040
  queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_IS_INCLUSIVE] = true;
3041
3041
  } else if (this._query.startAfter !== void 0) {
3042
3042
  queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_VALUE] = this._query.startAfter.value ?? null;
3043
- if (this._query.startAfter.key !== void 0) {
3044
- queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME] = this._query.startAfter.key;
3045
- }
3043
+ queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME] = this._query.startAfter.key ?? "[MAX_NAME]";
3046
3044
  queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_IS_INCLUSIVE] = false;
3047
3045
  }
3048
3046
  if (this._query.endAt !== void 0) {
@@ -3053,9 +3051,7 @@ var DatabaseReference = class _DatabaseReference {
3053
3051
  queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_IS_INCLUSIVE] = true;
3054
3052
  } else if (this._query.endBefore !== void 0) {
3055
3053
  queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_VALUE] = this._query.endBefore.value ?? null;
3056
- if (this._query.endBefore.key !== void 0) {
3057
- queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME] = this._query.endBefore.key;
3058
- }
3054
+ queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME] = this._query.endBefore.key ?? "[MIN_NAME]";
3059
3055
  queryObj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_IS_INCLUSIVE] = false;
3060
3056
  }
3061
3057
  if (this._query.equalTo !== void 0) {
@@ -4497,7 +4493,6 @@ var LarkDatabase = class {
4497
4493
  this.transport?.close();
4498
4494
  this.transport = null;
4499
4495
  this._state = "disconnected";
4500
- this.subscriptionManager.clearCacheOnly();
4501
4496
  this.fireConnectionStateChange();
4502
4497
  }
4503
4498
  }