mppx 0.8.11 → 0.8.13
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 +25 -0
- package/README.md +16 -1
- package/dist/cli/account.d.ts +88 -0
- package/dist/cli/account.d.ts.map +1 -1
- package/dist/cli/account.js +39 -9
- package/dist/cli/account.js.map +1 -1
- package/dist/cli/cli.d.ts +2 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +59 -2
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/sessions/Manager.d.ts +31 -0
- package/dist/cli/sessions/Manager.d.ts.map +1 -0
- package/dist/cli/sessions/Manager.js +56 -0
- package/dist/cli/sessions/Manager.js.map +1 -0
- package/dist/cli/sessions/commands.d.ts +36 -0
- package/dist/cli/sessions/commands.d.ts.map +1 -0
- package/dist/cli/sessions/commands.js +407 -0
- package/dist/cli/sessions/commands.js.map +1 -0
- package/dist/cli/sessions/request.d.ts +35 -0
- package/dist/cli/sessions/request.d.ts.map +1 -0
- package/dist/cli/sessions/request.js +271 -0
- package/dist/cli/sessions/request.js.map +1 -0
- package/dist/cli/sessions/store.d.ts +134 -0
- package/dist/cli/sessions/store.d.ts.map +1 -0
- package/dist/cli/sessions/store.js +723 -0
- package/dist/cli/sessions/store.js.map +1 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +12 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/cli/validate/index.d.ts.map +1 -1
- package/dist/cli/validate/index.js +12 -6
- package/dist/cli/validate/index.js.map +1 -1
- package/dist/cli/validate/messages.d.ts +2 -0
- package/dist/cli/validate/messages.d.ts.map +1 -0
- package/dist/cli/validate/messages.js +8 -0
- package/dist/cli/validate/messages.js.map +1 -0
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +35 -6
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/MethodResponse.d.ts +23 -0
- package/dist/client/internal/MethodResponse.d.ts.map +1 -0
- package/dist/client/internal/MethodResponse.js +15 -0
- package/dist/client/internal/MethodResponse.js.map +1 -0
- package/dist/client/node.d.ts +29 -0
- package/dist/client/node.d.ts.map +1 -0
- package/dist/client/node.js +177 -0
- package/dist/client/node.js.map +1 -0
- package/dist/internal/types.d.ts +24 -0
- package/dist/internal/types.d.ts.map +1 -1
- package/dist/stripe/server/Charge.d.ts +8 -4
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.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/client/Methods.d.ts +1 -1
- package/dist/tempo/internal/types.d.ts +10 -1
- package/dist/tempo/internal/types.d.ts.map +1 -1
- package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -0
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -1
- package/dist/tempo/legacy/client/ChannelOps.js +4 -0
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -1
- package/dist/tempo/legacy/client/Session.d.ts +2 -2
- package/dist/tempo/legacy/client/Session.d.ts.map +1 -1
- package/dist/tempo/legacy/client/Session.js +7 -0
- package/dist/tempo/legacy/client/Session.js.map +1 -1
- package/dist/tempo/legacy/server/Session.d.ts +3 -3
- package/dist/tempo/legacy/server/Session.d.ts.map +1 -1
- package/dist/tempo/legacy/server/Session.js.map +1 -1
- package/dist/tempo/server/Charge.d.ts +3 -2
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +2 -23
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +2 -2
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +3 -2
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js.map +1 -1
- package/dist/tempo/server/index.d.ts +1 -1
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.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/Snapshot.d.ts +9 -0
- package/dist/tempo/session/Snapshot.d.ts.map +1 -1
- package/dist/tempo/session/Snapshot.js +6 -0
- package/dist/tempo/session/Snapshot.js.map +1 -1
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -1
- package/dist/tempo/session/client/ChannelOps.js +11 -2
- package/dist/tempo/session/client/ChannelOps.js.map +1 -1
- package/dist/tempo/session/client/CredentialState.d.ts +21 -1
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -1
- package/dist/tempo/session/client/CredentialState.js +66 -1
- package/dist/tempo/session/client/CredentialState.js.map +1 -1
- package/dist/tempo/session/client/Session.d.ts +1 -1
- package/dist/tempo/session/client/Session.d.ts.map +1 -1
- package/dist/tempo/session/client/Session.js +53 -1
- package/dist/tempo/session/client/Session.js.map +1 -1
- package/dist/tempo/session/client/SessionManager.d.ts +2 -2
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
- package/dist/tempo/session/client/SessionManager.js +130 -30
- package/dist/tempo/session/client/SessionManager.js.map +1 -1
- package/dist/tempo/session/client/Transports.d.ts +21 -2
- package/dist/tempo/session/client/Transports.d.ts.map +1 -1
- package/dist/tempo/session/client/Transports.js +129 -18
- package/dist/tempo/session/client/Transports.js.map +1 -1
- package/dist/tempo/session/client/internal/SessionManager.d.ts +19 -0
- package/dist/tempo/session/client/internal/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/internal/SessionManager.js +13 -0
- package/dist/tempo/session/client/internal/SessionManager.js.map +1 -0
- package/dist/tempo/session/precompile/Chain.js +13 -4
- package/dist/tempo/session/precompile/Chain.js.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.d.ts +3 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.js +14 -0
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
- package/dist/tempo/session/server/MeteredStream.d.ts +7 -1
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
- package/dist/tempo/session/server/MeteredStream.js +5 -4
- package/dist/tempo/session/server/MeteredStream.js.map +1 -1
- package/dist/tempo/session/server/RequestState.d.ts +5 -1
- package/dist/tempo/session/server/RequestState.d.ts.map +1 -1
- package/dist/tempo/session/server/RequestState.js +10 -4
- package/dist/tempo/session/server/RequestState.js.map +1 -1
- package/dist/tempo/session/server/Session.d.ts +21 -6
- package/dist/tempo/session/server/Session.d.ts.map +1 -1
- package/dist/tempo/session/server/Session.js +4 -1
- package/dist/tempo/session/server/Session.js.map +1 -1
- package/dist/tempo/session/server/Settlement.d.ts +20 -0
- package/dist/tempo/session/server/Settlement.d.ts.map +1 -1
- package/dist/tempo/session/server/Settlement.js +20 -0
- package/dist/tempo/session/server/Settlement.js.map +1 -1
- package/dist/tempo/session/server/Ws.d.ts +2 -0
- package/dist/tempo/session/server/Ws.d.ts.map +1 -1
- package/dist/tempo/session/server/Ws.js.map +1 -1
- package/dist/tempo/session/server/index.d.ts +1 -1
- package/dist/tempo/session/server/index.d.ts.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +21 -21
- package/dist/validation/core.d.ts.map +1 -1
- package/dist/validation/core.js +6 -2
- package/dist/validation/core.js.map +1 -1
- package/dist/viem/Client.d.ts.map +1 -1
- package/dist/viem/Client.js +24 -17
- package/dist/viem/Client.js.map +1 -1
- package/package.json +6 -1
- package/src/cli/account.ts +45 -10
- package/src/cli/cli.test.ts +165 -70
- package/src/cli/cli.ts +67 -2
- package/src/cli/mcp.test.ts +11 -0
- package/src/cli/sessions/Manager.test.ts +249 -0
- package/src/cli/sessions/Manager.ts +93 -0
- package/src/cli/sessions/commands.ts +444 -0
- package/src/cli/sessions/request.test.ts +51 -0
- package/src/cli/sessions/request.ts +353 -0
- package/src/cli/sessions/store.test.ts +581 -0
- package/src/cli/sessions/store.ts +940 -0
- package/src/cli/utils.test.ts +23 -0
- package/src/cli/utils.ts +10 -0
- package/src/cli/validate/index.ts +12 -14
- package/src/cli/validate/messages.ts +7 -0
- package/src/cli/validate.test.ts +38 -5
- package/src/client/internal/Fetch.test.ts +29 -0
- package/src/client/internal/Fetch.ts +51 -6
- package/src/client/internal/MethodResponse.ts +39 -0
- package/src/client/node.test.ts +115 -0
- package/src/client/node.ts +247 -0
- package/src/internal/types.test-d.ts +21 -0
- package/src/internal/types.ts +33 -0
- package/src/server/Mppx.test-d.ts +42 -0
- package/src/stripe/Methods.test.ts +10 -0
- package/src/stripe/server/Charge.test-d.ts +66 -0
- package/src/stripe/server/Charge.ts +8 -5
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/internal/types.ts +13 -2
- package/src/tempo/legacy/client/ChannelOps.test.ts +21 -0
- package/src/tempo/legacy/client/ChannelOps.ts +7 -0
- package/src/tempo/legacy/client/Session.test.ts +102 -1
- package/src/tempo/legacy/client/Session.ts +10 -0
- package/src/tempo/legacy/server/Defaults.test-d.ts +9 -0
- package/src/tempo/legacy/server/Session.ts +6 -5
- package/src/tempo/server/Charge.ts +6 -4
- package/src/tempo/server/Methods.ts +5 -4
- package/src/tempo/server/Subscription.ts +6 -4
- package/src/tempo/server/index.ts +5 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/session/README.md +201 -0
- package/src/tempo/session/Snapshot.ts +21 -0
- package/src/tempo/session/client/ChannelOps.test.ts +40 -0
- package/src/tempo/session/client/ChannelOps.ts +12 -2
- package/src/tempo/session/client/CredentialState.test.ts +2 -2
- package/src/tempo/session/client/CredentialState.ts +103 -1
- package/src/tempo/session/client/Session.test.ts +86 -4
- package/src/tempo/session/client/Session.ts +73 -1
- package/src/tempo/session/client/SessionManager.test.ts +137 -4
- package/src/tempo/session/client/SessionManager.ts +141 -33
- package/src/tempo/session/client/Transports.test.ts +225 -8
- package/src/tempo/session/client/Transports.ts +156 -21
- package/src/tempo/session/client/internal/SessionManager.ts +36 -0
- package/src/tempo/session/precompile/Chain.test.ts +26 -0
- package/src/tempo/session/precompile/Chain.ts +17 -4
- package/src/tempo/session/server/CredentialVerification.ts +18 -1
- package/src/tempo/session/server/MeteredStream.ts +12 -5
- package/src/tempo/session/server/RequestState.test.ts +39 -3
- package/src/tempo/session/server/RequestState.ts +13 -6
- package/src/tempo/session/server/Session.test.ts +461 -0
- package/src/tempo/session/server/Session.ts +31 -8
- package/src/tempo/session/server/Settlement.ts +45 -0
- package/src/tempo/session/server/Ws.test.ts +113 -0
- package/src/tempo/session/server/Ws.ts +2 -0
- package/src/tempo/session/server/index.ts +2 -0
- package/src/validation/core.ts +7 -1
- package/src/viem/Client.test.ts +44 -1
- package/src/viem/Client.ts +31 -17
|
@@ -340,6 +340,27 @@ describe.runIf(isLocalnet)('tryRecoverChannel', () => {
|
|
|
340
340
|
expect(result!.opened).toBe(true)
|
|
341
341
|
expect(result!.escrowContract).toBe(escrow)
|
|
342
342
|
expect(result!.chainId).toBe(chain.id)
|
|
343
|
+
// Channel opened with a zero authorizedSigner: the escrow verifies
|
|
344
|
+
// vouchers against the payer, so the recovered authority is the payer.
|
|
345
|
+
expect(result!.authorizedSigner.toLowerCase()).toBe(payer.address.toLowerCase())
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
test('recovers the on-chain authorizedSigner when set', async () => {
|
|
349
|
+
const authorizedSigner = accounts[4].address
|
|
350
|
+
const { channelId: signerChannelId } = await openChannel({
|
|
351
|
+
escrow,
|
|
352
|
+
payer,
|
|
353
|
+
payee,
|
|
354
|
+
token: currency,
|
|
355
|
+
deposit: 10_000_000n,
|
|
356
|
+
salt: Hex.random(32) as `0x${string}`,
|
|
357
|
+
authorizedSigner,
|
|
358
|
+
})
|
|
359
|
+
|
|
360
|
+
const result = await tryRecoverChannel(client, escrow, signerChannelId, chain.id)
|
|
361
|
+
|
|
362
|
+
expect(result).not.toBeUndefined()
|
|
363
|
+
expect(result!.authorizedSigner.toLowerCase()).toBe(authorizedSigner.toLowerCase())
|
|
343
364
|
})
|
|
344
365
|
|
|
345
366
|
test('returns undefined for non-existent channel', async () => {
|
|
@@ -27,6 +27,8 @@ import { signVoucher } from '../session/Voucher.js'
|
|
|
27
27
|
|
|
28
28
|
/** Cached channel metadata used by the legacy auto-driving session client. */
|
|
29
29
|
export type ChannelEntry = {
|
|
30
|
+
/** Voucher authority the channel was opened with. */
|
|
31
|
+
authorizedSigner: Address
|
|
30
32
|
/** Legacy contract-backed channel ID. */
|
|
31
33
|
channelId: Hex.Hex
|
|
32
34
|
/** Salt used to derive the channel ID. */
|
|
@@ -209,6 +211,7 @@ export async function createOpenPayload(
|
|
|
209
211
|
|
|
210
212
|
return {
|
|
211
213
|
entry: {
|
|
214
|
+
authorizedSigner,
|
|
212
215
|
channelId,
|
|
213
216
|
salt,
|
|
214
217
|
cumulativeAmount: initialAmount,
|
|
@@ -249,6 +252,10 @@ export async function tryRecoverChannel(
|
|
|
249
252
|
|
|
250
253
|
if (onChain.deposit > 0n && !onChain.finalized) {
|
|
251
254
|
return {
|
|
255
|
+
// A zero on-chain authorizedSigner means the escrow verifies vouchers
|
|
256
|
+
// against the payer, so record the payer as the voucher authority.
|
|
257
|
+
authorizedSigner:
|
|
258
|
+
BigInt(onChain.authorizedSigner) === 0n ? onChain.payer : onChain.authorizedSigner,
|
|
252
259
|
channelId,
|
|
253
260
|
salt: '0x' as Hex.Hex,
|
|
254
261
|
cumulativeAmount: onChain.settled,
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { SignatureEnvelope } from 'ox/tempo'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type Address,
|
|
4
|
+
createClient,
|
|
5
|
+
custom,
|
|
6
|
+
decodeFunctionData,
|
|
7
|
+
erc20Abi,
|
|
8
|
+
type Hex,
|
|
9
|
+
http,
|
|
10
|
+
} from 'viem'
|
|
3
11
|
import { privateKeyToAccount } from 'viem/accounts'
|
|
4
12
|
import { Account as TempoAccount, Addresses, Transaction, WebCryptoP256 } from 'viem/tempo'
|
|
13
|
+
import { tempoModerato } from 'viem/tempo/chains'
|
|
5
14
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
6
15
|
import { tempoNetwork } from '~test/config.js'
|
|
7
16
|
import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
|
|
@@ -374,6 +383,98 @@ describe('session (pure)', () => {
|
|
|
374
383
|
expect(cred.source).toBe(`did:pkh:eip155:42431:${pureAccount.address}`)
|
|
375
384
|
})
|
|
376
385
|
})
|
|
386
|
+
|
|
387
|
+
describe('auto-manage channel reuse', () => {
|
|
388
|
+
const payerAccount = privateKeyToAccount(
|
|
389
|
+
'0x59c6995e998f97a5a0044966f09453863d462d2b3f1446a99f0a3d7b5d0f5a0d',
|
|
390
|
+
)
|
|
391
|
+
const signerA = TempoAccount.fromSecp256k1(
|
|
392
|
+
'0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',
|
|
393
|
+
{ access: payerAccount },
|
|
394
|
+
)
|
|
395
|
+
const signerB = TempoAccount.fromSecp256k1(
|
|
396
|
+
'0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',
|
|
397
|
+
{ access: payerAccount },
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
function makeAutoClient(account: typeof signerA) {
|
|
401
|
+
return createClient({
|
|
402
|
+
account,
|
|
403
|
+
chain: tempoModerato,
|
|
404
|
+
transport: custom({
|
|
405
|
+
async request({ method }: { method: string }) {
|
|
406
|
+
if (method === 'eth_chainId') return `0x${tempoModerato.id.toString(16)}`
|
|
407
|
+
if (method === 'eth_fillTransaction')
|
|
408
|
+
return {
|
|
409
|
+
raw: '0x',
|
|
410
|
+
tx: {
|
|
411
|
+
chainId: `0x${tempoModerato.id.toString(16)}`,
|
|
412
|
+
from: payerAccount.address,
|
|
413
|
+
gas: '0x5208',
|
|
414
|
+
input: '0x',
|
|
415
|
+
maxFeePerGas: '0x1',
|
|
416
|
+
maxPriorityFeePerGas: '0x1',
|
|
417
|
+
nonce: '0x0',
|
|
418
|
+
to: escrowAddress,
|
|
419
|
+
type: '0x2',
|
|
420
|
+
value: '0x0',
|
|
421
|
+
},
|
|
422
|
+
}
|
|
423
|
+
throw new Error(`unexpected rpc request: ${method}`)
|
|
424
|
+
},
|
|
425
|
+
}),
|
|
426
|
+
})
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
test('reuses the cached channel while the voucher signer is unchanged', async () => {
|
|
430
|
+
const method = session({
|
|
431
|
+
getClient: () => makeAutoClient(signerA),
|
|
432
|
+
maxDeposit: '10',
|
|
433
|
+
})
|
|
434
|
+
|
|
435
|
+
const first = deserializePayload(
|
|
436
|
+
await method.createCredential({ challenge: makeChallenge(), context: {} }),
|
|
437
|
+
)
|
|
438
|
+
const second = deserializePayload(
|
|
439
|
+
await method.createCredential({ challenge: makeChallenge(), context: {} }),
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
expect(first.payload.action).toBe('open')
|
|
443
|
+
expect(second.payload.action).toBe('voucher')
|
|
444
|
+
expect(second.payload.channelId).toBe(first.payload.channelId)
|
|
445
|
+
})
|
|
446
|
+
|
|
447
|
+
test('opens a new channel instead of reusing when the authorizedSigner changes', async () => {
|
|
448
|
+
let account = signerA
|
|
449
|
+
const method = session({
|
|
450
|
+
getClient: () => makeAutoClient(account),
|
|
451
|
+
maxDeposit: '10',
|
|
452
|
+
})
|
|
453
|
+
|
|
454
|
+
const first = deserializePayload(
|
|
455
|
+
await method.createCredential({ challenge: makeChallenge(), context: {} }),
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
account = signerB
|
|
459
|
+
|
|
460
|
+
const second = deserializePayload(
|
|
461
|
+
await method.createCredential({ challenge: makeChallenge(), context: {} }),
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
expect(first.payload.action).toBe('open')
|
|
465
|
+
if (first.payload.action !== 'open') throw new Error('expected open payload')
|
|
466
|
+
expect(first.payload.authorizedSigner?.toLowerCase()).toBe(
|
|
467
|
+
signerA.accessKeyAddress.toLowerCase(),
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
expect(second.payload.action).toBe('open')
|
|
471
|
+
if (second.payload.action !== 'open') throw new Error('expected open payload')
|
|
472
|
+
expect(second.payload.authorizedSigner?.toLowerCase()).toBe(
|
|
473
|
+
signerB.accessKeyAddress.toLowerCase(),
|
|
474
|
+
)
|
|
475
|
+
expect(second.payload.channelId).not.toBe(first.payload.channelId)
|
|
476
|
+
})
|
|
477
|
+
})
|
|
377
478
|
})
|
|
378
479
|
|
|
379
480
|
describe.runIf(isLocalnet)('session (on-chain)', () => {
|
|
@@ -175,6 +175,16 @@ export function session(parameters: session.Parameters = {}) {
|
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
// A channel only admits vouchers from the authorizedSigner it was opened
|
|
179
|
+
// with, so a cached or recovered entry stops being reusable once the
|
|
180
|
+
// resolved signer changes. Fall through to open a fresh channel instead
|
|
181
|
+
// of emitting a voucher the escrow would reject.
|
|
182
|
+
if (
|
|
183
|
+
entry?.opened &&
|
|
184
|
+
entry.authorizedSigner.toLowerCase() !== getAccountSignerAddress(voucherSigner).toLowerCase()
|
|
185
|
+
)
|
|
186
|
+
entry = undefined
|
|
187
|
+
|
|
178
188
|
let payload: LegacySessionCredentialPayload
|
|
179
189
|
|
|
180
190
|
if (entry?.opened) {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { expectTypeOf, test } from 'vp/test'
|
|
2
|
+
|
|
3
|
+
import type { session } from './Session.js'
|
|
4
|
+
|
|
5
|
+
test('legacy session exposes its resolved currency and decimals as defaults', () => {
|
|
6
|
+
type Defaults = session.DeriveDefaults<{}>
|
|
7
|
+
expectTypeOf<Defaults['currency']>().toEqualTypeOf<string>()
|
|
8
|
+
expectTypeOf<Defaults['decimals']>().toEqualTypeOf<number>()
|
|
9
|
+
})
|
|
@@ -399,11 +399,12 @@ export declare namespace session {
|
|
|
399
399
|
|
|
400
400
|
type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
|
|
401
401
|
parameters,
|
|
402
|
-
Defaults
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
402
|
+
Defaults,
|
|
403
|
+
{
|
|
404
|
+
currency: string
|
|
405
|
+
decimals: number
|
|
406
|
+
}
|
|
407
|
+
>
|
|
407
408
|
}
|
|
408
409
|
|
|
409
410
|
function assertSettlementSender(parameters: {
|
|
@@ -623,10 +623,12 @@ export declare namespace charge {
|
|
|
623
623
|
|
|
624
624
|
type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
|
|
625
625
|
parameters,
|
|
626
|
-
Defaults
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
626
|
+
Defaults,
|
|
627
|
+
{
|
|
628
|
+
currency: string
|
|
629
|
+
decimals: number
|
|
630
|
+
}
|
|
631
|
+
>
|
|
630
632
|
|
|
631
633
|
type FeePayerPolicy = Partial<FeePayer.Policy>
|
|
632
634
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NoExtraKeys } from '../../internal/types.js'
|
|
1
2
|
import { session as sessionLegacy_, settle as settleLegacy_ } from '../legacy/server/index.js'
|
|
2
3
|
import {
|
|
3
4
|
charge as sessionCharge_,
|
|
@@ -37,16 +38,16 @@ function createChargeMethod<const parameters extends tempo.Parameters>(
|
|
|
37
38
|
parameters: parameters | undefined,
|
|
38
39
|
) {
|
|
39
40
|
// `tempo()` accepts the intersection of charge/session parameters, then
|
|
40
|
-
// forwards only the fields each method understands.
|
|
41
|
-
//
|
|
42
|
-
return tempo.charge(parameters as charge_.Parameters)
|
|
41
|
+
// forwards only the fields each method understands. Preserve the inferred
|
|
42
|
+
// parameter type so configured request defaults remain visible to handlers.
|
|
43
|
+
return tempo.charge(parameters as NoExtraKeys<parameters, charge_.Parameters> | undefined)
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
function createSessionMethod<const parameters extends tempo.Parameters>(
|
|
46
47
|
parameters: parameters | undefined,
|
|
47
48
|
) {
|
|
48
49
|
// See `createChargeMethod()`: session receives the same shared parameter bag.
|
|
49
|
-
return sessionServer(parameters as session_.Parameters)
|
|
50
|
+
return sessionServer(parameters as NoExtraKeys<parameters, session_.Parameters> | undefined)
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
/**
|
|
@@ -1286,10 +1286,12 @@ export declare namespace subscription {
|
|
|
1286
1286
|
/** Derived defaults after account and chain configuration are applied. */
|
|
1287
1287
|
type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
|
|
1288
1288
|
parameters,
|
|
1289
|
-
Defaults
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1289
|
+
Defaults,
|
|
1290
|
+
{
|
|
1291
|
+
currency: string
|
|
1292
|
+
decimals: number
|
|
1293
|
+
}
|
|
1294
|
+
>
|
|
1293
1295
|
}
|
|
1294
1296
|
|
|
1295
1297
|
function createContext<const parameters extends createContext.Parameters>(
|
|
@@ -4,5 +4,9 @@ export * as Ws from '../session/server/Ws.js'
|
|
|
4
4
|
export { charge } from './Charge.js'
|
|
5
5
|
export { sessionLegacy, settleLegacy, tempo } from './Methods.js'
|
|
6
6
|
export { session, settle, settleBatch } from '../session/server/Session.js'
|
|
7
|
-
export type {
|
|
7
|
+
export type {
|
|
8
|
+
OnSessionSettlement,
|
|
9
|
+
SessionSettlementContext,
|
|
10
|
+
SettlementSchedule,
|
|
11
|
+
} from '../session/server/Session.js'
|
|
8
12
|
export { renew as renewSubscription, subscription } from './Subscription.js'
|