@mgarlik/datastore 0.1.2 → 0.1.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.
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);
@@ -1106,8 +1136,9 @@ var DataStoreProvider = forwardRef(
1106
1136
  async (id, data) => {
1107
1137
  const providerPreset = presetProviders[id];
1108
1138
  const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
1109
- systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
1139
+ console.log("[INIT PROVIDER] ", id, "(", data || "", ")");
1110
1140
  if (typeof prov !== "boolean") {
1141
+ console.log("[INIT PROVIDER] rendered: ", prov);
1111
1142
  return await registerProvider(prov);
1112
1143
  }
1113
1144
  return false;
@@ -1141,6 +1172,7 @@ var DataStoreProvider = forwardRef(
1141
1172
  result = await updateDataStore(item.data);
1142
1173
  break;
1143
1174
  case "createDocument":
1175
+ console.log("Dispatcher createDocument", item.data);
1144
1176
  await createDocument(item.data);
1145
1177
  break;
1146
1178
  case "updateDocument":
@@ -1480,14 +1512,27 @@ var DataStoreProvider = forwardRef(
1480
1512
  const createDocument = useCallback(
1481
1513
  async ({ model, documentId, data }) => {
1482
1514
  const newDocument = data;
1483
- systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1515
+ console.log(`Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1484
1516
  var providerListenersCount = 0;
1485
1517
  Object.keys(providers).forEach((key) => {
1486
1518
  const provider = providers[key];
1487
1519
  var socketListeners = provider.dataSource?.socketListeners;
1488
1520
  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
1521
  if (!provider.data.includes(documentId)) {
1522
+ setCounterDocuments((prev) => {
1523
+ const newC = { ...prev };
1524
+ if (newC[documentId]) {
1525
+ setDocuments((prev2) => ({
1526
+ ...prev2,
1527
+ [documentId]: { ...prev2[documentId], ...newDocument }
1528
+ }));
1529
+ newC[documentId] = prev[documentId] + 1;
1530
+ } else {
1531
+ setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
1532
+ newC[documentId] = providerListenersCount;
1533
+ }
1534
+ return newC;
1535
+ });
1491
1536
  providerListenersCount++;
1492
1537
  setProviders((prev) => ({
1493
1538
  ...prev,
@@ -1500,24 +1545,14 @@ var DataStoreProvider = forwardRef(
1500
1545
  }
1501
1546
  }
1502
1547
  });
1548
+ console.log("Provider listeners count: ", providerListenersCount);
1503
1549
  if (providerListenersCount > 0) {
1504
1550
  if (providers[model]?.isPersisting && persistenceStorage) {
1551
+ console.log("Persistuji dokument ", documentId, " do modelu ", model);
1505
1552
  await persistDocument({ documentId, model, data: newDocument });
1506
1553
  }
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
- });
1554
+ console.log("Dokument ", documentId, " zaregistrovan do ", providerListenersCount, " provideru");
1555
+ console.log(newDocument);
1521
1556
  return { id: documentId, document: newDocument };
1522
1557
  } else return false;
1523
1558
  },
@@ -1525,6 +1560,7 @@ var DataStoreProvider = forwardRef(
1525
1560
  );
1526
1561
  const deleteDocument = useCallback(
1527
1562
  async ({ documentId }) => {
1563
+ console.log("Mazani dokumentu ", documentId);
1528
1564
  systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
1529
1565
  await removePersistedDocument(documentId);
1530
1566
  setDocuments((prev) => {
@@ -1591,55 +1627,77 @@ var DataStoreProvider = forwardRef(
1591
1627
  [providers]
1592
1628
  );
1593
1629
  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;
1630
+ (sockets2, filter) => {
1631
+ if (!sockets2) return;
1632
+ const normalizedFilter = filter ?? {};
1633
+ systemLog("dsp", "[registerProviderSockets]", sockets2, `filter: ${JSON.stringify(normalizedFilter)}`);
1634
+ const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1635
+ setSockets((prev) => {
1636
+ const newS = { ...prev };
1637
+ d.forEach((item) => {
1638
+ if (newS[item]) {
1639
+ const existingFilter = newS[item].filters.find((f) => isEqual(f.filter, normalizedFilter));
1640
+ if (existingFilter) {
1641
+ existingFilter.listeners++;
1642
+ systemLog("dsp", `[registerProviderSockets] Filter uz existuje, navysuji listeners na ${existingFilter.listeners}`);
1603
1643
  } 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);
1644
+ newS[item].filters = [...newS[item].filters, { filter: normalizedFilter, listeners: 1 }];
1645
+ socket.emit("joinRoom", { room: item, filter: normalizedFilter });
1646
+ systemLog(
1647
+ "dsp",
1648
+ `[registerProviderSockets] Novy filter, registruji room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
1649
+ );
1615
1650
  }
1616
- });
1617
- return newS;
1651
+ } else {
1652
+ newS[item] = {
1653
+ filters: [{ filter: normalizedFilter, listeners: 1 }],
1654
+ data: []
1655
+ };
1656
+ socket.emit("joinRoom", { room: item, filter: normalizedFilter });
1657
+ systemLog("dsp", `[registerProviderSockets] Nova room ${item}, filter: ${JSON.stringify(normalizedFilter)}`);
1658
+ }
1618
1659
  });
1619
- }
1660
+ return newS;
1661
+ });
1620
1662
  },
1621
1663
  [setSockets, socket]
1622
1664
  );
1623
1665
  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];
1666
+ (sockets2, filter) => {
1667
+ const normalizedFilter = filter ?? {};
1668
+ systemLog(
1669
+ "dsp",
1670
+ "[unregisterProviderSockets] Mazu sockety",
1671
+ JSON.stringify(sockets2, null, 2),
1672
+ `filter: ${JSON.stringify(normalizedFilter)}`
1673
+ );
1674
+ const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1628
1675
  setSockets((prev) => {
1629
1676
  const newS = { ...prev };
1677
+ const removeSocketListeners = [];
1630
1678
  d.forEach((item) => {
1631
- if (newS[item]?.listeners <= 1) {
1679
+ if (!newS[item]) return;
1680
+ const existingFilter = newS[item].filters.find((f) => isEqual(f.filter, normalizedFilter));
1681
+ if (!existingFilter) return;
1682
+ if (existingFilter.listeners <= 1) {
1683
+ newS[item].filters = newS[item].filters.filter((f) => !isEqual(f.filter, normalizedFilter));
1684
+ socket.emit("leaveRoom", { room: item, filter: normalizedFilter });
1685
+ systemLog(
1686
+ "dsp",
1687
+ `[unregisterProviderSockets] Filter smazan, odhlaseni room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
1688
+ );
1689
+ } else {
1690
+ existingFilter.listeners--;
1691
+ systemLog("dsp", `[unregisterProviderSockets] Filter listeners snizen na ${existingFilter.listeners}`);
1692
+ }
1693
+ if (newS[item].filters.length === 0) {
1632
1694
  removeSocketListeners.push(item);
1633
- const roomHandler = socketRoomHandlersRef.current[item];
1634
- if (roomHandler) {
1635
- socket.off(item, roomHandler);
1636
- delete socketRoomHandlersRef.current[item];
1637
- }
1638
1695
  delete newS[item];
1639
- } else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
1696
+ systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
1697
+ }
1640
1698
  });
1641
1699
  if (removeSocketListeners.length > 0) {
1642
- socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1700
+ socket.emit("leaveRooms", removeSocketListeners);
1643
1701
  }
1644
1702
  return newS;
1645
1703
  });
@@ -1652,66 +1710,69 @@ var DataStoreProvider = forwardRef(
1652
1710
  setCounterProviders((prev) => {
1653
1711
  if (!prev[id]) return prev;
1654
1712
  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));
1713
+ return { ...prev, [id]: prev[id] + val };
1714
+ }
1715
+ setProviders((prevP) => {
1716
+ systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
1717
+ setSockets((prevS) => {
1718
+ const newS = { ...prevS };
1719
+ const removeSocketListeners = [];
1720
+ const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
1721
+ const providerFilter = prevP[id].dataSource?.filter;
1722
+ const normalizedFilter = providerFilter ?? {};
1723
+ providerSocketListeners.forEach((socketName) => {
1724
+ if (!newS[socketName]) return;
1725
+ const existingFilter = newS[socketName].filters.find((f) => isEqual(f.filter, normalizedFilter));
1726
+ if (!existingFilter) return;
1727
+ if (existingFilter.listeners + val <= 0) {
1728
+ newS[socketName].filters = newS[socketName].filters.filter((f) => !isEqual(f.filter, normalizedFilter));
1729
+ socket.emit("leaveRoom", { room: socketName, filter: normalizedFilter });
1730
+ systemLog("dsp", `[updateProviderListeners] Filter smazan pro room ${socketName}`);
1731
+ } else {
1732
+ existingFilter.listeners = existingFilter.listeners + val;
1733
+ systemLog("dsp", `[updateProviderListeners] Filter listeners snizen na ${existingFilter.listeners}`);
1734
+ }
1735
+ if (newS[socketName].filters.length === 0) {
1736
+ removeSocketListeners.push(socketName);
1737
+ delete newS[socketName];
1738
+ systemLog("dsp", `[updateProviderListeners] Room ${socketName} uplne smazana`);
1682
1739
  }
1683
- return newS;
1684
1740
  });
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;
1741
+ if (removeSocketListeners.length > 0) {
1742
+ socket.emit("leaveRooms", removeSocketListeners);
1743
+ }
1744
+ return newS;
1745
+ });
1746
+ setCounterDocuments((prevC) => {
1747
+ const newC = { ...prevC };
1748
+ prevP[id].data.forEach((document) => {
1749
+ if (newC[document] + val <= 0) {
1750
+ setDocuments((prev2) => {
1751
+ const newD = { ...prev2 };
1752
+ delete newD[document];
1753
+ return newD;
1754
+ });
1755
+ delete newC[document];
1756
+ } else {
1757
+ newC[document] = newC[document] + val;
1758
+ }
1700
1759
  });
1701
- const newP = { ...prevP };
1702
- delete newP[id];
1703
- return newP;
1760
+ return newC;
1704
1761
  });
1705
- const newProvs = { ...prev };
1706
- delete newProvs[id];
1707
- return newProvs;
1708
- }
1762
+ const newP = { ...prevP };
1763
+ delete newP[id];
1764
+ return newP;
1765
+ });
1766
+ const newProvs = { ...prev };
1767
+ delete newProvs[id];
1768
+ return newProvs;
1709
1769
  });
1710
1770
  },
1711
1771
  [setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
1712
1772
  );
1713
1773
  const registerProvider = useCallback(
1714
1774
  async (newItem) => {
1775
+ console.log("Registruji provider ", newItem.id, " se schema ", newItem.schema);
1715
1776
  systemLog("dsp", "[registerProvider]", newItem.id);
1716
1777
  let result;
1717
1778
  const { id, ...provider } = newItem;
@@ -1779,7 +1840,7 @@ var DataStoreProvider = forwardRef(
1779
1840
  [id]: 1
1780
1841
  }));
1781
1842
  if (provider.dataSource?.socketListeners) {
1782
- registerProviderSockets(provider.dataSource.socketListeners);
1843
+ registerProviderSockets(provider.dataSource.socketListeners, provider.dataSource.filter);
1783
1844
  }
1784
1845
  console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
1785
1846
  } catch (error) {
@@ -1803,7 +1864,7 @@ var DataStoreProvider = forwardRef(
1803
1864
  };
1804
1865
  } else {
1805
1866
  systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
1806
- unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
1867
+ unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners, providers[itemId]?.dataSource.filter);
1807
1868
  systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
1808
1869
  setCounterDocuments((cd) => {
1809
1870
  const newC = { ...cd };