@mgarlik/datastore 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -56,11 +56,23 @@ type JSONType = string | number | boolean | {
56
56
  /** Konfigurace Socket.IO serveru používaná DataStoreProviderem. */
57
57
  type SocketServerType = {
58
58
  url: string;
59
- params: Record<string, any>;
59
+ params: {
60
+ autoConnect: boolean;
61
+ transports: string[];
62
+ auth: Record<string, any>;
63
+ /**
64
+ * Jakym socket eventům naslouchat pro aktualizace dat. Pokud není uvedeno, naslouchá se na ["create", "update", "delete"].
65
+ */
66
+ socketEvents?: string[];
67
+ };
60
68
  };
61
69
  /** In-memory metadata aktivní socket místnosti. */
62
- type SocketItem = {
70
+ type SocketFilterItem = {
71
+ filter: Record<string, any>;
63
72
  listeners: number;
73
+ };
74
+ type SocketItem = {
75
+ filters: SocketFilterItem[];
64
76
  data: any[];
65
77
  };
66
78
  /** Podporované akce zpracovávané interní frontou dispatcheru. */
@@ -262,13 +274,16 @@ declare const useDataStore: () => DataStore;
262
274
  *
263
275
  * <DataStoreProvider ref={dsRef} ...>
264
276
  * <AppProvider
265
- * onLogin={({ userId }) => {
266
- * dsRef.current?.startSockets();
267
- * dsRef.current?.registerProviderSockets(userId);
268
- * }}
269
- * onLogout={({ userId }) => {
270
- * dsRef.current?.unregisterProviderSockets(userId);
271
- * dsRef.current?.stopSockets();
277
+ * auth={{
278
+ * requireLogin: true,
279
+ * onLogin: ({ userId }) => {
280
+ * dsRef.current?.startSockets();
281
+ * dsRef.current?.registerProviderSockets(userId);
282
+ * },
283
+ * onLogout: ({ userId }) => {
284
+ * dsRef.current?.unregisterProviderSockets(userId);
285
+ * dsRef.current?.stopSockets();
286
+ * },
272
287
  * }}
273
288
  * />
274
289
  * </DataStoreProvider>
@@ -452,4 +467,4 @@ declare const COLOR_AXIOS = "\u001B[33m%s\u001B[0m";
452
467
  declare const COLOR_APP = "\u001B[34m%s\u001B[0m";
453
468
  declare const COLOR_DS = "\u001B[35m%s\u001B[0m";
454
469
 
455
- export { COLOR_APP, COLOR_AXIOS, COLOR_BLUE, COLOR_CONTEXT, COLOR_CYAN, COLOR_DS, COLOR_ERROR, COLOR_FUNCTION, COLOR_GREEN, COLOR_MAGENTA, COLOR_ORANGE, COLOR_PROVIDER, COLOR_RED, COLOR_RENDER, COLOR_SCREEN, COLOR_SOCKET, COLOR_SOCKETS, COLOR_WARNING, COLOR_WHITE, COLOR_YELLOW, type DataProvider, type DataProviders, type DataStore, DataStoreActionsContext, DataStoreContext, DataStoreDocumentsContext, type DataStoreProps, DataStoreProvider, DataStoreProvidersContext, type DataStoreRef, DataStoreStableContext, DataStoreStorage, type DispatcherActionType, type DispatcherType, type FilterType, type JSONType, type ProductFiltersType, type ProviderDataSource, type ProviderTypes, type SchemaType, type SocketItem, type SocketServerType, type UseDataProviderResult, type UseProviderActionsResult, type Uuid, dataStoreFilterObject, doesObjectMatchFilter, doesValueMatchFilter, filterDocuments, filterDocumentsAsync, type filterItemType, getValueByRules, isUuid, recalculateObjectWithDocument, useDataProvider, useDataStore, useDataStoreActions, useDocument, useDocuments, useFilteredDocuments, useProvider, useProviderActions, useProviderDocuments, uuid };
470
+ export { COLOR_APP, COLOR_AXIOS, COLOR_BLUE, COLOR_CONTEXT, COLOR_CYAN, COLOR_DS, COLOR_ERROR, COLOR_FUNCTION, COLOR_GREEN, COLOR_MAGENTA, COLOR_ORANGE, COLOR_PROVIDER, COLOR_RED, COLOR_RENDER, COLOR_SCREEN, COLOR_SOCKET, COLOR_SOCKETS, COLOR_WARNING, COLOR_WHITE, COLOR_YELLOW, type DataProvider, type DataProviders, type DataStore, DataStoreActionsContext, DataStoreContext, DataStoreDocumentsContext, type DataStoreProps, DataStoreProvider, DataStoreProvidersContext, type DataStoreRef, DataStoreStableContext, DataStoreStorage, type DispatcherActionType, type DispatcherType, type FilterType, type JSONType, type ProductFiltersType, type ProviderDataSource, type ProviderTypes, type SchemaType, type SocketFilterItem, type SocketItem, type SocketServerType, type UseDataProviderResult, type UseProviderActionsResult, type Uuid, dataStoreFilterObject, doesObjectMatchFilter, doesValueMatchFilter, filterDocuments, filterDocumentsAsync, type filterItemType, getValueByRules, isUuid, recalculateObjectWithDocument, useDataProvider, useDataStore, useDataStoreActions, useDocument, useDocuments, useFilteredDocuments, useProvider, useProviderActions, useProviderDocuments, uuid };
package/dist/index.d.ts CHANGED
@@ -56,11 +56,23 @@ type JSONType = string | number | boolean | {
56
56
  /** Konfigurace Socket.IO serveru používaná DataStoreProviderem. */
57
57
  type SocketServerType = {
58
58
  url: string;
59
- params: Record<string, any>;
59
+ params: {
60
+ autoConnect: boolean;
61
+ transports: string[];
62
+ auth: Record<string, any>;
63
+ /**
64
+ * Jakym socket eventům naslouchat pro aktualizace dat. Pokud není uvedeno, naslouchá se na ["create", "update", "delete"].
65
+ */
66
+ socketEvents?: string[];
67
+ };
60
68
  };
61
69
  /** In-memory metadata aktivní socket místnosti. */
62
- type SocketItem = {
70
+ type SocketFilterItem = {
71
+ filter: Record<string, any>;
63
72
  listeners: number;
73
+ };
74
+ type SocketItem = {
75
+ filters: SocketFilterItem[];
64
76
  data: any[];
65
77
  };
66
78
  /** Podporované akce zpracovávané interní frontou dispatcheru. */
@@ -262,13 +274,16 @@ declare const useDataStore: () => DataStore;
262
274
  *
263
275
  * <DataStoreProvider ref={dsRef} ...>
264
276
  * <AppProvider
265
- * onLogin={({ userId }) => {
266
- * dsRef.current?.startSockets();
267
- * dsRef.current?.registerProviderSockets(userId);
268
- * }}
269
- * onLogout={({ userId }) => {
270
- * dsRef.current?.unregisterProviderSockets(userId);
271
- * dsRef.current?.stopSockets();
277
+ * auth={{
278
+ * requireLogin: true,
279
+ * onLogin: ({ userId }) => {
280
+ * dsRef.current?.startSockets();
281
+ * dsRef.current?.registerProviderSockets(userId);
282
+ * },
283
+ * onLogout: ({ userId }) => {
284
+ * dsRef.current?.unregisterProviderSockets(userId);
285
+ * dsRef.current?.stopSockets();
286
+ * },
272
287
  * }}
273
288
  * />
274
289
  * </DataStoreProvider>
@@ -452,4 +467,4 @@ declare const COLOR_AXIOS = "\u001B[33m%s\u001B[0m";
452
467
  declare const COLOR_APP = "\u001B[34m%s\u001B[0m";
453
468
  declare const COLOR_DS = "\u001B[35m%s\u001B[0m";
454
469
 
455
- export { COLOR_APP, COLOR_AXIOS, COLOR_BLUE, COLOR_CONTEXT, COLOR_CYAN, COLOR_DS, COLOR_ERROR, COLOR_FUNCTION, COLOR_GREEN, COLOR_MAGENTA, COLOR_ORANGE, COLOR_PROVIDER, COLOR_RED, COLOR_RENDER, COLOR_SCREEN, COLOR_SOCKET, COLOR_SOCKETS, COLOR_WARNING, COLOR_WHITE, COLOR_YELLOW, type DataProvider, type DataProviders, type DataStore, DataStoreActionsContext, DataStoreContext, DataStoreDocumentsContext, type DataStoreProps, DataStoreProvider, DataStoreProvidersContext, type DataStoreRef, DataStoreStableContext, DataStoreStorage, type DispatcherActionType, type DispatcherType, type FilterType, type JSONType, type ProductFiltersType, type ProviderDataSource, type ProviderTypes, type SchemaType, type SocketItem, type SocketServerType, type UseDataProviderResult, type UseProviderActionsResult, type Uuid, dataStoreFilterObject, doesObjectMatchFilter, doesValueMatchFilter, filterDocuments, filterDocumentsAsync, type filterItemType, getValueByRules, isUuid, recalculateObjectWithDocument, useDataProvider, useDataStore, useDataStoreActions, useDocument, useDocuments, useFilteredDocuments, useProvider, useProviderActions, useProviderDocuments, uuid };
470
+ export { COLOR_APP, COLOR_AXIOS, COLOR_BLUE, COLOR_CONTEXT, COLOR_CYAN, COLOR_DS, COLOR_ERROR, COLOR_FUNCTION, COLOR_GREEN, COLOR_MAGENTA, COLOR_ORANGE, COLOR_PROVIDER, COLOR_RED, COLOR_RENDER, COLOR_SCREEN, COLOR_SOCKET, COLOR_SOCKETS, COLOR_WARNING, COLOR_WHITE, COLOR_YELLOW, type DataProvider, type DataProviders, type DataStore, DataStoreActionsContext, DataStoreContext, DataStoreDocumentsContext, type DataStoreProps, DataStoreProvider, DataStoreProvidersContext, type DataStoreRef, DataStoreStableContext, DataStoreStorage, type DispatcherActionType, type DispatcherType, type FilterType, type JSONType, type ProductFiltersType, type ProviderDataSource, type ProviderTypes, type SchemaType, type SocketFilterItem, type SocketItem, type SocketServerType, type UseDataProviderResult, type UseProviderActionsResult, type Uuid, dataStoreFilterObject, doesObjectMatchFilter, doesValueMatchFilter, filterDocuments, filterDocumentsAsync, type filterItemType, getValueByRules, isUuid, recalculateObjectWithDocument, useDataProvider, useDataStore, useDataStoreActions, useDocument, useDocuments, useFilteredDocuments, useProvider, useProviderActions, useProviderDocuments, uuid };
package/dist/index.js CHANGED
@@ -16,26 +16,32 @@ import {
16
16
  } from "react";
17
17
 
18
18
  // src/handleSocketMessage.ts
19
- var handleSocketMessage = (model, msg, dataProvider) => {
20
- const { dispatch, updateDocument } = dataProvider;
19
+ var handleSocketMessage = (msg, dataProvider) => {
20
+ const { dispatch } = dataProvider;
21
+ console.log("Mam socket message, data: ", msg);
21
22
  const data = JSON.parse(msg);
22
23
  switch (data.action) {
23
24
  case "create":
24
25
  systemLog("sockets", "[create] ", data.model, ", document: ", data.documentId);
26
+ console.log("[SOCKETS] CREATING model:", data.model, ", document: ", data.documentId, " data:", data.data);
25
27
  dispatch?.("createDocument", { model: data.model, documentId: data.documentId, data: data.data });
26
28
  break;
27
29
  case "update":
30
+ console.log(`[SOCKETS] UPDATE model: ${data.model}, document: ${data.documentId}, data: `, data.data);
28
31
  systemLog("sockets", `[update] ${JSON.stringify(data)}`);
29
32
  if (Array.isArray(data.data)) dispatch?.("updateDocuments", { model: data.model, documents: data.data });
30
- else updateDocument?.({ model: data.model, documentId: data.documentId, data: data.data });
33
+ else {
34
+ dispatch?.("updateDocument", { model: data.model, documentId: data.documentId, data: data.data });
35
+ }
31
36
  break;
32
37
  case "delete":
38
+ console.log(`[SOCKETS] DELETE model: ${data.model}, document: ${data.documentId}`);
33
39
  systemLog("sockets", "[delete] model:", data.model, ", document: ", data.documentId);
34
- dispatch?.("deleteDocument", { documentId: data.documentId, data: data.data });
40
+ dispatch?.("deleteDocument", { model: data.model, documentId: data.documentId, data: data.data });
35
41
  break;
36
42
  case "deleteItem":
37
- systemLog("sockets", "DELETE ITEM ", model, ", model: ", data.model, ", data: ", data.data);
38
- dispatch?.("removeItem", { model, documentId: data.data.id });
43
+ systemLog("sockets", "DELETE ITEM ", data.model, ", model: ", data.model, ", data: ", data.data);
44
+ dispatch?.("removeItem", { model: data.model, documentId: data.data.id });
39
45
  break;
40
46
  default:
41
47
  console.error(`Unknown command ${data.action}`);
@@ -443,12 +449,15 @@ function doesValueMatchFilter(objVal, value, documents = {}) {
443
449
  }
444
450
  }
445
451
  function doesObjectMatchFilter(obj, filter, documents = {}) {
452
+ console.log("doesObjectMatchFilter", "Obj", JSON.stringify(obj, null, 2), "Filter", JSON.stringify(filter, null, 2));
446
453
  if (!filter) return true;
447
454
  if (Object.keys(filter)?.includes("$rule")) {
455
+ console.log("Pravidloo: ", filter.$rule);
448
456
  const result2 = doesObjectMatchFilter(obj, filter.$rule, documents);
449
457
  if (result2 === true) {
450
458
  return result2;
451
459
  } else {
460
+ console.log("Vracim chybovou message ", filter.$message);
452
461
  return filter.$message || false;
453
462
  }
454
463
  }
@@ -597,11 +606,20 @@ var saveData = async ({
597
606
  }
598
607
  console.timeEnd(`[SQL] saveData ${providerId}`);
599
608
  };
609
+ var serializeParams = (params) => {
610
+ return Object.fromEntries(
611
+ Object.entries(params).map(([key, value]) => [
612
+ key,
613
+ typeof value === "object" ? JSON.stringify(value) : value
614
+ ])
615
+ );
616
+ };
600
617
  var buildUri = ({
601
618
  method,
602
619
  dataSource,
603
620
  variant
604
621
  }) => {
622
+ console.log("[HANDLE DATA] BUILD URI method ", method, " from", dataSource);
605
623
  if (dataSource.crud) {
606
624
  if (method === "update" && dataSource.crud.updates) {
607
625
  if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];
@@ -635,7 +653,7 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
635
653
  console.time("Persisted Data");
636
654
  const qDatum = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);
637
655
  systemLog("axios", "SQLite.read Posledni datum update: ", qDatum[0]?.lastUpdate);
638
- if (qDatum[0]?.lastUpdate) params.changeTime = qDatum[0].lastUpdate;
656
+ if (qDatum[0]?.lastUpdate) params.changeTimeFrom = qDatum[0].lastUpdate;
639
657
  persistedData = qDatum.map((item) => {
640
658
  try {
641
659
  const parsedData = typeof item.data === "string" ? JSON.parse(item.data) : item.data;
@@ -652,8 +670,8 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
652
670
  console.timeEnd("Persisted Data");
653
671
  }
654
672
  if (dataSource) {
655
- systemLog("axios", "Params: ", JSON.stringify(params));
656
- const axiosResponse = await axios.get(buildUri({ dataSource, method: "read" }), { params });
673
+ console.log("Stahuji data z ", buildUri({ dataSource, method: "read" }), " s parametry ", params);
674
+ const axiosResponse = await axios.get(buildUri({ dataSource, method: "read" }), { params: serializeParams(params) });
657
675
  if (schema && !dataSource.readAllFields) {
658
676
  if (Array.isArray(axiosResponse.data.data)) {
659
677
  newData = [];
@@ -1049,9 +1067,12 @@ var DataStoreProvider = forwardRef(
1049
1067
  useEffect(() => {
1050
1068
  if (isLive) {
1051
1069
  systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
1052
- const ss = Object.keys(sockets);
1053
- systemLog("dsp", "useEffect[isLive] registruji", ss);
1054
- if (ss?.length > 0) socket.emit("joinRooms", JSON.stringify(ss));
1070
+ const roomsToJoin = Object.entries(sockets).flatMap(
1071
+ ([roomName, socketItem]) => socketItem.filters.map(({ filter }) => ({ room: roomName, filter }))
1072
+ );
1073
+ console.log("Sokety pro p\u0159ipojen\xED:", roomsToJoin);
1074
+ systemLog("dsp", "useEffect[isLive] registruji", roomsToJoin);
1075
+ if (roomsToJoin.length > 0) socket.emit("joinRooms", roomsToJoin);
1055
1076
  if (!didInitialLiveSyncRef.current) {
1056
1077
  didInitialLiveSyncRef.current = true;
1057
1078
  systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
@@ -1065,6 +1086,15 @@ var DataStoreProvider = forwardRef(
1065
1086
  useEffect(() => {
1066
1087
  socket.on("connect", handleSocketConnect);
1067
1088
  socket.on("disconnect", handleSocketDisconnect);
1089
+ if (socketServer?.params?.socketEvents && socketServer.params.socketEvents.length > 0) {
1090
+ socketServer?.params?.socketEvents?.map(
1091
+ (event) => socket.on(event, (data) => handleSocketMessage(data, socketActionHandlersRef.current))
1092
+ );
1093
+ } else {
1094
+ socket.on("create", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
1095
+ socket.on("update", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
1096
+ socket.on("delete", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
1097
+ }
1068
1098
  return () => {
1069
1099
  socket.off("connect", handleSocketConnect);
1070
1100
  socket.off("disconnect", handleSocketDisconnect);
@@ -1141,6 +1171,7 @@ var DataStoreProvider = forwardRef(
1141
1171
  result = await updateDataStore(item.data);
1142
1172
  break;
1143
1173
  case "createDocument":
1174
+ console.log("Dispatcher createDocument", item.data);
1144
1175
  await createDocument(item.data);
1145
1176
  break;
1146
1177
  case "updateDocument":
@@ -1480,14 +1511,27 @@ var DataStoreProvider = forwardRef(
1480
1511
  const createDocument = useCallback(
1481
1512
  async ({ model, documentId, data }) => {
1482
1513
  const newDocument = data;
1483
- systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1514
+ console.log(`Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1484
1515
  var providerListenersCount = 0;
1485
1516
  Object.keys(providers).forEach((key) => {
1486
1517
  const provider = providers[key];
1487
1518
  var socketListeners = provider.dataSource?.socketListeners;
1488
1519
  if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
1489
- systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
1490
1520
  if (!provider.data.includes(documentId)) {
1521
+ setCounterDocuments((prev) => {
1522
+ const newC = { ...prev };
1523
+ if (newC[documentId]) {
1524
+ setDocuments((prev2) => ({
1525
+ ...prev2,
1526
+ [documentId]: { ...prev2[documentId], ...newDocument }
1527
+ }));
1528
+ newC[documentId] = prev[documentId] + 1;
1529
+ } else {
1530
+ setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
1531
+ newC[documentId] = providerListenersCount;
1532
+ }
1533
+ return newC;
1534
+ });
1491
1535
  providerListenersCount++;
1492
1536
  setProviders((prev) => ({
1493
1537
  ...prev,
@@ -1500,24 +1544,14 @@ var DataStoreProvider = forwardRef(
1500
1544
  }
1501
1545
  }
1502
1546
  });
1547
+ console.log("Provider listeners count: ", providerListenersCount);
1503
1548
  if (providerListenersCount > 0) {
1504
1549
  if (providers[model]?.isPersisting && persistenceStorage) {
1550
+ console.log("Persistuji dokument ", documentId, " do modelu ", model);
1505
1551
  await persistDocument({ documentId, model, data: newDocument });
1506
1552
  }
1507
- setCounterDocuments((prev) => {
1508
- const newC = { ...prev };
1509
- if (newC[documentId]) {
1510
- setDocuments((prev2) => ({
1511
- ...prev2,
1512
- [documentId]: { ...prev2[documentId], ...newDocument }
1513
- }));
1514
- newC[documentId] = prev[documentId] + providerListenersCount;
1515
- } else {
1516
- setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
1517
- newC[documentId] = providerListenersCount;
1518
- }
1519
- return newC;
1520
- });
1553
+ console.log("Dokument ", documentId, " zaregistrovan do ", providerListenersCount, " provideru");
1554
+ console.log(newDocument);
1521
1555
  return { id: documentId, document: newDocument };
1522
1556
  } else return false;
1523
1557
  },
@@ -1525,6 +1559,7 @@ var DataStoreProvider = forwardRef(
1525
1559
  );
1526
1560
  const deleteDocument = useCallback(
1527
1561
  async ({ documentId }) => {
1562
+ console.log("Mazani dokumentu ", documentId);
1528
1563
  systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
1529
1564
  await removePersistedDocument(documentId);
1530
1565
  setDocuments((prev) => {
@@ -1591,55 +1626,77 @@ var DataStoreProvider = forwardRef(
1591
1626
  [providers]
1592
1627
  );
1593
1628
  const registerProviderSockets = useCallback(
1594
- (sockets2) => {
1595
- if (sockets2) {
1596
- systemLog("dsp", "[registerProviderSockets]", sockets2);
1597
- var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1598
- setSockets((prev) => {
1599
- const newS = { ...prev };
1600
- d.forEach((item) => {
1601
- if (newS[item]) {
1602
- newS[item].listeners = newS[item].listeners + 1;
1629
+ (sockets2, filter) => {
1630
+ if (!sockets2) return;
1631
+ const normalizedFilter = filter ?? {};
1632
+ systemLog("dsp", "[registerProviderSockets]", sockets2, `filter: ${JSON.stringify(normalizedFilter)}`);
1633
+ const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1634
+ setSockets((prev) => {
1635
+ const newS = { ...prev };
1636
+ d.forEach((item) => {
1637
+ if (newS[item]) {
1638
+ const existingFilter = newS[item].filters.find((f) => isEqual(f.filter, normalizedFilter));
1639
+ if (existingFilter) {
1640
+ existingFilter.listeners++;
1641
+ systemLog("dsp", `[registerProviderSockets] Filter uz existuje, navysuji listeners na ${existingFilter.listeners}`);
1603
1642
  } else {
1604
- const roomHandler = (msg) => {
1605
- const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;
1606
- handleSocketMessage(item, msg, {
1607
- dispatch: currentDispatch,
1608
- updateDocument: currentUpdateDocument
1609
- });
1610
- };
1611
- socketRoomHandlersRef.current[item] = roomHandler;
1612
- newS[item] = { listeners: 1, data: [] };
1613
- socket.emit("joinRoom", item);
1614
- socket.on(item, roomHandler);
1643
+ newS[item].filters = [...newS[item].filters, { filter: normalizedFilter, listeners: 1 }];
1644
+ socket.emit("joinRoom", { room: item, filter: normalizedFilter });
1645
+ systemLog(
1646
+ "dsp",
1647
+ `[registerProviderSockets] Novy filter, registruji room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
1648
+ );
1615
1649
  }
1616
- });
1617
- return newS;
1650
+ } else {
1651
+ newS[item] = {
1652
+ filters: [{ filter: normalizedFilter, listeners: 1 }],
1653
+ data: []
1654
+ };
1655
+ socket.emit("joinRoom", { room: item, filter: normalizedFilter });
1656
+ systemLog("dsp", `[registerProviderSockets] Nova room ${item}, filter: ${JSON.stringify(normalizedFilter)}`);
1657
+ }
1618
1658
  });
1619
- }
1659
+ return newS;
1660
+ });
1620
1661
  },
1621
1662
  [setSockets, socket]
1622
1663
  );
1623
1664
  const unregisterProviderSockets = useCallback(
1624
- (sockets2) => {
1625
- systemLog("dsp", "[unregisterProviderSockets] Mazu sockety ", JSON.stringify(sockets2, null, 2));
1626
- var removeSocketListeners = [];
1627
- var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1665
+ (sockets2, filter) => {
1666
+ const normalizedFilter = filter ?? {};
1667
+ systemLog(
1668
+ "dsp",
1669
+ "[unregisterProviderSockets] Mazu sockety",
1670
+ JSON.stringify(sockets2, null, 2),
1671
+ `filter: ${JSON.stringify(normalizedFilter)}`
1672
+ );
1673
+ const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1628
1674
  setSockets((prev) => {
1629
1675
  const newS = { ...prev };
1676
+ const removeSocketListeners = [];
1630
1677
  d.forEach((item) => {
1631
- if (newS[item]?.listeners <= 1) {
1678
+ if (!newS[item]) return;
1679
+ const existingFilter = newS[item].filters.find((f) => isEqual(f.filter, normalizedFilter));
1680
+ if (!existingFilter) return;
1681
+ if (existingFilter.listeners <= 1) {
1682
+ newS[item].filters = newS[item].filters.filter((f) => !isEqual(f.filter, normalizedFilter));
1683
+ socket.emit("leaveRoom", { room: item, filter: normalizedFilter });
1684
+ systemLog(
1685
+ "dsp",
1686
+ `[unregisterProviderSockets] Filter smazan, odhlaseni room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
1687
+ );
1688
+ } else {
1689
+ existingFilter.listeners--;
1690
+ systemLog("dsp", `[unregisterProviderSockets] Filter listeners snizen na ${existingFilter.listeners}`);
1691
+ }
1692
+ if (newS[item].filters.length === 0) {
1632
1693
  removeSocketListeners.push(item);
1633
- const roomHandler = socketRoomHandlersRef.current[item];
1634
- if (roomHandler) {
1635
- socket.off(item, roomHandler);
1636
- delete socketRoomHandlersRef.current[item];
1637
- }
1638
1694
  delete newS[item];
1639
- } else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
1695
+ systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
1696
+ }
1640
1697
  });
1641
1698
  if (removeSocketListeners.length > 0) {
1642
- socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1699
+ socket.emit("leaveRooms", removeSocketListeners);
1643
1700
  }
1644
1701
  return newS;
1645
1702
  });
@@ -1652,60 +1709,62 @@ var DataStoreProvider = forwardRef(
1652
1709
  setCounterProviders((prev) => {
1653
1710
  if (!prev[id]) return prev;
1654
1711
  if (prev[id] + val > 0) {
1655
- return {
1656
- ...prev,
1657
- [id]: prev[id] + val
1658
- };
1659
- } else {
1660
- setProviders((prevP) => {
1661
- systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
1662
- setSockets((prevS) => {
1663
- var removeSocketListeners = [];
1664
- const newS = { ...prevS };
1665
- const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
1666
- providerSocketListeners.forEach((socketName) => {
1667
- if (!newS[socketName]) return;
1668
- if (newS[socketName].listeners + val <= 0) {
1669
- const roomHandler = socketRoomHandlersRef.current[socketName];
1670
- if (roomHandler) {
1671
- socket.off(socketName, roomHandler);
1672
- delete socketRoomHandlersRef.current[socketName];
1673
- }
1674
- delete newS[socketName];
1675
- removeSocketListeners.push(socketName);
1676
- } else {
1677
- newS[socketName].listeners = newS[socketName].listeners + val;
1678
- }
1679
- });
1680
- if (removeSocketListeners.length > 0) {
1681
- socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1712
+ return { ...prev, [id]: prev[id] + val };
1713
+ }
1714
+ setProviders((prevP) => {
1715
+ systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
1716
+ setSockets((prevS) => {
1717
+ const newS = { ...prevS };
1718
+ const removeSocketListeners = [];
1719
+ const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
1720
+ const providerFilter = prevP[id].dataSource?.filter;
1721
+ const normalizedFilter = providerFilter ?? {};
1722
+ providerSocketListeners.forEach((socketName) => {
1723
+ if (!newS[socketName]) return;
1724
+ const existingFilter = newS[socketName].filters.find((f) => isEqual(f.filter, normalizedFilter));
1725
+ if (!existingFilter) return;
1726
+ if (existingFilter.listeners + val <= 0) {
1727
+ newS[socketName].filters = newS[socketName].filters.filter((f) => !isEqual(f.filter, normalizedFilter));
1728
+ socket.emit("leaveRoom", { room: socketName, filter: normalizedFilter });
1729
+ systemLog("dsp", `[updateProviderListeners] Filter smazan pro room ${socketName}`);
1730
+ } else {
1731
+ existingFilter.listeners = existingFilter.listeners + val;
1732
+ systemLog("dsp", `[updateProviderListeners] Filter listeners snizen na ${existingFilter.listeners}`);
1733
+ }
1734
+ if (newS[socketName].filters.length === 0) {
1735
+ removeSocketListeners.push(socketName);
1736
+ delete newS[socketName];
1737
+ systemLog("dsp", `[updateProviderListeners] Room ${socketName} uplne smazana`);
1682
1738
  }
1683
- return newS;
1684
1739
  });
1685
- setCounterDocuments((prevC) => {
1686
- const newC = { ...prevC };
1687
- prevP[id].data.forEach((document) => {
1688
- if (newC[document] + val <= 0) {
1689
- setDocuments((prev2) => {
1690
- const newD = { ...prev2 };
1691
- delete newD[document];
1692
- return newD;
1693
- });
1694
- delete newC[document];
1695
- } else {
1696
- newC[document] = newC[document] + val;
1697
- }
1698
- });
1699
- return newC;
1740
+ if (removeSocketListeners.length > 0) {
1741
+ socket.emit("leaveRooms", removeSocketListeners);
1742
+ }
1743
+ return newS;
1744
+ });
1745
+ setCounterDocuments((prevC) => {
1746
+ const newC = { ...prevC };
1747
+ prevP[id].data.forEach((document) => {
1748
+ if (newC[document] + val <= 0) {
1749
+ setDocuments((prev2) => {
1750
+ const newD = { ...prev2 };
1751
+ delete newD[document];
1752
+ return newD;
1753
+ });
1754
+ delete newC[document];
1755
+ } else {
1756
+ newC[document] = newC[document] + val;
1757
+ }
1700
1758
  });
1701
- const newP = { ...prevP };
1702
- delete newP[id];
1703
- return newP;
1759
+ return newC;
1704
1760
  });
1705
- const newProvs = { ...prev };
1706
- delete newProvs[id];
1707
- return newProvs;
1708
- }
1761
+ const newP = { ...prevP };
1762
+ delete newP[id];
1763
+ return newP;
1764
+ });
1765
+ const newProvs = { ...prev };
1766
+ delete newProvs[id];
1767
+ return newProvs;
1709
1768
  });
1710
1769
  },
1711
1770
  [setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
@@ -1779,7 +1838,7 @@ var DataStoreProvider = forwardRef(
1779
1838
  [id]: 1
1780
1839
  }));
1781
1840
  if (provider.dataSource?.socketListeners) {
1782
- registerProviderSockets(provider.dataSource.socketListeners);
1841
+ registerProviderSockets(provider.dataSource.socketListeners, provider.dataSource.filter);
1783
1842
  }
1784
1843
  console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
1785
1844
  } catch (error) {
@@ -1803,7 +1862,7 @@ var DataStoreProvider = forwardRef(
1803
1862
  };
1804
1863
  } else {
1805
1864
  systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
1806
- unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
1865
+ unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners, providers[itemId]?.dataSource.filter);
1807
1866
  systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
1808
1867
  setCounterDocuments((cd) => {
1809
1868
  const newC = { ...cd };