@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.cjs +177 -116
- 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 +177 -116
- 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);
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
});
|
|
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
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
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
|
-
|
|
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);
|
|
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
|
-
|
|
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
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
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]
|
|
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
|
-
|
|
1696
|
+
systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
|
|
1697
|
+
}
|
|
1640
1698
|
});
|
|
1641
1699
|
if (removeSocketListeners.length > 0) {
|
|
1642
|
-
socket.emit("leaveRooms",
|
|
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
|
-
|
|
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));
|
|
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
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
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
|
-
|
|
1702
|
-
delete newP[id];
|
|
1703
|
-
return newP;
|
|
1760
|
+
return newC;
|
|
1704
1761
|
});
|
|
1705
|
-
const
|
|
1706
|
-
delete
|
|
1707
|
-
return
|
|
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 };
|