@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 +174 -115
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -10
- package/dist/index.d.ts +25 -10
- package/dist/index.js +174 -115
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
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:
|
|
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
|
|
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
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
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:
|
|
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
|
|
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
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
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 = (
|
|
20
|
-
const { dispatch
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
1053
|
-
|
|
1054
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1508
|
-
|
|
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
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
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
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
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]
|
|
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
|
-
|
|
1695
|
+
systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
|
|
1696
|
+
}
|
|
1640
1697
|
});
|
|
1641
1698
|
if (removeSocketListeners.length > 0) {
|
|
1642
|
-
socket.emit("leaveRooms",
|
|
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
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
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
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
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
|
-
|
|
1702
|
-
delete newP[id];
|
|
1703
|
-
return newP;
|
|
1759
|
+
return newC;
|
|
1704
1760
|
});
|
|
1705
|
-
const
|
|
1706
|
-
delete
|
|
1707
|
-
return
|
|
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 };
|