@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.
- package/README.md +352 -0
- package/dist/analytics.d.ts +60 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +146 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth-refresh.d.ts +5 -0
- package/dist/auth-refresh.d.ts.map +1 -0
- package/dist/auth-refresh.js +26 -0
- package/dist/auth-refresh.js.map +1 -0
- package/dist/auth.d.ts +314 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +518 -0
- package/dist/auth.js.map +1 -0
- package/dist/browser-storage.d.ts +7 -0
- package/dist/browser-storage.d.ts.map +1 -0
- package/dist/browser-storage.js +43 -0
- package/dist/browser-storage.js.map +1 -0
- package/dist/client.d.ts +145 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +310 -0
- package/dist/client.js.map +1 -0
- package/dist/database-live.d.ts +65 -0
- package/dist/database-live.d.ts.map +1 -0
- package/dist/database-live.js +486 -0
- package/dist/database-live.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/match-filter.d.ts +30 -0
- package/dist/match-filter.d.ts.map +1 -0
- package/dist/match-filter.js +86 -0
- package/dist/match-filter.js.map +1 -0
- package/dist/room-realtime-media.d.ts +96 -0
- package/dist/room-realtime-media.d.ts.map +1 -0
- package/dist/room-realtime-media.js +418 -0
- package/dist/room-realtime-media.js.map +1 -0
- package/dist/room.d.ts +450 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +1506 -0
- package/dist/room.js.map +1 -0
- package/dist/token-manager.d.ts +73 -0
- package/dist/token-manager.d.ts.map +1 -0
- package/dist/token-manager.js +378 -0
- package/dist/token-manager.js.map +1 -0
- package/dist/turnstile.d.ts +56 -0
- package/dist/turnstile.d.ts.map +1 -0
- package/dist/turnstile.js +191 -0
- package/dist/turnstile.js.map +1 -0
- package/llms.txt +549 -0
- package/package.json +50 -0
package/dist/client.d.ts
ADDED
|
@@ -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"}
|