mppx 0.3.3 → 0.3.5

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 (148) hide show
  1. package/README.md +0 -52
  2. package/dist/Challenge.d.ts +8 -0
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +20 -4
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Errors.d.ts +7 -7
  7. package/dist/Errors.d.ts.map +1 -1
  8. package/dist/Errors.js +7 -7
  9. package/dist/Errors.js.map +1 -1
  10. package/dist/cli.js +280 -119
  11. package/dist/cli.js.map +1 -1
  12. package/dist/internal/env.js +2 -2
  13. package/dist/internal/env.js.map +1 -1
  14. package/dist/server/Mppx.d.ts +2 -0
  15. package/dist/server/Mppx.d.ts.map +1 -1
  16. package/dist/server/Mppx.js +4 -3
  17. package/dist/server/Mppx.js.map +1 -1
  18. package/dist/tempo/client/ChannelOps.d.ts +5 -5
  19. package/dist/tempo/client/ChannelOps.d.ts.map +1 -1
  20. package/dist/tempo/client/ChannelOps.js +3 -3
  21. package/dist/tempo/client/ChannelOps.js.map +1 -1
  22. package/dist/tempo/client/Session.d.ts +2 -2
  23. package/dist/tempo/client/Session.d.ts.map +1 -1
  24. package/dist/tempo/client/Session.js +3 -3
  25. package/dist/tempo/client/Session.js.map +1 -1
  26. package/dist/tempo/client/SessionManager.d.ts +4 -4
  27. package/dist/tempo/client/SessionManager.d.ts.map +1 -1
  28. package/dist/tempo/client/SessionManager.js +4 -4
  29. package/dist/tempo/client/SessionManager.js.map +1 -1
  30. package/dist/tempo/index.d.ts +1 -1
  31. package/dist/tempo/index.d.ts.map +1 -1
  32. package/dist/tempo/index.js +1 -1
  33. package/dist/tempo/index.js.map +1 -1
  34. package/dist/tempo/server/Charge.js +1 -1
  35. package/dist/tempo/server/Charge.js.map +1 -1
  36. package/dist/tempo/server/Methods.d.ts +1 -1
  37. package/dist/tempo/server/Methods.d.ts.map +1 -1
  38. package/dist/tempo/server/Session.d.ts +8 -8
  39. package/dist/tempo/server/Session.d.ts.map +1 -1
  40. package/dist/tempo/server/Session.js +24 -24
  41. package/dist/tempo/server/Session.js.map +1 -1
  42. package/dist/tempo/server/index.d.ts +2 -2
  43. package/dist/tempo/server/index.d.ts.map +1 -1
  44. package/dist/tempo/server/index.js +2 -2
  45. package/dist/tempo/server/index.js.map +1 -1
  46. package/dist/tempo/server/internal/transport.d.ts +4 -4
  47. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  48. package/dist/tempo/server/internal/transport.js +3 -3
  49. package/dist/tempo/server/internal/transport.js.map +1 -1
  50. package/dist/tempo/session/Chain.d.ts.map +1 -0
  51. package/dist/tempo/session/Chain.js.map +1 -0
  52. package/dist/tempo/session/Channel.d.ts.map +1 -0
  53. package/dist/tempo/session/Channel.js.map +1 -0
  54. package/dist/tempo/session/ChannelStore.d.ts.map +1 -0
  55. package/dist/tempo/session/ChannelStore.js.map +1 -0
  56. package/dist/tempo/session/Receipt.d.ts +22 -0
  57. package/dist/tempo/session/Receipt.d.ts.map +1 -0
  58. package/dist/tempo/{stream → session}/Receipt.js +6 -6
  59. package/dist/tempo/session/Receipt.js.map +1 -0
  60. package/dist/tempo/{stream → session}/Sse.d.ts +7 -7
  61. package/dist/tempo/session/Sse.d.ts.map +1 -0
  62. package/dist/tempo/{stream → session}/Sse.js +4 -4
  63. package/dist/tempo/session/Sse.js.map +1 -0
  64. package/dist/tempo/{stream → session}/Types.d.ts +4 -4
  65. package/dist/tempo/session/Types.d.ts.map +1 -0
  66. package/dist/tempo/{stream → session}/Types.js.map +1 -1
  67. package/dist/tempo/session/Voucher.d.ts.map +1 -0
  68. package/dist/tempo/session/Voucher.js.map +1 -0
  69. package/dist/tempo/{stream → session}/escrow.abi.d.ts.map +1 -1
  70. package/dist/tempo/session/escrow.abi.js.map +1 -0
  71. package/dist/tempo/session/index.d.ts.map +1 -0
  72. package/dist/tempo/session/index.js.map +1 -0
  73. package/package.json +1 -1
  74. package/src/Challenge.test.ts +201 -11
  75. package/src/Challenge.ts +34 -4
  76. package/src/Errors.test.ts +10 -10
  77. package/src/Errors.ts +7 -7
  78. package/src/Store.test.ts +93 -0
  79. package/src/cli.test.ts +234 -38
  80. package/src/cli.ts +340 -135
  81. package/src/client/Transport.test.ts +4 -4
  82. package/src/internal/env.test.ts +42 -0
  83. package/src/internal/env.ts +2 -2
  84. package/src/middlewares/express.test.ts +1 -1
  85. package/src/middlewares/hono.test.ts +1 -1
  86. package/src/middlewares/nextjs.test.ts +1 -1
  87. package/src/server/Mppx.test.ts +173 -0
  88. package/src/server/Mppx.ts +6 -3
  89. package/src/server/Transport.test.ts +6 -6
  90. package/src/tempo/client/ChannelOps.test.ts +2 -2
  91. package/src/tempo/client/ChannelOps.ts +8 -8
  92. package/src/tempo/client/Session.test.ts +3 -3
  93. package/src/tempo/client/Session.ts +9 -9
  94. package/src/tempo/client/SessionManager.test.ts +3 -3
  95. package/src/tempo/client/SessionManager.ts +9 -9
  96. package/src/tempo/index.ts +1 -1
  97. package/src/tempo/server/Charge.ts +1 -1
  98. package/src/tempo/server/Session.test.ts +61 -9
  99. package/src/tempo/server/Session.ts +47 -47
  100. package/src/tempo/server/Sse.test.ts +3 -3
  101. package/src/tempo/server/index.ts +2 -2
  102. package/src/tempo/server/internal/transport.test.ts +285 -0
  103. package/src/tempo/server/internal/transport.ts +6 -6
  104. package/src/tempo/{stream → session}/Chain.test.ts +1 -1
  105. package/src/tempo/{stream → session}/Receipt.test.ts +16 -12
  106. package/src/tempo/{stream → session}/Receipt.ts +9 -9
  107. package/src/tempo/{stream → session}/Sse.test.ts +5 -5
  108. package/src/tempo/{stream → session}/Sse.ts +11 -11
  109. package/src/tempo/{stream → session}/Types.ts +4 -4
  110. package/dist/tempo/stream/Chain.d.ts.map +0 -1
  111. package/dist/tempo/stream/Chain.js.map +0 -1
  112. package/dist/tempo/stream/Channel.d.ts.map +0 -1
  113. package/dist/tempo/stream/Channel.js.map +0 -1
  114. package/dist/tempo/stream/ChannelStore.d.ts.map +0 -1
  115. package/dist/tempo/stream/ChannelStore.js.map +0 -1
  116. package/dist/tempo/stream/Receipt.d.ts +0 -22
  117. package/dist/tempo/stream/Receipt.d.ts.map +0 -1
  118. package/dist/tempo/stream/Receipt.js.map +0 -1
  119. package/dist/tempo/stream/Sse.d.ts.map +0 -1
  120. package/dist/tempo/stream/Sse.js.map +0 -1
  121. package/dist/tempo/stream/Types.d.ts.map +0 -1
  122. package/dist/tempo/stream/Voucher.d.ts.map +0 -1
  123. package/dist/tempo/stream/Voucher.js.map +0 -1
  124. package/dist/tempo/stream/escrow.abi.js.map +0 -1
  125. package/dist/tempo/stream/index.d.ts.map +0 -1
  126. package/dist/tempo/stream/index.js.map +0 -1
  127. /package/dist/tempo/{stream → session}/Chain.d.ts +0 -0
  128. /package/dist/tempo/{stream → session}/Chain.js +0 -0
  129. /package/dist/tempo/{stream → session}/Channel.d.ts +0 -0
  130. /package/dist/tempo/{stream → session}/Channel.js +0 -0
  131. /package/dist/tempo/{stream → session}/ChannelStore.d.ts +0 -0
  132. /package/dist/tempo/{stream → session}/ChannelStore.js +0 -0
  133. /package/dist/tempo/{stream → session}/Types.js +0 -0
  134. /package/dist/tempo/{stream → session}/Voucher.d.ts +0 -0
  135. /package/dist/tempo/{stream → session}/Voucher.js +0 -0
  136. /package/dist/tempo/{stream → session}/escrow.abi.d.ts +0 -0
  137. /package/dist/tempo/{stream → session}/escrow.abi.js +0 -0
  138. /package/dist/tempo/{stream → session}/index.d.ts +0 -0
  139. /package/dist/tempo/{stream → session}/index.js +0 -0
  140. /package/src/tempo/{stream → session}/Chain.ts +0 -0
  141. /package/src/tempo/{stream → session}/Channel.test.ts +0 -0
  142. /package/src/tempo/{stream → session}/Channel.ts +0 -0
  143. /package/src/tempo/{stream → session}/ChannelStore.test.ts +0 -0
  144. /package/src/tempo/{stream → session}/ChannelStore.ts +0 -0
  145. /package/src/tempo/{stream → session}/Voucher.test.ts +0 -0
  146. /package/src/tempo/{stream → session}/Voucher.ts +0 -0
  147. /package/src/tempo/{stream → session}/escrow.abi.ts +0 -0
  148. /package/src/tempo/{stream → session}/index.ts +0 -0
@@ -8,7 +8,7 @@ import {
8
8
  signOpenChannel,
9
9
  signTopUpChannel,
10
10
  topUpChannel,
11
- } from '~test/tempo/stream.js'
11
+ } from '~test/tempo/session.js'
12
12
  import { accounts, asset, chain, client, fundAccount, http } from '~test/tempo/viem.js'
13
13
  import {
14
14
  ChannelClosedError,
@@ -18,9 +18,9 @@ import {
18
18
  } from '../../Errors.js'
19
19
  import * as Store from '../../Store.js'
20
20
  import type * as Methods from '../Methods.js'
21
- import * as ChannelStore from '../stream/ChannelStore.js'
22
- import type { StreamReceipt } from '../stream/Types.js'
23
- import { signVoucher } from '../stream/Voucher.js'
21
+ import * as ChannelStore from '../session/ChannelStore.js'
22
+ import type { SessionReceipt } from '../session/Types.js'
23
+ import { signVoucher } from '../session/Voucher.js'
24
24
  import { charge, session, settle } from './Session.js'
25
25
 
26
26
  const payer = accounts[2]
@@ -367,7 +367,7 @@ describe('session', () => {
367
367
  })
368
368
 
369
369
  expect(receipt.status).toBe('success')
370
- expect((receipt as StreamReceipt).acceptedCumulative).toBe('1000000')
370
+ expect((receipt as SessionReceipt).acceptedCumulative).toBe('1000000')
371
371
  })
372
372
 
373
373
  test('rejects voucher exceeding deposit', async () => {
@@ -520,7 +520,7 @@ describe('session', () => {
520
520
  },
521
521
  },
522
522
  request: makeRequest(),
523
- })) as StreamReceipt
523
+ })) as SessionReceipt
524
524
 
525
525
  expect(receipt.status).toBe('success')
526
526
  expect(receipt.spent).toBe('800000')
@@ -748,7 +748,7 @@ describe('session', () => {
748
748
  })
749
749
 
750
750
  expect(receipt.status).toBe('success')
751
- expect((receipt as StreamReceipt).txHash).toMatch(/^0x/)
751
+ expect((receipt as SessionReceipt).txHash).toMatch(/^0x/)
752
752
 
753
753
  const ch = await store.getChannel(channelId)
754
754
  expect(ch!.finalized).toBe(true)
@@ -1099,6 +1099,58 @@ describe('session', () => {
1099
1099
  } as any)
1100
1100
  expect(result).toBeUndefined()
1101
1101
  })
1102
+
1103
+ test('returns undefined for voucher POST with content-length > 0 (content request)', () => {
1104
+ const server = createServer()
1105
+ const result = server.respond!({
1106
+ credential: {
1107
+ challenge: makeChallenge({
1108
+ channelId: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex,
1109
+ }),
1110
+ payload: { action: 'voucher' },
1111
+ },
1112
+ input: new Request('http://localhost', {
1113
+ method: 'POST',
1114
+ headers: { 'content-length': '42' },
1115
+ }),
1116
+ } as any)
1117
+ expect(result).toBeUndefined()
1118
+ })
1119
+
1120
+ test('returns undefined for voucher POST with transfer-encoding header (content request)', () => {
1121
+ const server = createServer()
1122
+ const result = server.respond!({
1123
+ credential: {
1124
+ challenge: makeChallenge({
1125
+ channelId: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex,
1126
+ }),
1127
+ payload: { action: 'voucher' },
1128
+ },
1129
+ input: new Request('http://localhost', {
1130
+ method: 'POST',
1131
+ headers: { 'transfer-encoding': 'chunked' },
1132
+ }),
1133
+ } as any)
1134
+ expect(result).toBeUndefined()
1135
+ })
1136
+
1137
+ test('returns 204 for voucher POST with content-length: 0', () => {
1138
+ const server = createServer()
1139
+ const result = server.respond!({
1140
+ credential: {
1141
+ challenge: makeChallenge({
1142
+ channelId: '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex,
1143
+ }),
1144
+ payload: { action: 'voucher' },
1145
+ },
1146
+ input: new Request('http://localhost', {
1147
+ method: 'POST',
1148
+ headers: { 'content-length': '0' },
1149
+ }),
1150
+ } as any)
1151
+ expect(result).toBeInstanceOf(Response)
1152
+ expect((result as Response).status).toBe(204)
1153
+ })
1102
1154
  })
1103
1155
 
1104
1156
  describe('SSE', () => {
@@ -1110,7 +1162,7 @@ describe('session', () => {
1110
1162
  currency: asset,
1111
1163
  escrowContract,
1112
1164
  getClient: () => client,
1113
- stream: true,
1165
+ sse: true,
1114
1166
  }),
1115
1167
  ],
1116
1168
  realm: 'api.example.com',
@@ -1147,7 +1199,7 @@ describe('session', () => {
1147
1199
  }
1148
1200
  })
1149
1201
 
1150
- test('behavior: non-stream session withReceipt only accepts Response', async () => {
1202
+ test('behavior: non-SSE session withReceipt only accepts Response', async () => {
1151
1203
  const handler = Mppx_server.create({
1152
1204
  methods: [
1153
1205
  tempo_server.session({
@@ -2,13 +2,13 @@
2
2
  * Server-side session payment method for request/response flows.
3
3
  *
4
4
  * Handles the full channel lifecycle (open, voucher, top-up, close) and
5
- * one-shot settlement. Each incoming request carries a stream credential
5
+ * one-shot settlement. Each incoming request carries a session credential
6
6
  * with a cumulative voucher that the server validates and records.
7
7
  *
8
8
  * Use `session()` for standard HTTP request/response patterns where each
9
9
  * request is a discrete paid unit (for example, a page scrape or API call).
10
10
  * For long-lived connections that emit multiple paid events over a single
11
- * request, use {@link ../stream/Sse} instead.
11
+ * request, use {@link ../session/Sse} instead.
12
12
  */
13
13
  import {
14
14
  type Address,
@@ -44,15 +44,15 @@ import {
44
44
  getOnChainChannel,
45
45
  type OnChainChannel,
46
46
  settleOnChain,
47
- } from '../stream/Chain.js'
48
- import * as ChannelStore from '../stream/ChannelStore.js'
49
- import { createStreamReceipt } from '../stream/Receipt.js'
50
- import type { SignedVoucher, StreamCredentialPayload, StreamReceipt } from '../stream/Types.js'
51
- import { parseVoucherFromPayload, verifyVoucher } from '../stream/Voucher.js'
47
+ } from '../session/Chain.js'
48
+ import * as ChannelStore from '../session/ChannelStore.js'
49
+ import { createSessionReceipt } from '../session/Receipt.js'
50
+ import type { SessionCredentialPayload, SessionReceipt, SignedVoucher } from '../session/Types.js'
51
+ import { parseVoucherFromPayload, verifyVoucher } from '../session/Voucher.js'
52
52
  import * as Transport from './internal/transport.js'
53
53
 
54
- /** Challenge methodDetails shape for stream methods. */
55
- type StreamMethodDetails = {
54
+ /** Challenge methodDetails shape for session methods. */
55
+ type SessionMethodDetails = {
56
56
  escrowContract: Address
57
57
  chainId: number
58
58
  channelId?: Hex | undefined
@@ -61,7 +61,7 @@ type StreamMethodDetails = {
61
61
  }
62
62
 
63
63
  /**
64
- * Creates a stream payment server using the Method.toServer() pattern.
64
+ * Creates a session payment server using the Method.toServer() pattern.
65
65
  *
66
66
  * @example
67
67
  * ```ts
@@ -101,11 +101,11 @@ export function session<const parameters extends session.Parameters>(p?: paramet
101
101
  })
102
102
  const { account, recipient, feePayer } = Account.resolve(parameters)
103
103
 
104
- type Transport = parameters['stream'] extends false | undefined ? undefined : Transport.Sse
105
- const transport = parameters.stream
104
+ type Transport = parameters['sse'] extends false | undefined ? undefined : Transport.Sse
105
+ const transport = parameters.sse
106
106
  ? Transport.sse({
107
107
  store,
108
- ...(typeof parameters.stream === 'object' ? parameters.stream : undefined),
108
+ ...(typeof parameters.sse === 'object' ? parameters.sse : undefined),
109
109
  })
110
110
  : undefined
111
111
 
@@ -122,7 +122,7 @@ export function session<const parameters extends session.Parameters>(p?: paramet
122
122
 
123
123
  transport: transport as never,
124
124
 
125
- // TODO: dedupe `{charge,stream}.request`
125
+ // TODO: dedupe `{charge,session}.request`
126
126
  async request({ credential, request }) {
127
127
  // Extract chainId from request or default.
128
128
  const chainId = await (async () => {
@@ -160,9 +160,9 @@ export function session<const parameters extends session.Parameters>(p?: paramet
160
160
  },
161
161
 
162
162
  async verify({ credential }) {
163
- const { challenge, payload } = credential as Credential.Credential<StreamCredentialPayload>
163
+ const { challenge, payload } = credential as Credential.Credential<SessionCredentialPayload>
164
164
 
165
- const methodDetails = challenge.request.methodDetails as StreamMethodDetails
165
+ const methodDetails = challenge.request.methodDetails as SessionMethodDetails
166
166
  const client = await getClient({ chainId: methodDetails.chainId })
167
167
 
168
168
  const resolvedFeePayer = methodDetails.feePayer === true ? feePayer : undefined
@@ -171,11 +171,11 @@ export function session<const parameters extends session.Parameters>(p?: paramet
171
171
  ? BigInt(methodDetails.minVoucherDelta)
172
172
  : minVoucherDelta
173
173
 
174
- let streamReceipt: StreamReceipt
174
+ let sessionReceipt: SessionReceipt
175
175
 
176
176
  switch (payload.action) {
177
177
  case 'open':
178
- streamReceipt = await handleOpen(
178
+ sessionReceipt = await handleOpen(
179
179
  store,
180
180
  client,
181
181
  challenge,
@@ -186,7 +186,7 @@ export function session<const parameters extends session.Parameters>(p?: paramet
186
186
  break
187
187
 
188
188
  case 'topUp':
189
- streamReceipt = await handleTopUp(
189
+ sessionReceipt = await handleTopUp(
190
190
  store,
191
191
  client,
192
192
  challenge,
@@ -197,7 +197,7 @@ export function session<const parameters extends session.Parameters>(p?: paramet
197
197
  break
198
198
 
199
199
  case 'voucher':
200
- streamReceipt = await handleVoucher(
200
+ sessionReceipt = await handleVoucher(
201
201
  store,
202
202
  client,
203
203
  effectiveMinVoucherDelta,
@@ -208,7 +208,7 @@ export function session<const parameters extends session.Parameters>(p?: paramet
208
208
  break
209
209
 
210
210
  case 'close':
211
- streamReceipt = await handleClose(
211
+ sessionReceipt = await handleClose(
212
212
  store,
213
213
  client,
214
214
  challenge,
@@ -224,7 +224,7 @@ export function session<const parameters extends session.Parameters>(p?: paramet
224
224
  })
225
225
  }
226
226
 
227
- return streamReceipt
227
+ return sessionReceipt
228
228
  },
229
229
 
230
230
  // This hook acts as a gate: when it returns a Response, `withReceipt()`
@@ -236,14 +236,14 @@ export function session<const parameters extends session.Parameters>(p?: paramet
236
236
  // return 204 regardless of request method.
237
237
  //
238
238
  // Voucher POSTs are gated only when they have no request body, which
239
- // signals a mid-stream voucher update (the client is just topping up
239
+ // signals a mid-session voucher update (the client is just topping up
240
240
  // the channel balance). Voucher POSTs WITH a body are content requests
241
241
  // (e.g., an API call to a POST endpoint) and fall through to the
242
242
  // user's handler. GET requests with vouchers always fall through so
243
243
  // auto-mode clients (whose fetch wrapper bundles open+voucher into a
244
244
  // single GET retry) receive content as expected.
245
245
  respond({ credential, input }) {
246
- const { payload } = credential as Credential.Credential<StreamCredentialPayload>
246
+ const { payload } = credential as Credential.Credential<SessionCredentialPayload>
247
247
 
248
248
  if (payload.action === 'close') return new Response(null, { status: 204 })
249
249
 
@@ -253,7 +253,7 @@ export function session<const parameters extends session.Parameters>(p?: paramet
253
253
  const isVoucher = payload.action === 'voucher'
254
254
  if (!isVoucher) return undefined
255
255
 
256
- // Only gate voucher POSTs with no body (mid-stream balance updates).
256
+ // Only gate voucher POSTs with no body (mid-session balance updates).
257
257
  // POSTs with a body are content requests that should reach the handler.
258
258
  if (input.method !== 'POST') return undefined
259
259
  const contentLength = input.headers.get('content-length')
@@ -279,10 +279,10 @@ export declare namespace session {
279
279
  * Enable SSE streaming.
280
280
  *
281
281
  * Pass `true` to enable with defaults, or an options object
282
- * to configure the stream (e.g. `{ poll: true }` for
282
+ * to configure SSE (e.g. `{ poll: true }` for
283
283
  * Cloudflare Workers compatibility).
284
284
  */
285
- stream?: boolean | Transport.sse.Options | undefined
285
+ sse?: boolean | Transport.sse.Options | undefined
286
286
  /** Testnet mode. */
287
287
  testnet?: boolean | undefined
288
288
  } & Account.resolve.Parameters &
@@ -332,7 +332,7 @@ export async function settle(
332
332
  /**
333
333
  * Charge against a channel's balance.
334
334
  *
335
- * Exported so consumers can deduct from a channel outside the `stream()`
335
+ * Exported so consumers can deduct from a channel outside the `session()`
336
336
  * handler (e.g., custom middleware, the SSE `serve()` loop, or direct tests).
337
337
  *
338
338
  * Delegates to the shared `deductFromChannel` atomic helper and translates
@@ -403,8 +403,8 @@ async function verifyAndAcceptVoucher(parameters: {
403
403
  channelId: Hex
404
404
  voucher: SignedVoucher
405
405
  onChain: OnChainChannel
406
- methodDetails: StreamMethodDetails
407
- }): Promise<StreamReceipt> {
406
+ methodDetails: SessionMethodDetails
407
+ }): Promise<SessionReceipt> {
408
408
  const { store, minVoucherDelta, challenge, channel, channelId, voucher, onChain, methodDetails } =
409
409
  parameters
410
410
 
@@ -426,7 +426,7 @@ async function verifyAndAcceptVoucher(parameters: {
426
426
  }
427
427
 
428
428
  if (voucher.cumulativeAmount <= channel.highestVoucherAmount) {
429
- return createStreamReceipt({
429
+ return createSessionReceipt({
430
430
  challengeId: challenge.id,
431
431
  channelId,
432
432
  acceptedCumulative: channel.highestVoucherAmount,
@@ -467,7 +467,7 @@ async function verifyAndAcceptVoucher(parameters: {
467
467
  })
468
468
  if (!updated) throw new ChannelNotFoundError({ reason: 'channel not found' })
469
469
 
470
- return createStreamReceipt({
470
+ return createSessionReceipt({
471
471
  challengeId: challenge.id,
472
472
  channelId,
473
473
  acceptedCumulative: updated.highestVoucherAmount,
@@ -483,10 +483,10 @@ async function handleOpen(
483
483
  store: ChannelStore.ChannelStore,
484
484
  client: viem_Client,
485
485
  challenge: Challenge.Challenge,
486
- payload: StreamCredentialPayload & { action: 'open' },
487
- methodDetails: StreamMethodDetails,
486
+ payload: SessionCredentialPayload & { action: 'open' },
487
+ methodDetails: SessionMethodDetails,
488
488
  feePayer: viem_Account | undefined,
489
- ): Promise<StreamReceipt> {
489
+ ): Promise<SessionReceipt> {
490
490
  const voucher = parseVoucherFromPayload(
491
491
  payload.channelId,
492
492
  payload.cumulativeAmount,
@@ -579,7 +579,7 @@ async function handleOpen(
579
579
 
580
580
  if (!updated) throw new VerificationFailedError({ reason: 'failed to create channel' })
581
581
 
582
- return createStreamReceipt({
582
+ return createSessionReceipt({
583
583
  challengeId: challenge.id,
584
584
  channelId: payload.channelId,
585
585
  acceptedCumulative: updated.highestVoucherAmount,
@@ -600,10 +600,10 @@ async function handleTopUp(
600
600
  store: ChannelStore.ChannelStore,
601
601
  client: viem_Client,
602
602
  challenge: Challenge.Challenge,
603
- payload: StreamCredentialPayload & { action: 'topUp' },
604
- methodDetails: StreamMethodDetails,
603
+ payload: SessionCredentialPayload & { action: 'topUp' },
604
+ methodDetails: SessionMethodDetails,
605
605
  feePayer: viem_Account | undefined,
606
- ): Promise<StreamReceipt> {
606
+ ): Promise<SessionReceipt> {
607
607
  const channel = await store.getChannel(payload.channelId)
608
608
  if (!channel) {
609
609
  throw new ChannelNotFoundError({ reason: 'channel not found' })
@@ -626,7 +626,7 @@ async function handleTopUp(
626
626
  return { ...current, deposit: onChainDeposit }
627
627
  })
628
628
 
629
- return createStreamReceipt({
629
+ return createSessionReceipt({
630
630
  challengeId: challenge.id,
631
631
  channelId: payload.channelId,
632
632
  acceptedCumulative: updated?.highestVoucherAmount ?? channel.highestVoucherAmount,
@@ -643,9 +643,9 @@ async function handleVoucher(
643
643
  _client: viem_Client,
644
644
  minVoucherDelta: bigint,
645
645
  challenge: Challenge.Challenge,
646
- payload: StreamCredentialPayload & { action: 'voucher' },
647
- methodDetails: StreamMethodDetails,
648
- ): Promise<StreamReceipt> {
646
+ payload: SessionCredentialPayload & { action: 'voucher' },
647
+ methodDetails: SessionMethodDetails,
648
+ ): Promise<SessionReceipt> {
649
649
  const channel = await store.getChannel(payload.channelId)
650
650
  if (!channel) {
651
651
  throw new ChannelNotFoundError({ reason: 'channel not found' })
@@ -696,10 +696,10 @@ async function handleClose(
696
696
  store: ChannelStore.ChannelStore,
697
697
  client: viem_Client,
698
698
  challenge: Challenge.Challenge,
699
- payload: StreamCredentialPayload & { action: 'close' },
700
- methodDetails: StreamMethodDetails,
699
+ payload: SessionCredentialPayload & { action: 'close' },
700
+ methodDetails: SessionMethodDetails,
701
701
  account?: viem_Account,
702
- ): Promise<StreamReceipt> {
702
+ ): Promise<SessionReceipt> {
703
703
  const channel = await store.getChannel(payload.channelId)
704
704
  if (!channel) {
705
705
  throw new ChannelNotFoundError({ reason: 'channel not found' })
@@ -762,7 +762,7 @@ async function handleClose(
762
762
  }
763
763
  })
764
764
 
765
- return createStreamReceipt({
765
+ return createSessionReceipt({
766
766
  challengeId: challenge.id,
767
767
  channelId: payload.channelId,
768
768
  acceptedCumulative: voucher.cumulativeAmount,
@@ -1,7 +1,7 @@
1
1
  import type { Address, Hex } from 'viem'
2
2
  import { describe, expect, test } from 'vitest'
3
- import type * as ChannelStore from '../stream/ChannelStore.js'
4
- import { serve, toResponse } from '../stream/Sse.js'
3
+ import type * as ChannelStore from '../session/ChannelStore.js'
4
+ import { serve, toResponse } from '../session/Sse.js'
5
5
 
6
6
  const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
7
7
  const challengeId = 'test-challenge-id'
@@ -58,7 +58,7 @@ async function readStream(stream: ReadableStream<Uint8Array>): Promise<string> {
58
58
  }
59
59
 
60
60
  describe('Sse.serve', () => {
61
- test('emits message events for each yielded value (StreamController)', async () => {
61
+ test('emits message events for each yielded value (SessionController)', async () => {
62
62
  const store = memoryStore()
63
63
  await seedChannel(store, 3000000n)
64
64
 
@@ -1,5 +1,5 @@
1
- export * as ChannelStore from '../stream/ChannelStore.js'
2
- export * as Sse from '../stream/Sse.js'
1
+ export * as ChannelStore from '../session/ChannelStore.js'
2
+ export * as Sse from '../session/Sse.js'
3
3
  export { charge } from './Charge.js'
4
4
  export { tempo } from './Methods.js'
5
5
  export { session, settle } from './Session.js'