@dvmkit/sdk 0.1.0-rc.1 → 0.1.0-rc.3

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 (42) hide show
  1. package/README.md +10 -2
  2. package/dist/{revenue-reporter-M35KP6V7.js → chunk-2ABMGUDS.js} +78 -2
  3. package/dist/chunk-5SO7ZVOH.js +375 -0
  4. package/dist/chunk-66HGCPBU.js +25 -0
  5. package/dist/{chunk-KQAJVVZT.js → chunk-AZBXSXQT.js} +27 -287
  6. package/dist/chunk-C2DC4FKR.js +21424 -0
  7. package/dist/{chunk-H25M54MI.js → chunk-C3MTFLC6.js} +16 -0
  8. package/dist/{chunk-NTK5DJ6R.js → chunk-EXHBXA4U.js} +11 -1
  9. package/dist/chunk-FT7IM66W.js +1557 -0
  10. package/dist/{chunk-KXWROQGK.js → chunk-FUJ36YDV.js} +1 -24
  11. package/dist/{tempo-charge-store-6GJEMNUU.js → chunk-JZWELPFH.js} +1 -0
  12. package/dist/{chunk-RPXHKMYE.js → chunk-LWUR4CGG.js} +348 -34
  13. package/dist/chunk-RHP3BRTH.js +1090 -0
  14. package/dist/{tempo-session-store-FTEEGZXA.js → chunk-RU7SXHLO.js} +2 -1
  15. package/dist/{chunk-7IH5SG2A.js → chunk-TKA6ZP4M.js} +62 -41
  16. package/dist/chunk-TVI4V7GF.js +283 -0
  17. package/dist/chunk-X3IKFWJA.js +754 -0
  18. package/dist/{chunk-DCNT4PJS.js → chunk-XY5Y5REG.js} +6 -258
  19. package/dist/chunk-XYTSDAPH.js +232 -0
  20. package/dist/chunk-YD3TZNXV.js +1042 -0
  21. package/dist/{credit-ledger-EDMEZSA2.js → credit-ledger-ED6JXKVD.js} +2 -2
  22. package/dist/credit-menu-DONAtGVf.d.ts +5076 -0
  23. package/dist/{ssrf-BdHsrrIb.d.ts → fx-Bq4cvn16.d.ts} +37 -119
  24. package/dist/index.d.ts +8 -66
  25. package/dist/index.js +11 -219
  26. package/dist/internal/index.d.ts +5745 -0
  27. package/dist/internal/index.js +6379 -0
  28. package/dist/{job-store-C5n6bhap.d.ts → job-store-m2pYmvbr.d.ts} +1772 -31
  29. package/dist/{memory-credit-ledger-7TTZDSRS.js → memory-credit-ledger-XJ5VQEVP.js} +3 -3
  30. package/dist/payout-reporter-3UB5WRCV.js +13 -0
  31. package/dist/revenue-reporter-JIKUPXOK.js +7 -0
  32. package/dist/server/index.d.ts +14 -3530
  33. package/dist/server/index.js +327 -20636
  34. package/dist/ssrf-DbFkpDv0.d.ts +118 -0
  35. package/dist/tempo-charge-store-RIFTALZK.js +8 -0
  36. package/dist/tempo-session-store-DALMRIWN.js +11 -0
  37. package/dist/testing/index.d.ts +3 -2
  38. package/dist/testing/index.js +3 -2
  39. package/dist/usd-DjVAPMlf.d.ts +97 -0
  40. package/dist/x402-5EVIUSEP.js +81 -0
  41. package/package.json +6 -2
  42. package/dist/x402-35VLYFKZ.js +0 -1272
@@ -11,11 +11,6 @@ var DEFAULT_CREDIT_MIN = "$0.10";
11
11
  var DEFAULT_CREDIT_MAX = "$5.00";
12
12
  var DEFAULT_CREDIT_TTL_SECONDS = 30 * 24 * 60 * 60;
13
13
 
14
- // src/sdk/env.ts
15
- function envFlag(value) {
16
- return value === "1" || value === "true";
17
- }
18
-
19
14
  // src/lib/cast-auth/canonical-json.ts
20
15
  function canonicalize(value) {
21
16
  return JSON.stringify(sortDeep(value));
@@ -47,6 +42,26 @@ function sortDeep(value) {
47
42
 
48
43
  // src/lib/cast-auth/verify.ts
49
44
  import { schnorr } from "@noble/curves/secp256k1.js";
45
+ function verifyCanonicalSignedRequest(payload, signatureHex, pubkeyHex) {
46
+ if (!/^[0-9a-f]{64}$/i.test(pubkeyHex) || !/^[0-9a-f]{128}$/i.test(signatureHex)) {
47
+ return false;
48
+ }
49
+ const data = canonicaliseForSigning(payload);
50
+ const signature = hexToBytes(signatureHex);
51
+ const pubkey = hexToBytes(pubkeyHex);
52
+ try {
53
+ return schnorr.verify(signature, data, pubkey);
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+ function hexToBytes(hex) {
59
+ const out = new Uint8Array(hex.length / 2);
60
+ for (let i = 0; i < out.length; i++) {
61
+ out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
62
+ }
63
+ return out;
64
+ }
50
65
 
51
66
  // src/lib/signed-request-statement.ts
52
67
  var SIGNED_REQUEST_AUTH_ID = "secp256k1-schnorr-v2";
@@ -106,9 +121,6 @@ function canonicalRequestPath(pathOrUrl) {
106
121
  return parsed.pathname.startsWith("/") ? parsed.pathname : `/${parsed.pathname}`;
107
122
  }
108
123
 
109
- // src/sdk/server/signed-request.ts
110
- import { schnorr as schnorr2 } from "@noble/curves/secp256k1.js";
111
-
112
124
  // src/sdk/server/zod-error.ts
113
125
  function humanizeZodError(err, opts) {
114
126
  return humanizeZodIssues(err.issues, opts);
@@ -195,6 +207,7 @@ function pickHint(issues, schemaUrl) {
195
207
  }
196
208
 
197
209
  // src/sdk/server/signed-request.ts
210
+ import { schnorr as schnorr2 } from "@noble/curves/secp256k1.js";
198
211
  var SIGNED_ENVELOPE_TYPES = {
199
212
  pubkey: "string",
200
213
  signature: "string",
@@ -357,12 +370,12 @@ function statementHeader(input) {
357
370
  }
358
371
  function verifyBytes(bytes, signatureHex, pubkeyHex) {
359
372
  try {
360
- return schnorr2.verify(hexToBytes(signatureHex), bytes, hexToBytes(pubkeyHex));
373
+ return schnorr2.verify(hexToBytes2(signatureHex), bytes, hexToBytes2(pubkeyHex));
361
374
  } catch {
362
375
  return false;
363
376
  }
364
377
  }
365
- function hexToBytes(hex) {
378
+ function hexToBytes2(hex) {
366
379
  const out = new Uint8Array(hex.length / 2);
367
380
  for (let i = 0; i < out.length; i++) out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
368
381
  return out;
@@ -413,300 +426,27 @@ function createDefaultReplayStore() {
413
426
  }
414
427
  var SATURATION_WARN_INTERVAL_SECONDS = 60;
415
428
 
416
- // src/sdk/server/ssrf.ts
417
- import { lookup } from "dns/promises";
418
- import { isIPv4, isIPv6 } from "net";
419
- import { Agent } from "undici";
420
- var SSRFError = class extends Error {
421
- code = "ssrf_blocked";
422
- reason;
423
- constructor(reason, message) {
424
- super(message);
425
- this.reason = reason;
426
- }
427
- };
428
- async function assertSafeUrl(url, opts) {
429
- await resolveAndValidate(url, opts);
430
- }
431
- async function createPinnedFetch(url, opts) {
432
- const validated = await resolveAndValidate(url, opts);
433
- const baseFetch = opts?.baseFetch ?? fetch;
434
- const initialUrl = new URL(url);
435
- const agents = [];
436
- const targets = /* @__PURE__ */ new Map();
437
- const createTarget = (next) => {
438
- if (next.kind === "literal") return {};
439
- const agent = new Agent({
440
- connect: { lookup: buildPinnedLookup(next.addresses) }
441
- });
442
- agents.push(agent);
443
- return { agent };
444
- };
445
- targets.set(initialUrl.origin, createTarget(validated));
446
- const targetFor = async (requestUrl) => {
447
- const parsed = new URL(requestUrl);
448
- const existing = targets.get(parsed.origin);
449
- if (existing) return existing;
450
- const target = createTarget(await resolveAndValidate(parsed.href, opts));
451
- targets.set(parsed.origin, target);
452
- return target;
453
- };
454
- const pinnedFetch = async (input, init) => {
455
- let request = new Request(input, init);
456
- let redirects = 0;
457
- for (; ; ) {
458
- const target = await targetFor(request.url);
459
- const response = await baseFetch(
460
- request,
461
- target.agent ? { redirect: "manual", dispatcher: target.agent } : { redirect: "manual" }
462
- );
463
- if (!isRedirect(response.status) || request.redirect === "manual") return response;
464
- const location = response.headers.get("location");
465
- if (location === null) return response;
466
- await discardResponse(response);
467
- if (request.redirect === "error") {
468
- throw new TypeError("fetch failed: redirect mode is set to error");
469
- }
470
- if (redirects >= MAX_PINNED_REDIRECTS) {
471
- throw new TypeError("fetch failed: maximum redirect count exceeded");
472
- }
473
- request = requestForRedirect(request, new URL(location, request.url), response.status);
474
- redirects += 1;
475
- opts?.onRedirectFollowed?.();
476
- }
477
- };
478
- return {
479
- fetch: pinnedFetch,
480
- address: validated.address,
481
- family: validated.family,
482
- close: async () => {
483
- await Promise.all(agents.map((agent) => agent.close()));
484
- }
485
- };
486
- }
487
- var MAX_PINNED_REDIRECTS = 20;
488
- function isRedirect(status) {
489
- return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
490
- }
491
- async function discardResponse(response) {
492
- await response.body?.cancel().catch(() => void 0);
493
- }
494
- function requestForRedirect(request, target, status) {
495
- const headers = new Headers(request.headers);
496
- if (new URL(request.url).origin !== target.origin) {
497
- headers.delete("authorization");
498
- headers.delete("cookie");
499
- headers.delete("proxy-authorization");
500
- headers.delete("host");
501
- }
502
- const method = request.method.toUpperCase();
503
- const switchToGet = status === 303 && method !== "HEAD" || (status === 301 || status === 302) && method === "POST";
504
- if (switchToGet) {
505
- headers.delete("content-length");
506
- headers.delete("content-type");
507
- return redirectRequest(target, request, headers, "GET");
508
- }
509
- if (method !== "GET" && method !== "HEAD") {
510
- throw new TypeError("fetch failed: cannot safely replay a request body across this redirect");
511
- }
512
- return redirectRequest(target, request, headers, method);
513
- }
514
- function redirectRequest(target, request, headers, method) {
515
- return new Request(target, {
516
- method,
517
- headers,
518
- signal: request.signal,
519
- redirect: request.redirect,
520
- cache: request.cache,
521
- credentials: request.credentials,
522
- integrity: request.integrity,
523
- keepalive: request.keepalive,
524
- mode: request.mode,
525
- referrer: request.referrer,
526
- referrerPolicy: request.referrerPolicy
527
- });
528
- }
529
- function buildPinnedLookup(addresses) {
530
- return ((_hostname, options, cb) => {
531
- if (options.all === false) {
532
- const first = addresses[0];
533
- cb(
534
- null,
535
- first.address,
536
- first.family
537
- );
538
- } else {
539
- cb(
540
- null,
541
- addresses
542
- );
543
- }
544
- });
545
- }
546
- async function resolveAndValidate(url, opts) {
547
- const resolver = opts?.resolver ?? defaultResolver;
548
- let parsed;
549
- try {
550
- parsed = new URL(url);
551
- } catch {
552
- throw new SSRFError("invalid_url", `url is not a valid URL: ${url}`);
553
- }
554
- if (parsed.protocol !== "https:") {
555
- throw new SSRFError("insecure_scheme", `url must be https; got ${parsed.protocol}`);
556
- }
557
- const host = parsed.hostname.toLowerCase();
558
- if (host === "") {
559
- throw new SSRFError("invalid_url", "url has no host");
560
- }
561
- if (HOSTNAME_DENYLIST_EXACT.has(host) || matchesExtraExact(host, opts?.extraHostnamesExact)) {
562
- throw new SSRFError("private_address", `url host "${host}" is on the SSRF denylist`);
563
- }
564
- for (const suffix of HOSTNAME_DENYLIST_SUFFIX) {
565
- if (host === suffix.slice(1) || host.endsWith(suffix)) {
566
- throw new SSRFError(
567
- "private_address",
568
- `url host "${host}" matches denied suffix "${suffix}"`
569
- );
570
- }
571
- }
572
- if (opts?.extraHostnameSuffixes) {
573
- for (const suffix of opts.extraHostnameSuffixes) {
574
- const s = suffix.toLowerCase();
575
- if (host === s.slice(1) || host.endsWith(s)) {
576
- throw new SSRFError("private_address", `url host "${host}" matches denied suffix "${s}"`);
577
- }
578
- }
579
- }
580
- const stripped = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
581
- if (isIPv4(stripped) || isIPv6(stripped)) {
582
- if (isUnsafeAddress(stripped, opts)) {
583
- throw new SSRFError(
584
- "private_address",
585
- `url host "${stripped}" is in a blocked address range`
586
- );
587
- }
588
- return { kind: "literal", address: stripped, family: isIPv4(stripped) ? 4 : 6 };
589
- }
590
- let addresses;
591
- try {
592
- addresses = await resolver(host);
593
- } catch (err) {
594
- throw new SSRFError(
595
- "dns_failed",
596
- `url host "${host}" failed DNS resolution: ${err instanceof Error ? err.message : String(err)}`
597
- );
598
- }
599
- if (addresses.length === 0) {
600
- throw new SSRFError("dns_failed", `url host "${host}" resolved to no addresses`);
601
- }
602
- for (const { address } of addresses) {
603
- if (isUnsafeAddress(address, opts)) {
604
- throw new SSRFError(
605
- "private_address",
606
- `url host "${host}" resolves to blocked address "${address}"`
607
- );
608
- }
609
- }
610
- const validated = addresses.map((a) => ({ address: a.address, family: a.family }));
611
- const first = validated[0];
612
- return { kind: "resolved", address: first.address, family: first.family, addresses: validated };
613
- }
614
- var HOSTNAME_DENYLIST_EXACT = /* @__PURE__ */ new Set([
615
- "localhost",
616
- "ip6-localhost",
617
- "ip6-loopback",
618
- "metadata.google.internal",
619
- "metadata"
620
- ]);
621
- var HOSTNAME_DENYLIST_SUFFIX = [".internal", ".local", ".localhost", ".lan"];
622
- async function defaultResolver(host) {
623
- return lookup(host, { all: true });
624
- }
625
- function matchesExtraExact(host, extras) {
626
- if (!extras) return false;
627
- for (const entry of extras) {
628
- if (entry.toLowerCase() === host) return true;
629
- }
630
- return false;
631
- }
632
- function isUnsafeAddress(address, opts) {
633
- if (isIPv4(address)) {
634
- if (isUnsafeIPv4(address)) return true;
635
- return opts?.extraUnsafeIPv4?.(address) === true;
636
- }
637
- if (isIPv6(address)) {
638
- if (isUnsafeIPv6(address)) return true;
639
- return opts?.extraUnsafeIPv6?.(address) === true;
640
- }
641
- return true;
642
- }
643
- function isUnsafeIPv4(address) {
644
- const parts = address.split(".").map(Number);
645
- if (parts.length !== 4 || parts.some((p) => !Number.isFinite(p) || p < 0 || p > 255)) {
646
- return true;
647
- }
648
- const [a, b, c] = parts;
649
- if (a === 0) return true;
650
- if (a === 10) return true;
651
- if (a === 100 && b >= 64 && b <= 127) return true;
652
- if (a === 127) return true;
653
- if (a === 169 && b === 254) return true;
654
- if (a === 172 && b >= 16 && b <= 31) return true;
655
- if (a === 192 && b === 0 && (c === 0 || c === 2)) return true;
656
- if (a === 192 && b === 168) return true;
657
- if (a === 198 && (b === 18 || b === 19)) return true;
658
- if (a >= 224 && a <= 239) return true;
659
- if (a >= 240) return true;
660
- return false;
661
- }
662
- function isUnsafeIPv6(address) {
663
- const lower = address.toLowerCase();
664
- if (lower === "::1") return true;
665
- if (lower === "::") return true;
666
- if (lower.startsWith("fe8") || lower.startsWith("fe9") || lower.startsWith("fea") || lower.startsWith("feb")) {
667
- return true;
668
- }
669
- if (lower.startsWith("fc") || lower.startsWith("fd")) return true;
670
- if (lower.startsWith("::ffff:")) {
671
- const tail = lower.slice("::ffff:".length);
672
- if (isIPv4(tail)) return isUnsafeIPv4(tail);
673
- const m = /^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(tail);
674
- if (m) {
675
- const high = parseInt(m[1], 16);
676
- const low = parseInt(m[2], 16);
677
- const a = high >> 8 & 255;
678
- const b = high & 255;
679
- const c = low >> 8 & 255;
680
- const d = low & 255;
681
- return isUnsafeIPv4(`${a.toString()}.${b.toString()}.${c.toString()}.${d.toString()}`);
682
- }
683
- }
684
- if (lower.startsWith("ff")) return true;
685
- return false;
686
- }
687
-
688
429
  export {
689
430
  isZodSchema,
690
431
  RAIL_REFUNDABLE,
691
432
  DEFAULT_CREDIT_MIN,
692
433
  DEFAULT_CREDIT_MAX,
693
434
  DEFAULT_CREDIT_TTL_SECONDS,
694
- envFlag,
695
435
  canonicalize,
696
436
  canonicaliseForSigning,
437
+ verifyCanonicalSignedRequest,
697
438
  SIGNED_REQUEST_AUTH_ID,
698
439
  SIGNED_REQUEST_STATEMENT_VERSION,
699
440
  signedRequestStatementHeader,
441
+ canonicalSignedRequestStatement,
700
442
  canonicalRequestPath,
701
443
  humanizeZodError,
702
444
  humanizeZodIssues,
703
445
  zodIssuesOf,
446
+ SIGNED_ENVELOPE_TYPES,
704
447
  SIGNED_ENVELOPE_FIELDS,
705
448
  SignedRequestError,
706
449
  createSignedRequestVerifier,
707
450
  signedRequestInput,
708
- createDefaultReplayStore,
709
- SSRFError,
710
- assertSafeUrl,
711
- createPinnedFetch
451
+ createDefaultReplayStore
712
452
  };