mppx 0.8.14 → 0.8.15
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/CHANGELOG.md +21 -0
- package/dist/cli/validate/payment.d.ts.map +1 -1
- package/dist/cli/validate/payment.js +18 -4
- package/dist/cli/validate/payment.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +93 -10
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/MethodChallenge.d.ts +2 -0
- package/dist/client/internal/MethodChallenge.d.ts.map +1 -1
- package/dist/client/internal/MethodChallenge.js +4 -0
- package/dist/client/internal/MethodChallenge.js.map +1 -1
- package/dist/client/internal/MethodResponse.d.ts +15 -0
- package/dist/client/internal/MethodResponse.d.ts.map +1 -1
- package/dist/client/internal/MethodResponse.js +10 -0
- package/dist/client/internal/MethodResponse.js.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/server/Charge.d.ts +9 -1
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Relay.d.ts +13 -4
- package/dist/tempo/server/Relay.d.ts.map +1 -1
- package/dist/tempo/server/Relay.js +4 -2
- package/dist/tempo/server/Relay.js.map +1 -1
- package/dist/tempo/server/SponsorBudget.d.ts.map +1 -1
- package/dist/tempo/server/SponsorBudget.js +7 -1
- package/dist/tempo/server/SponsorBudget.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/session/client/Session.d.ts.map +1 -1
- package/dist/tempo/session/client/Session.js +128 -14
- package/dist/tempo/session/client/Session.js.map +1 -1
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
- package/dist/tempo/session/client/SessionManager.js +62 -20
- package/dist/tempo/session/client/SessionManager.js.map +1 -1
- package/dist/tempo/session/client/Transports.d.ts +9 -1
- package/dist/tempo/session/client/Transports.d.ts.map +1 -1
- package/dist/tempo/session/client/Transports.js +36 -13
- package/dist/tempo/session/client/Transports.js.map +1 -1
- package/dist/tempo/session/server/Ws.d.ts.map +1 -1
- package/dist/tempo/session/server/Ws.js +3 -0
- package/dist/tempo/session/server/Ws.js.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +1 -829
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.js +14 -3
- package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
- package/dist/viem/Client.d.ts.map +1 -1
- package/dist/viem/Client.js +6 -1
- package/dist/viem/Client.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/validate/payment.ts +18 -4
- package/src/cli/validate.test.ts +16 -0
- package/src/client/internal/Fetch.test.ts +77 -0
- package/src/client/internal/Fetch.ts +113 -11
- package/src/client/internal/MethodChallenge.ts +5 -0
- package/src/client/internal/MethodResponse.ts +28 -0
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/Charge.ts +9 -1
- package/src/tempo/server/Relay.test.ts +156 -2
- package/src/tempo/server/Relay.ts +13 -4
- package/src/tempo/server/SponsorBudget.test.ts +29 -0
- package/src/tempo/server/SponsorBudget.ts +7 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/session/README.md +7 -0
- package/src/tempo/session/client/Session.test.ts +299 -33
- package/src/tempo/session/client/Session.ts +152 -16
- package/src/tempo/session/client/SessionManager.test.ts +216 -9
- package/src/tempo/session/client/SessionManager.ts +63 -17
- package/src/tempo/session/client/Transports.test.ts +22 -0
- package/src/tempo/session/client/Transports.ts +58 -22
- package/src/tempo/session/server/Session.test.ts +66 -4
- package/src/tempo/session/server/Ws.ts +3 -0
- package/src/tempo/subscription/KeyAuthorization.test.ts +70 -1
- package/src/tempo/subscription/KeyAuthorization.ts +14 -3
- package/src/viem/Client.test.ts +18 -1
- package/src/viem/Client.ts +7 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyAuthorization.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"KeyAuthorization.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,UAAU,CAAA;AAC9D,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9D,OAAO,KAAK,KAAK,OAAO,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,eAAe,CAAA;AASpD,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAIvF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjF;AAED,wBAAgB,2BAA2B,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,CAmB7E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,sBAAsB,CAAA;CACnC,GAAG,MAAM,CAsBT;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE;IACnD,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,YAAY,GAAG,qBAAqB,CAAC,CAAA;CACzF,QAeA;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,WAAW,CAAC;;;;GAW7D;AAED,mFAAmF;AACnF,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,WAAW,CAAC;;;;;;GAc7D;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,UAAU,EAAE;IACjE,SAAS,EAAE,qBAAqB,CAAA;IAChC,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE;YAAE,IAAI,EAAE,KAAK,MAAM,EAAE,CAAA;SAAE,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;KACrF,CAAA;IACD,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,IAAI,CACX,mBAAmB,EACnB,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,qBAAqB,CAC3F,CAAA;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAqBA;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,UAAU,EAAE;IAC7D,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,6BAA6B,CAAA;IACtC,OAAO,EAAE,mBAAmB,CAAA;CAC7B;;;iBAsBwB,OAAO;;;EAI/B"}
|
|
@@ -120,8 +120,14 @@ export async function signSubscriptionKeyAuthorization(parameters) {
|
|
|
120
120
|
const signature = await account.sign({
|
|
121
121
|
hash: KeyAuthorization.getSignPayload(authorization),
|
|
122
122
|
});
|
|
123
|
+
const signatureEnvelope = SignatureEnvelope.from(signature);
|
|
124
|
+
if (signatureEnvelope.type === 'keychain' || signatureEnvelope.type === 'multisig') {
|
|
125
|
+
throw new VerificationFailedError({
|
|
126
|
+
reason: 'keyAuthorization must use a primitive signature',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
123
129
|
return KeyAuthorization.from(authorization, {
|
|
124
|
-
signature
|
|
130
|
+
signature,
|
|
125
131
|
});
|
|
126
132
|
}
|
|
127
133
|
/**
|
|
@@ -173,13 +179,18 @@ function deserializeAuthorization(signature) {
|
|
|
173
179
|
try {
|
|
174
180
|
return KeyAuthorization.deserialize(signature);
|
|
175
181
|
}
|
|
176
|
-
catch {
|
|
182
|
+
catch (error) {
|
|
183
|
+
if (error instanceof KeyAuthorization.InvalidSignatureTypeError) {
|
|
184
|
+
throw new VerificationFailedError({
|
|
185
|
+
reason: 'keyAuthorization must use a primitive signature',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
177
188
|
throw new VerificationFailedError({ reason: 'invalid keyAuthorization payload' });
|
|
178
189
|
}
|
|
179
190
|
}
|
|
180
191
|
function getPrimitiveSignature(authorization) {
|
|
181
192
|
const signature = authorization.signature;
|
|
182
|
-
if (!signature
|
|
193
|
+
if (!signature) {
|
|
183
194
|
throw new VerificationFailedError({
|
|
184
195
|
reason: 'keyAuthorization must use a primitive signature',
|
|
185
196
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyAuthorization.js","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAgB,MAAM,MAAM,CAAA;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAQzD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAE5C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAA;AAEpD,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAM,6BAA6B,GAAG;IACpC,UAAU,EAAE,EAAE;IACd,GAAG,EAAE,MAAO;IACZ,IAAI,EAAE,OAAQ;CACkC,CAAA;AAMlD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,mBAAkC;IACzE,OAAO,mBAAmB,YAAY,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAA;AAClG,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,mBAAyB;IACnE,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,EAAE,CAAA;IAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,YAAY,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,4DAA4D;SACrE,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,GAAG,KAAK,CAAA;IACpC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,wEAAwE;SACjF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAG3C;IACC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,WAAW,GAAG,6BAA6B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACrE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAA;IACvD,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,yEAAyE;SAClF,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,uBAAuB,CAAC;YAChC,MAAM,EAAE,wEAAwE;SACjF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAGxC;IACC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;IAChD,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,kBAAkB,GAAG,2BAA2B,CACpD,wBAAwB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CACtD,CAAA;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAA;QAChF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,kBAAkB,IAAI,eAAe,EAAE,CAAC;YAC/E,MAAM,IAAI,uBAAuB,CAAC;gBAChC,MAAM,EAAE,mEAAmE;aAC5E,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CACnC,OAA4D;IAE5D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC/D,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAClE,OAAO;QACL;YACE,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,wBAAwB;YAClC,UAAU,EAAE,CAAC,SAAS,CAAC;SACxB;KACO,CAAA;AACZ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,8BAA8B,CAC5C,OAA4D;IAE5D,MAAM,CAAC,gBAAgB,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;IACzD,OAAO;QACL;YACE,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;YACtD,aAAa,EAAE;gBACb;oBACE,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;oBACnC,UAAU,EAAE,gBAAgB,CAAC,UAAU;iBACxC;aACF;SACF;KACO,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,UAUtD;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;IAC3D,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,SAAS,CAAA;IAExD,MAAM,aAAa,GAAG,2BAA2B,CAAC;QAChD,SAAS;QACT,OAAO;QACP,OAAO;KACR,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;QACnC,IAAI,EAAE,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC;KACrD,CAAC,CAAA;IACF,
|
|
1
|
+
{"version":3,"file":"KeyAuthorization.js","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/viem/Client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAA+C,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/viem/Client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAA+C,MAAM,MAAM,CAAA;AAI3F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAOxD,wBAAgB,WAAW,CACzB,UAAU,EAAE,WAAW,CAAC,UAAU,GAAG;IACnC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IACzB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,kCAAkC;IAClC,MAAM,CAAC,EAAE,CAAC;QAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,GAAG,SAAS,CAAA;CAC9D,GACA,CAAC,UAAU,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,KAAK,YAAY,CAAC,MAAM,CAAC,CAiExE;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAK,UAAU,GAAG;QAChB,6DAA6D;QAC7D,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAA;KACjG,CAAA;CACF"}
|
package/dist/viem/Client.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { createClient, createTransport, custom, http } from 'viem';
|
|
2
2
|
import { withFeePayer } from 'viem/tempo';
|
|
3
|
+
import { tempo as tempoMainnetChain, tempoModerato } from 'viem/tempo/chains';
|
|
4
|
+
const knownTempoChains = {
|
|
5
|
+
[tempoMainnetChain.id]: tempoMainnetChain,
|
|
6
|
+
[tempoModerato.id]: tempoModerato,
|
|
7
|
+
};
|
|
3
8
|
export function getResolver(parameters) {
|
|
4
9
|
const { chain, feePayerUrl, getClient, rpcUrl } = parameters;
|
|
5
10
|
if (getClient) {
|
|
@@ -53,7 +58,7 @@ export function getResolver(parameters) {
|
|
|
53
58
|
throw new Error(`No \`rpcUrl\` configured for \`chainId\` (${resolvedChainId}).`);
|
|
54
59
|
const transport = feePayerUrl ? withFeePayer(http(url), http(feePayerUrl)) : http(url);
|
|
55
60
|
return createClient({
|
|
56
|
-
chain: { ...chain, id: resolvedChainId },
|
|
61
|
+
chain: (knownTempoChains[resolvedChainId] ?? { ...chain, id: resolvedChainId }),
|
|
57
62
|
transport,
|
|
58
63
|
});
|
|
59
64
|
};
|
package/dist/viem/Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/viem/Client.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/viem/Client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mppx",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.15",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/wevm/mppx#readme",
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
"@stripe/stripe-js": "9.9.0",
|
|
171
171
|
"eventsource-parser": "3.1.0",
|
|
172
172
|
"incur": "^0.4.10",
|
|
173
|
-
"ox": "0.14.
|
|
173
|
+
"ox": "0.14.33",
|
|
174
174
|
"zod": "^4.4.3"
|
|
175
175
|
},
|
|
176
176
|
"repository": {
|
|
@@ -46,6 +46,20 @@ async function provisionAndPayTestnet(
|
|
|
46
46
|
await Promise.all(hashes.map((hash) => waitForTransactionReceipt(client, { hash })))
|
|
47
47
|
if (!silent) console.log(pc.dim(` Using wallet: ${account.address}`))
|
|
48
48
|
|
|
49
|
+
// The faucet tx receipt can land before the RPC's balance reads are
|
|
50
|
+
// consistent with it, so poll briefly for the funded balance to appear
|
|
51
|
+
// rather than racing straight into the charge.
|
|
52
|
+
const currency = (challenge.request as Record<string, unknown>).currency
|
|
53
|
+
if (typeof currency === 'string') {
|
|
54
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
55
|
+
const balance = await Actions.token
|
|
56
|
+
.getBalance(client, { account: account.address, token: currency as Address })
|
|
57
|
+
.catch(() => undefined)
|
|
58
|
+
if (balance && balance.amount > 0n) break
|
|
59
|
+
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
49
63
|
const methods = [...tempoMethods({ account })]
|
|
50
64
|
return { methods }
|
|
51
65
|
} catch (error) {
|
|
@@ -198,7 +212,7 @@ export async function validatePaymentFlow(
|
|
|
198
212
|
const mppx = Mppx.create({ methods: provisioned.methods, polyfill: false })
|
|
199
213
|
const cred = await mppx.createCredential(fakeResp)
|
|
200
214
|
results.push(check('Payment: submitted', 'ephemeral testnet wallet'))
|
|
201
|
-
|
|
215
|
+
await sendAndValidateResponse(
|
|
202
216
|
results,
|
|
203
217
|
url,
|
|
204
218
|
endpoint,
|
|
@@ -210,17 +224,17 @@ export async function validatePaymentFlow(
|
|
|
210
224
|
)
|
|
211
225
|
} catch (error) {
|
|
212
226
|
results.push(fail('Payment: create credential', (error as Error).message))
|
|
213
|
-
return results
|
|
214
227
|
}
|
|
215
228
|
} else {
|
|
216
229
|
results.push(
|
|
217
230
|
fail('Payment: auto-provision wallet', 'Failed to create and fund testnet wallet'),
|
|
218
231
|
)
|
|
219
|
-
return results
|
|
220
232
|
}
|
|
233
|
+
options.onResults?.(results)
|
|
221
234
|
}
|
|
222
235
|
|
|
223
|
-
// Try each challenge method (
|
|
236
|
+
// Try each remaining challenge method (tempo testnet already handled above),
|
|
237
|
+
// so validate exercises every payment method the server offers, same as mainnet.
|
|
224
238
|
const loaded = await loadConfig().catch(() => undefined)
|
|
225
239
|
const isInteractive = options.interactive
|
|
226
240
|
const stripeKey = process.env.MPPX_STRIPE_SECRET_KEY ?? resolveStripeKey(verbose)
|
package/src/cli/validate.test.ts
CHANGED
|
@@ -707,6 +707,22 @@ describe('validate: multi-challenge', () => {
|
|
|
707
707
|
const { output } = await serve(['validate', server.url])
|
|
708
708
|
expect(output).toContain('Amount is valid integer string (Got: 1.50)')
|
|
709
709
|
})
|
|
710
|
+
|
|
711
|
+
test("tempo doesn't block other testnet methods", { timeout: 15_000 }, async () => {
|
|
712
|
+
// makeChallenge() defaults to a tempo testnet challenge (chainId 42431),
|
|
713
|
+
// which takes the ephemeral-wallet fast path. That path used to return
|
|
714
|
+
// immediately, so a server offering evm/stripe alongside tempo would
|
|
715
|
+
// never have those methods exercised. It should now fall through and
|
|
716
|
+
// try them too, same as it does for tempo mainnet challenges.
|
|
717
|
+
const server = await multiChallengeServer([makeChallenge(), makeEvmChallenge()])
|
|
718
|
+
const { output } = await serve(['validate', server.url, '--outputJson', '--yes'])
|
|
719
|
+
const jsonStart = output.indexOf('{')
|
|
720
|
+
const jsonEnd = output.lastIndexOf('}')
|
|
721
|
+
const result = JSON.parse(output.slice(jsonStart, jsonEnd + 1))
|
|
722
|
+
const paymentLabels = result.endpoints[0].payment.map((r: { label: string }) => r.label)
|
|
723
|
+
expect(paymentLabels).toContain('Payment: submitted')
|
|
724
|
+
expect(paymentLabels.some((l: string) => l.includes('[evm]'))).toBe(true)
|
|
725
|
+
})
|
|
710
726
|
})
|
|
711
727
|
|
|
712
728
|
describe('validate: payment methods coverage', () => {
|
|
@@ -10,6 +10,7 @@ import { rpcUrl } from '~test/tempo/rpc.js'
|
|
|
10
10
|
import { accounts, asset, chain, client, http } from '~test/tempo/viem.js'
|
|
11
11
|
|
|
12
12
|
import * as Fetch from './Fetch.js'
|
|
13
|
+
import * as MethodChallenge from './MethodChallenge.js'
|
|
13
14
|
import * as MethodResponse from './MethodResponse.js'
|
|
14
15
|
|
|
15
16
|
const realm = 'api.example.com'
|
|
@@ -337,6 +338,23 @@ const noopMethod = {
|
|
|
337
338
|
createCredential: async () => 'credential',
|
|
338
339
|
} as any
|
|
339
340
|
|
|
341
|
+
function trackedMethod(settlements: MethodResponse.AttemptOutcome['status'][]) {
|
|
342
|
+
const method = {
|
|
343
|
+
...noopMethod,
|
|
344
|
+
async createCredential(parameters: object) {
|
|
345
|
+
const attempt = MethodResponse.getAttempt(parameters)
|
|
346
|
+
if (attempt)
|
|
347
|
+
attempt.settle = (outcome) => {
|
|
348
|
+
settlements.push(outcome.status)
|
|
349
|
+
return outcome.status !== 'pending'
|
|
350
|
+
}
|
|
351
|
+
return 'credential'
|
|
352
|
+
},
|
|
353
|
+
}
|
|
354
|
+
MethodChallenge.register(method, () => undefined)
|
|
355
|
+
return MethodResponse.register(method, ({ response }) => response)
|
|
356
|
+
}
|
|
357
|
+
|
|
340
358
|
const x402PaymentRequired = {
|
|
341
359
|
accepts: [
|
|
342
360
|
{
|
|
@@ -418,6 +436,30 @@ describe('Fetch.from: method responses', () => {
|
|
|
418
436
|
expect(handle).toHaveBeenCalledWith(expect.objectContaining({ credential: 'credential' }))
|
|
419
437
|
expect(paidResponse?.clone).not.toHaveBeenCalled()
|
|
420
438
|
})
|
|
439
|
+
|
|
440
|
+
test.each([
|
|
441
|
+
['a rejected paid response', () => new Response('rejected', { status: 500 }), 500, undefined],
|
|
442
|
+
['the final payment retry', () => make402(), 402, 1],
|
|
443
|
+
[
|
|
444
|
+
'the paid request throwing',
|
|
445
|
+
() => Promise.reject(new Error('paid request failed')),
|
|
446
|
+
undefined,
|
|
447
|
+
undefined,
|
|
448
|
+
],
|
|
449
|
+
])('settles credential state after %s', async (_name, paidRequest, status, maxPaymentRetries) => {
|
|
450
|
+
const settlements: MethodResponse.AttemptOutcome['status'][] = []
|
|
451
|
+
let calls = 0
|
|
452
|
+
const fetch = Fetch.from({
|
|
453
|
+
fetch: async () => (++calls === 1 ? make402() : paidRequest()),
|
|
454
|
+
maxPaymentRetries,
|
|
455
|
+
methods: [trackedMethod(settlements)],
|
|
456
|
+
})
|
|
457
|
+
|
|
458
|
+
const result = fetch('https://example.com/paid')
|
|
459
|
+
if (status) expect((await result).status).toBe(status)
|
|
460
|
+
else await expect(result).rejects.toThrow('paid request failed')
|
|
461
|
+
expect(settlements).toEqual(['rejected'])
|
|
462
|
+
})
|
|
421
463
|
})
|
|
422
464
|
|
|
423
465
|
describe('Fetch.from: init passthrough (non-402)', () => {
|
|
@@ -1873,6 +1915,41 @@ describe('Fetch.from: 402 retry path', () => {
|
|
|
1873
1915
|
).toEqual(['credential-first', 'credential-second', 'credential-third'])
|
|
1874
1916
|
})
|
|
1875
1917
|
|
|
1918
|
+
test('invalidates a prepared credential across a generic challenge', async () => {
|
|
1919
|
+
const firstCredential = vi.fn(async () => 'first')
|
|
1920
|
+
const first = { ...noopMethod, name: 'first', createCredential: firstCredential }
|
|
1921
|
+
const second = { ...noopMethod, name: 'second', createCredential: async () => 'second' }
|
|
1922
|
+
MethodChallenge.register(first, () => undefined)
|
|
1923
|
+
const responses = [
|
|
1924
|
+
make402({ id: 'first', method: 'first' }),
|
|
1925
|
+
make402({ id: 'second', method: 'second' }),
|
|
1926
|
+
make402({ id: 'first', method: 'first' }),
|
|
1927
|
+
new Response('OK'),
|
|
1928
|
+
]
|
|
1929
|
+
const mockFetch = vi.fn(async () => responses.shift()!)
|
|
1930
|
+
const fetch = Fetch.from({ fetch: mockFetch, methods: [first, second] })
|
|
1931
|
+
|
|
1932
|
+
expect((await fetch('https://example.com/api')).status).toBe(200)
|
|
1933
|
+
expect(firstCredential).toHaveBeenCalledTimes(2)
|
|
1934
|
+
})
|
|
1935
|
+
|
|
1936
|
+
test('invalidates a prepared credential after an explicit context', async () => {
|
|
1937
|
+
const createCredential = vi.fn(async () => 'credential')
|
|
1938
|
+
const method = { ...noopMethod, createCredential }
|
|
1939
|
+
MethodChallenge.register(method, () => undefined)
|
|
1940
|
+
let challenges = 0
|
|
1941
|
+
const mockFetch = vi.fn(async () => (++challenges <= 3 ? make402() : new Response('OK')))
|
|
1942
|
+
const fetch = Fetch.from({
|
|
1943
|
+
fetch: mockFetch as typeof globalThis.fetch,
|
|
1944
|
+
methods: [method],
|
|
1945
|
+
onChallenge: async (_challenge, { createCredential: create }) =>
|
|
1946
|
+
challenges === 2 ? create({ override: true } as never) : undefined,
|
|
1947
|
+
})
|
|
1948
|
+
|
|
1949
|
+
expect((await fetch('https://example.com/api')).status).toBe(200)
|
|
1950
|
+
expect(createCredential).toHaveBeenCalledTimes(3)
|
|
1951
|
+
})
|
|
1952
|
+
|
|
1876
1953
|
test('caps repeated 402 retries at three', async () => {
|
|
1877
1954
|
let callCount = 0
|
|
1878
1955
|
const createCredential = vi.fn(async () => 'credential')
|
|
@@ -19,9 +19,33 @@ type WrappedFetch = typeof globalThis.fetch & {
|
|
|
19
19
|
[MPPX_FETCH_WRAPPER]?: typeof globalThis.fetch
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
/** Credential state retained between payment retries until its method settles it. */
|
|
23
|
+
type PreparedCredential = {
|
|
24
|
+
/** Method-owned preparation and settlement hooks. */
|
|
25
|
+
attempt: MethodResponse.Attempt
|
|
26
|
+
/** Serialized challenge used to recognize the same retry. */
|
|
27
|
+
key?: string | undefined
|
|
28
|
+
/** Method that prepared the credential. */
|
|
29
|
+
method: Method.AnyClient
|
|
30
|
+
/** Memoized credential reused for the same retry. */
|
|
31
|
+
promise: Promise<string>
|
|
32
|
+
}
|
|
33
|
+
|
|
22
34
|
let originalFetch: typeof globalThis.fetch | undefined
|
|
23
35
|
const eventObserverChecks = new WeakMap<object, (name: keyof ClientEventMap) => boolean>()
|
|
24
36
|
|
|
37
|
+
async function settleAttempt(
|
|
38
|
+
prepared: PreparedCredential | undefined,
|
|
39
|
+
outcome: MethodResponse.AttemptOutcome,
|
|
40
|
+
): Promise<boolean> {
|
|
41
|
+
const settle = prepared?.attempt.settle
|
|
42
|
+
if (!settle) return outcome.status !== 'pending'
|
|
43
|
+
prepared.attempt.settle = undefined
|
|
44
|
+
const settled = await settle(outcome)
|
|
45
|
+
if (!settled) prepared.attempt.settle = settle
|
|
46
|
+
return settled
|
|
47
|
+
}
|
|
48
|
+
|
|
25
49
|
export type ClientEventMap<
|
|
26
50
|
methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[],
|
|
27
51
|
response = Response,
|
|
@@ -210,6 +234,7 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
210
234
|
let challenge: Challenge.Challenge | undefined
|
|
211
235
|
let challenges: readonly Challenge.Challenge[] | undefined
|
|
212
236
|
let mi: methods[number] | undefined
|
|
237
|
+
let preparedCredential: PreparedCredential | undefined
|
|
213
238
|
|
|
214
239
|
try {
|
|
215
240
|
for (let retry = 0; retry < maxPaymentRetries; retry++) {
|
|
@@ -229,6 +254,11 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
229
254
|
)
|
|
230
255
|
const selected = orderedCandidates[0]
|
|
231
256
|
if (!selected) {
|
|
257
|
+
await settleAttempt(preparedCredential, {
|
|
258
|
+
challenges,
|
|
259
|
+
response,
|
|
260
|
+
status: 'rejected',
|
|
261
|
+
})
|
|
232
262
|
// A post-payment 402 with no actionable challenge (e.g. rejected credential)
|
|
233
263
|
// is the server's final answer, not a new challenge round.
|
|
234
264
|
if (retry > 0) return response
|
|
@@ -247,16 +277,54 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
247
277
|
initialRequest.input,
|
|
248
278
|
initialRequest.input,
|
|
249
279
|
)
|
|
280
|
+
const previousCredential = preparedCredential
|
|
281
|
+
const key = Challenge.serialize(selectedChallenge)
|
|
282
|
+
const sameAttempt =
|
|
283
|
+
previousCredential?.method === selected.method && previousCredential?.key === key
|
|
284
|
+
let canReusePrevious = false
|
|
285
|
+
if (previousCredential) {
|
|
286
|
+
const settled = await settleAttempt(previousCredential, {
|
|
287
|
+
challenges,
|
|
288
|
+
response,
|
|
289
|
+
status: sameAttempt ? 'pending' : 'rejected',
|
|
290
|
+
})
|
|
291
|
+
canReusePrevious = sameAttempt && !settled
|
|
292
|
+
}
|
|
293
|
+
preparedCredential = canReusePrevious ? previousCredential : undefined
|
|
250
294
|
const createCredential = memoizeCreateCredential(
|
|
251
295
|
async (overrideContext?: AnyContextFor<methods>) => {
|
|
296
|
+
if (overrideContext === undefined && canReusePrevious && previousCredential) {
|
|
297
|
+
return previousCredential.promise
|
|
298
|
+
}
|
|
299
|
+
if (canReusePrevious && previousCredential) {
|
|
300
|
+
await settleAttempt(previousCredential, { status: 'rejected' })
|
|
301
|
+
preparedCredential = undefined
|
|
302
|
+
}
|
|
303
|
+
|
|
252
304
|
const credentialContext = overrideContext ?? context
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
305
|
+
if (!MethodChallenge.has(selected.method))
|
|
306
|
+
return resolveCredential(selectedChallenge, selected.method, credentialContext)
|
|
307
|
+
const attempt: MethodResponse.Attempt = {
|
|
308
|
+
prepare: () =>
|
|
309
|
+
MethodChallenge.handle(selected.method, {
|
|
310
|
+
challenge: selectedChallenge,
|
|
311
|
+
context: credentialContext,
|
|
312
|
+
fetch: baseFetch,
|
|
313
|
+
input: paymentInput,
|
|
314
|
+
}),
|
|
315
|
+
}
|
|
316
|
+
const promise = attempt
|
|
317
|
+
.prepare()
|
|
318
|
+
.then(() =>
|
|
319
|
+
resolveCredential(selectedChallenge, selected.method, credentialContext, attempt),
|
|
320
|
+
)
|
|
321
|
+
preparedCredential = {
|
|
322
|
+
attempt,
|
|
323
|
+
key: overrideContext === undefined ? key : undefined,
|
|
324
|
+
method: selected.method,
|
|
325
|
+
promise,
|
|
326
|
+
}
|
|
327
|
+
return promise
|
|
260
328
|
},
|
|
261
329
|
)
|
|
262
330
|
const eventCredential = await events.emit(
|
|
@@ -279,6 +347,11 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
279
347
|
})
|
|
280
348
|
: undefined)
|
|
281
349
|
const credential = onChallengeCredential ?? (await createCredential())
|
|
350
|
+
const prepared = preparedCredential
|
|
351
|
+
if (prepared && (await prepared.promise.catch(() => undefined)) !== credential) {
|
|
352
|
+
await settleAttempt(prepared, { status: 'rejected' })
|
|
353
|
+
preparedCredential = undefined
|
|
354
|
+
}
|
|
282
355
|
validateCredentialHeaderValue(credential)
|
|
283
356
|
await events.emit(
|
|
284
357
|
'credential.created',
|
|
@@ -303,6 +376,17 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
303
376
|
{ challenge: selectedChallenge },
|
|
304
377
|
),
|
|
305
378
|
)
|
|
379
|
+
const paymentRequired = await transport.isPaymentRequired(
|
|
380
|
+
response,
|
|
381
|
+
transportRequest as never,
|
|
382
|
+
)
|
|
383
|
+
if (!paymentRequired) {
|
|
384
|
+
await settleAttempt(prepared, {
|
|
385
|
+
response,
|
|
386
|
+
status: response.ok ? 'accepted' : 'rejected',
|
|
387
|
+
})
|
|
388
|
+
preparedCredential = undefined
|
|
389
|
+
}
|
|
306
390
|
// Cloning an unobserved stream would tee and buffer it indefinitely.
|
|
307
391
|
if (response.ok && hasEventObservers(events, 'payment.response'))
|
|
308
392
|
await events.emit(
|
|
@@ -316,7 +400,7 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
316
400
|
response,
|
|
317
401
|
}),
|
|
318
402
|
)
|
|
319
|
-
if (!
|
|
403
|
+
if (!paymentRequired) {
|
|
320
404
|
if (!response.ok) return response
|
|
321
405
|
return MethodResponse.handle(selected.method, {
|
|
322
406
|
challenge: selectedChallenge,
|
|
@@ -334,8 +418,24 @@ export function from<const methods extends readonly Method.AnyClient[]>(
|
|
|
334
418
|
})
|
|
335
419
|
}
|
|
336
420
|
}
|
|
421
|
+
challenges = undefined
|
|
422
|
+
try {
|
|
423
|
+
challenges = transport.getChallenges
|
|
424
|
+
? await transport.getChallenges(response, transportRequest as never)
|
|
425
|
+
: [await transport.getChallenge(response, transportRequest as never)]
|
|
426
|
+
} catch {}
|
|
427
|
+
await settleAttempt(preparedCredential, {
|
|
428
|
+
challenges,
|
|
429
|
+
response,
|
|
430
|
+
status: 'rejected',
|
|
431
|
+
})
|
|
337
432
|
return response
|
|
338
433
|
} catch (error) {
|
|
434
|
+
await settleAttempt(preparedCredential, {
|
|
435
|
+
challenges,
|
|
436
|
+
response,
|
|
437
|
+
status: 'rejected',
|
|
438
|
+
})
|
|
339
439
|
await events.emit(
|
|
340
440
|
'payment.failed',
|
|
341
441
|
createPaymentFailedPayload({
|
|
@@ -884,11 +984,13 @@ async function resolveCredential(
|
|
|
884
984
|
challenge: Challenge.Challenge,
|
|
885
985
|
mi: Method.AnyClient,
|
|
886
986
|
context: unknown,
|
|
987
|
+
attempt?: MethodResponse.Attempt | undefined,
|
|
887
988
|
): Promise<string> {
|
|
888
989
|
const parsedContext = mi.context && context !== undefined ? mi.context.parse(context) : undefined
|
|
889
|
-
|
|
890
|
-
parsedContext !== undefined ? { challenge, context: parsedContext } :
|
|
891
|
-
)
|
|
990
|
+
const parameters =
|
|
991
|
+
parsedContext !== undefined ? { challenge, context: parsedContext } : { challenge }
|
|
992
|
+
if (attempt) MethodResponse.attachAttempt(mi, parameters, attempt)
|
|
993
|
+
return mi.createCredential(parameters as never)
|
|
892
994
|
}
|
|
893
995
|
|
|
894
996
|
function resolvePaymentPreferences<methods extends readonly Method.AnyClient[]>(
|
|
@@ -24,6 +24,11 @@ export function register<const method extends Method.AnyClient>(
|
|
|
24
24
|
return method
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/** Returns whether a method registered pre-credential work. */
|
|
28
|
+
export function has(method: Method.AnyClient): boolean {
|
|
29
|
+
return handlers.has(method)
|
|
30
|
+
}
|
|
31
|
+
|
|
27
32
|
/** Runs method-specific work before creating a challenge credential. */
|
|
28
33
|
export function handle(method: Method.AnyClient, parameters: HandlerParameters): Promise<void> {
|
|
29
34
|
return Promise.resolve(handlers.get(method)?.(parameters))
|
|
@@ -3,6 +3,20 @@ import type { MaybePromise } from '../../internal/types.js'
|
|
|
3
3
|
import type * as Method from '../../Method.js'
|
|
4
4
|
|
|
5
5
|
const handlers = new WeakMap<Method.AnyClient, Handler>()
|
|
6
|
+
const attempts = new WeakMap<object, Attempt>()
|
|
7
|
+
|
|
8
|
+
export type AttemptOutcome = {
|
|
9
|
+
challenges?: readonly Challenge.Challenge[] | undefined
|
|
10
|
+
response?: Response | undefined
|
|
11
|
+
status: 'accepted' | 'pending' | 'rejected'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type Attempt = {
|
|
15
|
+
/** Re-runs method preparation when serialized state changed before signing. */
|
|
16
|
+
prepare: () => Promise<void>
|
|
17
|
+
/** Settles state created for one credential attempt. */
|
|
18
|
+
settle?: ((outcome: AttemptOutcome) => MaybePromise<boolean>) | undefined
|
|
19
|
+
}
|
|
6
20
|
|
|
7
21
|
/** Inputs available when a client method handles a successful paid response. */
|
|
8
22
|
export type HandlerParameters = {
|
|
@@ -33,6 +47,20 @@ export function unregister(method: Method.AnyClient): void {
|
|
|
33
47
|
handlers.delete(method)
|
|
34
48
|
}
|
|
35
49
|
|
|
50
|
+
/** Adds response lifecycle state to internal credential parameters. */
|
|
51
|
+
export function attachAttempt(
|
|
52
|
+
method: Method.AnyClient,
|
|
53
|
+
parameters: object,
|
|
54
|
+
attempt: Attempt,
|
|
55
|
+
): void {
|
|
56
|
+
if (handlers.has(method)) attempts.set(parameters, attempt)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Reads response lifecycle state when Fetch owns this credential. */
|
|
60
|
+
export function getAttempt(parameters: object): Attempt | undefined {
|
|
61
|
+
return attempts.get(parameters)
|
|
62
|
+
}
|
|
63
|
+
|
|
36
64
|
/** Lets the selected client method handle a successful paid response. */
|
|
37
65
|
export function handle(method: Method.AnyClient, parameters: HandlerParameters): Promise<Response> {
|
|
38
66
|
return Promise.resolve(handlers.get(method)?.(parameters) ?? parameters.response)
|