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.
Files changed (170) hide show
  1. package/README.md +263 -0
  2. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts +5 -0
  3. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.d.ts.map +1 -0
  4. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js +17 -0
  5. package/dist/appendonlystores/InMemoryContentAddressedStoreFactory.js.map +1 -0
  6. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +111 -0
  7. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -0
  8. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +237 -0
  9. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -0
  10. package/dist/appendonlystores/network/HttpTransport.d.ts +78 -0
  11. package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -0
  12. package/dist/appendonlystores/network/HttpTransport.js +356 -0
  13. package/dist/appendonlystores/network/HttpTransport.js.map +1 -0
  14. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +131 -0
  15. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -0
  16. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +248 -0
  17. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -0
  18. package/dist/appendonlystores/network/index.d.ts +8 -0
  19. package/dist/appendonlystores/network/index.d.ts.map +1 -0
  20. package/dist/appendonlystores/network/index.js +21 -0
  21. package/dist/appendonlystores/network/index.js.map +1 -0
  22. package/dist/browser/crypto/BrowserCryptoAdapter.d.ts +14 -0
  23. package/dist/browser/crypto/BrowserCryptoAdapter.d.ts.map +1 -0
  24. package/dist/browser/crypto/BrowserCryptoAdapter.js +30 -0
  25. package/dist/browser/crypto/BrowserCryptoAdapter.js.map +1 -0
  26. package/dist/browser/index.d.ts +3 -0
  27. package/dist/browser/index.d.ts.map +1 -0
  28. package/dist/browser/index.js +26 -0
  29. package/dist/browser/index.js.map +1 -0
  30. package/dist/core/BaseMindooDB.d.ts +182 -0
  31. package/dist/core/BaseMindooDB.d.ts.map +1 -0
  32. package/dist/core/BaseMindooDB.js +1701 -0
  33. package/dist/core/BaseMindooDB.js.map +1 -0
  34. package/dist/core/BaseMindooTenant.d.ts +155 -0
  35. package/dist/core/BaseMindooTenant.d.ts.map +1 -0
  36. package/dist/core/BaseMindooTenant.js +673 -0
  37. package/dist/core/BaseMindooTenant.js.map +1 -0
  38. package/dist/core/BaseMindooTenantDirectory.d.ts +99 -0
  39. package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -0
  40. package/dist/core/BaseMindooTenantDirectory.js +776 -0
  41. package/dist/core/BaseMindooTenantDirectory.js.map +1 -0
  42. package/dist/core/BaseMindooTenantFactory.d.ts +91 -0
  43. package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -0
  44. package/dist/core/BaseMindooTenantFactory.js +297 -0
  45. package/dist/core/BaseMindooTenantFactory.js.map +1 -0
  46. package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +111 -0
  47. package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -0
  48. package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +293 -0
  49. package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -0
  50. package/dist/core/appendonlystores/network/AuthenticationService.d.ts +78 -0
  51. package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -0
  52. package/dist/core/appendonlystores/network/AuthenticationService.js +297 -0
  53. package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -0
  54. package/dist/core/appendonlystores/network/NetworkTransport.d.ts +174 -0
  55. package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -0
  56. package/dist/core/appendonlystores/network/NetworkTransport.js +3 -0
  57. package/dist/core/appendonlystores/network/NetworkTransport.js.map +1 -0
  58. package/dist/core/appendonlystores/network/types.d.ts +135 -0
  59. package/dist/core/appendonlystores/network/types.d.ts.map +1 -0
  60. package/dist/core/appendonlystores/network/types.js +35 -0
  61. package/dist/core/appendonlystores/network/types.js.map +1 -0
  62. package/dist/core/appendonlystores/types.d.ts +157 -0
  63. package/dist/core/appendonlystores/types.d.ts.map +1 -0
  64. package/dist/core/appendonlystores/types.js +3 -0
  65. package/dist/core/appendonlystores/types.js.map +1 -0
  66. package/dist/core/crypto/CryptoAdapter.d.ts +19 -0
  67. package/dist/core/crypto/CryptoAdapter.d.ts.map +1 -0
  68. package/dist/core/crypto/CryptoAdapter.js +3 -0
  69. package/dist/core/crypto/CryptoAdapter.js.map +1 -0
  70. package/dist/core/crypto/MindooDocSigner.d.ts +106 -0
  71. package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -0
  72. package/dist/core/crypto/MindooDocSigner.js +192 -0
  73. package/dist/core/crypto/MindooDocSigner.js.map +1 -0
  74. package/dist/core/crypto/RSAEncryption.d.ts +62 -0
  75. package/dist/core/crypto/RSAEncryption.d.ts.map +1 -0
  76. package/dist/core/crypto/RSAEncryption.js +167 -0
  77. package/dist/core/crypto/RSAEncryption.js.map +1 -0
  78. package/dist/core/errors.d.ts +10 -0
  79. package/dist/core/errors.d.ts.map +1 -0
  80. package/dist/core/errors.js +17 -0
  81. package/dist/core/errors.js.map +1 -0
  82. package/dist/core/index.d.ts +14 -0
  83. package/dist/core/index.d.ts.map +1 -0
  84. package/dist/core/index.js +53 -0
  85. package/dist/core/index.js.map +1 -0
  86. package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.d.ts +33 -0
  87. package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.d.ts.map +1 -0
  88. package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.js +27 -0
  89. package/dist/core/indexing/virtualviews/IViewEntryAccessCheck.js.map +1 -0
  90. package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts +31 -0
  91. package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts.map +1 -0
  92. package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.js +3 -0
  93. package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.js.map +1 -0
  94. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +52 -0
  95. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -0
  96. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +106 -0
  97. package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -0
  98. package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts +44 -0
  99. package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts.map +1 -0
  100. package/dist/core/indexing/virtualviews/ViewEntrySortKey.js +107 -0
  101. package/dist/core/indexing/virtualviews/ViewEntrySortKey.js.map +1 -0
  102. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts +28 -0
  103. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts.map +1 -0
  104. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js +133 -0
  105. package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js.map +1 -0
  106. package/dist/core/indexing/virtualviews/VirtualView.d.ts +109 -0
  107. package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -0
  108. package/dist/core/indexing/virtualviews/VirtualView.js +504 -0
  109. package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -0
  110. package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts +59 -0
  111. package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts.map +1 -0
  112. package/dist/core/indexing/virtualviews/VirtualViewColumn.js +70 -0
  113. package/dist/core/indexing/virtualviews/VirtualViewColumn.js.map +1 -0
  114. package/dist/core/indexing/virtualviews/VirtualViewDataChange.d.ts +49 -0
  115. package/dist/core/indexing/virtualviews/VirtualViewDataChange.d.ts.map +1 -0
  116. package/dist/core/indexing/virtualviews/VirtualViewDataChange.js +69 -0
  117. package/dist/core/indexing/virtualviews/VirtualViewDataChange.js.map +1 -0
  118. package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +121 -0
  119. package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -0
  120. package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +365 -0
  121. package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -0
  122. package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts +131 -0
  123. package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts.map +1 -0
  124. package/dist/core/indexing/virtualviews/VirtualViewFactory.js +236 -0
  125. package/dist/core/indexing/virtualviews/VirtualViewFactory.js.map +1 -0
  126. package/dist/core/indexing/virtualviews/VirtualViewNavigator.d.ts +330 -0
  127. package/dist/core/indexing/virtualviews/VirtualViewNavigator.d.ts.map +1 -0
  128. package/dist/core/indexing/virtualviews/VirtualViewNavigator.js +1010 -0
  129. package/dist/core/indexing/virtualviews/VirtualViewNavigator.js.map +1 -0
  130. package/dist/core/indexing/virtualviews/index.d.ts +53 -0
  131. package/dist/core/indexing/virtualviews/index.d.ts.map +1 -0
  132. package/dist/core/indexing/virtualviews/index.js +89 -0
  133. package/dist/core/indexing/virtualviews/index.js.map +1 -0
  134. package/dist/core/indexing/virtualviews/types.d.ts +115 -0
  135. package/dist/core/indexing/virtualviews/types.d.ts.map +1 -0
  136. package/dist/core/indexing/virtualviews/types.js +175 -0
  137. package/dist/core/indexing/virtualviews/types.js.map +1 -0
  138. package/dist/core/keys/KeyBag.d.ts +122 -0
  139. package/dist/core/keys/KeyBag.d.ts.map +1 -0
  140. package/dist/core/keys/KeyBag.js +401 -0
  141. package/dist/core/keys/KeyBag.js.map +1 -0
  142. package/dist/core/types.d.ts +1004 -0
  143. package/dist/core/types.d.ts.map +1 -0
  144. package/dist/core/types.js +10 -0
  145. package/dist/core/types.js.map +1 -0
  146. package/dist/core/userid/index.d.ts +53 -0
  147. package/dist/core/userid/index.d.ts.map +1 -0
  148. package/dist/core/userid/index.js +3 -0
  149. package/dist/core/userid/index.js.map +1 -0
  150. package/dist/core/utils/idGeneration.d.ts +109 -0
  151. package/dist/core/utils/idGeneration.d.ts.map +1 -0
  152. package/dist/core/utils/idGeneration.js +182 -0
  153. package/dist/core/utils/idGeneration.js.map +1 -0
  154. package/dist/core/utils/index.d.ts +5 -0
  155. package/dist/core/utils/index.d.ts.map +1 -0
  156. package/dist/core/utils/index.js +19 -0
  157. package/dist/core/utils/index.js.map +1 -0
  158. package/dist/index.d.ts +7 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +40 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/node/crypto/NodeCryptoAdapter.d.ts +16 -0
  163. package/dist/node/crypto/NodeCryptoAdapter.d.ts.map +1 -0
  164. package/dist/node/crypto/NodeCryptoAdapter.js +53 -0
  165. package/dist/node/crypto/NodeCryptoAdapter.js.map +1 -0
  166. package/dist/node/index.d.ts +3 -0
  167. package/dist/node/index.d.ts.map +1 -0
  168. package/dist/node/index.js +26 -0
  169. package/dist/node/index.js.map +1 -0
  170. 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":"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"}
@@ -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"}