@orbitmem/relay 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 (86) hide show
  1. package/README.md +108 -0
  2. package/dist/app.d.ts +7 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +27 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +24 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/middleware/ed25519-verify.d.ts +14 -0
  11. package/dist/middleware/ed25519-verify.d.ts.map +1 -0
  12. package/dist/middleware/ed25519-verify.js +31 -0
  13. package/dist/middleware/ed25519-verify.js.map +1 -0
  14. package/dist/middleware/erc8128.d.ts +25 -0
  15. package/dist/middleware/erc8128.d.ts.map +1 -0
  16. package/dist/middleware/erc8128.js +196 -0
  17. package/dist/middleware/erc8128.js.map +1 -0
  18. package/dist/middleware/mpp.d.ts +36 -0
  19. package/dist/middleware/mpp.d.ts.map +1 -0
  20. package/dist/middleware/mpp.js +122 -0
  21. package/dist/middleware/mpp.js.map +1 -0
  22. package/dist/middleware/session.d.ts +13 -0
  23. package/dist/middleware/session.d.ts.map +1 -0
  24. package/dist/middleware/session.js +47 -0
  25. package/dist/middleware/session.js.map +1 -0
  26. package/dist/routes/data.d.ts +5 -0
  27. package/dist/routes/data.d.ts.map +1 -0
  28. package/dist/routes/data.js +44 -0
  29. package/dist/routes/data.js.map +1 -0
  30. package/dist/routes/health.d.ts +3 -0
  31. package/dist/routes/health.d.ts.map +1 -0
  32. package/dist/routes/health.js +4 -0
  33. package/dist/routes/health.js.map +1 -0
  34. package/dist/routes/snapshots.d.ts +5 -0
  35. package/dist/routes/snapshots.d.ts.map +1 -0
  36. package/dist/routes/snapshots.js +31 -0
  37. package/dist/routes/snapshots.js.map +1 -0
  38. package/dist/routes/vault.d.ts +6 -0
  39. package/dist/routes/vault.d.ts.map +1 -0
  40. package/dist/routes/vault.js +105 -0
  41. package/dist/routes/vault.js.map +1 -0
  42. package/dist/services/index.d.ts +17 -0
  43. package/dist/services/index.d.ts.map +1 -0
  44. package/dist/services/index.js +60 -0
  45. package/dist/services/index.js.map +1 -0
  46. package/dist/services/live-discovery.d.ts +17 -0
  47. package/dist/services/live-discovery.d.ts.map +1 -0
  48. package/dist/services/live-discovery.js +97 -0
  49. package/dist/services/live-discovery.js.map +1 -0
  50. package/dist/services/live-snapshot.d.ts +18 -0
  51. package/dist/services/live-snapshot.d.ts.map +1 -0
  52. package/dist/services/live-snapshot.js +43 -0
  53. package/dist/services/live-snapshot.js.map +1 -0
  54. package/dist/services/live-vault.d.ts +27 -0
  55. package/dist/services/live-vault.d.ts.map +1 -0
  56. package/dist/services/live-vault.js +73 -0
  57. package/dist/services/live-vault.js.map +1 -0
  58. package/dist/services/mock-discovery.d.ts +14 -0
  59. package/dist/services/mock-discovery.d.ts.map +1 -0
  60. package/dist/services/mock-discovery.js +86 -0
  61. package/dist/services/mock-discovery.js.map +1 -0
  62. package/dist/services/mock-snapshot.d.ts +7 -0
  63. package/dist/services/mock-snapshot.d.ts.map +1 -0
  64. package/dist/services/mock-snapshot.js +30 -0
  65. package/dist/services/mock-snapshot.js.map +1 -0
  66. package/dist/services/mock-vault.d.ts +33 -0
  67. package/dist/services/mock-vault.d.ts.map +1 -0
  68. package/dist/services/mock-vault.js +88 -0
  69. package/dist/services/mock-vault.js.map +1 -0
  70. package/dist/services/orbitdb-peer.d.ts +12 -0
  71. package/dist/services/orbitdb-peer.d.ts.map +1 -0
  72. package/dist/services/orbitdb-peer.js +23 -0
  73. package/dist/services/orbitdb-peer.js.map +1 -0
  74. package/dist/services/plan.d.ts +14 -0
  75. package/dist/services/plan.d.ts.map +1 -0
  76. package/dist/services/plan.js +37 -0
  77. package/dist/services/plan.js.map +1 -0
  78. package/dist/services/test-helpers.d.ts +4 -0
  79. package/dist/services/test-helpers.d.ts.map +1 -0
  80. package/dist/services/test-helpers.js +10 -0
  81. package/dist/services/test-helpers.js.map +1 -0
  82. package/dist/services/types.d.ts +100 -0
  83. package/dist/services/types.d.ts.map +1 -0
  84. package/dist/services/types.js +2 -0
  85. package/dist/services/types.js.map +1 -0
  86. package/package.json +70 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpp.js","sourceRoot":"","sources":["../../src/middleware/mpp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Create a stateless HMAC-signed session token.
3
+ * Format: base64(JSON payload) + "." + base64(HMAC signature)
4
+ */
5
+ export declare function createSessionToken(address: string, ttlSeconds: number): Promise<string>;
6
+ /**
7
+ * Verify a session token. Returns the payload if valid, null otherwise.
8
+ */
9
+ export declare function verifySessionToken(token: string): Promise<{
10
+ address: string;
11
+ expiresAt: number;
12
+ } | null>;
13
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyBxD"}
@@ -0,0 +1,47 @@
1
+ // Random secret per process — tokens invalidate on relay restart
2
+ const SECRET = crypto.getRandomValues(new Uint8Array(32));
3
+ let hmacKey = null;
4
+ async function getKey() {
5
+ if (!hmacKey) {
6
+ hmacKey = await crypto.subtle.importKey("raw", SECRET, { name: "HMAC", hash: "SHA-256" }, false, ["sign", "verify"]);
7
+ }
8
+ return hmacKey;
9
+ }
10
+ /**
11
+ * Create a stateless HMAC-signed session token.
12
+ * Format: base64(JSON payload) + "." + base64(HMAC signature)
13
+ */
14
+ export async function createSessionToken(address, ttlSeconds) {
15
+ const expiresAt = Date.now() + ttlSeconds * 1000;
16
+ const payload = JSON.stringify({ address, expiresAt });
17
+ const payloadB64 = btoa(payload);
18
+ const key = await getKey();
19
+ const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(payloadB64));
20
+ const sigB64 = btoa(String.fromCharCode(...new Uint8Array(sig)));
21
+ return `${payloadB64}.${sigB64}`;
22
+ }
23
+ /**
24
+ * Verify a session token. Returns the payload if valid, null otherwise.
25
+ */
26
+ export async function verifySessionToken(token) {
27
+ const dot = token.indexOf(".");
28
+ if (dot === -1)
29
+ return null;
30
+ const payloadB64 = token.slice(0, dot);
31
+ const sigB64 = token.slice(dot + 1);
32
+ try {
33
+ const key = await getKey();
34
+ const sig = Uint8Array.from(atob(sigB64), (c) => c.charCodeAt(0));
35
+ const valid = await crypto.subtle.verify("HMAC", key, sig, new TextEncoder().encode(payloadB64));
36
+ if (!valid)
37
+ return null;
38
+ const payload = JSON.parse(atob(payloadB64));
39
+ if (payload.expiresAt <= Date.now())
40
+ return null;
41
+ return { address: payload.address, expiresAt: payload.expiresAt };
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1D,IAAI,OAAO,GAAqB,IAAI,CAAC;AAErC,KAAK,UAAU,MAAM;IACnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACrC,KAAK,EACL,MAAM,EACN,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,UAAkB;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,GAAG,UAAU,IAAI,MAAM,EAAE,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa;IAEb,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,MAAM,EACN,GAAG,EACH,GAAG,EACH,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CACrC,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAEjD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Hono } from "hono";
2
+ import { type ERC8128Env } from "../middleware/erc8128.js";
3
+ import type { IDiscoveryService } from "../services/types.js";
4
+ export declare function createDataRoutes(discovery: IDiscoveryService): Hono<ERC8128Env>;
5
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,KAAK,UAAU,EAAW,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,CAgD/E"}
@@ -0,0 +1,44 @@
1
+ import { Hono } from "hono";
2
+ import { erc8128 } from "../middleware/erc8128.js";
3
+ export function createDataRoutes(discovery) {
4
+ const routes = new Hono();
5
+ // Stats cache (60s TTL)
6
+ let statsCache = null;
7
+ routes.get("/data/stats", async (c) => {
8
+ const now = Date.now();
9
+ if (statsCache && statsCache.expiry > now) {
10
+ return c.json(statsCache.data);
11
+ }
12
+ const stats = await discovery.getStats();
13
+ statsCache = { data: stats, expiry: now + 60_000 };
14
+ return c.json(stats);
15
+ });
16
+ // Per-user stats — requires ERC-8128
17
+ routes.get("/data/user/stats", erc8128(), async (c) => {
18
+ const signer = c.get("signer");
19
+ const stats = await discovery.getUserStats(signer);
20
+ return c.json(stats);
21
+ });
22
+ // Search data registrations
23
+ routes.get("/data/search", async (c) => {
24
+ const schema = c.req.query("schema");
25
+ const tags = c.req.query("tags")?.split(",");
26
+ const verifiedOnly = c.req.query("verifiedOnly") === "true";
27
+ const minQuality = c.req.query("minQuality") ? Number(c.req.query("minQuality")) : undefined;
28
+ const results = await discovery.search({
29
+ schema: schema || undefined,
30
+ tags: tags?.length ? tags : undefined,
31
+ verifiedOnly: verifiedOnly || undefined,
32
+ minQuality,
33
+ });
34
+ return c.json({ results, count: results.length });
35
+ });
36
+ // Get data quality score
37
+ routes.get("/data/:dataId/score", async (c) => {
38
+ const dataId = Number(c.req.param("dataId"));
39
+ const score = await discovery.getScore(dataId);
40
+ return c.json(score);
41
+ });
42
+ return routes;
43
+ }
44
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAmB,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGpE,MAAM,UAAU,gBAAgB,CAAC,SAA4B;IAC3D,MAAM,MAAM,GAAG,IAAI,IAAI,EAAc,CAAC;IAEtC,wBAAwB;IACxB,IAAI,UAAU,GAA6C,IAAI,CAAC;IAEhE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;QACzC,UAAU,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,CAAC;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC;QAC5D,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7F,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;YACrC,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACrC,YAAY,EAAE,YAAY,IAAI,SAAS;YACvC,UAAU;SACX,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Hono } from "hono";
2
+ export declare const healthRoutes: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,eAAO,MAAM,YAAY,4EAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from "hono";
2
+ export const healthRoutes = new Hono();
3
+ healthRoutes.get("/health", (c) => c.json({ status: "ok", timestamp: Date.now() }));
4
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;AAEvC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Hono } from "hono";
2
+ import { type ERC8128Env } from "../middleware/erc8128.js";
3
+ import type { IPlanService, ISnapshotService } from "../services/types.js";
4
+ export declare function createSnapshotRoutes(snapshot: ISnapshotService, plan: IPlanService): Hono<ERC8128Env>;
5
+ //# sourceMappingURL=snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/routes/snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,KAAK,UAAU,EAAW,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE3E,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,YAAY,GACjB,IAAI,CAAC,UAAU,CAAC,CAoClB"}
@@ -0,0 +1,31 @@
1
+ import { Hono } from "hono";
2
+ import { erc8128 } from "../middleware/erc8128.js";
3
+ export function createSnapshotRoutes(snapshot, plan) {
4
+ const routes = new Hono();
5
+ routes.get("/snapshots", erc8128(), async (c) => {
6
+ const signer = c.get("signer");
7
+ const snapshots = await snapshot.list(signer);
8
+ return c.json({ snapshots, count: snapshots.length });
9
+ });
10
+ routes.post("/snapshots/archive", erc8128(), async (c) => {
11
+ const signer = c.get("signer");
12
+ const body = await c.req
13
+ .json()
14
+ .catch(() => ({ data: undefined, entryCount: undefined }));
15
+ const dataSize = new TextEncoder().encode(body.data ?? "{}").length;
16
+ const usage = await plan.getUsage(signer);
17
+ if (usage.used + dataSize > usage.limit) {
18
+ return c.json({ error: "Storage quota exceeded" }, 413);
19
+ }
20
+ const meta = await snapshot.archive(signer, body.data, body.entryCount);
21
+ await plan.addUsage(signer, meta.size);
22
+ return c.json(meta);
23
+ });
24
+ routes.get("/snapshots/usage", erc8128(), async (c) => {
25
+ const signer = c.get("signer");
26
+ const usage = await plan.getUsage(signer);
27
+ return c.json(usage);
28
+ });
29
+ return routes;
30
+ }
31
+ //# sourceMappingURL=snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/routes/snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAmB,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGpE,MAAM,UAAU,oBAAoB,CAClC,QAA0B,EAC1B,IAAkB;IAElB,MAAM,MAAM,GAAG,IAAI,IAAI,EAAc,CAAC;IAEtC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG;aACrB,IAAI,EAA0C;aAC9C,KAAK,CACJ,GAAG,EAAE,CACH,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAA2C,CACzF,CAAC;QAEJ,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Hono } from "hono";
2
+ import { type ERC8128Env } from "../middleware/erc8128.js";
3
+ import { type MPPConfig } from "../middleware/mpp.js";
4
+ import type { IVaultService } from "../services/types.js";
5
+ export declare function createVaultRoutes(vault: IVaultService, mppConfig?: MPPConfig): Hono<ERC8128Env>;
6
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/routes/vault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,KAAK,UAAU,EAAW,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAwH/F"}
@@ -0,0 +1,105 @@
1
+ import { Hono } from "hono";
2
+ import { erc8128 } from "../middleware/erc8128.js";
3
+ import { mppPricing } from "../middleware/mpp.js";
4
+ import { createSessionToken } from "../middleware/session.js";
5
+ const DEFAULT_SESSION_TTL = 1800; // 30 minutes
6
+ const MAX_SESSION_TTL = 86400; // 24 hours
7
+ export function createVaultRoutes(vault, mppConfig) {
8
+ const routes = new Hono();
9
+ // List public keys — must be before the wildcard route (always free)
10
+ routes.get("/vault/public/:address/keys", async (c) => {
11
+ const address = c.req.param("address");
12
+ const prefix = c.req.query("prefix");
13
+ const keys = await vault.getPublicKeys(address, prefix ?? undefined);
14
+ return c.json({ keys });
15
+ });
16
+ // Public read — no auth required (wildcard must come after /keys)
17
+ // If MPP config is provided, apply pricing middleware
18
+ if (mppConfig) {
19
+ routes.get("/vault/public/:address/:key{.+}", mppPricing({ vault, config: mppConfig }), async (c) => {
20
+ const address = c.req.param("address");
21
+ const key = c.req.param("key");
22
+ const entry = await vault.getPublic(address, key);
23
+ if (!entry) {
24
+ return c.json({ error: "Entry not found or not public" }, 404);
25
+ }
26
+ return c.json({ key, value: entry.value, visibility: "public" });
27
+ });
28
+ }
29
+ else {
30
+ routes.get("/vault/public/:address/:key{.+}", async (c) => {
31
+ const address = c.req.param("address");
32
+ const key = c.req.param("key");
33
+ const entry = await vault.getPublic(address, key);
34
+ if (!entry) {
35
+ return c.json({ error: "Entry not found or not public" }, 404);
36
+ }
37
+ return c.json({ key, value: entry.value, visibility: "public" });
38
+ });
39
+ }
40
+ // Encrypted read — requires ERC-8128
41
+ routes.post("/vault/read", erc8128(), async (c) => {
42
+ const body = await c.req.json();
43
+ const address = body.vaultAddress ?? c.get("signer");
44
+ const entry = await vault.getEncrypted(address, body.path);
45
+ if (!entry) {
46
+ return c.json({ error: "Entry not found" }, 404);
47
+ }
48
+ return c.json({
49
+ key: body.path,
50
+ value: entry.value,
51
+ visibility: entry.visibility,
52
+ signer: c.get("signer"),
53
+ });
54
+ });
55
+ // Sync trigger — requires ERC-8128
56
+ routes.post("/vault/sync", erc8128(), async (c) => {
57
+ const result = await vault.sync(c.get("signer"));
58
+ return c.json({ ...result, signer: c.get("signer") });
59
+ });
60
+ // Auth challenge — generate nonce for wallet signing
61
+ routes.post("/auth/challenge", async (c) => {
62
+ const nonce = crypto.randomUUID();
63
+ const timestamp = Date.now();
64
+ const message = `OrbitMem Authentication\nTimestamp: ${timestamp}\nNonce: ${nonce}`;
65
+ return c.json({ message, nonce, timestamp });
66
+ });
67
+ // Issue session token — requires ERC-8128 auth
68
+ routes.post("/auth/session", erc8128(), async (c) => {
69
+ const body = await c.req.json().catch(() => ({}));
70
+ const ttl = Math.min(body.ttl ?? DEFAULT_SESSION_TTL, MAX_SESSION_TTL);
71
+ const address = c.get("signer");
72
+ const token = await createSessionToken(address, ttl);
73
+ const expiresAt = Date.now() + ttl * 1000;
74
+ return c.json({ token, expiresAt, address });
75
+ });
76
+ // Internal: seed vault data (for testing / initial sync)
77
+ routes.post("/vault/seed", async (c) => {
78
+ const body = await c.req.json();
79
+ const count = await vault.seed(body.address, body.entries);
80
+ return c.json({ status: "ok", count });
81
+ });
82
+ // Write vault entry — requires ERC-8128
83
+ routes.post("/vault/write", erc8128(), async (c) => {
84
+ const body = await c.req.json();
85
+ const signer = c.get("signer");
86
+ const result = await vault.write(signer, body.path, body.value, body.visibility);
87
+ return c.json({ ok: true, hash: result.hash });
88
+ });
89
+ // Delete vault entry — requires ERC-8128
90
+ routes.post("/vault/delete", erc8128(), async (c) => {
91
+ const body = await c.req.json();
92
+ const signer = c.get("signer");
93
+ await vault.delete(signer, body.path);
94
+ return c.json({ ok: true });
95
+ });
96
+ // List vault keys — requires ERC-8128
97
+ routes.post("/vault/keys", erc8128(), async (c) => {
98
+ const body = await c.req.json();
99
+ const signer = c.get("signer");
100
+ const keys = await vault.getKeys(signer, body.prefix);
101
+ return c.json({ keys });
102
+ });
103
+ return routes;
104
+ }
105
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/routes/vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { RelayServices } from "./types.js";
2
+ export declare function getOrbitDBPeer(opts?: {
3
+ directory?: string;
4
+ listenAddrs?: string[];
5
+ }): Promise<{
6
+ orbitdb: any;
7
+ ipfs: any;
8
+ libp2p: any;
9
+ cleanup: () => Promise<void>;
10
+ }>;
11
+ export declare function stopOrbitDBPeer(): Promise<void>;
12
+ export { PlanService } from "./plan.js";
13
+ export type { IDiscoveryService, IPlanService, ISnapshotService, IVaultService, RelayServices, } from "./types.js";
14
+ export declare function createMockServices(): RelayServices;
15
+ export declare function createLiveServices(): Promise<RelayServices>;
16
+ export declare function createServices(mode?: string): Promise<RelayServices>;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;;;;;GAGzF;AAED,wBAAsB,eAAe,kBAGpC;AACD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC;AAiBpB,wBAAgB,kBAAkB,IAAI,aAAa,CAOlD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CAqBjE;AAED,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAK1E"}
@@ -0,0 +1,60 @@
1
+ import { MockDiscoveryService } from "./mock-discovery.js";
2
+ import { MockSnapshotService } from "./mock-snapshot.js";
3
+ import { MockVaultService } from "./mock-vault.js";
4
+ import { PlanService } from "./plan.js";
5
+ export async function getOrbitDBPeer(opts) {
6
+ const { getOrbitDBPeer: get } = await import("./orbitdb-peer.js");
7
+ return get(opts);
8
+ }
9
+ export async function stopOrbitDBPeer() {
10
+ const { stopOrbitDBPeer: stop } = await import("./orbitdb-peer.js");
11
+ return stop();
12
+ }
13
+ export { PlanService } from "./plan.js";
14
+ function getChain(chainId) {
15
+ // Lazy-resolve chain definitions to avoid importing all chains at startup
16
+ const id = Number(chainId || "8453");
17
+ return { id, name: `chain-${id}` };
18
+ }
19
+ const LIVE_ENV_VARS = ["RPC_URL", "DATA_REGISTRY_ADDRESS", "FEEDBACK_REGISTRY_ADDRESS"];
20
+ function validateLiveEnv() {
21
+ const missing = LIVE_ENV_VARS.filter((v) => !process.env[v]);
22
+ if (missing.length > 0) {
23
+ throw new Error(`RELAY_MODE=live requires env vars: ${missing.join(", ")}`);
24
+ }
25
+ }
26
+ export function createMockServices() {
27
+ return {
28
+ vault: new MockVaultService(),
29
+ snapshot: new MockSnapshotService(),
30
+ discovery: new MockDiscoveryService(),
31
+ plan: new PlanService(),
32
+ };
33
+ }
34
+ export async function createLiveServices() {
35
+ validateLiveEnv();
36
+ const { createPublicClient, http } = await import("viem");
37
+ const { LiveDiscoveryService } = await import("./live-discovery.js");
38
+ const chain = getChain(process.env.CHAIN_ID);
39
+ const transport = http(process.env.RPC_URL);
40
+ const publicClient = createPublicClient({ chain, transport });
41
+ const deployBlock = BigInt(process.env.DEPLOY_BLOCK ?? "38728995");
42
+ return {
43
+ vault: new MockVaultService(),
44
+ snapshot: new MockSnapshotService(),
45
+ discovery: new LiveDiscoveryService({
46
+ publicClient,
47
+ dataRegistry: process.env.DATA_REGISTRY_ADDRESS,
48
+ feedbackRegistry: process.env.FEEDBACK_REGISTRY_ADDRESS,
49
+ deployBlock,
50
+ }),
51
+ plan: new PlanService(),
52
+ };
53
+ }
54
+ export async function createServices(mode) {
55
+ if (mode === "live") {
56
+ return createLiveServices();
57
+ }
58
+ return createMockServices();
59
+ }
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type OnChainRegistryConfig } from "@orbitmem/sdk/discovery";
2
+ import type { DataStats, IDiscoveryService, UserStats } from "./types.js";
3
+ export declare class LiveDiscoveryService implements IDiscoveryService {
4
+ private registry;
5
+ private config;
6
+ constructor(config: OnChainRegistryConfig);
7
+ search(query: {
8
+ schema?: string;
9
+ tags?: string[];
10
+ verifiedOnly?: boolean;
11
+ minQuality?: number;
12
+ }): Promise<unknown[]>;
13
+ getScore(dataId: number): Promise<unknown>;
14
+ getStats(): Promise<DataStats>;
15
+ getUserStats(_signer: string): Promise<UserStats>;
16
+ }
17
+ //# sourceMappingURL=live-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-discovery.d.ts","sourceRoot":"","sources":["../../src/services/live-discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAKnC,MAAM,CAAC,KAAK,EAAE;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8BhB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IA6D9B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAIxD"}
@@ -0,0 +1,97 @@
1
+ import { DataRegistryAbi } from "@orbitmem/contracts";
2
+ import { OnChainRegistry } from "@orbitmem/sdk/discovery";
3
+ export class LiveDiscoveryService {
4
+ registry;
5
+ config;
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.registry = new OnChainRegistry(config);
9
+ }
10
+ async search(query) {
11
+ const results = await this.registry.findData({ activeOnly: query.verifiedOnly });
12
+ // Enrich each entry with tokenURI metadata
13
+ const enriched = await Promise.all(results.map(async (entry) => {
14
+ try {
15
+ const uri = (await this.config.publicClient.readContract({
16
+ address: this.config.dataRegistry,
17
+ abi: DataRegistryAbi,
18
+ functionName: "tokenURI",
19
+ args: [BigInt(entry.dataId)],
20
+ }));
21
+ const meta = JSON.parse(uri);
22
+ return { ...entry, ...meta };
23
+ }
24
+ catch {
25
+ return entry;
26
+ }
27
+ }));
28
+ // Client-side filtering by schema / tags
29
+ return enriched.filter((entry) => {
30
+ if (query.schema && entry.schema !== query.schema)
31
+ return false;
32
+ if (query.tags?.length && !query.tags.some((t) => entry.tags?.includes(t)))
33
+ return false;
34
+ return true;
35
+ });
36
+ }
37
+ async getScore(dataId) {
38
+ return this.registry.getDataScore(dataId);
39
+ }
40
+ async getStats() {
41
+ const allData = await this.search({});
42
+ const scores = await Promise.all(allData.map((d) => this.getScore(d.dataId)));
43
+ const totalEntries = allData.length;
44
+ const totalFeedback = scores.reduce((sum, s) => sum + s.totalFeedback, 0);
45
+ const avgQuality = totalEntries > 0
46
+ ? Math.round(scores.reduce((sum, s) => sum + s.quality, 0) / totalEntries)
47
+ : 0;
48
+ const buckets = [
49
+ { range: "0-20", min: 0, max: 20, count: 0 },
50
+ { range: "21-40", min: 21, max: 40, count: 0 },
51
+ { range: "41-60", min: 41, max: 60, count: 0 },
52
+ { range: "61-80", min: 61, max: 80, count: 0 },
53
+ { range: "81-100", min: 81, max: 100, count: 0 },
54
+ ];
55
+ for (const s of scores) {
56
+ const bucket = buckets.find((b) => s.quality >= b.min && s.quality <= b.max);
57
+ if (bucket)
58
+ bucket.count++;
59
+ }
60
+ const qualityDistribution = buckets.map(({ range, count }) => ({ range, count }));
61
+ const tagCounts = new Map();
62
+ for (const d of allData) {
63
+ for (const tag of d.tags ?? []) {
64
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
65
+ }
66
+ }
67
+ const topTags = Array.from(tagCounts.entries())
68
+ .map(([tag, count]) => ({ tag, count }))
69
+ .sort((a, b) => b.count - a.count)
70
+ .slice(0, 10);
71
+ const now = Date.now();
72
+ const days = Array.from({ length: 7 }, (_, i) => {
73
+ const d = new Date(now - (6 - i) * 86400000);
74
+ return d.toLocaleDateString("en-US", { weekday: "short" });
75
+ });
76
+ const activityMap = new Map(days.map((d) => [d, { entries: 0, feedback: 0 }]));
77
+ for (const d of allData) {
78
+ const day = new Date(d.registeredAt ?? Date.now()).toLocaleDateString("en-US", {
79
+ weekday: "short",
80
+ });
81
+ const entry = activityMap.get(day);
82
+ if (entry)
83
+ entry.entries++;
84
+ }
85
+ const activity = days.map((date) => ({
86
+ date,
87
+ entries: activityMap.get(date)?.entries ?? 0,
88
+ feedback: activityMap.get(date)?.feedback ?? 0,
89
+ }));
90
+ return { totalEntries, totalFeedback, avgQuality, qualityDistribution, topTags, activity };
91
+ }
92
+ async getUserStats(_signer) {
93
+ // On-chain per-signer feedback query deferred — return empty stats
94
+ return { feedbackSubmitted: 0, avgRatingGiven: 0, dataEntriesRated: 0, topTagsUsed: [] };
95
+ }
96
+ }
97
+ //# sourceMappingURL=live-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-discovery.js","sourceRoot":"","sources":["../../src/services/live-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ISnapshotService, SnapshotMeta } from "./types.js";
2
+ interface LiveSnapshotConfig {
3
+ /** Serialized UCAN delegation proof (base64 CAR) */
4
+ proof: string;
5
+ /** IPFS gateway URL */
6
+ gatewayUrl?: string;
7
+ }
8
+ export declare class LiveSnapshotService implements ISnapshotService {
9
+ private config;
10
+ private metadata;
11
+ private clientPromise;
12
+ constructor(config: LiveSnapshotConfig);
13
+ private getClient;
14
+ archive(signer: string, data?: string, entryCount?: number): Promise<SnapshotMeta>;
15
+ list(signer: string): Promise<SnapshotMeta[]>;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=live-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-snapshot.d.ts","sourceRoot":"","sources":["../../src/services/live-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjE,UAAU,kBAAkB;IAC1B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,aAAa,CAA6B;gBAEtC,MAAM,EAAE,kBAAkB;YAIxB,SAAS;IAgBjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBlF,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAGpD"}
@@ -0,0 +1,43 @@
1
+ export class LiveSnapshotService {
2
+ config;
3
+ metadata = new Map();
4
+ clientPromise = null;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async getClient() {
9
+ if (!this.clientPromise) {
10
+ this.clientPromise = (async () => {
11
+ const { Client } = await import("@storacha/client");
12
+ const { parse } = await import("@storacha/client/proof");
13
+ const client = await Client.create();
14
+ const proof = await parse(this.config.proof);
15
+ const space = proof.capabilities[0].with;
16
+ await client.addProof(proof);
17
+ await client.setCurrentSpace(space);
18
+ return client;
19
+ })();
20
+ }
21
+ return this.clientPromise;
22
+ }
23
+ async archive(signer, data, entryCount) {
24
+ const encoded = new TextEncoder().encode(data ?? "{}");
25
+ const client = await this.getClient();
26
+ const blob = new Blob([encoded]);
27
+ const cid = await client.uploadFile(blob);
28
+ const meta = {
29
+ cid: cid.toString(),
30
+ size: encoded.length,
31
+ archivedAt: Date.now(),
32
+ signer,
33
+ entryCount: entryCount ?? 0,
34
+ encrypted: true,
35
+ };
36
+ this.metadata.set(meta.cid, meta);
37
+ return meta;
38
+ }
39
+ async list(signer) {
40
+ return Array.from(this.metadata.values()).filter((s) => s.signer === signer);
41
+ }
42
+ }
43
+ //# sourceMappingURL=live-snapshot.js.map