edmaxlabs-core 2.5.2 → 2.5.4

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/index.ts","../src/authentication/Credentials.ts","../src/utils/HttpsRequest.ts","../src/authentication/Authentication.ts","../src/database/DocumentSnapshot.ts","../src/utils/documentNomalizer.ts","../src/database/DocumentRef.ts","../src/database/Query.ts","../src/database/CollectionRef.ts","../src/database/Batch.ts","../src/database/Database.ts","../src/database/Realtime.ts","../src/utils/uuid.ts","../src/functions/Functions.ts","../src/hosting/Hosting.ts","../src/persistence/LocalStore.ts","../../../../../node_modules/idb/build/wrap-idb-value.js","../../../../../node_modules/idb/build/index.js","../src/persistence/Persistence.ts","../src/persistence/RealtimeBridge.ts","../src/persistence/SyncEngine.ts","../src/storage/StorageSnapshot.ts","../src/storage/StorageRef.ts","../src/storage/Storage.ts","../src/utils/constants.ts","../src/core/EdmaxLabs.ts","../src/database/Timestamp.ts","../src/database/ArraySnapshot.ts"],"sourcesContent":["import EdmaxLabs, { EdmaxLabsConfig } from \"./core/EdmaxLabs.js\";\r\nimport { ArraySnapshot } from \"./database/ArraySnapshot.js\";\r\nimport { DocumentSnapshot } from \"./database/DocumentSnapshot.js\";\r\nimport { StorageSnapshot } from \"./storage/StorageSnapshot.js\";\r\nimport { Credentials, DisplayInfo } from \"./authentication/Credentials.js\";\r\nimport { Timestamp } from \"./database/Timestamp.js\";\r\nimport Authentication from \"./authentication/Authentication.js\";\r\n\r\nexport default EdmaxLabs;\r\nexport {\r\n DocumentSnapshot,\r\n StorageSnapshot,\r\n ArraySnapshot,\r\n Timestamp,\r\n Credentials,\r\n DisplayInfo,\r\n Authentication,\r\n EdmaxLabsConfig\r\n};\r\n","import { Timestamp } from \"../database/Timestamp.js\";\r\n\r\nexport interface DisplayInfo {\r\n firstname: string;\r\n lastname: string;\r\n surname: string;\r\n profile: string;\r\n email: string;\r\n phone: string;\r\n}\r\n\r\nexport class Credentials {\r\n uid: string;\r\n displayInfo: DisplayInfo;\r\n logged: boolean;\r\n createdAt: Timestamp;\r\n updatedAt: Timestamp;\r\n lastLogged: Timestamp;\r\n\r\n private constructor(\r\n uid: string,\r\n displayInfo: DisplayInfo,\r\n createdAt: Timestamp,\r\n updatedAt: Timestamp,\r\n lastLogged: Timestamp,\r\n logged?:boolean\r\n ) {\r\n this.uid = uid;\r\n this.displayInfo = displayInfo;\r\n this.createdAt = createdAt;\r\n this.updatedAt = updatedAt;\r\n this.lastLogged = lastLogged;\r\n this.logged = logged === true;\r\n }\r\n\r\n static fromMap(map: Record<string, any>): Credentials {\r\n const uid = map.id ?? map.uid ?? \"\";\r\n const data = map.data ?? map;\r\n\r\n const d_info = data.displayInfo;\r\n const createdAt = data.createdAt;\r\n const updatedAt = data.updatedAt;\r\n const lastLogged = data.lastLogged;\r\n const logged = data.logged;\r\n\r\n const result = new Credentials(\r\n uid,\r\n d_info,\r\n createdAt,\r\n updatedAt,\r\n lastLogged,\r\n logged\r\n );\r\n\r\n //console.log(\"Parsing :|\", map);\r\n // console.log(\"Parsed :|\", result.toMap());\r\n\r\n return result;\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n uid: this.uid,\r\n displayInfo: this.displayInfo,\r\n createdAt: this.createdAt,\r\n updatedAt: this.updatedAt,\r\n lastLogged: this.lastLogged,\r\n logged:this.logged\r\n };\r\n }\r\n}\r\n","export enum HttpMethod {\r\n GET = \"GET\",\r\n POST = \"POST\",\r\n PUT = \"PUT\",\r\n DELETE = \"DELETE\",\r\n}\r\n\r\nexport class HttpsRequest {\r\n method: HttpMethod;\r\n endpoint: string;\r\n headers: Record<string, string>;\r\n body: Record<string, any>;\r\n file?: File;\r\n isMultipart?: boolean;\r\n\r\n constructor({\r\n method,\r\n endpoint,\r\n headers = {},\r\n body = {},\r\n file,\r\n isMultipart = false,\r\n }: {\r\n method: HttpMethod;\r\n endpoint: string;\r\n headers?: Record<string, string>;\r\n body?: Record<string, any>;\r\n file?: File;\r\n isMultipart?: boolean;\r\n }) {\r\n this.method = method;\r\n this.endpoint = endpoint;\r\n this.headers = headers;\r\n this.body = body;\r\n this.file = file;\r\n this.isMultipart = isMultipart;\r\n }\r\n\r\n async sendRequest(): Promise<any> {\r\n try {\r\n if (this.isMultipart && this.file) {\r\n const formData = new FormData();\r\n\r\n Object.entries(this.body).forEach(([key, value]) => {\r\n formData.append(key, value);\r\n });\r\n\r\n formData.append(\"file\", this.file);\r\n\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: this.headers,\r\n body: formData,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => \"Network error\");\r\n throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n }\r\n\r\n return await response.json().catch(() => ({}));\r\n }\r\n\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...this.headers,\r\n },\r\n body: this.method !== HttpMethod.GET ? JSON.stringify(this.body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => \"Network error\");\r\n throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n }\r\n\r\n return await response.json().catch(() => ({}));\r\n } catch (error: any) {\r\n // Enhanced error handling\r\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\r\n throw new Error(\"Network connection failed. Please check your internet connection.\");\r\n }\r\n if (error.name === 'AbortError') {\r\n throw new Error(\"Request was cancelled.\");\r\n }\r\n // Re-throw with more context\r\n throw error;\r\n }\r\n }\r\n}\r\n","import EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport { Credentials } from \"./Credentials.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\ntype Listener<T = any> = (value: T) => void;\r\ntype Resolver<T = any> = (value: T) => void;\r\n\r\nexport default class Authentication {\r\n static instance: Authentication | null = null;\r\n\r\n private eUser?: Credentials | null;\r\n private client?: EdmaxLabs | null;\r\n private app?: EdmaxLabs | null;\r\n\r\n\r\n private eventListeners = new Map<string, Listener[]>();\r\n private eventWaiters = new Map<string, Resolver[]>();\r\n private unsubscribers = new Set<() => void>();\r\n\r\n constructor() {\r\n if (Authentication.instance) return Authentication.instance;\r\n\r\n this.client = EdmaxLabs.instance!;\r\n this.app = new EdmaxLabs({\r\n token: 'auth',\r\n project: '6922d5982b23ae6a12e51d85',\r\n });\r\n\r\n Authentication.instance = this;\r\n this.restoreSession();\r\n }\r\n\r\n private isSameCredentials = (\r\n a?: Credentials | null,\r\n b?: Credentials | null\r\n) => {\r\n if (!a && !b) return true;\r\n if (!a || !b) return false;\r\n\r\n return JSON.stringify(a.toMap()) === JSON.stringify(b.toMap());\r\n };\r\n\r\n private restoreSession() {\r\n const saved = this.currentUser();\r\n if (saved) {\r\n this.eUser = saved;\r\n this.emitValue(\"creds\", saved);\r\n }\r\n }\r\n\r\n // Better singleton\r\n static getInstance(): Authentication {\r\n if (!Authentication.instance) {\r\n Authentication.instance = new Authentication();\r\n }\r\n return Authentication.instance;\r\n }\r\n\r\n emitValue<T>(key: string, value: T) {\r\n const listeners = this.eventListeners.get(key) || [];\r\n listeners.forEach((l) => l(value));\r\n\r\n const waiters = this.eventWaiters.get(key) || [];\r\n waiters.forEach((resolve) => resolve(value));\r\n this.eventWaiters.delete(key);\r\n }\r\n\r\n onValue<T>(key: string, callback: Listener<T>): () => void {\r\n const listeners = this.eventListeners.get(key) || [];\r\n listeners.push(callback as Listener);\r\n this.eventListeners.set(key, listeners);\r\n\r\n return () => {\r\n const filtered = listeners.filter((cb) => cb !== callback);\r\n this.eventListeners.set(key, filtered);\r\n };\r\n }\r\n\r\n currentUser(): Credentials | null {\r\n const data = localStorage.getItem(\"eauth\");\r\n if (!data) return null;\r\n try {\r\n return Credentials.fromMap(JSON.parse(data));\r\n } catch {\r\n localStorage.removeItem(\"eauth\");\r\n return null;\r\n }\r\n }\r\n\r\n private saveCredentials(credentials: Credentials | null) {\r\n if (!credentials) {\r\n localStorage.removeItem(\"eauth\");\r\n this.eUser = null;\r\n this.emitValue(\"creds\", null);\r\n return;\r\n }\r\n\r\n localStorage.setItem(\"eauth\", JSON.stringify(credentials.toMap()));\r\n this.eUser = credentials;\r\n this.emitValue(\"creds\", credentials);\r\n }\r\n\r\n // Main auth state listener - should be called ONCE at app root\r\n authState({\r\n onChange,\r\n onSignOut,\r\n onDeleted,\r\n }: {\r\n onChange: (user: Credentials) => void;\r\n onSignOut?: () => void;\r\n onDeleted?: () => void;\r\n }) {\r\n let userDocUnsubscribe: (() => void) | undefined;\r\n\r\n const handleCredsChange = (creds: Credentials | null) => {\r\n if (userDocUnsubscribe) {\r\n userDocUnsubscribe();\r\n userDocUnsubscribe = undefined;\r\n }\r\n\r\n if (!creds) {\r\n this.eUser = null;\r\n onSignOut?.();\r\n return;\r\n }\r\n\r\n const userRef = this.app?.getDatabase.collection(\"users\").doc(creds.uid);\r\n if (!userRef) return;\r\n\r\n userDocUnsubscribe = userRef.onSnapshot(\r\n (snapshot: DocumentSnapshot | null, change: string) => {\r\n console.log(snapshot);\r\n if (change === \"delete\") {\r\n this.saveCredentials(null);\r\n onSignOut?.();\r\n onDeleted?.();\r\n return;\r\n }\r\n\r\n if (change === \"insert\" || change === \"update\") {\r\n if (!snapshot) return;\r\n if (snapshot.data.logged === false || snapshot.data.logged === \"false\") {\r\n this.saveCredentials(null);\r\n onSignOut?.();\r\n return;\r\n }\r\n\r\n const newCreds = Credentials.fromMap(snapshot.toMap());\r\n\r\n if (!this.isSameCredentials(this.eUser, newCreds)) {\r\n this.eUser = newCreds;\r\n this.saveCredentials(newCreds); // this will also emit\r\n onChange(newCreds);\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n // Initial state\r\n const initialUser = this.currentUser();\r\n if (initialUser) {\r\n this.eUser = initialUser;\r\n onChange(initialUser);\r\n }\r\n handleCredsChange(initialUser);\r\n\r\n // Listen to future credential changes (login/logout from other tabs, etc.)\r\n const credsUnsub = this.onValue<Credentials | null>(\"creds\", handleCredsChange);\r\n\r\n return () => {\r\n credsUnsub();\r\n userDocUnsubscribe?.();\r\n };\r\n }\r\n\r\n createUserWithEmailAndPassword = async ({\r\n email,\r\n password,\r\n }: {\r\n email: string;\r\n password: string;\r\n }): Promise<Credentials | null> => {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n const app = this.app?.getDatabase;\r\n\r\n //check if email already exists\r\n const data = await app\r\n ?.collection(\"users\")\r\n .query.where({\r\n key: \"email\",\r\n op: \"===\",\r\n value: email,\r\n })\r\n .get();\r\n\r\n if (data!.length > 0) {\r\n throw new Error(\"Email Already In Use.\");\r\n }\r\n\r\n const userRef = await app?.collection(\"users\").add({\r\n email,\r\n password,\r\n logged: true,\r\n lastLogged: Date.now(),\r\n displayInfo: {\r\n firstname: email.split('@')[0],\r\n lastname: \"\",\r\n surname: \"\",\r\n profile: \"./logo.png\",\r\n email: email,\r\n phone:\"\"\r\n }\r\n });\r\n\r\n if (!userRef?.id || userRef?.id === \"\") {\r\n throw new Error(\"Something went wrong try Again.\");\r\n }\r\n\r\n this.eUser = Credentials.fromMap(userRef);\r\n this.saveCredentials(this.eUser);\r\n return Credentials.fromMap(userRef.toMap());\r\n };\r\n\r\n signInWithEmailAndPassword = async ({\r\n email,\r\n password,\r\n }: {\r\n email: string;\r\n password: string;\r\n }): Promise<Credentials | null> => {\r\n const app = this.app?.getDatabase;\r\n\r\n const data = await app\r\n ?.collection(\"users\")\r\n .query.where({\r\n key: \"email\",\r\n op: \"===\",\r\n value: email,\r\n })\r\n .where({\r\n key: \"password\",\r\n op: \"===\",\r\n value: password,\r\n })\r\n .get();\r\n\r\n if (data === undefined) {\r\n throw new Error(\"Auth Failed.\");\r\n }\r\n\r\n if (data?.length === 0) {\r\n throw new Error(\"User Not Found.\");\r\n }\r\n\r\n const _data = data[0];\r\n \r\n await app?.collection(\"users\").doc(_data.id).update({\r\n logged: true,\r\n lastLogged: Date.now(),\r\n });\r\n\r\n this.eUser = Credentials.fromMap(_data);\r\n this.saveCredentials(this.eUser);\r\n\r\n return Credentials.fromMap(_data);\r\n };\r\n\r\n deleteUser = async () => {\r\n if (!this.eUser) {\r\n throw new Error(\"No User Signed in\");\r\n }\r\n\r\n const app = this.app?.getDatabase;\r\n const userRef = await app?.collection(\"users\").doc(this.eUser.uid).delete();\r\n\r\n if (userRef) {\r\n throw new Error(\"Something went wrong try Again.\");\r\n }\r\n\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n };\r\n\r\n signOut = async () => {\r\n const app = this.app?.getDatabase;\r\n const luid = this.currentUser();\r\n\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n\r\n if (luid)\r\n await app?.collection(\"users\").doc(luid?.uid).update({\r\n logged: false,\r\n lastLogged: Date.now(),\r\n });\r\n return;\r\n };\r\n\r\n rules = async (\r\n path: string,\r\n context: Record<string, any>,\r\n ): Promise<{ success: boolean; allowed: any }> => {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.client!.getBaseUrl() + \"/auth/rules/verify\",\r\n headers: {\r\n authorization: this.client!.getConfig().token,\r\n project:this.client!.getConfig().project\r\n },\r\n body: {\r\n path,\r\n context: context\r\n },\r\n }).sendRequest();\r\n\r\n return res as { success: boolean; allowed: any };\r\n };\r\n}\r\n","export class DocumentSnapshot {\r\n id: string;\r\n data: Record<string, any>;\r\n\r\n private constructor(id: string, doc: Record<string, any>) {\r\n this.id = id;\r\n this.data = doc;\r\n }\r\n\r\n static fromMap(map: Record<string, any>): DocumentSnapshot {\r\n const id = map.id ?? map._id ?? \"\";\r\n const document = map.document ?? map.documents ?? map.data ?? map;\r\n\r\n return new DocumentSnapshot(id, document);\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n id: this.id,\r\n data: this.data,\r\n };\r\n }\r\n}\r\n","export function normalizePayload(payload: any) {\r\n const raw = payload?.document ?? payload?.data ?? payload;\r\n if (!raw) return null;\r\n\r\n const doc = { ...raw };\r\n doc.id = payload.id ?? payload._id;\r\n delete doc._id;\r\n\r\n return {\r\n change: payload?.change ?? raw?.change ?? null,\r\n data: doc,\r\n };\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport SyncEngine from \"../persistence/SyncEngine.js\";\r\nimport LocalStore from \"../persistence/LocalStore.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\n/**\r\n * Basic input validation for document data\r\n */\r\nfunction validateDocumentData(data: any, operation: string): void {\r\n if (data === null || data === undefined) {\r\n throw new Error(`${operation}: data cannot be null or undefined`);\r\n }\r\n if (typeof data !== 'object' || Array.isArray(data)) {\r\n throw new Error(`${operation}: data must be a plain object`);\r\n }\r\n\r\n const reservedFields = ['_id', '_createdAt', '_updatedAt', '_deleted','_v','_s'];\r\n for (const field of reservedFields) {\r\n if (field in data) {\r\n throw new Error(`${operation}: '${field}' is a reserved field and cannot be set manually`);\r\n }\r\n }\r\n\r\n // try {\r\n // const size = JSON.stringify(data).length;\r\n // if (size > 1024 * 1024) {\r\n // throw new Error(`${operation}: document too large (max 1MB)`);\r\n // }\r\n // } catch {\r\n // throw new Error(`${operation}: data contains circular references`);\r\n // }\r\n}\r\n\r\nexport default class DocumentRef {\r\n private app: EdmaxLabs;\r\n readonly collection: string;\r\n readonly id: string;\r\n\r\n private persistence: Persistence | null;\r\n private syncEngine: SyncEngine | null;\r\n private localStore: LocalStore | null;\r\n\r\n private _isUpdating = false;\r\n\r\n constructor(app: EdmaxLabs, collection: string, id: string) {\r\n this.app = app;\r\n this.collection = collection;\r\n this.id = id;\r\n this.persistence = app.offline().persistence;\r\n this.syncEngine = app.offline().syncEngine;\r\n this.localStore = app.offline().localStore;\r\n }\r\n\r\n // ====================== GET ======================\r\n async get(): Promise<DocumentSnapshot | null> {\r\n // Offline-first\r\n if (this.persistence) {\r\n try {\r\n const localSnap = await this.persistence.getDocSnapshot(this.collection, this.id);\r\n if (localSnap) return localSnap;\r\n } catch (error) {\r\n console.error(\"[EdmaxLabs] Cache read error:\", error);\r\n }\r\n }\r\n\r\n // Direct server call (no recursion)\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/read`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: {\r\n collection: this.collection,\r\n id: this.id,\r\n single: true\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !res.document) return null;\r\n\r\n return DocumentSnapshot.fromMap(res.document);\r\n } catch (error) {\r\n console.error(`[DocumentRef] get(${this.collection}/${this.id}) failed:`, error);\r\n return null;\r\n }\r\n }\r\n\r\n // ====================== UPDATE ======================\r\n async update(data: Record<string, any>): Promise<DocumentSnapshot | null> {\r\n if (this._isUpdating) {\r\n console.warn(`[DocumentRef] update recursion blocked on ${this.collection}/${this.id}`);\r\n return null;\r\n }\r\n\r\n this._isUpdating = true;\r\n\r\n try {\r\n validateDocumentData(data, 'DocumentRef.update');\r\n\r\n if (!this.persistence) {\r\n // Pure online path\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/update`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, id: this.id, data },\r\n }).sendRequest();\r\n\r\n return res?.success ? DocumentSnapshot.fromMap({ ...data, id: this.id }) : null;\r\n }\r\n\r\n // Offline-first path\r\n const old = await this.persistence.getDoc(this.collection, this.id);\r\n if (!old || old.deleted) return null;\r\n\r\n const mergedData = { ...old.data, ...data, id: this.id };\r\n\r\n const updated = await this.persistence.upsertDoc({\r\n collection: this.collection,\r\n id: this.id,\r\n data: mergedData,\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: old.localOnly,\r\n status: \"pending\",\r\n revision: old.revision,\r\n lastSyncedAt: old.lastSyncedAt,\r\n });\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: this.id,\r\n type: \"update\",\r\n payload: data,\r\n baseRevision: old.revision,\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(updated.data);\r\n\r\n this.localStore?.emitDocument(this.collection, this.id, snap, \"update\");\r\n this.localStore?.notifyCollectionChanged(this.collection, this.id, \"update\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return snap;\r\n } finally {\r\n this._isUpdating = false;\r\n }\r\n }\r\n\r\n // ====================== SET ======================\r\n async set(data: Record<string, any>): Promise<DocumentSnapshot | null> {\r\n validateDocumentData(data, 'DocumentRef.set');\r\n\r\n if (!this.persistence) {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/create`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, data: { ...data, id: this.id } },\r\n }).sendRequest();\r\n\r\n return res?.success ? DocumentSnapshot.fromMap({ ...data, id: this.id }) : null;\r\n }\r\n\r\n const updated = await this.persistence.upsertDoc({\r\n collection: this.collection,\r\n id: this.id,\r\n data: { ...data, id: this.id },\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: false,\r\n status: \"pending\",\r\n });\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: this.id,\r\n type: \"insert\",\r\n payload: data,\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(updated.data);\r\n\r\n this.localStore?.emitDocument(this.collection, this.id, snap, \"update\");\r\n this.localStore?.notifyCollectionChanged(this.collection, this.id, \"update\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return snap;\r\n }\r\n\r\n // ====================== DELETE ======================\r\n async delete(): Promise<boolean> {\r\n if (this.persistence) {\r\n await this.persistence.markDeleted(this.collection, this.id, 1);\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: this.id,\r\n type: \"delete\",\r\n payload: null,\r\n });\r\n\r\n this.localStore?.emitDocument(this.collection, this.id, null, \"empty\");\r\n this.localStore?.notifyCollectionChanged(this.collection, this.id, \"delete\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return true;\r\n }\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/delete`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, id: this.id },\r\n }).sendRequest();\r\n\r\n return !!res?.success;\r\n }\r\n\r\n // ====================== SNAPSHOT ======================\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot | null, change: string) => void\r\n ): () => void {\r\n if (this.persistence && this.localStore && this.app.offline().realtimeBridge) {\r\n this.app.offline().realtimeBridge?.watchDocument(this.collection, this.id);\r\n return this.localStore.subscribeToDocument(this.collection, this.id, callback) || (() => {});\r\n }\r\n\r\n // Online-only realtime\r\n return this.app.rtdb().subscribeToDocumentRaw(this.collection, this.id, (snapshot, change) => {\r\n const res = normalizePayload(snapshot);\r\n callback(DocumentSnapshot.fromMap(res?.data), change);\r\n });\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport LocalStore, { CollectionListener } from \"../persistence/LocalStore.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\nexport type FilterExpression = {\r\n key: string;\r\n op: \"==\" | \"===\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"in\" | \"nin\" | \"contains\";\r\n value: any;\r\n};\r\n\r\nexport default class Query {\r\n private app: EdmaxLabs;\r\n private collection: string;\r\n private filter: FilterExpression[] = [];\r\n private localStore: LocalStore | null;\r\n \r\n\r\n constructor(app: EdmaxLabs, collection: string) {\r\n this.app = app;\r\n this.collection = collection;\r\n this.localStore = app.offline().localStore;\r\n\r\n }\r\n\r\n where(expression: FilterExpression): Query {\r\n this.filter.push(expression);\r\n return this;\r\n }\r\n\r\n private buildFilter(): Record<string, any> {\r\n const mongoFilter: Record<string, any> = {};\r\n\r\n this.filter.forEach(({ key, op, value }) => {\r\n switch (op) {\r\n case \"==\":\r\n case \"===\":\r\n mongoFilter[key] = { $eq: value };\r\n break;\r\n case \"!=\":\r\n mongoFilter[key] = { $ne: value };\r\n break;\r\n case \"<\":\r\n mongoFilter[key] = { $lt: value };\r\n break;\r\n case \"<=\":\r\n mongoFilter[key] = { $lte: value };\r\n break;\r\n case \">\":\r\n mongoFilter[key] = { $gt: value };\r\n break;\r\n case \">=\":\r\n mongoFilter[key] = { $gte: value };\r\n break;\r\n case \"in\":\r\n mongoFilter[key] = { $in: value };\r\n break;\r\n case \"nin\":\r\n mongoFilter[key] = { $nin: value };\r\n break;\r\n case \"contains\":\r\n mongoFilter[key] = { $regex: value, $options: \"i\" }; // case-insensitive bonus\r\n break;\r\n default:\r\n throw new Error(`Unknown operator: ${op}`);\r\n }\r\n });\r\n\r\n return mongoFilter;\r\n }\r\n\r\n private matchesFilter(document: Record<string, any>, { key, op, value }: FilterExpression): boolean {\r\n const fieldValue = document[key];\r\n\r\n switch (op) {\r\n case \"==\":\r\n case \"===\":\r\n return fieldValue === value;\r\n case \"!=\":\r\n return fieldValue !== value;\r\n case \"<\":\r\n return fieldValue < value;\r\n case \"<=\":\r\n return fieldValue <= value;\r\n case \">\":\r\n return fieldValue > value;\r\n case \">=\":\r\n return fieldValue >= value;\r\n case \"in\":\r\n return Array.isArray(value) && value.includes(fieldValue);\r\n case \"nin\":\r\n return Array.isArray(value) && !value.includes(fieldValue);\r\n case \"contains\":\r\n if (fieldValue == null) return false;\r\n return String(fieldValue).toLowerCase().includes(String(value).toLowerCase());\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private filterDocuments(docs: DocumentSnapshot[]): DocumentSnapshot[] {\r\n if (this.filter.length === 0) return docs;\r\n return docs.filter((snapshot) =>\r\n this.filter.every((expression) =>\r\n this.matchesFilter(snapshot.data, expression)\r\n )\r\n );\r\n }\r\n\r\n private async getLocalFilteredSnapshots(): Promise<DocumentSnapshot[]> {\r\n const persistence = this.app.offline().persistence;\r\n if (!persistence) return [];\r\n\r\n const docs = await persistence.getCollectionSnapshots(this.collection);\r\n return this.filterDocuments(docs);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n const persistence = this.app.offline().persistence;\r\n\r\n if (this.filter.length > 0 && persistence) {\r\n const local = await this.getLocalFilteredSnapshots();\r\n if (typeof navigator === \"undefined\" || !navigator.onLine) {\r\n return local;\r\n }\r\n return this.refreshFromRemote();\r\n }\r\n\r\n // No filters: safe to return local cache when offline\r\n if (persistence) {\r\n const local = await persistence.getCollectionSnapshots(this.collection);\r\n // Background server refresh if online (async, non-blocking)\r\n if (typeof navigator === \"undefined\" || navigator.onLine) {\r\n this.refreshFromRemote().catch(() => {});\r\n }\r\n return local;\r\n }\r\n\r\n // Original online-only path\r\n return this.refreshFromRemote();\r\n }\r\n\r\n private async refreshFromRemote(): Promise<DocumentSnapshot[]> {\r\n try {\r\n const genfilter = this.buildFilter();\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/read`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !Array.isArray(res.documents)) {\r\n return [];\r\n }\r\n\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d.id ?? d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n // Advanced: query-wide update (keep for now, but document it's server-side only)\r\n async update(data: Record<string, any>): Promise<any> {\r\n const genfilter = this.buildFilter();\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/update`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n data,\r\n },\r\n }).sendRequest();\r\n\r\n return res;\r\n }\r\n\r\n\r\n onSnapshot(callback: CollectionListener): () => void {\r\n const genfilter = this.buildFilter();\r\n const persistence = this.app.offline().persistence;\r\n\r\n if (persistence) {\r\n const remoteUnsub = this.app.offline().realtimeBridge?.watchCollection(this.collection, genfilter);\r\n\r\n if (this.filter.length > 0) {\r\n const emitFiltered = async (change: string, changedDocId?: string) => {\r\n const docs = await this.getLocalFilteredSnapshots();\r\n callback(docs, change, changedDocId);\r\n };\r\n\r\n emitFiltered(\"insert\").catch(console.error);\r\n\r\n const localUnsub = this.localStore?.subscribeToCollection(\r\n this.collection,\r\n async (snapshots, change, changedDocId) => {\r\n if (snapshots.length > 0) {\r\n callback(this.filterDocuments(snapshots), change, changedDocId);\r\n } else {\r\n await emitFiltered(change, changedDocId);\r\n }\r\n }\r\n ) ?? (() => {});\r\n\r\n return () => {\r\n localUnsub();\r\n remoteUnsub?.();\r\n };\r\n }\r\n\r\n const localUnsub = this.localStore?.subscribeToCollection(this.collection, callback) ?? (() => {});\r\n return () => {\r\n localUnsub();\r\n remoteUnsub?.();\r\n };\r\n }\r\n\r\n // Online-only: use realtime directly WITH filters\r\n return this.app.rtdb().subscribeToCollectionRaw(this.collection, (payload, changes) => {\r\n const res = normalizePayload(payload);\r\n callback([DocumentSnapshot.fromMap(res?.data)], changes);\r\n }, genfilter);\r\n }\r\n}","import DocumentRef from \"./DocumentRef.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport Query from \"./Query.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport SyncEngine from \"../persistence/SyncEngine.js\";\r\nimport LocalStore, { CollectionListener } from \"../persistence/LocalStore.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\nexport default class CollectionRef {\r\n private app: EdmaxLabs;\r\n readonly collection: string;\r\n\r\n private persistence: Persistence | null;\r\n private syncEngine: SyncEngine | null;\r\n private localStore: LocalStore | null;\r\n\r\n constructor(app: EdmaxLabs, collection: string) {\r\n this.app = app;\r\n this.collection = collection;\r\n this.persistence = app.offline().persistence;\r\n this.syncEngine = app.offline().syncEngine;\r\n this.localStore = app.offline().localStore;\r\n }\r\n\r\n doc(id: string): DocumentRef {\r\n return new DocumentRef(this.app, this.collection, id);\r\n }\r\n\r\n get query(): Query {\r\n return new Query(this.app, this.collection);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n // Offline-first path\r\n if (this.persistence) {\r\n const local = await this.persistence.getCollectionSnapshots(this.collection);\r\n\r\n // Background refresh only if online (non-blocking)\r\n if (typeof navigator === \"undefined\" || navigator.onLine) {\r\n this.refreshFromRemote().catch(() => {});\r\n }\r\n\r\n return local;\r\n }\r\n\r\n // Pure online path - direct HTTP call (NO recursion!)\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/read`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: {},\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !Array.isArray(res.documents)) {\r\n return [];\r\n }\r\n\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d.id ?? d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } catch (error) {\r\n console.error(\"[EdmaxLabs] Collection get failed:\", error);\r\n return [];\r\n }\r\n }\r\n\r\n private async refreshFromRemote(): Promise<DocumentSnapshot[]> {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/read`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: {},\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !Array.isArray(res.documents)) {\r\n return [];\r\n }\r\n\r\n // Apply remote documents to persistence layer\r\n for (const raw of res.documents) {\r\n const doc = { ...raw };\r\n doc.id = doc.id ?? doc._id;\r\n delete doc._id;\r\n\r\n if (this.persistence) {\r\n await this.persistence.applyRemoteDoc(this.collection, doc);\r\n }\r\n }\r\n\r\n // Return fresh local data if persistence is active\r\n if (this.persistence) {\r\n return await this.persistence.getCollectionSnapshots(this.collection);\r\n }\r\n\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d.id ?? d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } catch (error) {\r\n console.error(\"[EdmaxLabs] refreshFromRemote failed:\", error);\r\n return [];\r\n }\r\n }\r\n\r\n async add(data: Record<string, any>): Promise<DocumentSnapshot | null> {\r\n if (this.persistence) {\r\n const localId = this.persistence.createLocalId();\r\n\r\n const docRecord = await this.persistence.upsertDoc({\r\n collection: this.collection,\r\n id: localId,\r\n data: { ...data, id: localId },\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: true,\r\n status: \"pending\",\r\n });\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: localId,\r\n type: \"insert\",\r\n payload: docRecord.data,\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(docRecord.data);\r\n\r\n this.localStore?.emitDocument(this.collection, localId, snap, \"insert\");\r\n this.localStore?.notifyCollectionChanged(this.collection, localId, \"insert\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return snap;\r\n }\r\n\r\n // Online-only add\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/create`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, data: { ...data, id: \"\" } }, // server will generate id\r\n }).sendRequest();\r\n\r\n if (!res?.success || !res.document) return null;\r\n\r\n return DocumentSnapshot.fromMap(res.document);\r\n }\r\n\r\n onSnapshot(callback: CollectionListener): () => void {\r\n if (this.persistence && this.localStore && this.app.offline().realtimeBridge) {\r\n this.app.offline().realtimeBridge?.watchCollection(this.collection);\r\n return this.localStore.subscribeToCollection(this.collection, callback) ?? (() => {});\r\n }\r\n\r\n // Online-only realtime\r\n return this.app.rtdb().subscribeToCollectionRaw(this.collection, (payload, changes) => {\r\n const res = normalizePayload(payload);\r\n callback([DocumentSnapshot.fromMap(res?.data)], changes);\r\n });\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport DocumentRef from \"./DocumentRef.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class Batch {\r\n private app: EdmaxLabs;\r\n private ops: any[] = [];\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n set(docRef: DocumentRef, data: any): Batch {\r\n this.ops.push({\r\n op: \"set\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n return this;\r\n }\r\n\r\n create(docRef: DocumentRef, data: any): Batch {\r\n this.ops.push({\r\n op: \"create\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n return this;\r\n }\r\n\r\n update(docRef: DocumentRef, data: any): Batch {\r\n this.ops.push({\r\n op: \"update\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n return this;\r\n }\r\n\r\n delete(docRef: DocumentRef): Batch {\r\n this.ops.push({\r\n op: \"delete\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n });\r\n return this;\r\n }\r\n\r\n async commit(): Promise<any> {\r\n const persistence = this.app.offline().persistence;\r\n const localStore = this.app.offline().localStore;\r\n const syncEngine = this.app.offline().syncEngine;\r\n\r\n // Offline-first optimistic path\r\n if (persistence && localStore) {\r\n const results: DocumentSnapshot[] = [];\r\n\r\n for (const op of this.ops) {\r\n try {\r\n if (op.op === \"update\") {\r\n const docRef = new DocumentRef(this.app, op.collection, op.id);\r\n const snap = await docRef.update(op.data);\r\n if (snap) results.push(snap);\r\n } else if (op.op === \"create\" || op.op === \"insert\" || op.op === \"set\") {\r\n // For create/set operations, insert optimistically\r\n const upserted = await persistence.upsertDoc({\r\n collection: op.collection,\r\n id: op.id,\r\n data: { ...op.data, id: op.id },\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: false,\r\n status: \"pending\",\r\n });\r\n \r\n await persistence.enqueueMutation({\r\n mutationId: persistence.createMutationId(),\r\n collection: op.collection,\r\n documentId: op.id,\r\n type: \"insert\",\r\n payload: op.data,\r\n });\r\n \r\n const snap = DocumentSnapshot.fromMap(upserted.data);\r\n localStore.emitDocument(op.collection, op.id, snap, \"insert\");\r\n localStore.notifyCollectionChanged(op.collection, op.id, \"insert\");\r\n results.push(snap);\r\n } else if (op.op === \"delete\") {\r\n const docRef = new DocumentRef(this.app, op.collection, op.id);\r\n await docRef.delete();\r\n }\r\n } catch (e) {\r\n console.error(`[EdmaxLabs Batch] Failed optimistic ${op.op}`, e);\r\n }\r\n }\r\n\r\n // Trigger background sync for all queued mutations\r\n syncEngine?.flush().catch(console.error);\r\n\r\n return { success: true, results };\r\n }\r\n\r\n // Fallback: original online-only behavior (no breaking change)\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/batch`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: { ops: this.ops },\r\n }).sendRequest();\r\n\r\n if (res?.error) {\r\n throw new Error(res.error.message || \"Batch commit failed\");\r\n }\r\n\r\n return res;\r\n }\r\n}","import CollectionRef from \"./CollectionRef.js\";\r\nimport DocumentRef from \"./DocumentRef.js\";\r\nimport Batch from \"./Batch.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\nexport default class Database {\r\n private app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n collection(name: string): CollectionRef {\r\n return new CollectionRef(this.app, name);\r\n }\r\n\r\n doc(path: string): DocumentRef {\r\n if (path.includes(\"/\")) {\r\n const [col, id] = path.split(\"/\");\r\n return new DocumentRef(this.app, col, id);\r\n }\r\n throw new Error(\"doc(path) expects format 'collection/documentId'\");\r\n }\r\n\r\n batch(): Batch {\r\n return new Batch(this.app);\r\n }\r\n\r\n /**\r\n * Server-side transaction (unchanged, but improved error handling)\r\n * This remains online-only for now — offline transactions are complex and can be added later as opt-in.\r\n */\r\n async runTransaction(\r\n transactionFn: (tx: {\r\n ops: any[];\r\n get: (docRef: DocumentRef) => Promise<any>;\r\n set: (docRef: DocumentRef, data: any) => void;\r\n update: (docRef: DocumentRef, data: any) => void;\r\n delete: (docRef: DocumentRef) => void;\r\n }) => Promise<void>\r\n ): Promise<any> {\r\n const tx = {\r\n ops: [] as any[],\r\n async get(docRef: DocumentRef) {\r\n return docRef.get(); // will use offline cache if available in future\r\n },\r\n set(docRef: DocumentRef, data: any) {\r\n tx.ops.push({ op: \"set\", collection: docRef.collection, id: docRef.id, data });\r\n },\r\n update(docRef: DocumentRef, data: any) {\r\n tx.ops.push({ op: \"update\", collection: docRef.collection, id: docRef.id, data });\r\n },\r\n delete(docRef: DocumentRef) {\r\n tx.ops.push({ op: \"delete\", collection: docRef.collection, id: docRef.id });\r\n },\r\n };\r\n\r\n await transactionFn(tx);\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/transaction`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: { ops: tx.ops },\r\n }).sendRequest();\r\n\r\n if (res?.error) {\r\n throw new Error(res.error.message || \"Transaction failed\");\r\n }\r\n return res;\r\n }\r\n\r\n // ===================== OFFLINE HELPERS (Internal) =====================\r\n\r\n /** \r\n * Returns true if persistence is enabled and we are currently offline \r\n */\r\n private get shouldUseOffline(): boolean {\r\n return !!(this.app.offline().persistence && \r\n typeof navigator !== \"undefined\" && \r\n !navigator.onLine);\r\n }\r\n\r\n /** \r\n * Returns the SyncEngine if persistence is enabled \r\n */\r\n private get syncEngine() {\r\n return this.app.offline().syncEngine;\r\n }\r\n\r\n /** \r\n * Returns the RealtimeBridge if persistence is enabled \r\n */\r\n private get realtimeBridge() {\r\n return this.app.offline().realtimeBridge;\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { io, Socket } from \"socket.io-client\";\r\nimport { generateUUID } from \"../utils/uuid.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\ntype RealtimeEvent = \"error\" | \"insert\" | \"update\" | \"delete\";\r\n\r\ntype SubscriptionRecord = {\r\n lid: string;\r\n collection: string;\r\n filter: Record<string, any>;\r\n handlers: Array<{\r\n event: string;\r\n fn: (payload: any) => void;\r\n }>;\r\n};\r\n\r\nexport default class Realtime {\r\n private app: EdmaxLabs;\r\n private socket: Socket | null = null;\r\n private readonly events: RealtimeEvent[] = [\"error\", \"insert\", \"update\", \"delete\"];\r\n private subscriptions = new Map<string, SubscriptionRecord>();\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n private connect(): Socket {\r\n if (this.socket) return this.socket;\r\n\r\n if (!this.app.getConfig().token) {\r\n throw new Error(\"Auth token is required for realtime connection\");\r\n }\r\n\r\n this.socket = io(this.app.getSocketUrl(), {\r\n transports: [\"websocket\"],\r\n auth: { token: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n autoConnect: true,\r\n reconnection: true,\r\n reconnectionAttempts: Infinity,\r\n reconnectionDelay: 1000,\r\n reconnectionDelayMax: 5000,\r\n });\r\n\r\n this.setupSocketListeners();\r\n\r\n return this.socket;\r\n }\r\n\r\n private setupSocketListeners(): void {\r\n if (!this.socket) return;\r\n\r\n this.socket.on(\"connect\", () => {\r\n console.log(\"[EdmaxLabs Realtime] Connected\");\r\n this.resubscribeAll();\r\n // Trigger offline sync + bridge refresh when back online\r\n this.app.offline().syncEngine?.flush().catch(console.error);\r\n this.app.offline().realtimeBridge?.onReconnect?.().catch(console.error);\r\n });\r\n\r\n this.socket.on(\"disconnect\", (reason) => {\r\n console.log(`[EdmaxLabs Realtime] Disconnected: ${reason}`);\r\n });\r\n\r\n this.socket.on(\"error\", (err) => {\r\n console.error(\"[EdmaxLabs Realtime] Socket error:\", err);\r\n });\r\n }\r\n\r\n // ===================== PUBLIC HELPERS =====================\r\n\r\n on(event: string, cb: (...args: any[]) => void): void {\r\n this.connect().on(event, cb);\r\n }\r\n\r\n off(event: string, cb?: (...args: any[]) => void): void {\r\n if (cb) this.socket?.off(event, cb);\r\n else this.socket?.removeAllListeners(event);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n this.connect().emit(event, data);\r\n }\r\n\r\n // ===================== INTERNAL RAW SUBSCRIPTIONS =====================\r\n\r\n /**\r\n * Low-level collection subscription (used by RealtimeBridge)\r\n */\r\n subscribeToCollectionRaw(\r\n collection: string,\r\n callback: (payload: any, change: string) => void,\r\n filter: Record<string, any> = {}\r\n ): () => void {\r\n this.connect();\r\n\r\n const lid = `col_${collection}_${generateUUID()}`;\r\n const handlers: Array<{ event: string; fn: (payload: any) => void }> = [];\r\n\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n this.events.forEach((event) => {\r\n const channel = `${lid}-${event}`;\r\n const fn = (payload: any) => {\r\n const normalized = normalizePayload(payload);\r\n if (!normalized) return;\r\n callback(normalized.data,event);\r\n };\r\n\r\n this.socket!.on(channel, fn);\r\n handlers.push({ event: channel, fn });\r\n });\r\n\r\n this.registerSubscription(lid, collection, filter, handlers);\r\n\r\n return () => this.cleanupSubscription(lid);\r\n }\r\n\r\n /**\r\n * Low-level document subscription (used by RealtimeBridge)\r\n */\r\n subscribeToDocumentRaw(\r\n collection: string,\r\n id: string,\r\n callback: (payload: any, change: string) => void\r\n ): () => void {\r\n this.connect();\r\n\r\n const lid = `doc_${collection}_${id}_${generateUUID()}`;\r\n const filter = { _id: id };\r\n const handlers: Array<{ event: string; fn: (payload: any) => void }> = [];\r\n\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n this.events.forEach((event) => {\r\n const channel = `${lid}-${event}`;\r\n const fn = (payload: any) => {\r\n const normalized = normalizePayload(payload);\r\n if (!normalized) {\r\n callback({ id }, \"delete\");\r\n return;\r\n }\r\n callback(normalized.data, normalized.change ?? event);\r\n };\r\n\r\n this.socket!.on(channel, fn);\r\n handlers.push({ event: channel, fn });\r\n });\r\n\r\n this.registerSubscription(lid, collection, filter, handlers);\r\n\r\n return () => this.cleanupSubscription(lid);\r\n }\r\n\r\n // ===================== PRIVATE HELPERS =====================\r\n\r\n\r\n private registerSubscription(\r\n lid: string,\r\n collection: string,\r\n filter: Record<string, any>,\r\n handlers: Array<{ event: string; fn: (payload: any) => void }>\r\n ) {\r\n this.subscriptions.set(lid, { lid, collection, filter, handlers });\r\n }\r\n\r\n private resubscribeAll() {\r\n if (!this.socket) return;\r\n\r\n for (const sub of this.subscriptions.values()) {\r\n this.socket.emit(\"subscribe\", {\r\n collection: sub.collection,\r\n filter: sub.filter,\r\n lid: sub.lid,\r\n });\r\n }\r\n }\r\n\r\n private cleanupSubscription(lid: string): void {\r\n const sub = this.subscriptions.get(lid);\r\n if (!sub || !this.socket) return;\r\n\r\n for (const handler of sub.handlers) {\r\n this.socket.off(handler.event, handler.fn);\r\n }\r\n\r\n this.socket.emit(\"unsubscribe\", { lid });\r\n this.subscriptions.delete(lid);\r\n }\r\n\r\n // ===================== LIFECYCLE =====================\r\n\r\n disconnect(): void {\r\n this.socket?.disconnect();\r\n this.socket = null;\r\n this.subscriptions.clear();\r\n }\r\n\r\n dispose(): void {\r\n this.disconnect();\r\n }\r\n}","// utils/uuid.ts\r\nexport function generateUUID(): string {\r\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\r\n return crypto.randomUUID(); // Secure & browser-native\r\n }\r\n\r\n // Fallback: Manual RFC4122 UUID v4 generator\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\nexport default class Functions {\r\n app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n async call(functionName: string, data?: Record<string, any>): Promise<any> {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl() + \"/functions/call/\" + functionName,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: data,\r\n }).sendRequest();\r\n\r\n return res;\r\n } catch (err: any) {\r\n throw {\r\n message: err.message || \"Function call failed\",\r\n code: err.code || \"UNKNOWN_ERROR\",\r\n };\r\n }\r\n }\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\nexport default class Hosting {\r\n app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n async createSubdomain(name: string): Promise<any> {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl() + \"/hosting/register\",\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n hostname: name,\r\n project: this.app.getConfig().project,\r\n },\r\n }).sendRequest();\r\n\r\n return res;\r\n } catch (err: any) {\r\n throw {\r\n message: err.message || \"Function call failed\",\r\n code: err.code || \"UNKNOWN_ERROR\",\r\n };\r\n }\r\n }\r\n}\r\n","import { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\n\r\nexport type DocListener = (snapshot: DocumentSnapshot | null, change: string) => void;\r\n\r\n/**\r\n * For collection listeners we pass:\r\n * - snapshots: all current documents in the collection\r\n * - change: what triggered this emission\r\n * - changedDocId?: which specific document changed (useful for granular updates)\r\n */\r\nexport type CollectionListener = (\r\n snapshots: DocumentSnapshot[],\r\n change: string,\r\n changedDocId?: string\r\n) => void;\r\n\r\nexport default class LocalStore {\r\n private documentListeners = new Map<string, Set<DocListener>>();\r\n private collectionListeners = new Map<string, Set<CollectionListener>>();\r\n\r\n private docKey(collection: string, id: string): string {\r\n return `${collection}:${id}`;\r\n }\r\n\r\n // ===================== DOCUMENT LISTENERS =====================\r\n\r\n subscribeToDocument(\r\n collection: string,\r\n id: string,\r\n callback: DocListener\r\n ): () => void {\r\n const key = this.docKey(collection, id);\r\n\r\n if (!this.documentListeners.has(key)) {\r\n this.documentListeners.set(key, new Set());\r\n }\r\n\r\n const listeners = this.documentListeners.get(key)!;\r\n listeners.add(callback);\r\n\r\n // Return unsubscribe function (standard in React SDKs)\r\n return () => {\r\n listeners.delete(callback);\r\n if (listeners.size === 0) {\r\n this.documentListeners.delete(key);\r\n }\r\n };\r\n }\r\n\r\n // ===================== COLLECTION LISTENERS =====================\r\n\r\n subscribeToCollection(\r\n collection: string,\r\n callback: CollectionListener\r\n ): () => void {\r\n if (!this.collectionListeners.has(collection)) {\r\n this.collectionListeners.set(collection, new Set());\r\n }\r\n\r\n const listeners = this.collectionListeners.get(collection)!;\r\n listeners.add(callback);\r\n\r\n return () => {\r\n listeners.delete(callback);\r\n if (listeners.size === 0) {\r\n this.collectionListeners.delete(collection);\r\n }\r\n };\r\n }\r\n\r\n // ===================== EMITTERS =====================\r\n\r\n /**\r\n * Notify all listeners for a specific document\r\n */\r\n emitDocument(\r\n collection: string,\r\n id: string,\r\n snapshot: DocumentSnapshot | null,\r\n change: string\r\n ): void {\r\n const key = this.docKey(collection, id);\r\n this.documentListeners.get(key)?.forEach((cb) => {\r\n try {\r\n cb(snapshot, change);\r\n } catch (err) {\r\n console.error(`[EdmaxLabs] Error in document listener for ${key}:`, err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notify all listeners for a collection.\r\n * This is the most important fix — collection listeners now receive the full list.\r\n */\r\n emitCollection(\r\n collection: string,\r\n snapshots: DocumentSnapshot[], // ← Changed from single snapshot\r\n change: string,\r\n changedDocId?: string\r\n ): void {\r\n this.collectionListeners.get(collection)?.forEach((cb) => {\r\n try {\r\n cb(snapshots, change, changedDocId);\r\n } catch (err) {\r\n console.error(`[EdmaxLabs] Error in collection listener for ${collection}:`, err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * OPTIMIZED: Notify collection listeners that something changed, without fetching full collection.\r\n * Listeners can call getCollectionSnapshots() themselves if they need the full list.\r\n * This avoids expensive collection queries after every single mutation.\r\n */\r\n notifyCollectionChanged(\r\n collection: string,\r\n changedDocId: string,\r\n change: string\r\n ): void {\r\n // Send empty snapshots array (listeners will know to refetch if needed)\r\n // The changedDocId tells listeners WHICH document changed\r\n this.collectionListeners.get(collection)?.forEach((cb) => {\r\n try {\r\n cb([], change, changedDocId);\r\n } catch (err) {\r\n console.error(`[EdmaxLabs] Error in collection listener for ${collection}:`, err);\r\n }\r\n });\r\n }\r\n\r\n // ===================== UTILITY =====================\r\n\r\n /**\r\n * Clear all listeners (useful for testing or when persistence is disabled)\r\n */\r\n clearAllListeners(): void {\r\n this.documentListeners.clear();\r\n this.collectionListeners.clear();\r\n }\r\n\r\n /**\r\n * Get current listener count (for debugging / dev tools)\r\n */\r\n get listenerCount(): { documents: number; collections: number } {\r\n let docCount = 0;\r\n this.documentListeners.forEach(set => docCount += set.size);\r\n let collCount = 0;\r\n this.collectionListeners.forEach(set => collCount += set.size);\r\n return { documents: docCount, collections: collCount };\r\n }\r\n\r\n /**\r\n * Remove all listeners for a specific collection (useful for cleanup)\r\n */\r\n removeCollectionListeners(collection: string): void {\r\n this.collectionListeners.delete(collection);\r\n }\r\n\r\n /**\r\n * Remove all listeners for a specific document (useful for cleanup)\r\n */\r\n removeDocumentListeners(collection: string, id: string): void {\r\n const key = this.docKey(collection, id);\r\n this.documentListeners.delete(key);\r\n }\r\n}","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { openDB, type DBSchema, type IDBPDatabase } from \"idb\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport type { LocalDoc } from \"./models/LocalDoc.js\";\r\nimport type { MutationRecord, MutationType } from \"./models/Mutation.js\";\r\n\r\ninterface EdmaxDBSchema extends DBSchema {\r\n docs: {\r\n key: string;\r\n value: LocalDoc;\r\n indexes: {\r\n \"by-collection\": string;\r\n \"by-id\": string;\r\n \"by-updatedAt\": number;\r\n \"by-pending\": number;\r\n };\r\n };\r\n mutations: {\r\n key: string;\r\n value: MutationRecord;\r\n indexes: {\r\n \"by-status\": string;\r\n \"by-collection\": string;\r\n \"by-documentId\": string;\r\n \"by-createdAt\": number;\r\n };\r\n };\r\n meta: {\r\n key: string;\r\n value: any;\r\n };\r\n}\r\n\r\nexport default class Persistence {\r\n private dbPromise: Promise<IDBPDatabase<EdmaxDBSchema>>;\r\n private appName: string;\r\n\r\n constructor(appName: string = \"default\") {\r\n this.appName = appName;\r\n // Isolation: Use app_name in DB name to prevent data leakage between apps/users\r\n this.dbPromise = openDB<EdmaxDBSchema>(`edmaxlabs_storage_${appName}`, 1, {\r\n upgrade(app, oldVersion) {\r\n if (oldVersion < 1) {\r\n if (!app.objectStoreNames.contains(\"docs\")) {\r\n const docs = app.createObjectStore(\"docs\", { keyPath: \"key\" });\r\n docs.createIndex(\"by-collection\", \"collection\");\r\n docs.createIndex(\"by-id\", \"id\");\r\n docs.createIndex(\"by-updatedAt\", \"updatedAt\");\r\n docs.createIndex(\"by-pending\", \"pending\");\r\n }\r\n\r\n if (!app.objectStoreNames.contains(\"mutations\")) {\r\n const mutations = app.createObjectStore(\"mutations\", {\r\n keyPath: \"mutationId\",\r\n });\r\n mutations.createIndex(\"by-status\", \"status\");\r\n mutations.createIndex(\"by-collection\", \"collection\");\r\n mutations.createIndex(\"by-documentId\", \"documentId\");\r\n mutations.createIndex(\"by-createdAt\", \"createdAt\");\r\n }\r\n\r\n if (!app.objectStoreNames.contains(\"meta\")) {\r\n app.createObjectStore(\"meta\");\r\n }\r\n }\r\n },\r\n blocked() {\r\n console.warn(\"[EdmaxLabs] IndexedDB blocked - another tab has the database open\");\r\n },\r\n blocking() {\r\n console.warn(\"[EdmaxLabs] IndexedDB blocking - closing to allow upgrade\");\r\n // Note: Cannot auto-close here as it would break the upgrade process\r\n // The blocking event indicates another tab needs access\r\n },\r\n terminated() {\r\n console.error(\"[EdmaxLabs] IndexedDB terminated unexpectedly\");\r\n },\r\n }).catch(error => {\r\n if (error.name === 'QuotaExceededError') {\r\n console.error(\"[EdmaxLabs] IndexedDB quota exceeded - storage full\");\r\n throw new Error(\"Storage quota exceeded. Please clear browser data or free up space.\");\r\n }\r\n if (error.name === 'VersionError') {\r\n console.error(\"[EdmaxLabs] IndexedDB version conflict - clearing and retrying\");\r\n // Try to delete and recreate\r\n indexedDB.deleteDatabase(`edmaxlabs_storage_${appName}`);\r\n throw error; // Let caller handle retry\r\n }\r\n throw error;\r\n });\r\n }\r\n\r\n private docKey(collection: string, id: string): string {\r\n // Include app_name for extra isolation (defense in depth)\r\n return `${this.appName}:${collection}:${id}`;\r\n }\r\n\r\n private now(): number {\r\n return Date.now();\r\n }\r\n\r\n private async getDb(): Promise<IDBPDatabase<EdmaxDBSchema>> {\r\n try {\r\n return await this.dbPromise;\r\n } catch (error: any) {\r\n if (error.name === 'QuotaExceededError') {\r\n throw new Error(\"Storage quota exceeded. Please clear browser data or free up space.\");\r\n }\r\n if (error.name === 'VersionError') {\r\n // Try recovery by deleting and recreating\r\n console.warn(\"[EdmaxLabs] IndexedDB version error - attempting recovery\");\r\n indexedDB.deleteDatabase(`edmaxlabs_storage_${this.appName}`);\r\n // Force recreation on next call\r\n this.dbPromise = openDB<EdmaxDBSchema>(`edmaxlabs_storage_${this.appName}`, 1, {\r\n upgrade(app, oldVersion) {\r\n // Same schema as above\r\n if (oldVersion < 1) {\r\n if (!app.objectStoreNames.contains(\"docs\")) {\r\n const docs = app.createObjectStore(\"docs\", { keyPath: \"key\" });\r\n docs.createIndex(\"by-collection\", \"collection\");\r\n docs.createIndex(\"by-id\", \"id\");\r\n docs.createIndex(\"by-updatedAt\", \"updatedAt\");\r\n docs.createIndex(\"by-pending\", \"pending\");\r\n }\r\n if (!app.objectStoreNames.contains(\"mutations\")) {\r\n const mutations = app.createObjectStore(\"mutations\", {\r\n keyPath: \"mutationId\",\r\n });\r\n mutations.createIndex(\"by-status\", \"status\");\r\n mutations.createIndex(\"by-collection\", \"collection\");\r\n mutations.createIndex(\"by-documentId\", \"documentId\");\r\n mutations.createIndex(\"by-createdAt\", \"createdAt\");\r\n }\r\n if (!app.objectStoreNames.contains(\"meta\")) {\r\n app.createObjectStore(\"meta\");\r\n }\r\n }\r\n },\r\n });\r\n return await this.dbPromise;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n // ==================== DOCS ====================\r\n\r\n async getDoc(collection: string, id: string): Promise<LocalDoc | null> {\r\n const app = await this.getDb();\r\n return (await app.get(\"docs\", this.docKey(collection, id))) ?? null;\r\n }\r\n\r\n async getDocSnapshot(collection: string, id: string): Promise<DocumentSnapshot | null> {\r\n const doc = await this.getDoc(collection, id);\r\n if (!doc || !doc.exists || doc.deleted) return null;\r\n return DocumentSnapshot.fromMap(doc.data);\r\n }\r\n\r\n async getCollection(collection: string): Promise<LocalDoc[]> {\r\n const app = await this.getDb();\r\n const all = await app.getAllFromIndex(\"docs\", \"by-collection\", collection);\r\n return all.filter((d) => d.exists && !d.deleted);\r\n }\r\n\r\n async getCollectionSnapshots(collection: string): Promise<DocumentSnapshot[]> {\r\n const docs = await this.getCollection(collection);\r\n return docs.map((d) => DocumentSnapshot.fromMap(d.data));\r\n }\r\n\r\n async upsertDoc(input: Omit<LocalDoc, \"key\" | \"updatedAt\"> & { updatedAt?: number }): Promise<LocalDoc> {\r\n const app = await this.getDb();\r\n const record: LocalDoc = {\r\n ...input,\r\n key: this.docKey(input.collection, input.id),\r\n updatedAt: input.updatedAt ?? this.now(),\r\n };\r\n\r\n await app.put(\"docs\", record);\r\n return record;\r\n }\r\n\r\n async markDeleted(collection: string, id: string, pending = 1): Promise<LocalDoc> {\r\n const old = await this.getDoc(collection, id);\r\n\r\n const record: LocalDoc = {\r\n key: this.docKey(collection, id),\r\n collection,\r\n id,\r\n data: old?.data ?? { id },\r\n exists: false,\r\n deleted: true,\r\n pending,\r\n localOnly: false,\r\n status: pending ? \"pending\" : \"synced\",\r\n updatedAt: this.now(),\r\n lastSyncedAt: old?.lastSyncedAt,\r\n revision: old?.revision,\r\n };\r\n\r\n const app = await this.getDb();\r\n await app.put(\"docs\", record);\r\n return record;\r\n }\r\n\r\n // ==================== MUTATIONS ====================\r\n\r\n async enqueueMutation(\r\n mutation: Omit<MutationRecord, \"updatedAt\" | \"createdAt\" | \"retryCount\" | \"status\">\r\n ): Promise<MutationRecord> {\r\n const app = await this.getDb();\r\n const record: MutationRecord = {\r\n ...mutation,\r\n createdAt: this.now(),\r\n updatedAt: this.now(),\r\n retryCount: 0,\r\n status: \"pending\",\r\n };\r\n\r\n await app.put(\"mutations\", record);\r\n return record;\r\n }\r\n\r\n async getPendingMutations(): Promise<MutationRecord[]> {\r\n const app = await this.getDb();\r\n const [pending, failed] = await Promise.all([\r\n app.getAllFromIndex(\"mutations\", \"by-status\", \"pending\"),\r\n app.getAllFromIndex(\"mutations\", \"by-status\", \"failed\"),\r\n ]);\r\n\r\n return [...pending, ...failed].sort((a, b) => a.createdAt - b.createdAt);\r\n }\r\n\r\n async getMutation(mutationId: string): Promise<MutationRecord | null> {\r\n const app = await this.getDb();\r\n return (await app.get(\"mutations\", mutationId)) ?? null;\r\n }\r\n\r\n async resetMutation(mutationId: string): Promise<MutationRecord | null> {\r\n const app = await this.getDb();\r\n const old = await app.get(\"mutations\", mutationId);\r\n if (!old) return null;\r\n\r\n const next: MutationRecord = {\r\n ...old,\r\n status: \"pending\",\r\n retryCount: 0,\r\n updatedAt: this.now(),\r\n error: undefined,\r\n };\r\n\r\n await app.put(\"mutations\", next);\r\n return next;\r\n }\r\n\r\n async setMutationStatus(\r\n mutationId: string,\r\n status: MutationRecord[\"status\"],\r\n error?: string\r\n ): Promise<MutationRecord | null> {\r\n const app = await this.getDb();\r\n const old = await app.get(\"mutations\", mutationId);\r\n if (!old) return null;\r\n\r\n const next: MutationRecord = {\r\n ...old,\r\n status,\r\n updatedAt: this.now(),\r\n retryCount: status === \"failed\" ? (old.retryCount || 0) + 1 : old.retryCount,\r\n error,\r\n };\r\n\r\n await app.put(\"mutations\", next);\r\n return next;\r\n }\r\n\r\n async removeMutation(mutationId: string): Promise<void> {\r\n const app = await this.getDb();\r\n await app.delete(\"mutations\", mutationId);\r\n }\r\n\r\n // ==================== ADVANCED OPERATIONS ====================\r\n\r\n async replaceDocId(collection: string, oldId: string, newId: string): Promise<LocalDoc | null> {\r\n const app = await this.getDb();\r\n const oldKey = this.docKey(collection, oldId);\r\n const oldDoc = await app.get(\"docs\", oldKey);\r\n if (!oldDoc) return null;\r\n\r\n const next: LocalDoc = {\r\n ...oldDoc,\r\n id: newId,\r\n key: this.docKey(collection, newId),\r\n data: { ...oldDoc.data, id: newId },\r\n localOnly: false,\r\n pending: 0,\r\n status: \"synced\",\r\n updatedAt: this.now(),\r\n lastSyncedAt: this.now(),\r\n };\r\n\r\n const tx = app.transaction([\"docs\", \"mutations\"], \"readwrite\");\r\n const docsStore = tx.objectStore(\"docs\");\r\n const mutationsStore = tx.objectStore(\"mutations\");\r\n\r\n await docsStore.put(next);\r\n await docsStore.delete(oldKey);\r\n\r\n // Update all related mutations in one transaction\r\n const allMutations = await mutationsStore.getAll();\r\n for (const mut of allMutations) {\r\n if (mut.collection === collection && mut.documentId === oldId) {\r\n await mutationsStore.put({\r\n ...mut,\r\n documentId: newId,\r\n payload: mut.payload ? { ...mut.payload, id: newId } : null,\r\n updatedAt: this.now(),\r\n });\r\n }\r\n }\r\n\r\n await tx.done;\r\n return next;\r\n }\r\n\r\n async applyRemoteDoc(\r\n collection: string,\r\n data: Record<string, any>,\r\n revision?: string | number\r\n ): Promise<LocalDoc | null> {\r\n const id = data.id ?? data._id;\r\n if (!id) return null;\r\n\r\n const local = await this.getDoc(collection, id);\r\n if (local?.pending && local.pending > 0) {\r\n return local; // Protect optimistic writes\r\n }\r\n\r\n return this.upsertDoc({\r\n collection,\r\n id,\r\n data: { ...data, id },\r\n exists: true,\r\n deleted: false,\r\n pending: 0,\r\n localOnly: false,\r\n status: \"synced\",\r\n revision,\r\n lastSyncedAt: this.now(),\r\n });\r\n }\r\n\r\n async applyRemoteDelete(collection: string, id: string): Promise<LocalDoc | null> {\r\n const local = await this.getDoc(collection, id);\r\n if (local?.pending && local.pending > 0) {\r\n return local;\r\n }\r\n return this.markDeleted(collection, id, 0);\r\n }\r\n\r\n // ==================== UTILITIES ====================\r\n\r\n createLocalId(): string {\r\n return `local_${crypto.randomUUID()}`;\r\n }\r\n\r\n createMutationId(): string {\r\n return `mut_${crypto.randomUUID()}`;\r\n }\r\n\r\n // Future-proof maintenance methods (optional for now)\r\n async clearAll(): Promise<void> {\r\n const app = await this.getDb();\r\n const tx = app.transaction([\"docs\", \"mutations\", \"meta\"], \"readwrite\");\r\n await Promise.all([\r\n tx.objectStore(\"docs\").clear(),\r\n tx.objectStore(\"mutations\").clear(),\r\n tx.objectStore(\"meta\").clear(),\r\n ]);\r\n await tx.done;\r\n }\r\n\r\n async getStorageUsage(): Promise<number> {\r\n // Can be implemented later with estimate() if needed\r\n return 0;\r\n }\r\n}","import Persistence from \"../persistence/Persistence.js\";\r\nimport LocalStore from \"./LocalStore.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class RealtimeBridge {\r\n private collectionUnsubs = new Map<string, () => void>();\r\n private documentUnsubs = new Map<string, () => void>();\r\n\r\n constructor(\r\n private app: EdmaxLabs,\r\n private persistence: Persistence,\r\n private store: LocalStore\r\n ) {}\r\n\r\n private docKey(collection: string, id: string): string {\r\n return `${collection}:${id}`;\r\n }\r\n\r\n // ===================== PUBLIC API =====================\r\n\r\n watchCollection(collection: string, filter: Record<string, any> = {}): () => void {\r\n const key = `${collection}:${JSON.stringify(filter)}`;\r\n\r\n // Return existing unsub if already watching\r\n if (this.collectionUnsubs.has(key)) {\r\n return this.collectionUnsubs.get(key)!;\r\n }\r\n\r\n // First: emit current local cache immediately (offline-first)\r\n this.emitCurrentCollection(collection);\r\n\r\n // Subscribe to realtime\r\n const unsub = this.app.rtdb().subscribeToCollectionRaw(\r\n collection,\r\n async (payload, change) => {\r\n if (change === \"delete\") {\r\n const id = payload?.id || payload?._id;\r\n if (id) await this.handleRemoteDelete(collection, id);\r\n } else {\r\n await this.handleRemoteCreateOrUpdate(collection, payload,change);\r\n }\r\n },\r\n filter\r\n );\r\n\r\n const fullUnsub = () => {\r\n unsub();\r\n this.collectionUnsubs.delete(key);\r\n };\r\n\r\n this.collectionUnsubs.set(key, fullUnsub);\r\n return fullUnsub;\r\n }\r\n\r\n watchDocument(collection: string, id: string): () => void {\r\n const key = this.docKey(collection, id);\r\n\r\n if (this.documentUnsubs.has(key)) {\r\n return this.documentUnsubs.get(key)!;\r\n }\r\n\r\n // Emit local cache immediately\r\n this.emitCurrentDocument(collection, id);\r\n\r\n const unsub = this.app.rtdb().subscribeToDocumentRaw(\r\n collection,\r\n id,\r\n async (payload, change) => {\r\n if (change === \"delete\") {\r\n await this.handleRemoteDelete(collection, id);\r\n } else {\r\n await this.handleRemoteCreateOrUpdate(collection, payload,change);\r\n }\r\n }\r\n );\r\n\r\n const fullUnsub = () => {\r\n unsub();\r\n this.documentUnsubs.delete(key);\r\n };\r\n\r\n this.documentUnsubs.set(key, fullUnsub);\r\n return fullUnsub;\r\n }\r\n\r\n // ===================== INTERNAL HANDLERS =====================\r\n\r\n private async emitCurrentDocument(collection: string, id: string): Promise<void> {\r\n const localDoc = await this.persistence.getDoc(collection, id);\r\n const snapshot = localDoc && localDoc.exists && !localDoc.deleted\r\n ? DocumentSnapshot.fromMap(localDoc.data)\r\n : null;\r\n\r\n this.store.emitDocument(collection, id, snapshot, \"insert\");\r\n }\r\n\r\n private async emitCurrentCollection(collection: string): Promise<void> {\r\n const localDocs = await this.persistence.getCollectionSnapshots(collection);\r\n this.store.emitCollection(collection, localDocs, \"insert\");\r\n }\r\n\r\n private async handleRemoteCreateOrUpdate(collection: string, raw: Record<string, any>,change:string): Promise<void> {\r\n const id = raw.id ?? raw._id;\r\n if (!id) return;\r\n\r\n const saved = await this.persistence.applyRemoteDoc(collection, raw);\r\n if (!saved) return;\r\n\r\n const snap = DocumentSnapshot.fromMap(saved.data);\r\n\r\n // Emit to document listeners\r\n this.store.emitDocument(collection, id, snap, change);\r\n\r\n // Notify collection listeners WITHOUT fetching full collection (performance optimization)\r\n this.store.notifyCollectionChanged(collection, id, change);\r\n }\r\n\r\n private async handleRemoteDelete(collection: string, id: string): Promise<void> {\r\n await this.persistence.applyRemoteDelete(collection, id);\r\n\r\n this.store.emitDocument(collection, id, null, \"delete\");\r\n\r\n // Notify collection listeners WITHOUT fetching full collection\r\n this.store.notifyCollectionChanged(collection, id, \"delete\");\r\n }\r\n\r\n // ===================== LIFECYCLE =====================\r\n\r\n /**\r\n * Call this when Socket.IO reconnects or when going online\r\n * Replays pending mutations + refreshes all active subscriptions from cache\r\n */\r\n async onReconnect(): Promise<void> {\r\n // Future: trigger SyncEngine to process queue\r\n // For now: refresh all watched collections/documents from local cache\r\n for (const [key] of this.collectionUnsubs) {\r\n const collection = key.split(':')[0];\r\n await this.emitCurrentCollection(collection);\r\n }\r\n\r\n for (const [key] of this.documentUnsubs) {\r\n const [collection, id] = key.split(':');\r\n await this.emitCurrentDocument(collection, id);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up all subscriptions (call from EdmaxLabs destructor if needed)\r\n */\r\n dispose(): void {\r\n this.collectionUnsubs.forEach(unsub => unsub());\r\n this.documentUnsubs.forEach(unsub => unsub());\r\n this.collectionUnsubs.clear();\r\n this.documentUnsubs.clear();\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport LocalStore from \"./LocalStore.js\";\r\nimport RealtimeBridge from \"./RealtimeBridge.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\n\r\nexport default class SyncEngine {\r\n private app: EdmaxLabs;\r\n private persistence: Persistence;\r\n private store: LocalStore;\r\n private realtimeBridge: RealtimeBridge | null = null;\r\n\r\n private syncing = false;\r\n private retryTimeout: NodeJS.Timeout | null = null;\r\n private readonly MAX_RETRIES = 5;\r\n private readonly BASE_RETRY_DELAY = 2000;\r\n\r\n constructor(\r\n app: EdmaxLabs,\r\n persistence: Persistence,\r\n store: LocalStore,\r\n realtimeBridge?: RealtimeBridge // optional for now\r\n ) {\r\n this.app = app;\r\n this.persistence = persistence;\r\n this.store = store;\r\n this.realtimeBridge = realtimeBridge || null;\r\n\r\n // Listen for online events\r\n if (typeof window !== \"undefined\") {\r\n window.addEventListener(\"online\", () => this.onNetworkOnline());\r\n // Optional: also listen to visibilitychange for better UX\r\n document.addEventListener(\"visibilitychange\", () => {\r\n if (document.visibilityState === \"visible\") this.onNetworkOnline();\r\n });\r\n }\r\n }\r\n\r\n private onNetworkOnline(): void {\r\n if (this.retryTimeout) {\r\n clearTimeout(this.retryTimeout);\r\n this.retryTimeout = null;\r\n }\r\n this.flush().catch(console.error);\r\n }\r\n\r\n async flush(): Promise<void> {\r\n if (this.syncing) return;\r\n if (typeof navigator !== \"undefined\" && !navigator.onLine) return;\r\n\r\n this.syncing = true;\r\n\r\n try {\r\n const pending = await this.persistence.getPendingMutations();\r\n\r\n for (const mutation of pending) {\r\n if (mutation.retryCount >= this.MAX_RETRIES) {\r\n await this.persistence.setMutationStatus(\r\n mutation.mutationId,\r\n \"failed\",\r\n \"Max retries exceeded\"\r\n );\r\n continue;\r\n }\r\n\r\n await this.persistence.setMutationStatus(mutation.mutationId, \"syncing\");\r\n\r\n try {\r\n let success = false;\r\n\r\n switch (mutation.type) {\r\n case \"insert\":\r\n success = await this.syncCreate(mutation);\r\n break;\r\n case \"update\":\r\n success = await this.syncUpdate(mutation);\r\n break;\r\n case \"delete\":\r\n success = await this.syncDelete(mutation);\r\n break;\r\n case \"array_push\":\r\n case \"array_update\":\r\n case \"array_insert\":\r\n case \"array_remove\":\r\n default:\r\n console.warn(`[EdmaxLabs] Unknown mutation type: ${mutation.type}`);\r\n }\r\n\r\n if (success) {\r\n await this.persistence.removeMutation(mutation.mutationId);\r\n } else {\r\n throw new Error(\"Sync operation failed\");\r\n }\r\n } catch (error: any) {\r\n const nextRetryCount = (mutation.retryCount || 0) + 1;\r\n await this.persistence.setMutationStatus(\r\n mutation.mutationId,\r\n \"failed\",\r\n error?.message ?? \"Unknown insert error\"\r\n );\r\n\r\n // Exponential backoff for next flush\r\n if (nextRetryCount < this.MAX_RETRIES) {\r\n this.scheduleRetry();\r\n }\r\n }\r\n }\r\n\r\n // After successful flush → notify bridge to refresh views\r\n if (this.realtimeBridge) {\r\n await this.realtimeBridge.onReconnect();\r\n }\r\n } finally {\r\n this.syncing = false;\r\n }\r\n }\r\n\r\n private async syncCreate(mutation: any): Promise<boolean> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/create`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: mutation.collection,\r\n data: mutation.payload,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !res.id) return false;\r\n\r\n const oldId = mutation.documentId;\r\n const newId = String(res.id);\r\n\r\n const replaced = await this.persistence.replaceDocId(\r\n mutation.collection,\r\n oldId,\r\n newId\r\n );\r\n\r\n if (replaced) {\r\n const snap = DocumentSnapshot.fromMap(replaced.data);\r\n // Notify document listeners (minimal overhead)\r\n this.store.emitDocument(mutation.collection, oldId, snap, \"insert\");\r\n this.store.emitDocument(mutation.collection, newId, snap, \"insert\");\r\n \r\n // Notify collection listeners WITHOUT fetching full collection\r\n // Listeners can call getCollectionSnapshots() if they need the full list\r\n this.store.notifyCollectionChanged(mutation.collection, newId, \"insert\");\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private async syncUpdate(mutation: any): Promise<boolean> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/update`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: mutation.collection,\r\n document: mutation.documentId,\r\n data: mutation.payload,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success) return false;\r\n\r\n const local = await this.persistence.upsertDoc({\r\n collection: mutation.collection,\r\n id: mutation.documentId,\r\n data: {\r\n ...(res.document ?? mutation.payload ?? {}),\r\n id: mutation.documentId,\r\n },\r\n exists: true,\r\n deleted: false,\r\n pending: 0,\r\n localOnly: false,\r\n status: \"synced\",\r\n lastSyncedAt: this.persistence['now']?.() ?? Date.now(),\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(local.data);\r\n this.store.emitDocument(mutation.collection, mutation.documentId, snap, \"update\");\r\n \r\n // Notify collection listeners WITHOUT fetching full collection\r\n this.store.notifyCollectionChanged(mutation.collection, mutation.documentId, \"update\");\r\n\r\n return true;\r\n }\r\n\r\n private async syncDelete(mutation: any): Promise<boolean> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/delete`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: mutation.collection,\r\n document: mutation.documentId,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success) return false;\r\n\r\n await this.persistence.markDeleted(mutation.collection, mutation.documentId, 0);\r\n\r\n this.store.emitDocument(mutation.collection, mutation.documentId, null, \"delete\");\r\n \r\n // Notify collection listeners WITHOUT fetching full collection\r\n this.store.notifyCollectionChanged(mutation.collection, mutation.documentId, \"delete\");\r\n\r\n return true;\r\n }\r\n\r\n private scheduleRetry(): void {\r\n if (this.retryTimeout) clearTimeout(this.retryTimeout);\r\n\r\n const delay = this.BASE_RETRY_DELAY * Math.pow(1.5, (Math.random() * 0.5)); // jitter\r\n this.retryTimeout = setTimeout(() => {\r\n this.flush().catch(console.error);\r\n }, delay);\r\n }\r\n\r\n // Public method users can call manually if needed\r\n async forceSync(): Promise<void> {\r\n return this.flush();\r\n }\r\n\r\n /**\r\n * Get all failed mutations for error handling/UI\r\n * Returns mutations that exceeded MAX_RETRIES\r\n */\r\n async getFailedMutations(): Promise<any[]> {\r\n const all = await this.persistence.getPendingMutations();\r\n return all.filter((m) => m.status === \"failed\");\r\n }\r\n\r\n /**\r\n * Retry a specific failed mutation by resetting its retry count\r\n * Useful for user-initiated recovery after fixing network/server issues\r\n */\r\n async retryMutation(mutationId: string): Promise<boolean> {\r\n const reset = await this.persistence.resetMutation(mutationId);\r\n if (!reset) return false;\r\n\r\n // Trigger flush immediately\r\n this.flush().catch(console.error);\r\n return true;\r\n }\r\n\r\n /**\r\n * Retry all failed mutations at once\r\n */\r\n async retryAllFailed(): Promise<number> {\r\n const failed = await this.getFailedMutations();\r\n for (const mut of failed) {\r\n await this.persistence.setMutationStatus(mut.mutationId, \"pending\");\r\n }\r\n \r\n if (failed.length > 0) {\r\n this.flush().catch(console.error);\r\n }\r\n \r\n return failed.length;\r\n }\r\n\r\n /**\r\n * Remove a mutation entirely (user acknowledges the failure and wants to discard it)\r\n * Be careful: this means the operation will never sync to the server\r\n */\r\n async removeMutation(mutationId: string): Promise<boolean> {\r\n try {\r\n await this.persistence.removeMutation(mutationId);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n dispose(): void {\r\n if (this.retryTimeout) {\r\n clearTimeout(this.retryTimeout);\r\n }\r\n }\r\n}","export class StorageSnapshot {\r\n id: string;\r\n data: Record<string, any>;\r\n\r\n private constructor(id: string, file: Record<string, any>) {\r\n this.id = id;\r\n this.data = file;\r\n }\r\n\r\n static fromMap(map: Record<string, any>): StorageSnapshot {\r\n const id = map.id ?? map._id ?? \"\";\r\n const document = map.file ?? map.data ?? map;\r\n\r\n return new StorageSnapshot(id, document);\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n id: this.id,\r\n data: this.data,\r\n };\r\n }\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { StorageSnapshot } from \"./StorageSnapshot.js\";\r\nimport FormData from \"form-data\";\r\n\r\nexport default class StorageRef {\r\n app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n async get(id:string): Promise<StorageSnapshot | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.GET,\r\n endpoint: this.app.getBaseUrl() + `/storage/${id}`,\r\n headers: {\r\n //authorization: this.app.getConfig.token,\r\n }\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return undefined;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async getMeta(id:string): Promise<StorageSnapshot | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.GET,\r\n endpoint: this.app.getBaseUrl() + `/storage/${id}/info`,\r\n headers: {\r\n //authorization: this.app.getConfig.token,\r\n }\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return undefined;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async upload(srcFile: File): Promise<StorageSnapshot | null | undefined> {\r\n if (!srcFile) {\r\n throw new Error(\"Invalid File\");\r\n }\r\n console.log(\"SRCF\")\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl() + \"/storage/file/upload\",\r\n headers: { authorization: this.app.getConfig().token,project:this.app.getConfig().project },\r\n file:srcFile,\r\n isMultipart:true\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return undefined;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async delete(id:string): Promise<{ success: boolean; error: string }> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl() + \"/storage/file/delete\",\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n file_id: id,\r\n },\r\n }).sendRequest();\r\n return res;\r\n }\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport StorageRef from \"./StorageRef.js\";\r\n\r\nexport default class Storage {\r\n app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n getStorage(): StorageRef {\r\n return new StorageRef(this.app);\r\n }\r\n}\r\n","const serverURI = \"https://api.edmaxlabs.com/api/v2\";\r\nconst socketURI = \"https://api.edmaxlabs.com\";\r\n\r\nexport { serverURI, socketURI };\r\n","import Authentication from \"../authentication/Authentication.js\";\r\nimport Database from \"../database/Database.js\";\r\nimport Realtime from \"../database/Realtime.js\";\r\nimport Functions from \"../functions/Functions.js\";\r\nimport Hosting from \"../hosting/Hosting.js\";\r\nimport LocalStore from \"../persistence/LocalStore.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport RealtimeBridge from \"../persistence/RealtimeBridge.js\";\r\nimport SyncEngine from \"../persistence/SyncEngine.js\";\r\nimport Storage from \"../storage/Storage.js\";\r\nimport { serverURI, socketURI } from \"../utils/constants.js\";\r\n\r\nexport interface EdmaxLabsConfig {\r\n token: string;\r\n project: string;\r\n app_name?: string; // Used for cache isolation (prevents different users/apps sharing data)\r\n persistence?: boolean;\r\n default_bucket?: string;\r\n}\r\n\r\n\r\nexport default class EdmaxLabs {\r\n static instance: EdmaxLabs | null = null;\r\n\r\n private baseUrl: string;\r\n private socketUrl: string;\r\n\r\n private _db: Database;\r\n private _realtime: Realtime;\r\n private _hosting: Hosting;\r\n private _config: EdmaxLabsConfig;\r\n\r\n // Offline layer (only initialized when persistence: true)\r\n private persistence: Persistence | null = null;\r\n private localStore: LocalStore | null = null;\r\n private syncEngine: SyncEngine | null = null;\r\n private realtimeBridge: RealtimeBridge | null = null;\r\n\r\n constructor(config: EdmaxLabsConfig) {\r\n const { token, project, persistence = false } = config;\r\n\r\n if (!token || !project) {\r\n throw new Error(\"EdmaxLabs: 'token' and 'project' are required in config\");\r\n }\r\n\r\n this.baseUrl = serverURI;\r\n this.socketUrl = socketURI;\r\n this._config = config;\r\n\r\n // Core services\r\n this._db = new Database(this);\r\n this._realtime = new Realtime(this);\r\n this._hosting = new Hosting(this);\r\n\r\n // Offline-first layer (non-breaking)\r\n if (persistence) {\r\n const appName = config.app_name || config.project; // Fallback to project for backward compatibility\r\n this.persistence = new Persistence(appName);\r\n this.localStore = new LocalStore();\r\n this.realtimeBridge = new RealtimeBridge(this, this.persistence, this.localStore);\r\n\r\n // Important: Pass realtimeBridge to SyncEngine\r\n this.syncEngine = new SyncEngine(\r\n this,\r\n this.persistence,\r\n this.localStore,\r\n this.realtimeBridge\r\n );\r\n }\r\n }\r\n\r\n // ===================== PUBLIC API =====================\r\n\r\n /** Recommended for most React apps (creates fresh instance) */\r\n static create(config: EdmaxLabsConfig): EdmaxLabs {\r\n return new EdmaxLabs(config);\r\n }\r\n\r\n /** Firebase-style singleton (kept for backward compatibility) */\r\n static initialize(config: EdmaxLabsConfig): EdmaxLabs {\r\n if (!EdmaxLabs.instance) {\r\n EdmaxLabs.instance = new EdmaxLabs(config);\r\n }\r\n return EdmaxLabs.instance;\r\n }\r\n\r\n // ===================== CLEAN GETTERS =====================\r\n\r\n get getDatabase(): Database {\r\n return this._db;\r\n }\r\n\r\n get getFunctions(): Functions {\r\n return new Functions(this);\r\n }\r\n\r\n get getStorage(): Storage {\r\n return new Storage(this);\r\n }\r\n\r\n get getAuthentication(): Authentication {\r\n if (!Authentication.instance) {\r\n Authentication.instance = new Authentication();\r\n }\r\n return Authentication.instance!;\r\n }\r\n\r\n // ===================== OFFLINE UTILITIES =====================\r\n\r\n /** Check if offline features are enabled */\r\n get isOfflineEnabled(): boolean {\r\n return !!this.persistence;\r\n }\r\n\r\n /** Get current storage usage (approximate) */\r\n async getStorageUsage(): Promise<{ used: number; available: number } | null> {\r\n if (!this.persistence) return null;\r\n try {\r\n const usage = await this.persistence.getStorageUsage();\r\n // Estimate available (IndexedDB typically has 50MB-1GB limits)\r\n return { used: usage, available: 50 * 1024 * 1024 }; // 50MB estimate\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Clear all cached data (nuclear option) */\r\n async clearCache(): Promise<void> {\r\n if (this.persistence) {\r\n await this.persistence.clearAll();\r\n }\r\n this.localStore?.clearAllListeners();\r\n }\r\n\r\n /** New clean offline namespace - highly recommended */\r\n offline() {\r\n return {\r\n persistence: this.persistence,\r\n localStore: this.localStore,\r\n syncEngine: this.syncEngine,\r\n realtimeBridge: this.realtimeBridge,\r\n enabled: !!this.persistence,\r\n // Add cleanup utilities\r\n clearListeners: () => this.localStore?.clearAllListeners(),\r\n getListenerCount: () => this.localStore?.listenerCount || { documents: 0, collections: 0 },\r\n } as const;\r\n }\r\n\r\n /**\r\n * Manually trigger sync of pending mutations\r\n * Useful for progressive sync or after network restoration\r\n */\r\n async sync(): Promise<void> {\r\n if (!this.syncEngine) {\r\n console.warn(\"[EdmaxLabs] Sync called but persistence is not enabled\");\r\n return;\r\n }\r\n return this.syncEngine.forceSync();\r\n }\r\n\r\n /**\r\n * Get mutations that failed to sync (for error UI)\r\n */\r\n async getFailedMutations() {\r\n if (!this.syncEngine) return [];\r\n return this.syncEngine.getFailedMutations();\r\n }\r\n\r\n /**\r\n * Retry all failed mutations\r\n */\r\n async retrySync(): Promise<number> {\r\n if (!this.syncEngine) return 0;\r\n return this.syncEngine.retryAllFailed();\r\n }\r\n\r\n // Internal access (for internal classes only)\r\n getConfig(): EdmaxLabsConfig {\r\n return { ...this._config }; // return copy to prevent mutation\r\n }\r\n\r\n getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n getSocketUrl(): string {\r\n return this.socketUrl;\r\n }\r\n\r\n rtdb(): Realtime {\r\n return this._realtime;\r\n }\r\n\r\n // ===================== LIFECYCLE =====================\r\n\r\n /** Call this when your app unmounts or user logs out */\r\n dispose(): void {\r\n this._realtime.dispose?.();\r\n this.syncEngine?.dispose?.();\r\n this.realtimeBridge?.dispose?.();\r\n\r\n if (EdmaxLabs.instance === this) {\r\n EdmaxLabs.instance = null;\r\n }\r\n }\r\n}","export interface TimestampData {\r\n seconds: number;\r\n nanoseconds: number;\r\n}\r\n\r\nexport interface TimestampJSON {\r\n _type: \"timestamp\";\r\n seconds: number;\r\n nanoseconds: number;\r\n}\r\n\r\nexport class Timestamp implements TimestampData {\r\n seconds: number;\r\n nanoseconds: number;\r\n\r\n constructor(seconds: number, nanoseconds: number = 0) {\r\n this.seconds = seconds;\r\n this.nanoseconds = nanoseconds;\r\n }\r\n\r\n static now(): Timestamp {\r\n return Timestamp.fromMillis(Date.now());\r\n }\r\n\r\n static fromDate(date: Date): Timestamp {\r\n return new Timestamp(\r\n Math.floor(date.getTime() / 1000),\r\n (date.getTime() % 1000) * 1e6,\r\n );\r\n }\r\n\r\n static fromMillis(ms: number): Timestamp {\r\n return new Timestamp(Math.floor(ms / 1000), (ms % 1000) * 1e6);\r\n }\r\n\r\n static fromMongo(dateObj: Date): Timestamp {\r\n return Timestamp.fromMillis(dateObj.getTime());\r\n }\r\n\r\n static fromJSON(obj: Record<string, number>): Timestamp {\r\n return new Timestamp(obj.seconds, obj.nanoseconds);\r\n }\r\n\r\n toDate(): Date {\r\n return new Date(this.toMillis());\r\n }\r\n\r\n toMillis(): number {\r\n return this.seconds * 1000 + Math.floor(this.nanoseconds / 1e6);\r\n }\r\n\r\n sinceEpoch(): number {\r\n return this.seconds;\r\n }\r\n\r\n toMongo(): Date {\r\n return new Date(this.toMillis());\r\n }\r\n\r\n format(pattern: string = \"dd-MM-yyyy HH:mm:ss\"): string {\r\n const d = this.toDate();\r\n\r\n const monthsShort = [\r\n \"Jan\",\r\n \"Feb\",\r\n \"Mar\",\r\n \"Apr\",\r\n \"May\",\r\n \"Jun\",\r\n \"Jul\",\r\n \"Aug\",\r\n \"Sep\",\r\n \"Oct\",\r\n \"Nov\",\r\n \"Dec\",\r\n ];\r\n\r\n const monthsLong = [\r\n \"January\",\r\n \"February\",\r\n \"March\",\r\n \"April\",\r\n \"May\",\r\n \"June\",\r\n \"July\",\r\n \"August\",\r\n \"September\",\r\n \"October\",\r\n \"November\",\r\n \"December\",\r\n ];\r\n\r\n // Calculate 12-hour format and AM/PM\r\n const hours = d.getHours();\r\n const hours12 = hours % 12 === 0 ? 12 : hours % 12;\r\n const ampm = hours < 12 ? \"AM\" : \"PM\";\r\n\r\n const map: { [key: string]: string | number } = {\r\n dd: String(d.getDate()).padStart(2, \"0\"),\r\n MM: String(d.getMonth() + 1).padStart(2, \"0\"),\r\n yyyy: d.getFullYear(),\r\n HH: String(d.getHours()).padStart(2, \"0\"),\r\n mm: String(d.getMinutes()).padStart(2, \"0\"),\r\n ss: String(d.getSeconds()).padStart(2, \"0\"),\r\n SSS: String(d.getMilliseconds()).padStart(3, \"0\"),\r\n MMM: monthsShort[d.getMonth()],\r\n MMMM: monthsLong[d.getMonth()],\r\n a: ampm.toLowerCase(), // am/pm\r\n A: ampm, // AM/PM\r\n };\r\n\r\n // Order matters — match longest tokens first\r\n return pattern.replace(/MMMM|MMM|dd|MM|yyyy|HH|mm|ss|SSS|a|A/g, (match) =>\r\n String(map[match]),\r\n );\r\n }\r\n\r\n compare(other: Timestamp): number {\r\n if (this.seconds !== other.seconds) {\r\n return this.seconds - other.seconds;\r\n }\r\n return this.nanoseconds - other.nanoseconds;\r\n }\r\n\r\n relative(fmt: string = \"dd-MM-yyyy HH:mm:ss\"): string {\r\n const now = Date.now();\r\n const diff = now - this.toMillis();\r\n\r\n const sec = Math.floor(diff / 1000);\r\n if (sec < 60) return `${sec}s ago`;\r\n\r\n const min = Math.floor(sec / 60);\r\n if (min < 60) return `${min}m ago`;\r\n\r\n const hrs = Math.floor(min / 60);\r\n if (hrs < 24) return `${hrs}h ago`;\r\n\r\n const days = Math.floor(hrs / 24);\r\n if (days < 3) return `${days}d ago`;\r\n\r\n return this.format(fmt);\r\n }\r\n\r\n add({\r\n seconds = 0,\r\n minutes = 0,\r\n hours = 0,\r\n days = 0,\r\n }: {\r\n seconds?: number;\r\n minutes?: number;\r\n hours?: number;\r\n days?: number;\r\n }): Timestamp {\r\n const totalMs =\r\n seconds * 1000 + minutes * 60000 + hours * 3600000 + days * 86400000;\r\n\r\n return Timestamp.fromMillis(this.toMillis() + totalMs);\r\n }\r\n\r\n weekdayName(): string {\r\n return [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"][\r\n this.toDate().getDay()\r\n ];\r\n }\r\n\r\n toJSON(): TimestampJSON {\r\n return {\r\n _type: \"timestamp\",\r\n seconds: this.seconds,\r\n nanoseconds: this.nanoseconds,\r\n };\r\n }\r\n\r\n toString(): string {\r\n return this.format(\"yyyy-MM-dd HH:mm:ss\");\r\n }\r\n}\r\n","import { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport class ArraySnapshot {\r\n id?: string;\r\n data: Record<string, any>;\r\n dt: Timestamp;\r\n\r\n private constructor(\r\n id: string = \"\",\r\n index: number,\r\n data: Record<string, any>,\r\n dt?: Timestamp,\r\n ) {\r\n this.data = data;\r\n this.id = id;\r\n this.dt = dt ?? Timestamp.now();\r\n }\r\n\r\n static fromMap(map: Record<string, any>): ArraySnapshot {\r\n const index = map.index ?? map.index ?? -1;\r\n const id = map.id ?? map._id ?? \"\";\r\n const document = map.data ?? map.document ?? map;\r\n return new ArraySnapshot(id, index, document);\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n id: this.id ?? \"\",\r\n data: this.data,\r\n dt: this.dt,\r\n };\r\n }\r\n}\r\n"],"mappings":"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","names":["response","document","document","localUnsub","target","document","document"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/authentication/Credentials.ts","../src/utils/HttpsRequest.ts","../src/authentication/Authentication.ts","../src/database/DocumentSnapshot.ts","../src/utils/documentNomalizer.ts","../src/database/DocumentRef.ts","../src/database/Query.ts","../src/utils/constants.ts","../src/database/CollectionRef.ts","../src/database/Batch.ts","../src/database/Database.ts","../src/database/Realtime.ts","../src/utils/uuid.ts","../src/functions/Functions.ts","../src/hosting/Hosting.ts","../src/persistence/LocalStore.ts","../../../../../node_modules/idb/build/wrap-idb-value.js","../../../../../node_modules/idb/build/index.js","../src/persistence/Persistence.ts","../src/persistence/RealtimeBridge.ts","../src/persistence/SyncEngine.ts","../src/storage/StorageSnapshot.ts","../src/storage/StorageRef.ts","../src/core/EdmaxLabs.ts","../src/database/Timestamp.ts","../src/database/ArraySnapshot.ts"],"sourcesContent":["import EdmaxLabs, { EdmaxLabsConfig } from \"./core/EdmaxLabs.js\";\r\nimport { ArraySnapshot } from \"./database/ArraySnapshot.js\";\r\nimport { DocumentSnapshot } from \"./database/DocumentSnapshot.js\";\r\nimport { StorageSnapshot } from \"./storage/StorageSnapshot.js\";\r\nimport { Credentials, DisplayInfo } from \"./authentication/Credentials.js\";\r\nimport { Timestamp } from \"./database/Timestamp.js\";\r\nimport Authentication from \"./authentication/Authentication.js\";\r\n\r\nexport default EdmaxLabs;\r\nexport {\r\n DocumentSnapshot,\r\n StorageSnapshot,\r\n ArraySnapshot,\r\n Timestamp,\r\n Credentials,\r\n DisplayInfo,\r\n Authentication,\r\n EdmaxLabsConfig\r\n};\r\n","import { Timestamp } from \"../database/Timestamp.js\";\r\n\r\nexport interface DisplayInfo {\r\n firstname: string;\r\n lastname: string;\r\n surname: string;\r\n profile: string;\r\n email: string;\r\n phone: string;\r\n}\r\n\r\nexport class Credentials {\r\n uid: string;\r\n displayInfo: DisplayInfo;\r\n logged: boolean;\r\n createdAt: Timestamp;\r\n updatedAt: Timestamp;\r\n lastLogged: Timestamp;\r\n\r\n private constructor(\r\n uid: string,\r\n displayInfo: DisplayInfo,\r\n createdAt: Timestamp,\r\n updatedAt: Timestamp,\r\n lastLogged: Timestamp,\r\n logged?:boolean\r\n ) {\r\n this.uid = uid;\r\n this.displayInfo = displayInfo;\r\n this.createdAt = createdAt;\r\n this.updatedAt = updatedAt;\r\n this.lastLogged = lastLogged;\r\n this.logged = logged === true;\r\n }\r\n\r\n static fromMap(map: Record<string, any>): Credentials {\r\n const uid = map.id ?? map.uid ?? \"\";\r\n const data = map.data ?? map;\r\n\r\n const d_info = data.displayInfo;\r\n const createdAt = data.createdAt;\r\n const updatedAt = data.updatedAt;\r\n const lastLogged = data.lastLogged;\r\n const logged = data.logged;\r\n\r\n const result = new Credentials(\r\n uid,\r\n d_info,\r\n createdAt,\r\n updatedAt,\r\n lastLogged,\r\n logged\r\n );\r\n\r\n //console.log(\"Parsing :|\", map);\r\n // console.log(\"Parsed :|\", result.toMap());\r\n\r\n return result;\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n uid: this.uid,\r\n displayInfo: this.displayInfo,\r\n createdAt: this.createdAt,\r\n updatedAt: this.updatedAt,\r\n lastLogged: this.lastLogged,\r\n logged:this.logged\r\n };\r\n }\r\n}\r\n","export enum HttpMethod {\r\n GET = \"GET\",\r\n POST = \"POST\",\r\n PUT = \"PUT\",\r\n DELETE = \"DELETE\",\r\n}\r\n\r\nexport class HttpsRequest {\r\n method: HttpMethod;\r\n endpoint: string;\r\n headers: Record<string, string>;\r\n body: Record<string, any>;\r\n file?: File;\r\n isMultipart?: boolean;\r\n\r\n constructor({\r\n method,\r\n endpoint,\r\n headers = {},\r\n body = {},\r\n file,\r\n isMultipart = false,\r\n }: {\r\n method: HttpMethod;\r\n endpoint: string;\r\n headers?: Record<string, string>;\r\n body?: Record<string, any>;\r\n file?: File;\r\n isMultipart?: boolean;\r\n }) {\r\n this.method = method;\r\n this.endpoint = endpoint;\r\n this.headers = headers;\r\n this.body = body;\r\n this.file = file;\r\n this.isMultipart = isMultipart;\r\n }\r\n\r\n async sendRequest(): Promise<any> {\r\n try {\r\n if (this.isMultipart && this.file) {\r\n const formData = new FormData();\r\n\r\n Object.entries(this.body).forEach(([key, value]) => {\r\n formData.append(key, value);\r\n });\r\n\r\n formData.append(\"file\", this.file);\r\n\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: this.headers,\r\n body: formData,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => \"Network error\");\r\n throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n }\r\n\r\n return await response.json().catch(() => ({}));\r\n }\r\n\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...this.headers,\r\n },\r\n body: this.method !== HttpMethod.GET ? JSON.stringify(this.body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text().catch(() => \"Network error\");\r\n throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n }\r\n\r\n return await response.json().catch(() => ({}));\r\n } catch (error: any) {\r\n // Enhanced error handling\r\n if (error.name === 'TypeError' && error.message.includes('fetch')) {\r\n throw new Error(\"Network connection failed. Please check your internet connection.\");\r\n }\r\n if (error.name === 'AbortError') {\r\n throw new Error(\"Request was cancelled.\");\r\n }\r\n // Re-throw with more context\r\n throw error;\r\n }\r\n }\r\n}\r\n","import EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport { Credentials } from \"./Credentials.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\ntype Listener<T = any> = (value: T) => void;\r\ntype Resolver<T = any> = (value: T) => void;\r\n\r\nexport default class Authentication {\r\n static instance: Authentication | null = null;\r\n\r\n private eUser?: Credentials | null;\r\n private client?: EdmaxLabs | null;\r\n private app?: EdmaxLabs | null;\r\n\r\n\r\n private eventListeners = new Map<string, Listener[]>();\r\n private eventWaiters = new Map<string, Resolver[]>();\r\n private unsubscribers = new Set<() => void>();\r\n\r\n constructor() {\r\n if (Authentication.instance) return Authentication.instance;\r\n\r\n this.client = EdmaxLabs.instance!;\r\n this.app = new EdmaxLabs({\r\n token: 'auth',\r\n project: '6922d5982b23ae6a12e51d85',\r\n });\r\n\r\n Authentication.instance = this;\r\n this.restoreSession();\r\n }\r\n\r\n private isSameCredentials = (\r\n a?: Credentials | null,\r\n b?: Credentials | null\r\n) => {\r\n if (!a && !b) return true;\r\n if (!a || !b) return false;\r\n\r\n return JSON.stringify(a.toMap()) === JSON.stringify(b.toMap());\r\n };\r\n\r\n private restoreSession() {\r\n const saved = this.currentUser();\r\n if (saved) {\r\n this.eUser = saved;\r\n this.emitValue(\"creds\", saved);\r\n }\r\n }\r\n\r\n // Better singleton\r\n static getInstance(): Authentication {\r\n if (!Authentication.instance) {\r\n Authentication.instance = new Authentication();\r\n }\r\n return Authentication.instance;\r\n }\r\n\r\n emitValue<T>(key: string, value: T) {\r\n const listeners = this.eventListeners.get(key) || [];\r\n listeners.forEach((l) => l(value));\r\n\r\n const waiters = this.eventWaiters.get(key) || [];\r\n waiters.forEach((resolve) => resolve(value));\r\n this.eventWaiters.delete(key);\r\n }\r\n\r\n onValue<T>(key: string, callback: Listener<T>): () => void {\r\n const listeners = this.eventListeners.get(key) || [];\r\n listeners.push(callback as Listener);\r\n this.eventListeners.set(key, listeners);\r\n\r\n return () => {\r\n const filtered = listeners.filter((cb) => cb !== callback);\r\n this.eventListeners.set(key, filtered);\r\n };\r\n }\r\n\r\n currentUser(): Credentials | null {\r\n const data = localStorage.getItem(\"eauth\");\r\n if (!data) return null;\r\n try {\r\n return Credentials.fromMap(JSON.parse(data));\r\n } catch {\r\n localStorage.removeItem(\"eauth\");\r\n return null;\r\n }\r\n }\r\n\r\n private saveCredentials(credentials: Credentials | null) {\r\n if (!credentials) {\r\n localStorage.removeItem(\"eauth\");\r\n this.eUser = null;\r\n this.emitValue(\"creds\", null);\r\n return;\r\n }\r\n\r\n localStorage.setItem(\"eauth\", JSON.stringify(credentials.toMap()));\r\n this.eUser = credentials;\r\n this.emitValue(\"creds\", credentials);\r\n }\r\n\r\n // Main auth state listener - should be called ONCE at app root\r\n authState({\r\n onChange,\r\n onSignOut,\r\n onDeleted,\r\n }: {\r\n onChange: (user: Credentials) => void;\r\n onSignOut?: () => void;\r\n onDeleted?: () => void;\r\n }) {\r\n let userDocUnsubscribe: (() => void) | undefined;\r\n\r\n const handleCredsChange = (creds: Credentials | null) => {\r\n if (userDocUnsubscribe) {\r\n userDocUnsubscribe();\r\n userDocUnsubscribe = undefined;\r\n }\r\n\r\n if (!creds) {\r\n this.eUser = null;\r\n onSignOut?.();\r\n return;\r\n }\r\n\r\n const userRef = this.app?.getDatabase.collection(\"users\").doc(creds.uid);\r\n if (!userRef) return;\r\n\r\n userDocUnsubscribe = userRef.onSnapshot(\r\n (snapshot: DocumentSnapshot | null, change: string) => {\r\n console.log(snapshot);\r\n if (change === \"delete\") {\r\n this.saveCredentials(null);\r\n onSignOut?.();\r\n onDeleted?.();\r\n return;\r\n }\r\n\r\n if (change === \"insert\" || change === \"update\") {\r\n if (!snapshot) return;\r\n if (snapshot.data.logged === false || snapshot.data.logged === \"false\") {\r\n this.saveCredentials(null);\r\n onSignOut?.();\r\n return;\r\n }\r\n\r\n const newCreds = Credentials.fromMap(snapshot.toMap());\r\n\r\n if (!this.isSameCredentials(this.eUser, newCreds)) {\r\n this.eUser = newCreds;\r\n this.saveCredentials(newCreds); // this will also emit\r\n onChange(newCreds);\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n // Initial state\r\n const initialUser = this.currentUser();\r\n if (initialUser) {\r\n this.eUser = initialUser;\r\n onChange(initialUser);\r\n }\r\n handleCredsChange(initialUser);\r\n\r\n // Listen to future credential changes (login/logout from other tabs, etc.)\r\n const credsUnsub = this.onValue<Credentials | null>(\"creds\", handleCredsChange);\r\n\r\n return () => {\r\n credsUnsub();\r\n userDocUnsubscribe?.();\r\n };\r\n }\r\n\r\n createUserWithEmailAndPassword = async ({\r\n email,\r\n password,\r\n }: {\r\n email: string;\r\n password: string;\r\n }): Promise<Credentials | null> => {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n const app = this.app?.getDatabase;\r\n\r\n //check if email already exists\r\n const data = await app\r\n ?.collection(\"users\")\r\n .query.where({\r\n key: \"email\",\r\n op: \"===\",\r\n value: email,\r\n })\r\n .get();\r\n\r\n if (data!.length > 0) {\r\n throw new Error(\"Email Already In Use.\");\r\n }\r\n\r\n const userRef = await app?.collection(\"users\").add({\r\n email,\r\n password,\r\n logged: true,\r\n lastLogged: Date.now(),\r\n displayInfo: {\r\n firstname: email.split('@')[0],\r\n lastname: \"\",\r\n surname: \"\",\r\n profile: \"./logo.png\",\r\n email: email,\r\n phone:\"\"\r\n }\r\n });\r\n\r\n if (!userRef?.id || userRef?.id === \"\") {\r\n throw new Error(\"Something went wrong try Again.\");\r\n }\r\n\r\n this.eUser = Credentials.fromMap(userRef);\r\n this.saveCredentials(this.eUser);\r\n return Credentials.fromMap(userRef.toMap());\r\n };\r\n\r\n signInWithEmailAndPassword = async ({\r\n email,\r\n password,\r\n }: {\r\n email: string;\r\n password: string;\r\n }): Promise<Credentials | null> => {\r\n const app = this.app?.getDatabase;\r\n\r\n const data = await app\r\n ?.collection(\"users\")\r\n .query.where({\r\n key: \"email\",\r\n op: \"===\",\r\n value: email,\r\n })\r\n .where({\r\n key: \"password\",\r\n op: \"===\",\r\n value: password,\r\n })\r\n .get();\r\n\r\n if (data === undefined) {\r\n throw new Error(\"Auth Failed.\");\r\n }\r\n\r\n if (data?.length === 0) {\r\n throw new Error(\"User Not Found.\");\r\n }\r\n\r\n const _data = data[0];\r\n \r\n await app?.collection(\"users\").doc(_data.id).update({\r\n logged: true,\r\n lastLogged: Date.now(),\r\n });\r\n\r\n this.eUser = Credentials.fromMap(_data);\r\n this.saveCredentials(this.eUser);\r\n\r\n return Credentials.fromMap(_data);\r\n };\r\n\r\n deleteUser = async () => {\r\n if (!this.eUser) {\r\n throw new Error(\"No User Signed in\");\r\n }\r\n\r\n const app = this.app?.getDatabase;\r\n const userRef = await app?.collection(\"users\").doc(this.eUser.uid).delete();\r\n\r\n if (userRef) {\r\n throw new Error(\"Something went wrong try Again.\");\r\n }\r\n\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n };\r\n\r\n signOut = async () => {\r\n const app = this.app?.getDatabase;\r\n const luid = this.currentUser();\r\n\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n\r\n if (luid)\r\n await app?.collection(\"users\").doc(luid?.uid).update({\r\n logged: false,\r\n lastLogged: Date.now(),\r\n });\r\n return;\r\n };\r\n\r\n rules = async (\r\n path: string,\r\n context: Record<string, any>,\r\n ): Promise<{ success: boolean; allowed: any }> => {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.client!.getBaseUrl() + \"/auth/rules/verify\",\r\n headers: {\r\n authorization: this.client!.getConfig().token,\r\n project:this.client!.getConfig().project\r\n },\r\n body: {\r\n path,\r\n context: context\r\n },\r\n }).sendRequest();\r\n\r\n return res as { success: boolean; allowed: any };\r\n };\r\n}\r\n","export class DocumentSnapshot {\r\n id: string;\r\n data: Record<string, any>;\r\n\r\n private constructor(id: string, doc: Record<string, any>) {\r\n this.id = id;\r\n this.data = doc;\r\n }\r\n\r\n static fromMap(map: Record<string, any>): DocumentSnapshot {\r\n const id = map.id ?? map._id ?? \"\";\r\n const document = map.document ?? map.documents ?? map.data ?? map;\r\n\r\n return new DocumentSnapshot(id, document);\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n id: this.id,\r\n data: this.data,\r\n };\r\n }\r\n}\r\n","export function normalizePayload(payload: any) {\r\n const raw = payload?.document ?? payload?.data ?? payload;\r\n if (!raw) return null;\r\n\r\n const doc = { ...raw };\r\n doc.id = payload.id ?? payload._id;\r\n delete doc._id;\r\n\r\n return {\r\n change: payload?.change ?? raw?.change ?? null,\r\n data: doc,\r\n };\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport SyncEngine from \"../persistence/SyncEngine.js\";\r\nimport LocalStore from \"../persistence/LocalStore.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\n/**\r\n * Basic input validation for document data\r\n */\r\nfunction validateDocumentData(data: any, operation: string): void {\r\n if (data === null || data === undefined) {\r\n throw new Error(`${operation}: data cannot be null or undefined`);\r\n }\r\n if (typeof data !== 'object' || Array.isArray(data)) {\r\n throw new Error(`${operation}: data must be a plain object`);\r\n }\r\n\r\n const reservedFields = ['_id', '_createdAt', '_updatedAt', '_deleted','_v','_s'];\r\n for (const field of reservedFields) {\r\n if (field in data) {\r\n throw new Error(`${operation}: '${field}' is a reserved field and cannot be set manually`);\r\n }\r\n }\r\n\r\n // try {\r\n // const size = JSON.stringify(data).length;\r\n // if (size > 1024 * 1024) {\r\n // throw new Error(`${operation}: document too large (max 1MB)`);\r\n // }\r\n // } catch {\r\n // throw new Error(`${operation}: data contains circular references`);\r\n // }\r\n}\r\n\r\nexport default class DocumentRef {\r\n private app: EdmaxLabs;\r\n readonly collection: string;\r\n readonly id: string;\r\n\r\n private persistence: Persistence | null;\r\n private syncEngine: SyncEngine | null;\r\n private localStore: LocalStore | null;\r\n\r\n private _isUpdating = false;\r\n\r\n constructor(app: EdmaxLabs, collection: string, id: string) {\r\n this.app = app;\r\n this.collection = collection;\r\n this.id = id;\r\n this.persistence = app.offline().persistence;\r\n this.syncEngine = app.offline().syncEngine;\r\n this.localStore = app.offline().localStore;\r\n }\r\n\r\n // ====================== GET ======================\r\n async get(): Promise<DocumentSnapshot | null> {\r\n // Offline-first\r\n if (this.persistence) {\r\n try {\r\n const localSnap = await this.persistence.getDocSnapshot(this.collection, this.id);\r\n if (localSnap) return localSnap;\r\n } catch (error) {\r\n console.error(\"[EdmaxLabs] Cache read error:\", error);\r\n }\r\n }\r\n\r\n // Direct server call (no recursion)\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/read`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: {\r\n collection: this.collection,\r\n id: this.id,\r\n single: true\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !res.document) return null;\r\n\r\n return DocumentSnapshot.fromMap(res.document);\r\n } catch (error) {\r\n console.error(`[DocumentRef] get(${this.collection}/${this.id}) failed:`, error);\r\n return null;\r\n }\r\n }\r\n\r\n // ====================== UPDATE ======================\r\n async update(data: Record<string, any>): Promise<DocumentSnapshot | null> {\r\n if (this._isUpdating) {\r\n console.warn(`[DocumentRef] update recursion blocked on ${this.collection}/${this.id}`);\r\n return null;\r\n }\r\n\r\n this._isUpdating = true;\r\n\r\n try {\r\n validateDocumentData(data, 'DocumentRef.update');\r\n\r\n if (!this.persistence) {\r\n // Pure online path\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/update`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, id: this.id, data },\r\n }).sendRequest();\r\n\r\n return res?.success ? DocumentSnapshot.fromMap({ ...data, id: this.id }) : null;\r\n }\r\n\r\n // Offline-first path\r\n const old = await this.persistence.getDoc(this.collection, this.id);\r\n if (!old || old.deleted) return null;\r\n\r\n const mergedData = { ...old.data, ...data, id: this.id };\r\n\r\n const updated = await this.persistence.upsertDoc({\r\n collection: this.collection,\r\n id: this.id,\r\n data: mergedData,\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: old.localOnly,\r\n status: \"pending\",\r\n revision: old.revision,\r\n lastSyncedAt: old.lastSyncedAt,\r\n });\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: this.id,\r\n type: \"update\",\r\n payload: data,\r\n baseRevision: old.revision,\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(updated.data);\r\n\r\n this.localStore?.emitDocument(this.collection, this.id, snap, \"update\");\r\n this.localStore?.notifyCollectionChanged(this.collection, this.id, \"update\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return snap;\r\n } finally {\r\n this._isUpdating = false;\r\n }\r\n }\r\n\r\n // ====================== SET ======================\r\n async set(data: Record<string, any>): Promise<DocumentSnapshot | null> {\r\n validateDocumentData(data, 'DocumentRef.set');\r\n\r\n if (!this.persistence) {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/create`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, data: { ...data, id: this.id } },\r\n }).sendRequest();\r\n\r\n return res?.success ? DocumentSnapshot.fromMap({ ...data, id: this.id }) : null;\r\n }\r\n\r\n const updated = await this.persistence.upsertDoc({\r\n collection: this.collection,\r\n id: this.id,\r\n data: { ...data, id: this.id },\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: false,\r\n status: \"pending\",\r\n });\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: this.id,\r\n type: \"insert\",\r\n payload: data,\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(updated.data);\r\n\r\n this.localStore?.emitDocument(this.collection, this.id, snap, \"update\");\r\n this.localStore?.notifyCollectionChanged(this.collection, this.id, \"update\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return snap;\r\n }\r\n\r\n // ====================== DELETE ======================\r\n async delete(): Promise<boolean> {\r\n if (this.persistence) {\r\n await this.persistence.markDeleted(this.collection, this.id, 1);\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: this.id,\r\n type: \"delete\",\r\n payload: null,\r\n });\r\n\r\n this.localStore?.emitDocument(this.collection, this.id, null, \"empty\");\r\n this.localStore?.notifyCollectionChanged(this.collection, this.id, \"delete\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return true;\r\n }\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/delete`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, id: this.id },\r\n }).sendRequest();\r\n\r\n return !!res?.success;\r\n }\r\n\r\n // ====================== SNAPSHOT ======================\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot | null, change: string) => void\r\n ): () => void {\r\n if (this.persistence && this.localStore && this.app.offline().realtimeBridge) {\r\n this.app.offline().realtimeBridge?.watchDocument(this.collection, this.id);\r\n return this.localStore.subscribeToDocument(this.collection, this.id, callback) || (() => {});\r\n }\r\n\r\n // Online-only realtime\r\n return this.app.rtdb().subscribeToDocumentRaw(this.collection, this.id, (snapshot, change) => {\r\n const res = normalizePayload(snapshot);\r\n callback(DocumentSnapshot.fromMap(res?.data), change);\r\n });\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport LocalStore, { CollectionListener } from \"../persistence/LocalStore.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\nexport type FilterExpression = {\r\n key: string;\r\n op: \"==\" | \"===\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"in\" | \"nin\" | \"contains\";\r\n value: any;\r\n};\r\n\r\nexport default class Query {\r\n private app: EdmaxLabs;\r\n private collection: string;\r\n private filter: FilterExpression[] = [];\r\n private localStore: LocalStore | null;\r\n \r\n\r\n constructor(app: EdmaxLabs, collection: string) {\r\n this.app = app;\r\n this.collection = collection;\r\n this.localStore = app.offline().localStore;\r\n\r\n }\r\n\r\n where(expression: FilterExpression): Query {\r\n this.filter.push(expression);\r\n return this;\r\n }\r\n\r\n private buildFilter(): Record<string, any> {\r\n const mongoFilter: Record<string, any> = {};\r\n\r\n this.filter.forEach(({ key, op, value }) => {\r\n switch (op) {\r\n case \"==\":\r\n case \"===\":\r\n mongoFilter[key] = { $eq: value };\r\n break;\r\n case \"!=\":\r\n mongoFilter[key] = { $ne: value };\r\n break;\r\n case \"<\":\r\n mongoFilter[key] = { $lt: value };\r\n break;\r\n case \"<=\":\r\n mongoFilter[key] = { $lte: value };\r\n break;\r\n case \">\":\r\n mongoFilter[key] = { $gt: value };\r\n break;\r\n case \">=\":\r\n mongoFilter[key] = { $gte: value };\r\n break;\r\n case \"in\":\r\n mongoFilter[key] = { $in: value };\r\n break;\r\n case \"nin\":\r\n mongoFilter[key] = { $nin: value };\r\n break;\r\n case \"contains\":\r\n mongoFilter[key] = { $regex: value, $options: \"i\" }; // case-insensitive bonus\r\n break;\r\n default:\r\n throw new Error(`Unknown operator: ${op}`);\r\n }\r\n });\r\n\r\n return mongoFilter;\r\n }\r\n\r\n private matchesFilter(document: Record<string, any>, { key, op, value }: FilterExpression): boolean {\r\n const fieldValue = document[key];\r\n\r\n switch (op) {\r\n case \"==\":\r\n case \"===\":\r\n return fieldValue === value;\r\n case \"!=\":\r\n return fieldValue !== value;\r\n case \"<\":\r\n return fieldValue < value;\r\n case \"<=\":\r\n return fieldValue <= value;\r\n case \">\":\r\n return fieldValue > value;\r\n case \">=\":\r\n return fieldValue >= value;\r\n case \"in\":\r\n return Array.isArray(value) && value.includes(fieldValue);\r\n case \"nin\":\r\n return Array.isArray(value) && !value.includes(fieldValue);\r\n case \"contains\":\r\n if (fieldValue == null) return false;\r\n return String(fieldValue).toLowerCase().includes(String(value).toLowerCase());\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private filterDocuments(docs: DocumentSnapshot[]): DocumentSnapshot[] {\r\n if (this.filter.length === 0) return docs;\r\n return docs.filter((snapshot) =>\r\n this.filter.every((expression) =>\r\n this.matchesFilter(snapshot.data, expression)\r\n )\r\n );\r\n }\r\n\r\n private async getLocalFilteredSnapshots(): Promise<DocumentSnapshot[]> {\r\n const persistence = this.app.offline().persistence;\r\n if (!persistence) return [];\r\n\r\n const docs = await persistence.getCollectionSnapshots(this.collection);\r\n return this.filterDocuments(docs);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n const persistence = this.app.offline().persistence;\r\n\r\n if (this.filter.length > 0 && persistence) {\r\n const local = await this.getLocalFilteredSnapshots();\r\n if (typeof navigator === \"undefined\" || !navigator.onLine) {\r\n return local;\r\n }\r\n return this.refreshFromRemote();\r\n }\r\n\r\n // No filters: safe to return local cache when offline\r\n if (persistence) {\r\n const local = await persistence.getCollectionSnapshots(this.collection);\r\n // Background server refresh if online (async, non-blocking)\r\n if (typeof navigator === \"undefined\" || navigator.onLine) {\r\n this.refreshFromRemote().catch(() => {});\r\n }\r\n return local;\r\n }\r\n\r\n // Original online-only path\r\n return this.refreshFromRemote();\r\n }\r\n\r\n private async refreshFromRemote(): Promise<DocumentSnapshot[]> {\r\n try {\r\n const genfilter = this.buildFilter();\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/read`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !Array.isArray(res.documents)) {\r\n return [];\r\n }\r\n\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d.id ?? d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n // Advanced: query-wide update (keep for now, but document it's server-side only)\r\n async update(data: Record<string, any>): Promise<any> {\r\n const genfilter = this.buildFilter();\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/update`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n data,\r\n },\r\n }).sendRequest();\r\n\r\n return res;\r\n }\r\n\r\n\r\n onSnapshot(callback: CollectionListener): () => void {\r\n const genfilter = this.buildFilter();\r\n const persistence = this.app.offline().persistence;\r\n\r\n if (persistence) {\r\n const remoteUnsub = this.app.offline().realtimeBridge?.watchCollection(this.collection, genfilter);\r\n\r\n if (this.filter.length > 0) {\r\n const emitFiltered = async (change: string, changedDocId?: string) => {\r\n const docs = await this.getLocalFilteredSnapshots();\r\n callback(docs, change, changedDocId);\r\n };\r\n\r\n emitFiltered(\"insert\").catch(console.error);\r\n\r\n const localUnsub = this.localStore?.subscribeToCollection(\r\n this.collection,\r\n async (snapshots, change, changedDocId) => {\r\n if (snapshots.length > 0) {\r\n callback(this.filterDocuments(snapshots), change, changedDocId);\r\n } else {\r\n await emitFiltered(change, changedDocId);\r\n }\r\n }\r\n ) ?? (() => {});\r\n\r\n return () => {\r\n localUnsub();\r\n remoteUnsub?.();\r\n };\r\n }\r\n\r\n const localUnsub = this.localStore?.subscribeToCollection(this.collection, callback) ?? (() => {});\r\n return () => {\r\n localUnsub();\r\n remoteUnsub?.();\r\n };\r\n }\r\n\r\n // Online-only: use realtime directly WITH filters\r\n return this.app.rtdb().subscribeToCollectionRaw(this.collection, (payload, changes) => {\r\n const res = normalizePayload(payload);\r\n callback([DocumentSnapshot.fromMap(res?.data)], changes);\r\n }, genfilter);\r\n }\r\n}","const serverURI = \"https://api.edmaxlabs.com/api/v2\";\r\nconst socketURI = \"https://api.edmaxlabs.com\";\r\n\r\nexport { serverURI, socketURI };\r\n","import DocumentRef from \"./DocumentRef.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport Query from \"./Query.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport SyncEngine from \"../persistence/SyncEngine.js\";\r\nimport LocalStore, { CollectionListener } from \"../persistence/LocalStore.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\nimport { serverURI } from \"../utils/constants.js\";\r\n\r\nexport default class CollectionRef {\r\n private app: EdmaxLabs;\r\n readonly collection: string;\r\n\r\n private persistence: Persistence | null;\r\n private syncEngine: SyncEngine | null;\r\n private localStore: LocalStore | null;\r\n\r\n constructor(app: EdmaxLabs, collection: string) {\r\n this.app = app;\r\n this.collection = collection;\r\n this.persistence = app.offline().persistence;\r\n this.syncEngine = app.offline().syncEngine;\r\n this.localStore = app.offline().localStore;\r\n }\r\n\r\n doc(id: string): DocumentRef {\r\n return new DocumentRef(this.app, this.collection, id);\r\n }\r\n\r\n get query(): Query {\r\n return new Query(this.app, this.collection);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n // Offline-first path\r\n if (this.persistence) {\r\n const local = await this.persistence.getCollectionSnapshots(this.collection);\r\n\r\n // Background refresh only if online (non-blocking)\r\n if (typeof navigator === \"undefined\" || navigator.onLine) {\r\n this.refreshFromRemote().catch(() => {});\r\n }\r\n\r\n return local;\r\n }\r\n\r\n // Pure online path - direct HTTP call (NO recursion!)\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${serverURI}/db/read`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: {},\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !Array.isArray(res.documents)) {\r\n return [];\r\n }\r\n\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d.id ?? d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } catch (error) {\r\n console.error(\"[EdmaxLabs] Collection get failed:\", error);\r\n return [];\r\n }\r\n }\r\n\r\n private async refreshFromRemote(): Promise<DocumentSnapshot[]> {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${serverURI}/db/read`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: {},\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !Array.isArray(res.documents)) {\r\n return [];\r\n }\r\n\r\n // Apply remote documents to persistence layer\r\n for (const raw of res.documents) {\r\n const doc = { ...raw };\r\n doc.id = doc.id ?? doc._id;\r\n delete doc._id;\r\n\r\n if (this.persistence) {\r\n await this.persistence.applyRemoteDoc(this.collection, doc);\r\n }\r\n }\r\n\r\n // Return fresh local data if persistence is active\r\n if (this.persistence) {\r\n return await this.persistence.getCollectionSnapshots(this.collection);\r\n }\r\n\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d.id ?? d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } catch (error) {\r\n console.error(\"[EdmaxLabs] refreshFromRemote failed:\", error);\r\n return [];\r\n }\r\n }\r\n\r\n async add(data: Record<string, any>): Promise<DocumentSnapshot | null> {\r\n if (this.persistence) {\r\n const localId = this.persistence.createLocalId();\r\n\r\n const docRecord = await this.persistence.upsertDoc({\r\n collection: this.collection,\r\n id: localId,\r\n data: { ...data, id: localId },\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: true,\r\n status: \"pending\",\r\n });\r\n\r\n await this.persistence.enqueueMutation({\r\n mutationId: this.persistence.createMutationId(),\r\n collection: this.collection,\r\n documentId: localId,\r\n type: \"insert\",\r\n payload: docRecord.data,\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(docRecord.data);\r\n\r\n this.localStore?.emitDocument(this.collection, localId, snap, \"insert\");\r\n this.localStore?.notifyCollectionChanged(this.collection, localId, \"insert\");\r\n\r\n this.syncEngine?.flush().catch(console.error);\r\n\r\n return snap;\r\n }\r\n\r\n // Online-only add\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/create`,\r\n headers: {\r\n authorization: this.app.getConfig().token,\r\n \"x-project\": this.app.getConfig().project\r\n },\r\n body: { collection: this.collection, data: { ...data, id: \"\" } }, // server will generate id\r\n }).sendRequest();\r\n\r\n if (!res?.success || !res.document) return null;\r\n\r\n return DocumentSnapshot.fromMap(res.document);\r\n }\r\n\r\n onSnapshot(callback: CollectionListener): () => void {\r\n if (this.persistence && this.localStore && this.app.offline().realtimeBridge) {\r\n this.app.offline().realtimeBridge?.watchCollection(this.collection);\r\n return this.localStore.subscribeToCollection(this.collection, callback) ?? (() => {});\r\n }\r\n\r\n // Online-only realtime\r\n return this.app.rtdb().subscribeToCollectionRaw(this.collection, (payload, changes) => {\r\n const res = normalizePayload(payload);\r\n callback([DocumentSnapshot.fromMap(res?.data)], changes);\r\n });\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport DocumentRef from \"./DocumentRef.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport { serverURI } from \"../utils/constants.js\";\r\nimport { EdmaxLabsConfig } from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class Batch {\r\n private app: EdmaxLabs;\r\n private config: EdmaxLabsConfig;\r\n private ops: any[] = [];\r\n\r\n constructor(app: EdmaxLabs,config:EdmaxLabsConfig) {\r\n this.app = app;\r\n this.config = config;\r\n }\r\n\r\n set(docRef: DocumentRef, data: any): Batch {\r\n this.ops.push({\r\n op: \"set\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n return this;\r\n }\r\n\r\n create(docRef: DocumentRef, data: any): Batch {\r\n this.ops.push({\r\n op: \"create\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n return this;\r\n }\r\n\r\n update(docRef: DocumentRef, data: any): Batch {\r\n this.ops.push({\r\n op: \"update\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n return this;\r\n }\r\n\r\n delete(docRef: DocumentRef): Batch {\r\n this.ops.push({\r\n op: \"delete\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n });\r\n return this;\r\n }\r\n\r\n async commit(): Promise<any> {\r\n const persistence = this.app.offline().persistence;\r\n const localStore = this.app.offline().localStore;\r\n const syncEngine = this.app.offline().syncEngine;\r\n\r\n // Offline-first optimistic path\r\n if (persistence && localStore) {\r\n const results: DocumentSnapshot[] = [];\r\n\r\n for (const op of this.ops) {\r\n try {\r\n if (op.op === \"update\") {\r\n const docRef = new DocumentRef(this.app, op.collection, op.id);\r\n const snap = await docRef.update(op.data);\r\n if (snap) results.push(snap);\r\n } else if (op.op === \"create\" || op.op === \"insert\" || op.op === \"set\") {\r\n // For create/set operations, insert optimistically\r\n const upserted = await persistence.upsertDoc({\r\n collection: op.collection,\r\n id: op.id,\r\n data: { ...op.data, id: op.id },\r\n exists: true,\r\n deleted: false,\r\n pending: 1,\r\n localOnly: false,\r\n status: \"pending\",\r\n });\r\n \r\n await persistence.enqueueMutation({\r\n mutationId: persistence.createMutationId(),\r\n collection: op.collection,\r\n documentId: op.id,\r\n type: \"insert\",\r\n payload: op.data,\r\n });\r\n \r\n const snap = DocumentSnapshot.fromMap(upserted.data);\r\n localStore.emitDocument(op.collection, op.id, snap, \"insert\");\r\n localStore.notifyCollectionChanged(op.collection, op.id, \"insert\");\r\n results.push(snap);\r\n } else if (op.op === \"delete\") {\r\n const docRef = new DocumentRef(this.app, op.collection, op.id);\r\n await docRef.delete();\r\n }\r\n } catch (e) {\r\n console.error(`[EdmaxLabs Batch] Failed optimistic ${op.op}`, e);\r\n }\r\n }\r\n\r\n // Trigger background sync for all queued mutations\r\n syncEngine?.flush().catch(console.error);\r\n\r\n return { success: true, results };\r\n }\r\n\r\n // Fallback: original online-only behavior (no breaking change)\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${serverURI}/db/batch`,\r\n headers: { authorization: this.config.token,\"x-project\":this.config.project },\r\n body: { ops: this.ops },\r\n }).sendRequest();\r\n\r\n if (res?.error) {\r\n throw new Error(res.error.message || \"Batch commit failed\");\r\n }\r\n\r\n return res;\r\n }\r\n}","import CollectionRef from \"./CollectionRef.js\";\r\nimport DocumentRef from \"./DocumentRef.js\";\r\nimport Batch from \"./Batch.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\nexport default class Database {\r\n private app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n collection(name: string): CollectionRef {\r\n return new CollectionRef(this.app, name);\r\n }\r\n\r\n doc(path: string): DocumentRef {\r\n if (path.includes(\"/\")) {\r\n const [col, id] = path.split(\"/\");\r\n return new DocumentRef(this.app, col, id);\r\n }\r\n throw new Error(\"doc(path) expects format 'collection/documentId'\");\r\n }\r\n\r\n batch(): Batch {\r\n return new Batch(this.app,this.app.getConfig());\r\n }\r\n\r\n /**\r\n * Server-side transaction (unchanged, but improved error handling)\r\n * This remains online-only for now — offline transactions are complex and can be added later as opt-in.\r\n */\r\n async runTransaction(\r\n transactionFn: (tx: {\r\n ops: any[];\r\n get: (docRef: DocumentRef) => Promise<any>;\r\n set: (docRef: DocumentRef, data: any) => void;\r\n update: (docRef: DocumentRef, data: any) => void;\r\n delete: (docRef: DocumentRef) => void;\r\n }) => Promise<void>\r\n ): Promise<any> {\r\n const tx = {\r\n ops: [] as any[],\r\n async get(docRef: DocumentRef) {\r\n return docRef.get(); // will use offline cache if available in future\r\n },\r\n set(docRef: DocumentRef, data: any) {\r\n tx.ops.push({ op: \"set\", collection: docRef.collection, id: docRef.id, data });\r\n },\r\n update(docRef: DocumentRef, data: any) {\r\n tx.ops.push({ op: \"update\", collection: docRef.collection, id: docRef.id, data });\r\n },\r\n delete(docRef: DocumentRef) {\r\n tx.ops.push({ op: \"delete\", collection: docRef.collection, id: docRef.id });\r\n },\r\n };\r\n\r\n await transactionFn(tx);\r\n\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/transaction`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: { ops: tx.ops },\r\n }).sendRequest();\r\n\r\n if (res?.error) {\r\n throw new Error(res.error.message || \"Transaction failed\");\r\n }\r\n return res;\r\n }\r\n\r\n // ===================== OFFLINE HELPERS (Internal) =====================\r\n\r\n /** \r\n * Returns true if persistence is enabled and we are currently offline \r\n */\r\n private get shouldUseOffline(): boolean {\r\n return !!(this.app.offline().persistence && \r\n typeof navigator !== \"undefined\" && \r\n !navigator.onLine);\r\n }\r\n\r\n /** \r\n * Returns the SyncEngine if persistence is enabled \r\n */\r\n private get syncEngine() {\r\n return this.app.offline().syncEngine;\r\n }\r\n\r\n /** \r\n * Returns the RealtimeBridge if persistence is enabled \r\n */\r\n private get realtimeBridge() {\r\n return this.app.offline().realtimeBridge;\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { io, Socket } from \"socket.io-client\";\r\nimport { generateUUID } from \"../utils/uuid.js\";\r\nimport { normalizePayload } from \"../utils/documentNomalizer.js\";\r\n\r\ntype RealtimeEvent = \"error\" | \"insert\" | \"update\" | \"delete\";\r\n\r\ntype SubscriptionRecord = {\r\n lid: string;\r\n collection: string;\r\n filter: Record<string, any>;\r\n handlers: Array<{\r\n event: string;\r\n fn: (payload: any) => void;\r\n }>;\r\n};\r\n\r\nexport default class Realtime {\r\n private app: EdmaxLabs;\r\n private socket: Socket | null = null;\r\n private readonly events: RealtimeEvent[] = [\"error\", \"insert\", \"update\", \"delete\"];\r\n private subscriptions = new Map<string, SubscriptionRecord>();\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n private connect(): Socket {\r\n if (this.socket) return this.socket;\r\n\r\n if (!this.app.getConfig().token) {\r\n throw new Error(\"Auth token is required for realtime connection\");\r\n }\r\n\r\n this.socket = io(this.app.getSocketUrl(), {\r\n transports: [\"websocket\"],\r\n auth: { token: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n autoConnect: true,\r\n reconnection: true,\r\n reconnectionAttempts: Infinity,\r\n reconnectionDelay: 1000,\r\n reconnectionDelayMax: 5000,\r\n });\r\n\r\n this.setupSocketListeners();\r\n\r\n return this.socket;\r\n }\r\n\r\n private setupSocketListeners(): void {\r\n if (!this.socket) return;\r\n\r\n this.socket.on(\"connect\", () => {\r\n console.log(\"[EdmaxLabs Realtime] Connected\");\r\n this.resubscribeAll();\r\n // Trigger offline sync + bridge refresh when back online\r\n this.app.offline().syncEngine?.flush().catch(console.error);\r\n this.app.offline().realtimeBridge?.onReconnect?.().catch(console.error);\r\n });\r\n\r\n this.socket.on(\"disconnect\", (reason) => {\r\n console.log(`[EdmaxLabs Realtime] Disconnected: ${reason}`);\r\n });\r\n\r\n this.socket.on(\"error\", (err) => {\r\n console.error(\"[EdmaxLabs Realtime] Socket error:\", err);\r\n });\r\n }\r\n\r\n // ===================== PUBLIC HELPERS =====================\r\n\r\n on(event: string, cb: (...args: any[]) => void): void {\r\n this.connect().on(event, cb);\r\n }\r\n\r\n off(event: string, cb?: (...args: any[]) => void): void {\r\n if (cb) this.socket?.off(event, cb);\r\n else this.socket?.removeAllListeners(event);\r\n }\r\n\r\n emit(event: string, data: any): void {\r\n this.connect().emit(event, data);\r\n }\r\n\r\n // ===================== INTERNAL RAW SUBSCRIPTIONS =====================\r\n\r\n /**\r\n * Low-level collection subscription (used by RealtimeBridge)\r\n */\r\n subscribeToCollectionRaw(\r\n collection: string,\r\n callback: (payload: any, change: string) => void,\r\n filter: Record<string, any> = {}\r\n ): () => void {\r\n this.connect();\r\n\r\n const lid = `col_${collection}_${generateUUID()}`;\r\n const handlers: Array<{ event: string; fn: (payload: any) => void }> = [];\r\n\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n this.events.forEach((event) => {\r\n const channel = `${lid}-${event}`;\r\n const fn = (payload: any) => {\r\n const normalized = normalizePayload(payload);\r\n if (!normalized) return;\r\n callback(normalized.data,event);\r\n };\r\n\r\n this.socket!.on(channel, fn);\r\n handlers.push({ event: channel, fn });\r\n });\r\n\r\n this.registerSubscription(lid, collection, filter, handlers);\r\n\r\n return () => this.cleanupSubscription(lid);\r\n }\r\n\r\n /**\r\n * Low-level document subscription (used by RealtimeBridge)\r\n */\r\n subscribeToDocumentRaw(\r\n collection: string,\r\n id: string,\r\n callback: (payload: any, change: string) => void\r\n ): () => void {\r\n this.connect();\r\n\r\n const lid = `doc_${collection}_${id}_${generateUUID()}`;\r\n const filter = { _id: id };\r\n const handlers: Array<{ event: string; fn: (payload: any) => void }> = [];\r\n\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n this.events.forEach((event) => {\r\n const channel = `${lid}-${event}`;\r\n const fn = (payload: any) => {\r\n const normalized = normalizePayload(payload);\r\n if (!normalized) {\r\n callback({ id }, \"delete\");\r\n return;\r\n }\r\n callback(normalized.data, normalized.change ?? event);\r\n };\r\n\r\n this.socket!.on(channel, fn);\r\n handlers.push({ event: channel, fn });\r\n });\r\n\r\n this.registerSubscription(lid, collection, filter, handlers);\r\n\r\n return () => this.cleanupSubscription(lid);\r\n }\r\n\r\n // ===================== PRIVATE HELPERS =====================\r\n\r\n\r\n private registerSubscription(\r\n lid: string,\r\n collection: string,\r\n filter: Record<string, any>,\r\n handlers: Array<{ event: string; fn: (payload: any) => void }>\r\n ) {\r\n this.subscriptions.set(lid, { lid, collection, filter, handlers });\r\n }\r\n\r\n private resubscribeAll() {\r\n if (!this.socket) return;\r\n\r\n for (const sub of this.subscriptions.values()) {\r\n this.socket.emit(\"subscribe\", {\r\n collection: sub.collection,\r\n filter: sub.filter,\r\n lid: sub.lid,\r\n });\r\n }\r\n }\r\n\r\n private cleanupSubscription(lid: string): void {\r\n const sub = this.subscriptions.get(lid);\r\n if (!sub || !this.socket) return;\r\n\r\n for (const handler of sub.handlers) {\r\n this.socket.off(handler.event, handler.fn);\r\n }\r\n\r\n this.socket.emit(\"unsubscribe\", { lid });\r\n this.subscriptions.delete(lid);\r\n }\r\n\r\n // ===================== LIFECYCLE =====================\r\n\r\n disconnect(): void {\r\n this.socket?.disconnect();\r\n this.socket = null;\r\n this.subscriptions.clear();\r\n }\r\n\r\n dispose(): void {\r\n this.disconnect();\r\n }\r\n}","// utils/uuid.ts\r\nexport function generateUUID(): string {\r\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\r\n return crypto.randomUUID(); // Secure & browser-native\r\n }\r\n\r\n // Fallback: Manual RFC4122 UUID v4 generator\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { EdmaxLabsConfig } from \"../core/EdmaxLabs.js\";\r\nimport { serverURI } from \"../utils/constants.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\nexport default class Functions {\r\n private config: EdmaxLabsConfig;\r\n\r\n constructor(config: EdmaxLabsConfig) {\r\n this.config = config;\r\n }\r\n\r\n async call(functionName: string, data?: Record<string, any>): Promise<any> {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: serverURI + \"/functions/call/\" + functionName,\r\n headers: { authorization: this.config.token,\"x-project\":this.config.project },\r\n body: data,\r\n }).sendRequest();\r\n\r\n return res;\r\n } catch (err: any) {\r\n throw {\r\n message: err.message || \"Function call failed\",\r\n code: err.code || \"UNKNOWN_ERROR\",\r\n };\r\n }\r\n }\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\n\r\nexport default class Hosting {\r\n app: EdmaxLabs;\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n }\r\n\r\n async createSubdomain(name: string): Promise<any> {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl() + \"/hosting/register\",\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n hostname: name,\r\n project: this.app.getConfig().project,\r\n },\r\n }).sendRequest();\r\n\r\n return res;\r\n } catch (err: any) {\r\n throw {\r\n message: err.message || \"Function call failed\",\r\n code: err.code || \"UNKNOWN_ERROR\",\r\n };\r\n }\r\n }\r\n}\r\n","import { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\n\r\nexport type DocListener = (snapshot: DocumentSnapshot | null, change: string) => void;\r\n\r\n/**\r\n * For collection listeners we pass:\r\n * - snapshots: all current documents in the collection\r\n * - change: what triggered this emission\r\n * - changedDocId?: which specific document changed (useful for granular updates)\r\n */\r\nexport type CollectionListener = (\r\n snapshots: DocumentSnapshot[],\r\n change: string,\r\n changedDocId?: string\r\n) => void;\r\n\r\nexport default class LocalStore {\r\n private documentListeners = new Map<string, Set<DocListener>>();\r\n private collectionListeners = new Map<string, Set<CollectionListener>>();\r\n\r\n private docKey(collection: string, id: string): string {\r\n return `${collection}:${id}`;\r\n }\r\n\r\n // ===================== DOCUMENT LISTENERS =====================\r\n\r\n subscribeToDocument(\r\n collection: string,\r\n id: string,\r\n callback: DocListener\r\n ): () => void {\r\n const key = this.docKey(collection, id);\r\n\r\n if (!this.documentListeners.has(key)) {\r\n this.documentListeners.set(key, new Set());\r\n }\r\n\r\n const listeners = this.documentListeners.get(key)!;\r\n listeners.add(callback);\r\n\r\n // Return unsubscribe function (standard in React SDKs)\r\n return () => {\r\n listeners.delete(callback);\r\n if (listeners.size === 0) {\r\n this.documentListeners.delete(key);\r\n }\r\n };\r\n }\r\n\r\n // ===================== COLLECTION LISTENERS =====================\r\n\r\n subscribeToCollection(\r\n collection: string,\r\n callback: CollectionListener\r\n ): () => void {\r\n if (!this.collectionListeners.has(collection)) {\r\n this.collectionListeners.set(collection, new Set());\r\n }\r\n\r\n const listeners = this.collectionListeners.get(collection)!;\r\n listeners.add(callback);\r\n\r\n return () => {\r\n listeners.delete(callback);\r\n if (listeners.size === 0) {\r\n this.collectionListeners.delete(collection);\r\n }\r\n };\r\n }\r\n\r\n // ===================== EMITTERS =====================\r\n\r\n /**\r\n * Notify all listeners for a specific document\r\n */\r\n emitDocument(\r\n collection: string,\r\n id: string,\r\n snapshot: DocumentSnapshot | null,\r\n change: string\r\n ): void {\r\n const key = this.docKey(collection, id);\r\n this.documentListeners.get(key)?.forEach((cb) => {\r\n try {\r\n cb(snapshot, change);\r\n } catch (err) {\r\n console.error(`[EdmaxLabs] Error in document listener for ${key}:`, err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notify all listeners for a collection.\r\n * This is the most important fix — collection listeners now receive the full list.\r\n */\r\n emitCollection(\r\n collection: string,\r\n snapshots: DocumentSnapshot[], // ← Changed from single snapshot\r\n change: string,\r\n changedDocId?: string\r\n ): void {\r\n this.collectionListeners.get(collection)?.forEach((cb) => {\r\n try {\r\n cb(snapshots, change, changedDocId);\r\n } catch (err) {\r\n console.error(`[EdmaxLabs] Error in collection listener for ${collection}:`, err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * OPTIMIZED: Notify collection listeners that something changed, without fetching full collection.\r\n * Listeners can call getCollectionSnapshots() themselves if they need the full list.\r\n * This avoids expensive collection queries after every single mutation.\r\n */\r\n notifyCollectionChanged(\r\n collection: string,\r\n changedDocId: string,\r\n change: string\r\n ): void {\r\n // Send empty snapshots array (listeners will know to refetch if needed)\r\n // The changedDocId tells listeners WHICH document changed\r\n this.collectionListeners.get(collection)?.forEach((cb) => {\r\n try {\r\n cb([], change, changedDocId);\r\n } catch (err) {\r\n console.error(`[EdmaxLabs] Error in collection listener for ${collection}:`, err);\r\n }\r\n });\r\n }\r\n\r\n // ===================== UTILITY =====================\r\n\r\n /**\r\n * Clear all listeners (useful for testing or when persistence is disabled)\r\n */\r\n clearAllListeners(): void {\r\n this.documentListeners.clear();\r\n this.collectionListeners.clear();\r\n }\r\n\r\n /**\r\n * Get current listener count (for debugging / dev tools)\r\n */\r\n get listenerCount(): { documents: number; collections: number } {\r\n let docCount = 0;\r\n this.documentListeners.forEach(set => docCount += set.size);\r\n let collCount = 0;\r\n this.collectionListeners.forEach(set => collCount += set.size);\r\n return { documents: docCount, collections: collCount };\r\n }\r\n\r\n /**\r\n * Remove all listeners for a specific collection (useful for cleanup)\r\n */\r\n removeCollectionListeners(collection: string): void {\r\n this.collectionListeners.delete(collection);\r\n }\r\n\r\n /**\r\n * Remove all listeners for a specific document (useful for cleanup)\r\n */\r\n removeDocumentListeners(collection: string, id: string): void {\r\n const key = this.docKey(collection, id);\r\n this.documentListeners.delete(key);\r\n }\r\n}","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","import { openDB, type DBSchema, type IDBPDatabase } from \"idb\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport type { LocalDoc } from \"./models/LocalDoc.js\";\r\nimport type { MutationRecord, MutationType } from \"./models/Mutation.js\";\r\n\r\ninterface EdmaxDBSchema extends DBSchema {\r\n docs: {\r\n key: string;\r\n value: LocalDoc;\r\n indexes: {\r\n \"by-collection\": string;\r\n \"by-id\": string;\r\n \"by-updatedAt\": number;\r\n \"by-pending\": number;\r\n };\r\n };\r\n mutations: {\r\n key: string;\r\n value: MutationRecord;\r\n indexes: {\r\n \"by-status\": string;\r\n \"by-collection\": string;\r\n \"by-documentId\": string;\r\n \"by-createdAt\": number;\r\n };\r\n };\r\n meta: {\r\n key: string;\r\n value: any;\r\n };\r\n}\r\n\r\nexport default class Persistence {\r\n private dbPromise: Promise<IDBPDatabase<EdmaxDBSchema>>;\r\n private appName: string;\r\n\r\n constructor(appName: string = \"default\") {\r\n this.appName = appName;\r\n // Isolation: Use app_name in DB name to prevent data leakage between apps/users\r\n this.dbPromise = openDB<EdmaxDBSchema>(`edmaxlabs_storage_${appName}`, 1, {\r\n upgrade(app, oldVersion) {\r\n if (oldVersion < 1) {\r\n if (!app.objectStoreNames.contains(\"docs\")) {\r\n const docs = app.createObjectStore(\"docs\", { keyPath: \"key\" });\r\n docs.createIndex(\"by-collection\", \"collection\");\r\n docs.createIndex(\"by-id\", \"id\");\r\n docs.createIndex(\"by-updatedAt\", \"updatedAt\");\r\n docs.createIndex(\"by-pending\", \"pending\");\r\n }\r\n\r\n if (!app.objectStoreNames.contains(\"mutations\")) {\r\n const mutations = app.createObjectStore(\"mutations\", {\r\n keyPath: \"mutationId\",\r\n });\r\n mutations.createIndex(\"by-status\", \"status\");\r\n mutations.createIndex(\"by-collection\", \"collection\");\r\n mutations.createIndex(\"by-documentId\", \"documentId\");\r\n mutations.createIndex(\"by-createdAt\", \"createdAt\");\r\n }\r\n\r\n if (!app.objectStoreNames.contains(\"meta\")) {\r\n app.createObjectStore(\"meta\");\r\n }\r\n }\r\n },\r\n blocked() {\r\n console.warn(\"[EdmaxLabs] IndexedDB blocked - another tab has the database open\");\r\n },\r\n blocking() {\r\n console.warn(\"[EdmaxLabs] IndexedDB blocking - closing to allow upgrade\");\r\n // Note: Cannot auto-close here as it would break the upgrade process\r\n // The blocking event indicates another tab needs access\r\n },\r\n terminated() {\r\n console.error(\"[EdmaxLabs] IndexedDB terminated unexpectedly\");\r\n },\r\n }).catch(error => {\r\n if (error.name === 'QuotaExceededError') {\r\n console.error(\"[EdmaxLabs] IndexedDB quota exceeded - storage full\");\r\n throw new Error(\"Storage quota exceeded. Please clear browser data or free up space.\");\r\n }\r\n if (error.name === 'VersionError') {\r\n console.error(\"[EdmaxLabs] IndexedDB version conflict - clearing and retrying\");\r\n // Try to delete and recreate\r\n indexedDB.deleteDatabase(`edmaxlabs_storage_${appName}`);\r\n throw error; // Let caller handle retry\r\n }\r\n throw error;\r\n });\r\n }\r\n\r\n private docKey(collection: string, id: string): string {\r\n // Include app_name for extra isolation (defense in depth)\r\n return `${this.appName}:${collection}:${id}`;\r\n }\r\n\r\n private now(): number {\r\n return Date.now();\r\n }\r\n\r\n private async getDb(): Promise<IDBPDatabase<EdmaxDBSchema>> {\r\n try {\r\n return await this.dbPromise;\r\n } catch (error: any) {\r\n if (error.name === 'QuotaExceededError') {\r\n throw new Error(\"Storage quota exceeded. Please clear browser data or free up space.\");\r\n }\r\n if (error.name === 'VersionError') {\r\n // Try recovery by deleting and recreating\r\n console.warn(\"[EdmaxLabs] IndexedDB version error - attempting recovery\");\r\n indexedDB.deleteDatabase(`edmaxlabs_storage_${this.appName}`);\r\n // Force recreation on next call\r\n this.dbPromise = openDB<EdmaxDBSchema>(`edmaxlabs_storage_${this.appName}`, 1, {\r\n upgrade(app, oldVersion) {\r\n // Same schema as above\r\n if (oldVersion < 1) {\r\n if (!app.objectStoreNames.contains(\"docs\")) {\r\n const docs = app.createObjectStore(\"docs\", { keyPath: \"key\" });\r\n docs.createIndex(\"by-collection\", \"collection\");\r\n docs.createIndex(\"by-id\", \"id\");\r\n docs.createIndex(\"by-updatedAt\", \"updatedAt\");\r\n docs.createIndex(\"by-pending\", \"pending\");\r\n }\r\n if (!app.objectStoreNames.contains(\"mutations\")) {\r\n const mutations = app.createObjectStore(\"mutations\", {\r\n keyPath: \"mutationId\",\r\n });\r\n mutations.createIndex(\"by-status\", \"status\");\r\n mutations.createIndex(\"by-collection\", \"collection\");\r\n mutations.createIndex(\"by-documentId\", \"documentId\");\r\n mutations.createIndex(\"by-createdAt\", \"createdAt\");\r\n }\r\n if (!app.objectStoreNames.contains(\"meta\")) {\r\n app.createObjectStore(\"meta\");\r\n }\r\n }\r\n },\r\n });\r\n return await this.dbPromise;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n // ==================== DOCS ====================\r\n\r\n async getDoc(collection: string, id: string): Promise<LocalDoc | null> {\r\n const app = await this.getDb();\r\n return (await app.get(\"docs\", this.docKey(collection, id))) ?? null;\r\n }\r\n\r\n async getDocSnapshot(collection: string, id: string): Promise<DocumentSnapshot | null> {\r\n const doc = await this.getDoc(collection, id);\r\n if (!doc || !doc.exists || doc.deleted) return null;\r\n return DocumentSnapshot.fromMap(doc.data);\r\n }\r\n\r\n async getCollection(collection: string): Promise<LocalDoc[]> {\r\n const app = await this.getDb();\r\n const all = await app.getAllFromIndex(\"docs\", \"by-collection\", collection);\r\n return all.filter((d) => d.exists && !d.deleted);\r\n }\r\n\r\n async getCollectionSnapshots(collection: string): Promise<DocumentSnapshot[]> {\r\n const docs = await this.getCollection(collection);\r\n return docs.map((d) => DocumentSnapshot.fromMap(d.data));\r\n }\r\n\r\n async upsertDoc(input: Omit<LocalDoc, \"key\" | \"updatedAt\"> & { updatedAt?: number }): Promise<LocalDoc> {\r\n const app = await this.getDb();\r\n const record: LocalDoc = {\r\n ...input,\r\n key: this.docKey(input.collection, input.id),\r\n updatedAt: input.updatedAt ?? this.now(),\r\n };\r\n\r\n await app.put(\"docs\", record);\r\n return record;\r\n }\r\n\r\n async markDeleted(collection: string, id: string, pending = 1): Promise<LocalDoc> {\r\n const old = await this.getDoc(collection, id);\r\n\r\n const record: LocalDoc = {\r\n key: this.docKey(collection, id),\r\n collection,\r\n id,\r\n data: old?.data ?? { id },\r\n exists: false,\r\n deleted: true,\r\n pending,\r\n localOnly: false,\r\n status: pending ? \"pending\" : \"synced\",\r\n updatedAt: this.now(),\r\n lastSyncedAt: old?.lastSyncedAt,\r\n revision: old?.revision,\r\n };\r\n\r\n const app = await this.getDb();\r\n await app.put(\"docs\", record);\r\n return record;\r\n }\r\n\r\n // ==================== MUTATIONS ====================\r\n\r\n async enqueueMutation(\r\n mutation: Omit<MutationRecord, \"updatedAt\" | \"createdAt\" | \"retryCount\" | \"status\">\r\n ): Promise<MutationRecord> {\r\n const app = await this.getDb();\r\n const record: MutationRecord = {\r\n ...mutation,\r\n createdAt: this.now(),\r\n updatedAt: this.now(),\r\n retryCount: 0,\r\n status: \"pending\",\r\n };\r\n\r\n await app.put(\"mutations\", record);\r\n return record;\r\n }\r\n\r\n async getPendingMutations(): Promise<MutationRecord[]> {\r\n const app = await this.getDb();\r\n const [pending, failed] = await Promise.all([\r\n app.getAllFromIndex(\"mutations\", \"by-status\", \"pending\"),\r\n app.getAllFromIndex(\"mutations\", \"by-status\", \"failed\"),\r\n ]);\r\n\r\n return [...pending, ...failed].sort((a, b) => a.createdAt - b.createdAt);\r\n }\r\n\r\n async getMutation(mutationId: string): Promise<MutationRecord | null> {\r\n const app = await this.getDb();\r\n return (await app.get(\"mutations\", mutationId)) ?? null;\r\n }\r\n\r\n async resetMutation(mutationId: string): Promise<MutationRecord | null> {\r\n const app = await this.getDb();\r\n const old = await app.get(\"mutations\", mutationId);\r\n if (!old) return null;\r\n\r\n const next: MutationRecord = {\r\n ...old,\r\n status: \"pending\",\r\n retryCount: 0,\r\n updatedAt: this.now(),\r\n error: undefined,\r\n };\r\n\r\n await app.put(\"mutations\", next);\r\n return next;\r\n }\r\n\r\n async setMutationStatus(\r\n mutationId: string,\r\n status: MutationRecord[\"status\"],\r\n error?: string\r\n ): Promise<MutationRecord | null> {\r\n const app = await this.getDb();\r\n const old = await app.get(\"mutations\", mutationId);\r\n if (!old) return null;\r\n\r\n const next: MutationRecord = {\r\n ...old,\r\n status,\r\n updatedAt: this.now(),\r\n retryCount: status === \"failed\" ? (old.retryCount || 0) + 1 : old.retryCount,\r\n error,\r\n };\r\n\r\n await app.put(\"mutations\", next);\r\n return next;\r\n }\r\n\r\n async removeMutation(mutationId: string): Promise<void> {\r\n const app = await this.getDb();\r\n await app.delete(\"mutations\", mutationId);\r\n }\r\n\r\n // ==================== ADVANCED OPERATIONS ====================\r\n\r\n async replaceDocId(collection: string, oldId: string, newId: string): Promise<LocalDoc | null> {\r\n const app = await this.getDb();\r\n const oldKey = this.docKey(collection, oldId);\r\n const oldDoc = await app.get(\"docs\", oldKey);\r\n if (!oldDoc) return null;\r\n\r\n const next: LocalDoc = {\r\n ...oldDoc,\r\n id: newId,\r\n key: this.docKey(collection, newId),\r\n data: { ...oldDoc.data, id: newId },\r\n localOnly: false,\r\n pending: 0,\r\n status: \"synced\",\r\n updatedAt: this.now(),\r\n lastSyncedAt: this.now(),\r\n };\r\n\r\n const tx = app.transaction([\"docs\", \"mutations\"], \"readwrite\");\r\n const docsStore = tx.objectStore(\"docs\");\r\n const mutationsStore = tx.objectStore(\"mutations\");\r\n\r\n await docsStore.put(next);\r\n await docsStore.delete(oldKey);\r\n\r\n // Update all related mutations in one transaction\r\n const allMutations = await mutationsStore.getAll();\r\n for (const mut of allMutations) {\r\n if (mut.collection === collection && mut.documentId === oldId) {\r\n await mutationsStore.put({\r\n ...mut,\r\n documentId: newId,\r\n payload: mut.payload ? { ...mut.payload, id: newId } : null,\r\n updatedAt: this.now(),\r\n });\r\n }\r\n }\r\n\r\n await tx.done;\r\n return next;\r\n }\r\n\r\n async applyRemoteDoc(\r\n collection: string,\r\n data: Record<string, any>,\r\n revision?: string | number\r\n ): Promise<LocalDoc | null> {\r\n const id = data.id ?? data._id;\r\n if (!id) return null;\r\n\r\n const local = await this.getDoc(collection, id);\r\n if (local?.pending && local.pending > 0) {\r\n return local; // Protect optimistic writes\r\n }\r\n\r\n return this.upsertDoc({\r\n collection,\r\n id,\r\n data: { ...data, id },\r\n exists: true,\r\n deleted: false,\r\n pending: 0,\r\n localOnly: false,\r\n status: \"synced\",\r\n revision,\r\n lastSyncedAt: this.now(),\r\n });\r\n }\r\n\r\n async applyRemoteDelete(collection: string, id: string): Promise<LocalDoc | null> {\r\n const local = await this.getDoc(collection, id);\r\n if (local?.pending && local.pending > 0) {\r\n return local;\r\n }\r\n return this.markDeleted(collection, id, 0);\r\n }\r\n\r\n // ==================== UTILITIES ====================\r\n\r\n createLocalId(): string {\r\n return `local_${crypto.randomUUID()}`;\r\n }\r\n\r\n createMutationId(): string {\r\n return `mut_${crypto.randomUUID()}`;\r\n }\r\n\r\n // Future-proof maintenance methods (optional for now)\r\n async clearAll(): Promise<void> {\r\n const app = await this.getDb();\r\n const tx = app.transaction([\"docs\", \"mutations\", \"meta\"], \"readwrite\");\r\n await Promise.all([\r\n tx.objectStore(\"docs\").clear(),\r\n tx.objectStore(\"mutations\").clear(),\r\n tx.objectStore(\"meta\").clear(),\r\n ]);\r\n await tx.done;\r\n }\r\n\r\n async getStorageUsage(): Promise<number> {\r\n // Can be implemented later with estimate() if needed\r\n return 0;\r\n }\r\n}","import Persistence from \"../persistence/Persistence.js\";\r\nimport LocalStore from \"./LocalStore.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class RealtimeBridge {\r\n private collectionUnsubs = new Map<string, () => void>();\r\n private documentUnsubs = new Map<string, () => void>();\r\n\r\n constructor(\r\n private app: EdmaxLabs,\r\n private persistence: Persistence,\r\n private store: LocalStore\r\n ) {}\r\n\r\n private docKey(collection: string, id: string): string {\r\n return `${collection}:${id}`;\r\n }\r\n\r\n // ===================== PUBLIC API =====================\r\n\r\n watchCollection(collection: string, filter: Record<string, any> = {}): () => void {\r\n const key = `${collection}:${JSON.stringify(filter)}`;\r\n\r\n // Return existing unsub if already watching\r\n if (this.collectionUnsubs.has(key)) {\r\n return this.collectionUnsubs.get(key)!;\r\n }\r\n\r\n // First: emit current local cache immediately (offline-first)\r\n this.emitCurrentCollection(collection);\r\n\r\n // Subscribe to realtime\r\n const unsub = this.app.rtdb().subscribeToCollectionRaw(\r\n collection,\r\n async (payload, change) => {\r\n if (change === \"delete\") {\r\n const id = payload?.id || payload?._id;\r\n if (id) await this.handleRemoteDelete(collection, id);\r\n } else {\r\n await this.handleRemoteCreateOrUpdate(collection, payload,change);\r\n }\r\n },\r\n filter\r\n );\r\n\r\n const fullUnsub = () => {\r\n unsub();\r\n this.collectionUnsubs.delete(key);\r\n };\r\n\r\n this.collectionUnsubs.set(key, fullUnsub);\r\n return fullUnsub;\r\n }\r\n\r\n watchDocument(collection: string, id: string): () => void {\r\n const key = this.docKey(collection, id);\r\n\r\n if (this.documentUnsubs.has(key)) {\r\n return this.documentUnsubs.get(key)!;\r\n }\r\n\r\n // Emit local cache immediately\r\n this.emitCurrentDocument(collection, id);\r\n\r\n const unsub = this.app.rtdb().subscribeToDocumentRaw(\r\n collection,\r\n id,\r\n async (payload, change) => {\r\n if (change === \"delete\") {\r\n await this.handleRemoteDelete(collection, id);\r\n } else {\r\n await this.handleRemoteCreateOrUpdate(collection, payload,change);\r\n }\r\n }\r\n );\r\n\r\n const fullUnsub = () => {\r\n unsub();\r\n this.documentUnsubs.delete(key);\r\n };\r\n\r\n this.documentUnsubs.set(key, fullUnsub);\r\n return fullUnsub;\r\n }\r\n\r\n // ===================== INTERNAL HANDLERS =====================\r\n\r\n private async emitCurrentDocument(collection: string, id: string): Promise<void> {\r\n const localDoc = await this.persistence.getDoc(collection, id);\r\n const snapshot = localDoc && localDoc.exists && !localDoc.deleted\r\n ? DocumentSnapshot.fromMap(localDoc.data)\r\n : null;\r\n\r\n this.store.emitDocument(collection, id, snapshot, \"insert\");\r\n }\r\n\r\n private async emitCurrentCollection(collection: string): Promise<void> {\r\n const localDocs = await this.persistence.getCollectionSnapshots(collection);\r\n this.store.emitCollection(collection, localDocs, \"insert\");\r\n }\r\n\r\n private async handleRemoteCreateOrUpdate(collection: string, raw: Record<string, any>,change:string): Promise<void> {\r\n const id = raw.id ?? raw._id;\r\n if (!id) return;\r\n\r\n const saved = await this.persistence.applyRemoteDoc(collection, raw);\r\n if (!saved) return;\r\n\r\n const snap = DocumentSnapshot.fromMap(saved.data);\r\n\r\n // Emit to document listeners\r\n this.store.emitDocument(collection, id, snap, change);\r\n\r\n // Notify collection listeners WITHOUT fetching full collection (performance optimization)\r\n this.store.notifyCollectionChanged(collection, id, change);\r\n }\r\n\r\n private async handleRemoteDelete(collection: string, id: string): Promise<void> {\r\n await this.persistence.applyRemoteDelete(collection, id);\r\n\r\n this.store.emitDocument(collection, id, null, \"delete\");\r\n\r\n // Notify collection listeners WITHOUT fetching full collection\r\n this.store.notifyCollectionChanged(collection, id, \"delete\");\r\n }\r\n\r\n // ===================== LIFECYCLE =====================\r\n\r\n /**\r\n * Call this when Socket.IO reconnects or when going online\r\n * Replays pending mutations + refreshes all active subscriptions from cache\r\n */\r\n async onReconnect(): Promise<void> {\r\n // Future: trigger SyncEngine to process queue\r\n // For now: refresh all watched collections/documents from local cache\r\n for (const [key] of this.collectionUnsubs) {\r\n const collection = key.split(':')[0];\r\n await this.emitCurrentCollection(collection);\r\n }\r\n\r\n for (const [key] of this.documentUnsubs) {\r\n const [collection, id] = key.split(':');\r\n await this.emitCurrentDocument(collection, id);\r\n }\r\n }\r\n\r\n /**\r\n * Clean up all subscriptions (call from EdmaxLabs destructor if needed)\r\n */\r\n dispose(): void {\r\n this.collectionUnsubs.forEach(unsub => unsub());\r\n this.documentUnsubs.forEach(unsub => unsub());\r\n this.collectionUnsubs.clear();\r\n this.documentUnsubs.clear();\r\n }\r\n}","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport LocalStore from \"./LocalStore.js\";\r\nimport RealtimeBridge from \"./RealtimeBridge.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\n\r\nexport default class SyncEngine {\r\n private app: EdmaxLabs;\r\n private persistence: Persistence;\r\n private store: LocalStore;\r\n private realtimeBridge: RealtimeBridge | null = null;\r\n\r\n private syncing = false;\r\n private retryTimeout: NodeJS.Timeout | null = null;\r\n private readonly MAX_RETRIES = 5;\r\n private readonly BASE_RETRY_DELAY = 2000;\r\n\r\n constructor(\r\n app: EdmaxLabs,\r\n persistence: Persistence,\r\n store: LocalStore,\r\n realtimeBridge?: RealtimeBridge // optional for now\r\n ) {\r\n this.app = app;\r\n this.persistence = persistence;\r\n this.store = store;\r\n this.realtimeBridge = realtimeBridge || null;\r\n\r\n // Listen for online events\r\n if (typeof window !== \"undefined\") {\r\n window.addEventListener(\"online\", () => this.onNetworkOnline());\r\n // Optional: also listen to visibilitychange for better UX\r\n document.addEventListener(\"visibilitychange\", () => {\r\n if (document.visibilityState === \"visible\") this.onNetworkOnline();\r\n });\r\n }\r\n }\r\n\r\n private onNetworkOnline(): void {\r\n if (this.retryTimeout) {\r\n clearTimeout(this.retryTimeout);\r\n this.retryTimeout = null;\r\n }\r\n this.flush().catch(console.error);\r\n }\r\n\r\n async flush(): Promise<void> {\r\n if (this.syncing) return;\r\n if (typeof navigator !== \"undefined\" && !navigator.onLine) return;\r\n\r\n this.syncing = true;\r\n\r\n try {\r\n const pending = await this.persistence.getPendingMutations();\r\n\r\n for (const mutation of pending) {\r\n if (mutation.retryCount >= this.MAX_RETRIES) {\r\n await this.persistence.setMutationStatus(\r\n mutation.mutationId,\r\n \"failed\",\r\n \"Max retries exceeded\"\r\n );\r\n continue;\r\n }\r\n\r\n await this.persistence.setMutationStatus(mutation.mutationId, \"syncing\");\r\n\r\n try {\r\n let success = false;\r\n\r\n switch (mutation.type) {\r\n case \"insert\":\r\n success = await this.syncCreate(mutation);\r\n break;\r\n case \"update\":\r\n success = await this.syncUpdate(mutation);\r\n break;\r\n case \"delete\":\r\n success = await this.syncDelete(mutation);\r\n break;\r\n case \"array_push\":\r\n case \"array_update\":\r\n case \"array_insert\":\r\n case \"array_remove\":\r\n default:\r\n console.warn(`[EdmaxLabs] Unknown mutation type: ${mutation.type}`);\r\n }\r\n\r\n if (success) {\r\n await this.persistence.removeMutation(mutation.mutationId);\r\n } else {\r\n throw new Error(\"Sync operation failed\");\r\n }\r\n } catch (error: any) {\r\n const nextRetryCount = (mutation.retryCount || 0) + 1;\r\n await this.persistence.setMutationStatus(\r\n mutation.mutationId,\r\n \"failed\",\r\n error?.message ?? \"Unknown insert error\"\r\n );\r\n\r\n // Exponential backoff for next flush\r\n if (nextRetryCount < this.MAX_RETRIES) {\r\n this.scheduleRetry();\r\n }\r\n }\r\n }\r\n\r\n // After successful flush → notify bridge to refresh views\r\n if (this.realtimeBridge) {\r\n await this.realtimeBridge.onReconnect();\r\n }\r\n } finally {\r\n this.syncing = false;\r\n }\r\n }\r\n\r\n private async syncCreate(mutation: any): Promise<boolean> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/create`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: mutation.collection,\r\n data: mutation.payload,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success || !res.id) return false;\r\n\r\n const oldId = mutation.documentId;\r\n const newId = String(res.id);\r\n\r\n const replaced = await this.persistence.replaceDocId(\r\n mutation.collection,\r\n oldId,\r\n newId\r\n );\r\n\r\n if (replaced) {\r\n const snap = DocumentSnapshot.fromMap(replaced.data);\r\n // Notify document listeners (minimal overhead)\r\n this.store.emitDocument(mutation.collection, oldId, snap, \"insert\");\r\n this.store.emitDocument(mutation.collection, newId, snap, \"insert\");\r\n \r\n // Notify collection listeners WITHOUT fetching full collection\r\n // Listeners can call getCollectionSnapshots() if they need the full list\r\n this.store.notifyCollectionChanged(mutation.collection, newId, \"insert\");\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private async syncUpdate(mutation: any): Promise<boolean> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/update`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: mutation.collection,\r\n document: mutation.documentId,\r\n data: mutation.payload,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success) return false;\r\n\r\n const local = await this.persistence.upsertDoc({\r\n collection: mutation.collection,\r\n id: mutation.documentId,\r\n data: {\r\n ...(res.document ?? mutation.payload ?? {}),\r\n id: mutation.documentId,\r\n },\r\n exists: true,\r\n deleted: false,\r\n pending: 0,\r\n localOnly: false,\r\n status: \"synced\",\r\n lastSyncedAt: this.persistence['now']?.() ?? Date.now(),\r\n });\r\n\r\n const snap = DocumentSnapshot.fromMap(local.data);\r\n this.store.emitDocument(mutation.collection, mutation.documentId, snap, \"update\");\r\n \r\n // Notify collection listeners WITHOUT fetching full collection\r\n this.store.notifyCollectionChanged(mutation.collection, mutation.documentId, \"update\");\r\n\r\n return true;\r\n }\r\n\r\n private async syncDelete(mutation: any): Promise<boolean> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.app.getBaseUrl()}/db/delete`,\r\n headers: { authorization: this.app.getConfig().token,\"x-project\":this.app.getConfig().project },\r\n body: {\r\n collection: mutation.collection,\r\n document: mutation.documentId,\r\n },\r\n }).sendRequest();\r\n\r\n if (!res?.success) return false;\r\n\r\n await this.persistence.markDeleted(mutation.collection, mutation.documentId, 0);\r\n\r\n this.store.emitDocument(mutation.collection, mutation.documentId, null, \"delete\");\r\n \r\n // Notify collection listeners WITHOUT fetching full collection\r\n this.store.notifyCollectionChanged(mutation.collection, mutation.documentId, \"delete\");\r\n\r\n return true;\r\n }\r\n\r\n private scheduleRetry(): void {\r\n if (this.retryTimeout) clearTimeout(this.retryTimeout);\r\n\r\n const delay = this.BASE_RETRY_DELAY * Math.pow(1.5, (Math.random() * 0.5)); // jitter\r\n this.retryTimeout = setTimeout(() => {\r\n this.flush().catch(console.error);\r\n }, delay);\r\n }\r\n\r\n // Public method users can call manually if needed\r\n async forceSync(): Promise<void> {\r\n return this.flush();\r\n }\r\n\r\n /**\r\n * Get all failed mutations for error handling/UI\r\n * Returns mutations that exceeded MAX_RETRIES\r\n */\r\n async getFailedMutations(): Promise<any[]> {\r\n const all = await this.persistence.getPendingMutations();\r\n return all.filter((m) => m.status === \"failed\");\r\n }\r\n\r\n /**\r\n * Retry a specific failed mutation by resetting its retry count\r\n * Useful for user-initiated recovery after fixing network/server issues\r\n */\r\n async retryMutation(mutationId: string): Promise<boolean> {\r\n const reset = await this.persistence.resetMutation(mutationId);\r\n if (!reset) return false;\r\n\r\n // Trigger flush immediately\r\n this.flush().catch(console.error);\r\n return true;\r\n }\r\n\r\n /**\r\n * Retry all failed mutations at once\r\n */\r\n async retryAllFailed(): Promise<number> {\r\n const failed = await this.getFailedMutations();\r\n for (const mut of failed) {\r\n await this.persistence.setMutationStatus(mut.mutationId, \"pending\");\r\n }\r\n \r\n if (failed.length > 0) {\r\n this.flush().catch(console.error);\r\n }\r\n \r\n return failed.length;\r\n }\r\n\r\n /**\r\n * Remove a mutation entirely (user acknowledges the failure and wants to discard it)\r\n * Be careful: this means the operation will never sync to the server\r\n */\r\n async removeMutation(mutationId: string): Promise<boolean> {\r\n try {\r\n await this.persistence.removeMutation(mutationId);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n dispose(): void {\r\n if (this.retryTimeout) {\r\n clearTimeout(this.retryTimeout);\r\n }\r\n }\r\n}","export class StorageSnapshot {\r\n id: string;\r\n data: Record<string, any>;\r\n\r\n private constructor(id: string, file: Record<string, any>) {\r\n this.id = id;\r\n this.data = file;\r\n }\r\n\r\n static fromMap(map: Record<string, any>): StorageSnapshot {\r\n const id = map.id ?? map._id ?? \"\";\r\n const document = map.file ?? map.data ?? map;\r\n\r\n return new StorageSnapshot(id, document);\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n id: this.id,\r\n data: this.data,\r\n };\r\n }\r\n}\r\n","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { EdmaxLabsConfig } from \"../core/EdmaxLabs.js\";\r\nimport { serverURI } from \"../utils/constants.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { StorageSnapshot } from \"./StorageSnapshot.js\";\r\nimport FormData from \"form-data\";\r\n\r\nexport default class StorageRef {\r\n private app: EdmaxLabs;\r\n private config: EdmaxLabsConfig;\r\n\r\n constructor(app: EdmaxLabs,config:EdmaxLabsConfig) {\r\n this.app = app;\r\n this.config = config;\r\n }\r\n\r\n async get(id:string): Promise<StorageSnapshot | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.GET,\r\n endpoint: serverURI + `/storage/${id}`,\r\n headers: {\r\n //authorization: this.app.getConfig.token,\r\n }\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return undefined;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async getMeta(id:string): Promise<StorageSnapshot | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.GET,\r\n endpoint: serverURI + `/storage/${id}/info`,\r\n headers: {\r\n //authorization: this.app.getConfig.token,\r\n }\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return undefined;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async upload(srcFile: File): Promise<StorageSnapshot | null | undefined> {\r\n if (!srcFile) {\r\n throw new Error(\"Invalid File\");\r\n }\r\n console.log(\"SRCF\")\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: serverURI + \"/storage/file/upload\",\r\n headers: { authorization: this.config.token,\"x-project\":this.config.project },\r\n file:srcFile,\r\n isMultipart:true\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return undefined;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n return result;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async delete(id:string): Promise<{ success: boolean; error: string }> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.config + \"/storage/file/delete\",\r\n headers: { authorization: this.config.token,\"x-project\":this.config.project },\r\n body: {\r\n file_id: id,\r\n },\r\n }).sendRequest();\r\n return res;\r\n }\r\n}\r\n","import Authentication from \"../authentication/Authentication.js\";\r\nimport Database from \"../database/Database.js\";\r\nimport Realtime from \"../database/Realtime.js\";\r\nimport Functions from \"../functions/Functions.js\";\r\nimport Hosting from \"../hosting/Hosting.js\";\r\nimport LocalStore from \"../persistence/LocalStore.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport RealtimeBridge from \"../persistence/RealtimeBridge.js\";\r\nimport SyncEngine from \"../persistence/SyncEngine.js\";\r\nimport StorageRef from \"../storage/StorageRef.js\";\r\nimport { serverURI, socketURI } from \"../utils/constants.js\";\r\n\r\nexport interface EdmaxLabsConfig {\r\n token: string;\r\n project: string;\r\n app_name?: string; // Used for cache isolation (prevents different users/apps sharing data)\r\n persistence?: boolean;\r\n default_bucket?: string;\r\n}\r\n\r\n\r\nexport default class EdmaxLabs {\r\n static instance: EdmaxLabs | null = null;\r\n\r\n private baseUrl: string;\r\n private socketUrl: string;\r\n\r\n private _db: Database;\r\n private _realtime: Realtime;\r\n private _hosting: Hosting;\r\n private _config: EdmaxLabsConfig;\r\n\r\n // Offline layer (only initialized when persistence: true)\r\n private persistence: Persistence | null = null;\r\n private localStore: LocalStore | null = null;\r\n private syncEngine: SyncEngine | null = null;\r\n private realtimeBridge: RealtimeBridge | null = null;\r\n\r\n constructor(config: EdmaxLabsConfig) {\r\n const { token, project, persistence = false } = config;\r\n\r\n if (!token || !project) {\r\n throw new Error(\"EdmaxLabs: 'token' and 'project' are required in config\");\r\n }\r\n\r\n this.baseUrl = serverURI;\r\n this.socketUrl = socketURI;\r\n this._config = config;\r\n\r\n // Core services\r\n this._db = new Database(this);\r\n this._realtime = new Realtime(this);\r\n this._hosting = new Hosting(this);\r\n\r\n // Offline-first layer (non-breaking)\r\n if (persistence) {\r\n const appName = config.app_name || config.project; // Fallback to project for backward compatibility\r\n this.persistence = new Persistence(appName);\r\n this.localStore = new LocalStore();\r\n this.realtimeBridge = new RealtimeBridge(this, this.persistence, this.localStore);\r\n\r\n // Important: Pass realtimeBridge to SyncEngine\r\n this.syncEngine = new SyncEngine(\r\n this,\r\n this.persistence,\r\n this.localStore,\r\n this.realtimeBridge\r\n );\r\n }\r\n }\r\n\r\n // ===================== PUBLIC API =====================\r\n\r\n /** Recommended for most React apps (creates fresh instance) */\r\n static create(config: EdmaxLabsConfig): EdmaxLabs {\r\n return new EdmaxLabs(config);\r\n }\r\n\r\n /** Firebase-style singleton (kept for backward compatibility) */\r\n static initialize(config: EdmaxLabsConfig): EdmaxLabs {\r\n if (!EdmaxLabs.instance) {\r\n EdmaxLabs.instance = new EdmaxLabs(config);\r\n }\r\n return EdmaxLabs.instance;\r\n }\r\n\r\n // ===================== CLEAN GETTERS =====================\r\n\r\n get getDatabase(): Database {\r\n return this._db;\r\n }\r\n\r\n get getFunctions(): Functions {\r\n return new Functions(this._config);\r\n }\r\n\r\n get getStorage(): StorageRef {\r\n return new StorageRef(this,this._config);\r\n }\r\n\r\n get getAuthentication(): Authentication {\r\n if (!Authentication.instance) {\r\n Authentication.instance = new Authentication();\r\n }\r\n return Authentication.instance!;\r\n }\r\n\r\n // ===================== OFFLINE UTILITIES =====================\r\n\r\n /** Check if offline features are enabled */\r\n get isOfflineEnabled(): boolean {\r\n return !!this.persistence;\r\n }\r\n\r\n /** Get current storage usage (approximate) */\r\n async getStorageUsage(): Promise<{ used: number; available: number } | null> {\r\n if (!this.persistence) return null;\r\n try {\r\n const usage = await this.persistence.getStorageUsage();\r\n // Estimate available (IndexedDB typically has 50MB-1GB limits)\r\n return { used: usage, available: 50 * 1024 * 1024 }; // 50MB estimate\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /** Clear all cached data (nuclear option) */\r\n async clearCache(): Promise<void> {\r\n if (this.persistence) {\r\n await this.persistence.clearAll();\r\n }\r\n this.localStore?.clearAllListeners();\r\n }\r\n\r\n /** New clean offline namespace - highly recommended */\r\n offline() {\r\n return {\r\n persistence: this.persistence,\r\n localStore: this.localStore,\r\n syncEngine: this.syncEngine,\r\n realtimeBridge: this.realtimeBridge,\r\n enabled: !!this.persistence,\r\n // Add cleanup utilities\r\n clearListeners: () => this.localStore?.clearAllListeners(),\r\n getListenerCount: () => this.localStore?.listenerCount || { documents: 0, collections: 0 },\r\n } as const;\r\n }\r\n\r\n /**\r\n * Manually trigger sync of pending mutations\r\n * Useful for progressive sync or after network restoration\r\n */\r\n async sync(): Promise<void> {\r\n if (!this.syncEngine) {\r\n console.warn(\"[EdmaxLabs] Sync called but persistence is not enabled\");\r\n return;\r\n }\r\n return this.syncEngine.forceSync();\r\n }\r\n\r\n /**\r\n * Get mutations that failed to sync (for error UI)\r\n */\r\n async getFailedMutations() {\r\n if (!this.syncEngine) return [];\r\n return this.syncEngine.getFailedMutations();\r\n }\r\n\r\n /**\r\n * Retry all failed mutations\r\n */\r\n async retrySync(): Promise<number> {\r\n if (!this.syncEngine) return 0;\r\n return this.syncEngine.retryAllFailed();\r\n }\r\n\r\n // Internal access (for internal classes only)\r\n getConfig(): EdmaxLabsConfig {\r\n return { ...this._config }; // return copy to prevent mutation\r\n }\r\n\r\n getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n getSocketUrl(): string {\r\n return this.socketUrl;\r\n }\r\n\r\n rtdb(): Realtime {\r\n return this._realtime;\r\n }\r\n\r\n // ===================== LIFECYCLE =====================\r\n\r\n /** Call this when your app unmounts or user logs out */\r\n dispose(): void {\r\n this._realtime.dispose?.();\r\n this.syncEngine?.dispose?.();\r\n this.realtimeBridge?.dispose?.();\r\n\r\n if (EdmaxLabs.instance === this) {\r\n EdmaxLabs.instance = null;\r\n }\r\n }\r\n}","export interface TimestampData {\r\n seconds: number;\r\n nanoseconds: number;\r\n}\r\n\r\nexport interface TimestampJSON {\r\n _type: \"timestamp\";\r\n seconds: number;\r\n nanoseconds: number;\r\n}\r\n\r\nexport class Timestamp implements TimestampData {\r\n seconds: number;\r\n nanoseconds: number;\r\n\r\n constructor(seconds: number, nanoseconds: number = 0) {\r\n this.seconds = seconds;\r\n this.nanoseconds = nanoseconds;\r\n }\r\n\r\n static now(): Timestamp {\r\n return Timestamp.fromMillis(Date.now());\r\n }\r\n\r\n static fromDate(date: Date): Timestamp {\r\n return new Timestamp(\r\n Math.floor(date.getTime() / 1000),\r\n (date.getTime() % 1000) * 1e6,\r\n );\r\n }\r\n\r\n static fromMillis(ms: number): Timestamp {\r\n return new Timestamp(Math.floor(ms / 1000), (ms % 1000) * 1e6);\r\n }\r\n\r\n static fromMongo(dateObj: Date): Timestamp {\r\n return Timestamp.fromMillis(dateObj.getTime());\r\n }\r\n\r\n static fromJSON(obj: Record<string, number>): Timestamp {\r\n return new Timestamp(obj.seconds, obj.nanoseconds);\r\n }\r\n\r\n toDate(): Date {\r\n return new Date(this.toMillis());\r\n }\r\n\r\n toMillis(): number {\r\n return this.seconds * 1000 + Math.floor(this.nanoseconds / 1e6);\r\n }\r\n\r\n sinceEpoch(): number {\r\n return this.seconds;\r\n }\r\n\r\n toMongo(): Date {\r\n return new Date(this.toMillis());\r\n }\r\n\r\n format(pattern: string = \"dd-MM-yyyy HH:mm:ss\"): string {\r\n const d = this.toDate();\r\n\r\n const monthsShort = [\r\n \"Jan\",\r\n \"Feb\",\r\n \"Mar\",\r\n \"Apr\",\r\n \"May\",\r\n \"Jun\",\r\n \"Jul\",\r\n \"Aug\",\r\n \"Sep\",\r\n \"Oct\",\r\n \"Nov\",\r\n \"Dec\",\r\n ];\r\n\r\n const monthsLong = [\r\n \"January\",\r\n \"February\",\r\n \"March\",\r\n \"April\",\r\n \"May\",\r\n \"June\",\r\n \"July\",\r\n \"August\",\r\n \"September\",\r\n \"October\",\r\n \"November\",\r\n \"December\",\r\n ];\r\n\r\n // Calculate 12-hour format and AM/PM\r\n const hours = d.getHours();\r\n const hours12 = hours % 12 === 0 ? 12 : hours % 12;\r\n const ampm = hours < 12 ? \"AM\" : \"PM\";\r\n\r\n const map: { [key: string]: string | number } = {\r\n dd: String(d.getDate()).padStart(2, \"0\"),\r\n MM: String(d.getMonth() + 1).padStart(2, \"0\"),\r\n yyyy: d.getFullYear(),\r\n HH: String(d.getHours()).padStart(2, \"0\"),\r\n mm: String(d.getMinutes()).padStart(2, \"0\"),\r\n ss: String(d.getSeconds()).padStart(2, \"0\"),\r\n SSS: String(d.getMilliseconds()).padStart(3, \"0\"),\r\n MMM: monthsShort[d.getMonth()],\r\n MMMM: monthsLong[d.getMonth()],\r\n a: ampm.toLowerCase(), // am/pm\r\n A: ampm, // AM/PM\r\n };\r\n\r\n // Order matters — match longest tokens first\r\n return pattern.replace(/MMMM|MMM|dd|MM|yyyy|HH|mm|ss|SSS|a|A/g, (match) =>\r\n String(map[match]),\r\n );\r\n }\r\n\r\n compare(other: Timestamp): number {\r\n if (this.seconds !== other.seconds) {\r\n return this.seconds - other.seconds;\r\n }\r\n return this.nanoseconds - other.nanoseconds;\r\n }\r\n\r\n relative(fmt: string = \"dd-MM-yyyy HH:mm:ss\"): string {\r\n const now = Date.now();\r\n const diff = now - this.toMillis();\r\n\r\n const sec = Math.floor(diff / 1000);\r\n if (sec < 60) return `${sec}s ago`;\r\n\r\n const min = Math.floor(sec / 60);\r\n if (min < 60) return `${min}m ago`;\r\n\r\n const hrs = Math.floor(min / 60);\r\n if (hrs < 24) return `${hrs}h ago`;\r\n\r\n const days = Math.floor(hrs / 24);\r\n if (days < 3) return `${days}d ago`;\r\n\r\n return this.format(fmt);\r\n }\r\n\r\n add({\r\n seconds = 0,\r\n minutes = 0,\r\n hours = 0,\r\n days = 0,\r\n }: {\r\n seconds?: number;\r\n minutes?: number;\r\n hours?: number;\r\n days?: number;\r\n }): Timestamp {\r\n const totalMs =\r\n seconds * 1000 + minutes * 60000 + hours * 3600000 + days * 86400000;\r\n\r\n return Timestamp.fromMillis(this.toMillis() + totalMs);\r\n }\r\n\r\n weekdayName(): string {\r\n return [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"][\r\n this.toDate().getDay()\r\n ];\r\n }\r\n\r\n toJSON(): TimestampJSON {\r\n return {\r\n _type: \"timestamp\",\r\n seconds: this.seconds,\r\n nanoseconds: this.nanoseconds,\r\n };\r\n }\r\n\r\n toString(): string {\r\n return this.format(\"yyyy-MM-dd HH:mm:ss\");\r\n }\r\n}\r\n","import { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport class ArraySnapshot {\r\n id?: string;\r\n data: Record<string, any>;\r\n dt: Timestamp;\r\n\r\n private constructor(\r\n id: string = \"\",\r\n index: number,\r\n data: Record<string, any>,\r\n dt?: Timestamp,\r\n ) {\r\n this.data = data;\r\n this.id = id;\r\n this.dt = dt ?? Timestamp.now();\r\n }\r\n\r\n static fromMap(map: Record<string, any>): ArraySnapshot {\r\n const index = map.index ?? map.index ?? -1;\r\n const id = map.id ?? map._id ?? \"\";\r\n const document = map.data ?? map.document ?? map;\r\n return new ArraySnapshot(id, index, document);\r\n }\r\n\r\n toMap(): Record<string, any> {\r\n return {\r\n id: this.id ?? \"\",\r\n data: this.data,\r\n dt: this.dt,\r\n };\r\n }\r\n}\r\n"],"mappings":"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","names":["response","document","document","localUnsub","target","document","document"]}