Skip to content

Commit 028354e

Browse files
committed
Recognize x402 extra expiry metadata
1 parent dc5ec3a commit 028354e

4 files changed

Lines changed: 36 additions & 3 deletions

File tree

bin/x402-surface-check.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,7 @@ function hasFreshnessMetadata(challenge, accept) {
10101010
accept?.expiresAt,
10111011
accept?.validBefore,
10121012
accept?.extra?.expires,
1013+
accept?.extra?.expiresAt,
10131014
accept?.extra?.validBefore,
10141015
].some(value => value !== undefined && value !== null && value !== '')
10151016
}

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "x402-surface-check",
3-
"version": "0.2.42",
3+
"version": "0.2.43",
44
"description": "No-payment x402 public-surface checker for manifests, OpenAPI specs, and HTTP 402 challenges.",
55
"type": "module",
66
"bin": {

test/smoke.mjs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,27 @@ data: ${JSON.stringify({
734734
return
735735
}
736736

737+
if (request.url === '/extra-expires-at') {
738+
response.statusCode = 402
739+
response.setHeader('content-type', 'application/json')
740+
response.setHeader('access-control-allow-origin', '*')
741+
response.end(JSON.stringify({
742+
x402Version: 2,
743+
error: 'Payment required',
744+
resource: { url: `${serverUrl}/extra-expires-at` },
745+
accepts: [{
746+
scheme: 'exact',
747+
network: 'eip155:8453',
748+
amount: '10000',
749+
asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
750+
payTo: '0x549c82e6bfc54bdae9a2073744cbc2af5d1fc6d1',
751+
resource: `${serverUrl}/extra-expires-at`,
752+
extra: { expiresAt: Date.now() + 60000 },
753+
}],
754+
}))
755+
return
756+
}
757+
737758
if (request.url?.startsWith('/route-paid')) {
738759
response.statusCode = 402
739760
response.setHeader('content-type', 'application/json')
@@ -1692,6 +1713,17 @@ try {
16921713
assert.doesNotMatch(legacy.stdout, /challenge is missing amount/)
16931714
assert.doesNotMatch(legacy.stdout, /did not expose Cache-Control/)
16941715

1716+
const extraExpiresAt = await execFileAsync('node', [
1717+
'bin/x402-surface-check.mjs',
1718+
'--endpoint',
1719+
'--method',
1720+
'GET',
1721+
`${serverUrl}/extra-expires-at`,
1722+
], { cwd: new URL('..', import.meta.url) })
1723+
1724+
assert.match(extraExpiresAt.stdout, /extra-expires-at/)
1725+
assert.doesNotMatch(extraExpiresAt.stdout, /does not expose timeout\/expiry metadata/)
1726+
16951727
const strictCache = await execFileAsync('node', [
16961728
'bin/x402-surface-check.mjs',
16971729
'--endpoint',

0 commit comments

Comments
 (0)