@edge-base/web 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +352 -0
  2. package/dist/analytics.d.ts +60 -0
  3. package/dist/analytics.d.ts.map +1 -0
  4. package/dist/analytics.js +146 -0
  5. package/dist/analytics.js.map +1 -0
  6. package/dist/auth-refresh.d.ts +5 -0
  7. package/dist/auth-refresh.d.ts.map +1 -0
  8. package/dist/auth-refresh.js +26 -0
  9. package/dist/auth-refresh.js.map +1 -0
  10. package/dist/auth.d.ts +314 -0
  11. package/dist/auth.d.ts.map +1 -0
  12. package/dist/auth.js +518 -0
  13. package/dist/auth.js.map +1 -0
  14. package/dist/browser-storage.d.ts +7 -0
  15. package/dist/browser-storage.d.ts.map +1 -0
  16. package/dist/browser-storage.js +43 -0
  17. package/dist/browser-storage.js.map +1 -0
  18. package/dist/client.d.ts +145 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +310 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/database-live.d.ts +65 -0
  23. package/dist/database-live.d.ts.map +1 -0
  24. package/dist/database-live.js +486 -0
  25. package/dist/database-live.js.map +1 -0
  26. package/dist/index.d.ts +21 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +28 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/match-filter.d.ts +30 -0
  31. package/dist/match-filter.d.ts.map +1 -0
  32. package/dist/match-filter.js +86 -0
  33. package/dist/match-filter.js.map +1 -0
  34. package/dist/room-realtime-media.d.ts +96 -0
  35. package/dist/room-realtime-media.d.ts.map +1 -0
  36. package/dist/room-realtime-media.js +418 -0
  37. package/dist/room-realtime-media.js.map +1 -0
  38. package/dist/room.d.ts +450 -0
  39. package/dist/room.d.ts.map +1 -0
  40. package/dist/room.js +1506 -0
  41. package/dist/room.js.map +1 -0
  42. package/dist/token-manager.d.ts +73 -0
  43. package/dist/token-manager.d.ts.map +1 -0
  44. package/dist/token-manager.js +378 -0
  45. package/dist/token-manager.js.map +1 -0
  46. package/dist/turnstile.d.ts +56 -0
  47. package/dist/turnstile.d.ts.map +1 -0
  48. package/dist/turnstile.js +191 -0
  49. package/dist/turnstile.js.map +1 -0
  50. package/llms.txt +549 -0
  51. package/package.json +50 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @edge-base/web — Client-side EdgeBase SDK (browser / React Native / mobile)
3
+ *
4
+ * @example
5
+ * import { createClient } from '@edge-base/web';
6
+ * const client = createClient('https://my-app.edgebase.fun');
7
+ * await client.auth.signUp({ email: 'user@test.com', password: 'pass123' });
8
+ * const posts = await client.db('shared').table('posts').where('status', '==', 'published').get();
9
+ */
10
+ import type { ContextValue } from '@edge-base/core';
11
+ import { DbRef } from '@edge-base/core';
12
+ import { StorageClient } from '@edge-base/core';
13
+ import { FunctionsClient } from '@edge-base/core';
14
+ import { type DatabaseLiveOptions } from './database-live.js';
15
+ import type { RoomOptions } from './room.js';
16
+ import { RoomClient } from './room.js';
17
+ import { AuthClient } from './auth.js';
18
+ import { ClientAnalytics } from './analytics.js';
19
+ /** Options for createClient() */
20
+ export interface JuneClientOptions {
21
+ /** Schema from typegen (build-time metadata) */
22
+ schema?: Record<string, unknown>;
23
+ /** Database live subscription options (auto-reconnect, delays, etc.) */
24
+ databaseLive?: DatabaseLiveOptions;
25
+ }
26
+ /**
27
+ * Client-side EdgeBase SDK.
28
+ * Exposes: auth, db, storage, room, push, destroy.
29
+ * Does NOT expose: adminAuth, sql (admin-only).
30
+ *
31
+ * @example
32
+ * const client = createClient('https://my-app.edgebase.fun');
33
+ * const posts = await client.db('shared').table('posts').where('status', '==', 'published').get();
34
+ */
35
+ export declare class ClientEdgeBase {
36
+ readonly auth: AuthClient;
37
+ readonly storage: StorageClient;
38
+ readonly functions: FunctionsClient;
39
+ readonly analytics: ClientAnalytics;
40
+ private baseUrl;
41
+ private databaseLive;
42
+ /** Push notification management. */
43
+ readonly push: {
44
+ /**
45
+ * Set the FCM token provider. Must be called before register().
46
+ * @example
47
+ * import { getToken, getMessaging } from 'firebase/messaging';
48
+ * const messaging = getMessaging(app);
49
+ * client.push.setTokenProvider(() => getToken(messaging, { vapidKey: '...' }));
50
+ */
51
+ setTokenProvider: (provider: () => Promise<string>) => void;
52
+ /**
53
+ * Register for push notifications.
54
+ * Requires setTokenProvider() first. Token is cached; network request only happens on change.
55
+ */
56
+ register: (options?: {
57
+ metadata?: Record<string, unknown>;
58
+ }) => Promise<void>;
59
+ /** Unregister the current device. Pass deviceId to unregister a specific device. */
60
+ unregister: (deviceId?: string) => Promise<void>;
61
+ /** Subscribe to a push notification topic (server-side via FCM IID API). */
62
+ subscribeTopic: (topic: string) => Promise<void>;
63
+ /** Unsubscribe from a push notification topic (server-side via FCM IID API). */
64
+ unsubscribeTopic: (topic: string) => Promise<void>;
65
+ /** Listen for push messages in foreground. */
66
+ onMessage: (callback: (message: {
67
+ title?: string;
68
+ body?: string;
69
+ data?: Record<string, unknown>;
70
+ }) => void) => void;
71
+ /** Listen for notification taps that opened the app. */
72
+ onMessageOpenedApp: (callback: (message: {
73
+ title?: string;
74
+ body?: string;
75
+ data?: Record<string, unknown>;
76
+ }) => void) => void;
77
+ /** Get current notification permission status. */
78
+ getPermissionStatus: () => 'granted' | 'denied' | 'notDetermined';
79
+ /** Request notification permission from the user. */
80
+ requestPermission: () => Promise<'granted' | 'denied'>;
81
+ };
82
+ private tokenManager;
83
+ private httpClient;
84
+ private contextManager;
85
+ private core;
86
+ constructor(url: string, options?: JuneClientOptions);
87
+ /**
88
+ * Access a DB block by namespace + optional instance ID. (§2)
89
+ *
90
+ * @example
91
+ * // Static shared DB (id omitted)
92
+ * const posts = await client.db('shared').table('posts').get();
93
+ *
94
+ * // Dynamic workspace DB
95
+ * const docs = await client.db('workspace', 'ws-456').table('documents').get();
96
+ *
97
+ * // Per-user DB
98
+ * const notes = await client.db('user', userId).table('notes').get();
99
+ */
100
+ db(namespace: string, id?: string): DbRef;
101
+ /**
102
+ * Create a RoomClient for a specific namespace and room ID.
103
+ *
104
+ * @param namespace - The room namespace (e.g. 'game', 'chat')
105
+ * @param roomId - The room instance ID within the namespace
106
+ * @param options - Connection options
107
+ *
108
+ * @example
109
+ * const room = client.room('game', 'room-123');
110
+ * await room.join();
111
+ * const result = await room.send('SET_SCORE', { score: 42 });
112
+ */
113
+ room(namespace: string, roomId: string, options?: RoomOptions): RoomClient;
114
+ /**
115
+ * Get room metadata without joining (HTTP GET). No WebSocket connection needed.
116
+ * Useful for lobby screens where you need room info before joining.
117
+ *
118
+ * @param namespace - The room namespace (e.g. 'game')
119
+ * @param roomId - The room instance ID
120
+ * @returns Developer-defined metadata set by room.setMetadata() on the server
121
+ */
122
+ getRoomMetadata(namespace: string, roomId: string): Promise<Record<string, unknown>>;
123
+ /**
124
+ * Set locale for i18n. Auth emails (verification, password reset, magic link, etc.)
125
+ * will be sent in this language. Also sent as Accept-Language header on all requests.
126
+ *
127
+ * @param locale - BCP 47 language tag (e.g. 'ko', 'ja', 'fr') or undefined to clear
128
+ *
129
+ * @example
130
+ * client.setLocale('ko'); // Korean
131
+ * await client.auth.signUp({ email, password }); // verification email in Korean
132
+ * client.setLocale(undefined); // clear — falls back to user's stored locale
133
+ */
134
+ setLocale(locale: string | undefined): void;
135
+ /** Get the currently set locale (undefined = using server default) */
136
+ getLocale(): string | undefined;
137
+ /** Set legacy isolateBy context state. HTTP DB routing uses db(namespace, id). */
138
+ setContext(context: ContextValue): void;
139
+ /** Get the currently configured legacy isolateBy context state. */
140
+ getContext(): ContextValue;
141
+ destroy(): void;
142
+ }
143
+ /** Create a client-side EdgeBase SDK instance. */
144
+ export declare function createClient(url: string, options?: JuneClientOptions): ClientEdgeBase;
145
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,310 @@
1
+ /**
2
+ * @edge-base/web — Client-side EdgeBase SDK (browser / React Native / mobile)
3
+ *
4
+ * @example
5
+ * import { createClient } from '@edge-base/web';
6
+ * const client = createClient('https://my-app.edgebase.fun');
7
+ * await client.auth.signUp({ email: 'user@test.com', password: 'pass123' });
8
+ * const posts = await client.db('shared').table('posts').where('status', '==', 'published').get();
9
+ */
10
+ import { HttpClient } from '@edge-base/core';
11
+ import { ContextManager } from '@edge-base/core';
12
+ import { DbRef } from '@edge-base/core';
13
+ import { StorageClient } from '@edge-base/core';
14
+ import { FunctionsClient } from '@edge-base/core';
15
+ import { DefaultDbApi, HttpClientAdapter, PublicHttpClientAdapter } from '@edge-base/core';
16
+ import { DatabaseLiveClient } from './database-live.js';
17
+ import { RoomClient } from './room.js';
18
+ import { matchesFilter } from './match-filter.js';
19
+ import { TokenManager } from './token-manager.js';
20
+ import { AuthClient } from './auth.js';
21
+ import { ClientAnalytics } from './analytics.js';
22
+ import { createBrowserStorage } from './browser-storage.js';
23
+ // ─── Client SDK (browser / mobile) ───
24
+ /**
25
+ * Client-side EdgeBase SDK.
26
+ * Exposes: auth, db, storage, room, push, destroy.
27
+ * Does NOT expose: adminAuth, sql (admin-only).
28
+ *
29
+ * @example
30
+ * const client = createClient('https://my-app.edgebase.fun');
31
+ * const posts = await client.db('shared').table('posts').where('status', '==', 'published').get();
32
+ */
33
+ export class ClientEdgeBase {
34
+ auth;
35
+ storage;
36
+ functions;
37
+ analytics;
38
+ baseUrl;
39
+ databaseLive;
40
+ /** Push notification management. */
41
+ push;
42
+ tokenManager;
43
+ httpClient;
44
+ contextManager;
45
+ core;
46
+ constructor(url, options) {
47
+ const baseUrl = url.replace(/\/$/, '');
48
+ this.tokenManager = new TokenManager(baseUrl);
49
+ this.contextManager = new ContextManager();
50
+ this.httpClient = new HttpClient({
51
+ baseUrl,
52
+ tokenManager: this.tokenManager,
53
+ contextManager: this.contextManager,
54
+ });
55
+ this.core = new DefaultDbApi(new HttpClientAdapter(this.httpClient));
56
+ const corePublic = new DefaultDbApi(new PublicHttpClientAdapter(this.httpClient));
57
+ this.auth = new AuthClient(this.httpClient, this.tokenManager, this.core, corePublic);
58
+ this.databaseLive = new DatabaseLiveClient(baseUrl, this.tokenManager, options?.databaseLive, this.contextManager);
59
+ this.storage = new StorageClient(this.httpClient, this.core);
60
+ this.functions = new FunctionsClient(this.httpClient);
61
+ this.analytics = new ClientAnalytics(this.httpClient, baseUrl, this.core);
62
+ this.baseUrl = baseUrl;
63
+ const storage = createBrowserStorage();
64
+ // Push — closures over generated core (no hardcoded paths)
65
+ const core = this.core;
66
+ const messageListeners = [];
67
+ const openedAppListeners = [];
68
+ // Listen for Service Worker messages (foreground push)
69
+ if (typeof navigator !== 'undefined' && 'serviceWorker' in navigator) {
70
+ navigator.serviceWorker.addEventListener('message', (event) => {
71
+ if (event.data?.type === 'push') {
72
+ const msg = event.data.payload ?? event.data;
73
+ for (const cb of messageListeners)
74
+ cb(msg);
75
+ }
76
+ if (event.data?.type === 'notificationclick') {
77
+ const msg = event.data.payload ?? event.data;
78
+ for (const cb of openedAppListeners)
79
+ cb(msg);
80
+ }
81
+ });
82
+ }
83
+ // Helper: get or create persistent device ID
84
+ const getDeviceId = () => {
85
+ const key = 'eb_push_device_id';
86
+ let id = storage.getItem(key);
87
+ if (!id) {
88
+ id = typeof crypto !== 'undefined' && crypto.randomUUID
89
+ ? crypto.randomUUID()
90
+ : `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
91
+ storage.setItem(key, id);
92
+ }
93
+ return id;
94
+ };
95
+ // Helper: token cache (skip network if unchanged)
96
+ const CACHE_KEY = 'eb_push_token_cache';
97
+ const getCachedToken = () => storage.getItem(CACHE_KEY);
98
+ const setCachedToken = (token) => {
99
+ storage.setItem(CACHE_KEY, token);
100
+ };
101
+ // FCM token provider — set by app via setTokenProvider()
102
+ let tokenProvider = null;
103
+ // Helper: detect browser name + version from User-Agent
104
+ const detectBrowser = () => {
105
+ if (typeof navigator === 'undefined')
106
+ return 'unknown';
107
+ const ua = navigator.userAgent;
108
+ // Order matters — Edge includes Chrome, Chrome includes Safari
109
+ if (ua.includes('Edg/'))
110
+ return 'Edge ' + (ua.match(/Edg\/(\d+)/)?.[1] ?? '');
111
+ if (ua.includes('OPR/') || ua.includes('Opera/'))
112
+ return 'Opera ' + (ua.match(/OPR\/(\d+)/)?.[1] ?? '');
113
+ if (ua.includes('Firefox/'))
114
+ return 'Firefox ' + (ua.match(/Firefox\/(\d+)/)?.[1] ?? '');
115
+ if (ua.includes('Chrome/') && !ua.includes('Edg/'))
116
+ return 'Chrome ' + (ua.match(/Chrome\/(\d+)/)?.[1] ?? '');
117
+ if (ua.includes('Safari/') && !ua.includes('Chrome/'))
118
+ return 'Safari ' + (ua.match(/Version\/(\d+)/)?.[1] ?? '');
119
+ return 'Browser';
120
+ };
121
+ // Helper: detect OS from User-Agent
122
+ const detectOS = () => {
123
+ if (typeof navigator === 'undefined')
124
+ return 'unknown';
125
+ const ua = navigator.userAgent;
126
+ if (ua.includes('Mac OS X')) {
127
+ const ver = ua.match(/Mac OS X (\d+[._]\d+)/)?.[1]?.replace(/_/g, '.') ?? '';
128
+ return 'macOS ' + ver;
129
+ }
130
+ if (ua.includes('Windows NT')) {
131
+ const ver = ua.match(/Windows NT (\d+\.\d+)/)?.[1] ?? '';
132
+ return 'Windows ' + ver;
133
+ }
134
+ if (ua.includes('Android'))
135
+ return 'Android ' + (ua.match(/Android (\d+)/)?.[1] ?? '');
136
+ if (ua.includes('iPhone') || ua.includes('iPad'))
137
+ return 'iOS ' + (ua.match(/OS (\d+)/)?.[1] ?? '');
138
+ if (ua.includes('Linux'))
139
+ return 'Linux';
140
+ return 'unknown';
141
+ };
142
+ // Helper: collect device info automatically
143
+ const collectDeviceInfo = () => ({
144
+ name: detectBrowser(),
145
+ osVersion: detectOS(),
146
+ locale: typeof navigator !== 'undefined' ? navigator.language : 'unknown',
147
+ });
148
+ this.push = {
149
+ setTokenProvider(provider) {
150
+ tokenProvider = provider;
151
+ },
152
+ // register — Decision §5/§9/§10 (FCM 일원화)
153
+ async register(options) {
154
+ // 1. Request permission
155
+ if (typeof Notification !== 'undefined' && Notification.permission === 'default') {
156
+ const perm = await Notification.requestPermission();
157
+ if (perm !== 'granted')
158
+ return;
159
+ }
160
+ if (typeof Notification !== 'undefined' && Notification.permission === 'denied')
161
+ return;
162
+ // 2. Get FCM token via provider (must be set by app using setTokenProvider)
163
+ if (!tokenProvider) {
164
+ throw new Error('Token provider not set. Call client.push.setTokenProvider() first.');
165
+ }
166
+ const token = await tokenProvider();
167
+ // 3. Check token cache — skip if unchanged (§9)
168
+ if (getCachedToken() === token && !options?.metadata)
169
+ return;
170
+ // 4. Register with server — auto-collect deviceInfo
171
+ const deviceId = getDeviceId();
172
+ await core.pushRegister({
173
+ deviceId,
174
+ token,
175
+ platform: 'web',
176
+ deviceInfo: collectDeviceInfo(),
177
+ metadata: options?.metadata,
178
+ });
179
+ setCachedToken(token);
180
+ },
181
+ async unregister(deviceId) {
182
+ const id = deviceId ?? getDeviceId();
183
+ await core.pushUnregister({ deviceId: id });
184
+ storage.removeItem(CACHE_KEY);
185
+ },
186
+ async subscribeTopic(topic) {
187
+ await core.pushTopicSubscribe({ topic });
188
+ },
189
+ async unsubscribeTopic(topic) {
190
+ await core.pushTopicUnsubscribe({ topic });
191
+ },
192
+ onMessage(callback) {
193
+ messageListeners.push(callback);
194
+ },
195
+ onMessageOpenedApp(callback) {
196
+ openedAppListeners.push(callback);
197
+ },
198
+ getPermissionStatus() {
199
+ if (typeof Notification === 'undefined')
200
+ return 'notDetermined';
201
+ if (Notification.permission === 'granted')
202
+ return 'granted';
203
+ if (Notification.permission === 'denied')
204
+ return 'denied';
205
+ return 'notDetermined';
206
+ },
207
+ async requestPermission() {
208
+ if (typeof Notification === 'undefined')
209
+ return 'denied';
210
+ const result = await Notification.requestPermission();
211
+ return result === 'granted' ? 'granted' : 'denied';
212
+ },
213
+ };
214
+ // ─── Auto-unregister push on signOut ───
215
+ // Wrap auth.signOut so the current device token is removed before clearing
216
+ // session tokens. This prevents stale tokens accumulating in KV.
217
+ const originalSignOut = this.auth.signOut.bind(this.auth);
218
+ const pushRef = this.push;
219
+ const cacheKey = CACHE_KEY;
220
+ this.auth.signOut = async function () {
221
+ // Best-effort push unregister — never fail signOut because of push
222
+ try {
223
+ if (storage.getItem(cacheKey)) {
224
+ await pushRef.unregister();
225
+ }
226
+ }
227
+ catch { /* ignore */ }
228
+ return originalSignOut();
229
+ };
230
+ }
231
+ /**
232
+ * Access a DB block by namespace + optional instance ID. (§2)
233
+ *
234
+ * @example
235
+ * // Static shared DB (id omitted)
236
+ * const posts = await client.db('shared').table('posts').get();
237
+ *
238
+ * // Dynamic workspace DB
239
+ * const docs = await client.db('workspace', 'ws-456').table('documents').get();
240
+ *
241
+ * // Per-user DB
242
+ * const notes = await client.db('user', userId).table('notes').get();
243
+ */
244
+ db(namespace, id) {
245
+ return new DbRef(this.core, namespace, id, this.databaseLive, matchesFilter);
246
+ }
247
+ /**
248
+ * Create a RoomClient for a specific namespace and room ID.
249
+ *
250
+ * @param namespace - The room namespace (e.g. 'game', 'chat')
251
+ * @param roomId - The room instance ID within the namespace
252
+ * @param options - Connection options
253
+ *
254
+ * @example
255
+ * const room = client.room('game', 'room-123');
256
+ * await room.join();
257
+ * const result = await room.send('SET_SCORE', { score: 42 });
258
+ */
259
+ room(namespace, roomId, options) {
260
+ return new RoomClient(this.baseUrl, namespace, roomId, this.tokenManager, options);
261
+ }
262
+ /**
263
+ * Get room metadata without joining (HTTP GET). No WebSocket connection needed.
264
+ * Useful for lobby screens where you need room info before joining.
265
+ *
266
+ * @param namespace - The room namespace (e.g. 'game')
267
+ * @param roomId - The room instance ID
268
+ * @returns Developer-defined metadata set by room.setMetadata() on the server
269
+ */
270
+ async getRoomMetadata(namespace, roomId) {
271
+ return RoomClient.getMetadata(this.baseUrl, namespace, roomId);
272
+ }
273
+ /**
274
+ * Set locale for i18n. Auth emails (verification, password reset, magic link, etc.)
275
+ * will be sent in this language. Also sent as Accept-Language header on all requests.
276
+ *
277
+ * @param locale - BCP 47 language tag (e.g. 'ko', 'ja', 'fr') or undefined to clear
278
+ *
279
+ * @example
280
+ * client.setLocale('ko'); // Korean
281
+ * await client.auth.signUp({ email, password }); // verification email in Korean
282
+ * client.setLocale(undefined); // clear — falls back to user's stored locale
283
+ */
284
+ setLocale(locale) {
285
+ this.httpClient.setLocale(locale);
286
+ }
287
+ /** Get the currently set locale (undefined = using server default) */
288
+ getLocale() {
289
+ return this.httpClient.getLocale();
290
+ }
291
+ /** Set legacy isolateBy context state. HTTP DB routing uses db(namespace, id). */
292
+ setContext(context) {
293
+ this.contextManager.setContext(context);
294
+ }
295
+ /** Get the currently configured legacy isolateBy context state. */
296
+ getContext() {
297
+ return this.contextManager.getContext();
298
+ }
299
+ destroy() {
300
+ this.analytics.destroy();
301
+ this.tokenManager.destroy();
302
+ this.databaseLive.disconnect();
303
+ }
304
+ }
305
+ // ─── Factory ───
306
+ /** Create a client-side EdgeBase SDK instance. */
307
+ export function createClient(url, options) {
308
+ return new ClientEdgeBase(url, options);
309
+ }
310
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { TokenManager } from './token-manager.js';
2
+ import type { ContextManager, IDatabaseLiveSubscriber } from '@edge-base/core';
3
+ export type ChangeType = 'added' | 'modified' | 'removed';
4
+ export type FilterTuple = [string, string, unknown];
5
+ export type ErrorHandler = (error: {
6
+ code: string;
7
+ message: string;
8
+ }) => void;
9
+ interface DbChange<T = Record<string, unknown>> {
10
+ changeType: ChangeType;
11
+ table: string;
12
+ docId: string;
13
+ data: T | null;
14
+ timestamp: string;
15
+ }
16
+ export interface DatabaseLiveOptions {
17
+ autoReconnect?: boolean;
18
+ maxReconnectAttempts?: number;
19
+ reconnectBaseDelay?: number;
20
+ }
21
+ export declare class DatabaseLiveClient implements IDatabaseLiveSubscriber {
22
+ private baseUrl;
23
+ private tokenManager;
24
+ private ws;
25
+ private connectingPromise;
26
+ private subscriptions;
27
+ private connectedChannels;
28
+ private channelFilters;
29
+ private channelOrFilters;
30
+ private errorHandlers;
31
+ private reconnectAttempts;
32
+ private connected;
33
+ private authenticated;
34
+ private waitingForAuth;
35
+ private authRecoveryPromise;
36
+ private heartbeatTimer;
37
+ private unsubAuthState;
38
+ private options;
39
+ constructor(baseUrl: string, tokenManager: TokenManager, options?: DatabaseLiveOptions, contextManager?: ContextManager);
40
+ onSnapshot<T>(channel: string, callback: (change: DbChange<T>) => void, clientFilters?: unknown, serverFilters?: unknown, serverOrFilters?: unknown): () => void;
41
+ onError(handler: ErrorHandler): () => void;
42
+ connect(channel: string): Promise<void>;
43
+ reconnect(): void;
44
+ disconnect(): void;
45
+ private establishConnection;
46
+ private authenticate;
47
+ private handleMessage;
48
+ private sendSubscribe;
49
+ private sendUnsubscribe;
50
+ private resubscribeAll;
51
+ private refreshAuth;
52
+ private handleAuthStateChange;
53
+ private handleAuthenticationFailure;
54
+ private resyncFilters;
55
+ private scheduleReconnect;
56
+ private buildWsUrl;
57
+ private sendRaw;
58
+ private hasAuthContext;
59
+ private recoverAuthentication;
60
+ private startHeartbeat;
61
+ private stopHeartbeat;
62
+ private handleContextChange;
63
+ }
64
+ export {};
65
+ //# sourceMappingURL=database-live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-live.d.ts","sourceRoot":"","sources":["../src/database-live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAI/E,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC;AAE9E,UAAU,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5C,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,kBAAmB,YAAW,uBAAuB;IAmB9D,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;IAnBtB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,cAAc,CAA6B;IAEnD,OAAO,CAAC,OAAO,CAAgC;gBAGrC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAClC,OAAO,CAAC,EAAE,mBAAmB,EAC7B,cAAc,CAAC,EAAE,cAAc;IAiBjC,UAAU,CAAC,CAAC,EACV,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EACvC,aAAa,CAAC,EAAE,OAAO,EACvB,aAAa,CAAC,EAAE,OAAO,EACvB,eAAe,CAAC,EAAE,OAAO,GACxB,MAAM,IAAI;IAuCb,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAQpC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B7C,SAAS,IAAI,IAAI;IAWjB,UAAU,IAAI,IAAI;YAmBJ,mBAAmB;YA6CnB,YAAY;IAgD1B,OAAO,CAAC,aAAa;IAwFrB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,qBAAqB;IAuC7B,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,mBAAmB;CAgB5B"}