edmaxlabs-core 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,45 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/authentication/Credentials.ts
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ ArraySnapshot: () => ArraySnapshot,
34
+ Credentials: () => Credentials,
35
+ DocumentSnapshot: () => DocumentSnapshot,
36
+ StorageSnapshot: () => StorageSnapshot,
37
+ Timestamp: () => Timestamp,
38
+ default: () => src_default
39
+ });
40
+ module.exports = __toCommonJS(src_exports);
41
+
42
+ // src/authentication/Credentials.ts
2
43
  var Credentials = class _Credentials {
3
44
  constructor(uid, displayInfo, createdAt, updatedAt, lastLogged) {
4
45
  this.uid = uid;
@@ -8,8 +49,8 @@ var Credentials = class _Credentials {
8
49
  this.lastLogged = lastLogged;
9
50
  }
10
51
  static fromMap(map) {
11
- const uid = _nullishCoalesce(_nullishCoalesce(map.id, () => ( map.uid)), () => ( ""));
12
- const data = _nullishCoalesce(map.data, () => ( map));
52
+ const uid = map.id ?? map.uid ?? "";
53
+ const data = map.data ?? map;
13
54
  const d_info = data.displayInfo;
14
55
  const createdAt = data.createdAt;
15
56
  const updatedAt = data.updatedAt;
@@ -104,7 +145,7 @@ var Authentication = class {
104
145
  if (data === void 0 || data === null) {
105
146
  return void 0;
106
147
  }
107
- const result = JSON.parse(_nullishCoalesce(data, () => ( "{}")));
148
+ const result = JSON.parse(data ?? "{}");
108
149
  return Credentials.fromMap(result);
109
150
  };
110
151
  this.authState = ({
@@ -115,8 +156,8 @@ var Authentication = class {
115
156
  const cuser = this.currentUser();
116
157
  if (!cuser)
117
158
  return;
118
- const userRef = _optionalChain([this, 'access', _ => _.app, 'optionalAccess', _2 => _2.database, 'access', _3 => _3.collection, 'call', _4 => _4("users"), 'access', _5 => _5.doc, 'call', _6 => _6(_optionalChain([cuser, 'optionalAccess', _7 => _7.uid]))]);
119
- _optionalChain([userRef, 'optionalAccess', _8 => _8.onSnapshot, 'call', _9 => _9((snapshot, change) => {
159
+ const userRef = this.app?.database.collection("users").doc(cuser?.uid);
160
+ userRef?.onSnapshot((snapshot, change) => {
120
161
  if (this.eUser === null || this.eUser === void 0)
121
162
  return;
122
163
  if (change === "insert") {
@@ -153,7 +194,7 @@ var Authentication = class {
153
194
  if (onDeleted)
154
195
  onDeleted();
155
196
  }
156
- })]);
197
+ });
157
198
  };
158
199
  this.createUserWithEmailAndPassword = async ({
159
200
  email,
@@ -161,23 +202,23 @@ var Authentication = class {
161
202
  }) => {
162
203
  this.eUser = void 0;
163
204
  this.saveCredentials(null);
164
- const db = _optionalChain([this, 'access', _10 => _10.app, 'optionalAccess', _11 => _11.database]);
165
- const data = await _optionalChain([db, 'optionalAccess', _12 => _12.collection, 'call', _13 => _13("users"), 'access', _14 => _14.query, 'access', _15 => _15.where, 'call', _16 => _16({
205
+ const db = this.app?.database;
206
+ const data = await db?.collection("users").query.where({
166
207
  key: "email",
167
208
  op: "===",
168
209
  value: email
169
- }), 'access', _17 => _17.get, 'call', _18 => _18()]);
210
+ }).get();
170
211
  if (data.length > 0) {
171
212
  throw new Error("Email Already In Use.");
172
213
  }
173
- const userRef = await _optionalChain([db, 'optionalAccess', _19 => _19.collection, 'call', _20 => _20("users"), 'access', _21 => _21.add, 'call', _22 => _22({
214
+ const userRef = await db?.collection("users").add({
174
215
  email,
175
216
  password,
176
- token: _optionalChain([this, 'access', _23 => _23.client, 'optionalAccess', _24 => _24.getAuth, 'access', _25 => _25.token]),
217
+ token: this.client?.getAuth.token,
177
218
  logged: true,
178
219
  lastLogged: Date.now()
179
- })]);
180
- if (!_optionalChain([userRef, 'optionalAccess', _26 => _26.id]) || _optionalChain([userRef, 'optionalAccess', _27 => _27.id]) === "") {
220
+ });
221
+ if (!userRef?.id || userRef?.id === "") {
181
222
  throw new Error("Something went wrong try Again.");
182
223
  }
183
224
  this.eUser = Credentials.fromMap(userRef);
@@ -188,54 +229,54 @@ var Authentication = class {
188
229
  email,
189
230
  password
190
231
  }) => {
191
- const db = _optionalChain([this, 'access', _28 => _28.app, 'optionalAccess', _29 => _29.database]);
192
- const data = await _optionalChain([db, 'optionalAccess', _30 => _30.collection, 'call', _31 => _31("users"), 'access', _32 => _32.query, 'access', _33 => _33.where, 'call', _34 => _34({
232
+ const db = this.app?.database;
233
+ const data = await db?.collection("users").query.where({
193
234
  key: "email",
194
235
  op: "===",
195
236
  value: email
196
- }), 'access', _35 => _35.where, 'call', _36 => _36({
237
+ }).where({
197
238
  key: "password",
198
239
  op: "===",
199
240
  value: password
200
- }), 'access', _37 => _37.get, 'call', _38 => _38()]);
241
+ }).get();
201
242
  if (data === void 0) {
202
243
  throw new Error("Auth Failed.");
203
244
  }
204
- if (_optionalChain([data, 'optionalAccess', _39 => _39.length]) === 0) {
245
+ if (data?.length === 0) {
205
246
  throw new Error("User Not Found.");
206
247
  }
207
248
  const _data = data[0];
208
249
  console.log("Signing ...");
209
250
  this.eUser = Credentials.fromMap(_data);
210
251
  this.saveCredentials(this.eUser);
211
- await _optionalChain([db, 'optionalAccess', _40 => _40.collection, 'call', _41 => _41("users"), 'access', _42 => _42.doc, 'call', _43 => _43(data[0].id), 'access', _44 => _44.update, 'call', _45 => _45({
252
+ await db?.collection("users").doc(data[0].id).update({
212
253
  logged: true,
213
254
  lastLogged: Date.now()
214
- })]);
255
+ });
215
256
  return Credentials.fromMap(data[0].toMap());
216
257
  };
217
258
  this.deleteUser = async () => {
218
259
  if (!this.eUser) {
219
260
  throw new Error("No User Signed in");
220
261
  }
221
- const db = _optionalChain([this, 'access', _46 => _46.app, 'optionalAccess', _47 => _47.database]);
222
- const userRef = await _optionalChain([db, 'optionalAccess', _48 => _48.collection, 'call', _49 => _49("users"), 'access', _50 => _50.doc, 'call', _51 => _51(this.eUser.uid), 'access', _52 => _52.delete, 'call', _53 => _53()]);
223
- if (_optionalChain([userRef, 'optionalAccess', _54 => _54.id]) || _optionalChain([userRef, 'optionalAccess', _55 => _55.id]) === "") {
262
+ const db = this.app?.database;
263
+ const userRef = await db?.collection("users").doc(this.eUser.uid).delete();
264
+ if (userRef?.id || userRef?.id === "") {
224
265
  throw new Error("Something went wrong try Again.");
225
266
  }
226
267
  this.eUser = void 0;
227
268
  this.saveCredentials(null);
228
269
  };
229
270
  this.signOut = async () => {
230
- const db = _optionalChain([this, 'access', _56 => _56.app, 'optionalAccess', _57 => _57.database]);
271
+ const db = this.app?.database;
231
272
  const luid = this.currentUser();
232
273
  this.eUser = void 0;
233
274
  this.saveCredentials(null);
234
275
  if (luid)
235
- await _optionalChain([db, 'optionalAccess', _58 => _58.collection, 'call', _59 => _59("users"), 'access', _60 => _60.doc, 'call', _61 => _61(_optionalChain([luid, 'optionalAccess', _62 => _62.uid])), 'access', _63 => _63.update, 'call', _64 => _64({
276
+ await db?.collection("users").doc(luid?.uid).update({
236
277
  logged: false,
237
278
  lastLogged: Date.now()
238
- })]);
279
+ });
239
280
  return;
240
281
  };
241
282
  this.rules = async (path, oparation) => {
@@ -396,17 +437,17 @@ var ArraySnapshot = class _ArraySnapshot {
396
437
  constructor(id = "", index, data, dt) {
397
438
  this.data = data;
398
439
  this.id = id;
399
- this.dt = _nullishCoalesce(dt, () => ( Timestamp.now()));
440
+ this.dt = dt ?? Timestamp.now();
400
441
  }
401
442
  static fromMap(map) {
402
- const index = _nullishCoalesce(_nullishCoalesce(map.index, () => ( map.index)), () => ( -1));
403
- const id = _nullishCoalesce(_nullishCoalesce(map.id, () => ( map._id)), () => ( ""));
404
- const document = _nullishCoalesce(_nullishCoalesce(map.data, () => ( map.document)), () => ( map));
443
+ const index = map.index ?? map.index ?? -1;
444
+ const id = map.id ?? map._id ?? "";
445
+ const document = map.data ?? map.document ?? map;
405
446
  return new _ArraySnapshot(id, index, document);
406
447
  }
407
448
  toMap() {
408
449
  return {
409
- id: _nullishCoalesce(this.id, () => ( "")),
450
+ id: this.id ?? "",
410
451
  data: this.data,
411
452
  dt: this.dt
412
453
  };
@@ -559,8 +600,8 @@ var DocumentSnapshot = class _DocumentSnapshot {
559
600
  this.data = doc;
560
601
  }
561
602
  static fromMap(map) {
562
- const id = _nullishCoalesce(_nullishCoalesce(map.id, () => ( map._id)), () => ( ""));
563
- const document = _nullishCoalesce(_nullishCoalesce(_nullishCoalesce(map.document, () => ( map.documents)), () => ( map.data)), () => ( map));
603
+ const id = map.id ?? map._id ?? "";
604
+ const document = map.document ?? map.documents ?? map.data ?? map;
564
605
  return new _DocumentSnapshot(id, document);
565
606
  }
566
607
  toMap() {
@@ -909,7 +950,7 @@ var CollectionRef = class {
909
950
  try {
910
951
  const res = await new HttpsRequest({
911
952
  method: "POST" /* POST */,
912
- endpoint: `${_optionalChain([this, 'access', _65 => _65.db, 'optionalAccess', _66 => _66.getBaseUrl])}/db/${packet.action}`.replace(
953
+ endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(
913
954
  "$",
914
955
  "/"
915
956
  ),
@@ -918,13 +959,13 @@ var CollectionRef = class {
918
959
  data: packet
919
960
  }
920
961
  }).sendRequest();
921
- if (_optionalChain([res, 'optionalAccess', _67 => _67.success])) {
962
+ if (res?.success) {
922
963
  packet.status = "success";
923
964
  packet.timestamp = Timestamp.now();
924
965
  await store.put(packet);
925
966
  return true;
926
967
  }
927
- } catch (e) {
968
+ } catch {
928
969
  return false;
929
970
  }
930
971
  }
@@ -939,7 +980,7 @@ var CollectionRef = class {
939
980
  try {
940
981
  const res = await new HttpsRequest({
941
982
  method: "POST" /* POST */,
942
- endpoint: `${_optionalChain([this, 'access', _68 => _68.db, 'optionalAccess', _69 => _69.getBaseUrl])}/db/${packet.action}`.replace(
983
+ endpoint: `${this.db?.getBaseUrl}/db/${packet.action}`.replace(
943
984
  "$",
944
985
  "/"
945
986
  ),
@@ -948,12 +989,12 @@ var CollectionRef = class {
948
989
  data: packet
949
990
  }
950
991
  }).sendRequest();
951
- if (_optionalChain([res, 'optionalAccess', _70 => _70.success])) {
992
+ if (res?.success) {
952
993
  packet.status = "success";
953
994
  packet.timestamp = Timestamp.now();
954
995
  await store.put(packet);
955
996
  }
956
- } catch (e2) {
997
+ } catch {
957
998
  }
958
999
  }
959
1000
  await tx.done;
@@ -1130,7 +1171,7 @@ var CollectionRef2 = class {
1130
1171
  }
1131
1172
  }).sendRequest();
1132
1173
  console.log(res);
1133
- if (!_optionalChain([res, 'optionalAccess', _71 => _71.success]) || !res.id) {
1174
+ if (!res?.success || !res.id) {
1134
1175
  payload.status = "failed";
1135
1176
  if (this.db.getPersistence) {
1136
1177
  }
@@ -1199,7 +1240,7 @@ var Batch = class {
1199
1240
  ops: this.ops
1200
1241
  }
1201
1242
  }).sendRequest();
1202
- if (_optionalChain([res, 'optionalAccess', _72 => _72.error]))
1243
+ if (res?.error)
1203
1244
  throw new Error(res.error.message || "Batch commit failed");
1204
1245
  return res;
1205
1246
  }
@@ -1264,14 +1305,14 @@ var Database = class {
1264
1305
  ops: tx.ops
1265
1306
  }
1266
1307
  }).sendRequest();
1267
- if (_optionalChain([res, 'optionalAccess', _73 => _73.error]))
1308
+ if (res?.error)
1268
1309
  throw new Error(res.error.message || "Transaction failed");
1269
1310
  return res;
1270
1311
  }
1271
1312
  };
1272
1313
 
1273
1314
  // src/database/Realtime.ts
1274
- var _socketioclient = require('socket.io-client');
1315
+ var import_socket = require("socket.io-client");
1275
1316
 
1276
1317
  // src/utils/uuid.ts
1277
1318
  function generateUUID() {
@@ -1293,25 +1334,25 @@ var Realtime = class {
1293
1334
  this.events = ["error", "insert", "update", "delete"];
1294
1335
  }
1295
1336
  connect() {
1296
- if (!_optionalChain([this, 'access', _74 => _74.db, 'access', _75 => _75.getAuth, 'optionalAccess', _76 => _76.token]))
1337
+ if (!this.db.getAuth?.token)
1297
1338
  throw new Error("Auth token missing");
1298
- this.socket = _socketioclient.io.call(void 0, this.db.getSocketUrl, {
1339
+ this.socket = (0, import_socket.io)(this.db.getSocketUrl, {
1299
1340
  transports: ["websocket"],
1300
1341
  auth: { token: this.db.getAuth.token }
1301
1342
  });
1302
1343
  return this.socket;
1303
1344
  }
1304
1345
  on(event, cb) {
1305
- _optionalChain([this, 'access', _77 => _77.socket, 'optionalAccess', _78 => _78.on, 'call', _79 => _79(event, cb)]);
1346
+ this.socket?.on(event, cb);
1306
1347
  }
1307
1348
  off(event, cb) {
1308
1349
  if (cb)
1309
- _optionalChain([this, 'access', _80 => _80.socket, 'optionalAccess', _81 => _81.off, 'call', _82 => _82(event, cb)]);
1350
+ this.socket?.off(event, cb);
1310
1351
  else
1311
- _optionalChain([this, 'access', _83 => _83.socket, 'optionalAccess', _84 => _84.removeAllListeners, 'call', _85 => _85(event)]);
1352
+ this.socket?.removeAllListeners(event);
1312
1353
  }
1313
1354
  emit(event, data) {
1314
- _optionalChain([this, 'access', _86 => _86.socket, 'optionalAccess', _87 => _87.emit, 'call', _88 => _88(event, data)]);
1355
+ this.socket?.emit(event, data);
1315
1356
  }
1316
1357
  // ------------------------------------------------------------
1317
1358
  // 🔥 ADDITIONS BELOW — NO BREAKING CHANGES
@@ -1400,8 +1441,8 @@ var StorageSnapshot = class _StorageSnapshot {
1400
1441
  this.data = file;
1401
1442
  }
1402
1443
  static fromMap(map) {
1403
- const id = _nullishCoalesce(_nullishCoalesce(map.id, () => ( map._id)), () => ( ""));
1404
- const document = _nullishCoalesce(_nullishCoalesce(map.file, () => ( map.data)), () => ( map));
1444
+ const id = map.id ?? map._id ?? "";
1445
+ const document = map.file ?? map.data ?? map;
1405
1446
  return new _StorageSnapshot(id, document);
1406
1447
  }
1407
1448
  toMap() {
@@ -1413,7 +1454,7 @@ var StorageSnapshot = class _StorageSnapshot {
1413
1454
  };
1414
1455
 
1415
1456
  // src/storage/StorageRef.ts
1416
- var _formdata = require('form-data'); var _formdata2 = _interopRequireDefault(_formdata);
1457
+ var import_form_data = __toESM(require("form-data"), 1);
1417
1458
  var StorageRef = class {
1418
1459
  constructor(db, id) {
1419
1460
  this.db = db;
@@ -1444,7 +1485,7 @@ var StorageRef = class {
1444
1485
  if (!srcFile) {
1445
1486
  throw new Error("Invalid File");
1446
1487
  }
1447
- const form = new (0, _formdata2.default)();
1488
+ const form = new import_form_data.default();
1448
1489
  form.append("file", srcFile, srcFile.name);
1449
1490
  const res = await new HttpsRequest({
1450
1491
  method: "POST" /* POST */,
@@ -1576,11 +1617,12 @@ var EdmaxLabs = _EdmaxLabs;
1576
1617
 
1577
1618
  // src/index.ts
1578
1619
  var src_default = EdmaxLabs;
1579
-
1580
-
1581
-
1582
-
1583
-
1584
-
1585
-
1586
- exports.ArraySnapshot = ArraySnapshot; exports.Credentials = Credentials; exports.DocumentSnapshot = DocumentSnapshot; exports.StorageSnapshot = StorageSnapshot; exports.Timestamp = Timestamp; exports.default = src_default;
1620
+ // Annotate the CommonJS export names for ESM import in node:
1621
+ 0 && (module.exports = {
1622
+ ArraySnapshot,
1623
+ Credentials,
1624
+ DocumentSnapshot,
1625
+ StorageSnapshot,
1626
+ Timestamp
1627
+ });
1628
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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 ): 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 },\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"]}
package/dist/index.mjs CHANGED
@@ -1584,3 +1584,4 @@ export {
1584
1584
  Timestamp,
1585
1585
  src_default as default
1586
1586
  };
1587
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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 ): 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 },\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edmaxlabs-core",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Official Collection of Edmaxlabs services , including database , storage etc , Learn more at https://edmaxlabs.com",
5
5
  "author": "edmaxlabs",
6
6
  "license": "MIT",
@@ -13,6 +13,10 @@
13
13
  "auth",
14
14
  "storage"
15
15
  ],
16
+ "type": "module",
17
+ "main": "./dist/index.cjs",
18
+ "module": "./dist/index.mjs",
19
+ "types": "./dist/index.d.ts",
16
20
  "files": [
17
21
  "**/dist/**/*",
18
22
  "**/package.json",
@@ -21,6 +25,11 @@
21
25
  "compat/index.d.ts"
22
26
  ],
23
27
  "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.mjs",
31
+ "require": "./dist/index.cjs"
32
+ },
24
33
  "./database": {
25
34
  "types": "./database/dist/database/index.d.ts",
26
35
  "node": {
File without changes