@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.cjs
CHANGED
|
@@ -85,26 +85,32 @@ function systemLog(..._args) {
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
// src/handleSocketMessage.ts
|
|
88
|
-
var handleSocketMessage = (
|
|
89
|
-
const { dispatch
|
|
88
|
+
var handleSocketMessage = (msg, dataProvider) => {
|
|
89
|
+
const { dispatch } = dataProvider;
|
|
90
|
+
console.log("Mam socket message, data: ", msg);
|
|
90
91
|
const data = JSON.parse(msg);
|
|
91
92
|
switch (data.action) {
|
|
92
93
|
case "create":
|
|
93
94
|
systemLog("sockets", "[create] ", data.model, ", document: ", data.documentId);
|
|
95
|
+
console.log("[SOCKETS] CREATING model:", data.model, ", document: ", data.documentId, " data:", data.data);
|
|
94
96
|
dispatch?.("createDocument", { model: data.model, documentId: data.documentId, data: data.data });
|
|
95
97
|
break;
|
|
96
98
|
case "update":
|
|
99
|
+
console.log(`[SOCKETS] UPDATE model: ${data.model}, document: ${data.documentId}, data: `, data.data);
|
|
97
100
|
systemLog("sockets", `[update] ${JSON.stringify(data)}`);
|
|
98
101
|
if (Array.isArray(data.data)) dispatch?.("updateDocuments", { model: data.model, documents: data.data });
|
|
99
|
-
else
|
|
102
|
+
else {
|
|
103
|
+
dispatch?.("updateDocument", { model: data.model, documentId: data.documentId, data: data.data });
|
|
104
|
+
}
|
|
100
105
|
break;
|
|
101
106
|
case "delete":
|
|
107
|
+
console.log(`[SOCKETS] DELETE model: ${data.model}, document: ${data.documentId}`);
|
|
102
108
|
systemLog("sockets", "[delete] model:", data.model, ", document: ", data.documentId);
|
|
103
|
-
dispatch?.("deleteDocument", { documentId: data.documentId, data: data.data });
|
|
109
|
+
dispatch?.("deleteDocument", { model: data.model, documentId: data.documentId, data: data.data });
|
|
104
110
|
break;
|
|
105
111
|
case "deleteItem":
|
|
106
|
-
systemLog("sockets", "DELETE ITEM ", model, ", model: ", data.model, ", data: ", data.data);
|
|
107
|
-
dispatch?.("removeItem", { model, documentId: data.data.id });
|
|
112
|
+
systemLog("sockets", "DELETE ITEM ", data.model, ", model: ", data.model, ", data: ", data.data);
|
|
113
|
+
dispatch?.("removeItem", { model: data.model, documentId: data.data.id });
|
|
108
114
|
break;
|
|
109
115
|
default:
|
|
110
116
|
console.error(`Unknown command ${data.action}`);
|
|
@@ -512,12 +518,15 @@ function doesValueMatchFilter(objVal, value, documents = {}) {
|
|
|
512
518
|
}
|
|
513
519
|
}
|
|
514
520
|
function doesObjectMatchFilter(obj, filter, documents = {}) {
|
|
521
|
+
console.log("doesObjectMatchFilter", "Obj", JSON.stringify(obj, null, 2), "Filter", JSON.stringify(filter, null, 2));
|
|
515
522
|
if (!filter) return true;
|
|
516
523
|
if (Object.keys(filter)?.includes("$rule")) {
|
|
524
|
+
console.log("Pravidloo: ", filter.$rule);
|
|
517
525
|
const result2 = doesObjectMatchFilter(obj, filter.$rule, documents);
|
|
518
526
|
if (result2 === true) {
|
|
519
527
|
return result2;
|
|
520
528
|
} else {
|
|
529
|
+
console.log("Vracim chybovou message ", filter.$message);
|
|
521
530
|
return filter.$message || false;
|
|
522
531
|
}
|
|
523
532
|
}
|
|
@@ -666,11 +675,20 @@ var saveData = async ({
|
|
|
666
675
|
}
|
|
667
676
|
console.timeEnd(`[SQL] saveData ${providerId}`);
|
|
668
677
|
};
|
|
678
|
+
var serializeParams = (params) => {
|
|
679
|
+
return Object.fromEntries(
|
|
680
|
+
Object.entries(params).map(([key, value]) => [
|
|
681
|
+
key,
|
|
682
|
+
typeof value === "object" ? JSON.stringify(value) : value
|
|
683
|
+
])
|
|
684
|
+
);
|
|
685
|
+
};
|
|
669
686
|
var buildUri = ({
|
|
670
687
|
method,
|
|
671
688
|
dataSource,
|
|
672
689
|
variant
|
|
673
690
|
}) => {
|
|
691
|
+
console.log("[HANDLE DATA] BUILD URI method ", method, " from", dataSource);
|
|
674
692
|
if (dataSource.crud) {
|
|
675
693
|
if (method === "update" && dataSource.crud.updates) {
|
|
676
694
|
if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];
|
|
@@ -704,7 +722,7 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
|
|
|
704
722
|
console.time("Persisted Data");
|
|
705
723
|
const qDatum = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);
|
|
706
724
|
systemLog("axios", "SQLite.read Posledni datum update: ", qDatum[0]?.lastUpdate);
|
|
707
|
-
if (qDatum[0]?.lastUpdate) params.
|
|
725
|
+
if (qDatum[0]?.lastUpdate) params.changeTimeFrom = qDatum[0].lastUpdate;
|
|
708
726
|
persistedData = qDatum.map((item) => {
|
|
709
727
|
try {
|
|
710
728
|
const parsedData = typeof item.data === "string" ? JSON.parse(item.data) : item.data;
|
|
@@ -721,8 +739,8 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime
|
|
|
721
739
|
console.timeEnd("Persisted Data");
|
|
722
740
|
}
|
|
723
741
|
if (dataSource) {
|
|
724
|
-
|
|
725
|
-
const axiosResponse = await import_axios.default.get(buildUri({ dataSource, method: "read" }), { params });
|
|
742
|
+
console.log("Stahuji data z ", buildUri({ dataSource, method: "read" }), " s parametry ", params);
|
|
743
|
+
const axiosResponse = await import_axios.default.get(buildUri({ dataSource, method: "read" }), { params: serializeParams(params) });
|
|
726
744
|
if (schema && !dataSource.readAllFields) {
|
|
727
745
|
if (Array.isArray(axiosResponse.data.data)) {
|
|
728
746
|
newData = [];
|
|
@@ -957,796 +975,839 @@ var resolveLocale = () => {
|
|
|
957
975
|
}
|
|
958
976
|
return void 0;
|
|
959
977
|
};
|
|
960
|
-
var DataStoreProvider = (
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
978
|
+
var DataStoreProvider = (0, import_react.forwardRef)(
|
|
979
|
+
({ socketServer, restServer, usePersistentStorage = true, locale, storage = null, ...props }, ref) => {
|
|
980
|
+
const [isLive, setIsLive] = (0, import_react.useState)(false);
|
|
981
|
+
const [isSynchronizing, setIsSynchronizing] = (0, import_react.useState)(true);
|
|
982
|
+
const [sockets, setSockets] = (0, import_react.useState)({});
|
|
983
|
+
const [providers, setProviders] = (0, import_react.useState)({});
|
|
984
|
+
const [documents, setDocuments] = (0, import_react.useState)({});
|
|
985
|
+
const externalProvidersRef = (0, import_react.useRef)({});
|
|
986
|
+
const externalDocumentsRef = (0, import_react.useRef)({});
|
|
987
|
+
const providerSubscribersRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
|
|
988
|
+
const previousProviderUpdateIdsRef = (0, import_react.useRef)({});
|
|
989
|
+
const [dispatcher, setDispatcher] = (0, import_react.useState)({ isBussy: false, actions: [] });
|
|
990
|
+
const [counterProviders, setCounterProviders] = (0, import_react.useState)({});
|
|
991
|
+
const [counterDocuments, setCounterDocuments] = (0, import_react.useState)({});
|
|
992
|
+
const didInitialLiveSyncRef = (0, import_react.useRef)(false);
|
|
993
|
+
const persistenceStorage = (0, import_react.useMemo)(
|
|
994
|
+
() => usePersistentStorage ? storage : null,
|
|
995
|
+
[storage, usePersistentStorage]
|
|
996
|
+
);
|
|
997
|
+
(0, import_react.useEffect)(() => {
|
|
998
|
+
if (!restServer) return;
|
|
999
|
+
const resolvedLocale = locale || resolveLocale();
|
|
1000
|
+
import_axios2.default.defaults.baseURL = restServer;
|
|
1001
|
+
if (resolvedLocale) {
|
|
1002
|
+
import_axios2.default.defaults.headers.common["Accept-Language"] = resolvedLocale;
|
|
1003
|
+
}
|
|
1004
|
+
systemLog("dsp", "[INIT] Axios baseURL:", restServer);
|
|
1005
|
+
async function checkServer() {
|
|
1006
|
+
try {
|
|
1007
|
+
const response = await import_axios2.default.head("/", {
|
|
1008
|
+
timeout: 7e3,
|
|
1009
|
+
validateStatus: () => true
|
|
1010
|
+
});
|
|
1011
|
+
systemLog("dsp", "[INIT] Axios Success, status:", response.status);
|
|
1012
|
+
} catch (e) {
|
|
1013
|
+
if (import_axios2.default.isAxiosError(e)) {
|
|
1014
|
+
systemLog("dsp", "[INIT] Axios Error:", e.code ?? "UNKNOWN", e.message);
|
|
1015
|
+
} else {
|
|
1016
|
+
systemLog("dsp", "[INIT] Axios Error:", String(e));
|
|
1017
|
+
}
|
|
1018
|
+
} finally {
|
|
1019
|
+
systemLog("dsp", "[INIT] Axios check done");
|
|
998
1020
|
}
|
|
999
|
-
} finally {
|
|
1000
|
-
systemLog("dsp", "[INIT] Axios check done");
|
|
1001
1021
|
}
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
1008
|
-
}
|
|
1009
|
-
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
1010
|
-
const socketRoomHandlersRef = (0, import_react.useRef)({});
|
|
1011
|
-
const socketActionHandlersRef = (0, import_react.useRef)({});
|
|
1012
|
-
systemLog("dsp", "START");
|
|
1013
|
-
const socket = (0, import_react.useMemo)(() => (0, import_socket.io)(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
1014
|
-
const handleSocketConnect = (0, import_react.useCallback)(() => setIsLive(true), []);
|
|
1015
|
-
const handleSocketDisconnect = (0, import_react.useCallback)(() => setIsLive(false), []);
|
|
1016
|
-
const getSocketAuthToken = (0, import_react.useCallback)(() => {
|
|
1017
|
-
const authorizationHeader = import_axios2.default.defaults.headers.common["Authorization"];
|
|
1018
|
-
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
1019
|
-
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
1020
|
-
}
|
|
1021
|
-
return "Bearer ";
|
|
1022
|
-
}, []);
|
|
1023
|
-
const subscribeToProvider = (0, import_react.useCallback)((providerId, callback) => {
|
|
1024
|
-
const subscribersByProvider = providerSubscribersRef.current;
|
|
1025
|
-
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
1026
|
-
providerSubscribers.add(callback);
|
|
1027
|
-
subscribersByProvider.set(providerId, providerSubscribers);
|
|
1028
|
-
return () => {
|
|
1029
|
-
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
1030
|
-
if (!activeSubscribers) return;
|
|
1031
|
-
activeSubscribers.delete(callback);
|
|
1032
|
-
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
1033
|
-
};
|
|
1034
|
-
}, []);
|
|
1035
|
-
const getProviderLastUpdate = (0, import_react.useCallback)((providerId) => {
|
|
1036
|
-
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
1037
|
-
}, []);
|
|
1038
|
-
const getExternalDocuments = (0, import_react.useCallback)(() => externalDocumentsRef.current, []);
|
|
1039
|
-
const getExternalProviders = (0, import_react.useCallback)(() => externalProvidersRef.current, []);
|
|
1040
|
-
(0, import_react.useEffect)(() => {
|
|
1041
|
-
externalProvidersRef.current = providers;
|
|
1042
|
-
const currentUpdateIds = {};
|
|
1043
|
-
Object.keys(providers).forEach((providerId) => {
|
|
1044
|
-
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
1045
|
-
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
1046
|
-
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
1047
|
-
subscribers?.forEach((callback) => callback());
|
|
1022
|
+
checkServer();
|
|
1023
|
+
}, [locale, restServer]);
|
|
1024
|
+
(0, import_react.useEffect)(() => {
|
|
1025
|
+
if (usePersistentStorage && !storage) {
|
|
1026
|
+
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
1048
1027
|
}
|
|
1049
|
-
});
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1028
|
+
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
1029
|
+
const socketRoomHandlersRef = (0, import_react.useRef)({});
|
|
1030
|
+
const socketActionHandlersRef = (0, import_react.useRef)({});
|
|
1031
|
+
systemLog("dsp", "START");
|
|
1032
|
+
const socket = (0, import_react.useMemo)(() => (0, import_socket.io)(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
1033
|
+
const handleSocketConnect = (0, import_react.useCallback)(() => setIsLive(true), []);
|
|
1034
|
+
const handleSocketDisconnect = (0, import_react.useCallback)(() => setIsLive(false), []);
|
|
1035
|
+
const getSocketAuthToken = (0, import_react.useCallback)(() => {
|
|
1036
|
+
const authorizationHeader = import_axios2.default.defaults.headers.common["Authorization"];
|
|
1037
|
+
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
1038
|
+
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
1054
1039
|
}
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1040
|
+
return "Bearer ";
|
|
1041
|
+
}, []);
|
|
1042
|
+
const subscribeToProvider = (0, import_react.useCallback)((providerId, callback) => {
|
|
1043
|
+
const subscribersByProvider = providerSubscribersRef.current;
|
|
1044
|
+
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
1045
|
+
providerSubscribers.add(callback);
|
|
1046
|
+
subscribersByProvider.set(providerId, providerSubscribers);
|
|
1047
|
+
return () => {
|
|
1048
|
+
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
1049
|
+
if (!activeSubscribers) return;
|
|
1050
|
+
activeSubscribers.delete(callback);
|
|
1051
|
+
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
1052
|
+
};
|
|
1053
|
+
}, []);
|
|
1054
|
+
const getProviderLastUpdate = (0, import_react.useCallback)((providerId) => {
|
|
1055
|
+
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
1056
|
+
}, []);
|
|
1057
|
+
const getExternalDocuments = (0, import_react.useCallback)(() => externalDocumentsRef.current, []);
|
|
1058
|
+
const getExternalProviders = (0, import_react.useCallback)(() => externalProvidersRef.current, []);
|
|
1059
|
+
(0, import_react.useEffect)(() => {
|
|
1060
|
+
externalProvidersRef.current = providers;
|
|
1061
|
+
const currentUpdateIds = {};
|
|
1062
|
+
Object.keys(providers).forEach((providerId) => {
|
|
1063
|
+
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
1064
|
+
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
1065
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
1066
|
+
subscribers?.forEach((callback) => callback());
|
|
1067
|
+
}
|
|
1068
|
+
});
|
|
1069
|
+
Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {
|
|
1070
|
+
if (!(providerId in currentUpdateIds)) {
|
|
1071
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
1072
|
+
subscribers?.forEach((callback) => callback());
|
|
1073
|
+
}
|
|
1074
|
+
});
|
|
1075
|
+
previousProviderUpdateIdsRef.current = currentUpdateIds;
|
|
1076
|
+
}, [providers]);
|
|
1077
|
+
(0, import_react.useEffect)(() => {
|
|
1078
|
+
externalDocumentsRef.current = documents;
|
|
1079
|
+
}, [documents]);
|
|
1080
|
+
const persistDocument = (0, import_react.useCallback)(
|
|
1081
|
+
async ({
|
|
1070
1082
|
documentId,
|
|
1071
|
-
JSON.stringify(data),
|
|
1072
1083
|
model,
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1084
|
+
data,
|
|
1085
|
+
lastUpdate = (/* @__PURE__ */ new Date()).toISOString()
|
|
1086
|
+
}) => {
|
|
1087
|
+
if (!persistenceStorage) return;
|
|
1088
|
+
await persistenceStorage.query("INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)", [
|
|
1089
|
+
documentId,
|
|
1090
|
+
JSON.stringify(data),
|
|
1091
|
+
model,
|
|
1092
|
+
lastUpdate
|
|
1093
|
+
]);
|
|
1094
|
+
},
|
|
1095
|
+
[persistenceStorage]
|
|
1096
|
+
);
|
|
1097
|
+
const removePersistedDocument = (0, import_react.useCallback)(
|
|
1098
|
+
async (documentId) => {
|
|
1099
|
+
if (!persistenceStorage) return;
|
|
1100
|
+
await persistenceStorage.query("DELETE FROM documents WHERE id = ?", [documentId]);
|
|
1101
|
+
},
|
|
1102
|
+
[persistenceStorage]
|
|
1103
|
+
);
|
|
1104
|
+
const synchronizeDataStore = (0, import_react.useCallback)(async () => {
|
|
1105
|
+
setIsSynchronizing(true);
|
|
1106
|
+
const stats = { processed: 0, updated: 0, failed: 0 };
|
|
1107
|
+
try {
|
|
1108
|
+
for (const key of Object.keys(providers)) {
|
|
1109
|
+
stats.processed++;
|
|
1110
|
+
try {
|
|
1111
|
+
const { data, lastUpdate, ...rest } = providers[key];
|
|
1112
|
+
const response = await getData({
|
|
1113
|
+
id: key,
|
|
1114
|
+
...rest,
|
|
1115
|
+
changeTime: lastUpdate.time
|
|
1103
1116
|
});
|
|
1104
|
-
|
|
1105
|
-
|
|
1117
|
+
if (response.length > 0) {
|
|
1118
|
+
const updateData = {};
|
|
1119
|
+
response.forEach((item) => {
|
|
1120
|
+
const { id, ...d } = item;
|
|
1121
|
+
updateData[id] = d;
|
|
1122
|
+
});
|
|
1123
|
+
await updateDocuments({ model: key, documents: updateData, mode: "replace" });
|
|
1124
|
+
stats.updated++;
|
|
1125
|
+
}
|
|
1126
|
+
} catch (e) {
|
|
1127
|
+
stats.failed++;
|
|
1128
|
+
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1106
1129
|
}
|
|
1107
|
-
} catch (e) {
|
|
1108
|
-
stats.failed++;
|
|
1109
|
-
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1110
1130
|
}
|
|
1131
|
+
} finally {
|
|
1132
|
+
setIsSynchronizing(false);
|
|
1133
|
+
systemLog("dsp", "[synchronizeDataStore] Hotovo:", stats);
|
|
1111
1134
|
}
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1135
|
+
}, [providers]);
|
|
1136
|
+
(0, import_react.useEffect)(() => {
|
|
1137
|
+
if (isLive) {
|
|
1138
|
+
systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
|
|
1139
|
+
const roomsToJoin = Object.entries(sockets).flatMap(
|
|
1140
|
+
([roomName, socketItem]) => socketItem.filters.map(({ filter }) => ({ room: roomName, filter }))
|
|
1141
|
+
);
|
|
1142
|
+
console.log("Sokety pro p\u0159ipojen\xED:", roomsToJoin);
|
|
1143
|
+
systemLog("dsp", "useEffect[isLive] registruji", roomsToJoin);
|
|
1144
|
+
if (roomsToJoin.length > 0) socket.emit("joinRooms", roomsToJoin);
|
|
1145
|
+
if (!didInitialLiveSyncRef.current) {
|
|
1146
|
+
didInitialLiveSyncRef.current = true;
|
|
1147
|
+
systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
|
|
1148
|
+
synchronizeDataStore();
|
|
1149
|
+
}
|
|
1150
|
+
} else {
|
|
1151
|
+
didInitialLiveSyncRef.current = false;
|
|
1127
1152
|
}
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
const startSockets = (0, import_react.useCallback)(() => {
|
|
1142
|
-
socket.auth = {
|
|
1143
|
-
...socket.auth || {},
|
|
1144
|
-
...socketServer?.params?.auth || {},
|
|
1145
|
-
token: getSocketAuthToken()
|
|
1146
|
-
};
|
|
1147
|
-
systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
|
|
1148
|
-
socket.connect();
|
|
1149
|
-
}, [socket, socketServer?.params?.auth, getSocketAuthToken]);
|
|
1150
|
-
const stopSockets = (0, import_react.useCallback)(() => {
|
|
1151
|
-
systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
|
|
1152
|
-
socket.disconnect();
|
|
1153
|
-
}, [socket]);
|
|
1154
|
-
const resetDataStore = (0, import_react.useCallback)(async () => {
|
|
1155
|
-
console.time("[DSP] resetDataStore");
|
|
1156
|
-
if (persistenceStorage?.emptyTable) {
|
|
1157
|
-
await persistenceStorage.emptyTable("documents");
|
|
1158
|
-
}
|
|
1159
|
-
setSockets({});
|
|
1160
|
-
setProviders({});
|
|
1161
|
-
setDocuments({});
|
|
1162
|
-
setCounterProviders({});
|
|
1163
|
-
setCounterDocuments({});
|
|
1164
|
-
console.timeEnd("[DSP] resetDataStore");
|
|
1165
|
-
}, [persistenceStorage]);
|
|
1166
|
-
const resetProvider = (0, import_react.useCallback)(
|
|
1167
|
-
async (provider) => {
|
|
1168
|
-
if (!persistenceStorage) return;
|
|
1169
|
-
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1170
|
-
},
|
|
1171
|
-
[persistenceStorage]
|
|
1172
|
-
);
|
|
1173
|
-
const initProvider = (0, import_react.useCallback)(
|
|
1174
|
-
async (id, data) => {
|
|
1175
|
-
const providerPreset = presetProviders[id];
|
|
1176
|
-
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1177
|
-
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1178
|
-
if (typeof prov !== "boolean") {
|
|
1179
|
-
return await registerProvider(prov);
|
|
1153
|
+
}, [isLive, socket, sockets, synchronizeDataStore]);
|
|
1154
|
+
const presetProviders = props.providers;
|
|
1155
|
+
(0, import_react.useEffect)(() => {
|
|
1156
|
+
socket.on("connect", handleSocketConnect);
|
|
1157
|
+
socket.on("disconnect", handleSocketDisconnect);
|
|
1158
|
+
if (socketServer?.params?.socketEvents && socketServer.params.socketEvents.length > 0) {
|
|
1159
|
+
socketServer?.params?.socketEvents?.map(
|
|
1160
|
+
(event) => socket.on(event, (data) => handleSocketMessage(data, socketActionHandlersRef.current))
|
|
1161
|
+
);
|
|
1162
|
+
} else {
|
|
1163
|
+
socket.on("create", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
|
|
1164
|
+
socket.on("update", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
|
|
1165
|
+
socket.on("delete", (data) => handleSocketMessage(data, socketActionHandlersRef.current));
|
|
1180
1166
|
}
|
|
1181
|
-
return
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
await registerProvider(item.data);
|
|
1204
|
-
break;
|
|
1205
|
-
case "unregisterProvider":
|
|
1206
|
-
await unregisterProvider(item.data);
|
|
1207
|
-
break;
|
|
1208
|
-
case "updateDataStore":
|
|
1209
|
-
result = await updateDataStore(item.data);
|
|
1210
|
-
break;
|
|
1211
|
-
case "createDocument":
|
|
1212
|
-
await createDocument(item.data);
|
|
1213
|
-
break;
|
|
1214
|
-
case "updateDocument":
|
|
1215
|
-
await updateDocument(item.data);
|
|
1216
|
-
break;
|
|
1217
|
-
case "updateDocuments":
|
|
1218
|
-
await updateDocuments(item.data);
|
|
1219
|
-
break;
|
|
1220
|
-
case "removeItem":
|
|
1221
|
-
break;
|
|
1222
|
-
case "deleteDocument":
|
|
1223
|
-
await deleteDocument(item.data);
|
|
1224
|
-
break;
|
|
1225
|
-
case "createProviderItem":
|
|
1226
|
-
result = await createProviderItem(item.data);
|
|
1227
|
-
break;
|
|
1228
|
-
case "deleteProviderItem":
|
|
1229
|
-
result = await deleteProviderItem(item.data);
|
|
1230
|
-
break;
|
|
1231
|
-
default:
|
|
1232
|
-
console.error("Unknown Action ", item.action, "Data: ", item.data);
|
|
1233
|
-
}
|
|
1234
|
-
item.callback && item.callback(result);
|
|
1235
|
-
setDispatcher((prev) => ({
|
|
1236
|
-
isBussy: false,
|
|
1237
|
-
actions: prev.actions.slice(1)
|
|
1238
|
-
}));
|
|
1239
|
-
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1167
|
+
return () => {
|
|
1168
|
+
socket.off("connect", handleSocketConnect);
|
|
1169
|
+
socket.off("disconnect", handleSocketDisconnect);
|
|
1170
|
+
};
|
|
1171
|
+
}, [socket, handleSocketConnect, handleSocketDisconnect]);
|
|
1172
|
+
const startSockets = (0, import_react.useCallback)(() => {
|
|
1173
|
+
socket.auth = {
|
|
1174
|
+
...socket.auth || {},
|
|
1175
|
+
...socketServer?.params?.auth || {},
|
|
1176
|
+
token: getSocketAuthToken()
|
|
1177
|
+
};
|
|
1178
|
+
systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
|
|
1179
|
+
socket.connect();
|
|
1180
|
+
}, [socket, socketServer?.params?.auth, getSocketAuthToken]);
|
|
1181
|
+
const stopSockets = (0, import_react.useCallback)(() => {
|
|
1182
|
+
systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
|
|
1183
|
+
socket.disconnect();
|
|
1184
|
+
}, [socket]);
|
|
1185
|
+
const resetDataStore = (0, import_react.useCallback)(async () => {
|
|
1186
|
+
console.time("[DSP] resetDataStore");
|
|
1187
|
+
if (persistenceStorage?.emptyTable) {
|
|
1188
|
+
await persistenceStorage.emptyTable("documents");
|
|
1240
1189
|
}
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1190
|
+
setSockets({});
|
|
1191
|
+
setProviders({});
|
|
1192
|
+
setDocuments({});
|
|
1193
|
+
setCounterProviders({});
|
|
1194
|
+
setCounterDocuments({});
|
|
1195
|
+
console.timeEnd("[DSP] resetDataStore");
|
|
1196
|
+
}, [persistenceStorage]);
|
|
1197
|
+
const resetProvider = (0, import_react.useCallback)(
|
|
1198
|
+
async (provider) => {
|
|
1199
|
+
if (!persistenceStorage) return;
|
|
1200
|
+
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1201
|
+
},
|
|
1202
|
+
[persistenceStorage]
|
|
1203
|
+
);
|
|
1204
|
+
const initProvider = (0, import_react.useCallback)(
|
|
1205
|
+
async (id, data) => {
|
|
1206
|
+
const providerPreset = presetProviders[id];
|
|
1207
|
+
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1208
|
+
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1209
|
+
if (typeof prov !== "boolean") {
|
|
1210
|
+
return await registerProvider(prov);
|
|
1211
|
+
}
|
|
1212
|
+
return false;
|
|
1213
|
+
},
|
|
1214
|
+
[persistenceStorage, presetProviders, usePersistentStorage]
|
|
1215
|
+
);
|
|
1216
|
+
const dispatch = (0, import_react.useCallback)((action, data, callback) => {
|
|
1217
|
+
systemLog("dsp", "[DSP] DISPATCH Ukladam akci", action, ",", data);
|
|
1218
|
+
setDispatcher((prev) => ({
|
|
1219
|
+
isBussy: prev.isBussy,
|
|
1220
|
+
actions: [...prev.actions, { action, data, callback }]
|
|
1221
|
+
}));
|
|
1222
|
+
}, []);
|
|
1223
|
+
(0, import_react.useEffect)(() => {
|
|
1224
|
+
async function processDispatcher() {
|
|
1225
|
+
if (dispatcher.actions.length > 0) {
|
|
1226
|
+
let result;
|
|
1227
|
+
systemLog("dsp", "[DSP] DISPATCHER Zpracovavam", dispatcher.actions[0].action);
|
|
1228
|
+
const timeCode = uuid();
|
|
1229
|
+
console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1230
|
+
setDispatcher((prev) => ({ ...prev, isBussy: true }));
|
|
1231
|
+
const item = dispatcher.actions[0];
|
|
1232
|
+
switch (item.action) {
|
|
1233
|
+
case "registerProvider":
|
|
1234
|
+
await registerProvider(item.data);
|
|
1235
|
+
break;
|
|
1236
|
+
case "unregisterProvider":
|
|
1237
|
+
await unregisterProvider(item.data);
|
|
1238
|
+
break;
|
|
1239
|
+
case "updateDataStore":
|
|
1240
|
+
result = await updateDataStore(item.data);
|
|
1241
|
+
break;
|
|
1242
|
+
case "createDocument":
|
|
1243
|
+
console.log("Dispatcher createDocument", item.data);
|
|
1244
|
+
await createDocument(item.data);
|
|
1245
|
+
break;
|
|
1246
|
+
case "updateDocument":
|
|
1247
|
+
await updateDocument(item.data);
|
|
1248
|
+
break;
|
|
1249
|
+
case "updateDocuments":
|
|
1250
|
+
await updateDocuments(item.data);
|
|
1251
|
+
break;
|
|
1252
|
+
case "removeItem":
|
|
1253
|
+
break;
|
|
1254
|
+
case "deleteDocument":
|
|
1255
|
+
await deleteDocument(item.data);
|
|
1256
|
+
break;
|
|
1257
|
+
case "createProviderItem":
|
|
1258
|
+
result = await createProviderItem(item.data);
|
|
1259
|
+
break;
|
|
1260
|
+
case "deleteProviderItem":
|
|
1261
|
+
result = await deleteProviderItem(item.data);
|
|
1262
|
+
break;
|
|
1263
|
+
default:
|
|
1264
|
+
console.error("Unknown Action ", item.action, "Data: ", item.data);
|
|
1265
|
+
}
|
|
1266
|
+
item.callback && item.callback(result);
|
|
1267
|
+
setDispatcher((prev) => ({
|
|
1268
|
+
isBussy: false,
|
|
1269
|
+
actions: prev.actions.slice(1)
|
|
1270
|
+
}));
|
|
1271
|
+
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1272
|
+
}
|
|
1255
1273
|
}
|
|
1256
|
-
|
|
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
|
-
systemLog("dsp", "updateDocuments -
|
|
1282
|
-
data.push(id);
|
|
1274
|
+
if (!dispatcher.isBussy) processDispatcher();
|
|
1275
|
+
}, [dispatcher]);
|
|
1276
|
+
const updateDocuments = (0, import_react.useCallback)(
|
|
1277
|
+
async ({
|
|
1278
|
+
model,
|
|
1279
|
+
documents: uDocuments,
|
|
1280
|
+
mode = "update"
|
|
1281
|
+
}) => {
|
|
1282
|
+
systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
|
|
1283
|
+
const modelProvider = providers[model];
|
|
1284
|
+
if (!modelProvider) {
|
|
1285
|
+
systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
|
|
1286
|
+
return;
|
|
1287
|
+
}
|
|
1288
|
+
let data = [...modelProvider.data || []];
|
|
1289
|
+
const documentsToPersist = [];
|
|
1290
|
+
const documentIdsToDelete = [];
|
|
1291
|
+
setDocuments((prev) => {
|
|
1292
|
+
console.time("updateDocuments");
|
|
1293
|
+
let newDocs = { ...prev };
|
|
1294
|
+
if (Array.isArray(uDocuments)) {
|
|
1295
|
+
uDocuments.forEach((document) => {
|
|
1296
|
+
const { id, ...doc } = document;
|
|
1297
|
+
switch (mode) {
|
|
1298
|
+
case "replace":
|
|
1299
|
+
systemLog("dsp", "updateDocuments - replace", id);
|
|
1283
1300
|
newDocs[id] = doc;
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1301
|
+
if (doc._deleted) {
|
|
1302
|
+
data = data.filter((d) => d !== id);
|
|
1303
|
+
documentIdsToDelete.push(id);
|
|
1304
|
+
delete newDocs[id];
|
|
1305
|
+
} else {
|
|
1306
|
+
if (!data.includes(id)) data.push(id);
|
|
1307
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1308
|
+
}
|
|
1309
|
+
break;
|
|
1310
|
+
case "update":
|
|
1311
|
+
default:
|
|
1312
|
+
if (!newDocs[id]) {
|
|
1313
|
+
systemLog("dsp", "updateDocuments - vytvarim", id);
|
|
1314
|
+
data.push(id);
|
|
1315
|
+
newDocs[id] = doc;
|
|
1316
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1317
|
+
} else if (doc._deleted) {
|
|
1318
|
+
systemLog("dsp", "updateDocuments - mazu", id);
|
|
1319
|
+
data = data.filter((d) => d !== id);
|
|
1320
|
+
documentIdsToDelete.push(id);
|
|
1321
|
+
delete newDocs[id];
|
|
1322
|
+
} else {
|
|
1323
|
+
systemLog("dsp", "updateDocuments - updatuji", id);
|
|
1324
|
+
newDocs[id] = { ...newDocs[id], ...doc };
|
|
1325
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1326
|
+
}
|
|
1327
|
+
break;
|
|
1328
|
+
}
|
|
1329
|
+
});
|
|
1330
|
+
} else {
|
|
1331
|
+
for (const key in uDocuments) {
|
|
1332
|
+
switch (mode) {
|
|
1333
|
+
case "replace":
|
|
1334
|
+
if (!newDocs[key]) {
|
|
1335
|
+
data.push(key);
|
|
1336
|
+
}
|
|
1337
|
+
if (uDocuments[key]._deleted) {
|
|
1338
|
+
data = data.filter((d) => d !== key);
|
|
1339
|
+
documentIdsToDelete.push(key);
|
|
1340
|
+
}
|
|
1320
1341
|
newDocs[key] = uDocuments[key];
|
|
1321
|
-
|
|
1342
|
+
if (uDocuments[key]._deleted) {
|
|
1343
|
+
delete newDocs[key];
|
|
1344
|
+
} else {
|
|
1345
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1346
|
+
}
|
|
1322
1347
|
break;
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1348
|
+
case "update":
|
|
1349
|
+
default:
|
|
1350
|
+
if (!newDocs[key]) {
|
|
1351
|
+
data.push(key);
|
|
1352
|
+
newDocs[key] = uDocuments[key];
|
|
1353
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1354
|
+
break;
|
|
1355
|
+
}
|
|
1356
|
+
if (uDocuments[key]._deleted) {
|
|
1357
|
+
data = data.filter((d) => d !== key);
|
|
1358
|
+
documentIdsToDelete.push(key);
|
|
1359
|
+
delete newDocs[key];
|
|
1360
|
+
} else {
|
|
1361
|
+
newDocs[key] = { ...newDocs[key], ...uDocuments[key] };
|
|
1362
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1363
|
+
}
|
|
1364
|
+
break;
|
|
1365
|
+
}
|
|
1333
1366
|
}
|
|
1334
1367
|
}
|
|
1368
|
+
console.timeEnd("updateDocuments");
|
|
1369
|
+
return newDocs;
|
|
1370
|
+
});
|
|
1371
|
+
const unique = uuid();
|
|
1372
|
+
setProviders((prev) => {
|
|
1373
|
+
const newP = { ...prev };
|
|
1374
|
+
newP[model] = {
|
|
1375
|
+
...newP[model],
|
|
1376
|
+
data,
|
|
1377
|
+
lastUpdate: { id: unique, time: /* @__PURE__ */ new Date() }
|
|
1378
|
+
};
|
|
1379
|
+
return newP;
|
|
1380
|
+
});
|
|
1381
|
+
if (modelProvider?.isPersisting && persistenceStorage) {
|
|
1382
|
+
await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));
|
|
1383
|
+
await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));
|
|
1335
1384
|
}
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
if (fields) {
|
|
1362
|
-
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1363
|
-
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1364
|
-
const provider = presetProviders[model];
|
|
1365
|
-
systemLog("dsp", "[updateDocument]", provider);
|
|
1366
|
-
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1367
|
-
if (dP) {
|
|
1368
|
-
const dataFromSource = await getData({
|
|
1369
|
-
id: dP.id,
|
|
1370
|
-
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1371
|
-
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1372
|
-
schema: dP.schema,
|
|
1373
|
-
SQLite: persistenceStorage || void 0
|
|
1374
|
-
});
|
|
1375
|
-
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1376
|
-
data = dataFromSource;
|
|
1385
|
+
},
|
|
1386
|
+
[providers, setDocuments, setProviders, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1387
|
+
);
|
|
1388
|
+
const updateDocument = (0, import_react.useCallback)(
|
|
1389
|
+
async ({ documentId, model, fields, data: pData }) => {
|
|
1390
|
+
systemLog("dsp", "[updateDocument]:", documentId, ", model:", model);
|
|
1391
|
+
let data = pData;
|
|
1392
|
+
if (typeof pData === "function") data = pData(documents[documentId]);
|
|
1393
|
+
if (fields) {
|
|
1394
|
+
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1395
|
+
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1396
|
+
const provider = presetProviders[model];
|
|
1397
|
+
systemLog("dsp", "[updateDocument]", provider);
|
|
1398
|
+
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1399
|
+
if (dP) {
|
|
1400
|
+
const dataFromSource = await getData({
|
|
1401
|
+
id: dP.id,
|
|
1402
|
+
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1403
|
+
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1404
|
+
schema: dP.schema,
|
|
1405
|
+
SQLite: persistenceStorage || void 0
|
|
1406
|
+
});
|
|
1407
|
+
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1408
|
+
data = dataFromSource;
|
|
1409
|
+
}
|
|
1377
1410
|
}
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1411
|
+
if (data) {
|
|
1412
|
+
var listeningProviders = 0;
|
|
1413
|
+
var isProvidersUpdated = false;
|
|
1414
|
+
const rand = uuid();
|
|
1415
|
+
setProviders((prev) => {
|
|
1416
|
+
systemLog("dsp", "[updateDocument] setProviders", rand);
|
|
1417
|
+
console.time("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1418
|
+
var newProviders = { ...prev };
|
|
1419
|
+
Object.keys(newProviders).forEach((key) => {
|
|
1420
|
+
const provider = newProviders[key];
|
|
1421
|
+
const providerNext = {
|
|
1422
|
+
...provider,
|
|
1423
|
+
data: Array.isArray(provider?.data) ? [...provider.data] : []
|
|
1424
|
+
};
|
|
1425
|
+
var socketListeners = providerNext.dataSource?.socketListeners || [];
|
|
1426
|
+
if (socketListeners.length === 0) {
|
|
1427
|
+
if (providerNext.data.includes(documentId)) {
|
|
1428
|
+
if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {
|
|
1429
|
+
systemLog("dsp", "[updateDocument] - zustava v Provider bez Listeners:", key);
|
|
1430
|
+
listeningProviders++;
|
|
1431
|
+
providerNext.lastUpdate = {
|
|
1432
|
+
id: uuid(),
|
|
1433
|
+
time: /* @__PURE__ */ new Date(),
|
|
1434
|
+
documentId
|
|
1435
|
+
};
|
|
1436
|
+
} else {
|
|
1437
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1438
|
+
isProvidersUpdated = true;
|
|
1439
|
+
providerNext.lastUpdate = {
|
|
1440
|
+
id: uuid(),
|
|
1441
|
+
time: /* @__PURE__ */ new Date(),
|
|
1442
|
+
documentId
|
|
1443
|
+
};
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
} else if (socketListeners.includes(model) || // socketListeners.includes(documentId) ||
|
|
1447
|
+
key === model) {
|
|
1448
|
+
if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {
|
|
1398
1449
|
listeningProviders++;
|
|
1399
1450
|
providerNext.lastUpdate = {
|
|
1400
1451
|
id: uuid(),
|
|
1401
1452
|
time: /* @__PURE__ */ new Date(),
|
|
1402
1453
|
documentId
|
|
1403
1454
|
};
|
|
1455
|
+
if (!providerNext.data.includes(documentId)) {
|
|
1456
|
+
providerNext.data.push(documentId);
|
|
1457
|
+
isProvidersUpdated = true;
|
|
1458
|
+
}
|
|
1404
1459
|
} else {
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1460
|
+
if (providerNext.data.includes(documentId)) {
|
|
1461
|
+
systemLog("dsp", "[updateDocument] - mazu:", key);
|
|
1462
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1463
|
+
isProvidersUpdated = true;
|
|
1464
|
+
providerNext.lastUpdate = {
|
|
1465
|
+
id: uuid(),
|
|
1466
|
+
time: /* @__PURE__ */ new Date(),
|
|
1467
|
+
documentId
|
|
1468
|
+
};
|
|
1469
|
+
}
|
|
1412
1470
|
}
|
|
1413
1471
|
}
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
}
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
isProvidersUpdated = true;
|
|
1432
|
-
providerNext.lastUpdate = {
|
|
1433
|
-
id: uuid(),
|
|
1434
|
-
time: /* @__PURE__ */ new Date(),
|
|
1435
|
-
documentId
|
|
1472
|
+
newProviders[key] = providerNext;
|
|
1473
|
+
});
|
|
1474
|
+
console.timeEnd("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1475
|
+
console.time("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1476
|
+
setDocuments((prev2) => {
|
|
1477
|
+
console.time("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1478
|
+
if (prev2[documentId]) {
|
|
1479
|
+
if (listeningProviders === 0) {
|
|
1480
|
+
const newD = { ...prev2 };
|
|
1481
|
+
delete newD[documentId];
|
|
1482
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1483
|
+
return newD;
|
|
1484
|
+
} else {
|
|
1485
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1486
|
+
return {
|
|
1487
|
+
...prev2,
|
|
1488
|
+
[documentId]: { ...prev2[documentId], ...data }
|
|
1436
1489
|
};
|
|
1437
1490
|
}
|
|
1491
|
+
} else if (listeningProviders > 0) {
|
|
1492
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1493
|
+
return { ...prev2, [documentId]: data };
|
|
1438
1494
|
}
|
|
1439
|
-
|
|
1440
|
-
|
|
1495
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1496
|
+
return prev2;
|
|
1497
|
+
});
|
|
1498
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1499
|
+
systemLog("dsp", "OUTSIDE", documentId);
|
|
1500
|
+
return newProviders;
|
|
1441
1501
|
});
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
if (prev2[documentId]) {
|
|
1502
|
+
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1503
|
+
if (isProvidersUpdated) {
|
|
1504
|
+
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1505
|
+
setCounterDocuments((prev) => {
|
|
1447
1506
|
if (listeningProviders === 0) {
|
|
1448
|
-
const newD = { ...
|
|
1507
|
+
const newD = { ...prev };
|
|
1449
1508
|
delete newD[documentId];
|
|
1450
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1451
1509
|
return newD;
|
|
1452
1510
|
} else {
|
|
1453
|
-
|
|
1454
|
-
return {
|
|
1455
|
-
...prev2,
|
|
1456
|
-
[documentId]: { ...prev2[documentId], ...data }
|
|
1457
|
-
};
|
|
1511
|
+
return { ...prev, [documentId]: listeningProviders };
|
|
1458
1512
|
}
|
|
1459
|
-
} else if (listeningProviders > 0) {
|
|
1460
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1461
|
-
return { ...prev2, [documentId]: data };
|
|
1462
|
-
}
|
|
1463
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1464
|
-
return prev2;
|
|
1465
|
-
});
|
|
1466
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1467
|
-
systemLog("dsp", "OUTSIDE", documentId);
|
|
1468
|
-
return newProviders;
|
|
1469
|
-
});
|
|
1470
|
-
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1471
|
-
if (isProvidersUpdated) {
|
|
1472
|
-
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1473
|
-
setCounterDocuments((prev) => {
|
|
1474
|
-
if (listeningProviders === 0) {
|
|
1475
|
-
const newD = { ...prev };
|
|
1476
|
-
delete newD[documentId];
|
|
1477
|
-
return newD;
|
|
1478
|
-
} else {
|
|
1479
|
-
return { ...prev, [documentId]: listeningProviders };
|
|
1480
|
-
}
|
|
1481
|
-
});
|
|
1482
|
-
} else {
|
|
1483
|
-
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1484
|
-
}
|
|
1485
|
-
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1486
|
-
if (listeningProviders > 0) {
|
|
1487
|
-
await persistDocument({
|
|
1488
|
-
documentId,
|
|
1489
|
-
model,
|
|
1490
|
-
data: { ...documents[documentId], ...data }
|
|
1491
1513
|
});
|
|
1492
1514
|
} else {
|
|
1493
|
-
|
|
1515
|
+
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1516
|
+
}
|
|
1517
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1518
|
+
if (listeningProviders > 0) {
|
|
1519
|
+
await persistDocument({
|
|
1520
|
+
documentId,
|
|
1521
|
+
model,
|
|
1522
|
+
data: { ...documents[documentId], ...data }
|
|
1523
|
+
});
|
|
1524
|
+
} else {
|
|
1525
|
+
await removePersistedDocument(documentId);
|
|
1526
|
+
}
|
|
1494
1527
|
}
|
|
1495
1528
|
}
|
|
1496
|
-
}
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
async ({
|
|
1502
|
-
id,
|
|
1503
|
-
documentId,
|
|
1504
|
-
params,
|
|
1505
|
-
variant,
|
|
1506
|
-
data
|
|
1507
|
-
}) => {
|
|
1508
|
-
if (!providers[id]) {
|
|
1509
|
-
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1510
|
-
return;
|
|
1511
|
-
}
|
|
1512
|
-
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1513
|
-
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1514
|
-
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1515
|
-
} else updateDocument({ documentId, model: id, data });
|
|
1516
|
-
return true;
|
|
1517
|
-
}
|
|
1518
|
-
systemLog(
|
|
1519
|
-
"dsp",
|
|
1520
|
-
"[updateDataStore] Posilam patchData: ",
|
|
1529
|
+
},
|
|
1530
|
+
[documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1531
|
+
);
|
|
1532
|
+
const updateDataStore = (0, import_react.useCallback)(
|
|
1533
|
+
async ({
|
|
1521
1534
|
id,
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
"\n data: ",
|
|
1525
|
-
JSON.stringify(data, null, 2)
|
|
1526
|
-
);
|
|
1527
|
-
const result = await patchData({
|
|
1528
|
-
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1535
|
+
documentId,
|
|
1536
|
+
params,
|
|
1529
1537
|
variant,
|
|
1530
1538
|
data
|
|
1531
|
-
})
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1536
|
-
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1537
|
-
} else {
|
|
1538
|
-
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1539
|
+
}) => {
|
|
1540
|
+
if (!providers[id]) {
|
|
1541
|
+
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1542
|
+
return;
|
|
1539
1543
|
}
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
(0, import_react.useEffect)(() => {
|
|
1546
|
-
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1547
|
-
}, [dispatch, updateDocument]);
|
|
1548
|
-
const createDocument = (0, import_react.useCallback)(
|
|
1549
|
-
async ({ model, documentId, data }) => {
|
|
1550
|
-
const newDocument = data;
|
|
1551
|
-
systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1552
|
-
var providerListenersCount = 0;
|
|
1553
|
-
Object.keys(providers).forEach((key) => {
|
|
1554
|
-
const provider = providers[key];
|
|
1555
|
-
var socketListeners = provider.dataSource?.socketListeners;
|
|
1556
|
-
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1557
|
-
systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
|
|
1558
|
-
if (!provider.data.includes(documentId)) {
|
|
1559
|
-
providerListenersCount++;
|
|
1560
|
-
setProviders((prev) => ({
|
|
1561
|
-
...prev,
|
|
1562
|
-
[key]: {
|
|
1563
|
-
...prev[key],
|
|
1564
|
-
data: [...prev[key].data, documentId],
|
|
1565
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1566
|
-
}
|
|
1567
|
-
}));
|
|
1568
|
-
}
|
|
1544
|
+
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1545
|
+
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1546
|
+
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1547
|
+
} else updateDocument({ documentId, model: id, data });
|
|
1548
|
+
return true;
|
|
1569
1549
|
}
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1550
|
+
systemLog(
|
|
1551
|
+
"dsp",
|
|
1552
|
+
"[updateDataStore] Posilam patchData: ",
|
|
1553
|
+
id,
|
|
1554
|
+
",\n params: ",
|
|
1555
|
+
JSON.stringify(params, null, 2),
|
|
1556
|
+
"\n data: ",
|
|
1557
|
+
JSON.stringify(data, null, 2)
|
|
1558
|
+
);
|
|
1559
|
+
const result = await patchData({
|
|
1560
|
+
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1561
|
+
variant,
|
|
1562
|
+
data
|
|
1563
|
+
});
|
|
1564
|
+
if (typeof result === "object") {
|
|
1565
|
+
const { id: rDocumentId, ...document } = result;
|
|
1566
|
+
if (!isLive) {
|
|
1567
|
+
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1568
|
+
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1569
|
+
} else {
|
|
1570
|
+
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1571
|
+
}
|
|
1574
1572
|
}
|
|
1573
|
+
return result;
|
|
1574
|
+
},
|
|
1575
|
+
[providers, documents, isLive, updateDocument]
|
|
1576
|
+
);
|
|
1577
|
+
(0, import_react.useEffect)(() => {
|
|
1578
|
+
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1579
|
+
}, [dispatch, updateDocument]);
|
|
1580
|
+
const createDocument = (0, import_react.useCallback)(
|
|
1581
|
+
async ({ model, documentId, data }) => {
|
|
1582
|
+
const newDocument = data;
|
|
1583
|
+
console.log(`Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1584
|
+
var providerListenersCount = 0;
|
|
1585
|
+
Object.keys(providers).forEach((key) => {
|
|
1586
|
+
const provider = providers[key];
|
|
1587
|
+
var socketListeners = provider.dataSource?.socketListeners;
|
|
1588
|
+
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1589
|
+
if (!provider.data.includes(documentId)) {
|
|
1590
|
+
setCounterDocuments((prev) => {
|
|
1591
|
+
const newC = { ...prev };
|
|
1592
|
+
if (newC[documentId]) {
|
|
1593
|
+
setDocuments((prev2) => ({
|
|
1594
|
+
...prev2,
|
|
1595
|
+
[documentId]: { ...prev2[documentId], ...newDocument }
|
|
1596
|
+
}));
|
|
1597
|
+
newC[documentId] = prev[documentId] + 1;
|
|
1598
|
+
} else {
|
|
1599
|
+
setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
|
|
1600
|
+
newC[documentId] = providerListenersCount;
|
|
1601
|
+
}
|
|
1602
|
+
return newC;
|
|
1603
|
+
});
|
|
1604
|
+
providerListenersCount++;
|
|
1605
|
+
setProviders((prev) => ({
|
|
1606
|
+
...prev,
|
|
1607
|
+
[key]: {
|
|
1608
|
+
...prev[key],
|
|
1609
|
+
data: [...prev[key].data, documentId],
|
|
1610
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1611
|
+
}
|
|
1612
|
+
}));
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
});
|
|
1616
|
+
console.log("Provider listeners count: ", providerListenersCount);
|
|
1617
|
+
if (providerListenersCount > 0) {
|
|
1618
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1619
|
+
console.log("Persistuji dokument ", documentId, " do modelu ", model);
|
|
1620
|
+
await persistDocument({ documentId, model, data: newDocument });
|
|
1621
|
+
}
|
|
1622
|
+
console.log("Dokument ", documentId, " zaregistrovan do ", providerListenersCount, " provideru");
|
|
1623
|
+
console.log(newDocument);
|
|
1624
|
+
return { id: documentId, document: newDocument };
|
|
1625
|
+
} else return false;
|
|
1626
|
+
},
|
|
1627
|
+
[providers, setProviders, setCounterDocuments, setDocuments, persistDocument, persistenceStorage]
|
|
1628
|
+
);
|
|
1629
|
+
const deleteDocument = (0, import_react.useCallback)(
|
|
1630
|
+
async ({ documentId }) => {
|
|
1631
|
+
console.log("Mazani dokumentu ", documentId);
|
|
1632
|
+
systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
|
|
1633
|
+
await removePersistedDocument(documentId);
|
|
1634
|
+
setDocuments((prev) => {
|
|
1635
|
+
const newDocs = { ...prev };
|
|
1636
|
+
systemLog("dsp", "[deleteDocument] MAZU ", documentId, " z ", newDocs);
|
|
1637
|
+
delete newDocs[documentId];
|
|
1638
|
+
systemLog("dsp", "[deleteDocument] NEW DOCS: ", newDocs);
|
|
1639
|
+
return newDocs;
|
|
1640
|
+
});
|
|
1575
1641
|
setCounterDocuments((prev) => {
|
|
1576
1642
|
const newC = { ...prev };
|
|
1577
|
-
|
|
1578
|
-
setDocuments((prev2) => ({
|
|
1579
|
-
...prev2,
|
|
1580
|
-
[documentId]: { ...prev2[documentId], ...newDocument }
|
|
1581
|
-
}));
|
|
1582
|
-
newC[documentId] = prev[documentId] + providerListenersCount;
|
|
1583
|
-
} else {
|
|
1584
|
-
setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
|
|
1585
|
-
newC[documentId] = providerListenersCount;
|
|
1586
|
-
}
|
|
1643
|
+
delete newC[documentId];
|
|
1587
1644
|
return newC;
|
|
1588
1645
|
});
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
});
|
|
1610
|
-
setProviders((prev) => {
|
|
1611
|
-
var deletedCount = 0;
|
|
1612
|
-
const updatedDataObj = { ...prev };
|
|
1613
|
-
for (const key in updatedDataObj) {
|
|
1614
|
-
const initialLength = updatedDataObj[key].data.length;
|
|
1615
|
-
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1616
|
-
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1617
|
-
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1618
|
-
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1646
|
+
setProviders((prev) => {
|
|
1647
|
+
var deletedCount = 0;
|
|
1648
|
+
const updatedDataObj = { ...prev };
|
|
1649
|
+
for (const key in updatedDataObj) {
|
|
1650
|
+
const initialLength = updatedDataObj[key].data.length;
|
|
1651
|
+
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1652
|
+
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1653
|
+
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1654
|
+
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1655
|
+
}
|
|
1656
|
+
return updatedDataObj;
|
|
1657
|
+
});
|
|
1658
|
+
},
|
|
1659
|
+
[setDocuments, setCounterDocuments, setProviders, removePersistedDocument]
|
|
1660
|
+
);
|
|
1661
|
+
const createProviderItem = (0, import_react.useCallback)(
|
|
1662
|
+
async ({ id, data }) => {
|
|
1663
|
+
if (!providers[id]) {
|
|
1664
|
+
systemLog("dsp", "[createProviderItem] Provider neexistuje:", id);
|
|
1665
|
+
return;
|
|
1619
1666
|
}
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
}
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
});
|
|
1657
|
-
return response;
|
|
1658
|
-
},
|
|
1659
|
-
[providers]
|
|
1660
|
-
);
|
|
1661
|
-
const registerProviderSockets = (0, import_react.useCallback)(
|
|
1662
|
-
(sockets2) => {
|
|
1663
|
-
if (sockets2) {
|
|
1664
|
-
systemLog("dsp", "[registerProviderSockets]", sockets2);
|
|
1665
|
-
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1667
|
+
if (!providers[id].dataSource) {
|
|
1668
|
+
const { id: dId, ...rData } = data;
|
|
1669
|
+
const documentId = dId || uuid();
|
|
1670
|
+
const result2 = createDocument({ model: id, documentId, data: rData });
|
|
1671
|
+
return result2;
|
|
1672
|
+
}
|
|
1673
|
+
const result = await postData({
|
|
1674
|
+
dataSource: providers[id].dataSource,
|
|
1675
|
+
schema: providers[id].schema,
|
|
1676
|
+
val: data
|
|
1677
|
+
});
|
|
1678
|
+
return result;
|
|
1679
|
+
},
|
|
1680
|
+
[providers, createDocument]
|
|
1681
|
+
);
|
|
1682
|
+
const deleteProviderItem = (0, import_react.useCallback)(
|
|
1683
|
+
async ({ providerId, data, params }) => {
|
|
1684
|
+
if (!providers[providerId]) {
|
|
1685
|
+
systemLog("dsp", "[deleteProviderItem] Provider neexistuje:", providerId);
|
|
1686
|
+
return;
|
|
1687
|
+
}
|
|
1688
|
+
const response = await deleteData({
|
|
1689
|
+
dataSource: renderJSONTemplate(providers[providerId].dataSource, params),
|
|
1690
|
+
// dataSource: providers[providerId].dataSource,
|
|
1691
|
+
data
|
|
1692
|
+
});
|
|
1693
|
+
return response;
|
|
1694
|
+
},
|
|
1695
|
+
[providers]
|
|
1696
|
+
);
|
|
1697
|
+
const registerProviderSockets = (0, import_react.useCallback)(
|
|
1698
|
+
(sockets2, filter) => {
|
|
1699
|
+
if (!sockets2) return;
|
|
1700
|
+
const normalizedFilter = filter ?? {};
|
|
1701
|
+
systemLog("dsp", "[registerProviderSockets]", sockets2, `filter: ${JSON.stringify(normalizedFilter)}`);
|
|
1702
|
+
const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1666
1703
|
setSockets((prev) => {
|
|
1667
1704
|
const newS = { ...prev };
|
|
1668
1705
|
d.forEach((item) => {
|
|
1669
1706
|
if (newS[item]) {
|
|
1670
|
-
|
|
1707
|
+
const existingFilter = newS[item].filters.find((f) => (0, import_isEqual.default)(f.filter, normalizedFilter));
|
|
1708
|
+
if (existingFilter) {
|
|
1709
|
+
existingFilter.listeners++;
|
|
1710
|
+
systemLog("dsp", `[registerProviderSockets] Filter uz existuje, navysuji listeners na ${existingFilter.listeners}`);
|
|
1711
|
+
} else {
|
|
1712
|
+
newS[item].filters = [...newS[item].filters, { filter: normalizedFilter, listeners: 1 }];
|
|
1713
|
+
socket.emit("joinRoom", { room: item, filter: normalizedFilter });
|
|
1714
|
+
systemLog(
|
|
1715
|
+
"dsp",
|
|
1716
|
+
`[registerProviderSockets] Novy filter, registruji room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
|
|
1717
|
+
);
|
|
1718
|
+
}
|
|
1671
1719
|
} else {
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
dispatch: currentDispatch,
|
|
1676
|
-
updateDocument: currentUpdateDocument
|
|
1677
|
-
});
|
|
1720
|
+
newS[item] = {
|
|
1721
|
+
filters: [{ filter: normalizedFilter, listeners: 1 }],
|
|
1722
|
+
data: []
|
|
1678
1723
|
};
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
socket.emit("joinRoom", item);
|
|
1682
|
-
socket.on(item, roomHandler);
|
|
1724
|
+
socket.emit("joinRoom", { room: item, filter: normalizedFilter });
|
|
1725
|
+
systemLog("dsp", `[registerProviderSockets] Nova room ${item}, filter: ${JSON.stringify(normalizedFilter)}`);
|
|
1683
1726
|
}
|
|
1684
1727
|
});
|
|
1685
1728
|
return newS;
|
|
1686
1729
|
});
|
|
1687
|
-
}
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1730
|
+
},
|
|
1731
|
+
[setSockets, socket]
|
|
1732
|
+
);
|
|
1733
|
+
const unregisterProviderSockets = (0, import_react.useCallback)(
|
|
1734
|
+
(sockets2, filter) => {
|
|
1735
|
+
const normalizedFilter = filter ?? {};
|
|
1736
|
+
systemLog(
|
|
1737
|
+
"dsp",
|
|
1738
|
+
"[unregisterProviderSockets] Mazu sockety",
|
|
1739
|
+
JSON.stringify(sockets2, null, 2),
|
|
1740
|
+
`filter: ${JSON.stringify(normalizedFilter)}`
|
|
1741
|
+
);
|
|
1742
|
+
const d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1743
|
+
setSockets((prev) => {
|
|
1744
|
+
const newS = { ...prev };
|
|
1745
|
+
const removeSocketListeners = [];
|
|
1746
|
+
d.forEach((item) => {
|
|
1747
|
+
if (!newS[item]) return;
|
|
1748
|
+
const existingFilter = newS[item].filters.find((f) => (0, import_isEqual.default)(f.filter, normalizedFilter));
|
|
1749
|
+
if (!existingFilter) return;
|
|
1750
|
+
if (existingFilter.listeners <= 1) {
|
|
1751
|
+
newS[item].filters = newS[item].filters.filter((f) => !(0, import_isEqual.default)(f.filter, normalizedFilter));
|
|
1752
|
+
socket.emit("leaveRoom", { room: item, filter: normalizedFilter });
|
|
1753
|
+
systemLog(
|
|
1754
|
+
"dsp",
|
|
1755
|
+
`[unregisterProviderSockets] Filter smazan, odhlaseni room ${item} s filterem ${JSON.stringify(normalizedFilter)}`
|
|
1756
|
+
);
|
|
1757
|
+
} else {
|
|
1758
|
+
existingFilter.listeners--;
|
|
1759
|
+
systemLog("dsp", `[unregisterProviderSockets] Filter listeners snizen na ${existingFilter.listeners}`);
|
|
1760
|
+
}
|
|
1761
|
+
if (newS[item].filters.length === 0) {
|
|
1762
|
+
removeSocketListeners.push(item);
|
|
1763
|
+
delete newS[item];
|
|
1764
|
+
systemLog("dsp", `[unregisterProviderSockets] Room ${item} uplne smazana`);
|
|
1705
1765
|
}
|
|
1706
|
-
|
|
1707
|
-
|
|
1766
|
+
});
|
|
1767
|
+
if (removeSocketListeners.length > 0) {
|
|
1768
|
+
socket.emit("leaveRooms", removeSocketListeners);
|
|
1769
|
+
}
|
|
1770
|
+
return newS;
|
|
1708
1771
|
});
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
setCounterProviders((prev) => {
|
|
1721
|
-
if (!prev[id]) return prev;
|
|
1722
|
-
if (prev[id] + val > 0) {
|
|
1723
|
-
return {
|
|
1724
|
-
...prev,
|
|
1725
|
-
[id]: prev[id] + val
|
|
1726
|
-
};
|
|
1727
|
-
} else {
|
|
1772
|
+
},
|
|
1773
|
+
[setSockets, socket]
|
|
1774
|
+
);
|
|
1775
|
+
const updateProviderListeners = (0, import_react.useCallback)(
|
|
1776
|
+
async (id, val) => {
|
|
1777
|
+
systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
|
|
1778
|
+
setCounterProviders((prev) => {
|
|
1779
|
+
if (!prev[id]) return prev;
|
|
1780
|
+
if (prev[id] + val > 0) {
|
|
1781
|
+
return { ...prev, [id]: prev[id] + val };
|
|
1782
|
+
}
|
|
1728
1783
|
setProviders((prevP) => {
|
|
1729
1784
|
systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
|
|
1730
1785
|
setSockets((prevS) => {
|
|
1731
|
-
var removeSocketListeners = [];
|
|
1732
1786
|
const newS = { ...prevS };
|
|
1787
|
+
const removeSocketListeners = [];
|
|
1733
1788
|
const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
|
|
1789
|
+
const providerFilter = prevP[id].dataSource?.filter;
|
|
1790
|
+
const normalizedFilter = providerFilter ?? {};
|
|
1734
1791
|
providerSocketListeners.forEach((socketName) => {
|
|
1735
1792
|
if (!newS[socketName]) return;
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
}
|
|
1742
|
-
delete newS[socketName];
|
|
1743
|
-
removeSocketListeners.push(socketName);
|
|
1793
|
+
const existingFilter = newS[socketName].filters.find((f) => (0, import_isEqual.default)(f.filter, normalizedFilter));
|
|
1794
|
+
if (!existingFilter) return;
|
|
1795
|
+
if (existingFilter.listeners + val <= 0) {
|
|
1796
|
+
newS[socketName].filters = newS[socketName].filters.filter((f) => !(0, import_isEqual.default)(f.filter, normalizedFilter));
|
|
1797
|
+
socket.emit("leaveRoom", { room: socketName, filter: normalizedFilter });
|
|
1798
|
+
systemLog("dsp", `[updateProviderListeners] Filter smazan pro room ${socketName}`);
|
|
1744
1799
|
} else {
|
|
1745
|
-
|
|
1800
|
+
existingFilter.listeners = existingFilter.listeners + val;
|
|
1801
|
+
systemLog("dsp", `[updateProviderListeners] Filter listeners snizen na ${existingFilter.listeners}`);
|
|
1802
|
+
}
|
|
1803
|
+
if (newS[socketName].filters.length === 0) {
|
|
1804
|
+
removeSocketListeners.push(socketName);
|
|
1805
|
+
delete newS[socketName];
|
|
1806
|
+
systemLog("dsp", `[updateProviderListeners] Room ${socketName} uplne smazana`);
|
|
1746
1807
|
}
|
|
1747
1808
|
});
|
|
1748
1809
|
if (removeSocketListeners.length > 0) {
|
|
1749
|
-
socket.emit("leaveRooms",
|
|
1810
|
+
socket.emit("leaveRooms", removeSocketListeners);
|
|
1750
1811
|
}
|
|
1751
1812
|
return newS;
|
|
1752
1813
|
});
|
|
@@ -1773,202 +1834,203 @@ var DataStoreProvider = ({ socketServer, restServer, usePersistentStorage = true
|
|
|
1773
1834
|
const newProvs = { ...prev };
|
|
1774
1835
|
delete newProvs[id];
|
|
1775
1836
|
return newProvs;
|
|
1776
|
-
}
|
|
1777
|
-
});
|
|
1778
|
-
},
|
|
1779
|
-
[setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
|
|
1780
|
-
);
|
|
1781
|
-
const registerProvider = (0, import_react.useCallback)(
|
|
1782
|
-
async (newItem) => {
|
|
1783
|
-
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1784
|
-
let result;
|
|
1785
|
-
const { id, ...provider } = newItem;
|
|
1786
|
-
if (providers[id]) {
|
|
1787
|
-
setCounterProviders((prev) => {
|
|
1788
|
-
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1789
|
-
return {
|
|
1790
|
-
...prev,
|
|
1791
|
-
[id]: prev[id] + 1
|
|
1792
|
-
};
|
|
1793
1837
|
});
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
if (!item) return;
|
|
1810
|
-
const { id: itId, ...data } = item;
|
|
1811
|
-
const normalizedId = itId || uuid();
|
|
1812
|
-
dataList.push(normalizedId);
|
|
1813
|
-
if (documents[normalizedId]) {
|
|
1814
|
-
items[normalizedId] = {
|
|
1815
|
-
...documents[normalizedId],
|
|
1816
|
-
...data
|
|
1817
|
-
};
|
|
1818
|
-
} else {
|
|
1819
|
-
items[normalizedId] = data;
|
|
1820
|
-
}
|
|
1838
|
+
},
|
|
1839
|
+
[setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
|
|
1840
|
+
);
|
|
1841
|
+
const registerProvider = (0, import_react.useCallback)(
|
|
1842
|
+
async (newItem) => {
|
|
1843
|
+
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1844
|
+
let result;
|
|
1845
|
+
const { id, ...provider } = newItem;
|
|
1846
|
+
if (providers[id]) {
|
|
1847
|
+
setCounterProviders((prev) => {
|
|
1848
|
+
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1849
|
+
return {
|
|
1850
|
+
...prev,
|
|
1851
|
+
[id]: prev[id] + 1
|
|
1852
|
+
};
|
|
1821
1853
|
});
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1854
|
+
result = providers[id];
|
|
1855
|
+
} else {
|
|
1856
|
+
try {
|
|
1857
|
+
const dataFromSource = await getData({
|
|
1858
|
+
schema: newItem.schema,
|
|
1859
|
+
dataSource: newItem.dataSource || {},
|
|
1860
|
+
id: newItem.id,
|
|
1861
|
+
isPersisting: !!newItem.isPersisting && !!persistenceStorage,
|
|
1862
|
+
SQLite: persistenceStorage || void 0
|
|
1863
|
+
});
|
|
1864
|
+
console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1865
|
+
var dataList = [];
|
|
1866
|
+
var items = {};
|
|
1867
|
+
const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];
|
|
1868
|
+
dataS.forEach((item) => {
|
|
1869
|
+
if (!item) return;
|
|
1870
|
+
const { id: itId, ...data } = item;
|
|
1871
|
+
const normalizedId = itId || uuid();
|
|
1872
|
+
dataList.push(normalizedId);
|
|
1873
|
+
if (documents[normalizedId]) {
|
|
1874
|
+
items[normalizedId] = {
|
|
1875
|
+
...documents[normalizedId],
|
|
1876
|
+
...data
|
|
1877
|
+
};
|
|
1827
1878
|
} else {
|
|
1828
|
-
|
|
1879
|
+
items[normalizedId] = data;
|
|
1829
1880
|
}
|
|
1830
1881
|
});
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1840
|
-
};
|
|
1841
|
-
setProviders((prev) => ({
|
|
1842
|
-
...prev,
|
|
1843
|
-
[id]: result
|
|
1844
|
-
}));
|
|
1845
|
-
setCounterProviders((prev) => ({
|
|
1846
|
-
...prev,
|
|
1847
|
-
[id]: 1
|
|
1848
|
-
}));
|
|
1849
|
-
if (provider.dataSource?.socketListeners) {
|
|
1850
|
-
registerProviderSockets(provider.dataSource.socketListeners);
|
|
1851
|
-
}
|
|
1852
|
-
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1853
|
-
} catch (error) {
|
|
1854
|
-
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1855
|
-
throw error;
|
|
1856
|
-
}
|
|
1857
|
-
}
|
|
1858
|
-
return result;
|
|
1859
|
-
},
|
|
1860
|
-
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1861
|
-
);
|
|
1862
|
-
const unregisterProvider = (0, import_react.useCallback)(
|
|
1863
|
-
async (itemId) => {
|
|
1864
|
-
setCounterProviders((prev) => {
|
|
1865
|
-
if (prev[itemId]) {
|
|
1866
|
-
if (prev[itemId] > 1) {
|
|
1867
|
-
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1868
|
-
return {
|
|
1869
|
-
...prev,
|
|
1870
|
-
[itemId]: prev[itemId] - 1
|
|
1871
|
-
};
|
|
1872
|
-
} else {
|
|
1873
|
-
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1874
|
-
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
|
|
1875
|
-
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1876
|
-
setCounterDocuments((cd) => {
|
|
1877
|
-
const newC = { ...cd };
|
|
1878
|
-
const deleteDocumentIds = [];
|
|
1879
|
-
providers[itemId].data.forEach((docId) => {
|
|
1880
|
-
if (newC[docId] <= 1) {
|
|
1881
|
-
deleteDocumentIds.push(docId);
|
|
1882
|
-
delete newC[docId];
|
|
1883
|
-
} else newC[docId] = newC[docId] - 1;
|
|
1882
|
+
setCounterDocuments((prev) => {
|
|
1883
|
+
const newC = { ...prev };
|
|
1884
|
+
dataList.forEach((itemId) => {
|
|
1885
|
+
if (newC[itemId]) {
|
|
1886
|
+
newC[itemId] = newC[itemId] + 1;
|
|
1887
|
+
} else {
|
|
1888
|
+
newC[itemId] = 1;
|
|
1889
|
+
}
|
|
1884
1890
|
});
|
|
1885
|
-
if (deleteDocumentIds.length > 0) {
|
|
1886
|
-
setDocuments((pd) => {
|
|
1887
|
-
const newD = { ...pd };
|
|
1888
|
-
deleteDocumentIds.forEach((docId) => {
|
|
1889
|
-
delete newD[docId];
|
|
1890
|
-
});
|
|
1891
|
-
return newD;
|
|
1892
|
-
});
|
|
1893
|
-
}
|
|
1894
1891
|
return newC;
|
|
1895
1892
|
});
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1893
|
+
if (Object.keys(items).length > 0) {
|
|
1894
|
+
setDocuments((prev) => ({ ...prev, ...items }));
|
|
1895
|
+
}
|
|
1896
|
+
result = {
|
|
1897
|
+
...provider,
|
|
1898
|
+
data: dataList,
|
|
1899
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1900
|
+
};
|
|
1901
|
+
setProviders((prev) => ({
|
|
1902
|
+
...prev,
|
|
1903
|
+
[id]: result
|
|
1904
|
+
}));
|
|
1905
|
+
setCounterProviders((prev) => ({
|
|
1906
|
+
...prev,
|
|
1907
|
+
[id]: 1
|
|
1908
|
+
}));
|
|
1909
|
+
if (provider.dataSource?.socketListeners) {
|
|
1910
|
+
registerProviderSockets(provider.dataSource.socketListeners, provider.dataSource.filter);
|
|
1911
|
+
}
|
|
1912
|
+
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1913
|
+
} catch (error) {
|
|
1914
|
+
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1915
|
+
throw error;
|
|
1904
1916
|
}
|
|
1905
|
-
}
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1917
|
+
}
|
|
1918
|
+
return result;
|
|
1919
|
+
},
|
|
1920
|
+
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1921
|
+
);
|
|
1922
|
+
const unregisterProvider = (0, import_react.useCallback)(
|
|
1923
|
+
async (itemId) => {
|
|
1924
|
+
setCounterProviders((prev) => {
|
|
1925
|
+
if (prev[itemId]) {
|
|
1926
|
+
if (prev[itemId] > 1) {
|
|
1927
|
+
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1928
|
+
return {
|
|
1929
|
+
...prev,
|
|
1930
|
+
[itemId]: prev[itemId] - 1
|
|
1931
|
+
};
|
|
1932
|
+
} else {
|
|
1933
|
+
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1934
|
+
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners, providers[itemId]?.dataSource.filter);
|
|
1935
|
+
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1936
|
+
setCounterDocuments((cd) => {
|
|
1937
|
+
const newC = { ...cd };
|
|
1938
|
+
const deleteDocumentIds = [];
|
|
1939
|
+
providers[itemId].data.forEach((docId) => {
|
|
1940
|
+
if (newC[docId] <= 1) {
|
|
1941
|
+
deleteDocumentIds.push(docId);
|
|
1942
|
+
delete newC[docId];
|
|
1943
|
+
} else newC[docId] = newC[docId] - 1;
|
|
1944
|
+
});
|
|
1945
|
+
if (deleteDocumentIds.length > 0) {
|
|
1946
|
+
setDocuments((pd) => {
|
|
1947
|
+
const newD = { ...pd };
|
|
1948
|
+
deleteDocumentIds.forEach((docId) => {
|
|
1949
|
+
delete newD[docId];
|
|
1950
|
+
});
|
|
1951
|
+
return newD;
|
|
1952
|
+
});
|
|
1953
|
+
}
|
|
1954
|
+
return newC;
|
|
1955
|
+
});
|
|
1956
|
+
setProviders((pp) => {
|
|
1957
|
+
const newProvs2 = { ...pp };
|
|
1958
|
+
delete newProvs2[itemId];
|
|
1959
|
+
return newProvs2;
|
|
1960
|
+
});
|
|
1961
|
+
const newProvs = { ...prev };
|
|
1962
|
+
delete newProvs[itemId];
|
|
1963
|
+
return newProvs;
|
|
1964
|
+
}
|
|
1965
|
+
} else return prev;
|
|
1966
|
+
});
|
|
1967
|
+
},
|
|
1968
|
+
[setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets]
|
|
1969
|
+
);
|
|
1970
|
+
const actionsValue = (0, import_react.useMemo)(
|
|
1971
|
+
() => ({
|
|
1972
|
+
dispatch,
|
|
1973
|
+
initProvider,
|
|
1974
|
+
resetProvider,
|
|
1975
|
+
registerProvider,
|
|
1976
|
+
unregisterProvider,
|
|
1977
|
+
updateProviderListeners,
|
|
1978
|
+
resetDataStore,
|
|
1979
|
+
startSockets,
|
|
1980
|
+
stopSockets,
|
|
1981
|
+
registerProviderSockets,
|
|
1982
|
+
unregisterProviderSockets,
|
|
1983
|
+
updateDocuments,
|
|
1984
|
+
presetProviders
|
|
1985
|
+
}),
|
|
1986
|
+
[
|
|
1987
|
+
dispatch,
|
|
1988
|
+
initProvider,
|
|
1989
|
+
resetProvider,
|
|
1990
|
+
registerProvider,
|
|
1991
|
+
unregisterProvider,
|
|
1992
|
+
updateProviderListeners,
|
|
1993
|
+
resetDataStore,
|
|
1994
|
+
startSockets,
|
|
1995
|
+
stopSockets,
|
|
1996
|
+
registerProviderSockets,
|
|
1997
|
+
unregisterProviderSockets,
|
|
1998
|
+
updateDocuments,
|
|
1999
|
+
presetProviders
|
|
2000
|
+
]
|
|
2001
|
+
);
|
|
2002
|
+
const metaValue = (0, import_react.useMemo)(
|
|
2003
|
+
() => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),
|
|
2004
|
+
[isLive, isSynchronizing, sockets, counterProviders, counterDocuments]
|
|
2005
|
+
);
|
|
2006
|
+
const stableValue = (0, import_react.useMemo)(
|
|
2007
|
+
() => ({
|
|
2008
|
+
dispatch,
|
|
2009
|
+
presetProviders,
|
|
2010
|
+
updateProviderListeners,
|
|
2011
|
+
subscribeToProvider,
|
|
2012
|
+
getProviderLastUpdate,
|
|
2013
|
+
getExternalDocuments,
|
|
2014
|
+
getExternalProviders
|
|
2015
|
+
}),
|
|
2016
|
+
[
|
|
2017
|
+
dispatch,
|
|
2018
|
+
presetProviders,
|
|
2019
|
+
updateProviderListeners,
|
|
2020
|
+
subscribeToProvider,
|
|
2021
|
+
getProviderLastUpdate,
|
|
2022
|
+
getExternalDocuments,
|
|
2023
|
+
getExternalProviders
|
|
2024
|
+
]
|
|
2025
|
+
);
|
|
2026
|
+
(0, import_react.useImperativeHandle)(ref, () => actionsValue, [actionsValue]);
|
|
2027
|
+
systemLog("dsp", "END");
|
|
2028
|
+
return (
|
|
2029
|
+
// <DatabaseProvider>
|
|
2030
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreStableContext.Provider, { value: stableValue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreActionsContext.Provider, { value: actionsValue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreProvidersContext.Provider, { value: providers, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreDocumentsContext.Provider, { value: documents, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreContext.Provider, { value: metaValue, children: props.children }) }) }) }) })
|
|
2031
|
+
);
|
|
2032
|
+
}
|
|
2033
|
+
);
|
|
1972
2034
|
var DataStoreProvider_default = DataStoreProvider;
|
|
1973
2035
|
|
|
1974
2036
|
// src/useDataProvider.tsx
|