@lark-sh/client 0.1.19 → 0.1.21
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/{chunk-UF3SZ62Y.mjs → chunk-HHBHX2EM.mjs} +85 -121
- package/dist/chunk-HHBHX2EM.mjs.map +1 -0
- package/dist/fb-v8/index.d.mts +5 -5
- package/dist/fb-v8/index.d.ts +5 -5
- package/dist/fb-v8/index.js +88 -124
- package/dist/fb-v8/index.js.map +1 -1
- package/dist/fb-v8/index.mjs +5 -5
- package/dist/fb-v8/index.mjs.map +1 -1
- package/dist/index.d.mts +37 -24
- package/dist/index.d.ts +37 -24
- package/dist/index.js +84 -120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-UF3SZ62Y.mjs.map +0 -1
package/dist/fb-v8/index.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
ServerValue,
|
|
8
8
|
generatePushId,
|
|
9
9
|
isVolatilePath
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-HHBHX2EM.mjs";
|
|
11
11
|
|
|
12
12
|
// src/fb-v8/index.ts
|
|
13
13
|
var DatabaseReference = class _DatabaseReference {
|
|
@@ -217,13 +217,13 @@ var ThenableReference = class extends DatabaseReference {
|
|
|
217
217
|
}
|
|
218
218
|
};
|
|
219
219
|
var LarkDatabase2 = class {
|
|
220
|
-
constructor() {
|
|
220
|
+
constructor(databaseId, options = {}) {
|
|
221
221
|
/**
|
|
222
222
|
* Global callback registry for Firebase v8 compatibility.
|
|
223
223
|
* Structure: path -> eventType -> callback -> unsubscribe function
|
|
224
224
|
*/
|
|
225
225
|
this._callbackRegistry = /* @__PURE__ */ new Map();
|
|
226
|
-
this._modernDb = new LarkDatabase();
|
|
226
|
+
this._modernDb = new LarkDatabase(databaseId, options);
|
|
227
227
|
}
|
|
228
228
|
// ============================================
|
|
229
229
|
// Internal: Callback Registry Management
|
|
@@ -387,8 +387,8 @@ var LarkDatabase2 = class {
|
|
|
387
387
|
// ============================================
|
|
388
388
|
// Connection Management (delegated)
|
|
389
389
|
// ============================================
|
|
390
|
-
async connect(
|
|
391
|
-
return this._modernDb.connect(
|
|
390
|
+
async connect() {
|
|
391
|
+
return this._modernDb.connect();
|
|
392
392
|
}
|
|
393
393
|
async disconnect() {
|
|
394
394
|
this._callbackRegistry.clear();
|
package/dist/fb-v8/index.mjs.map
CHANGED
|
@@ -1 +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"]}
|
|
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('project/database', { anonymous: true });\n * await db.connect();\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(databaseId: string, options: ConnectOptions = {}) {\n this._modernDb = new ModernLarkDatabase(databaseId, options);\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(): Promise<void> {\n return this._modernDb.connect();\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.d.mts
CHANGED
|
@@ -726,10 +726,28 @@ declare class LarkDatabase {
|
|
|
726
726
|
private reconnectingCallbacks;
|
|
727
727
|
private authStateChangedCallbacks;
|
|
728
728
|
private infoSubscriptions;
|
|
729
|
-
private
|
|
730
|
-
private authenticationResolve;
|
|
729
|
+
private _connectionPromise;
|
|
731
730
|
private _serverTimeOffset;
|
|
732
|
-
|
|
731
|
+
/**
|
|
732
|
+
* Create a new LarkDatabase instance.
|
|
733
|
+
*
|
|
734
|
+
* @param databaseId - Database ID in format "project/database"
|
|
735
|
+
* @param options - Connection options (token, anonymous, domain, transport).
|
|
736
|
+
* Defaults to anonymous auth if not specified.
|
|
737
|
+
*
|
|
738
|
+
* @example
|
|
739
|
+
* ```typescript
|
|
740
|
+
* // Lazy connection - connects on first operation
|
|
741
|
+
* const db = new LarkDatabase('project/database', { anonymous: true });
|
|
742
|
+
* db.ref('/users').on('value', cb); // Auto-connects here
|
|
743
|
+
*
|
|
744
|
+
* // Explicit connection - for UI feedback or error handling
|
|
745
|
+
* const db = new LarkDatabase('project/database', { anonymous: true });
|
|
746
|
+
* await db.connect(); // Explicitly await connection
|
|
747
|
+
* db.ref('/users').on('value', cb);
|
|
748
|
+
* ```
|
|
749
|
+
*/
|
|
750
|
+
constructor(databaseId: string, options?: ConnectOptions);
|
|
733
751
|
/**
|
|
734
752
|
* Whether the database is fully connected and authenticated.
|
|
735
753
|
* Returns true when ready to perform database operations.
|
|
@@ -781,12 +799,22 @@ declare class LarkDatabase {
|
|
|
781
799
|
*/
|
|
782
800
|
clearPendingWrites(): void;
|
|
783
801
|
/**
|
|
784
|
-
*
|
|
802
|
+
* Explicitly connect to the database.
|
|
785
803
|
*
|
|
786
|
-
*
|
|
787
|
-
*
|
|
804
|
+
* This is optional - operations will auto-connect if needed.
|
|
805
|
+
* Use this when you want to:
|
|
806
|
+
* - Await connection completion for UI feedback
|
|
807
|
+
* - Handle connection errors separately from operation errors
|
|
808
|
+
* - Pre-warm the connection before first operation
|
|
809
|
+
*
|
|
810
|
+
* @returns Promise that resolves when fully authenticated
|
|
788
811
|
*/
|
|
789
|
-
connect(
|
|
812
|
+
connect(): Promise<void>;
|
|
813
|
+
/**
|
|
814
|
+
* Ensure connection is established, triggering it if needed.
|
|
815
|
+
* Multiple concurrent calls share the same connection promise.
|
|
816
|
+
*/
|
|
817
|
+
private ensureConnected;
|
|
790
818
|
/**
|
|
791
819
|
* Internal connect implementation used by both initial connect and reconnect.
|
|
792
820
|
* Implements the Join → Auth flow:
|
|
@@ -811,8 +839,9 @@ declare class LarkDatabase {
|
|
|
811
839
|
*/
|
|
812
840
|
goOnline(): void;
|
|
813
841
|
/**
|
|
814
|
-
* Full cleanup - clears
|
|
842
|
+
* Full cleanup - clears connection state including subscriptions.
|
|
815
843
|
* Used for intentional disconnect.
|
|
844
|
+
* Preserves config (databaseId, domain, token) so connect() can be called again.
|
|
816
845
|
*/
|
|
817
846
|
private cleanupFull;
|
|
818
847
|
/**
|
|
@@ -953,22 +982,6 @@ declare class LarkDatabase {
|
|
|
953
982
|
private handleMessage;
|
|
954
983
|
private handleClose;
|
|
955
984
|
private handleError;
|
|
956
|
-
/**
|
|
957
|
-
* Check if authenticated synchronously.
|
|
958
|
-
* Returns true if authenticated, false if connecting (should wait), throws if disconnected.
|
|
959
|
-
*/
|
|
960
|
-
private isAuthenticatedOrThrow;
|
|
961
|
-
/**
|
|
962
|
-
* Wait for authentication to complete before performing an operation.
|
|
963
|
-
* If already authenticated, returns immediately (synchronously).
|
|
964
|
-
* If connecting/reconnecting, waits for auth to complete.
|
|
965
|
-
* If disconnected and no connect in progress, throws.
|
|
966
|
-
*
|
|
967
|
-
* IMPORTANT: This returns a Promise only if waiting is needed.
|
|
968
|
-
* Callers should use: `if (!this.isAuthenticatedOrThrow()) if (!this.isAuthenticatedOrThrow()) await this.waitForAuthenticated();`
|
|
969
|
-
* to preserve synchronous execution when already authenticated.
|
|
970
|
-
*/
|
|
971
|
-
private waitForAuthenticated;
|
|
972
985
|
private send;
|
|
973
986
|
/**
|
|
974
987
|
* @internal Send a set operation.
|
package/dist/index.d.ts
CHANGED
|
@@ -726,10 +726,28 @@ declare class LarkDatabase {
|
|
|
726
726
|
private reconnectingCallbacks;
|
|
727
727
|
private authStateChangedCallbacks;
|
|
728
728
|
private infoSubscriptions;
|
|
729
|
-
private
|
|
730
|
-
private authenticationResolve;
|
|
729
|
+
private _connectionPromise;
|
|
731
730
|
private _serverTimeOffset;
|
|
732
|
-
|
|
731
|
+
/**
|
|
732
|
+
* Create a new LarkDatabase instance.
|
|
733
|
+
*
|
|
734
|
+
* @param databaseId - Database ID in format "project/database"
|
|
735
|
+
* @param options - Connection options (token, anonymous, domain, transport).
|
|
736
|
+
* Defaults to anonymous auth if not specified.
|
|
737
|
+
*
|
|
738
|
+
* @example
|
|
739
|
+
* ```typescript
|
|
740
|
+
* // Lazy connection - connects on first operation
|
|
741
|
+
* const db = new LarkDatabase('project/database', { anonymous: true });
|
|
742
|
+
* db.ref('/users').on('value', cb); // Auto-connects here
|
|
743
|
+
*
|
|
744
|
+
* // Explicit connection - for UI feedback or error handling
|
|
745
|
+
* const db = new LarkDatabase('project/database', { anonymous: true });
|
|
746
|
+
* await db.connect(); // Explicitly await connection
|
|
747
|
+
* db.ref('/users').on('value', cb);
|
|
748
|
+
* ```
|
|
749
|
+
*/
|
|
750
|
+
constructor(databaseId: string, options?: ConnectOptions);
|
|
733
751
|
/**
|
|
734
752
|
* Whether the database is fully connected and authenticated.
|
|
735
753
|
* Returns true when ready to perform database operations.
|
|
@@ -781,12 +799,22 @@ declare class LarkDatabase {
|
|
|
781
799
|
*/
|
|
782
800
|
clearPendingWrites(): void;
|
|
783
801
|
/**
|
|
784
|
-
*
|
|
802
|
+
* Explicitly connect to the database.
|
|
785
803
|
*
|
|
786
|
-
*
|
|
787
|
-
*
|
|
804
|
+
* This is optional - operations will auto-connect if needed.
|
|
805
|
+
* Use this when you want to:
|
|
806
|
+
* - Await connection completion for UI feedback
|
|
807
|
+
* - Handle connection errors separately from operation errors
|
|
808
|
+
* - Pre-warm the connection before first operation
|
|
809
|
+
*
|
|
810
|
+
* @returns Promise that resolves when fully authenticated
|
|
788
811
|
*/
|
|
789
|
-
connect(
|
|
812
|
+
connect(): Promise<void>;
|
|
813
|
+
/**
|
|
814
|
+
* Ensure connection is established, triggering it if needed.
|
|
815
|
+
* Multiple concurrent calls share the same connection promise.
|
|
816
|
+
*/
|
|
817
|
+
private ensureConnected;
|
|
790
818
|
/**
|
|
791
819
|
* Internal connect implementation used by both initial connect and reconnect.
|
|
792
820
|
* Implements the Join → Auth flow:
|
|
@@ -811,8 +839,9 @@ declare class LarkDatabase {
|
|
|
811
839
|
*/
|
|
812
840
|
goOnline(): void;
|
|
813
841
|
/**
|
|
814
|
-
* Full cleanup - clears
|
|
842
|
+
* Full cleanup - clears connection state including subscriptions.
|
|
815
843
|
* Used for intentional disconnect.
|
|
844
|
+
* Preserves config (databaseId, domain, token) so connect() can be called again.
|
|
816
845
|
*/
|
|
817
846
|
private cleanupFull;
|
|
818
847
|
/**
|
|
@@ -953,22 +982,6 @@ declare class LarkDatabase {
|
|
|
953
982
|
private handleMessage;
|
|
954
983
|
private handleClose;
|
|
955
984
|
private handleError;
|
|
956
|
-
/**
|
|
957
|
-
* Check if authenticated synchronously.
|
|
958
|
-
* Returns true if authenticated, false if connecting (should wait), throws if disconnected.
|
|
959
|
-
*/
|
|
960
|
-
private isAuthenticatedOrThrow;
|
|
961
|
-
/**
|
|
962
|
-
* Wait for authentication to complete before performing an operation.
|
|
963
|
-
* If already authenticated, returns immediately (synchronously).
|
|
964
|
-
* If connecting/reconnecting, waits for auth to complete.
|
|
965
|
-
* If disconnected and no connect in progress, throws.
|
|
966
|
-
*
|
|
967
|
-
* IMPORTANT: This returns a Promise only if waiting is needed.
|
|
968
|
-
* Callers should use: `if (!this.isAuthenticatedOrThrow()) if (!this.isAuthenticatedOrThrow()) await this.waitForAuthenticated();`
|
|
969
|
-
* to preserve synchronous execution when already authenticated.
|
|
970
|
-
*/
|
|
971
|
-
private waitForAuthenticated;
|
|
972
985
|
private send;
|
|
973
986
|
/**
|
|
974
987
|
* @internal Send a set operation.
|