@seedhape/x402-merchant-sdk 0.5.2 → 0.5.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.
- package/README.md +371 -8
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +180 -0
- package/dist/cli.js.map +1 -0
- package/dist/commerce.d.ts +2 -0
- package/dist/commerce.d.ts.map +1 -1
- package/dist/commerce.js +1 -0
- package/dist/commerce.js.map +1 -1
- package/dist/fulfillment.d.ts +153 -0
- package/dist/fulfillment.d.ts.map +1 -0
- package/dist/fulfillment.js +369 -0
- package/dist/fulfillment.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware.d.ts +3 -3
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +7 -3
- package/dist/middleware.js.map +1 -1
- package/dist/protocol-catalog.d.ts +67 -0
- package/dist/protocol-catalog.d.ts.map +1 -0
- package/dist/protocol-catalog.js +76 -0
- package/dist/protocol-catalog.js.map +1 -0
- package/dist/proxy.d.ts +19 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +100 -0
- package/dist/proxy.js.map +1 -0
- package/dist/seller.d.ts +24 -0
- package/dist/seller.d.ts.map +1 -1
- package/dist/seller.js +195 -28
- package/dist/seller.js.map +1 -1
- package/dist/stripe-mpp.d.ts +2 -2
- package/dist/stripe-mpp.d.ts.map +1 -1
- package/dist/stripe-mpp.js +8 -2
- package/dist/stripe-mpp.js.map +1 -1
- package/dist/ucp-handler.d.ts +8 -0
- package/dist/ucp-handler.d.ts.map +1 -0
- package/dist/ucp-handler.js +132 -0
- package/dist/ucp-handler.js.map +1 -0
- package/package.json +6 -3
package/dist/commerce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commerce.js","sourceRoot":"","sources":["../src/commerce.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commerce.js","sourceRoot":"","sources":["../src/commerce.ts"],"names":[],"mappings":"AA2BA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA8B;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAElG,OAAO;QACL,OAAO;YACL,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACvC,GAAG,OAAO;gBACV,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;gBACpE,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAU;gBACvD,cAAc,EAAE,CAAC,MAAM,CAAU;aAClC,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,CAAC,EAAU;YAChB,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QAC9B,CAAC;QACD,UAAU,CAAC,EAAU;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;YACjE,OAAO;gBACL,GAAG,MAAM,CAAC,OAAO;gBACjB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;aAC/G,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-neutral delivery values for products fulfilled after payment.
|
|
3
|
+
*
|
|
4
|
+
* The SDK does not store files or host merchant inventory. These helpers give
|
|
5
|
+
* merchants a stable response shape for their own storage, license, or
|
|
6
|
+
* entitlement systems while payment remains handled by the seller paywall.
|
|
7
|
+
*/
|
|
8
|
+
import type { SellerFulfillment, SellerFulfillmentContext, SellerProductKind } from "./seller.js";
|
|
9
|
+
export interface DownloadGrant {
|
|
10
|
+
assetId: string;
|
|
11
|
+
orderId: string;
|
|
12
|
+
productId: string;
|
|
13
|
+
expiresAt: number;
|
|
14
|
+
maxDownloads?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface DownloadAsset {
|
|
17
|
+
body: string | Uint8Array | ArrayBuffer | ReadableStream<Uint8Array>;
|
|
18
|
+
filename: string;
|
|
19
|
+
contentType?: string;
|
|
20
|
+
contentLength?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface DownloadHandlerOptions {
|
|
23
|
+
secret: string;
|
|
24
|
+
resolveAsset: (grant: DownloadGrant) => Promise<DownloadAsset | null>;
|
|
25
|
+
/** Return false when the grant has reached its atomic download limit. */
|
|
26
|
+
consumeGrant?: (grant: DownloadGrant) => Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
export interface LocalDownloadAsset {
|
|
29
|
+
relativePath: string;
|
|
30
|
+
filename: string;
|
|
31
|
+
contentType?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RemoteDownloadAsset {
|
|
34
|
+
url: string;
|
|
35
|
+
filename: string;
|
|
36
|
+
contentType?: string;
|
|
37
|
+
}
|
|
38
|
+
export type FulfillmentHandler = (context: SellerFulfillmentContext) => SellerFulfillment | Promise<SellerFulfillment>;
|
|
39
|
+
export type FulfillmentRouterOptions = Partial<Record<SellerProductKind, FulfillmentHandler>>;
|
|
40
|
+
/** Sign a short-lived, storage-opaque grant for a hosted download route. */
|
|
41
|
+
export declare function createDownloadGrant(input: {
|
|
42
|
+
secret: string;
|
|
43
|
+
assetId: string;
|
|
44
|
+
orderId: string;
|
|
45
|
+
productId: string;
|
|
46
|
+
expiresInSeconds?: number;
|
|
47
|
+
maxDownloads?: number;
|
|
48
|
+
now?: number;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
token: string;
|
|
51
|
+
grant: DownloadGrant;
|
|
52
|
+
}>;
|
|
53
|
+
/** Verify a grant and return only the claims needed by a storage adapter. */
|
|
54
|
+
export declare function verifyDownloadGrant(token: string, secret: string, now?: number): Promise<DownloadGrant>;
|
|
55
|
+
/**
|
|
56
|
+
* Build a hosted download endpoint around private storage.
|
|
57
|
+
*
|
|
58
|
+
* The resolver should fetch the asset only after grant verification. When a
|
|
59
|
+
* grant has a maxDownloads value, provide consumeGrant backed by an atomic
|
|
60
|
+
* database update so concurrent requests cannot exceed the limit.
|
|
61
|
+
*/
|
|
62
|
+
export declare function createDownloadHandler(options: DownloadHandlerOptions): (request: Request) => Promise<Response>;
|
|
63
|
+
/**
|
|
64
|
+
* Resolve assets from a private local directory without allowing path escape.
|
|
65
|
+
* This is intended for a small merchant deployment; object-storage adapters
|
|
66
|
+
* can implement the same DownloadHandlerOptions.resolveAsset contract.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createLocalDownloadResolver(input: {
|
|
69
|
+
rootDir: string;
|
|
70
|
+
assets: Record<string, LocalDownloadAsset>;
|
|
71
|
+
}): (grant: DownloadGrant) => Promise<DownloadAsset | null>;
|
|
72
|
+
/** Resolve a private object-storage URL without exposing it to the buyer. */
|
|
73
|
+
export declare function createRemoteDownloadResolver(input: {
|
|
74
|
+
getAsset: (grant: DownloadGrant) => Promise<RemoteDownloadAsset | null>;
|
|
75
|
+
timeoutMs?: number;
|
|
76
|
+
maxBytes?: number;
|
|
77
|
+
}): (grant: DownloadGrant) => Promise<DownloadAsset | null>;
|
|
78
|
+
/** Select the merchant's delivery handler from the product's declared kind. */
|
|
79
|
+
export declare function createFulfillmentRouter(handlers: FulfillmentRouterOptions): FulfillmentHandler;
|
|
80
|
+
export type DigitalDownloadDelivery = {
|
|
81
|
+
type: "digital_download";
|
|
82
|
+
downloadUrl: string;
|
|
83
|
+
filename: string;
|
|
84
|
+
expiresAt?: number;
|
|
85
|
+
maxDownloads?: number;
|
|
86
|
+
};
|
|
87
|
+
export type LicenseDelivery = {
|
|
88
|
+
type: "license";
|
|
89
|
+
licenseKey?: string;
|
|
90
|
+
activationUrl?: string;
|
|
91
|
+
metadata?: Record<string, string>;
|
|
92
|
+
};
|
|
93
|
+
export type WebhookDelivery = {
|
|
94
|
+
type: "webhook";
|
|
95
|
+
reference: string;
|
|
96
|
+
};
|
|
97
|
+
export type FulfillmentDelivery = DigitalDownloadDelivery | LicenseDelivery | WebhookDelivery;
|
|
98
|
+
export interface FulfillmentWebhookEvent {
|
|
99
|
+
id: string;
|
|
100
|
+
type: "license.issue" | "license.revoke" | "subscription.activate" | "subscription.renew" | "subscription.cancel";
|
|
101
|
+
orderId: string;
|
|
102
|
+
productId: string;
|
|
103
|
+
buyerId?: string;
|
|
104
|
+
paymentReference?: string;
|
|
105
|
+
data?: Record<string, unknown>;
|
|
106
|
+
}
|
|
107
|
+
export interface FulfillmentWebhookResult {
|
|
108
|
+
status: number;
|
|
109
|
+
body: unknown;
|
|
110
|
+
}
|
|
111
|
+
export interface FulfillmentWebhookRetryOptions {
|
|
112
|
+
attempts?: number;
|
|
113
|
+
baseDelayMs?: number;
|
|
114
|
+
maxDelayMs?: number;
|
|
115
|
+
/** Injectable for tests and job runners. */
|
|
116
|
+
wait?: (milliseconds: number) => Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
/** Parse and validate a signed webhook body before applying business logic. */
|
|
119
|
+
export declare function parseFulfillmentWebhookEvent(body: string): FulfillmentWebhookEvent;
|
|
120
|
+
/** Verify the timestamped HMAC headers received by a merchant webhook. */
|
|
121
|
+
export declare function verifyFulfillmentWebhookSignature(input: {
|
|
122
|
+
secret: string;
|
|
123
|
+
timestamp: string;
|
|
124
|
+
signature: string;
|
|
125
|
+
body: string;
|
|
126
|
+
toleranceSeconds?: number;
|
|
127
|
+
now?: number;
|
|
128
|
+
}): boolean;
|
|
129
|
+
/** Create a validated, buyer-safe delivery response for a merchant-signed URL. */
|
|
130
|
+
export declare function createDownloadDelivery(input: {
|
|
131
|
+
downloadUrl: string;
|
|
132
|
+
filename: string;
|
|
133
|
+
expiresAt?: number;
|
|
134
|
+
maxDownloads?: number;
|
|
135
|
+
}): DigitalDownloadDelivery;
|
|
136
|
+
export declare function createLicenseDelivery(input: {
|
|
137
|
+
licenseKey?: string;
|
|
138
|
+
activationUrl?: string;
|
|
139
|
+
metadata?: Record<string, string>;
|
|
140
|
+
}): LicenseDelivery;
|
|
141
|
+
export declare function createWebhookDelivery(reference: string): WebhookDelivery;
|
|
142
|
+
type FulfillmentWebhookInput = {
|
|
143
|
+
url: string;
|
|
144
|
+
secret: string;
|
|
145
|
+
event: FulfillmentWebhookEvent;
|
|
146
|
+
timeoutMs?: number;
|
|
147
|
+
};
|
|
148
|
+
/** Send a signed, idempotent fulfillment event to a merchant-owned system. */
|
|
149
|
+
export declare function sendFulfillmentWebhook(input: FulfillmentWebhookInput): Promise<FulfillmentWebhookResult>;
|
|
150
|
+
/** Retry a fulfillment event without changing its idempotency key or signature payload. */
|
|
151
|
+
export declare function sendFulfillmentWebhookWithRetry(input: Parameters<typeof sendFulfillmentWebhook>[0], retry?: FulfillmentWebhookRetryOptions): Promise<FulfillmentWebhookResult>;
|
|
152
|
+
export {};
|
|
153
|
+
//# sourceMappingURL=fulfillment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fulfillment.d.ts","sourceRoot":"","sources":["../src/fulfillment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol-neutral delivery values for products fulfilled after payment.
|
|
3
|
+
*
|
|
4
|
+
* The SDK does not store files or host merchant inventory. These helpers give
|
|
5
|
+
* merchants a stable response shape for their own storage, license, or
|
|
6
|
+
* entitlement systems while payment remains handled by the seller paywall.
|
|
7
|
+
*/
|
|
8
|
+
import { SignJWT, jwtVerify } from "jose";
|
|
9
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
10
|
+
import { realpath, readFile, stat } from "node:fs/promises";
|
|
11
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
12
|
+
import { validateOutboundUrl } from "@seedhape/core";
|
|
13
|
+
const DOWNLOAD_GRANT_ISSUER = "seedhape-download";
|
|
14
|
+
function signingKey(secret) {
|
|
15
|
+
if (secret.length < 32)
|
|
16
|
+
throw new Error("download grant secret must be at least 32 characters.");
|
|
17
|
+
return new TextEncoder().encode(secret);
|
|
18
|
+
}
|
|
19
|
+
function requiredText(value, field) {
|
|
20
|
+
if (!value.trim() || value.length > 512)
|
|
21
|
+
throw new Error(`${field} must contain 1-512 characters.`);
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
/** Sign a short-lived, storage-opaque grant for a hosted download route. */
|
|
25
|
+
export async function createDownloadGrant(input) {
|
|
26
|
+
const now = input.now ?? Math.floor(Date.now() / 1000);
|
|
27
|
+
const lifetime = input.expiresInSeconds ?? 3600;
|
|
28
|
+
if (!Number.isSafeInteger(lifetime) || lifetime < 60 || lifetime > 86_400)
|
|
29
|
+
throw new Error("expiresInSeconds must be an integer from 60 to 86400.");
|
|
30
|
+
if (input.maxDownloads !== undefined && (!Number.isSafeInteger(input.maxDownloads) || input.maxDownloads < 1))
|
|
31
|
+
throw new Error("maxDownloads must be a positive integer.");
|
|
32
|
+
const grant = {
|
|
33
|
+
assetId: requiredText(input.assetId, "assetId"),
|
|
34
|
+
orderId: requiredText(input.orderId, "orderId"),
|
|
35
|
+
productId: requiredText(input.productId, "productId"),
|
|
36
|
+
expiresAt: now + lifetime,
|
|
37
|
+
...(input.maxDownloads === undefined ? {} : { maxDownloads: input.maxDownloads }),
|
|
38
|
+
};
|
|
39
|
+
const token = await new SignJWT({
|
|
40
|
+
asset_id: grant.assetId,
|
|
41
|
+
order_id: grant.orderId,
|
|
42
|
+
product_id: grant.productId,
|
|
43
|
+
...(grant.maxDownloads === undefined ? {} : { max_downloads: grant.maxDownloads }),
|
|
44
|
+
})
|
|
45
|
+
.setProtectedHeader({ alg: "HS256", typ: "JWT" })
|
|
46
|
+
.setIssuer(DOWNLOAD_GRANT_ISSUER)
|
|
47
|
+
.setIssuedAt(now)
|
|
48
|
+
.setExpirationTime(grant.expiresAt)
|
|
49
|
+
.sign(signingKey(input.secret));
|
|
50
|
+
return { token, grant };
|
|
51
|
+
}
|
|
52
|
+
/** Verify a grant and return only the claims needed by a storage adapter. */
|
|
53
|
+
export async function verifyDownloadGrant(token, secret, now = Math.floor(Date.now() / 1000)) {
|
|
54
|
+
const { payload } = await jwtVerify(token, signingKey(secret), { algorithms: ["HS256"], issuer: DOWNLOAD_GRANT_ISSUER });
|
|
55
|
+
const assetId = payload.asset_id;
|
|
56
|
+
const orderId = payload.order_id;
|
|
57
|
+
const productId = payload.product_id;
|
|
58
|
+
const expiresAt = payload.exp;
|
|
59
|
+
const maxDownloads = payload.max_downloads;
|
|
60
|
+
if (typeof assetId !== "string" || typeof orderId !== "string" || typeof productId !== "string" || typeof expiresAt !== "number" || expiresAt <= now) {
|
|
61
|
+
throw new Error("Invalid download grant claims.");
|
|
62
|
+
}
|
|
63
|
+
if (maxDownloads !== undefined && (typeof maxDownloads !== "number" || !Number.isSafeInteger(maxDownloads) || maxDownloads < 1))
|
|
64
|
+
throw new Error("Invalid download grant limit.");
|
|
65
|
+
return { assetId, orderId, productId, expiresAt, ...(maxDownloads === undefined ? {} : { maxDownloads }) };
|
|
66
|
+
}
|
|
67
|
+
function contentDisposition(filename) {
|
|
68
|
+
const safe = filename.replace(/[\\"\r\n]/g, "_");
|
|
69
|
+
return `attachment; filename="${safe}"`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build a hosted download endpoint around private storage.
|
|
73
|
+
*
|
|
74
|
+
* The resolver should fetch the asset only after grant verification. When a
|
|
75
|
+
* grant has a maxDownloads value, provide consumeGrant backed by an atomic
|
|
76
|
+
* database update so concurrent requests cannot exceed the limit.
|
|
77
|
+
*/
|
|
78
|
+
export function createDownloadHandler(options) {
|
|
79
|
+
signingKey(options.secret);
|
|
80
|
+
return async (request) => {
|
|
81
|
+
if (request.method !== "GET" && request.method !== "HEAD")
|
|
82
|
+
return new Response("Method Not Allowed", { status: 405, headers: { allow: "GET, HEAD" } });
|
|
83
|
+
const url = new URL(request.url);
|
|
84
|
+
let token;
|
|
85
|
+
try {
|
|
86
|
+
token = url.searchParams.get("token") ?? decodeURIComponent(url.pathname.split("/").filter(Boolean).at(-1) ?? "");
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return new Response("Malformed download token", { status: 400 });
|
|
90
|
+
}
|
|
91
|
+
if (!token)
|
|
92
|
+
return new Response("Download token is required", { status: 400 });
|
|
93
|
+
let grant;
|
|
94
|
+
try {
|
|
95
|
+
grant = await verifyDownloadGrant(token, options.secret);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return new Response("Invalid or expired download link", { status: 401 });
|
|
99
|
+
}
|
|
100
|
+
const asset = await options.resolveAsset(grant);
|
|
101
|
+
if (!asset)
|
|
102
|
+
return new Response("Download not found", { status: 404 });
|
|
103
|
+
if (grant.maxDownloads !== undefined) {
|
|
104
|
+
if (!options.consumeGrant)
|
|
105
|
+
return new Response("Download delivery is not configured", { status: 503 });
|
|
106
|
+
if (!(await options.consumeGrant(grant)))
|
|
107
|
+
return new Response("Download limit reached", { status: 410 });
|
|
108
|
+
}
|
|
109
|
+
const headers = new Headers({ "content-type": asset.contentType ?? "application/octet-stream", "content-disposition": contentDisposition(asset.filename), "cache-control": "private, no-store" });
|
|
110
|
+
if (asset.contentLength !== undefined)
|
|
111
|
+
headers.set("content-length", String(asset.contentLength));
|
|
112
|
+
return new Response(request.method === "HEAD" ? null : asset.body, { status: 200, headers });
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Resolve assets from a private local directory without allowing path escape.
|
|
117
|
+
* This is intended for a small merchant deployment; object-storage adapters
|
|
118
|
+
* can implement the same DownloadHandlerOptions.resolveAsset contract.
|
|
119
|
+
*/
|
|
120
|
+
export function createLocalDownloadResolver(input) {
|
|
121
|
+
if (isAbsolute(input.rootDir)) {
|
|
122
|
+
// Keep the explicit check here so a relative working-directory mistake is
|
|
123
|
+
// caught during setup rather than after a buyer has paid.
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
throw new Error("rootDir must be an absolute path.");
|
|
127
|
+
}
|
|
128
|
+
const rootPromise = realpath(input.rootDir);
|
|
129
|
+
return async (grant) => {
|
|
130
|
+
const asset = input.assets[grant.assetId];
|
|
131
|
+
if (!asset || !asset.relativePath.trim() || isAbsolute(asset.relativePath))
|
|
132
|
+
return null;
|
|
133
|
+
const root = await rootPromise.catch(() => null);
|
|
134
|
+
if (!root)
|
|
135
|
+
return null;
|
|
136
|
+
const candidate = resolve(root, asset.relativePath);
|
|
137
|
+
const relation = relative(root, candidate);
|
|
138
|
+
if (relation.startsWith("..") || isAbsolute(relation))
|
|
139
|
+
return null;
|
|
140
|
+
try {
|
|
141
|
+
const actual = await realpath(candidate);
|
|
142
|
+
const actualRelation = relative(root, actual);
|
|
143
|
+
if (actualRelation.startsWith("..") || isAbsolute(actualRelation))
|
|
144
|
+
return null;
|
|
145
|
+
const metadata = await stat(actual);
|
|
146
|
+
if (!metadata.isFile())
|
|
147
|
+
return null;
|
|
148
|
+
return { body: await readFile(actual), filename: asset.filename, contentType: asset.contentType, contentLength: metadata.size };
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** Resolve a private object-storage URL without exposing it to the buyer. */
|
|
156
|
+
export function createRemoteDownloadResolver(input) {
|
|
157
|
+
const timeoutMs = input.timeoutMs ?? 10_000;
|
|
158
|
+
const maxBytes = input.maxBytes ?? 50_000_000;
|
|
159
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 100 || timeoutMs > 120_000)
|
|
160
|
+
throw new Error("timeoutMs must be an integer from 100 to 120000.");
|
|
161
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1_024 || maxBytes > 500_000_000)
|
|
162
|
+
throw new Error("maxBytes must be an integer from 1024 to 500000000.");
|
|
163
|
+
return async (grant) => {
|
|
164
|
+
const asset = await input.getAsset(grant);
|
|
165
|
+
if (!asset)
|
|
166
|
+
return null;
|
|
167
|
+
let url;
|
|
168
|
+
try {
|
|
169
|
+
url = await validateOutboundUrl(asset.url, { requireHttps: true });
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const controller = new AbortController();
|
|
175
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
176
|
+
try {
|
|
177
|
+
const response = await fetch(url, { redirect: "error", signal: controller.signal });
|
|
178
|
+
if (!response.ok)
|
|
179
|
+
return null;
|
|
180
|
+
const declaredLength = Number(response.headers.get("content-length"));
|
|
181
|
+
if (Number.isFinite(declaredLength) && declaredLength > maxBytes)
|
|
182
|
+
return null;
|
|
183
|
+
const body = await response.arrayBuffer();
|
|
184
|
+
if (body.byteLength > maxBytes)
|
|
185
|
+
return null;
|
|
186
|
+
return { body, filename: asset.filename, contentType: asset.contentType ?? response.headers.get("content-type") ?? undefined, contentLength: body.byteLength };
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
if (error instanceof DOMException && error.name === "AbortError")
|
|
190
|
+
return null;
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
clearTimeout(timer);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** Select the merchant's delivery handler from the product's declared kind. */
|
|
199
|
+
export function createFulfillmentRouter(handlers) {
|
|
200
|
+
return async (context) => {
|
|
201
|
+
const kind = context.product.kind ?? "api";
|
|
202
|
+
const handler = handlers[kind];
|
|
203
|
+
if (!handler)
|
|
204
|
+
throw new Error(`No fulfillment handler is configured for product kind '${kind}'.`);
|
|
205
|
+
return handler(context);
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/** Parse and validate a signed webhook body before applying business logic. */
|
|
209
|
+
export function parseFulfillmentWebhookEvent(body) {
|
|
210
|
+
let value;
|
|
211
|
+
try {
|
|
212
|
+
value = JSON.parse(body);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
throw new Error("Fulfillment webhook body must be valid JSON.");
|
|
216
|
+
}
|
|
217
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
218
|
+
throw new Error("Fulfillment webhook event must be an object.");
|
|
219
|
+
const event = value;
|
|
220
|
+
const types = ["license.issue", "license.revoke", "subscription.activate", "subscription.renew", "subscription.cancel"];
|
|
221
|
+
if (typeof event.id !== "string" || !event.id.trim() || event.id.length > 256)
|
|
222
|
+
throw new Error("Fulfillment webhook event id is required.");
|
|
223
|
+
if (typeof event.type !== "string" || !types.includes(event.type))
|
|
224
|
+
throw new Error("Unsupported fulfillment webhook event type.");
|
|
225
|
+
if (typeof event.orderId !== "string" || !event.orderId.trim() || event.orderId.length > 512)
|
|
226
|
+
throw new Error("Fulfillment webhook orderId is required.");
|
|
227
|
+
if (typeof event.productId !== "string" || !event.productId.trim() || event.productId.length > 512)
|
|
228
|
+
throw new Error("Fulfillment webhook productId is required.");
|
|
229
|
+
if (event.buyerId !== undefined && (typeof event.buyerId !== "string" || event.buyerId.length > 512))
|
|
230
|
+
throw new Error("Fulfillment webhook buyerId is invalid.");
|
|
231
|
+
if (event.paymentReference !== undefined && (typeof event.paymentReference !== "string" || event.paymentReference.length > 512))
|
|
232
|
+
throw new Error("Fulfillment webhook paymentReference is invalid.");
|
|
233
|
+
if (event.data !== undefined && (!event.data || typeof event.data !== "object" || Array.isArray(event.data)))
|
|
234
|
+
throw new Error("Fulfillment webhook data must be an object.");
|
|
235
|
+
return event;
|
|
236
|
+
}
|
|
237
|
+
/** Verify the timestamped HMAC headers received by a merchant webhook. */
|
|
238
|
+
export function verifyFulfillmentWebhookSignature(input) {
|
|
239
|
+
if (input.secret.length < 32 || !/^\d+$/.test(input.timestamp))
|
|
240
|
+
return false;
|
|
241
|
+
const timestamp = Number(input.timestamp);
|
|
242
|
+
const tolerance = input.toleranceSeconds ?? 300;
|
|
243
|
+
const now = input.now ?? Math.floor(Date.now() / 1000);
|
|
244
|
+
if (!Number.isSafeInteger(timestamp) || !Number.isSafeInteger(tolerance) || tolerance < 1 || Math.abs(now - timestamp) > tolerance)
|
|
245
|
+
return false;
|
|
246
|
+
const expected = signWebhook(input.secret, input.timestamp, input.body);
|
|
247
|
+
const received = Buffer.from(input.signature);
|
|
248
|
+
const calculated = Buffer.from(expected);
|
|
249
|
+
return received.length === calculated.length && timingSafeEqual(received, calculated);
|
|
250
|
+
}
|
|
251
|
+
function httpsUrl(value, field) {
|
|
252
|
+
let url;
|
|
253
|
+
try {
|
|
254
|
+
url = new URL(value);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
throw new Error(`${field} must be an absolute HTTPS URL.`);
|
|
258
|
+
}
|
|
259
|
+
if (url.protocol !== "https:")
|
|
260
|
+
throw new Error(`${field} must be an absolute HTTPS URL.`);
|
|
261
|
+
return url.toString();
|
|
262
|
+
}
|
|
263
|
+
/** Create a validated, buyer-safe delivery response for a merchant-signed URL. */
|
|
264
|
+
export function createDownloadDelivery(input) {
|
|
265
|
+
if (!input.filename.trim() || input.filename.length > 255)
|
|
266
|
+
throw new Error("filename must contain 1-255 characters.");
|
|
267
|
+
if (input.expiresAt !== undefined && (!Number.isSafeInteger(input.expiresAt) || input.expiresAt <= Math.floor(Date.now() / 1000))) {
|
|
268
|
+
throw new Error("expiresAt must be a future Unix timestamp.");
|
|
269
|
+
}
|
|
270
|
+
if (input.maxDownloads !== undefined && (!Number.isSafeInteger(input.maxDownloads) || input.maxDownloads < 1)) {
|
|
271
|
+
throw new Error("maxDownloads must be a positive integer.");
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
type: "digital_download",
|
|
275
|
+
downloadUrl: httpsUrl(input.downloadUrl, "downloadUrl"),
|
|
276
|
+
filename: input.filename,
|
|
277
|
+
...(input.expiresAt === undefined ? {} : { expiresAt: input.expiresAt }),
|
|
278
|
+
...(input.maxDownloads === undefined ? {} : { maxDownloads: input.maxDownloads }),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
export function createLicenseDelivery(input) {
|
|
282
|
+
if (!input.licenseKey && !input.activationUrl)
|
|
283
|
+
throw new Error("A licenseKey or activationUrl is required.");
|
|
284
|
+
return {
|
|
285
|
+
type: "license",
|
|
286
|
+
...(input.licenseKey === undefined ? {} : { licenseKey: input.licenseKey }),
|
|
287
|
+
...(input.activationUrl === undefined ? {} : { activationUrl: httpsUrl(input.activationUrl, "activationUrl") }),
|
|
288
|
+
...(input.metadata === undefined ? {} : { metadata: { ...input.metadata } }),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
export function createWebhookDelivery(reference) {
|
|
292
|
+
if (!reference.trim())
|
|
293
|
+
throw new Error("Webhook fulfillment reference is required.");
|
|
294
|
+
return { type: "webhook", reference };
|
|
295
|
+
}
|
|
296
|
+
function signWebhook(secret, timestamp, body) {
|
|
297
|
+
if (secret.length < 32)
|
|
298
|
+
throw new Error("fulfillment webhook secret must be at least 32 characters.");
|
|
299
|
+
return `sha256=${createHmac("sha256", secret).update(`${timestamp}.${body}`).digest("hex")}`;
|
|
300
|
+
}
|
|
301
|
+
async function sendFulfillmentWebhookAtUrl(input, url) {
|
|
302
|
+
const timeoutMs = input.timeoutMs ?? 8_000;
|
|
303
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 100 || timeoutMs > 120_000)
|
|
304
|
+
throw new Error("timeoutMs must be an integer from 100 to 120000.");
|
|
305
|
+
const body = JSON.stringify(input.event);
|
|
306
|
+
const timestamp = String(Math.floor(Date.now() / 1000));
|
|
307
|
+
const controller = new AbortController();
|
|
308
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
309
|
+
try {
|
|
310
|
+
const response = await fetch(url, {
|
|
311
|
+
method: "POST",
|
|
312
|
+
headers: {
|
|
313
|
+
"content-type": "application/json",
|
|
314
|
+
accept: "application/json",
|
|
315
|
+
"idempotency-key": input.event.id,
|
|
316
|
+
"x-seedhape-event": input.event.type,
|
|
317
|
+
"x-seedhape-timestamp": timestamp,
|
|
318
|
+
"x-seedhape-signature": signWebhook(input.secret, timestamp, body),
|
|
319
|
+
},
|
|
320
|
+
body,
|
|
321
|
+
signal: controller.signal,
|
|
322
|
+
redirect: "error",
|
|
323
|
+
});
|
|
324
|
+
const responseBody = await response.json().catch(() => null);
|
|
325
|
+
if (!response.ok)
|
|
326
|
+
throw new Error(`Fulfillment webhook rejected the event (${response.status}).`);
|
|
327
|
+
return { status: response.status, body: responseBody };
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
if (error instanceof DOMException && error.name === "AbortError")
|
|
331
|
+
throw new Error("Fulfillment webhook timed out.");
|
|
332
|
+
throw error;
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
clearTimeout(timer);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/** Send a signed, idempotent fulfillment event to a merchant-owned system. */
|
|
339
|
+
export async function sendFulfillmentWebhook(input) {
|
|
340
|
+
return sendFulfillmentWebhookAtUrl(input, await validateOutboundUrl(input.url, { requireHttps: true }));
|
|
341
|
+
}
|
|
342
|
+
/** Retry a fulfillment event without changing its idempotency key or signature payload. */
|
|
343
|
+
export async function sendFulfillmentWebhookWithRetry(input, retry = {}) {
|
|
344
|
+
const attempts = retry.attempts ?? 3;
|
|
345
|
+
const baseDelayMs = retry.baseDelayMs ?? 250;
|
|
346
|
+
const maxDelayMs = retry.maxDelayMs ?? 5_000;
|
|
347
|
+
if (!Number.isSafeInteger(attempts) || attempts < 1 || attempts > 10)
|
|
348
|
+
throw new Error("attempts must be an integer from 1 to 10.");
|
|
349
|
+
if (!Number.isSafeInteger(baseDelayMs) || baseDelayMs < 0 || baseDelayMs > 60_000)
|
|
350
|
+
throw new Error("baseDelayMs must be an integer from 0 to 60000.");
|
|
351
|
+
if (!Number.isSafeInteger(maxDelayMs) || maxDelayMs < baseDelayMs || maxDelayMs > 300_000)
|
|
352
|
+
throw new Error("maxDelayMs must be at least baseDelayMs and no more than 300000.");
|
|
353
|
+
const wait = retry.wait ?? ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
|
|
354
|
+
let lastError;
|
|
355
|
+
const url = await validateOutboundUrl(input.url, { requireHttps: true });
|
|
356
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
357
|
+
try {
|
|
358
|
+
return await sendFulfillmentWebhookAtUrl(input, url);
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
lastError = error;
|
|
362
|
+
if (attempt === attempts - 1)
|
|
363
|
+
break;
|
|
364
|
+
await wait(Math.min(maxDelayMs, baseDelayMs * 2 ** attempt));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
throw lastError instanceof Error ? lastError : new Error("Fulfillment webhook failed after retries.");
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=fulfillment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fulfillment.js","sourceRoot":"","sources":["../src/fulfillment.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,10 @@ export * from "./mcp.js";
|
|
|
3
3
|
export * from "./ap2.js";
|
|
4
4
|
export * from "./browser-paywall.js";
|
|
5
5
|
export * from "./commerce.js";
|
|
6
|
+
export * from "./protocol-catalog.js";
|
|
6
7
|
export * from "./mpp.js";
|
|
7
8
|
export * from "./stripe-mpp.js";
|
|
8
9
|
export * from "./seller.js";
|
|
10
|
+
export * from "./fulfillment.js";
|
|
11
|
+
export * from "./proxy.js";
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,10 @@ export * from "./mcp.js";
|
|
|
3
3
|
export * from "./ap2.js";
|
|
4
4
|
export * from "./browser-paywall.js";
|
|
5
5
|
export * from "./commerce.js";
|
|
6
|
+
export * from "./protocol-catalog.js";
|
|
6
7
|
export * from "./mpp.js";
|
|
7
8
|
export * from "./stripe-mpp.js";
|
|
8
9
|
export * from "./seller.js";
|
|
10
|
+
export * from "./fulfillment.js";
|
|
11
|
+
export * from "./proxy.js";
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -36,8 +36,8 @@ export interface Receipt {
|
|
|
36
36
|
asset: string;
|
|
37
37
|
network: string;
|
|
38
38
|
txHash?: string;
|
|
39
|
-
/**
|
|
40
|
-
|
|
39
|
+
/** fiat minorUnits at settlement time. */
|
|
40
|
+
fiatMinorUnits?: bigint;
|
|
41
41
|
fxRateScaled?: bigint;
|
|
42
42
|
settledAt: number;
|
|
43
43
|
/** Your own order/customer reference, if the caller supplied one. */
|
|
@@ -131,7 +131,7 @@ export interface PaywallConfig {
|
|
|
131
131
|
price: Money | PriceResolver;
|
|
132
132
|
facilitator: FacilitatorConfig;
|
|
133
133
|
receipts?: ReceiptSink;
|
|
134
|
-
/**
|
|
134
|
+
/** fiat per USDC scaled 1e8, for receipt valuation. */
|
|
135
135
|
fxRateScaled?: () => Promise<bigint>;
|
|
136
136
|
description?: string;
|
|
137
137
|
/** Bazaar/Sonar metadata. `description` remains supported as a shorthand. */
|