@opendatalabs/vana-sdk 3.8.3 → 3.10.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 (52) hide show
  1. package/README.md +31 -10
  2. package/dist/index.browser.d.ts +1 -1
  3. package/dist/index.browser.js +8 -0
  4. package/dist/index.browser.js.map +2 -2
  5. package/dist/index.node.cjs +8 -0
  6. package/dist/index.node.cjs.map +2 -2
  7. package/dist/index.node.d.ts +1 -1
  8. package/dist/index.node.js +8 -0
  9. package/dist/index.node.js.map +2 -2
  10. package/dist/protocol/gateway.cjs +8 -0
  11. package/dist/protocol/gateway.cjs.map +1 -1
  12. package/dist/protocol/gateway.d.ts +24 -0
  13. package/dist/protocol/gateway.js +8 -0
  14. package/dist/protocol/gateway.js.map +1 -1
  15. package/dist/session-relay/client.cjs +215 -0
  16. package/dist/session-relay/client.cjs.map +1 -0
  17. package/dist/session-relay/client.d.ts +16 -0
  18. package/dist/session-relay/client.js +190 -0
  19. package/dist/session-relay/client.js.map +1 -0
  20. package/dist/session-relay/client.test.d.ts +1 -0
  21. package/dist/session-relay/endpoints.cjs +37 -0
  22. package/dist/session-relay/endpoints.cjs.map +1 -0
  23. package/dist/session-relay/endpoints.d.ts +7 -0
  24. package/dist/session-relay/endpoints.js +11 -0
  25. package/dist/session-relay/endpoints.js.map +1 -0
  26. package/dist/session-relay/errors.cjs +36 -0
  27. package/dist/session-relay/errors.cjs.map +1 -0
  28. package/dist/session-relay/errors.d.ts +13 -0
  29. package/dist/session-relay/errors.js +12 -0
  30. package/dist/session-relay/errors.js.map +1 -0
  31. package/dist/session-relay/index.cjs +46 -0
  32. package/dist/session-relay/index.cjs.map +1 -0
  33. package/dist/session-relay/index.d.ts +5 -0
  34. package/dist/session-relay/index.js +25 -0
  35. package/dist/session-relay/index.js.map +1 -0
  36. package/dist/session-relay/signing.cjs +62 -0
  37. package/dist/session-relay/signing.cjs.map +1 -0
  38. package/dist/session-relay/signing.d.ts +21 -0
  39. package/dist/session-relay/signing.js +39 -0
  40. package/dist/session-relay/signing.js.map +1 -0
  41. package/dist/session-relay/signing.test.d.ts +1 -0
  42. package/dist/session-relay/types.cjs +17 -0
  43. package/dist/session-relay/types.cjs.map +1 -0
  44. package/dist/session-relay/types.d.ts +119 -0
  45. package/dist/session-relay/types.js +1 -0
  46. package/dist/session-relay/types.js.map +1 -0
  47. package/dist/session-relay.cjs +46 -0
  48. package/dist/session-relay.cjs.map +1 -0
  49. package/dist/session-relay.d.ts +27 -0
  50. package/dist/session-relay.js +27 -0
  51. package/dist/session-relay.js.map +1 -0
  52. package/package.json +10 -1
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var client_exports = {};
20
+ __export(client_exports, {
21
+ createSessionRelayBuilderClient: () => createSessionRelayBuilderClient,
22
+ createSessionRelayClient: () => createSessionRelayClient
23
+ });
24
+ module.exports = __toCommonJS(client_exports);
25
+ var import_endpoints = require("./endpoints");
26
+ var import_errors = require("./errors");
27
+ var import_signing = require("./signing");
28
+ const DEFAULT_POLL_INTERVAL_MS = 2e3;
29
+ const DEFAULT_POLL_TIMEOUT_MS = 15 * 6e4;
30
+ function stripTrailingSlash(url) {
31
+ return url.replace(/\/+$/, "");
32
+ }
33
+ function resolveFetch(fetchFn) {
34
+ const resolved = fetchFn ?? globalThis.fetch;
35
+ if (!resolved) {
36
+ throw new import_errors.SessionRelayError(
37
+ "No fetch implementation available. Pass `fetchFn` to the Session Relay client.",
38
+ { relayErrorCode: "SESSION_RELAY_CONFIG_ERROR" }
39
+ );
40
+ }
41
+ return resolved;
42
+ }
43
+ function endpoint(options) {
44
+ return stripTrailingSlash(options.baseUrl ?? (0, import_endpoints.getSessionRelayUrl)(options.env));
45
+ }
46
+ async function parseJson(res) {
47
+ if (res.status === 204) return void 0;
48
+ if (res.text) {
49
+ const text = await res.text();
50
+ if (text.length === 0) return void 0;
51
+ try {
52
+ return JSON.parse(text);
53
+ } catch {
54
+ throw new import_errors.SessionRelayError(
55
+ `Session Relay returned a non-JSON response (HTTP ${res.status})`,
56
+ { status: res.status }
57
+ );
58
+ }
59
+ }
60
+ try {
61
+ return await res.json();
62
+ } catch {
63
+ throw new import_errors.SessionRelayError(
64
+ `Session Relay returned a non-JSON response (HTTP ${res.status})`,
65
+ { status: res.status }
66
+ );
67
+ }
68
+ }
69
+ function relayErrorFromBody(body) {
70
+ if (body === null || typeof body !== "object" || !("error" in body)) {
71
+ return void 0;
72
+ }
73
+ const error = body.error;
74
+ if (error === null || typeof error !== "object") return void 0;
75
+ return error;
76
+ }
77
+ async function relayFetch(fetchFn, url, init) {
78
+ let res;
79
+ try {
80
+ res = await fetchFn(url, init);
81
+ } catch (err) {
82
+ throw new import_errors.SessionRelayError(
83
+ "Network error communicating with Session Relay",
84
+ {
85
+ body: err
86
+ }
87
+ );
88
+ }
89
+ const body = await parseJson(res);
90
+ if (!res.ok) {
91
+ const relayError = relayErrorFromBody(body);
92
+ throw new import_errors.SessionRelayError(
93
+ relayError?.message ?? `Session Relay request failed (HTTP ${res.status})`,
94
+ {
95
+ status: res.status,
96
+ relayCode: relayError?.code,
97
+ relayErrorCode: relayError?.errorCode,
98
+ body
99
+ }
100
+ );
101
+ }
102
+ return body;
103
+ }
104
+ async function pollSession(fetchFn, baseUrl, sessionId) {
105
+ return relayFetch(
106
+ fetchFn,
107
+ `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/poll`,
108
+ { method: "GET" }
109
+ );
110
+ }
111
+ async function pollUntilComplete(fetchFn, baseUrl, sessionId, opts) {
112
+ const intervalMs = opts?.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;
113
+ const timeoutMs = opts?.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
114
+ const deadline = Date.now() + timeoutMs;
115
+ while (Date.now() < deadline) {
116
+ const result = await pollSession(fetchFn, baseUrl, sessionId);
117
+ if (result.status === "approved" || result.status === "denied" || result.status === "expired") {
118
+ return result;
119
+ }
120
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
121
+ }
122
+ throw new import_errors.SessionRelayError("Polling timed out", {
123
+ relayErrorCode: "SESSION_RELAY_POLL_TIMEOUT"
124
+ });
125
+ }
126
+ function createSessionRelayClient(options = {}) {
127
+ const fetchFn = resolveFetch(options.fetchFn);
128
+ const baseUrl = endpoint(options);
129
+ return {
130
+ claimSession(request) {
131
+ return relayFetch(
132
+ fetchFn,
133
+ `${baseUrl}/v1/session/claim`,
134
+ {
135
+ method: "POST",
136
+ headers: { "Content-Type": "application/json" },
137
+ body: JSON.stringify(request)
138
+ }
139
+ );
140
+ },
141
+ async approveSession(sessionId, request) {
142
+ await relayFetch(
143
+ fetchFn,
144
+ `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/approve`,
145
+ {
146
+ method: "POST",
147
+ headers: { "Content-Type": "application/json" },
148
+ body: JSON.stringify(request)
149
+ }
150
+ );
151
+ },
152
+ async denySession(sessionId, request) {
153
+ await relayFetch(
154
+ fetchFn,
155
+ `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/deny`,
156
+ {
157
+ method: "POST",
158
+ headers: { "Content-Type": "application/json" },
159
+ body: JSON.stringify(request)
160
+ }
161
+ );
162
+ },
163
+ pollSession(sessionId) {
164
+ return pollSession(fetchFn, baseUrl, sessionId);
165
+ },
166
+ pollUntilComplete(sessionId, opts) {
167
+ return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);
168
+ }
169
+ };
170
+ }
171
+ function createSessionRelayBuilderClient(options) {
172
+ const fetchFn = resolveFetch(options.fetchFn);
173
+ const baseUrl = endpoint(options);
174
+ return {
175
+ async initSession(params) {
176
+ const path = "/v1/session/init";
177
+ const body = JSON.stringify({
178
+ granteeAddress: options.granteeAddress,
179
+ scopes: params.scopes,
180
+ ...params.webhookUrl && { webhookUrl: params.webhookUrl },
181
+ ...params.appUserId && { appUserId: params.appUserId }
182
+ });
183
+ const iat = options.now?.() ?? Math.floor(Date.now() / 1e3);
184
+ const authHeader = await (0, import_signing.buildSessionRelayWeb3SignedHeader)({
185
+ signMessage: options.signMessage,
186
+ aud: baseUrl,
187
+ method: "POST",
188
+ uri: path,
189
+ body,
190
+ iat,
191
+ exp: iat + 300
192
+ });
193
+ return relayFetch(fetchFn, `${baseUrl}${path}`, {
194
+ method: "POST",
195
+ headers: {
196
+ "Content-Type": "application/json",
197
+ Authorization: authHeader
198
+ },
199
+ body
200
+ });
201
+ },
202
+ pollSession(sessionId) {
203
+ return pollSession(fetchFn, baseUrl, sessionId);
204
+ },
205
+ pollUntilComplete(sessionId, opts) {
206
+ return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);
207
+ }
208
+ };
209
+ }
210
+ // Annotate the CommonJS export names for ESM import in node:
211
+ 0 && (module.exports = {
212
+ createSessionRelayBuilderClient,
213
+ createSessionRelayClient
214
+ });
215
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session-relay/client.ts"],"sourcesContent":["import { getSessionRelayUrl } from \"./endpoints\";\nimport { SessionRelayError } from \"./errors\";\nimport { buildSessionRelayWeb3SignedHeader } from \"./signing\";\nimport type {\n SessionRelayApproveRequest,\n SessionRelayBuilderClient,\n SessionRelayBuilderClientOptions,\n SessionRelayClaimRequest,\n SessionRelayClaimResponse,\n SessionRelayClient,\n SessionRelayClientOptions,\n SessionRelayDenyRequest,\n SessionRelayFetch,\n SessionRelayInitParams,\n SessionRelayInitResult,\n SessionRelayPollResult,\n} from \"./types\";\n\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst DEFAULT_POLL_TIMEOUT_MS = 15 * 60_000;\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\nfunction resolveFetch(fetchFn?: SessionRelayFetch): SessionRelayFetch {\n const resolved = fetchFn ?? (globalThis.fetch as SessionRelayFetch);\n if (!resolved) {\n throw new SessionRelayError(\n \"No fetch implementation available. Pass `fetchFn` to the Session Relay client.\",\n { relayErrorCode: \"SESSION_RELAY_CONFIG_ERROR\" },\n );\n }\n return resolved;\n}\n\nfunction endpoint(options: SessionRelayClientOptions): string {\n return stripTrailingSlash(options.baseUrl ?? getSessionRelayUrl(options.env));\n}\n\nasync function parseJson(res: Awaited<ReturnType<SessionRelayFetch>>) {\n if (res.status === 204) return undefined;\n\n if (res.text) {\n const text = await res.text();\n if (text.length === 0) return undefined;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new SessionRelayError(\n `Session Relay returned a non-JSON response (HTTP ${res.status})`,\n { status: res.status },\n );\n }\n }\n\n try {\n return await res.json();\n } catch {\n throw new SessionRelayError(\n `Session Relay returned a non-JSON response (HTTP ${res.status})`,\n { status: res.status },\n );\n }\n}\n\nfunction relayErrorFromBody(\n body: unknown,\n):\n | { message?: string; code?: number; errorCode?: string; details?: unknown }\n | undefined {\n if (body === null || typeof body !== \"object\" || !(\"error\" in body)) {\n return undefined;\n }\n const error = (body as { error?: unknown }).error;\n if (error === null || typeof error !== \"object\") return undefined;\n return error as {\n message?: string;\n code?: number;\n errorCode?: string;\n details?: unknown;\n };\n}\n\nasync function relayFetch<T>(\n fetchFn: SessionRelayFetch,\n url: string,\n init: { method: string; headers?: Record<string, string>; body?: string },\n): Promise<T> {\n let res: Awaited<ReturnType<SessionRelayFetch>>;\n try {\n res = await fetchFn(url, init);\n } catch (err) {\n throw new SessionRelayError(\n \"Network error communicating with Session Relay\",\n {\n body: err,\n },\n );\n }\n\n const body = await parseJson(res);\n if (!res.ok) {\n const relayError = relayErrorFromBody(body);\n throw new SessionRelayError(\n relayError?.message ??\n `Session Relay request failed (HTTP ${res.status})`,\n {\n status: res.status,\n relayCode: relayError?.code,\n relayErrorCode: relayError?.errorCode,\n body,\n },\n );\n }\n\n return body as T;\n}\n\nasync function pollSession(\n fetchFn: SessionRelayFetch,\n baseUrl: string,\n sessionId: string,\n): Promise<SessionRelayPollResult> {\n return relayFetch<SessionRelayPollResult>(\n fetchFn,\n `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/poll`,\n { method: \"GET\" },\n );\n}\n\nasync function pollUntilComplete(\n fetchFn: SessionRelayFetch,\n baseUrl: string,\n sessionId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n): Promise<SessionRelayPollResult> {\n const intervalMs = opts?.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const result = await pollSession(fetchFn, baseUrl, sessionId);\n if (\n result.status === \"approved\" ||\n result.status === \"denied\" ||\n result.status === \"expired\"\n ) {\n return result;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n throw new SessionRelayError(\"Polling timed out\", {\n relayErrorCode: \"SESSION_RELAY_POLL_TIMEOUT\",\n });\n}\n\n/**\n * Create a Session Relay client for app-side claim/approve/deny calls and\n * unsigned polling.\n *\n * @remarks\n * This is a Vana service integration client, not a protocol-core primitive.\n * It intentionally models the current Session Relay HTTP API while leaving\n * user-facing grant orchestration to the app using it.\n */\nexport function createSessionRelayClient(\n options: SessionRelayClientOptions = {},\n): SessionRelayClient {\n const fetchFn = resolveFetch(options.fetchFn);\n const baseUrl = endpoint(options);\n\n return {\n claimSession(\n request: SessionRelayClaimRequest,\n ): Promise<SessionRelayClaimResponse> {\n return relayFetch<SessionRelayClaimResponse>(\n fetchFn,\n `${baseUrl}/v1/session/claim`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n },\n\n async approveSession(\n sessionId: string,\n request: SessionRelayApproveRequest,\n ): Promise<void> {\n await relayFetch<unknown>(\n fetchFn,\n `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/approve`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n },\n\n async denySession(\n sessionId: string,\n request: SessionRelayDenyRequest,\n ): Promise<void> {\n await relayFetch<unknown>(\n fetchFn,\n `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/deny`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n },\n\n pollSession(sessionId: string): Promise<SessionRelayPollResult> {\n return pollSession(fetchFn, baseUrl, sessionId);\n },\n\n pollUntilComplete(\n sessionId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<SessionRelayPollResult> {\n return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);\n },\n };\n}\n\n/**\n * Create a builder-side Session Relay client for signed session init and\n * unsigned polling.\n */\nexport function createSessionRelayBuilderClient(\n options: SessionRelayBuilderClientOptions,\n): SessionRelayBuilderClient {\n const fetchFn = resolveFetch(options.fetchFn);\n const baseUrl = endpoint(options);\n\n return {\n async initSession(\n params: SessionRelayInitParams,\n ): Promise<SessionRelayInitResult> {\n const path = \"/v1/session/init\";\n const body = JSON.stringify({\n granteeAddress: options.granteeAddress,\n scopes: params.scopes,\n ...(params.webhookUrl && { webhookUrl: params.webhookUrl }),\n ...(params.appUserId && { appUserId: params.appUserId }),\n });\n const iat = options.now?.() ?? Math.floor(Date.now() / 1000);\n const authHeader = await buildSessionRelayWeb3SignedHeader({\n signMessage: options.signMessage,\n aud: baseUrl,\n method: \"POST\",\n uri: path,\n body,\n iat,\n exp: iat + 300,\n });\n\n return relayFetch<SessionRelayInitResult>(fetchFn, `${baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n },\n body,\n });\n },\n\n pollSession(sessionId: string): Promise<SessionRelayPollResult> {\n return pollSession(fetchFn, baseUrl, sessionId);\n },\n\n pollUntilComplete(\n sessionId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<SessionRelayPollResult> {\n return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,16 @@
1
+ import type { SessionRelayBuilderClient, SessionRelayBuilderClientOptions, SessionRelayClient, SessionRelayClientOptions } from "./types";
2
+ /**
3
+ * Create a Session Relay client for app-side claim/approve/deny calls and
4
+ * unsigned polling.
5
+ *
6
+ * @remarks
7
+ * This is a Vana service integration client, not a protocol-core primitive.
8
+ * It intentionally models the current Session Relay HTTP API while leaving
9
+ * user-facing grant orchestration to the app using it.
10
+ */
11
+ export declare function createSessionRelayClient(options?: SessionRelayClientOptions): SessionRelayClient;
12
+ /**
13
+ * Create a builder-side Session Relay client for signed session init and
14
+ * unsigned polling.
15
+ */
16
+ export declare function createSessionRelayBuilderClient(options: SessionRelayBuilderClientOptions): SessionRelayBuilderClient;
@@ -0,0 +1,190 @@
1
+ import { getSessionRelayUrl } from "./endpoints.js";
2
+ import { SessionRelayError } from "./errors.js";
3
+ import { buildSessionRelayWeb3SignedHeader } from "./signing.js";
4
+ const DEFAULT_POLL_INTERVAL_MS = 2e3;
5
+ const DEFAULT_POLL_TIMEOUT_MS = 15 * 6e4;
6
+ function stripTrailingSlash(url) {
7
+ return url.replace(/\/+$/, "");
8
+ }
9
+ function resolveFetch(fetchFn) {
10
+ const resolved = fetchFn ?? globalThis.fetch;
11
+ if (!resolved) {
12
+ throw new SessionRelayError(
13
+ "No fetch implementation available. Pass `fetchFn` to the Session Relay client.",
14
+ { relayErrorCode: "SESSION_RELAY_CONFIG_ERROR" }
15
+ );
16
+ }
17
+ return resolved;
18
+ }
19
+ function endpoint(options) {
20
+ return stripTrailingSlash(options.baseUrl ?? getSessionRelayUrl(options.env));
21
+ }
22
+ async function parseJson(res) {
23
+ if (res.status === 204) return void 0;
24
+ if (res.text) {
25
+ const text = await res.text();
26
+ if (text.length === 0) return void 0;
27
+ try {
28
+ return JSON.parse(text);
29
+ } catch {
30
+ throw new SessionRelayError(
31
+ `Session Relay returned a non-JSON response (HTTP ${res.status})`,
32
+ { status: res.status }
33
+ );
34
+ }
35
+ }
36
+ try {
37
+ return await res.json();
38
+ } catch {
39
+ throw new SessionRelayError(
40
+ `Session Relay returned a non-JSON response (HTTP ${res.status})`,
41
+ { status: res.status }
42
+ );
43
+ }
44
+ }
45
+ function relayErrorFromBody(body) {
46
+ if (body === null || typeof body !== "object" || !("error" in body)) {
47
+ return void 0;
48
+ }
49
+ const error = body.error;
50
+ if (error === null || typeof error !== "object") return void 0;
51
+ return error;
52
+ }
53
+ async function relayFetch(fetchFn, url, init) {
54
+ let res;
55
+ try {
56
+ res = await fetchFn(url, init);
57
+ } catch (err) {
58
+ throw new SessionRelayError(
59
+ "Network error communicating with Session Relay",
60
+ {
61
+ body: err
62
+ }
63
+ );
64
+ }
65
+ const body = await parseJson(res);
66
+ if (!res.ok) {
67
+ const relayError = relayErrorFromBody(body);
68
+ throw new SessionRelayError(
69
+ relayError?.message ?? `Session Relay request failed (HTTP ${res.status})`,
70
+ {
71
+ status: res.status,
72
+ relayCode: relayError?.code,
73
+ relayErrorCode: relayError?.errorCode,
74
+ body
75
+ }
76
+ );
77
+ }
78
+ return body;
79
+ }
80
+ async function pollSession(fetchFn, baseUrl, sessionId) {
81
+ return relayFetch(
82
+ fetchFn,
83
+ `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/poll`,
84
+ { method: "GET" }
85
+ );
86
+ }
87
+ async function pollUntilComplete(fetchFn, baseUrl, sessionId, opts) {
88
+ const intervalMs = opts?.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;
89
+ const timeoutMs = opts?.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;
90
+ const deadline = Date.now() + timeoutMs;
91
+ while (Date.now() < deadline) {
92
+ const result = await pollSession(fetchFn, baseUrl, sessionId);
93
+ if (result.status === "approved" || result.status === "denied" || result.status === "expired") {
94
+ return result;
95
+ }
96
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
97
+ }
98
+ throw new SessionRelayError("Polling timed out", {
99
+ relayErrorCode: "SESSION_RELAY_POLL_TIMEOUT"
100
+ });
101
+ }
102
+ function createSessionRelayClient(options = {}) {
103
+ const fetchFn = resolveFetch(options.fetchFn);
104
+ const baseUrl = endpoint(options);
105
+ return {
106
+ claimSession(request) {
107
+ return relayFetch(
108
+ fetchFn,
109
+ `${baseUrl}/v1/session/claim`,
110
+ {
111
+ method: "POST",
112
+ headers: { "Content-Type": "application/json" },
113
+ body: JSON.stringify(request)
114
+ }
115
+ );
116
+ },
117
+ async approveSession(sessionId, request) {
118
+ await relayFetch(
119
+ fetchFn,
120
+ `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/approve`,
121
+ {
122
+ method: "POST",
123
+ headers: { "Content-Type": "application/json" },
124
+ body: JSON.stringify(request)
125
+ }
126
+ );
127
+ },
128
+ async denySession(sessionId, request) {
129
+ await relayFetch(
130
+ fetchFn,
131
+ `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/deny`,
132
+ {
133
+ method: "POST",
134
+ headers: { "Content-Type": "application/json" },
135
+ body: JSON.stringify(request)
136
+ }
137
+ );
138
+ },
139
+ pollSession(sessionId) {
140
+ return pollSession(fetchFn, baseUrl, sessionId);
141
+ },
142
+ pollUntilComplete(sessionId, opts) {
143
+ return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);
144
+ }
145
+ };
146
+ }
147
+ function createSessionRelayBuilderClient(options) {
148
+ const fetchFn = resolveFetch(options.fetchFn);
149
+ const baseUrl = endpoint(options);
150
+ return {
151
+ async initSession(params) {
152
+ const path = "/v1/session/init";
153
+ const body = JSON.stringify({
154
+ granteeAddress: options.granteeAddress,
155
+ scopes: params.scopes,
156
+ ...params.webhookUrl && { webhookUrl: params.webhookUrl },
157
+ ...params.appUserId && { appUserId: params.appUserId }
158
+ });
159
+ const iat = options.now?.() ?? Math.floor(Date.now() / 1e3);
160
+ const authHeader = await buildSessionRelayWeb3SignedHeader({
161
+ signMessage: options.signMessage,
162
+ aud: baseUrl,
163
+ method: "POST",
164
+ uri: path,
165
+ body,
166
+ iat,
167
+ exp: iat + 300
168
+ });
169
+ return relayFetch(fetchFn, `${baseUrl}${path}`, {
170
+ method: "POST",
171
+ headers: {
172
+ "Content-Type": "application/json",
173
+ Authorization: authHeader
174
+ },
175
+ body
176
+ });
177
+ },
178
+ pollSession(sessionId) {
179
+ return pollSession(fetchFn, baseUrl, sessionId);
180
+ },
181
+ pollUntilComplete(sessionId, opts) {
182
+ return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);
183
+ }
184
+ };
185
+ }
186
+ export {
187
+ createSessionRelayBuilderClient,
188
+ createSessionRelayClient
189
+ };
190
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session-relay/client.ts"],"sourcesContent":["import { getSessionRelayUrl } from \"./endpoints\";\nimport { SessionRelayError } from \"./errors\";\nimport { buildSessionRelayWeb3SignedHeader } from \"./signing\";\nimport type {\n SessionRelayApproveRequest,\n SessionRelayBuilderClient,\n SessionRelayBuilderClientOptions,\n SessionRelayClaimRequest,\n SessionRelayClaimResponse,\n SessionRelayClient,\n SessionRelayClientOptions,\n SessionRelayDenyRequest,\n SessionRelayFetch,\n SessionRelayInitParams,\n SessionRelayInitResult,\n SessionRelayPollResult,\n} from \"./types\";\n\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst DEFAULT_POLL_TIMEOUT_MS = 15 * 60_000;\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\nfunction resolveFetch(fetchFn?: SessionRelayFetch): SessionRelayFetch {\n const resolved = fetchFn ?? (globalThis.fetch as SessionRelayFetch);\n if (!resolved) {\n throw new SessionRelayError(\n \"No fetch implementation available. Pass `fetchFn` to the Session Relay client.\",\n { relayErrorCode: \"SESSION_RELAY_CONFIG_ERROR\" },\n );\n }\n return resolved;\n}\n\nfunction endpoint(options: SessionRelayClientOptions): string {\n return stripTrailingSlash(options.baseUrl ?? getSessionRelayUrl(options.env));\n}\n\nasync function parseJson(res: Awaited<ReturnType<SessionRelayFetch>>) {\n if (res.status === 204) return undefined;\n\n if (res.text) {\n const text = await res.text();\n if (text.length === 0) return undefined;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new SessionRelayError(\n `Session Relay returned a non-JSON response (HTTP ${res.status})`,\n { status: res.status },\n );\n }\n }\n\n try {\n return await res.json();\n } catch {\n throw new SessionRelayError(\n `Session Relay returned a non-JSON response (HTTP ${res.status})`,\n { status: res.status },\n );\n }\n}\n\nfunction relayErrorFromBody(\n body: unknown,\n):\n | { message?: string; code?: number; errorCode?: string; details?: unknown }\n | undefined {\n if (body === null || typeof body !== \"object\" || !(\"error\" in body)) {\n return undefined;\n }\n const error = (body as { error?: unknown }).error;\n if (error === null || typeof error !== \"object\") return undefined;\n return error as {\n message?: string;\n code?: number;\n errorCode?: string;\n details?: unknown;\n };\n}\n\nasync function relayFetch<T>(\n fetchFn: SessionRelayFetch,\n url: string,\n init: { method: string; headers?: Record<string, string>; body?: string },\n): Promise<T> {\n let res: Awaited<ReturnType<SessionRelayFetch>>;\n try {\n res = await fetchFn(url, init);\n } catch (err) {\n throw new SessionRelayError(\n \"Network error communicating with Session Relay\",\n {\n body: err,\n },\n );\n }\n\n const body = await parseJson(res);\n if (!res.ok) {\n const relayError = relayErrorFromBody(body);\n throw new SessionRelayError(\n relayError?.message ??\n `Session Relay request failed (HTTP ${res.status})`,\n {\n status: res.status,\n relayCode: relayError?.code,\n relayErrorCode: relayError?.errorCode,\n body,\n },\n );\n }\n\n return body as T;\n}\n\nasync function pollSession(\n fetchFn: SessionRelayFetch,\n baseUrl: string,\n sessionId: string,\n): Promise<SessionRelayPollResult> {\n return relayFetch<SessionRelayPollResult>(\n fetchFn,\n `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/poll`,\n { method: \"GET\" },\n );\n}\n\nasync function pollUntilComplete(\n fetchFn: SessionRelayFetch,\n baseUrl: string,\n sessionId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n): Promise<SessionRelayPollResult> {\n const intervalMs = opts?.intervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_POLL_TIMEOUT_MS;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const result = await pollSession(fetchFn, baseUrl, sessionId);\n if (\n result.status === \"approved\" ||\n result.status === \"denied\" ||\n result.status === \"expired\"\n ) {\n return result;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n throw new SessionRelayError(\"Polling timed out\", {\n relayErrorCode: \"SESSION_RELAY_POLL_TIMEOUT\",\n });\n}\n\n/**\n * Create a Session Relay client for app-side claim/approve/deny calls and\n * unsigned polling.\n *\n * @remarks\n * This is a Vana service integration client, not a protocol-core primitive.\n * It intentionally models the current Session Relay HTTP API while leaving\n * user-facing grant orchestration to the app using it.\n */\nexport function createSessionRelayClient(\n options: SessionRelayClientOptions = {},\n): SessionRelayClient {\n const fetchFn = resolveFetch(options.fetchFn);\n const baseUrl = endpoint(options);\n\n return {\n claimSession(\n request: SessionRelayClaimRequest,\n ): Promise<SessionRelayClaimResponse> {\n return relayFetch<SessionRelayClaimResponse>(\n fetchFn,\n `${baseUrl}/v1/session/claim`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n },\n\n async approveSession(\n sessionId: string,\n request: SessionRelayApproveRequest,\n ): Promise<void> {\n await relayFetch<unknown>(\n fetchFn,\n `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/approve`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n },\n\n async denySession(\n sessionId: string,\n request: SessionRelayDenyRequest,\n ): Promise<void> {\n await relayFetch<unknown>(\n fetchFn,\n `${baseUrl}/v1/session/${encodeURIComponent(sessionId)}/deny`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n },\n\n pollSession(sessionId: string): Promise<SessionRelayPollResult> {\n return pollSession(fetchFn, baseUrl, sessionId);\n },\n\n pollUntilComplete(\n sessionId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<SessionRelayPollResult> {\n return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);\n },\n };\n}\n\n/**\n * Create a builder-side Session Relay client for signed session init and\n * unsigned polling.\n */\nexport function createSessionRelayBuilderClient(\n options: SessionRelayBuilderClientOptions,\n): SessionRelayBuilderClient {\n const fetchFn = resolveFetch(options.fetchFn);\n const baseUrl = endpoint(options);\n\n return {\n async initSession(\n params: SessionRelayInitParams,\n ): Promise<SessionRelayInitResult> {\n const path = \"/v1/session/init\";\n const body = JSON.stringify({\n granteeAddress: options.granteeAddress,\n scopes: params.scopes,\n ...(params.webhookUrl && { webhookUrl: params.webhookUrl }),\n ...(params.appUserId && { appUserId: params.appUserId }),\n });\n const iat = options.now?.() ?? Math.floor(Date.now() / 1000);\n const authHeader = await buildSessionRelayWeb3SignedHeader({\n signMessage: options.signMessage,\n aud: baseUrl,\n method: \"POST\",\n uri: path,\n body,\n iat,\n exp: iat + 300,\n });\n\n return relayFetch<SessionRelayInitResult>(fetchFn, `${baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n },\n body,\n });\n },\n\n pollSession(sessionId: string): Promise<SessionRelayPollResult> {\n return pollSession(fetchFn, baseUrl, sessionId);\n },\n\n pollUntilComplete(\n sessionId: string,\n opts?: { intervalMs?: number; timeoutMs?: number },\n ): Promise<SessionRelayPollResult> {\n return pollUntilComplete(fetchFn, baseUrl, sessionId, opts);\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var endpoints_exports = {};
20
+ __export(endpoints_exports, {
21
+ SESSION_RELAY_DEV_URL: () => SESSION_RELAY_DEV_URL,
22
+ SESSION_RELAY_PRODUCTION_URL: () => SESSION_RELAY_PRODUCTION_URL,
23
+ getSessionRelayUrl: () => getSessionRelayUrl
24
+ });
25
+ module.exports = __toCommonJS(endpoints_exports);
26
+ const SESSION_RELAY_PRODUCTION_URL = "https://session-relay.vana.org";
27
+ const SESSION_RELAY_DEV_URL = "https://dev.session-relay.vana.org";
28
+ function getSessionRelayUrl(env = "production") {
29
+ return env === "dev" ? SESSION_RELAY_DEV_URL : SESSION_RELAY_PRODUCTION_URL;
30
+ }
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ SESSION_RELAY_DEV_URL,
34
+ SESSION_RELAY_PRODUCTION_URL,
35
+ getSessionRelayUrl
36
+ });
37
+ //# sourceMappingURL=endpoints.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session-relay/endpoints.ts"],"sourcesContent":["import type { SessionRelayEnvironment } from \"./types\";\n\n/** Production Session Relay URL. */\nexport const SESSION_RELAY_PRODUCTION_URL = \"https://session-relay.vana.org\";\n\n/** Internal dev Session Relay URL. */\nexport const SESSION_RELAY_DEV_URL = \"https://dev.session-relay.vana.org\";\n\n/** Resolve the default Session Relay URL for a deployment environment. */\nexport function getSessionRelayUrl(\n env: SessionRelayEnvironment = \"production\",\n): string {\n return env === \"dev\" ? SESSION_RELAY_DEV_URL : SESSION_RELAY_PRODUCTION_URL;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,+BAA+B;AAGrC,MAAM,wBAAwB;AAG9B,SAAS,mBACd,MAA+B,cACvB;AACR,SAAO,QAAQ,QAAQ,wBAAwB;AACjD;","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { SessionRelayEnvironment } from "./types";
2
+ /** Production Session Relay URL. */
3
+ export declare const SESSION_RELAY_PRODUCTION_URL = "https://session-relay.vana.org";
4
+ /** Internal dev Session Relay URL. */
5
+ export declare const SESSION_RELAY_DEV_URL = "https://dev.session-relay.vana.org";
6
+ /** Resolve the default Session Relay URL for a deployment environment. */
7
+ export declare function getSessionRelayUrl(env?: SessionRelayEnvironment): string;
@@ -0,0 +1,11 @@
1
+ const SESSION_RELAY_PRODUCTION_URL = "https://session-relay.vana.org";
2
+ const SESSION_RELAY_DEV_URL = "https://dev.session-relay.vana.org";
3
+ function getSessionRelayUrl(env = "production") {
4
+ return env === "dev" ? SESSION_RELAY_DEV_URL : SESSION_RELAY_PRODUCTION_URL;
5
+ }
6
+ export {
7
+ SESSION_RELAY_DEV_URL,
8
+ SESSION_RELAY_PRODUCTION_URL,
9
+ getSessionRelayUrl
10
+ };
11
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session-relay/endpoints.ts"],"sourcesContent":["import type { SessionRelayEnvironment } from \"./types\";\n\n/** Production Session Relay URL. */\nexport const SESSION_RELAY_PRODUCTION_URL = \"https://session-relay.vana.org\";\n\n/** Internal dev Session Relay URL. */\nexport const SESSION_RELAY_DEV_URL = \"https://dev.session-relay.vana.org\";\n\n/** Resolve the default Session Relay URL for a deployment environment. */\nexport function getSessionRelayUrl(\n env: SessionRelayEnvironment = \"production\",\n): string {\n return env === \"dev\" ? SESSION_RELAY_DEV_URL : SESSION_RELAY_PRODUCTION_URL;\n}\n"],"mappings":"AAGO,MAAM,+BAA+B;AAGrC,MAAM,wBAAwB;AAG9B,SAAS,mBACd,MAA+B,cACvB;AACR,SAAO,QAAQ,QAAQ,wBAAwB;AACjD;","names":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var errors_exports = {};
20
+ __export(errors_exports, {
21
+ SessionRelayError: () => SessionRelayError
22
+ });
23
+ module.exports = __toCommonJS(errors_exports);
24
+ var import_errors = require("../errors");
25
+ class SessionRelayError extends import_errors.VanaError {
26
+ constructor(message, details = {}) {
27
+ super(message, details.relayErrorCode ?? "SESSION_RELAY_ERROR");
28
+ this.details = details;
29
+ }
30
+ details;
31
+ }
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ SessionRelayError
35
+ });
36
+ //# sourceMappingURL=errors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session-relay/errors.ts"],"sourcesContent":["import { VanaError } from \"../errors\";\n\n/** Error details returned by Session Relay. */\nexport interface SessionRelayErrorDetails {\n status?: number;\n relayCode?: number;\n relayErrorCode?: string;\n body?: unknown;\n}\n\n/** Error thrown by Session Relay client operations. */\nexport class SessionRelayError extends VanaError {\n constructor(\n message: string,\n public readonly details: SessionRelayErrorDetails = {},\n ) {\n super(message, details.relayErrorCode ?? \"SESSION_RELAY_ERROR\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAWnB,MAAM,0BAA0B,wBAAU;AAAA,EAC/C,YACE,SACgB,UAAoC,CAAC,GACrD;AACA,UAAM,SAAS,QAAQ,kBAAkB,qBAAqB;AAF9C;AAAA,EAGlB;AAAA,EAHkB;AAIpB;","names":[]}
@@ -0,0 +1,13 @@
1
+ import { VanaError } from "../errors";
2
+ /** Error details returned by Session Relay. */
3
+ export interface SessionRelayErrorDetails {
4
+ status?: number;
5
+ relayCode?: number;
6
+ relayErrorCode?: string;
7
+ body?: unknown;
8
+ }
9
+ /** Error thrown by Session Relay client operations. */
10
+ export declare class SessionRelayError extends VanaError {
11
+ readonly details: SessionRelayErrorDetails;
12
+ constructor(message: string, details?: SessionRelayErrorDetails);
13
+ }
@@ -0,0 +1,12 @@
1
+ import { VanaError } from "../errors.js";
2
+ class SessionRelayError extends VanaError {
3
+ constructor(message, details = {}) {
4
+ super(message, details.relayErrorCode ?? "SESSION_RELAY_ERROR");
5
+ this.details = details;
6
+ }
7
+ details;
8
+ }
9
+ export {
10
+ SessionRelayError
11
+ };
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/session-relay/errors.ts"],"sourcesContent":["import { VanaError } from \"../errors\";\n\n/** Error details returned by Session Relay. */\nexport interface SessionRelayErrorDetails {\n status?: number;\n relayCode?: number;\n relayErrorCode?: string;\n body?: unknown;\n}\n\n/** Error thrown by Session Relay client operations. */\nexport class SessionRelayError extends VanaError {\n constructor(\n message: string,\n public readonly details: SessionRelayErrorDetails = {},\n ) {\n super(message, details.relayErrorCode ?? \"SESSION_RELAY_ERROR\");\n }\n}\n"],"mappings":"AAAA,SAAS,iBAAiB;AAWnB,MAAM,0BAA0B,UAAU;AAAA,EAC/C,YACE,SACgB,UAAoC,CAAC,GACrD;AACA,UAAM,SAAS,QAAQ,kBAAkB,qBAAqB;AAF9C;AAAA,EAGlB;AAAA,EAHkB;AAIpB;","names":[]}