akeyless-client-commons 1.1.129 → 1.1.130

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.
@@ -791,17 +791,73 @@ function timestamp_to_string(firebaseTimestamp, options) {
791
791
  return import_moment_timezone.default.utc(date).format(format);
792
792
  }
793
793
  }
794
- // src/helpers/firebase.ts
794
+ // src/helpers/global.ts
795
+ var import_akeyless_types_commons = require("akeyless-types-commons");
796
+ var import_axios = __toESM(require("axios"));
797
+ var import_lodash = require("lodash");
795
798
  var import_meta = {};
799
+ var renderOnce = function() {
800
+ return true;
801
+ };
802
+ var propsAreEqual = function(prevProps, nextProps) {
803
+ return (0, import_lodash.isEqual)(prevProps, nextProps);
804
+ };
805
+ var getLocationUrl = function(lng, lat) {
806
+ return "https://www.google.com/maps?q=".concat(lat, ",").concat(lng);
807
+ };
808
+ var isNodeEnv = typeof process !== "undefined" && process.env;
809
+ var _ref = {
810
+ mode: isNodeEnv ? process.env.NEXT_PUBLIC_MODE : import_meta.env.VITE_MODE,
811
+ isLocal: (isNodeEnv ? process.env.NEXT_PUBLIC_IS_LOCAL : import_meta.env.VITE_is_local) === "true"
812
+ }, mode = _ref.mode, isLocal = _ref.isLocal;
813
+ var getFixedNumber = function() {
814
+ var number = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0, fix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
815
+ var sum_value = number % 1 === 0 ? number : number.toFixed(fix).replace(/\.?0+$/, "");
816
+ return String(sum_value);
817
+ };
818
+ var checkConditions = function(document2, conditions) {
819
+ if (!conditions || conditions.length === 0) return true;
820
+ return conditions.every(function(condition) {
821
+ var fieldValue = document2[condition.field_name];
822
+ switch(condition.operator){
823
+ case "==":
824
+ return fieldValue === condition.value;
825
+ case "!=":
826
+ return fieldValue !== condition.value;
827
+ case "<":
828
+ return fieldValue < condition.value;
829
+ case "<=":
830
+ return fieldValue <= condition.value;
831
+ case ">":
832
+ return fieldValue > condition.value;
833
+ case ">=":
834
+ return fieldValue >= condition.value;
835
+ case "in":
836
+ return Array.isArray(condition.value) && condition.value.includes(fieldValue);
837
+ case "not-in":
838
+ return Array.isArray(condition.value) && !condition.value.includes(fieldValue);
839
+ case "array-contains":
840
+ return Array.isArray(fieldValue) && fieldValue.includes(condition.value);
841
+ case "array-contains-any":
842
+ return Array.isArray(fieldValue) && Array.isArray(condition.value) && condition.value.some(function(v) {
843
+ return fieldValue.includes(v);
844
+ });
845
+ default:
846
+ return false;
847
+ }
848
+ });
849
+ };
850
+ // src/helpers/firebase.ts
851
+ var import_meta2 = {};
796
852
  var initApp = function() {
797
853
  var isNodeEnv2 = typeof process !== "undefined" && process.env;
798
854
  var firebaseConfig = {
799
- apiKey: isNodeEnv2 ? process.env.NEXT_PUBLIC_API_KEY : import_meta.env.VITE_API_KEY,
800
- authDomain: isNodeEnv2 ? process.env.NEXT_PUBLIC_AUTH_DOMAIN : import_meta.env.VITE_AUTH_DOMAIN,
801
- projectId: isNodeEnv2 ? process.env.NEXT_PUBLIC_PROJECT_ID : import_meta.env.VITE_PROJECT_ID,
802
- storageBucket: isNodeEnv2 ? process.env.NEXT_PUBLIC_STORAGE_BUCKET : import_meta.env.VITE_STORAGE_BUCKET,
803
- messagingSenderId: isNodeEnv2 ? process.env.NEXT_PUBLIC_MESSAGING_SENDER_ID : import_meta.env.VITE_MESSAGING_SENDER_ID,
804
- appId: isNodeEnv2 ? process.env.NEXT_PUBLIC_APP_ID : import_meta.env.VITE_APP_ID
855
+ apiKey: isNodeEnv2 ? process.env.NEXT_PUBLIC_API_KEY : import_meta2.env.VITE_API_KEY,
856
+ authDomain: isNodeEnv2 ? process.env.NEXT_PUBLIC_AUTH_DOMAIN : import_meta2.env.VITE_AUTH_DOMAIN,
857
+ projectId: isNodeEnv2 ? process.env.NEXT_PUBLIC_PROJECT_ID : import_meta2.env.VITE_PROJECT_ID,
858
+ storageBucket: isNodeEnv2 ? process.env.NEXT_PUBLIC_STORAGE_BUCKET : import_meta2.env.VITE_STORAGE_BUCKET,
859
+ messagingSenderId: isNodeEnv2 ? process.env.NEXT_PUBLIC_MESSAGING_SENDER_ID : import_meta2.env.VITE_MESSAGING_SENDER_ID,
860
+ appId: isNodeEnv2 ? process.env.NEXT_PUBLIC_APP_ID : import_meta2.env.VITE_APP_ID
805
861
  };
806
862
  try {
807
863
  var app2 = (0, import_app.initializeApp)(firebaseConfig);
@@ -810,7 +866,7 @@ var initApp = function() {
810
866
  var db2 = (0, import_firestore2.getFirestore)(app2);
811
867
  var storage2 = (0, import_storage.getStorage)(app2);
812
868
  var googleLoginProvider2 = new import_auth.GoogleAuthProvider();
813
- var recaptchaSiteKey = isNodeEnv2 ? process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY : import_meta.env.VITE_RECAPTCHA_SITE_KEY;
869
+ var recaptchaSiteKey = isNodeEnv2 ? process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY : import_meta2.env.VITE_RECAPTCHA_SITE_KEY;
814
870
  var result = {
815
871
  db: db2,
816
872
  auth: auth2,
@@ -1170,30 +1226,6 @@ var validateUserStatusAndPermissions = function(user, app2) {
1170
1226
  }
1171
1227
  return userPermissions;
1172
1228
  };
1173
- // src/helpers/global.ts
1174
- var import_akeyless_types_commons = require("akeyless-types-commons");
1175
- var import_axios = __toESM(require("axios"));
1176
- var import_lodash = require("lodash");
1177
- var import_meta2 = {};
1178
- var renderOnce = function() {
1179
- return true;
1180
- };
1181
- var propsAreEqual = function(prevProps, nextProps) {
1182
- return (0, import_lodash.isEqual)(prevProps, nextProps);
1183
- };
1184
- var getLocationUrl = function(lng, lat) {
1185
- return "https://www.google.com/maps?q=".concat(lat, ",").concat(lng);
1186
- };
1187
- var isNodeEnv = typeof process !== "undefined" && process.env;
1188
- var _ref = {
1189
- mode: isNodeEnv ? process.env.NEXT_PUBLIC_MODE : import_meta2.env.VITE_MODE,
1190
- isLocal: (isNodeEnv ? process.env.NEXT_PUBLIC_IS_LOCAL : import_meta2.env.VITE_is_local) === "true"
1191
- }, mode = _ref.mode, isLocal = _ref.isLocal;
1192
- var getFixedNumber = function() {
1193
- var number = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0, fix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
1194
- var sum_value = number % 1 === 0 ? number : number.toFixed(fix).replace(/\.?0+$/, "");
1195
- return String(sum_value);
1196
- };
1197
1229
  // src/helpers/forms.ts
1198
1230
  var import_xregexp = __toESM(require("xregexp"));
1199
1231
  var textRegex = (0, import_xregexp.default)(String.raw(_templateObject()), "gu");
@@ -1340,6 +1372,9 @@ var SocketService = /*#__PURE__*/ function() {
1340
1372
  this.disconnectCallbacks = [];
1341
1373
  this.authToken = null;
1342
1374
  this.isDisconnected = true;
1375
+ /// the data-socket keeps one subscription per collection per socket, so a second condition set
1376
+ /// for a collection never reaches it and would silently receive the first one's documents
1377
+ this.activeConditions = /* @__PURE__ */ new Map();
1343
1378
  this.handleDisconnect = function(source, reason) {
1344
1379
  var _this_socket;
1345
1380
  if (_this.isDisconnected) {
@@ -1507,6 +1542,39 @@ var SocketService = /*#__PURE__*/ function() {
1507
1542
  }
1508
1543
  }
1509
1544
  },
1545
+ {
1546
+ key: "registerConditions",
1547
+ value: function registerConditions(collectionName) {
1548
+ var conditions = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
1549
+ var signature = JSON.stringify(conditions);
1550
+ var active = this.activeConditions.get(collectionName);
1551
+ if (!active) {
1552
+ this.activeConditions.set(collectionName, {
1553
+ signature: signature,
1554
+ conditions: conditions,
1555
+ count: 1
1556
+ });
1557
+ return;
1558
+ }
1559
+ active.count++;
1560
+ if (active.signature !== signature) {
1561
+ console.error('[socket] "'.concat(collectionName, '" is already subscribed with different conditions, and a collection supports one condition set at a time. The active set stays in effect, so this subscription receives its documents instead of its own. active: ').concat(active.signature, " requested: ").concat(signature));
1562
+ }
1563
+ }
1564
+ },
1565
+ {
1566
+ key: "releaseConditions",
1567
+ value: function releaseConditions(collectionName) {
1568
+ var active = this.activeConditions.get(collectionName);
1569
+ if (!active) {
1570
+ return;
1571
+ }
1572
+ active.count--;
1573
+ if (active.count <= 0) {
1574
+ this.activeConditions.delete(collectionName);
1575
+ }
1576
+ }
1577
+ },
1510
1578
  {
1511
1579
  key: "disconnectSocket",
1512
1580
  value: function disconnectSocket() {
@@ -1518,6 +1586,8 @@ var SocketService = /*#__PURE__*/ function() {
1518
1586
  },
1519
1587
  {
1520
1588
  /// subscribe to collections
1589
+ /// conditions are derived from OnSnapshotConfig.conditions, never passed in, so a caller cannot
1590
+ /// set them in a second place and have them silently overwritten
1521
1591
  key: "subscribeToCollections",
1522
1592
  value: function subscribeToCollections(config, options) {
1523
1593
  var _this = this;
@@ -1530,26 +1600,77 @@ var SocketService = /*#__PURE__*/ function() {
1530
1600
  });
1531
1601
  var eventHandlers = [];
1532
1602
  config.forEach(function(configuration) {
1533
- var collectionName = configuration.collectionName, onAdd = configuration.onAdd, onFirstTime = configuration.onFirstTime, onModify = configuration.onModify, onRemove = configuration.onRemove, extraParsers = configuration.extraParsers;
1603
+ var collectionName = configuration.collectionName, conditions = configuration.conditions;
1604
+ var parsers = [
1605
+ configuration
1606
+ ].concat(_to_consumable_array(configuration.extraParsers || []));
1607
+ var matchedIds = /* @__PURE__ */ new Set();
1534
1608
  var attach = function(eventName, handler) {
1535
- if (!handler) return;
1536
- _this.socket.off(eventName, handler);
1537
1609
  _this.socket.on(eventName, handler);
1538
1610
  eventHandlers.push({
1539
1611
  eventName: eventName,
1540
1612
  handler: handler
1541
1613
  });
1542
1614
  };
1543
- attach("initial:".concat(collectionName), onFirstTime);
1544
- attach("add:".concat(collectionName), onAdd);
1545
- attach("update:".concat(collectionName), onModify);
1546
- attach("delete:".concat(collectionName), onRemove);
1547
- extraParsers === null || extraParsers === void 0 ? void 0 : extraParsers.forEach(function(parsers) {
1548
- var extraOnAdd = parsers.onAdd, extraOnFirstTime = parsers.onFirstTime, extraOnModify = parsers.onModify, extraOnRemove = parsers.onRemove;
1549
- attach("initial:".concat(collectionName), extraOnFirstTime);
1550
- attach("add:".concat(collectionName), extraOnAdd);
1551
- attach("update:".concat(collectionName), extraOnModify);
1552
- attach("delete:".concat(collectionName), extraOnRemove);
1615
+ var toDocs = function(payload) {
1616
+ return Array.isArray(payload) ? payload : payload ? [
1617
+ payload
1618
+ ] : [];
1619
+ };
1620
+ var run = function(op, docs) {
1621
+ return parsers.forEach(function(parser) {
1622
+ var _parser_op;
1623
+ return (_parser_op = parser[op]) === null || _parser_op === void 0 ? void 0 : _parser_op.call(parser, docs, configuration);
1624
+ });
1625
+ };
1626
+ var runIfAny = function(op, docs) {
1627
+ if (docs.length) {
1628
+ run(op, docs);
1629
+ }
1630
+ };
1631
+ attach("initial:".concat(collectionName), function(payload) {
1632
+ var docs = toDocs(payload).filter(function(doc2) {
1633
+ return checkConditions(doc2, conditions);
1634
+ });
1635
+ matchedIds.clear();
1636
+ docs.forEach(function(doc2) {
1637
+ return matchedIds.add(doc2.id);
1638
+ });
1639
+ run("onFirstTime", docs);
1640
+ });
1641
+ var handleUpsert = function(payload, defaultOp) {
1642
+ var added = [];
1643
+ var modified = [];
1644
+ var removed = [];
1645
+ toDocs(payload).forEach(function(doc2) {
1646
+ if (!(conditions === null || conditions === void 0 ? void 0 : conditions.length)) {
1647
+ (defaultOp === "onAdd" ? added : modified).push(doc2);
1648
+ return;
1649
+ }
1650
+ var wasMatching = matchedIds.has(doc2.id);
1651
+ if (checkConditions(doc2, conditions)) {
1652
+ matchedIds.add(doc2.id);
1653
+ (wasMatching ? modified : added).push(doc2);
1654
+ } else if (wasMatching) {
1655
+ matchedIds.delete(doc2.id);
1656
+ removed.push(doc2);
1657
+ }
1658
+ });
1659
+ runIfAny("onAdd", added);
1660
+ runIfAny("onModify", modified);
1661
+ runIfAny("onRemove", removed);
1662
+ };
1663
+ attach("add:".concat(collectionName), function(payload) {
1664
+ return handleUpsert(payload, "onAdd");
1665
+ });
1666
+ attach("update:".concat(collectionName), function(payload) {
1667
+ return handleUpsert(payload, "onModify");
1668
+ });
1669
+ attach("delete:".concat(collectionName), function(payload) {
1670
+ var docs = toDocs(payload).filter(function(doc2) {
1671
+ return !(conditions === null || conditions === void 0 ? void 0 : conditions.length) || matchedIds.delete(doc2.id);
1672
+ });
1673
+ runIfAny("onRemove", docs);
1553
1674
  });
1554
1675
  });
1555
1676
  var acknowledge = function(callback) {
@@ -1559,12 +1680,28 @@ var SocketService = /*#__PURE__*/ function() {
1559
1680
  console.error("Failed to subscribe to ".concat(config.join(", "), ": ").concat(callback.message));
1560
1681
  }
1561
1682
  };
1562
- if (options) {
1563
- s.emit("subscribe_options", options);
1683
+ config.forEach(function(c) {
1684
+ return _this.registerConditions(c.collectionName, c.conditions);
1685
+ });
1686
+ var conditionsByCollection = config.reduce(function(acc, c) {
1687
+ var active = _this.activeConditions.get(c.collectionName);
1688
+ if (active === null || active === void 0 ? void 0 : active.conditions.length) {
1689
+ acc[c.collectionName] = active.conditions;
1690
+ }
1691
+ return acc;
1692
+ }, {});
1693
+ var subscribeOptions = Object.keys(conditionsByCollection).length ? _object_spread_props(_object_spread({}, options), {
1694
+ conditions: conditionsByCollection
1695
+ }) : options;
1696
+ if (subscribeOptions) {
1697
+ s.emit("subscribe_options", subscribeOptions);
1564
1698
  }
1565
1699
  s.emit("subscribe_collections", collectionsNames, acknowledge);
1566
1700
  return function() {
1567
1701
  console.log("Cleaning up subscriptions for: ".concat(collectionsNames.join(", ")));
1702
+ collectionsNames.forEach(function(name) {
1703
+ return _this.releaseConditions(name);
1704
+ });
1568
1705
  s.emit("unsubscribe_collections", collectionsNames);
1569
1706
  eventHandlers.forEach(function(eh) {
1570
1707
  s.off(eh.eventName, eh.handler);
@@ -524,6 +524,61 @@ function timestamp_to_string(firebaseTimestamp, options) {
524
524
  return moment.utc(date).format(format);
525
525
  }
526
526
  }
527
+ // src/helpers/global.ts
528
+ import { CountryOptions, LanguageOptions } from "akeyless-types-commons";
529
+ import axios from "axios";
530
+ import { isEqual } from "lodash";
531
+ var renderOnce = function() {
532
+ return true;
533
+ };
534
+ var propsAreEqual = function(prevProps, nextProps) {
535
+ return isEqual(prevProps, nextProps);
536
+ };
537
+ var getLocationUrl = function(lng, lat) {
538
+ return "https://www.google.com/maps?q=".concat(lat, ",").concat(lng);
539
+ };
540
+ var isNodeEnv = typeof process !== "undefined" && process.env;
541
+ var _ref = {
542
+ mode: isNodeEnv ? process.env.NEXT_PUBLIC_MODE : import.meta.env.VITE_MODE,
543
+ isLocal: (isNodeEnv ? process.env.NEXT_PUBLIC_IS_LOCAL : import.meta.env.VITE_is_local) === "true"
544
+ }, mode = _ref.mode, isLocal = _ref.isLocal;
545
+ var getFixedNumber = function() {
546
+ var number = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0, fix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
547
+ var sum_value = number % 1 === 0 ? number : number.toFixed(fix).replace(/\.?0+$/, "");
548
+ return String(sum_value);
549
+ };
550
+ var checkConditions = function(document2, conditions) {
551
+ if (!conditions || conditions.length === 0) return true;
552
+ return conditions.every(function(condition) {
553
+ var fieldValue = document2[condition.field_name];
554
+ switch(condition.operator){
555
+ case "==":
556
+ return fieldValue === condition.value;
557
+ case "!=":
558
+ return fieldValue !== condition.value;
559
+ case "<":
560
+ return fieldValue < condition.value;
561
+ case "<=":
562
+ return fieldValue <= condition.value;
563
+ case ">":
564
+ return fieldValue > condition.value;
565
+ case ">=":
566
+ return fieldValue >= condition.value;
567
+ case "in":
568
+ return Array.isArray(condition.value) && condition.value.includes(fieldValue);
569
+ case "not-in":
570
+ return Array.isArray(condition.value) && !condition.value.includes(fieldValue);
571
+ case "array-contains":
572
+ return Array.isArray(fieldValue) && fieldValue.includes(condition.value);
573
+ case "array-contains-any":
574
+ return Array.isArray(fieldValue) && Array.isArray(condition.value) && condition.value.some(function(v) {
575
+ return fieldValue.includes(v);
576
+ });
577
+ default:
578
+ return false;
579
+ }
580
+ });
581
+ };
527
582
  // src/helpers/firebase.ts
528
583
  var initApp = function() {
529
584
  var isNodeEnv2 = typeof process !== "undefined" && process.env;
@@ -902,29 +957,6 @@ var validateUserStatusAndPermissions = function(user, app2) {
902
957
  }
903
958
  return userPermissions;
904
959
  };
905
- // src/helpers/global.ts
906
- import { CountryOptions, LanguageOptions } from "akeyless-types-commons";
907
- import axios from "axios";
908
- import { isEqual } from "lodash";
909
- var renderOnce = function() {
910
- return true;
911
- };
912
- var propsAreEqual = function(prevProps, nextProps) {
913
- return isEqual(prevProps, nextProps);
914
- };
915
- var getLocationUrl = function(lng, lat) {
916
- return "https://www.google.com/maps?q=".concat(lat, ",").concat(lng);
917
- };
918
- var isNodeEnv = typeof process !== "undefined" && process.env;
919
- var _ref = {
920
- mode: isNodeEnv ? process.env.NEXT_PUBLIC_MODE : import.meta.env.VITE_MODE,
921
- isLocal: (isNodeEnv ? process.env.NEXT_PUBLIC_IS_LOCAL : import.meta.env.VITE_is_local) === "true"
922
- }, mode = _ref.mode, isLocal = _ref.isLocal;
923
- var getFixedNumber = function() {
924
- var number = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0, fix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
925
- var sum_value = number % 1 === 0 ? number : number.toFixed(fix).replace(/\.?0+$/, "");
926
- return String(sum_value);
927
- };
928
960
  // src/helpers/forms.ts
929
961
  import XRegExp from "xregexp";
930
962
  var textRegex = XRegExp(String.raw(_templateObject()), "gu");
@@ -1071,6 +1103,9 @@ var SocketService = /*#__PURE__*/ function() {
1071
1103
  this.disconnectCallbacks = [];
1072
1104
  this.authToken = null;
1073
1105
  this.isDisconnected = true;
1106
+ /// the data-socket keeps one subscription per collection per socket, so a second condition set
1107
+ /// for a collection never reaches it and would silently receive the first one's documents
1108
+ this.activeConditions = /* @__PURE__ */ new Map();
1074
1109
  this.handleDisconnect = function(source, reason) {
1075
1110
  var _this_socket;
1076
1111
  if (_this.isDisconnected) {
@@ -1238,6 +1273,39 @@ var SocketService = /*#__PURE__*/ function() {
1238
1273
  }
1239
1274
  }
1240
1275
  },
1276
+ {
1277
+ key: "registerConditions",
1278
+ value: function registerConditions(collectionName) {
1279
+ var conditions = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
1280
+ var signature = JSON.stringify(conditions);
1281
+ var active = this.activeConditions.get(collectionName);
1282
+ if (!active) {
1283
+ this.activeConditions.set(collectionName, {
1284
+ signature: signature,
1285
+ conditions: conditions,
1286
+ count: 1
1287
+ });
1288
+ return;
1289
+ }
1290
+ active.count++;
1291
+ if (active.signature !== signature) {
1292
+ console.error('[socket] "'.concat(collectionName, '" is already subscribed with different conditions, and a collection supports one condition set at a time. The active set stays in effect, so this subscription receives its documents instead of its own. active: ').concat(active.signature, " requested: ").concat(signature));
1293
+ }
1294
+ }
1295
+ },
1296
+ {
1297
+ key: "releaseConditions",
1298
+ value: function releaseConditions(collectionName) {
1299
+ var active = this.activeConditions.get(collectionName);
1300
+ if (!active) {
1301
+ return;
1302
+ }
1303
+ active.count--;
1304
+ if (active.count <= 0) {
1305
+ this.activeConditions.delete(collectionName);
1306
+ }
1307
+ }
1308
+ },
1241
1309
  {
1242
1310
  key: "disconnectSocket",
1243
1311
  value: function disconnectSocket() {
@@ -1249,6 +1317,8 @@ var SocketService = /*#__PURE__*/ function() {
1249
1317
  },
1250
1318
  {
1251
1319
  /// subscribe to collections
1320
+ /// conditions are derived from OnSnapshotConfig.conditions, never passed in, so a caller cannot
1321
+ /// set them in a second place and have them silently overwritten
1252
1322
  key: "subscribeToCollections",
1253
1323
  value: function subscribeToCollections(config, options) {
1254
1324
  var _this = this;
@@ -1261,26 +1331,77 @@ var SocketService = /*#__PURE__*/ function() {
1261
1331
  });
1262
1332
  var eventHandlers = [];
1263
1333
  config.forEach(function(configuration) {
1264
- var collectionName = configuration.collectionName, onAdd = configuration.onAdd, onFirstTime = configuration.onFirstTime, onModify = configuration.onModify, onRemove = configuration.onRemove, extraParsers = configuration.extraParsers;
1334
+ var collectionName = configuration.collectionName, conditions = configuration.conditions;
1335
+ var parsers = [
1336
+ configuration
1337
+ ].concat(_to_consumable_array(configuration.extraParsers || []));
1338
+ var matchedIds = /* @__PURE__ */ new Set();
1265
1339
  var attach = function(eventName, handler) {
1266
- if (!handler) return;
1267
- _this.socket.off(eventName, handler);
1268
1340
  _this.socket.on(eventName, handler);
1269
1341
  eventHandlers.push({
1270
1342
  eventName: eventName,
1271
1343
  handler: handler
1272
1344
  });
1273
1345
  };
1274
- attach("initial:".concat(collectionName), onFirstTime);
1275
- attach("add:".concat(collectionName), onAdd);
1276
- attach("update:".concat(collectionName), onModify);
1277
- attach("delete:".concat(collectionName), onRemove);
1278
- extraParsers === null || extraParsers === void 0 ? void 0 : extraParsers.forEach(function(parsers) {
1279
- var extraOnAdd = parsers.onAdd, extraOnFirstTime = parsers.onFirstTime, extraOnModify = parsers.onModify, extraOnRemove = parsers.onRemove;
1280
- attach("initial:".concat(collectionName), extraOnFirstTime);
1281
- attach("add:".concat(collectionName), extraOnAdd);
1282
- attach("update:".concat(collectionName), extraOnModify);
1283
- attach("delete:".concat(collectionName), extraOnRemove);
1346
+ var toDocs = function(payload) {
1347
+ return Array.isArray(payload) ? payload : payload ? [
1348
+ payload
1349
+ ] : [];
1350
+ };
1351
+ var run = function(op, docs) {
1352
+ return parsers.forEach(function(parser) {
1353
+ var _parser_op;
1354
+ return (_parser_op = parser[op]) === null || _parser_op === void 0 ? void 0 : _parser_op.call(parser, docs, configuration);
1355
+ });
1356
+ };
1357
+ var runIfAny = function(op, docs) {
1358
+ if (docs.length) {
1359
+ run(op, docs);
1360
+ }
1361
+ };
1362
+ attach("initial:".concat(collectionName), function(payload) {
1363
+ var docs = toDocs(payload).filter(function(doc2) {
1364
+ return checkConditions(doc2, conditions);
1365
+ });
1366
+ matchedIds.clear();
1367
+ docs.forEach(function(doc2) {
1368
+ return matchedIds.add(doc2.id);
1369
+ });
1370
+ run("onFirstTime", docs);
1371
+ });
1372
+ var handleUpsert = function(payload, defaultOp) {
1373
+ var added = [];
1374
+ var modified = [];
1375
+ var removed = [];
1376
+ toDocs(payload).forEach(function(doc2) {
1377
+ if (!(conditions === null || conditions === void 0 ? void 0 : conditions.length)) {
1378
+ (defaultOp === "onAdd" ? added : modified).push(doc2);
1379
+ return;
1380
+ }
1381
+ var wasMatching = matchedIds.has(doc2.id);
1382
+ if (checkConditions(doc2, conditions)) {
1383
+ matchedIds.add(doc2.id);
1384
+ (wasMatching ? modified : added).push(doc2);
1385
+ } else if (wasMatching) {
1386
+ matchedIds.delete(doc2.id);
1387
+ removed.push(doc2);
1388
+ }
1389
+ });
1390
+ runIfAny("onAdd", added);
1391
+ runIfAny("onModify", modified);
1392
+ runIfAny("onRemove", removed);
1393
+ };
1394
+ attach("add:".concat(collectionName), function(payload) {
1395
+ return handleUpsert(payload, "onAdd");
1396
+ });
1397
+ attach("update:".concat(collectionName), function(payload) {
1398
+ return handleUpsert(payload, "onModify");
1399
+ });
1400
+ attach("delete:".concat(collectionName), function(payload) {
1401
+ var docs = toDocs(payload).filter(function(doc2) {
1402
+ return !(conditions === null || conditions === void 0 ? void 0 : conditions.length) || matchedIds.delete(doc2.id);
1403
+ });
1404
+ runIfAny("onRemove", docs);
1284
1405
  });
1285
1406
  });
1286
1407
  var acknowledge = function(callback) {
@@ -1290,12 +1411,28 @@ var SocketService = /*#__PURE__*/ function() {
1290
1411
  console.error("Failed to subscribe to ".concat(config.join(", "), ": ").concat(callback.message));
1291
1412
  }
1292
1413
  };
1293
- if (options) {
1294
- s.emit("subscribe_options", options);
1414
+ config.forEach(function(c) {
1415
+ return _this.registerConditions(c.collectionName, c.conditions);
1416
+ });
1417
+ var conditionsByCollection = config.reduce(function(acc, c) {
1418
+ var active = _this.activeConditions.get(c.collectionName);
1419
+ if (active === null || active === void 0 ? void 0 : active.conditions.length) {
1420
+ acc[c.collectionName] = active.conditions;
1421
+ }
1422
+ return acc;
1423
+ }, {});
1424
+ var subscribeOptions = Object.keys(conditionsByCollection).length ? _object_spread_props(_object_spread({}, options), {
1425
+ conditions: conditionsByCollection
1426
+ }) : options;
1427
+ if (subscribeOptions) {
1428
+ s.emit("subscribe_options", subscribeOptions);
1295
1429
  }
1296
1430
  s.emit("subscribe_collections", collectionsNames, acknowledge);
1297
1431
  return function() {
1298
1432
  console.log("Cleaning up subscriptions for: ".concat(collectionsNames.join(", ")));
1433
+ collectionsNames.forEach(function(name) {
1434
+ return _this.releaseConditions(name);
1435
+ });
1299
1436
  s.emit("unsubscribe_collections", collectionsNames);
1300
1437
  eventHandlers.forEach(function(eh) {
1301
1438
  s.off(eh.eventName, eh.handler);
@@ -188,6 +188,7 @@ declare const isLocal: boolean;
188
188
  declare const getFixedNumber: (number?: number, fix?: number) => string;
189
189
  declare const getAddressByGeo: ({ lat, lng }: Geo, currentLanguage: LanguageOptions) => Promise<any>;
190
190
  declare const validateAndCast: <T extends unknown>(variable: any, condition: Boolean) => variable is T;
191
+ declare const checkConditions: (document: TObject<any>, conditions?: WhereCondition[]) => boolean;
191
192
 
192
193
  declare const textRegex: RegExp;
193
194
  declare const numbersRegex: RegExp;
@@ -333,6 +334,7 @@ declare class SocketService {
333
334
  private disconnectCallbacks;
334
335
  private authToken;
335
336
  private isDisconnected;
337
+ private activeConditions;
336
338
  private handleDisconnect;
337
339
  private initSocket;
338
340
  private constructor();
@@ -345,8 +347,10 @@ declare class SocketService {
345
347
  offDisconnect(callback: () => void): void;
346
348
  isConnected(): boolean;
347
349
  setAuthToken(token: string): void;
350
+ private registerConditions;
351
+ private releaseConditions;
348
352
  disconnectSocket(): void;
349
- subscribeToCollections(config: OnSnapshotConfig[], options?: SubscribeCollectionsOptions): () => void;
353
+ subscribeToCollections(config: OnSnapshotConfig[], options?: Omit<SubscribeCollectionsOptions, "conditions">): () => void;
350
354
  setData<UpdateType extends RedisUpdateType, DataType = any>(payload: RedisUpdatePayload<UpdateType, DataType>): Promise<SocketCallbackResponse>;
351
355
  getCollectionData<T>(payload: Omit<GetDataPayload<T>, "key">): void;
352
356
  getDocumentData<T>(payload: GetDataPayload<T>): void;
@@ -361,4 +365,4 @@ declare const multiply: (a: number, b: number) => number;
361
365
  declare const add: (a: number, b: number) => number;
362
366
  declare const subtract: (a: number, b: number) => number;
363
367
 
364
- export { type EmailAttachment, type EmailData, type ValidationType, add, addAuditRecord, addLoginAudit, addNxProblem, add_document, addressRegex, akeylessOnlineDomain, app, appCheck, auth, baseDomain, biDomain, calculateBearing, callCenterEventsDomain, callCenterGeoDomain, carsRegex, chargeDomain, chartsRegex, checkUserPermissions, cleanNxSites, cn, collections, colorRegex, createAttachmentFromBlob, createAttachmentFromUrl, createSelectors, dataSocketDomain, dataSyncDomain, db, delete_document, devicesDomain, displayFormatPhoneNumber, durationToSeconds, emailRegex, endUsersDomain, extractAlertsData, extractBoardsData, extractCanbusData, extractCarsData, extractClientData, extractLocationData, extractSiteData, fire_base_TIME_TEMP, formatCarNumber, getAddressByGeo, getFileUrlFromStorage, getFixedNumber, getFormCheckboxValue, getFormElementValue, getLocationUrl, getUserByEmail, getUserByIdentifier, getUserByPhone, getUserCountryByIp, get_all_documents, get_document_by_id, get_international_phone_number, googleLoginProvider, handleChange, handleInvalid, handlePaste, initializeUserPermissions, international_israel_phone_format, isFixedOrServiceNumber, isInternational, isInternationalIsraelPhone, isLocal, isNodeEnv, isSimProviderCelcom, isSimProviderMonogoto, isSimProviderPartner, isSimProviderPelephone, is_iccid, local_israel_phone_format, longShortPhoneNumbers, mode, multiStringFormat, multiply, notificationsDomain, numbersOnlyRegex, numbersRegex, nxApiCall, parseMultiSelectInput, parsePermissions, parseSnapshotAsArray, parseSnapshotAsObject, priceRegex, propsAreEqual, query_document, query_document_by_conditions, query_documents, query_documents_by_conditions, renderOnce, secondsToDuration, sendEmail, setFormElementValue, setState, set_document, simpleExtractData, snapshot, snapshotDocument, socketServiceInstance, sort_by_timestamp, storage, subtract, textNumbersRegex, textRegex, timestamp_to_millis, timestamp_to_string, uploadFileToStorage, useLoginWithGoogle, useStoreValues, useValidation, userNameFormat, validateAndCast, validateUserStatusAndPermissions };
368
+ export { type EmailAttachment, type EmailData, type ValidationType, add, addAuditRecord, addLoginAudit, addNxProblem, add_document, addressRegex, akeylessOnlineDomain, app, appCheck, auth, baseDomain, biDomain, calculateBearing, callCenterEventsDomain, callCenterGeoDomain, carsRegex, chargeDomain, chartsRegex, checkConditions, checkUserPermissions, cleanNxSites, cn, collections, colorRegex, createAttachmentFromBlob, createAttachmentFromUrl, createSelectors, dataSocketDomain, dataSyncDomain, db, delete_document, devicesDomain, displayFormatPhoneNumber, durationToSeconds, emailRegex, endUsersDomain, extractAlertsData, extractBoardsData, extractCanbusData, extractCarsData, extractClientData, extractLocationData, extractSiteData, fire_base_TIME_TEMP, formatCarNumber, getAddressByGeo, getFileUrlFromStorage, getFixedNumber, getFormCheckboxValue, getFormElementValue, getLocationUrl, getUserByEmail, getUserByIdentifier, getUserByPhone, getUserCountryByIp, get_all_documents, get_document_by_id, get_international_phone_number, googleLoginProvider, handleChange, handleInvalid, handlePaste, initializeUserPermissions, international_israel_phone_format, isFixedOrServiceNumber, isInternational, isInternationalIsraelPhone, isLocal, isNodeEnv, isSimProviderCelcom, isSimProviderMonogoto, isSimProviderPartner, isSimProviderPelephone, is_iccid, local_israel_phone_format, longShortPhoneNumbers, mode, multiStringFormat, multiply, notificationsDomain, numbersOnlyRegex, numbersRegex, nxApiCall, parseMultiSelectInput, parsePermissions, parseSnapshotAsArray, parseSnapshotAsObject, priceRegex, propsAreEqual, query_document, query_document_by_conditions, query_documents, query_documents_by_conditions, renderOnce, secondsToDuration, sendEmail, setFormElementValue, setState, set_document, simpleExtractData, snapshot, snapshotDocument, socketServiceInstance, sort_by_timestamp, storage, subtract, textNumbersRegex, textRegex, timestamp_to_millis, timestamp_to_string, uploadFileToStorage, useLoginWithGoogle, useStoreValues, useValidation, userNameFormat, validateAndCast, validateUserStatusAndPermissions };
@@ -188,6 +188,7 @@ declare const isLocal: boolean;
188
188
  declare const getFixedNumber: (number?: number, fix?: number) => string;
189
189
  declare const getAddressByGeo: ({ lat, lng }: Geo, currentLanguage: LanguageOptions) => Promise<any>;
190
190
  declare const validateAndCast: <T extends unknown>(variable: any, condition: Boolean) => variable is T;
191
+ declare const checkConditions: (document: TObject<any>, conditions?: WhereCondition[]) => boolean;
191
192
 
192
193
  declare const textRegex: RegExp;
193
194
  declare const numbersRegex: RegExp;
@@ -333,6 +334,7 @@ declare class SocketService {
333
334
  private disconnectCallbacks;
334
335
  private authToken;
335
336
  private isDisconnected;
337
+ private activeConditions;
336
338
  private handleDisconnect;
337
339
  private initSocket;
338
340
  private constructor();
@@ -345,8 +347,10 @@ declare class SocketService {
345
347
  offDisconnect(callback: () => void): void;
346
348
  isConnected(): boolean;
347
349
  setAuthToken(token: string): void;
350
+ private registerConditions;
351
+ private releaseConditions;
348
352
  disconnectSocket(): void;
349
- subscribeToCollections(config: OnSnapshotConfig[], options?: SubscribeCollectionsOptions): () => void;
353
+ subscribeToCollections(config: OnSnapshotConfig[], options?: Omit<SubscribeCollectionsOptions, "conditions">): () => void;
350
354
  setData<UpdateType extends RedisUpdateType, DataType = any>(payload: RedisUpdatePayload<UpdateType, DataType>): Promise<SocketCallbackResponse>;
351
355
  getCollectionData<T>(payload: Omit<GetDataPayload<T>, "key">): void;
352
356
  getDocumentData<T>(payload: GetDataPayload<T>): void;
@@ -361,4 +365,4 @@ declare const multiply: (a: number, b: number) => number;
361
365
  declare const add: (a: number, b: number) => number;
362
366
  declare const subtract: (a: number, b: number) => number;
363
367
 
364
- export { type EmailAttachment, type EmailData, type ValidationType, add, addAuditRecord, addLoginAudit, addNxProblem, add_document, addressRegex, akeylessOnlineDomain, app, appCheck, auth, baseDomain, biDomain, calculateBearing, callCenterEventsDomain, callCenterGeoDomain, carsRegex, chargeDomain, chartsRegex, checkUserPermissions, cleanNxSites, cn, collections, colorRegex, createAttachmentFromBlob, createAttachmentFromUrl, createSelectors, dataSocketDomain, dataSyncDomain, db, delete_document, devicesDomain, displayFormatPhoneNumber, durationToSeconds, emailRegex, endUsersDomain, extractAlertsData, extractBoardsData, extractCanbusData, extractCarsData, extractClientData, extractLocationData, extractSiteData, fire_base_TIME_TEMP, formatCarNumber, getAddressByGeo, getFileUrlFromStorage, getFixedNumber, getFormCheckboxValue, getFormElementValue, getLocationUrl, getUserByEmail, getUserByIdentifier, getUserByPhone, getUserCountryByIp, get_all_documents, get_document_by_id, get_international_phone_number, googleLoginProvider, handleChange, handleInvalid, handlePaste, initializeUserPermissions, international_israel_phone_format, isFixedOrServiceNumber, isInternational, isInternationalIsraelPhone, isLocal, isNodeEnv, isSimProviderCelcom, isSimProviderMonogoto, isSimProviderPartner, isSimProviderPelephone, is_iccid, local_israel_phone_format, longShortPhoneNumbers, mode, multiStringFormat, multiply, notificationsDomain, numbersOnlyRegex, numbersRegex, nxApiCall, parseMultiSelectInput, parsePermissions, parseSnapshotAsArray, parseSnapshotAsObject, priceRegex, propsAreEqual, query_document, query_document_by_conditions, query_documents, query_documents_by_conditions, renderOnce, secondsToDuration, sendEmail, setFormElementValue, setState, set_document, simpleExtractData, snapshot, snapshotDocument, socketServiceInstance, sort_by_timestamp, storage, subtract, textNumbersRegex, textRegex, timestamp_to_millis, timestamp_to_string, uploadFileToStorage, useLoginWithGoogle, useStoreValues, useValidation, userNameFormat, validateAndCast, validateUserStatusAndPermissions };
368
+ export { type EmailAttachment, type EmailData, type ValidationType, add, addAuditRecord, addLoginAudit, addNxProblem, add_document, addressRegex, akeylessOnlineDomain, app, appCheck, auth, baseDomain, biDomain, calculateBearing, callCenterEventsDomain, callCenterGeoDomain, carsRegex, chargeDomain, chartsRegex, checkConditions, checkUserPermissions, cleanNxSites, cn, collections, colorRegex, createAttachmentFromBlob, createAttachmentFromUrl, createSelectors, dataSocketDomain, dataSyncDomain, db, delete_document, devicesDomain, displayFormatPhoneNumber, durationToSeconds, emailRegex, endUsersDomain, extractAlertsData, extractBoardsData, extractCanbusData, extractCarsData, extractClientData, extractLocationData, extractSiteData, fire_base_TIME_TEMP, formatCarNumber, getAddressByGeo, getFileUrlFromStorage, getFixedNumber, getFormCheckboxValue, getFormElementValue, getLocationUrl, getUserByEmail, getUserByIdentifier, getUserByPhone, getUserCountryByIp, get_all_documents, get_document_by_id, get_international_phone_number, googleLoginProvider, handleChange, handleInvalid, handlePaste, initializeUserPermissions, international_israel_phone_format, isFixedOrServiceNumber, isInternational, isInternationalIsraelPhone, isLocal, isNodeEnv, isSimProviderCelcom, isSimProviderMonogoto, isSimProviderPartner, isSimProviderPelephone, is_iccid, local_israel_phone_format, longShortPhoneNumbers, mode, multiStringFormat, multiply, notificationsDomain, numbersOnlyRegex, numbersRegex, nxApiCall, parseMultiSelectInput, parsePermissions, parseSnapshotAsArray, parseSnapshotAsObject, priceRegex, propsAreEqual, query_document, query_document_by_conditions, query_documents, query_documents_by_conditions, renderOnce, secondsToDuration, sendEmail, setFormElementValue, setState, set_document, simpleExtractData, snapshot, snapshotDocument, socketServiceInstance, sort_by_timestamp, storage, subtract, textNumbersRegex, textRegex, timestamp_to_millis, timestamp_to_string, uploadFileToStorage, useLoginWithGoogle, useStoreValues, useValidation, userNameFormat, validateAndCast, validateUserStatusAndPermissions };