@edge-base/react-native 0.1.2 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/token-manager.ts","../src/auth.ts","../src/auth-refresh.ts","../src/database-live.ts","../src/room.ts","../src/push.ts","../src/lifecycle.ts","../src/analytics.ts","../src/match-filter.ts","../src/client.ts","../src/turnstile.tsx"],"names":["EdgeBaseError","result","ApiPaths","useEffect","ContextManager","HttpClient","DefaultDbApi","HttpClientAdapter","PublicHttpClientAdapter","StorageClient","FunctionsClient","DbRef","useCallback","React","useState"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Token management for React Native — AsyncStorage based.\n *: Access Token in memory, Refresh Token in persistent storage\n *: onAuthStateChange\n *\n * Key differences from @edge-base/web TokenManager:\n * - Uses AsyncStorage instead of localStorage (async reads/writes)\n * - No BroadcastChannel (no multi-tab in RN)\n * - No storage event listener (RN has no cross-tab concept)\n * - Simpler: single-tab, single-process model\n */\n\nimport { EdgeBaseError } from '@edge-base/core';\n\n// ─── AsyncStorage adapter interface ───\n\n/** Minimal interface compatible with @react-native-async-storage/async-storage */\nexport interface AsyncStorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n// ─── Token types ───\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface TokenUser {\n id: string;\n email?: string;\n displayName?: string;\n avatarUrl?: string;\n role?: string;\n isAnonymous?: boolean;\n emailVisibility?: string;\n custom?: Record<string, unknown>;\n}\n\nexport type AuthStateChangeHandler = (user: TokenUser | null) => void;\n\n// ─── JWT helpers ───\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> {\n const parts = token.split('.');\n if (parts.length !== 3) throw new EdgeBaseError(0, 'Invalid JWT format');\n const payload = parts[1];\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '=='.slice(0, (4 - (base64.length % 4)) % 4);\n // Decode via UTF-8 so non-ASCII claims survive round-trips.\n const binary = atob(padded);\n const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));\n return JSON.parse(new TextDecoder().decode(bytes));\n}\n\nfunction isTokenExpired(token: string, bufferSeconds = 30): boolean {\n try {\n const payload = decodeJwtPayload(token);\n const exp = payload.exp as number;\n if (!exp) return true;\n return Date.now() / 1000 >= exp - bufferSeconds;\n } catch {\n return true;\n }\n}\n\nfunction extractUser(token: string): TokenUser | null {\n try {\n const payload = decodeJwtPayload(token);\n return {\n id: payload.sub as string,\n email: payload.email as string | undefined,\n displayName: payload.displayName as string | undefined,\n avatarUrl: payload.avatarUrl as string | undefined,\n role: payload.role as string | undefined,\n isAnonymous: payload.isAnonymous as boolean | undefined,\n emailVisibility: payload.emailVisibility as string | undefined,\n custom: payload.custom as Record<string, unknown> | undefined,\n };\n } catch {\n return null;\n }\n}\n\n// ─── Storage keys ───\n\nconst REFRESH_TOKEN_KEY = 'edgebase:refresh-token';\nconst PUSH_TOKEN_CACHE_KEY = 'edgebase:push-token-cache';\nconst PUSH_DEVICE_ID_KEY = 'edgebase:push-device-id';\n\nexport { PUSH_TOKEN_CACHE_KEY, PUSH_DEVICE_ID_KEY };\n\n// ─── TokenManager ───\n\nexport class TokenManager {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private refreshPromise: Promise<TokenPair> | null = null;\n private authStateListeners: AuthStateChangeHandler[] = [];\n private cachedUser: TokenUser | null = null;\n private storage: AsyncStorageAdapter;\n private initialized = false;\n private initPromise: Promise<void>;\n\n constructor(\n private baseUrl: string,\n storage: AsyncStorageAdapter,\n ) {\n this.storage = storage;\n // Async init: restore user from persisted refresh token\n this.initPromise = this.restore();\n }\n\n /** Wait for storage restore to complete */\n async ready(): Promise<void> {\n return this.initPromise;\n }\n\n private async restore(): Promise<void> {\n try {\n const stored = await this.storage.getItem(REFRESH_TOKEN_KEY);\n if (stored && !isTokenExpired(stored, 0)) {\n this.refreshToken = stored;\n this.cachedUser = extractUser(stored);\n }\n } catch {\n // ignore storage errors on init\n }\n this.initialized = true;\n }\n\n /** Get valid access token, refreshing if needed */\n async getAccessToken(\n doRefresh: (refreshToken: string) => Promise<TokenPair>,\n ): Promise<string | null> {\n await this.initPromise;\n\n if (this.accessToken && !isTokenExpired(this.accessToken)) {\n return this.accessToken;\n }\n\n const refreshToken = this.refreshToken;\n if (!refreshToken) return null;\n\n // Deduplicate concurrent calls\n if (this.refreshPromise) {\n const result = await this.refreshPromise;\n return result.accessToken;\n }\n\n this.refreshPromise = doRefresh(refreshToken)\n .then((tokens) => {\n this.setTokens(tokens);\n return tokens;\n })\n .catch((err) => {\n if (err instanceof EdgeBaseError && err.code === 401) {\n this.clearTokens();\n }\n throw err;\n })\n .finally(() => {\n this.refreshPromise = null;\n });\n\n const result = await this.refreshPromise;\n return result.accessToken;\n }\n\n /** Set tokens after successful auth (sync in-memory + async persist) */\n setTokens(tokens: TokenPair): void {\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n void this.storage.setItem(REFRESH_TOKEN_KEY, tokens.refreshToken);\n this.updateUser(tokens.accessToken);\n }\n\n /** Get stored refresh token (sync from memory cache) */\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n /** Drop the current access token so the next request must refresh or fail fast. */\n invalidateAccessToken(): void {\n this.accessToken = null;\n if (!this.refreshToken) {\n this.cachedUser = null;\n this.emitAuthStateChange(null);\n }\n }\n\n /** Read-only access to current access token (for websocket re-auth). */\n get currentAccessToken(): string | null {\n return this.accessToken;\n }\n\n /** Clear all tokens on sign-out */\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n void this.storage.removeItem(REFRESH_TOKEN_KEY);\n this.cachedUser = null;\n this.emitAuthStateChange(null);\n }\n\n /** Get current user (from cached JWT payload) */\n getCurrentUser(): TokenUser | null {\n return this.cachedUser;\n }\n\n /** Subscribe to auth state changes. Fires immediately with current state. */\n onAuthStateChange(handler: AuthStateChangeHandler): () => void {\n this.authStateListeners.push(handler);\n handler(this.cachedUser);\n return () => {\n this.authStateListeners = this.authStateListeners.filter((h) => h !== handler);\n };\n }\n\n private updateUser(accessToken: string): void {\n const user = extractUser(accessToken);\n this.cachedUser = user;\n this.emitAuthStateChange(user);\n }\n\n private emitAuthStateChange(user: TokenUser | null): void {\n for (const listener of this.authStateListeners) {\n listener(user);\n }\n }\n\n /** Clean up (no-op in RN, kept for API parity with web SDK) */\n destroy(): void {\n this.authStateListeners = [];\n }\n}\n","/**\n * Auth client for React Native — API parity with @edge-base/web AuthClient.\n *: onAuthStateChange\n *: signInAnonymously\n *: signUp with data\n *: React Native OAuth via Linking API + deep link callback\n *\n * Key differences from web AuthClient:\n * - signInWithOAuth uses Linking.openURL() instead of window.location.href\n * - Handles deep link OAuth callback via Linking.addEventListener\n * - TokenManager.getRefreshToken() is async (AsyncStorage)\n * - Captcha is handled via TurnstileWebView component (see turnstile.tsx)\n */\n\nimport type { HttpClient, GeneratedDbApi } from '@edge-base/core';\nimport type { TokenManager, TokenUser, AuthStateChangeHandler } from './token-manager.js';\n\n// ─── Types ───\n\nexport interface SignUpOptions {\n email: string;\n password: string;\n data?: {\n displayName?: string;\n avatarUrl?: string;\n [key: string]: unknown;\n };\n /** Captcha token from TurnstileWebView */\n captchaToken?: string;\n}\n\nexport interface SignInOptions {\n email: string;\n password: string;\n /** Captcha token from TurnstileWebView */\n captchaToken?: string;\n}\n\nexport interface AuthResult {\n user: TokenUser;\n accessToken: string;\n refreshToken: string;\n}\n\n/** Returned when MFA is required during sign-in */\nexport interface MfaRequiredResult {\n mfaRequired: true;\n mfaTicket: string;\n factors: MfaFactor[];\n}\n\nexport interface MfaFactor {\n id: string;\n type: string;\n}\n\nexport type SignInResult = AuthResult | MfaRequiredResult;\n\nexport interface TotpEnrollResult {\n factorId: string;\n secret: string;\n qrCodeUri: string;\n recoveryCodes: string[];\n}\n\nexport interface DisableTotpOptions {\n password?: string;\n code?: string;\n}\n\nexport interface Session {\n id: string;\n createdAt: string;\n userAgent?: string;\n ip?: string;\n}\n\nexport interface UpdateProfileOptions {\n displayName?: string;\n avatarUrl?: string;\n emailVisibility?: string;\n}\n\nexport interface PasskeysAuthOptions {\n email?: string;\n}\n\nexport interface LinkedIdentity {\n id: string;\n kind: 'oauth';\n provider: string;\n providerUserId: string;\n createdAt: string;\n canUnlink: boolean;\n}\n\nexport interface IdentityMethods {\n total: number;\n hasPassword: boolean;\n hasMagicLink: boolean;\n hasEmailOtp: boolean;\n hasPhone: boolean;\n passkeyCount: number;\n oauthCount: number;\n email?: string | null;\n phone?: string | null;\n}\n\nexport interface IdentitiesResult {\n ok?: boolean;\n identities: LinkedIdentity[];\n methods: IdentityMethods;\n}\n\n/** Minimal Linking interface — compatible with react-native Linking API */\nexport interface LinkingAdapter {\n openURL(url: string): Promise<void>;\n addEventListener(type: 'url', handler: (event: { url: string }) => void): { remove: () => void };\n getInitialURL(): Promise<string | null>;\n}\n\ntype OAuthStartOptions = {\n provider: string;\n redirectUrl?: string;\n captchaToken?: string;\n};\n\n// ─── AuthClient ───\n\nexport class AuthClient {\n private baseUrl: string;\n\n constructor(\n private client: HttpClient,\n private tokenManager: TokenManager,\n private core: GeneratedDbApi,\n private corePublic: GeneratedDbApi,\n private linking?: LinkingAdapter,\n ) {\n this.baseUrl = client.getBaseUrl();\n }\n\n /** Register a new user. Optionally include user metadata. */\n async signUp(options: SignUpOptions): Promise<AuthResult> {\n const body: Record<string, unknown> = {\n email: options.email,\n password: options.password,\n };\n if (options.data) body.data = options.data;\n if (options.captchaToken) body.captchaToken = options.captchaToken;\n\n const result = await this.corePublic.authSignup(body) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** Sign in with email and password. Returns MfaRequiredResult if MFA is enabled. */\n async signIn(options: SignInOptions): Promise<SignInResult> {\n const body: Record<string, unknown> = {\n email: options.email,\n password: options.password,\n };\n if (options.captchaToken) body.captchaToken = options.captchaToken;\n\n const result = await this.corePublic.authSignin(body) as SignInResult;\n if ('mfaRequired' in result && result.mfaRequired) {\n return result;\n }\n const authResult = result as AuthResult;\n this.tokenManager.setTokens({\n accessToken: authResult.accessToken,\n refreshToken: authResult.refreshToken,\n });\n return authResult;\n }\n\n /** Sign out — revokes current session on server and clears local tokens. */\n async signOut(): Promise<void> {\n try {\n const refreshToken = await this.tokenManager.getRefreshToken();\n if (refreshToken) {\n await this.core.authSignout({ refreshToken });\n }\n } catch {\n // Continue even if server call fails\n }\n this.tokenManager.clearTokens();\n }\n\n /** Refresh the current session using the stored refresh token. */\n async refreshSession(): Promise<AuthResult> {\n const refreshToken = await this.tokenManager.getRefreshToken();\n if (!refreshToken) {\n throw new Error('No refresh token available.');\n }\n const result = await this.corePublic.authRefresh({ refreshToken }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /**\n * Start OAuth sign-in flow.\n * Opens the OAuth URL via Linking.openURL() and listens for the deep link callback.\n * The app must be configured with a deep link scheme (e.g. myapp://auth/callback).\n *\n * @param provider - OAuth provider name (e.g. 'google', 'github')\n * @param options.redirectUrl - Deep link URL to redirect back to after OAuth (required for RN)\n * @param options.captchaToken - Optional captcha token\n * @returns Promise that resolves with AuthResult when OAuth completes\n *\n * NOTE: Not delegated to Generated Core — this is URL construction + redirect, not a standard HTTP call.\n */\n signInWithOAuth(\n providerOrOptions: string | OAuthStartOptions,\n options?: { redirectUrl?: string; captchaToken?: string },\n ): { url: string } {\n const provider = typeof providerOrOptions === 'string'\n ? providerOrOptions\n : providerOrOptions.provider;\n const resolvedOptions = typeof providerOrOptions === 'string'\n ? options\n : providerOrOptions;\n let url = `${this.baseUrl}/api/auth/oauth/${encodeURIComponent(provider)}`;\n if (resolvedOptions?.captchaToken) {\n url += `?captcha_token=${encodeURIComponent(resolvedOptions.captchaToken)}`;\n }\n if (resolvedOptions?.redirectUrl) {\n const sep = url.includes('?') ? '&' : '?';\n url += `${sep}redirect_url=${encodeURIComponent(resolvedOptions.redirectUrl)}`;\n }\n\n // Open in system browser via Linking API\n if (this.linking) {\n void this.linking.openURL(url);\n }\n\n return { url };\n }\n\n /**\n * Handle OAuth deep link callback.\n * Call this when your app receives a deep link URL with auth tokens.\n * Extract tokens from query params and store them.\n *\n * @example\n * // In your navigation/linking config:\n * Linking.addEventListener('url', ({ url }) => client.auth.handleOAuthCallback(url));\n */\n async handleOAuthCallback(url: string): Promise<AuthResult | null> {\n try {\n const parsed = new URL(url);\n const accessToken = parsed.searchParams.get('access_token');\n const refreshToken = parsed.searchParams.get('refresh_token');\n if (!accessToken || !refreshToken) return null;\n\n this.tokenManager.setTokens({ accessToken, refreshToken });\n\n return {\n user: this.tokenManager.getCurrentUser()!,\n accessToken,\n refreshToken,\n };\n } catch {\n return null;\n }\n }\n\n /** Sign in anonymously. */\n async signInAnonymously(options?: { captchaToken?: string }): Promise<AuthResult> {\n const body: Record<string, unknown> | undefined = options?.captchaToken\n ? { captchaToken: options.captchaToken }\n : undefined;\n const result = await this.corePublic.authSigninAnonymous(body) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /**\n * Send a magic link (passwordless login) email.\n * If the email is not registered and autoCreate is enabled (server config), a new account is created.\n */\n async signInWithMagicLink(options: { email: string; captchaToken?: string }): Promise<void> {\n const body: Record<string, unknown> = { email: options.email };\n if (options.captchaToken) {\n body.captchaToken = options.captchaToken;\n }\n await this.corePublic.authSigninMagicLink(body);\n }\n\n /**\n * Verify a magic link token and sign in.\n * Called after user clicks the link from their email.\n */\n async verifyMagicLink(token: string): Promise<AuthResult> {\n const result = await this.corePublic.authVerifyMagicLink({ token }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n // ─── Phone / SMS Auth ───\n\n /**\n * Send an SMS verification code to the given phone number.\n * If the phone is not registered and autoCreate is enabled (server config), a new account is created on verify.\n */\n async signInWithPhone(options: { phone: string; captchaToken?: string }): Promise<void> {\n const body: Record<string, unknown> = { phone: options.phone };\n if (options.captchaToken) {\n body.captchaToken = options.captchaToken;\n }\n await this.corePublic.authSigninPhone(body);\n }\n\n /**\n * Verify the SMS code and sign in.\n * Called after user receives the code from signInWithPhone.\n */\n async verifyPhone(options: { phone: string; code: string }): Promise<AuthResult> {\n const result = await this.corePublic.authVerifyPhone({\n phone: options.phone,\n code: options.code,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** Link current account with a phone number. Sends an SMS code. */\n async linkWithPhone(options: { phone: string }): Promise<void> {\n await this.core.authLinkPhone({ phone: options.phone });\n }\n\n /** Verify phone link code. Completes phone linking for the current account. */\n async verifyLinkPhone(options: { phone: string; code: string }): Promise<void> {\n await this.core.authVerifyLinkPhone({\n phone: options.phone,\n code: options.code,\n });\n }\n\n /** Link anonymous account to email/password. */\n async linkWithEmail(options: { email: string; password: string }): Promise<AuthResult> {\n const result = await this.core.authLinkEmail({\n email: options.email,\n password: options.password,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /**\n * Link anonymous account to OAuth provider. Returns URL to open in browser.\n *\n * NOTE: Not delegated — Generated Core's oauthLinkStart(provider) takes no body,\n * but we need to pass { redirectUrl }.\n */\n async linkWithOAuth(\n providerOrOptions: string | { provider: string; redirectUrl?: string },\n options?: { redirectUrl?: string },\n ): Promise<{ redirectUrl: string }> {\n const provider = typeof providerOrOptions === 'string'\n ? providerOrOptions\n : providerOrOptions.provider;\n const resolvedOptions = typeof providerOrOptions === 'string'\n ? options\n : providerOrOptions;\n const redirectUrl = resolvedOptions?.redirectUrl ?? '';\n const result = await this.client.post<{ redirectUrl: string }>(\n `/api/auth/oauth/link/${encodeURIComponent(provider)}`,\n { redirectUrl },\n );\n if (this.linking) {\n void this.linking.openURL(result.redirectUrl);\n }\n return result;\n }\n\n /** Subscribe to authentication state changes. */\n onAuthStateChange(callback: AuthStateChangeHandler): () => void {\n return this.tokenManager.onAuthStateChange(callback);\n }\n\n /** Get current authenticated user (from cached JWT). */\n get currentUser(): TokenUser | null {\n return this.tokenManager.getCurrentUser();\n }\n\n /** List active sessions. */\n async listSessions(): Promise<Session[]> {\n const result = await this.core.authGetSessions() as { sessions: Session[] };\n return result.sessions;\n }\n\n /** Revoke a specific session. */\n async revokeSession(sessionId: string): Promise<void> {\n await this.core.authDeleteSession(sessionId);\n }\n\n /** Update current user's profile. */\n async updateProfile(data: UpdateProfileOptions): Promise<TokenUser> {\n const result = await this.core.authUpdateProfile(data) as AuthResult;\n if (result.accessToken && result.refreshToken) {\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n }\n return this.tokenManager.getCurrentUser()!;\n }\n\n /** Verify email address with token. */\n async verifyEmail(token: string): Promise<void> {\n await this.corePublic.authVerifyEmail({ token });\n }\n\n /** Request a verification email for the current user. */\n async requestEmailVerification(options?: { redirectUrl?: string }): Promise<void> {\n const body: Record<string, unknown> = {};\n if (options?.redirectUrl) body.redirectUrl = options.redirectUrl;\n await this.core.authRequestEmailVerification(body);\n }\n\n /** Verify a pending email change using the emailed token. */\n async verifyEmailChange(token: string): Promise<void> {\n await this.corePublic.authVerifyEmailChange({ token });\n }\n\n /** Request password reset email. */\n async requestPasswordReset(\n email: string,\n options?: { captchaToken?: string },\n ): Promise<void> {\n const body: Record<string, unknown> = { email };\n if (options?.captchaToken) body.captchaToken = options.captchaToken;\n await this.corePublic.authRequestPasswordReset(body);\n }\n\n /** Reset password with token. */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.corePublic.authResetPassword({ token, newPassword });\n }\n\n /** Change password for authenticated user. */\n async changePassword(options: {\n currentPassword: string;\n newPassword: string;\n }): Promise<AuthResult> {\n const result = await this.core.authChangePassword({\n currentPassword: options.currentPassword,\n newPassword: options.newPassword,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** Request an email change for the authenticated user. */\n async changeEmail(options: { newEmail: string; password: string; redirectUrl?: string }): Promise<void> {\n const body: Record<string, unknown> = {\n newEmail: options.newEmail,\n password: options.password,\n };\n if (options.redirectUrl) body.redirectUrl = options.redirectUrl;\n await this.client.post('/api/auth/change-email', body);\n }\n\n /** List linked sign-in identities for the current user. */\n async listIdentities(): Promise<IdentitiesResult> {\n return this.client.get('/api/auth/identities') as Promise<IdentitiesResult>;\n }\n\n /** Unlink a linked OAuth identity by its identity ID. */\n async unlinkIdentity(identityId: string): Promise<IdentitiesResult> {\n return this.client.delete(`/api/auth/identities/${encodeURIComponent(identityId)}`) as Promise<IdentitiesResult>;\n }\n\n /** Send an email OTP code for sign-in. */\n async signInWithEmailOtp(options: { email: string }): Promise<void> {\n await this.corePublic.authSigninEmailOtp({ email: options.email });\n }\n\n /** Verify an email OTP code and sign in. */\n async verifyEmailOtp(options: { email: string; code: string }): Promise<AuthResult> {\n const result = await this.corePublic.authVerifyEmailOtp({\n email: options.email,\n code: options.code,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n // ─── Passkeys / WebAuthn REST layer ───\n\n /** Generate WebAuthn registration options for the current authenticated user. */\n async passkeysRegisterOptions(): Promise<unknown> {\n return this.core.authPasskeysRegisterOptions();\n }\n\n /** Verify and store a passkey registration response from the platform credential API. */\n async passkeysRegister(response: unknown): Promise<unknown> {\n return this.core.authPasskeysRegister({ response });\n }\n\n /** Generate WebAuthn authentication options. */\n async passkeysAuthOptions(options?: PasskeysAuthOptions): Promise<unknown> {\n return this.corePublic.authPasskeysAuthOptions(options ?? {});\n }\n\n /** Verify a WebAuthn assertion and establish a session. */\n async passkeysAuthenticate(response: unknown): Promise<AuthResult> {\n const result = await this.corePublic.authPasskeysAuthenticate({ response }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** List registered passkeys for the current authenticated user. */\n async passkeysList(): Promise<unknown> {\n return this.core.authPasskeysList();\n }\n\n /** Delete a registered passkey by credential ID. */\n async passkeysDelete(credentialId: string): Promise<unknown> {\n return this.core.authPasskeysDelete(credentialId);\n }\n\n // ─── MFA / TOTP ───\n\n /** MFA sub-namespace for TOTP enrollment, verification, and management. */\n get mfa() {\n const client = this.client;\n const core = this.core;\n const corePublic = this.corePublic;\n const tokenManager = this.tokenManager;\n return {\n /** Enroll TOTP — returns secret, QR code URI, and recovery codes. */\n async enrollTotp(): Promise<TotpEnrollResult> {\n return core.authMfaTotpEnroll() as Promise<TotpEnrollResult>;\n },\n\n /** Verify TOTP enrollment with factorId and a TOTP code. */\n async verifyTotpEnrollment(factorId: string, code: string): Promise<{ ok: true }> {\n return core.authMfaTotpVerify({ factorId, code }) as Promise<{ ok: true }>;\n },\n\n /** Verify TOTP code during MFA challenge (after signIn returns mfaRequired). */\n async verifyTotp(mfaTicket: string, code: string): Promise<AuthResult> {\n const result = await corePublic.authMfaVerify({\n mfaTicket,\n code,\n }) as AuthResult;\n tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n },\n\n /** Use a recovery code during MFA challenge. */\n async useRecoveryCode(mfaTicket: string, recoveryCode: string): Promise<AuthResult> {\n const result = await corePublic.authMfaRecovery({\n mfaTicket,\n recoveryCode,\n }) as AuthResult;\n tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n },\n\n /**\n * Disable TOTP for the current user. Requires password or TOTP code.\n */\n async disableTotp(options?: DisableTotpOptions): Promise<{ ok: true }> {\n return core.authMfaTotpDelete(options ?? {}) as Promise<{ ok: true }>;\n },\n\n /** List enrolled MFA factors for the current user. */\n async listFactors(): Promise<{ factors: MfaFactor[] }> {\n return core.authMfaFactors() as Promise<{ factors: MfaFactor[] }>;\n },\n };\n }\n\n}\n","import { EdgeBaseError } from '@edge-base/core';\n\ninterface RefreshResponse {\n accessToken?: string;\n refreshToken?: string;\n message?: string;\n}\n\nexport async function refreshAccessToken(baseUrl: string, refreshToken: string): Promise<{\n accessToken: string;\n refreshToken: string;\n}> {\n let response: Response;\n\n try {\n response = await fetch(`${baseUrl.replace(/\\/$/, '')}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n });\n } catch (error) {\n throw new EdgeBaseError(\n 0,\n `Network error: ${error instanceof Error ? error.message : 'Failed to refresh access token.'}`,\n );\n }\n\n const body = await response.json().catch(() => null) as RefreshResponse | null;\n if (!response.ok) {\n throw new EdgeBaseError(\n response.status,\n typeof body?.message === 'string' ? body.message : 'Failed to refresh access token.',\n );\n }\n\n if (!body?.accessToken || !body?.refreshToken) {\n throw new EdgeBaseError(500, 'Invalid auth refresh response.');\n }\n\n return {\n accessToken: body.accessToken,\n refreshToken: body.refreshToken,\n };\n}\n","import type { ContextManager, IDatabaseLiveSubscriber } from '@edge-base/core';\nimport { EdgeBaseError } from '@edge-base/core';\nimport type { TokenManager, TokenUser } from './token-manager.js';\nimport { refreshAccessToken } from './auth-refresh.js';\n\nexport type ChangeType = 'added' | 'modified' | 'removed';\nexport type FilterTuple = [string, string, unknown];\n\ntype ErrorHandler = (error: { code: string; message: string }) => void;\n\ninterface DbChange<T = Record<string, unknown>> {\n changeType: ChangeType;\n table: string;\n docId: string;\n data: T | null;\n timestamp: string;\n}\n\ninterface Subscription {\n channel: string;\n handler: (change: DbChange) => void;\n filters?: Record<string, unknown>;\n serverFilters?: FilterTuple[];\n serverOrFilters?: FilterTuple[];\n}\n\nexport interface DatabaseLiveOptions {\n autoReconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n}\n\nexport class DatabaseLiveClient implements IDatabaseLiveSubscriber {\n private ws: WebSocket | null = null;\n private connectingPromise: Promise<void> | null = null;\n private subscriptions = new Map<string, Subscription[]>();\n private connectedChannels = new Set<string>();\n private channelFilters = new Map<string, FilterTuple[]>();\n private channelOrFilters = new Map<string, FilterTuple[]>();\n private errorHandlers: ErrorHandler[] = [];\n private reconnectAttempts = 0;\n private connected = false;\n private authenticated = false;\n private waitingForAuth = false;\n private authRecoveryPromise: Promise<void> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private unsubAuthState: (() => void) | null = null;\n\n private options: Required<DatabaseLiveOptions>;\n\n constructor(\n private baseUrl: string,\n private tokenManager: TokenManager,\n options?: DatabaseLiveOptions,\n contextManager?: ContextManager,\n ) {\n this.options = {\n autoReconnect: options?.autoReconnect ?? true,\n maxReconnectAttempts: options?.maxReconnectAttempts ?? 10,\n reconnectBaseDelay: options?.reconnectBaseDelay ?? 1000,\n };\n\n if (contextManager) {\n contextManager.onContextChange(() => this.handleContextChange());\n }\n\n this.unsubAuthState = this.tokenManager.onAuthStateChange((user) => {\n this.handleAuthStateChange(user);\n });\n }\n\n onSnapshot<T>(\n channel: string,\n callback: (change: DbChange<T>) => void,\n clientFilters?: unknown,\n serverFilters?: unknown,\n serverOrFilters?: unknown,\n ): () => void {\n const sub: Subscription = {\n channel,\n handler: callback as (change: DbChange) => void,\n filters: clientFilters as Record<string, unknown> | undefined,\n serverFilters: serverFilters as FilterTuple[] | undefined,\n serverOrFilters: serverOrFilters as FilterTuple[] | undefined,\n };\n\n if (!this.subscriptions.has(channel)) {\n this.subscriptions.set(channel, []);\n }\n this.subscriptions.get(channel)!.push(sub);\n\n if (sub.serverFilters && sub.serverFilters.length > 0) {\n this.channelFilters.set(channel, sub.serverFilters);\n }\n if (sub.serverOrFilters && sub.serverOrFilters.length > 0) {\n this.channelOrFilters.set(channel, sub.serverOrFilters);\n }\n\n this.connect(channel).catch(() => {});\n\n return () => {\n const subs = this.subscriptions.get(channel);\n if (!subs) return;\n const idx = subs.indexOf(sub);\n if (idx >= 0) subs.splice(idx, 1);\n if (subs.length === 0) {\n this.subscriptions.delete(channel);\n this.channelFilters.delete(channel);\n this.channelOrFilters.delete(channel);\n this.sendUnsubscribe(channel);\n }\n };\n }\n\n onError(handler: ErrorHandler): () => void {\n this.errorHandlers.push(handler);\n return () => {\n const idx = this.errorHandlers.indexOf(handler);\n if (idx >= 0) this.errorHandlers.splice(idx, 1);\n };\n }\n\n async connect(channel: string): Promise<void> {\n this.connectedChannels.add(channel);\n\n if (this.ws && this.connected) {\n this.sendSubscribe(channel);\n return;\n }\n\n if (!this.hasAuthContext()) {\n this.waitingForAuth = true;\n return;\n }\n\n if (this.connectingPromise) {\n return this.connectingPromise;\n }\n\n const connection = this.establishConnection(channel).finally(() => {\n if (this.connectingPromise === connection) {\n this.connectingPromise = null;\n }\n });\n this.connectingPromise = connection;\n return connection;\n }\n\n reconnect(): void {\n if (this.connected || this.connectedChannels.size === 0) return;\n const firstChannel = this.connectedChannels.values().next().value as string | undefined;\n if (!firstChannel) return;\n this.reconnectAttempts = 0;\n this.options.autoReconnect = true;\n this.connect(firstChannel).catch(() => {});\n }\n\n disconnect(): void {\n this.options.autoReconnect = false;\n this.stopHeartbeat();\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n this.connected = false;\n this.authenticated = false;\n this.connectingPromise = null;\n this.connectedChannels.clear();\n this.subscriptions.clear();\n this.channelFilters.clear();\n this.channelOrFilters.clear();\n this.errorHandlers = [];\n this.unsubAuthState?.();\n this.unsubAuthState = null;\n }\n\n private async establishConnection(channel: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.buildWsUrl(channel));\n this.ws = ws;\n\n ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.authenticate()\n .then(() => {\n this.waitingForAuth = false;\n resolve();\n })\n .catch((error) => {\n this.handleAuthenticationFailure(error);\n reject(error);\n });\n };\n\n ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n\n ws.onclose = () => {\n this.connected = false;\n this.authenticated = false;\n this.ws = null;\n this.stopHeartbeat();\n if (\n this.options.autoReconnect\n && !this.waitingForAuth\n && this.reconnectAttempts < this.options.maxReconnectAttempts\n ) {\n this.scheduleReconnect(channel);\n }\n };\n\n ws.onerror = () => {\n reject(new EdgeBaseError(500, 'Database live WebSocket connection error'));\n };\n });\n }\n\n private async authenticate(): Promise<void> {\n const token = await this.tokenManager.getAccessToken((refreshToken) =>\n refreshAccessToken(this.baseUrl, refreshToken),\n );\n if (!token) throw new EdgeBaseError(401, 'No access token available. Sign in first.');\n this.sendRaw({ type: 'auth', token, sdkVersion: '0.1.0' });\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new EdgeBaseError(401, 'Auth timeout')), 10000);\n const original = this.ws?.onmessage;\n if (!this.ws) return;\n\n this.ws.onmessage = (event) => {\n const msg = JSON.parse(event.data as string) as Record<string, unknown>;\n if (msg.type === 'auth_success' || msg.type === 'auth_refreshed') {\n clearTimeout(timeout);\n this.authenticated = true;\n if (this.ws) this.ws.onmessage = original ?? null;\n if (msg.type === 'auth_refreshed') {\n const revoked = (msg.revokedChannels as string[] | undefined) ?? [];\n for (const channel of revoked) {\n this.subscriptions.delete(channel);\n this.channelFilters.delete(channel);\n this.channelOrFilters.delete(channel);\n this.connectedChannels.delete(channel);\n }\n }\n this.resubscribeAll();\n resolve();\n } else if (msg.type === 'error') {\n clearTimeout(timeout);\n reject(new EdgeBaseError(401, msg.message as string));\n }\n };\n });\n }\n\n private handleMessage(raw: string): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n const type = msg.type as string;\n\n if (type === 'db_change') {\n const change: DbChange = {\n changeType: msg.changeType as ChangeType,\n table: msg.table as string,\n docId: msg.docId as string,\n data: msg.data as Record<string, unknown> | null,\n timestamp: msg.timestamp as string,\n };\n const messageChannel = typeof msg.channel === 'string' ? msg.channel : undefined;\n for (const [channel, subs] of this.subscriptions.entries()) {\n if (!matchesDatabaseLiveChannel(channel, change, messageChannel)) continue;\n for (const sub of subs) {\n if (sub.filters && change.data && !matchesClientFilter(change.data, sub.filters)) continue;\n sub.handler(change);\n }\n }\n return;\n }\n\n if (type === 'batch_changes') {\n const changes = msg.changes as Array<{ event: string; docId: string; data: Record<string, unknown> | null; timestamp: string }>;\n if (!Array.isArray(changes)) return;\n for (const entry of changes) {\n const change: DbChange = {\n changeType: entry.event as ChangeType,\n table: (msg.table as string | undefined) ?? '',\n docId: entry.docId,\n data: entry.data,\n timestamp: entry.timestamp,\n };\n const messageChannel = typeof msg.channel === 'string' ? msg.channel : undefined;\n for (const [channel, subs] of this.subscriptions.entries()) {\n if (!matchesDatabaseLiveChannel(channel, change, messageChannel)) continue;\n for (const sub of subs) {\n if (sub.filters && change.data && !matchesClientFilter(change.data, sub.filters)) continue;\n sub.handler(change);\n }\n }\n }\n return;\n }\n\n if (type === 'FILTER_RESYNC') {\n this.resyncFilters();\n return;\n }\n\n if (type === 'auth_refreshed') {\n const revoked = (msg.revokedChannels as string[] | undefined) ?? [];\n for (const channel of revoked) {\n this.subscriptions.delete(channel);\n this.channelFilters.delete(channel);\n this.channelOrFilters.delete(channel);\n this.connectedChannels.delete(channel);\n }\n return;\n }\n\n if (type === 'error') {\n if ((msg.code as string | undefined) === 'NOT_AUTHENTICATED' && this.hasAuthContext()) {\n this.recoverAuthentication();\n return;\n }\n for (const handler of this.errorHandlers) {\n handler({ code: msg.code as string, message: msg.message as string });\n }\n }\n }\n\n private sendSubscribe(channel: string): void {\n if (!this.authenticated) return;\n const filters = this.channelFilters.get(channel);\n const orFilters = this.channelOrFilters.get(channel);\n const msg: Record<string, unknown> = { type: 'subscribe', channel };\n if (filters && filters.length > 0) msg.filters = filters;\n if (orFilters && orFilters.length > 0) msg.orFilters = orFilters;\n this.sendRaw(msg);\n }\n\n private sendUnsubscribe(channel: string): void {\n this.connectedChannels.delete(channel);\n if (this.authenticated) this.sendRaw({ type: 'unsubscribe', channel });\n }\n\n private resubscribeAll(): void {\n for (const channel of this.connectedChannels) this.sendSubscribe(channel);\n }\n\n private refreshAuth(): void {\n const token = this.tokenManager.currentAccessToken;\n if (!token || !this.ws || !this.connected) return;\n this.sendRaw({ type: 'auth', token, sdkVersion: '0.1.0' });\n }\n\n private handleAuthStateChange(user: TokenUser | null): void {\n if (user) {\n if (this.ws && this.connected && this.authenticated) {\n this.refreshAuth();\n return;\n }\n\n this.waitingForAuth = false;\n if (this.connectedChannels.size > 0 && (!this.ws || !this.connected)) {\n const firstChannel = this.connectedChannels.values().next().value as string | undefined;\n if (firstChannel) {\n this.reconnectAttempts = 0;\n this.connect(firstChannel).catch(() => {});\n }\n }\n return;\n }\n\n this.waitingForAuth = this.connectedChannels.size > 0;\n if (this.ws) {\n const socket = this.ws;\n this.stopHeartbeat();\n this.ws = null;\n this.connected = false;\n this.authenticated = false;\n try {\n socket.close(1000, 'Signed out');\n } catch {\n // Ignore close failures.\n }\n return;\n }\n\n this.connected = false;\n this.authenticated = false;\n }\n\n private handleAuthenticationFailure(error: unknown): void {\n const authError =\n error instanceof EdgeBaseError\n ? error\n : new EdgeBaseError(500, 'Database live authentication failed.');\n\n this.waitingForAuth = authError.code === 401 && this.connectedChannels.size > 0;\n this.stopHeartbeat();\n this.connected = false;\n this.authenticated = false;\n\n if (this.ws) {\n const socket = this.ws;\n this.ws = null;\n try {\n socket.close(4001, authError.message);\n } catch {\n // Ignore close failures.\n }\n }\n }\n\n private resyncFilters(): void {\n for (const [channel] of this.channelFilters) {\n const filters = this.channelFilters.get(channel) ?? [];\n const orFilters = this.channelOrFilters.get(channel) ?? [];\n if (filters.length > 0 || orFilters.length > 0) {\n const msg: Record<string, unknown> = { type: 'subscribe', channel };\n if (filters.length > 0) msg.filters = filters;\n if (orFilters.length > 0) msg.orFilters = orFilters;\n this.sendRaw(msg);\n }\n }\n }\n\n private scheduleReconnect(channel: string): void {\n const delay = this.options.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n setTimeout(() => { this.connect(channel).catch(() => {}); }, Math.min(delay, 30000));\n }\n\n private buildWsUrl(channel: string): string {\n const wsUrl = this.baseUrl.replace(/\\/$/, '').replace(/^http/, 'ws');\n return `${wsUrl}/api/db/subscribe?channel=${encodeURIComponent(channel)}`;\n }\n\n private sendRaw(msg: Record<string, unknown>): void {\n if (this.ws && this.connected) this.ws.send(JSON.stringify(msg));\n }\n\n private hasAuthContext(): boolean {\n return Boolean(this.tokenManager.getCurrentUser() || this.tokenManager.getRefreshToken());\n }\n\n private recoverAuthentication(): void {\n if (this.authRecoveryPromise || !this.ws || !this.connected || !this.hasAuthContext()) {\n return;\n }\n\n this.authenticated = false;\n this.waitingForAuth = true;\n this.authRecoveryPromise = this.authenticate()\n .then(() => {\n this.waitingForAuth = false;\n })\n .catch((error) => {\n this.handleAuthenticationFailure(error);\n for (const handler of this.errorHandlers) {\n handler({\n code: 'NOT_AUTHENTICATED',\n message: 'Database live authentication was lost and recovery failed.',\n });\n }\n })\n .finally(() => {\n this.authRecoveryPromise = null;\n });\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.ws && this.connected) this.sendRaw({ type: 'ping' });\n }, 30000);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = null; }\n }\n\n private handleContextChange(): void {\n if (!this.ws || !this.connected) return;\n if (this.connectedChannels.size === 0) return;\n this.stopHeartbeat();\n this.ws.close(1000, 'Context change');\n this.ws = null;\n this.connected = false;\n this.authenticated = false;\n this.reconnectAttempts = 0;\n const firstChannel = this.connectedChannels.values().next().value as string | undefined;\n if (firstChannel) this.connect(firstChannel).catch(() => {});\n }\n}\n\nfunction matchesClientFilter(data: Record<string, unknown>, filters: Record<string, unknown>): boolean {\n for (const [key, expected] of Object.entries(filters)) {\n if (data[key] !== expected) return false;\n }\n return true;\n}\n\nfunction matchesDatabaseLiveChannel(channel: string, change: DbChange, messageChannel?: string): boolean {\n if (messageChannel) return channel === messageChannel;\n const parts = channel.split(':');\n if (parts[0] !== 'dblive') return false;\n if (parts.length === 2) return parts[1] === change.table;\n if (parts.length === 3) return parts[2] === change.table;\n if (parts.length === 4) {\n if (parts[2] === change.table) return change.docId === parts[3];\n return parts[3] === change.table;\n }\n return parts[3] === change.table && change.docId === parts[4];\n}\n","/**\n * RoomClient v2 — Client-side room connection for real-time multiplayer state.\n *\n *: Complete redesign from v1.\n * - 3 state areas: sharedState (all clients), playerState (per-player), serverState (server-only, not sent)\n * - Client can only read + subscribe + send(). All writes are server-only.\n * - send() returns a Promise resolved by requestId matching\n * - Subscription returns { unsubscribe() } object\n * - namespace + roomId identification (replaces single roomId)\n */\nimport type { TokenManager, TokenUser } from './token-manager.js';\nimport { EdgeBaseError } from '@edge-base/core';\nimport { refreshAccessToken } from './auth-refresh.js';\n\n// ─── Types ───\n\nexport interface RoomOptions {\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Max reconnect attempts (default: 10) */\n maxReconnectAttempts?: number;\n /** Base delay for reconnect backoff in ms (default: 1000) */\n reconnectBaseDelay?: number;\n /** Timeout for send() requests in ms (default: 10000) */\n sendTimeout?: number;\n}\n\nexport interface Subscription {\n unsubscribe(): void;\n}\n\nexport type SharedStateHandler = (state: Record<string, unknown>, changes: Record<string, unknown>) => void;\nexport type PlayerStateHandler = (state: Record<string, unknown>, changes: Record<string, unknown>) => void;\nexport type MessageHandler = (data: unknown) => void;\nexport type ErrorHandler = (error: { code: string; message: string }) => void;\nexport type KickedHandler = () => void;\nexport type RoomConnectionState =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'disconnected'\n | 'auth_lost'\n | 'kicked';\nexport type RoomMemberLeaveReason = 'leave' | 'timeout' | 'kicked';\n\nexport interface RoomSignalMeta {\n memberId?: string | null;\n userId?: string | null;\n connectionId?: string | null;\n sentAt?: number;\n serverSent?: boolean;\n}\n\nexport interface RoomMember {\n memberId: string;\n userId: string;\n connectionId?: string;\n connectionCount?: number;\n role?: string;\n state: Record<string, unknown>;\n}\n\nexport interface RoomReconnectInfo {\n attempt: number;\n}\n\nexport type RoomMediaKind = 'audio' | 'video' | 'screen';\n\nexport interface RoomMediaTrack {\n kind: RoomMediaKind;\n trackId?: string;\n deviceId?: string;\n muted: boolean;\n publishedAt?: number;\n adminDisabled?: boolean;\n}\n\nexport interface RoomMemberMediaKindState {\n published: boolean;\n muted: boolean;\n trackId?: string;\n deviceId?: string;\n publishedAt?: number;\n adminDisabled?: boolean;\n}\n\nexport interface RoomMemberMediaState {\n audio?: RoomMemberMediaKindState;\n video?: RoomMemberMediaKindState;\n screen?: RoomMemberMediaKindState;\n}\n\nexport interface RoomMediaMember {\n member: RoomMember;\n state: RoomMemberMediaState;\n tracks: RoomMediaTrack[];\n}\n\nexport interface RoomMediaDeviceChange {\n kind: RoomMediaKind;\n deviceId: string;\n}\n\n// ─── Helpers ───\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current: any = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key];\n }\n const lastKey = parts[parts.length - 1];\n if (value === null) {\n delete current[lastKey];\n } else {\n current[lastKey] = value;\n }\n}\n\nfunction generateRequestId(): string {\n // Use crypto.randomUUID if available, fallback to simple counter\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value ?? null)) as T;\n}\n\nfunction cloneRecord<T extends Record<string, unknown>>(value: T): T {\n return cloneValue(value);\n}\n\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst ROOM_EXPLICIT_LEAVE_CLOSE_CODE = 4005;\nconst ROOM_EXPLICIT_LEAVE_REASON = 'Client left room';\nconst ROOM_EXPLICIT_LEAVE_CLOSE_DELAY_MS = 40;\n\nfunction isSocketOpenOrConnecting(socket: Pick<WebSocket, 'readyState'> | null | undefined): boolean {\n return !!socket && (socket.readyState === WS_OPEN || socket.readyState === WS_CONNECTING);\n}\n\nfunction closeSocketAfterLeave(socket: Pick<WebSocket, 'close'>, reason: string): void {\n globalThis.setTimeout(() => {\n try {\n socket.close(ROOM_EXPLICIT_LEAVE_CLOSE_CODE, reason);\n } catch {\n // Socket already closed.\n }\n }, ROOM_EXPLICIT_LEAVE_CLOSE_DELAY_MS);\n}\n\n// ─── RoomClient v2 ───\n\nexport class RoomClient {\n private baseUrl: string;\n private tokenManager: TokenManager;\n private options: Required<RoomOptions>;\n\n /** Room namespace (e.g. 'game', 'chat') */\n public readonly namespace: string;\n /** Room instance ID within the namespace */\n public readonly roomId: string;\n\n // ─── State ───\n private _sharedState: Record<string, unknown> = {};\n private _sharedVersion = 0;\n private _playerState: Record<string, unknown> = {};\n private _playerVersion = 0;\n private _members: RoomMember[] = [];\n private _mediaMembers: RoomMediaMember[] = [];\n // ─── Connection ───\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private connected = false;\n private authenticated = false;\n private joined = false;\n private currentUserId: string | null = null;\n private currentConnectionId: string | null = null;\n private connectionState: RoomConnectionState = 'idle';\n private reconnectInfo: RoomReconnectInfo | null = null;\n private connectingPromise: Promise<void> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private intentionallyLeft = false;\n private waitingForAuth = false;\n private joinRequested = false;\n private unsubAuthState: (() => void) | null = null;\n\n // ─── Pending send() requests (requestId → { resolve, reject, timeout }) ───\n private pendingRequests = new Map<string, {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingSignalRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingAdminRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingMemberStateRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingMediaRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n\n // ─── Subscriptions ───\n private sharedStateHandlers: SharedStateHandler[] = [];\n private playerStateHandlers: PlayerStateHandler[] = [];\n private messageHandlers = new Map<string, MessageHandler[]>(); // messageType → handlers\n private allMessageHandlers: ((messageType: string, data: unknown) => void)[] = [];\n private errorHandlers: ErrorHandler[] = [];\n private kickedHandlers: KickedHandler[] = [];\n private memberSyncHandlers: Array<(members: RoomMember[]) => void> = [];\n private memberJoinHandlers: Array<(member: RoomMember) => void> = [];\n private memberLeaveHandlers: Array<(member: RoomMember, reason: RoomMemberLeaveReason) => void> = [];\n private memberStateHandlers: Array<(member: RoomMember, state: Record<string, unknown>) => void> = [];\n private signalHandlers = new Map<string, Array<(payload: unknown, meta: RoomSignalMeta) => void>>();\n private anySignalHandlers: Array<(event: string, payload: unknown, meta: RoomSignalMeta) => void> = [];\n private mediaTrackHandlers: Array<(track: RoomMediaTrack, member: RoomMember) => void> = [];\n private mediaTrackRemovedHandlers: Array<(track: RoomMediaTrack, member: RoomMember) => void> = [];\n private mediaStateHandlers: Array<(member: RoomMember, state: RoomMemberMediaState) => void> = [];\n private mediaDeviceHandlers: Array<(member: RoomMember, change: RoomMediaDeviceChange) => void> = [];\n private reconnectHandlers: Array<(info: RoomReconnectInfo) => void> = [];\n private connectionStateHandlers: Array<(state: RoomConnectionState) => void> = [];\n\n readonly state = {\n getShared: (): Record<string, unknown> => this.getSharedState(),\n getMine: (): Record<string, unknown> => this.getPlayerState(),\n onSharedChange: (handler: SharedStateHandler): Subscription => this.onSharedState(handler),\n onMineChange: (handler: PlayerStateHandler): Subscription => this.onPlayerState(handler),\n send: (actionType: string, payload?: unknown): Promise<unknown> => this.send(actionType, payload),\n };\n\n readonly meta = {\n get: (): Promise<Record<string, unknown>> => this.getMetadata(),\n };\n\n readonly signals = {\n send: (event: string, payload?: unknown, options?: { includeSelf?: boolean }): Promise<void> =>\n this.sendSignal(event, payload, options),\n sendTo: (memberId: string, event: string, payload?: unknown): Promise<void> =>\n this.sendSignal(event, payload, { memberId }),\n on: (event: string, handler: (payload: unknown, meta: RoomSignalMeta) => void): Subscription =>\n this.onSignal(event, handler),\n onAny: (handler: (event: string, payload: unknown, meta: RoomSignalMeta) => void): Subscription =>\n this.onAnySignal(handler),\n };\n\n readonly members = {\n list: (): RoomMember[] => cloneValue(this._members),\n onSync: (handler: (members: RoomMember[]) => void): Subscription => this.onMembersSync(handler),\n onJoin: (handler: (member: RoomMember) => void): Subscription => this.onMemberJoin(handler),\n onLeave: (handler: (member: RoomMember, reason: RoomMemberLeaveReason) => void): Subscription =>\n this.onMemberLeave(handler),\n setState: (state: Record<string, unknown>): Promise<void> => this.sendMemberState(state),\n clearState: (): Promise<void> => this.clearMemberState(),\n onStateChange: (handler: (member: RoomMember, state: Record<string, unknown>) => void): Subscription =>\n this.onMemberStateChange(handler),\n };\n\n readonly admin = {\n kick: (memberId: string): Promise<void> => this.sendAdmin('kick', memberId),\n mute: (memberId: string): Promise<void> => this.sendAdmin('mute', memberId),\n block: (memberId: string): Promise<void> => this.sendAdmin('block', memberId),\n setRole: (memberId: string, role: string): Promise<void> =>\n this.sendAdmin('setRole', memberId, { role }),\n disableVideo: (memberId: string): Promise<void> => this.sendAdmin('disableVideo', memberId),\n stopScreenShare: (memberId: string): Promise<void> => this.sendAdmin('stopScreenShare', memberId),\n };\n\n readonly media = {\n list: (): RoomMediaMember[] => cloneValue(this._mediaMembers),\n audio: {\n enable: (payload?: { trackId?: string; deviceId?: string }): Promise<void> =>\n this.sendMedia('publish', 'audio', payload),\n disable: (): Promise<void> => this.sendMedia('unpublish', 'audio'),\n setMuted: (muted: boolean): Promise<void> => this.sendMedia('mute', 'audio', { muted }),\n },\n video: {\n enable: (payload?: { trackId?: string; deviceId?: string }): Promise<void> =>\n this.sendMedia('publish', 'video', payload),\n disable: (): Promise<void> => this.sendMedia('unpublish', 'video'),\n setMuted: (muted: boolean): Promise<void> => this.sendMedia('mute', 'video', { muted }),\n },\n screen: {\n start: (payload?: { trackId?: string; deviceId?: string }): Promise<void> =>\n this.sendMedia('publish', 'screen', payload),\n stop: (): Promise<void> => this.sendMedia('unpublish', 'screen'),\n },\n devices: {\n switch: (payload: {\n audioInputId?: string;\n videoInputId?: string;\n screenInputId?: string;\n }): Promise<void> => this.switchMediaDevices(payload),\n },\n onTrack: (handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription =>\n this.onMediaTrack(handler),\n onTrackRemoved: (handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription =>\n this.onMediaTrackRemoved(handler),\n onStateChange: (handler: (member: RoomMember, state: RoomMemberMediaState) => void): Subscription =>\n this.onMediaStateChange(handler),\n onDeviceChange: (handler: (member: RoomMember, change: RoomMediaDeviceChange) => void): Subscription =>\n this.onMediaDeviceChange(handler),\n };\n\n readonly session = {\n onError: (handler: ErrorHandler): Subscription => this.onError(handler),\n onKicked: (handler: KickedHandler): Subscription => this.onKicked(handler),\n onReconnect: (handler: (info: RoomReconnectInfo) => void): Subscription => this.onReconnect(handler),\n onConnectionStateChange: (handler: (state: RoomConnectionState) => void): Subscription =>\n this.onConnectionStateChange(handler),\n };\n\n constructor(\n baseUrl: string,\n namespace: string,\n roomId: string,\n tokenManager: TokenManager,\n options?: RoomOptions,\n ) {\n this.baseUrl = baseUrl;\n this.namespace = namespace;\n this.roomId = roomId;\n this.tokenManager = tokenManager;\n this.options = {\n autoReconnect: options?.autoReconnect ?? true,\n maxReconnectAttempts: options?.maxReconnectAttempts ?? 10,\n reconnectBaseDelay: options?.reconnectBaseDelay ?? 1000,\n sendTimeout: options?.sendTimeout ?? 10000,\n };\n\n this.unsubAuthState = this.tokenManager.onAuthStateChange((user) => {\n this.handleAuthStateChange(user);\n });\n }\n\n // ─── State Accessors ───\n\n /** Get current shared state (read-only snapshot) */\n getSharedState(): Record<string, unknown> {\n return cloneRecord(this._sharedState);\n }\n\n /** Get current player state (read-only snapshot) */\n getPlayerState(): Record<string, unknown> {\n return cloneRecord(this._playerState);\n }\n\n // ─── Metadata (HTTP, no WebSocket needed) ───\n\n /**\n * Get room metadata without joining (HTTP GET).\n * Returns developer-defined metadata set by room.setMetadata() on the server.\n */\n async getMetadata(): Promise<Record<string, unknown>> {\n return RoomClient.getMetadata(this.baseUrl, this.namespace, this.roomId);\n }\n\n /**\n * Static: Get room metadata without creating a RoomClient instance.\n * Useful for lobby screens where you need room info before joining.\n */\n static async getMetadata(\n baseUrl: string,\n namespace: string,\n roomId: string,\n ): Promise<Record<string, unknown>> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/room/metadata?namespace=${encodeURIComponent(namespace)}&id=${encodeURIComponent(roomId)}`;\n const res = await fetch(url);\n if (!res.ok) {\n throw new EdgeBaseError(res.status, `Failed to get room metadata: ${res.statusText}`);\n }\n return res.json() as Promise<Record<string, unknown>>;\n }\n\n // ─── Connection Lifecycle ───\n\n /** Connect to the room, authenticate, and join */\n async join(): Promise<void> {\n this.intentionallyLeft = false;\n this.joinRequested = true;\n if (isSocketOpenOrConnecting(this.ws)) {\n return this.connectingPromise ?? Promise.resolve();\n }\n this.setConnectionState(this.reconnectInfo ? 'reconnecting' : 'connecting');\n return this.ensureConnection();\n }\n\n /** Leave the room and disconnect. Cleans up all pending requests. */\n leave(): void {\n this.intentionallyLeft = true;\n this.joinRequested = false;\n this.waitingForAuth = false;\n this.stopHeartbeat();\n\n // Reject all pending send() requests\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new EdgeBaseError(499, 'Room left'));\n }\n this.pendingRequests.clear();\n this.rejectPendingVoidRequests(this.pendingSignalRequests, new EdgeBaseError(499, 'Room left'));\n this.rejectPendingVoidRequests(this.pendingAdminRequests, new EdgeBaseError(499, 'Room left'));\n this.rejectPendingVoidRequests(this.pendingMemberStateRequests, new EdgeBaseError(499, 'Room left'));\n this.rejectPendingVoidRequests(this.pendingMediaRequests, new EdgeBaseError(499, 'Room left'));\n\n if (this.ws) {\n const socket = this.ws;\n this.sendRaw({ type: 'leave' });\n closeSocketAfterLeave(socket, ROOM_EXPLICIT_LEAVE_REASON);\n this.ws = null;\n }\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this.connectingPromise = null;\n this._sharedState = {};\n this._sharedVersion = 0;\n this._playerState = {};\n this._playerVersion = 0;\n this._members = [];\n this._mediaMembers = [];\n this.currentUserId = null;\n this.currentConnectionId = null;\n this.reconnectInfo = null;\n this.setConnectionState('disconnected');\n }\n\n // ─── Actions ───\n\n /**\n * Send an action to the server.\n * Returns a Promise that resolves with the action result from the server.\n *\n * @example\n * const result = await room.send('SET_SCORE', { score: 42 });\n */\n async send(actionType: string, payload?: unknown): Promise<unknown> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n\n return new Promise<unknown>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Action '${actionType}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n this.sendRaw({\n type: 'send',\n actionType,\n payload: payload ?? {},\n requestId,\n });\n });\n }\n\n // ─── Subscriptions (v2 API) ───\n\n /**\n * Subscribe to shared state changes.\n * Called on full sync and on each shared_delta.\n *\n * @returns Subscription with unsubscribe()\n */\n onSharedState(handler: SharedStateHandler): Subscription {\n this.sharedStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.sharedStateHandlers.indexOf(handler);\n if (idx >= 0) this.sharedStateHandlers.splice(idx, 1);\n },\n };\n }\n\n /**\n * Subscribe to player state changes.\n * Called on full sync and on each player_delta.\n *\n * @returns Subscription with unsubscribe()\n */\n onPlayerState(handler: PlayerStateHandler): Subscription {\n this.playerStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.playerStateHandlers.indexOf(handler);\n if (idx >= 0) this.playerStateHandlers.splice(idx, 1);\n },\n };\n }\n\n /**\n * Subscribe to messages of a specific type sent by room.sendMessage().\n *\n * @example\n * room.onMessage('game_over', (data) => { console.log(data.winner); });\n *\n * @returns Subscription with unsubscribe()\n */\n onMessage(messageType: string, handler: MessageHandler): Subscription {\n if (!this.messageHandlers.has(messageType)) {\n this.messageHandlers.set(messageType, []);\n }\n this.messageHandlers.get(messageType)!.push(handler);\n return {\n unsubscribe: () => {\n const handlers = this.messageHandlers.get(messageType);\n if (handlers) {\n const idx = handlers.indexOf(handler);\n if (idx >= 0) handlers.splice(idx, 1);\n }\n },\n };\n }\n\n /**\n * Subscribe to ALL messages regardless of type.\n *\n * @returns Subscription with unsubscribe()\n */\n onAnyMessage(handler: (messageType: string, data: unknown) => void): Subscription {\n this.allMessageHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.allMessageHandlers.indexOf(handler);\n if (idx >= 0) this.allMessageHandlers.splice(idx, 1);\n },\n };\n }\n\n /** Subscribe to errors */\n onError(handler: ErrorHandler): Subscription {\n this.errorHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.errorHandlers.indexOf(handler);\n if (idx >= 0) this.errorHandlers.splice(idx, 1);\n },\n };\n }\n\n /** Subscribe to kick events */\n onKicked(handler: KickedHandler): Subscription {\n this.kickedHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.kickedHandlers.indexOf(handler);\n if (idx >= 0) this.kickedHandlers.splice(idx, 1);\n },\n };\n }\n\n private onSignal(\n event: string,\n handler: (payload: unknown, meta: RoomSignalMeta) => void,\n ): Subscription {\n if (!this.signalHandlers.has(event)) {\n this.signalHandlers.set(event, []);\n }\n this.signalHandlers.get(event)!.push(handler);\n return {\n unsubscribe: () => {\n const handlers = this.signalHandlers.get(event);\n if (!handlers) return;\n const index = handlers.indexOf(handler);\n if (index >= 0) handlers.splice(index, 1);\n },\n };\n }\n\n private onAnySignal(\n handler: (event: string, payload: unknown, meta: RoomSignalMeta) => void,\n ): Subscription {\n this.anySignalHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.anySignalHandlers.indexOf(handler);\n if (index >= 0) this.anySignalHandlers.splice(index, 1);\n },\n };\n }\n\n private onMembersSync(handler: (members: RoomMember[]) => void): Subscription {\n this.memberSyncHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberSyncHandlers.indexOf(handler);\n if (index >= 0) this.memberSyncHandlers.splice(index, 1);\n },\n };\n }\n\n private onMemberJoin(handler: (member: RoomMember) => void): Subscription {\n this.memberJoinHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberJoinHandlers.indexOf(handler);\n if (index >= 0) this.memberJoinHandlers.splice(index, 1);\n },\n };\n }\n\n private onMemberLeave(\n handler: (member: RoomMember, reason: RoomMemberLeaveReason) => void,\n ): Subscription {\n this.memberLeaveHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberLeaveHandlers.indexOf(handler);\n if (index >= 0) this.memberLeaveHandlers.splice(index, 1);\n },\n };\n }\n\n private onMemberStateChange(\n handler: (member: RoomMember, state: Record<string, unknown>) => void,\n ): Subscription {\n this.memberStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberStateHandlers.indexOf(handler);\n if (index >= 0) this.memberStateHandlers.splice(index, 1);\n },\n };\n }\n\n private onReconnect(handler: (info: RoomReconnectInfo) => void): Subscription {\n this.reconnectHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.reconnectHandlers.indexOf(handler);\n if (index >= 0) this.reconnectHandlers.splice(index, 1);\n },\n };\n }\n\n private onConnectionStateChange(handler: (state: RoomConnectionState) => void): Subscription {\n this.connectionStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.connectionStateHandlers.indexOf(handler);\n if (index >= 0) this.connectionStateHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaTrack(handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription {\n this.mediaTrackHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaTrackHandlers.indexOf(handler);\n if (index >= 0) this.mediaTrackHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaTrackRemoved(handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription {\n this.mediaTrackRemovedHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaTrackRemovedHandlers.indexOf(handler);\n if (index >= 0) this.mediaTrackRemovedHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaStateChange(\n handler: (member: RoomMember, state: RoomMemberMediaState) => void,\n ): Subscription {\n this.mediaStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaStateHandlers.indexOf(handler);\n if (index >= 0) this.mediaStateHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaDeviceChange(\n handler: (member: RoomMember, change: RoomMediaDeviceChange) => void,\n ): Subscription {\n this.mediaDeviceHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaDeviceHandlers.indexOf(handler);\n if (index >= 0) this.mediaDeviceHandlers.splice(index, 1);\n },\n };\n }\n\n private async sendSignal(\n event: string,\n payload?: unknown,\n options?: { includeSelf?: boolean; memberId?: string },\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingSignalRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Signal '${event}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingSignalRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({\n type: 'signal',\n event,\n payload: payload ?? {},\n includeSelf: options?.includeSelf === true,\n memberId: options?.memberId,\n requestId,\n });\n });\n }\n\n private async sendMemberState(state: Record<string, unknown>): Promise<void> {\n return this.sendMemberStateRequest({\n type: 'member_state',\n state,\n });\n }\n\n private async clearMemberState(): Promise<void> {\n return this.sendMemberStateRequest({\n type: 'member_state_clear',\n });\n }\n\n private async sendMemberStateRequest(\n payload: { type: 'member_state'; state: Record<string, unknown> } | { type: 'member_state_clear' },\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingMemberStateRequests.delete(requestId);\n reject(new EdgeBaseError(408, 'Member state update timed out'));\n }, this.options.sendTimeout);\n\n this.pendingMemberStateRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({ ...payload, requestId });\n });\n }\n\n private async sendAdmin(\n operation: string,\n memberId: string,\n payload?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAdminRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Admin operation '${operation}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingAdminRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({\n type: 'admin',\n operation,\n memberId,\n payload: payload ?? {},\n requestId,\n });\n });\n }\n\n private async sendMedia(\n operation: 'publish' | 'unpublish' | 'mute' | 'device',\n kind: RoomMediaKind,\n payload?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingMediaRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Media operation '${operation}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingMediaRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({\n type: 'media',\n operation,\n kind,\n payload: payload ?? {},\n requestId,\n });\n });\n }\n\n private async switchMediaDevices(payload: {\n audioInputId?: string;\n videoInputId?: string;\n screenInputId?: string;\n }): Promise<void> {\n const operations: Promise<void>[] = [];\n if (payload.audioInputId) {\n operations.push(this.sendMedia('device', 'audio', { deviceId: payload.audioInputId }));\n }\n if (payload.videoInputId) {\n operations.push(this.sendMedia('device', 'video', { deviceId: payload.videoInputId }));\n }\n if (payload.screenInputId) {\n operations.push(this.sendMedia('device', 'screen', { deviceId: payload.screenInputId }));\n }\n await Promise.all(operations);\n }\n\n // ─── Private: Connection ───\n\n private async establishConnection(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const wsUrl = this.buildWsUrl();\n const ws = new WebSocket(wsUrl);\n this.ws = ws;\n\n ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.authenticate()\n .then(() => {\n this.waitingForAuth = false;\n resolve();\n })\n .catch((error) => {\n this.handleAuthenticationFailure(error);\n reject(error);\n });\n };\n\n ws.onmessage = (event: MessageEvent) => {\n this.handleMessage(event.data as string);\n };\n\n ws.onclose = (event: CloseEvent) => {\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this.ws = null;\n this.stopHeartbeat();\n if (event.code === 4004 && this.connectionState !== 'kicked') {\n this.handleKicked();\n }\n\n if (\n !this.intentionallyLeft &&\n !this.waitingForAuth &&\n this.options.autoReconnect &&\n this.reconnectAttempts < this.options.maxReconnectAttempts\n ) {\n this.scheduleReconnect();\n } else if (\n !this.intentionallyLeft &&\n this.connectionState !== 'kicked' &&\n this.connectionState !== 'auth_lost'\n ) {\n this.setConnectionState('disconnected');\n }\n };\n\n ws.onerror = () => {\n reject(new EdgeBaseError(500, 'Room WebSocket connection error'));\n };\n });\n }\n\n private ensureConnection(): Promise<void> {\n if (this.connectingPromise) {\n return this.connectingPromise;\n }\n\n const nextPromise = this.establishConnection().finally(() => {\n if (this.connectingPromise === nextPromise) {\n this.connectingPromise = null;\n }\n });\n this.connectingPromise = nextPromise;\n return nextPromise;\n }\n\n private async authenticate(): Promise<void> {\n const token = await this.tokenManager.getAccessToken((refreshToken) =>\n refreshAccessToken(this.baseUrl, refreshToken),\n );\n if (!token) {\n throw new EdgeBaseError(401, 'No access token available. Sign in first.');\n }\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new EdgeBaseError(401, 'Room auth timeout'));\n }, 10000);\n\n const originalOnMessage = this.ws?.onmessage;\n if (this.ws) {\n this.ws.onmessage = (event: MessageEvent) => {\n const msg = JSON.parse(event.data as string) as Record<string, unknown>;\n if (msg.type === 'auth_success' || msg.type === 'auth_refreshed') {\n clearTimeout(timeout);\n this.authenticated = true;\n this.currentUserId = typeof msg.userId === 'string' ? msg.userId : this.currentUserId;\n this.currentConnectionId = typeof msg.connectionId === 'string' ? msg.connectionId : this.currentConnectionId;\n if (this.ws) this.ws.onmessage = originalOnMessage ?? null;\n\n // Send join message with last known state for eviction recovery\n this.sendRaw({\n type: 'join',\n lastSharedState: this._sharedState,\n lastSharedVersion: this._sharedVersion,\n lastPlayerState: this._playerState,\n lastPlayerVersion: this._playerVersion,\n });\n this.joined = true;\n resolve();\n } else if (msg.type === 'error') {\n clearTimeout(timeout);\n reject(new EdgeBaseError(401, msg.message as string));\n }\n };\n }\n\n this.sendRaw({ type: 'auth', token });\n });\n }\n\n // ─── Private: Message Handling ───\n\n private handleMessage(raw: string): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case 'auth_success':\n case 'auth_refreshed':\n this.handleAuthAck(msg);\n break;\n case 'sync':\n this.handleSync(msg);\n break;\n case 'shared_delta':\n this.handleSharedDelta(msg);\n break;\n case 'player_delta':\n this.handlePlayerDelta(msg);\n break;\n case 'action_result':\n this.handleActionResult(msg);\n break;\n case 'action_error':\n this.handleActionError(msg);\n break;\n case 'message':\n this.handleServerMessage(msg);\n break;\n case 'signal':\n this.handleSignalFrame(msg);\n break;\n case 'signal_sent':\n this.handleSignalSent(msg);\n break;\n case 'signal_error':\n this.handleSignalError(msg);\n break;\n case 'members_sync':\n this.handleMembersSync(msg);\n break;\n case 'media_sync':\n this.handleMediaSync(msg);\n break;\n case 'member_join':\n this.handleMemberJoinFrame(msg);\n break;\n case 'member_leave':\n this.handleMemberLeaveFrame(msg);\n break;\n case 'member_state':\n this.handleMemberStateFrame(msg);\n break;\n case 'member_state_error':\n this.handleMemberStateError(msg);\n break;\n case 'media_track':\n this.handleMediaTrackFrame(msg);\n break;\n case 'media_track_removed':\n this.handleMediaTrackRemovedFrame(msg);\n break;\n case 'media_state':\n this.handleMediaStateFrame(msg);\n break;\n case 'media_device':\n this.handleMediaDeviceFrame(msg);\n break;\n case 'media_result':\n this.handleMediaResult(msg);\n break;\n case 'media_error':\n this.handleMediaError(msg);\n break;\n case 'admin_result':\n this.handleAdminResult(msg);\n break;\n case 'admin_error':\n this.handleAdminError(msg);\n break;\n case 'kicked':\n this.handleKicked();\n break;\n case 'error':\n this.handleError(msg);\n break;\n case 'pong':\n // Heartbeat response — no action needed\n break;\n }\n }\n\n private handleSync(msg: Record<string, unknown>): void {\n this._sharedState = msg.sharedState as Record<string, unknown>;\n this._sharedVersion = msg.sharedVersion as number;\n this._playerState = msg.playerState as Record<string, unknown>;\n this._playerVersion = msg.playerVersion as number;\n const reconnectInfo = this.reconnectInfo;\n this.reconnectInfo = null;\n this.setConnectionState('connected');\n\n // Notify handlers with full state as changes\n const sharedSnapshot = cloneRecord(this._sharedState);\n const playerSnapshot = cloneRecord(this._playerState);\n for (const handler of this.sharedStateHandlers) {\n handler(sharedSnapshot, cloneRecord(sharedSnapshot));\n }\n for (const handler of this.playerStateHandlers) {\n handler(playerSnapshot, cloneRecord(playerSnapshot));\n }\n if (reconnectInfo) {\n for (const handler of this.reconnectHandlers) {\n handler(reconnectInfo);\n }\n }\n }\n\n private handleSharedDelta(msg: Record<string, unknown>): void {\n const delta = msg.delta as Record<string, unknown>;\n this._sharedVersion = msg.version as number;\n\n // Apply delta to local state\n for (const [path, value] of Object.entries(delta)) {\n deepSet(this._sharedState, path, value);\n }\n\n const sharedSnapshot = cloneRecord(this._sharedState);\n const deltaSnapshot = cloneRecord(delta);\n for (const handler of this.sharedStateHandlers) {\n handler(sharedSnapshot, deltaSnapshot);\n }\n }\n\n private handlePlayerDelta(msg: Record<string, unknown>): void {\n const delta = msg.delta as Record<string, unknown>;\n this._playerVersion = msg.version as number;\n\n // Apply delta to local player state\n for (const [path, value] of Object.entries(delta)) {\n deepSet(this._playerState, path, value);\n }\n\n const playerSnapshot = cloneRecord(this._playerState);\n const deltaSnapshot = cloneRecord(delta);\n for (const handler of this.playerStateHandlers) {\n handler(playerSnapshot, deltaSnapshot);\n }\n }\n\n private handleActionResult(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string;\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.resolve(msg.result);\n }\n }\n\n private handleActionError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string;\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, msg.message as string));\n }\n }\n\n private handleAuthAck(msg: Record<string, unknown>): void {\n this.currentUserId = typeof msg.userId === 'string' ? msg.userId : this.currentUserId;\n this.currentConnectionId =\n typeof msg.connectionId === 'string' ? msg.connectionId : this.currentConnectionId;\n }\n\n private handleServerMessage(msg: Record<string, unknown>): void {\n const messageType = msg.messageType as string;\n const data = msg.data;\n\n // Type-specific handlers\n const handlers = this.messageHandlers.get(messageType);\n if (handlers) {\n for (const handler of handlers) handler(data);\n }\n\n // All-message handlers\n for (const handler of this.allMessageHandlers) {\n handler(messageType, data);\n }\n }\n\n private handleSignalFrame(msg: Record<string, unknown>): void {\n const event = typeof msg.event === 'string' ? msg.event : '';\n if (!event) return;\n const meta = this.normalizeSignalMeta(msg.meta);\n const payload = msg.payload;\n\n const handlers = this.signalHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) handler(payload, meta);\n }\n for (const handler of this.anySignalHandlers) {\n handler(event, payload, meta);\n }\n }\n\n private handleSignalSent(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingSignalRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingSignalRequests.delete(requestId);\n pending.resolve();\n }\n\n private handleSignalError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingSignalRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingSignalRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Signal failed'));\n }\n\n private handleMembersSync(msg: Record<string, unknown>): void {\n const members = this.normalizeMembers(msg.members);\n this._members = members;\n for (const member of members) {\n this.syncMediaMemberInfo(member);\n }\n const snapshot = cloneValue(this._members);\n for (const handler of this.memberSyncHandlers) {\n handler(snapshot);\n }\n }\n\n private handleMediaSync(msg: Record<string, unknown>): void {\n this._mediaMembers = this.normalizeMediaMembers(msg.members);\n }\n\n private handleMemberJoinFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n if (!member) return;\n this.upsertMember(member);\n this.syncMediaMemberInfo(member);\n const snapshot = cloneValue(member);\n for (const handler of this.memberJoinHandlers) {\n handler(snapshot);\n }\n }\n\n private handleMemberLeaveFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n if (!member) return;\n this.removeMember(member.memberId);\n this.removeMediaMember(member.memberId);\n const reason = this.normalizeLeaveReason(msg.reason);\n const snapshot = cloneValue(member);\n for (const handler of this.memberLeaveHandlers) {\n handler(snapshot, reason);\n }\n }\n\n private handleMemberStateFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const state = this.normalizeState(msg.state);\n if (!member) return;\n member.state = state;\n this.upsertMember(member);\n this.syncMediaMemberInfo(member);\n\n const requestId = msg.requestId as string | undefined;\n if (requestId && member.memberId === this.currentUserId) {\n const pending = this.pendingMemberStateRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingMemberStateRequests.delete(requestId);\n pending.resolve();\n }\n }\n\n const memberSnapshot = cloneValue(member);\n const stateSnapshot = cloneRecord(state);\n for (const handler of this.memberStateHandlers) {\n handler(memberSnapshot, stateSnapshot);\n }\n }\n\n private handleMemberStateError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingMemberStateRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingMemberStateRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Member state update failed'));\n }\n\n private handleMediaTrackFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const track = this.normalizeMediaTrack(msg.track);\n if (!member || !track) return;\n const mediaMember = this.ensureMediaMember(member);\n this.upsertMediaTrack(mediaMember, track);\n this.mergeMediaState(mediaMember, track.kind, {\n published: true,\n muted: track.muted,\n trackId: track.trackId,\n deviceId: track.deviceId,\n publishedAt: track.publishedAt,\n adminDisabled: track.adminDisabled,\n });\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const trackSnapshot = cloneValue(track);\n for (const handler of this.mediaTrackHandlers) {\n handler(trackSnapshot, memberSnapshot);\n }\n }\n\n private handleMediaTrackRemovedFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const track = this.normalizeMediaTrack(msg.track);\n if (!member || !track) return;\n const mediaMember = this.ensureMediaMember(member);\n this.removeMediaTrack(mediaMember, track);\n mediaMember.state = {\n ...mediaMember.state,\n [track.kind]: {\n published: false,\n muted: false,\n adminDisabled: false,\n },\n };\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const trackSnapshot = cloneValue(track);\n for (const handler of this.mediaTrackRemovedHandlers) {\n handler(trackSnapshot, memberSnapshot);\n }\n }\n\n private handleMediaStateFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n if (!member) return;\n const mediaMember = this.ensureMediaMember(member);\n mediaMember.state = this.normalizeMediaState(msg.state);\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const stateSnapshot = cloneValue(mediaMember.state);\n for (const handler of this.mediaStateHandlers) {\n handler(memberSnapshot, stateSnapshot);\n }\n }\n\n private handleMediaDeviceFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const kind = this.normalizeMediaKind(msg.kind);\n const deviceId = typeof msg.deviceId === 'string' ? msg.deviceId : '';\n if (!member || !kind || !deviceId) return;\n\n const mediaMember = this.ensureMediaMember(member);\n this.mergeMediaState(mediaMember, kind, { deviceId });\n for (const track of mediaMember.tracks) {\n if (track.kind === kind) {\n track.deviceId = deviceId;\n }\n }\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const change = { kind, deviceId } satisfies RoomMediaDeviceChange;\n for (const handler of this.mediaDeviceHandlers) {\n handler(memberSnapshot, change);\n }\n }\n\n private handleMediaResult(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingMediaRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingMediaRequests.delete(requestId);\n pending.resolve();\n }\n\n private handleMediaError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingMediaRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingMediaRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Media operation failed'));\n }\n\n private handleAdminResult(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingAdminRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingAdminRequests.delete(requestId);\n pending.resolve();\n }\n\n private handleAdminError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingAdminRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingAdminRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Admin operation failed'));\n }\n\n private handleKicked(): void {\n for (const handler of this.kickedHandlers) handler();\n // Don't auto-reconnect after being kicked\n this.intentionallyLeft = true;\n this.reconnectInfo = null;\n this.setConnectionState('kicked');\n }\n\n private handleError(msg: Record<string, unknown>): void {\n for (const handler of this.errorHandlers) {\n handler({ code: msg.code as string, message: msg.message as string });\n }\n }\n\n private refreshAuth(): void {\n const token = this.tokenManager.currentAccessToken;\n if (!token || !this.ws || !this.connected) return;\n this.sendRaw({ type: 'auth', token });\n }\n\n private handleAuthStateChange(user: TokenUser | null): void {\n if (user) {\n if (this.ws && this.connected && this.authenticated) {\n this.refreshAuth();\n return;\n }\n\n this.waitingForAuth = false;\n if (\n this.joinRequested &&\n !this.connectingPromise &&\n !isSocketOpenOrConnecting(this.ws)\n ) {\n this.reconnectAttempts = 0;\n this.ensureConnection().catch(() => {\n // Connection errors are surfaced through the normal socket lifecycle.\n });\n }\n return;\n }\n\n this.waitingForAuth = this.joinRequested;\n this.reconnectInfo = null;\n this.setConnectionState('auth_lost');\n if (this.ws) {\n const socket = this.ws;\n this.sendRaw({ type: 'leave' });\n this.stopHeartbeat();\n this.ws = null;\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this._mediaMembers = [];\n this.currentUserId = null;\n this.currentConnectionId = null;\n try {\n closeSocketAfterLeave(socket, 'Signed out');\n } catch {\n // Ignore close failures — socket is already unusable.\n }\n return;\n }\n\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this._mediaMembers = [];\n }\n\n private handleAuthenticationFailure(error: unknown): void {\n const authError =\n error instanceof EdgeBaseError\n ? error\n : new EdgeBaseError(500, 'Room authentication failed.');\n\n this.waitingForAuth = authError.code === 401 && this.joinRequested;\n this.stopHeartbeat();\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this.connectingPromise = null;\n\n if (this.ws) {\n const socket = this.ws;\n this.ws = null;\n try {\n socket.close(4001, authError.message);\n } catch {\n // Ignore close failures — the server will time out stale sockets.\n }\n }\n }\n\n private normalizeMembers(value: unknown): RoomMember[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((member) => this.normalizeMember(member))\n .filter((member): member is RoomMember => !!member);\n }\n\n private normalizeMediaMembers(value: unknown): RoomMediaMember[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((member) => this.normalizeMediaMember(member))\n .filter((member): member is RoomMediaMember => !!member);\n }\n\n private normalizeMember(value: unknown): RoomMember | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const member = value as Record<string, unknown>;\n if (typeof member.memberId !== 'string' || typeof member.userId !== 'string') {\n return null;\n }\n return {\n memberId: member.memberId,\n userId: member.userId,\n connectionId: typeof member.connectionId === 'string' ? member.connectionId : undefined,\n connectionCount:\n typeof member.connectionCount === 'number' ? member.connectionCount : undefined,\n role: typeof member.role === 'string' ? member.role : undefined,\n state: this.normalizeState(member.state),\n };\n }\n\n private normalizeState(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n return cloneRecord(value as Record<string, unknown>);\n }\n\n private normalizeMediaMember(value: unknown): RoomMediaMember | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const entry = value as Record<string, unknown>;\n const member = this.normalizeMember(entry.member);\n if (!member) {\n return null;\n }\n return {\n member,\n state: this.normalizeMediaState(entry.state),\n tracks: this.normalizeMediaTracks(entry.tracks),\n };\n }\n\n private normalizeMediaState(value: unknown): RoomMemberMediaState {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n const state = value as Record<string, unknown>;\n return {\n audio: this.normalizeMediaKindState(state.audio),\n video: this.normalizeMediaKindState(state.video),\n screen: this.normalizeMediaKindState(state.screen),\n };\n }\n\n private normalizeMediaKindState(value: unknown): RoomMemberMediaKindState | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n const state = value as Record<string, unknown>;\n return {\n published: state.published === true,\n muted: state.muted === true,\n trackId: typeof state.trackId === 'string' ? state.trackId : undefined,\n deviceId: typeof state.deviceId === 'string' ? state.deviceId : undefined,\n publishedAt: typeof state.publishedAt === 'number' ? state.publishedAt : undefined,\n adminDisabled: state.adminDisabled === true,\n };\n }\n\n private normalizeMediaTracks(value: unknown): RoomMediaTrack[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((track) => this.normalizeMediaTrack(track))\n .filter((track): track is RoomMediaTrack => !!track);\n }\n\n private normalizeMediaTrack(value: unknown): RoomMediaTrack | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const track = value as Record<string, unknown>;\n const kind = this.normalizeMediaKind(track.kind);\n if (!kind) {\n return null;\n }\n return {\n kind,\n trackId: typeof track.trackId === 'string' ? track.trackId : undefined,\n deviceId: typeof track.deviceId === 'string' ? track.deviceId : undefined,\n muted: track.muted === true,\n publishedAt: typeof track.publishedAt === 'number' ? track.publishedAt : undefined,\n adminDisabled: track.adminDisabled === true,\n };\n }\n\n private normalizeMediaKind(value: unknown): RoomMediaKind | null {\n switch (value) {\n case 'audio':\n case 'video':\n case 'screen':\n return value;\n default:\n return null;\n }\n }\n\n private normalizeSignalMeta(value: unknown): RoomSignalMeta {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n const meta = value as Record<string, unknown>;\n return {\n memberId: typeof meta.memberId === 'string' || meta.memberId === null ? (meta.memberId as string | null) : undefined,\n userId: typeof meta.userId === 'string' || meta.userId === null ? (meta.userId as string | null) : undefined,\n connectionId:\n typeof meta.connectionId === 'string' || meta.connectionId === null\n ? (meta.connectionId as string | null)\n : undefined,\n sentAt: typeof meta.sentAt === 'number' ? meta.sentAt : undefined,\n serverSent: meta.serverSent === true,\n };\n }\n\n private normalizeLeaveReason(value: unknown): RoomMemberLeaveReason {\n switch (value) {\n case 'leave':\n case 'timeout':\n case 'kicked':\n return value;\n default:\n return 'leave';\n }\n }\n\n private upsertMember(member: RoomMember): void {\n const index = this._members.findIndex((entry) => entry.memberId === member.memberId);\n if (index >= 0) {\n this._members[index] = cloneValue(member);\n return;\n }\n this._members.push(cloneValue(member));\n }\n\n private removeMember(memberId: string): void {\n this._members = this._members.filter((member) => member.memberId !== memberId);\n }\n\n private syncMediaMemberInfo(member: RoomMember): void {\n const mediaMember = this._mediaMembers.find((entry) => entry.member.memberId === member.memberId);\n if (!mediaMember) {\n return;\n }\n mediaMember.member = cloneValue(member);\n }\n\n private ensureMediaMember(member: RoomMember): RoomMediaMember {\n const existing = this._mediaMembers.find((entry) => entry.member.memberId === member.memberId);\n if (existing) {\n existing.member = cloneValue(member);\n return existing;\n }\n const created: RoomMediaMember = {\n member: cloneValue(member),\n state: {},\n tracks: [],\n };\n this._mediaMembers.push(created);\n return created;\n }\n\n private removeMediaMember(memberId: string): void {\n this._mediaMembers = this._mediaMembers.filter((member) => member.member.memberId !== memberId);\n }\n\n private upsertMediaTrack(mediaMember: RoomMediaMember, track: RoomMediaTrack): void {\n const index = mediaMember.tracks.findIndex(\n (entry) =>\n entry.kind === track.kind &&\n entry.trackId === track.trackId,\n );\n if (index >= 0) {\n mediaMember.tracks[index] = cloneValue(track);\n return;\n }\n mediaMember.tracks = mediaMember.tracks\n .filter((entry) => !(entry.kind === track.kind && !track.trackId))\n .concat(cloneValue(track));\n }\n\n private removeMediaTrack(mediaMember: RoomMediaMember, track: RoomMediaTrack): void {\n mediaMember.tracks = mediaMember.tracks.filter((entry) => {\n if (track.trackId) {\n return !(entry.kind === track.kind && entry.trackId === track.trackId);\n }\n return entry.kind !== track.kind;\n });\n }\n\n private mergeMediaState(\n mediaMember: RoomMediaMember,\n kind: RoomMediaKind,\n partial: Partial<RoomMemberMediaKindState>,\n ): void {\n const next: RoomMemberMediaKindState = {\n published: partial.published ?? mediaMember.state[kind]?.published ?? false,\n muted: partial.muted ?? mediaMember.state[kind]?.muted ?? false,\n trackId: partial.trackId ?? mediaMember.state[kind]?.trackId,\n deviceId: partial.deviceId ?? mediaMember.state[kind]?.deviceId,\n publishedAt: partial.publishedAt ?? mediaMember.state[kind]?.publishedAt,\n adminDisabled: partial.adminDisabled ?? mediaMember.state[kind]?.adminDisabled,\n };\n mediaMember.state = {\n ...mediaMember.state,\n [kind]: next,\n };\n }\n\n private rejectPendingVoidRequests(\n pendingRequests: Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>,\n error: EdgeBaseError,\n ): void {\n for (const [, pending] of pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n pendingRequests.clear();\n }\n\n private setConnectionState(next: RoomConnectionState): void {\n if (this.connectionState === next) {\n return;\n }\n this.connectionState = next;\n for (const handler of this.connectionStateHandlers) {\n handler(next);\n }\n }\n\n // ─── Private: Helpers ───\n\n private sendRaw(data: Record<string, unknown>): void {\n if (this.ws && this.connected) {\n this.ws.send(JSON.stringify(data));\n return;\n }\n }\n\n private buildWsUrl(): string {\n const httpUrl = this.baseUrl.replace(/\\/$/, '');\n const wsUrl = httpUrl.replace(/^http/, 'ws');\n return `${wsUrl}/api/room?namespace=${encodeURIComponent(this.namespace)}&id=${encodeURIComponent(this.roomId)}`;\n }\n\n private scheduleReconnect(): void {\n const attempt = this.reconnectAttempts + 1;\n const delay = this.options.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n this.reconnectInfo = { attempt };\n this.setConnectionState('reconnecting');\n setTimeout(() => {\n if (\n this.connectingPromise ||\n !this.joinRequested ||\n this.waitingForAuth ||\n isSocketOpenOrConnecting(this.ws)\n ) {\n return;\n }\n this.ensureConnection().catch(() => {});\n }, Math.min(delay, 30000));\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.ws && this.connected) {\n this.ws.send(JSON.stringify({ type: 'ping' }));\n }\n }, 30000);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n}\n","/**\n * React Native Push Notification client.\n *\n * Platform support (FCM 일원화):\n * - iOS: FCM token via Firebase iOS SDK bridge (tokenProvider callback)\n * - Android: FCM token via FirebaseMessaging bridge (tokenProvider callback)\n *\n * Zero-parameter register() design: tokenProvider closure is set by native\n * app code (AppDelegate / Application) before register() is called.\n * SDK never calls native APIs directly — avoids hard dependency on firebase-messaging.\n *\n * @example\n * // In AppDelegate (iOS) or Application (Android):\n * client.push.setTokenProvider(async () => {\n * const token = await messaging().getToken(); // FCM or APNs\n * return { token, platform: 'android' };\n * });\n * // Then anywhere:\n * await client.push.register();\n */\n\nimport { ApiPaths, type HttpClient, type GeneratedDbApi } from '@edge-base/core';\nimport type { AsyncStorageAdapter } from './token-manager.js';\nimport { PUSH_TOKEN_CACHE_KEY, PUSH_DEVICE_ID_KEY } from './token-manager.js';\n\n// ─── Types ───\n\nexport type PushPlatform = 'ios' | 'android' | 'web';\n\nexport interface PushTokenProvider {\n (): Promise<{ token: string; platform: PushPlatform }>;\n}\n\nexport type PushPermissionStatus = 'granted' | 'denied' | 'not-determined' | 'provisional';\n\nexport interface PushPermissionProvider {\n getPermissionStatus(): Promise<PushPermissionStatus>;\n requestPermission(): Promise<PushPermissionStatus>;\n}\n\nexport interface PushMessage {\n title?: string;\n body?: string;\n data?: Record<string, unknown>;\n}\n\nexport type PushMessageHandler = (message: PushMessage) => void;\n\nexport interface PushTopicProvider {\n subscribeTopic(topic: string): Promise<void>;\n unsubscribeTopic(topic: string): Promise<void>;\n}\n\n// ─── PushClient ───\n\nexport class PushClient {\n private tokenProvider: PushTokenProvider | null = null;\n private permissionProvider: PushPermissionProvider | null = null;\n private topicProvider: PushTopicProvider | null = null;\n private messageListeners: PushMessageHandler[] = [];\n private openedAppListeners: PushMessageHandler[] = [];\n\n constructor(\n private http: HttpClient,\n private storage: AsyncStorageAdapter,\n private core?: GeneratedDbApi,\n ) {}\n\n\n /**\n * Set the native token provider.\n * Must be called before register() — typically in App.tsx or native bootstrapping.\n *\n * @example (Firebase Messaging)\n * client.push.setTokenProvider(async () => ({\n * token: await messaging().getToken(),\n * platform: 'android',\n * }));\n *\n * @example (APNs via native bridge)\n * client.push.setTokenProvider(async () => ({\n * token: nativeBridge.getAPNsToken(),\n * platform: 'ios',\n * }));\n */\n setTokenProvider(provider: PushTokenProvider): void {\n this.tokenProvider = provider;\n }\n\n /**\n * Set the native permission provider.\n * Call this with your FCM / @notifee/react-native permission handler.\n *\n * @example (Firebase Messaging)\n * client.push.setPermissionProvider({\n * getPermissionStatus: async () => {\n * const status = await messaging().hasPermission();\n * if (status === messaging.AuthorizationStatus.AUTHORIZED) return 'granted';\n * if (status === messaging.AuthorizationStatus.PROVISIONAL) return 'provisional';\n * if (status === messaging.AuthorizationStatus.DENIED) return 'denied';\n * return 'not-determined';\n * },\n * requestPermission: async () => {\n * const status = await messaging().requestPermission();\n * if (status === messaging.AuthorizationStatus.AUTHORIZED) return 'granted';\n * if (status === messaging.AuthorizationStatus.PROVISIONAL) return 'provisional';\n * return 'denied';\n * },\n * });\n */\n setPermissionProvider(provider: PushPermissionProvider): void {\n this.permissionProvider = provider;\n }\n\n /**\n * Get current push notification permission status.\n * Uses custom provider if set via setPermissionProvider(), otherwise uses\n * built-in platform defaults (PermissionsAndroid on Android, auto-grant on iOS).\n */\n async getPermissionStatus(): Promise<PushPermissionStatus> {\n if (this.permissionProvider) {\n return this.permissionProvider.getPermissionStatus();\n }\n return this._defaultGetPermissionStatus();\n }\n\n /**\n * Request push notification permission from the user.\n * Uses custom provider if set via setPermissionProvider(), otherwise uses\n * built-in platform defaults (PermissionsAndroid on Android, auto-grant on iOS).\n */\n async requestPermission(): Promise<PushPermissionStatus> {\n if (this.permissionProvider) {\n return this.permissionProvider.requestPermission();\n }\n return this._defaultRequestPermission();\n }\n\n\n /**\n * Register for push notifications.\n * Zero-parameter — token is acquired via setTokenProvider().\n * Token is cached; network request only fires if token changes.\n */\n async register(options?: { metadata?: Record<string, unknown> }): Promise<void> {\n if (!this.tokenProvider) {\n throw new Error(\n '[EdgeBase] push.register(): No token provider set. ' +\n 'Call client.push.setTokenProvider(async () => ({ token, platform })) first.',\n );\n }\n\n // Auto-request permission before token acquisition\n const permStatus = await this.requestPermission();\n if (permStatus === 'denied') return;\n\n const { token, platform } = await this.tokenProvider();\n\n // Cache check — skip network if token unchanged and no new metadata\n const cachedToken = await this.storage.getItem(PUSH_TOKEN_CACHE_KEY);\n if (cachedToken === token && !options?.metadata) return;\n\n const deviceId = await this.getOrCreateDeviceId();\n\n if (this.core) {\n await this.core.pushRegister({\n deviceId,\n token,\n platform,\n metadata: options?.metadata,\n });\n } else {\n await this.http.post(ApiPaths.PUSH_REGISTER, {\n deviceId,\n token,\n platform,\n metadata: options?.metadata,\n });\n }\n\n await this.storage.setItem(PUSH_TOKEN_CACHE_KEY, token);\n }\n\n /**\n * Unregister the current device from push notifications.\n * Called automatically on signOut.\n */\n async unregister(deviceId?: string): Promise<void> {\n const id = deviceId ?? (await this.getOrCreateDeviceId());\n if (this.core) {\n await this.core.pushUnregister({ deviceId: id });\n } else {\n await this.http.post(ApiPaths.PUSH_UNREGISTER, { deviceId: id });\n }\n await this.storage.removeItem(PUSH_TOKEN_CACHE_KEY);\n }\n\n /** Listen for push messages while app is in foreground. */\n onMessage(callback: PushMessageHandler): () => void {\n this.messageListeners.push(callback);\n return () => {\n this.messageListeners = this.messageListeners.filter((h) => h !== callback);\n };\n }\n\n /** Listen for notification taps that opened the app. */\n onMessageOpenedApp(callback: PushMessageHandler): () => void {\n this.openedAppListeners.push(callback);\n return () => {\n this.openedAppListeners = this.openedAppListeners.filter((h) => h !== callback);\n };\n }\n\n /**\n * Dispatch a foreground message to all onMessage listeners.\n * Call this from your native FCM/APNs foreground handler.\n *\n * @example (Firebase Messaging)\n * messaging().onMessage(async (remoteMessage) => {\n * client.push._dispatchForegroundMessage({\n * title: remoteMessage.notification?.title,\n * body: remoteMessage.notification?.body,\n * data: remoteMessage.data,\n * });\n * });\n */\n _dispatchForegroundMessage(message: PushMessage): void {\n for (const handler of this.messageListeners) {\n handler(message);\n }\n }\n\n /**\n * Dispatch an opened-app notification to all onMessageOpenedApp listeners.\n * Call this from your notification tap handler.\n */\n _dispatchOpenedAppMessage(message: PushMessage): void {\n for (const handler of this.openedAppListeners) {\n handler(message);\n }\n }\n\n /**\n * Set topic subscription provider.\n * Inject your Firebase RN SDK's topic subscription handlers.\n *\n * @example\n * client.push.setTopicProvider({\n * subscribeTopic: (topic) => messaging().subscribeToTopic(topic),\n * unsubscribeTopic: (topic) => messaging().unsubscribeFromTopic(topic),\n * });\n */\n setTopicProvider(provider: PushTopicProvider): void {\n this.topicProvider = provider;\n }\n\n /**\n * Subscribe to a push notification topic.\n * Delegates to the topic provider set via setTopicProvider().\n */\n async subscribeTopic(topic: string): Promise<void> {\n if (!this.topicProvider) {\n throw new Error(\n '[EdgeBase] push.subscribeTopic(): No topic provider set. ' +\n 'Call client.push.setTopicProvider({ subscribeTopic, unsubscribeTopic }) first.',\n );\n }\n return this.topicProvider.subscribeTopic(topic);\n }\n\n /**\n * Unsubscribe from a push notification topic.\n * Delegates to the topic provider set via setTopicProvider().\n */\n async unsubscribeTopic(topic: string): Promise<void> {\n if (!this.topicProvider) {\n throw new Error(\n '[EdgeBase] push.unsubscribeTopic(): No topic provider set. ' +\n 'Call client.push.setTopicProvider({ subscribeTopic, unsubscribeTopic }) first.',\n );\n }\n return this.topicProvider.unsubscribeTopic(topic);\n }\n\n // ─── Built-in permission defaults ───\n //\n // Used when no custom permissionProvider is set.\n // Android: uses react-native PermissionsAndroid for POST_NOTIFICATIONS (API 33+).\n // iOS: returns 'granted' — Firebase messaging handles iOS permission internally\n // when getToken() is called. Use setPermissionProvider() for explicit control.\n\n private async _defaultGetPermissionStatus(): Promise<PushPermissionStatus> {\n try {\n const { Platform, PermissionsAndroid } = require('react-native');\n if (Platform.OS === 'android') {\n if (Platform.Version < 33) return 'granted'; // Pre-Android 13: no runtime permission needed\n const granted = await PermissionsAndroid.check(\n 'android.permission.POST_NOTIFICATIONS',\n );\n return granted ? 'granted' : 'not-determined';\n }\n // iOS: Firebase messaging handles permission during getToken()\n return 'granted';\n } catch {\n return 'not-determined';\n }\n }\n\n private async _defaultRequestPermission(): Promise<PushPermissionStatus> {\n try {\n const { Platform, PermissionsAndroid } = require('react-native');\n if (Platform.OS === 'android') {\n if (Platform.Version < 33) return 'granted'; // Pre-Android 13: no runtime permission needed\n const result = await PermissionsAndroid.request(\n 'android.permission.POST_NOTIFICATIONS',\n );\n return result === PermissionsAndroid.RESULTS.GRANTED ? 'granted' : 'denied';\n }\n // iOS: Firebase messaging handles permission during getToken()\n return 'granted';\n } catch {\n return 'not-determined';\n }\n }\n\n // ─── Private helpers ───\n\n private async getOrCreateDeviceId(): Promise<string> {\n const existing = await this.storage.getItem(PUSH_DEVICE_ID_KEY);\n if (existing) return existing;\n\n const id = `rn-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n await this.storage.setItem(PUSH_DEVICE_ID_KEY, id);\n return id;\n }\n}\n","/**\n * AppState-based lifecycle management for React Native.\n *\n * Responsibility:\n * - Foreground: check if access token is about to expire → pre-emptive refresh\n * - Foreground: reconnect WebSocket if disconnected during background\n * - Background: disconnect WebSocket to avoid battery drain and server-side timeout\n *\n * Usage:\n * const lifecycle = new LifecycleManager(tokenManager, databaseLive, AppState);\n * lifecycle.start();\n * // on unmount or destroy:\n * lifecycle.stop();\n */\n\nimport type { TokenManager } from './token-manager.js';\n\n// ─── Minimal AppState interface ───\n\nexport interface AppStateStatus {\n currentState: 'active' | 'background' | 'inactive' | 'unknown' | string;\n}\n\nexport interface AppStateAdapter {\n currentState: string;\n addEventListener(\n type: 'change',\n handler: (state: string) => void,\n ): { remove: () => void };\n}\n\n// ─── Minimal DatabaseLiveClient interface ───\n\nexport interface DatabaseLiveClientAdapter {\n disconnect(): void;\n reconnect?(): void;\n}\n\n// ─── LifecycleManager ───\n\nexport class LifecycleManager {\n private subscription: { remove: () => void } | null = null;\n private previousState: string;\n\n constructor(\n private tokenManager: TokenManager,\n private databaseLive: DatabaseLiveClientAdapter | null,\n private appState: AppStateAdapter,\n /** Optional: function to trigger token refresh (e.g. doRefresh from HttpClient) */\n private doRefresh?: (refreshToken: string) => Promise<{ accessToken: string; refreshToken: string }>,\n ) {\n this.previousState = appState.currentState;\n }\n\n /** Start listening to AppState changes. */\n start(): void {\n if (this.subscription) return; // already started\n\n this.subscription = this.appState.addEventListener('change', this.handleStateChange);\n }\n\n /** Stop listening to AppState changes and clean up. */\n stop(): void {\n this.subscription?.remove();\n this.subscription = null;\n }\n\n private handleStateChange = (nextState: string): void => {\n const prev = this.previousState;\n this.previousState = nextState;\n\n // Only react to transitions\n if (prev === nextState) return;\n\n if (nextState === 'active') {\n // App came to foreground\n this.onForeground();\n } else if (nextState === 'background' || nextState === 'inactive') {\n // App went to background\n this.onBackground();\n }\n };\n\n private onForeground(): void {\n // 1. Pre-emptive token refresh (may have expired while backgrounded)\n if (this.doRefresh) {\n void this.tokenManager.getAccessToken(this.doRefresh).catch(() => {\n // Token expired while in background — user will need to sign in again\n // TokenManager.clearTokens() is called internally on 401\n });\n }\n\n // 2. Reconnect WebSocket if it supports reconnect\n if (this.databaseLive?.reconnect) {\n this.databaseLive.reconnect();\n }\n }\n\n private onBackground(): void {\n // Disconnect WebSocket to avoid:\n // - Battery drain from keepalive pings\n // - Server-side heartbeat timeout\n // - Unnecessary DO CPU billing\n // Auto-reconnect will restore subscriptions on foreground\n this.databaseLive?.disconnect();\n }\n}\n\n// ─── React hook wrapper ───\n\nexport interface UseLifecycleOptions {\n tokenManager: TokenManager;\n databaseLive: DatabaseLiveClientAdapter | null;\n appState: AppStateAdapter;\n doRefresh?: (refreshToken: string) => Promise<{ accessToken: string; refreshToken: string }>;\n}\n\n/**\n * React hook that manages lifecycle automatically.\n * Starts on mount, stops on unmount.\n *\n * @example\n * function App() {\n * const { AppState } = require('react-native');\n * useLifecycle({ tokenManager: client._tokenManager, databaseLive: client._databaseLive, appState: AppState });\n * }\n */\nexport function useLifecycle({\n tokenManager,\n databaseLive,\n appState,\n doRefresh,\n}: UseLifecycleOptions): void {\n // Import useEffect lazily to avoid hard dep on React in non-React-component code\n const { useEffect } = require('react') as typeof import('react');\n\n useEffect(() => {\n const manager = new LifecycleManager(tokenManager, databaseLive, appState, doRefresh);\n manager.start();\n return () => manager.stop();\n }, [tokenManager, databaseLive, appState, doRefresh]);\n}\n","import type { GeneratedDbApi } from '@edge-base/core';\n\ntype AnalyticsProperties = Record<string, string | number | boolean>;\n\nexport interface AnalyticsEvent {\n name: string;\n properties?: AnalyticsProperties;\n timestamp?: number;\n}\n\n/**\n * React Native analytics helper.\n *\n * Unlike the browser client, RN sends events immediately because there is no\n * sendBeacon/page-unload behavior to coordinate against.\n */\nexport class ClientAnalytics {\n constructor(private core: GeneratedDbApi) {}\n\n async track(name: string, properties?: AnalyticsProperties): Promise<void> {\n await this.trackBatch([{ name, properties }]);\n }\n\n async trackBatch(events: AnalyticsEvent[]): Promise<void> {\n if (events.length === 0) return;\n await this.core.trackEvents({\n events: events.map((event) => ({\n name: event.name,\n properties: event.properties,\n timestamp: event.timestamp ?? Date.now(),\n })),\n });\n }\n\n async flush(): Promise<void> {\n // RN sends immediately, so flush is a compatibility no-op.\n }\n\n destroy(): void {\n // No retained listeners/resources in the RN implementation.\n }\n}\n","/**\n * Client-side filter matching for database-live subscriptions.\n *\n * React Native shares the same query/filter tuple semantics as the web SDK,\n * so the matching logic stays identical across both clients.\n */\n\nexport type FilterOperator = '==' | '!=' | '<' | '>' | '<=' | '>=' | 'contains' | 'contains-any' | 'in' | 'not in';\n\nexport interface FilterEntry {\n field: string;\n operator: FilterOperator;\n value: unknown;\n}\n\nexport function matchesFilter(\n data: Record<string, unknown>,\n filters: Record<string, unknown> | [string, FilterOperator, unknown][],\n): boolean {\n const entries = Array.isArray(filters) && filters.length > 0 && Array.isArray(filters[0])\n ? parseTupleFilters(filters as [string, FilterOperator, unknown][])\n : parseFilters(filters as Record<string, unknown>);\n return entries.every(({ field, operator, value }) =>\n evaluateCondition(data[field], operator, value),\n );\n}\n\nfunction parseFilters(filters: Record<string, unknown>): FilterEntry[] {\n const entries: FilterEntry[] = [];\n\n for (const [key, value] of Object.entries(filters)) {\n const dotIdx = key.lastIndexOf('.');\n if (dotIdx > 0) {\n const possibleOp = key.slice(dotIdx + 1);\n if (isValidOperator(possibleOp)) {\n entries.push({\n field: key.slice(0, dotIdx),\n operator: possibleOp as FilterOperator,\n value,\n });\n continue;\n }\n }\n\n entries.push({ field: key, operator: '==', value });\n }\n\n return entries;\n}\n\nfunction parseTupleFilters(tuples: [string, FilterOperator, unknown][]): FilterEntry[] {\n return tuples.map(([field, operator, value]) => ({ field, operator, value }));\n}\n\nfunction isValidOperator(op: string): op is FilterOperator {\n return ['==', '!=', '<', '>', '<=', '>=', 'contains', 'contains-any', 'in', 'not in'].includes(op);\n}\n\nfunction evaluateCondition(\n fieldValue: unknown,\n operator: FilterOperator,\n expected: unknown,\n): boolean {\n switch (operator) {\n case '==':\n return fieldValue === expected;\n case '!=':\n return fieldValue !== expected;\n case '<':\n return (fieldValue as number) < (expected as number);\n case '>':\n return (fieldValue as number) > (expected as number);\n case '<=':\n return (fieldValue as number) <= (expected as number);\n case '>=':\n return (fieldValue as number) >= (expected as number);\n case 'contains':\n if (typeof fieldValue === 'string') return fieldValue.includes(expected as string);\n if (Array.isArray(fieldValue)) return fieldValue.includes(expected);\n return false;\n case 'contains-any':\n if (!Array.isArray(fieldValue) || !Array.isArray(expected)) return false;\n return expected.some(value => fieldValue.includes(value));\n case 'in':\n if (Array.isArray(expected)) return expected.includes(fieldValue);\n return false;\n case 'not in':\n if (Array.isArray(expected)) return !expected.includes(fieldValue);\n return true;\n default:\n return false;\n }\n}\n","/**\n * @edge-base/react-native — Full-featured client.\n * All APIs: auth, database-live, storage, push, room, captcha (turnstile), lifecycle\n *\n * @example\n * import { createClient } from '@edge-base/react-native';\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * import { Linking, AppState } from 'react-native';\n *\n * const client = createClient('https://my-app.edgebase.fun', {\n * storage: AsyncStorage,\n * linking: Linking,\n * appState: AppState,\n * });\n */\n\nimport {\n HttpClient,\n TableRef,\n DbRef,\n StorageClient,\n ContextManager,\n DefaultDbApi,\n HttpClientAdapter,\n PublicHttpClientAdapter,\n ApiPaths,\n FunctionsClient,\n type FilterMatchFn,\n} from '@edge-base/core';\nimport type { ContextValue } from '@edge-base/core';\nimport { TokenManager, type AsyncStorageAdapter } from './token-manager.js';\nimport { AuthClient, type LinkingAdapter } from './auth.js';\nimport { DatabaseLiveClient, type DatabaseLiveOptions } from './database-live.js';\nimport { RoomClient, type RoomOptions } from './room.js';\nimport { PushClient } from './push.js';\nimport { LifecycleManager, type AppStateAdapter } from './lifecycle.js';\nimport { ClientAnalytics } from './analytics.js';\nimport { matchesFilter } from './match-filter.js';\n\n// ─── Options ───\n\nexport interface JuneClientOptions {\n /**\n * AsyncStorage adapter.\n * Pass `require('@react-native-async-storage/async-storage').default`\n */\n storage: AsyncStorageAdapter;\n\n /**\n * Linking adapter — pass `require('react-native').Linking`\n * Required for OAuth sign-in.\n */\n linking?: LinkingAdapter;\n\n /**\n * AppState adapter — pass `require('react-native').AppState`\n * Enables auto lifecycle management:\n * background → WebSocket disconnect\n * foreground → reconnect + token refresh\n */\n appState?: AppStateAdapter;\n\n /** Database live subscription options (auto-reconnect, delays, etc.) */\n databaseLive?: DatabaseLiveOptions;\n\n /** Schema from typegen */\n schema?: Record<string, unknown>;\n}\n\n// ─── ClientEdgeBase ───\n\nexport class ClientEdgeBase {\n readonly auth: AuthClient;\n readonly storage: StorageClient;\n readonly push: PushClient;\n readonly functions: FunctionsClient;\n readonly analytics: ClientAnalytics;\n private databaseLive: DatabaseLiveClient;\n\n /** @internal exposed for advanced use (e.g. setDatabaseLive, testing) */\n readonly _tokenManager: TokenManager;\n /** @internal */\n readonly _httpClient: HttpClient;\n\n private lifecycleManager: LifecycleManager | null = null;\n private contextManager: ContextManager;\n private baseUrl: string;\n private core: DefaultDbApi;\n\n constructor(url: string, options: JuneClientOptions) {\n this.baseUrl = url.replace(/\\/$/, '');\n this._tokenManager = new TokenManager(this.baseUrl, options.storage);\n this.contextManager = new ContextManager();\n\n this._httpClient = new HttpClient({\n baseUrl: this.baseUrl,\n tokenManager: this._tokenManager,\n contextManager: this.contextManager,\n });\n\n this.core = new DefaultDbApi(new HttpClientAdapter(this._httpClient));\n const corePublic = new DefaultDbApi(new PublicHttpClientAdapter(this._httpClient));\n this.auth = new AuthClient(this._httpClient, this._tokenManager, this.core, corePublic, options.linking);\n this.databaseLive = new DatabaseLiveClient(\n this.baseUrl,\n this._tokenManager,\n options.databaseLive,\n this.contextManager,\n );\n this.storage = new StorageClient(this._httpClient, this.core);\n this.push = new PushClient(this._httpClient, options.storage, this.core);\n this.functions = new FunctionsClient(this._httpClient);\n this.analytics = new ClientAnalytics(this.core);\n\n // Auto-unregister push on signOut\n const originalSignOut = this.auth.signOut.bind(this.auth);\n const pushRef = this.push;\n const storageRef = options.storage;\n this.auth.signOut = async function (): Promise<void> {\n try {\n const cached = await storageRef.getItem('edgebase:push-token-cache');\n if (cached) await pushRef.unregister();\n } catch { /* ignore */ }\n return originalSignOut();\n };\n\n // AppState lifecycle management\n if (options.appState) {\n const doRefresh = async (refreshToken: string) => {\n return this._httpClient.postPublic<{ accessToken: string; refreshToken: string }>(\n ApiPaths.AUTH_REFRESH,\n { refreshToken },\n );\n };\n\n this.lifecycleManager = new LifecycleManager(\n this._tokenManager,\n {\n disconnect: () => {\n this.databaseLive.disconnect();\n },\n reconnect: () => {\n this.databaseLive.reconnect?.();\n },\n },\n options.appState,\n doRefresh,\n );\n this.lifecycleManager.start();\n }\n }\n\n /**\n * Select a DB block by namespace and optional instance ID (#133 §2).\n *\n * @example\n * const posts = await client.db('shared').table('posts').where('status', '==', 'published').get();\n * client.db('shared').table('posts').onSnapshot((change) => { ... });\n */\n db(namespace: string, instanceId?: string): DbRef {\n return new DbRef(this.core, namespace, instanceId, this.databaseLive, matchesFilter as FilterMatchFn);\n }\n\n /**\n * Get a Room client for ephemeral stateful real-time sessions.\n *\n * @param namespace - The room namespace (e.g. 'game', 'chat')\n * @param roomId - The room instance ID within the namespace\n * @param options - Connection options\n *\n * @example\n * const room = client.room('game', 'room-123');\n * await room.join();\n * const result = await room.send('SET_SCORE', { score: 42 });\n */\n room(namespace: string, roomId: string, options?: RoomOptions): RoomClient {\n return new RoomClient(this.baseUrl, namespace, roomId, this._tokenManager, options);\n }\n\n /** Set legacy isolateBy context state. HTTP DB routing uses db(namespace, id). */\n setContext(context: ContextValue): void {\n this.contextManager.setContext(context);\n }\n\n /** Set locale for auth email i18n and Accept-Language headers. */\n setLocale(locale: string | undefined): void {\n this._httpClient.setLocale(locale);\n }\n\n /** Get the currently configured locale override. */\n getLocale(): string | undefined {\n return this._httpClient.getLocale();\n }\n\n /** Get the currently configured legacy isolateBy context state. */\n getContext(): ContextValue {\n return this.contextManager.getContext();\n }\n\n /** Clean up all connections and listeners. */\n destroy(): void {\n this.analytics.destroy();\n this._tokenManager.destroy();\n this.lifecycleManager?.stop();\n this.databaseLive.disconnect();\n }\n}\n\n// ─── Factory ───\n\n/** Create a React Native EdgeBase client. */\nexport function createClient(url: string, options: JuneClientOptions): ClientEdgeBase {\n return new ClientEdgeBase(url, options);\n}\n","/**\n * Turnstile CAPTCHA widget for React Native — WebView based.\n *\n * Supports all platforms:\n * - iOS: WKWebView via react-native-webview\n * - Android: android.webkit.WebView via react-native-webview\n * (uses window.ReactNativeWebView.postMessage instead of window.postMessage)\n * - Web (React Native Web): Falls back to direct script injection\n *\n * Usage:\n * <TurnstileWebView\n * siteKey=\"your-site-key\"\n * action=\"signup\"\n * onToken={(token) => handleToken(token)}\n * onError={(err) => handleError(err)}\n * />\n *\n * Or use the helper hook:\n * const { token, isLoading, error, reset } = useTurnstile({ baseUrl, action });\n */\n\nimport React, { useRef, useState, useCallback, useEffect } from 'react';\n\n// ─── Types (minimal RN typings to avoid hard dep on @types/react-native) ───\n\ninterface StyleProp {\n [key: string]: unknown;\n}\n\ninterface WebViewMessage {\n nativeEvent: { data: string };\n}\n\ninterface WebViewProps {\n source: { html: string };\n style?: StyleProp;\n onMessage: (event: WebViewMessage) => void;\n testID?: string;\n javaScriptEnabled?: boolean;\n originWhitelist?: string[];\n scrollEnabled?: boolean;\n showsHorizontalScrollIndicator?: boolean;\n showsVerticalScrollIndicator?: boolean;\n}\n\n// ─── Turnstile HTML template ───\n// Uses window.ReactNativeWebView.postMessage for Android compatibility.\n// Falls back to window.postMessage for web environments.\n\ntype TurnstileAppearance = 'always' | 'execute' | 'interaction-only';\ntype TurnstileSize = 'normal' | 'compact' | 'flexible';\n\nfunction buildTurnstileHtml(\n siteKey: string,\n action: string,\n appearance: TurnstileAppearance,\n size: TurnstileSize,\n): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<meta http-equiv=\"Content-Security-Policy\" content=\"script-src 'unsafe-inline' https://challenges.cloudflare.com; style-src 'unsafe-inline';\">\n<style>\n html, body { margin: 0; padding: 0; background: transparent; overflow: hidden; }\n #container { display: flex; align-items: center; justify-content: center; min-height: 65px; }\n</style>\n<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit\" async defer></script>\n<script>\n function sendToNative(data) {\n try {\n // Android/iOS via react-native-webview\n if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {\n window.ReactNativeWebView.postMessage(JSON.stringify(data));\n return;\n }\n // React Native Web / fallback\n window.postMessage(JSON.stringify(data), '*');\n } catch(e) {}\n }\n\n function onTurnstileLoad() {\n turnstile.render('#container', {\n sitekey: ${JSON.stringify(siteKey)},\n action: ${JSON.stringify(action)},\n appearance: ${JSON.stringify(appearance)},\n size: ${JSON.stringify(size)},\n callback: function(token) {\n sendToNative({ type: 'captcha-token', token: token });\n },\n 'error-callback': function(error) {\n sendToNative({ type: 'captcha-error', error: String(error) });\n },\n 'before-interactive-callback': function() {\n sendToNative({ type: 'captcha-interactive' });\n },\n 'after-interactive-callback': function() {\n sendToNative({ type: 'captcha-done' });\n },\n 'timeout-callback': function() {\n sendToNative({ type: 'captcha-error', error: 'timeout' });\n }\n });\n }\n\n // Wait for Turnstile script to load\n var checkInterval = setInterval(function() {\n if (window.turnstile) {\n clearInterval(checkInterval);\n onTurnstileLoad();\n }\n }, 100);\n\n // Safety timeout — give up after 15 seconds\n setTimeout(function() {\n clearInterval(checkInterval);\n if (!window.turnstile) {\n sendToNative({ type: 'captcha-error', error: 'script_load_failed' });\n }\n }, 15000);\n</script>\n</head>\n<body><div id=\"container\"></div></body>\n</html>`;\n}\n\n// ─── TurnstileWebView component ───\n\nexport interface TurnstileWebViewProps {\n siteKey: string;\n action?: string;\n /** Called when Turnstile successfully issues a token */\n onToken: (token: string) => void;\n /** Called when Turnstile fails or times out */\n onError?: (error: string) => void;\n /** Called when an interactive challenge appears (show the WebView) */\n onInteractive?: () => void;\n /** Turnstile appearance mode */\n appearance?: TurnstileAppearance;\n /** Turnstile widget size */\n size?: TurnstileSize;\n /** Test identifier forwarded to the underlying WebView shell */\n testID?: string;\n /** Style for the WebView container */\n style?: StyleProp;\n /** WebView component — inject from react-native-webview */\n WebViewComponent: React.ComponentType<WebViewProps>;\n}\n\nexport function TurnstileWebView({\n siteKey,\n action = 'auth',\n onToken,\n onError,\n onInteractive,\n appearance = 'interaction-only',\n size = 'normal',\n testID,\n style,\n WebViewComponent,\n}: TurnstileWebViewProps): React.ReactElement {\n const html = buildTurnstileHtml(siteKey, action, appearance, size);\n\n const handleMessage = useCallback(\n (event: WebViewMessage) => {\n try {\n // React Native WebView may double-stringify on some versions\n let raw = event.nativeEvent.data;\n if (typeof raw !== 'string') raw = JSON.stringify(raw);\n const msg = JSON.parse(raw) as { type: string; token?: string; error?: string };\n\n switch (msg.type) {\n case 'captcha-token':\n if (msg.token) onToken(msg.token);\n break;\n case 'captcha-error':\n onError?.(msg.error ?? 'unknown');\n break;\n case 'captcha-interactive':\n onInteractive?.();\n break;\n default:\n break;\n }\n } catch {\n // Ignore non-JSON messages (e.g. React DevTools)\n }\n },\n [onToken, onError, onInteractive],\n );\n\n return React.createElement(WebViewComponent, {\n source: { html },\n style: style ?? { width: 300, height: 65, backgroundColor: 'transparent' },\n onMessage: handleMessage,\n testID,\n javaScriptEnabled: true,\n originWhitelist: ['*'],\n scrollEnabled: false,\n showsHorizontalScrollIndicator: false,\n showsVerticalScrollIndicator: false,\n });\n}\n\n// ─── useTurnstile hook ───\n\nexport interface UseTurnstileOptions {\n baseUrl: string;\n action?: string;\n /** Inject WebView component — pass require('react-native-webview').WebView */\n WebViewComponent?: React.ComponentType<WebViewProps>;\n}\n\nexport interface UseTurnstileResult {\n /** Current captcha token (null until resolved) */\n token: string | null;\n /** True while waiting for Turnstile to issue a token */\n isLoading: boolean;\n /** Error message if Turnstile failed */\n error: string | null;\n /** True if interactive challenge is needed (show the WebView) */\n needsInteraction: boolean;\n /** The siteKey fetched from server (null if captcha not configured) */\n siteKey: string | null;\n /** Reset state — useful to retry after error */\n reset: () => void;\n /** Manually set the token (for manual override flow) */\n setToken: (token: string) => void;\n /** Pass to TurnstileWebView.onToken for stateful integration */\n onToken: (token: string) => void;\n /** Pass to TurnstileWebView.onError for stateful integration */\n onError: (error: string) => void;\n /** Pass to TurnstileWebView.onInteractive for stateful integration */\n onInteractive: () => void;\n}\n\n// Cache site keys per backend URL so separate dev servers do not share stale config.\nconst cachedSiteKeys = new Map<string, string | null>();\nconst siteKeyFetchPromises = new Map<string, Promise<string | null>>();\n\nasync function fetchSiteKey(baseUrl: string): Promise<string | null> {\n if (cachedSiteKeys.has(baseUrl)) return cachedSiteKeys.get(baseUrl) ?? null;\n\n const inflight = siteKeyFetchPromises.get(baseUrl);\n if (inflight) return inflight;\n\n const nextPromise = (async () => {\n try {\n const res = await fetch(`${baseUrl}/api/config`);\n if (!res.ok) return null;\n const data = (await res.json()) as { captcha?: { siteKey?: string } | null };\n const nextKey = data.captcha?.siteKey ?? null;\n cachedSiteKeys.set(baseUrl, nextKey);\n return nextKey;\n } catch {\n return null;\n } finally {\n siteKeyFetchPromises.delete(baseUrl);\n }\n })();\n\n siteKeyFetchPromises.set(baseUrl, nextPromise);\n return nextPromise;\n}\n\nexport function useTurnstile({\n baseUrl,\n action = 'auth',\n}: UseTurnstileOptions): UseTurnstileResult {\n const [token, setTokenState] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [needsInteraction, setNeedsInteraction] = useState(false);\n const [siteKey, setSiteKey] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n setIsLoading(true);\n fetchSiteKey(baseUrl).then((key) => {\n if (!cancelled) {\n setSiteKey(key);\n if (!key) setIsLoading(false); // No captcha configured — done immediately\n }\n });\n return () => { cancelled = true; };\n }, [baseUrl]);\n\n const reset = useCallback(() => {\n setTokenState(null);\n setError(null);\n setNeedsInteraction(false);\n setIsLoading(true);\n }, []);\n\n const handleToken = useCallback((t: string) => {\n setTokenState(t);\n setIsLoading(false);\n setError(null);\n setNeedsInteraction(false);\n }, []);\n\n const handleError = useCallback((e: string) => {\n setError(e);\n setIsLoading(false);\n }, []);\n\n const handleInteractive = useCallback(() => {\n setNeedsInteraction(true);\n }, []);\n\n const setToken = useCallback((t: string) => {\n setTokenState(t);\n setIsLoading(false);\n }, []);\n\n return {\n token,\n isLoading,\n error,\n needsInteraction,\n siteKey,\n reset,\n setToken,\n onToken: handleToken,\n onError: handleError,\n onInteractive: handleInteractive,\n };\n}\n\n// ─── Platform detection helper ───\n\n/**\n * Detect if we're running on React Native Web (browser) vs native.\n * Used internally to skip WebView when running on web platform.\n */\nexport function isPlatformWeb(): boolean {\n return typeof document !== 'undefined' && typeof navigator !== 'undefined'\n && !('ReactNativeWebView' in window);\n}\n"]}
1
+ {"version":3,"sources":["../src/token-manager.ts","../src/auth.ts","../src/auth-refresh.ts","../src/database-live.ts","../src/room.ts","../src/push.ts","../src/lifecycle.ts","../src/analytics.ts","../src/match-filter.ts","../src/client.ts","../src/turnstile.tsx"],"names":["EdgeBaseError","result","ApiPaths","useEffect","ContextManager","HttpClient","DefaultDbApi","HttpClientAdapter","PublicHttpClientAdapter","StorageClient","FunctionsClient","DbRef","useCallback","React","useState"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Token management for React Native — AsyncStorage based.\n *: Access Token in memory, Refresh Token in persistent storage\n *: onAuthStateChange\n *\n * Key differences from @edge-base/web TokenManager:\n * - Uses AsyncStorage instead of localStorage (async reads/writes)\n * - No BroadcastChannel (no multi-tab in RN)\n * - No storage event listener (RN has no cross-tab concept)\n * - Simpler: single-tab, single-process model\n */\n\nimport { EdgeBaseError } from '@edge-base/core';\n\n// ─── AsyncStorage adapter interface ───\n\n/** Minimal interface compatible with @react-native-async-storage/async-storage */\nexport interface AsyncStorageAdapter {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n// ─── Token types ───\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface TokenUser {\n id: string;\n email?: string;\n displayName?: string;\n avatarUrl?: string;\n role?: string;\n isAnonymous?: boolean;\n emailVisibility?: string;\n custom?: Record<string, unknown>;\n}\n\nexport type AuthStateChangeHandler = (user: TokenUser | null) => void;\n\n// ─── JWT helpers ───\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> {\n const parts = token.split('.');\n if (parts.length !== 3) throw new EdgeBaseError(0, 'Invalid JWT format');\n const payload = parts[1];\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '=='.slice(0, (4 - (base64.length % 4)) % 4);\n // Decode via UTF-8 so non-ASCII claims survive round-trips.\n const binary = atob(padded);\n const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));\n return JSON.parse(new TextDecoder().decode(bytes));\n}\n\nfunction isTokenExpired(token: string, bufferSeconds = 30): boolean {\n try {\n const payload = decodeJwtPayload(token);\n const exp = payload.exp as number;\n if (!exp) return true;\n return Date.now() / 1000 >= exp - bufferSeconds;\n } catch {\n return true;\n }\n}\n\nfunction extractUser(token: string): TokenUser | null {\n try {\n const payload = decodeJwtPayload(token);\n return {\n id: payload.sub as string,\n email: payload.email as string | undefined,\n displayName: payload.displayName as string | undefined,\n avatarUrl: payload.avatarUrl as string | undefined,\n role: payload.role as string | undefined,\n isAnonymous: payload.isAnonymous as boolean | undefined,\n emailVisibility: payload.emailVisibility as string | undefined,\n custom: payload.custom as Record<string, unknown> | undefined,\n };\n } catch {\n return null;\n }\n}\n\n// ─── Storage keys ───\n\nconst REFRESH_TOKEN_KEY = 'edgebase:refresh-token';\nconst PUSH_TOKEN_CACHE_KEY = 'edgebase:push-token-cache';\nconst PUSH_DEVICE_ID_KEY = 'edgebase:push-device-id';\n\nexport { PUSH_TOKEN_CACHE_KEY, PUSH_DEVICE_ID_KEY };\n\n// ─── TokenManager ───\n\nexport class TokenManager {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private refreshPromise: Promise<TokenPair> | null = null;\n private authStateListeners: AuthStateChangeHandler[] = [];\n private cachedUser: TokenUser | null = null;\n private storage: AsyncStorageAdapter;\n private initialized = false;\n private initPromise: Promise<void>;\n\n constructor(\n private baseUrl: string,\n storage: AsyncStorageAdapter,\n ) {\n this.storage = storage;\n // Async init: restore user from persisted refresh token\n this.initPromise = this.restore();\n }\n\n /** Wait for storage restore to complete */\n async ready(): Promise<void> {\n return this.initPromise;\n }\n\n private async restore(): Promise<void> {\n try {\n const stored = await this.storage.getItem(REFRESH_TOKEN_KEY);\n if (stored && !isTokenExpired(stored, 0)) {\n this.refreshToken = stored;\n this.cachedUser = extractUser(stored);\n }\n } catch {\n // ignore storage errors on init\n }\n this.initialized = true;\n }\n\n /** Get valid access token, refreshing if needed */\n async getAccessToken(\n doRefresh: (refreshToken: string) => Promise<TokenPair>,\n ): Promise<string | null> {\n await this.initPromise;\n\n if (this.accessToken && !isTokenExpired(this.accessToken)) {\n return this.accessToken;\n }\n\n const refreshToken = this.refreshToken;\n if (!refreshToken) return null;\n\n // Deduplicate concurrent calls\n if (this.refreshPromise) {\n const result = await this.refreshPromise;\n return result.accessToken;\n }\n\n this.refreshPromise = doRefresh(refreshToken)\n .then((tokens) => {\n this.setTokens(tokens);\n return tokens;\n })\n .catch((err) => {\n if (err instanceof EdgeBaseError && err.code === 401) {\n this.clearTokens();\n }\n throw err;\n })\n .finally(() => {\n this.refreshPromise = null;\n });\n\n const result = await this.refreshPromise;\n return result.accessToken;\n }\n\n /** Set tokens after successful auth (sync in-memory + async persist) */\n setTokens(tokens: TokenPair): void {\n this.accessToken = tokens.accessToken;\n this.refreshToken = tokens.refreshToken;\n void this.storage.setItem(REFRESH_TOKEN_KEY, tokens.refreshToken);\n this.updateUser(tokens.accessToken);\n }\n\n /** Get stored refresh token (sync from memory cache) */\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n /** Drop the current access token so the next request must refresh or fail fast. */\n invalidateAccessToken(): void {\n this.accessToken = null;\n if (!this.refreshToken) {\n this.cachedUser = null;\n this.emitAuthStateChange(null);\n }\n }\n\n /** Read-only access to current access token (for websocket re-auth). */\n get currentAccessToken(): string | null {\n return this.accessToken;\n }\n\n /** Clear all tokens on sign-out */\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n void this.storage.removeItem(REFRESH_TOKEN_KEY);\n this.cachedUser = null;\n this.emitAuthStateChange(null);\n }\n\n /** Get current user (from cached JWT payload) */\n getCurrentUser(): TokenUser | null {\n return this.cachedUser;\n }\n\n /** Subscribe to auth state changes. Fires immediately with current state. */\n onAuthStateChange(handler: AuthStateChangeHandler): () => void {\n this.authStateListeners.push(handler);\n handler(this.cachedUser);\n return () => {\n this.authStateListeners = this.authStateListeners.filter((h) => h !== handler);\n };\n }\n\n private updateUser(accessToken: string): void {\n const user = extractUser(accessToken);\n this.cachedUser = user;\n this.emitAuthStateChange(user);\n }\n\n private emitAuthStateChange(user: TokenUser | null): void {\n for (const listener of this.authStateListeners) {\n listener(user);\n }\n }\n\n /** Clean up (no-op in RN, kept for API parity with web SDK) */\n destroy(): void {\n this.authStateListeners = [];\n }\n}\n","/**\n * Auth client for React Native — API parity with @edge-base/web AuthClient.\n *: onAuthStateChange\n *: signInAnonymously\n *: signUp with data\n *: React Native OAuth via Linking API + deep link callback\n *\n * Key differences from web AuthClient:\n * - signInWithOAuth uses Linking.openURL() instead of window.location.href\n * - Handles deep link OAuth callback via Linking.addEventListener\n * - TokenManager.getRefreshToken() is async (AsyncStorage)\n * - Captcha is handled via TurnstileWebView component (see turnstile.tsx)\n */\n\nimport type { HttpClient, GeneratedDbApi } from '@edge-base/core';\nimport type { TokenManager, TokenUser, AuthStateChangeHandler } from './token-manager.js';\n\n// ─── Types ───\n\nexport interface SignUpOptions {\n email: string;\n password: string;\n data?: {\n displayName?: string;\n avatarUrl?: string;\n [key: string]: unknown;\n };\n /** Captcha token from TurnstileWebView */\n captchaToken?: string;\n}\n\nexport interface SignInOptions {\n email: string;\n password: string;\n /** Captcha token from TurnstileWebView */\n captchaToken?: string;\n}\n\nexport interface AuthResult {\n user: TokenUser;\n accessToken: string;\n refreshToken: string;\n}\n\n/** Returned when MFA is required during sign-in */\nexport interface MfaRequiredResult {\n mfaRequired: true;\n mfaTicket: string;\n factors: MfaFactor[];\n}\n\nexport interface MfaFactor {\n id: string;\n type: string;\n}\n\nexport type SignInResult = AuthResult | MfaRequiredResult;\n\nexport interface TotpEnrollResult {\n factorId: string;\n secret: string;\n qrCodeUri: string;\n recoveryCodes: string[];\n}\n\nexport interface DisableTotpOptions {\n password?: string;\n code?: string;\n}\n\nexport interface Session {\n id: string;\n createdAt: string;\n userAgent?: string;\n ip?: string;\n}\n\nexport interface UpdateProfileOptions {\n displayName?: string;\n avatarUrl?: string;\n emailVisibility?: string;\n}\n\nexport interface PasskeysAuthOptions {\n email?: string;\n}\n\nexport interface LinkedIdentity {\n id: string;\n kind: 'oauth';\n provider: string;\n providerUserId: string;\n createdAt: string;\n canUnlink: boolean;\n}\n\nexport interface IdentityMethods {\n total: number;\n hasPassword: boolean;\n hasMagicLink: boolean;\n hasEmailOtp: boolean;\n hasPhone: boolean;\n passkeyCount: number;\n oauthCount: number;\n email?: string | null;\n phone?: string | null;\n}\n\nexport interface IdentitiesResult {\n ok?: boolean;\n identities: LinkedIdentity[];\n methods: IdentityMethods;\n}\n\n/** Minimal Linking interface — compatible with react-native Linking API */\nexport interface LinkingAdapter {\n openURL(url: string): Promise<void>;\n addEventListener(type: 'url', handler: (event: { url: string }) => void): { remove: () => void };\n getInitialURL(): Promise<string | null>;\n}\n\ntype OAuthStartOptions = {\n provider: string;\n redirectUrl?: string;\n captchaToken?: string;\n};\n\n// ─── AuthClient ───\n\nexport class AuthClient {\n private baseUrl: string;\n\n constructor(\n private client: HttpClient,\n private tokenManager: TokenManager,\n private core: GeneratedDbApi,\n private corePublic: GeneratedDbApi,\n private linking?: LinkingAdapter,\n ) {\n this.baseUrl = client.getBaseUrl();\n }\n\n /** Register a new user. Optionally include user metadata. */\n async signUp(options: SignUpOptions): Promise<AuthResult> {\n const body: Record<string, unknown> = {\n email: options.email,\n password: options.password,\n };\n if (options.data) body.data = options.data;\n if (options.captchaToken) body.captchaToken = options.captchaToken;\n\n const result = await this.corePublic.authSignup(body) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** Sign in with email and password. Returns MfaRequiredResult if MFA is enabled. */\n async signIn(options: SignInOptions): Promise<SignInResult> {\n const body: Record<string, unknown> = {\n email: options.email,\n password: options.password,\n };\n if (options.captchaToken) body.captchaToken = options.captchaToken;\n\n const result = await this.corePublic.authSignin(body) as SignInResult;\n if ('mfaRequired' in result && result.mfaRequired) {\n return result;\n }\n const authResult = result as AuthResult;\n this.tokenManager.setTokens({\n accessToken: authResult.accessToken,\n refreshToken: authResult.refreshToken,\n });\n return authResult;\n }\n\n /** Sign out — revokes current session on server and clears local tokens. */\n async signOut(): Promise<void> {\n try {\n const refreshToken = await this.tokenManager.getRefreshToken();\n if (refreshToken) {\n await this.core.authSignout({ refreshToken });\n }\n } catch {\n // Continue even if server call fails\n }\n this.tokenManager.clearTokens();\n }\n\n /** Refresh the current session using the stored refresh token. */\n async refreshSession(): Promise<AuthResult> {\n const refreshToken = await this.tokenManager.getRefreshToken();\n if (!refreshToken) {\n throw new Error('No refresh token available.');\n }\n const result = await this.corePublic.authRefresh({ refreshToken }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /**\n * Start OAuth sign-in flow.\n * Opens the OAuth URL via Linking.openURL() and listens for the deep link callback.\n * The app must be configured with a deep link scheme (e.g. myapp://auth/callback).\n *\n * @param provider - OAuth provider name (e.g. 'google', 'github')\n * @param options.redirectUrl - Deep link URL to redirect back to after OAuth (required for RN)\n * @param options.captchaToken - Optional captcha token\n * @returns Promise that resolves with AuthResult when OAuth completes\n *\n * NOTE: Not delegated to Generated Core — this is URL construction + redirect, not a standard HTTP call.\n */\n signInWithOAuth(\n providerOrOptions: string | OAuthStartOptions,\n options?: { redirectUrl?: string; captchaToken?: string },\n ): { url: string } {\n const provider = typeof providerOrOptions === 'string'\n ? providerOrOptions\n : providerOrOptions.provider;\n const resolvedOptions = typeof providerOrOptions === 'string'\n ? options\n : providerOrOptions;\n let url = `${this.baseUrl}/api/auth/oauth/${encodeURIComponent(provider)}`;\n if (resolvedOptions?.captchaToken) {\n url += `?captcha_token=${encodeURIComponent(resolvedOptions.captchaToken)}`;\n }\n if (resolvedOptions?.redirectUrl) {\n const sep = url.includes('?') ? '&' : '?';\n url += `${sep}redirect_url=${encodeURIComponent(resolvedOptions.redirectUrl)}`;\n }\n\n // Open in system browser via Linking API\n if (this.linking) {\n void this.linking.openURL(url);\n }\n\n return { url };\n }\n\n /**\n * Handle OAuth deep link callback.\n * Call this when your app receives a deep link URL with auth tokens.\n * Extract tokens from query params and store them.\n *\n * @example\n * // In your navigation/linking config:\n * Linking.addEventListener('url', ({ url }) => client.auth.handleOAuthCallback(url));\n */\n async handleOAuthCallback(url: string): Promise<AuthResult | null> {\n try {\n const parsed = new URL(url);\n const accessToken = parsed.searchParams.get('access_token');\n const refreshToken = parsed.searchParams.get('refresh_token');\n if (!accessToken || !refreshToken) return null;\n\n this.tokenManager.setTokens({ accessToken, refreshToken });\n\n return {\n user: this.tokenManager.getCurrentUser()!,\n accessToken,\n refreshToken,\n };\n } catch {\n return null;\n }\n }\n\n /** Sign in anonymously. */\n async signInAnonymously(options?: { captchaToken?: string }): Promise<AuthResult> {\n const body: Record<string, unknown> | undefined = options?.captchaToken\n ? { captchaToken: options.captchaToken }\n : undefined;\n const result = await this.corePublic.authSigninAnonymous(body) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /**\n * Send a magic link (passwordless login) email.\n * If the email is not registered and autoCreate is enabled (server config), a new account is created.\n */\n async signInWithMagicLink(options: { email: string; captchaToken?: string }): Promise<void> {\n const body: Record<string, unknown> = { email: options.email };\n if (options.captchaToken) {\n body.captchaToken = options.captchaToken;\n }\n await this.corePublic.authSigninMagicLink(body);\n }\n\n /**\n * Verify a magic link token and sign in.\n * Called after user clicks the link from their email.\n */\n async verifyMagicLink(token: string): Promise<AuthResult> {\n const result = await this.corePublic.authVerifyMagicLink({ token }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n // ─── Phone / SMS Auth ───\n\n /**\n * Send an SMS verification code to the given phone number.\n * If the phone is not registered and autoCreate is enabled (server config), a new account is created on verify.\n */\n async signInWithPhone(options: { phone: string; captchaToken?: string }): Promise<void> {\n const body: Record<string, unknown> = { phone: options.phone };\n if (options.captchaToken) {\n body.captchaToken = options.captchaToken;\n }\n await this.corePublic.authSigninPhone(body);\n }\n\n /**\n * Verify the SMS code and sign in.\n * Called after user receives the code from signInWithPhone.\n */\n async verifyPhone(options: { phone: string; code: string }): Promise<AuthResult> {\n const result = await this.corePublic.authVerifyPhone({\n phone: options.phone,\n code: options.code,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** Link current account with a phone number. Sends an SMS code. */\n async linkWithPhone(options: { phone: string }): Promise<void> {\n await this.core.authLinkPhone({ phone: options.phone });\n }\n\n /** Verify phone link code. Completes phone linking for the current account. */\n async verifyLinkPhone(options: { phone: string; code: string }): Promise<void> {\n await this.core.authVerifyLinkPhone({\n phone: options.phone,\n code: options.code,\n });\n }\n\n /** Link anonymous account to email/password. */\n async linkWithEmail(options: { email: string; password: string }): Promise<AuthResult> {\n const result = await this.core.authLinkEmail({\n email: options.email,\n password: options.password,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /**\n * Link anonymous account to OAuth provider. Returns URL to open in browser.\n *\n * NOTE: Not delegated — Generated Core's oauthLinkStart(provider) takes no body,\n * but we need to pass { redirectUrl }.\n */\n async linkWithOAuth(\n providerOrOptions: string | { provider: string; redirectUrl?: string },\n options?: { redirectUrl?: string },\n ): Promise<{ redirectUrl: string }> {\n const provider = typeof providerOrOptions === 'string'\n ? providerOrOptions\n : providerOrOptions.provider;\n const resolvedOptions = typeof providerOrOptions === 'string'\n ? options\n : providerOrOptions;\n const redirectUrl = resolvedOptions?.redirectUrl ?? '';\n const result = await this.client.post<{ redirectUrl: string }>(\n `/api/auth/oauth/link/${encodeURIComponent(provider)}`,\n { redirectUrl },\n );\n if (this.linking) {\n void this.linking.openURL(result.redirectUrl);\n }\n return result;\n }\n\n /** Subscribe to authentication state changes. */\n onAuthStateChange(callback: AuthStateChangeHandler): () => void {\n return this.tokenManager.onAuthStateChange(callback);\n }\n\n /** Get current authenticated user (from cached JWT). */\n get currentUser(): TokenUser | null {\n return this.tokenManager.getCurrentUser();\n }\n\n /** List active sessions. */\n async listSessions(): Promise<Session[]> {\n const result = await this.core.authGetSessions() as { sessions: Session[] };\n return result.sessions;\n }\n\n /** Revoke a specific session. */\n async revokeSession(sessionId: string): Promise<void> {\n await this.core.authDeleteSession(sessionId);\n }\n\n /** Update current user's profile. */\n async updateProfile(data: UpdateProfileOptions): Promise<TokenUser> {\n const result = await this.core.authUpdateProfile(data) as AuthResult;\n if (result.accessToken && result.refreshToken) {\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n }\n return this.tokenManager.getCurrentUser()!;\n }\n\n /** Verify email address with token. */\n async verifyEmail(token: string): Promise<void> {\n await this.corePublic.authVerifyEmail({ token });\n }\n\n /** Request a verification email for the current user. */\n async requestEmailVerification(options?: { redirectUrl?: string }): Promise<void> {\n const body: Record<string, unknown> = {};\n if (options?.redirectUrl) body.redirectUrl = options.redirectUrl;\n await this.core.authRequestEmailVerification(body);\n }\n\n /** Verify a pending email change using the emailed token. */\n async verifyEmailChange(token: string): Promise<void> {\n await this.corePublic.authVerifyEmailChange({ token });\n }\n\n /** Request password reset email. */\n async requestPasswordReset(\n email: string,\n options?: { captchaToken?: string },\n ): Promise<void> {\n const body: Record<string, unknown> = { email };\n if (options?.captchaToken) body.captchaToken = options.captchaToken;\n await this.corePublic.authRequestPasswordReset(body);\n }\n\n /** Reset password with token. */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.corePublic.authResetPassword({ token, newPassword });\n }\n\n /** Change password for authenticated user. */\n async changePassword(options: {\n currentPassword: string;\n newPassword: string;\n }): Promise<AuthResult> {\n const result = await this.core.authChangePassword({\n currentPassword: options.currentPassword,\n newPassword: options.newPassword,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** Request an email change for the authenticated user. */\n async changeEmail(options: { newEmail: string; password: string; redirectUrl?: string }): Promise<void> {\n const body: Record<string, unknown> = {\n newEmail: options.newEmail,\n password: options.password,\n };\n if (options.redirectUrl) body.redirectUrl = options.redirectUrl;\n await this.client.post('/api/auth/change-email', body);\n }\n\n /** List linked sign-in identities for the current user. */\n async listIdentities(): Promise<IdentitiesResult> {\n return this.client.get('/api/auth/identities') as Promise<IdentitiesResult>;\n }\n\n /** Unlink a linked OAuth identity by its identity ID. */\n async unlinkIdentity(identityId: string): Promise<IdentitiesResult> {\n return this.client.delete(`/api/auth/identities/${encodeURIComponent(identityId)}`) as Promise<IdentitiesResult>;\n }\n\n /** Send an email OTP code for sign-in. */\n async signInWithEmailOtp(options: { email: string }): Promise<void> {\n await this.corePublic.authSigninEmailOtp({ email: options.email });\n }\n\n /** Verify an email OTP code and sign in. */\n async verifyEmailOtp(options: { email: string; code: string }): Promise<AuthResult> {\n const result = await this.corePublic.authVerifyEmailOtp({\n email: options.email,\n code: options.code,\n }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n // ─── Passkeys / WebAuthn REST layer ───\n\n /** Generate WebAuthn registration options for the current authenticated user. */\n async passkeysRegisterOptions(): Promise<unknown> {\n return this.core.authPasskeysRegisterOptions();\n }\n\n /** Verify and store a passkey registration response from the platform credential API. */\n async passkeysRegister(response: unknown): Promise<unknown> {\n return this.core.authPasskeysRegister({ response });\n }\n\n /** Generate WebAuthn authentication options. */\n async passkeysAuthOptions(options?: PasskeysAuthOptions): Promise<unknown> {\n return this.corePublic.authPasskeysAuthOptions(options ?? {});\n }\n\n /** Verify a WebAuthn assertion and establish a session. */\n async passkeysAuthenticate(response: unknown): Promise<AuthResult> {\n const result = await this.corePublic.authPasskeysAuthenticate({ response }) as AuthResult;\n this.tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n }\n\n /** List registered passkeys for the current authenticated user. */\n async passkeysList(): Promise<unknown> {\n return this.core.authPasskeysList();\n }\n\n /** Delete a registered passkey by credential ID. */\n async passkeysDelete(credentialId: string): Promise<unknown> {\n return this.core.authPasskeysDelete(credentialId);\n }\n\n // ─── MFA / TOTP ───\n\n /** MFA sub-namespace for TOTP enrollment, verification, and management. */\n get mfa() {\n const client = this.client;\n const core = this.core;\n const corePublic = this.corePublic;\n const tokenManager = this.tokenManager;\n return {\n /** Enroll TOTP — returns secret, QR code URI, and recovery codes. */\n async enrollTotp(): Promise<TotpEnrollResult> {\n return core.authMfaTotpEnroll() as Promise<TotpEnrollResult>;\n },\n\n /** Verify TOTP enrollment with factorId and a TOTP code. */\n async verifyTotpEnrollment(factorId: string, code: string): Promise<{ ok: true }> {\n return core.authMfaTotpVerify({ factorId, code }) as Promise<{ ok: true }>;\n },\n\n /** Verify TOTP code during MFA challenge (after signIn returns mfaRequired). */\n async verifyTotp(mfaTicket: string, code: string): Promise<AuthResult> {\n const result = await corePublic.authMfaVerify({\n mfaTicket,\n code,\n }) as AuthResult;\n tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n },\n\n /** Use a recovery code during MFA challenge. */\n async useRecoveryCode(mfaTicket: string, recoveryCode: string): Promise<AuthResult> {\n const result = await corePublic.authMfaRecovery({\n mfaTicket,\n recoveryCode,\n }) as AuthResult;\n tokenManager.setTokens({\n accessToken: result.accessToken,\n refreshToken: result.refreshToken,\n });\n return result;\n },\n\n /**\n * Disable TOTP for the current user. Requires password or TOTP code.\n */\n async disableTotp(options?: DisableTotpOptions): Promise<{ ok: true }> {\n return core.authMfaTotpDelete(options ?? {}) as Promise<{ ok: true }>;\n },\n\n /** List enrolled MFA factors for the current user. */\n async listFactors(): Promise<{ factors: MfaFactor[] }> {\n return core.authMfaFactors() as Promise<{ factors: MfaFactor[] }>;\n },\n };\n }\n\n}\n","import { EdgeBaseError } from '@edge-base/core';\n\ninterface RefreshResponse {\n accessToken?: string;\n refreshToken?: string;\n message?: string;\n}\n\nexport async function refreshAccessToken(baseUrl: string, refreshToken: string): Promise<{\n accessToken: string;\n refreshToken: string;\n}> {\n let response: Response;\n\n try {\n response = await fetch(`${baseUrl.replace(/\\/$/, '')}/api/auth/refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n });\n } catch (error) {\n throw new EdgeBaseError(\n 0,\n `Network error: ${error instanceof Error ? error.message : 'Failed to refresh access token.'}`,\n );\n }\n\n const body = await response.json().catch(() => null) as RefreshResponse | null;\n if (!response.ok) {\n throw new EdgeBaseError(\n response.status,\n typeof body?.message === 'string' ? body.message : 'Failed to refresh access token.',\n );\n }\n\n if (!body?.accessToken || !body?.refreshToken) {\n throw new EdgeBaseError(500, 'Invalid auth refresh response.');\n }\n\n return {\n accessToken: body.accessToken,\n refreshToken: body.refreshToken,\n };\n}\n","import type { ContextManager, IDatabaseLiveSubscriber } from '@edge-base/core';\nimport { EdgeBaseError } from '@edge-base/core';\nimport type { TokenManager, TokenUser } from './token-manager.js';\nimport { refreshAccessToken } from './auth-refresh.js';\n\nexport type ChangeType = 'added' | 'modified' | 'removed';\nexport type FilterTuple = [string, string, unknown];\n\ntype ErrorHandler = (error: { code: string; message: string }) => void;\n\ninterface DbChange<T = Record<string, unknown>> {\n changeType: ChangeType;\n table: string;\n docId: string;\n data: T | null;\n timestamp: string;\n}\n\ninterface Subscription {\n channel: string;\n handler: (change: DbChange) => void;\n filters?: Record<string, unknown>;\n serverFilters?: FilterTuple[];\n serverOrFilters?: FilterTuple[];\n}\n\nexport interface DatabaseLiveOptions {\n autoReconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n}\n\nexport class DatabaseLiveClient implements IDatabaseLiveSubscriber {\n private ws: WebSocket | null = null;\n private connectingPromise: Promise<void> | null = null;\n private subscriptions = new Map<string, Subscription[]>();\n private connectedChannels = new Set<string>();\n private channelFilters = new Map<string, FilterTuple[]>();\n private channelOrFilters = new Map<string, FilterTuple[]>();\n private errorHandlers: ErrorHandler[] = [];\n private reconnectAttempts = 0;\n private connected = false;\n private authenticated = false;\n private waitingForAuth = false;\n private authRecoveryPromise: Promise<void> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private unsubAuthState: (() => void) | null = null;\n\n private options: Required<DatabaseLiveOptions>;\n\n constructor(\n private baseUrl: string,\n private tokenManager: TokenManager,\n options?: DatabaseLiveOptions,\n contextManager?: ContextManager,\n ) {\n this.options = {\n autoReconnect: options?.autoReconnect ?? true,\n maxReconnectAttempts: options?.maxReconnectAttempts ?? 10,\n reconnectBaseDelay: options?.reconnectBaseDelay ?? 1000,\n };\n\n if (contextManager) {\n contextManager.onContextChange(() => this.handleContextChange());\n }\n\n this.unsubAuthState = this.tokenManager.onAuthStateChange((user) => {\n this.handleAuthStateChange(user);\n });\n }\n\n onSnapshot<T>(\n channel: string,\n callback: (change: DbChange<T>) => void,\n clientFilters?: unknown,\n serverFilters?: unknown,\n serverOrFilters?: unknown,\n ): () => void {\n const sub: Subscription = {\n channel,\n handler: callback as (change: DbChange) => void,\n filters: clientFilters as Record<string, unknown> | undefined,\n serverFilters: serverFilters as FilterTuple[] | undefined,\n serverOrFilters: serverOrFilters as FilterTuple[] | undefined,\n };\n\n if (!this.subscriptions.has(channel)) {\n this.subscriptions.set(channel, []);\n }\n this.subscriptions.get(channel)!.push(sub);\n\n if (sub.serverFilters && sub.serverFilters.length > 0) {\n this.channelFilters.set(channel, sub.serverFilters);\n }\n if (sub.serverOrFilters && sub.serverOrFilters.length > 0) {\n this.channelOrFilters.set(channel, sub.serverOrFilters);\n }\n\n this.connect(channel).catch(() => {});\n\n return () => {\n const subs = this.subscriptions.get(channel);\n if (!subs) return;\n const idx = subs.indexOf(sub);\n if (idx >= 0) subs.splice(idx, 1);\n if (subs.length === 0) {\n this.subscriptions.delete(channel);\n this.channelFilters.delete(channel);\n this.channelOrFilters.delete(channel);\n this.sendUnsubscribe(channel);\n }\n };\n }\n\n onError(handler: ErrorHandler): () => void {\n this.errorHandlers.push(handler);\n return () => {\n const idx = this.errorHandlers.indexOf(handler);\n if (idx >= 0) this.errorHandlers.splice(idx, 1);\n };\n }\n\n async connect(channel: string): Promise<void> {\n this.connectedChannels.add(channel);\n\n if (this.ws && this.connected) {\n this.sendSubscribe(channel);\n return;\n }\n\n if (!this.hasAuthContext()) {\n this.waitingForAuth = true;\n return;\n }\n\n if (this.connectingPromise) {\n return this.connectingPromise;\n }\n\n const connection = this.establishConnection(channel).finally(() => {\n if (this.connectingPromise === connection) {\n this.connectingPromise = null;\n }\n });\n this.connectingPromise = connection;\n return connection;\n }\n\n reconnect(): void {\n if (this.connected || this.connectedChannels.size === 0) return;\n const firstChannel = this.connectedChannels.values().next().value as string | undefined;\n if (!firstChannel) return;\n this.reconnectAttempts = 0;\n this.options.autoReconnect = true;\n this.connect(firstChannel).catch(() => {});\n }\n\n disconnect(): void {\n this.options.autoReconnect = false;\n this.stopHeartbeat();\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n this.connected = false;\n this.authenticated = false;\n this.connectingPromise = null;\n this.connectedChannels.clear();\n this.subscriptions.clear();\n this.channelFilters.clear();\n this.channelOrFilters.clear();\n this.errorHandlers = [];\n this.unsubAuthState?.();\n this.unsubAuthState = null;\n }\n\n private async establishConnection(channel: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.buildWsUrl(channel));\n this.ws = ws;\n\n ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.authenticate()\n .then(() => {\n this.waitingForAuth = false;\n resolve();\n })\n .catch((error) => {\n this.handleAuthenticationFailure(error);\n reject(error);\n });\n };\n\n ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n\n ws.onclose = () => {\n this.connected = false;\n this.authenticated = false;\n this.ws = null;\n this.stopHeartbeat();\n if (\n this.options.autoReconnect\n && !this.waitingForAuth\n && this.reconnectAttempts < this.options.maxReconnectAttempts\n ) {\n this.scheduleReconnect(channel);\n }\n };\n\n ws.onerror = () => {\n reject(new EdgeBaseError(500, 'Database live WebSocket connection error'));\n };\n });\n }\n\n private async authenticate(): Promise<void> {\n const token = await this.tokenManager.getAccessToken((refreshToken) =>\n refreshAccessToken(this.baseUrl, refreshToken),\n );\n if (!token) throw new EdgeBaseError(401, 'No access token available. Sign in first.');\n this.sendRaw({ type: 'auth', token, sdkVersion: '0.1.0' });\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new EdgeBaseError(401, 'Auth timeout')), 10000);\n const original = this.ws?.onmessage;\n if (!this.ws) return;\n\n this.ws.onmessage = (event) => {\n const msg = JSON.parse(event.data as string) as Record<string, unknown>;\n if (msg.type === 'auth_success' || msg.type === 'auth_refreshed') {\n clearTimeout(timeout);\n this.authenticated = true;\n if (this.ws) this.ws.onmessage = original ?? null;\n if (msg.type === 'auth_refreshed') {\n const revoked = (msg.revokedChannels as string[] | undefined) ?? [];\n for (const channel of revoked) {\n this.subscriptions.delete(channel);\n this.channelFilters.delete(channel);\n this.channelOrFilters.delete(channel);\n this.connectedChannels.delete(channel);\n }\n }\n this.resubscribeAll();\n resolve();\n } else if (msg.type === 'error') {\n clearTimeout(timeout);\n reject(new EdgeBaseError(401, msg.message as string));\n }\n };\n });\n }\n\n private handleMessage(raw: string): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n const type = msg.type as string;\n\n if (type === 'db_change') {\n const change: DbChange = {\n changeType: msg.changeType as ChangeType,\n table: msg.table as string,\n docId: msg.docId as string,\n data: msg.data as Record<string, unknown> | null,\n timestamp: msg.timestamp as string,\n };\n const messageChannel = typeof msg.channel === 'string' ? msg.channel : undefined;\n for (const [channel, subs] of this.subscriptions.entries()) {\n if (!matchesDatabaseLiveChannel(channel, change, messageChannel)) continue;\n for (const sub of subs) {\n if (sub.filters && change.data && !matchesClientFilter(change.data, sub.filters)) continue;\n sub.handler(change);\n }\n }\n return;\n }\n\n if (type === 'batch_changes') {\n const changes = msg.changes as Array<{ event: string; docId: string; data: Record<string, unknown> | null; timestamp: string }>;\n if (!Array.isArray(changes)) return;\n for (const entry of changes) {\n const change: DbChange = {\n changeType: entry.event as ChangeType,\n table: (msg.table as string | undefined) ?? '',\n docId: entry.docId,\n data: entry.data,\n timestamp: entry.timestamp,\n };\n const messageChannel = typeof msg.channel === 'string' ? msg.channel : undefined;\n for (const [channel, subs] of this.subscriptions.entries()) {\n if (!matchesDatabaseLiveChannel(channel, change, messageChannel)) continue;\n for (const sub of subs) {\n if (sub.filters && change.data && !matchesClientFilter(change.data, sub.filters)) continue;\n sub.handler(change);\n }\n }\n }\n return;\n }\n\n if (type === 'FILTER_RESYNC') {\n this.resyncFilters();\n return;\n }\n\n if (type === 'auth_refreshed') {\n const revoked = (msg.revokedChannels as string[] | undefined) ?? [];\n for (const channel of revoked) {\n this.subscriptions.delete(channel);\n this.channelFilters.delete(channel);\n this.channelOrFilters.delete(channel);\n this.connectedChannels.delete(channel);\n }\n return;\n }\n\n if (type === 'error') {\n if ((msg.code as string | undefined) === 'NOT_AUTHENTICATED' && this.hasAuthContext()) {\n this.recoverAuthentication();\n return;\n }\n for (const handler of this.errorHandlers) {\n handler({ code: msg.code as string, message: msg.message as string });\n }\n }\n }\n\n private sendSubscribe(channel: string): void {\n if (!this.authenticated) return;\n const filters = this.channelFilters.get(channel);\n const orFilters = this.channelOrFilters.get(channel);\n const msg: Record<string, unknown> = { type: 'subscribe', channel };\n if (filters && filters.length > 0) msg.filters = filters;\n if (orFilters && orFilters.length > 0) msg.orFilters = orFilters;\n this.sendRaw(msg);\n }\n\n private sendUnsubscribe(channel: string): void {\n this.connectedChannels.delete(channel);\n if (this.authenticated) this.sendRaw({ type: 'unsubscribe', channel });\n }\n\n private resubscribeAll(): void {\n for (const channel of this.connectedChannels) this.sendSubscribe(channel);\n }\n\n private refreshAuth(): void {\n const token = this.tokenManager.currentAccessToken;\n if (!token || !this.ws || !this.connected) return;\n this.sendRaw({ type: 'auth', token, sdkVersion: '0.1.0' });\n }\n\n private handleAuthStateChange(user: TokenUser | null): void {\n if (user) {\n if (this.ws && this.connected && this.authenticated) {\n this.refreshAuth();\n return;\n }\n\n this.waitingForAuth = false;\n if (this.connectedChannels.size > 0 && (!this.ws || !this.connected)) {\n const firstChannel = this.connectedChannels.values().next().value as string | undefined;\n if (firstChannel) {\n this.reconnectAttempts = 0;\n this.connect(firstChannel).catch(() => {});\n }\n }\n return;\n }\n\n this.waitingForAuth = this.connectedChannels.size > 0;\n if (this.ws) {\n const socket = this.ws;\n this.stopHeartbeat();\n this.ws = null;\n this.connected = false;\n this.authenticated = false;\n try {\n socket.close(1000, 'Signed out');\n } catch {\n // Ignore close failures.\n }\n return;\n }\n\n this.connected = false;\n this.authenticated = false;\n }\n\n private handleAuthenticationFailure(error: unknown): void {\n const authError =\n error instanceof EdgeBaseError\n ? error\n : new EdgeBaseError(500, 'Database live authentication failed.');\n\n this.waitingForAuth = authError.code === 401 && this.connectedChannels.size > 0;\n this.stopHeartbeat();\n this.connected = false;\n this.authenticated = false;\n\n if (this.ws) {\n const socket = this.ws;\n this.ws = null;\n try {\n socket.close(4001, authError.message);\n } catch {\n // Ignore close failures.\n }\n }\n }\n\n private resyncFilters(): void {\n for (const [channel] of this.channelFilters) {\n const filters = this.channelFilters.get(channel) ?? [];\n const orFilters = this.channelOrFilters.get(channel) ?? [];\n if (filters.length > 0 || orFilters.length > 0) {\n const msg: Record<string, unknown> = { type: 'subscribe', channel };\n if (filters.length > 0) msg.filters = filters;\n if (orFilters.length > 0) msg.orFilters = orFilters;\n this.sendRaw(msg);\n }\n }\n }\n\n private scheduleReconnect(channel: string): void {\n const delay = this.options.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n setTimeout(() => { this.connect(channel).catch(() => {}); }, Math.min(delay, 30000));\n }\n\n private buildWsUrl(channel: string): string {\n const wsUrl = this.baseUrl.replace(/\\/$/, '').replace(/^http/, 'ws');\n return `${wsUrl}/api/db/subscribe?channel=${encodeURIComponent(channel)}`;\n }\n\n private sendRaw(msg: Record<string, unknown>): void {\n if (this.ws && this.connected) this.ws.send(JSON.stringify(msg));\n }\n\n private hasAuthContext(): boolean {\n return Boolean(this.tokenManager.getCurrentUser() || this.tokenManager.getRefreshToken());\n }\n\n private recoverAuthentication(): void {\n if (this.authRecoveryPromise || !this.ws || !this.connected || !this.hasAuthContext()) {\n return;\n }\n\n this.authenticated = false;\n this.waitingForAuth = true;\n this.authRecoveryPromise = this.authenticate()\n .then(() => {\n this.waitingForAuth = false;\n })\n .catch((error) => {\n this.handleAuthenticationFailure(error);\n for (const handler of this.errorHandlers) {\n handler({\n code: 'NOT_AUTHENTICATED',\n message: 'Database live authentication was lost and recovery failed.',\n });\n }\n })\n .finally(() => {\n this.authRecoveryPromise = null;\n });\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.ws && this.connected) this.sendRaw({ type: 'ping' });\n }, 30000);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) { clearInterval(this.heartbeatTimer); this.heartbeatTimer = null; }\n }\n\n private handleContextChange(): void {\n if (!this.ws || !this.connected) return;\n if (this.connectedChannels.size === 0) return;\n this.stopHeartbeat();\n this.ws.close(1000, 'Context change');\n this.ws = null;\n this.connected = false;\n this.authenticated = false;\n this.reconnectAttempts = 0;\n const firstChannel = this.connectedChannels.values().next().value as string | undefined;\n if (firstChannel) this.connect(firstChannel).catch(() => {});\n }\n}\n\nfunction matchesClientFilter(data: Record<string, unknown>, filters: Record<string, unknown>): boolean {\n for (const [key, expected] of Object.entries(filters)) {\n if (data[key] !== expected) return false;\n }\n return true;\n}\n\nfunction matchesDatabaseLiveChannel(channel: string, change: DbChange, messageChannel?: string): boolean {\n if (messageChannel) return channel === messageChannel;\n const parts = channel.split(':');\n if (parts[0] !== 'dblive') return false;\n if (parts.length === 2) return parts[1] === change.table;\n if (parts.length === 3) return parts[2] === change.table;\n if (parts.length === 4) {\n if (parts[2] === change.table) return change.docId === parts[3];\n return parts[3] === change.table;\n }\n return parts[3] === change.table && change.docId === parts[4];\n}\n","/**\n * RoomClient v2 — Client-side room connection for real-time multiplayer state.\n *\n *: Complete redesign from v1.\n * - 3 state areas: sharedState (all clients), playerState (per-player), serverState (server-only, not sent)\n * - Client can only read + subscribe + send(). All writes are server-only.\n * - send() returns a Promise resolved by requestId matching\n * - Subscription returns { unsubscribe() } object\n * - namespace + roomId identification (replaces single roomId)\n */\nimport type { TokenManager, TokenUser } from './token-manager.js';\nimport { EdgeBaseError } from '@edge-base/core';\nimport { refreshAccessToken } from './auth-refresh.js';\n\n// ─── Types ───\n\nexport interface RoomOptions {\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Max reconnect attempts (default: 10) */\n maxReconnectAttempts?: number;\n /** Base delay for reconnect backoff in ms (default: 1000) */\n reconnectBaseDelay?: number;\n /** Timeout for send() requests in ms (default: 10000) */\n sendTimeout?: number;\n}\n\nexport interface Subscription {\n unsubscribe(): void;\n}\n\nexport type SharedStateHandler = (state: Record<string, unknown>, changes: Record<string, unknown>) => void;\nexport type PlayerStateHandler = (state: Record<string, unknown>, changes: Record<string, unknown>) => void;\nexport type MessageHandler = (data: unknown) => void;\nexport type ErrorHandler = (error: { code: string; message: string }) => void;\nexport type KickedHandler = () => void;\nexport type RoomConnectionState =\n | 'idle'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'disconnected'\n | 'auth_lost'\n | 'kicked';\nexport type RoomMemberLeaveReason = 'leave' | 'timeout' | 'kicked';\n\nexport interface RoomSignalMeta {\n memberId?: string | null;\n userId?: string | null;\n connectionId?: string | null;\n sentAt?: number;\n serverSent?: boolean;\n}\n\nexport interface RoomMember {\n memberId: string;\n userId: string;\n connectionId?: string;\n connectionCount?: number;\n role?: string;\n state: Record<string, unknown>;\n}\n\nexport interface RoomReconnectInfo {\n attempt: number;\n}\n\nexport type RoomMediaKind = 'audio' | 'video' | 'screen';\n\nexport interface RoomMediaTrack {\n kind: RoomMediaKind;\n trackId?: string;\n deviceId?: string;\n muted: boolean;\n publishedAt?: number;\n adminDisabled?: boolean;\n}\n\nexport interface RoomMemberMediaKindState {\n published: boolean;\n muted: boolean;\n trackId?: string;\n deviceId?: string;\n publishedAt?: number;\n adminDisabled?: boolean;\n}\n\nexport interface RoomMemberMediaState {\n audio?: RoomMemberMediaKindState;\n video?: RoomMemberMediaKindState;\n screen?: RoomMemberMediaKindState;\n}\n\nexport interface RoomMediaMember {\n member: RoomMember;\n state: RoomMemberMediaState;\n tracks: RoomMediaTrack[];\n}\n\nexport interface RoomMediaDeviceChange {\n kind: RoomMediaKind;\n deviceId: string;\n}\n\n// ─── Helpers ───\n\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n if (parts.some((p) => UNSAFE_KEYS.has(p))) return;\n let current: any = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof current[key] !== 'object' || current[key] === null) {\n current[key] = {};\n }\n current = current[key];\n }\n const lastKey = parts[parts.length - 1];\n if (value === null) {\n delete current[lastKey];\n } else {\n current[lastKey] = value;\n }\n}\n\nfunction generateRequestId(): string {\n // Use crypto.randomUUID if available, fallback to simple counter\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === 'function') {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value ?? null)) as T;\n}\n\nfunction cloneRecord<T extends Record<string, unknown>>(value: T): T {\n return cloneValue(value);\n}\n\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst ROOM_EXPLICIT_LEAVE_CLOSE_CODE = 4005;\nconst ROOM_EXPLICIT_LEAVE_REASON = 'Client left room';\nconst ROOM_EXPLICIT_LEAVE_CLOSE_DELAY_MS = 40;\n\nfunction isSocketOpenOrConnecting(socket: Pick<WebSocket, 'readyState'> | null | undefined): boolean {\n return !!socket && (socket.readyState === WS_OPEN || socket.readyState === WS_CONNECTING);\n}\n\nfunction closeSocketAfterLeave(socket: Pick<WebSocket, 'close'>, reason: string): void {\n globalThis.setTimeout(() => {\n try {\n socket.close(ROOM_EXPLICIT_LEAVE_CLOSE_CODE, reason);\n } catch {\n // Socket already closed.\n }\n }, ROOM_EXPLICIT_LEAVE_CLOSE_DELAY_MS);\n}\n\n// ─── RoomClient v2 ───\n\nexport class RoomClient {\n private baseUrl: string;\n private tokenManager: TokenManager;\n private options: Required<RoomOptions>;\n\n /** Room namespace (e.g. 'game', 'chat') */\n public readonly namespace: string;\n /** Room instance ID within the namespace */\n public readonly roomId: string;\n\n // ─── State ───\n private _sharedState: Record<string, unknown> = {};\n private _sharedVersion = 0;\n private _playerState: Record<string, unknown> = {};\n private _playerVersion = 0;\n private _members: RoomMember[] = [];\n private _mediaMembers: RoomMediaMember[] = [];\n // ─── Connection ───\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private connected = false;\n private authenticated = false;\n private joined = false;\n private currentUserId: string | null = null;\n private currentConnectionId: string | null = null;\n private connectionState: RoomConnectionState = 'idle';\n private reconnectInfo: RoomReconnectInfo | null = null;\n private connectingPromise: Promise<void> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private intentionallyLeft = false;\n private waitingForAuth = false;\n private joinRequested = false;\n private unsubAuthState: (() => void) | null = null;\n\n // ─── Pending send() requests (requestId → { resolve, reject, timeout }) ───\n private pendingRequests = new Map<string, {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingSignalRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingAdminRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingMemberStateRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n private pendingMediaRequests = new Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>();\n\n // ─── Subscriptions ───\n private sharedStateHandlers: SharedStateHandler[] = [];\n private playerStateHandlers: PlayerStateHandler[] = [];\n private messageHandlers = new Map<string, MessageHandler[]>(); // messageType → handlers\n private allMessageHandlers: ((messageType: string, data: unknown) => void)[] = [];\n private errorHandlers: ErrorHandler[] = [];\n private kickedHandlers: KickedHandler[] = [];\n private memberSyncHandlers: Array<(members: RoomMember[]) => void> = [];\n private memberJoinHandlers: Array<(member: RoomMember) => void> = [];\n private memberLeaveHandlers: Array<(member: RoomMember, reason: RoomMemberLeaveReason) => void> = [];\n private memberStateHandlers: Array<(member: RoomMember, state: Record<string, unknown>) => void> = [];\n private signalHandlers = new Map<string, Array<(payload: unknown, meta: RoomSignalMeta) => void>>();\n private anySignalHandlers: Array<(event: string, payload: unknown, meta: RoomSignalMeta) => void> = [];\n private mediaTrackHandlers: Array<(track: RoomMediaTrack, member: RoomMember) => void> = [];\n private mediaTrackRemovedHandlers: Array<(track: RoomMediaTrack, member: RoomMember) => void> = [];\n private mediaStateHandlers: Array<(member: RoomMember, state: RoomMemberMediaState) => void> = [];\n private mediaDeviceHandlers: Array<(member: RoomMember, change: RoomMediaDeviceChange) => void> = [];\n private reconnectHandlers: Array<(info: RoomReconnectInfo) => void> = [];\n private connectionStateHandlers: Array<(state: RoomConnectionState) => void> = [];\n\n readonly state = {\n getShared: (): Record<string, unknown> => this.getSharedState(),\n getMine: (): Record<string, unknown> => this.getPlayerState(),\n onSharedChange: (handler: SharedStateHandler): Subscription => this.onSharedState(handler),\n onMineChange: (handler: PlayerStateHandler): Subscription => this.onPlayerState(handler),\n send: (actionType: string, payload?: unknown): Promise<unknown> => this.send(actionType, payload),\n };\n\n readonly meta = {\n get: (): Promise<Record<string, unknown>> => this.getMetadata(),\n };\n\n readonly signals = {\n send: (event: string, payload?: unknown, options?: { includeSelf?: boolean }): Promise<void> =>\n this.sendSignal(event, payload, options),\n sendTo: (memberId: string, event: string, payload?: unknown): Promise<void> =>\n this.sendSignal(event, payload, { memberId }),\n on: (event: string, handler: (payload: unknown, meta: RoomSignalMeta) => void): Subscription =>\n this.onSignal(event, handler),\n onAny: (handler: (event: string, payload: unknown, meta: RoomSignalMeta) => void): Subscription =>\n this.onAnySignal(handler),\n };\n\n readonly members = {\n list: (): RoomMember[] => cloneValue(this._members),\n onSync: (handler: (members: RoomMember[]) => void): Subscription => this.onMembersSync(handler),\n onJoin: (handler: (member: RoomMember) => void): Subscription => this.onMemberJoin(handler),\n onLeave: (handler: (member: RoomMember, reason: RoomMemberLeaveReason) => void): Subscription =>\n this.onMemberLeave(handler),\n setState: (state: Record<string, unknown>): Promise<void> => this.sendMemberState(state),\n clearState: (): Promise<void> => this.clearMemberState(),\n onStateChange: (handler: (member: RoomMember, state: Record<string, unknown>) => void): Subscription =>\n this.onMemberStateChange(handler),\n };\n\n readonly admin = {\n kick: (memberId: string): Promise<void> => this.sendAdmin('kick', memberId),\n mute: (memberId: string): Promise<void> => this.sendAdmin('mute', memberId),\n block: (memberId: string): Promise<void> => this.sendAdmin('block', memberId),\n setRole: (memberId: string, role: string): Promise<void> =>\n this.sendAdmin('setRole', memberId, { role }),\n disableVideo: (memberId: string): Promise<void> => this.sendAdmin('disableVideo', memberId),\n stopScreenShare: (memberId: string): Promise<void> => this.sendAdmin('stopScreenShare', memberId),\n };\n\n readonly media = {\n list: (): RoomMediaMember[] => cloneValue(this._mediaMembers),\n audio: {\n enable: (payload?: { trackId?: string; deviceId?: string }): Promise<void> =>\n this.sendMedia('publish', 'audio', payload),\n disable: (): Promise<void> => this.sendMedia('unpublish', 'audio'),\n setMuted: (muted: boolean): Promise<void> => this.sendMedia('mute', 'audio', { muted }),\n },\n video: {\n enable: (payload?: { trackId?: string; deviceId?: string }): Promise<void> =>\n this.sendMedia('publish', 'video', payload),\n disable: (): Promise<void> => this.sendMedia('unpublish', 'video'),\n setMuted: (muted: boolean): Promise<void> => this.sendMedia('mute', 'video', { muted }),\n },\n screen: {\n start: (payload?: { trackId?: string; deviceId?: string }): Promise<void> =>\n this.sendMedia('publish', 'screen', payload),\n stop: (): Promise<void> => this.sendMedia('unpublish', 'screen'),\n },\n devices: {\n switch: (payload: {\n audioInputId?: string;\n videoInputId?: string;\n screenInputId?: string;\n }): Promise<void> => this.switchMediaDevices(payload),\n },\n onTrack: (handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription =>\n this.onMediaTrack(handler),\n onTrackRemoved: (handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription =>\n this.onMediaTrackRemoved(handler),\n onStateChange: (handler: (member: RoomMember, state: RoomMemberMediaState) => void): Subscription =>\n this.onMediaStateChange(handler),\n onDeviceChange: (handler: (member: RoomMember, change: RoomMediaDeviceChange) => void): Subscription =>\n this.onMediaDeviceChange(handler),\n };\n\n readonly session = {\n onError: (handler: ErrorHandler): Subscription => this.onError(handler),\n onKicked: (handler: KickedHandler): Subscription => this.onKicked(handler),\n onReconnect: (handler: (info: RoomReconnectInfo) => void): Subscription => this.onReconnect(handler),\n onConnectionStateChange: (handler: (state: RoomConnectionState) => void): Subscription =>\n this.onConnectionStateChange(handler),\n };\n\n constructor(\n baseUrl: string,\n namespace: string,\n roomId: string,\n tokenManager: TokenManager,\n options?: RoomOptions,\n ) {\n this.baseUrl = baseUrl;\n this.namespace = namespace;\n this.roomId = roomId;\n this.tokenManager = tokenManager;\n this.options = {\n autoReconnect: options?.autoReconnect ?? true,\n maxReconnectAttempts: options?.maxReconnectAttempts ?? 10,\n reconnectBaseDelay: options?.reconnectBaseDelay ?? 1000,\n sendTimeout: options?.sendTimeout ?? 10000,\n };\n\n this.unsubAuthState = this.tokenManager.onAuthStateChange((user) => {\n this.handleAuthStateChange(user);\n });\n }\n\n // ─── State Accessors ───\n\n /** Get current shared state (read-only snapshot) */\n getSharedState(): Record<string, unknown> {\n return cloneRecord(this._sharedState);\n }\n\n /** Get current player state (read-only snapshot) */\n getPlayerState(): Record<string, unknown> {\n return cloneRecord(this._playerState);\n }\n\n // ─── Metadata (HTTP, no WebSocket needed) ───\n\n /**\n * Get room metadata without joining (HTTP GET).\n * Returns developer-defined metadata set by room.setMetadata() on the server.\n */\n async getMetadata(): Promise<Record<string, unknown>> {\n return RoomClient.getMetadata(this.baseUrl, this.namespace, this.roomId);\n }\n\n /**\n * Static: Get room metadata without creating a RoomClient instance.\n * Useful for lobby screens where you need room info before joining.\n */\n static async getMetadata(\n baseUrl: string,\n namespace: string,\n roomId: string,\n ): Promise<Record<string, unknown>> {\n const url = `${baseUrl.replace(/\\/$/, '')}/api/room/metadata?namespace=${encodeURIComponent(namespace)}&id=${encodeURIComponent(roomId)}`;\n const res = await fetch(url);\n if (!res.ok) {\n throw new EdgeBaseError(res.status, `Failed to get room metadata: ${res.statusText}`);\n }\n return res.json() as Promise<Record<string, unknown>>;\n }\n\n // ─── Connection Lifecycle ───\n\n /** Connect to the room, authenticate, and join */\n async join(): Promise<void> {\n this.intentionallyLeft = false;\n this.joinRequested = true;\n if (isSocketOpenOrConnecting(this.ws)) {\n return this.connectingPromise ?? Promise.resolve();\n }\n this.setConnectionState(this.reconnectInfo ? 'reconnecting' : 'connecting');\n return this.ensureConnection();\n }\n\n /** Leave the room and disconnect. Cleans up all pending requests. */\n leave(): void {\n this.intentionallyLeft = true;\n this.joinRequested = false;\n this.waitingForAuth = false;\n this.stopHeartbeat();\n\n // Reject all pending send() requests\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new EdgeBaseError(499, 'Room left'));\n }\n this.pendingRequests.clear();\n this.rejectPendingVoidRequests(this.pendingSignalRequests, new EdgeBaseError(499, 'Room left'));\n this.rejectPendingVoidRequests(this.pendingAdminRequests, new EdgeBaseError(499, 'Room left'));\n this.rejectPendingVoidRequests(this.pendingMemberStateRequests, new EdgeBaseError(499, 'Room left'));\n this.rejectPendingVoidRequests(this.pendingMediaRequests, new EdgeBaseError(499, 'Room left'));\n\n if (this.ws) {\n const socket = this.ws;\n this.sendRaw({ type: 'leave' });\n closeSocketAfterLeave(socket, ROOM_EXPLICIT_LEAVE_REASON);\n this.ws = null;\n }\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this.connectingPromise = null;\n this._sharedState = {};\n this._sharedVersion = 0;\n this._playerState = {};\n this._playerVersion = 0;\n this._members = [];\n this._mediaMembers = [];\n this.currentUserId = null;\n this.currentConnectionId = null;\n this.reconnectInfo = null;\n this.setConnectionState('disconnected');\n }\n\n // ─── Actions ───\n\n /**\n * Send an action to the server.\n * Returns a Promise that resolves with the action result from the server.\n *\n * @example\n * const result = await room.send('SET_SCORE', { score: 42 });\n */\n async send(actionType: string, payload?: unknown): Promise<unknown> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n\n return new Promise<unknown>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Action '${actionType}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n this.sendRaw({\n type: 'send',\n actionType,\n payload: payload ?? {},\n requestId,\n });\n });\n }\n\n // ─── Subscriptions (v2 API) ───\n\n /**\n * Subscribe to shared state changes.\n * Called on full sync and on each shared_delta.\n *\n * @returns Subscription with unsubscribe()\n */\n onSharedState(handler: SharedStateHandler): Subscription {\n this.sharedStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.sharedStateHandlers.indexOf(handler);\n if (idx >= 0) this.sharedStateHandlers.splice(idx, 1);\n },\n };\n }\n\n /**\n * Subscribe to player state changes.\n * Called on full sync and on each player_delta.\n *\n * @returns Subscription with unsubscribe()\n */\n onPlayerState(handler: PlayerStateHandler): Subscription {\n this.playerStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.playerStateHandlers.indexOf(handler);\n if (idx >= 0) this.playerStateHandlers.splice(idx, 1);\n },\n };\n }\n\n /**\n * Subscribe to messages of a specific type sent by room.sendMessage().\n *\n * @example\n * room.onMessage('game_over', (data) => { console.log(data.winner); });\n *\n * @returns Subscription with unsubscribe()\n */\n onMessage(messageType: string, handler: MessageHandler): Subscription {\n if (!this.messageHandlers.has(messageType)) {\n this.messageHandlers.set(messageType, []);\n }\n this.messageHandlers.get(messageType)!.push(handler);\n return {\n unsubscribe: () => {\n const handlers = this.messageHandlers.get(messageType);\n if (handlers) {\n const idx = handlers.indexOf(handler);\n if (idx >= 0) handlers.splice(idx, 1);\n }\n },\n };\n }\n\n /**\n * Subscribe to ALL messages regardless of type.\n *\n * @returns Subscription with unsubscribe()\n */\n onAnyMessage(handler: (messageType: string, data: unknown) => void): Subscription {\n this.allMessageHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.allMessageHandlers.indexOf(handler);\n if (idx >= 0) this.allMessageHandlers.splice(idx, 1);\n },\n };\n }\n\n /** Subscribe to errors */\n onError(handler: ErrorHandler): Subscription {\n this.errorHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.errorHandlers.indexOf(handler);\n if (idx >= 0) this.errorHandlers.splice(idx, 1);\n },\n };\n }\n\n /** Subscribe to kick events */\n onKicked(handler: KickedHandler): Subscription {\n this.kickedHandlers.push(handler);\n return {\n unsubscribe: () => {\n const idx = this.kickedHandlers.indexOf(handler);\n if (idx >= 0) this.kickedHandlers.splice(idx, 1);\n },\n };\n }\n\n private onSignal(\n event: string,\n handler: (payload: unknown, meta: RoomSignalMeta) => void,\n ): Subscription {\n if (!this.signalHandlers.has(event)) {\n this.signalHandlers.set(event, []);\n }\n this.signalHandlers.get(event)!.push(handler);\n return {\n unsubscribe: () => {\n const handlers = this.signalHandlers.get(event);\n if (!handlers) return;\n const index = handlers.indexOf(handler);\n if (index >= 0) handlers.splice(index, 1);\n },\n };\n }\n\n private onAnySignal(\n handler: (event: string, payload: unknown, meta: RoomSignalMeta) => void,\n ): Subscription {\n this.anySignalHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.anySignalHandlers.indexOf(handler);\n if (index >= 0) this.anySignalHandlers.splice(index, 1);\n },\n };\n }\n\n private onMembersSync(handler: (members: RoomMember[]) => void): Subscription {\n this.memberSyncHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberSyncHandlers.indexOf(handler);\n if (index >= 0) this.memberSyncHandlers.splice(index, 1);\n },\n };\n }\n\n private onMemberJoin(handler: (member: RoomMember) => void): Subscription {\n this.memberJoinHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberJoinHandlers.indexOf(handler);\n if (index >= 0) this.memberJoinHandlers.splice(index, 1);\n },\n };\n }\n\n private onMemberLeave(\n handler: (member: RoomMember, reason: RoomMemberLeaveReason) => void,\n ): Subscription {\n this.memberLeaveHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberLeaveHandlers.indexOf(handler);\n if (index >= 0) this.memberLeaveHandlers.splice(index, 1);\n },\n };\n }\n\n private onMemberStateChange(\n handler: (member: RoomMember, state: Record<string, unknown>) => void,\n ): Subscription {\n this.memberStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.memberStateHandlers.indexOf(handler);\n if (index >= 0) this.memberStateHandlers.splice(index, 1);\n },\n };\n }\n\n private onReconnect(handler: (info: RoomReconnectInfo) => void): Subscription {\n this.reconnectHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.reconnectHandlers.indexOf(handler);\n if (index >= 0) this.reconnectHandlers.splice(index, 1);\n },\n };\n }\n\n private onConnectionStateChange(handler: (state: RoomConnectionState) => void): Subscription {\n this.connectionStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.connectionStateHandlers.indexOf(handler);\n if (index >= 0) this.connectionStateHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaTrack(handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription {\n this.mediaTrackHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaTrackHandlers.indexOf(handler);\n if (index >= 0) this.mediaTrackHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaTrackRemoved(handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription {\n this.mediaTrackRemovedHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaTrackRemovedHandlers.indexOf(handler);\n if (index >= 0) this.mediaTrackRemovedHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaStateChange(\n handler: (member: RoomMember, state: RoomMemberMediaState) => void,\n ): Subscription {\n this.mediaStateHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaStateHandlers.indexOf(handler);\n if (index >= 0) this.mediaStateHandlers.splice(index, 1);\n },\n };\n }\n\n private onMediaDeviceChange(\n handler: (member: RoomMember, change: RoomMediaDeviceChange) => void,\n ): Subscription {\n this.mediaDeviceHandlers.push(handler);\n return {\n unsubscribe: () => {\n const index = this.mediaDeviceHandlers.indexOf(handler);\n if (index >= 0) this.mediaDeviceHandlers.splice(index, 1);\n },\n };\n }\n\n private async sendSignal(\n event: string,\n payload?: unknown,\n options?: { includeSelf?: boolean; memberId?: string },\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingSignalRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Signal '${event}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingSignalRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({\n type: 'signal',\n event,\n payload: payload ?? {},\n includeSelf: options?.includeSelf === true,\n memberId: options?.memberId,\n requestId,\n });\n });\n }\n\n private async sendMemberState(state: Record<string, unknown>): Promise<void> {\n return this.sendMemberStateRequest({\n type: 'member_state',\n state,\n });\n }\n\n private async clearMemberState(): Promise<void> {\n return this.sendMemberStateRequest({\n type: 'member_state_clear',\n });\n }\n\n private async sendMemberStateRequest(\n payload: { type: 'member_state'; state: Record<string, unknown> } | { type: 'member_state_clear' },\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingMemberStateRequests.delete(requestId);\n reject(new EdgeBaseError(408, 'Member state update timed out'));\n }, this.options.sendTimeout);\n\n this.pendingMemberStateRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({ ...payload, requestId });\n });\n }\n\n private async sendAdmin(\n operation: string,\n memberId: string,\n payload?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAdminRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Admin operation '${operation}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingAdminRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({\n type: 'admin',\n operation,\n memberId,\n payload: payload ?? {},\n requestId,\n });\n });\n }\n\n private async sendMedia(\n operation: 'publish' | 'unpublish' | 'mute' | 'device',\n kind: RoomMediaKind,\n payload?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.ws || !this.connected || !this.authenticated) {\n throw new EdgeBaseError(400, 'Not connected to room');\n }\n\n const requestId = generateRequestId();\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingMediaRequests.delete(requestId);\n reject(new EdgeBaseError(408, `Media operation '${operation}' timed out`));\n }, this.options.sendTimeout);\n\n this.pendingMediaRequests.set(requestId, { resolve, reject, timeout });\n this.sendRaw({\n type: 'media',\n operation,\n kind,\n payload: payload ?? {},\n requestId,\n });\n });\n }\n\n private async switchMediaDevices(payload: {\n audioInputId?: string;\n videoInputId?: string;\n screenInputId?: string;\n }): Promise<void> {\n const operations: Promise<void>[] = [];\n if (payload.audioInputId) {\n operations.push(this.sendMedia('device', 'audio', { deviceId: payload.audioInputId }));\n }\n if (payload.videoInputId) {\n operations.push(this.sendMedia('device', 'video', { deviceId: payload.videoInputId }));\n }\n if (payload.screenInputId) {\n operations.push(this.sendMedia('device', 'screen', { deviceId: payload.screenInputId }));\n }\n await Promise.all(operations);\n }\n\n // ─── Private: Connection ───\n\n private async establishConnection(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const wsUrl = this.buildWsUrl();\n const ws = new WebSocket(wsUrl);\n this.ws = ws;\n\n ws.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n this.authenticate()\n .then(() => {\n this.waitingForAuth = false;\n resolve();\n })\n .catch((error) => {\n this.handleAuthenticationFailure(error);\n reject(error);\n });\n };\n\n ws.onmessage = (event: MessageEvent) => {\n this.handleMessage(event.data as string);\n };\n\n ws.onclose = (event: CloseEvent) => {\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this.ws = null;\n this.stopHeartbeat();\n if (event.code === 4004 && this.connectionState !== 'kicked') {\n this.handleKicked();\n }\n\n if (\n !this.intentionallyLeft &&\n !this.waitingForAuth &&\n this.options.autoReconnect &&\n this.reconnectAttempts < this.options.maxReconnectAttempts\n ) {\n this.scheduleReconnect();\n } else if (\n !this.intentionallyLeft &&\n this.connectionState !== 'kicked' &&\n this.connectionState !== 'auth_lost'\n ) {\n this.setConnectionState('disconnected');\n }\n };\n\n ws.onerror = () => {\n reject(new EdgeBaseError(500, 'Room WebSocket connection error'));\n };\n });\n }\n\n private ensureConnection(): Promise<void> {\n if (this.connectingPromise) {\n return this.connectingPromise;\n }\n\n const nextPromise = this.establishConnection().finally(() => {\n if (this.connectingPromise === nextPromise) {\n this.connectingPromise = null;\n }\n });\n this.connectingPromise = nextPromise;\n return nextPromise;\n }\n\n private async authenticate(): Promise<void> {\n const token = await this.tokenManager.getAccessToken((refreshToken) =>\n refreshAccessToken(this.baseUrl, refreshToken),\n );\n if (!token) {\n throw new EdgeBaseError(401, 'No access token available. Sign in first.');\n }\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new EdgeBaseError(401, 'Room auth timeout'));\n }, 10000);\n\n const originalOnMessage = this.ws?.onmessage;\n if (this.ws) {\n this.ws.onmessage = (event: MessageEvent) => {\n const msg = JSON.parse(event.data as string) as Record<string, unknown>;\n if (msg.type === 'auth_success' || msg.type === 'auth_refreshed') {\n clearTimeout(timeout);\n this.authenticated = true;\n this.currentUserId = typeof msg.userId === 'string' ? msg.userId : this.currentUserId;\n this.currentConnectionId = typeof msg.connectionId === 'string' ? msg.connectionId : this.currentConnectionId;\n if (this.ws) this.ws.onmessage = originalOnMessage ?? null;\n\n // Send join message with last known state for eviction recovery\n this.sendRaw({\n type: 'join',\n lastSharedState: this._sharedState,\n lastSharedVersion: this._sharedVersion,\n lastPlayerState: this._playerState,\n lastPlayerVersion: this._playerVersion,\n });\n this.joined = true;\n resolve();\n } else if (msg.type === 'error') {\n clearTimeout(timeout);\n reject(new EdgeBaseError(401, msg.message as string));\n }\n };\n }\n\n this.sendRaw({ type: 'auth', token });\n });\n }\n\n // ─── Private: Message Handling ───\n\n private handleMessage(raw: string): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n\n const type = msg.type as string;\n\n switch (type) {\n case 'auth_success':\n case 'auth_refreshed':\n this.handleAuthAck(msg);\n break;\n case 'sync':\n this.handleSync(msg);\n break;\n case 'shared_delta':\n this.handleSharedDelta(msg);\n break;\n case 'player_delta':\n this.handlePlayerDelta(msg);\n break;\n case 'action_result':\n this.handleActionResult(msg);\n break;\n case 'action_error':\n this.handleActionError(msg);\n break;\n case 'message':\n this.handleServerMessage(msg);\n break;\n case 'signal':\n this.handleSignalFrame(msg);\n break;\n case 'signal_sent':\n this.handleSignalSent(msg);\n break;\n case 'signal_error':\n this.handleSignalError(msg);\n break;\n case 'members_sync':\n this.handleMembersSync(msg);\n break;\n case 'media_sync':\n this.handleMediaSync(msg);\n break;\n case 'member_join':\n this.handleMemberJoinFrame(msg);\n break;\n case 'member_leave':\n this.handleMemberLeaveFrame(msg);\n break;\n case 'member_state':\n this.handleMemberStateFrame(msg);\n break;\n case 'member_state_error':\n this.handleMemberStateError(msg);\n break;\n case 'media_track':\n this.handleMediaTrackFrame(msg);\n break;\n case 'media_track_removed':\n this.handleMediaTrackRemovedFrame(msg);\n break;\n case 'media_state':\n this.handleMediaStateFrame(msg);\n break;\n case 'media_device':\n this.handleMediaDeviceFrame(msg);\n break;\n case 'media_result':\n this.handleMediaResult(msg);\n break;\n case 'media_error':\n this.handleMediaError(msg);\n break;\n case 'admin_result':\n this.handleAdminResult(msg);\n break;\n case 'admin_error':\n this.handleAdminError(msg);\n break;\n case 'kicked':\n this.handleKicked();\n break;\n case 'error':\n this.handleError(msg);\n break;\n case 'pong':\n // Heartbeat response — no action needed\n break;\n }\n }\n\n private handleSync(msg: Record<string, unknown>): void {\n this._sharedState = msg.sharedState as Record<string, unknown>;\n this._sharedVersion = msg.sharedVersion as number;\n this._playerState = msg.playerState as Record<string, unknown>;\n this._playerVersion = msg.playerVersion as number;\n const reconnectInfo = this.reconnectInfo;\n this.reconnectInfo = null;\n this.setConnectionState('connected');\n\n // Notify handlers with full state as changes\n const sharedSnapshot = cloneRecord(this._sharedState);\n const playerSnapshot = cloneRecord(this._playerState);\n for (const handler of this.sharedStateHandlers) {\n handler(sharedSnapshot, cloneRecord(sharedSnapshot));\n }\n for (const handler of this.playerStateHandlers) {\n handler(playerSnapshot, cloneRecord(playerSnapshot));\n }\n if (reconnectInfo) {\n for (const handler of this.reconnectHandlers) {\n handler(reconnectInfo);\n }\n }\n }\n\n private handleSharedDelta(msg: Record<string, unknown>): void {\n const delta = msg.delta as Record<string, unknown>;\n this._sharedVersion = msg.version as number;\n\n // Apply delta to local state\n for (const [path, value] of Object.entries(delta)) {\n deepSet(this._sharedState, path, value);\n }\n\n const sharedSnapshot = cloneRecord(this._sharedState);\n const deltaSnapshot = cloneRecord(delta);\n for (const handler of this.sharedStateHandlers) {\n handler(sharedSnapshot, deltaSnapshot);\n }\n }\n\n private handlePlayerDelta(msg: Record<string, unknown>): void {\n const delta = msg.delta as Record<string, unknown>;\n this._playerVersion = msg.version as number;\n\n // Apply delta to local player state\n for (const [path, value] of Object.entries(delta)) {\n deepSet(this._playerState, path, value);\n }\n\n const playerSnapshot = cloneRecord(this._playerState);\n const deltaSnapshot = cloneRecord(delta);\n for (const handler of this.playerStateHandlers) {\n handler(playerSnapshot, deltaSnapshot);\n }\n }\n\n private handleActionResult(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string;\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.resolve(msg.result);\n }\n }\n\n private handleActionError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string;\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, msg.message as string));\n }\n }\n\n private handleAuthAck(msg: Record<string, unknown>): void {\n this.currentUserId = typeof msg.userId === 'string' ? msg.userId : this.currentUserId;\n this.currentConnectionId =\n typeof msg.connectionId === 'string' ? msg.connectionId : this.currentConnectionId;\n }\n\n private handleServerMessage(msg: Record<string, unknown>): void {\n const messageType = msg.messageType as string;\n const data = msg.data;\n\n // Type-specific handlers\n const handlers = this.messageHandlers.get(messageType);\n if (handlers) {\n for (const handler of handlers) handler(data);\n }\n\n // All-message handlers\n for (const handler of this.allMessageHandlers) {\n handler(messageType, data);\n }\n }\n\n private handleSignalFrame(msg: Record<string, unknown>): void {\n const event = typeof msg.event === 'string' ? msg.event : '';\n if (!event) return;\n const meta = this.normalizeSignalMeta(msg.meta);\n const payload = msg.payload;\n\n const handlers = this.signalHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) handler(payload, meta);\n }\n for (const handler of this.anySignalHandlers) {\n handler(event, payload, meta);\n }\n }\n\n private handleSignalSent(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingSignalRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingSignalRequests.delete(requestId);\n pending.resolve();\n }\n\n private handleSignalError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingSignalRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingSignalRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Signal failed'));\n }\n\n private handleMembersSync(msg: Record<string, unknown>): void {\n const members = this.normalizeMembers(msg.members);\n this._members = members;\n for (const member of members) {\n this.syncMediaMemberInfo(member);\n }\n const snapshot = cloneValue(this._members);\n for (const handler of this.memberSyncHandlers) {\n handler(snapshot);\n }\n }\n\n private handleMediaSync(msg: Record<string, unknown>): void {\n this._mediaMembers = this.normalizeMediaMembers(msg.members);\n }\n\n private handleMemberJoinFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n if (!member) return;\n this.upsertMember(member);\n this.syncMediaMemberInfo(member);\n const snapshot = cloneValue(member);\n for (const handler of this.memberJoinHandlers) {\n handler(snapshot);\n }\n }\n\n private handleMemberLeaveFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n if (!member) return;\n this.removeMember(member.memberId);\n this.removeMediaMember(member.memberId);\n const reason = this.normalizeLeaveReason(msg.reason);\n const snapshot = cloneValue(member);\n for (const handler of this.memberLeaveHandlers) {\n handler(snapshot, reason);\n }\n }\n\n private handleMemberStateFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const state = this.normalizeState(msg.state);\n if (!member) return;\n member.state = state;\n this.upsertMember(member);\n this.syncMediaMemberInfo(member);\n\n const requestId = msg.requestId as string | undefined;\n if (requestId && member.memberId === this.currentUserId) {\n const pending = this.pendingMemberStateRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingMemberStateRequests.delete(requestId);\n pending.resolve();\n }\n }\n\n const memberSnapshot = cloneValue(member);\n const stateSnapshot = cloneRecord(state);\n for (const handler of this.memberStateHandlers) {\n handler(memberSnapshot, stateSnapshot);\n }\n }\n\n private handleMemberStateError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingMemberStateRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingMemberStateRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Member state update failed'));\n }\n\n private handleMediaTrackFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const track = this.normalizeMediaTrack(msg.track);\n if (!member || !track) return;\n const mediaMember = this.ensureMediaMember(member);\n this.upsertMediaTrack(mediaMember, track);\n this.mergeMediaState(mediaMember, track.kind, {\n published: true,\n muted: track.muted,\n trackId: track.trackId,\n deviceId: track.deviceId,\n publishedAt: track.publishedAt,\n adminDisabled: track.adminDisabled,\n });\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const trackSnapshot = cloneValue(track);\n for (const handler of this.mediaTrackHandlers) {\n handler(trackSnapshot, memberSnapshot);\n }\n }\n\n private handleMediaTrackRemovedFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const track = this.normalizeMediaTrack(msg.track);\n if (!member || !track) return;\n const mediaMember = this.ensureMediaMember(member);\n this.removeMediaTrack(mediaMember, track);\n mediaMember.state = {\n ...mediaMember.state,\n [track.kind]: {\n published: false,\n muted: false,\n adminDisabled: false,\n },\n };\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const trackSnapshot = cloneValue(track);\n for (const handler of this.mediaTrackRemovedHandlers) {\n handler(trackSnapshot, memberSnapshot);\n }\n }\n\n private handleMediaStateFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n if (!member) return;\n const mediaMember = this.ensureMediaMember(member);\n mediaMember.state = this.normalizeMediaState(msg.state);\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const stateSnapshot = cloneValue(mediaMember.state);\n for (const handler of this.mediaStateHandlers) {\n handler(memberSnapshot, stateSnapshot);\n }\n }\n\n private handleMediaDeviceFrame(msg: Record<string, unknown>): void {\n const member = this.normalizeMember(msg.member);\n const kind = this.normalizeMediaKind(msg.kind);\n const deviceId = typeof msg.deviceId === 'string' ? msg.deviceId : '';\n if (!member || !kind || !deviceId) return;\n\n const mediaMember = this.ensureMediaMember(member);\n this.mergeMediaState(mediaMember, kind, { deviceId });\n for (const track of mediaMember.tracks) {\n if (track.kind === kind) {\n track.deviceId = deviceId;\n }\n }\n\n const memberSnapshot = cloneValue(mediaMember.member);\n const change = { kind, deviceId } satisfies RoomMediaDeviceChange;\n for (const handler of this.mediaDeviceHandlers) {\n handler(memberSnapshot, change);\n }\n }\n\n private handleMediaResult(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingMediaRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingMediaRequests.delete(requestId);\n pending.resolve();\n }\n\n private handleMediaError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingMediaRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingMediaRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Media operation failed'));\n }\n\n private handleAdminResult(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingAdminRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingAdminRequests.delete(requestId);\n pending.resolve();\n }\n\n private handleAdminError(msg: Record<string, unknown>): void {\n const requestId = msg.requestId as string | undefined;\n if (!requestId) return;\n const pending = this.pendingAdminRequests.get(requestId);\n if (!pending) return;\n clearTimeout(pending.timeout);\n this.pendingAdminRequests.delete(requestId);\n pending.reject(new EdgeBaseError(400, (msg.message as string) || 'Admin operation failed'));\n }\n\n private handleKicked(): void {\n for (const handler of this.kickedHandlers) handler();\n // Don't auto-reconnect after being kicked\n this.intentionallyLeft = true;\n this.reconnectInfo = null;\n this.setConnectionState('kicked');\n }\n\n private handleError(msg: Record<string, unknown>): void {\n for (const handler of this.errorHandlers) {\n handler({ code: msg.code as string, message: msg.message as string });\n }\n }\n\n private refreshAuth(): void {\n const token = this.tokenManager.currentAccessToken;\n if (!token || !this.ws || !this.connected) return;\n this.sendRaw({ type: 'auth', token });\n }\n\n private handleAuthStateChange(user: TokenUser | null): void {\n if (user) {\n if (this.ws && this.connected && this.authenticated) {\n this.refreshAuth();\n return;\n }\n\n this.waitingForAuth = false;\n if (\n this.joinRequested &&\n !this.connectingPromise &&\n !isSocketOpenOrConnecting(this.ws)\n ) {\n this.reconnectAttempts = 0;\n this.ensureConnection().catch(() => {\n // Connection errors are surfaced through the normal socket lifecycle.\n });\n }\n return;\n }\n\n this.waitingForAuth = this.joinRequested;\n this.reconnectInfo = null;\n this.setConnectionState('auth_lost');\n if (this.ws) {\n const socket = this.ws;\n this.sendRaw({ type: 'leave' });\n this.stopHeartbeat();\n this.ws = null;\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this._mediaMembers = [];\n this.currentUserId = null;\n this.currentConnectionId = null;\n try {\n closeSocketAfterLeave(socket, 'Signed out');\n } catch {\n // Ignore close failures — socket is already unusable.\n }\n return;\n }\n\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this._mediaMembers = [];\n }\n\n private handleAuthenticationFailure(error: unknown): void {\n const authError =\n error instanceof EdgeBaseError\n ? error\n : new EdgeBaseError(500, 'Room authentication failed.');\n\n this.waitingForAuth = authError.code === 401 && this.joinRequested;\n this.stopHeartbeat();\n this.connected = false;\n this.authenticated = false;\n this.joined = false;\n this.connectingPromise = null;\n\n if (this.ws) {\n const socket = this.ws;\n this.ws = null;\n try {\n socket.close(4001, authError.message);\n } catch {\n // Ignore close failures — the server will time out stale sockets.\n }\n }\n }\n\n private normalizeMembers(value: unknown): RoomMember[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((member) => this.normalizeMember(member))\n .filter((member): member is RoomMember => !!member);\n }\n\n private normalizeMediaMembers(value: unknown): RoomMediaMember[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((member) => this.normalizeMediaMember(member))\n .filter((member): member is RoomMediaMember => !!member);\n }\n\n private normalizeMember(value: unknown): RoomMember | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const member = value as Record<string, unknown>;\n if (typeof member.memberId !== 'string' || typeof member.userId !== 'string') {\n return null;\n }\n return {\n memberId: member.memberId,\n userId: member.userId,\n connectionId: typeof member.connectionId === 'string' ? member.connectionId : undefined,\n connectionCount:\n typeof member.connectionCount === 'number' ? member.connectionCount : undefined,\n role: typeof member.role === 'string' ? member.role : undefined,\n state: this.normalizeState(member.state),\n };\n }\n\n private normalizeState(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n return cloneRecord(value as Record<string, unknown>);\n }\n\n private normalizeMediaMember(value: unknown): RoomMediaMember | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const entry = value as Record<string, unknown>;\n const member = this.normalizeMember(entry.member);\n if (!member) {\n return null;\n }\n return {\n member,\n state: this.normalizeMediaState(entry.state),\n tracks: this.normalizeMediaTracks(entry.tracks),\n };\n }\n\n private normalizeMediaState(value: unknown): RoomMemberMediaState {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n const state = value as Record<string, unknown>;\n return {\n audio: this.normalizeMediaKindState(state.audio),\n video: this.normalizeMediaKindState(state.video),\n screen: this.normalizeMediaKindState(state.screen),\n };\n }\n\n private normalizeMediaKindState(value: unknown): RoomMemberMediaKindState | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n const state = value as Record<string, unknown>;\n return {\n published: state.published === true,\n muted: state.muted === true,\n trackId: typeof state.trackId === 'string' ? state.trackId : undefined,\n deviceId: typeof state.deviceId === 'string' ? state.deviceId : undefined,\n publishedAt: typeof state.publishedAt === 'number' ? state.publishedAt : undefined,\n adminDisabled: state.adminDisabled === true,\n };\n }\n\n private normalizeMediaTracks(value: unknown): RoomMediaTrack[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((track) => this.normalizeMediaTrack(track))\n .filter((track): track is RoomMediaTrack => !!track);\n }\n\n private normalizeMediaTrack(value: unknown): RoomMediaTrack | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const track = value as Record<string, unknown>;\n const kind = this.normalizeMediaKind(track.kind);\n if (!kind) {\n return null;\n }\n return {\n kind,\n trackId: typeof track.trackId === 'string' ? track.trackId : undefined,\n deviceId: typeof track.deviceId === 'string' ? track.deviceId : undefined,\n muted: track.muted === true,\n publishedAt: typeof track.publishedAt === 'number' ? track.publishedAt : undefined,\n adminDisabled: track.adminDisabled === true,\n };\n }\n\n private normalizeMediaKind(value: unknown): RoomMediaKind | null {\n switch (value) {\n case 'audio':\n case 'video':\n case 'screen':\n return value;\n default:\n return null;\n }\n }\n\n private normalizeSignalMeta(value: unknown): RoomSignalMeta {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n const meta = value as Record<string, unknown>;\n return {\n memberId: typeof meta.memberId === 'string' || meta.memberId === null ? (meta.memberId as string | null) : undefined,\n userId: typeof meta.userId === 'string' || meta.userId === null ? (meta.userId as string | null) : undefined,\n connectionId:\n typeof meta.connectionId === 'string' || meta.connectionId === null\n ? (meta.connectionId as string | null)\n : undefined,\n sentAt: typeof meta.sentAt === 'number' ? meta.sentAt : undefined,\n serverSent: meta.serverSent === true,\n };\n }\n\n private normalizeLeaveReason(value: unknown): RoomMemberLeaveReason {\n switch (value) {\n case 'leave':\n case 'timeout':\n case 'kicked':\n return value;\n default:\n return 'leave';\n }\n }\n\n private upsertMember(member: RoomMember): void {\n const index = this._members.findIndex((entry) => entry.memberId === member.memberId);\n if (index >= 0) {\n this._members[index] = cloneValue(member);\n return;\n }\n this._members.push(cloneValue(member));\n }\n\n private removeMember(memberId: string): void {\n this._members = this._members.filter((member) => member.memberId !== memberId);\n }\n\n private syncMediaMemberInfo(member: RoomMember): void {\n const mediaMember = this._mediaMembers.find((entry) => entry.member.memberId === member.memberId);\n if (!mediaMember) {\n return;\n }\n mediaMember.member = cloneValue(member);\n }\n\n private ensureMediaMember(member: RoomMember): RoomMediaMember {\n const existing = this._mediaMembers.find((entry) => entry.member.memberId === member.memberId);\n if (existing) {\n existing.member = cloneValue(member);\n return existing;\n }\n const created: RoomMediaMember = {\n member: cloneValue(member),\n state: {},\n tracks: [],\n };\n this._mediaMembers.push(created);\n return created;\n }\n\n private removeMediaMember(memberId: string): void {\n this._mediaMembers = this._mediaMembers.filter((member) => member.member.memberId !== memberId);\n }\n\n private upsertMediaTrack(mediaMember: RoomMediaMember, track: RoomMediaTrack): void {\n const index = mediaMember.tracks.findIndex(\n (entry) =>\n entry.kind === track.kind &&\n entry.trackId === track.trackId,\n );\n if (index >= 0) {\n mediaMember.tracks[index] = cloneValue(track);\n return;\n }\n mediaMember.tracks = mediaMember.tracks\n .filter((entry) => !(entry.kind === track.kind && !track.trackId))\n .concat(cloneValue(track));\n }\n\n private removeMediaTrack(mediaMember: RoomMediaMember, track: RoomMediaTrack): void {\n mediaMember.tracks = mediaMember.tracks.filter((entry) => {\n if (track.trackId) {\n return !(entry.kind === track.kind && entry.trackId === track.trackId);\n }\n return entry.kind !== track.kind;\n });\n }\n\n private mergeMediaState(\n mediaMember: RoomMediaMember,\n kind: RoomMediaKind,\n partial: Partial<RoomMemberMediaKindState>,\n ): void {\n const next: RoomMemberMediaKindState = {\n published: partial.published ?? mediaMember.state[kind]?.published ?? false,\n muted: partial.muted ?? mediaMember.state[kind]?.muted ?? false,\n trackId: partial.trackId ?? mediaMember.state[kind]?.trackId,\n deviceId: partial.deviceId ?? mediaMember.state[kind]?.deviceId,\n publishedAt: partial.publishedAt ?? mediaMember.state[kind]?.publishedAt,\n adminDisabled: partial.adminDisabled ?? mediaMember.state[kind]?.adminDisabled,\n };\n mediaMember.state = {\n ...mediaMember.state,\n [kind]: next,\n };\n }\n\n private rejectPendingVoidRequests(\n pendingRequests: Map<string, {\n resolve: () => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }>,\n error: EdgeBaseError,\n ): void {\n for (const [, pending] of pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n pendingRequests.clear();\n }\n\n private setConnectionState(next: RoomConnectionState): void {\n if (this.connectionState === next) {\n return;\n }\n this.connectionState = next;\n for (const handler of this.connectionStateHandlers) {\n handler(next);\n }\n }\n\n // ─── Private: Helpers ───\n\n private sendRaw(data: Record<string, unknown>): void {\n if (this.ws && this.connected) {\n this.ws.send(JSON.stringify(data));\n return;\n }\n }\n\n private buildWsUrl(): string {\n const httpUrl = this.baseUrl.replace(/\\/$/, '');\n const wsUrl = httpUrl.replace(/^http/, 'ws');\n return `${wsUrl}/api/room?namespace=${encodeURIComponent(this.namespace)}&id=${encodeURIComponent(this.roomId)}`;\n }\n\n private scheduleReconnect(): void {\n const attempt = this.reconnectAttempts + 1;\n const delay = this.options.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n this.reconnectInfo = { attempt };\n this.setConnectionState('reconnecting');\n setTimeout(() => {\n if (\n this.connectingPromise ||\n !this.joinRequested ||\n this.waitingForAuth ||\n isSocketOpenOrConnecting(this.ws)\n ) {\n return;\n }\n this.ensureConnection().catch(() => {});\n }, Math.min(delay, 30000));\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.ws && this.connected) {\n this.ws.send(JSON.stringify({ type: 'ping' }));\n }\n }, 30000);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n}\n","/**\n * React Native Push Notification client.\n *\n * Platform support (FCM 일원화):\n * - iOS: FCM token via Firebase iOS SDK bridge (tokenProvider callback)\n * - Android: FCM token via FirebaseMessaging bridge (tokenProvider callback)\n *\n * Zero-parameter register() design: tokenProvider closure is set by native\n * app code (AppDelegate / Application) before register() is called.\n * SDK never calls native APIs directly — avoids hard dependency on firebase-messaging.\n *\n * @example\n * // In AppDelegate (iOS) or Application (Android):\n * client.push.setTokenProvider(async () => {\n * const token = await messaging().getToken(); // FCM or APNs\n * return { token, platform: 'android' };\n * });\n * // Then anywhere:\n * await client.push.register();\n */\n\nimport { ApiPaths, type HttpClient, type GeneratedDbApi } from '@edge-base/core';\nimport type { AsyncStorageAdapter } from './token-manager.js';\nimport { PUSH_TOKEN_CACHE_KEY, PUSH_DEVICE_ID_KEY } from './token-manager.js';\n\n// ─── Types ───\n\nexport type PushPlatform = 'ios' | 'android' | 'web';\n\nexport interface PushTokenProvider {\n (): Promise<{ token: string; platform: PushPlatform }>;\n}\n\nexport type PushPermissionStatus = 'granted' | 'denied' | 'not-determined' | 'provisional';\n\nexport interface PushPermissionProvider {\n getPermissionStatus(): Promise<PushPermissionStatus>;\n requestPermission(): Promise<PushPermissionStatus>;\n}\n\nexport interface PushMessage {\n title?: string;\n body?: string;\n data?: Record<string, unknown>;\n}\n\nexport type PushMessageHandler = (message: PushMessage) => void;\n\nexport interface PushTopicProvider {\n subscribeTopic(topic: string): Promise<void>;\n unsubscribeTopic(topic: string): Promise<void>;\n}\n\n// ─── PushClient ───\n\nexport class PushClient {\n private tokenProvider: PushTokenProvider | null = null;\n private permissionProvider: PushPermissionProvider | null = null;\n private topicProvider: PushTopicProvider | null = null;\n private messageListeners: PushMessageHandler[] = [];\n private openedAppListeners: PushMessageHandler[] = [];\n\n constructor(\n private http: HttpClient,\n private storage: AsyncStorageAdapter,\n private core?: GeneratedDbApi,\n ) {}\n\n\n /**\n * Set the native token provider.\n * Must be called before register() — typically in App.tsx or native bootstrapping.\n *\n * @example (Firebase Messaging)\n * client.push.setTokenProvider(async () => ({\n * token: await messaging().getToken(),\n * platform: 'android',\n * }));\n *\n * @example (APNs via native bridge)\n * client.push.setTokenProvider(async () => ({\n * token: nativeBridge.getAPNsToken(),\n * platform: 'ios',\n * }));\n */\n setTokenProvider(provider: PushTokenProvider): void {\n this.tokenProvider = provider;\n }\n\n /**\n * Set the native permission provider.\n * Call this with your FCM / @notifee/react-native permission handler.\n *\n * @example (Firebase Messaging)\n * client.push.setPermissionProvider({\n * getPermissionStatus: async () => {\n * const status = await messaging().hasPermission();\n * if (status === messaging.AuthorizationStatus.AUTHORIZED) return 'granted';\n * if (status === messaging.AuthorizationStatus.PROVISIONAL) return 'provisional';\n * if (status === messaging.AuthorizationStatus.DENIED) return 'denied';\n * return 'not-determined';\n * },\n * requestPermission: async () => {\n * const status = await messaging().requestPermission();\n * if (status === messaging.AuthorizationStatus.AUTHORIZED) return 'granted';\n * if (status === messaging.AuthorizationStatus.PROVISIONAL) return 'provisional';\n * return 'denied';\n * },\n * });\n */\n setPermissionProvider(provider: PushPermissionProvider): void {\n this.permissionProvider = provider;\n }\n\n /**\n * Get current push notification permission status.\n * Uses custom provider if set via setPermissionProvider(), otherwise uses\n * built-in platform defaults (PermissionsAndroid on Android, auto-grant on iOS).\n */\n async getPermissionStatus(): Promise<PushPermissionStatus> {\n if (this.permissionProvider) {\n return this.permissionProvider.getPermissionStatus();\n }\n return this._defaultGetPermissionStatus();\n }\n\n /**\n * Request push notification permission from the user.\n * Uses custom provider if set via setPermissionProvider(), otherwise uses\n * built-in platform defaults (PermissionsAndroid on Android, auto-grant on iOS).\n */\n async requestPermission(): Promise<PushPermissionStatus> {\n if (this.permissionProvider) {\n return this.permissionProvider.requestPermission();\n }\n return this._defaultRequestPermission();\n }\n\n\n /**\n * Register for push notifications.\n * Zero-parameter — token is acquired via setTokenProvider().\n * Token is cached; network request only fires if token changes.\n */\n async register(options?: { metadata?: Record<string, unknown> }): Promise<void> {\n if (!this.tokenProvider) {\n throw new Error(\n '[EdgeBase] push.register(): No token provider set. ' +\n 'Call client.push.setTokenProvider(async () => ({ token, platform })) first.',\n );\n }\n\n // Auto-request permission before token acquisition\n const permStatus = await this.requestPermission();\n if (permStatus === 'denied') return;\n\n const { token, platform } = await this.tokenProvider();\n\n // Cache check — skip network if token unchanged and no new metadata\n const cachedToken = await this.storage.getItem(PUSH_TOKEN_CACHE_KEY);\n if (cachedToken === token && !options?.metadata) return;\n\n const deviceId = await this.getOrCreateDeviceId();\n\n if (this.core) {\n await this.core.pushRegister({\n deviceId,\n token,\n platform,\n metadata: options?.metadata,\n });\n } else {\n await this.http.post(ApiPaths.PUSH_REGISTER, {\n deviceId,\n token,\n platform,\n metadata: options?.metadata,\n });\n }\n\n await this.storage.setItem(PUSH_TOKEN_CACHE_KEY, token);\n }\n\n /**\n * Unregister the current device from push notifications.\n * Called automatically on signOut.\n */\n async unregister(deviceId?: string): Promise<void> {\n const id = deviceId ?? (await this.getOrCreateDeviceId());\n if (this.core) {\n await this.core.pushUnregister({ deviceId: id });\n } else {\n await this.http.post(ApiPaths.PUSH_UNREGISTER, { deviceId: id });\n }\n await this.storage.removeItem(PUSH_TOKEN_CACHE_KEY);\n }\n\n /** Listen for push messages while app is in foreground. */\n onMessage(callback: PushMessageHandler): () => void {\n this.messageListeners.push(callback);\n return () => {\n this.messageListeners = this.messageListeners.filter((h) => h !== callback);\n };\n }\n\n /** Listen for notification taps that opened the app. */\n onMessageOpenedApp(callback: PushMessageHandler): () => void {\n this.openedAppListeners.push(callback);\n return () => {\n this.openedAppListeners = this.openedAppListeners.filter((h) => h !== callback);\n };\n }\n\n /**\n * Dispatch a foreground message to all onMessage listeners.\n * Call this from your native FCM/APNs foreground handler.\n *\n * @example (Firebase Messaging)\n * messaging().onMessage(async (remoteMessage) => {\n * client.push._dispatchForegroundMessage({\n * title: remoteMessage.notification?.title,\n * body: remoteMessage.notification?.body,\n * data: remoteMessage.data,\n * });\n * });\n */\n _dispatchForegroundMessage(message: PushMessage): void {\n for (const handler of this.messageListeners) {\n handler(message);\n }\n }\n\n /**\n * Dispatch an opened-app notification to all onMessageOpenedApp listeners.\n * Call this from your notification tap handler.\n */\n _dispatchOpenedAppMessage(message: PushMessage): void {\n for (const handler of this.openedAppListeners) {\n handler(message);\n }\n }\n\n /**\n * Set topic subscription provider.\n * Inject your Firebase RN SDK's topic subscription handlers.\n *\n * @example\n * client.push.setTopicProvider({\n * subscribeTopic: (topic) => messaging().subscribeToTopic(topic),\n * unsubscribeTopic: (topic) => messaging().unsubscribeFromTopic(topic),\n * });\n */\n setTopicProvider(provider: PushTopicProvider): void {\n this.topicProvider = provider;\n }\n\n /**\n * Subscribe to a push notification topic.\n * Delegates to the topic provider set via setTopicProvider().\n */\n async subscribeTopic(topic: string): Promise<void> {\n if (!this.topicProvider) {\n throw new Error(\n '[EdgeBase] push.subscribeTopic(): No topic provider set. ' +\n 'Call client.push.setTopicProvider({ subscribeTopic, unsubscribeTopic }) first.',\n );\n }\n return this.topicProvider.subscribeTopic(topic);\n }\n\n /**\n * Unsubscribe from a push notification topic.\n * Delegates to the topic provider set via setTopicProvider().\n */\n async unsubscribeTopic(topic: string): Promise<void> {\n if (!this.topicProvider) {\n throw new Error(\n '[EdgeBase] push.unsubscribeTopic(): No topic provider set. ' +\n 'Call client.push.setTopicProvider({ subscribeTopic, unsubscribeTopic }) first.',\n );\n }\n return this.topicProvider.unsubscribeTopic(topic);\n }\n\n // ─── Built-in permission defaults ───\n //\n // Used when no custom permissionProvider is set.\n // Android: uses react-native PermissionsAndroid for POST_NOTIFICATIONS (API 33+).\n // iOS: returns 'granted' — Firebase messaging handles iOS permission internally\n // when getToken() is called. Use setPermissionProvider() for explicit control.\n\n private async _defaultGetPermissionStatus(): Promise<PushPermissionStatus> {\n try {\n const { Platform, PermissionsAndroid } = require('react-native');\n if (Platform.OS === 'android') {\n if (Platform.Version < 33) return 'granted'; // Pre-Android 13: no runtime permission needed\n const granted = await PermissionsAndroid.check(\n 'android.permission.POST_NOTIFICATIONS',\n );\n return granted ? 'granted' : 'not-determined';\n }\n // iOS: Firebase messaging handles permission during getToken()\n return 'granted';\n } catch {\n return 'not-determined';\n }\n }\n\n private async _defaultRequestPermission(): Promise<PushPermissionStatus> {\n try {\n const { Platform, PermissionsAndroid } = require('react-native');\n if (Platform.OS === 'android') {\n if (Platform.Version < 33) return 'granted'; // Pre-Android 13: no runtime permission needed\n const result = await PermissionsAndroid.request(\n 'android.permission.POST_NOTIFICATIONS',\n );\n return result === PermissionsAndroid.RESULTS.GRANTED ? 'granted' : 'denied';\n }\n // iOS: Firebase messaging handles permission during getToken()\n return 'granted';\n } catch {\n return 'not-determined';\n }\n }\n\n // ─── Private helpers ───\n\n private async getOrCreateDeviceId(): Promise<string> {\n const existing = await this.storage.getItem(PUSH_DEVICE_ID_KEY);\n if (existing) return existing;\n\n const id = `rn-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n await this.storage.setItem(PUSH_DEVICE_ID_KEY, id);\n return id;\n }\n}\n","/**\n * AppState-based lifecycle management for React Native.\n *\n * Responsibility:\n * - Foreground: check if access token is about to expire → pre-emptive refresh\n * - Foreground: reconnect WebSocket if disconnected during background\n * - Background: disconnect WebSocket to avoid battery drain and server-side timeout\n *\n * Usage:\n * const lifecycle = new LifecycleManager(tokenManager, databaseLive, AppState);\n * lifecycle.start();\n * // on unmount or destroy:\n * lifecycle.stop();\n */\n\nimport type { TokenManager } from './token-manager.js';\n\n// ─── Minimal AppState interface ───\n\nexport interface AppStateStatus {\n currentState: 'active' | 'background' | 'inactive' | 'unknown' | string;\n}\n\nexport interface AppStateAdapter {\n currentState: string;\n addEventListener(\n type: 'change',\n handler: (state: string) => void,\n ): { remove: () => void };\n}\n\n// ─── Minimal DatabaseLiveClient interface ───\n\nexport interface DatabaseLiveClientAdapter {\n disconnect(): void;\n reconnect?(): void;\n}\n\n// ─── LifecycleManager ───\n\nexport class LifecycleManager {\n private subscription: { remove: () => void } | null = null;\n private previousState: string;\n\n constructor(\n private tokenManager: TokenManager,\n private databaseLive: DatabaseLiveClientAdapter | null,\n private appState: AppStateAdapter,\n /** Optional: function to trigger token refresh (e.g. doRefresh from HttpClient) */\n private doRefresh?: (refreshToken: string) => Promise<{ accessToken: string; refreshToken: string }>,\n ) {\n this.previousState = appState.currentState;\n }\n\n /** Start listening to AppState changes. */\n start(): void {\n if (this.subscription) return; // already started\n\n this.subscription = this.appState.addEventListener('change', this.handleStateChange);\n }\n\n /** Stop listening to AppState changes and clean up. */\n stop(): void {\n this.subscription?.remove();\n this.subscription = null;\n }\n\n private handleStateChange = (nextState: string): void => {\n const prev = this.previousState;\n this.previousState = nextState;\n\n // Only react to transitions\n if (prev === nextState) return;\n\n if (nextState === 'active') {\n // App came to foreground\n this.onForeground();\n } else if (nextState === 'background' || nextState === 'inactive') {\n // App went to background\n this.onBackground();\n }\n };\n\n private onForeground(): void {\n // 1. Pre-emptive token refresh (may have expired while backgrounded)\n if (this.doRefresh) {\n void this.tokenManager.getAccessToken(this.doRefresh).catch(() => {\n // Token expired while in background — user will need to sign in again\n // TokenManager.clearTokens() is called internally on 401\n });\n }\n\n // 2. Reconnect WebSocket if it supports reconnect\n if (this.databaseLive?.reconnect) {\n this.databaseLive.reconnect();\n }\n }\n\n private onBackground(): void {\n // Disconnect WebSocket to avoid:\n // - Battery drain from keepalive pings\n // - Server-side heartbeat timeout\n // - Unnecessary DO CPU billing\n // Auto-reconnect will restore subscriptions on foreground\n this.databaseLive?.disconnect();\n }\n}\n\n// ─── React hook wrapper ───\n\nexport interface UseLifecycleOptions {\n tokenManager: TokenManager;\n databaseLive: DatabaseLiveClientAdapter | null;\n appState: AppStateAdapter;\n doRefresh?: (refreshToken: string) => Promise<{ accessToken: string; refreshToken: string }>;\n}\n\n/**\n * React hook that manages lifecycle automatically.\n * Starts on mount, stops on unmount.\n *\n * @example\n * function App() {\n * const { AppState } = require('react-native');\n * useLifecycle({ tokenManager: client._tokenManager, databaseLive: client._databaseLive, appState: AppState });\n * }\n */\nexport function useLifecycle({\n tokenManager,\n databaseLive,\n appState,\n doRefresh,\n}: UseLifecycleOptions): void {\n // Import useEffect lazily to avoid hard dep on React in non-React-component code\n const { useEffect } = require('react') as typeof import('react');\n\n useEffect(() => {\n const manager = new LifecycleManager(tokenManager, databaseLive, appState, doRefresh);\n manager.start();\n return () => manager.stop();\n }, [tokenManager, databaseLive, appState, doRefresh]);\n}\n","import type { GeneratedDbApi } from '@edge-base/core';\n\ntype AnalyticsProperties = Record<string, string | number | boolean>;\n\nexport interface AnalyticsEvent {\n name: string;\n properties?: AnalyticsProperties;\n timestamp?: number;\n}\n\n/**\n * React Native analytics helper.\n *\n * Unlike the browser client, RN sends events immediately because there is no\n * sendBeacon/page-unload behavior to coordinate against.\n */\nexport class ClientAnalytics {\n constructor(private core: GeneratedDbApi) {}\n\n async track(name: string, properties?: AnalyticsProperties): Promise<void> {\n await this.trackBatch([{ name, properties }]);\n }\n\n async trackBatch(events: AnalyticsEvent[]): Promise<void> {\n if (events.length === 0) return;\n await this.core.trackEvents({\n events: events.map((event) => ({\n name: event.name,\n properties: event.properties,\n timestamp: event.timestamp ?? Date.now(),\n })),\n });\n }\n\n async flush(): Promise<void> {\n // RN sends immediately, so flush is a compatibility no-op.\n }\n\n destroy(): void {\n // No retained listeners/resources in the RN implementation.\n }\n}\n","/**\n * Client-side filter matching for database-live subscriptions.\n *\n * React Native shares the same query/filter tuple semantics as the web SDK,\n * so the matching logic stays identical across both clients.\n */\n\nexport type FilterOperator = '==' | '!=' | '<' | '>' | '<=' | '>=' | 'contains' | 'contains-any' | 'in' | 'not in';\n\nexport interface FilterEntry {\n field: string;\n operator: FilterOperator;\n value: unknown;\n}\n\nexport function matchesFilter(\n data: Record<string, unknown>,\n filters: Record<string, unknown> | [string, FilterOperator, unknown][],\n): boolean {\n const entries = Array.isArray(filters) && filters.length > 0 && Array.isArray(filters[0])\n ? parseTupleFilters(filters as [string, FilterOperator, unknown][])\n : parseFilters(filters as Record<string, unknown>);\n return entries.every(({ field, operator, value }) =>\n evaluateCondition(data[field], operator, value),\n );\n}\n\nfunction parseFilters(filters: Record<string, unknown>): FilterEntry[] {\n const entries: FilterEntry[] = [];\n\n for (const [key, value] of Object.entries(filters)) {\n const dotIdx = key.lastIndexOf('.');\n if (dotIdx > 0) {\n const possibleOp = key.slice(dotIdx + 1);\n if (isValidOperator(possibleOp)) {\n entries.push({\n field: key.slice(0, dotIdx),\n operator: possibleOp as FilterOperator,\n value,\n });\n continue;\n }\n }\n\n entries.push({ field: key, operator: '==', value });\n }\n\n return entries;\n}\n\nfunction parseTupleFilters(tuples: [string, FilterOperator, unknown][]): FilterEntry[] {\n return tuples.map(([field, operator, value]) => ({ field, operator, value }));\n}\n\nfunction isValidOperator(op: string): op is FilterOperator {\n return ['==', '!=', '<', '>', '<=', '>=', 'contains', 'contains-any', 'in', 'not in'].includes(op);\n}\n\nfunction evaluateCondition(\n fieldValue: unknown,\n operator: FilterOperator,\n expected: unknown,\n): boolean {\n switch (operator) {\n case '==':\n return fieldValue === expected;\n case '!=':\n return fieldValue !== expected;\n case '<':\n return (fieldValue as number) < (expected as number);\n case '>':\n return (fieldValue as number) > (expected as number);\n case '<=':\n return (fieldValue as number) <= (expected as number);\n case '>=':\n return (fieldValue as number) >= (expected as number);\n case 'contains':\n if (typeof fieldValue === 'string') return fieldValue.includes(expected as string);\n if (Array.isArray(fieldValue)) return fieldValue.includes(expected);\n return false;\n case 'contains-any':\n if (!Array.isArray(fieldValue) || !Array.isArray(expected)) return false;\n return expected.some(value => fieldValue.includes(value));\n case 'in':\n if (Array.isArray(expected)) return expected.includes(fieldValue);\n return false;\n case 'not in':\n if (Array.isArray(expected)) return !expected.includes(fieldValue);\n return true;\n default:\n return false;\n }\n}\n","/**\n * @edge-base/react-native — Full-featured client.\n * All APIs: auth, database-live, storage, push, room, captcha (turnstile), lifecycle\n *\n * @example\n * import { createClient } from '@edge-base/react-native';\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * import { Linking, AppState } from 'react-native';\n *\n * const client = createClient('https://my-app.edgebase.fun', {\n * storage: AsyncStorage,\n * linking: Linking,\n * appState: AppState,\n * });\n */\n\nimport {\n HttpClient,\n TableRef,\n DbRef,\n StorageClient,\n ContextManager,\n DefaultDbApi,\n HttpClientAdapter,\n PublicHttpClientAdapter,\n ApiPaths,\n FunctionsClient,\n type FilterMatchFn,\n} from '@edge-base/core';\nimport type { ContextValue } from '@edge-base/core';\nimport { TokenManager, type AsyncStorageAdapter } from './token-manager.js';\nimport { AuthClient, type LinkingAdapter } from './auth.js';\nimport { DatabaseLiveClient, type DatabaseLiveOptions } from './database-live.js';\nimport { RoomClient, type RoomOptions } from './room.js';\nimport { PushClient } from './push.js';\nimport { LifecycleManager, type AppStateAdapter } from './lifecycle.js';\nimport { ClientAnalytics } from './analytics.js';\nimport { matchesFilter } from './match-filter.js';\n\n// ─── Options ───\n\nexport interface JuneClientOptions {\n /**\n * AsyncStorage adapter.\n * Pass `require('@react-native-async-storage/async-storage').default`\n */\n storage: AsyncStorageAdapter;\n\n /**\n * Linking adapter — pass `require('react-native').Linking`\n * Required for OAuth sign-in.\n */\n linking?: LinkingAdapter;\n\n /**\n * AppState adapter — pass `require('react-native').AppState`\n * Enables auto lifecycle management:\n * background → WebSocket disconnect\n * foreground → reconnect + token refresh\n */\n appState?: AppStateAdapter;\n\n /** Database live subscription options (auto-reconnect, delays, etc.) */\n databaseLive?: DatabaseLiveOptions;\n\n /** Schema from typegen */\n schema?: Record<string, unknown>;\n}\n\n// ─── ClientEdgeBase ───\n\nexport class ClientEdgeBase {\n readonly auth: AuthClient;\n readonly storage: StorageClient;\n readonly push: PushClient;\n readonly functions: FunctionsClient;\n readonly analytics: ClientAnalytics;\n private databaseLive: DatabaseLiveClient;\n\n /** @internal exposed for advanced use (e.g. setDatabaseLive, testing) */\n readonly _tokenManager: TokenManager;\n /** @internal */\n readonly _httpClient: HttpClient;\n\n private lifecycleManager: LifecycleManager | null = null;\n private contextManager: ContextManager;\n private baseUrl: string;\n private core: DefaultDbApi;\n\n constructor(url: string, options: JuneClientOptions) {\n this.baseUrl = url.replace(/\\/$/, '');\n this._tokenManager = new TokenManager(this.baseUrl, options.storage);\n this.contextManager = new ContextManager();\n\n this._httpClient = new HttpClient({\n baseUrl: this.baseUrl,\n tokenManager: this._tokenManager,\n contextManager: this.contextManager,\n });\n\n this.core = new DefaultDbApi(new HttpClientAdapter(this._httpClient));\n const corePublic = new DefaultDbApi(new PublicHttpClientAdapter(this._httpClient));\n this.auth = new AuthClient(this._httpClient, this._tokenManager, this.core, corePublic, options.linking);\n this.databaseLive = new DatabaseLiveClient(\n this.baseUrl,\n this._tokenManager,\n options.databaseLive,\n this.contextManager,\n );\n this.storage = new StorageClient(this._httpClient, this.core);\n this.push = new PushClient(this._httpClient, options.storage, this.core);\n this.functions = new FunctionsClient(this._httpClient);\n this.analytics = new ClientAnalytics(this.core);\n\n // Auto-unregister push on signOut\n const originalSignOut = this.auth.signOut.bind(this.auth);\n const pushRef = this.push;\n const storageRef = options.storage;\n this.auth.signOut = async function (): Promise<void> {\n try {\n const cached = await storageRef.getItem('edgebase:push-token-cache');\n if (cached) await pushRef.unregister();\n } catch { /* ignore */ }\n return originalSignOut();\n };\n\n // AppState lifecycle management\n if (options.appState) {\n const doRefresh = async (refreshToken: string) => {\n return this._httpClient.postPublic<{ accessToken: string; refreshToken: string }>(\n ApiPaths.AUTH_REFRESH,\n { refreshToken },\n );\n };\n\n this.lifecycleManager = new LifecycleManager(\n this._tokenManager,\n {\n disconnect: () => {\n this.databaseLive.disconnect();\n },\n reconnect: () => {\n this.databaseLive.reconnect?.();\n },\n },\n options.appState,\n doRefresh,\n );\n this.lifecycleManager.start();\n }\n }\n\n /**\n * Select a DB block by namespace and optional instance ID (#133 §2).\n *\n * @example\n * const posts = await client.db('shared').table('posts').where('status', '==', 'published').get();\n * client.db('shared').table('posts').onSnapshot((change) => { ... });\n */\n db(namespace: string, instanceId?: string): DbRef {\n return new DbRef(this.core, namespace, instanceId, this.databaseLive, matchesFilter as FilterMatchFn);\n }\n\n /**\n * Get a Room client for ephemeral stateful real-time sessions.\n *\n * @param namespace - The room namespace (e.g. 'game', 'chat')\n * @param roomId - The room instance ID within the namespace\n * @param options - Connection options\n *\n * @example\n * const room = client.room('game', 'room-123');\n * await room.join();\n * const result = await room.send('SET_SCORE', { score: 42 });\n */\n room(namespace: string, roomId: string, options?: RoomOptions): RoomClient {\n return new RoomClient(this.baseUrl, namespace, roomId, this._tokenManager, options);\n }\n\n /** Set legacy isolateBy context state. HTTP DB routing uses db(namespace, id). */\n setContext(context: ContextValue): void {\n this.contextManager.setContext(context);\n }\n\n /** Set locale for auth email i18n and Accept-Language headers. */\n setLocale(locale: string | undefined): void {\n this._httpClient.setLocale(locale);\n }\n\n /** Get the currently configured locale override. */\n getLocale(): string | undefined {\n return this._httpClient.getLocale();\n }\n\n /** Get the currently configured legacy isolateBy context state. */\n getContext(): ContextValue {\n return this.contextManager.getContext();\n }\n\n /** Clean up all connections and listeners. */\n destroy(): void {\n this.analytics.destroy();\n this._tokenManager.destroy();\n this.lifecycleManager?.stop();\n this.databaseLive.disconnect();\n }\n}\n\n// ─── Factory ───\n\n/** Create a React Native EdgeBase client. */\nexport function createClient(url: string, options: JuneClientOptions): ClientEdgeBase {\n return new ClientEdgeBase(url, options);\n}\n","/**\n * Turnstile CAPTCHA widget for React Native — WebView based.\n *\n * Supports all platforms:\n * - iOS: WKWebView via react-native-webview\n * - Android: android.webkit.WebView via react-native-webview\n * (uses window.ReactNativeWebView.postMessage instead of window.postMessage)\n * - Web (React Native Web): Falls back to direct script injection\n *\n * Usage:\n * <TurnstileWebView\n * siteKey=\"your-site-key\"\n * action=\"signup\"\n * onToken={(token) => handleToken(token)}\n * onError={(err) => handleError(err)}\n * />\n *\n * Or use the helper hook:\n * const { token, isLoading, error, reset } = useTurnstile({ baseUrl, action });\n */\n\nimport React, { useRef, useState, useCallback, useEffect } from 'react';\n\n// ─── Types (minimal RN typings to avoid hard dep on @types/react-native) ───\n\ninterface StyleProp {\n [key: string]: unknown;\n}\n\ninterface WebViewMessage {\n nativeEvent: { data: string };\n}\n\ninterface WebViewProps {\n source: { html: string };\n style?: StyleProp;\n onMessage: (event: WebViewMessage) => void;\n testID?: string;\n javaScriptEnabled?: boolean;\n originWhitelist?: string[];\n scrollEnabled?: boolean;\n showsHorizontalScrollIndicator?: boolean;\n showsVerticalScrollIndicator?: boolean;\n}\n\n// ─── Turnstile HTML template ───\n// Uses window.ReactNativeWebView.postMessage for Android compatibility.\n// Falls back to window.postMessage for web environments.\n\ntype TurnstileAppearance = 'always' | 'execute' | 'interaction-only';\ntype TurnstileSize = 'normal' | 'compact' | 'flexible';\n\nfunction buildTurnstileHtml(\n siteKey: string,\n action: string,\n appearance: TurnstileAppearance,\n size: TurnstileSize,\n): string {\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<meta http-equiv=\"Content-Security-Policy\" content=\"script-src 'unsafe-inline' https://challenges.cloudflare.com; style-src 'unsafe-inline';\">\n<style>\n html, body { margin: 0; padding: 0; background: transparent; overflow: hidden; }\n #container { display: flex; align-items: center; justify-content: center; min-height: 65px; }\n</style>\n<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit\" async defer></script>\n<script>\n function sendToNative(data) {\n try {\n // Android/iOS via react-native-webview\n if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {\n window.ReactNativeWebView.postMessage(JSON.stringify(data));\n return;\n }\n // React Native Web / fallback\n window.postMessage(JSON.stringify(data), '*');\n } catch(e) {}\n }\n\n function onTurnstileLoad() {\n turnstile.render('#container', {\n sitekey: ${JSON.stringify(siteKey)},\n action: ${JSON.stringify(action)},\n appearance: ${JSON.stringify(appearance)},\n size: ${JSON.stringify(size)},\n callback: function(token) {\n sendToNative({ type: 'captcha-token', token: token });\n },\n 'error-callback': function(error) {\n sendToNative({ type: 'captcha-error', error: String(error) });\n },\n 'before-interactive-callback': function() {\n sendToNative({ type: 'captcha-interactive' });\n },\n 'after-interactive-callback': function() {\n sendToNative({ type: 'captcha-done' });\n },\n 'timeout-callback': function() {\n sendToNative({ type: 'captcha-error', error: 'timeout' });\n }\n });\n }\n\n // Wait for Turnstile script to load\n var checkInterval = setInterval(function() {\n if (window.turnstile) {\n clearInterval(checkInterval);\n onTurnstileLoad();\n }\n }, 100);\n\n // Safety timeout — give up after 15 seconds\n setTimeout(function() {\n clearInterval(checkInterval);\n if (!window.turnstile) {\n sendToNative({ type: 'captcha-error', error: 'script_load_failed' });\n }\n }, 15000);\n</script>\n</head>\n<body><div id=\"container\"></div></body>\n</html>`;\n}\n\n// ─── TurnstileWebView component ───\n\nexport interface TurnstileWebViewProps {\n siteKey: string;\n action?: string;\n /** Called when Turnstile successfully issues a token */\n onToken: (token: string) => void;\n /** Called when Turnstile fails or times out */\n onError?: (error: string) => void;\n /** Called when an interactive challenge appears (show the WebView) */\n onInteractive?: () => void;\n /** Turnstile appearance mode */\n appearance?: TurnstileAppearance;\n /** Turnstile widget size */\n size?: TurnstileSize;\n /** Test identifier forwarded to the underlying WebView shell */\n testID?: string;\n /** Style for the WebView container */\n style?: StyleProp;\n /** WebView component — inject from react-native-webview */\n WebViewComponent: React.ComponentType<WebViewProps>;\n}\n\nexport function TurnstileWebView({\n siteKey,\n action = 'auth',\n onToken,\n onError,\n onInteractive,\n appearance = 'interaction-only',\n size = 'normal',\n testID,\n style,\n WebViewComponent,\n}: TurnstileWebViewProps): React.ReactElement {\n const html = buildTurnstileHtml(siteKey, action, appearance, size);\n\n const handleMessage = useCallback(\n (event: WebViewMessage) => {\n try {\n // React Native WebView may double-stringify on some versions\n let raw = event.nativeEvent.data;\n if (typeof raw !== 'string') raw = JSON.stringify(raw);\n const msg = JSON.parse(raw) as { type: string; token?: string; error?: string };\n\n switch (msg.type) {\n case 'captcha-token':\n if (msg.token) onToken(msg.token);\n break;\n case 'captcha-error':\n onError?.(msg.error ?? 'unknown');\n break;\n case 'captcha-interactive':\n onInteractive?.();\n break;\n default:\n break;\n }\n } catch {\n // Ignore non-JSON messages (e.g. React DevTools)\n }\n },\n [onToken, onError, onInteractive],\n );\n\n return React.createElement(WebViewComponent, {\n source: { html },\n style: style ?? { width: 300, height: 65, backgroundColor: 'transparent' },\n onMessage: handleMessage,\n testID,\n javaScriptEnabled: true,\n originWhitelist: ['*'],\n scrollEnabled: false,\n showsHorizontalScrollIndicator: false,\n showsVerticalScrollIndicator: false,\n });\n}\n\n// ─── useTurnstile hook ───\n\nexport interface UseTurnstileOptions {\n baseUrl: string;\n action?: string;\n /** Inject WebView component — pass require('react-native-webview').WebView */\n WebViewComponent?: React.ComponentType<WebViewProps>;\n}\n\nexport interface UseTurnstileResult {\n /** Current captcha token (null until resolved) */\n token: string | null;\n /** True while waiting for Turnstile to issue a token */\n isLoading: boolean;\n /** Error message if Turnstile failed */\n error: string | null;\n /** True if interactive challenge is needed (show the WebView) */\n needsInteraction: boolean;\n /** The siteKey fetched from server (null if captcha not configured) */\n siteKey: string | null;\n /** Reset state — useful to retry after error */\n reset: () => void;\n /** Manually set the token (for manual override flow) */\n setToken: (token: string) => void;\n /** Pass to TurnstileWebView.onToken for stateful integration */\n onToken: (token: string) => void;\n /** Pass to TurnstileWebView.onError for stateful integration */\n onError: (error: string) => void;\n /** Pass to TurnstileWebView.onInteractive for stateful integration */\n onInteractive: () => void;\n}\n\n// Cache site keys per backend URL so separate dev servers do not share stale config.\nconst cachedSiteKeys = new Map<string, string | null>();\nconst siteKeyFetchPromises = new Map<string, Promise<string | null>>();\n\nasync function fetchSiteKey(baseUrl: string): Promise<string | null> {\n if (cachedSiteKeys.has(baseUrl)) return cachedSiteKeys.get(baseUrl) ?? null;\n\n const inflight = siteKeyFetchPromises.get(baseUrl);\n if (inflight) return inflight;\n\n const nextPromise = (async () => {\n try {\n const res = await fetch(`${baseUrl}/api/config`);\n if (!res.ok) return null;\n const data = (await res.json()) as { captcha?: { siteKey?: string } | null };\n const nextKey = data.captcha?.siteKey ?? null;\n cachedSiteKeys.set(baseUrl, nextKey);\n return nextKey;\n } catch {\n return null;\n } finally {\n siteKeyFetchPromises.delete(baseUrl);\n }\n })();\n\n siteKeyFetchPromises.set(baseUrl, nextPromise);\n return nextPromise;\n}\n\nexport function useTurnstile({\n baseUrl,\n action = 'auth',\n}: UseTurnstileOptions): UseTurnstileResult {\n const [token, setTokenState] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [needsInteraction, setNeedsInteraction] = useState(false);\n const [siteKey, setSiteKey] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n setIsLoading(true);\n fetchSiteKey(baseUrl).then((key) => {\n if (!cancelled) {\n setSiteKey(key);\n if (!key) setIsLoading(false); // No captcha configured — done immediately\n }\n });\n return () => { cancelled = true; };\n }, [baseUrl]);\n\n const reset = useCallback(() => {\n setTokenState(null);\n setError(null);\n setNeedsInteraction(false);\n setIsLoading(true);\n }, []);\n\n const handleToken = useCallback((t: string) => {\n setTokenState(t);\n setIsLoading(false);\n setError(null);\n setNeedsInteraction(false);\n }, []);\n\n const handleError = useCallback((e: string) => {\n setError(e);\n setIsLoading(false);\n }, []);\n\n const handleInteractive = useCallback(() => {\n setNeedsInteraction(true);\n }, []);\n\n const setToken = useCallback((t: string) => {\n setTokenState(t);\n setIsLoading(false);\n }, []);\n\n return {\n token,\n isLoading,\n error,\n needsInteraction,\n siteKey,\n reset,\n setToken,\n onToken: handleToken,\n onError: handleError,\n onInteractive: handleInteractive,\n };\n}\n\n// ─── Platform detection helper ───\n\n/**\n * Detect if we're running on React Native Web (browser) vs native.\n * Used internally to skip WebView when running on web platform.\n */\nexport function isPlatformWeb(): boolean {\n return typeof document !== 'undefined' && typeof navigator !== 'undefined'\n && !('ReactNativeWebView' in window);\n}\n"]}