mindoodb 0.0.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/README.md +263 -0
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts +5 -0
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts.map +1 -0
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js +17 -0
- package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js.map +1 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +111 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +237 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -0
- package/dist/appendonlystores/network/HttpTransport.d.ts +78 -0
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -0
- package/dist/appendonlystores/network/HttpTransport.js +356 -0
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +131 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +248 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -0
- package/dist/appendonlystores/network/index.d.ts +8 -0
- package/dist/appendonlystores/network/index.d.ts.map +1 -0
- package/dist/appendonlystores/network/index.js +21 -0
- package/dist/appendonlystores/network/index.js.map +1 -0
- package/dist/browser/crypto/BrowserCryptoAdapter.d.ts +14 -0
- package/dist/browser/crypto/BrowserCryptoAdapter.d.ts.map +1 -0
- package/dist/browser/crypto/BrowserCryptoAdapter.js +30 -0
- package/dist/browser/crypto/BrowserCryptoAdapter.js.map +1 -0
- package/dist/browser/index.d.ts +3 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +26 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/core/BaseMindooDB.d.ts +182 -0
- package/dist/core/BaseMindooDB.d.ts.map +1 -0
- package/dist/core/BaseMindooDB.js +1701 -0
- package/dist/core/BaseMindooDB.js.map +1 -0
- package/dist/core/BaseMindooTenant.d.ts +155 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -0
- package/dist/core/BaseMindooTenant.js +673 -0
- package/dist/core/BaseMindooTenant.js.map +1 -0
- package/dist/core/BaseMindooTenantDirectory.d.ts +99 -0
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -0
- package/dist/core/BaseMindooTenantDirectory.js +776 -0
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -0
- package/dist/core/BaseMindooTenantFactory.d.ts +91 -0
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -0
- package/dist/core/BaseMindooTenantFactory.js +297 -0
- package/dist/core/BaseMindooTenantFactory.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +111 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +293 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +78 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/AuthenticationService.js +297 -0
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -0
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +174 -0
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/NetworkTransport.js +3 -0
- package/dist/core/appendonlystores/network/NetworkTransport.js.map +1 -0
- package/dist/core/appendonlystores/network/types.d.ts +135 -0
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/types.js +35 -0
- package/dist/core/appendonlystores/network/types.js.map +1 -0
- package/dist/core/appendonlystores/types.d.ts +157 -0
- package/dist/core/appendonlystores/types.d.ts.map +1 -0
- package/dist/core/appendonlystores/types.js +3 -0
- package/dist/core/appendonlystores/types.js.map +1 -0
- package/dist/core/crypto/CryptoAdapter.d.ts +19 -0
- package/dist/core/crypto/CryptoAdapter.d.ts.map +1 -0
- package/dist/core/crypto/CryptoAdapter.js +3 -0
- package/dist/core/crypto/CryptoAdapter.js.map +1 -0
- package/dist/core/crypto/MindooDocSigner.d.ts +106 -0
- package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -0
- package/dist/core/crypto/MindooDocSigner.js +192 -0
- package/dist/core/crypto/MindooDocSigner.js.map +1 -0
- package/dist/core/crypto/RSAEncryption.d.ts +62 -0
- package/dist/core/crypto/RSAEncryption.d.ts.map +1 -0
- package/dist/core/crypto/RSAEncryption.js +167 -0
- package/dist/core/crypto/RSAEncryption.js.map +1 -0
- package/dist/core/errors.d.ts +10 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +17 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +53 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.d.ts +33 -0
- package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.js +27 -0
- package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.js.map +1 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts +31 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.js +3 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.js.map +1 -0
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +52 -0
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +106 -0
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts +44 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js +107 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js.map +1 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts +28 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js +133 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +109 -0
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualView.js +504 -0
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts +59 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js +70 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewDataChange.d.ts +49 -0
- package/dist/core/indexing/virtualviews/VirtualViewDataChange.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewDataChange.js +69 -0
- package/dist/core/indexing/virtualviews/VirtualViewDataChange.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +121 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +365 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts +131 -0
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js +236 -0
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.d.ts +330 -0
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.js +1010 -0
- package/dist/core/indexing/virtualviews/VirtualViewNavigator.js.map +1 -0
- package/dist/core/indexing/virtualviews/index.d.ts +53 -0
- package/dist/core/indexing/virtualviews/index.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/index.js +89 -0
- package/dist/core/indexing/virtualviews/index.js.map +1 -0
- package/dist/core/indexing/virtualviews/types.d.ts +115 -0
- package/dist/core/indexing/virtualviews/types.d.ts.map +1 -0
- package/dist/core/indexing/virtualviews/types.js +175 -0
- package/dist/core/indexing/virtualviews/types.js.map +1 -0
- package/dist/core/keys/KeyBag.d.ts +122 -0
- package/dist/core/keys/KeyBag.d.ts.map +1 -0
- package/dist/core/keys/KeyBag.js +401 -0
- package/dist/core/keys/KeyBag.js.map +1 -0
- package/dist/core/types.d.ts +1004 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/userid/index.d.ts +53 -0
- package/dist/core/userid/index.d.ts.map +1 -0
- package/dist/core/userid/index.js +3 -0
- package/dist/core/userid/index.js.map +1 -0
- package/dist/core/utils/idGeneration.d.ts +109 -0
- package/dist/core/utils/idGeneration.d.ts.map +1 -0
- package/dist/core/utils/idGeneration.js +182 -0
- package/dist/core/utils/idGeneration.js.map +1 -0
- package/dist/core/utils/index.d.ts +5 -0
- package/dist/core/utils/index.d.ts.map +1 -0
- package/dist/core/utils/index.js +19 -0
- package/dist/core/utils/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/node/crypto/NodeCryptoAdapter.d.ts +16 -0
- package/dist/node/crypto/NodeCryptoAdapter.d.ts.map +1 -0
- package/dist/node/crypto/NodeCryptoAdapter.js +53 -0
- package/dist/node/crypto/NodeCryptoAdapter.js.map +1 -0
- package/dist/node/index.d.ts +3 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +26 -0
- package/dist/node/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { StoreEntry, StoreEntryMetadata } from "../../core/types";
|
|
2
|
+
import type { NetworkTransport, NetworkTransportConfig } from "../../core/appendonlystores/network/NetworkTransport";
|
|
3
|
+
import type { NetworkEncryptedEntry, AuthResult } from "../../core/appendonlystores/network/types";
|
|
4
|
+
/**
|
|
5
|
+
* HTTP implementation of the NetworkTransport interface.
|
|
6
|
+
*
|
|
7
|
+
* Uses fetch API for making HTTP requests to a remote server.
|
|
8
|
+
* Supports retry with exponential backoff for transient failures.
|
|
9
|
+
*
|
|
10
|
+
* REST API endpoints:
|
|
11
|
+
* - POST /auth/challenge - Request authentication challenge
|
|
12
|
+
* - POST /auth/authenticate - Authenticate with signed challenge
|
|
13
|
+
* - POST /sync/findNewEntries - Find entries we don't have
|
|
14
|
+
* - POST /sync/getEntries - Get specific entries
|
|
15
|
+
* - POST /sync/putEntries - Push entries to the server
|
|
16
|
+
* - GET /sync/getAllIds - Get all entry IDs from the server
|
|
17
|
+
*/
|
|
18
|
+
export declare class HttpTransport implements NetworkTransport {
|
|
19
|
+
private config;
|
|
20
|
+
private baseUrl;
|
|
21
|
+
constructor(config: NetworkTransportConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Request a challenge string for authentication.
|
|
24
|
+
*/
|
|
25
|
+
requestChallenge(username: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Authenticate by providing a signed challenge.
|
|
28
|
+
*/
|
|
29
|
+
authenticate(challenge: string, signature: Uint8Array): Promise<AuthResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Find entries that the remote has which we don't have locally.
|
|
32
|
+
*/
|
|
33
|
+
findNewEntries(token: string, haveIds: string[]): Promise<StoreEntryMetadata[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Find entries for a specific document that the remote has which we don't have locally.
|
|
36
|
+
*/
|
|
37
|
+
findNewEntriesForDoc(token: string, haveIds: string[], docId: string): Promise<StoreEntryMetadata[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get entries from the remote store.
|
|
40
|
+
*/
|
|
41
|
+
getEntries(token: string, ids: string[]): Promise<NetworkEncryptedEntry[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Push entries to the remote store.
|
|
44
|
+
*/
|
|
45
|
+
putEntries(token: string, entries: StoreEntry[]): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Check which of the provided IDs exist in the remote store.
|
|
48
|
+
*/
|
|
49
|
+
hasEntries(token: string, ids: string[]): Promise<string[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Get all entry IDs from the remote store.
|
|
52
|
+
*/
|
|
53
|
+
getAllIds(token: string): Promise<string[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the dependency chain starting from an entry ID.
|
|
56
|
+
*/
|
|
57
|
+
resolveDependencies(token: string, startId: string, options?: Record<string, unknown>): Promise<string[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Fetch with retry and exponential backoff.
|
|
60
|
+
*/
|
|
61
|
+
private fetchWithRetry;
|
|
62
|
+
private sleep;
|
|
63
|
+
private uint8ArrayToBase64;
|
|
64
|
+
private base64ToUint8Array;
|
|
65
|
+
/**
|
|
66
|
+
* Serialize StoreEntryMetadata for network transmission.
|
|
67
|
+
*/
|
|
68
|
+
private serializeEntryMetadata;
|
|
69
|
+
/**
|
|
70
|
+
* Deserialize StoreEntryMetadata from network format.
|
|
71
|
+
*/
|
|
72
|
+
private deserializeEntryMetadata;
|
|
73
|
+
/**
|
|
74
|
+
* Serialize StoreEntry for network transmission.
|
|
75
|
+
*/
|
|
76
|
+
private serializeEntry;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=HttpTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpTransport.d.ts","sourceRoot":"","sources":["../../../src/appendonlystores/network/HttpTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAkB,MAAM,kBAAkB,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AACrH,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAGnG;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,sBAAsB;IAgB1C;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BzD;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BjF;;OAEG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA8BhC;;OAEG;IACG,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA+BhC;;OAEG;IACG,UAAU,CACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA+BnC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBrE;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA8BjE;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBjD;;OAEG;IACG,mBAAmB,CACvB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC;IA2BpB;;OAEG;YACW,cAAc;IAuF5B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;OAEG;IACH,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpTransport = void 0;
|
|
4
|
+
const types_1 = require("../../core/appendonlystores/network/types");
|
|
5
|
+
/**
|
|
6
|
+
* HTTP implementation of the NetworkTransport interface.
|
|
7
|
+
*
|
|
8
|
+
* Uses fetch API for making HTTP requests to a remote server.
|
|
9
|
+
* Supports retry with exponential backoff for transient failures.
|
|
10
|
+
*
|
|
11
|
+
* REST API endpoints:
|
|
12
|
+
* - POST /auth/challenge - Request authentication challenge
|
|
13
|
+
* - POST /auth/authenticate - Authenticate with signed challenge
|
|
14
|
+
* - POST /sync/findNewEntries - Find entries we don't have
|
|
15
|
+
* - POST /sync/getEntries - Get specific entries
|
|
16
|
+
* - POST /sync/putEntries - Push entries to the server
|
|
17
|
+
* - GET /sync/getAllIds - Get all entry IDs from the server
|
|
18
|
+
*/
|
|
19
|
+
class HttpTransport {
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.config = {
|
|
22
|
+
timeout: 30000,
|
|
23
|
+
retryAttempts: 3,
|
|
24
|
+
retryDelayMs: 1000,
|
|
25
|
+
...config,
|
|
26
|
+
};
|
|
27
|
+
if (!config.baseUrl) {
|
|
28
|
+
throw new Error("HttpTransport requires baseUrl in config");
|
|
29
|
+
}
|
|
30
|
+
// Ensure baseUrl doesn't end with /
|
|
31
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Request a challenge string for authentication.
|
|
35
|
+
*/
|
|
36
|
+
async requestChallenge(username) {
|
|
37
|
+
console.log(`[HttpTransport] Requesting challenge for user: ${username}`);
|
|
38
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/auth/challenge`, {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
},
|
|
43
|
+
body: JSON.stringify({ username }),
|
|
44
|
+
});
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
if (!data.challenge) {
|
|
47
|
+
throw new types_1.NetworkError(types_1.NetworkErrorType.SERVER_ERROR, "Server did not return a challenge");
|
|
48
|
+
}
|
|
49
|
+
console.log(`[HttpTransport] Received challenge: ${data.challenge}`);
|
|
50
|
+
return data.challenge;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Authenticate by providing a signed challenge.
|
|
54
|
+
*/
|
|
55
|
+
async authenticate(challenge, signature) {
|
|
56
|
+
console.log(`[HttpTransport] Authenticating with challenge: ${challenge}`);
|
|
57
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/auth/authenticate`, {
|
|
58
|
+
method: "POST",
|
|
59
|
+
headers: {
|
|
60
|
+
"Content-Type": "application/json",
|
|
61
|
+
},
|
|
62
|
+
body: JSON.stringify({
|
|
63
|
+
challenge,
|
|
64
|
+
signature: this.uint8ArrayToBase64(signature),
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
const data = await response.json();
|
|
68
|
+
console.log(`[HttpTransport] Authentication result: ${data.success ? "success" : "failed"}`);
|
|
69
|
+
return {
|
|
70
|
+
success: data.success,
|
|
71
|
+
token: data.token,
|
|
72
|
+
error: data.error,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Find entries that the remote has which we don't have locally.
|
|
77
|
+
*/
|
|
78
|
+
async findNewEntries(token, haveIds) {
|
|
79
|
+
console.log(`[HttpTransport] Finding new entries, have ${haveIds.length} IDs`);
|
|
80
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/sync/findNewEntries`, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
"Authorization": `Bearer ${token}`,
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({
|
|
87
|
+
tenantId: this.config.tenantId,
|
|
88
|
+
dbId: this.config.dbId,
|
|
89
|
+
haveIds,
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
const data = await response.json();
|
|
93
|
+
// Deserialize the entries
|
|
94
|
+
const entries = (data.entries || []).map((e) => this.deserializeEntryMetadata(e));
|
|
95
|
+
console.log(`[HttpTransport] Found ${entries.length} new entries`);
|
|
96
|
+
return entries;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Find entries for a specific document that the remote has which we don't have locally.
|
|
100
|
+
*/
|
|
101
|
+
async findNewEntriesForDoc(token, haveIds, docId) {
|
|
102
|
+
console.log(`[HttpTransport] Finding new entries for doc ${docId}, have ${haveIds.length} IDs`);
|
|
103
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/sync/findNewEntriesForDoc`, {
|
|
104
|
+
method: "POST",
|
|
105
|
+
headers: {
|
|
106
|
+
"Content-Type": "application/json",
|
|
107
|
+
"Authorization": `Bearer ${token}`,
|
|
108
|
+
},
|
|
109
|
+
body: JSON.stringify({
|
|
110
|
+
tenantId: this.config.tenantId,
|
|
111
|
+
dbId: this.config.dbId,
|
|
112
|
+
haveIds,
|
|
113
|
+
docId,
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
const data = await response.json();
|
|
117
|
+
// Deserialize the entries
|
|
118
|
+
const entries = (data.entries || []).map((e) => this.deserializeEntryMetadata(e));
|
|
119
|
+
console.log(`[HttpTransport] Found ${entries.length} new entries for doc ${docId}`);
|
|
120
|
+
return entries;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get entries from the remote store.
|
|
124
|
+
*/
|
|
125
|
+
async getEntries(token, ids) {
|
|
126
|
+
console.log(`[HttpTransport] Getting ${ids.length} entries`);
|
|
127
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/sync/getEntries`, {
|
|
128
|
+
method: "POST",
|
|
129
|
+
headers: {
|
|
130
|
+
"Content-Type": "application/json",
|
|
131
|
+
"Authorization": `Bearer ${token}`,
|
|
132
|
+
},
|
|
133
|
+
body: JSON.stringify({
|
|
134
|
+
tenantId: this.config.tenantId,
|
|
135
|
+
dbId: this.config.dbId,
|
|
136
|
+
ids,
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
const data = await response.json();
|
|
140
|
+
// Deserialize the encrypted entries
|
|
141
|
+
const entries = (data.entries || []).map((e) => ({
|
|
142
|
+
...this.deserializeEntryMetadata(e),
|
|
143
|
+
rsaEncryptedPayload: this.base64ToUint8Array(e.rsaEncryptedPayload),
|
|
144
|
+
}));
|
|
145
|
+
console.log(`[HttpTransport] Retrieved ${entries.length} encrypted entries`);
|
|
146
|
+
return entries;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Push entries to the remote store.
|
|
150
|
+
*/
|
|
151
|
+
async putEntries(token, entries) {
|
|
152
|
+
console.log(`[HttpTransport] Pushing ${entries.length} entries`);
|
|
153
|
+
// Serialize the entries for transmission
|
|
154
|
+
const serializedEntries = entries.map(e => this.serializeEntry(e));
|
|
155
|
+
await this.fetchWithRetry(`${this.baseUrl}/sync/putEntries`, {
|
|
156
|
+
method: "POST",
|
|
157
|
+
headers: {
|
|
158
|
+
"Content-Type": "application/json",
|
|
159
|
+
"Authorization": `Bearer ${token}`,
|
|
160
|
+
},
|
|
161
|
+
body: JSON.stringify({
|
|
162
|
+
tenantId: this.config.tenantId,
|
|
163
|
+
dbId: this.config.dbId,
|
|
164
|
+
entries: serializedEntries,
|
|
165
|
+
}),
|
|
166
|
+
});
|
|
167
|
+
console.log(`[HttpTransport] Successfully pushed ${entries.length} entries`);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check which of the provided IDs exist in the remote store.
|
|
171
|
+
*/
|
|
172
|
+
async hasEntries(token, ids) {
|
|
173
|
+
console.log(`[HttpTransport] Checking ${ids.length} entry IDs`);
|
|
174
|
+
if (ids.length === 0) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/sync/hasEntries`, {
|
|
178
|
+
method: "POST",
|
|
179
|
+
headers: {
|
|
180
|
+
"Content-Type": "application/json",
|
|
181
|
+
"Authorization": `Bearer ${token}`,
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({
|
|
184
|
+
tenantId: this.config.tenantId,
|
|
185
|
+
dbId: this.config.dbId,
|
|
186
|
+
ids,
|
|
187
|
+
}),
|
|
188
|
+
});
|
|
189
|
+
const data = await response.json();
|
|
190
|
+
const existingIds = data.ids || [];
|
|
191
|
+
console.log(`[HttpTransport] Found ${existingIds.length} existing entries out of ${ids.length} checked`);
|
|
192
|
+
return existingIds;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get all entry IDs from the remote store.
|
|
196
|
+
*/
|
|
197
|
+
async getAllIds(token) {
|
|
198
|
+
console.log(`[HttpTransport] Getting all entry IDs`);
|
|
199
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/sync/getAllIds?tenantId=${encodeURIComponent(this.config.tenantId)}${this.config.dbId ? `&dbId=${encodeURIComponent(this.config.dbId)}` : ""}`, {
|
|
200
|
+
method: "GET",
|
|
201
|
+
headers: {
|
|
202
|
+
"Authorization": `Bearer ${token}`,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
const data = await response.json();
|
|
206
|
+
const ids = data.ids || [];
|
|
207
|
+
console.log(`[HttpTransport] Retrieved ${ids.length} entry IDs`);
|
|
208
|
+
return ids;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Resolve the dependency chain starting from an entry ID.
|
|
212
|
+
*/
|
|
213
|
+
async resolveDependencies(token, startId, options) {
|
|
214
|
+
console.log(`[HttpTransport] Resolving dependencies for ${startId}`);
|
|
215
|
+
const response = await this.fetchWithRetry(`${this.baseUrl}/sync/resolveDependencies`, {
|
|
216
|
+
method: "POST",
|
|
217
|
+
headers: {
|
|
218
|
+
"Content-Type": "application/json",
|
|
219
|
+
"Authorization": `Bearer ${token}`,
|
|
220
|
+
},
|
|
221
|
+
body: JSON.stringify({
|
|
222
|
+
tenantId: this.config.tenantId,
|
|
223
|
+
dbId: this.config.dbId,
|
|
224
|
+
startId,
|
|
225
|
+
options,
|
|
226
|
+
}),
|
|
227
|
+
});
|
|
228
|
+
const data = await response.json();
|
|
229
|
+
const ids = data.ids || [];
|
|
230
|
+
console.log(`[HttpTransport] Resolved ${ids.length} dependencies`);
|
|
231
|
+
return ids;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Fetch with retry and exponential backoff.
|
|
235
|
+
*/
|
|
236
|
+
async fetchWithRetry(url, options) {
|
|
237
|
+
let lastError = null;
|
|
238
|
+
const attempts = this.config.retryAttempts || 3;
|
|
239
|
+
const baseDelay = this.config.retryDelayMs || 1000;
|
|
240
|
+
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
241
|
+
try {
|
|
242
|
+
const controller = new AbortController();
|
|
243
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout || 30000);
|
|
244
|
+
const response = await fetch(url, {
|
|
245
|
+
...options,
|
|
246
|
+
signal: controller.signal,
|
|
247
|
+
});
|
|
248
|
+
clearTimeout(timeoutId);
|
|
249
|
+
// Handle HTTP error responses
|
|
250
|
+
if (!response.ok) {
|
|
251
|
+
const errorData = await response.json().catch(() => ({}));
|
|
252
|
+
switch (response.status) {
|
|
253
|
+
case 401:
|
|
254
|
+
throw new types_1.NetworkError(types_1.NetworkErrorType.INVALID_TOKEN, errorData.error || "Unauthorized");
|
|
255
|
+
case 403:
|
|
256
|
+
throw new types_1.NetworkError(types_1.NetworkErrorType.USER_REVOKED, errorData.error || "Access denied");
|
|
257
|
+
case 404:
|
|
258
|
+
throw new types_1.NetworkError(types_1.NetworkErrorType.USER_NOT_FOUND, errorData.error || "Not found");
|
|
259
|
+
default:
|
|
260
|
+
throw new types_1.NetworkError(types_1.NetworkErrorType.SERVER_ERROR, errorData.error || `HTTP ${response.status}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return response;
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
lastError = error;
|
|
267
|
+
// Don't retry for certain error types
|
|
268
|
+
if (error instanceof types_1.NetworkError) {
|
|
269
|
+
if (error.type === types_1.NetworkErrorType.INVALID_TOKEN ||
|
|
270
|
+
error.type === types_1.NetworkErrorType.USER_REVOKED ||
|
|
271
|
+
error.type === types_1.NetworkErrorType.INVALID_SIGNATURE) {
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Check if it's an abort error (timeout)
|
|
276
|
+
if (error.name === "AbortError") {
|
|
277
|
+
console.warn(`[HttpTransport] Request timeout, attempt ${attempt + 1}/${attempts}`);
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.warn(`[HttpTransport] Request failed, attempt ${attempt + 1}/${attempts}:`, error);
|
|
281
|
+
}
|
|
282
|
+
// Wait before retrying (exponential backoff)
|
|
283
|
+
if (attempt < attempts - 1) {
|
|
284
|
+
const delay = baseDelay * Math.pow(2, attempt);
|
|
285
|
+
await this.sleep(delay);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
throw new types_1.NetworkError(types_1.NetworkErrorType.NETWORK_ERROR, lastError?.message || "Request failed after retries");
|
|
290
|
+
}
|
|
291
|
+
sleep(ms) {
|
|
292
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
293
|
+
}
|
|
294
|
+
uint8ArrayToBase64(bytes) {
|
|
295
|
+
let binary = "";
|
|
296
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
297
|
+
binary += String.fromCharCode(bytes[i]);
|
|
298
|
+
}
|
|
299
|
+
return btoa(binary);
|
|
300
|
+
}
|
|
301
|
+
base64ToUint8Array(base64) {
|
|
302
|
+
const binary = atob(base64);
|
|
303
|
+
const bytes = new Uint8Array(binary.length);
|
|
304
|
+
for (let i = 0; i < binary.length; i++) {
|
|
305
|
+
bytes[i] = binary.charCodeAt(i);
|
|
306
|
+
}
|
|
307
|
+
return bytes;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Serialize StoreEntryMetadata for network transmission.
|
|
311
|
+
*/
|
|
312
|
+
serializeEntryMetadata(metadata) {
|
|
313
|
+
return {
|
|
314
|
+
entryType: metadata.entryType,
|
|
315
|
+
id: metadata.id,
|
|
316
|
+
contentHash: metadata.contentHash,
|
|
317
|
+
docId: metadata.docId,
|
|
318
|
+
dependencyIds: metadata.dependencyIds,
|
|
319
|
+
createdAt: metadata.createdAt,
|
|
320
|
+
createdByPublicKey: metadata.createdByPublicKey,
|
|
321
|
+
decryptionKeyId: metadata.decryptionKeyId,
|
|
322
|
+
signature: this.uint8ArrayToBase64(metadata.signature),
|
|
323
|
+
originalSize: metadata.originalSize,
|
|
324
|
+
encryptedSize: metadata.encryptedSize,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Deserialize StoreEntryMetadata from network format.
|
|
329
|
+
*/
|
|
330
|
+
deserializeEntryMetadata(serialized) {
|
|
331
|
+
return {
|
|
332
|
+
entryType: serialized.entryType,
|
|
333
|
+
id: serialized.id,
|
|
334
|
+
contentHash: serialized.contentHash,
|
|
335
|
+
docId: serialized.docId,
|
|
336
|
+
dependencyIds: serialized.dependencyIds,
|
|
337
|
+
createdAt: serialized.createdAt,
|
|
338
|
+
createdByPublicKey: serialized.createdByPublicKey,
|
|
339
|
+
decryptionKeyId: serialized.decryptionKeyId,
|
|
340
|
+
signature: this.base64ToUint8Array(serialized.signature),
|
|
341
|
+
originalSize: serialized.originalSize,
|
|
342
|
+
encryptedSize: serialized.encryptedSize,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Serialize StoreEntry for network transmission.
|
|
347
|
+
*/
|
|
348
|
+
serializeEntry(entry) {
|
|
349
|
+
return {
|
|
350
|
+
...this.serializeEntryMetadata(entry),
|
|
351
|
+
encryptedData: this.uint8ArrayToBase64(entry.encryptedData),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
exports.HttpTransport = HttpTransport;
|
|
356
|
+
//# sourceMappingURL=HttpTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpTransport.js","sourceRoot":"","sources":["../../../src/appendonlystores/network/HttpTransport.ts"],"names":[],"mappings":";;;AAGA,qEAA2F;AAE3F;;;;;;;;;;;;;GAaG;AACH,MAAa,aAAa;IAIxB,YAAY,MAA8B;QACxC,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,IAAI;YAClB,GAAG,MAAM;SACV,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,OAAO,CAAC,GAAG,CAAC,kDAAkD,QAAQ,EAAE,CAAC,CAAC;QAE1E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAChC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;SACnC,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,oBAAY,CACpB,wBAAgB,CAAC,YAAY,EAC7B,mCAAmC,CACpC,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,SAAqB;QACzD,OAAO,CAAC,GAAG,CAAC,kDAAkD,SAAS,EAAE,CAAC,CAAC;QAE3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EACnC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS;gBACT,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;aAC9C,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,OAAiB;QAEjB,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC;QAE/E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EACrC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,OAAO;aACR,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,0BAA0B;QAC1B,MAAM,OAAO,GAAyB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAC5F,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CACjC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACxB,KAAa,EACb,OAAiB,EACjB,KAAa;QAEb,OAAO,CAAC,GAAG,CAAC,+CAA+C,KAAK,UAAU,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC;QAEhG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,4BAA4B,EAC3C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,OAAO;gBACP,KAAK;aACN,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,0BAA0B;QAC1B,MAAM,OAAO,GAAyB,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAC5F,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CACjC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,MAAM,wBAAwB,KAAK,EAAE,CAAC,CAAC;QACpF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,KAAa,EACb,GAAa;QAEb,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EACjC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,GAAG;aACJ,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,oCAAoC;QACpC,MAAM,OAAO,GAA4B,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAkC,EAAE,EAAE,CAAC,CAAC;YACzG,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACnC,mBAAmB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC;SACpE,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;QAC7E,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAqB;QACnD,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAEjE,yCAAyC;QACzC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,MAAM,IAAI,CAAC,cAAc,CACvB,GAAG,IAAI,CAAC,OAAO,kBAAkB,EACjC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,OAAO,EAAE,iBAAiB;aAC3B,CAAC;SACH,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,GAAa;QAC3C,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC;QAEhE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EACjC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,GAAG;aACJ,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,WAAW,GAAa,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,yBAAyB,WAAW,CAAC,MAAM,4BAA4B,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC;QACzG,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,4BAA4B,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/J;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;SACF,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAa,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAErC,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,CAAC,MAAM,YAAY,CAAC,CAAC;QACjE,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,KAAa,EACb,OAAe,EACf,OAAiC;QAEjC,OAAO,CAAC,GAAG,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CACxC,GAAG,IAAI,CAAC,OAAO,2BAA2B,EAC1C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,KAAK,EAAE;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,OAAO;gBACP,OAAO;aACR,CAAC;SACH,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAa,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAErC,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,MAAM,eAAe,CAAC,CAAC;QACnE,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,GAAW,EACX,OAAoB;QAEpB,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QAEnD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,UAAU,CAC1B,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAC7B,CAAC;gBAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,GAAG,OAAO;oBACV,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,YAAY,CAAC,SAAS,CAAC,CAAC;gBAExB,8BAA8B;gBAC9B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAE1D,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;wBACxB,KAAK,GAAG;4BACN,MAAM,IAAI,oBAAY,CACpB,wBAAgB,CAAC,aAAa,EAC9B,SAAS,CAAC,KAAK,IAAI,cAAc,CAClC,CAAC;wBACJ,KAAK,GAAG;4BACN,MAAM,IAAI,oBAAY,CACpB,wBAAgB,CAAC,YAAY,EAC7B,SAAS,CAAC,KAAK,IAAI,eAAe,CACnC,CAAC;wBACJ,KAAK,GAAG;4BACN,MAAM,IAAI,oBAAY,CACpB,wBAAgB,CAAC,cAAc,EAC/B,SAAS,CAAC,KAAK,IAAI,WAAW,CAC/B,CAAC;wBACJ;4BACE,MAAM,IAAI,oBAAY,CACpB,wBAAgB,CAAC,YAAY,EAC7B,SAAS,CAAC,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAC7C,CAAC;oBACN,CAAC;gBACH,CAAC;gBAED,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAE3B,sCAAsC;gBACtC,IAAI,KAAK,YAAY,oBAAY,EAAE,CAAC;oBAClC,IACE,KAAK,CAAC,IAAI,KAAK,wBAAgB,CAAC,aAAa;wBAC7C,KAAK,CAAC,IAAI,KAAK,wBAAgB,CAAC,YAAY;wBAC5C,KAAK,CAAC,IAAI,KAAK,wBAAgB,CAAC,iBAAiB,EACjD,CAAC;wBACD,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,yCAAyC;gBACzC,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,4CAA4C,OAAO,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,2CAA2C,OAAO,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC7F,CAAC;gBAED,6CAA6C;gBAC7C,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,oBAAY,CACpB,wBAAgB,CAAC,aAAa,EAC9B,SAAS,EAAE,OAAO,IAAI,8BAA8B,CACrD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAEO,kBAAkB,CAAC,KAAiB;QAC1C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,QAA4B;QACzD,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB;YAC/C,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC;YACtD,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,UAAmC;QAClE,OAAO;YACL,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;YACjD,eAAe,EAAE,UAAU,CAAC,eAAe;YAC3C,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC;YACxD,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,aAAa,EAAE,UAAU,CAAC,aAAa;SACxC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAiB;QACtC,OAAO;YACL,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACrC,aAAa,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF;AAndD,sCAmdC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { ContentAddressedStore } from "../../core/types";
|
|
2
|
+
import type { StoreEntry, StoreEntryMetadata, MindooTenantDirectory } from "../../core/types";
|
|
3
|
+
import type { CryptoAdapter } from "../../core/crypto/CryptoAdapter";
|
|
4
|
+
import type { NetworkEncryptedEntry } from "../../core/appendonlystores/network/types";
|
|
5
|
+
import { AuthenticationService } from "../../core/appendonlystores/network/AuthenticationService";
|
|
6
|
+
/**
|
|
7
|
+
* Server-side network handler for ContentAddressedStore operations.
|
|
8
|
+
*
|
|
9
|
+
* This class handles incoming sync requests from clients:
|
|
10
|
+
* 1. Validates authentication tokens
|
|
11
|
+
* 2. Retrieves entries from the local store
|
|
12
|
+
* 3. Encrypts entries with the requesting user's RSA public key
|
|
13
|
+
* 4. Returns encrypted entries to the client
|
|
14
|
+
*
|
|
15
|
+
* This is not a ContentAddressedStore implementation itself, but rather
|
|
16
|
+
* a service that wraps a local ContentAddressedStore and handles network requests.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ServerNetworkContentAddressedStore {
|
|
19
|
+
private localStore;
|
|
20
|
+
private directory;
|
|
21
|
+
private authService;
|
|
22
|
+
private rsaEncryption;
|
|
23
|
+
private cryptoAdapter;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new ServerNetworkContentAddressedStore.
|
|
26
|
+
*
|
|
27
|
+
* @param localStore The local store containing the actual data
|
|
28
|
+
* @param directory The tenant directory for user lookup
|
|
29
|
+
* @param authService The authentication service for token validation
|
|
30
|
+
* @param cryptoAdapter The crypto adapter for encryption
|
|
31
|
+
*/
|
|
32
|
+
constructor(localStore: ContentAddressedStore, directory: MindooTenantDirectory, authService: AuthenticationService, cryptoAdapter: CryptoAdapter);
|
|
33
|
+
/**
|
|
34
|
+
* Get the ID of the underlying store.
|
|
35
|
+
*/
|
|
36
|
+
getId(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Handle a challenge request from a client.
|
|
39
|
+
*
|
|
40
|
+
* @param username The username requesting authentication
|
|
41
|
+
* @returns The challenge string
|
|
42
|
+
*/
|
|
43
|
+
handleChallengeRequest(username: string): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Handle an authentication request from a client.
|
|
46
|
+
*
|
|
47
|
+
* @param challenge The challenge string
|
|
48
|
+
* @param signature The client's signature
|
|
49
|
+
* @returns The authentication result with JWT token
|
|
50
|
+
*/
|
|
51
|
+
handleAuthenticate(challenge: string, signature: Uint8Array): Promise<{
|
|
52
|
+
success: boolean;
|
|
53
|
+
token?: string;
|
|
54
|
+
error?: string;
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Handle a findNewEntries request from a client.
|
|
58
|
+
*
|
|
59
|
+
* @param token The JWT access token
|
|
60
|
+
* @param knownIds The entry IDs the client already has
|
|
61
|
+
* @returns List of new entry metadata
|
|
62
|
+
*/
|
|
63
|
+
handleFindNewEntries(token: string, knownIds: string[]): Promise<StoreEntryMetadata[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Handle a findNewEntriesForDoc request from a client.
|
|
66
|
+
* This is an optimized version that only returns entries for a specific document.
|
|
67
|
+
*
|
|
68
|
+
* @param token The JWT access token
|
|
69
|
+
* @param knownIds The entry IDs the client already has for this document
|
|
70
|
+
* @param docId The document ID to filter by
|
|
71
|
+
* @returns List of new entry metadata for the specified document
|
|
72
|
+
*/
|
|
73
|
+
handleFindNewEntriesForDoc(token: string, knownIds: string[], docId: string): Promise<StoreEntryMetadata[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Handle a getEntries request from a client.
|
|
76
|
+
* Encrypts the entries with the client's RSA public key.
|
|
77
|
+
*
|
|
78
|
+
* @param token The JWT access token
|
|
79
|
+
* @param ids The IDs of entries to retrieve
|
|
80
|
+
* @returns The entries with RSA-encrypted payloads
|
|
81
|
+
*/
|
|
82
|
+
handleGetEntries(token: string, ids: string[]): Promise<NetworkEncryptedEntry[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Handle a putEntries request from a client.
|
|
85
|
+
*
|
|
86
|
+
* @param token The JWT access token
|
|
87
|
+
* @param entries The entries to store
|
|
88
|
+
*/
|
|
89
|
+
handlePutEntries(token: string, entries: StoreEntry[]): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Handle a hasEntries request from a client.
|
|
92
|
+
* Checks which of the provided IDs exist in the store.
|
|
93
|
+
*
|
|
94
|
+
* @param token The JWT access token
|
|
95
|
+
* @param ids The IDs to check for existence
|
|
96
|
+
* @returns List of IDs that exist in the store
|
|
97
|
+
*/
|
|
98
|
+
handleHasEntries(token: string, ids: string[]): Promise<string[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Handle a getAllIds request from a client.
|
|
101
|
+
* This is used by clients to determine which entries they need to push.
|
|
102
|
+
*
|
|
103
|
+
* @param token The JWT access token
|
|
104
|
+
* @returns List of all entry IDs in the store
|
|
105
|
+
*/
|
|
106
|
+
handleGetAllIds(token: string): Promise<string[]>;
|
|
107
|
+
/**
|
|
108
|
+
* Handle a resolveDependencies request from a client.
|
|
109
|
+
* Resolves the dependency chain starting from an entry ID.
|
|
110
|
+
*
|
|
111
|
+
* @param token The JWT access token
|
|
112
|
+
* @param startId The entry ID to start traversal from
|
|
113
|
+
* @param options Optional traversal options
|
|
114
|
+
* @returns List of entry IDs in dependency order
|
|
115
|
+
*/
|
|
116
|
+
handleResolveDependencies(token: string, startId: string, options?: Record<string, unknown>): Promise<string[]>;
|
|
117
|
+
/**
|
|
118
|
+
* Validate a JWT token and return the payload.
|
|
119
|
+
*
|
|
120
|
+
* @param token The JWT token
|
|
121
|
+
* @returns The token payload
|
|
122
|
+
* @throws NetworkError if token is invalid
|
|
123
|
+
*/
|
|
124
|
+
private validateToken;
|
|
125
|
+
/**
|
|
126
|
+
* Encrypt entries with a user's RSA public key.
|
|
127
|
+
* Transforms StoreEntry[] to NetworkEncryptedEntry[].
|
|
128
|
+
*/
|
|
129
|
+
private encryptEntriesForUser;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=ServerNetworkContentAddressedStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerNetworkContentAddressedStore.d.ts","sourceRoot":"","sources":["../../../src/appendonlystores/network/ServerNetworkContentAddressedStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,2CAA2C,CAAC;AAGhH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2DAA2D,CAAC;AAElG;;;;;;;;;;;GAWG;AACH,qBAAa,kCAAkC;IAC7C,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IAErC;;;;;;;OAOG;gBAED,UAAU,EAAE,qBAAqB,EACjC,SAAS,EAAE,qBAAqB,EAChC,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,aAAa;IAS9B;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;;;;OAKG;IACG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D;;;;;;OAMG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC;QAC1E,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAKF;;;;;;OAMG;IACG,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAchC;;;;;;;;OAQG;IACG,0BAA0B,CAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAchC;;;;;;;OAOG;IACG,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAiCnC;;;;;OAKG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB3E;;;;;;;OAOG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcvE;;;;;;OAMG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcvD;;;;;;;;OAQG;IACG,yBAAyB,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC;IAcpB;;;;;;OAMG;YACW,aAAa;IAa3B;;;OAGG;YACW,qBAAqB;CAqCpC"}
|