@opendatalabs/personal-server-ts-server 0.0.1-canary.0d0705b

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 (73) hide show
  1. package/dist/api.d.ts +2 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +2 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/app.d.ts +31 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +94 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/bootstrap.d.ts +29 -0
  10. package/dist/bootstrap.d.ts.map +1 -0
  11. package/dist/bootstrap.js +159 -0
  12. package/dist/bootstrap.js.map +1 -0
  13. package/dist/dev-token.d.ts +6 -0
  14. package/dist/dev-token.d.ts.map +1 -0
  15. package/dist/dev-token.js +9 -0
  16. package/dist/dev-token.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +34 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/middleware/access-log.d.ts +8 -0
  22. package/dist/middleware/access-log.d.ts.map +1 -0
  23. package/dist/middleware/access-log.js +38 -0
  24. package/dist/middleware/access-log.js.map +1 -0
  25. package/dist/middleware/body-limit.d.ts +10 -0
  26. package/dist/middleware/body-limit.d.ts.map +1 -0
  27. package/dist/middleware/body-limit.js +20 -0
  28. package/dist/middleware/body-limit.js.map +1 -0
  29. package/dist/middleware/builder-check.d.ts +8 -0
  30. package/dist/middleware/builder-check.d.ts.map +1 -0
  31. package/dist/middleware/builder-check.js +29 -0
  32. package/dist/middleware/builder-check.js.map +1 -0
  33. package/dist/middleware/grant-check.d.ts +12 -0
  34. package/dist/middleware/grant-check.d.ts.map +1 -0
  35. package/dist/middleware/grant-check.js +90 -0
  36. package/dist/middleware/grant-check.js.map +1 -0
  37. package/dist/middleware/owner-check.d.ts +9 -0
  38. package/dist/middleware/owner-check.d.ts.map +1 -0
  39. package/dist/middleware/owner-check.js +37 -0
  40. package/dist/middleware/owner-check.js.map +1 -0
  41. package/dist/middleware/web3-auth.d.ts +16 -0
  42. package/dist/middleware/web3-auth.d.ts.map +1 -0
  43. package/dist/middleware/web3-auth.js +56 -0
  44. package/dist/middleware/web3-auth.js.map +1 -0
  45. package/dist/routes/access-logs.d.ts +16 -0
  46. package/dist/routes/access-logs.d.ts.map +1 -0
  47. package/dist/routes/access-logs.js +30 -0
  48. package/dist/routes/access-logs.js.map +1 -0
  49. package/dist/routes/data.d.ts +20 -0
  50. package/dist/routes/data.d.ts.map +1 -0
  51. package/dist/routes/data.js +213 -0
  52. package/dist/routes/data.js.map +1 -0
  53. package/dist/routes/grants.d.ts +16 -0
  54. package/dist/routes/grants.d.ts.map +1 -0
  55. package/dist/routes/grants.js +122 -0
  56. package/dist/routes/grants.js.map +1 -0
  57. package/dist/routes/health.d.ts +14 -0
  58. package/dist/routes/health.d.ts.map +1 -0
  59. package/dist/routes/health.js +35 -0
  60. package/dist/routes/health.js.map +1 -0
  61. package/dist/routes/sync.d.ts +16 -0
  62. package/dist/routes/sync.d.ts.map +1 -0
  63. package/dist/routes/sync.js +52 -0
  64. package/dist/routes/sync.js.map +1 -0
  65. package/dist/routes/ui-config.d.ts +7 -0
  66. package/dist/routes/ui-config.d.ts.map +1 -0
  67. package/dist/routes/ui-config.js +89 -0
  68. package/dist/routes/ui-config.js.map +1 -0
  69. package/dist/routes/ui.d.ts +6 -0
  70. package/dist/routes/ui.d.ts.map +1 -0
  71. package/dist/routes/ui.js +36 -0
  72. package/dist/routes/ui.js.map +1 -0
  73. package/package.json +45 -0
@@ -0,0 +1,90 @@
1
+ import { scopeCoveredByGrant } from "@opendatalabs/personal-server-ts-core/scopes";
2
+ import { GrantRequiredError, GrantRevokedError, GrantExpiredError, ScopeMismatchError, InvalidSignatureError, ProtocolError, } from "@opendatalabs/personal-server-ts-core/errors";
3
+ /**
4
+ * Parse the opaque `grant` string from the gateway response.
5
+ * The grant field is a JSON-serialized EIP-712 grant payload containing
6
+ * { user, builder, scopes, expiresAt, nonce }.
7
+ */
8
+ function parseGrantPayload(grantString) {
9
+ try {
10
+ const parsed = JSON.parse(grantString);
11
+ return {
12
+ scopes: Array.isArray(parsed.scopes) ? parsed.scopes : [],
13
+ expiresAt: typeof parsed.expiresAt === "number" ? parsed.expiresAt : 0,
14
+ };
15
+ }
16
+ catch {
17
+ return { scopes: [], expiresAt: 0 };
18
+ }
19
+ }
20
+ /**
21
+ * Enforces grant for data reads. Must run AFTER web3-auth middleware.
22
+ * Fetches grant from Gateway, checks revocation/expiry/scope/grantee.
23
+ * Sets c.set('grant', grantResponse).
24
+ */
25
+ export function createGrantCheckMiddleware(params) {
26
+ const { gateway } = params;
27
+ return async (c, next) => {
28
+ if (c.get("devBypass")) {
29
+ await next();
30
+ return;
31
+ }
32
+ const auth = c.get("auth");
33
+ try {
34
+ // 1. Extract grantId from auth payload
35
+ const grantId = auth.payload.grantId;
36
+ if (!grantId) {
37
+ throw new GrantRequiredError({
38
+ reason: "No grantId in authorization payload",
39
+ });
40
+ }
41
+ // 2. Fetch grant from Gateway
42
+ const grant = await gateway.getGrant(grantId);
43
+ if (!grant) {
44
+ throw new GrantRequiredError({ reason: "Grant not found", grantId });
45
+ }
46
+ // 3. Check revocation — gateway uses revokedAt (null = not revoked)
47
+ if (grant.revokedAt !== null) {
48
+ throw new GrantRevokedError({ grantId: grant.id });
49
+ }
50
+ // 4. Parse the opaque grant string to extract scopes and expiresAt
51
+ const grantPayload = parseGrantPayload(grant.grant);
52
+ // 5. Check expiry (expiresAt > 0 && expiresAt < now means expired)
53
+ if (grantPayload.expiresAt > 0) {
54
+ const now = Math.floor(Date.now() / 1000);
55
+ if (grantPayload.expiresAt < now) {
56
+ throw new GrantExpiredError({ expiresAt: grantPayload.expiresAt });
57
+ }
58
+ }
59
+ // 6. Check scope coverage — extract scope from route param
60
+ const scope = c.req.param("scope");
61
+ if (scope && !scopeCoveredByGrant(scope, grantPayload.scopes)) {
62
+ throw new ScopeMismatchError({
63
+ requestedScope: scope,
64
+ grantedScopes: grantPayload.scopes,
65
+ });
66
+ }
67
+ // 7. Check grantee — signer must be the grant's builder.
68
+ // Gateway returns granteeId (bytes32 builderId), not an address.
69
+ // Look up builder by signer address, then compare builder.id === grant.granteeId.
70
+ const builder = await gateway.getBuilder(auth.signer);
71
+ if (!builder || builder.id !== grant.granteeId) {
72
+ throw new InvalidSignatureError({
73
+ reason: "Request signer is not the grant builder",
74
+ expected: grant.granteeId,
75
+ actual: auth.signer,
76
+ });
77
+ }
78
+ // Set grant on context for downstream handlers
79
+ c.set("grant", grant);
80
+ await next();
81
+ }
82
+ catch (err) {
83
+ if (err instanceof ProtocolError) {
84
+ return c.json(err.toJSON(), err.code);
85
+ }
86
+ throw err;
87
+ }
88
+ };
89
+ }
90
+ //# sourceMappingURL=grant-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant-check.js","sourceRoot":"","sources":["../../src/middleware/grant-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ /**
3
+ * Verifies the authenticated signer is the server owner.
4
+ * Must run AFTER web3-auth middleware (expects c.get('auth')).
5
+ * Returns 500 when serverOwner is not configured.
6
+ * Compares addresses case-insensitively.
7
+ */
8
+ export declare function createOwnerCheckMiddleware(serverOwner: `0x${string}` | undefined): MiddlewareHandler;
9
+ //# sourceMappingURL=owner-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-check.d.ts","sourceRoot":"","sources":["../../src/middleware/owner-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI9C;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,KAAK,MAAM,EAAE,GAAG,SAAS,GACrC,iBAAiB,CAuCnB"}
@@ -0,0 +1,37 @@
1
+ import { NotOwnerError } from "@opendatalabs/personal-server-ts-core/errors";
2
+ /**
3
+ * Verifies the authenticated signer is the server owner.
4
+ * Must run AFTER web3-auth middleware (expects c.get('auth')).
5
+ * Returns 500 when serverOwner is not configured.
6
+ * Compares addresses case-insensitively.
7
+ */
8
+ export function createOwnerCheckMiddleware(serverOwner) {
9
+ return async (c, next) => {
10
+ if (c.get("devBypass")) {
11
+ await next();
12
+ return;
13
+ }
14
+ if (!serverOwner) {
15
+ return c.json({
16
+ error: {
17
+ code: 500,
18
+ errorCode: "SERVER_NOT_CONFIGURED",
19
+ message: "Server owner address not configured. Set VANA_MASTER_KEY_SIGNATURE environment variable.",
20
+ },
21
+ }, 500);
22
+ }
23
+ const auth = c.get("auth");
24
+ if (!auth) {
25
+ throw new Error("owner-check middleware requires web3-auth middleware to run first");
26
+ }
27
+ if (auth.signer.toLowerCase() !== serverOwner.toLowerCase()) {
28
+ const err = new NotOwnerError({
29
+ signer: auth.signer,
30
+ expected: serverOwner,
31
+ });
32
+ return c.json(err.toJSON(), 401);
33
+ }
34
+ await next();
35
+ };
36
+ }
37
+ //# sourceMappingURL=owner-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-check.js","sourceRoot":"","sources":["../../src/middleware/owner-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAG7E;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAsC;IAEtC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,SAAS,EAAE,uBAAuB;oBAClC,OAAO,EACL,0FAA0F;iBAC7F;aACF,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;QAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;gBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ export interface Web3AuthMiddlewareDeps {
3
+ serverOrigin: string;
4
+ devToken?: string;
5
+ serverOwner?: `0x${string}`;
6
+ }
7
+ /**
8
+ * Parses + verifies Web3Signed Authorization header.
9
+ * Sets c.set('auth', VerifiedAuth) for downstream handlers.
10
+ *
11
+ * When a devToken is configured and the request carries a matching
12
+ * Bearer token, auth context is populated with the server owner
13
+ * and c.set('devBypass', true) is set to skip downstream checks.
14
+ */
15
+ export declare function createWeb3AuthMiddleware(depsOrOrigin: Web3AuthMiddlewareDeps | string): MiddlewareHandler;
16
+ //# sourceMappingURL=web3-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web3-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/web3-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI9C,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,sBAAsB,GAAG,MAAM,GAC5C,iBAAiB,CAmDnB"}
@@ -0,0 +1,56 @@
1
+ import { verifyWeb3Signed } from "@opendatalabs/personal-server-ts-core/auth";
2
+ import { ProtocolError } from "@opendatalabs/personal-server-ts-core/errors";
3
+ /**
4
+ * Parses + verifies Web3Signed Authorization header.
5
+ * Sets c.set('auth', VerifiedAuth) for downstream handlers.
6
+ *
7
+ * When a devToken is configured and the request carries a matching
8
+ * Bearer token, auth context is populated with the server owner
9
+ * and c.set('devBypass', true) is set to skip downstream checks.
10
+ */
11
+ export function createWeb3AuthMiddleware(depsOrOrigin) {
12
+ const deps = typeof depsOrOrigin === "string"
13
+ ? { serverOrigin: depsOrOrigin }
14
+ : depsOrOrigin;
15
+ return async (c, next) => {
16
+ // Dev token bypass: if configured and header matches, skip Web3Signed verification
17
+ if (deps.devToken) {
18
+ const authHeader = c.req.header("authorization");
19
+ if (authHeader === `Bearer ${deps.devToken}`) {
20
+ if (!deps.serverOwner) {
21
+ return c.json({
22
+ error: {
23
+ code: 500,
24
+ errorCode: "SERVER_NOT_CONFIGURED",
25
+ message: "Server owner address not configured. Set VANA_MASTER_KEY_SIGNATURE environment variable.",
26
+ },
27
+ }, 500);
28
+ }
29
+ c.set("auth", {
30
+ signer: deps.serverOwner,
31
+ payload: {},
32
+ });
33
+ c.set("devBypass", true);
34
+ await next();
35
+ return;
36
+ }
37
+ }
38
+ try {
39
+ const auth = await verifyWeb3Signed({
40
+ headerValue: c.req.header("authorization"),
41
+ expectedOrigin: deps.serverOrigin,
42
+ expectedMethod: c.req.method,
43
+ expectedPath: new URL(c.req.url).pathname,
44
+ });
45
+ c.set("auth", auth);
46
+ await next();
47
+ }
48
+ catch (err) {
49
+ if (err instanceof ProtocolError) {
50
+ return c.json(err.toJSON(), err.code);
51
+ }
52
+ throw err;
53
+ }
54
+ };
55
+ }
56
+ //# sourceMappingURL=web3-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web3-auth.js","sourceRoot":"","sources":["../../src/middleware/web3-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAQ7E;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAA6C;IAE7C,MAAM,IAAI,GACR,OAAO,YAAY,KAAK,QAAQ;QAC9B,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE;QAChC,CAAC,CAAC,YAAY,CAAC;IAEnB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,mFAAmF;QACnF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACjD,IAAI,UAAU,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACtB,OAAO,CAAC,CAAC,IAAI,CACX;wBACE,KAAK,EAAE;4BACL,IAAI,EAAE,GAAG;4BACT,SAAS,EAAE,uBAAuB;4BAClC,OAAO,EACL,0FAA0F;yBAC7F;qBACF,EACD,GAAG,CACJ,CAAC;gBACJ,CAAC;gBACD,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE;oBACZ,MAAM,EAAE,IAAI,CAAC,WAAW;oBACxB,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAC;gBACH,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACzB,MAAM,IAAI,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;gBAClC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC1C,cAAc,EAAE,IAAI,CAAC,YAAY;gBACjC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;gBAC5B,YAAY,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;aAC1C,CAAC,CAAC;YAEH,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,IAAiB,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Access logs routes — GET / returns paginated access log entries.
3
+ * Owner auth is wired in Task 4.1.
4
+ */
5
+ import { Hono } from "hono";
6
+ import type { Logger } from "pino";
7
+ import type { AccessLogReader } from "@opendatalabs/personal-server-ts-core/logging/access-reader";
8
+ export interface AccessLogsRouteDeps {
9
+ logger: Logger;
10
+ accessLogReader: AccessLogReader;
11
+ serverOrigin: string;
12
+ serverOwner?: `0x${string}`;
13
+ devToken?: string;
14
+ }
15
+ export declare function accessLogsRoutes(deps: AccessLogsRouteDeps): Hono;
16
+ //# sourceMappingURL=access-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-logs.d.ts","sourceRoot":"","sources":["../../src/routes/access-logs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAC;AAInG,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CA2BhE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Access logs routes — GET / returns paginated access log entries.
3
+ * Owner auth is wired in Task 4.1.
4
+ */
5
+ import { Hono } from "hono";
6
+ import { createWeb3AuthMiddleware } from "../middleware/web3-auth.js";
7
+ import { createOwnerCheckMiddleware } from "../middleware/owner-check.js";
8
+ export function accessLogsRoutes(deps) {
9
+ const app = new Hono();
10
+ const web3Auth = createWeb3AuthMiddleware({
11
+ serverOrigin: deps.serverOrigin,
12
+ devToken: deps.devToken,
13
+ serverOwner: deps.serverOwner,
14
+ });
15
+ const ownerCheck = createOwnerCheckMiddleware(deps.serverOwner);
16
+ // GET / — list access logs with pagination (owner auth required)
17
+ app.get("/", web3Auth, ownerCheck, async (c) => {
18
+ const limitParam = c.req.query("limit");
19
+ const offsetParam = c.req.query("offset");
20
+ const limit = limitParam !== undefined ? parseInt(limitParam, 10) : 50;
21
+ const offset = offsetParam !== undefined ? parseInt(offsetParam, 10) : 0;
22
+ const result = await deps.accessLogReader.read({
23
+ limit: Number.isNaN(limit) ? 50 : limit,
24
+ offset: Number.isNaN(offset) ? 0 : offset,
25
+ });
26
+ return c.json(result);
27
+ });
28
+ return app;
29
+ }
30
+ //# sourceMappingURL=access-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-logs.js","sourceRoot":"","sources":["../../src/routes/access-logs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAU1E,MAAM,UAAU,gBAAgB,CAAC,IAAyB;IACxD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACxC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,0BAA0B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEhE,iEAAiE;IACjE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC7C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;YACvC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;SAC1C,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Hono } from "hono";
2
+ import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
3
+ import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
4
+ import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
5
+ import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
6
+ import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
7
+ import type { Logger } from "pino";
8
+ export interface DataRouteDeps {
9
+ indexManager: IndexManager;
10
+ hierarchyOptions: HierarchyManagerOptions;
11
+ logger: Logger;
12
+ serverOrigin: string;
13
+ serverOwner?: `0x${string}`;
14
+ gateway: GatewayClient;
15
+ accessLogWriter: AccessLogWriter;
16
+ syncManager?: SyncManager | null;
17
+ devToken?: string;
18
+ }
19
+ export declare function dataRoutes(deps: DataRouteDeps): Hono;
20
+ //# 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;AAS5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAWnC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAoRpD"}
@@ -0,0 +1,213 @@
1
+ import { Hono } from "hono";
2
+ import { ScopeSchema } from "@opendatalabs/personal-server-ts-core/scopes";
3
+ import { createDataFileEnvelope } from "@opendatalabs/personal-server-ts-core/schemas/data-file";
4
+ import { generateCollectedAt, writeDataFile, readDataFile, deleteAllForScope, } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
5
+ import { createBodyLimit, DATA_INGEST_MAX_SIZE, } from "../middleware/body-limit.js";
6
+ import { createWeb3AuthMiddleware } from "../middleware/web3-auth.js";
7
+ import { createBuilderCheckMiddleware } from "../middleware/builder-check.js";
8
+ import { createGrantCheckMiddleware } from "../middleware/grant-check.js";
9
+ import { createAccessLogMiddleware } from "../middleware/access-log.js";
10
+ import { createOwnerCheckMiddleware } from "../middleware/owner-check.js";
11
+ export function dataRoutes(deps) {
12
+ const app = new Hono();
13
+ // Create middleware instances
14
+ const web3Auth = createWeb3AuthMiddleware({
15
+ serverOrigin: deps.serverOrigin,
16
+ devToken: deps.devToken,
17
+ serverOwner: deps.serverOwner,
18
+ });
19
+ const builderCheck = createBuilderCheckMiddleware(deps.gateway);
20
+ const grantCheck = createGrantCheckMiddleware({
21
+ gateway: deps.gateway,
22
+ serverOwner: deps.serverOwner,
23
+ });
24
+ const accessLog = createAccessLogMiddleware(deps.accessLogWriter);
25
+ // GET /v1/data/:scope/versions — list versions for a scope (requires auth + builder, no grant)
26
+ app.get("/:scope/versions", web3Auth, builderCheck, async (c) => {
27
+ // 1. Validate scope
28
+ const scopeParam = c.req.param("scope");
29
+ const scopeResult = ScopeSchema.safeParse(scopeParam);
30
+ if (!scopeResult.success) {
31
+ return c.json({
32
+ error: "INVALID_SCOPE",
33
+ message: scopeResult.error.issues[0].message,
34
+ }, 400);
35
+ }
36
+ const scope = scopeResult.data;
37
+ // 2. Parse pagination
38
+ const limit = c.req.query("limit")
39
+ ? parseInt(c.req.query("limit"), 10)
40
+ : 20;
41
+ const offset = c.req.query("offset")
42
+ ? parseInt(c.req.query("offset"), 10)
43
+ : 0;
44
+ // 3. Query index
45
+ const entries = deps.indexManager.findByScope({ scope, limit, offset });
46
+ const total = deps.indexManager.countByScope(scope);
47
+ // 4. Return response
48
+ return c.json({
49
+ scope,
50
+ versions: entries.map((e) => ({
51
+ fileId: e.fileId,
52
+ collectedAt: e.collectedAt,
53
+ })),
54
+ total,
55
+ limit,
56
+ offset,
57
+ });
58
+ });
59
+ // GET /v1/data — list distinct scopes (requires auth + builder, no grant)
60
+ app.get("/", web3Auth, builderCheck, async (c) => {
61
+ const scopePrefix = c.req.query("scopePrefix");
62
+ const limit = c.req.query("limit")
63
+ ? parseInt(c.req.query("limit"), 10)
64
+ : 20;
65
+ const offset = c.req.query("offset")
66
+ ? parseInt(c.req.query("offset"), 10)
67
+ : 0;
68
+ const result = deps.indexManager.listDistinctScopes({
69
+ scopePrefix: scopePrefix || undefined,
70
+ limit,
71
+ offset,
72
+ });
73
+ return c.json({
74
+ scopes: result.scopes,
75
+ total: result.total,
76
+ limit,
77
+ offset,
78
+ });
79
+ });
80
+ // GET /v1/data/:scope — read a data file (requires auth + grant)
81
+ app.get("/:scope", web3Auth, builderCheck, grantCheck, accessLog, async (c) => {
82
+ // 1. Validate scope
83
+ const scopeParam = c.req.param("scope");
84
+ const scopeResult = ScopeSchema.safeParse(scopeParam);
85
+ if (!scopeResult.success) {
86
+ return c.json({
87
+ error: "INVALID_SCOPE",
88
+ message: scopeResult.error.issues[0].message,
89
+ }, 400);
90
+ }
91
+ const scope = scopeResult.data;
92
+ // 2. Determine lookup strategy: fileId, at, or latest
93
+ const fileIdParam = c.req.query("fileId");
94
+ const atParam = c.req.query("at");
95
+ let entry;
96
+ if (fileIdParam) {
97
+ entry = deps.indexManager.findByFileId(fileIdParam);
98
+ }
99
+ else if (atParam) {
100
+ entry = deps.indexManager.findClosestByScope(scope, atParam);
101
+ }
102
+ else {
103
+ entry = deps.indexManager.findLatestByScope(scope);
104
+ }
105
+ // 3. 404 if not found
106
+ if (!entry) {
107
+ return c.json({
108
+ error: "NOT_FOUND",
109
+ message: `No data found for scope "${scope}"`,
110
+ }, 404);
111
+ }
112
+ // 4. Read the data file from disk
113
+ const envelope = await readDataFile(deps.hierarchyOptions, scope, entry.collectedAt);
114
+ // 5. Return 200 with envelope
115
+ return c.json(envelope);
116
+ });
117
+ app.use("/:scope", createBodyLimit(DATA_INGEST_MAX_SIZE));
118
+ app.post("/:scope", async (c) => {
119
+ // 1. Parse & validate scope
120
+ const scopeParam = c.req.param("scope");
121
+ const scopeResult = ScopeSchema.safeParse(scopeParam);
122
+ if (!scopeResult.success) {
123
+ return c.json({
124
+ error: "INVALID_SCOPE",
125
+ message: scopeResult.error.issues[0].message,
126
+ }, 400);
127
+ }
128
+ const scope = scopeResult.data;
129
+ // 2. Parse JSON body
130
+ let body;
131
+ try {
132
+ body = await c.req.json();
133
+ }
134
+ catch {
135
+ return c.json({
136
+ error: "INVALID_BODY",
137
+ message: "Request body must be valid JSON",
138
+ }, 400);
139
+ }
140
+ if (body === null || typeof body !== "object" || Array.isArray(body)) {
141
+ return c.json({
142
+ error: "INVALID_BODY",
143
+ message: "Request body must be a JSON object",
144
+ }, 400);
145
+ }
146
+ // 3. Look up schema via Gateway (strict: reject if not found)
147
+ let schemaUrl;
148
+ try {
149
+ const schema = await deps.gateway.getSchemaForScope(scope);
150
+ if (!schema) {
151
+ return c.json({
152
+ error: "NO_SCHEMA",
153
+ message: `No schema registered for scope: ${scope}`,
154
+ }, 400);
155
+ }
156
+ schemaUrl = schema.definitionUrl;
157
+ }
158
+ catch (err) {
159
+ deps.logger.error({ err, scope }, "Gateway schema lookup failed");
160
+ return c.json({
161
+ error: "GATEWAY_ERROR",
162
+ message: "Failed to look up schema for scope",
163
+ }, 502);
164
+ }
165
+ // 4. Generate collectedAt
166
+ const collectedAt = generateCollectedAt();
167
+ // 5. Construct envelope
168
+ const envelope = createDataFileEnvelope(scope, collectedAt, body, schemaUrl);
169
+ // 6. Write atomically
170
+ const writeResult = await writeDataFile(deps.hierarchyOptions, envelope);
171
+ // 7. Insert into index
172
+ deps.indexManager.insert({
173
+ fileId: null,
174
+ path: writeResult.relativePath,
175
+ scope,
176
+ collectedAt,
177
+ sizeBytes: writeResult.sizeBytes,
178
+ });
179
+ deps.logger.info({ scope, collectedAt, path: writeResult.relativePath }, "Data file ingested");
180
+ // 8. Notify sync manager of new data (if enabled)
181
+ let status = "stored";
182
+ if (deps.syncManager) {
183
+ deps.syncManager.notifyNewData();
184
+ status = "syncing";
185
+ }
186
+ // 9. Return 201
187
+ return c.json({ scope, collectedAt, status }, 201);
188
+ });
189
+ // Owner-check middleware (web3-auth + owner-check)
190
+ const ownerCheck = createOwnerCheckMiddleware(deps.serverOwner);
191
+ // DELETE /v1/data/:scope — delete all versions for a scope (owner auth required)
192
+ app.delete("/:scope", web3Auth, ownerCheck, async (c) => {
193
+ // 1. Validate scope
194
+ const scopeParam = c.req.param("scope");
195
+ const scopeResult = ScopeSchema.safeParse(scopeParam);
196
+ if (!scopeResult.success) {
197
+ return c.json({
198
+ error: "INVALID_SCOPE",
199
+ message: scopeResult.error.issues[0].message,
200
+ }, 400);
201
+ }
202
+ const scope = scopeResult.data;
203
+ // 2. Delete from index
204
+ const deletedCount = deps.indexManager.deleteByScope(scope);
205
+ // 3. Delete from filesystem
206
+ await deleteAllForScope(deps.hierarchyOptions, scope);
207
+ deps.logger.info({ scope, deletedCount }, "Scope deleted");
208
+ // 4. Return 204
209
+ return c.body(null, 204);
210
+ });
211
+ return app;
212
+ }
213
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Grants routes — POST /verify (public endpoint).
3
+ * Verifies EIP-712 grant signatures locally without network calls.
4
+ */
5
+ import { Hono } from "hono";
6
+ import type { Logger } from "pino";
7
+ import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
8
+ export interface GrantsRouteDeps {
9
+ logger: Logger;
10
+ gateway: GatewayClient;
11
+ serverOwner?: `0x${string}`;
12
+ serverOrigin: string;
13
+ devToken?: string;
14
+ }
15
+ export declare function grantsRoutes(deps: GrantsRouteDeps): Hono;
16
+ //# sourceMappingURL=grants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/routes/grants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAQnF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA0CD,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAuGxD"}