edmaxlabs-core 1.0.7 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +38 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.mjs +38 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -289,7 +289,8 @@ var Authentication = class {
|
|
|
289
289
|
body: {
|
|
290
290
|
path,
|
|
291
291
|
op: oparation,
|
|
292
|
-
context
|
|
292
|
+
context,
|
|
293
|
+
hello: "world"
|
|
293
294
|
}
|
|
294
295
|
}).sendRequest();
|
|
295
296
|
return res;
|
|
@@ -297,7 +298,8 @@ var Authentication = class {
|
|
|
297
298
|
this.client = EdmaxLabs.instance;
|
|
298
299
|
this.app = new EdmaxLabs({
|
|
299
300
|
token: this.client.getAuth.authToken,
|
|
300
|
-
authToken: this.client.getAuth.authToken
|
|
301
|
+
authToken: this.client.getAuth.authToken,
|
|
302
|
+
project: this.client.getAuth.project
|
|
301
303
|
});
|
|
302
304
|
this.init();
|
|
303
305
|
}
|
|
@@ -1435,6 +1437,34 @@ var Functions = class {
|
|
|
1435
1437
|
}
|
|
1436
1438
|
};
|
|
1437
1439
|
|
|
1440
|
+
// src/hosting/Hosting.ts
|
|
1441
|
+
var Hosting = class {
|
|
1442
|
+
constructor(app) {
|
|
1443
|
+
this.app = app;
|
|
1444
|
+
}
|
|
1445
|
+
async createSubdomain(name) {
|
|
1446
|
+
try {
|
|
1447
|
+
const res = await new HttpsRequest({
|
|
1448
|
+
method: "POST" /* POST */,
|
|
1449
|
+
endpoint: this.app.getBaseUrl + "/hosting/register",
|
|
1450
|
+
headers: {
|
|
1451
|
+
authorization: this.app.getAuth.token
|
|
1452
|
+
},
|
|
1453
|
+
body: {
|
|
1454
|
+
hostname: name,
|
|
1455
|
+
project: this.app.getAuth.project
|
|
1456
|
+
}
|
|
1457
|
+
}).sendRequest();
|
|
1458
|
+
return res;
|
|
1459
|
+
} catch (err) {
|
|
1460
|
+
throw {
|
|
1461
|
+
message: err.message || "Function call failed",
|
|
1462
|
+
code: err.code || "UNKNOWN_ERROR"
|
|
1463
|
+
};
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
};
|
|
1467
|
+
|
|
1438
1468
|
// src/storage/StorageSnapshot.ts
|
|
1439
1469
|
var StorageSnapshot = class _StorageSnapshot {
|
|
1440
1470
|
constructor(id, file) {
|
|
@@ -1555,13 +1585,14 @@ var socketURI = "https://api.edmaxlabs.com:4000";
|
|
|
1555
1585
|
|
|
1556
1586
|
// src/core/EdmaxLabs.ts
|
|
1557
1587
|
var _EdmaxLabs = class _EdmaxLabs {
|
|
1558
|
-
constructor({ token, authToken }) {
|
|
1588
|
+
constructor({ token, authToken, project }) {
|
|
1559
1589
|
this.persistence = false;
|
|
1560
1590
|
this.baseUrl = serverURI;
|
|
1561
1591
|
this.socketUrl = socketURI;
|
|
1562
|
-
this.auth = { token, authToken };
|
|
1592
|
+
this.auth = { token, authToken, project };
|
|
1563
1593
|
this._db = new Database(this);
|
|
1564
1594
|
this._storage = new Storage(this);
|
|
1595
|
+
this._hosting = new Hosting(this);
|
|
1565
1596
|
this.realtime = new Realtime(this);
|
|
1566
1597
|
this.persistence_worker = new CollectionRef(this);
|
|
1567
1598
|
}
|
|
@@ -1594,6 +1625,9 @@ var _EdmaxLabs = class _EdmaxLabs {
|
|
|
1594
1625
|
get storage() {
|
|
1595
1626
|
return this._storage;
|
|
1596
1627
|
}
|
|
1628
|
+
get hosting() {
|
|
1629
|
+
return this._hosting;
|
|
1630
|
+
}
|
|
1597
1631
|
get functions() {
|
|
1598
1632
|
return new Functions(this);
|
|
1599
1633
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/authentication/Credentials.ts","../src/utils/HttpsRequest.ts","../src/authentication/Authentication.ts","../src/database/Timestamp.ts","../src/database/ArraySnapshot.ts","../src/database/Array.ts","../src/database/DocumentSnapshot.ts","../src/database/DocumentRef.ts","../../../../../node_modules/idb/build/wrap-idb-value.js","../../../../../node_modules/idb/build/index.js","../src/persistence/Persistence.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/storage/StorageSnapshot.ts","../src/storage/StorageRef.ts","../src/storage/Storage.ts","../src/utils/constants.ts","../src/core/EdmaxLabs.ts"],"sourcesContent":["import EdmaxLabs 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\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};\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 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 ) {\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 }\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\r\n const result = new Credentials(\r\n uid,\r\n d_info,\r\n createdAt,\r\n updatedAt,\r\n lastLogged,\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 };\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 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, // Let browser handle multipart boundaries\r\n body: formData,\r\n });\r\n\r\n return await response.json();\r\n } else {\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: {\r\n ...this.headers,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(this.body),\r\n });\r\n\r\n return await response.json();\r\n }\r\n }\r\n}\r\n","import { disconnect } from \"mongoose\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport Realtime from \"../database/Realtime.js\";\r\nimport { Credentials } from \"./Credentials.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\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 constructor() {\r\n this.client = EdmaxLabs.instance!;\r\n this.app = new EdmaxLabs({\r\n token: this.client.getAuth.authToken,\r\n authToken: this.client.getAuth.authToken,\r\n });\r\n this.init();\r\n }\r\n\r\n private init = () => {\r\n const _currentUser = this.currentUser();\r\n if (!_currentUser) return undefined;\r\n console.log(\"Auth Listening...\", _currentUser);\r\n this.eUser = _currentUser;\r\n return this.eUser;\r\n };\r\n\r\n private saveCredentials = (credentials: Credentials | null) => {\r\n const ldb = localStorage;\r\n if (!credentials) {\r\n ldb.removeItem(\"eauth\");\r\n return;\r\n }\r\n ldb.setItem(\"eauth\", JSON.stringify(credentials));\r\n };\r\n\r\n currentUser = (): Credentials | undefined => {\r\n const ldb = localStorage;\r\n\r\n const data = ldb.getItem(\"eauth\");\r\n\r\n if (data === undefined || data === null) {\r\n return undefined;\r\n }\r\n\r\n const result = JSON.parse(data ?? \"{}\");\r\n\r\n return Credentials.fromMap(result);\r\n };\r\n\r\n authState = ({\r\n onChange,\r\n onSignOut,\r\n onDeleted,\r\n }: {\r\n onChange: (data: Credentials) => void;\r\n onDeleted?: () => void;\r\n onSignOut?: () => void;\r\n }) => {\r\n const cuser = this.currentUser();\r\n\r\n //console.log(\"Listening :|: \", cuser);\r\n\r\n if (!cuser) return;\r\n const userRef = this.app?.database.collection(\"users\").doc(cuser?.uid);\r\n\r\n //listen change state\r\n userRef?.onSnapshot((snapshot: DocumentSnapshot, change: string) => {\r\n if (this.eUser === null || this.eUser === undefined) return;\r\n\r\n if (change === \"insert\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n if (change === \"update\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n //On deleted\r\n if (change === \"delete\") {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n if (onDeleted) onDeleted();\r\n }\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 db = this.app?.database;\r\n\r\n //check if email already exists\r\n const data = await db\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 db?.collection(\"users\").add({\r\n email,\r\n password,\r\n token: this.client?.getAuth.token,\r\n logged: true,\r\n lastLogged: Date.now(),\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 db = this.app?.database;\r\n\r\n const data = await db\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 console.log(\"Signing ...\");\r\n\r\n this.eUser = Credentials.fromMap(_data);\r\n this.saveCredentials(this.eUser);\r\n\r\n await db?.collection(\"users\").doc(data[0].id).update({\r\n logged: true,\r\n lastLogged: Date.now(),\r\n });\r\n\r\n return Credentials.fromMap(data[0].toMap());\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 db = this.app?.database;\r\n const userRef = await db?.collection(\"users\").doc(this.eUser.uid).delete();\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 = undefined;\r\n this.saveCredentials(null);\r\n };\r\n\r\n signOut = async () => {\r\n const db = this.app?.database;\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 db?.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 oparation: 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!.getAuth.token,\r\n },\r\n body: {\r\n path,\r\n op: oparation,\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 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 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 };\r\n\r\n // Order matters — match longest tokens first\r\n return pattern.replace(/MMMM|MMM|dd|MM|yyyy|HH|mm|ss|SSS/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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { ArraySnapshot } from \"./ArraySnapshot.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class Array {\r\n db: EdmaxLabs;\r\n collection: string;\r\n key: string;\r\n docID: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, key: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.key = key;\r\n this.docID = id;\r\n }\r\n\r\n async show(): Promise<ArraySnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/show\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n if (d === undefined) return [];\r\n return ArraySnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async push(data: any, id?: string): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/push\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n data: data,\r\n id,\r\n dt: Timestamp.now(),\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async insert(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/insert\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async get(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async remove(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/remove\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Array from \"./Array.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class DocumentRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n id: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async set(data: any): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(data: any): Promise<DocumentSnapshot | null> {\r\n if (this.id === undefined) return null;\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async delete(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n array(key: string): Array {\r\n return new Array(this.db, this.collection, key, this.id);\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n return this.db.rtdb.subscribeToDocument(this.collection, this.id, callback);\r\n }\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 } from \"idb\";\r\nimport { Timestamp } from \"../database/Timestamp.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n }\r\n\r\n getIDB = (collection: string) => {\r\n const dbPromise = openDB(\"edmaxlabs\", 1, {\r\n upgrade(db) {\r\n if (!db.objectStoreNames.contains(collection)) {\r\n const store = db.createObjectStore(collection, {\r\n keyPath: \"id\",\r\n });\r\n\r\n store.createIndex(\"id\", \"id\");\r\n store.createIndex(\"status\", \"status\");\r\n }\r\n },\r\n });\r\n\r\n return dbPromise;\r\n };\r\n\r\n async syncPendingWrite(id: string, collection: string = \"default\") {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const oid = IDBKeyRange.only(id);\r\n\r\n const pendingPackets = await store.index(\"id\").getAll(oid);\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n return true;\r\n }\r\n } catch {\r\n // stay pending\r\n return false;\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n\r\n async syncPendingWrites(collection: string) {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const pendingPackets = await store\r\n .index(\"status\")\r\n .getAll(IDBKeyRange.only(\"pending\"));\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n }\r\n } catch {\r\n // stay pending\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n}\r\n\r\n// export const read = async (\r\n// collection: string,\r\n// id?: string,\r\n// projection?: any,\r\n// ) => {\r\n// const db = await getIDB(collection);\r\n// const tx = db.transaction(collection, \"readonly\");\r\n// const index = tx.store.index(\"pid\");\r\n\r\n// if (id) {\r\n// const result = await index.getAll(id);\r\n// return result as typeof projection;\r\n// }\r\n\r\n// const result = await index.getAll();\r\n// return result as typeof projection;\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\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 db: EdmaxLabs;\r\n collection: string;\r\n private filter: FilterExpression[] = [];\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n }\r\n\r\n where(expression: FilterExpression) {\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 // works for string fields\r\n mongoFilter[key] = { $regex: value };\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 async get(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n // console.log(\r\n // \"Q => \",\r\n // res.documents.map((d: Record<string, any>) => {\r\n // delete d.token;\r\n // d.id = d._id;\r\n // delete d._id;\r\n // return DocumentSnapshot.fromMap(d);\r\n // })\r\n // );\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async update(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n const genfilter = this.buildFilter();\r\n return this.db.rtdb.subscribeToCollection(\r\n this.collection,\r\n callback,\r\n genfilter\r\n );\r\n }\r\n}\r\n","import DocumentRef from \"./DocumentRef.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Query from \"./Query.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport { Packet } from \"../persistence/models/Packet.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n persistence: Persistence;\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.persistence = new Persistence(db);\r\n }\r\n\r\n doc(id: string): DocumentRef {\r\n return new DocumentRef(this.db, this.collection, id);\r\n }\r\n\r\n get query(): Query {\r\n return new Query(this.db, this.collection);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\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) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n if (d === undefined) return [];\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async add(data: any): Promise<DocumentSnapshot | null> {\r\n // const db = await this.persistence.getIDB(this.collection);\r\n // const tx = db.transaction(this.collection, \"readwrite\");\r\n // const store = tx.store;\r\n\r\n const localId = Timestamp.now().toString();\r\n\r\n const payload: Packet = {\r\n id: localId,\r\n data,\r\n collection: this.collection,\r\n action: \"create\",\r\n status: \"pending\",\r\n timestamp: Timestamp.now(),\r\n };\r\n\r\n // 1️⃣ Persist locally first\r\n if (this.db.getPersistence) {\r\n // await store.put(payload); // PUT, not ADD\r\n // await tx.done;\r\n }\r\n\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n data: payload.data,\r\n },\r\n }).sendRequest();\r\n\r\n console.log(res);\r\n\r\n if (!res?.success || !res.id) {\r\n // mark failed but keep for retry\r\n payload.status = \"failed\";\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n return null;\r\n }\r\n\r\n // 2️⃣ Sync success\r\n payload.status = \"success\";\r\n payload.id = res.id; // IMPORTANT\r\n\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n\r\n return DocumentSnapshot.fromMap({\r\n ...res,\r\n });\r\n } catch (error) {\r\n console.error(\"Error adding document:\", error);\r\n\r\n // stay pending for retry\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n ): () => void {\r\n return this.db.rtdb.subscribeToCollection(this.collection, callback, {});\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\n\r\nexport default class Batch {\r\n app: EdmaxLabs;\r\n ops: any[];\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n this.ops = [];\r\n }\r\n\r\n set(docRef: DocumentRef, data: any) {\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 update(docRef: DocumentRef, data: any) {\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) {\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() {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/batch\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: this.ops,\r\n },\r\n }).sendRequest();\r\n if (res?.error) throw new Error(res.error.message || \"Batch commit failed\");\r\n return res;\r\n }\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 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 'collection/id'\");\r\n }\r\n\r\n batch(): Batch {\r\n return new Batch(this.app);\r\n }\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();\r\n },\r\n set(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"set\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n update(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"update\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n delete(docRef: DocumentRef) {\r\n tx.ops.push({\r\n op: \"delete\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n });\r\n },\r\n };\r\n\r\n await transactionFn(tx);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/transaction\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: tx.ops,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.error) throw new Error(res.error.message || \"Transaction failed\");\r\n return res;\r\n }\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 { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class Realtime {\r\n db: EdmaxLabs;\r\n socket: Socket | null;\r\n events: string[];\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n this.socket = null;\r\n this.events = [\"error\", \"insert\", \"update\", \"delete\"];\r\n }\r\n\r\n connect() {\r\n if (!this.db.getAuth?.token) throw new Error(\"Auth token missing\");\r\n\r\n this.socket = io(this.db.getSocketUrl, {\r\n transports: [\"websocket\"],\r\n auth: { token: this.db.getAuth.token },\r\n });\r\n\r\n return this.socket;\r\n }\r\n\r\n on(event: string, cb: (...args: any[]) => void) {\r\n this.socket?.on(event, cb);\r\n }\r\n\r\n off(event: string, cb?: (...args: any[]) => 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) {\r\n this.socket?.emit(event, data);\r\n }\r\n\r\n // ------------------------------------------------------------\r\n // 🔥 ADDITIONS BELOW — NO BREAKING CHANGES\r\n // ------------------------------------------------------------\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n subscribeToCollection(\r\n collection: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n filter?: Record<string, any>\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n if (!filter) {\r\n filter = {};\r\n }\r\n\r\n const lid = `${generateUUID()}`;\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n this.socket!.on(`${lid}-${event}`, handler);\r\n });\r\n\r\n // return unsubscribe fn\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n subscribeToDocument(\r\n collection: string,\r\n id: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n const lid = id;\r\n this.socket!.emit(\"subscribe\", {\r\n collection,\r\n filter: {\r\n _id: lid,\r\n },\r\n lid,\r\n });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n const listener = `${lid}-${event}`;\r\n this.socket!.on(listener, handler);\r\n });\r\n\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\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/\" + functionName,\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\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","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 db: EdmaxLabs;\r\n id: string;\r\n file: StorageSnapshot | undefined | null;\r\n\r\n constructor(db: EdmaxLabs, id: string) {\r\n this.db = db;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<StorageRef | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async upload(srcFile: File): Promise<StorageRef | null | undefined> {\r\n if (!srcFile) {\r\n throw new Error(\"Invalid File\");\r\n }\r\n\r\n const form = new FormData();\r\n form.append(\"file\", srcFile, srcFile.name);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/upload\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n ...form.getHeaders(),\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getBaseUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n getDownloadUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/d/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n async delete(): Promise<{ success: boolean; error: string }> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.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 get(file_id: string): StorageRef {\r\n if (!file_id || file_id === \"\") {\r\n throw new Error(\"File ID is Invalid\");\r\n }\r\n return new StorageRef(this.app, file_id);\r\n }\r\n}\r\n","const serverURI = \"https://api.edmaxlabs.com/api/v2\";\r\nconst socketURI = \"https://api.edmaxlabs.com:4000\";\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 Persistence from \"../persistence/Persistence.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 authToken: string;\r\n}\r\n\r\nexport interface AuthState {\r\n token: string;\r\n authToken: string;\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 private auth: AuthState;\r\n private _db: Database;\r\n private _storage: Storage;\r\n private realtime: Realtime;\r\n private persistence: boolean = false;\r\n private persistence_worker: Persistence;\r\n\r\n constructor({ token, authToken }: EdmaxLabsConfig) {\r\n this.baseUrl = serverURI;\r\n this.socketUrl = socketURI;\r\n this.auth = { token, authToken };\r\n this._db = new Database(this);\r\n this._storage = new Storage(this);\r\n this.realtime = new Realtime(this);\r\n this.persistence_worker = new Persistence(this);\r\n }\r\n\r\n static allowPersistence(enable: boolean) {\r\n if (EdmaxLabs.instance) {\r\n EdmaxLabs.instance.persistence = enable;\r\n }\r\n }\r\n\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 get getPersistence(): boolean {\r\n return this.persistence;\r\n }\r\n\r\n get getAuth(): Record<string, any> {\r\n return this.auth;\r\n }\r\n\r\n get getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n get getSocketUrl(): string {\r\n return this.socketUrl;\r\n }\r\n\r\n get database(): Database {\r\n return this._db;\r\n }\r\n\r\n get storage(): Storage {\r\n return this._storage;\r\n }\r\n\r\n get functions(): Functions {\r\n return new Functions(this);\r\n }\r\n\r\n get rtdb(): Realtime {\r\n return this.realtime;\r\n }\r\n\r\n sync(id: string, collection?: string): Promise<boolean | undefined> {\r\n if (!this.getPersistence) {\r\n throw new Error(\"Persistence is Off Can't Sync.\");\r\n }\r\n return this.persistence_worker!.syncPendingWrite(id, collection);\r\n }\r\n\r\n get authentication(): 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"],"mappings":"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","names":["target","CollectionRef","CollectionRef","FormData"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/authentication/Credentials.ts","../src/utils/HttpsRequest.ts","../src/authentication/Authentication.ts","../src/database/Timestamp.ts","../src/database/ArraySnapshot.ts","../src/database/Array.ts","../src/database/DocumentSnapshot.ts","../src/database/DocumentRef.ts","../../../../../node_modules/idb/build/wrap-idb-value.js","../../../../../node_modules/idb/build/index.js","../src/persistence/Persistence.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/storage/StorageSnapshot.ts","../src/storage/StorageRef.ts","../src/storage/Storage.ts","../src/utils/constants.ts","../src/core/EdmaxLabs.ts"],"sourcesContent":["import EdmaxLabs 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\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};\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 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 ) {\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 }\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\r\n const result = new Credentials(\r\n uid,\r\n d_info,\r\n createdAt,\r\n updatedAt,\r\n lastLogged,\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 };\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 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, // Let browser handle multipart boundaries\r\n body: formData,\r\n });\r\n\r\n return await response.json();\r\n } else {\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: {\r\n ...this.headers,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(this.body),\r\n });\r\n\r\n return await response.json();\r\n }\r\n }\r\n}\r\n","import { disconnect } from \"mongoose\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport Realtime from \"../database/Realtime.js\";\r\nimport { Credentials } from \"./Credentials.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\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 constructor() {\r\n this.client = EdmaxLabs.instance!;\r\n this.app = new EdmaxLabs({\r\n token: this.client.getAuth.authToken,\r\n authToken: this.client.getAuth.authToken,\r\n project: this.client.getAuth.project,\r\n });\r\n this.init();\r\n }\r\n\r\n private init = () => {\r\n const _currentUser = this.currentUser();\r\n if (!_currentUser) return undefined;\r\n console.log(\"Auth Listening...\", _currentUser);\r\n this.eUser = _currentUser;\r\n return this.eUser;\r\n };\r\n\r\n private saveCredentials = (credentials: Credentials | null) => {\r\n const ldb = localStorage;\r\n if (!credentials) {\r\n ldb.removeItem(\"eauth\");\r\n return;\r\n }\r\n ldb.setItem(\"eauth\", JSON.stringify(credentials));\r\n };\r\n\r\n currentUser = (): Credentials | undefined => {\r\n const ldb = localStorage;\r\n\r\n const data = ldb.getItem(\"eauth\");\r\n\r\n if (data === undefined || data === null) {\r\n return undefined;\r\n }\r\n\r\n const result = JSON.parse(data ?? \"{}\");\r\n\r\n return Credentials.fromMap(result);\r\n };\r\n\r\n authState = ({\r\n onChange,\r\n onSignOut,\r\n onDeleted,\r\n }: {\r\n onChange: (data: Credentials) => void;\r\n onDeleted?: () => void;\r\n onSignOut?: () => void;\r\n }) => {\r\n const cuser = this.currentUser();\r\n\r\n //console.log(\"Listening :|: \", cuser);\r\n\r\n if (!cuser) return;\r\n const userRef = this.app?.database.collection(\"users\").doc(cuser?.uid);\r\n\r\n //listen change state\r\n userRef?.onSnapshot((snapshot: DocumentSnapshot, change: string) => {\r\n if (this.eUser === null || this.eUser === undefined) return;\r\n\r\n if (change === \"insert\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n if (change === \"update\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n //On deleted\r\n if (change === \"delete\") {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n if (onDeleted) onDeleted();\r\n }\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 db = this.app?.database;\r\n\r\n //check if email already exists\r\n const data = await db\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 db?.collection(\"users\").add({\r\n email,\r\n password,\r\n token: this.client?.getAuth.token,\r\n logged: true,\r\n lastLogged: Date.now(),\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 db = this.app?.database;\r\n\r\n const data = await db\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 console.log(\"Signing ...\");\r\n\r\n this.eUser = Credentials.fromMap(_data);\r\n this.saveCredentials(this.eUser);\r\n\r\n await db?.collection(\"users\").doc(data[0].id).update({\r\n logged: true,\r\n lastLogged: Date.now(),\r\n });\r\n\r\n return Credentials.fromMap(data[0].toMap());\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 db = this.app?.database;\r\n const userRef = await db?.collection(\"users\").doc(this.eUser.uid).delete();\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 = undefined;\r\n this.saveCredentials(null);\r\n };\r\n\r\n signOut = async () => {\r\n const db = this.app?.database;\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 db?.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 oparation: 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!.getAuth.token,\r\n },\r\n body: {\r\n path,\r\n op: oparation,\r\n context: context,\r\n hello: \"world\",\r\n },\r\n }).sendRequest();\r\n\r\n return res as { success: boolean; allowed: any };\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 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 };\r\n\r\n // Order matters — match longest tokens first\r\n return pattern.replace(/MMMM|MMM|dd|MM|yyyy|HH|mm|ss|SSS/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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { ArraySnapshot } from \"./ArraySnapshot.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class Array {\r\n db: EdmaxLabs;\r\n collection: string;\r\n key: string;\r\n docID: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, key: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.key = key;\r\n this.docID = id;\r\n }\r\n\r\n async show(): Promise<ArraySnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/show\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n if (d === undefined) return [];\r\n return ArraySnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async push(data: any, id?: string): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/push\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n data: data,\r\n id,\r\n dt: Timestamp.now(),\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async insert(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/insert\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async get(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async remove(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/remove\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Array from \"./Array.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class DocumentRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n id: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async set(data: any): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(data: any): Promise<DocumentSnapshot | null> {\r\n if (this.id === undefined) return null;\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async delete(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n array(key: string): Array {\r\n return new Array(this.db, this.collection, key, this.id);\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n return this.db.rtdb.subscribeToDocument(this.collection, this.id, callback);\r\n }\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 } from \"idb\";\r\nimport { Timestamp } from \"../database/Timestamp.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n }\r\n\r\n getIDB = (collection: string) => {\r\n const dbPromise = openDB(\"edmaxlabs\", 1, {\r\n upgrade(db) {\r\n if (!db.objectStoreNames.contains(collection)) {\r\n const store = db.createObjectStore(collection, {\r\n keyPath: \"id\",\r\n });\r\n\r\n store.createIndex(\"id\", \"id\");\r\n store.createIndex(\"status\", \"status\");\r\n }\r\n },\r\n });\r\n\r\n return dbPromise;\r\n };\r\n\r\n async syncPendingWrite(id: string, collection: string = \"default\") {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const oid = IDBKeyRange.only(id);\r\n\r\n const pendingPackets = await store.index(\"id\").getAll(oid);\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n return true;\r\n }\r\n } catch {\r\n // stay pending\r\n return false;\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n\r\n async syncPendingWrites(collection: string) {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const pendingPackets = await store\r\n .index(\"status\")\r\n .getAll(IDBKeyRange.only(\"pending\"));\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n }\r\n } catch {\r\n // stay pending\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n}\r\n\r\n// export const read = async (\r\n// collection: string,\r\n// id?: string,\r\n// projection?: any,\r\n// ) => {\r\n// const db = await getIDB(collection);\r\n// const tx = db.transaction(collection, \"readonly\");\r\n// const index = tx.store.index(\"pid\");\r\n\r\n// if (id) {\r\n// const result = await index.getAll(id);\r\n// return result as typeof projection;\r\n// }\r\n\r\n// const result = await index.getAll();\r\n// return result as typeof projection;\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\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 db: EdmaxLabs;\r\n collection: string;\r\n private filter: FilterExpression[] = [];\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n }\r\n\r\n where(expression: FilterExpression) {\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 // works for string fields\r\n mongoFilter[key] = { $regex: value };\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 async get(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n // console.log(\r\n // \"Q => \",\r\n // res.documents.map((d: Record<string, any>) => {\r\n // delete d.token;\r\n // d.id = d._id;\r\n // delete d._id;\r\n // return DocumentSnapshot.fromMap(d);\r\n // })\r\n // );\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async update(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n const genfilter = this.buildFilter();\r\n return this.db.rtdb.subscribeToCollection(\r\n this.collection,\r\n callback,\r\n genfilter\r\n );\r\n }\r\n}\r\n","import DocumentRef from \"./DocumentRef.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Query from \"./Query.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport { Packet } from \"../persistence/models/Packet.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n persistence: Persistence;\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.persistence = new Persistence(db);\r\n }\r\n\r\n doc(id: string): DocumentRef {\r\n return new DocumentRef(this.db, this.collection, id);\r\n }\r\n\r\n get query(): Query {\r\n return new Query(this.db, this.collection);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\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) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n if (d === undefined) return [];\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async add(data: any): Promise<DocumentSnapshot | null> {\r\n // const db = await this.persistence.getIDB(this.collection);\r\n // const tx = db.transaction(this.collection, \"readwrite\");\r\n // const store = tx.store;\r\n\r\n const localId = Timestamp.now().toString();\r\n\r\n const payload: Packet = {\r\n id: localId,\r\n data,\r\n collection: this.collection,\r\n action: \"create\",\r\n status: \"pending\",\r\n timestamp: Timestamp.now(),\r\n };\r\n\r\n // 1️⃣ Persist locally first\r\n if (this.db.getPersistence) {\r\n // await store.put(payload); // PUT, not ADD\r\n // await tx.done;\r\n }\r\n\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n data: payload.data,\r\n },\r\n }).sendRequest();\r\n\r\n console.log(res);\r\n\r\n if (!res?.success || !res.id) {\r\n // mark failed but keep for retry\r\n payload.status = \"failed\";\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n return null;\r\n }\r\n\r\n // 2️⃣ Sync success\r\n payload.status = \"success\";\r\n payload.id = res.id; // IMPORTANT\r\n\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n\r\n return DocumentSnapshot.fromMap({\r\n ...res,\r\n });\r\n } catch (error) {\r\n console.error(\"Error adding document:\", error);\r\n\r\n // stay pending for retry\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n ): () => void {\r\n return this.db.rtdb.subscribeToCollection(this.collection, callback, {});\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\n\r\nexport default class Batch {\r\n app: EdmaxLabs;\r\n ops: any[];\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n this.ops = [];\r\n }\r\n\r\n set(docRef: DocumentRef, data: any) {\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 update(docRef: DocumentRef, data: any) {\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) {\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() {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/batch\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: this.ops,\r\n },\r\n }).sendRequest();\r\n if (res?.error) throw new Error(res.error.message || \"Batch commit failed\");\r\n return res;\r\n }\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 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 'collection/id'\");\r\n }\r\n\r\n batch(): Batch {\r\n return new Batch(this.app);\r\n }\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();\r\n },\r\n set(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"set\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n update(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"update\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n delete(docRef: DocumentRef) {\r\n tx.ops.push({\r\n op: \"delete\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n });\r\n },\r\n };\r\n\r\n await transactionFn(tx);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/transaction\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: tx.ops,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.error) throw new Error(res.error.message || \"Transaction failed\");\r\n return res;\r\n }\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 { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class Realtime {\r\n db: EdmaxLabs;\r\n socket: Socket | null;\r\n events: string[];\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n this.socket = null;\r\n this.events = [\"error\", \"insert\", \"update\", \"delete\"];\r\n }\r\n\r\n connect() {\r\n if (!this.db.getAuth?.token) throw new Error(\"Auth token missing\");\r\n\r\n this.socket = io(this.db.getSocketUrl, {\r\n transports: [\"websocket\"],\r\n auth: { token: this.db.getAuth.token },\r\n });\r\n\r\n return this.socket;\r\n }\r\n\r\n on(event: string, cb: (...args: any[]) => void) {\r\n this.socket?.on(event, cb);\r\n }\r\n\r\n off(event: string, cb?: (...args: any[]) => 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) {\r\n this.socket?.emit(event, data);\r\n }\r\n\r\n // ------------------------------------------------------------\r\n // 🔥 ADDITIONS BELOW — NO BREAKING CHANGES\r\n // ------------------------------------------------------------\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n subscribeToCollection(\r\n collection: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n filter?: Record<string, any>\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n if (!filter) {\r\n filter = {};\r\n }\r\n\r\n const lid = `${generateUUID()}`;\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n this.socket!.on(`${lid}-${event}`, handler);\r\n });\r\n\r\n // return unsubscribe fn\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n subscribeToDocument(\r\n collection: string,\r\n id: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n const lid = id;\r\n this.socket!.emit(\"subscribe\", {\r\n collection,\r\n filter: {\r\n _id: lid,\r\n },\r\n lid,\r\n });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n const listener = `${lid}-${event}`;\r\n this.socket!.on(listener, handler);\r\n });\r\n\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\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/\" + functionName,\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\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: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n hostname: name,\r\n project: this.app.getAuth.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","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 db: EdmaxLabs;\r\n id: string;\r\n file: StorageSnapshot | undefined | null;\r\n\r\n constructor(db: EdmaxLabs, id: string) {\r\n this.db = db;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<StorageRef | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async upload(srcFile: File): Promise<StorageRef | null | undefined> {\r\n if (!srcFile) {\r\n throw new Error(\"Invalid File\");\r\n }\r\n\r\n const form = new FormData();\r\n form.append(\"file\", srcFile, srcFile.name);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/upload\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n ...form.getHeaders(),\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getBaseUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n getDownloadUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/d/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n async delete(): Promise<{ success: boolean; error: string }> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.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 get(file_id: string): StorageRef {\r\n if (!file_id || file_id === \"\") {\r\n throw new Error(\"File ID is Invalid\");\r\n }\r\n return new StorageRef(this.app, file_id);\r\n }\r\n}\r\n","const serverURI = \"https://api.edmaxlabs.com/api/v2\";\r\nconst socketURI = \"https://api.edmaxlabs.com:4000\";\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 Persistence from \"../persistence/Persistence.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 authToken: string;\r\n}\r\n\r\nexport interface AuthState {\r\n token: string;\r\n project: string;\r\n authToken: string;\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 private auth: AuthState;\r\n private _db: Database;\r\n private _storage: Storage;\r\n private _hosting: Hosting;\r\n private realtime: Realtime;\r\n private persistence: boolean = false;\r\n private persistence_worker: Persistence;\r\n\r\n constructor({ token, authToken, project }: EdmaxLabsConfig) {\r\n this.baseUrl = serverURI;\r\n this.socketUrl = socketURI;\r\n this.auth = { token, authToken, project };\r\n this._db = new Database(this);\r\n this._storage = new Storage(this);\r\n this._hosting = new Hosting(this);\r\n this.realtime = new Realtime(this);\r\n this.persistence_worker = new Persistence(this);\r\n }\r\n\r\n static allowPersistence(enable: boolean) {\r\n if (EdmaxLabs.instance) {\r\n EdmaxLabs.instance.persistence = enable;\r\n }\r\n }\r\n\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 get getPersistence(): boolean {\r\n return this.persistence;\r\n }\r\n\r\n get getAuth(): Record<string, any> {\r\n return this.auth;\r\n }\r\n\r\n get getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n get getSocketUrl(): string {\r\n return this.socketUrl;\r\n }\r\n\r\n get database(): Database {\r\n return this._db;\r\n }\r\n\r\n get storage(): Storage {\r\n return this._storage;\r\n }\r\n\r\n get hosting(): Hosting {\r\n return this._hosting;\r\n }\r\n\r\n get functions(): Functions {\r\n return new Functions(this);\r\n }\r\n\r\n get rtdb(): Realtime {\r\n return this.realtime;\r\n }\r\n\r\n sync(id: string, collection?: string): Promise<boolean | undefined> {\r\n if (!this.getPersistence) {\r\n throw new Error(\"Persistence is Off Can't Sync.\");\r\n }\r\n return this.persistence_worker!.syncPendingWrite(id, collection);\r\n }\r\n\r\n get authentication(): 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"],"mappings":"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","names":["target","CollectionRef","CollectionRef","FormData"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -224,6 +224,12 @@ declare class Functions {
|
|
|
224
224
|
call(functionName: string, data?: Record<string, any>): Promise<any>;
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
+
declare class Hosting {
|
|
228
|
+
app: EdmaxLabs;
|
|
229
|
+
constructor(app: EdmaxLabs);
|
|
230
|
+
createSubdomain(name: string): Promise<any>;
|
|
231
|
+
}
|
|
232
|
+
|
|
227
233
|
declare class StorageSnapshot {
|
|
228
234
|
id: string;
|
|
229
235
|
data: Record<string, any>;
|
|
@@ -255,6 +261,7 @@ declare class Storage {
|
|
|
255
261
|
|
|
256
262
|
interface EdmaxLabsConfig {
|
|
257
263
|
token: string;
|
|
264
|
+
project: string;
|
|
258
265
|
authToken: string;
|
|
259
266
|
}
|
|
260
267
|
declare class EdmaxLabs {
|
|
@@ -264,10 +271,11 @@ declare class EdmaxLabs {
|
|
|
264
271
|
private auth;
|
|
265
272
|
private _db;
|
|
266
273
|
private _storage;
|
|
274
|
+
private _hosting;
|
|
267
275
|
private realtime;
|
|
268
276
|
private persistence;
|
|
269
277
|
private persistence_worker;
|
|
270
|
-
constructor({ token, authToken }: EdmaxLabsConfig);
|
|
278
|
+
constructor({ token, authToken, project }: EdmaxLabsConfig);
|
|
271
279
|
static allowPersistence(enable: boolean): void;
|
|
272
280
|
static initialize(config: EdmaxLabsConfig): EdmaxLabs;
|
|
273
281
|
get getPersistence(): boolean;
|
|
@@ -276,6 +284,7 @@ declare class EdmaxLabs {
|
|
|
276
284
|
get getSocketUrl(): string;
|
|
277
285
|
get database(): Database;
|
|
278
286
|
get storage(): Storage;
|
|
287
|
+
get hosting(): Hosting;
|
|
279
288
|
get functions(): Functions;
|
|
280
289
|
get rtdb(): Realtime;
|
|
281
290
|
sync(id: string, collection?: string): Promise<boolean | undefined>;
|
package/dist/index.d.ts
CHANGED
|
@@ -224,6 +224,12 @@ declare class Functions {
|
|
|
224
224
|
call(functionName: string, data?: Record<string, any>): Promise<any>;
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
+
declare class Hosting {
|
|
228
|
+
app: EdmaxLabs;
|
|
229
|
+
constructor(app: EdmaxLabs);
|
|
230
|
+
createSubdomain(name: string): Promise<any>;
|
|
231
|
+
}
|
|
232
|
+
|
|
227
233
|
declare class StorageSnapshot {
|
|
228
234
|
id: string;
|
|
229
235
|
data: Record<string, any>;
|
|
@@ -255,6 +261,7 @@ declare class Storage {
|
|
|
255
261
|
|
|
256
262
|
interface EdmaxLabsConfig {
|
|
257
263
|
token: string;
|
|
264
|
+
project: string;
|
|
258
265
|
authToken: string;
|
|
259
266
|
}
|
|
260
267
|
declare class EdmaxLabs {
|
|
@@ -264,10 +271,11 @@ declare class EdmaxLabs {
|
|
|
264
271
|
private auth;
|
|
265
272
|
private _db;
|
|
266
273
|
private _storage;
|
|
274
|
+
private _hosting;
|
|
267
275
|
private realtime;
|
|
268
276
|
private persistence;
|
|
269
277
|
private persistence_worker;
|
|
270
|
-
constructor({ token, authToken }: EdmaxLabsConfig);
|
|
278
|
+
constructor({ token, authToken, project }: EdmaxLabsConfig);
|
|
271
279
|
static allowPersistence(enable: boolean): void;
|
|
272
280
|
static initialize(config: EdmaxLabsConfig): EdmaxLabs;
|
|
273
281
|
get getPersistence(): boolean;
|
|
@@ -276,6 +284,7 @@ declare class EdmaxLabs {
|
|
|
276
284
|
get getSocketUrl(): string;
|
|
277
285
|
get database(): Database;
|
|
278
286
|
get storage(): Storage;
|
|
287
|
+
get hosting(): Hosting;
|
|
279
288
|
get functions(): Functions;
|
|
280
289
|
get rtdb(): Realtime;
|
|
281
290
|
sync(id: string, collection?: string): Promise<boolean | undefined>;
|
package/dist/index.mjs
CHANGED
|
@@ -248,7 +248,8 @@ var Authentication = class {
|
|
|
248
248
|
body: {
|
|
249
249
|
path,
|
|
250
250
|
op: oparation,
|
|
251
|
-
context
|
|
251
|
+
context,
|
|
252
|
+
hello: "world"
|
|
252
253
|
}
|
|
253
254
|
}).sendRequest();
|
|
254
255
|
return res;
|
|
@@ -256,7 +257,8 @@ var Authentication = class {
|
|
|
256
257
|
this.client = EdmaxLabs.instance;
|
|
257
258
|
this.app = new EdmaxLabs({
|
|
258
259
|
token: this.client.getAuth.authToken,
|
|
259
|
-
authToken: this.client.getAuth.authToken
|
|
260
|
+
authToken: this.client.getAuth.authToken,
|
|
261
|
+
project: this.client.getAuth.project
|
|
260
262
|
});
|
|
261
263
|
this.init();
|
|
262
264
|
}
|
|
@@ -1394,6 +1396,34 @@ var Functions = class {
|
|
|
1394
1396
|
}
|
|
1395
1397
|
};
|
|
1396
1398
|
|
|
1399
|
+
// src/hosting/Hosting.ts
|
|
1400
|
+
var Hosting = class {
|
|
1401
|
+
constructor(app) {
|
|
1402
|
+
this.app = app;
|
|
1403
|
+
}
|
|
1404
|
+
async createSubdomain(name) {
|
|
1405
|
+
try {
|
|
1406
|
+
const res = await new HttpsRequest({
|
|
1407
|
+
method: "POST" /* POST */,
|
|
1408
|
+
endpoint: this.app.getBaseUrl + "/hosting/register",
|
|
1409
|
+
headers: {
|
|
1410
|
+
authorization: this.app.getAuth.token
|
|
1411
|
+
},
|
|
1412
|
+
body: {
|
|
1413
|
+
hostname: name,
|
|
1414
|
+
project: this.app.getAuth.project
|
|
1415
|
+
}
|
|
1416
|
+
}).sendRequest();
|
|
1417
|
+
return res;
|
|
1418
|
+
} catch (err) {
|
|
1419
|
+
throw {
|
|
1420
|
+
message: err.message || "Function call failed",
|
|
1421
|
+
code: err.code || "UNKNOWN_ERROR"
|
|
1422
|
+
};
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
};
|
|
1426
|
+
|
|
1397
1427
|
// src/storage/StorageSnapshot.ts
|
|
1398
1428
|
var StorageSnapshot = class _StorageSnapshot {
|
|
1399
1429
|
constructor(id, file) {
|
|
@@ -1514,13 +1544,14 @@ var socketURI = "https://api.edmaxlabs.com:4000";
|
|
|
1514
1544
|
|
|
1515
1545
|
// src/core/EdmaxLabs.ts
|
|
1516
1546
|
var _EdmaxLabs = class _EdmaxLabs {
|
|
1517
|
-
constructor({ token, authToken }) {
|
|
1547
|
+
constructor({ token, authToken, project }) {
|
|
1518
1548
|
this.persistence = false;
|
|
1519
1549
|
this.baseUrl = serverURI;
|
|
1520
1550
|
this.socketUrl = socketURI;
|
|
1521
|
-
this.auth = { token, authToken };
|
|
1551
|
+
this.auth = { token, authToken, project };
|
|
1522
1552
|
this._db = new Database(this);
|
|
1523
1553
|
this._storage = new Storage(this);
|
|
1554
|
+
this._hosting = new Hosting(this);
|
|
1524
1555
|
this.realtime = new Realtime(this);
|
|
1525
1556
|
this.persistence_worker = new CollectionRef(this);
|
|
1526
1557
|
}
|
|
@@ -1553,6 +1584,9 @@ var _EdmaxLabs = class _EdmaxLabs {
|
|
|
1553
1584
|
get storage() {
|
|
1554
1585
|
return this._storage;
|
|
1555
1586
|
}
|
|
1587
|
+
get hosting() {
|
|
1588
|
+
return this._hosting;
|
|
1589
|
+
}
|
|
1556
1590
|
get functions() {
|
|
1557
1591
|
return new Functions(this);
|
|
1558
1592
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/authentication/Credentials.ts","../src/utils/HttpsRequest.ts","../src/authentication/Authentication.ts","../src/database/Timestamp.ts","../src/database/ArraySnapshot.ts","../src/database/Array.ts","../src/database/DocumentSnapshot.ts","../src/database/DocumentRef.ts","../../../../../node_modules/idb/build/wrap-idb-value.js","../../../../../node_modules/idb/build/index.js","../src/persistence/Persistence.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/storage/StorageSnapshot.ts","../src/storage/StorageRef.ts","../src/storage/Storage.ts","../src/utils/constants.ts","../src/core/EdmaxLabs.ts","../src/index.ts"],"sourcesContent":["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 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 ) {\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 }\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\r\n const result = new Credentials(\r\n uid,\r\n d_info,\r\n createdAt,\r\n updatedAt,\r\n lastLogged,\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 };\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 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, // Let browser handle multipart boundaries\r\n body: formData,\r\n });\r\n\r\n return await response.json();\r\n } else {\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: {\r\n ...this.headers,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(this.body),\r\n });\r\n\r\n return await response.json();\r\n }\r\n }\r\n}\r\n","import { disconnect } from \"mongoose\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport Realtime from \"../database/Realtime.js\";\r\nimport { Credentials } from \"./Credentials.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\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 constructor() {\r\n this.client = EdmaxLabs.instance!;\r\n this.app = new EdmaxLabs({\r\n token: this.client.getAuth.authToken,\r\n authToken: this.client.getAuth.authToken,\r\n });\r\n this.init();\r\n }\r\n\r\n private init = () => {\r\n const _currentUser = this.currentUser();\r\n if (!_currentUser) return undefined;\r\n console.log(\"Auth Listening...\", _currentUser);\r\n this.eUser = _currentUser;\r\n return this.eUser;\r\n };\r\n\r\n private saveCredentials = (credentials: Credentials | null) => {\r\n const ldb = localStorage;\r\n if (!credentials) {\r\n ldb.removeItem(\"eauth\");\r\n return;\r\n }\r\n ldb.setItem(\"eauth\", JSON.stringify(credentials));\r\n };\r\n\r\n currentUser = (): Credentials | undefined => {\r\n const ldb = localStorage;\r\n\r\n const data = ldb.getItem(\"eauth\");\r\n\r\n if (data === undefined || data === null) {\r\n return undefined;\r\n }\r\n\r\n const result = JSON.parse(data ?? \"{}\");\r\n\r\n return Credentials.fromMap(result);\r\n };\r\n\r\n authState = ({\r\n onChange,\r\n onSignOut,\r\n onDeleted,\r\n }: {\r\n onChange: (data: Credentials) => void;\r\n onDeleted?: () => void;\r\n onSignOut?: () => void;\r\n }) => {\r\n const cuser = this.currentUser();\r\n\r\n //console.log(\"Listening :|: \", cuser);\r\n\r\n if (!cuser) return;\r\n const userRef = this.app?.database.collection(\"users\").doc(cuser?.uid);\r\n\r\n //listen change state\r\n userRef?.onSnapshot((snapshot: DocumentSnapshot, change: string) => {\r\n if (this.eUser === null || this.eUser === undefined) return;\r\n\r\n if (change === \"insert\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n if (change === \"update\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n //On deleted\r\n if (change === \"delete\") {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n if (onDeleted) onDeleted();\r\n }\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 db = this.app?.database;\r\n\r\n //check if email already exists\r\n const data = await db\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 db?.collection(\"users\").add({\r\n email,\r\n password,\r\n token: this.client?.getAuth.token,\r\n logged: true,\r\n lastLogged: Date.now(),\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 db = this.app?.database;\r\n\r\n const data = await db\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 console.log(\"Signing ...\");\r\n\r\n this.eUser = Credentials.fromMap(_data);\r\n this.saveCredentials(this.eUser);\r\n\r\n await db?.collection(\"users\").doc(data[0].id).update({\r\n logged: true,\r\n lastLogged: Date.now(),\r\n });\r\n\r\n return Credentials.fromMap(data[0].toMap());\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 db = this.app?.database;\r\n const userRef = await db?.collection(\"users\").doc(this.eUser.uid).delete();\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 = undefined;\r\n this.saveCredentials(null);\r\n };\r\n\r\n signOut = async () => {\r\n const db = this.app?.database;\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 db?.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 oparation: 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!.getAuth.token,\r\n },\r\n body: {\r\n path,\r\n op: oparation,\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 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 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 };\r\n\r\n // Order matters — match longest tokens first\r\n return pattern.replace(/MMMM|MMM|dd|MM|yyyy|HH|mm|ss|SSS/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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { ArraySnapshot } from \"./ArraySnapshot.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class Array {\r\n db: EdmaxLabs;\r\n collection: string;\r\n key: string;\r\n docID: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, key: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.key = key;\r\n this.docID = id;\r\n }\r\n\r\n async show(): Promise<ArraySnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/show\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n if (d === undefined) return [];\r\n return ArraySnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async push(data: any, id?: string): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/push\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n data: data,\r\n id,\r\n dt: Timestamp.now(),\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async insert(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/insert\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async get(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async remove(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/remove\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Array from \"./Array.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class DocumentRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n id: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async set(data: any): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(data: any): Promise<DocumentSnapshot | null> {\r\n if (this.id === undefined) return null;\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async delete(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n array(key: string): Array {\r\n return new Array(this.db, this.collection, key, this.id);\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n return this.db.rtdb.subscribeToDocument(this.collection, this.id, callback);\r\n }\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 } from \"idb\";\r\nimport { Timestamp } from \"../database/Timestamp.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n }\r\n\r\n getIDB = (collection: string) => {\r\n const dbPromise = openDB(\"edmaxlabs\", 1, {\r\n upgrade(db) {\r\n if (!db.objectStoreNames.contains(collection)) {\r\n const store = db.createObjectStore(collection, {\r\n keyPath: \"id\",\r\n });\r\n\r\n store.createIndex(\"id\", \"id\");\r\n store.createIndex(\"status\", \"status\");\r\n }\r\n },\r\n });\r\n\r\n return dbPromise;\r\n };\r\n\r\n async syncPendingWrite(id: string, collection: string = \"default\") {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const oid = IDBKeyRange.only(id);\r\n\r\n const pendingPackets = await store.index(\"id\").getAll(oid);\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n return true;\r\n }\r\n } catch {\r\n // stay pending\r\n return false;\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n\r\n async syncPendingWrites(collection: string) {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const pendingPackets = await store\r\n .index(\"status\")\r\n .getAll(IDBKeyRange.only(\"pending\"));\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n }\r\n } catch {\r\n // stay pending\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n}\r\n\r\n// export const read = async (\r\n// collection: string,\r\n// id?: string,\r\n// projection?: any,\r\n// ) => {\r\n// const db = await getIDB(collection);\r\n// const tx = db.transaction(collection, \"readonly\");\r\n// const index = tx.store.index(\"pid\");\r\n\r\n// if (id) {\r\n// const result = await index.getAll(id);\r\n// return result as typeof projection;\r\n// }\r\n\r\n// const result = await index.getAll();\r\n// return result as typeof projection;\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\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 db: EdmaxLabs;\r\n collection: string;\r\n private filter: FilterExpression[] = [];\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n }\r\n\r\n where(expression: FilterExpression) {\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 // works for string fields\r\n mongoFilter[key] = { $regex: value };\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 async get(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n // console.log(\r\n // \"Q => \",\r\n // res.documents.map((d: Record<string, any>) => {\r\n // delete d.token;\r\n // d.id = d._id;\r\n // delete d._id;\r\n // return DocumentSnapshot.fromMap(d);\r\n // })\r\n // );\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async update(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n const genfilter = this.buildFilter();\r\n return this.db.rtdb.subscribeToCollection(\r\n this.collection,\r\n callback,\r\n genfilter\r\n );\r\n }\r\n}\r\n","import DocumentRef from \"./DocumentRef.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Query from \"./Query.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport { Packet } from \"../persistence/models/Packet.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n persistence: Persistence;\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.persistence = new Persistence(db);\r\n }\r\n\r\n doc(id: string): DocumentRef {\r\n return new DocumentRef(this.db, this.collection, id);\r\n }\r\n\r\n get query(): Query {\r\n return new Query(this.db, this.collection);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\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) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n if (d === undefined) return [];\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async add(data: any): Promise<DocumentSnapshot | null> {\r\n // const db = await this.persistence.getIDB(this.collection);\r\n // const tx = db.transaction(this.collection, \"readwrite\");\r\n // const store = tx.store;\r\n\r\n const localId = Timestamp.now().toString();\r\n\r\n const payload: Packet = {\r\n id: localId,\r\n data,\r\n collection: this.collection,\r\n action: \"create\",\r\n status: \"pending\",\r\n timestamp: Timestamp.now(),\r\n };\r\n\r\n // 1️⃣ Persist locally first\r\n if (this.db.getPersistence) {\r\n // await store.put(payload); // PUT, not ADD\r\n // await tx.done;\r\n }\r\n\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n data: payload.data,\r\n },\r\n }).sendRequest();\r\n\r\n console.log(res);\r\n\r\n if (!res?.success || !res.id) {\r\n // mark failed but keep for retry\r\n payload.status = \"failed\";\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n return null;\r\n }\r\n\r\n // 2️⃣ Sync success\r\n payload.status = \"success\";\r\n payload.id = res.id; // IMPORTANT\r\n\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n\r\n return DocumentSnapshot.fromMap({\r\n ...res,\r\n });\r\n } catch (error) {\r\n console.error(\"Error adding document:\", error);\r\n\r\n // stay pending for retry\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n ): () => void {\r\n return this.db.rtdb.subscribeToCollection(this.collection, callback, {});\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\n\r\nexport default class Batch {\r\n app: EdmaxLabs;\r\n ops: any[];\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n this.ops = [];\r\n }\r\n\r\n set(docRef: DocumentRef, data: any) {\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 update(docRef: DocumentRef, data: any) {\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) {\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() {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/batch\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: this.ops,\r\n },\r\n }).sendRequest();\r\n if (res?.error) throw new Error(res.error.message || \"Batch commit failed\");\r\n return res;\r\n }\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 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 'collection/id'\");\r\n }\r\n\r\n batch(): Batch {\r\n return new Batch(this.app);\r\n }\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();\r\n },\r\n set(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"set\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n update(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"update\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n delete(docRef: DocumentRef) {\r\n tx.ops.push({\r\n op: \"delete\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n });\r\n },\r\n };\r\n\r\n await transactionFn(tx);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/transaction\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: tx.ops,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.error) throw new Error(res.error.message || \"Transaction failed\");\r\n return res;\r\n }\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 { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class Realtime {\r\n db: EdmaxLabs;\r\n socket: Socket | null;\r\n events: string[];\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n this.socket = null;\r\n this.events = [\"error\", \"insert\", \"update\", \"delete\"];\r\n }\r\n\r\n connect() {\r\n if (!this.db.getAuth?.token) throw new Error(\"Auth token missing\");\r\n\r\n this.socket = io(this.db.getSocketUrl, {\r\n transports: [\"websocket\"],\r\n auth: { token: this.db.getAuth.token },\r\n });\r\n\r\n return this.socket;\r\n }\r\n\r\n on(event: string, cb: (...args: any[]) => void) {\r\n this.socket?.on(event, cb);\r\n }\r\n\r\n off(event: string, cb?: (...args: any[]) => 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) {\r\n this.socket?.emit(event, data);\r\n }\r\n\r\n // ------------------------------------------------------------\r\n // 🔥 ADDITIONS BELOW — NO BREAKING CHANGES\r\n // ------------------------------------------------------------\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n subscribeToCollection(\r\n collection: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n filter?: Record<string, any>\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n if (!filter) {\r\n filter = {};\r\n }\r\n\r\n const lid = `${generateUUID()}`;\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n this.socket!.on(`${lid}-${event}`, handler);\r\n });\r\n\r\n // return unsubscribe fn\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n subscribeToDocument(\r\n collection: string,\r\n id: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n const lid = id;\r\n this.socket!.emit(\"subscribe\", {\r\n collection,\r\n filter: {\r\n _id: lid,\r\n },\r\n lid,\r\n });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n const listener = `${lid}-${event}`;\r\n this.socket!.on(listener, handler);\r\n });\r\n\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\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/\" + functionName,\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\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","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 db: EdmaxLabs;\r\n id: string;\r\n file: StorageSnapshot | undefined | null;\r\n\r\n constructor(db: EdmaxLabs, id: string) {\r\n this.db = db;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<StorageRef | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async upload(srcFile: File): Promise<StorageRef | null | undefined> {\r\n if (!srcFile) {\r\n throw new Error(\"Invalid File\");\r\n }\r\n\r\n const form = new FormData();\r\n form.append(\"file\", srcFile, srcFile.name);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/upload\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n ...form.getHeaders(),\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getBaseUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n getDownloadUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/d/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n async delete(): Promise<{ success: boolean; error: string }> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.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 get(file_id: string): StorageRef {\r\n if (!file_id || file_id === \"\") {\r\n throw new Error(\"File ID is Invalid\");\r\n }\r\n return new StorageRef(this.app, file_id);\r\n }\r\n}\r\n","const serverURI = \"https://api.edmaxlabs.com/api/v2\";\r\nconst socketURI = \"https://api.edmaxlabs.com:4000\";\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 Persistence from \"../persistence/Persistence.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 authToken: string;\r\n}\r\n\r\nexport interface AuthState {\r\n token: string;\r\n authToken: string;\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 private auth: AuthState;\r\n private _db: Database;\r\n private _storage: Storage;\r\n private realtime: Realtime;\r\n private persistence: boolean = false;\r\n private persistence_worker: Persistence;\r\n\r\n constructor({ token, authToken }: EdmaxLabsConfig) {\r\n this.baseUrl = serverURI;\r\n this.socketUrl = socketURI;\r\n this.auth = { token, authToken };\r\n this._db = new Database(this);\r\n this._storage = new Storage(this);\r\n this.realtime = new Realtime(this);\r\n this.persistence_worker = new Persistence(this);\r\n }\r\n\r\n static allowPersistence(enable: boolean) {\r\n if (EdmaxLabs.instance) {\r\n EdmaxLabs.instance.persistence = enable;\r\n }\r\n }\r\n\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 get getPersistence(): boolean {\r\n return this.persistence;\r\n }\r\n\r\n get getAuth(): Record<string, any> {\r\n return this.auth;\r\n }\r\n\r\n get getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n get getSocketUrl(): string {\r\n return this.socketUrl;\r\n }\r\n\r\n get database(): Database {\r\n return this._db;\r\n }\r\n\r\n get storage(): Storage {\r\n return this._storage;\r\n }\r\n\r\n get functions(): Functions {\r\n return new Functions(this);\r\n }\r\n\r\n get rtdb(): Realtime {\r\n return this.realtime;\r\n }\r\n\r\n sync(id: string, collection?: string): Promise<boolean | undefined> {\r\n if (!this.getPersistence) {\r\n throw new Error(\"Persistence is Off Can't Sync.\");\r\n }\r\n return this.persistence_worker!.syncPendingWrite(id, collection);\r\n }\r\n\r\n get authentication(): 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","import EdmaxLabs 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\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};\r\n"],"mappings":"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","names":["target","CollectionRef","CollectionRef","FormData"]}
|
|
1
|
+
{"version":3,"sources":["../src/authentication/Credentials.ts","../src/utils/HttpsRequest.ts","../src/authentication/Authentication.ts","../src/database/Timestamp.ts","../src/database/ArraySnapshot.ts","../src/database/Array.ts","../src/database/DocumentSnapshot.ts","../src/database/DocumentRef.ts","../../../../../node_modules/idb/build/wrap-idb-value.js","../../../../../node_modules/idb/build/index.js","../src/persistence/Persistence.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/storage/StorageSnapshot.ts","../src/storage/StorageRef.ts","../src/storage/Storage.ts","../src/utils/constants.ts","../src/core/EdmaxLabs.ts","../src/index.ts"],"sourcesContent":["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 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 ) {\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 }\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\r\n const result = new Credentials(\r\n uid,\r\n d_info,\r\n createdAt,\r\n updatedAt,\r\n lastLogged,\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 };\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 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, // Let browser handle multipart boundaries\r\n body: formData,\r\n });\r\n\r\n return await response.json();\r\n } else {\r\n const response = await fetch(this.endpoint, {\r\n method: this.method,\r\n headers: {\r\n ...this.headers,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(this.body),\r\n });\r\n\r\n return await response.json();\r\n }\r\n }\r\n}\r\n","import { disconnect } from \"mongoose\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { DocumentSnapshot } from \"../database/DocumentSnapshot.js\";\r\nimport Realtime from \"../database/Realtime.js\";\r\nimport { Credentials } from \"./Credentials.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\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 constructor() {\r\n this.client = EdmaxLabs.instance!;\r\n this.app = new EdmaxLabs({\r\n token: this.client.getAuth.authToken,\r\n authToken: this.client.getAuth.authToken,\r\n project: this.client.getAuth.project,\r\n });\r\n this.init();\r\n }\r\n\r\n private init = () => {\r\n const _currentUser = this.currentUser();\r\n if (!_currentUser) return undefined;\r\n console.log(\"Auth Listening...\", _currentUser);\r\n this.eUser = _currentUser;\r\n return this.eUser;\r\n };\r\n\r\n private saveCredentials = (credentials: Credentials | null) => {\r\n const ldb = localStorage;\r\n if (!credentials) {\r\n ldb.removeItem(\"eauth\");\r\n return;\r\n }\r\n ldb.setItem(\"eauth\", JSON.stringify(credentials));\r\n };\r\n\r\n currentUser = (): Credentials | undefined => {\r\n const ldb = localStorage;\r\n\r\n const data = ldb.getItem(\"eauth\");\r\n\r\n if (data === undefined || data === null) {\r\n return undefined;\r\n }\r\n\r\n const result = JSON.parse(data ?? \"{}\");\r\n\r\n return Credentials.fromMap(result);\r\n };\r\n\r\n authState = ({\r\n onChange,\r\n onSignOut,\r\n onDeleted,\r\n }: {\r\n onChange: (data: Credentials) => void;\r\n onDeleted?: () => void;\r\n onSignOut?: () => void;\r\n }) => {\r\n const cuser = this.currentUser();\r\n\r\n //console.log(\"Listening :|: \", cuser);\r\n\r\n if (!cuser) return;\r\n const userRef = this.app?.database.collection(\"users\").doc(cuser?.uid);\r\n\r\n //listen change state\r\n userRef?.onSnapshot((snapshot: DocumentSnapshot, change: string) => {\r\n if (this.eUser === null || this.eUser === undefined) return;\r\n\r\n if (change === \"insert\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n if (change === \"update\") {\r\n if (\r\n snapshot.data.logged === \"false\" ||\r\n snapshot.data.logged === false\r\n ) {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n return;\r\n }\r\n const result = Credentials.fromMap(snapshot.toMap());\r\n this.eUser = result;\r\n this.saveCredentials(result);\r\n onChange(result);\r\n }\r\n\r\n //On deleted\r\n if (change === \"delete\") {\r\n this.eUser = undefined;\r\n this.saveCredentials(null);\r\n if (onSignOut) onSignOut();\r\n if (onDeleted) onDeleted();\r\n }\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 db = this.app?.database;\r\n\r\n //check if email already exists\r\n const data = await db\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 db?.collection(\"users\").add({\r\n email,\r\n password,\r\n token: this.client?.getAuth.token,\r\n logged: true,\r\n lastLogged: Date.now(),\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 db = this.app?.database;\r\n\r\n const data = await db\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 console.log(\"Signing ...\");\r\n\r\n this.eUser = Credentials.fromMap(_data);\r\n this.saveCredentials(this.eUser);\r\n\r\n await db?.collection(\"users\").doc(data[0].id).update({\r\n logged: true,\r\n lastLogged: Date.now(),\r\n });\r\n\r\n return Credentials.fromMap(data[0].toMap());\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 db = this.app?.database;\r\n const userRef = await db?.collection(\"users\").doc(this.eUser.uid).delete();\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 = undefined;\r\n this.saveCredentials(null);\r\n };\r\n\r\n signOut = async () => {\r\n const db = this.app?.database;\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 db?.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 oparation: 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!.getAuth.token,\r\n },\r\n body: {\r\n path,\r\n op: oparation,\r\n context: context,\r\n hello: \"world\",\r\n },\r\n }).sendRequest();\r\n\r\n return res as { success: boolean; allowed: any };\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 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 };\r\n\r\n // Order matters — match longest tokens first\r\n return pattern.replace(/MMMM|MMM|dd|MM|yyyy|HH|mm|ss|SSS/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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport { ArraySnapshot } from \"./ArraySnapshot.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class Array {\r\n db: EdmaxLabs;\r\n collection: string;\r\n key: string;\r\n docID: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, key: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.key = key;\r\n this.docID = id;\r\n }\r\n\r\n async show(): Promise<ArraySnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/show\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n if (d === undefined) return [];\r\n return ArraySnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async push(data: any, id?: string): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/push\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n data: data,\r\n id,\r\n dt: Timestamp.now(),\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async insert(\r\n position: number,\r\n data: any,\r\n id?: string\r\n ): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/insert\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n data,\r\n id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async get(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position: position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async remove(position: number): Promise<ArraySnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/array/remove\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.docID,\r\n array: this.key,\r\n position,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return ArraySnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\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","import type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Array from \"./Array.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class DocumentRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n id: string;\r\n\r\n constructor(db: EdmaxLabs, collection: string, id: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async set(data: any): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async update(data: any): Promise<DocumentSnapshot | null> {\r\n if (this.id === undefined) return null;\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n data,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async delete(): Promise<DocumentSnapshot | null> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n document: this.id,\r\n },\r\n }).sendRequest();\r\n if (res.success) {\r\n if (res.document === undefined) return null;\r\n return DocumentSnapshot.fromMap(res.document);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n array(key: string): Array {\r\n return new Array(this.db, this.collection, key, this.id);\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n return this.db.rtdb.subscribeToDocument(this.collection, this.id, callback);\r\n }\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 } from \"idb\";\r\nimport { Timestamp } from \"../database/Timestamp.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport EdmaxLabs from \"../core/EdmaxLabs.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n }\r\n\r\n getIDB = (collection: string) => {\r\n const dbPromise = openDB(\"edmaxlabs\", 1, {\r\n upgrade(db) {\r\n if (!db.objectStoreNames.contains(collection)) {\r\n const store = db.createObjectStore(collection, {\r\n keyPath: \"id\",\r\n });\r\n\r\n store.createIndex(\"id\", \"id\");\r\n store.createIndex(\"status\", \"status\");\r\n }\r\n },\r\n });\r\n\r\n return dbPromise;\r\n };\r\n\r\n async syncPendingWrite(id: string, collection: string = \"default\") {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const oid = IDBKeyRange.only(id);\r\n\r\n const pendingPackets = await store.index(\"id\").getAll(oid);\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n return true;\r\n }\r\n } catch {\r\n // stay pending\r\n return false;\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n\r\n async syncPendingWrites(collection: string) {\r\n const idb = await this.getIDB(\"edmaxlabs\");\r\n const tx = idb.transaction(collection, \"readwrite\");\r\n const store = tx.store;\r\n\r\n const pendingPackets = await store\r\n .index(\"status\")\r\n .getAll(IDBKeyRange.only(\"pending\"));\r\n\r\n for (const packet of pendingPackets) {\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(\r\n \"$\",\r\n \"/\",\r\n ),\r\n body: {\r\n collection: packet.collection,\r\n data: packet,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.success) {\r\n packet.status = \"success\";\r\n packet.timestamp = Timestamp.now();\r\n await store.put(packet);\r\n }\r\n } catch {\r\n // stay pending\r\n }\r\n }\r\n\r\n await tx.done;\r\n }\r\n}\r\n\r\n// export const read = async (\r\n// collection: string,\r\n// id?: string,\r\n// projection?: any,\r\n// ) => {\r\n// const db = await getIDB(collection);\r\n// const tx = db.transaction(collection, \"readonly\");\r\n// const index = tx.store.index(\"pid\");\r\n\r\n// if (id) {\r\n// const result = await index.getAll(id);\r\n// return result as typeof projection;\r\n// }\r\n\r\n// const result = await index.getAll();\r\n// return result as typeof projection;\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\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 db: EdmaxLabs;\r\n collection: string;\r\n private filter: FilterExpression[] = [];\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n }\r\n\r\n where(expression: FilterExpression) {\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 // works for string fields\r\n mongoFilter[key] = { $regex: value };\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 async get(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n // console.log(\r\n // \"Q => \",\r\n // res.documents.map((d: Record<string, any>) => {\r\n // delete d.token;\r\n // d.id = d._id;\r\n // delete d._id;\r\n // return DocumentSnapshot.fromMap(d);\r\n // })\r\n // );\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async update(): Promise<DocumentSnapshot[]> {\r\n const genfilter = this.buildFilter();\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/update\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n filter: genfilter,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n const genfilter = this.buildFilter();\r\n return this.db.rtdb.subscribeToCollection(\r\n this.collection,\r\n callback,\r\n genfilter\r\n );\r\n }\r\n}\r\n","import DocumentRef from \"./DocumentRef.js\";\r\nimport Persistence from \"../persistence/Persistence.js\";\r\nimport type EdmaxLabs from \"../core/EdmaxLabs.js\";\r\nimport { HttpMethod, HttpsRequest } from \"../utils/HttpsRequest.js\";\r\nimport Query from \"./Query.js\";\r\nimport { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\nimport { Packet } from \"../persistence/models/Packet.js\";\r\nimport { Timestamp } from \"./Timestamp.js\";\r\n\r\nexport default class CollectionRef {\r\n db: EdmaxLabs;\r\n collection: string;\r\n persistence: Persistence;\r\n\r\n constructor(db: EdmaxLabs, collection: string) {\r\n this.db = db;\r\n this.collection = collection;\r\n this.persistence = new Persistence(db);\r\n }\r\n\r\n doc(id: string): DocumentRef {\r\n return new DocumentRef(this.db, this.collection, id);\r\n }\r\n\r\n get query(): Query {\r\n return new Query(this.db, this.collection);\r\n }\r\n\r\n async get(): Promise<DocumentSnapshot[]> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\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) {\r\n return res.documents.map((d: Record<string, any>) => {\r\n delete d.token;\r\n d.id = d._id;\r\n delete d._id;\r\n if (d === undefined) return [];\r\n return DocumentSnapshot.fromMap(d);\r\n });\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n async add(data: any): Promise<DocumentSnapshot | null> {\r\n // const db = await this.persistence.getIDB(this.collection);\r\n // const tx = db.transaction(this.collection, \"readwrite\");\r\n // const store = tx.store;\r\n\r\n const localId = Timestamp.now().toString();\r\n\r\n const payload: Packet = {\r\n id: localId,\r\n data,\r\n collection: this.collection,\r\n action: \"create\",\r\n status: \"pending\",\r\n timestamp: Timestamp.now(),\r\n };\r\n\r\n // 1️⃣ Persist locally first\r\n if (this.db.getPersistence) {\r\n // await store.put(payload); // PUT, not ADD\r\n // await tx.done;\r\n }\r\n\r\n try {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/db/create\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n collection: this.collection,\r\n data: payload.data,\r\n },\r\n }).sendRequest();\r\n\r\n console.log(res);\r\n\r\n if (!res?.success || !res.id) {\r\n // mark failed but keep for retry\r\n payload.status = \"failed\";\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n return null;\r\n }\r\n\r\n // 2️⃣ Sync success\r\n payload.status = \"success\";\r\n payload.id = res.id; // IMPORTANT\r\n\r\n if (this.db.getPersistence) {\r\n //await db.put(this.collection, payload);\r\n }\r\n\r\n return DocumentSnapshot.fromMap({\r\n ...res,\r\n });\r\n } catch (error) {\r\n console.error(\"Error adding document:\", error);\r\n\r\n // stay pending for retry\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n onSnapshot(\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n ): () => void {\r\n return this.db.rtdb.subscribeToCollection(this.collection, callback, {});\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\n\r\nexport default class Batch {\r\n app: EdmaxLabs;\r\n ops: any[];\r\n\r\n constructor(app: EdmaxLabs) {\r\n this.app = app;\r\n this.ops = [];\r\n }\r\n\r\n set(docRef: DocumentRef, data: any) {\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 update(docRef: DocumentRef, data: any) {\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) {\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() {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/batch\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: this.ops,\r\n },\r\n }).sendRequest();\r\n if (res?.error) throw new Error(res.error.message || \"Batch commit failed\");\r\n return res;\r\n }\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 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 'collection/id'\");\r\n }\r\n\r\n batch(): Batch {\r\n return new Batch(this.app);\r\n }\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();\r\n },\r\n set(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"set\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n update(docRef: DocumentRef, data: any) {\r\n tx.ops.push({\r\n op: \"update\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n data,\r\n });\r\n },\r\n delete(docRef: DocumentRef) {\r\n tx.ops.push({\r\n op: \"delete\",\r\n collection: docRef.collection,\r\n id: docRef.id,\r\n });\r\n },\r\n };\r\n\r\n await transactionFn(tx);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.app.getBaseUrl + \"/db/transaction\",\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n ops: tx.ops,\r\n },\r\n }).sendRequest();\r\n\r\n if (res?.error) throw new Error(res.error.message || \"Transaction failed\");\r\n return res;\r\n }\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 { DocumentSnapshot } from \"./DocumentSnapshot.js\";\r\n\r\nexport default class Realtime {\r\n db: EdmaxLabs;\r\n socket: Socket | null;\r\n events: string[];\r\n\r\n constructor(db: EdmaxLabs) {\r\n this.db = db;\r\n this.socket = null;\r\n this.events = [\"error\", \"insert\", \"update\", \"delete\"];\r\n }\r\n\r\n connect() {\r\n if (!this.db.getAuth?.token) throw new Error(\"Auth token missing\");\r\n\r\n this.socket = io(this.db.getSocketUrl, {\r\n transports: [\"websocket\"],\r\n auth: { token: this.db.getAuth.token },\r\n });\r\n\r\n return this.socket;\r\n }\r\n\r\n on(event: string, cb: (...args: any[]) => void) {\r\n this.socket?.on(event, cb);\r\n }\r\n\r\n off(event: string, cb?: (...args: any[]) => 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) {\r\n this.socket?.emit(event, data);\r\n }\r\n\r\n // ------------------------------------------------------------\r\n // 🔥 ADDITIONS BELOW — NO BREAKING CHANGES\r\n // ------------------------------------------------------------\r\n\r\n /**\r\n * Realtime listener for entire collection\r\n */\r\n subscribeToCollection(\r\n collection: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void,\r\n filter?: Record<string, any>\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n if (!filter) {\r\n filter = {};\r\n }\r\n\r\n const lid = `${generateUUID()}`;\r\n this.socket!.emit(\"subscribe\", { collection, filter, lid });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n this.socket!.on(`${lid}-${event}`, handler);\r\n });\r\n\r\n // return unsubscribe fn\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\r\n\r\n /**\r\n * Realtime listener for a single document\r\n */\r\n subscribeToDocument(\r\n collection: string,\r\n id: string,\r\n callback: (snapshot: DocumentSnapshot, change: string) => void\r\n ): () => void {\r\n if (!this.socket) this.connect();\r\n\r\n const lid = id;\r\n this.socket!.emit(\"subscribe\", {\r\n collection,\r\n filter: {\r\n _id: lid,\r\n },\r\n lid,\r\n });\r\n\r\n const handler = (payload: any) => {\r\n const snapshot = DocumentSnapshot.fromMap(payload);\r\n callback(snapshot, payload.change);\r\n };\r\n\r\n this.events.forEach((event) => {\r\n const listener = `${lid}-${event}`;\r\n this.socket!.on(listener, handler);\r\n });\r\n\r\n return () => {\r\n this.socket!.emit(\"unsubscribe\", { lid });\r\n this.socket!.off(lid, handler);\r\n };\r\n }\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/\" + functionName,\r\n headers: {\r\n authorization: this.app.getAuth.token,\r\n },\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: {\r\n authorization: this.app.getAuth.token,\r\n },\r\n body: {\r\n hostname: name,\r\n project: this.app.getAuth.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","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 db: EdmaxLabs;\r\n id: string;\r\n file: StorageSnapshot | undefined | null;\r\n\r\n constructor(db: EdmaxLabs, id: string) {\r\n this.db = db;\r\n this.id = id;\r\n }\r\n\r\n async get(): Promise<StorageRef | null | undefined> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/read\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async upload(srcFile: File): Promise<StorageRef | null | undefined> {\r\n if (!srcFile) {\r\n throw new Error(\"Invalid File\");\r\n }\r\n\r\n const form = new FormData();\r\n form.append(\"file\", srcFile, srcFile.name);\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/upload\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n ...form.getHeaders(),\r\n },\r\n body: {\r\n file_id: this.id,\r\n },\r\n }).sendRequest();\r\n\r\n if (res.success) {\r\n if (res.document === undefined) return this;\r\n const result = StorageSnapshot.fromMap(res.document);\r\n this.file = result;\r\n return this;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n getBaseUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n getDownloadUrl(): string {\r\n if (this.file) {\r\n return `https://api.edmaxlabs.com/storage/d/${this.file.id}`;\r\n }\r\n return \"\";\r\n }\r\n\r\n async delete(): Promise<{ success: boolean; error: string }> {\r\n const res = await new HttpsRequest({\r\n method: HttpMethod.POST,\r\n endpoint: this.db.getBaseUrl + \"/storage/file/delete\",\r\n headers: {\r\n authorization: this.db.getAuth.token,\r\n },\r\n body: {\r\n file_id: this.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 get(file_id: string): StorageRef {\r\n if (!file_id || file_id === \"\") {\r\n throw new Error(\"File ID is Invalid\");\r\n }\r\n return new StorageRef(this.app, file_id);\r\n }\r\n}\r\n","const serverURI = \"https://api.edmaxlabs.com/api/v2\";\r\nconst socketURI = \"https://api.edmaxlabs.com:4000\";\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 Persistence from \"../persistence/Persistence.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 authToken: string;\r\n}\r\n\r\nexport interface AuthState {\r\n token: string;\r\n project: string;\r\n authToken: string;\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 private auth: AuthState;\r\n private _db: Database;\r\n private _storage: Storage;\r\n private _hosting: Hosting;\r\n private realtime: Realtime;\r\n private persistence: boolean = false;\r\n private persistence_worker: Persistence;\r\n\r\n constructor({ token, authToken, project }: EdmaxLabsConfig) {\r\n this.baseUrl = serverURI;\r\n this.socketUrl = socketURI;\r\n this.auth = { token, authToken, project };\r\n this._db = new Database(this);\r\n this._storage = new Storage(this);\r\n this._hosting = new Hosting(this);\r\n this.realtime = new Realtime(this);\r\n this.persistence_worker = new Persistence(this);\r\n }\r\n\r\n static allowPersistence(enable: boolean) {\r\n if (EdmaxLabs.instance) {\r\n EdmaxLabs.instance.persistence = enable;\r\n }\r\n }\r\n\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 get getPersistence(): boolean {\r\n return this.persistence;\r\n }\r\n\r\n get getAuth(): Record<string, any> {\r\n return this.auth;\r\n }\r\n\r\n get getBaseUrl(): string {\r\n return this.baseUrl;\r\n }\r\n\r\n get getSocketUrl(): string {\r\n return this.socketUrl;\r\n }\r\n\r\n get database(): Database {\r\n return this._db;\r\n }\r\n\r\n get storage(): Storage {\r\n return this._storage;\r\n }\r\n\r\n get hosting(): Hosting {\r\n return this._hosting;\r\n }\r\n\r\n get functions(): Functions {\r\n return new Functions(this);\r\n }\r\n\r\n get rtdb(): Realtime {\r\n return this.realtime;\r\n }\r\n\r\n sync(id: string, collection?: string): Promise<boolean | undefined> {\r\n if (!this.getPersistence) {\r\n throw new Error(\"Persistence is Off Can't Sync.\");\r\n }\r\n return this.persistence_worker!.syncPendingWrite(id, collection);\r\n }\r\n\r\n get authentication(): 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","import EdmaxLabs 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\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};\r\n"],"mappings":"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","names":["target","CollectionRef","CollectionRef","FormData"]}
|
package/package.json
CHANGED