@mgarlik/datastore 0.1.0 → 0.1.2
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/README.md +28 -1
- package/dist/chunk-7XDRKNJQ.js +14 -0
- package/dist/chunk-7XDRKNJQ.js.map +1 -0
- package/dist/expo-sqlite.cjs +210 -0
- package/dist/expo-sqlite.cjs.map +1 -0
- package/dist/expo-sqlite.d.cts +31 -0
- package/dist/expo-sqlite.d.ts +31 -0
- package/dist/expo-sqlite.js +166 -0
- package/dist/expo-sqlite.js.map +1 -0
- package/dist/index.cjs +990 -1097
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +117 -75
- package/dist/index.d.ts +117 -75
- package/dist/index.js +1005 -1101
- package/dist/index.js.map +1 -1
- package/dist/storage-D_xv8gFb.d.cts +18 -0
- package/dist/storage-D_xv8gFb.d.ts +18 -0
- package/package.json +16 -6
package/dist/index.cjs
CHANGED
|
@@ -56,7 +56,6 @@ __export(index_exports, {
|
|
|
56
56
|
DataStoreProvider: () => DataStoreProvider_default,
|
|
57
57
|
DataStoreProvidersContext: () => DataStoreProvidersContext,
|
|
58
58
|
DataStoreStableContext: () => DataStoreStableContext,
|
|
59
|
-
SQLite: () => SQLite2,
|
|
60
59
|
dataStoreFilterObject: () => dataStoreFilterObject,
|
|
61
60
|
doesObjectMatchFilter: () => doesObjectMatchFilter,
|
|
62
61
|
doesValueMatchFilter: () => doesValueMatchFilter,
|
|
@@ -84,11 +83,6 @@ var import_react = require("react");
|
|
|
84
83
|
// src/log.ts
|
|
85
84
|
function systemLog(..._args) {
|
|
86
85
|
}
|
|
87
|
-
function systemLogError(...args) {
|
|
88
|
-
if (typeof console !== "undefined" && typeof console.error === "function") {
|
|
89
|
-
console.error(...args);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
86
|
|
|
93
87
|
// src/handleSocketMessage.ts
|
|
94
88
|
var handleSocketMessage = (model, msg, dataProvider) => {
|
|
@@ -120,9 +114,6 @@ var handleSocketMessage = (model, msg, dataProvider) => {
|
|
|
120
114
|
// src/handleData.ts
|
|
121
115
|
var import_axios = __toESM(require("axios"), 1);
|
|
122
116
|
|
|
123
|
-
// src/utils.ts
|
|
124
|
-
var Crypto = __toESM(require("expo-crypto"), 1);
|
|
125
|
-
|
|
126
117
|
// src/dotPath.ts
|
|
127
118
|
function propToArray(prop) {
|
|
128
119
|
return prop.split(".").reduce((ret, el, index, list) => {
|
|
@@ -167,6 +158,13 @@ function getValueByDotPath(obj, prop, value) {
|
|
|
167
158
|
|
|
168
159
|
// src/utils.ts
|
|
169
160
|
var import_dayjs = __toESM(require("dayjs"), 1);
|
|
161
|
+
function randomUuidSegment(template) {
|
|
162
|
+
return template.replace(/[xy]/g, (char) => {
|
|
163
|
+
const random = Math.floor(Math.random() * 16);
|
|
164
|
+
const value = char === "x" ? random : random & 3 | 8;
|
|
165
|
+
return value.toString(16);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
170
168
|
function escapeRegExp(string) {
|
|
171
169
|
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
172
170
|
}
|
|
@@ -629,7 +627,13 @@ var dataStoreFilterObject = (obj, filter) => {
|
|
|
629
627
|
return result;
|
|
630
628
|
};
|
|
631
629
|
function uuid() {
|
|
632
|
-
return
|
|
630
|
+
return [
|
|
631
|
+
randomUuidSegment("xxxxxxxx"),
|
|
632
|
+
randomUuidSegment("xxxx"),
|
|
633
|
+
"4" + randomUuidSegment("xxx"),
|
|
634
|
+
randomUuidSegment("yxxx"),
|
|
635
|
+
randomUuidSegment("xxxxxxxxxxxx")
|
|
636
|
+
].join("-");
|
|
633
637
|
}
|
|
634
638
|
function isUuid(val) {
|
|
635
639
|
if (typeof val !== "string") return false;
|
|
@@ -642,7 +646,7 @@ var saveData = async ({
|
|
|
642
646
|
providerId,
|
|
643
647
|
newData,
|
|
644
648
|
dateUpdate,
|
|
645
|
-
SQLite
|
|
649
|
+
SQLite
|
|
646
650
|
}) => {
|
|
647
651
|
console.time(`[SQL] saveData ${providerId}`);
|
|
648
652
|
const batchSize = 8e3;
|
|
@@ -657,8 +661,7 @@ var saveData = async ({
|
|
|
657
661
|
}
|
|
658
662
|
}
|
|
659
663
|
const placeholdersArray = Array.from({ length: Math.ceil(values.length / 4) }, () => placeholders).join(",");
|
|
660
|
-
|
|
661
|
-
const row = await SQLite3.query(`INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES ${placeholdersArray}`, values);
|
|
664
|
+
const row = await SQLite.query(`INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES ${placeholdersArray}`, values);
|
|
662
665
|
systemLog("axios", "saveData result: ", JSON.stringify(row));
|
|
663
666
|
}
|
|
664
667
|
console.timeEnd(`[SQL] saveData ${providerId}`);
|
|
@@ -680,7 +683,7 @@ var buildUri = ({
|
|
|
680
683
|
}
|
|
681
684
|
return dataSource.uri || `${dataSource.model || ""}/`;
|
|
682
685
|
};
|
|
683
|
-
var getData = async ({ id, dataSource, isPersisting, schema, SQLite
|
|
686
|
+
var getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime }) => {
|
|
684
687
|
if (dataSource) systemLog("axios", "GET Data Source: ", buildUri({ dataSource, method: "read" }));
|
|
685
688
|
else systemLog("axios", "No DataSource for ", id);
|
|
686
689
|
let persistedData = [];
|
|
@@ -697,12 +700,24 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite: SQLite3, ch
|
|
|
697
700
|
} else {
|
|
698
701
|
if (changeTime) {
|
|
699
702
|
params.changeTime = changeTime;
|
|
700
|
-
} else if (isPersisting &&
|
|
703
|
+
} else if (isPersisting && SQLite) {
|
|
701
704
|
console.time("Persisted Data");
|
|
702
|
-
const qDatum = await
|
|
705
|
+
const qDatum = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);
|
|
703
706
|
systemLog("axios", "SQLite.read Posledni datum update: ", qDatum[0]?.lastUpdate);
|
|
704
707
|
if (qDatum[0]?.lastUpdate) params.changeTime = qDatum[0].lastUpdate;
|
|
705
|
-
persistedData = qDatum.map((item) =>
|
|
708
|
+
persistedData = qDatum.map((item) => {
|
|
709
|
+
try {
|
|
710
|
+
const parsedData = typeof item.data === "string" ? JSON.parse(item.data) : item.data;
|
|
711
|
+
if (!parsedData || typeof parsedData !== "object" || Array.isArray(parsedData)) {
|
|
712
|
+
systemLog("axios", "SQLite.read Preskakuji neplatny dokument:", item.id);
|
|
713
|
+
return null;
|
|
714
|
+
}
|
|
715
|
+
return { id: item.id, ...parsedData };
|
|
716
|
+
} catch (error) {
|
|
717
|
+
console.error("[datastore] Nepodarilo se zpracovat SQL data pro dokument", item.id, error);
|
|
718
|
+
return null;
|
|
719
|
+
}
|
|
720
|
+
}).filter((item) => item !== null);
|
|
706
721
|
console.timeEnd("Persisted Data");
|
|
707
722
|
}
|
|
708
723
|
if (dataSource) {
|
|
@@ -750,8 +765,8 @@ var getData = async ({ id, dataSource, isPersisting, schema, SQLite: SQLite3, ch
|
|
|
750
765
|
JSON.stringify(newData).length,
|
|
751
766
|
"Bytes"
|
|
752
767
|
);
|
|
753
|
-
if (isPersisting &&
|
|
754
|
-
await saveData({ providerId: id, newData, SQLite
|
|
768
|
+
if (isPersisting && SQLite) {
|
|
769
|
+
await saveData({ providerId: id, newData, SQLite, dateUpdate: axiosResponse.data.queryAt || (/* @__PURE__ */ new Date()).toISOString() });
|
|
755
770
|
}
|
|
756
771
|
}
|
|
757
772
|
}
|
|
@@ -816,7 +831,6 @@ var deleteData = async ({ dataSource, data }) => {
|
|
|
816
831
|
// src/DataStoreProvider.tsx
|
|
817
832
|
var import_socket = require("socket.io-client");
|
|
818
833
|
var import_axios2 = __toESM(require("axios"), 1);
|
|
819
|
-
var import_expo_localization = require("expo-localization");
|
|
820
834
|
|
|
821
835
|
// src/templates.ts
|
|
822
836
|
var _renderMyTemplate = (templateString, data) => {
|
|
@@ -847,162 +861,7 @@ function renderJSONTemplate(val, data) {
|
|
|
847
861
|
|
|
848
862
|
// src/DataStoreProvider.tsx
|
|
849
863
|
var import_isEqual = __toESM(require("lodash/isEqual.js"), 1);
|
|
850
|
-
|
|
851
|
-
// src/database.ts
|
|
852
|
-
var SQL = __toESM(require("expo-sqlite"), 1);
|
|
853
|
-
var SQLite = class {
|
|
854
|
-
constructor(name) {
|
|
855
|
-
this.db = null;
|
|
856
|
-
this.dbName = name || "modelaz.db";
|
|
857
|
-
this.initDB();
|
|
858
|
-
}
|
|
859
|
-
async initDB() {
|
|
860
|
-
if (!this.db) {
|
|
861
|
-
try {
|
|
862
|
-
systemLog("sql", "[initDB]");
|
|
863
|
-
this.db = await SQL.openDatabaseAsync(this.dbName);
|
|
864
|
-
await this.createTables({
|
|
865
|
-
documents: "id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT"
|
|
866
|
-
// logs: "time TEXT PRIMARY KEY, module TEXT, message TEXT",
|
|
867
|
-
});
|
|
868
|
-
} catch (e) {
|
|
869
|
-
console.log("INITDB ERROR", e);
|
|
870
|
-
throw e;
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
async getDb() {
|
|
875
|
-
if (!this.db) {
|
|
876
|
-
await this.initDB();
|
|
877
|
-
}
|
|
878
|
-
if (!this.db) {
|
|
879
|
-
throw new Error("Database is not initialized");
|
|
880
|
-
}
|
|
881
|
-
return this.db;
|
|
882
|
-
}
|
|
883
|
-
async createTable(table, tableSchema) {
|
|
884
|
-
try {
|
|
885
|
-
systemLog("sql", "[createTable]", table);
|
|
886
|
-
const db = await this.getDb();
|
|
887
|
-
const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);
|
|
888
|
-
systemLog("sql", "[createTable] result: ", JSON.stringify(result));
|
|
889
|
-
return result;
|
|
890
|
-
} catch (e) {
|
|
891
|
-
systemLogError("sql", "[createTable]", e);
|
|
892
|
-
throw e;
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
async createTables(tables) {
|
|
896
|
-
try {
|
|
897
|
-
systemLog("sql", "[createTables]", tables);
|
|
898
|
-
const query = Object.entries(tables).reduce((acc, [table, schema]) => {
|
|
899
|
-
return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;
|
|
900
|
-
}, "");
|
|
901
|
-
const db = await this.getDb();
|
|
902
|
-
const result = await db.runAsync(query);
|
|
903
|
-
systemLog("sql", "[createTables] result: ", JSON.stringify(result));
|
|
904
|
-
return result;
|
|
905
|
-
} catch (e) {
|
|
906
|
-
systemLogError("sql", "[createTable]", e);
|
|
907
|
-
throw e;
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
/**
|
|
911
|
-
* Smazani starych logu
|
|
912
|
-
*/
|
|
913
|
-
async deleteLogs() {
|
|
914
|
-
systemLog("sql", "[query] delete old Logs", this.db);
|
|
915
|
-
try {
|
|
916
|
-
const db = await this.getDb();
|
|
917
|
-
await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);
|
|
918
|
-
} catch (error) {
|
|
919
|
-
throw error;
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
async read(query, args) {
|
|
923
|
-
try {
|
|
924
|
-
systemLog("sql", "[read]", query);
|
|
925
|
-
const db = await this.getDb();
|
|
926
|
-
const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
|
|
927
|
-
systemLog("sql", "[read] result ", result.length);
|
|
928
|
-
return result;
|
|
929
|
-
} catch (e) {
|
|
930
|
-
systemLogError("sql", "[read]", e);
|
|
931
|
-
throw e;
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
async query(query, args) {
|
|
935
|
-
try {
|
|
936
|
-
systemLog("sql", "[query]->", query);
|
|
937
|
-
const db = await this.getDb();
|
|
938
|
-
const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
|
|
939
|
-
systemLog("sql", result);
|
|
940
|
-
return result;
|
|
941
|
-
} catch (error) {
|
|
942
|
-
console.error("INSERT ERROR", error);
|
|
943
|
-
systemLogError("sql", error);
|
|
944
|
-
throw error;
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
async dropTable(table) {
|
|
948
|
-
try {
|
|
949
|
-
systemLog("sql", "dropTable", table);
|
|
950
|
-
console.time("[SQL] dropTable");
|
|
951
|
-
const db = await this.getDb();
|
|
952
|
-
const result = await db.runAsync(`DROP TABLE ${table}`);
|
|
953
|
-
console.timeEnd("[SQL] dropTable");
|
|
954
|
-
return result;
|
|
955
|
-
} catch (error) {
|
|
956
|
-
throw error;
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
async emptyTable(table) {
|
|
960
|
-
try {
|
|
961
|
-
systemLog("sql", `[emptyTable]`, table);
|
|
962
|
-
const db = await this.getDb();
|
|
963
|
-
const result = await db.runAsync(`DELETE FROM '${table}'`);
|
|
964
|
-
systemLog("sql", "[emptyTable] result", result);
|
|
965
|
-
return result;
|
|
966
|
-
} catch (error) {
|
|
967
|
-
throw error;
|
|
968
|
-
}
|
|
969
|
-
}
|
|
970
|
-
async getTables() {
|
|
971
|
-
systemLog("sql", "Jdu zkusit nacist tabulky z ", JSON.stringify(this.dbName));
|
|
972
|
-
try {
|
|
973
|
-
const db = await this.getDb();
|
|
974
|
-
const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type="table"');
|
|
975
|
-
systemLog("sql", "DB Result:", result);
|
|
976
|
-
return result;
|
|
977
|
-
} catch (error) {
|
|
978
|
-
throw error;
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
async resetDatabase() {
|
|
982
|
-
try {
|
|
983
|
-
systemLog("sql", "Reset database", this.dbName);
|
|
984
|
-
console.time("DELETING");
|
|
985
|
-
systemLog("sql", "Closing");
|
|
986
|
-
const db = await this.getDb();
|
|
987
|
-
await db.closeAsync();
|
|
988
|
-
systemLog("sql", "Deleting");
|
|
989
|
-
await SQL.deleteDatabaseAsync(this.dbName);
|
|
990
|
-
console.timeEnd("DELETING");
|
|
991
|
-
console.time("INIT");
|
|
992
|
-
this.db = null;
|
|
993
|
-
systemLog("sql", "Zacinam inicializovat databazi databaze");
|
|
994
|
-
await this.initDB();
|
|
995
|
-
systemLog("sql", "Inicializovana databaze");
|
|
996
|
-
console.timeEnd("INIT");
|
|
997
|
-
} catch (e) {
|
|
998
|
-
systemLogError("sql", "[resetDatabase]", e);
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
};
|
|
1002
|
-
|
|
1003
|
-
// src/DataStoreProvider.tsx
|
|
1004
864
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
1005
|
-
var SQLite2 = new SQLite("modelaz.db");
|
|
1006
865
|
var DataStoreContext = (0, import_react.createContext)({});
|
|
1007
866
|
var DataStoreDocumentsContext = (0, import_react.createContext)({});
|
|
1008
867
|
var DataStoreProvidersContext = (0, import_react.createContext)({});
|
|
@@ -1082,1002 +941,1037 @@ var buildDocumentTemplateParams = (model, documentId) => {
|
|
|
1082
941
|
[templateIdKey]: documentId
|
|
1083
942
|
};
|
|
1084
943
|
};
|
|
1085
|
-
var
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
const providerSubscribersRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
|
|
1094
|
-
const previousProviderUpdateIdsRef = (0, import_react.useRef)({});
|
|
1095
|
-
const [dispatcher, setDispatcher] = (0, import_react.useState)({ isBussy: false, actions: [] });
|
|
1096
|
-
const [counterProviders, setCounterProviders] = (0, import_react.useState)({});
|
|
1097
|
-
const [counterDocuments, setCounterDocuments] = (0, import_react.useState)({});
|
|
1098
|
-
const didInitialLiveSyncRef = (0, import_react.useRef)(false);
|
|
1099
|
-
(0, import_react.useEffect)(() => {
|
|
1100
|
-
if (!restServer) return;
|
|
1101
|
-
const localization = (0, import_expo_localization.getLocales)();
|
|
1102
|
-
import_axios2.default.defaults.baseURL = restServer;
|
|
1103
|
-
import_axios2.default.defaults.headers.common["Accept-Language"] = localization[0]?.languageCode;
|
|
1104
|
-
systemLog("dsp", "[INIT] Axios baseURL:", restServer);
|
|
1105
|
-
async function checkServer() {
|
|
1106
|
-
try {
|
|
1107
|
-
const response = await import_axios2.default.head("/", {
|
|
1108
|
-
timeout: 7e3,
|
|
1109
|
-
validateStatus: () => true
|
|
1110
|
-
});
|
|
1111
|
-
systemLog("dsp", "[INIT] Axios Success, status:", response.status);
|
|
1112
|
-
} catch (e) {
|
|
1113
|
-
if (import_axios2.default.isAxiosError(e)) {
|
|
1114
|
-
systemLog("dsp", "[INIT] Axios Error:", e.code ?? "UNKNOWN", e.message);
|
|
1115
|
-
} else {
|
|
1116
|
-
systemLog("dsp", "[INIT] Axios Error:", String(e));
|
|
1117
|
-
}
|
|
1118
|
-
} finally {
|
|
1119
|
-
systemLog("dsp", "[INIT] Axios check done");
|
|
1120
|
-
}
|
|
944
|
+
var resolveLocale = () => {
|
|
945
|
+
if (typeof Intl !== "undefined" && typeof Intl.DateTimeFormat === "function") {
|
|
946
|
+
const locale = Intl.DateTimeFormat().resolvedOptions().locale;
|
|
947
|
+
if (locale) return locale;
|
|
948
|
+
}
|
|
949
|
+
if (typeof navigator !== "undefined") {
|
|
950
|
+
if (typeof navigator.language === "string" && navigator.language.length > 0) {
|
|
951
|
+
return navigator.language;
|
|
1121
952
|
}
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
const socketActionHandlersRef = (0, import_react.useRef)({});
|
|
1126
|
-
systemLog("dsp", "START");
|
|
1127
|
-
const socket = (0, import_react.useMemo)(() => (0, import_socket.io)(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
1128
|
-
const handleSocketConnect = (0, import_react.useCallback)(() => setIsLive(true), []);
|
|
1129
|
-
const handleSocketDisconnect = (0, import_react.useCallback)(() => setIsLive(false), []);
|
|
1130
|
-
const getSocketAuthToken = (0, import_react.useCallback)(() => {
|
|
1131
|
-
const authorizationHeader = import_axios2.default.defaults.headers.common["Authorization"];
|
|
1132
|
-
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
1133
|
-
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
953
|
+
if (Array.isArray(navigator.languages) && navigator.languages.length > 0) {
|
|
954
|
+
const firstLocale = navigator.languages.find((value) => typeof value === "string" && value.length > 0);
|
|
955
|
+
if (firstLocale) return firstLocale;
|
|
1134
956
|
}
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
957
|
+
}
|
|
958
|
+
return void 0;
|
|
959
|
+
};
|
|
960
|
+
var DataStoreProvider = (0, import_react.forwardRef)(
|
|
961
|
+
({ socketServer, restServer, usePersistentStorage = true, locale, storage = null, ...props }, ref) => {
|
|
962
|
+
const [isLive, setIsLive] = (0, import_react.useState)(false);
|
|
963
|
+
const [isSynchronizing, setIsSynchronizing] = (0, import_react.useState)(true);
|
|
964
|
+
const [sockets, setSockets] = (0, import_react.useState)({});
|
|
965
|
+
const [providers, setProviders] = (0, import_react.useState)({});
|
|
966
|
+
const [documents, setDocuments] = (0, import_react.useState)({});
|
|
967
|
+
const externalProvidersRef = (0, import_react.useRef)({});
|
|
968
|
+
const externalDocumentsRef = (0, import_react.useRef)({});
|
|
969
|
+
const providerSubscribersRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
|
|
970
|
+
const previousProviderUpdateIdsRef = (0, import_react.useRef)({});
|
|
971
|
+
const [dispatcher, setDispatcher] = (0, import_react.useState)({ isBussy: false, actions: [] });
|
|
972
|
+
const [counterProviders, setCounterProviders] = (0, import_react.useState)({});
|
|
973
|
+
const [counterDocuments, setCounterDocuments] = (0, import_react.useState)({});
|
|
974
|
+
const didInitialLiveSyncRef = (0, import_react.useRef)(false);
|
|
975
|
+
const persistenceStorage = (0, import_react.useMemo)(
|
|
976
|
+
() => usePersistentStorage ? storage : null,
|
|
977
|
+
[storage, usePersistentStorage]
|
|
978
|
+
);
|
|
979
|
+
(0, import_react.useEffect)(() => {
|
|
980
|
+
if (!restServer) return;
|
|
981
|
+
const resolvedLocale = locale || resolveLocale();
|
|
982
|
+
import_axios2.default.defaults.baseURL = restServer;
|
|
983
|
+
if (resolvedLocale) {
|
|
984
|
+
import_axios2.default.defaults.headers.common["Accept-Language"] = resolvedLocale;
|
|
1162
985
|
}
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
986
|
+
systemLog("dsp", "[INIT] Axios baseURL:", restServer);
|
|
987
|
+
async function checkServer() {
|
|
988
|
+
try {
|
|
989
|
+
const response = await import_axios2.default.head("/", {
|
|
990
|
+
timeout: 7e3,
|
|
991
|
+
validateStatus: () => true
|
|
992
|
+
});
|
|
993
|
+
systemLog("dsp", "[INIT] Axios Success, status:", response.status);
|
|
994
|
+
} catch (e) {
|
|
995
|
+
if (import_axios2.default.isAxiosError(e)) {
|
|
996
|
+
systemLog("dsp", "[INIT] Axios Error:", e.code ?? "UNKNOWN", e.message);
|
|
997
|
+
} else {
|
|
998
|
+
systemLog("dsp", "[INIT] Axios Error:", String(e));
|
|
999
|
+
}
|
|
1000
|
+
} finally {
|
|
1001
|
+
systemLog("dsp", "[INIT] Axios check done");
|
|
1002
|
+
}
|
|
1168
1003
|
}
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1004
|
+
checkServer();
|
|
1005
|
+
}, [locale, restServer]);
|
|
1006
|
+
(0, import_react.useEffect)(() => {
|
|
1007
|
+
if (usePersistentStorage && !storage) {
|
|
1008
|
+
systemLog("dsp", "[INIT] Persistence is enabled but no storage adapter was provided.");
|
|
1009
|
+
}
|
|
1010
|
+
}, [persistenceStorage, storage, usePersistentStorage]);
|
|
1011
|
+
const socketRoomHandlersRef = (0, import_react.useRef)({});
|
|
1012
|
+
const socketActionHandlersRef = (0, import_react.useRef)({});
|
|
1013
|
+
systemLog("dsp", "START");
|
|
1014
|
+
const socket = (0, import_react.useMemo)(() => (0, import_socket.io)(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
|
|
1015
|
+
const handleSocketConnect = (0, import_react.useCallback)(() => setIsLive(true), []);
|
|
1016
|
+
const handleSocketDisconnect = (0, import_react.useCallback)(() => setIsLive(false), []);
|
|
1017
|
+
const getSocketAuthToken = (0, import_react.useCallback)(() => {
|
|
1018
|
+
const authorizationHeader = import_axios2.default.defaults.headers.common["Authorization"];
|
|
1019
|
+
if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
|
|
1020
|
+
return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
|
|
1021
|
+
}
|
|
1022
|
+
return "Bearer ";
|
|
1023
|
+
}, []);
|
|
1024
|
+
const subscribeToProvider = (0, import_react.useCallback)((providerId, callback) => {
|
|
1025
|
+
const subscribersByProvider = providerSubscribersRef.current;
|
|
1026
|
+
const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
|
|
1027
|
+
providerSubscribers.add(callback);
|
|
1028
|
+
subscribersByProvider.set(providerId, providerSubscribers);
|
|
1029
|
+
return () => {
|
|
1030
|
+
const activeSubscribers = subscribersByProvider.get(providerId);
|
|
1031
|
+
if (!activeSubscribers) return;
|
|
1032
|
+
activeSubscribers.delete(callback);
|
|
1033
|
+
if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
|
|
1034
|
+
};
|
|
1035
|
+
}, []);
|
|
1036
|
+
const getProviderLastUpdate = (0, import_react.useCallback)((providerId) => {
|
|
1037
|
+
return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
|
|
1038
|
+
}, []);
|
|
1039
|
+
const getExternalDocuments = (0, import_react.useCallback)(() => externalDocumentsRef.current, []);
|
|
1040
|
+
const getExternalProviders = (0, import_react.useCallback)(() => externalProvidersRef.current, []);
|
|
1041
|
+
(0, import_react.useEffect)(() => {
|
|
1042
|
+
externalProvidersRef.current = providers;
|
|
1043
|
+
const currentUpdateIds = {};
|
|
1044
|
+
Object.keys(providers).forEach((providerId) => {
|
|
1045
|
+
currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
|
|
1046
|
+
if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
|
|
1047
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
1048
|
+
subscribers?.forEach((callback) => callback());
|
|
1049
|
+
}
|
|
1050
|
+
});
|
|
1051
|
+
Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {
|
|
1052
|
+
if (!(providerId in currentUpdateIds)) {
|
|
1053
|
+
const subscribers = providerSubscribersRef.current.get(providerId);
|
|
1054
|
+
subscribers?.forEach((callback) => callback());
|
|
1055
|
+
}
|
|
1056
|
+
});
|
|
1057
|
+
previousProviderUpdateIdsRef.current = currentUpdateIds;
|
|
1058
|
+
}, [providers]);
|
|
1059
|
+
(0, import_react.useEffect)(() => {
|
|
1060
|
+
externalDocumentsRef.current = documents;
|
|
1061
|
+
}, [documents]);
|
|
1062
|
+
const persistDocument = (0, import_react.useCallback)(
|
|
1063
|
+
async ({
|
|
1184
1064
|
documentId,
|
|
1185
|
-
JSON.stringify(data),
|
|
1186
1065
|
model,
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1066
|
+
data,
|
|
1067
|
+
lastUpdate = (/* @__PURE__ */ new Date()).toISOString()
|
|
1068
|
+
}) => {
|
|
1069
|
+
if (!persistenceStorage) return;
|
|
1070
|
+
await persistenceStorage.query("INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)", [
|
|
1071
|
+
documentId,
|
|
1072
|
+
JSON.stringify(data),
|
|
1073
|
+
model,
|
|
1074
|
+
lastUpdate
|
|
1075
|
+
]);
|
|
1076
|
+
},
|
|
1077
|
+
[persistenceStorage]
|
|
1078
|
+
);
|
|
1079
|
+
const removePersistedDocument = (0, import_react.useCallback)(
|
|
1080
|
+
async (documentId) => {
|
|
1081
|
+
if (!persistenceStorage) return;
|
|
1082
|
+
await persistenceStorage.query("DELETE FROM documents WHERE id = ?", [documentId]);
|
|
1083
|
+
},
|
|
1084
|
+
[persistenceStorage]
|
|
1085
|
+
);
|
|
1086
|
+
const synchronizeDataStore = (0, import_react.useCallback)(async () => {
|
|
1087
|
+
setIsSynchronizing(true);
|
|
1088
|
+
const stats = { processed: 0, updated: 0, failed: 0 };
|
|
1089
|
+
try {
|
|
1090
|
+
for (const key of Object.keys(providers)) {
|
|
1091
|
+
stats.processed++;
|
|
1092
|
+
try {
|
|
1093
|
+
const { data, lastUpdate, ...rest } = providers[key];
|
|
1094
|
+
const response = await getData({
|
|
1095
|
+
id: key,
|
|
1096
|
+
...rest,
|
|
1097
|
+
changeTime: lastUpdate.time
|
|
1217
1098
|
});
|
|
1218
|
-
|
|
1219
|
-
|
|
1099
|
+
if (response.length > 0) {
|
|
1100
|
+
const updateData = {};
|
|
1101
|
+
response.forEach((item) => {
|
|
1102
|
+
const { id, ...d } = item;
|
|
1103
|
+
updateData[id] = d;
|
|
1104
|
+
});
|
|
1105
|
+
await updateDocuments({ model: key, documents: updateData, mode: "replace" });
|
|
1106
|
+
stats.updated++;
|
|
1107
|
+
}
|
|
1108
|
+
} catch (e) {
|
|
1109
|
+
stats.failed++;
|
|
1110
|
+
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1220
1111
|
}
|
|
1221
|
-
} catch (e) {
|
|
1222
|
-
stats.failed++;
|
|
1223
|
-
console.error("[DSP] synchronizeDataStore provider error:", key, e);
|
|
1224
1112
|
}
|
|
1113
|
+
} finally {
|
|
1114
|
+
setIsSynchronizing(false);
|
|
1115
|
+
systemLog("dsp", "[synchronizeDataStore] Hotovo:", stats);
|
|
1225
1116
|
}
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
synchronizeDataStore();
|
|
1117
|
+
}, [providers]);
|
|
1118
|
+
(0, import_react.useEffect)(() => {
|
|
1119
|
+
if (isLive) {
|
|
1120
|
+
systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
|
|
1121
|
+
const ss = Object.keys(sockets);
|
|
1122
|
+
systemLog("dsp", "useEffect[isLive] registruji", ss);
|
|
1123
|
+
if (ss?.length > 0) socket.emit("joinRooms", JSON.stringify(ss));
|
|
1124
|
+
if (!didInitialLiveSyncRef.current) {
|
|
1125
|
+
didInitialLiveSyncRef.current = true;
|
|
1126
|
+
systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
|
|
1127
|
+
synchronizeDataStore();
|
|
1128
|
+
}
|
|
1129
|
+
} else {
|
|
1130
|
+
didInitialLiveSyncRef.current = false;
|
|
1241
1131
|
}
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
};
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
console.time("[DSP] resetDataStore");
|
|
1270
|
-
if (usePersistentStorage) {
|
|
1271
|
-
await SQLite2.emptyTable("documents");
|
|
1272
|
-
}
|
|
1273
|
-
setSockets({});
|
|
1274
|
-
setProviders({});
|
|
1275
|
-
setDocuments({});
|
|
1276
|
-
setCounterProviders({});
|
|
1277
|
-
setCounterDocuments({});
|
|
1278
|
-
console.timeEnd("[DSP] resetDataStore");
|
|
1279
|
-
}, [usePersistentStorage]);
|
|
1280
|
-
const resetProvider = (0, import_react.useCallback)(
|
|
1281
|
-
async (provider) => {
|
|
1282
|
-
if (!usePersistentStorage) return;
|
|
1283
|
-
await SQLite2.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1284
|
-
},
|
|
1285
|
-
[usePersistentStorage]
|
|
1286
|
-
);
|
|
1287
|
-
const initProvider = (0, import_react.useCallback)(
|
|
1288
|
-
async (id, data) => {
|
|
1289
|
-
const providerPreset = presetProviders[id];
|
|
1290
|
-
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1291
|
-
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1292
|
-
if (typeof prov !== "boolean") {
|
|
1293
|
-
return await registerProvider(prov);
|
|
1132
|
+
}, [isLive, socket, sockets, synchronizeDataStore]);
|
|
1133
|
+
const presetProviders = props.providers;
|
|
1134
|
+
(0, import_react.useEffect)(() => {
|
|
1135
|
+
socket.on("connect", handleSocketConnect);
|
|
1136
|
+
socket.on("disconnect", handleSocketDisconnect);
|
|
1137
|
+
return () => {
|
|
1138
|
+
socket.off("connect", handleSocketConnect);
|
|
1139
|
+
socket.off("disconnect", handleSocketDisconnect);
|
|
1140
|
+
};
|
|
1141
|
+
}, [socket, handleSocketConnect, handleSocketDisconnect]);
|
|
1142
|
+
const startSockets = (0, import_react.useCallback)(() => {
|
|
1143
|
+
socket.auth = {
|
|
1144
|
+
...socket.auth || {},
|
|
1145
|
+
...socketServer?.params?.auth || {},
|
|
1146
|
+
token: getSocketAuthToken()
|
|
1147
|
+
};
|
|
1148
|
+
systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
|
|
1149
|
+
socket.connect();
|
|
1150
|
+
}, [socket, socketServer?.params?.auth, getSocketAuthToken]);
|
|
1151
|
+
const stopSockets = (0, import_react.useCallback)(() => {
|
|
1152
|
+
systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
|
|
1153
|
+
socket.disconnect();
|
|
1154
|
+
}, [socket]);
|
|
1155
|
+
const resetDataStore = (0, import_react.useCallback)(async () => {
|
|
1156
|
+
console.time("[DSP] resetDataStore");
|
|
1157
|
+
if (persistenceStorage?.emptyTable) {
|
|
1158
|
+
await persistenceStorage.emptyTable("documents");
|
|
1294
1159
|
}
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
const
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1160
|
+
setSockets({});
|
|
1161
|
+
setProviders({});
|
|
1162
|
+
setDocuments({});
|
|
1163
|
+
setCounterProviders({});
|
|
1164
|
+
setCounterDocuments({});
|
|
1165
|
+
console.timeEnd("[DSP] resetDataStore");
|
|
1166
|
+
}, [persistenceStorage]);
|
|
1167
|
+
const resetProvider = (0, import_react.useCallback)(
|
|
1168
|
+
async (provider) => {
|
|
1169
|
+
if (!persistenceStorage) return;
|
|
1170
|
+
await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);
|
|
1171
|
+
},
|
|
1172
|
+
[persistenceStorage]
|
|
1173
|
+
);
|
|
1174
|
+
const initProvider = (0, import_react.useCallback)(
|
|
1175
|
+
async (id, data) => {
|
|
1176
|
+
const providerPreset = presetProviders[id];
|
|
1177
|
+
const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
|
|
1178
|
+
systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
|
|
1179
|
+
if (typeof prov !== "boolean") {
|
|
1180
|
+
return await registerProvider(prov);
|
|
1181
|
+
}
|
|
1182
|
+
return false;
|
|
1183
|
+
},
|
|
1184
|
+
[persistenceStorage, presetProviders, usePersistentStorage]
|
|
1185
|
+
);
|
|
1186
|
+
const dispatch = (0, import_react.useCallback)((action, data, callback) => {
|
|
1187
|
+
systemLog("dsp", "[DSP] DISPATCH Ukladam akci", action, ",", data);
|
|
1188
|
+
setDispatcher((prev) => ({
|
|
1189
|
+
isBussy: prev.isBussy,
|
|
1190
|
+
actions: [...prev.actions, { action, data, callback }]
|
|
1191
|
+
}));
|
|
1192
|
+
}, []);
|
|
1193
|
+
(0, import_react.useEffect)(() => {
|
|
1194
|
+
async function processDispatcher() {
|
|
1195
|
+
if (dispatcher.actions.length > 0) {
|
|
1196
|
+
let result;
|
|
1197
|
+
systemLog("dsp", "[DSP] DISPATCHER Zpracovavam", dispatcher.actions[0].action);
|
|
1198
|
+
const timeCode = uuid();
|
|
1199
|
+
console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1200
|
+
setDispatcher((prev) => ({ ...prev, isBussy: true }));
|
|
1201
|
+
const item = dispatcher.actions[0];
|
|
1202
|
+
switch (item.action) {
|
|
1203
|
+
case "registerProvider":
|
|
1204
|
+
await registerProvider(item.data);
|
|
1205
|
+
break;
|
|
1206
|
+
case "unregisterProvider":
|
|
1207
|
+
await unregisterProvider(item.data);
|
|
1208
|
+
break;
|
|
1209
|
+
case "updateDataStore":
|
|
1210
|
+
result = await updateDataStore(item.data);
|
|
1211
|
+
break;
|
|
1212
|
+
case "createDocument":
|
|
1213
|
+
await createDocument(item.data);
|
|
1214
|
+
break;
|
|
1215
|
+
case "updateDocument":
|
|
1216
|
+
await updateDocument(item.data);
|
|
1217
|
+
break;
|
|
1218
|
+
case "updateDocuments":
|
|
1219
|
+
await updateDocuments(item.data);
|
|
1220
|
+
break;
|
|
1221
|
+
case "removeItem":
|
|
1222
|
+
break;
|
|
1223
|
+
case "deleteDocument":
|
|
1224
|
+
await deleteDocument(item.data);
|
|
1225
|
+
break;
|
|
1226
|
+
case "createProviderItem":
|
|
1227
|
+
result = await createProviderItem(item.data);
|
|
1228
|
+
break;
|
|
1229
|
+
case "deleteProviderItem":
|
|
1230
|
+
result = await deleteProviderItem(item.data);
|
|
1231
|
+
break;
|
|
1232
|
+
default:
|
|
1233
|
+
console.error("Unknown Action ", item.action, "Data: ", item.data);
|
|
1234
|
+
}
|
|
1235
|
+
item.callback && item.callback(result);
|
|
1236
|
+
setDispatcher((prev) => ({
|
|
1237
|
+
isBussy: false,
|
|
1238
|
+
actions: prev.actions.slice(1)
|
|
1239
|
+
}));
|
|
1240
|
+
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1347
1241
|
}
|
|
1348
|
-
item.callback && item.callback(result);
|
|
1349
|
-
setDispatcher((prev) => ({
|
|
1350
|
-
isBussy: false,
|
|
1351
|
-
actions: prev.actions.slice(1)
|
|
1352
|
-
}));
|
|
1353
|
-
console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
|
|
1354
|
-
}
|
|
1355
|
-
}
|
|
1356
|
-
if (!dispatcher.isBussy) processDispatcher();
|
|
1357
|
-
}, [dispatcher]);
|
|
1358
|
-
const updateDocuments = (0, import_react.useCallback)(
|
|
1359
|
-
async ({
|
|
1360
|
-
model,
|
|
1361
|
-
documents: uDocuments,
|
|
1362
|
-
mode = "update"
|
|
1363
|
-
}) => {
|
|
1364
|
-
systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
|
|
1365
|
-
const modelProvider = providers[model];
|
|
1366
|
-
if (!modelProvider) {
|
|
1367
|
-
systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
|
|
1368
|
-
return;
|
|
1369
1242
|
}
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
systemLog("dsp", "updateDocuments -
|
|
1396
|
-
data.push(id);
|
|
1243
|
+
if (!dispatcher.isBussy) processDispatcher();
|
|
1244
|
+
}, [dispatcher]);
|
|
1245
|
+
const updateDocuments = (0, import_react.useCallback)(
|
|
1246
|
+
async ({
|
|
1247
|
+
model,
|
|
1248
|
+
documents: uDocuments,
|
|
1249
|
+
mode = "update"
|
|
1250
|
+
}) => {
|
|
1251
|
+
systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
|
|
1252
|
+
const modelProvider = providers[model];
|
|
1253
|
+
if (!modelProvider) {
|
|
1254
|
+
systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
|
|
1255
|
+
return;
|
|
1256
|
+
}
|
|
1257
|
+
let data = [...modelProvider.data || []];
|
|
1258
|
+
const documentsToPersist = [];
|
|
1259
|
+
const documentIdsToDelete = [];
|
|
1260
|
+
setDocuments((prev) => {
|
|
1261
|
+
console.time("updateDocuments");
|
|
1262
|
+
let newDocs = { ...prev };
|
|
1263
|
+
if (Array.isArray(uDocuments)) {
|
|
1264
|
+
uDocuments.forEach((document) => {
|
|
1265
|
+
const { id, ...doc } = document;
|
|
1266
|
+
switch (mode) {
|
|
1267
|
+
case "replace":
|
|
1268
|
+
systemLog("dsp", "updateDocuments - replace", id);
|
|
1397
1269
|
newDocs[id] = doc;
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1270
|
+
if (doc._deleted) {
|
|
1271
|
+
data = data.filter((d) => d !== id);
|
|
1272
|
+
documentIdsToDelete.push(id);
|
|
1273
|
+
delete newDocs[id];
|
|
1274
|
+
} else {
|
|
1275
|
+
if (!data.includes(id)) data.push(id);
|
|
1276
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1277
|
+
}
|
|
1278
|
+
break;
|
|
1279
|
+
case "update":
|
|
1280
|
+
default:
|
|
1281
|
+
if (!newDocs[id]) {
|
|
1282
|
+
systemLog("dsp", "updateDocuments - vytvarim", id);
|
|
1283
|
+
data.push(id);
|
|
1284
|
+
newDocs[id] = doc;
|
|
1285
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1286
|
+
} else if (doc._deleted) {
|
|
1287
|
+
systemLog("dsp", "updateDocuments - mazu", id);
|
|
1288
|
+
data = data.filter((d) => d !== id);
|
|
1289
|
+
documentIdsToDelete.push(id);
|
|
1290
|
+
delete newDocs[id];
|
|
1291
|
+
} else {
|
|
1292
|
+
systemLog("dsp", "updateDocuments - updatuji", id);
|
|
1293
|
+
newDocs[id] = { ...newDocs[id], ...doc };
|
|
1294
|
+
documentsToPersist.push({ id, data: newDocs[id] });
|
|
1295
|
+
}
|
|
1296
|
+
break;
|
|
1297
|
+
}
|
|
1298
|
+
});
|
|
1299
|
+
} else {
|
|
1300
|
+
for (const key in uDocuments) {
|
|
1301
|
+
switch (mode) {
|
|
1302
|
+
case "replace":
|
|
1303
|
+
if (!newDocs[key]) {
|
|
1304
|
+
data.push(key);
|
|
1305
|
+
}
|
|
1306
|
+
if (uDocuments[key]._deleted) {
|
|
1307
|
+
data = data.filter((d) => d !== key);
|
|
1308
|
+
documentIdsToDelete.push(key);
|
|
1309
|
+
}
|
|
1434
1310
|
newDocs[key] = uDocuments[key];
|
|
1435
|
-
|
|
1311
|
+
if (uDocuments[key]._deleted) {
|
|
1312
|
+
delete newDocs[key];
|
|
1313
|
+
} else {
|
|
1314
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1315
|
+
}
|
|
1436
1316
|
break;
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1317
|
+
case "update":
|
|
1318
|
+
default:
|
|
1319
|
+
if (!newDocs[key]) {
|
|
1320
|
+
data.push(key);
|
|
1321
|
+
newDocs[key] = uDocuments[key];
|
|
1322
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1323
|
+
break;
|
|
1324
|
+
}
|
|
1325
|
+
if (uDocuments[key]._deleted) {
|
|
1326
|
+
data = data.filter((d) => d !== key);
|
|
1327
|
+
documentIdsToDelete.push(key);
|
|
1328
|
+
delete newDocs[key];
|
|
1329
|
+
} else {
|
|
1330
|
+
newDocs[key] = { ...newDocs[key], ...uDocuments[key] };
|
|
1331
|
+
documentsToPersist.push({ id: key, data: newDocs[key] });
|
|
1332
|
+
}
|
|
1333
|
+
break;
|
|
1334
|
+
}
|
|
1447
1335
|
}
|
|
1448
1336
|
}
|
|
1337
|
+
console.timeEnd("updateDocuments");
|
|
1338
|
+
return newDocs;
|
|
1339
|
+
});
|
|
1340
|
+
const unique = uuid();
|
|
1341
|
+
setProviders((prev) => {
|
|
1342
|
+
const newP = { ...prev };
|
|
1343
|
+
newP[model] = {
|
|
1344
|
+
...newP[model],
|
|
1345
|
+
data,
|
|
1346
|
+
lastUpdate: { id: unique, time: /* @__PURE__ */ new Date() }
|
|
1347
|
+
};
|
|
1348
|
+
return newP;
|
|
1349
|
+
});
|
|
1350
|
+
if (modelProvider?.isPersisting && persistenceStorage) {
|
|
1351
|
+
await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));
|
|
1352
|
+
await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));
|
|
1449
1353
|
}
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
if (fields) {
|
|
1476
|
-
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1477
|
-
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1478
|
-
const provider = presetProviders[model];
|
|
1479
|
-
systemLog("dsp", "[updateDocument]", provider);
|
|
1480
|
-
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1481
|
-
if (dP) {
|
|
1482
|
-
const dataFromSource = await getData({
|
|
1483
|
-
id: dP.id,
|
|
1484
|
-
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1485
|
-
isPersisting: !!dP.isPersisting && usePersistentStorage,
|
|
1486
|
-
schema: dP.schema,
|
|
1487
|
-
SQLite: SQLite2
|
|
1488
|
-
});
|
|
1489
|
-
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1490
|
-
data = dataFromSource;
|
|
1354
|
+
},
|
|
1355
|
+
[providers, setDocuments, setProviders, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1356
|
+
);
|
|
1357
|
+
const updateDocument = (0, import_react.useCallback)(
|
|
1358
|
+
async ({ documentId, model, fields, data: pData }) => {
|
|
1359
|
+
systemLog("dsp", "[updateDocument]:", documentId, ", model:", model);
|
|
1360
|
+
let data = pData;
|
|
1361
|
+
if (typeof pData === "function") data = pData(documents[documentId]);
|
|
1362
|
+
if (fields) {
|
|
1363
|
+
systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
|
|
1364
|
+
systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
|
|
1365
|
+
const provider = presetProviders[model];
|
|
1366
|
+
systemLog("dsp", "[updateDocument]", provider);
|
|
1367
|
+
let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
|
|
1368
|
+
if (dP) {
|
|
1369
|
+
const dataFromSource = await getData({
|
|
1370
|
+
id: dP.id,
|
|
1371
|
+
dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
|
|
1372
|
+
isPersisting: !!dP.isPersisting && !!persistenceStorage,
|
|
1373
|
+
schema: dP.schema,
|
|
1374
|
+
SQLite: persistenceStorage || void 0
|
|
1375
|
+
});
|
|
1376
|
+
systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
|
|
1377
|
+
data = dataFromSource;
|
|
1378
|
+
}
|
|
1491
1379
|
}
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1380
|
+
if (data) {
|
|
1381
|
+
var listeningProviders = 0;
|
|
1382
|
+
var isProvidersUpdated = false;
|
|
1383
|
+
const rand = uuid();
|
|
1384
|
+
setProviders((prev) => {
|
|
1385
|
+
systemLog("dsp", "[updateDocument] setProviders", rand);
|
|
1386
|
+
console.time("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1387
|
+
var newProviders = { ...prev };
|
|
1388
|
+
Object.keys(newProviders).forEach((key) => {
|
|
1389
|
+
const provider = newProviders[key];
|
|
1390
|
+
const providerNext = {
|
|
1391
|
+
...provider,
|
|
1392
|
+
data: Array.isArray(provider?.data) ? [...provider.data] : []
|
|
1393
|
+
};
|
|
1394
|
+
var socketListeners = providerNext.dataSource?.socketListeners || [];
|
|
1395
|
+
if (socketListeners.length === 0) {
|
|
1396
|
+
if (providerNext.data.includes(documentId)) {
|
|
1397
|
+
if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {
|
|
1398
|
+
systemLog("dsp", "[updateDocument] - zustava v Provider bez Listeners:", key);
|
|
1399
|
+
listeningProviders++;
|
|
1400
|
+
providerNext.lastUpdate = {
|
|
1401
|
+
id: uuid(),
|
|
1402
|
+
time: /* @__PURE__ */ new Date(),
|
|
1403
|
+
documentId
|
|
1404
|
+
};
|
|
1405
|
+
} else {
|
|
1406
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1407
|
+
isProvidersUpdated = true;
|
|
1408
|
+
providerNext.lastUpdate = {
|
|
1409
|
+
id: uuid(),
|
|
1410
|
+
time: /* @__PURE__ */ new Date(),
|
|
1411
|
+
documentId
|
|
1412
|
+
};
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
} else if (socketListeners.includes(model) || // socketListeners.includes(documentId) ||
|
|
1416
|
+
key === model) {
|
|
1417
|
+
if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {
|
|
1512
1418
|
listeningProviders++;
|
|
1513
1419
|
providerNext.lastUpdate = {
|
|
1514
1420
|
id: uuid(),
|
|
1515
1421
|
time: /* @__PURE__ */ new Date(),
|
|
1516
1422
|
documentId
|
|
1517
1423
|
};
|
|
1424
|
+
if (!providerNext.data.includes(documentId)) {
|
|
1425
|
+
providerNext.data.push(documentId);
|
|
1426
|
+
isProvidersUpdated = true;
|
|
1427
|
+
}
|
|
1518
1428
|
} else {
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1429
|
+
if (providerNext.data.includes(documentId)) {
|
|
1430
|
+
systemLog("dsp", "[updateDocument] - mazu:", key);
|
|
1431
|
+
providerNext.data = providerNext.data.filter((item) => item !== documentId);
|
|
1432
|
+
isProvidersUpdated = true;
|
|
1433
|
+
providerNext.lastUpdate = {
|
|
1434
|
+
id: uuid(),
|
|
1435
|
+
time: /* @__PURE__ */ new Date(),
|
|
1436
|
+
documentId
|
|
1437
|
+
};
|
|
1438
|
+
}
|
|
1526
1439
|
}
|
|
1527
1440
|
}
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
}
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
isProvidersUpdated = true;
|
|
1546
|
-
providerNext.lastUpdate = {
|
|
1547
|
-
id: uuid(),
|
|
1548
|
-
time: /* @__PURE__ */ new Date(),
|
|
1549
|
-
documentId
|
|
1441
|
+
newProviders[key] = providerNext;
|
|
1442
|
+
});
|
|
1443
|
+
console.timeEnd("[DSP UPDATE PROVIDERS INSIDE]");
|
|
1444
|
+
console.time("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1445
|
+
setDocuments((prev2) => {
|
|
1446
|
+
console.time("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1447
|
+
if (prev2[documentId]) {
|
|
1448
|
+
if (listeningProviders === 0) {
|
|
1449
|
+
const newD = { ...prev2 };
|
|
1450
|
+
delete newD[documentId];
|
|
1451
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1452
|
+
return newD;
|
|
1453
|
+
} else {
|
|
1454
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1455
|
+
return {
|
|
1456
|
+
...prev2,
|
|
1457
|
+
[documentId]: { ...prev2[documentId], ...data }
|
|
1550
1458
|
};
|
|
1551
1459
|
}
|
|
1460
|
+
} else if (listeningProviders > 0) {
|
|
1461
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1462
|
+
return { ...prev2, [documentId]: data };
|
|
1552
1463
|
}
|
|
1553
|
-
|
|
1554
|
-
|
|
1464
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1465
|
+
return prev2;
|
|
1466
|
+
});
|
|
1467
|
+
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1468
|
+
systemLog("dsp", "OUTSIDE", documentId);
|
|
1469
|
+
return newProviders;
|
|
1555
1470
|
});
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
if (prev2[documentId]) {
|
|
1471
|
+
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1472
|
+
if (isProvidersUpdated) {
|
|
1473
|
+
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1474
|
+
setCounterDocuments((prev) => {
|
|
1561
1475
|
if (listeningProviders === 0) {
|
|
1562
|
-
const newD = { ...
|
|
1476
|
+
const newD = { ...prev };
|
|
1563
1477
|
delete newD[documentId];
|
|
1564
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1565
1478
|
return newD;
|
|
1566
1479
|
} else {
|
|
1567
|
-
|
|
1568
|
-
return {
|
|
1569
|
-
...prev2,
|
|
1570
|
-
[documentId]: { ...prev2[documentId], ...data }
|
|
1571
|
-
};
|
|
1480
|
+
return { ...prev, [documentId]: listeningProviders };
|
|
1572
1481
|
}
|
|
1573
|
-
} else if (listeningProviders > 0) {
|
|
1574
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1575
|
-
return { ...prev2, [documentId]: data };
|
|
1576
|
-
}
|
|
1577
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
|
|
1578
|
-
return prev2;
|
|
1579
|
-
});
|
|
1580
|
-
console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
|
|
1581
|
-
systemLog("dsp", "OUTSIDE", documentId);
|
|
1582
|
-
return newProviders;
|
|
1583
|
-
});
|
|
1584
|
-
systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
|
|
1585
|
-
if (isProvidersUpdated) {
|
|
1586
|
-
systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
|
|
1587
|
-
setCounterDocuments((prev) => {
|
|
1588
|
-
if (listeningProviders === 0) {
|
|
1589
|
-
const newD = { ...prev };
|
|
1590
|
-
delete newD[documentId];
|
|
1591
|
-
return newD;
|
|
1592
|
-
} else {
|
|
1593
|
-
return { ...prev, [documentId]: listeningProviders };
|
|
1594
|
-
}
|
|
1595
|
-
});
|
|
1596
|
-
} else {
|
|
1597
|
-
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1598
|
-
}
|
|
1599
|
-
if (providers[model]?.isPersisting && usePersistentStorage) {
|
|
1600
|
-
if (listeningProviders > 0) {
|
|
1601
|
-
await persistDocument({
|
|
1602
|
-
documentId,
|
|
1603
|
-
model,
|
|
1604
|
-
data: { ...documents[documentId], ...data }
|
|
1605
1482
|
});
|
|
1606
1483
|
} else {
|
|
1607
|
-
|
|
1484
|
+
systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
|
|
1485
|
+
}
|
|
1486
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1487
|
+
if (listeningProviders > 0) {
|
|
1488
|
+
await persistDocument({
|
|
1489
|
+
documentId,
|
|
1490
|
+
model,
|
|
1491
|
+
data: { ...documents[documentId], ...data }
|
|
1492
|
+
});
|
|
1493
|
+
} else {
|
|
1494
|
+
await removePersistedDocument(documentId);
|
|
1495
|
+
}
|
|
1608
1496
|
}
|
|
1609
1497
|
}
|
|
1610
|
-
}
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
async ({
|
|
1616
|
-
id,
|
|
1617
|
-
documentId,
|
|
1618
|
-
params,
|
|
1619
|
-
variant,
|
|
1620
|
-
data
|
|
1621
|
-
}) => {
|
|
1622
|
-
if (!providers[id]) {
|
|
1623
|
-
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1624
|
-
return;
|
|
1625
|
-
}
|
|
1626
|
-
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1627
|
-
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1628
|
-
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1629
|
-
} else updateDocument({ documentId, model: id, data });
|
|
1630
|
-
return true;
|
|
1631
|
-
}
|
|
1632
|
-
systemLog(
|
|
1633
|
-
"dsp",
|
|
1634
|
-
"[updateDataStore] Posilam patchData: ",
|
|
1498
|
+
},
|
|
1499
|
+
[documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument, persistenceStorage]
|
|
1500
|
+
);
|
|
1501
|
+
const updateDataStore = (0, import_react.useCallback)(
|
|
1502
|
+
async ({
|
|
1635
1503
|
id,
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
"\n data: ",
|
|
1639
|
-
JSON.stringify(data, null, 2)
|
|
1640
|
-
);
|
|
1641
|
-
const result = await patchData({
|
|
1642
|
-
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1504
|
+
documentId,
|
|
1505
|
+
params,
|
|
1643
1506
|
variant,
|
|
1644
1507
|
data
|
|
1645
|
-
})
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1650
|
-
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1651
|
-
} else {
|
|
1652
|
-
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1508
|
+
}) => {
|
|
1509
|
+
if (!providers[id]) {
|
|
1510
|
+
systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
|
|
1511
|
+
return;
|
|
1653
1512
|
}
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
(0, import_react.useEffect)(() => {
|
|
1660
|
-
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1661
|
-
}, [dispatch, updateDocument]);
|
|
1662
|
-
const createDocument = (0, import_react.useCallback)(
|
|
1663
|
-
async ({ model, documentId, data }) => {
|
|
1664
|
-
const newDocument = data;
|
|
1665
|
-
systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1666
|
-
var providerListenersCount = 0;
|
|
1667
|
-
Object.keys(providers).forEach((key) => {
|
|
1668
|
-
const provider = providers[key];
|
|
1669
|
-
var socketListeners = provider.dataSource?.socketListeners;
|
|
1670
|
-
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1671
|
-
systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
|
|
1672
|
-
if (!provider.data.includes(documentId)) {
|
|
1673
|
-
providerListenersCount++;
|
|
1674
|
-
setProviders((prev) => ({
|
|
1675
|
-
...prev,
|
|
1676
|
-
[key]: {
|
|
1677
|
-
...prev[key],
|
|
1678
|
-
data: [...prev[key].data, documentId],
|
|
1679
|
-
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1680
|
-
}
|
|
1681
|
-
}));
|
|
1682
|
-
}
|
|
1683
|
-
}
|
|
1684
|
-
});
|
|
1685
|
-
if (providerListenersCount > 0) {
|
|
1686
|
-
if (providers[model]?.isPersisting && usePersistentStorage) {
|
|
1687
|
-
await persistDocument({ documentId, model, data: newDocument });
|
|
1513
|
+
if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
|
|
1514
|
+
if (!documents[documentId] && providers[id]?.autoCreate) {
|
|
1515
|
+
await createProviderItem({ id, data: { id: documentId, ...data } });
|
|
1516
|
+
} else updateDocument({ documentId, model: id, data });
|
|
1517
|
+
return true;
|
|
1688
1518
|
}
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1519
|
+
systemLog(
|
|
1520
|
+
"dsp",
|
|
1521
|
+
"[updateDataStore] Posilam patchData: ",
|
|
1522
|
+
id,
|
|
1523
|
+
",\n params: ",
|
|
1524
|
+
JSON.stringify(params, null, 2),
|
|
1525
|
+
"\n data: ",
|
|
1526
|
+
JSON.stringify(data, null, 2)
|
|
1527
|
+
);
|
|
1528
|
+
const result = await patchData({
|
|
1529
|
+
dataSource: renderJSONTemplate(providers[id].dataSource, params),
|
|
1530
|
+
variant,
|
|
1531
|
+
data
|
|
1532
|
+
});
|
|
1533
|
+
if (typeof result === "object") {
|
|
1534
|
+
const { id: rDocumentId, ...document } = result;
|
|
1535
|
+
if (!isLive) {
|
|
1536
|
+
systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
|
|
1537
|
+
updateDocument({ documentId: rDocumentId, model: id, data: document });
|
|
1697
1538
|
} else {
|
|
1698
|
-
|
|
1699
|
-
newC[documentId] = providerListenersCount;
|
|
1539
|
+
systemLog("dsp", "[updateDataStore] Updatuje Socket");
|
|
1700
1540
|
}
|
|
1701
|
-
return newC;
|
|
1702
|
-
});
|
|
1703
|
-
return { id: documentId, document: newDocument };
|
|
1704
|
-
} else return false;
|
|
1705
|
-
},
|
|
1706
|
-
[providers, setProviders, setCounterDocuments, setDocuments, persistDocument]
|
|
1707
|
-
);
|
|
1708
|
-
const deleteDocument = (0, import_react.useCallback)(
|
|
1709
|
-
async ({ documentId }) => {
|
|
1710
|
-
systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
|
|
1711
|
-
await removePersistedDocument(documentId);
|
|
1712
|
-
setDocuments((prev) => {
|
|
1713
|
-
const newDocs = { ...prev };
|
|
1714
|
-
systemLog("dsp", "[deleteDocument] MAZU ", documentId, " z ", newDocs);
|
|
1715
|
-
delete newDocs[documentId];
|
|
1716
|
-
systemLog("dsp", "[deleteDocument] NEW DOCS: ", newDocs);
|
|
1717
|
-
return newDocs;
|
|
1718
|
-
});
|
|
1719
|
-
setCounterDocuments((prev) => {
|
|
1720
|
-
const newC = { ...prev };
|
|
1721
|
-
delete newC[documentId];
|
|
1722
|
-
return newC;
|
|
1723
|
-
});
|
|
1724
|
-
setProviders((prev) => {
|
|
1725
|
-
var deletedCount = 0;
|
|
1726
|
-
const updatedDataObj = { ...prev };
|
|
1727
|
-
for (const key in updatedDataObj) {
|
|
1728
|
-
const initialLength = updatedDataObj[key].data.length;
|
|
1729
|
-
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1730
|
-
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1731
|
-
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1732
|
-
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1733
1541
|
}
|
|
1734
|
-
return
|
|
1735
|
-
}
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
(sockets2) => {
|
|
1777
|
-
if (sockets2) {
|
|
1778
|
-
systemLog("dsp", "[registerProviderSockets]", sockets2);
|
|
1779
|
-
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1780
|
-
setSockets((prev) => {
|
|
1781
|
-
const newS = { ...prev };
|
|
1782
|
-
d.forEach((item) => {
|
|
1783
|
-
if (newS[item]) {
|
|
1784
|
-
newS[item].listeners = newS[item].listeners + 1;
|
|
1542
|
+
return result;
|
|
1543
|
+
},
|
|
1544
|
+
[providers, documents, isLive, updateDocument]
|
|
1545
|
+
);
|
|
1546
|
+
(0, import_react.useEffect)(() => {
|
|
1547
|
+
socketActionHandlersRef.current = { dispatch, updateDocument };
|
|
1548
|
+
}, [dispatch, updateDocument]);
|
|
1549
|
+
const createDocument = (0, import_react.useCallback)(
|
|
1550
|
+
async ({ model, documentId, data }) => {
|
|
1551
|
+
const newDocument = data;
|
|
1552
|
+
systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
|
|
1553
|
+
var providerListenersCount = 0;
|
|
1554
|
+
Object.keys(providers).forEach((key) => {
|
|
1555
|
+
const provider = providers[key];
|
|
1556
|
+
var socketListeners = provider.dataSource?.socketListeners;
|
|
1557
|
+
if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
|
|
1558
|
+
systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
|
|
1559
|
+
if (!provider.data.includes(documentId)) {
|
|
1560
|
+
providerListenersCount++;
|
|
1561
|
+
setProviders((prev) => ({
|
|
1562
|
+
...prev,
|
|
1563
|
+
[key]: {
|
|
1564
|
+
...prev[key],
|
|
1565
|
+
data: [...prev[key].data, documentId],
|
|
1566
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1567
|
+
}
|
|
1568
|
+
}));
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
});
|
|
1572
|
+
if (providerListenersCount > 0) {
|
|
1573
|
+
if (providers[model]?.isPersisting && persistenceStorage) {
|
|
1574
|
+
await persistDocument({ documentId, model, data: newDocument });
|
|
1575
|
+
}
|
|
1576
|
+
setCounterDocuments((prev) => {
|
|
1577
|
+
const newC = { ...prev };
|
|
1578
|
+
if (newC[documentId]) {
|
|
1579
|
+
setDocuments((prev2) => ({
|
|
1580
|
+
...prev2,
|
|
1581
|
+
[documentId]: { ...prev2[documentId], ...newDocument }
|
|
1582
|
+
}));
|
|
1583
|
+
newC[documentId] = prev[documentId] + providerListenersCount;
|
|
1785
1584
|
} else {
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
handleSocketMessage(item, msg, {
|
|
1789
|
-
dispatch: currentDispatch,
|
|
1790
|
-
updateDocument: currentUpdateDocument
|
|
1791
|
-
});
|
|
1792
|
-
};
|
|
1793
|
-
socketRoomHandlersRef.current[item] = roomHandler;
|
|
1794
|
-
newS[item] = { listeners: 1, data: [] };
|
|
1795
|
-
socket.emit("joinRoom", item);
|
|
1796
|
-
socket.on(item, roomHandler);
|
|
1585
|
+
setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
|
|
1586
|
+
newC[documentId] = providerListenersCount;
|
|
1797
1587
|
}
|
|
1588
|
+
return newC;
|
|
1798
1589
|
});
|
|
1799
|
-
return
|
|
1590
|
+
return { id: documentId, document: newDocument };
|
|
1591
|
+
} else return false;
|
|
1592
|
+
},
|
|
1593
|
+
[providers, setProviders, setCounterDocuments, setDocuments, persistDocument, persistenceStorage]
|
|
1594
|
+
);
|
|
1595
|
+
const deleteDocument = (0, import_react.useCallback)(
|
|
1596
|
+
async ({ documentId }) => {
|
|
1597
|
+
systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
|
|
1598
|
+
await removePersistedDocument(documentId);
|
|
1599
|
+
setDocuments((prev) => {
|
|
1600
|
+
const newDocs = { ...prev };
|
|
1601
|
+
systemLog("dsp", "[deleteDocument] MAZU ", documentId, " z ", newDocs);
|
|
1602
|
+
delete newDocs[documentId];
|
|
1603
|
+
systemLog("dsp", "[deleteDocument] NEW DOCS: ", newDocs);
|
|
1604
|
+
return newDocs;
|
|
1800
1605
|
});
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
const unregisterProviderSockets = (0, import_react.useCallback)(
|
|
1806
|
-
(sockets2) => {
|
|
1807
|
-
systemLog("dsp", "[unregisterProviderSockets] Mazu sockety ", JSON.stringify(sockets2, null, 2));
|
|
1808
|
-
var removeSocketListeners = [];
|
|
1809
|
-
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1810
|
-
setSockets((prev) => {
|
|
1811
|
-
const newS = { ...prev };
|
|
1812
|
-
d.forEach((item) => {
|
|
1813
|
-
if (newS[item]?.listeners <= 1) {
|
|
1814
|
-
removeSocketListeners.push(item);
|
|
1815
|
-
const roomHandler = socketRoomHandlersRef.current[item];
|
|
1816
|
-
if (roomHandler) {
|
|
1817
|
-
socket.off(item, roomHandler);
|
|
1818
|
-
delete socketRoomHandlersRef.current[item];
|
|
1819
|
-
}
|
|
1820
|
-
delete newS[item];
|
|
1821
|
-
} else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
|
|
1606
|
+
setCounterDocuments((prev) => {
|
|
1607
|
+
const newC = { ...prev };
|
|
1608
|
+
delete newC[documentId];
|
|
1609
|
+
return newC;
|
|
1822
1610
|
});
|
|
1823
|
-
|
|
1824
|
-
|
|
1611
|
+
setProviders((prev) => {
|
|
1612
|
+
var deletedCount = 0;
|
|
1613
|
+
const updatedDataObj = { ...prev };
|
|
1614
|
+
for (const key in updatedDataObj) {
|
|
1615
|
+
const initialLength = updatedDataObj[key].data.length;
|
|
1616
|
+
updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
|
|
1617
|
+
updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
|
|
1618
|
+
deletedCount += initialLength - updatedDataObj[key].data.length;
|
|
1619
|
+
if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
|
|
1620
|
+
}
|
|
1621
|
+
return updatedDataObj;
|
|
1622
|
+
});
|
|
1623
|
+
},
|
|
1624
|
+
[setDocuments, setCounterDocuments, setProviders, removePersistedDocument]
|
|
1625
|
+
);
|
|
1626
|
+
const createProviderItem = (0, import_react.useCallback)(
|
|
1627
|
+
async ({ id, data }) => {
|
|
1628
|
+
if (!providers[id]) {
|
|
1629
|
+
systemLog("dsp", "[createProviderItem] Provider neexistuje:", id);
|
|
1630
|
+
return;
|
|
1825
1631
|
}
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
const updateProviderListeners = (0, import_react.useCallback)(
|
|
1832
|
-
async (id, val) => {
|
|
1833
|
-
systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
|
|
1834
|
-
setCounterProviders((prev) => {
|
|
1835
|
-
if (!prev[id]) return prev;
|
|
1836
|
-
if (prev[id] + val > 0) {
|
|
1837
|
-
return {
|
|
1838
|
-
...prev,
|
|
1839
|
-
[id]: prev[id] + val
|
|
1840
|
-
};
|
|
1841
|
-
} else {
|
|
1842
|
-
setProviders((prevP) => {
|
|
1843
|
-
systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
|
|
1844
|
-
setSockets((prevS) => {
|
|
1845
|
-
var removeSocketListeners = [];
|
|
1846
|
-
const newS = { ...prevS };
|
|
1847
|
-
const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
|
|
1848
|
-
providerSocketListeners.forEach((socketName) => {
|
|
1849
|
-
if (!newS[socketName]) return;
|
|
1850
|
-
if (newS[socketName].listeners + val <= 0) {
|
|
1851
|
-
const roomHandler = socketRoomHandlersRef.current[socketName];
|
|
1852
|
-
if (roomHandler) {
|
|
1853
|
-
socket.off(socketName, roomHandler);
|
|
1854
|
-
delete socketRoomHandlersRef.current[socketName];
|
|
1855
|
-
}
|
|
1856
|
-
delete newS[socketName];
|
|
1857
|
-
removeSocketListeners.push(socketName);
|
|
1858
|
-
} else {
|
|
1859
|
-
newS[socketName].listeners = newS[socketName].listeners + val;
|
|
1860
|
-
}
|
|
1861
|
-
});
|
|
1862
|
-
if (removeSocketListeners.length > 0) {
|
|
1863
|
-
socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
|
|
1864
|
-
}
|
|
1865
|
-
return newS;
|
|
1866
|
-
});
|
|
1867
|
-
setCounterDocuments((prevC) => {
|
|
1868
|
-
const newC = { ...prevC };
|
|
1869
|
-
prevP[id].data.forEach((document) => {
|
|
1870
|
-
if (newC[document] + val <= 0) {
|
|
1871
|
-
setDocuments((prev2) => {
|
|
1872
|
-
const newD = { ...prev2 };
|
|
1873
|
-
delete newD[document];
|
|
1874
|
-
return newD;
|
|
1875
|
-
});
|
|
1876
|
-
delete newC[document];
|
|
1877
|
-
} else {
|
|
1878
|
-
newC[document] = newC[document] + val;
|
|
1879
|
-
}
|
|
1880
|
-
});
|
|
1881
|
-
return newC;
|
|
1882
|
-
});
|
|
1883
|
-
const newP = { ...prevP };
|
|
1884
|
-
delete newP[id];
|
|
1885
|
-
return newP;
|
|
1886
|
-
});
|
|
1887
|
-
const newProvs = { ...prev };
|
|
1888
|
-
delete newProvs[id];
|
|
1889
|
-
return newProvs;
|
|
1632
|
+
if (!providers[id].dataSource) {
|
|
1633
|
+
const { id: dId, ...rData } = data;
|
|
1634
|
+
const documentId = dId || uuid();
|
|
1635
|
+
const result2 = createDocument({ model: id, documentId, data: rData });
|
|
1636
|
+
return result2;
|
|
1890
1637
|
}
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
const registerProvider = (0, import_react.useCallback)(
|
|
1896
|
-
async (newItem) => {
|
|
1897
|
-
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1898
|
-
let result;
|
|
1899
|
-
const { id, ...provider } = newItem;
|
|
1900
|
-
if (providers[id]) {
|
|
1901
|
-
setCounterProviders((prev) => {
|
|
1902
|
-
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1903
|
-
return {
|
|
1904
|
-
...prev,
|
|
1905
|
-
[id]: prev[id] + 1
|
|
1906
|
-
};
|
|
1907
|
-
});
|
|
1908
|
-
result = providers[id];
|
|
1909
|
-
} else {
|
|
1910
|
-
const dataFromSource = await getData({
|
|
1911
|
-
schema: newItem.schema,
|
|
1912
|
-
dataSource: newItem.dataSource || {},
|
|
1913
|
-
id: newItem.id,
|
|
1914
|
-
isPersisting: !!newItem.isPersisting && usePersistentStorage,
|
|
1915
|
-
SQLite: SQLite2
|
|
1638
|
+
const result = await postData({
|
|
1639
|
+
dataSource: providers[id].dataSource,
|
|
1640
|
+
schema: providers[id].schema,
|
|
1641
|
+
val: data
|
|
1916
1642
|
});
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
} else {
|
|
1932
|
-
items[id2] = data;
|
|
1933
|
-
}
|
|
1643
|
+
return result;
|
|
1644
|
+
},
|
|
1645
|
+
[providers, createDocument]
|
|
1646
|
+
);
|
|
1647
|
+
const deleteProviderItem = (0, import_react.useCallback)(
|
|
1648
|
+
async ({ providerId, data, params }) => {
|
|
1649
|
+
if (!providers[providerId]) {
|
|
1650
|
+
systemLog("dsp", "[deleteProviderItem] Provider neexistuje:", providerId);
|
|
1651
|
+
return;
|
|
1652
|
+
}
|
|
1653
|
+
const response = await deleteData({
|
|
1654
|
+
dataSource: renderJSONTemplate(providers[providerId].dataSource, params),
|
|
1655
|
+
// dataSource: providers[providerId].dataSource,
|
|
1656
|
+
data
|
|
1934
1657
|
});
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1658
|
+
return response;
|
|
1659
|
+
},
|
|
1660
|
+
[providers]
|
|
1661
|
+
);
|
|
1662
|
+
const registerProviderSockets = (0, import_react.useCallback)(
|
|
1663
|
+
(sockets2) => {
|
|
1664
|
+
if (sockets2) {
|
|
1665
|
+
systemLog("dsp", "[registerProviderSockets]", sockets2);
|
|
1666
|
+
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1667
|
+
setSockets((prev) => {
|
|
1668
|
+
const newS = { ...prev };
|
|
1669
|
+
d.forEach((item) => {
|
|
1670
|
+
if (newS[item]) {
|
|
1671
|
+
newS[item].listeners = newS[item].listeners + 1;
|
|
1941
1672
|
} else {
|
|
1942
|
-
|
|
1673
|
+
const roomHandler = (msg) => {
|
|
1674
|
+
const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;
|
|
1675
|
+
handleSocketMessage(item, msg, {
|
|
1676
|
+
dispatch: currentDispatch,
|
|
1677
|
+
updateDocument: currentUpdateDocument
|
|
1678
|
+
});
|
|
1679
|
+
};
|
|
1680
|
+
socketRoomHandlersRef.current[item] = roomHandler;
|
|
1681
|
+
newS[item] = { listeners: 1, data: [] };
|
|
1682
|
+
socket.emit("joinRoom", item);
|
|
1683
|
+
socket.on(item, roomHandler);
|
|
1943
1684
|
}
|
|
1944
1685
|
});
|
|
1945
|
-
return
|
|
1686
|
+
return newS;
|
|
1687
|
+
});
|
|
1688
|
+
}
|
|
1689
|
+
},
|
|
1690
|
+
[setSockets, socket]
|
|
1691
|
+
);
|
|
1692
|
+
const unregisterProviderSockets = (0, import_react.useCallback)(
|
|
1693
|
+
(sockets2) => {
|
|
1694
|
+
systemLog("dsp", "[unregisterProviderSockets] Mazu sockety ", JSON.stringify(sockets2, null, 2));
|
|
1695
|
+
var removeSocketListeners = [];
|
|
1696
|
+
var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
|
|
1697
|
+
setSockets((prev) => {
|
|
1698
|
+
const newS = { ...prev };
|
|
1699
|
+
d.forEach((item) => {
|
|
1700
|
+
if (newS[item]?.listeners <= 1) {
|
|
1701
|
+
removeSocketListeners.push(item);
|
|
1702
|
+
const roomHandler = socketRoomHandlersRef.current[item];
|
|
1703
|
+
if (roomHandler) {
|
|
1704
|
+
socket.off(item, roomHandler);
|
|
1705
|
+
delete socketRoomHandlersRef.current[item];
|
|
1706
|
+
}
|
|
1707
|
+
delete newS[item];
|
|
1708
|
+
} else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
|
|
1709
|
+
});
|
|
1710
|
+
if (removeSocketListeners.length > 0) {
|
|
1711
|
+
socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
|
|
1946
1712
|
}
|
|
1713
|
+
return newS;
|
|
1947
1714
|
});
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
[id]: result
|
|
1958
|
-
}));
|
|
1959
|
-
setCounterProviders((prev) => ({
|
|
1960
|
-
...prev,
|
|
1961
|
-
[id]: 1
|
|
1962
|
-
}));
|
|
1963
|
-
dataList;
|
|
1964
|
-
if (provider.dataSource?.socketListeners) registerProviderSockets(provider.dataSource.socketListeners);
|
|
1965
|
-
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1966
|
-
}
|
|
1967
|
-
return result;
|
|
1968
|
-
},
|
|
1969
|
-
[providers, SQLite2, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets]
|
|
1970
|
-
);
|
|
1971
|
-
const unregisterProvider = (0, import_react.useCallback)(
|
|
1972
|
-
async (itemId) => {
|
|
1973
|
-
setCounterProviders((prev) => {
|
|
1974
|
-
if (prev[itemId]) {
|
|
1975
|
-
if (prev[itemId] > 1) {
|
|
1976
|
-
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1715
|
+
},
|
|
1716
|
+
[setSockets, socket]
|
|
1717
|
+
);
|
|
1718
|
+
const updateProviderListeners = (0, import_react.useCallback)(
|
|
1719
|
+
async (id, val) => {
|
|
1720
|
+
systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
|
|
1721
|
+
setCounterProviders((prev) => {
|
|
1722
|
+
if (!prev[id]) return prev;
|
|
1723
|
+
if (prev[id] + val > 0) {
|
|
1977
1724
|
return {
|
|
1978
1725
|
...prev,
|
|
1979
|
-
[
|
|
1726
|
+
[id]: prev[id] + val
|
|
1980
1727
|
};
|
|
1981
1728
|
} else {
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1729
|
+
setProviders((prevP) => {
|
|
1730
|
+
systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
|
|
1731
|
+
setSockets((prevS) => {
|
|
1732
|
+
var removeSocketListeners = [];
|
|
1733
|
+
const newS = { ...prevS };
|
|
1734
|
+
const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
|
|
1735
|
+
providerSocketListeners.forEach((socketName) => {
|
|
1736
|
+
if (!newS[socketName]) return;
|
|
1737
|
+
if (newS[socketName].listeners + val <= 0) {
|
|
1738
|
+
const roomHandler = socketRoomHandlersRef.current[socketName];
|
|
1739
|
+
if (roomHandler) {
|
|
1740
|
+
socket.off(socketName, roomHandler);
|
|
1741
|
+
delete socketRoomHandlersRef.current[socketName];
|
|
1742
|
+
}
|
|
1743
|
+
delete newS[socketName];
|
|
1744
|
+
removeSocketListeners.push(socketName);
|
|
1745
|
+
} else {
|
|
1746
|
+
newS[socketName].listeners = newS[socketName].listeners + val;
|
|
1747
|
+
}
|
|
1748
|
+
});
|
|
1749
|
+
if (removeSocketListeners.length > 0) {
|
|
1750
|
+
socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
|
|
1751
|
+
}
|
|
1752
|
+
return newS;
|
|
1993
1753
|
});
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
1754
|
+
setCounterDocuments((prevC) => {
|
|
1755
|
+
const newC = { ...prevC };
|
|
1756
|
+
prevP[id].data.forEach((document) => {
|
|
1757
|
+
if (newC[document] + val <= 0) {
|
|
1758
|
+
setDocuments((prev2) => {
|
|
1759
|
+
const newD = { ...prev2 };
|
|
1760
|
+
delete newD[document];
|
|
1761
|
+
return newD;
|
|
1762
|
+
});
|
|
1763
|
+
delete newC[document];
|
|
1764
|
+
} else {
|
|
1765
|
+
newC[document] = newC[document] + val;
|
|
1766
|
+
}
|
|
2001
1767
|
});
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
delete newProvs2[itemId];
|
|
2008
|
-
return newProvs2;
|
|
1768
|
+
return newC;
|
|
1769
|
+
});
|
|
1770
|
+
const newP = { ...prevP };
|
|
1771
|
+
delete newP[id];
|
|
1772
|
+
return newP;
|
|
2009
1773
|
});
|
|
2010
1774
|
const newProvs = { ...prev };
|
|
2011
|
-
delete newProvs[
|
|
1775
|
+
delete newProvs[id];
|
|
2012
1776
|
return newProvs;
|
|
2013
1777
|
}
|
|
2014
|
-
}
|
|
2015
|
-
}
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
1778
|
+
});
|
|
1779
|
+
},
|
|
1780
|
+
[setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
|
|
1781
|
+
);
|
|
1782
|
+
const registerProvider = (0, import_react.useCallback)(
|
|
1783
|
+
async (newItem) => {
|
|
1784
|
+
systemLog("dsp", "[registerProvider]", newItem.id);
|
|
1785
|
+
let result;
|
|
1786
|
+
const { id, ...provider } = newItem;
|
|
1787
|
+
if (providers[id]) {
|
|
1788
|
+
setCounterProviders((prev) => {
|
|
1789
|
+
systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
|
|
1790
|
+
return {
|
|
1791
|
+
...prev,
|
|
1792
|
+
[id]: prev[id] + 1
|
|
1793
|
+
};
|
|
1794
|
+
});
|
|
1795
|
+
result = providers[id];
|
|
1796
|
+
} else {
|
|
1797
|
+
try {
|
|
1798
|
+
const dataFromSource = await getData({
|
|
1799
|
+
schema: newItem.schema,
|
|
1800
|
+
dataSource: newItem.dataSource || {},
|
|
1801
|
+
id: newItem.id,
|
|
1802
|
+
isPersisting: !!newItem.isPersisting && !!persistenceStorage,
|
|
1803
|
+
SQLite: persistenceStorage || void 0
|
|
1804
|
+
});
|
|
1805
|
+
console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1806
|
+
var dataList = [];
|
|
1807
|
+
var items = {};
|
|
1808
|
+
const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];
|
|
1809
|
+
dataS.forEach((item) => {
|
|
1810
|
+
if (!item) return;
|
|
1811
|
+
const { id: itId, ...data } = item;
|
|
1812
|
+
const normalizedId = itId || uuid();
|
|
1813
|
+
dataList.push(normalizedId);
|
|
1814
|
+
if (documents[normalizedId]) {
|
|
1815
|
+
items[normalizedId] = {
|
|
1816
|
+
...documents[normalizedId],
|
|
1817
|
+
...data
|
|
1818
|
+
};
|
|
1819
|
+
} else {
|
|
1820
|
+
items[normalizedId] = data;
|
|
1821
|
+
}
|
|
1822
|
+
});
|
|
1823
|
+
setCounterDocuments((prev) => {
|
|
1824
|
+
const newC = { ...prev };
|
|
1825
|
+
dataList.forEach((itemId) => {
|
|
1826
|
+
if (newC[itemId]) {
|
|
1827
|
+
newC[itemId] = newC[itemId] + 1;
|
|
1828
|
+
} else {
|
|
1829
|
+
newC[itemId] = 1;
|
|
1830
|
+
}
|
|
1831
|
+
});
|
|
1832
|
+
return newC;
|
|
1833
|
+
});
|
|
1834
|
+
if (Object.keys(items).length > 0) {
|
|
1835
|
+
setDocuments((prev) => ({ ...prev, ...items }));
|
|
1836
|
+
}
|
|
1837
|
+
result = {
|
|
1838
|
+
...provider,
|
|
1839
|
+
data: dataList,
|
|
1840
|
+
lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
|
|
1841
|
+
};
|
|
1842
|
+
setProviders((prev) => ({
|
|
1843
|
+
...prev,
|
|
1844
|
+
[id]: result
|
|
1845
|
+
}));
|
|
1846
|
+
setCounterProviders((prev) => ({
|
|
1847
|
+
...prev,
|
|
1848
|
+
[id]: 1
|
|
1849
|
+
}));
|
|
1850
|
+
if (provider.dataSource?.socketListeners) {
|
|
1851
|
+
registerProviderSockets(provider.dataSource.socketListeners);
|
|
1852
|
+
}
|
|
1853
|
+
console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
|
|
1854
|
+
} catch (error) {
|
|
1855
|
+
console.error("[DataStoreProvider] registerProvider:error", { id: newItem.id, error });
|
|
1856
|
+
throw error;
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
return result;
|
|
1860
|
+
},
|
|
1861
|
+
[providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage]
|
|
1862
|
+
);
|
|
1863
|
+
const unregisterProvider = (0, import_react.useCallback)(
|
|
1864
|
+
async (itemId) => {
|
|
1865
|
+
setCounterProviders((prev) => {
|
|
1866
|
+
if (prev[itemId]) {
|
|
1867
|
+
if (prev[itemId] > 1) {
|
|
1868
|
+
systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
|
|
1869
|
+
return {
|
|
1870
|
+
...prev,
|
|
1871
|
+
[itemId]: prev[itemId] - 1
|
|
1872
|
+
};
|
|
1873
|
+
} else {
|
|
1874
|
+
systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
|
|
1875
|
+
unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
|
|
1876
|
+
systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
|
|
1877
|
+
setCounterDocuments((cd) => {
|
|
1878
|
+
const newC = { ...cd };
|
|
1879
|
+
const deleteDocumentIds = [];
|
|
1880
|
+
providers[itemId].data.forEach((docId) => {
|
|
1881
|
+
if (newC[docId] <= 1) {
|
|
1882
|
+
deleteDocumentIds.push(docId);
|
|
1883
|
+
delete newC[docId];
|
|
1884
|
+
} else newC[docId] = newC[docId] - 1;
|
|
1885
|
+
});
|
|
1886
|
+
if (deleteDocumentIds.length > 0) {
|
|
1887
|
+
setDocuments((pd) => {
|
|
1888
|
+
const newD = { ...pd };
|
|
1889
|
+
deleteDocumentIds.forEach((docId) => {
|
|
1890
|
+
delete newD[docId];
|
|
1891
|
+
});
|
|
1892
|
+
return newD;
|
|
1893
|
+
});
|
|
1894
|
+
}
|
|
1895
|
+
return newC;
|
|
1896
|
+
});
|
|
1897
|
+
setProviders((pp) => {
|
|
1898
|
+
const newProvs2 = { ...pp };
|
|
1899
|
+
delete newProvs2[itemId];
|
|
1900
|
+
return newProvs2;
|
|
1901
|
+
});
|
|
1902
|
+
const newProvs = { ...prev };
|
|
1903
|
+
delete newProvs[itemId];
|
|
1904
|
+
return newProvs;
|
|
1905
|
+
}
|
|
1906
|
+
} else return prev;
|
|
1907
|
+
});
|
|
1908
|
+
},
|
|
1909
|
+
[setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets]
|
|
1910
|
+
);
|
|
1911
|
+
const actionsValue = (0, import_react.useMemo)(
|
|
1912
|
+
() => ({
|
|
1913
|
+
dispatch,
|
|
1914
|
+
initProvider,
|
|
1915
|
+
resetProvider,
|
|
1916
|
+
registerProvider,
|
|
1917
|
+
unregisterProvider,
|
|
1918
|
+
updateProviderListeners,
|
|
1919
|
+
resetDataStore,
|
|
1920
|
+
startSockets,
|
|
1921
|
+
stopSockets,
|
|
1922
|
+
registerProviderSockets,
|
|
1923
|
+
unregisterProviderSockets,
|
|
1924
|
+
updateDocuments,
|
|
1925
|
+
presetProviders
|
|
1926
|
+
}),
|
|
1927
|
+
[
|
|
1928
|
+
dispatch,
|
|
1929
|
+
initProvider,
|
|
1930
|
+
resetProvider,
|
|
1931
|
+
registerProvider,
|
|
1932
|
+
unregisterProvider,
|
|
1933
|
+
updateProviderListeners,
|
|
1934
|
+
resetDataStore,
|
|
1935
|
+
startSockets,
|
|
1936
|
+
stopSockets,
|
|
1937
|
+
registerProviderSockets,
|
|
1938
|
+
unregisterProviderSockets,
|
|
1939
|
+
updateDocuments,
|
|
1940
|
+
presetProviders
|
|
1941
|
+
]
|
|
1942
|
+
);
|
|
1943
|
+
const metaValue = (0, import_react.useMemo)(
|
|
1944
|
+
() => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),
|
|
1945
|
+
[isLive, isSynchronizing, sockets, counterProviders, counterDocuments]
|
|
1946
|
+
);
|
|
1947
|
+
const stableValue = (0, import_react.useMemo)(
|
|
1948
|
+
() => ({
|
|
1949
|
+
dispatch,
|
|
1950
|
+
presetProviders,
|
|
1951
|
+
updateProviderListeners,
|
|
1952
|
+
subscribeToProvider,
|
|
1953
|
+
getProviderLastUpdate,
|
|
1954
|
+
getExternalDocuments,
|
|
1955
|
+
getExternalProviders
|
|
1956
|
+
}),
|
|
1957
|
+
[
|
|
1958
|
+
dispatch,
|
|
1959
|
+
presetProviders,
|
|
1960
|
+
updateProviderListeners,
|
|
1961
|
+
subscribeToProvider,
|
|
1962
|
+
getProviderLastUpdate,
|
|
1963
|
+
getExternalDocuments,
|
|
1964
|
+
getExternalProviders
|
|
1965
|
+
]
|
|
1966
|
+
);
|
|
1967
|
+
(0, import_react.useImperativeHandle)(ref, () => actionsValue, [actionsValue]);
|
|
1968
|
+
systemLog("dsp", "END");
|
|
1969
|
+
return (
|
|
1970
|
+
// <DatabaseProvider>
|
|
1971
|
+
/* @__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 }) }) }) }) })
|
|
1972
|
+
);
|
|
1973
|
+
}
|
|
1974
|
+
);
|
|
2081
1975
|
var DataStoreProvider_default = DataStoreProvider;
|
|
2082
1976
|
|
|
2083
1977
|
// src/useDataProvider.tsx
|
|
@@ -2347,7 +2241,6 @@ var COLOR_DS = COLOR_MAGENTA;
|
|
|
2347
2241
|
DataStoreProvider,
|
|
2348
2242
|
DataStoreProvidersContext,
|
|
2349
2243
|
DataStoreStableContext,
|
|
2350
|
-
SQLite,
|
|
2351
2244
|
dataStoreFilterObject,
|
|
2352
2245
|
doesObjectMatchFilter,
|
|
2353
2246
|
doesValueMatchFilter,
|