@solana/mpp 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +212 -0
  2. package/dist/Methods.d.ts +1 -213
  3. package/dist/Methods.d.ts.map +1 -1
  4. package/dist/Methods.js +1 -158
  5. package/dist/Methods.js.map +1 -1
  6. package/dist/client/Methods.d.ts +0 -2
  7. package/dist/client/Methods.d.ts.map +1 -1
  8. package/dist/client/Methods.js +0 -2
  9. package/dist/client/Methods.js.map +1 -1
  10. package/dist/client/index.d.ts +0 -1
  11. package/dist/client/index.d.ts.map +1 -1
  12. package/dist/client/index.js +0 -1
  13. package/dist/client/index.js.map +1 -1
  14. package/dist/index.d.ts +0 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +0 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/server/Charge.d.ts +2 -2
  19. package/dist/server/Charge.d.ts.map +1 -1
  20. package/dist/server/Charge.js +4 -0
  21. package/dist/server/Charge.js.map +1 -1
  22. package/dist/server/Methods.d.ts +0 -2
  23. package/dist/server/Methods.d.ts.map +1 -1
  24. package/dist/server/Methods.js +0 -2
  25. package/dist/server/Methods.js.map +1 -1
  26. package/dist/server/index.d.ts +0 -1
  27. package/dist/server/index.d.ts.map +1 -1
  28. package/dist/server/index.js +0 -1
  29. package/dist/server/index.js.map +1 -1
  30. package/package.json +1 -9
  31. package/src/Methods.ts +1 -171
  32. package/src/client/Methods.ts +0 -3
  33. package/src/client/index.ts +0 -1
  34. package/src/index.ts +0 -29
  35. package/src/server/Charge.ts +7 -2
  36. package/src/server/Methods.ts +0 -3
  37. package/src/server/index.ts +0 -1
  38. package/dist/client/Session.d.ts +0 -195
  39. package/dist/client/Session.d.ts.map +0 -1
  40. package/dist/client/Session.js +0 -411
  41. package/dist/client/Session.js.map +0 -1
  42. package/dist/server/Session.d.ts +0 -171
  43. package/dist/server/Session.d.ts.map +0 -1
  44. package/dist/server/Session.js +0 -430
  45. package/dist/server/Session.js.map +0 -1
  46. package/dist/session/ChannelStore.d.ts +0 -12
  47. package/dist/session/ChannelStore.d.ts.map +0 -1
  48. package/dist/session/ChannelStore.js +0 -88
  49. package/dist/session/ChannelStore.js.map +0 -1
  50. package/dist/session/Types.d.ts +0 -179
  51. package/dist/session/Types.d.ts.map +0 -1
  52. package/dist/session/Types.js +0 -2
  53. package/dist/session/Types.js.map +0 -1
  54. package/dist/session/Voucher.d.ts +0 -7
  55. package/dist/session/Voucher.d.ts.map +0 -1
  56. package/dist/session/Voucher.js +0 -118
  57. package/dist/session/Voucher.js.map +0 -1
  58. package/dist/session/authorizers/BudgetAuthorizer.d.ts +0 -90
  59. package/dist/session/authorizers/BudgetAuthorizer.d.ts.map +0 -1
  60. package/dist/session/authorizers/BudgetAuthorizer.js +0 -398
  61. package/dist/session/authorizers/BudgetAuthorizer.js.map +0 -1
  62. package/dist/session/authorizers/SwigSessionAuthorizer.d.ts +0 -104
  63. package/dist/session/authorizers/SwigSessionAuthorizer.d.ts.map +0 -1
  64. package/dist/session/authorizers/SwigSessionAuthorizer.js +0 -522
  65. package/dist/session/authorizers/SwigSessionAuthorizer.js.map +0 -1
  66. package/dist/session/authorizers/UnboundedAuthorizer.d.ts +0 -36
  67. package/dist/session/authorizers/UnboundedAuthorizer.d.ts.map +0 -1
  68. package/dist/session/authorizers/UnboundedAuthorizer.js +0 -204
  69. package/dist/session/authorizers/UnboundedAuthorizer.js.map +0 -1
  70. package/dist/session/authorizers/index.d.ts +0 -5
  71. package/dist/session/authorizers/index.d.ts.map +0 -1
  72. package/dist/session/authorizers/index.js +0 -5
  73. package/dist/session/authorizers/index.js.map +0 -1
  74. package/dist/session/authorizers/makeSessionAuthorizer.d.ts +0 -19
  75. package/dist/session/authorizers/makeSessionAuthorizer.d.ts.map +0 -1
  76. package/dist/session/authorizers/makeSessionAuthorizer.js +0 -72
  77. package/dist/session/authorizers/makeSessionAuthorizer.js.map +0 -1
  78. package/dist/session/index.d.ts +0 -5
  79. package/dist/session/index.d.ts.map +0 -1
  80. package/dist/session/index.js +0 -5
  81. package/dist/session/index.js.map +0 -1
  82. package/src/client/Session.ts +0 -630
  83. package/src/server/Session.ts +0 -687
  84. package/src/session/ChannelStore.ts +0 -128
  85. package/src/session/Types.ts +0 -189
  86. package/src/session/Voucher.ts +0 -158
  87. package/src/session/authorizers/BudgetAuthorizer.ts +0 -574
  88. package/src/session/authorizers/SwigSessionAuthorizer.ts +0 -767
  89. package/src/session/authorizers/UnboundedAuthorizer.ts +0 -284
  90. package/src/session/authorizers/index.ts +0 -4
  91. package/src/session/authorizers/makeSessionAuthorizer.ts +0 -104
  92. package/src/session/index.ts +0 -4
@@ -1,195 +0,0 @@
1
- import type { TransactionSigner } from '@solana/kit';
2
- import { Method, z } from 'mppx';
3
- import type { SessionAuthorizer } from '../session/Types.js';
4
- type SessionAsset = {
5
- decimals: number;
6
- kind: 'sol' | 'spl';
7
- mint?: string;
8
- symbol?: string;
9
- };
10
- export declare const sessionContextSchema: z.ZodMiniObject<{
11
- action: z.ZodMiniOptional<z.ZodMiniEnum<{
12
- open: "open";
13
- update: "update";
14
- topup: "topup";
15
- close: "close";
16
- }>>;
17
- additionalAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
18
- channelId: z.ZodMiniOptional<z.ZodMiniString<string>>;
19
- cumulativeAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
20
- depositAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
21
- openTx: z.ZodMiniOptional<z.ZodMiniString<string>>;
22
- sequence: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
23
- topupTx: z.ZodMiniOptional<z.ZodMiniString<string>>;
24
- }, z.core.$strip>;
25
- export type SessionContext = z.infer<typeof sessionContextSchema>;
26
- export declare function session(parameters: session.Parameters): Method.Client<{
27
- readonly intent: "session";
28
- readonly name: "solana";
29
- readonly schema: {
30
- readonly credential: {
31
- readonly payload: z.ZodMiniDiscriminatedUnion<[z.ZodMiniObject<{
32
- action: z.ZodMiniLiteral<"open">;
33
- authorizationMode: z.ZodMiniString<string>;
34
- capabilities: z.ZodMiniOptional<z.ZodMiniObject<{
35
- allowedActions: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
36
- maxCumulativeAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
37
- }, z.core.$strip>>;
38
- channelId: z.ZodMiniString<string>;
39
- depositAmount: z.ZodMiniString<string>;
40
- expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
41
- openTx: z.ZodMiniString<string>;
42
- payer: z.ZodMiniString<string>;
43
- voucher: z.ZodMiniObject<{
44
- signature: z.ZodMiniString<string>;
45
- signatureType: z.ZodMiniString<string>;
46
- signer: z.ZodMiniString<string>;
47
- voucher: z.ZodMiniObject<{
48
- chainId: z.ZodMiniString<string>;
49
- channelId: z.ZodMiniString<string>;
50
- channelProgram: z.ZodMiniString<string>;
51
- cumulativeAmount: z.ZodMiniString<string>;
52
- expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
53
- meter: z.ZodMiniString<string>;
54
- payer: z.ZodMiniString<string>;
55
- recipient: z.ZodMiniString<string>;
56
- sequence: z.ZodMiniNumber<number>;
57
- serverNonce: z.ZodMiniString<string>;
58
- units: z.ZodMiniString<string>;
59
- }, z.core.$strip>;
60
- }, z.core.$strip>;
61
- }, z.core.$strip>, z.ZodMiniObject<{
62
- action: z.ZodMiniLiteral<"update">;
63
- channelId: z.ZodMiniString<string>;
64
- voucher: z.ZodMiniObject<{
65
- signature: z.ZodMiniString<string>;
66
- signatureType: z.ZodMiniString<string>;
67
- signer: z.ZodMiniString<string>;
68
- voucher: z.ZodMiniObject<{
69
- chainId: z.ZodMiniString<string>;
70
- channelId: z.ZodMiniString<string>;
71
- channelProgram: z.ZodMiniString<string>;
72
- cumulativeAmount: z.ZodMiniString<string>;
73
- expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
74
- meter: z.ZodMiniString<string>;
75
- payer: z.ZodMiniString<string>;
76
- recipient: z.ZodMiniString<string>;
77
- sequence: z.ZodMiniNumber<number>;
78
- serverNonce: z.ZodMiniString<string>;
79
- units: z.ZodMiniString<string>;
80
- }, z.core.$strip>;
81
- }, z.core.$strip>;
82
- }, z.core.$strip>, z.ZodMiniObject<{
83
- action: z.ZodMiniLiteral<"topup">;
84
- additionalAmount: z.ZodMiniString<string>;
85
- channelId: z.ZodMiniString<string>;
86
- topupTx: z.ZodMiniString<string>;
87
- }, z.core.$strip>, z.ZodMiniObject<{
88
- action: z.ZodMiniLiteral<"close">;
89
- channelId: z.ZodMiniString<string>;
90
- closeTx: z.ZodMiniOptional<z.ZodMiniString<string>>;
91
- voucher: z.ZodMiniObject<{
92
- signature: z.ZodMiniString<string>;
93
- signatureType: z.ZodMiniString<string>;
94
- signer: z.ZodMiniString<string>;
95
- voucher: z.ZodMiniObject<{
96
- chainId: z.ZodMiniString<string>;
97
- channelId: z.ZodMiniString<string>;
98
- channelProgram: z.ZodMiniString<string>;
99
- cumulativeAmount: z.ZodMiniString<string>;
100
- expiresAt: z.ZodMiniOptional<z.ZodMiniString<string>>;
101
- meter: z.ZodMiniString<string>;
102
- payer: z.ZodMiniString<string>;
103
- recipient: z.ZodMiniString<string>;
104
- sequence: z.ZodMiniNumber<number>;
105
- serverNonce: z.ZodMiniString<string>;
106
- units: z.ZodMiniString<string>;
107
- }, z.core.$strip>;
108
- }, z.core.$strip>;
109
- }, z.core.$strip>], "action">;
110
- };
111
- readonly request: z.ZodMiniObject<{
112
- asset: z.ZodMiniObject<{
113
- decimals: z.ZodMiniNumber<number>;
114
- kind: z.ZodMiniString<string>;
115
- mint: z.ZodMiniOptional<z.ZodMiniString<string>>;
116
- symbol: z.ZodMiniOptional<z.ZodMiniString<string>>;
117
- }, z.core.$strip>;
118
- channelProgram: z.ZodMiniString<string>;
119
- network: z.ZodMiniOptional<z.ZodMiniString<string>>;
120
- pricing: z.ZodMiniOptional<z.ZodMiniObject<{
121
- amountPerUnit: z.ZodMiniString<string>;
122
- meter: z.ZodMiniString<string>;
123
- minDebit: z.ZodMiniOptional<z.ZodMiniString<string>>;
124
- unit: z.ZodMiniString<string>;
125
- }, z.core.$strip>>;
126
- recipient: z.ZodMiniString<string>;
127
- sessionDefaults: z.ZodMiniOptional<z.ZodMiniObject<{
128
- closeBehavior: z.ZodMiniOptional<z.ZodMiniString<string>>;
129
- settleInterval: z.ZodMiniOptional<z.ZodMiniObject<{
130
- kind: z.ZodMiniString<string>;
131
- minIncrement: z.ZodMiniOptional<z.ZodMiniString<string>>;
132
- seconds: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
133
- }, z.core.$strip>>;
134
- suggestedDeposit: z.ZodMiniOptional<z.ZodMiniString<string>>;
135
- ttlSeconds: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
136
- }, z.core.$strip>>;
137
- verifier: z.ZodMiniOptional<z.ZodMiniObject<{
138
- acceptAuthorizationModes: z.ZodMiniOptional<z.ZodMiniArray<z.ZodMiniString<string>>>;
139
- maxClockSkewSeconds: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
140
- }, z.core.$strip>>;
141
- }, z.core.$strip>;
142
- };
143
- }, z.ZodMiniObject<{
144
- action: z.ZodMiniOptional<z.ZodMiniEnum<{
145
- open: "open";
146
- update: "update";
147
- topup: "topup";
148
- close: "close";
149
- }>>;
150
- additionalAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
151
- channelId: z.ZodMiniOptional<z.ZodMiniString<string>>;
152
- cumulativeAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
153
- depositAmount: z.ZodMiniOptional<z.ZodMiniString<string>>;
154
- openTx: z.ZodMiniOptional<z.ZodMiniString<string>>;
155
- sequence: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
156
- topupTx: z.ZodMiniOptional<z.ZodMiniString<string>>;
157
- }, z.core.$strip>>;
158
- export declare namespace session {
159
- type Parameters = {
160
- authorizer: SessionAuthorizer;
161
- autoOpen?: boolean;
162
- autoTopup?: boolean;
163
- onProgress?: (event: ProgressEvent) => void;
164
- settleOnLimitHit?: boolean;
165
- signer?: TransactionSigner;
166
- };
167
- type ProgressEvent = {
168
- asset: SessionAsset;
169
- network: string;
170
- recipient: string;
171
- type: 'challenge';
172
- } | {
173
- channelId: string;
174
- cumulativeAmount: string;
175
- type: 'updated';
176
- } | {
177
- channelId: string;
178
- cumulativeAmount: string;
179
- type: 'updating';
180
- } | {
181
- channelId: string;
182
- type: 'closed';
183
- } | {
184
- channelId: string;
185
- type: 'closing';
186
- } | {
187
- channelId: string;
188
- type: 'opened';
189
- } | {
190
- channelId: string;
191
- type: 'opening';
192
- };
193
- }
194
- export {};
195
- //# sourceMappingURL=Session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../src/client/Session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAA8B,MAAM,EAAE,CAAC,EAAE,MAAM,MAAM,CAAC;AAG7D,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,qBAAqB,CAAC;AAEvF,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAmCF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAS/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,wBAAgB,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA2WrD;AA6LD,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC7B,KAAK,UAAU,GAAG;QACd,UAAU,EAAE,iBAAiB,CAAC;QAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;QAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,MAAM,CAAC,EAAE,iBAAiB,CAAC;KAC9B,CAAC;IAEF,KAAK,aAAa,GACZ;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,GAC9E;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,GAChE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GACjE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GACrC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,GACtC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GACrC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC;CAChD"}
@@ -1,411 +0,0 @@
1
- import { Credential, Method, z } from 'mppx';
2
- import * as Methods from '../Methods.js';
3
- export const sessionContextSchema = z.object({
4
- action: z.optional(z.enum(['open', 'update', 'topup', 'close'])),
5
- additionalAmount: z.optional(z.string()),
6
- channelId: z.optional(z.string()),
7
- cumulativeAmount: z.optional(z.string()),
8
- depositAmount: z.optional(z.string()),
9
- openTx: z.optional(z.string()),
10
- sequence: z.optional(z.number()),
11
- topupTx: z.optional(z.string()),
12
- });
13
- export function session(parameters) {
14
- const { signer, authorizer, autoOpen = true, autoTopup = false, settleOnLimitHit = false, onProgress } = parameters;
15
- let activeChannel = null;
16
- return Method.toClient(Methods.session, {
17
- context: sessionContextSchema,
18
- async createCredential({ challenge, context }) {
19
- const request = challenge.request;
20
- const recipient = request.recipient;
21
- const network = request.network ?? 'mainnet-beta';
22
- const asset = request.asset;
23
- const channelProgram = request.channelProgram;
24
- const pricing = request.pricing;
25
- const sessionDefaults = request.sessionDefaults;
26
- onProgress?.({
27
- asset,
28
- network,
29
- recipient,
30
- type: 'challenge',
31
- });
32
- if (context?.action === 'topup') {
33
- return await handleTopupAction(challenge, context, authorizer, activeChannel, channelProgram, network);
34
- }
35
- if (context?.action === 'close') {
36
- const credential = await handleCloseAction(challenge, context, authorizer, activeChannel, channelProgram, recipient, network, onProgress);
37
- activeChannel = null;
38
- return credential;
39
- }
40
- if (context?.action === 'open') {
41
- if (!context.channelId) {
42
- throw new Error('channelId is required for open action');
43
- }
44
- if (!context.depositAmount) {
45
- throw new Error('depositAmount is required for open action');
46
- }
47
- const channelId = context.channelId;
48
- const depositAmount = context.depositAmount;
49
- const parsedDepositAmount = parseNonNegativeAmount(depositAmount, 'context.depositAmount');
50
- const serverNonce = crypto.randomUUID();
51
- onProgress?.({ channelId, type: 'opening' });
52
- const openResult = await authorizer.authorizeOpen({
53
- asset,
54
- channelId,
55
- channelProgram,
56
- depositAmount,
57
- network,
58
- pricing,
59
- recipient,
60
- serverNonce,
61
- });
62
- const payer = resolveOpenPayer(openResult.voucher.voucher.payer, signer);
63
- const payload = {
64
- action: 'open',
65
- authorizationMode: authorizer.getMode(),
66
- channelId,
67
- depositAmount,
68
- openTx: context.openTx ?? openResult.openTx,
69
- payer,
70
- ...(openResult.expiresAt ? { expiresAt: openResult.expiresAt } : {}),
71
- capabilities: {
72
- ...(openResult.capabilities.maxCumulativeAmount
73
- ? {
74
- maxCumulativeAmount: openResult.capabilities.maxCumulativeAmount,
75
- }
76
- : {}),
77
- ...(openResult.capabilities.allowedActions
78
- ? { allowedActions: openResult.capabilities.allowedActions }
79
- : {}),
80
- },
81
- voucher: openResult.voucher,
82
- };
83
- activeChannel = {
84
- asset: normalizeAsset(asset),
85
- channelId,
86
- channelProgram,
87
- cumulativeAmount: parseNonNegativeAmount(openResult.voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount'),
88
- depositAmount: parsedDepositAmount,
89
- network,
90
- recipient,
91
- sequence: assertNonNegativeSequence(openResult.voucher.voucher.sequence),
92
- serverNonce: openResult.voucher.voucher.serverNonce,
93
- };
94
- onProgress?.({ channelId, type: 'opened' });
95
- return Credential.serialize({
96
- challenge,
97
- payload,
98
- });
99
- }
100
- if (context?.action === 'update') {
101
- const channelId = context.channelId ?? activeChannel?.channelId;
102
- if (!channelId) {
103
- throw new Error('channelId is required for update action');
104
- }
105
- if (!activeChannel || activeChannel.channelId !== channelId) {
106
- throw new Error('Cannot update a channel that is not active');
107
- }
108
- if (!context.cumulativeAmount) {
109
- throw new Error('cumulativeAmount is required for update action');
110
- }
111
- if (context.sequence === undefined) {
112
- throw new Error('sequence is required for update action');
113
- }
114
- const nextCumulativeAmount = parseNonNegativeAmount(context.cumulativeAmount, 'context.cumulativeAmount');
115
- const nextSequence = assertNonNegativeSequence(context.sequence);
116
- onProgress?.({
117
- channelId,
118
- cumulativeAmount: nextCumulativeAmount.toString(),
119
- type: 'updating',
120
- });
121
- const updateResult = await authorizer.authorizeUpdate({
122
- channelId,
123
- channelProgram,
124
- cumulativeAmount: nextCumulativeAmount.toString(),
125
- meter: pricing?.meter ?? 'session',
126
- network,
127
- recipient,
128
- sequence: nextSequence,
129
- serverNonce: activeChannel.serverNonce,
130
- units: pricing ? '1' : '0',
131
- });
132
- const payload = {
133
- action: 'update',
134
- channelId,
135
- voucher: updateResult.voucher,
136
- };
137
- activeChannel.cumulativeAmount = parseNonNegativeAmount(updateResult.voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount');
138
- activeChannel.sequence = assertNonNegativeSequence(updateResult.voucher.voucher.sequence);
139
- activeChannel.serverNonce = updateResult.voucher.voucher.serverNonce;
140
- onProgress?.({
141
- channelId,
142
- cumulativeAmount: activeChannel.cumulativeAmount.toString(),
143
- type: 'updated',
144
- });
145
- return Credential.serialize({
146
- challenge,
147
- payload,
148
- });
149
- }
150
- const scopedActiveChannel = activeChannel &&
151
- matchesScope(activeChannel, {
152
- asset,
153
- channelProgram,
154
- network,
155
- recipient,
156
- })
157
- ? activeChannel
158
- : null;
159
- if (!scopedActiveChannel) {
160
- if (!autoOpen) {
161
- throw new Error('No active session channel for challenge scope and autoOpen is disabled');
162
- }
163
- const channelId = crypto.randomUUID();
164
- const serverNonce = crypto.randomUUID();
165
- const depositAmount = sessionDefaults?.suggestedDeposit ?? '0';
166
- const parsedDepositAmount = parseNonNegativeAmount(depositAmount, 'sessionDefaults.suggestedDeposit');
167
- onProgress?.({ channelId, type: 'opening' });
168
- const openResult = await authorizer.authorizeOpen({
169
- asset,
170
- channelId,
171
- channelProgram,
172
- depositAmount,
173
- network,
174
- pricing,
175
- recipient,
176
- serverNonce,
177
- });
178
- const payer = resolveOpenPayer(openResult.voucher.voucher.payer, signer);
179
- const payload = {
180
- action: 'open',
181
- authorizationMode: authorizer.getMode(),
182
- channelId,
183
- depositAmount,
184
- openTx: openResult.openTx,
185
- payer,
186
- ...(openResult.expiresAt ? { expiresAt: openResult.expiresAt } : {}),
187
- capabilities: {
188
- ...(openResult.capabilities.maxCumulativeAmount
189
- ? {
190
- maxCumulativeAmount: openResult.capabilities.maxCumulativeAmount,
191
- }
192
- : {}),
193
- ...(openResult.capabilities.allowedActions
194
- ? { allowedActions: openResult.capabilities.allowedActions }
195
- : {}),
196
- },
197
- voucher: openResult.voucher,
198
- };
199
- activeChannel = {
200
- asset: normalizeAsset(asset),
201
- channelId,
202
- channelProgram,
203
- cumulativeAmount: parseNonNegativeAmount(openResult.voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount'),
204
- depositAmount: parsedDepositAmount,
205
- network,
206
- recipient,
207
- sequence: assertNonNegativeSequence(openResult.voucher.voucher.sequence),
208
- serverNonce: openResult.voucher.voucher.serverNonce,
209
- };
210
- onProgress?.({ channelId, type: 'opened' });
211
- return Credential.serialize({
212
- challenge,
213
- payload,
214
- });
215
- }
216
- const debitIncrement = resolveDebitIncrement(pricing);
217
- const nextCumulativeAmount = scopedActiveChannel.cumulativeAmount + debitIncrement;
218
- const nextSequence = scopedActiveChannel.sequence + 1;
219
- if (nextCumulativeAmount > scopedActiveChannel.depositAmount) {
220
- if (!autoTopup) {
221
- if (!settleOnLimitHit) {
222
- throw new Error('Voucher cumulative amount exceeds tracked deposit and autoTopup is disabled');
223
- }
224
- const closeCredential = await handleCloseAction(challenge, {
225
- action: 'close',
226
- channelId: scopedActiveChannel.channelId,
227
- }, authorizer, scopedActiveChannel, channelProgram, recipient, network, onProgress);
228
- activeChannel = null;
229
- return closeCredential;
230
- }
231
- const additionalAmount = resolveAutoTopupAmount(sessionDefaults?.suggestedDeposit, nextCumulativeAmount, scopedActiveChannel.depositAmount);
232
- const topupResult = await authorizer.authorizeTopup({
233
- additionalAmount: additionalAmount.toString(),
234
- channelId: scopedActiveChannel.channelId,
235
- channelProgram,
236
- network,
237
- });
238
- scopedActiveChannel.depositAmount += additionalAmount;
239
- const payload = {
240
- action: 'topup',
241
- additionalAmount: additionalAmount.toString(),
242
- channelId: scopedActiveChannel.channelId,
243
- topupTx: topupResult.topupTx,
244
- };
245
- return Credential.serialize({
246
- challenge,
247
- payload,
248
- });
249
- }
250
- onProgress?.({
251
- channelId: scopedActiveChannel.channelId,
252
- cumulativeAmount: nextCumulativeAmount.toString(),
253
- type: 'updating',
254
- });
255
- const updateResult = await authorizer.authorizeUpdate({
256
- channelId: scopedActiveChannel.channelId,
257
- channelProgram,
258
- cumulativeAmount: nextCumulativeAmount.toString(),
259
- meter: pricing?.meter ?? 'session',
260
- network,
261
- recipient,
262
- sequence: nextSequence,
263
- serverNonce: scopedActiveChannel.serverNonce,
264
- units: pricing ? '1' : '0',
265
- });
266
- const payload = {
267
- action: 'update',
268
- channelId: scopedActiveChannel.channelId,
269
- voucher: updateResult.voucher,
270
- };
271
- scopedActiveChannel.cumulativeAmount = parseNonNegativeAmount(updateResult.voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount');
272
- scopedActiveChannel.sequence = assertNonNegativeSequence(updateResult.voucher.voucher.sequence);
273
- scopedActiveChannel.serverNonce = updateResult.voucher.voucher.serverNonce;
274
- onProgress?.({
275
- channelId: scopedActiveChannel.channelId,
276
- cumulativeAmount: scopedActiveChannel.cumulativeAmount.toString(),
277
- type: 'updated',
278
- });
279
- return Credential.serialize({
280
- challenge,
281
- payload,
282
- });
283
- },
284
- });
285
- }
286
- async function handleTopupAction(challenge, context, authorizer, activeChannel, channelProgram, network) {
287
- const channelId = context.channelId ?? activeChannel?.channelId;
288
- if (!channelId) {
289
- throw new Error('channelId is required for topup action');
290
- }
291
- if (!context.additionalAmount) {
292
- throw new Error('additionalAmount is required for topup action');
293
- }
294
- const additionalAmount = parseNonNegativeAmount(context.additionalAmount, 'context.additionalAmount');
295
- const topupResult = await authorizer.authorizeTopup({
296
- additionalAmount: additionalAmount.toString(),
297
- channelId,
298
- channelProgram,
299
- network,
300
- });
301
- if (activeChannel && activeChannel.channelId === channelId) {
302
- activeChannel.depositAmount += additionalAmount;
303
- }
304
- const payload = {
305
- action: 'topup',
306
- additionalAmount: additionalAmount.toString(),
307
- channelId,
308
- topupTx: topupResult.topupTx,
309
- };
310
- return Credential.serialize({ challenge, payload });
311
- }
312
- async function handleCloseAction(challenge, context, authorizer, activeChannel, channelProgram, recipient, network, onProgress) {
313
- const channelId = context.channelId ?? activeChannel?.channelId;
314
- if (!channelId) {
315
- throw new Error('channelId is required for close action');
316
- }
317
- if (!activeChannel || activeChannel.channelId !== channelId) {
318
- throw new Error('Cannot close a channel that is not active');
319
- }
320
- const finalSequence = activeChannel.sequence + 1;
321
- onProgress?.({ channelId, type: 'closing' });
322
- const closeResult = await authorizer.authorizeClose({
323
- channelId,
324
- channelProgram,
325
- finalCumulativeAmount: activeChannel.cumulativeAmount.toString(),
326
- network,
327
- recipient,
328
- sequence: finalSequence,
329
- serverNonce: activeChannel.serverNonce,
330
- });
331
- const payload = {
332
- action: 'close',
333
- channelId,
334
- ...(closeResult.closeTx ? { closeTx: closeResult.closeTx } : {}),
335
- voucher: closeResult.voucher,
336
- };
337
- onProgress?.({ channelId, type: 'closed' });
338
- return Credential.serialize({ challenge, payload });
339
- }
340
- function resolveDebitIncrement(pricing) {
341
- if (pricing?.minDebit !== undefined) {
342
- return parseNonNegativeAmount(pricing.minDebit, 'pricing.minDebit');
343
- }
344
- if (pricing?.amountPerUnit !== undefined) {
345
- return parseNonNegativeAmount(pricing.amountPerUnit, 'pricing.amountPerUnit');
346
- }
347
- return 0n;
348
- }
349
- function resolveAutoTopupAmount(suggestedDeposit, nextCumulativeAmount, depositAmount) {
350
- const shortfall = nextCumulativeAmount - depositAmount;
351
- if (shortfall <= 0n) {
352
- return 0n;
353
- }
354
- if (suggestedDeposit === undefined) {
355
- return shortfall;
356
- }
357
- const parsedSuggestedDeposit = parseNonNegativeAmount(suggestedDeposit, 'sessionDefaults.suggestedDeposit');
358
- return parsedSuggestedDeposit > shortfall ? parsedSuggestedDeposit : shortfall;
359
- }
360
- function matchesScope(active, scope) {
361
- if (active.recipient !== scope.recipient) {
362
- return false;
363
- }
364
- if (active.network !== scope.network) {
365
- return false;
366
- }
367
- if (active.channelProgram !== scope.channelProgram) {
368
- return false;
369
- }
370
- return sameAsset(active.asset, scope.asset);
371
- }
372
- function sameAsset(left, right) {
373
- return (left.kind === right.kind &&
374
- left.decimals === right.decimals &&
375
- (left.mint ?? '') === (right.mint ?? '') &&
376
- (left.symbol ?? '') === (right.symbol ?? ''));
377
- }
378
- function normalizeAsset(asset) {
379
- return {
380
- decimals: asset.decimals,
381
- kind: asset.kind,
382
- ...(asset.mint ? { mint: asset.mint } : {}),
383
- ...(asset.symbol ? { symbol: asset.symbol } : {}),
384
- };
385
- }
386
- function assertNonNegativeSequence(value) {
387
- if (!Number.isInteger(value) || value < 0) {
388
- throw new Error('voucher.sequence must be a non-negative integer');
389
- }
390
- return value;
391
- }
392
- function parseNonNegativeAmount(value, field) {
393
- let amount;
394
- try {
395
- amount = BigInt(value);
396
- }
397
- catch {
398
- throw new Error(`${field} must be a valid integer string`);
399
- }
400
- if (amount < 0n) {
401
- throw new Error(`${field} must be non-negative`);
402
- }
403
- return amount;
404
- }
405
- function resolveOpenPayer(voucherPayer, signer) {
406
- if (signer && signer.address !== voucherPayer) {
407
- throw new Error(`Open voucher payer ${voucherPayer} does not match signer address ${signer.address}`);
408
- }
409
- return voucherPayer;
410
- }
411
- //# sourceMappingURL=Session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Session.js","sourceRoot":"","sources":["../../src/client/Session.ts"],"names":[],"mappings":"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"}