@instantdb/core 0.22.97 → 0.22.98-experimental.drewh-ts-target.20762041587.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/Connection.js +50 -51
- package/dist/commonjs/Connection.js.map +1 -1
- package/dist/commonjs/InMemoryStorage.js +13 -32
- package/dist/commonjs/InMemoryStorage.js.map +1 -1
- package/dist/commonjs/IndexedDBStorage.js +193 -217
- package/dist/commonjs/IndexedDBStorage.js.map +1 -1
- package/dist/commonjs/InstantError.js +1 -0
- package/dist/commonjs/InstantError.js.map +1 -1
- package/dist/commonjs/Reactor.js +566 -610
- package/dist/commonjs/Reactor.js.map +1 -1
- package/dist/commonjs/StorageAPI.js +51 -70
- package/dist/commonjs/StorageAPI.js.map +1 -1
- package/dist/commonjs/SyncTable.js +68 -81
- package/dist/commonjs/SyncTable.js.map +1 -1
- package/dist/commonjs/WindowNetworkListener.js +2 -13
- package/dist/commonjs/WindowNetworkListener.js.map +1 -1
- package/dist/commonjs/__types__/fieldsTypeTest.js +8 -16
- package/dist/commonjs/__types__/fieldsTypeTest.js.map +1 -1
- package/dist/commonjs/__types__/useDatesTypeTest.js +3 -6
- package/dist/commonjs/__types__/useDatesTypeTest.js.map +1 -1
- package/dist/commonjs/authAPI.js +62 -79
- package/dist/commonjs/authAPI.js.map +1 -1
- package/dist/commonjs/createRouteHandler.js +5 -15
- package/dist/commonjs/createRouteHandler.js.map +1 -1
- package/dist/commonjs/datalog.js +1 -1
- package/dist/commonjs/datalog.js.map +1 -1
- package/dist/commonjs/devtool.js +26 -8
- package/dist/commonjs/devtool.js.map +1 -1
- package/dist/commonjs/framework.d.ts.map +1 -1
- package/dist/commonjs/framework.js +142 -152
- package/dist/commonjs/framework.js.map +1 -1
- package/dist/commonjs/index.js +204 -190
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/instaml.js +44 -30
- package/dist/commonjs/instaml.js.map +1 -1
- package/dist/commonjs/instaql.js +25 -33
- package/dist/commonjs/instaql.js.map +1 -1
- package/dist/commonjs/parseSchemaFromJSON.js +6 -7
- package/dist/commonjs/parseSchemaFromJSON.js.map +1 -1
- package/dist/commonjs/presence.js +7 -8
- package/dist/commonjs/presence.js.map +1 -1
- package/dist/commonjs/queryValidation.js +1 -2
- package/dist/commonjs/queryValidation.js.map +1 -1
- package/dist/commonjs/schema.js +8 -6
- package/dist/commonjs/schema.js.map +1 -1
- package/dist/commonjs/schemaTypes.js +22 -3
- package/dist/commonjs/schemaTypes.js.map +1 -1
- package/dist/commonjs/store.js +29 -38
- package/dist/commonjs/store.js.map +1 -1
- package/dist/commonjs/transactionValidation.js +1 -2
- package/dist/commonjs/transactionValidation.js.map +1 -1
- package/dist/commonjs/utils/Deferred.js +3 -0
- package/dist/commonjs/utils/Deferred.js.map +1 -1
- package/dist/commonjs/utils/PersistedObject.js +216 -233
- package/dist/commonjs/utils/PersistedObject.js.map +1 -1
- package/dist/commonjs/utils/fetch.js +9 -19
- package/dist/commonjs/utils/fetch.js.map +1 -1
- package/dist/commonjs/utils/linkIndex.js +2 -4
- package/dist/commonjs/utils/linkIndex.js.map +1 -1
- package/dist/commonjs/utils/object.js +1 -1
- package/dist/commonjs/utils/object.js.map +1 -1
- package/dist/esm/Connection.js +50 -51
- package/dist/esm/Connection.js.map +1 -1
- package/dist/esm/InMemoryStorage.js +13 -32
- package/dist/esm/InMemoryStorage.js.map +1 -1
- package/dist/esm/IndexedDBStorage.js +193 -217
- package/dist/esm/IndexedDBStorage.js.map +1 -1
- package/dist/esm/InstantError.js +1 -0
- package/dist/esm/InstantError.js.map +1 -1
- package/dist/esm/Reactor.js +566 -610
- package/dist/esm/Reactor.js.map +1 -1
- package/dist/esm/StorageAPI.js +51 -70
- package/dist/esm/StorageAPI.js.map +1 -1
- package/dist/esm/SyncTable.js +68 -81
- package/dist/esm/SyncTable.js.map +1 -1
- package/dist/esm/WindowNetworkListener.js +2 -13
- package/dist/esm/WindowNetworkListener.js.map +1 -1
- package/dist/esm/__types__/fieldsTypeTest.js +8 -16
- package/dist/esm/__types__/fieldsTypeTest.js.map +1 -1
- package/dist/esm/__types__/useDatesTypeTest.js +3 -6
- package/dist/esm/__types__/useDatesTypeTest.js.map +1 -1
- package/dist/esm/authAPI.js +62 -79
- package/dist/esm/authAPI.js.map +1 -1
- package/dist/esm/createRouteHandler.js +5 -15
- package/dist/esm/createRouteHandler.js.map +1 -1
- package/dist/esm/datalog.js +1 -1
- package/dist/esm/datalog.js.map +1 -1
- package/dist/esm/devtool.js +26 -8
- package/dist/esm/devtool.js.map +1 -1
- package/dist/esm/framework.d.ts.map +1 -1
- package/dist/esm/framework.js +142 -152
- package/dist/esm/framework.js.map +1 -1
- package/dist/esm/index.js +204 -190
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/instaml.js +44 -30
- package/dist/esm/instaml.js.map +1 -1
- package/dist/esm/instaql.js +25 -33
- package/dist/esm/instaql.js.map +1 -1
- package/dist/esm/parseSchemaFromJSON.js +6 -7
- package/dist/esm/parseSchemaFromJSON.js.map +1 -1
- package/dist/esm/presence.js +7 -8
- package/dist/esm/presence.js.map +1 -1
- package/dist/esm/queryValidation.js +1 -2
- package/dist/esm/queryValidation.js.map +1 -1
- package/dist/esm/schema.js +8 -6
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/schemaTypes.js +22 -3
- package/dist/esm/schemaTypes.js.map +1 -1
- package/dist/esm/store.js +29 -38
- package/dist/esm/store.js.map +1 -1
- package/dist/esm/transactionValidation.js +1 -2
- package/dist/esm/transactionValidation.js.map +1 -1
- package/dist/esm/utils/Deferred.js +3 -0
- package/dist/esm/utils/Deferred.js.map +1 -1
- package/dist/esm/utils/PersistedObject.js +216 -233
- package/dist/esm/utils/PersistedObject.js.map +1 -1
- package/dist/esm/utils/fetch.js +9 -19
- package/dist/esm/utils/fetch.js.map +1 -1
- package/dist/esm/utils/linkIndex.js +2 -4
- package/dist/esm/utils/linkIndex.js.map +1 -1
- package/dist/esm/utils/object.js +1 -1
- package/dist/esm/utils/object.js.map +1 -1
- package/dist/standalone/index.js +2610 -2367
- package/dist/standalone/index.umd.cjs +3 -3
- package/package.json +2 -2
- package/src/framework.ts +0 -1
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.uploadFile = uploadFile;
|
|
13
4
|
exports.deleteFile = deleteFile;
|
|
@@ -15,77 +6,67 @@ exports.getSignedUploadUrl = getSignedUploadUrl;
|
|
|
15
6
|
exports.upload = upload;
|
|
16
7
|
exports.getDownloadUrl = getDownloadUrl;
|
|
17
8
|
const fetch_js_1 = require("./utils/fetch.js");
|
|
18
|
-
function uploadFile(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
body: file,
|
|
33
|
-
});
|
|
34
|
-
return data;
|
|
9
|
+
async function uploadFile({ apiURI, appId, path, file, refreshToken, contentType, contentDisposition, }) {
|
|
10
|
+
const headers = {
|
|
11
|
+
app_id: appId,
|
|
12
|
+
path,
|
|
13
|
+
authorization: `Bearer ${refreshToken}`,
|
|
14
|
+
'content-type': contentType || file.type,
|
|
15
|
+
};
|
|
16
|
+
if (contentDisposition) {
|
|
17
|
+
headers['content-disposition'] = contentDisposition;
|
|
18
|
+
}
|
|
19
|
+
const data = await (0, fetch_js_1.jsonFetch)(`${apiURI}/storage/upload`, {
|
|
20
|
+
method: 'PUT',
|
|
21
|
+
headers,
|
|
22
|
+
body: file,
|
|
35
23
|
});
|
|
24
|
+
return data;
|
|
36
25
|
}
|
|
37
|
-
function deleteFile(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
return data;
|
|
26
|
+
async function deleteFile({ apiURI, appId, path, refreshToken, }) {
|
|
27
|
+
const { data } = await (0, fetch_js_1.jsonFetch)(`${apiURI}/storage/files?app_id=${appId}&filename=${encodeURIComponent(path)}`, {
|
|
28
|
+
method: 'DELETE',
|
|
29
|
+
headers: {
|
|
30
|
+
'content-type': 'application/json',
|
|
31
|
+
authorization: `Bearer ${refreshToken}`,
|
|
32
|
+
},
|
|
47
33
|
});
|
|
34
|
+
return data;
|
|
48
35
|
}
|
|
49
36
|
// Deprecated Storage API (Jan 2025)
|
|
50
37
|
// ---------------------------------
|
|
51
|
-
function getSignedUploadUrl(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}),
|
|
63
|
-
});
|
|
64
|
-
return data;
|
|
38
|
+
async function getSignedUploadUrl({ apiURI, appId, fileName, refreshToken, metadata = {}, }) {
|
|
39
|
+
const { data } = await (0, fetch_js_1.jsonFetch)(`${apiURI}/storage/signed-upload-url`, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: {
|
|
42
|
+
'content-type': 'application/json',
|
|
43
|
+
authorization: `Bearer ${refreshToken}`,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
app_id: appId,
|
|
47
|
+
filename: fileName,
|
|
48
|
+
}),
|
|
65
49
|
});
|
|
50
|
+
return data;
|
|
66
51
|
}
|
|
67
|
-
function upload(presignedUrl, file) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
return response.ok;
|
|
52
|
+
async function upload(presignedUrl, file) {
|
|
53
|
+
const response = await fetch(presignedUrl, {
|
|
54
|
+
method: 'PUT',
|
|
55
|
+
body: file,
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': file.type,
|
|
58
|
+
},
|
|
77
59
|
});
|
|
60
|
+
return response.ok;
|
|
78
61
|
}
|
|
79
|
-
function getDownloadUrl(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
},
|
|
87
|
-
});
|
|
88
|
-
return data;
|
|
62
|
+
async function getDownloadUrl({ apiURI, appId, path, refreshToken, }) {
|
|
63
|
+
const { data } = await (0, fetch_js_1.jsonFetch)(`${apiURI}/storage/signed-download-url?app_id=${appId}&filename=${encodeURIComponent(path)}`, {
|
|
64
|
+
method: 'GET',
|
|
65
|
+
headers: {
|
|
66
|
+
'content-type': 'application/json',
|
|
67
|
+
authorization: `Bearer ${refreshToken}`,
|
|
68
|
+
},
|
|
89
69
|
});
|
|
70
|
+
return data;
|
|
90
71
|
}
|
|
91
72
|
//# sourceMappingURL=StorageAPI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageAPI.js","sourceRoot":"","sources":["../../src/StorageAPI.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StorageAPI.js","sourceRoot":"","sources":["../../src/StorageAPI.ts"],"names":[],"mappings":";;AAcA,gCAkCC;AAED,gCAuBC;AAKD,gDA0BC;AAED,wBAUC;AAED,wCAyBC;AA/ID,+CAA6C;AActC,KAAK,UAAU,UAAU,CAAC,EAC/B,MAAM,EACN,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,kBAAkB,GASnB;IACC,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,KAAK;QACb,IAAI;QACJ,aAAa,EAAE,UAAU,YAAY,EAAE;QACvC,cAAc,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI;KACzC,CAAC;IACF,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,qBAAqB,CAAC,GAAG,kBAAkB,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAA,oBAAS,EAAC,GAAG,MAAM,iBAAiB,EAAE;QACvD,MAAM,EAAE,KAAK;QACb,OAAO;QACP,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,EAC/B,MAAM,EACN,KAAK,EACL,IAAI,EACJ,YAAY,GAMb;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,oBAAS,EAC9B,GAAG,MAAM,yBAAyB,KAAK,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC9E;QACE,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,YAAY,EAAE;SACxC;KACF,CACF,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oCAAoC;AACpC,oCAAoC;AAE7B,KAAK,UAAU,kBAAkB,CAAC,EACvC,MAAM,EACN,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,QAAQ,GAAG,EAAE,GAOd;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,oBAAS,EAAC,GAAG,MAAM,4BAA4B,EAAE;QACtE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,YAAY,EAAE;SACxC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,QAAQ;SACnB,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,YAAY,EAAE,IAAI;IAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;QACzC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,cAAc,EAAE,IAAI,CAAC,IAAI;SAC1B;KACF,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,EAAE,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,EACnC,MAAM,EACN,KAAK,EACL,IAAI,EACJ,YAAY,GAMb;IACC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,oBAAS,EAC9B,GAAG,MAAM,uCAAuC,KAAK,aAAa,kBAAkB,CAClF,IAAI,CACL,EAAE,EACH;QACE,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,YAAY,EAAE;SACxC;KACF,CACF,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { jsonFetch } from './utils/fetch.js';\n\nexport type UploadFileResponse = {\n data: {\n id: string;\n };\n};\n\nexport type DeleteFileResponse = {\n data: {\n id: string | null;\n };\n};\n\nexport async function uploadFile({\n apiURI,\n appId,\n path,\n file,\n refreshToken,\n contentType,\n contentDisposition,\n}: {\n apiURI: string;\n appId: string;\n path: string;\n file: File | Blob;\n refreshToken?: string;\n contentType?: string;\n contentDisposition?: string;\n}): Promise<UploadFileResponse> {\n const headers = {\n app_id: appId,\n path,\n authorization: `Bearer ${refreshToken}`,\n 'content-type': contentType || file.type,\n };\n if (contentDisposition) {\n headers['content-disposition'] = contentDisposition;\n }\n\n const data = await jsonFetch(`${apiURI}/storage/upload`, {\n method: 'PUT',\n headers,\n body: file,\n });\n\n return data;\n}\n\nexport async function deleteFile({\n apiURI,\n appId,\n path,\n refreshToken,\n}: {\n apiURI: string;\n appId: string;\n path: string;\n refreshToken?: string;\n}): Promise<DeleteFileResponse> {\n const { data } = await jsonFetch(\n `${apiURI}/storage/files?app_id=${appId}&filename=${encodeURIComponent(path)}`,\n {\n method: 'DELETE',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${refreshToken}`,\n },\n },\n );\n\n return data;\n}\n\n// Deprecated Storage API (Jan 2025)\n// ---------------------------------\n\nexport async function getSignedUploadUrl({\n apiURI,\n appId,\n fileName,\n refreshToken,\n metadata = {},\n}: {\n apiURI: string;\n appId: string;\n fileName: string;\n refreshToken?: string;\n metadata?: Record<string, any>;\n}) {\n const { data } = await jsonFetch(`${apiURI}/storage/signed-upload-url`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${refreshToken}`,\n },\n body: JSON.stringify({\n app_id: appId,\n filename: fileName,\n }),\n });\n\n return data;\n}\n\nexport async function upload(presignedUrl, file) {\n const response = await fetch(presignedUrl, {\n method: 'PUT',\n body: file,\n headers: {\n 'Content-Type': file.type,\n },\n });\n\n return response.ok;\n}\n\nexport async function getDownloadUrl({\n apiURI,\n appId,\n path,\n refreshToken,\n}: {\n apiURI: string;\n appId: string;\n path: string;\n refreshToken?: string;\n}) {\n const { data } = await jsonFetch(\n `${apiURI}/storage/signed-download-url?app_id=${appId}&filename=${encodeURIComponent(\n path,\n )}`,\n {\n method: 'GET',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${refreshToken}`,\n },\n },\n );\n\n return data;\n}\n"]}
|
|
@@ -32,15 +32,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
37
|
};
|
|
@@ -67,23 +58,24 @@ function syncSubFromStorage(sub, useDateObjects) {
|
|
|
67
58
|
return sub;
|
|
68
59
|
}
|
|
69
60
|
function syncSubToStorage(_k, sub) {
|
|
70
|
-
var _a;
|
|
71
61
|
if (sub.values) {
|
|
72
62
|
const entities = [];
|
|
73
|
-
for (const e of
|
|
63
|
+
for (const e of sub.values?.entities) {
|
|
74
64
|
const store = s.toJSON(e.store);
|
|
75
|
-
entities.push(
|
|
65
|
+
entities.push({ ...e, store });
|
|
76
66
|
}
|
|
77
|
-
return
|
|
67
|
+
return {
|
|
68
|
+
...sub,
|
|
69
|
+
values: { attrsStore: sub.values.attrsStore.toJSON(), entities },
|
|
70
|
+
};
|
|
78
71
|
}
|
|
79
72
|
else {
|
|
80
73
|
return sub;
|
|
81
74
|
}
|
|
82
75
|
}
|
|
83
76
|
function onMergeSub(_key, storageSub, inMemorySub) {
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
const memoryTxId = (_b = inMemorySub === null || inMemorySub === void 0 ? void 0 : inMemorySub.state) === null || _b === void 0 ? void 0 : _b.txId;
|
|
77
|
+
const storageTxId = storageSub?.state?.txId;
|
|
78
|
+
const memoryTxId = inMemorySub?.state?.txId;
|
|
87
79
|
if (storageTxId && (!memoryTxId || storageTxId > memoryTxId)) {
|
|
88
80
|
return storageSub;
|
|
89
81
|
}
|
|
@@ -97,8 +89,7 @@ function queryEntity(sub, store, attrsStore) {
|
|
|
97
89
|
return res.data[sub.table][0];
|
|
98
90
|
}
|
|
99
91
|
function getServerCreatedAt(sub, store, attrsStore, entityId) {
|
|
100
|
-
|
|
101
|
-
const aid = (_a = s.getAttrByFwdIdentName(attrsStore, sub.table, 'id')) === null || _a === void 0 ? void 0 : _a.id;
|
|
92
|
+
const aid = s.getAttrByFwdIdentName(attrsStore, sub.table, 'id')?.id;
|
|
102
93
|
if (!aid) {
|
|
103
94
|
return -1;
|
|
104
95
|
}
|
|
@@ -121,18 +112,17 @@ function applyChangesToStore(store, attrsStore, changes) {
|
|
|
121
112
|
}
|
|
122
113
|
}
|
|
123
114
|
function changedFieldsOfChanges(store, attrsStore, changes) {
|
|
124
|
-
var _a, _b, _c, _d;
|
|
125
115
|
// This will be more complicated when we include links, we can either add a
|
|
126
116
|
// changedLinks field or we can have something like 'bookshelves.title`
|
|
127
117
|
const changedFields = {};
|
|
128
118
|
for (const { action, triple } of changes) {
|
|
129
119
|
const [e, a, v] = triple;
|
|
130
|
-
const field =
|
|
120
|
+
const field = attrsStore.getAttr(a)?.['forward-identity']?.[2];
|
|
131
121
|
if (!field)
|
|
132
122
|
continue;
|
|
133
|
-
const fields =
|
|
123
|
+
const fields = changedFields[e] ?? {};
|
|
134
124
|
changedFields[e] = fields;
|
|
135
|
-
const oldNew =
|
|
125
|
+
const oldNew = fields[field] ?? {};
|
|
136
126
|
switch (action) {
|
|
137
127
|
case 'added':
|
|
138
128
|
oldNew.newValue = v;
|
|
@@ -162,13 +152,12 @@ function subData(sub, entities) {
|
|
|
162
152
|
// and returns the type. We have to wait until the attrs
|
|
163
153
|
// are loaded before we can determine the type.
|
|
164
154
|
function orderFieldTypeMutative(sub, getAttrs) {
|
|
165
|
-
var _a;
|
|
166
155
|
if (sub.orderFieldType) {
|
|
167
156
|
return sub.orderFieldType;
|
|
168
157
|
}
|
|
169
158
|
const orderFieldType = sub.orderField === 'serverCreatedAt'
|
|
170
159
|
? 'number'
|
|
171
|
-
:
|
|
160
|
+
: s.getAttrByFwdIdentName(getAttrs(), sub.table, sub.orderField)?.['checked-data-type'];
|
|
172
161
|
sub.orderFieldType = orderFieldType;
|
|
173
162
|
return orderFieldType;
|
|
174
163
|
}
|
|
@@ -202,10 +191,16 @@ var CallbackEventType;
|
|
|
202
191
|
CallbackEventType["Error"] = "Error";
|
|
203
192
|
})(CallbackEventType || (exports.CallbackEventType = CallbackEventType = {}));
|
|
204
193
|
class SyncTable {
|
|
194
|
+
trySend;
|
|
195
|
+
subs;
|
|
196
|
+
// Using any for the SyncCallback because we'd need Reactor to be typed
|
|
197
|
+
callbacks = {};
|
|
198
|
+
config;
|
|
199
|
+
idToHash = {};
|
|
200
|
+
log;
|
|
201
|
+
createStore;
|
|
202
|
+
getAttrs;
|
|
205
203
|
constructor(trySend, storage, config, log, createStore, getAttrs) {
|
|
206
|
-
// Using any for the SyncCallback because we'd need Reactor to be typed
|
|
207
|
-
this.callbacks = {};
|
|
208
|
-
this.idToHash = {};
|
|
209
204
|
this.trySend = trySend;
|
|
210
205
|
this.config = config;
|
|
211
206
|
this.log = log;
|
|
@@ -216,13 +211,13 @@ class SyncTable {
|
|
|
216
211
|
merge: onMergeSub,
|
|
217
212
|
serialize: syncSubToStorage,
|
|
218
213
|
parse: (_key, x) => syncSubFromStorage(x, this.config.useDateObjects),
|
|
219
|
-
objectSize: (sub) =>
|
|
214
|
+
objectSize: (sub) => sub.values?.entities.length || 0,
|
|
220
215
|
logger: log,
|
|
221
216
|
gc: {
|
|
222
217
|
maxAgeMs: 1000 * 60 * 60 * 24 * 7 * 52, // 1 year
|
|
223
218
|
maxEntries: 1000,
|
|
224
219
|
// Size of each sub is the number of entity
|
|
225
|
-
maxSize:
|
|
220
|
+
maxSize: 1_000_000, // 1 million entities
|
|
226
221
|
},
|
|
227
222
|
});
|
|
228
223
|
}
|
|
@@ -235,7 +230,7 @@ class SyncTable {
|
|
|
235
230
|
this.callbacks[hash].push(cb);
|
|
236
231
|
this.initSubscription(q, hash, cb);
|
|
237
232
|
return (opts) => {
|
|
238
|
-
this.unsubscribe(hash, cb, opts
|
|
233
|
+
this.unsubscribe(hash, cb, opts?.keepSubscription);
|
|
239
234
|
};
|
|
240
235
|
}
|
|
241
236
|
unsubscribe(hash, cb, keepSubscription) {
|
|
@@ -244,7 +239,7 @@ class SyncTable {
|
|
|
244
239
|
if (!cbs.length) {
|
|
245
240
|
delete this.callbacks[hash];
|
|
246
241
|
const sub = this.subs.currentValue[hash];
|
|
247
|
-
if (sub
|
|
242
|
+
if (sub?.state) {
|
|
248
243
|
this.clearSubscriptionData(sub.state.subscriptionId, !!keepSubscription);
|
|
249
244
|
}
|
|
250
245
|
if (!keepSubscription) {
|
|
@@ -277,52 +272,47 @@ class SyncTable {
|
|
|
277
272
|
'keep-subscription': keepSubscription,
|
|
278
273
|
});
|
|
279
274
|
}
|
|
280
|
-
initSubscription(query, hash, cb) {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
if (existingSub
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
data: subData(existingSub, (_b = existingSub.values) === null || _b === void 0 ? void 0 : _b.entities),
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
return;
|
|
275
|
+
async initSubscription(query, hash, cb) {
|
|
276
|
+
// Wait for storage to load so that we know if we already have an existing subscription
|
|
277
|
+
await this.subs.waitForKeyToLoad(hash);
|
|
278
|
+
const existingSub = this.subs.currentValue[hash];
|
|
279
|
+
if (existingSub && existingSub.state && existingSub.state.txId) {
|
|
280
|
+
this.sendResync(existingSub, existingSub.state, existingSub.state.txId);
|
|
281
|
+
if (existingSub.values?.entities && cb) {
|
|
282
|
+
cb({
|
|
283
|
+
type: CallbackEventType.LoadFromStorage,
|
|
284
|
+
data: subData(existingSub, existingSub.values?.entities),
|
|
285
|
+
});
|
|
295
286
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const table = Object.keys(query)[0];
|
|
290
|
+
const orderBy = query[table]?.$?.order || { serverCreatedAt: 'asc' };
|
|
291
|
+
const [orderField, orderDirection] = Object.entries(orderBy)[0];
|
|
292
|
+
this.subs.updateInPlace((prev) => {
|
|
293
|
+
prev[hash] = {
|
|
294
|
+
query,
|
|
295
|
+
hash: hash,
|
|
296
|
+
table,
|
|
297
|
+
orderDirection,
|
|
298
|
+
orderField,
|
|
299
|
+
createdAt: Date.now(),
|
|
300
|
+
updatedAt: Date.now(),
|
|
301
|
+
};
|
|
311
302
|
});
|
|
303
|
+
this.sendStart(query);
|
|
312
304
|
}
|
|
313
|
-
flushPending() {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
yield this.initSubscription(sub.query, sub.hash);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
this.log.error('Missing sub for hash in flushPending', hash);
|
|
323
|
-
}
|
|
305
|
+
async flushPending() {
|
|
306
|
+
for (const hash of Object.keys(this.callbacks)) {
|
|
307
|
+
await this.subs.waitForKeyToLoad(hash);
|
|
308
|
+
const sub = this.subs.currentValue[hash];
|
|
309
|
+
if (sub) {
|
|
310
|
+
await this.initSubscription(sub.query, sub.hash);
|
|
324
311
|
}
|
|
325
|
-
|
|
312
|
+
else {
|
|
313
|
+
this.log.error('Missing sub for hash in flushPending', hash);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
326
316
|
}
|
|
327
317
|
onStartSyncOk(msg) {
|
|
328
318
|
const subscriptionId = msg['subscription-id'];
|
|
@@ -347,7 +337,6 @@ class SyncTable {
|
|
|
347
337
|
}
|
|
348
338
|
}
|
|
349
339
|
onSyncLoadBatch(msg) {
|
|
350
|
-
var _a;
|
|
351
340
|
const subscriptionId = msg['subscription-id'];
|
|
352
341
|
const joinRows = msg['join-rows'];
|
|
353
342
|
const hash = this.idToHash[subscriptionId];
|
|
@@ -361,7 +350,7 @@ class SyncTable {
|
|
|
361
350
|
this.log.error('Missing sub for hash', hash, msg);
|
|
362
351
|
return;
|
|
363
352
|
}
|
|
364
|
-
const values =
|
|
353
|
+
const values = sub.values ?? {
|
|
365
354
|
entities: [],
|
|
366
355
|
attrsStore: this.getAttrs(),
|
|
367
356
|
};
|
|
@@ -392,7 +381,6 @@ class SyncTable {
|
|
|
392
381
|
}
|
|
393
382
|
}
|
|
394
383
|
onSyncInitFinish(msg) {
|
|
395
|
-
var _a;
|
|
396
384
|
const subscriptionId = msg['subscription-id'];
|
|
397
385
|
const hash = this.idToHash[subscriptionId];
|
|
398
386
|
if (!hash) {
|
|
@@ -417,12 +405,11 @@ class SyncTable {
|
|
|
417
405
|
if (sub) {
|
|
418
406
|
this.notifyCbs(hash, {
|
|
419
407
|
type: CallbackEventType.InitialSyncComplete,
|
|
420
|
-
data: subData(sub,
|
|
408
|
+
data: subData(sub, sub.values?.entities || []),
|
|
421
409
|
});
|
|
422
410
|
}
|
|
423
411
|
}
|
|
424
412
|
onSyncUpdateTriples(msg) {
|
|
425
|
-
var _a, _b, _c;
|
|
426
413
|
const subscriptionId = msg['subscription-id'];
|
|
427
414
|
const hash = this.idToHash[subscriptionId];
|
|
428
415
|
if (!hash) {
|
|
@@ -448,11 +435,11 @@ class SyncTable {
|
|
|
448
435
|
// Note: this won't work as well when links are involved
|
|
449
436
|
const byEid = {};
|
|
450
437
|
for (const change of tx.changes) {
|
|
451
|
-
const eidChanges =
|
|
438
|
+
const eidChanges = byEid[change.triple[0]] ?? [];
|
|
452
439
|
byEid[change.triple[0]] = eidChanges;
|
|
453
440
|
eidChanges.push(change);
|
|
454
441
|
}
|
|
455
|
-
const values =
|
|
442
|
+
const values = sub.values ?? {
|
|
456
443
|
entities: [],
|
|
457
444
|
attrsStore: this.getAttrs(),
|
|
458
445
|
};
|
|
@@ -513,7 +500,7 @@ class SyncTable {
|
|
|
513
500
|
sortEntitiesInPlace(sub, orderFieldType, entities);
|
|
514
501
|
this.notifyCbs(hash, {
|
|
515
502
|
type: CallbackEventType.SyncTransaction,
|
|
516
|
-
data: subData(sub,
|
|
503
|
+
data: subData(sub, sub.values?.entities),
|
|
517
504
|
added,
|
|
518
505
|
removed,
|
|
519
506
|
updated,
|