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