mppx 0.8.13 → 0.8.14
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 +16 -0
- package/dist/Errors.d.ts +10 -0
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js +11 -2
- package/dist/Errors.js.map +1 -1
- package/dist/Method.d.ts +105 -3
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +102 -2
- package/dist/Method.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +12 -2
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/MethodChallenge.d.ts +17 -0
- package/dist/client/internal/MethodChallenge.d.ts.map +1 -0
- package/dist/client/internal/MethodChallenge.js +11 -0
- package/dist/client/internal/MethodChallenge.js.map +1 -0
- package/dist/server/Mppx.d.ts +23 -4
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +91 -82
- package/dist/server/Mppx.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +1 -0
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +1 -0
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +7 -2
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -1
- package/dist/tempo/legacy/client/ChannelOps.js +2 -1
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -1
- package/dist/tempo/server/Charge.d.ts +38 -77
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +289 -209
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +12 -1
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +4 -0
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Relay.d.ts +48 -0
- package/dist/tempo/server/Relay.d.ts.map +1 -0
- package/dist/tempo/server/Relay.js +177 -0
- package/dist/tempo/server/Relay.js.map +1 -0
- package/dist/tempo/server/SponsorBudget.d.ts +59 -0
- package/dist/tempo/server/SponsorBudget.d.ts.map +1 -0
- package/dist/tempo/server/SponsorBudget.js +144 -0
- package/dist/tempo/server/SponsorBudget.js.map +1 -0
- 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/ChannelOps.d.ts +7 -1
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -1
- package/dist/tempo/session/client/ChannelOps.js +9 -4
- package/dist/tempo/session/client/ChannelOps.js.map +1 -1
- package/dist/tempo/session/client/CredentialState.d.ts +5 -1
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -1
- package/dist/tempo/session/client/CredentialState.js +37 -19
- package/dist/tempo/session/client/CredentialState.js.map +1 -1
- package/dist/tempo/session/client/Runtime.d.ts +8 -0
- package/dist/tempo/session/client/Runtime.d.ts.map +1 -1
- package/dist/tempo/session/client/Runtime.js +17 -0
- package/dist/tempo/session/client/Runtime.js.map +1 -1
- package/dist/tempo/session/client/Session.d.ts +15 -5
- package/dist/tempo/session/client/Session.d.ts.map +1 -1
- package/dist/tempo/session/client/Session.js +93 -36
- package/dist/tempo/session/client/Session.js.map +1 -1
- package/dist/tempo/session/client/SessionManager.d.ts +8 -1
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
- package/dist/tempo/session/client/SessionManager.js +54 -26
- package/dist/tempo/session/client/SessionManager.js.map +1 -1
- package/dist/tempo/session/client/Transports.d.ts +7 -5
- package/dist/tempo/session/client/Transports.d.ts.map +1 -1
- package/dist/tempo/session/client/Transports.js +48 -24
- package/dist/tempo/session/client/Transports.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -1
- package/dist/tempo/session/precompile/Chain.js +96 -8
- package/dist/tempo/session/precompile/Chain.js.map +1 -1
- package/dist/tempo/session/precompile/Channel.d.ts +2 -0
- package/dist/tempo/session/precompile/Channel.d.ts.map +1 -1
- package/dist/tempo/session/precompile/Channel.js +4 -0
- package/dist/tempo/session/precompile/Channel.js.map +1 -1
- package/dist/tempo/session/server/RequestState.js +3 -1
- package/dist/tempo/session/server/RequestState.js.map +1 -1
- package/package.json +1 -1
- package/src/Errors.test.ts +23 -0
- package/src/Errors.ts +21 -2
- package/src/Method.test.ts +102 -1
- package/src/Method.ts +241 -5
- package/src/client/Mppx.test-d.ts +3 -3
- package/src/client/internal/Fetch.ts +16 -7
- package/src/client/internal/MethodChallenge.ts +30 -0
- package/src/server/Mppx.test-d.ts +2 -0
- package/src/server/Mppx.test.ts +205 -0
- package/src/server/Mppx.ts +167 -103
- package/src/tempo/PublicExports.test-d.ts +20 -0
- package/src/tempo/internal/fee-payer.ts +7 -3
- package/src/tempo/legacy/client/ChannelOps.test.ts +7 -0
- package/src/tempo/legacy/client/ChannelOps.ts +2 -1
- package/src/tempo/server/Charge.test.ts +337 -63
- package/src/tempo/server/Charge.ts +435 -267
- package/src/tempo/server/Methods.ts +11 -0
- package/src/tempo/server/Relay.test.ts +523 -0
- package/src/tempo/server/Relay.ts +288 -0
- package/src/tempo/server/SponsorBudget.test.ts +125 -0
- package/src/tempo/server/SponsorBudget.ts +213 -0
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/session/client/ChannelOps.test.ts +17 -2
- package/src/tempo/session/client/ChannelOps.ts +12 -4
- package/src/tempo/session/client/CredentialState.ts +61 -20
- package/src/tempo/session/client/Runtime.test.ts +12 -0
- package/src/tempo/session/client/Runtime.ts +22 -0
- package/src/tempo/session/client/Session.test.ts +235 -2
- package/src/tempo/session/client/Session.ts +130 -41
- package/src/tempo/session/client/SessionManager.test.ts +102 -4
- package/src/tempo/session/client/SessionManager.ts +71 -27
- package/src/tempo/session/client/Transports.test.ts +32 -1
- package/src/tempo/session/client/Transports.ts +79 -35
- package/src/tempo/session/precompile/Chain.integration.test.ts +19 -1
- package/src/tempo/session/precompile/Chain.test.ts +197 -10
- package/src/tempo/session/precompile/Chain.ts +102 -8
- package/src/tempo/session/precompile/Channel.test.ts +9 -0
- package/src/tempo/session/precompile/Channel.ts +5 -0
- package/src/tempo/session/server/RequestState.test.ts +8 -1
- package/src/tempo/session/server/RequestState.ts +2 -2
|
@@ -3,6 +3,8 @@ import * as Method from '../../../Method.js';
|
|
|
3
3
|
import * as Account from '../../../viem/Account.js';
|
|
4
4
|
import * as Client from '../../../viem/Client.js';
|
|
5
5
|
import type { ResolveAccount as ResolveAccount_, ResolveAccountInfo as ResolveAccountInfo_ } from '../../client/ResolveAccount.js';
|
|
6
|
+
import * as AutoSwap from '../../internal/auto-swap.js';
|
|
7
|
+
import * as Channel from '../precompile/Channel.js';
|
|
6
8
|
import { type ChannelEntry } from './ChannelOps.js';
|
|
7
9
|
import { type ChannelStore } from './ChannelStore.js';
|
|
8
10
|
export { sessionContextSchema, type SessionContext } from './CredentialState.js';
|
|
@@ -23,7 +25,7 @@ export declare function session(parameters?: session.Parameters): Method.Client<
|
|
|
23
25
|
authorizedSigner: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
24
26
|
channelId: import("zod/mini").ZodMiniString<string>;
|
|
25
27
|
cumulativeAmount: import("zod/mini").ZodMiniString<string>;
|
|
26
|
-
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<
|
|
28
|
+
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<Channel.ChannelDescriptor, Channel.ChannelDescriptor>>;
|
|
27
29
|
signature: import("zod/mini").ZodMiniString<string>;
|
|
28
30
|
transaction: import("zod/mini").ZodMiniString<string>;
|
|
29
31
|
type: import("zod/mini").ZodMiniLiteral<"transaction">;
|
|
@@ -31,20 +33,20 @@ export declare function session(parameters?: session.Parameters): Method.Client<
|
|
|
31
33
|
action: import("zod/mini").ZodMiniLiteral<"topUp">;
|
|
32
34
|
additionalDeposit: import("zod/mini").ZodMiniString<string>;
|
|
33
35
|
channelId: import("zod/mini").ZodMiniString<string>;
|
|
34
|
-
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<
|
|
36
|
+
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<Channel.ChannelDescriptor, Channel.ChannelDescriptor>>;
|
|
35
37
|
transaction: import("zod/mini").ZodMiniString<string>;
|
|
36
38
|
type: import("zod/mini").ZodMiniLiteral<"transaction">;
|
|
37
39
|
}, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniObject<{
|
|
38
40
|
action: import("zod/mini").ZodMiniLiteral<"voucher">;
|
|
39
41
|
channelId: import("zod/mini").ZodMiniString<string>;
|
|
40
42
|
cumulativeAmount: import("zod/mini").ZodMiniString<string>;
|
|
41
|
-
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<
|
|
43
|
+
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<Channel.ChannelDescriptor, Channel.ChannelDescriptor>>;
|
|
42
44
|
signature: import("zod/mini").ZodMiniString<string>;
|
|
43
45
|
}, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniObject<{
|
|
44
46
|
action: import("zod/mini").ZodMiniLiteral<"close">;
|
|
45
47
|
channelId: import("zod/mini").ZodMiniString<string>;
|
|
46
48
|
cumulativeAmount: import("zod/mini").ZodMiniString<string>;
|
|
47
|
-
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<
|
|
49
|
+
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<Channel.ChannelDescriptor, Channel.ChannelDescriptor>>;
|
|
48
50
|
signature: import("zod/mini").ZodMiniString<string>;
|
|
49
51
|
}, import("zod/v4/core").$strip>], "action">;
|
|
50
52
|
};
|
|
@@ -101,6 +103,7 @@ export declare function session(parameters?: session.Parameters): Method.Client<
|
|
|
101
103
|
};
|
|
102
104
|
}, import("zod/mini").ZodMiniObject<{
|
|
103
105
|
account: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<`0x${string}` | Account.Account | undefined, `0x${string}` | Account.Account | undefined>>;
|
|
106
|
+
autoSwap: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<AutoSwap.resolve.Value, AutoSwap.resolve.Value>>;
|
|
104
107
|
action: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniEnum<{
|
|
105
108
|
open: "open";
|
|
106
109
|
topUp: "topUp";
|
|
@@ -111,7 +114,7 @@ export declare function session(parameters?: session.Parameters): Method.Client<
|
|
|
111
114
|
cumulativeAmount: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
112
115
|
cumulativeAmountRaw: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
113
116
|
transaction: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<`0x${string}`, `0x${string}`>>;
|
|
114
|
-
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<
|
|
117
|
+
descriptor: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniCustom<Channel.ChannelDescriptor, Channel.ChannelDescriptor>>;
|
|
115
118
|
additionalDeposit: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
116
119
|
additionalDepositRaw: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
117
120
|
depositRaw: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
|
|
@@ -121,6 +124,8 @@ export declare namespace session {
|
|
|
121
124
|
type ResolveAccount = ResolveAccount_;
|
|
122
125
|
type ResolveAccountInfo = ResolveAccountInfo_;
|
|
123
126
|
type Parameters = Account.getResolver.Parameters & Client.getResolver.Parameters & {
|
|
127
|
+
/** Automatically acquire the session currency from fallback stablecoins before open/top-up. */
|
|
128
|
+
autoSwap?: AutoSwap.resolve.Value | undefined;
|
|
124
129
|
/** Pluggable persistence for reusable channels. Defaults to an in-memory store. */
|
|
125
130
|
channelStore?: ChannelStore | undefined;
|
|
126
131
|
/** Token decimals for parsing human-readable amounts (default: 6). */
|
|
@@ -129,6 +134,11 @@ export declare namespace session {
|
|
|
129
134
|
escrow?: Address | undefined;
|
|
130
135
|
/** Maximum channel deposit in human-readable units. Caps server-suggested opens and automatic top-ups. */
|
|
131
136
|
maxDeposit?: string | undefined;
|
|
137
|
+
/**
|
|
138
|
+
* Preferred automatic top-up size in human-readable units. When omitted,
|
|
139
|
+
* a bounded server `suggestedDeposit` is preferred, then the exact shortfall.
|
|
140
|
+
*/
|
|
141
|
+
topUpAmount?: string | undefined;
|
|
132
142
|
/** Called whenever channel state changes. */
|
|
133
143
|
onChannelUpdate?: ((entry: ChannelEntry) => void) | undefined;
|
|
134
144
|
/** Selects the account that signs this session credential after the challenge is known. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/client/Session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,MAAM,CAAA;AAM/C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACjD,OAAO,KAAK,EACV,cAAc,IAAI,eAAe,EACjC,kBAAkB,IAAI,mBAAmB,EAC1C,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/client/Session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,MAAM,CAAA;AAM/C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACjD,OAAO,KAAK,EACV,cAAc,IAAI,eAAe,EACjC,kBAAkB,IAAI,mBAAmB,EAC1C,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,6BAA6B,CAAA;AAGvD,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AAMnD,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAsBzE,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEhF;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,UAAU,GAAE,OAAO,CAAC,UAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAwM1D;AAED,qEAAqE;AACrE,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,KAAK,cAAc,GAAG,eAAe,CAAA;IACrC,KAAK,kBAAkB,GAAG,mBAAmB,CAAA;IAE7C,KAAK,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,GAC9C,MAAM,CAAC,WAAW,CAAC,UAAU,GAAG;QAC9B,+FAA+F;QAC/F,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAA;QAC7C,mFAAmF;QACnF,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;QACvC,sEAAsE;QACtE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B,2CAA2C;QAC3C,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QAC5B,0GAA0G;QAC1G,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC/B;;;WAGG;QACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,6CAA6C;QAC7C,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;QAC7D,2FAA2F;QAC3F,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAA;KAC5C,CAAA;CACJ"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { parseUnits } from 'viem';
|
|
2
2
|
import { tempo as tempo_chain } from 'viem/chains';
|
|
3
|
+
import * as MethodChallenge from '../../../client/internal/MethodChallenge.js';
|
|
3
4
|
import * as MethodResponse from '../../../client/internal/MethodResponse.js';
|
|
4
|
-
import * as Constants from '../../../Constants.js';
|
|
5
5
|
import * as Credential from '../../../Credential.js';
|
|
6
6
|
import * as Method from '../../../Method.js';
|
|
7
7
|
import * as Account from '../../../viem/Account.js';
|
|
8
8
|
import * as Client from '../../../viem/Client.js';
|
|
9
|
+
import * as AutoSwap from '../../internal/auto-swap.js';
|
|
9
10
|
import * as defaults from '../../internal/defaults.js';
|
|
10
11
|
import * as Methods from '../../Methods.js';
|
|
11
|
-
import
|
|
12
|
+
import * as Channel from '../precompile/Channel.js';
|
|
13
|
+
import { isEventStream, readSessionChallengeAmount, requireSessionCredentialContext, } from '../precompile/Protocol.js';
|
|
12
14
|
import { serializeCredential } from './ChannelOps.js';
|
|
13
15
|
import { createChannelStore } from './ChannelStore.js';
|
|
14
|
-
import { executeCredentialPlan, planCredential, resolveChallengeContext, resolveRecoverContext, sessionContextSchema, } from './CredentialState.js';
|
|
15
|
-
import { assertWithinMaxDeposit } from './Runtime.js';
|
|
16
|
-
import { handleSseNeedVoucher,
|
|
16
|
+
import { canSignDescriptor, executeCredentialPlan, hasSessionAction, planCredential, resolveChallengeContext, resolveRecoverContext, sessionContextSchema, } from './CredentialState.js';
|
|
17
|
+
import { assertWithinMaxDeposit, resolveAutomaticTopUp } from './Runtime.js';
|
|
18
|
+
import { handleSseNeedVoucher, isTip1034SessionChallenge, postTopUp, wrapSseResponse, } from './Transports.js';
|
|
17
19
|
export { sessionContextSchema } from './CredentialState.js';
|
|
18
20
|
/**
|
|
19
21
|
* Creates the low-level TIP-1034 session payment method for use with `Mppx.create()`.
|
|
@@ -23,7 +25,7 @@ export { sessionContextSchema } from './CredentialState.js';
|
|
|
23
25
|
* channel descriptor).
|
|
24
26
|
*/
|
|
25
27
|
export function session(parameters = {}) {
|
|
26
|
-
const { account, channelStore, decimals = defaults.decimals, escrow: escrowOverride, getClient: getClientParameter, maxDeposit: maxDepositParameter, onChannelUpdate, resolveAccount, } = parameters;
|
|
28
|
+
const { account, autoSwap: autoSwapParameter, channelStore, decimals = defaults.decimals, escrow: escrowOverride, getClient: getClientParameter, maxDeposit: maxDepositParameter, topUpAmount: topUpAmountParameter, onChannelUpdate, resolveAccount, } = parameters;
|
|
27
29
|
const getClient = Client.getResolver({
|
|
28
30
|
chain: tempo_chain,
|
|
29
31
|
getClient: getClientParameter,
|
|
@@ -31,12 +33,26 @@ export function session(parameters = {}) {
|
|
|
31
33
|
});
|
|
32
34
|
const getAccount = Account.getResolver({ account });
|
|
33
35
|
const maxDeposit = maxDepositParameter !== undefined ? parseUnits(maxDepositParameter, decimals) : undefined;
|
|
36
|
+
const topUpAmount = topUpAmountParameter !== undefined ? parseUnits(topUpAmountParameter, decimals) : undefined;
|
|
34
37
|
const store = channelStore ?? createChannelStore();
|
|
35
38
|
const sink = { store, notifyUpdate: (entry) => onChannelUpdate?.(entry) };
|
|
39
|
+
const resolveCredentialAccount = async (resolved, context, entry) => {
|
|
40
|
+
const defaultAccount = getAccount(resolved.client, context);
|
|
41
|
+
const descriptor = context?.action
|
|
42
|
+
? context.descriptor
|
|
43
|
+
: (entry?.descriptor ??
|
|
44
|
+
resolveRecoverContext({ context, snapshot: resolved.snapshot })?.descriptor);
|
|
45
|
+
return ((await resolveAccount?.({
|
|
46
|
+
account: defaultAccount,
|
|
47
|
+
chainId: resolved.chainId,
|
|
48
|
+
operation: {
|
|
49
|
+
kind: 'authorizePaymentChannel',
|
|
50
|
+
...(descriptor ? { authority: Channel.resolveAuthorizedSigner(descriptor) } : {}),
|
|
51
|
+
},
|
|
52
|
+
})) ?? defaultAccount);
|
|
53
|
+
};
|
|
36
54
|
const method = Method.toClient(Methods.session, {
|
|
37
|
-
canHandleChallenge({ challenge })
|
|
38
|
-
return (Constants.getMethodDetail(challenge.request.methodDetails, Constants.MethodDetailKeys.sessionProtocol) === Constants.SessionProtocols.v2);
|
|
39
|
-
},
|
|
55
|
+
canHandleChallenge: ({ challenge }) => isTip1034SessionChallenge(challenge),
|
|
40
56
|
context: sessionContextSchema,
|
|
41
57
|
async createCredential({ challenge, context }) {
|
|
42
58
|
const resolved = await resolveChallengeContext({
|
|
@@ -44,21 +60,8 @@ export function session(parameters = {}) {
|
|
|
44
60
|
escrowOverride,
|
|
45
61
|
getClient,
|
|
46
62
|
});
|
|
47
|
-
const defaultAccount = getAccount(resolved.client, context);
|
|
48
63
|
const entry = await store.get(resolved.key);
|
|
49
|
-
|
|
50
|
-
const recoverContext = resolveRecoverContext({ context, snapshot: resolved.snapshot });
|
|
51
|
-
const descriptor = context?.action
|
|
52
|
-
? context.descriptor
|
|
53
|
-
: (entry?.descriptor ?? recoverContext?.descriptor);
|
|
54
|
-
const account = (await resolveAccount?.({
|
|
55
|
-
account: defaultAccount,
|
|
56
|
-
chainId: resolved.chainId,
|
|
57
|
-
operation: {
|
|
58
|
-
kind: 'authorizePaymentChannel',
|
|
59
|
-
...(descriptor ? { authority: descriptor.authorizedSigner } : {}),
|
|
60
|
-
},
|
|
61
|
-
})) ?? defaultAccount;
|
|
64
|
+
const account = await resolveCredentialAccount(resolved, context, entry);
|
|
62
65
|
const payload = await executeCredentialPlan(planCredential({
|
|
63
66
|
account,
|
|
64
67
|
entry,
|
|
@@ -66,12 +69,72 @@ export function session(parameters = {}) {
|
|
|
66
69
|
decimals,
|
|
67
70
|
maxDeposit,
|
|
68
71
|
resolved,
|
|
69
|
-
}), sink);
|
|
72
|
+
}), sink, AutoSwap.resolve(context?.autoSwap ?? autoSwapParameter, AutoSwap.defaultCurrencies));
|
|
70
73
|
return serializeCredential(challenge, payload, resolved.chainId, account);
|
|
71
74
|
},
|
|
72
75
|
});
|
|
76
|
+
const topUpChannelIfNeeded = async ({ challenge, channel, deposit, fetch, input, requiredCumulative, }) => {
|
|
77
|
+
const knownDeposit = channel.deposit > deposit ? channel.deposit : deposit;
|
|
78
|
+
const additionalDeposit = resolveAutomaticTopUp({
|
|
79
|
+
deposit: knownDeposit,
|
|
80
|
+
maxDeposit,
|
|
81
|
+
requiredCumulative,
|
|
82
|
+
suggestedDeposit: challenge.request.suggestedDeposit === undefined
|
|
83
|
+
? undefined
|
|
84
|
+
: BigInt(challenge.request.suggestedDeposit),
|
|
85
|
+
topUpAmount,
|
|
86
|
+
});
|
|
87
|
+
if (additionalDeposit > 0n)
|
|
88
|
+
await postTopUp({
|
|
89
|
+
additionalDeposit,
|
|
90
|
+
challenge,
|
|
91
|
+
channel,
|
|
92
|
+
channelId: channel.channelId,
|
|
93
|
+
createSessionCredential: (challenge, context) => method.createCredential({ challenge, context }),
|
|
94
|
+
fetch,
|
|
95
|
+
input,
|
|
96
|
+
});
|
|
97
|
+
const nextDeposit = knownDeposit + additionalDeposit;
|
|
98
|
+
if (nextDeposit === channel.deposit)
|
|
99
|
+
return;
|
|
100
|
+
const updated = { ...channel, deposit: nextDeposit };
|
|
101
|
+
await store.set(updated);
|
|
102
|
+
sink.notifyUpdate(updated);
|
|
103
|
+
};
|
|
104
|
+
MethodChallenge.register(method, async ({ challenge, context, fetch, input }) => {
|
|
105
|
+
if (!isTip1034SessionChallenge(challenge))
|
|
106
|
+
return;
|
|
107
|
+
const sessionContext = context === undefined ? undefined : sessionContextSchema.parse(context);
|
|
108
|
+
if (hasSessionAction(sessionContext))
|
|
109
|
+
return;
|
|
110
|
+
const resolved = await resolveChallengeContext({ challenge, escrowOverride, getClient });
|
|
111
|
+
const channel = await store.get(resolved.key);
|
|
112
|
+
if (!channel?.opened)
|
|
113
|
+
return;
|
|
114
|
+
const snapshot = resolved.snapshot?.channelId.toLowerCase() === channel.channelId.toLowerCase()
|
|
115
|
+
? resolved.snapshot
|
|
116
|
+
: undefined;
|
|
117
|
+
const nextCumulative = channel.cumulativeAmount + readSessionChallengeAmount(challenge);
|
|
118
|
+
const snapshotRequired = snapshot ? BigInt(snapshot.requiredCumulative) : nextCumulative;
|
|
119
|
+
const requiredCumulative = snapshotRequired > nextCumulative ? snapshotRequired : nextCumulative;
|
|
120
|
+
const snapshotDeposit = snapshot ? BigInt(snapshot.deposit) : channel.deposit;
|
|
121
|
+
const deposit = snapshotDeposit > channel.deposit ? snapshotDeposit : channel.deposit;
|
|
122
|
+
if (requiredCumulative <= deposit && deposit === channel.deposit)
|
|
123
|
+
return;
|
|
124
|
+
const account = await resolveCredentialAccount(resolved, sessionContext, channel);
|
|
125
|
+
if (!canSignDescriptor(account, channel.descriptor))
|
|
126
|
+
return;
|
|
127
|
+
await topUpChannelIfNeeded({
|
|
128
|
+
challenge,
|
|
129
|
+
channel,
|
|
130
|
+
deposit,
|
|
131
|
+
fetch,
|
|
132
|
+
input,
|
|
133
|
+
requiredCumulative,
|
|
134
|
+
});
|
|
135
|
+
});
|
|
73
136
|
return MethodResponse.register(method, async ({ challenge, credential, fetch, headers, input, refetch, response, signal }) => {
|
|
74
|
-
if (!
|
|
137
|
+
if (!isTip1034SessionChallenge(challenge))
|
|
75
138
|
return response;
|
|
76
139
|
if (!isEventStream(response)) {
|
|
77
140
|
const credentialContext = requireSessionCredentialContext(Credential.deserialize(credential).payload);
|
|
@@ -91,23 +154,17 @@ export function session(parameters = {}) {
|
|
|
91
154
|
createSessionCredential: (challenge, context) => method.createCredential({ challenge, context }),
|
|
92
155
|
fetch,
|
|
93
156
|
getChannel: () => channel ?? null,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (requiredCumulative <= deposit || !channel)
|
|
157
|
+
async topUpIfNeeded({ deposit, requiredCumulative }) {
|
|
158
|
+
if (!channel)
|
|
97
159
|
return;
|
|
98
|
-
|
|
99
|
-
await postTopUp({
|
|
100
|
-
additionalDeposit,
|
|
160
|
+
await topUpChannelIfNeeded({
|
|
101
161
|
challenge,
|
|
102
162
|
channel,
|
|
103
|
-
|
|
104
|
-
createSessionCredential: (challenge, context) => method.createCredential({ challenge, context }),
|
|
163
|
+
deposit: channel.deposit > deposit ? channel.deposit : deposit,
|
|
105
164
|
fetch,
|
|
106
165
|
input,
|
|
166
|
+
requiredCumulative,
|
|
107
167
|
});
|
|
108
|
-
channel.deposit += additionalDeposit;
|
|
109
|
-
await store.set(channel);
|
|
110
|
-
sink.notifyUpdate(channel);
|
|
111
168
|
},
|
|
112
169
|
};
|
|
113
170
|
return wrapSseResponse({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Session.js","sourceRoot":"","sources":["../../../../src/tempo/session/client/Session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,UAAU,EAAE,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Session.js","sourceRoot":"","sources":["../../../../src/tempo/session/client/Session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,UAAU,EAAE,MAAM,MAAM,CAAA;AAC/C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,KAAK,eAAe,MAAM,6CAA6C,CAAA;AAC9E,OAAO,KAAK,cAAc,MAAM,4CAA4C,CAAA;AAC5E,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AAKjD,OAAO,KAAK,QAAQ,MAAM,6BAA6B,CAAA;AACvD,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAA;AACtD,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iBAAiB,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAA;AACzE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,GAGrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,SAAS,EACT,eAAe,GAGhB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAuB,MAAM,sBAAsB,CAAA;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,aAAiC,EAAE;IACzD,MAAM,EACJ,OAAO,EACP,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,EACZ,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAC5B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,kBAAkB,EAC7B,UAAU,EAAE,mBAAmB,EAC/B,WAAW,EAAE,oBAAoB,EACjC,eAAe,EACf,cAAc,GACf,GAAG,UAAU,CAAA;IACd,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC;QACnC,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,kBAAkB;QAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC,CAAA;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACnD,MAAM,UAAU,GACd,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3F,MAAM,WAAW,GACf,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7F,MAAM,KAAK,GAAG,YAAY,IAAI,kBAAkB,EAAE,CAAA;IAClD,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,KAAmB,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,CAAA;IAEvF,MAAM,wBAAwB,GAAG,KAAK,EACpC,QAA0B,EAC1B,OAAsC,EACtC,KAA+B,EAC/B,EAAE;QACF,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,UAAU,GAAG,OAAO,EAAE,MAAM;YAChC,CAAC,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU;gBAClB,qBAAqB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;QAChF,OAAO,CACL,CAAC,MAAM,cAAc,EAAE,CAAC;YACtB,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS,EAAE;gBACT,IAAI,EAAE,yBAAyB;gBAC/B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClF;SACF,CAAC,CAAC,IAAI,cAAc,CACtB,CAAA;IACH,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;QAC9C,kBAAkB,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,yBAAyB,CAAC,SAAS,CAAC;QAC3E,OAAO,EAAE,oBAAoB;QAC7B,KAAK,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE;YAC3C,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC;gBAC7C,SAAS;gBACT,cAAc;gBACd,SAAS;aACV,CAAC,CAAA;YACF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;YACxE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CACzC,cAAc,CAAC;gBACb,OAAO;gBACP,KAAK;gBACL,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,QAAQ;aACT,CAAC,EACF,IAAI,EACJ,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CACrF,CAAA;YACD,OAAO,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC3E,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,oBAAoB,GAAG,KAAK,EAAE,EAClC,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,KAAK,EACL,kBAAkB,GAQnB,EAAE,EAAE;QACH,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;QAC1E,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;YAC9C,OAAO,EAAE,YAAY;YACrB,UAAU;YACV,kBAAkB;YAClB,gBAAgB,EACd,SAAS,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS;gBAC9C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAChD,WAAW;SACZ,CAAC,CAAA;QACF,IAAI,iBAAiB,GAAG,EAAE;YACxB,MAAM,SAAS,CAAC;gBACd,iBAAiB;gBACjB,SAAS;gBACT,OAAO;gBACP,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,uBAAuB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAC9C,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;gBACjD,KAAK;gBACL,KAAK;aACN,CAAC,CAAA;QACJ,MAAM,WAAW,GAAG,YAAY,GAAG,iBAAiB,CAAA;QACpD,IAAI,WAAW,KAAK,OAAO,CAAC,OAAO;YAAE,OAAM;QAC3C,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;QACpD,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACxB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAA;IAED,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9E,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC;YAAE,OAAM;QACjD,MAAM,cAAc,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC9F,IAAI,gBAAgB,CAAC,cAAc,CAAC;YAAE,OAAM;QAC5C,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAA;QACxF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,EAAE,MAAM;YAAE,OAAM;QAC5B,MAAM,QAAQ,GACZ,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;YAC5E,CAAC,CAAC,QAAQ,CAAC,QAAQ;YACnB,CAAC,CAAC,SAAS,CAAA;QACf,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAA;QACvF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;QACxF,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAA;QAChG,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QAC7E,MAAM,OAAO,GAAG,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QACrF,IAAI,kBAAkB,IAAI,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO;YAAE,OAAM;QACxE,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;QACjF,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;YAAE,OAAM;QAC3D,MAAM,oBAAoB,CAAC;YACzB,SAAS;YACT,OAAO;YACP,OAAO;YACP,KAAK;YACL,KAAK;YACL,kBAAkB;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,cAAc,CAAC,QAAQ,CAC5B,MAAM,EACN,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QACpF,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC;YAAE,OAAO,QAAQ,CAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,iBAAiB,GAAG,+BAA+B,CACvD,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,OAAO,CAC3C,CAAA;YACD,IACE,iBAAiB,CAAC,MAAM,KAAK,MAAM;gBACnC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAElE,OAAO,CAAC,MAAM,OAAO,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAA;YACxC,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,UAAU,GAAG,CACjB,MAAM,uBAAuB,CAAC;YAC5B,SAAS;YACT,cAAc;YACd,SAAS;SACV,CAAC,CACH,CAAC,GAAG,CAAA;QACL,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACzC,MAAM,MAAM,GAAG;YACb,6BAA6B,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAClD,sBAAsB,CAAC,gBAAgB,EAAE,UAAU,CAAC;YACtD,uBAAuB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAC9C,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;YACjD,KAAK;YACL,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,IAAI;YACjC,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE;gBACjD,IAAI,CAAC,OAAO;oBAAE,OAAM;gBACpB,MAAM,oBAAoB,CAAC;oBACzB,SAAS;oBACT,OAAO;oBACP,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBAC9D,KAAK;oBACL,KAAK;oBACL,kBAAkB;iBACnB,CAAC,CAAA;YACJ,CAAC;SACyB,CAAA;QAE5B,OAAO,eAAe,CAAC;YACrB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC;YACnF,SAAS,KAAI,CAAC;YACd,QAAQ;YACR,MAAM;SACP,CAAC,CAAA;IACJ,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -4,7 +4,7 @@ import * as Account from '../../../viem/Account.js';
|
|
|
4
4
|
import * as Client from '../../../viem/Client.js';
|
|
5
5
|
import { type ChannelStore } from '../client/ChannelStore.js';
|
|
6
6
|
import { session as sessionPlugin } from '../client/Session.js';
|
|
7
|
-
import {
|
|
7
|
+
import type { SessionReceipt } from '../precompile/Protocol.js';
|
|
8
8
|
import { deserializeSnapshot as deserializeSessionSnapshot, serializeSnapshot as serializeSessionSnapshot } from '../Snapshot.js';
|
|
9
9
|
import type { SessionState } from './Runtime.js';
|
|
10
10
|
import { type TempoSessionChallenge } from './Transports.js';
|
|
@@ -64,6 +64,8 @@ export declare namespace sessionManager {
|
|
|
64
64
|
const serializeSnapshot: typeof serializeSessionSnapshot;
|
|
65
65
|
const deserializeSnapshot: typeof deserializeSessionSnapshot;
|
|
66
66
|
type Parameters = Account.getResolver.Parameters & Client.getResolver.Parameters & {
|
|
67
|
+
/** Automatically acquire the session currency from fallback stablecoins before open/top-up. */
|
|
68
|
+
autoSwap?: sessionPlugin.Parameters['autoSwap'];
|
|
67
69
|
/** Enables same-route HEAD bootstrap from a server session snapshot before opening a new channel. */
|
|
68
70
|
bootstrap?: boolean | undefined;
|
|
69
71
|
/** Viem client instance. Shorthand for `getClient: () => client`. */
|
|
@@ -76,6 +78,11 @@ export declare namespace sessionManager {
|
|
|
76
78
|
fetch?: typeof globalThis.fetch | undefined;
|
|
77
79
|
/** Maximum deposit in human-readable units (e.g. `'10'` for 10 tokens). Converted to raw units via `decimals`. */
|
|
78
80
|
maxDeposit?: string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Preferred automatic top-up size in human-readable units. When omitted,
|
|
83
|
+
* a bounded server `suggestedDeposit` is preferred, then the exact shortfall.
|
|
84
|
+
*/
|
|
85
|
+
topUpAmount?: string | undefined;
|
|
79
86
|
/** Selects the account that signs session credentials. */
|
|
80
87
|
resolveAccount?: sessionPlugin.ResolveAccount | undefined;
|
|
81
88
|
/** Store for reusable session channels. Defaults to in-memory. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/client/SessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AAC7B,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../../src/tempo/session/client/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { parseUnits } from 'viem';
|
|
|
2
2
|
import { tempo as tempo_chain } from 'viem/chains';
|
|
3
3
|
import * as Challenge from '../../../Challenge.js';
|
|
4
4
|
import * as Fetch from '../../../client/internal/Fetch.js';
|
|
5
|
+
import * as MethodChallenge from '../../../client/internal/MethodChallenge.js';
|
|
5
6
|
import * as MethodResponse from '../../../client/internal/MethodResponse.js';
|
|
6
7
|
import * as Constants from '../../../Constants.js';
|
|
7
8
|
import * as Account from '../../../viem/Account.js';
|
|
@@ -13,15 +14,14 @@ import { hydrateSessionSnapshot } from '../client/CredentialState.js';
|
|
|
13
14
|
import { session as sessionPlugin } from '../client/Session.js';
|
|
14
15
|
import * as Channel from '../precompile/Channel.js';
|
|
15
16
|
import { deserializeSessionReceipt } from '../precompile/Protocol.js';
|
|
16
|
-
import { readSessionChallengeAmount } from '../precompile/Protocol.js';
|
|
17
17
|
import { deserializeSnapshot as deserializeSessionSnapshot, serializeSnapshot as serializeSessionSnapshot, } from '../Snapshot.js';
|
|
18
18
|
import { registerSessionManagerInternals } from './internal/SessionManager.js';
|
|
19
19
|
import { createSessionReceiptCoordinator } from './ReceiptCoordinator.js';
|
|
20
20
|
import { resolveCloseTarget } from './Runtime.js';
|
|
21
21
|
import { assertVoucherWithinLocalLimit as assertVoucherWithinLocalAuthorization } from './Runtime.js';
|
|
22
|
-
import { applySessionReceiptToRuntime, captureRuntimeSnapshot as captureRuntimeStateSnapshot, computeFallbackCloseAmount, createSessionManagerRuntime, dispatchSessionEvent, restoreCumulativeAuthorization, restoreRuntimeSnapshot as restoreRuntimeStateSnapshot, } from './Runtime.js';
|
|
22
|
+
import { applySessionReceiptToRuntime, captureRuntimeSnapshot as captureRuntimeStateSnapshot, computeFallbackCloseAmount, createSessionManagerRuntime, dispatchSessionEvent, restoreCumulativeAuthorization, restoreRuntimeSnapshot as restoreRuntimeStateSnapshot, resolveAutomaticTopUp, } from './Runtime.js';
|
|
23
23
|
import { closeSocketSession } from './Runtime.js';
|
|
24
|
-
import { closeHttpSession, getSessionSnapshot, isTempoSessionChallenge,
|
|
24
|
+
import { closeHttpSession, getSessionSnapshot, isTempoSessionChallenge, postTopUp, retryHttpPaymentRequired, webSocketProbeUrl, } from './Transports.js';
|
|
25
25
|
import { WebSocketReadyState, } from './Transports.js';
|
|
26
26
|
import { consumeSseSessionResponse, openSseSession } from './Transports.js';
|
|
27
27
|
import { applyTopUpResult, resolveManualTopUp } from './Transports.js';
|
|
@@ -68,6 +68,7 @@ function resolveSessionManagerConfig(parameters) {
|
|
|
68
68
|
decimals,
|
|
69
69
|
fetch: parameters.fetch ?? globalThis.fetch.bind(globalThis),
|
|
70
70
|
maxVoucherCumulative: parameters.maxDeposit !== undefined ? parseUnits(parameters.maxDeposit, decimals) : null,
|
|
71
|
+
topUpAmount: parameters.topUpAmount !== undefined ? parseUnits(parameters.topUpAmount, decimals) : null,
|
|
71
72
|
WebSocket,
|
|
72
73
|
};
|
|
73
74
|
}
|
|
@@ -108,7 +109,7 @@ export function sessionManager(parameters) {
|
|
|
108
109
|
const entry = await getReusable(key);
|
|
109
110
|
if (entry && channelUse) {
|
|
110
111
|
channelUse.seenExisting.add(key);
|
|
111
|
-
if (!channelUse.created.has(key))
|
|
112
|
+
if (!channelUse.committed && !channelUse.created.has(key))
|
|
112
113
|
channelUse.resumed ??= entry;
|
|
113
114
|
}
|
|
114
115
|
return entry;
|
|
@@ -155,13 +156,29 @@ export function sessionManager(parameters) {
|
|
|
155
156
|
function dispatch(event) {
|
|
156
157
|
return dispatchSessionEvent(runtime, event);
|
|
157
158
|
}
|
|
159
|
+
function commitDurableTopUp(entry) {
|
|
160
|
+
const use = channelUse;
|
|
161
|
+
const baseline = use?.committed?.channel?.entry ?? use?.resumed;
|
|
162
|
+
if (!use ||
|
|
163
|
+
baseline?.channelId.toLowerCase() !== entry.channelId.toLowerCase() ||
|
|
164
|
+
entry.deposit <= baseline.deposit)
|
|
165
|
+
return;
|
|
166
|
+
use.resumed = undefined;
|
|
167
|
+
use.committed = captureRuntimeStateSnapshot({
|
|
168
|
+
channel: runtime.channel,
|
|
169
|
+
spent: runtime.spent,
|
|
170
|
+
state: runtime.state,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
158
173
|
const method = sessionPlugin({
|
|
159
174
|
account: parameters.account,
|
|
175
|
+
autoSwap: parameters.autoSwap,
|
|
160
176
|
getClient: parameters.client ? () => parameters.client : parameters.getClient,
|
|
161
177
|
resolveAccount: parameters.resolveAccount,
|
|
162
178
|
escrow: parameters.escrow,
|
|
163
179
|
decimals: config.decimals,
|
|
164
180
|
maxDeposit: parameters.maxDeposit,
|
|
181
|
+
topUpAmount: parameters.topUpAmount,
|
|
165
182
|
channelStore: store,
|
|
166
183
|
onChannelUpdate(entry) {
|
|
167
184
|
if (entry.channelId !== runtime.channel?.channelId)
|
|
@@ -176,6 +193,7 @@ export function sessionManager(parameters) {
|
|
|
176
193
|
units: 0,
|
|
177
194
|
});
|
|
178
195
|
}
|
|
196
|
+
commitDurableTopUp(entry);
|
|
179
197
|
},
|
|
180
198
|
});
|
|
181
199
|
MethodResponse.unregister(method);
|
|
@@ -201,16 +219,6 @@ export function sessionManager(parameters) {
|
|
|
201
219
|
use.challengesReceived++;
|
|
202
220
|
runtime.lastChallenge = challenge;
|
|
203
221
|
dispatch({ type: 'challengeReceived', challengeId: challenge.id });
|
|
204
|
-
if (runtime.channel?.opened && runtime.lastUrl) {
|
|
205
|
-
const requiredCumulative = runtime.channel.cumulativeAmount + readSessionChallengeAmount(challenge);
|
|
206
|
-
await topUpIfNeeded({
|
|
207
|
-
challenge,
|
|
208
|
-
input: runtime.lastUrl,
|
|
209
|
-
channelId: runtime.channel.channelId,
|
|
210
|
-
deposit: runtime.channel.deposit,
|
|
211
|
-
requiredCumulative,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
222
|
return undefined;
|
|
215
223
|
},
|
|
216
224
|
});
|
|
@@ -247,14 +255,11 @@ export function sessionManager(parameters) {
|
|
|
247
255
|
const snapshot = deserializeSessionSnapshot(header);
|
|
248
256
|
const client = await getClient({ chainId: snapshot.chainId });
|
|
249
257
|
const defaultAccount = getAccount(client);
|
|
250
|
-
const authority = BigInt(snapshot.descriptor.authorizedSigner) === 0n
|
|
251
|
-
? snapshot.descriptor.payer
|
|
252
|
-
: snapshot.descriptor.authorizedSigner;
|
|
253
258
|
const account = (await parameters.resolveAccount?.({
|
|
254
259
|
account: defaultAccount,
|
|
255
260
|
chainId: snapshot.chainId,
|
|
256
261
|
operation: {
|
|
257
|
-
authority,
|
|
262
|
+
authority: Channel.resolveAuthorizedSigner(snapshot.descriptor),
|
|
258
263
|
kind: 'authorizePaymentChannel',
|
|
259
264
|
},
|
|
260
265
|
})) ?? defaultAccount;
|
|
@@ -384,8 +389,9 @@ export function sessionManager(parameters) {
|
|
|
384
389
|
});
|
|
385
390
|
}
|
|
386
391
|
async function postTopUpAndApply(parameters) {
|
|
392
|
+
const { knownDeposit, ...topUp } = parameters;
|
|
387
393
|
const receipt = await postTopUp({
|
|
388
|
-
...
|
|
394
|
+
...topUp,
|
|
389
395
|
channel: runtime.channel,
|
|
390
396
|
createSessionCredential,
|
|
391
397
|
fetch: config.fetch,
|
|
@@ -397,6 +403,7 @@ export function sessionManager(parameters) {
|
|
|
397
403
|
channelId: parameters.channelId,
|
|
398
404
|
challengeId: runtime.lastChallenge?.id,
|
|
399
405
|
currentState: runtime.state,
|
|
406
|
+
knownDeposit,
|
|
400
407
|
receipt,
|
|
401
408
|
spent: runtime.spent,
|
|
402
409
|
});
|
|
@@ -409,18 +416,30 @@ export function sessionManager(parameters) {
|
|
|
409
416
|
spent: runtime.spent.toString(),
|
|
410
417
|
units: runtime.state.status === 'active' ? runtime.state.units : 0,
|
|
411
418
|
});
|
|
419
|
+
commitDurableTopUp(applied.channel);
|
|
412
420
|
}
|
|
413
421
|
return receipt;
|
|
414
422
|
}
|
|
415
423
|
async function topUpIfNeeded(parameters) {
|
|
416
|
-
|
|
424
|
+
const channelDeposit = runtime.channel?.channelId === parameters.channelId ? runtime.channel.deposit : 0n;
|
|
425
|
+
const deposit = channelDeposit > parameters.deposit ? channelDeposit : parameters.deposit;
|
|
426
|
+
const additionalDeposit = resolveAutomaticTopUp({
|
|
427
|
+
deposit,
|
|
428
|
+
maxDeposit: config.maxVoucherCumulative,
|
|
429
|
+
requiredCumulative: parameters.requiredCumulative,
|
|
430
|
+
suggestedDeposit: parameters.challenge.request.suggestedDeposit === undefined
|
|
431
|
+
? undefined
|
|
432
|
+
: BigInt(parameters.challenge.request.suggestedDeposit),
|
|
433
|
+
topUpAmount: config.topUpAmount,
|
|
434
|
+
});
|
|
435
|
+
if (additionalDeposit === 0n)
|
|
417
436
|
return;
|
|
418
|
-
assertVoucherWithinLocalLimit(parameters.requiredCumulative);
|
|
419
437
|
await postTopUpAndApply({
|
|
420
438
|
challenge: parameters.challenge,
|
|
421
439
|
input: parameters.input,
|
|
422
440
|
channelId: parameters.channelId,
|
|
423
|
-
additionalDeposit
|
|
441
|
+
additionalDeposit,
|
|
442
|
+
knownDeposit: deposit,
|
|
424
443
|
});
|
|
425
444
|
}
|
|
426
445
|
function restoreCumulative(channelId, cumulativeAmount) {
|
|
@@ -473,6 +492,7 @@ export function sessionManager(parameters) {
|
|
|
473
492
|
});
|
|
474
493
|
const use = {
|
|
475
494
|
challengesReceived: 0,
|
|
495
|
+
committed: undefined,
|
|
476
496
|
created: new Map(),
|
|
477
497
|
previous,
|
|
478
498
|
seenExisting: new Set(),
|
|
@@ -503,7 +523,7 @@ export function sessionManager(parameters) {
|
|
|
503
523
|
response = await wrappedFetch(input, effectiveInit);
|
|
504
524
|
}
|
|
505
525
|
catch (error) {
|
|
506
|
-
restoreRuntime(previous);
|
|
526
|
+
restoreRuntime(use.committed ?? previous);
|
|
507
527
|
if (await retryWithoutResumed())
|
|
508
528
|
continue;
|
|
509
529
|
throw error;
|
|
@@ -530,7 +550,7 @@ export function sessionManager(parameters) {
|
|
|
530
550
|
}
|
|
531
551
|
}
|
|
532
552
|
if (!attemptedHttpManagement && !paymentResponse.ok && !paymentResponse.receipt) {
|
|
533
|
-
restoreRuntime(previous);
|
|
553
|
+
restoreRuntime(use.committed ?? previous);
|
|
534
554
|
if (await retryWithoutResumed())
|
|
535
555
|
continue;
|
|
536
556
|
return paymentResponse;
|
|
@@ -568,7 +588,6 @@ export function sessionManager(parameters) {
|
|
|
568
588
|
getChannel: () => runtime.channel,
|
|
569
589
|
getChallenge: () => runtime.lastChallenge,
|
|
570
590
|
assertVoucherWithinLocalLimit,
|
|
571
|
-
managementInput,
|
|
572
591
|
acceptReceipt(receipt) {
|
|
573
592
|
updateSpentFromReceipt(receipt);
|
|
574
593
|
},
|
|
@@ -617,7 +636,16 @@ export function sessionManager(parameters) {
|
|
|
617
636
|
// Cold starts resume from `channelStore` after the probe's 402.
|
|
618
637
|
const liveHint = runtime.channel?.opened ? runtime.channel.channelId : undefined;
|
|
619
638
|
const prepared = await prepareWebSocketSession({
|
|
620
|
-
createSessionCredential,
|
|
639
|
+
async createSessionCredential(challenge, context) {
|
|
640
|
+
runtime.lastChallenge = challenge;
|
|
641
|
+
await MethodChallenge.handle(method, {
|
|
642
|
+
challenge,
|
|
643
|
+
context,
|
|
644
|
+
fetch: config.fetch,
|
|
645
|
+
input: probeUrl,
|
|
646
|
+
});
|
|
647
|
+
return createSessionCredential(challenge, context);
|
|
648
|
+
},
|
|
621
649
|
fetch: config.fetch,
|
|
622
650
|
input,
|
|
623
651
|
onProbeUrl(httpUrl) {
|