@settlemint/dalp-sdk 3.1.10 → 3.1.11-main.33538712635

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 (108) hide show
  1. package/README.md +111 -177
  2. package/dist/auth/client.d.ts +115 -0
  3. package/dist/auth/live.d.ts +4366 -0
  4. package/dist/{auth-permissions.d.ts → auth/permissions.d.ts} +1 -2
  5. package/dist/{auth-wallet-plugins.d.ts → auth/wallet-plugins.d.ts} +69 -5
  6. package/dist/auth.d.ts +22 -115
  7. package/dist/auth.js +248 -0
  8. package/dist/bundler.d.ts +17 -207
  9. package/dist/bundler.js +111 -0
  10. package/dist/chunk-63xjs3xe.js +45725 -0
  11. package/dist/chunk-cy9b59s6.js +503 -0
  12. package/dist/chunk-h12fatty.js +63 -0
  13. package/dist/chunk-nac758dt.js +14542 -0
  14. package/dist/chunk-p009n1rm.js +255 -0
  15. package/dist/chunk-r0vsftj4.js +102 -0
  16. package/dist/chunk-w21k7p99.js +843 -0
  17. package/dist/chunk-y0d2c7kp.js +54 -0
  18. package/dist/client/conditional-request.d.ts +16 -0
  19. package/dist/client/factory.d.ts +39 -0
  20. package/dist/client/query-serializer.d.ts +2 -0
  21. package/dist/client/request-compression.d.ts +47 -0
  22. package/dist/client/ssr-fetch.d.ts +12 -0
  23. package/dist/errors/api-error.d.ts +29 -0
  24. package/dist/errors/find-current-error.d.ts +8 -0
  25. package/dist/errors/sdk-error.d.ts +52 -0
  26. package/dist/errors/sdk-error.js +8 -0
  27. package/dist/generated/@tanstack/react-query.gen.d.ts +17380 -0
  28. package/dist/generated/client/client.gen.d.ts +2 -0
  29. package/dist/generated/client/index.d.ts +10 -0
  30. package/dist/generated/client/types.gen.d.ts +120 -0
  31. package/dist/generated/client/utils.gen.d.ts +37 -0
  32. package/dist/generated/client.gen.d.ts +12 -0
  33. package/dist/generated/core/auth.gen.d.ts +25 -0
  34. package/dist/generated/core/bodySerializer.gen.d.ts +25 -0
  35. package/dist/generated/core/params.gen.d.ts +43 -0
  36. package/dist/generated/core/pathSerializer.gen.d.ts +33 -0
  37. package/dist/generated/core/queryKeySerializer.gen.d.ts +18 -0
  38. package/dist/generated/core/serverSentEvents.gen.d.ts +71 -0
  39. package/dist/generated/core/types.gen.d.ts +83 -0
  40. package/dist/generated/core/utils.gen.d.ts +19 -0
  41. package/dist/generated/index.d.ts +2 -0
  42. package/dist/generated/sdk.gen.d.ts +5214 -0
  43. package/dist/generated/types.gen.d.ts +137282 -0
  44. package/dist/generated/zod.gen.d.ts +181286 -0
  45. package/dist/index.d.ts +23 -40
  46. package/dist/index.js +208 -96098
  47. package/dist/operations.d.ts +12 -0
  48. package/dist/operations.js +1747 -0
  49. package/dist/react-query.d.ts +11 -0
  50. package/dist/react-query.js +16485 -0
  51. package/dist/readonly-deep.d.ts +12 -0
  52. package/dist/runtime-exports.d.ts +20 -0
  53. package/dist/runtime-exports.js +16 -0
  54. package/dist/scalars/big-decimal.d.ts +16 -0
  55. package/dist/scalars/ethereum-address.d.ts +8 -0
  56. package/dist/scalars/exchange-rates.d.ts +36 -0
  57. package/dist/scalars/index.d.ts +15 -0
  58. package/dist/scalars/index.js +39 -0
  59. package/dist/scalars/organization-id.d.ts +8 -0
  60. package/dist/schemas.d.ts +10 -0
  61. package/dist/schemas.js +12040 -0
  62. package/dist/secret.d.ts +14 -0
  63. package/dist/sign-webhook-receipt.d.ts +76 -0
  64. package/dist/sign-webhook-receipt.js +26 -0
  65. package/dist/transport/cookie-store.d.ts +9 -0
  66. package/dist/transport/sse-lifecycle.d.ts +44 -0
  67. package/dist/types.d.ts +67 -102
  68. package/dist/url.d.ts +0 -1
  69. package/dist/verify-webhook.d.ts +17 -28
  70. package/dist/verify-webhook.js +8 -0
  71. package/dist/version.d.ts +0 -1
  72. package/dist/wait-for-transaction.d.ts +40 -86
  73. package/dist/wait-for-transaction.js +112 -0
  74. package/dist/webhook-events.d.ts +44 -27
  75. package/package.json +98 -30
  76. package/dist/auth-permissions.d.ts.map +0 -1
  77. package/dist/auth-wallet-plugins.d.ts.map +0 -1
  78. package/dist/auth.d.ts.map +0 -1
  79. package/dist/bundler.d.ts.map +0 -1
  80. package/dist/chunk-xm8h1dzh.js +0 -33
  81. package/dist/client.d.ts +0 -19
  82. package/dist/client.d.ts.map +0 -1
  83. package/dist/contract-errors.d.ts +0 -4156
  84. package/dist/contract-errors.d.ts.map +0 -1
  85. package/dist/contract.d.ts +0 -17
  86. package/dist/contract.d.ts.map +0 -1
  87. package/dist/cookie-store.d.ts +0 -10
  88. package/dist/cookie-store.d.ts.map +0 -1
  89. package/dist/dapi-errors.d.ts +0 -650
  90. package/dist/dapi-errors.d.ts.map +0 -1
  91. package/dist/errors.d.ts +0 -633
  92. package/dist/errors.d.ts.map +0 -1
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/platform.d.ts +0 -41
  95. package/dist/platform.d.ts.map +0 -1
  96. package/dist/plugins/index.d.ts +0 -13
  97. package/dist/plugins/index.d.ts.map +0 -1
  98. package/dist/plugins/index.js +0 -10
  99. package/dist/sdk-error.d.ts +0 -74
  100. package/dist/sdk-error.d.ts.map +0 -1
  101. package/dist/serializers.d.ts +0 -41
  102. package/dist/serializers.d.ts.map +0 -1
  103. package/dist/types.d.ts.map +0 -1
  104. package/dist/url.d.ts.map +0 -1
  105. package/dist/verify-webhook.d.ts.map +0 -1
  106. package/dist/version.d.ts.map +0 -1
  107. package/dist/wait-for-transaction.d.ts.map +0 -1
  108. package/dist/webhook-events.d.ts.map +0 -1
@@ -0,0 +1,503 @@
1
+ import {
2
+ createClient
3
+ } from "./chunk-w21k7p99.js";
4
+ import {
5
+ Secret,
6
+ normalizeDalpBaseUrl,
7
+ secret,
8
+ unwrapSecret
9
+ } from "./chunk-h12fatty.js";
10
+ import {
11
+ createDalpSdkConfigurationError
12
+ } from "./chunk-y0d2c7kp.js";
13
+
14
+ // src/client/conditional-request.ts
15
+ var IF_NONE_MATCH = "If-None-Match";
16
+ var CONDITIONAL_RESPONSE_STORE_CAPACITY = 64;
17
+ var CONDITIONAL_RESPONSE_MAX_BODY_BYTES = 1048576;
18
+ var IDENTITY_RESET_PATH_SUFFIXES = [
19
+ "/api/auth/sign-out",
20
+ "/api/auth/revoke-session",
21
+ "/api/auth/revoke-sessions",
22
+ "/api/auth/revoke-other-sessions",
23
+ "/api/auth/organization/set-active"
24
+ ];
25
+ var states = new WeakMap;
26
+ var headerOrDefault = (headers, name) => headers.get(name)?.trim() || "default";
27
+ var tenantOf = (headers) => `${headerOrDefault(headers, "X-Organization-Id")}\x00${headerOrDefault(headers, "X-Participant")}`;
28
+ var resourceKey = (request) => {
29
+ const url = new URL(request.url);
30
+ return `${url.origin}${url.pathname}${url.search}\x00${tenantOf(request.headers)}`;
31
+ };
32
+ var isIdentityResetPath = (url) => {
33
+ const path = new URL(url).pathname;
34
+ return IDENTITY_RESET_PATH_SUFFIXES.some((suffix) => path === suffix || path.endsWith(suffix));
35
+ };
36
+ var isEventStream = (response) => (response.headers.get("content-type") ?? "").includes("text/event-stream");
37
+ var stateFor = (client) => {
38
+ const existing = states.get(client);
39
+ if (existing !== undefined) {
40
+ return existing;
41
+ }
42
+ const created = { store: new Map, lastIdentity: undefined };
43
+ states.set(client, created);
44
+ return created;
45
+ };
46
+ var remember = (store, key, entry) => {
47
+ store.delete(key);
48
+ store.set(key, entry);
49
+ if (store.size > CONDITIONAL_RESPONSE_STORE_CAPACITY) {
50
+ const oldest = store.keys().next().value;
51
+ if (oldest !== undefined) {
52
+ store.delete(oldest);
53
+ }
54
+ }
55
+ };
56
+ var touch = (store, key) => {
57
+ const entry = store.get(key);
58
+ if (entry === undefined) {
59
+ return;
60
+ }
61
+ store.delete(key);
62
+ store.set(key, entry);
63
+ return entry;
64
+ };
65
+ function clearConditionalRequestStore(client) {
66
+ const state = states.get(client);
67
+ if (state === undefined) {
68
+ return;
69
+ }
70
+ state.store.clear();
71
+ state.lastIdentity = undefined;
72
+ }
73
+ var clientFetch = (client, request) => {
74
+ const fetchImpl = client.getConfig().fetch ?? globalThis.fetch;
75
+ return fetchImpl(request);
76
+ };
77
+ var requestWithoutIfNoneMatch = (request) => {
78
+ const headers = new Headers;
79
+ for (const [name, value] of request.headers.entries()) {
80
+ if (name.toLowerCase() !== IF_NONE_MATCH.toLowerCase()) {
81
+ headers.append(name, value);
82
+ }
83
+ }
84
+ return new Request(request.url, {
85
+ method: request.method,
86
+ headers,
87
+ signal: request.signal,
88
+ credentials: request.credentials,
89
+ redirect: request.redirect
90
+ });
91
+ };
92
+ async function captureSuccessfulGet(store, key, response) {
93
+ if (!response.ok || isEventStream(response)) {
94
+ return response;
95
+ }
96
+ const etag = response.headers.get("etag")?.trim();
97
+ if (etag === undefined || etag.length === 0) {
98
+ store.delete(key);
99
+ return response;
100
+ }
101
+ const body = new Uint8Array(await response.arrayBuffer());
102
+ const headers = new Headers(response.headers);
103
+ headers.set("etag", etag);
104
+ if (body.byteLength <= CONDITIONAL_RESPONSE_MAX_BODY_BYTES) {
105
+ remember(store, key, { body, etag, headers });
106
+ }
107
+ return new Response(body, {
108
+ headers,
109
+ status: response.status,
110
+ statusText: response.statusText
111
+ });
112
+ }
113
+ function installConditionalRequestInterceptors(client) {
114
+ const state = stateFor(client);
115
+ const syncIdentity = (headers) => {
116
+ const identity = tenantOf(headers);
117
+ if (state.lastIdentity !== undefined && identity !== state.lastIdentity) {
118
+ state.store.clear();
119
+ }
120
+ state.lastIdentity = identity;
121
+ };
122
+ client.interceptors.request.use((request) => {
123
+ syncIdentity(request.headers);
124
+ if (request.method !== "GET" || request.headers.has(IF_NONE_MATCH)) {
125
+ return request;
126
+ }
127
+ const entry = touch(state.store, resourceKey(request));
128
+ if (entry === undefined) {
129
+ return request;
130
+ }
131
+ const headers = new Headers(request.headers);
132
+ headers.set(IF_NONE_MATCH, entry.etag);
133
+ return new Request(request, { headers });
134
+ });
135
+ client.interceptors.response.use(async (response, request) => {
136
+ if (isIdentityResetPath(request.url) && response.ok) {
137
+ state.store.clear();
138
+ state.lastIdentity = undefined;
139
+ return response;
140
+ }
141
+ if (request.method !== "GET") {
142
+ return response;
143
+ }
144
+ const key = resourceKey(request);
145
+ if (response.status === 304) {
146
+ const entry = touch(state.store, key);
147
+ if (entry === undefined) {
148
+ const retried = await clientFetch(client, requestWithoutIfNoneMatch(request));
149
+ if (retried.status === 304) {
150
+ return retried;
151
+ }
152
+ return captureSuccessfulGet(state.store, key, retried);
153
+ }
154
+ return new Response(new Uint8Array(entry.body), {
155
+ status: 200,
156
+ statusText: "OK",
157
+ headers: entry.headers
158
+ });
159
+ }
160
+ return captureSuccessfulGet(state.store, key, response);
161
+ });
162
+ }
163
+
164
+ // src/client/query-serializer.ts
165
+ function appendQueryValue(search, path, value) {
166
+ if (value === undefined || value === null) {
167
+ return;
168
+ }
169
+ if (value instanceof Date) {
170
+ search.append(path, value.toISOString());
171
+ return;
172
+ }
173
+ if (Array.isArray(value)) {
174
+ for (const [index, item] of value.entries()) {
175
+ const itemPath = typeof item === "object" && item !== null ? `${path}[${String(index)}]` : path;
176
+ appendQueryValue(search, itemPath, item);
177
+ }
178
+ return;
179
+ }
180
+ if (typeof value === "object") {
181
+ for (const [key, item] of Object.entries(value)) {
182
+ appendQueryValue(search, `${path}[${key}]`, item);
183
+ }
184
+ return;
185
+ }
186
+ search.append(path, String(value));
187
+ }
188
+ function serializeDalpQuery(query) {
189
+ const search = new URLSearchParams;
190
+ if (typeof query === "object" && query !== null) {
191
+ for (const [key, value] of Object.entries(query)) {
192
+ appendQueryValue(search, key, value);
193
+ }
194
+ }
195
+ return search.toString();
196
+ }
197
+
198
+ // src/client/request-compression.ts
199
+ var DALP_SDK_REQUEST_COMPRESSION_MIN_BODY_BYTES = 1024;
200
+ var DALP_SDK_REQUEST_COMPRESSION_MAX_BODY_BYTES = 16777216;
201
+ var NO_BODY_METHODS = new Set(["GET", "HEAD"]);
202
+ function bufferedBodySize(body) {
203
+ if (typeof body === "string") {
204
+ return Buffer.byteLength(body);
205
+ }
206
+ if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {
207
+ return body.byteLength;
208
+ }
209
+ if (body instanceof Blob) {
210
+ return body.size;
211
+ }
212
+ return;
213
+ }
214
+ function isCompressibleMediaType(contentType) {
215
+ const mediaType = contentType?.split(";")[0]?.trim().toLowerCase();
216
+ if (mediaType === undefined || mediaType === "") {
217
+ return false;
218
+ }
219
+ return mediaType === "application/json" || mediaType.endsWith("+json") || mediaType.startsWith("text/");
220
+ }
221
+ async function cancelReaderBestEffort(reader) {
222
+ try {
223
+ await reader.cancel();
224
+ } catch {}
225
+ }
226
+ async function readRequestBodyWithinCap(request, maxBodyBytes) {
227
+ let body;
228
+ try {
229
+ const { body: clonedBody } = request.clone();
230
+ body = clonedBody;
231
+ } catch {
232
+ return;
233
+ }
234
+ if (body === null) {
235
+ return Buffer.alloc(0);
236
+ }
237
+ const reader = body.getReader();
238
+ const chunks = [];
239
+ let totalBytes = 0;
240
+ try {
241
+ while (true) {
242
+ const next = await reader.read();
243
+ if (next.done) {
244
+ return Buffer.concat(chunks, totalBytes);
245
+ }
246
+ totalBytes += next.value.byteLength;
247
+ if (totalBytes > maxBodyBytes) {
248
+ cancelReaderBestEffort(reader);
249
+ return;
250
+ }
251
+ chunks.push(next.value);
252
+ }
253
+ } catch {
254
+ return;
255
+ } finally {
256
+ reader.releaseLock();
257
+ }
258
+ }
259
+ function withRequestBodyCompression(fetchImpl, options) {
260
+ const minBodyBytes = options?.minBodyBytes ?? DALP_SDK_REQUEST_COMPRESSION_MIN_BODY_BYTES;
261
+ const maxBodyBytes = options?.maxBodyBytes ?? DALP_SDK_REQUEST_COMPRESSION_MAX_BODY_BYTES;
262
+ const requestCompressionFetch = async (input, init) => {
263
+ if (init?.compress !== undefined) {
264
+ return fetchImpl(input, init);
265
+ }
266
+ let request;
267
+ if (input instanceof Request) {
268
+ request = init === undefined ? input : new Request(input, init);
269
+ }
270
+ const method = (request?.method ?? init?.method ?? "GET").toUpperCase();
271
+ if (NO_BODY_METHODS.has(method)) {
272
+ return fetchImpl(input, init);
273
+ }
274
+ const headers = new Headers(request?.headers ?? init?.headers);
275
+ if (headers.get("content-encoding") !== null) {
276
+ return fetchImpl(input, init);
277
+ }
278
+ let compress;
279
+ let bufferedRequestBody;
280
+ if (request !== undefined && request.body !== null && isCompressibleMediaType(headers.get("content-type"))) {
281
+ bufferedRequestBody = await readRequestBodyWithinCap(request, maxBodyBytes);
282
+ if (bufferedRequestBody !== undefined && bufferedRequestBody.byteLength >= minBodyBytes) {
283
+ compress = "gzip";
284
+ }
285
+ } else if (init?.body !== null && init?.body !== undefined) {
286
+ const size = bufferedBodySize(init.body);
287
+ if (size !== undefined && size >= minBodyBytes && size <= maxBodyBytes) {
288
+ compress = "gzip";
289
+ }
290
+ }
291
+ if (compress === undefined) {
292
+ return fetchImpl(input, init);
293
+ }
294
+ if (request !== undefined && bufferedRequestBody !== undefined) {
295
+ return fetchImpl(request.url, {
296
+ ...init,
297
+ body: bufferedRequestBody,
298
+ cache: init?.cache ?? request.cache,
299
+ compress,
300
+ credentials: init?.credentials ?? request.credentials,
301
+ headers: request.headers,
302
+ integrity: init?.integrity ?? request.integrity,
303
+ keepalive: init?.keepalive ?? request.keepalive,
304
+ method: request.method,
305
+ mode: init?.mode ?? request.mode,
306
+ redirect: init?.redirect ?? request.redirect,
307
+ referrer: init?.referrer ?? request.referrer,
308
+ referrerPolicy: init?.referrerPolicy ?? request.referrerPolicy,
309
+ signal: init?.signal ?? request.signal
310
+ });
311
+ }
312
+ return fetchImpl(input, { ...init, compress });
313
+ };
314
+ return Object.assign(requestCompressionFetch, {
315
+ preconnect: fetchImpl.preconnect
316
+ });
317
+ }
318
+
319
+ // src/client/ssr-fetch.ts
320
+ class DalpSsrSecurityError extends Error {
321
+ name = "DalpSsrSecurityError";
322
+ }
323
+ var originOf = (value) => {
324
+ const url = new URL(value);
325
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
326
+ throw new DalpSsrSecurityError(`DALP SDK: ${url.protocol} is not an approved SSR protocol.`);
327
+ }
328
+ return url.origin;
329
+ };
330
+ var REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
331
+ var SENSITIVE_HEADERS = [
332
+ "authorization",
333
+ "baggage",
334
+ "cookie",
335
+ "idempotency-key",
336
+ "origin",
337
+ "referer",
338
+ "traceparent",
339
+ "tracestate",
340
+ "x-api-key",
341
+ "x-chain-id",
342
+ "x-executor",
343
+ "x-organization-id",
344
+ "x-participant",
345
+ "x-selected-signers"
346
+ ];
347
+ var withoutSensitiveHeaders = (source) => {
348
+ const headers = new Headers(source);
349
+ for (const name of SENSITIVE_HEADERS) {
350
+ headers.delete(name);
351
+ }
352
+ return headers;
353
+ };
354
+ function createSsrFetch(options) {
355
+ const incoming = new Headers(options.requestHeaders);
356
+ const approvedOrigins = new Set([originOf(options.baseUrl), ...(options.allowedOrigins ?? []).map(originOf)]);
357
+ const ssrFetch = async (input, init) => {
358
+ const request = input instanceof Request && init === undefined ? input : new Request(input, init);
359
+ if (!approvedOrigins.has(new URL(request.url).origin)) {
360
+ throw new DalpSsrSecurityError(`DALP SDK: ${request.url} is not an approved SSR destination.`);
361
+ }
362
+ const cookie = incoming.get("cookie");
363
+ if (cookie !== null && !["GET", "HEAD", "OPTIONS"].includes(request.method)) {
364
+ const incomingOrigin = incoming.get("origin");
365
+ let trustedOrigin = false;
366
+ try {
367
+ trustedOrigin = incomingOrigin !== null && approvedOrigins.has(originOf(incomingOrigin));
368
+ } catch {
369
+ trustedOrigin = false;
370
+ }
371
+ if (!trustedOrigin || incoming.get("sec-fetch-site") === "cross-site") {
372
+ throw new DalpSsrSecurityError("DALP SDK: a cookie-authenticated SSR mutation requires a trusted Origin.");
373
+ }
374
+ }
375
+ const headers = new Headers(request.headers);
376
+ if (cookie === null) {
377
+ headers.delete("cookie");
378
+ } else {
379
+ headers.set("cookie", cookie);
380
+ }
381
+ for (const name of ["origin", "traceparent", "tracestate", "baggage"]) {
382
+ const value = incoming.get(name);
383
+ if (value !== null && !headers.has(name)) {
384
+ headers.set(name, value);
385
+ }
386
+ }
387
+ let current = new Request(request, { headers, redirect: "manual" });
388
+ let sensitiveAllowed = true;
389
+ for (let redirectCount = 0;redirectCount <= 5; redirectCount += 1) {
390
+ const replay = current.clone();
391
+ const response = await options.fetch(current, { credentials: "omit", redirect: "manual" });
392
+ const location = response.headers.get("location");
393
+ if (!REDIRECT_STATUSES.has(response.status) || location === null) {
394
+ return response;
395
+ }
396
+ if (redirectCount === 5) {
397
+ throw new DalpSsrSecurityError("DALP SDK: SSR fetch exceeded the redirect limit.");
398
+ }
399
+ const nextUrl = new URL(location, current.url);
400
+ sensitiveAllowed = sensitiveAllowed && approvedOrigins.has(nextUrl.origin);
401
+ const redirectToGet = response.status === 303 || (response.status === 301 || response.status === 302) && replay.method === "POST";
402
+ const method = redirectToGet ? "GET" : replay.method;
403
+ if (!sensitiveAllowed && method !== "GET" && method !== "HEAD") {
404
+ throw new DalpSsrSecurityError("DALP SDK: refused to forward an SSR request body outside the trust boundary.");
405
+ }
406
+ const nextHeaders = sensitiveAllowed ? new Headers(replay.headers) : withoutSensitiveHeaders(replay.headers);
407
+ if (redirectToGet) {
408
+ nextHeaders.delete("content-length");
409
+ nextHeaders.delete("content-type");
410
+ }
411
+ current = new Request(nextUrl, {
412
+ body: method === "GET" || method === "HEAD" ? undefined : await replay.arrayBuffer(),
413
+ credentials: sensitiveAllowed ? replay.credentials : "omit",
414
+ headers: nextHeaders,
415
+ method,
416
+ redirect: "manual",
417
+ signal: replay.signal
418
+ });
419
+ }
420
+ throw new DalpSsrSecurityError("DALP SDK: unreachable redirect state.");
421
+ };
422
+ return Object.assign(ssrFetch, {
423
+ preconnect: options.fetch.preconnect ?? (() => {})
424
+ });
425
+ }
426
+
427
+ // src/client/factory.ts
428
+ var CONTEXT_HEADERS = {
429
+ organizationId: "X-Organization-Id",
430
+ participant: "X-Participant",
431
+ executor: "X-Executor",
432
+ chainId: "X-Chain-Id",
433
+ selectedSigners: "X-Selected-Signers",
434
+ idempotencyKey: "Idempotency-Key"
435
+ };
436
+ var setNonEmptyHeader = (headers, name, value) => {
437
+ if (value !== undefined && String(value).trim().length > 0) {
438
+ headers.set(name, String(value));
439
+ }
440
+ };
441
+ function createDalpContextHeaders(context) {
442
+ const headers = new Headers;
443
+ setNonEmptyHeader(headers, CONTEXT_HEADERS.organizationId, context.organizationId);
444
+ setNonEmptyHeader(headers, CONTEXT_HEADERS.participant, context.participant);
445
+ setNonEmptyHeader(headers, CONTEXT_HEADERS.executor, context.executor);
446
+ setNonEmptyHeader(headers, CONTEXT_HEADERS.chainId, context.chainId);
447
+ setNonEmptyHeader(headers, CONTEXT_HEADERS.idempotencyKey, context.idempotencyKey);
448
+ if (context.selectedSigners !== undefined && context.selectedSigners.length > 0) {
449
+ headers.set(CONTEXT_HEADERS.selectedSigners, JSON.stringify(context.selectedSigners));
450
+ }
451
+ return headers;
452
+ }
453
+ function createDalpClient(options) {
454
+ const baseUrl = normalizeDalpBaseUrl(String(options.baseUrl));
455
+ const runtime = options.runtime ?? (globalThis.window === undefined ? "server" : "browser");
456
+ const baseFetch = options.fetch ?? globalThis.fetch;
457
+ const transportFetch = runtime === "browser" ? baseFetch : withRequestBodyCompression(baseFetch);
458
+ const { apiKey: apiKeyOption } = options;
459
+ let apiKey;
460
+ if (apiKeyOption === undefined) {
461
+ apiKey = undefined;
462
+ } else if (apiKeyOption instanceof Secret) {
463
+ apiKey = apiKeyOption;
464
+ } else {
465
+ apiKey = secret(apiKeyOption.trim());
466
+ }
467
+ if (runtime === "browser" && apiKey !== undefined) {
468
+ throw createDalpSdkConfigurationError({
469
+ message: "DALP SDK: API keys are server/CLI-only credentials and cannot configure a browser client.",
470
+ why: "An API key placed in a browser client ships the credential to every visitor's bundle.",
471
+ fix: "Keep the API key on the server or CLI process; browser clients authenticate with the session cookie."
472
+ });
473
+ }
474
+ const resolvedFetch = options.ssr === undefined ? transportFetch : createSsrFetch({
475
+ allowedOrigins: options.ssr.allowedOrigins,
476
+ baseUrl,
477
+ fetch: transportFetch,
478
+ requestHeaders: options.ssr.requestHeaders
479
+ });
480
+ const client = createClient({
481
+ baseUrl,
482
+ credentials: runtime === "browser" ? "include" : "omit",
483
+ fetch: resolvedFetch,
484
+ querySerializer: serializeDalpQuery
485
+ });
486
+ const contextHeaders = createDalpContextHeaders(options.context ?? {});
487
+ client.interceptors.request.use((request) => {
488
+ const headers = new Headers(request.headers);
489
+ if (apiKey !== undefined) {
490
+ headers.set("X-Api-Key", unwrapSecret(apiKey));
491
+ }
492
+ for (const [name, value] of contextHeaders) {
493
+ if (!headers.has(name)) {
494
+ headers.set(name, value);
495
+ }
496
+ }
497
+ return new Request(request, { headers });
498
+ });
499
+ installConditionalRequestInterceptors(client);
500
+ return client;
501
+ }
502
+
503
+ export { clearConditionalRequestStore, createDalpContextHeaders, createDalpClient };
@@ -0,0 +1,63 @@
1
+ import {
2
+ createDalpSdkConfigurationError
3
+ } from "./chunk-y0d2c7kp.js";
4
+
5
+ // src/secret.ts
6
+ var SECRET_REDACTION_MARKER = "[REDACTED]";
7
+ var inspectSymbol = Symbol.for("nodejs.util.inspect.custom");
8
+ var secretValue = new WeakMap;
9
+
10
+ class Secret {
11
+ constructor(value) {
12
+ secretValue.set(this, value);
13
+ Object.freeze(this);
14
+ }
15
+ static from(value) {
16
+ if (value.trim().length === 0) {
17
+ throw new TypeError("DALP SDK: a secret value must not be empty.");
18
+ }
19
+ return new Secret(value);
20
+ }
21
+ toString() {
22
+ return SECRET_REDACTION_MARKER;
23
+ }
24
+ toJSON() {
25
+ return SECRET_REDACTION_MARKER;
26
+ }
27
+ [inspectSymbol]() {
28
+ return SECRET_REDACTION_MARKER;
29
+ }
30
+ }
31
+ var secret = (value) => Secret.from(value);
32
+ var unwrapSecret = (value) => {
33
+ const raw = secretValue.get(value);
34
+ if (raw === undefined) {
35
+ throw new TypeError("DALP SDK: cannot unwrap an invalid secret value.");
36
+ }
37
+ return raw;
38
+ };
39
+
40
+ // src/url.ts
41
+ function normalizeDalpBaseUrl(url) {
42
+ let parsed;
43
+ try {
44
+ parsed = new URL(url);
45
+ } catch (error) {
46
+ throw createDalpSdkConfigurationError({
47
+ message: `DALP SDK: invalid url "${url}". Provide a full URL including the protocol (e.g., "https://dalp.example.com").`,
48
+ why: "The SDK could not parse the configured DALP API URL.",
49
+ fix: 'Provide a full http:// or https:// URL, for example "https://dalp.example.com".',
50
+ cause: error
51
+ });
52
+ }
53
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
54
+ throw createDalpSdkConfigurationError({
55
+ message: `DALP SDK: url must use https:// or http:// protocol, got "${parsed.protocol}".`,
56
+ why: `The SDK received a URL with the unsupported "${parsed.protocol}" protocol.`,
57
+ fix: 'Use a DALP API base URL that starts with "https://" or "http://".'
58
+ });
59
+ }
60
+ return `${parsed.origin}${parsed.pathname.replace(/\/+$/, "")}`;
61
+ }
62
+
63
+ export { SECRET_REDACTION_MARKER, Secret, secret, unwrapSecret, normalizeDalpBaseUrl };