@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.cjs CHANGED
@@ -85,26 +85,32 @@ function systemLog(..._args) {
85
85
  }
86
86
 
87
87
  // src/handleSocketMessage.ts
88
- var handleSocketMessage = (model, msg, dataProvider) => {
89
- const { dispatch, updateDocument } = dataProvider;
88
+ var handleSocketMessage = (msg, dataProvider) => {
89
+ const { dispatch } = dataProvider;
90
+ console.log("Mam socket message, data: ", msg);
90
91
  const data = JSON.parse(msg);
91
92
  switch (data.action) {
92
93
  case "create":
93
94
  systemLog("sockets", "[create] ", data.model, ", document: ", data.documentId);
95
+ console.log("[SOCKETS] CREATING model:", data.model, ", document: ", data.documentId, " data:", data.data);
94
96
  dispatch?.("createDocument", { model: data.model, documentId: data.documentId, data: data.data });
95
97
  break;
96
98
  case "update":
99
+ console.log(`[SOCKETS] UPDATE model: ${data.model}, document: ${data.documentId}, data: `, data.data);
97
100
  systemLog("sockets", `[update] ${JSON.stringify(data)}`);
98
101
  if (Array.isArray(data.data)) dispatch?.("updateDocuments", { model: data.model, documents: data.data });
99
- else updateDocument?.({ model: data.model, documentId: data.documentId, data: data.data });
102
+ else {
103
+ dispatch?.("updateDocument", { model: data.model, documentId: data.documentId, data: data.data });
104
+ }
100
105
  break;
101
106
  case "delete":
107
+ console.log(`[SOCKETS] DELETE model: ${data.model}, document: ${data.documentId}`);
102
108
  systemLog("sockets", "[delete] model:", data.model, ", document: ", data.documentId);
103
- dispatch?.("deleteDocument", { documentId: data.documentId, data: data.data });
109
+ dispatch?.("deleteDocument", { model: data.model, documentId: data.documentId, data: data.data });
104
110
  break;
105
111
  case "deleteItem":
106
- systemLog("sockets", "DELETE ITEM ", model, ", model: ", data.model, ", data: ", data.data);
107
- dispatch?.("removeItem", { model, documentId: data.data.id });
112
+ systemLog("sockets", "DELETE ITEM ", data.model, ", model: ", data.model, ", data: ", data.data);
113
+ dispatch?.("removeItem", { model: data.model, documentId: data.data.id });
108
114
  break;
109
115
  default:
110
116
  console.error(`Unknown command ${data.action}`);
@@ -512,12 +518,15 @@ function doesValueMatchFilter(objVal, value, documents = {}) {
512
518
  }
513
519
  }
514
520
  function doesObjectMatchFilter(obj, filter, documents = {}) {
521
+ console.log("doesObjectMatchFilter", "Obj", JSON.stringify(obj, null, 2), "Filter", JSON.stringify(filter, null, 2));
515
522
  if (!filter) return true;
516
523
  if (Object.keys(filter)?.includes("$rule")) {
524
+ console.log("Pravidloo: ", filter.$rule);
517
525
  const result2 = doesObjectMatchFilter(obj, filter.$rule, documents);
518
526
  if (result2 === true) {
519
527
  return result2;
520
528
  } else {
529
+ console.log("Vracim chybovou message ", filter.$message);
521
530
  return filter.$message || false;
522
531
  }
523
532
  }
@@ -666,11 +675,20 @@ var saveData = async ({
666
675
  }
667
676
  console.timeEnd(`[SQL] saveData ${providerId}`);
668
677
  };
678
+ var serializeParams = (params) => {
679
+ return Object.fromEntries(
680
+ Object.entries(params).map(([key, value]) => [
681
+ key,
682
+ typeof value === "object" ? JSON.stringify(value) : value
683
+ ])
684
+ );
685
+ };
669
686
  var buildUri = ({
670
687
  method,
671
688
  dataSource,
672
689
  variant
673
690
  }) => {
691
+ console.log("[HANDLE DATA] BUILD URI method ", method, " from", dataSource);
674
692
  if (dataSource.crud) {
675
693
  if (method === "update" && dataSource.crud.updates) {
676
694
  if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];
@@ -704,7 +722,7 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
704
722
  console.time("Persisted Data");
705
723
  const qDatum = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);
706
724
  systemLog("axios", "SQLite.read Posledni datum update: ", qDatum[0]?.lastUpdate);
707
- if (qDatum[0]?.lastUpdate) params.changeTime = qDatum[0].lastUpdate;
725
+ if (qDatum[0]?.lastUpdate) params.changeTimeFrom = qDatum[0].lastUpdate;
708
726
  persistedData = qDatum.map((item) => {
709
727
  try {
710
728
  const parsedData = typeof item.data === "string" ? JSON.parse(item.data) : item.data;
@@ -721,8 +739,8 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
721
739
  console.timeEnd("Persisted Data");
722
740
  }
723
741
  if (dataSource) {
724
- systemLog("axios", "Params: ", JSON.stringify(params));
725
- const axiosResponse = await import_axios.default.get(buildUri({ dataSource, method: "read" }), { params });
742
+ console.log("Stahuji data z ", buildUri({ dataSource, method: "read" }), " s parametry ", params);
743
+ const axiosResponse = await import_axios.default.get(buildUri({ dataSource, method: "read" }), { params: serializeParams(params) });
726
744
  if (schema && !dataSource.readAllFields) {
727
745
  if (Array.isArray(axiosResponse.data.data)) {
728
746
  newData = [];
@@ -1118,9 +1136,12 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1118
1136
  (0, import_react.useEffect)(() => {
1119
1137
  if (isLive) {
1120
1138
  systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
1121
- const ss = Object.keys(sockets);
1122
- systemLog("dsp", "useEffect[isLive] registruji", ss);
1123
- if (ss?.length > 0) socket.emit("joinRooms", JSON.stringify(ss));
1139
+ const roomsToJoin = Object.entries(sockets).flatMap(
1140
+ ([roomName, socketItem]) => socketItem.filters.map(({ filter }) => ({ room: roomName, filter }))
1141
+ );
1142
+ console.log("Sokety pro p\u0159ipojen\xED:", roomsToJoin);
1143
+ systemLog("dsp", "useEffect[isLive] registruji", roomsToJoin);
1144
+ if (roomsToJoin.length > 0) socket.emit("joinRooms", roomsToJoin);
1124
1145
  if (!didInitialLiveSyncRef.current) {
1125
1146
  didInitialLiveSyncRef.current = true;
1126
1147
  systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
@@ -1134,6 +1155,15 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1134
1155
  (0, import_react.useEffect)(() => {
1135
1156
  socket.on("connect", handleSocketConnect);
1136
1157
  socket.on("disconnect", handleSocketDisconnect);
1158
+ if (socketServer?.params?.socketEvents && socketServer.params.socketEvents.length > 0) {
1159
+ socketServer?.params?.socketEvents?.map(
1160
+ (event) => socket.on(event, (data) => handleSocketMessage(data, socketActionHandlersRef.current))
1161
+ );
1162
+ } else {
1163
+ socket.on("create", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
1164
+ socket.on("update", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
1165
+ socket.on("delete", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
1166
+ }
1137
1167
  return () => {
1138
1168
  socket.off("connect", handleSocketConnect);
1139
1169
  socket.off("disconnect", handleSocketDisconnect);
@@ -1210,6 +1240,7 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1210
1240
  result = await updateDataStore(item.data);
1211
1241
  break;
1212
1242
  case "createDocument":
1243
+ console.log("Dispatcher createDocument", item.data);
1213
1244
  await createDocument(item.data);
1214
1245
  break;
1215
1246
  case "updateDocument":
@@ -1549,14 +1580,27 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1549
1580
  const createDocument = (0, import_react.useCallback)(
1550
1581
  async ({ model, documentId, data }) => {
1551
1582
  const newDocument = data;
1552
- systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1583
+ console.log(`Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1553
1584
  var providerListenersCount = 0;
1554
1585
  Object.keys(providers).forEach((key) => {
1555
1586
  const provider = providers[key];
1556
1587
  var socketListeners = provider.dataSource?.socketListeners;
1557
1588
  if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
1558
- systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
1559
1589
  if (!provider.data.includes(documentId)) {
1590
+ setCounterDocuments((prev) => {
1591
+ const newC = { ...prev };
1592
+ if (newC[documentId]) {
1593
+ setDocuments((prev2) => ({
1594
+ ...prev2,
1595
+ [documentId]: { ...prev2[documentId], ...newDocument }
1596
+ }));
1597
+ newC[documentId] = prev[documentId] + 1;
1598
+ } else {
1599
+ setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
1600
+ newC[documentId] = providerListenersCount;
1601
+ }
1602
+ return newC;
1603
+ });
1560
1604
  providerListenersCount++;
1561
1605
  setProviders((prev) => ({
1562
1606
  ...prev,
@@ -1569,24 +1613,14 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1569
1613
  }
1570
1614
  }
1571
1615
  });
1616
+ console.log("Provider listeners count: ", providerListenersCount);
1572
1617
  if (providerListenersCount > 0) {
1573
1618
  if (providers[model]?.isPersisting && persistenceStorage) {
1619
+ console.log("Persistuji dokument ", documentId, " do modelu ", model);
1574
1620
  await persistDocument({ documentId, model, data: newDocument });
1575
1621
  }
1576
- setCounterDocuments((prev) => {
1577
- const newC = { ...prev };
1578
- if (newC[documentId]) {
1579
- setDocuments((prev2) => ({
1580
- ...prev2,
1581
- [documentId]: { ...prev2[documentId], ...newDocument }
1582
- }));
1583
- newC[documentId] = prev[documentId] + providerListenersCount;
1584
- } else {
1585
- setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
1586
- newC[documentId] = providerListenersCount;
1587
- }
1588
- return newC;
1589
- });
1622
+ console.log("Dokument ", documentId, " zaregistrovan do ", providerListenersCount, " provideru");
1623
+ console.log(newDocument);
1590
1624
  return { id: documentId, document: newDocument };
1591
1625
  } else return false;
1592
1626
  },
@@ -1594,6 +1628,7 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1594
1628
  );
1595
1629
  const deleteDocument = (0, import_react.useCallback)(
1596
1630
  async ({ documentId }) => {
1631
+ console.log("Mazani dokumentu ", documentId);
1597
1632
  systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
1598
1633
  await removePersistedDocument(documentId);
1599
1634
  setDocuments((prev) => {
@@ -1660,55 +1695,77 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1660
1695
  [providers]
1661
1696
  );
1662
1697
  const registerProviderSockets = (0, import_react.useCallback)(
1663
- (sockets2) => {
1664
- if (sockets2) {
1665
- systemLog("dsp", "[registerProviderSockets]", sockets2);
1666
- var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1667
- setSockets((prev) => {
1668
- const newS = { ...prev };
1669
- d.forEach((item) => {
1670
- if (newS[item]) {
1671
- newS[item].listeners = newS[item].listeners + 1;
1698
+ (sockets2, filter) => {
1699
+ if (!sockets2) return;
1700
+ const normalizedFilter = filter ?? {};
1701
+ systemLog("dsp", "[registerProviderSockets]", sockets2, `filter: ${JSON.stringify(normalizedFilter)}`);
1702
+ const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1703
+ setSockets((prev) => {
1704
+ const newS = { ...prev };
1705
+ d.forEach((item) => {
1706
+ if (newS[item]) {
1707
+ const existingFilter = newS[item].filters.find((f) => (0, import_isEqual.default)(f.filter, normalizedFilter));
1708
+ if (existingFilter) {
1709
+ existingFilter.listeners++;
1710
+ systemLog("dsp", `[registerProviderSockets] Filter uz existuje, navysuji listeners na ${existingFilter.listeners}`);
1672
1711
  } else {
1673
- const roomHandler = (msg) => {
1674
- const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;
1675
- handleSocketMessage(item, msg, {
1676
- dispatch: currentDispatch,
1677
- updateDocument: currentUpdateDocument
1678
- });
1679
- };
1680
- socketRoomHandlersRef.current[item] = roomHandler;
1681
- newS[item] = { listeners: 1, data: [] };
1682
- socket.emit("joinRoom", item);
1683
- socket.on(item, roomHandler);
1712
+ newS[item].filters = [...newS[item].filters, { filter: normalizedFilter, listeners: 1 }];
1713
+ socket.emit("joinRoom", { room: item, filter: normalizedFilter });
1714
+ systemLog(
1715
+ "dsp",
1716
+ `[registerProviderSockets] Novy filter, registruji room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
1717
+ );
1684
1718
  }
1685
- });
1686
- return newS;
1719
+ } else {
1720
+ newS[item] = {
1721
+ filters: [{ filter: normalizedFilter, listeners: 1 }],
1722
+ data: []
1723
+ };
1724
+ socket.emit("joinRoom", { room: item, filter: normalizedFilter });
1725
+ systemLog("dsp", `[registerProviderSockets] Nova room ${item}, filter: ${JSON.stringify(normalizedFilter)}`);
1726
+ }
1687
1727
  });
1688
- }
1728
+ return newS;
1729
+ });
1689
1730
  },
1690
1731
  [setSockets, socket]
1691
1732
  );
1692
1733
  const unregisterProviderSockets = (0, import_react.useCallback)(
1693
- (sockets2) => {
1694
- systemLog("dsp", "[unregisterProviderSockets] Mazu sockety ", JSON.stringify(sockets2, null, 2));
1695
- var removeSocketListeners = [];
1696
- var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1734
+ (sockets2, filter) => {
1735
+ const normalizedFilter = filter ?? {};
1736
+ systemLog(
1737
+ "dsp",
1738
+ "[unregisterProviderSockets] Mazu sockety",
1739
+ JSON.stringify(sockets2, null, 2),
1740
+ `filter: ${JSON.stringify(normalizedFilter)}`
1741
+ );
1742
+ const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1697
1743
  setSockets((prev) => {
1698
1744
  const newS = { ...prev };
1745
+ const removeSocketListeners = [];
1699
1746
  d.forEach((item) => {
1700
- if (newS[item]?.listeners <= 1) {
1747
+ if (!newS[item]) return;
1748
+ const existingFilter = newS[item].filters.find((f) => (0, import_isEqual.default)(f.filter, normalizedFilter));
1749
+ if (!existingFilter) return;
1750
+ if (existingFilter.listeners <= 1) {
1751
+ newS[item].filters = newS[item].filters.filter((f) => !(0, import_isEqual.default)(f.filter, normalizedFilter));
1752
+ socket.emit("leaveRoom", { room: item, filter: normalizedFilter });
1753
+ systemLog(
1754
+ "dsp",
1755
+ `[unregisterProviderSockets] Filter smazan, odhlaseni room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
1756
+ );
1757
+ } else {
1758
+ existingFilter.listeners--;
1759
+ systemLog("dsp", `[unregisterProviderSockets] Filter listeners snizen na ${existingFilter.listeners}`);
1760
+ }
1761
+ if (newS[item].filters.length === 0) {
1701
1762
  removeSocketListeners.push(item);
1702
- const roomHandler = socketRoomHandlersRef.current[item];
1703
- if (roomHandler) {
1704
- socket.off(item, roomHandler);
1705
- delete socketRoomHandlersRef.current[item];
1706
- }
1707
1763
  delete newS[item];
1708
- } else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
1764
+ systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
1765
+ }
1709
1766
  });
1710
1767
  if (removeSocketListeners.length > 0) {
1711
- socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1768
+ socket.emit("leaveRooms", removeSocketListeners);
1712
1769
  }
1713
1770
  return newS;
1714
1771
  });
@@ -1721,60 +1778,62 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1721
1778
  setCounterProviders((prev) => {
1722
1779
  if (!prev[id]) return prev;
1723
1780
  if (prev[id] + val > 0) {
1724
- return {
1725
- ...prev,
1726
- [id]: prev[id] + val
1727
- };
1728
- } else {
1729
- setProviders((prevP) => {
1730
- systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
1731
- setSockets((prevS) => {
1732
- var removeSocketListeners = [];
1733
- const newS = { ...prevS };
1734
- const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
1735
- providerSocketListeners.forEach((socketName) => {
1736
- if (!newS[socketName]) return;
1737
- if (newS[socketName].listeners + val <= 0) {
1738
- const roomHandler = socketRoomHandlersRef.current[socketName];
1739
- if (roomHandler) {
1740
- socket.off(socketName, roomHandler);
1741
- delete socketRoomHandlersRef.current[socketName];
1742
- }
1743
- delete newS[socketName];
1744
- removeSocketListeners.push(socketName);
1745
- } else {
1746
- newS[socketName].listeners = newS[socketName].listeners + val;
1747
- }
1748
- });
1749
- if (removeSocketListeners.length > 0) {
1750
- socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1781
+ return { ...prev, [id]: prev[id] + val };
1782
+ }
1783
+ setProviders((prevP) => {
1784
+ systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
1785
+ setSockets((prevS) => {
1786
+ const newS = { ...prevS };
1787
+ const removeSocketListeners = [];
1788
+ const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
1789
+ const providerFilter = prevP[id].dataSource?.filter;
1790
+ const normalizedFilter = providerFilter ?? {};
1791
+ providerSocketListeners.forEach((socketName) => {
1792
+ if (!newS[socketName]) return;
1793
+ const existingFilter = newS[socketName].filters.find((f) => (0, import_isEqual.default)(f.filter, normalizedFilter));
1794
+ if (!existingFilter) return;
1795
+ if (existingFilter.listeners + val <= 0) {
1796
+ newS[socketName].filters = newS[socketName].filters.filter((f) => !(0, import_isEqual.default)(f.filter, normalizedFilter));
1797
+ socket.emit("leaveRoom", { room: socketName, filter: normalizedFilter });
1798
+ systemLog("dsp", `[updateProviderListeners] Filter smazan pro room ${socketName}`);
1799
+ } else {
1800
+ existingFilter.listeners = existingFilter.listeners + val;
1801
+ systemLog("dsp", `[updateProviderListeners] Filter listeners snizen na ${existingFilter.listeners}`);
1802
+ }
1803
+ if (newS[socketName].filters.length === 0) {
1804
+ removeSocketListeners.push(socketName);
1805
+ delete newS[socketName];
1806
+ systemLog("dsp", `[updateProviderListeners] Room ${socketName} uplne smazana`);
1751
1807
  }
1752
- return newS;
1753
1808
  });
1754
- setCounterDocuments((prevC) => {
1755
- const newC = { ...prevC };
1756
- prevP[id].data.forEach((document) => {
1757
- if (newC[document] + val <= 0) {
1758
- setDocuments((prev2) => {
1759
- const newD = { ...prev2 };
1760
- delete newD[document];
1761
- return newD;
1762
- });
1763
- delete newC[document];
1764
- } else {
1765
- newC[document] = newC[document] + val;
1766
- }
1767
- });
1768
- return newC;
1809
+ if (removeSocketListeners.length > 0) {
1810
+ socket.emit("leaveRooms", removeSocketListeners);
1811
+ }
1812
+ return newS;
1813
+ });
1814
+ setCounterDocuments((prevC) => {
1815
+ const newC = { ...prevC };
1816
+ prevP[id].data.forEach((document) => {
1817
+ if (newC[document] + val <= 0) {
1818
+ setDocuments((prev2) => {
1819
+ const newD = { ...prev2 };
1820
+ delete newD[document];
1821
+ return newD;
1822
+ });
1823
+ delete newC[document];
1824
+ } else {
1825
+ newC[document] = newC[document] + val;
1826
+ }
1769
1827
  });
1770
- const newP = { ...prevP };
1771
- delete newP[id];
1772
- return newP;
1828
+ return newC;
1773
1829
  });
1774
- const newProvs = { ...prev };
1775
- delete newProvs[id];
1776
- return newProvs;
1777
- }
1830
+ const newP = { ...prevP };
1831
+ delete newP[id];
1832
+ return newP;
1833
+ });
1834
+ const newProvs = { ...prev };
1835
+ delete newProvs[id];
1836
+ return newProvs;
1778
1837
  });
1779
1838
  },
1780
1839
  [setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
@@ -1848,7 +1907,7 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1848
1907
  [id]: 1
1849
1908
  }));
1850
1909
  if (provider.dataSource?.socketListeners) {
1851
- registerProviderSockets(provider.dataSource.socketListeners);
1910
+ registerProviderSockets(provider.dataSource.socketListeners, provider.dataSource.filter);
1852
1911
  }
1853
1912
  console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
1854
1913
  } catch (error) {
@@ -1872,7 +1931,7 @@ var DataStoreProvider = (0, import_react.forwardRef)(
1872
1931
  };
1873
1932
  } else {
1874
1933
  systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
1875
- unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
1934
+ unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners, providers[itemId]?.dataSource.filter);
1876
1935
  systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
1877
1936
  setCounterDocuments((cd) => {
1878
1937
  const newC = { ...cd };