@spendctl/adapter-mpp 0.0.0-stage → 0.2.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.
@@ -0,0 +1,50 @@
1
+ import { type AssetConfig, type PaymentOption } from "@spendctl/core";
2
+ import { Challenge } from "mppx";
3
+ /**
4
+ * MPP ("Payment" HTTP authentication scheme, https://mpp.dev) adapter.
5
+ *
6
+ * Parsing uses mppx's own challenge parser; spendctl only normalises each
7
+ * challenge into a PaymentOption for the policy engine. Creating the credential
8
+ * is method-specific (Tempo transaction, Stripe Shared Payment Token, ...), so it
9
+ * is delegated to a pluggable MppCredentialProvider.
10
+ */
11
+ export type MppChallengeData = Challenge.Challenge;
12
+ export interface MppChallenge {
13
+ protocol: "mpp";
14
+ version: 1;
15
+ challenges: MppChallengeData[];
16
+ options: PaymentOption[];
17
+ }
18
+ /** Creates the credential string (`Payment <base64url>`) for one challenge. */
19
+ export interface MppCredentialProvider {
20
+ /** Payment methods this provider can pay, e.g. `["tempo"]` or `["stripe"]`. */
21
+ methods: readonly string[];
22
+ createCredential(challenge: MppChallengeData, response: Response): Promise<string>;
23
+ }
24
+ export declare function toOptions(challenges: MppChallengeData[], providers?: MppCredentialProvider[], extraAssets?: AssetConfig[]): PaymentOption[];
25
+ /** Detects `WWW-Authenticate: Payment ...` challenges on a 402. */
26
+ export declare function parseMpp(headers: Headers, providers?: MppCredentialProvider[], extraAssets?: AssetConfig[]): MppChallenge | undefined;
27
+ /** Builds the request header carrying the credential for the chosen challenge. */
28
+ export declare function signMpp(parsed: MppChallenge, option: PaymentOption, providers: MppCredentialProvider[], response: Response): Promise<{
29
+ headers: Record<string, string>;
30
+ }>;
31
+ export interface MppReceipt {
32
+ success: boolean;
33
+ method?: string;
34
+ reference?: string;
35
+ raw: unknown;
36
+ }
37
+ /** Reads the `Payment-Receipt` header, if any. */
38
+ export declare function parseMppReceipt(response: Response): MppReceipt | undefined;
39
+ /**
40
+ * Credential provider backed by an mppx client (`Mppx.create({ methods, polyfill: false })`).
41
+ * Pass the same method clients you would give mppx, e.g. `tempo({ account })` or `stripe({ ... })`.
42
+ */
43
+ export declare function mppxProvider(mppx: {
44
+ createCredential(response: Response, context?: undefined, options?: {
45
+ orderChallenges?: (challenges: readonly MppChallengeData[]) => readonly MppChallengeData[];
46
+ }): Promise<string>;
47
+ }, methods: readonly string[]): MppCredentialProvider;
48
+ /** Request headers through which a client attaches an MPP credential. */
49
+ export declare function hasMppCredential(headers: Headers): boolean;
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAqB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAW,MAAM,MAAM,CAAC;AAE1C;;;;;;;GAOG;AAEH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,KAAK,CAAC;IAChB,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpF;AAkCD,wBAAgB,SAAS,CACvB,UAAU,EAAE,gBAAgB,EAAE,EAC9B,SAAS,GAAE,qBAAqB,EAAO,EACvC,WAAW,GAAE,WAAW,EAAO,GAC9B,aAAa,EAAE,CAoCjB;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,SAAS,GAAE,qBAAqB,EAAO,EACvC,WAAW,GAAE,WAAW,EAAO,GAC9B,YAAY,GAAG,SAAS,CAW1B;AAED,kFAAkF;AAClF,wBAAsB,OAAO,CAC3B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,qBAAqB,EAAE,EAClC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAQ9C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAa1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IACJ,gBAAgB,CACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,SAAS,EACnB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,KAAK,SAAS,gBAAgB,EAAE,CAAA;KAAE,GACvG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB,EACD,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,qBAAqB,CAQvB;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI1D"}
package/dist/index.js ADDED
@@ -0,0 +1,122 @@
1
+ import { atomicToUsdMicros } from "@spendctl/core";
2
+ import { Challenge, Receipt } from "mppx";
3
+ /** ISO-4217 minor-unit exponents for fiat currencies MPP methods may quote. */
4
+ const FIAT_DECIMALS = { usd: 2, eur: 2, gbp: 2, jpy: 0 };
5
+ function priceOf(method, currency, amount, extra) {
6
+ const custom = extra.find((asset) => (asset.network === method || asset.network === `mpp:${method}`) &&
7
+ asset.asset.toLowerCase() === currency.toLowerCase());
8
+ if (custom) {
9
+ return {
10
+ decimals: custom.decimals,
11
+ symbol: custom.symbol,
12
+ usdMicros: custom.usdPegged ? atomicToUsdMicros(amount, custom.decimals) : undefined,
13
+ };
14
+ }
15
+ const fiat = FIAT_DECIMALS[currency.toLowerCase()];
16
+ if (fiat !== undefined) {
17
+ return {
18
+ decimals: fiat,
19
+ symbol: currency.toUpperCase(),
20
+ usdMicros: currency.toLowerCase() === "usd" ? atomicToUsdMicros(amount, fiat) : undefined,
21
+ };
22
+ }
23
+ return {};
24
+ }
25
+ export function toOptions(challenges, providers = [], extraAssets = []) {
26
+ return challenges.map((challenge, index) => {
27
+ const request = challenge.request;
28
+ const amount = String(request.amount ?? "");
29
+ const currency = String(request.currency ?? "");
30
+ const recipient = String(request.recipient ?? request.methodDetails?.networkId ?? "");
31
+ const validAmount = /^\d+$/.test(amount);
32
+ const price = validAmount ? priceOf(challenge.method, currency, amount, extraAssets) : {};
33
+ let reason;
34
+ if (!validAmount)
35
+ reason = `MPP amount ${JSON.stringify(amount)} is not an integer`;
36
+ else if (challenge.intent !== "charge")
37
+ reason = `MPP intent "${challenge.intent}" is not supported yet (only "charge")`;
38
+ else if (!providers.some((provider) => provider.methods.includes(challenge.method))) {
39
+ reason = `no MPP credential provider configured for method "${challenge.method}"`;
40
+ }
41
+ const expiresIn = challenge.expires ? Math.round((Date.parse(challenge.expires) - Date.now()) / 1000) : undefined;
42
+ return {
43
+ protocol: "mpp",
44
+ protocolVersion: 1,
45
+ scheme: challenge.intent,
46
+ method: challenge.method,
47
+ network: challenge.method,
48
+ asset: currency,
49
+ assetSymbol: price.symbol,
50
+ decimals: price.decimals,
51
+ amountAtomic: validAmount ? amount : "0",
52
+ usdMicros: price.usdMicros,
53
+ payTo: recipient,
54
+ maxTimeoutSeconds: expiresIn !== undefined && expiresIn > 0 ? expiresIn : undefined,
55
+ index,
56
+ signable: reason === undefined,
57
+ unsignableReason: reason,
58
+ };
59
+ });
60
+ }
61
+ /** Detects `WWW-Authenticate: Payment ...` challenges on a 402. */
62
+ export function parseMpp(headers, providers = [], extraAssets = []) {
63
+ const header = headers.get("www-authenticate");
64
+ if (!header || !/(^|,\s*)Payment\s/i.test(header))
65
+ return undefined;
66
+ let challenges;
67
+ try {
68
+ challenges = Challenge.deserializeList(header);
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ if (challenges.length === 0)
74
+ return undefined;
75
+ return { protocol: "mpp", version: 1, challenges, options: toOptions(challenges, providers, extraAssets) };
76
+ }
77
+ /** Builds the request header carrying the credential for the chosen challenge. */
78
+ export async function signMpp(parsed, option, providers, response) {
79
+ const challenge = parsed.challenges[option.index];
80
+ if (!challenge)
81
+ throw new Error(`MPP challenge ${option.index} does not exist`);
82
+ const provider = providers.find((candidate) => candidate.methods.includes(challenge.method));
83
+ if (!provider)
84
+ throw new Error(`No MPP credential provider for method ${challenge.method}`);
85
+ const credential = await provider.createCredential(challenge, response);
86
+ const value = credential.startsWith("Payment ") ? credential : `Payment ${credential}`;
87
+ return { headers: { [Challenge.credentialHeader(challenge)]: value } };
88
+ }
89
+ /** Reads the `Payment-Receipt` header, if any. */
90
+ export function parseMppReceipt(response) {
91
+ if (!response.headers.get("payment-receipt"))
92
+ return undefined;
93
+ try {
94
+ const receipt = Receipt.fromResponse(response);
95
+ return {
96
+ success: receipt.status === "success",
97
+ method: receipt.method,
98
+ reference: receipt.reference,
99
+ raw: receipt,
100
+ };
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ /**
107
+ * Credential provider backed by an mppx client (`Mppx.create({ methods, polyfill: false })`).
108
+ * Pass the same method clients you would give mppx, e.g. `tempo({ account })` or `stripe({ ... })`.
109
+ */
110
+ export function mppxProvider(mppx, methods) {
111
+ return {
112
+ methods,
113
+ createCredential: (challenge, response) => mppx.createCredential(response.clone(), undefined, {
114
+ orderChallenges: (challenges) => challenges.filter((candidate) => candidate.id === challenge.id),
115
+ }),
116
+ };
117
+ }
118
+ /** Request headers through which a client attaches an MPP credential. */
119
+ export function hasMppCredential(headers) {
120
+ return [headers.get("authorization"), headers.get("payment-authorization")].some((value) => /^Payment\s/i.test(value ?? ""));
121
+ }
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,29 @@
1
1
  {
2
2
  "name": "@spendctl/adapter-mpp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Machine Payments Protocol (MPP) adapter for spendctl: parses Payment challenges and delegates credentials to mppx.",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "THIRD_PARTY_NOTICES"
19
+ ],
20
+ "engines": {
21
+ "node": ">=22.13"
22
+ },
23
+ "dependencies": {
24
+ "mppx": "0.15.0",
25
+ "@spendctl/core": "0.2.0"
26
+ },
27
+ "homepage": "https://spendctl.dev",
28
+ "scripts": {}
6
29
  }