@orbitmem/sdk 0.1.0

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 (176) hide show
  1. package/README.md +104 -0
  2. package/dist/agent/agent-adapter.d.ts +3 -0
  3. package/dist/agent/agent-adapter.d.ts.map +1 -0
  4. package/dist/agent/agent-adapter.js +3 -0
  5. package/dist/agent/agent-adapter.js.map +1 -0
  6. package/dist/agent/client.d.ts +5 -0
  7. package/dist/agent/client.d.ts.map +1 -0
  8. package/dist/agent/client.js +146 -0
  9. package/dist/agent/client.js.map +1 -0
  10. package/dist/agent/index.d.ts +2 -0
  11. package/dist/agent/index.d.ts.map +1 -0
  12. package/dist/agent/index.js +2 -0
  13. package/dist/agent/index.js.map +1 -0
  14. package/dist/client.d.ts +3 -0
  15. package/dist/client.d.ts.map +1 -0
  16. package/dist/client.js +118 -0
  17. package/dist/client.js.map +1 -0
  18. package/dist/contracts.d.ts +19 -0
  19. package/dist/contracts.d.ts.map +1 -0
  20. package/dist/contracts.js +28 -0
  21. package/dist/contracts.js.map +1 -0
  22. package/dist/data/index.d.ts +5 -0
  23. package/dist/data/index.d.ts.map +1 -0
  24. package/dist/data/index.js +5 -0
  25. package/dist/data/index.js.map +1 -0
  26. package/dist/data/orbitdb.d.ts +10 -0
  27. package/dist/data/orbitdb.d.ts.map +1 -0
  28. package/dist/data/orbitdb.js +39 -0
  29. package/dist/data/orbitdb.js.map +1 -0
  30. package/dist/data/pricing.d.ts +7 -0
  31. package/dist/data/pricing.d.ts.map +1 -0
  32. package/dist/data/pricing.js +55 -0
  33. package/dist/data/pricing.js.map +1 -0
  34. package/dist/data/serialization.d.ts +28 -0
  35. package/dist/data/serialization.d.ts.map +1 -0
  36. package/dist/data/serialization.js +76 -0
  37. package/dist/data/serialization.js.map +1 -0
  38. package/dist/data/vault.d.ts +21 -0
  39. package/dist/data/vault.d.ts.map +1 -0
  40. package/dist/data/vault.js +284 -0
  41. package/dist/data/vault.js.map +1 -0
  42. package/dist/discovery/discovery-layer.d.ts +3 -0
  43. package/dist/discovery/discovery-layer.d.ts.map +1 -0
  44. package/dist/discovery/discovery-layer.js +205 -0
  45. package/dist/discovery/discovery-layer.js.map +1 -0
  46. package/dist/discovery/index.d.ts +4 -0
  47. package/dist/discovery/index.d.ts.map +1 -0
  48. package/dist/discovery/index.js +4 -0
  49. package/dist/discovery/index.js.map +1 -0
  50. package/dist/discovery/mock-registry.d.ts +30 -0
  51. package/dist/discovery/mock-registry.d.ts.map +1 -0
  52. package/dist/discovery/mock-registry.js +71 -0
  53. package/dist/discovery/mock-registry.js.map +1 -0
  54. package/dist/discovery/on-chain-registry.d.ts +35 -0
  55. package/dist/discovery/on-chain-registry.d.ts.map +1 -0
  56. package/dist/discovery/on-chain-registry.js +199 -0
  57. package/dist/discovery/on-chain-registry.js.map +1 -0
  58. package/dist/encryption/aes.d.ts +15 -0
  59. package/dist/encryption/aes.d.ts.map +1 -0
  60. package/dist/encryption/aes.js +63 -0
  61. package/dist/encryption/aes.js.map +1 -0
  62. package/dist/encryption/encryption-layer.d.ts +8 -0
  63. package/dist/encryption/encryption-layer.d.ts.map +1 -0
  64. package/dist/encryption/encryption-layer.js +82 -0
  65. package/dist/encryption/encryption-layer.js.map +1 -0
  66. package/dist/encryption/index.d.ts +6 -0
  67. package/dist/encryption/index.d.ts.map +1 -0
  68. package/dist/encryption/index.js +4 -0
  69. package/dist/encryption/index.js.map +1 -0
  70. package/dist/encryption/lit.d.ts +23 -0
  71. package/dist/encryption/lit.d.ts.map +1 -0
  72. package/dist/encryption/lit.js +113 -0
  73. package/dist/encryption/lit.js.map +1 -0
  74. package/dist/encryption/vault-key.d.ts +37 -0
  75. package/dist/encryption/vault-key.d.ts.map +1 -0
  76. package/dist/encryption/vault-key.js +43 -0
  77. package/dist/encryption/vault-key.js.map +1 -0
  78. package/dist/identity/identity-layer.d.ts +3 -0
  79. package/dist/identity/identity-layer.d.ts.map +1 -0
  80. package/dist/identity/identity-layer.js +99 -0
  81. package/dist/identity/identity-layer.js.map +1 -0
  82. package/dist/identity/index.d.ts +4 -0
  83. package/dist/identity/index.d.ts.map +1 -0
  84. package/dist/identity/index.js +4 -0
  85. package/dist/identity/index.js.map +1 -0
  86. package/dist/identity/ows-adapter.d.ts +15 -0
  87. package/dist/identity/ows-adapter.d.ts.map +1 -0
  88. package/dist/identity/ows-adapter.js +67 -0
  89. package/dist/identity/ows-adapter.js.map +1 -0
  90. package/dist/identity/session.d.ts +10 -0
  91. package/dist/identity/session.d.ts.map +1 -0
  92. package/dist/identity/session.js +36 -0
  93. package/dist/identity/session.js.map +1 -0
  94. package/dist/index.d.ts +12 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +12 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/persistence/create-agent.d.ts +11 -0
  99. package/dist/persistence/create-agent.d.ts.map +1 -0
  100. package/dist/persistence/create-agent.js +47 -0
  101. package/dist/persistence/create-agent.js.map +1 -0
  102. package/dist/persistence/index.d.ts +3 -0
  103. package/dist/persistence/index.d.ts.map +1 -0
  104. package/dist/persistence/index.js +3 -0
  105. package/dist/persistence/index.js.map +1 -0
  106. package/dist/persistence/persistence-layer.d.ts +12 -0
  107. package/dist/persistence/persistence-layer.d.ts.map +1 -0
  108. package/dist/persistence/persistence-layer.js +194 -0
  109. package/dist/persistence/persistence-layer.js.map +1 -0
  110. package/dist/transport/index.d.ts +3 -0
  111. package/dist/transport/index.d.ts.map +1 -0
  112. package/dist/transport/index.js +3 -0
  113. package/dist/transport/index.js.map +1 -0
  114. package/dist/transport/relay-session.d.ts +41 -0
  115. package/dist/transport/relay-session.d.ts.map +1 -0
  116. package/dist/transport/relay-session.js +86 -0
  117. package/dist/transport/relay-session.js.map +1 -0
  118. package/dist/transport/transport-layer.d.ts +32 -0
  119. package/dist/transport/transport-layer.d.ts.map +1 -0
  120. package/dist/transport/transport-layer.js +110 -0
  121. package/dist/transport/transport-layer.js.map +1 -0
  122. package/dist/types.d.ts +1319 -0
  123. package/dist/types.d.ts.map +1 -0
  124. package/dist/types.js +7 -0
  125. package/dist/types.js.map +1 -0
  126. package/package.json +91 -0
  127. package/src/__tests__/client.test.ts +30 -0
  128. package/src/__tests__/orbitdb-availability.ts +8 -0
  129. package/src/agent/__tests__/agent-adapter.test.ts +50 -0
  130. package/src/agent/__tests__/client.test.ts +50 -0
  131. package/src/agent/agent-adapter.ts +2 -0
  132. package/src/agent/client.ts +158 -0
  133. package/src/agent/index.ts +1 -0
  134. package/src/client.ts +134 -0
  135. package/src/contracts.ts +44 -0
  136. package/src/data/__tests__/pricing.test.ts +73 -0
  137. package/src/data/__tests__/vault-encryption.test.ts +346 -0
  138. package/src/data/__tests__/vault.test.ts +75 -0
  139. package/src/data/index.ts +8 -0
  140. package/src/data/orbitdb.ts +47 -0
  141. package/src/data/pricing.ts +63 -0
  142. package/src/data/serialization.ts +108 -0
  143. package/src/data/vault.ts +382 -0
  144. package/src/discovery/__tests__/discovery.test.ts +49 -0
  145. package/src/discovery/__tests__/on-chain-registry.test.ts +176 -0
  146. package/src/discovery/discovery-layer.ts +244 -0
  147. package/src/discovery/index.ts +3 -0
  148. package/src/discovery/mock-registry.ts +96 -0
  149. package/src/discovery/on-chain-registry.ts +237 -0
  150. package/src/encryption/__tests__/aes.test.ts +64 -0
  151. package/src/encryption/__tests__/encryption-layer.test.ts +80 -0
  152. package/src/encryption/__tests__/lit.test.ts +97 -0
  153. package/src/encryption/aes.ts +109 -0
  154. package/src/encryption/encryption-layer.ts +100 -0
  155. package/src/encryption/index.ts +5 -0
  156. package/src/encryption/lit.ts +161 -0
  157. package/src/encryption/vault-key.ts +63 -0
  158. package/src/identity/__tests__/identity.test.ts +31 -0
  159. package/src/identity/__tests__/ows-adapter.test.ts +47 -0
  160. package/src/identity/identity-layer.ts +123 -0
  161. package/src/identity/index.ts +3 -0
  162. package/src/identity/ows-adapter.ts +80 -0
  163. package/src/identity/session.ts +57 -0
  164. package/src/index.ts +12 -0
  165. package/src/persistence/__tests__/create-agent.test.ts +9 -0
  166. package/src/persistence/__tests__/persistence.test.ts +242 -0
  167. package/src/persistence/create-agent.ts +55 -0
  168. package/src/persistence/index.ts +2 -0
  169. package/src/persistence/persistence-layer.ts +236 -0
  170. package/src/transport/__tests__/solana-transport.test.ts +112 -0
  171. package/src/transport/__tests__/transport.test.ts +84 -0
  172. package/src/transport/index.ts +2 -0
  173. package/src/transport/relay-session.ts +118 -0
  174. package/src/transport/transport-layer.ts +171 -0
  175. package/src/types/orbitdb.d.ts +9 -0
  176. package/src/types.ts +1496 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @param walletName — OWS wallet name (e.g., "orbitmem")
3
+ * @param chain — CAIP-2 chain ID (e.g., "eip155:84532" for Base Sepolia)
4
+ */
5
+ export function createOwsAdapter(walletName, chain) {
6
+ // OWS NAPI-RS bindings are synchronous — wrap in lazy import for ESM compat.
7
+ const ows = () => import("@open-wallet-standard/core");
8
+ function hexToBytes(hex) {
9
+ const clean = hex.replace(/^0x/, "");
10
+ return new Uint8Array(clean.match(/.{2}/g).map((b) => Number.parseInt(b, 16)));
11
+ }
12
+ /**
13
+ * Find the EVM address for the given CAIP-2 chain from WalletInfo.accounts.
14
+ * Falls back to the first eip155 account if exact chain not found.
15
+ */
16
+ function resolveAddress(accounts) {
17
+ const exact = accounts.find((a) => a.chainId === chain);
18
+ if (exact)
19
+ return exact.address;
20
+ const evm = accounts.find((a) => a.chainId.startsWith("eip155:"));
21
+ if (evm)
22
+ return evm.address;
23
+ throw new Error(`No EVM account found for chain ${chain} in wallet "${walletName}"`);
24
+ }
25
+ return {
26
+ async getAddress() {
27
+ const { getWallet } = await ows();
28
+ const wallet = getWallet(walletName);
29
+ return resolveAddress(wallet.accounts);
30
+ },
31
+ async signMessage(message) {
32
+ const { signMessage: owsSign } = await ows();
33
+ const result = owsSign(walletName, chain, message);
34
+ return { signature: hexToBytes(result.signature), algorithm: "ecdsa-secp256k1" };
35
+ },
36
+ async toViemAccount() {
37
+ const address = await this.getAddress();
38
+ const { toAccount } = await import("viem/accounts");
39
+ return toAccount({
40
+ address: address,
41
+ async signMessage({ message }) {
42
+ const { signMessage: owsSign } = await ows();
43
+ const msg = typeof message === "string"
44
+ ? message
45
+ : typeof message === "object" && "raw" in message
46
+ ? typeof message.raw === "string"
47
+ ? message.raw
48
+ : new TextDecoder().decode(message.raw)
49
+ : String(message);
50
+ const result = owsSign(walletName, chain, msg);
51
+ return result.signature;
52
+ },
53
+ async signTransaction(tx) {
54
+ const { signTransaction: owsSignTx } = await ows();
55
+ const result = owsSignTx(walletName, chain, JSON.stringify(tx));
56
+ return result.signature;
57
+ },
58
+ async signTypedData(typedData) {
59
+ const { signTypedData: owsSignTyped } = await ows();
60
+ const result = owsSignTyped(walletName, chain, JSON.stringify(typedData));
61
+ return result.signature;
62
+ },
63
+ });
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=ows-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ows-adapter.js","sourceRoot":"","sources":["../../src/identity/ows-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ChainFamily, SessionKey, SessionPermission, WalletAddress } from "../types.js";
2
+ export declare function deriveSessionKey(opts: {
3
+ family: ChainFamily;
4
+ signature: Uint8Array;
5
+ parentAddress: WalletAddress;
6
+ permissions: SessionPermission[];
7
+ ttl: number;
8
+ nonce?: Uint8Array;
9
+ }): Promise<SessionKey>;
10
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/identity/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EAEjB,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,CAAC,CAyCtB"}
@@ -0,0 +1,36 @@
1
+ export async function deriveSessionKey(opts) {
2
+ const nonce = opts.nonce ?? crypto.getRandomValues(new Uint8Array(32));
3
+ // Derive session address from signature + nonce
4
+ const combined = new Uint8Array(opts.signature.length + nonce.length);
5
+ combined.set(opts.signature, 0);
6
+ combined.set(nonce, opts.signature.length);
7
+ const hashBuffer = await crypto.subtle.digest("SHA-256", combined);
8
+ const hashArray = new Uint8Array(hashBuffer);
9
+ // Use first 20 bytes as session address (EVM-style)
10
+ const sessionAddrBytes = hashArray.slice(0, 20);
11
+ const sessionAddress = ("0x" +
12
+ Array.from(sessionAddrBytes)
13
+ .map((b) => b.toString(16).padStart(2, "0"))
14
+ .join(""));
15
+ // Session ID from hash
16
+ const id = Array.from(hashArray.slice(20, 32))
17
+ .map((b) => b.toString(16).padStart(2, "0"))
18
+ .join("");
19
+ const expiresAt = Date.now() + opts.ttl * 1000;
20
+ const algorithmMap = {
21
+ passkey: "p256",
22
+ evm: "ecdsa-secp256k1",
23
+ solana: "ed25519",
24
+ };
25
+ return {
26
+ id,
27
+ parentAddress: opts.parentAddress,
28
+ family: opts.family,
29
+ sessionAddress,
30
+ permissions: opts.permissions,
31
+ expiresAt,
32
+ isActive: expiresAt > Date.now(),
33
+ algorithm: algorithmMap[opts.family],
34
+ };
35
+ }
36
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/identity/session.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAOtC;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvE,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACtE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IAE7C,oDAAoD;IACpD,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,CAAC,IAAI;QAC1B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAkB,CAAC;IAEhC,uBAAuB;IACvB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAE/C,MAAM,YAAY,GAA4C;QAC5D,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,iBAAiB;QACtB,MAAM,EAAE,SAAS;KAClB,CAAC;IAEF,OAAO;QACL,EAAE;QACF,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc;QACd,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS;QACT,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;QAChC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { createOrbitMem } from "./client.js";
2
+ export type { NetworkConfig, NetworkId } from "./contracts.js";
3
+ export { DEFAULT_NETWORK, getNetwork, NETWORKS } from "./contracts.js";
4
+ export { createOrbitDBInstance, createVault } from "./data/index.js";
5
+ export { createDiscoveryLayer, MockRegistry, OnChainRegistry } from "./discovery/index.js";
6
+ export { AESEngine, createEncryptionLayer } from "./encryption/index.js";
7
+ export { createIdentityLayer } from "./identity/index.js";
8
+ export { createPersistenceLayer } from "./persistence/index.js";
9
+ export { createRelaySession, createTransportLayer } from "./transport/index.js";
10
+ export { deriveVaultKeyWithCache } from "./encryption/vault-key.js";
11
+ export * from "./types.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { createOrbitMem } from "./client.js";
2
+ export { DEFAULT_NETWORK, getNetwork, NETWORKS } from "./contracts.js";
3
+ export { createOrbitDBInstance, createVault } from "./data/index.js";
4
+ export { createDiscoveryLayer, MockRegistry, OnChainRegistry } from "./discovery/index.js";
5
+ // Layer-level exports for advanced usage
6
+ export { AESEngine, createEncryptionLayer } from "./encryption/index.js";
7
+ export { createIdentityLayer } from "./identity/index.js";
8
+ export { createPersistenceLayer } from "./persistence/index.js";
9
+ export { createRelaySession, createTransportLayer } from "./transport/index.js";
10
+ export { deriveVaultKeyWithCache } from "./encryption/vault-key.js";
11
+ export * from "./types.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3F,yCAAyC;AACzC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,cAAc,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * One-time setup helper for BYOS (Bring Your Own Storacha) users.
3
+ * Creates a Storacha agent, provisions a space, and returns the
4
+ * serialized proof to store in config.
5
+ */
6
+ export declare function createStorachaAgent(name?: string): Promise<{
7
+ agentDID: string;
8
+ proof: string;
9
+ instructions: string;
10
+ }>;
11
+ //# sourceMappingURL=create-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-agent.d.ts","sourceRoot":"","sources":["../../src/persistence/create-agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,SAAa,GAAG,OAAO,CAAC;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CA6CD"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * One-time setup helper for BYOS (Bring Your Own Storacha) users.
3
+ * Creates a Storacha agent, provisions a space, and returns the
4
+ * serialized proof to store in config.
5
+ */
6
+ export async function createStorachaAgent(name = "orbitmem") {
7
+ const { Client } = await import("@storacha/client");
8
+ const client = await Client.create();
9
+ const space = await client.createSpace(name);
10
+ await client.setCurrentSpace(space.did());
11
+ const delegation = await client.createDelegation(client.agent, ["*"], {
12
+ expiration: Infinity,
13
+ });
14
+ const chunks = [];
15
+ for await (const chunk of delegation.archive()) {
16
+ chunks.push(chunk);
17
+ }
18
+ const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);
19
+ const car = new Uint8Array(totalLength);
20
+ let offset = 0;
21
+ for (const chunk of chunks) {
22
+ car.set(chunk, offset);
23
+ offset += chunk.length;
24
+ }
25
+ const proof = btoa(String.fromCharCode(...car));
26
+ return {
27
+ agentDID: client.agent.did(),
28
+ proof,
29
+ instructions: [
30
+ "Storacha agent created successfully.",
31
+ `Agent DID: ${client.agent.did()}`,
32
+ `Space DID: ${space.did()}`,
33
+ "",
34
+ "Save the 'proof' string in your OrbitMem config:",
35
+ "",
36
+ " createOrbitMem({ persistence: { proof: '<proof string>' } })",
37
+ "",
38
+ "Or set it as an environment variable:",
39
+ "",
40
+ " ORBITMEM_STORACHA_PROOF=<proof string>",
41
+ "",
42
+ "Note: You must register this agent with Storacha before uploading.",
43
+ "Run: npx @storacha/cli login <email>",
44
+ ].join("\n"),
45
+ };
46
+ }
47
+ //# sourceMappingURL=create-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-agent.js","sourceRoot":"","sources":["../../src/persistence/create-agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAI,GAAG,UAAU;IAKzD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,MAAO,MAAc,CAAC,MAAM,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;QACpE,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAEhD,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QAC5B,KAAK;QACL,YAAY,EAAE;YACZ,sCAAsC;YACtC,cAAc,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE;YAClC,cAAc,KAAK,CAAC,GAAG,EAAE,EAAE;YAC3B,EAAE;YACF,kDAAkD;YAClD,EAAE;YACF,gEAAgE;YAChE,EAAE;YACF,uCAAuC;YACvC,EAAE;YACF,0CAA0C;YAC1C,EAAE;YACF,oEAAoE;YACpE,sCAAsC;SACvC,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createStorachaAgent } from "./create-agent.js";
2
+ export { createPersistenceLayer } from "./persistence-layer.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createStorachaAgent } from "./create-agent.js";
2
+ export { createPersistenceLayer } from "./persistence-layer.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { IPersistenceLayer, WalletAddress } from "../types.js";
2
+ interface PersistenceConfig {
3
+ mock?: boolean;
4
+ relayUrl?: string;
5
+ proof?: string;
6
+ gatewayUrl?: string;
7
+ author?: WalletAddress;
8
+ signer?: string;
9
+ }
10
+ export declare function createPersistenceLayer(config: PersistenceConfig): IPersistenceLayer;
11
+ export {};
12
+ //# sourceMappingURL=persistence-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence-layer.d.ts","sourceRoot":"","sources":["../../src/persistence/persistence-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAY,aAAa,EAAE,MAAM,aAAa,CAAC;AAI9E,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4ND,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAInF"}
@@ -0,0 +1,194 @@
1
+ const DEFAULT_GATEWAY = "https://w3s.link";
2
+ function generateCID() {
3
+ const bytes = crypto.getRandomValues(new Uint8Array(32));
4
+ return ("bafy" +
5
+ Array.from(bytes)
6
+ .map((b) => b.toString(36))
7
+ .join("")
8
+ .slice(0, 55));
9
+ }
10
+ // ── Mock Persistence ─────────────────────────────────────────
11
+ function createMockPersistence(config) {
12
+ const store = new Map();
13
+ return {
14
+ async archive(opts = {}) {
15
+ const data = opts.data ?? new Uint8Array(0);
16
+ const cid = generateCID();
17
+ const snapshot = {
18
+ cid,
19
+ size: data.length,
20
+ archivedAt: Date.now(),
21
+ author: config.author ?? "0x0",
22
+ entryCount: opts.entryCount ?? 0,
23
+ encrypted: true,
24
+ filecoinStatus: "pending",
25
+ };
26
+ store.set(cid, { data, snapshot });
27
+ return snapshot;
28
+ },
29
+ async retrieve(cid) {
30
+ const entry = store.get(cid);
31
+ if (!entry)
32
+ throw new Error(`Snapshot not found: ${cid}`);
33
+ return entry.data;
34
+ },
35
+ async restore(cid) {
36
+ const entry = store.get(cid);
37
+ if (!entry)
38
+ throw new Error(`Snapshot not found: ${cid}`);
39
+ return { merged: entry.snapshot.entryCount, conflicts: 0 };
40
+ },
41
+ async listSnapshots(opts) {
42
+ const all = Array.from(store.values()).map((e) => e.snapshot);
43
+ const offset = opts?.offset ?? 0;
44
+ const limit = opts?.limit ?? all.length;
45
+ return all.slice(offset, offset + limit);
46
+ },
47
+ async deleteSnapshot(cid) {
48
+ store.delete(cid);
49
+ },
50
+ async getDealStatus(cid) {
51
+ const entry = store.get(cid);
52
+ if (!entry)
53
+ throw new Error(`Snapshot not found: ${cid}`);
54
+ return { status: entry.snapshot.filecoinStatus };
55
+ },
56
+ };
57
+ }
58
+ // ── Managed Persistence (relay-backed) ───────────────────────
59
+ function createManagedPersistence(config) {
60
+ const relayUrl = config.relayUrl;
61
+ const gateway = config.gatewayUrl ?? DEFAULT_GATEWAY;
62
+ return {
63
+ async archive(opts = {}) {
64
+ const data = opts.data ?? new Uint8Array(0);
65
+ const body = JSON.stringify({
66
+ data: new TextDecoder().decode(data),
67
+ entryCount: opts.entryCount ?? 0,
68
+ });
69
+ const res = await fetch(`${relayUrl}/v1/snapshots/archive`, {
70
+ method: "POST",
71
+ headers: { "Content-Type": "application/json" },
72
+ body,
73
+ });
74
+ if (!res.ok) {
75
+ const text = await res.text();
76
+ throw new Error(`Archive failed (${res.status}): ${text}`);
77
+ }
78
+ const snap = await res.json();
79
+ return snap;
80
+ },
81
+ async retrieve(cid) {
82
+ const res = await fetch(`${gateway}/ipfs/${cid}`);
83
+ if (!res.ok)
84
+ throw new Error(`Failed to retrieve ${cid}: ${res.status}`);
85
+ return new Uint8Array(await res.arrayBuffer());
86
+ },
87
+ async restore(cid) {
88
+ const res = await fetch(`${gateway}/ipfs/${cid}`);
89
+ if (!res.ok)
90
+ throw new Error(`Failed to retrieve ${cid}: ${res.status}`);
91
+ return { merged: 0, conflicts: 0 };
92
+ },
93
+ async listSnapshots(_opts) {
94
+ const res = await fetch(`${relayUrl}/v1/snapshots`);
95
+ if (!res.ok) {
96
+ const text = await res.text();
97
+ throw new Error(`List snapshots failed (${res.status}): ${text}`);
98
+ }
99
+ const items = await res.json();
100
+ return items;
101
+ },
102
+ async deleteSnapshot(cid) {
103
+ const res = await fetch(`${relayUrl}/v1/snapshots/${cid}`, {
104
+ method: "DELETE",
105
+ });
106
+ if (!res.ok && res.status !== 204) {
107
+ const text = await res.text();
108
+ throw new Error(`Delete failed (${res.status}): ${text}`);
109
+ }
110
+ },
111
+ async getDealStatus(_cid) {
112
+ return { status: "pending" };
113
+ },
114
+ };
115
+ }
116
+ // ── Direct Persistence (Storacha UCAN) ───────────────────────
117
+ function createDirectPersistence(config) {
118
+ const gateway = config.gatewayUrl ?? DEFAULT_GATEWAY;
119
+ let clientPromise = null;
120
+ async function getClient() {
121
+ if (!clientPromise) {
122
+ clientPromise = (async () => {
123
+ const { create } = await import("@storacha/client");
124
+ const { parse } = await import("@storacha/client/proof");
125
+ const client = await create();
126
+ const proof = await parse(config.proof);
127
+ const space = await client.addSpace(proof);
128
+ await client.setCurrentSpace(space.did());
129
+ return client;
130
+ })();
131
+ }
132
+ return clientPromise;
133
+ }
134
+ return {
135
+ async archive(opts = {}) {
136
+ const client = await getClient();
137
+ const data = opts.data ?? new Uint8Array(0);
138
+ const blob = new Blob([data]);
139
+ const cid = await client.uploadFile(blob);
140
+ const snapshot = {
141
+ cid: cid.toString(),
142
+ size: data.length,
143
+ archivedAt: Date.now(),
144
+ author: config.author ?? "0x0",
145
+ entryCount: opts.entryCount ?? 0,
146
+ encrypted: true,
147
+ filecoinStatus: "pending",
148
+ };
149
+ return snapshot;
150
+ },
151
+ async retrieve(cid) {
152
+ const res = await fetch(`${gateway}/ipfs/${cid}`);
153
+ if (!res.ok)
154
+ throw new Error(`Failed to retrieve ${cid}: ${res.status}`);
155
+ return new Uint8Array(await res.arrayBuffer());
156
+ },
157
+ async restore(cid) {
158
+ const res = await fetch(`${gateway}/ipfs/${cid}`);
159
+ if (!res.ok)
160
+ throw new Error(`Failed to retrieve ${cid}: ${res.status}`);
161
+ return { merged: 0, conflicts: 0 };
162
+ },
163
+ async listSnapshots(_opts) {
164
+ const client = await getClient();
165
+ const result = await client.capability.upload.list();
166
+ return (result.results ?? []).map((entry) => ({
167
+ cid: entry.root.toString(),
168
+ size: entry.size ?? 0,
169
+ archivedAt: entry.insertedAt ? new Date(entry.insertedAt).getTime() : Date.now(),
170
+ author: config.author ?? "0x0",
171
+ entryCount: 0,
172
+ encrypted: true,
173
+ filecoinStatus: "pending",
174
+ }));
175
+ },
176
+ async deleteSnapshot(cid) {
177
+ const client = await getClient();
178
+ const { CID: CIDClass } = await import("multiformats/cid");
179
+ await client.capability.upload.remove(CIDClass.parse(cid));
180
+ },
181
+ async getDealStatus(_cid) {
182
+ return { status: "pending" };
183
+ },
184
+ };
185
+ }
186
+ // ── Factory (mode detection) ─────────────────────────────────
187
+ export function createPersistenceLayer(config) {
188
+ if (config.proof)
189
+ return createDirectPersistence(config);
190
+ if (config.relayUrl)
191
+ return createManagedPersistence(config);
192
+ return createMockPersistence(config);
193
+ }
194
+ //# sourceMappingURL=persistence-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence-layer.js","sourceRoot":"","sources":["../../src/persistence/persistence-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createRelaySession } from "./relay-session.js";
2
+ export { createTransportLayer } from "./transport-layer.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createRelaySession } from "./relay-session.js";
2
+ export { createTransportLayer } from "./transport-layer.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Relay session transport — acquires a bearer token via ERC-8128 auth
3
+ * and caches it for subsequent requests. Designed for browser use with
4
+ * sessionStorage, but works anywhere with a custom storage adapter.
5
+ */
6
+ export interface RelaySessionConfig {
7
+ /** Relay server URL (e.g. "https://orbitmem-relay.fly.dev") */
8
+ relayUrl: string;
9
+ /** Wallet address (checksummed) */
10
+ address: `0x${string}`;
11
+ /** Chain ID (default: 84532 = Base Sepolia) */
12
+ chainId?: number;
13
+ /** Wallet signMessage function */
14
+ signMessage: (message: Uint8Array) => Promise<`0x${string}`>;
15
+ /** Session TTL in seconds (default: 1800 = 30 min) */
16
+ ttl?: number;
17
+ /** Storage adapter for caching (default: sessionStorage if available) */
18
+ storage?: {
19
+ getItem(key: string): string | null;
20
+ setItem(key: string, value: string): void;
21
+ removeItem(key: string): void;
22
+ };
23
+ }
24
+ /**
25
+ * Create a relay session transport that handles session token
26
+ * acquisition, caching, and authenticated fetch.
27
+ *
28
+ * Usage:
29
+ * ```ts
30
+ * const relay = createRelaySession({ relayUrl, address, signMessage });
31
+ * const res = await relay.fetch("/v1/vault/keys", { method: "POST", body: ... });
32
+ * relay.clear(); // on disconnect
33
+ * ```
34
+ */
35
+ export declare function createRelaySession(config: RelaySessionConfig): {
36
+ /** Make an authenticated fetch to the relay using a cached session token. */
37
+ fetch(path: string, init?: RequestInit): Promise<Response>;
38
+ /** Clear the cached session token. Call on disconnect. */
39
+ clear(): void;
40
+ };
41
+ //# sourceMappingURL=relay-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-session.d.ts","sourceRoot":"","sources":["../../src/transport/relay-session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC7D,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;CACH;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB;IAqDzD,6EAA6E;gBAC3D,MAAM,SAAS,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAWhE,0DAA0D;;EAK7D"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Relay session transport — acquires a bearer token via ERC-8128 auth
3
+ * and caches it for subsequent requests. Designed for browser use with
4
+ * sessionStorage, but works anywhere with a custom storage adapter.
5
+ */
6
+ import { createSignerClient } from "@slicekit/erc8128";
7
+ const CACHE_KEY = "orbitmem:session";
8
+ /**
9
+ * Create a relay session transport that handles session token
10
+ * acquisition, caching, and authenticated fetch.
11
+ *
12
+ * Usage:
13
+ * ```ts
14
+ * const relay = createRelaySession({ relayUrl, address, signMessage });
15
+ * const res = await relay.fetch("/v1/vault/keys", { method: "POST", body: ... });
16
+ * relay.clear(); // on disconnect
17
+ * ```
18
+ */
19
+ export function createRelaySession(config) {
20
+ const { relayUrl, address, chainId = 84532, signMessage, ttl = 1800 } = config;
21
+ const storage = config.storage ?? (typeof sessionStorage !== "undefined" ? sessionStorage : null);
22
+ const signer = {
23
+ address,
24
+ chainId,
25
+ signMessage: async (message) => signMessage(message),
26
+ };
27
+ const client = createSignerClient(signer, {
28
+ preferReplayable: true,
29
+ ttlSeconds: ttl,
30
+ });
31
+ function getCached() {
32
+ if (!storage)
33
+ return null;
34
+ const raw = storage.getItem(CACHE_KEY);
35
+ if (!raw)
36
+ return null;
37
+ try {
38
+ const session = JSON.parse(raw);
39
+ if (session.address !== address)
40
+ return null;
41
+ if (session.expiresAt <= Date.now() + 30_000)
42
+ return null;
43
+ return session;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ async function acquireToken() {
50
+ const cached = getCached();
51
+ if (cached)
52
+ return cached.token;
53
+ const res = await client.fetch(`${relayUrl}/v1/auth/session`, {
54
+ method: "POST",
55
+ headers: { "Content-Type": "application/json" },
56
+ body: JSON.stringify({ ttl }),
57
+ }, {
58
+ binding: "class-bound",
59
+ replay: "replayable",
60
+ components: ["@authority"],
61
+ });
62
+ if (!res.ok)
63
+ throw new Error(`Session request failed: ${res.status}`);
64
+ const data = await res.json();
65
+ storage?.setItem(CACHE_KEY, JSON.stringify(data));
66
+ return data.token;
67
+ }
68
+ return {
69
+ /** Make an authenticated fetch to the relay using a cached session token. */
70
+ async fetch(path, init) {
71
+ const token = await acquireToken();
72
+ return globalThis.fetch(`${relayUrl}${path}`, {
73
+ ...init,
74
+ headers: {
75
+ ...init?.headers,
76
+ Authorization: `Bearer ${token}`,
77
+ },
78
+ });
79
+ },
80
+ /** Clear the cached session token. Call on disconnect. */
81
+ clear() {
82
+ storage?.removeItem(CACHE_KEY);
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=relay-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-session.js","sourceRoot":"","sources":["../../src/transport/relay-session.ts"],"names":[],"mappings":"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"}