@mgarlik/datastore 0.1.1 → 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 +971 -909
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -5
- package/dist/index.d.ts +47 -5
- package/dist/index.js +982 -910
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
package/dist/index.js
CHANGED
|
@@ -3,29 +3,45 @@ import {
|
|
|
3
3
|
} from "./chunk-7XDRKNJQ.js";
|
|
4
4
|
|
|
5
5
|
// src/DataStoreProvider.tsx
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
createContext,
|
|
8
|
+
forwardRef,
|
|
9
|
+
useCallback,
|
|
10
|
+
useContext,
|
|
11
|
+
useEffect,
|
|
12
|
+
useImperativeHandle,
|
|
13
|
+
useMemo,
|
|
14
|
+
useRef,
|
|
15
|
+
useState
|
|
16
|
+
} from "react";
|
|
7
17
|
|
|
8
18
|
// src/handleSocketMessage.ts
|
|
9
|
-
var handleSocketMessage = (
|
|
10
|
-
const { dispatch
|
|
19
|
+
var handleSocketMessage = (msg, dataProvider) => {
|
|
20
|
+
const { dispatch } = dataProvider;
|
|
21
|
+
console.log("Mam socket message, data: ", msg);
|
|
11
22
|
const data = JSON.parse(msg);
|
|
12
23
|
switch (data.action) {
|
|
13
24
|
case "create":
|
|
14
25
|
systemLog("sockets", "[create] ", data.model, ", document: ", data.documentId);
|
|
26
|
+
console.log("[SOCKETS] CREATING model:", data.model, ", document: ", data.documentId, " data:", data.data);
|
|
15
27
|
dispatch?.("createDocument", { model: data.model, documentId: data.documentId, data: data.data });
|
|
16
28
|
break;
|
|
17
29
|
case "update":
|
|
30
|
+
console.log(`[SOCKETS] UPDATE model: ${data.model}, document: ${data.documentId}, data: `, data.data);
|
|
18
31
|
systemLog("sockets", `[update] ${JSON.stringify(data)}`);
|
|
19
32
|
if (Array.isArray(data.data)) dispatch?.("updateDocuments", { model: data.model, documents: data.data });
|
|
20
|
-
else
|
|
33
|
+
else {
|
|
34
|
+
dispatch?.("updateDocument", { model: data.model, documentId: data.documentId, data: data.data });
|
|
35
|
+
}
|
|
21
36
|
break;
|
|
22
37
|
case "delete":
|
|
38
|
+
console.log(`[SOCKETS] DELETE model: ${data.model}, document: ${data.documentId}`);
|
|
23
39
|
systemLog("sockets", "[delete] model:", data.model, ", document: ", data.documentId);
|
|
24
|
-
dispatch?.("deleteDocument", { documentId: data.documentId, data: data.data });
|
|
40
|
+
dispatch?.("deleteDocument", { model: data.model, documentId: data.documentId, data: data.data });
|
|
25
41
|
break;
|
|
26
42
|
case "deleteItem":
|
|
27
|
-
systemLog("sockets", "DELETE ITEM ", model, ", model: ", data.model, ", data: ", data.data);
|
|
28
|
-
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 });
|
|
29
45
|
break;
|
|
30
46
|
default:
|
|
31
47
|
console.error(`Unknown command ${data.action}`);
|
|
@@ -433,12 +449,15 @@ function doesValueMatchFilter(objVal, value, documents = {}) {
|
|
|
433
449
|
}
|
|
434
450
|
}
|
|
435
451
|
function doesObjectMatchFilter(obj, filter, documents = {}) {
|
|
452
|
+
console.log("doesObjectMatchFilter", "Obj", JSON.stringify(obj, null, 2), "Filter", JSON.stringify(filter, null, 2));
|
|
436
453
|
if (!filter) return true;
|
|
437
454
|
if (Object.keys(filter)?.includes("$rule")) {
|
|
455
|
+
console.log("Pravidloo: ", filter.$rule);
|
|
438
456
|
const result2 = doesObjectMatchFilter(obj, filter.$rule, documents);
|
|
439
457
|
if (result2 === true) {
|
|
440
458
|
return result2;
|
|
441
459
|
} else {
|
|
460
|
+
console.log("Vracim chybovou message ", filter.$message);
|
|
442
461
|
return filter.$message || false;
|
|
443
462
|
}
|
|
444
463
|
}
|
|
@@ -587,11 +606,20 @@ var saveData = async ({
|
|
|
587
606
|
}
|
|
588
607
|
console.timeEnd(`[SQL] saveData ${providerId}`);
|
|
589
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
|
+
};
|
|
590
617
|
var buildUri = ({
|
|
591
618
|
method,
|
|
592
619
|
dataSource,
|
|
593
620
|
variant
|
|
594
621
|
}) => {
|
|
622
|
+
console.log("[HANDLE DATA] BUILD URI method ", method, " from", dataSource);
|
|
595
623
|
if (dataSource.crud) {
|
|
596
624
|
if (method === "update" && dataSource.crud.updates) {
|
|
597
625
|
if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];
|
|
@@ -625,7 +653,7 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
|
|
|
625
653
|
console.time("Persisted Data");
|
|
626
654
|
const qDatum = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);
|
|
627
655
|
systemLog("axios", "SQLite.read Posledni datum update: ", qDatum[0]?.lastUpdate);
|
|
628
|
-
if (qDatum[0]?.lastUpdate) params.
|
|
656
|
+
if (qDatum[0]?.lastUpdate) params.changeTimeFrom = qDatum[0].lastUpdate;
|
|
629
657
|
persistedData = qDatum.map((item) => {
|
|
630
658
|
try {
|
|
631
659
|
const parsedData = typeof item.data === "string" ? JSON.parse(item.data) : item.data;
|
|
@@ -642,8 +670,8 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
|
|
|
642
670
|
console.timeEnd("Persisted Data");
|
|
643
671
|
}
|
|
644
672
|
if (dataSource) {
|
|
645
|
-
|
|
646
|
-
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) });
|
|
647
675
|
if (schema && !dataSource.readAllFields) {
|
|
648
676
|
if (Array.isArray(axiosResponse.data.data)) {
|
|
649
677
|
newData = [];
|
|
@@ -878,796 +906,839 @@ var resolveLocale = () => {
|
|
|
878
906
|
}
|
|
879
907
|
return void 0;
|
|
880
908
|
};
|
|
881
|
-
var DataStoreProvider = (
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
909
|
+
var DataStoreProvider = forwardRef(
|
|
910
|
+
({ socketServer, restServer, usePersistentStorage = true, locale, storage = null, ...props }, ref) => {
|
|
911
|
+
const [isLive, setIsLive] = useState(false);
|
|
912
|
+
const [isSynchronizing, setIsSynchronizing] = useState(true);
|
|
913
|
+
const [sockets, setSockets] = useState({});
|
|
914
|
+
const [providers, setProviders] = useState({});
|
|
915
|
+
const [documents, setDocuments] = useState({});
|
|
916
|
+
const externalProvidersRef = useRef({});
|
|
917
|
+
const externalDocumentsRef = useRef({});
|
|
918
|
+
const providerSubscribersRef = useRef(/* @__PURE__ */ new Map());
|
|
919
|
+
const previousProviderUpdateIdsRef = useRef({});
|
|
920
|
+
const [dispatcher, setDispatcher] = useState({ isBussy: false, actions: [] });
|
|
921
|
+
const [counterProviders, setCounterProviders] = useState({});
|
|
922
|
+
const [counterDocuments, setCounterDocuments] = useState({});
|
|
923
|
+
const didInitialLiveSyncRef = useRef(false);
|
|
924
|
+
const persistenceStorage = useMemo(
|
|
925
|
+
() => usePersistentStorage ? storage : null,
|
|
926
|
+
[storage, usePersistentStorage]
|
|
927
|
+
);
|
|
928
|
+
useEffect(() => {
|
|
929
|
+
if (!restServer) return;
|
|
930
|
+
const resolvedLocale = locale || resolveLocale();
|
|
931
|
+
axios2.defaults.baseURL = restServer;
|
|
932
|
+
if (resolvedLocale) {
|
|
933
|
+
axios2.defaults.headers.common["Accept-Language"] = resolvedLocale;
|
|
934
|
+
}
|
|
935
|
+
systemLog("dsp", "[INIT] Axios baseURL:", restServer);
|
|
936
|
+
async function checkServer() {
|
|
937
|
+
try {
|
|
938
|
+
const response = await axios2.head("/", {
|
|
939
|
+
timeout: 7e3,
|
|
940
|
+
validateStatus: () => true
|
|
941
|
+
});
|
|
942
|
+
systemLog("dsp", "[INIT] Axios Success, status:", response.status);
|
|
943
|
+
} catch (e) {
|
|
944
|
+
if (axios2.isAxiosError(e)) {
|
|
945
|
+
systemLog("dsp", "[INIT] Axios Error:", e.code ?? "UNKNOWN", e.message);
|
|
946
|
+
} else {
|
|
947
|
+
systemLog("dsp", "[INIT] Axios Error:", String(e));
|
|
948
|
+
}
|
|
949
|
+
} finally {
|
|
950
|
+
systemLog("dsp", "[INIT] Axios check done");
|
|
919
951
|
}
|
|
920
|
-
} finally {
|
|
921
|
-
systemLog("dsp", "[INIT] Axios check done");
|
|
922
952
|
}
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
929
|
-
}
|
|
930
|
-
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
931
|
-
const socketRoomHandlersRef = useRef({});
|
|
932
|
-
const socketActionHandlersRef = useRef({});
|
|
933
|
-
systemLog("dsp", "START");
|
|
934
|
-
const socket = useMemo(() => ioSockets(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
935
|
-
const handleSocketConnect = useCallback(() => setIsLive(true), []);
|
|
936
|
-
const handleSocketDisconnect = useCallback(() => setIsLive(false), []);
|
|
937
|
-
const getSocketAuthToken = useCallback(() => {
|
|
938
|
-
const authorizationHeader = axios2.defaults.headers.common["Authorization"];
|
|
939
|
-
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
940
|
-
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
941
|
-
}
|
|
942
|
-
return "Bearer ";
|
|
943
|
-
}, []);
|
|
944
|
-
const subscribeToProvider = useCallback((providerId, callback) => {
|
|
945
|
-
const subscribersByProvider = providerSubscribersRef.current;
|
|
946
|
-
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
947
|
-
providerSubscribers.add(callback);
|
|
948
|
-
subscribersByProvider.set(providerId, providerSubscribers);
|
|
949
|
-
return () => {
|
|
950
|
-
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
951
|
-
if (!activeSubscribers) return;
|
|
952
|
-
activeSubscribers.delete(callback);
|
|
953
|
-
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
954
|
-
};
|
|
955
|
-
}, []);
|
|
956
|
-
const getProviderLastUpdate = useCallback((providerId) => {
|
|
957
|
-
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
958
|
-
}, []);
|
|
959
|
-
const getExternalDocuments = useCallback(() => externalDocumentsRef.current, []);
|
|
960
|
-
const getExternalProviders = useCallback(() => externalProvidersRef.current, []);
|
|
961
|
-
useEffect(() => {
|
|
962
|
-
externalProvidersRef.current = providers;
|
|
963
|
-
const currentUpdateIds = {};
|
|
964
|
-
Object.keys(providers).forEach((providerId) => {
|
|
965
|
-
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
966
|
-
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
967
|
-
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
968
|
-
subscribers?.forEach((callback) => callback());
|
|
953
|
+
checkServer();
|
|
954
|
+
}, [locale, restServer]);
|
|
955
|
+
useEffect(() => {
|
|
956
|
+
if (usePersistentStorage && !storage) {
|
|
957
|
+
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
969
958
|
}
|
|
970
|
-
});
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
959
|
+
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
960
|
+
const socketRoomHandlersRef = useRef({});
|
|
961
|
+
const socketActionHandlersRef = useRef({});
|
|
962
|
+
systemLog("dsp", "START");
|
|
963
|
+
const socket = useMemo(() => ioSockets(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
964
|
+
const handleSocketConnect = useCallback(() => setIsLive(true), []);
|
|
965
|
+
const handleSocketDisconnect = useCallback(() => setIsLive(false), []);
|
|
966
|
+
const getSocketAuthToken = useCallback(() => {
|
|
967
|
+
const authorizationHeader = axios2.defaults.headers.common["Authorization"];
|
|
968
|
+
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
969
|
+
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
975
970
|
}
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
971
|
+
return "Bearer ";
|
|
972
|
+
}, []);
|
|
973
|
+
const subscribeToProvider = useCallback((providerId, callback) => {
|
|
974
|
+
const subscribersByProvider = providerSubscribersRef.current;
|
|
975
|
+
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
976
|
+
providerSubscribers.add(callback);
|
|
977
|
+
subscribersByProvider.set(providerId, providerSubscribers);
|
|
978
|
+
return () => {
|
|
979
|
+
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
980
|
+
if (!activeSubscribers) return;
|
|
981
|
+
activeSubscribers.delete(callback);
|
|
982
|
+
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
983
|
+
};
|
|
984
|
+
}, []);
|
|
985
|
+
const getProviderLastUpdate = useCallback((providerId) => {
|
|
986
|
+
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
987
|
+
}, []);
|
|
988
|
+
const getExternalDocuments = useCallback(() => externalDocumentsRef.current, []);
|
|
989
|
+
const getExternalProviders = useCallback(() => externalProvidersRef.current, []);
|
|
990
|
+
useEffect(() => {
|
|
991
|
+
externalProvidersRef.current = providers;
|
|
992
|
+
const currentUpdateIds = {};
|
|
993
|
+
Object.keys(providers).forEach((providerId) => {
|
|
994
|
+
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
995
|
+
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
996
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
997
|
+
subscribers?.forEach((callback) => callback());
|
|
998
|
+
}
|
|
999
|
+
});
|
|
1000
|
+
Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {
|
|
1001
|
+
if (!(providerId in currentUpdateIds)) {
|
|
1002
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
1003
|
+
subscribers?.forEach((callback) => callback());
|
|
1004
|
+
}
|
|
1005
|
+
});
|
|
1006
|
+
previousProviderUpdateIdsRef.current = currentUpdateIds;
|
|
1007
|
+
}, [providers]);
|
|
1008
|
+
useEffect(() => {
|
|
1009
|
+
externalDocumentsRef.current = documents;
|
|
1010
|
+
}, [documents]);
|
|
1011
|
+
const persistDocument = useCallback(
|
|
1012
|
+
async ({
|
|
991
1013
|
documentId,
|
|
992
|
-
JSON.stringify(data),
|
|
993
1014
|
model,
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1015
|
+
data,
|
|
1016
|
+
lastUpdate = (/* @__PURE__ */ new Date()).toISOString()
|
|
1017
|
+
}) => {
|
|
1018
|
+
if (!persistenceStorage) return;
|
|
1019
|
+
await persistenceStorage.query("INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)", [
|
|
1020
|
+
documentId,
|
|
1021
|
+
JSON.stringify(data),
|
|
1022
|
+
model,
|
|
1023
|
+
lastUpdate
|
|
1024
|
+
]);
|
|
1025
|
+
},
|
|
1026
|
+
[persistenceStorage]
|
|
1027
|
+
);
|
|
1028
|
+
const removePersistedDocument = useCallback(
|
|
1029
|
+
async (documentId) => {
|
|
1030
|
+
if (!persistenceStorage) return;
|
|
1031
|
+
await persistenceStorage.query("DELETE FROM documents WHERE id = ?", [documentId]);
|
|
1032
|
+
},
|
|
1033
|
+
[persistenceStorage]
|
|
1034
|
+
);
|
|
1035
|
+
const synchronizeDataStore = useCallback(async () => {
|
|
1036
|
+
setIsSynchronizing(true);
|
|
1037
|
+
const stats = { processed: 0, updated: 0, failed: 0 };
|
|
1038
|
+
try {
|
|
1039
|
+
for (const key of Object.keys(providers)) {
|
|
1040
|
+
stats.processed++;
|
|
1041
|
+
try {
|
|
1042
|
+
const { data, lastUpdate, ...rest } = providers[key];
|
|
1043
|
+
const response = await getData({
|
|
1044
|
+
id: key,
|
|
1045
|
+
...rest,
|
|
1046
|
+
changeTime: lastUpdate.time
|
|
1024
1047
|
});
|
|
1025
|
-
|
|
1026
|
-
|
|
1048
|
+
if (response.length > 0) {
|
|
1049
|
+
const updateData = {};
|
|
1050
|
+
response.forEach((item) => {
|
|
1051
|
+
const { id, ...d } = item;
|
|
1052
|
+
updateData[id] = d;
|
|
1053
|
+
});
|
|
1054
|
+
await updateDocuments({ model: key, documents: updateData, mode: "replace" });
|
|
1055
|
+
stats.updated++;
|
|
1056
|
+
}
|
|
1057
|
+
} catch (e) {
|
|
1058
|
+
stats.failed++;
|
|
1059
|
+
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1027
1060
|
}
|
|
1028
|
-
} catch (e) {
|
|
1029
|
-
stats.failed++;
|
|
1030
|
-
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1031
1061
|
}
|
|
1062
|
+
} finally {
|
|
1063
|
+
setIsSynchronizing(false);
|
|
1064
|
+
systemLog("dsp", "[synchronizeDataStore] Hotovo:", stats);
|
|
1032
1065
|
}
|
|
1033
|
-
}
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1066
|
+
}, [providers]);
|
|
1067
|
+
useEffect(() => {
|
|
1068
|
+
if (isLive) {
|
|
1069
|
+
systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
|
|
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);
|
|
1076
|
+
if (!didInitialLiveSyncRef.current) {
|
|
1077
|
+
didInitialLiveSyncRef.current = true;
|
|
1078
|
+
systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
|
|
1079
|
+
synchronizeDataStore();
|
|
1080
|
+
}
|
|
1081
|
+
} else {
|
|
1082
|
+
didInitialLiveSyncRef.current = false;
|
|
1048
1083
|
}
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
const startSockets = useCallback(() => {
|
|
1063
|
-
socket.auth = {
|
|
1064
|
-
...socket.auth || {},
|
|
1065
|
-
...socketServer?.params?.auth || {},
|
|
1066
|
-
token: getSocketAuthToken()
|
|
1067
|
-
};
|
|
1068
|
-
systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
|
|
1069
|
-
socket.connect();
|
|
1070
|
-
}, [socket, socketServer?.params?.auth, getSocketAuthToken]);
|
|
1071
|
-
const stopSockets = useCallback(() => {
|
|
1072
|
-
systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
|
|
1073
|
-
socket.disconnect();
|
|
1074
|
-
}, [socket]);
|
|
1075
|
-
const resetDataStore = useCallback(async () => {
|
|
1076
|
-
console.time("[DSP] resetDataStore");
|
|
1077
|
-
if (persistenceStorage?.emptyTable) {
|
|
1078
|
-
await persistenceStorage.emptyTable("documents");
|
|
1079
|
-
}
|
|
1080
|
-
setSockets({});
|
|
1081
|
-
setProviders({});
|
|
1082
|
-
setDocuments({});
|
|
1083
|
-
setCounterProviders({});
|
|
1084
|
-
setCounterDocuments({});
|
|
1085
|
-
console.timeEnd("[DSP] resetDataStore");
|
|
1086
|
-
}, [persistenceStorage]);
|
|
1087
|
-
const resetProvider = useCallback(
|
|
1088
|
-
async (provider) => {
|
|
1089
|
-
if (!persistenceStorage) return;
|
|
1090
|
-
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1091
|
-
},
|
|
1092
|
-
[persistenceStorage]
|
|
1093
|
-
);
|
|
1094
|
-
const initProvider = useCallback(
|
|
1095
|
-
async (id, data) => {
|
|
1096
|
-
const providerPreset = presetProviders[id];
|
|
1097
|
-
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1098
|
-
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1099
|
-
if (typeof prov !== "boolean") {
|
|
1100
|
-
return await registerProvider(prov);
|
|
1084
|
+
}, [isLive, socket, sockets, synchronizeDataStore]);
|
|
1085
|
+
const presetProviders = props.providers;
|
|
1086
|
+
useEffect(() => {
|
|
1087
|
+
socket.on("connect", handleSocketConnect);
|
|
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));
|
|
1101
1097
|
}
|
|
1102
|
-
return
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
await registerProvider(item.data);
|
|
1125
|
-
break;
|
|
1126
|
-
case "unregisterProvider":
|
|
1127
|
-
await unregisterProvider(item.data);
|
|
1128
|
-
break;
|
|
1129
|
-
case "updateDataStore":
|
|
1130
|
-
result = await updateDataStore(item.data);
|
|
1131
|
-
break;
|
|
1132
|
-
case "createDocument":
|
|
1133
|
-
await createDocument(item.data);
|
|
1134
|
-
break;
|
|
1135
|
-
case "updateDocument":
|
|
1136
|
-
await updateDocument(item.data);
|
|
1137
|
-
break;
|
|
1138
|
-
case "updateDocuments":
|
|
1139
|
-
await updateDocuments(item.data);
|
|
1140
|
-
break;
|
|
1141
|
-
case "removeItem":
|
|
1142
|
-
break;
|
|
1143
|
-
case "deleteDocument":
|
|
1144
|
-
await deleteDocument(item.data);
|
|
1145
|
-
break;
|
|
1146
|
-
case "createProviderItem":
|
|
1147
|
-
result = await createProviderItem(item.data);
|
|
1148
|
-
break;
|
|
1149
|
-
case "deleteProviderItem":
|
|
1150
|
-
result = await deleteProviderItem(item.data);
|
|
1151
|
-
break;
|
|
1152
|
-
default:
|
|
1153
|
-
console.error("Unknown Action ", item.action, "Data: ", item.data);
|
|
1154
|
-
}
|
|
1155
|
-
item.callback && item.callback(result);
|
|
1156
|
-
setDispatcher((prev) => ({
|
|
1157
|
-
isBussy: false,
|
|
1158
|
-
actions: prev.actions.slice(1)
|
|
1159
|
-
}));
|
|
1160
|
-
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1098
|
+
return () => {
|
|
1099
|
+
socket.off("connect", handleSocketConnect);
|
|
1100
|
+
socket.off("disconnect", handleSocketDisconnect);
|
|
1101
|
+
};
|
|
1102
|
+
}, [socket, handleSocketConnect, handleSocketDisconnect]);
|
|
1103
|
+
const startSockets = useCallback(() => {
|
|
1104
|
+
socket.auth = {
|
|
1105
|
+
...socket.auth || {},
|
|
1106
|
+
...socketServer?.params?.auth || {},
|
|
1107
|
+
token: getSocketAuthToken()
|
|
1108
|
+
};
|
|
1109
|
+
systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
|
|
1110
|
+
socket.connect();
|
|
1111
|
+
}, [socket, socketServer?.params?.auth, getSocketAuthToken]);
|
|
1112
|
+
const stopSockets = useCallback(() => {
|
|
1113
|
+
systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
|
|
1114
|
+
socket.disconnect();
|
|
1115
|
+
}, [socket]);
|
|
1116
|
+
const resetDataStore = useCallback(async () => {
|
|
1117
|
+
console.time("[DSP] resetDataStore");
|
|
1118
|
+
if (persistenceStorage?.emptyTable) {
|
|
1119
|
+
await persistenceStorage.emptyTable("documents");
|
|
1161
1120
|
}
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1121
|
+
setSockets({});
|
|
1122
|
+
setProviders({});
|
|
1123
|
+
setDocuments({});
|
|
1124
|
+
setCounterProviders({});
|
|
1125
|
+
setCounterDocuments({});
|
|
1126
|
+
console.timeEnd("[DSP] resetDataStore");
|
|
1127
|
+
}, [persistenceStorage]);
|
|
1128
|
+
const resetProvider = useCallback(
|
|
1129
|
+
async (provider) => {
|
|
1130
|
+
if (!persistenceStorage) return;
|
|
1131
|
+
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1132
|
+
},
|
|
1133
|
+
[persistenceStorage]
|
|
1134
|
+
);
|
|
1135
|
+
const initProvider = useCallback(
|
|
1136
|
+
async (id, data) => {
|
|
1137
|
+
const providerPreset = presetProviders[id];
|
|
1138
|
+
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1139
|
+
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1140
|
+
if (typeof prov !== "boolean") {
|
|
1141
|
+
return await registerProvider(prov);
|
|
1142
|
+
}
|
|
1143
|
+
return false;
|
|
1144
|
+
},
|
|
1145
|
+
[persistenceStorage, presetProviders, usePersistentStorage]
|
|
1146
|
+
);
|
|
1147
|
+
const dispatch = useCallback((action, data, callback) => {
|
|
1148
|
+
systemLog("dsp", "[DSP] DISPATCH Ukladam akci", action, ",", data);
|
|
1149
|
+
setDispatcher((prev) => ({
|
|
1150
|
+
isBussy: prev.isBussy,
|
|
1151
|
+
actions: [...prev.actions, { action, data, callback }]
|
|
1152
|
+
}));
|
|
1153
|
+
}, []);
|
|
1154
|
+
useEffect(() => {
|
|
1155
|
+
async function processDispatcher() {
|
|
1156
|
+
if (dispatcher.actions.length > 0) {
|
|
1157
|
+
let result;
|
|
1158
|
+
systemLog("dsp", "[DSP] DISPATCHER Zpracovavam", dispatcher.actions[0].action);
|
|
1159
|
+
const timeCode = uuid();
|
|
1160
|
+
console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1161
|
+
setDispatcher((prev) => ({ ...prev, isBussy: true }));
|
|
1162
|
+
const item = dispatcher.actions[0];
|
|
1163
|
+
switch (item.action) {
|
|
1164
|
+
case "registerProvider":
|
|
1165
|
+
await registerProvider(item.data);
|
|
1166
|
+
break;
|
|
1167
|
+
case "unregisterProvider":
|
|
1168
|
+
await unregisterProvider(item.data);
|
|
1169
|
+
break;
|
|
1170
|
+
case "updateDataStore":
|
|
1171
|
+
result = await updateDataStore(item.data);
|
|
1172
|
+
break;
|
|
1173
|
+
case "createDocument":
|
|
1174
|
+
console.log("Dispatcher createDocument", item.data);
|
|
1175
|
+
await createDocument(item.data);
|
|
1176
|
+
break;
|
|
1177
|
+
case "updateDocument":
|
|
1178
|
+
await updateDocument(item.data);
|
|
1179
|
+
break;
|
|
1180
|
+
case "updateDocuments":
|
|
1181
|
+
await updateDocuments(item.data);
|
|
1182
|
+
break;
|
|
1183
|
+
case "removeItem":
|
|
1184
|
+
break;
|
|
1185
|
+
case "deleteDocument":
|
|
1186
|
+
await deleteDocument(item.data);
|
|
1187
|
+
break;
|
|
1188
|
+
case "createProviderItem":
|
|
1189
|
+
result = await createProviderItem(item.data);
|
|
1190
|
+
break;
|
|
1191
|
+
case "deleteProviderItem":
|
|
1192
|
+
result = await deleteProviderItem(item.data);
|
|
1193
|
+
break;
|
|
1194
|
+
default:
|
|
1195
|
+
console.error("Unknown Action ", item.action, "Data: ", item.data);
|
|
1196
|
+
}
|
|
1197
|
+
item.callback && item.callback(result);
|
|
1198
|
+
setDispatcher((prev) => ({
|
|
1199
|
+
isBussy: false,
|
|
1200
|
+
actions: prev.actions.slice(1)
|
|
1201
|
+
}));
|
|
1202
|
+
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1203
|
+
}
|
|
1176
1204
|
}
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
systemLog("dsp", "updateDocuments -
|
|
1203
|
-
data.push(id);
|
|
1205
|
+
if (!dispatcher.isBussy) processDispatcher();
|
|
1206
|
+
}, [dispatcher]);
|
|
1207
|
+
const updateDocuments = useCallback(
|
|
1208
|
+
async ({
|
|
1209
|
+
model,
|
|
1210
|
+
documents: uDocuments,
|
|
1211
|
+
mode = "update"
|
|
1212
|
+
}) => {
|
|
1213
|
+
systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
|
|
1214
|
+
const modelProvider = providers[model];
|
|
1215
|
+
if (!modelProvider) {
|
|
1216
|
+
systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
let data = [...modelProvider.data || []];
|
|
1220
|
+
const documentsToPersist = [];
|
|
1221
|
+
const documentIdsToDelete = [];
|
|
1222
|
+
setDocuments((prev) => {
|
|
1223
|
+
console.time("updateDocuments");
|
|
1224
|
+
let newDocs = { ...prev };
|
|
1225
|
+
if (Array.isArray(uDocuments)) {
|
|
1226
|
+
uDocuments.forEach((document) => {
|
|
1227
|
+
const { id, ...doc } = document;
|
|
1228
|
+
switch (mode) {
|
|
1229
|
+
case "replace":
|
|
1230
|
+
systemLog("dsp", "updateDocuments - replace", id);
|
|
1204
1231
|
newDocs[id] = doc;
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1232
|
+
if (doc._deleted) {
|
|
1233
|
+
data = data.filter((d) => d !== id);
|
|
1234
|
+
documentIdsToDelete.push(id);
|
|
1235
|
+
delete newDocs[id];
|
|
1236
|
+
} else {
|
|
1237
|
+
if (!data.includes(id)) data.push(id);
|
|
1238
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1239
|
+
}
|
|
1240
|
+
break;
|
|
1241
|
+
case "update":
|
|
1242
|
+
default:
|
|
1243
|
+
if (!newDocs[id]) {
|
|
1244
|
+
systemLog("dsp", "updateDocuments - vytvarim", id);
|
|
1245
|
+
data.push(id);
|
|
1246
|
+
newDocs[id] = doc;
|
|
1247
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1248
|
+
} else if (doc._deleted) {
|
|
1249
|
+
systemLog("dsp", "updateDocuments - mazu", id);
|
|
1250
|
+
data = data.filter((d) => d !== id);
|
|
1251
|
+
documentIdsToDelete.push(id);
|
|
1252
|
+
delete newDocs[id];
|
|
1253
|
+
} else {
|
|
1254
|
+
systemLog("dsp", "updateDocuments - updatuji", id);
|
|
1255
|
+
newDocs[id] = { ...newDocs[id], ...doc };
|
|
1256
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1257
|
+
}
|
|
1258
|
+
break;
|
|
1259
|
+
}
|
|
1260
|
+
});
|
|
1261
|
+
} else {
|
|
1262
|
+
for (const key in uDocuments) {
|
|
1263
|
+
switch (mode) {
|
|
1264
|
+
case "replace":
|
|
1265
|
+
if (!newDocs[key]) {
|
|
1266
|
+
data.push(key);
|
|
1267
|
+
}
|
|
1268
|
+
if (uDocuments[key]._deleted) {
|
|
1269
|
+
data = data.filter((d) => d !== key);
|
|
1270
|
+
documentIdsToDelete.push(key);
|
|
1271
|
+
}
|
|
1241
1272
|
newDocs[key] = uDocuments[key];
|
|
1242
|
-
|
|
1273
|
+
if (uDocuments[key]._deleted) {
|
|
1274
|
+
delete newDocs[key];
|
|
1275
|
+
} else {
|
|
1276
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1277
|
+
}
|
|
1243
1278
|
break;
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1279
|
+
case "update":
|
|
1280
|
+
default:
|
|
1281
|
+
if (!newDocs[key]) {
|
|
1282
|
+
data.push(key);
|
|
1283
|
+
newDocs[key] = uDocuments[key];
|
|
1284
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1285
|
+
break;
|
|
1286
|
+
}
|
|
1287
|
+
if (uDocuments[key]._deleted) {
|
|
1288
|
+
data = data.filter((d) => d !== key);
|
|
1289
|
+
documentIdsToDelete.push(key);
|
|
1290
|
+
delete newDocs[key];
|
|
1291
|
+
} else {
|
|
1292
|
+
newDocs[key] = { ...newDocs[key], ...uDocuments[key] };
|
|
1293
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1294
|
+
}
|
|
1295
|
+
break;
|
|
1296
|
+
}
|
|
1254
1297
|
}
|
|
1255
1298
|
}
|
|
1299
|
+
console.timeEnd("updateDocuments");
|
|
1300
|
+
return newDocs;
|
|
1301
|
+
});
|
|
1302
|
+
const unique = uuid();
|
|
1303
|
+
setProviders((prev) => {
|
|
1304
|
+
const newP = { ...prev };
|
|
1305
|
+
newP[model] = {
|
|
1306
|
+
...newP[model],
|
|
1307
|
+
data,
|
|
1308
|
+
lastUpdate: { id: unique, time: /* @__PURE__ */ new Date() }
|
|
1309
|
+
};
|
|
1310
|
+
return newP;
|
|
1311
|
+
});
|
|
1312
|
+
if (modelProvider?.isPersisting && persistenceStorage) {
|
|
1313
|
+
await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));
|
|
1314
|
+
await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));
|
|
1256
1315
|
}
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
if (fields) {
|
|
1283
|
-
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1284
|
-
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1285
|
-
const provider = presetProviders[model];
|
|
1286
|
-
systemLog("dsp", "[updateDocument]", provider);
|
|
1287
|
-
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1288
|
-
if (dP) {
|
|
1289
|
-
const dataFromSource = await getData({
|
|
1290
|
-
id: dP.id,
|
|
1291
|
-
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1292
|
-
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1293
|
-
schema: dP.schema,
|
|
1294
|
-
SQLite: persistenceStorage || void 0
|
|
1295
|
-
});
|
|
1296
|
-
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1297
|
-
data = dataFromSource;
|
|
1316
|
+
},
|
|
1317
|
+
[providers, setDocuments, setProviders, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1318
|
+
);
|
|
1319
|
+
const updateDocument = useCallback(
|
|
1320
|
+
async ({ documentId, model, fields, data: pData }) => {
|
|
1321
|
+
systemLog("dsp", "[updateDocument]:", documentId, ", model:", model);
|
|
1322
|
+
let data = pData;
|
|
1323
|
+
if (typeof pData === "function") data = pData(documents[documentId]);
|
|
1324
|
+
if (fields) {
|
|
1325
|
+
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1326
|
+
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1327
|
+
const provider = presetProviders[model];
|
|
1328
|
+
systemLog("dsp", "[updateDocument]", provider);
|
|
1329
|
+
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1330
|
+
if (dP) {
|
|
1331
|
+
const dataFromSource = await getData({
|
|
1332
|
+
id: dP.id,
|
|
1333
|
+
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1334
|
+
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1335
|
+
schema: dP.schema,
|
|
1336
|
+
SQLite: persistenceStorage || void 0
|
|
1337
|
+
});
|
|
1338
|
+
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1339
|
+
data = dataFromSource;
|
|
1340
|
+
}
|
|
1298
1341
|
}
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1342
|
+
if (data) {
|
|
1343
|
+
var listeningProviders = 0;
|
|
1344
|
+
var isProvidersUpdated = false;
|
|
1345
|
+
const rand = uuid();
|
|
1346
|
+
setProviders((prev) => {
|
|
1347
|
+
systemLog("dsp", "[updateDocument] setProviders", rand);
|
|
1348
|
+
console.time("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1349
|
+
var newProviders = { ...prev };
|
|
1350
|
+
Object.keys(newProviders).forEach((key) => {
|
|
1351
|
+
const provider = newProviders[key];
|
|
1352
|
+
const providerNext = {
|
|
1353
|
+
...provider,
|
|
1354
|
+
data: Array.isArray(provider?.data) ? [...provider.data] : []
|
|
1355
|
+
};
|
|
1356
|
+
var socketListeners = providerNext.dataSource?.socketListeners || [];
|
|
1357
|
+
if (socketListeners.length === 0) {
|
|
1358
|
+
if (providerNext.data.includes(documentId)) {
|
|
1359
|
+
if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {
|
|
1360
|
+
systemLog("dsp", "[updateDocument] - zustava v Provider bez Listeners:", key);
|
|
1361
|
+
listeningProviders++;
|
|
1362
|
+
providerNext.lastUpdate = {
|
|
1363
|
+
id: uuid(),
|
|
1364
|
+
time: /* @__PURE__ */ new Date(),
|
|
1365
|
+
documentId
|
|
1366
|
+
};
|
|
1367
|
+
} else {
|
|
1368
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1369
|
+
isProvidersUpdated = true;
|
|
1370
|
+
providerNext.lastUpdate = {
|
|
1371
|
+
id: uuid(),
|
|
1372
|
+
time: /* @__PURE__ */ new Date(),
|
|
1373
|
+
documentId
|
|
1374
|
+
};
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
} else if (socketListeners.includes(model) || // socketListeners.includes(documentId) ||
|
|
1378
|
+
key === model) {
|
|
1379
|
+
if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {
|
|
1319
1380
|
listeningProviders++;
|
|
1320
1381
|
providerNext.lastUpdate = {
|
|
1321
1382
|
id: uuid(),
|
|
1322
1383
|
time: /* @__PURE__ */ new Date(),
|
|
1323
1384
|
documentId
|
|
1324
1385
|
};
|
|
1386
|
+
if (!providerNext.data.includes(documentId)) {
|
|
1387
|
+
providerNext.data.push(documentId);
|
|
1388
|
+
isProvidersUpdated = true;
|
|
1389
|
+
}
|
|
1325
1390
|
} else {
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1391
|
+
if (providerNext.data.includes(documentId)) {
|
|
1392
|
+
systemLog("dsp", "[updateDocument] - mazu:", key);
|
|
1393
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1394
|
+
isProvidersUpdated = true;
|
|
1395
|
+
providerNext.lastUpdate = {
|
|
1396
|
+
id: uuid(),
|
|
1397
|
+
time: /* @__PURE__ */ new Date(),
|
|
1398
|
+
documentId
|
|
1399
|
+
};
|
|
1400
|
+
}
|
|
1333
1401
|
}
|
|
1334
1402
|
}
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
}
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
isProvidersUpdated = true;
|
|
1353
|
-
providerNext.lastUpdate = {
|
|
1354
|
-
id: uuid(),
|
|
1355
|
-
time: /* @__PURE__ */ new Date(),
|
|
1356
|
-
documentId
|
|
1403
|
+
newProviders[key] = providerNext;
|
|
1404
|
+
});
|
|
1405
|
+
console.timeEnd("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1406
|
+
console.time("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1407
|
+
setDocuments((prev2) => {
|
|
1408
|
+
console.time("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1409
|
+
if (prev2[documentId]) {
|
|
1410
|
+
if (listeningProviders === 0) {
|
|
1411
|
+
const newD = { ...prev2 };
|
|
1412
|
+
delete newD[documentId];
|
|
1413
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1414
|
+
return newD;
|
|
1415
|
+
} else {
|
|
1416
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1417
|
+
return {
|
|
1418
|
+
...prev2,
|
|
1419
|
+
[documentId]: { ...prev2[documentId], ...data }
|
|
1357
1420
|
};
|
|
1358
1421
|
}
|
|
1422
|
+
} else if (listeningProviders > 0) {
|
|
1423
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1424
|
+
return { ...prev2, [documentId]: data };
|
|
1359
1425
|
}
|
|
1360
|
-
|
|
1361
|
-
|
|
1426
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1427
|
+
return prev2;
|
|
1428
|
+
});
|
|
1429
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1430
|
+
systemLog("dsp", "OUTSIDE", documentId);
|
|
1431
|
+
return newProviders;
|
|
1362
1432
|
});
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
if (prev2[documentId]) {
|
|
1433
|
+
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1434
|
+
if (isProvidersUpdated) {
|
|
1435
|
+
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1436
|
+
setCounterDocuments((prev) => {
|
|
1368
1437
|
if (listeningProviders === 0) {
|
|
1369
|
-
const newD = { ...
|
|
1438
|
+
const newD = { ...prev };
|
|
1370
1439
|
delete newD[documentId];
|
|
1371
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1372
1440
|
return newD;
|
|
1373
1441
|
} else {
|
|
1374
|
-
|
|
1375
|
-
return {
|
|
1376
|
-
...prev2,
|
|
1377
|
-
[documentId]: { ...prev2[documentId], ...data }
|
|
1378
|
-
};
|
|
1442
|
+
return { ...prev, [documentId]: listeningProviders };
|
|
1379
1443
|
}
|
|
1380
|
-
} else if (listeningProviders > 0) {
|
|
1381
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1382
|
-
return { ...prev2, [documentId]: data };
|
|
1383
|
-
}
|
|
1384
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1385
|
-
return prev2;
|
|
1386
|
-
});
|
|
1387
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1388
|
-
systemLog("dsp", "OUTSIDE", documentId);
|
|
1389
|
-
return newProviders;
|
|
1390
|
-
});
|
|
1391
|
-
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1392
|
-
if (isProvidersUpdated) {
|
|
1393
|
-
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1394
|
-
setCounterDocuments((prev) => {
|
|
1395
|
-
if (listeningProviders === 0) {
|
|
1396
|
-
const newD = { ...prev };
|
|
1397
|
-
delete newD[documentId];
|
|
1398
|
-
return newD;
|
|
1399
|
-
} else {
|
|
1400
|
-
return { ...prev, [documentId]: listeningProviders };
|
|
1401
|
-
}
|
|
1402
|
-
});
|
|
1403
|
-
} else {
|
|
1404
|
-
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1405
|
-
}
|
|
1406
|
-
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1407
|
-
if (listeningProviders > 0) {
|
|
1408
|
-
await persistDocument({
|
|
1409
|
-
documentId,
|
|
1410
|
-
model,
|
|
1411
|
-
data: { ...documents[documentId], ...data }
|
|
1412
1444
|
});
|
|
1413
1445
|
} else {
|
|
1414
|
-
|
|
1446
|
+
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1447
|
+
}
|
|
1448
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1449
|
+
if (listeningProviders > 0) {
|
|
1450
|
+
await persistDocument({
|
|
1451
|
+
documentId,
|
|
1452
|
+
model,
|
|
1453
|
+
data: { ...documents[documentId], ...data }
|
|
1454
|
+
});
|
|
1455
|
+
} else {
|
|
1456
|
+
await removePersistedDocument(documentId);
|
|
1457
|
+
}
|
|
1415
1458
|
}
|
|
1416
1459
|
}
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
async ({
|
|
1423
|
-
id,
|
|
1424
|
-
documentId,
|
|
1425
|
-
params,
|
|
1426
|
-
variant,
|
|
1427
|
-
data
|
|
1428
|
-
}) => {
|
|
1429
|
-
if (!providers[id]) {
|
|
1430
|
-
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1431
|
-
return;
|
|
1432
|
-
}
|
|
1433
|
-
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1434
|
-
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1435
|
-
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1436
|
-
} else updateDocument({ documentId, model: id, data });
|
|
1437
|
-
return true;
|
|
1438
|
-
}
|
|
1439
|
-
systemLog(
|
|
1440
|
-
"dsp",
|
|
1441
|
-
"[updateDataStore] Posilam patchData: ",
|
|
1460
|
+
},
|
|
1461
|
+
[documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1462
|
+
);
|
|
1463
|
+
const updateDataStore = useCallback(
|
|
1464
|
+
async ({
|
|
1442
1465
|
id,
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
"\n data: ",
|
|
1446
|
-
JSON.stringify(data, null, 2)
|
|
1447
|
-
);
|
|
1448
|
-
const result = await patchData({
|
|
1449
|
-
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1466
|
+
documentId,
|
|
1467
|
+
params,
|
|
1450
1468
|
variant,
|
|
1451
1469
|
data
|
|
1452
|
-
})
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1457
|
-
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1458
|
-
} else {
|
|
1459
|
-
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1470
|
+
}) => {
|
|
1471
|
+
if (!providers[id]) {
|
|
1472
|
+
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1473
|
+
return;
|
|
1460
1474
|
}
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
useEffect(() => {
|
|
1467
|
-
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1468
|
-
}, [dispatch, updateDocument]);
|
|
1469
|
-
const createDocument = useCallback(
|
|
1470
|
-
async ({ model, documentId, data }) => {
|
|
1471
|
-
const newDocument = data;
|
|
1472
|
-
systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1473
|
-
var providerListenersCount = 0;
|
|
1474
|
-
Object.keys(providers).forEach((key) => {
|
|
1475
|
-
const provider = providers[key];
|
|
1476
|
-
var socketListeners = provider.dataSource?.socketListeners;
|
|
1477
|
-
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1478
|
-
systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
|
|
1479
|
-
if (!provider.data.includes(documentId)) {
|
|
1480
|
-
providerListenersCount++;
|
|
1481
|
-
setProviders((prev) => ({
|
|
1482
|
-
...prev,
|
|
1483
|
-
[key]: {
|
|
1484
|
-
...prev[key],
|
|
1485
|
-
data: [...prev[key].data, documentId],
|
|
1486
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1487
|
-
}
|
|
1488
|
-
}));
|
|
1489
|
-
}
|
|
1475
|
+
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1476
|
+
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1477
|
+
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1478
|
+
} else updateDocument({ documentId, model: id, data });
|
|
1479
|
+
return true;
|
|
1490
1480
|
}
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1481
|
+
systemLog(
|
|
1482
|
+
"dsp",
|
|
1483
|
+
"[updateDataStore] Posilam patchData: ",
|
|
1484
|
+
id,
|
|
1485
|
+
",\n params: ",
|
|
1486
|
+
JSON.stringify(params, null, 2),
|
|
1487
|
+
"\n data: ",
|
|
1488
|
+
JSON.stringify(data, null, 2)
|
|
1489
|
+
);
|
|
1490
|
+
const result = await patchData({
|
|
1491
|
+
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1492
|
+
variant,
|
|
1493
|
+
data
|
|
1494
|
+
});
|
|
1495
|
+
if (typeof result === "object") {
|
|
1496
|
+
const { id: rDocumentId, ...document } = result;
|
|
1497
|
+
if (!isLive) {
|
|
1498
|
+
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1499
|
+
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1500
|
+
} else {
|
|
1501
|
+
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1502
|
+
}
|
|
1495
1503
|
}
|
|
1504
|
+
return result;
|
|
1505
|
+
},
|
|
1506
|
+
[providers, documents, isLive, updateDocument]
|
|
1507
|
+
);
|
|
1508
|
+
useEffect(() => {
|
|
1509
|
+
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1510
|
+
}, [dispatch, updateDocument]);
|
|
1511
|
+
const createDocument = useCallback(
|
|
1512
|
+
async ({ model, documentId, data }) => {
|
|
1513
|
+
const newDocument = data;
|
|
1514
|
+
console.log(`Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1515
|
+
var providerListenersCount = 0;
|
|
1516
|
+
Object.keys(providers).forEach((key) => {
|
|
1517
|
+
const provider = providers[key];
|
|
1518
|
+
var socketListeners = provider.dataSource?.socketListeners;
|
|
1519
|
+
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
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
|
+
});
|
|
1535
|
+
providerListenersCount++;
|
|
1536
|
+
setProviders((prev) => ({
|
|
1537
|
+
...prev,
|
|
1538
|
+
[key]: {
|
|
1539
|
+
...prev[key],
|
|
1540
|
+
data: [...prev[key].data, documentId],
|
|
1541
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1542
|
+
}
|
|
1543
|
+
}));
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
});
|
|
1547
|
+
console.log("Provider listeners count: ", providerListenersCount);
|
|
1548
|
+
if (providerListenersCount > 0) {
|
|
1549
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1550
|
+
console.log("Persistuji dokument ", documentId, " do modelu ", model);
|
|
1551
|
+
await persistDocument({ documentId, model, data: newDocument });
|
|
1552
|
+
}
|
|
1553
|
+
console.log("Dokument ", documentId, " zaregistrovan do ", providerListenersCount, " provideru");
|
|
1554
|
+
console.log(newDocument);
|
|
1555
|
+
return { id: documentId, document: newDocument };
|
|
1556
|
+
} else return false;
|
|
1557
|
+
},
|
|
1558
|
+
[providers, setProviders, setCounterDocuments, setDocuments, persistDocument, persistenceStorage]
|
|
1559
|
+
);
|
|
1560
|
+
const deleteDocument = useCallback(
|
|
1561
|
+
async ({ documentId }) => {
|
|
1562
|
+
console.log("Mazani dokumentu ", documentId);
|
|
1563
|
+
systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
|
|
1564
|
+
await removePersistedDocument(documentId);
|
|
1565
|
+
setDocuments((prev) => {
|
|
1566
|
+
const newDocs = { ...prev };
|
|
1567
|
+
systemLog("dsp", "[deleteDocument] MAZU ", documentId, " z ", newDocs);
|
|
1568
|
+
delete newDocs[documentId];
|
|
1569
|
+
systemLog("dsp", "[deleteDocument] NEW DOCS: ", newDocs);
|
|
1570
|
+
return newDocs;
|
|
1571
|
+
});
|
|
1496
1572
|
setCounterDocuments((prev) => {
|
|
1497
1573
|
const newC = { ...prev };
|
|
1498
|
-
|
|
1499
|
-
setDocuments((prev2) => ({
|
|
1500
|
-
...prev2,
|
|
1501
|
-
[documentId]: { ...prev2[documentId], ...newDocument }
|
|
1502
|
-
}));
|
|
1503
|
-
newC[documentId] = prev[documentId] + providerListenersCount;
|
|
1504
|
-
} else {
|
|
1505
|
-
setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
|
|
1506
|
-
newC[documentId] = providerListenersCount;
|
|
1507
|
-
}
|
|
1574
|
+
delete newC[documentId];
|
|
1508
1575
|
return newC;
|
|
1509
1576
|
});
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
});
|
|
1531
|
-
setProviders((prev) => {
|
|
1532
|
-
var deletedCount = 0;
|
|
1533
|
-
const updatedDataObj = { ...prev };
|
|
1534
|
-
for (const key in updatedDataObj) {
|
|
1535
|
-
const initialLength = updatedDataObj[key].data.length;
|
|
1536
|
-
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1537
|
-
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1538
|
-
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1539
|
-
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1577
|
+
setProviders((prev) => {
|
|
1578
|
+
var deletedCount = 0;
|
|
1579
|
+
const updatedDataObj = { ...prev };
|
|
1580
|
+
for (const key in updatedDataObj) {
|
|
1581
|
+
const initialLength = updatedDataObj[key].data.length;
|
|
1582
|
+
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1583
|
+
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1584
|
+
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1585
|
+
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1586
|
+
}
|
|
1587
|
+
return updatedDataObj;
|
|
1588
|
+
});
|
|
1589
|
+
},
|
|
1590
|
+
[setDocuments, setCounterDocuments, setProviders, removePersistedDocument]
|
|
1591
|
+
);
|
|
1592
|
+
const createProviderItem = useCallback(
|
|
1593
|
+
async ({ id, data }) => {
|
|
1594
|
+
if (!providers[id]) {
|
|
1595
|
+
systemLog("dsp", "[createProviderItem] Provider neexistuje:", id);
|
|
1596
|
+
return;
|
|
1540
1597
|
}
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
});
|
|
1578
|
-
return response;
|
|
1579
|
-
},
|
|
1580
|
-
[providers]
|
|
1581
|
-
);
|
|
1582
|
-
const registerProviderSockets = useCallback(
|
|
1583
|
-
(sockets2) => {
|
|
1584
|
-
if (sockets2) {
|
|
1585
|
-
systemLog("dsp", "[registerProviderSockets]", sockets2);
|
|
1586
|
-
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1598
|
+
if (!providers[id].dataSource) {
|
|
1599
|
+
const { id: dId, ...rData } = data;
|
|
1600
|
+
const documentId = dId || uuid();
|
|
1601
|
+
const result2 = createDocument({ model: id, documentId, data: rData });
|
|
1602
|
+
return result2;
|
|
1603
|
+
}
|
|
1604
|
+
const result = await postData({
|
|
1605
|
+
dataSource: providers[id].dataSource,
|
|
1606
|
+
schema: providers[id].schema,
|
|
1607
|
+
val: data
|
|
1608
|
+
});
|
|
1609
|
+
return result;
|
|
1610
|
+
},
|
|
1611
|
+
[providers, createDocument]
|
|
1612
|
+
);
|
|
1613
|
+
const deleteProviderItem = useCallback(
|
|
1614
|
+
async ({ providerId, data, params }) => {
|
|
1615
|
+
if (!providers[providerId]) {
|
|
1616
|
+
systemLog("dsp", "[deleteProviderItem] Provider neexistuje:", providerId);
|
|
1617
|
+
return;
|
|
1618
|
+
}
|
|
1619
|
+
const response = await deleteData({
|
|
1620
|
+
dataSource: renderJSONTemplate(providers[providerId].dataSource, params),
|
|
1621
|
+
// dataSource: providers[providerId].dataSource,
|
|
1622
|
+
data
|
|
1623
|
+
});
|
|
1624
|
+
return response;
|
|
1625
|
+
},
|
|
1626
|
+
[providers]
|
|
1627
|
+
);
|
|
1628
|
+
const registerProviderSockets = useCallback(
|
|
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];
|
|
1587
1634
|
setSockets((prev) => {
|
|
1588
1635
|
const newS = { ...prev };
|
|
1589
1636
|
d.forEach((item) => {
|
|
1590
1637
|
if (newS[item]) {
|
|
1591
|
-
|
|
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}`);
|
|
1642
|
+
} else {
|
|
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
|
+
);
|
|
1649
|
+
}
|
|
1592
1650
|
} else {
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
dispatch: currentDispatch,
|
|
1597
|
-
updateDocument: currentUpdateDocument
|
|
1598
|
-
});
|
|
1651
|
+
newS[item] = {
|
|
1652
|
+
filters: [{ filter: normalizedFilter, listeners: 1 }],
|
|
1653
|
+
data: []
|
|
1599
1654
|
};
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
socket.emit("joinRoom", item);
|
|
1603
|
-
socket.on(item, roomHandler);
|
|
1655
|
+
socket.emit("joinRoom", { room: item, filter: normalizedFilter });
|
|
1656
|
+
systemLog("dsp", `[registerProviderSockets] Nova room ${item}, filter: ${JSON.stringify(normalizedFilter)}`);
|
|
1604
1657
|
}
|
|
1605
1658
|
});
|
|
1606
1659
|
return newS;
|
|
1607
1660
|
});
|
|
1608
|
-
}
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1661
|
+
},
|
|
1662
|
+
[setSockets, socket]
|
|
1663
|
+
);
|
|
1664
|
+
const unregisterProviderSockets = useCallback(
|
|
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];
|
|
1674
|
+
setSockets((prev) => {
|
|
1675
|
+
const newS = { ...prev };
|
|
1676
|
+
const removeSocketListeners = [];
|
|
1677
|
+
d.forEach((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}`);
|
|
1626
1691
|
}
|
|
1627
|
-
|
|
1628
|
-
|
|
1692
|
+
if (newS[item].filters.length === 0) {
|
|
1693
|
+
removeSocketListeners.push(item);
|
|
1694
|
+
delete newS[item];
|
|
1695
|
+
systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
|
|
1696
|
+
}
|
|
1697
|
+
});
|
|
1698
|
+
if (removeSocketListeners.length > 0) {
|
|
1699
|
+
socket.emit("leaveRooms", removeSocketListeners);
|
|
1700
|
+
}
|
|
1701
|
+
return newS;
|
|
1629
1702
|
});
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
setCounterProviders((prev) => {
|
|
1642
|
-
if (!prev[id]) return prev;
|
|
1643
|
-
if (prev[id] + val > 0) {
|
|
1644
|
-
return {
|
|
1645
|
-
...prev,
|
|
1646
|
-
[id]: prev[id] + val
|
|
1647
|
-
};
|
|
1648
|
-
} else {
|
|
1703
|
+
},
|
|
1704
|
+
[setSockets, socket]
|
|
1705
|
+
);
|
|
1706
|
+
const updateProviderListeners = useCallback(
|
|
1707
|
+
async (id, val) => {
|
|
1708
|
+
systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
|
|
1709
|
+
setCounterProviders((prev) => {
|
|
1710
|
+
if (!prev[id]) return prev;
|
|
1711
|
+
if (prev[id] + val > 0) {
|
|
1712
|
+
return { ...prev, [id]: prev[id] + val };
|
|
1713
|
+
}
|
|
1649
1714
|
setProviders((prevP) => {
|
|
1650
1715
|
systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
|
|
1651
1716
|
setSockets((prevS) => {
|
|
1652
|
-
var removeSocketListeners = [];
|
|
1653
1717
|
const newS = { ...prevS };
|
|
1718
|
+
const removeSocketListeners = [];
|
|
1654
1719
|
const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
|
|
1720
|
+
const providerFilter = prevP[id].dataSource?.filter;
|
|
1721
|
+
const normalizedFilter = providerFilter ?? {};
|
|
1655
1722
|
providerSocketListeners.forEach((socketName) => {
|
|
1656
1723
|
if (!newS[socketName]) return;
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
}
|
|
1663
|
-
delete newS[socketName];
|
|
1664
|
-
removeSocketListeners.push(socketName);
|
|
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}`);
|
|
1665
1730
|
} else {
|
|
1666
|
-
|
|
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`);
|
|
1667
1738
|
}
|
|
1668
1739
|
});
|
|
1669
1740
|
if (removeSocketListeners.length > 0) {
|
|
1670
|
-
socket.emit("leaveRooms",
|
|
1741
|
+
socket.emit("leaveRooms", removeSocketListeners);
|
|
1671
1742
|
}
|
|
1672
1743
|
return newS;
|
|
1673
1744
|
});
|
|
@@ -1694,202 +1765,203 @@ var DataStoreProvider = ({ socketServer, restServer, usePersistentStorage = true
|
|
|
1694
1765
|
const newProvs = { ...prev };
|
|
1695
1766
|
delete newProvs[id];
|
|
1696
1767
|
return newProvs;
|
|
1697
|
-
}
|
|
1698
|
-
});
|
|
1699
|
-
},
|
|
1700
|
-
[setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
|
|
1701
|
-
);
|
|
1702
|
-
const registerProvider = useCallback(
|
|
1703
|
-
async (newItem) => {
|
|
1704
|
-
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1705
|
-
let result;
|
|
1706
|
-
const { id, ...provider } = newItem;
|
|
1707
|
-
if (providers[id]) {
|
|
1708
|
-
setCounterProviders((prev) => {
|
|
1709
|
-
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1710
|
-
return {
|
|
1711
|
-
...prev,
|
|
1712
|
-
[id]: prev[id] + 1
|
|
1713
|
-
};
|
|
1714
1768
|
});
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
if (!item) return;
|
|
1731
|
-
const { id: itId, ...data } = item;
|
|
1732
|
-
const normalizedId = itId || uuid();
|
|
1733
|
-
dataList.push(normalizedId);
|
|
1734
|
-
if (documents[normalizedId]) {
|
|
1735
|
-
items[normalizedId] = {
|
|
1736
|
-
...documents[normalizedId],
|
|
1737
|
-
...data
|
|
1738
|
-
};
|
|
1739
|
-
} else {
|
|
1740
|
-
items[normalizedId] = data;
|
|
1741
|
-
}
|
|
1769
|
+
},
|
|
1770
|
+
[setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
|
|
1771
|
+
);
|
|
1772
|
+
const registerProvider = useCallback(
|
|
1773
|
+
async (newItem) => {
|
|
1774
|
+
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1775
|
+
let result;
|
|
1776
|
+
const { id, ...provider } = newItem;
|
|
1777
|
+
if (providers[id]) {
|
|
1778
|
+
setCounterProviders((prev) => {
|
|
1779
|
+
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1780
|
+
return {
|
|
1781
|
+
...prev,
|
|
1782
|
+
[id]: prev[id] + 1
|
|
1783
|
+
};
|
|
1742
1784
|
});
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1785
|
+
result = providers[id];
|
|
1786
|
+
} else {
|
|
1787
|
+
try {
|
|
1788
|
+
const dataFromSource = await getData({
|
|
1789
|
+
schema: newItem.schema,
|
|
1790
|
+
dataSource: newItem.dataSource || {},
|
|
1791
|
+
id: newItem.id,
|
|
1792
|
+
isPersisting: !!newItem.isPersisting && !!persistenceStorage,
|
|
1793
|
+
SQLite: persistenceStorage || void 0
|
|
1794
|
+
});
|
|
1795
|
+
console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1796
|
+
var dataList = [];
|
|
1797
|
+
var items = {};
|
|
1798
|
+
const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];
|
|
1799
|
+
dataS.forEach((item) => {
|
|
1800
|
+
if (!item) return;
|
|
1801
|
+
const { id: itId, ...data } = item;
|
|
1802
|
+
const normalizedId = itId || uuid();
|
|
1803
|
+
dataList.push(normalizedId);
|
|
1804
|
+
if (documents[normalizedId]) {
|
|
1805
|
+
items[normalizedId] = {
|
|
1806
|
+
...documents[normalizedId],
|
|
1807
|
+
...data
|
|
1808
|
+
};
|
|
1748
1809
|
} else {
|
|
1749
|
-
|
|
1810
|
+
items[normalizedId] = data;
|
|
1750
1811
|
}
|
|
1751
1812
|
});
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1761
|
-
};
|
|
1762
|
-
setProviders((prev) => ({
|
|
1763
|
-
...prev,
|
|
1764
|
-
[id]: result
|
|
1765
|
-
}));
|
|
1766
|
-
setCounterProviders((prev) => ({
|
|
1767
|
-
...prev,
|
|
1768
|
-
[id]: 1
|
|
1769
|
-
}));
|
|
1770
|
-
if (provider.dataSource?.socketListeners) {
|
|
1771
|
-
registerProviderSockets(provider.dataSource.socketListeners);
|
|
1772
|
-
}
|
|
1773
|
-
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1774
|
-
} catch (error) {
|
|
1775
|
-
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1776
|
-
throw error;
|
|
1777
|
-
}
|
|
1778
|
-
}
|
|
1779
|
-
return result;
|
|
1780
|
-
},
|
|
1781
|
-
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1782
|
-
);
|
|
1783
|
-
const unregisterProvider = useCallback(
|
|
1784
|
-
async (itemId) => {
|
|
1785
|
-
setCounterProviders((prev) => {
|
|
1786
|
-
if (prev[itemId]) {
|
|
1787
|
-
if (prev[itemId] > 1) {
|
|
1788
|
-
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1789
|
-
return {
|
|
1790
|
-
...prev,
|
|
1791
|
-
[itemId]: prev[itemId] - 1
|
|
1792
|
-
};
|
|
1793
|
-
} else {
|
|
1794
|
-
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1795
|
-
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
|
|
1796
|
-
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1797
|
-
setCounterDocuments((cd) => {
|
|
1798
|
-
const newC = { ...cd };
|
|
1799
|
-
const deleteDocumentIds = [];
|
|
1800
|
-
providers[itemId].data.forEach((docId) => {
|
|
1801
|
-
if (newC[docId] <= 1) {
|
|
1802
|
-
deleteDocumentIds.push(docId);
|
|
1803
|
-
delete newC[docId];
|
|
1804
|
-
} else newC[docId] = newC[docId] - 1;
|
|
1813
|
+
setCounterDocuments((prev) => {
|
|
1814
|
+
const newC = { ...prev };
|
|
1815
|
+
dataList.forEach((itemId) => {
|
|
1816
|
+
if (newC[itemId]) {
|
|
1817
|
+
newC[itemId] = newC[itemId] + 1;
|
|
1818
|
+
} else {
|
|
1819
|
+
newC[itemId] = 1;
|
|
1820
|
+
}
|
|
1805
1821
|
});
|
|
1806
|
-
if (deleteDocumentIds.length > 0) {
|
|
1807
|
-
setDocuments((pd) => {
|
|
1808
|
-
const newD = { ...pd };
|
|
1809
|
-
deleteDocumentIds.forEach((docId) => {
|
|
1810
|
-
delete newD[docId];
|
|
1811
|
-
});
|
|
1812
|
-
return newD;
|
|
1813
|
-
});
|
|
1814
|
-
}
|
|
1815
1822
|
return newC;
|
|
1816
1823
|
});
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1824
|
+
if (Object.keys(items).length > 0) {
|
|
1825
|
+
setDocuments((prev) => ({ ...prev, ...items }));
|
|
1826
|
+
}
|
|
1827
|
+
result = {
|
|
1828
|
+
...provider,
|
|
1829
|
+
data: dataList,
|
|
1830
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1831
|
+
};
|
|
1832
|
+
setProviders((prev) => ({
|
|
1833
|
+
...prev,
|
|
1834
|
+
[id]: result
|
|
1835
|
+
}));
|
|
1836
|
+
setCounterProviders((prev) => ({
|
|
1837
|
+
...prev,
|
|
1838
|
+
[id]: 1
|
|
1839
|
+
}));
|
|
1840
|
+
if (provider.dataSource?.socketListeners) {
|
|
1841
|
+
registerProviderSockets(provider.dataSource.socketListeners, provider.dataSource.filter);
|
|
1842
|
+
}
|
|
1843
|
+
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1844
|
+
} catch (error) {
|
|
1845
|
+
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1846
|
+
throw error;
|
|
1825
1847
|
}
|
|
1826
|
-
}
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1848
|
+
}
|
|
1849
|
+
return result;
|
|
1850
|
+
},
|
|
1851
|
+
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1852
|
+
);
|
|
1853
|
+
const unregisterProvider = useCallback(
|
|
1854
|
+
async (itemId) => {
|
|
1855
|
+
setCounterProviders((prev) => {
|
|
1856
|
+
if (prev[itemId]) {
|
|
1857
|
+
if (prev[itemId] > 1) {
|
|
1858
|
+
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1859
|
+
return {
|
|
1860
|
+
...prev,
|
|
1861
|
+
[itemId]: prev[itemId] - 1
|
|
1862
|
+
};
|
|
1863
|
+
} else {
|
|
1864
|
+
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1865
|
+
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners, providers[itemId]?.dataSource.filter);
|
|
1866
|
+
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1867
|
+
setCounterDocuments((cd) => {
|
|
1868
|
+
const newC = { ...cd };
|
|
1869
|
+
const deleteDocumentIds = [];
|
|
1870
|
+
providers[itemId].data.forEach((docId) => {
|
|
1871
|
+
if (newC[docId] <= 1) {
|
|
1872
|
+
deleteDocumentIds.push(docId);
|
|
1873
|
+
delete newC[docId];
|
|
1874
|
+
} else newC[docId] = newC[docId] - 1;
|
|
1875
|
+
});
|
|
1876
|
+
if (deleteDocumentIds.length > 0) {
|
|
1877
|
+
setDocuments((pd) => {
|
|
1878
|
+
const newD = { ...pd };
|
|
1879
|
+
deleteDocumentIds.forEach((docId) => {
|
|
1880
|
+
delete newD[docId];
|
|
1881
|
+
});
|
|
1882
|
+
return newD;
|
|
1883
|
+
});
|
|
1884
|
+
}
|
|
1885
|
+
return newC;
|
|
1886
|
+
});
|
|
1887
|
+
setProviders((pp) => {
|
|
1888
|
+
const newProvs2 = { ...pp };
|
|
1889
|
+
delete newProvs2[itemId];
|
|
1890
|
+
return newProvs2;
|
|
1891
|
+
});
|
|
1892
|
+
const newProvs = { ...prev };
|
|
1893
|
+
delete newProvs[itemId];
|
|
1894
|
+
return newProvs;
|
|
1895
|
+
}
|
|
1896
|
+
} else return prev;
|
|
1897
|
+
});
|
|
1898
|
+
},
|
|
1899
|
+
[setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets]
|
|
1900
|
+
);
|
|
1901
|
+
const actionsValue = useMemo(
|
|
1902
|
+
() => ({
|
|
1903
|
+
dispatch,
|
|
1904
|
+
initProvider,
|
|
1905
|
+
resetProvider,
|
|
1906
|
+
registerProvider,
|
|
1907
|
+
unregisterProvider,
|
|
1908
|
+
updateProviderListeners,
|
|
1909
|
+
resetDataStore,
|
|
1910
|
+
startSockets,
|
|
1911
|
+
stopSockets,
|
|
1912
|
+
registerProviderSockets,
|
|
1913
|
+
unregisterProviderSockets,
|
|
1914
|
+
updateDocuments,
|
|
1915
|
+
presetProviders
|
|
1916
|
+
}),
|
|
1917
|
+
[
|
|
1918
|
+
dispatch,
|
|
1919
|
+
initProvider,
|
|
1920
|
+
resetProvider,
|
|
1921
|
+
registerProvider,
|
|
1922
|
+
unregisterProvider,
|
|
1923
|
+
updateProviderListeners,
|
|
1924
|
+
resetDataStore,
|
|
1925
|
+
startSockets,
|
|
1926
|
+
stopSockets,
|
|
1927
|
+
registerProviderSockets,
|
|
1928
|
+
unregisterProviderSockets,
|
|
1929
|
+
updateDocuments,
|
|
1930
|
+
presetProviders
|
|
1931
|
+
]
|
|
1932
|
+
);
|
|
1933
|
+
const metaValue = useMemo(
|
|
1934
|
+
() => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),
|
|
1935
|
+
[isLive, isSynchronizing, sockets, counterProviders, counterDocuments]
|
|
1936
|
+
);
|
|
1937
|
+
const stableValue = useMemo(
|
|
1938
|
+
() => ({
|
|
1939
|
+
dispatch,
|
|
1940
|
+
presetProviders,
|
|
1941
|
+
updateProviderListeners,
|
|
1942
|
+
subscribeToProvider,
|
|
1943
|
+
getProviderLastUpdate,
|
|
1944
|
+
getExternalDocuments,
|
|
1945
|
+
getExternalProviders
|
|
1946
|
+
}),
|
|
1947
|
+
[
|
|
1948
|
+
dispatch,
|
|
1949
|
+
presetProviders,
|
|
1950
|
+
updateProviderListeners,
|
|
1951
|
+
subscribeToProvider,
|
|
1952
|
+
getProviderLastUpdate,
|
|
1953
|
+
getExternalDocuments,
|
|
1954
|
+
getExternalProviders
|
|
1955
|
+
]
|
|
1956
|
+
);
|
|
1957
|
+
useImperativeHandle(ref, () => actionsValue, [actionsValue]);
|
|
1958
|
+
systemLog("dsp", "END");
|
|
1959
|
+
return (
|
|
1960
|
+
// <DatabaseProvider>
|
|
1961
|
+
/* @__PURE__ */ jsx(DataStoreStableContext.Provider, { value: stableValue, children: /* @__PURE__ */ jsx(DataStoreActionsContext.Provider, { value: actionsValue, children: /* @__PURE__ */ jsx(DataStoreProvidersContext.Provider, { value: providers, children: /* @__PURE__ */ jsx(DataStoreDocumentsContext.Provider, { value: documents, children: /* @__PURE__ */ jsx(DataStoreContext.Provider, { value: metaValue, children: props.children }) }) }) }) })
|
|
1962
|
+
);
|
|
1963
|
+
}
|
|
1964
|
+
);
|
|
1893
1965
|
var DataStoreProvider_default = DataStoreProvider;
|
|
1894
1966
|
|
|
1895
1967
|
// src/useDataProvider.tsx
|