@402flow/sdk 0.1.0-alpha.1

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.
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # @402flow/sdk
2
+
3
+ Node.js SDK for making paid requests through the 402flow control plane.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @402flow/sdk
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Runtime Token
14
+
15
+ ```ts
16
+ import { AgentPayClient } from '@402flow/sdk';
17
+
18
+ const client = new AgentPayClient({
19
+ controlPlaneBaseUrl: 'https://402flow.ai',
20
+ auth: {
21
+ type: 'runtimeToken',
22
+ runtimeToken: process.env.AGENT_PAY_RUNTIME_TOKEN ?? '',
23
+ },
24
+ });
25
+ ```
26
+
27
+ ### Bootstrap Key
28
+
29
+ ```ts
30
+ import { AgentPayClient } from '@402flow/sdk';
31
+
32
+ const client = new AgentPayClient({
33
+ controlPlaneBaseUrl: 'https://402flow.ai',
34
+ auth: {
35
+ type: 'bootstrapKey',
36
+ bootstrapKey: process.env.AGENT_PAY_BOOTSTRAP_KEY ?? '',
37
+ },
38
+ });
39
+ ```
40
+
41
+ When you configure `bootstrapKey` auth, the SDK exchanges that credential for a runtime token and reuses the runtime token for subsequent control-plane calls until it needs refresh.
42
+
43
+ ## Runtime Requirements
44
+
45
+ Use this SDK from modern Node.js environments with built-in `fetch` support.
46
+
47
+ That matters because the SDK uses the Fetch API directly, not only when it calls `fetchPaid()`, but also when it normalizes headers and constructs response objects while mapping control-plane decisions back into SDK results. In practice, the SDK expects `fetch`, `Headers`, and `Response` to be available in the runtime.
48
+
49
+ The current target is modern Node.js with built-in Fetch API support.
50
+
51
+ ## Repository Layout
52
+
53
+ The publishable npm package lives under `packages/sdk`.
54
+
55
+ This repository keeps the package source, tests, and publish configuration together in a small workspace, but the public consumer surface is the single package `@402flow/sdk`.
56
+
57
+ ## Publish
58
+
59
+ The package is published from `packages/sdk`.
@@ -0,0 +1,5 @@
1
+ import { getX402PaymentRequired, type ParsedChallenge } from './challenge-types.js';
2
+ export declare function detectChallengeFromResponse(response: Response): Promise<ParsedChallenge | undefined>;
3
+ export declare function parseX402PaymentResponseFromHeaders(headers: Headers | Record<string, string>): import("./challenge-types.js").X402PaymentResponse | undefined;
4
+ export declare function parseX402PaymentResponseHeader(headerValue: string | null): import("./challenge-types.js").X402PaymentResponse | undefined;
5
+ export { getX402PaymentRequired, type ParsedChallenge };
@@ -0,0 +1,123 @@
1
+ import { createParsedChallenge, getX402PaymentRequired, } from './challenge-types.js';
2
+ import { parseX402V1BodyChallenge, parseX402V1HeaderChallenge, parseX402V1PaymentResponseHeader, } from './x402-v1.js';
3
+ import { parseX402V2BodyChallenge, parseX402V2HeaderChallenge, parseX402V2PaymentResponseHeader, } from './x402-v2.js';
4
+ import { monetaryAmountToMinorUnits, normalizedMoneySchema } from './contracts.js';
5
+ export async function detectChallengeFromResponse(response) {
6
+ const v2HeaderChallenge = parseX402V2HeaderChallenge(response);
7
+ if (v2HeaderChallenge) {
8
+ return v2HeaderChallenge;
9
+ }
10
+ const v1HeaderChallenge = parseX402V1HeaderChallenge(response);
11
+ if (v1HeaderChallenge) {
12
+ return v1HeaderChallenge;
13
+ }
14
+ const authenticateChallenge = parseAuthenticateHeader(response.headers.get('www-authenticate'));
15
+ if (authenticateChallenge) {
16
+ return authenticateChallenge;
17
+ }
18
+ const contentType = response.headers.get('content-type') ?? '';
19
+ if (!contentType.includes('application/json')) {
20
+ return undefined;
21
+ }
22
+ try {
23
+ const payload = await response.clone().json();
24
+ return parseBodyChallenge(payload);
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ export function parseX402PaymentResponseFromHeaders(headers) {
31
+ const headerMap = headers instanceof Headers ? headers : new Headers(headers);
32
+ const v2Header = headerMap.get('payment-response');
33
+ if (v2Header) {
34
+ return parseX402V2PaymentResponseHeader(v2Header);
35
+ }
36
+ const v1Header = headerMap.get('x-payment-response');
37
+ if (v1Header) {
38
+ return parseX402V1PaymentResponseHeader(v1Header);
39
+ }
40
+ return undefined;
41
+ }
42
+ export function parseX402PaymentResponseHeader(headerValue) {
43
+ return (parseX402V2PaymentResponseHeader(headerValue) ??
44
+ parseX402V1PaymentResponseHeader(headerValue));
45
+ }
46
+ function parseAuthenticateHeader(headerValue) {
47
+ if (!headerValue) {
48
+ return undefined;
49
+ }
50
+ const protocolMatch = headerValue.match(/\b(x402|l402)\b/i);
51
+ if (!protocolMatch) {
52
+ return undefined;
53
+ }
54
+ const protocol = protocolMatch[1]?.toLowerCase();
55
+ const attributePattern = /(amount|asset|precision|payee)="([^"]+)"/gi;
56
+ const attributes = {};
57
+ let match = attributePattern.exec(headerValue);
58
+ while (match) {
59
+ const attributeName = match[1];
60
+ const attributeValue = match[2];
61
+ if (attributeName && attributeValue) {
62
+ attributes[attributeName.toLowerCase()] = attributeValue;
63
+ }
64
+ match = attributePattern.exec(headerValue);
65
+ }
66
+ if (!attributes.amount || !attributes.asset) {
67
+ return undefined;
68
+ }
69
+ return createParsedChallenge({
70
+ protocol,
71
+ money: normalizedMoneySchema.parse({
72
+ asset: attributes.asset,
73
+ amount: attributes.amount,
74
+ amountMinor: monetaryAmountToMinorUnits(attributes.amount, Number(attributes.precision ?? '6')),
75
+ precision: Number(attributes.precision ?? '6'),
76
+ unit: 'minor',
77
+ }),
78
+ payee: attributes.payee,
79
+ raw: {
80
+ authenticate: headerValue,
81
+ },
82
+ });
83
+ }
84
+ function parseBodyChallenge(payload) {
85
+ if (!payload || typeof payload !== 'object') {
86
+ return undefined;
87
+ }
88
+ const candidate = 'challenge' in payload && payload.challenge && typeof payload.challenge === 'object'
89
+ ? payload.challenge
90
+ : payload;
91
+ const v2Challenge = parseX402V2BodyChallenge(candidate);
92
+ if (v2Challenge) {
93
+ return v2Challenge;
94
+ }
95
+ const v1Challenge = parseX402V1BodyChallenge(candidate);
96
+ if (v1Challenge) {
97
+ return v1Challenge;
98
+ }
99
+ if (!candidate || typeof candidate !== 'object') {
100
+ return undefined;
101
+ }
102
+ const protocol = 'protocol' in candidate && typeof candidate.protocol === 'string'
103
+ ? candidate.protocol.toLowerCase()
104
+ : undefined;
105
+ const money = 'money' in candidate ? candidate.money : undefined;
106
+ const payee = 'payee' in candidate && typeof candidate.payee === 'string'
107
+ ? candidate.payee
108
+ : undefined;
109
+ const raw = 'raw' in candidate && candidate.raw && typeof candidate.raw === 'object'
110
+ ? candidate.raw
111
+ : undefined;
112
+ if ((protocol !== 'x402' && protocol !== 'l402') || !money) {
113
+ return undefined;
114
+ }
115
+ return createParsedChallenge({
116
+ protocol,
117
+ money: normalizedMoneySchema.parse(money),
118
+ payee,
119
+ raw: raw ?? candidate,
120
+ });
121
+ }
122
+ export { getX402PaymentRequired };
123
+ //# sourceMappingURL=challenge-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge-detection.js","sourceRoot":"","sources":["../src/challenge-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { type NormalizedMoney, type PaidRequestProtocol } from './contracts.js';
2
+ export type SupportedProtocol = PaidRequestProtocol;
3
+ export declare const defaultX402MoneyPrecision = 6;
4
+ export type X402PaymentRequirement = {
5
+ scheme: string;
6
+ network: string;
7
+ amount?: string;
8
+ maxAmountRequired?: string;
9
+ asset?: string;
10
+ payTo?: string;
11
+ maxTimeoutSeconds?: number;
12
+ extra?: Record<string, unknown>;
13
+ };
14
+ export type X402PaymentRequired = {
15
+ x402Version: number;
16
+ error?: string;
17
+ resource?: {
18
+ url: string;
19
+ description?: string;
20
+ mimeType?: string;
21
+ } & Record<string, unknown>;
22
+ accepts: X402PaymentRequirement[];
23
+ };
24
+ export type X402PaymentResponse = Record<string, unknown>;
25
+ export type ParsedChallenge = {
26
+ protocol: SupportedProtocol;
27
+ money: NormalizedMoney;
28
+ payee?: string;
29
+ raw: Record<string, unknown>;
30
+ };
31
+ export declare function readX402RequirementAmount(requirement: X402PaymentRequirement): string | undefined;
32
+ export declare function createParsedChallenge(input: {
33
+ protocol: SupportedProtocol;
34
+ money: NormalizedMoney;
35
+ payee: string | undefined;
36
+ raw: Record<string, unknown>;
37
+ }): ParsedChallenge;
38
+ export declare function minorUnitsToMonetaryAmount(amountMinor: string, precision: number): string;
39
+ export declare function decodeBase64JsonObject(value: string): unknown;
40
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
41
+ export declare function isX402PaymentRequirement(value: unknown): value is X402PaymentRequirement;
42
+ export declare function isX402PaymentRequired(value: unknown): value is X402PaymentRequired;
43
+ export declare function inferX402Precision(requirement: X402PaymentRequirement): number;
44
+ export declare function createParsedChallengeFromPaymentRequired(input: {
45
+ protocol: SupportedProtocol;
46
+ paymentRequired: X402PaymentRequired;
47
+ raw: Record<string, unknown>;
48
+ }): ParsedChallenge | undefined;
49
+ export declare function createParsedChallengeFromExplicitHeaders(input: {
50
+ protocol: SupportedProtocol;
51
+ amount: string;
52
+ asset: string;
53
+ precision: number;
54
+ payee?: string;
55
+ raw: Record<string, unknown>;
56
+ }): ParsedChallenge;
57
+ export declare function getX402PaymentRequired(challenge: ParsedChallenge): X402PaymentRequired | undefined;
@@ -0,0 +1,111 @@
1
+ import { monetaryAmountToMinorUnits, normalizedMoneySchema, } from './contracts.js';
2
+ export const defaultX402MoneyPrecision = 6;
3
+ export function readX402RequirementAmount(requirement) {
4
+ return requirement.amount ?? requirement.maxAmountRequired;
5
+ }
6
+ export function createParsedChallenge(input) {
7
+ return {
8
+ protocol: input.protocol,
9
+ money: input.money,
10
+ raw: input.raw,
11
+ ...(input.payee ? { payee: input.payee } : {}),
12
+ };
13
+ }
14
+ export function minorUnitsToMonetaryAmount(amountMinor, precision) {
15
+ if (!/^\d+$/.test(amountMinor)) {
16
+ throw new Error('Invalid minor-unit amount format.');
17
+ }
18
+ if (precision === 0) {
19
+ return amountMinor;
20
+ }
21
+ const normalizedMinorUnits = amountMinor.padStart(precision + 1, '0');
22
+ const wholePart = normalizedMinorUnits.slice(0, -precision) || '0';
23
+ const fractionalPart = normalizedMinorUnits.slice(-precision);
24
+ return `${wholePart}.${fractionalPart}`;
25
+ }
26
+ export function decodeBase64JsonObject(value) {
27
+ const normalized = value.replace(/-/g, '+').replace(/_/g, '/');
28
+ const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');
29
+ const decodeBase64 = typeof globalThis.atob === 'function'
30
+ ? globalThis.atob.bind(globalThis)
31
+ : (input) => Buffer.from(input, 'base64').toString('binary');
32
+ const binary = decodeBase64(padded);
33
+ const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
34
+ const decoded = new TextDecoder().decode(bytes);
35
+ return JSON.parse(decoded);
36
+ }
37
+ export function isRecord(value) {
38
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
39
+ }
40
+ export function isX402PaymentRequirement(value) {
41
+ return (isRecord(value) &&
42
+ typeof value.scheme === 'string' &&
43
+ typeof value.network === 'string' &&
44
+ (typeof value.amount === 'string' || typeof value.maxAmountRequired === 'string'));
45
+ }
46
+ export function isX402PaymentRequired(value) {
47
+ return (isRecord(value) &&
48
+ typeof value.x402Version === 'number' &&
49
+ Array.isArray(value.accepts) &&
50
+ value.accepts.every((accept) => isX402PaymentRequirement(accept)));
51
+ }
52
+ export function inferX402Precision(requirement) {
53
+ const extra = requirement.extra;
54
+ if (!isRecord(extra)) {
55
+ return defaultX402MoneyPrecision;
56
+ }
57
+ const precisionCandidate = extra.precision ?? extra.decimals;
58
+ const precision = Number(precisionCandidate);
59
+ if (!Number.isFinite(precision) || precision < 0) {
60
+ return defaultX402MoneyPrecision;
61
+ }
62
+ return precision;
63
+ }
64
+ export function createParsedChallengeFromPaymentRequired(input) {
65
+ const firstRequirement = input.paymentRequired.accepts[0];
66
+ if (!firstRequirement) {
67
+ return undefined;
68
+ }
69
+ const requirementAmount = readX402RequirementAmount(firstRequirement);
70
+ if (!requirementAmount) {
71
+ return undefined;
72
+ }
73
+ const precision = inferX402Precision(firstRequirement);
74
+ const amount = minorUnitsToMonetaryAmount(requirementAmount, precision);
75
+ const asset = firstRequirement.asset ?? 'UNKNOWN';
76
+ const payee = firstRequirement.payTo;
77
+ return createParsedChallenge({
78
+ protocol: input.protocol,
79
+ money: normalizedMoneySchema.parse({
80
+ asset,
81
+ amount,
82
+ amountMinor: requirementAmount,
83
+ precision,
84
+ unit: 'minor',
85
+ }),
86
+ payee,
87
+ raw: input.raw,
88
+ });
89
+ }
90
+ export function createParsedChallengeFromExplicitHeaders(input) {
91
+ return createParsedChallenge({
92
+ protocol: input.protocol,
93
+ money: normalizedMoneySchema.parse({
94
+ asset: input.asset,
95
+ amount: input.amount,
96
+ amountMinor: monetaryAmountToMinorUnits(input.amount, input.precision),
97
+ precision: input.precision,
98
+ unit: 'minor',
99
+ }),
100
+ payee: input.payee,
101
+ raw: input.raw,
102
+ });
103
+ }
104
+ export function getX402PaymentRequired(challenge) {
105
+ const paymentRequired = challenge.raw.paymentRequired;
106
+ if (!isX402PaymentRequired(paymentRequired)) {
107
+ return undefined;
108
+ }
109
+ return paymentRequired;
110
+ }
111
+ //# sourceMappingURL=challenge-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challenge-types.js","sourceRoot":"","sources":["../src/challenge-types.ts"],"names":[],"mappings":"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"}