mppx 0.4.8 → 0.4.9

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 (183) hide show
  1. package/CHANGELOG.md +9 -3
  2. package/README.md +13 -13
  3. package/dist/BodyDigest.d.ts.map +1 -1
  4. package/dist/BodyDigest.js.map +1 -1
  5. package/dist/Challenge.d.ts.map +1 -1
  6. package/dist/Challenge.js.map +1 -1
  7. package/dist/Credential.d.ts.map +1 -1
  8. package/dist/Credential.js.map +1 -1
  9. package/dist/Errors.js +64 -67
  10. package/dist/Errors.js.map +1 -1
  11. package/dist/PaymentRequest.d.ts.map +1 -1
  12. package/dist/PaymentRequest.js.map +1 -1
  13. package/dist/Receipt.d.ts.map +1 -1
  14. package/dist/Receipt.js.map +1 -1
  15. package/dist/Store.d.ts +9 -0
  16. package/dist/Store.d.ts.map +1 -1
  17. package/dist/Store.js +17 -0
  18. package/dist/Store.js.map +1 -1
  19. package/dist/cli/account.d.ts.map +1 -1
  20. package/dist/cli/account.js +40 -5
  21. package/dist/cli/account.js.map +1 -1
  22. package/dist/cli/cli.d.ts.map +1 -1
  23. package/dist/cli/cli.js +2 -1
  24. package/dist/cli/cli.js.map +1 -1
  25. package/dist/cli/internal.d.ts.map +1 -1
  26. package/dist/cli/internal.js.map +1 -1
  27. package/dist/cli/plugins/stripe.d.ts.map +1 -1
  28. package/dist/cli/plugins/stripe.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +2 -1
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts.map +1 -1
  33. package/dist/cli/utils.js.map +1 -1
  34. package/dist/client/internal/Fetch.d.ts +2 -0
  35. package/dist/client/internal/Fetch.d.ts.map +1 -1
  36. package/dist/client/internal/Fetch.js +1 -1
  37. package/dist/client/internal/Fetch.js.map +1 -1
  38. package/dist/internal/types.d.ts.map +1 -1
  39. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
  40. package/dist/mcp-sdk/client/McpClient.js +1 -1
  41. package/dist/mcp-sdk/client/McpClient.js.map +1 -1
  42. package/dist/mcp-sdk/server/Transport.d.ts.map +1 -1
  43. package/dist/mcp-sdk/server/Transport.js.map +1 -1
  44. package/dist/middlewares/elysia.d.ts.map +1 -1
  45. package/dist/middlewares/elysia.js.map +1 -1
  46. package/dist/middlewares/express.d.ts.map +1 -1
  47. package/dist/middlewares/express.js +5 -2
  48. package/dist/middlewares/express.js.map +1 -1
  49. package/dist/middlewares/hono.d.ts.map +1 -1
  50. package/dist/middlewares/hono.js.map +1 -1
  51. package/dist/proxy/Proxy.d.ts.map +1 -1
  52. package/dist/proxy/Proxy.js.map +1 -1
  53. package/dist/proxy/Service.js +1 -1
  54. package/dist/proxy/Service.js.map +1 -1
  55. package/dist/server/Mppx.d.ts.map +1 -1
  56. package/dist/server/Mppx.js +35 -17
  57. package/dist/server/Mppx.js.map +1 -1
  58. package/dist/server/Request.d.ts.map +1 -1
  59. package/dist/server/Request.js.map +1 -1
  60. package/dist/stripe/Methods.d.ts.map +1 -1
  61. package/dist/stripe/Methods.js.map +1 -1
  62. package/dist/tempo/Methods.d.ts.map +1 -1
  63. package/dist/tempo/Methods.js.map +1 -1
  64. package/dist/tempo/client/ChannelOps.d.ts.map +1 -1
  65. package/dist/tempo/client/ChannelOps.js.map +1 -1
  66. package/dist/tempo/client/Charge.d.ts.map +1 -1
  67. package/dist/tempo/client/Charge.js.map +1 -1
  68. package/dist/tempo/client/Session.d.ts.map +1 -1
  69. package/dist/tempo/client/Session.js.map +1 -1
  70. package/dist/tempo/client/SessionManager.d.ts.map +1 -1
  71. package/dist/tempo/client/SessionManager.js +1 -1
  72. package/dist/tempo/client/SessionManager.js.map +1 -1
  73. package/dist/tempo/internal/auto-swap.d.ts.map +1 -1
  74. package/dist/tempo/internal/auto-swap.js +1 -1
  75. package/dist/tempo/internal/auto-swap.js.map +1 -1
  76. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  77. package/dist/tempo/internal/fee-payer.js +1 -1
  78. package/dist/tempo/internal/fee-payer.js.map +1 -1
  79. package/dist/tempo/server/Charge.d.ts.map +1 -1
  80. package/dist/tempo/server/Charge.js +1 -1
  81. package/dist/tempo/server/Charge.js.map +1 -1
  82. package/dist/tempo/server/Session.d.ts.map +1 -1
  83. package/dist/tempo/server/Session.js.map +1 -1
  84. package/dist/tempo/session/Chain.d.ts.map +1 -1
  85. package/dist/tempo/session/Chain.js.map +1 -1
  86. package/dist/tempo/session/ChannelStore.d.ts.map +1 -1
  87. package/dist/tempo/session/ChannelStore.js.map +1 -1
  88. package/dist/tempo/session/Receipt.d.ts.map +1 -1
  89. package/dist/tempo/session/Receipt.js.map +1 -1
  90. package/dist/tempo/session/Sse.d.ts.map +1 -1
  91. package/dist/tempo/session/Sse.js.map +1 -1
  92. package/dist/tempo/session/Voucher.d.ts.map +1 -1
  93. package/dist/tempo/session/Voucher.js.map +1 -1
  94. package/dist/viem/Client.d.ts.map +1 -1
  95. package/dist/viem/Client.js.map +1 -1
  96. package/package.json +1 -1
  97. package/src/BodyDigest.ts +1 -0
  98. package/src/Challenge.test-d.ts +1 -0
  99. package/src/Challenge.ts +1 -0
  100. package/src/Credential.ts +1 -0
  101. package/src/Errors.test.ts +27 -39
  102. package/src/Expires.test.ts +1 -0
  103. package/src/PaymentRequest.ts +1 -0
  104. package/src/Receipt.ts +1 -0
  105. package/src/Store.test-d.ts +1 -0
  106. package/src/Store.test.ts +56 -6
  107. package/src/Store.ts +25 -0
  108. package/src/cli/account.ts +65 -30
  109. package/src/cli/cli.test.ts +3 -1
  110. package/src/cli/cli.ts +4 -1
  111. package/src/cli/config.test.ts +1 -0
  112. package/src/cli/internal.ts +1 -0
  113. package/src/cli/plugins/stripe.ts +1 -0
  114. package/src/cli/plugins/tempo.ts +4 -1
  115. package/src/cli/utils.ts +1 -0
  116. package/src/client/Mppx.test-d.ts +1 -0
  117. package/src/client/internal/Fetch.browser.test.ts +1 -0
  118. package/src/client/internal/Fetch.test-d.ts +1 -0
  119. package/src/client/internal/Fetch.test.ts +1 -0
  120. package/src/client/internal/Fetch.ts +1 -1
  121. package/src/internal/constantTimeEqual.test.ts +1 -0
  122. package/src/internal/types.ts +1 -3
  123. package/src/mcp-sdk/client/McpClient.test-d.ts +1 -0
  124. package/src/mcp-sdk/client/McpClient.test.ts +1 -0
  125. package/src/mcp-sdk/client/McpClient.ts +2 -0
  126. package/src/mcp-sdk/server/Transport.test.ts +1 -0
  127. package/src/mcp-sdk/server/Transport.ts +1 -0
  128. package/src/middlewares/elysia.test.ts +1 -0
  129. package/src/middlewares/elysia.ts +1 -0
  130. package/src/middlewares/express.test.ts +62 -2
  131. package/src/middlewares/express.ts +6 -2
  132. package/src/middlewares/hono.ts +1 -0
  133. package/src/middlewares/internal/mppx.test.ts +1 -0
  134. package/src/middlewares/nextjs.test.ts +1 -0
  135. package/src/proxy/Proxy.test.ts +1 -0
  136. package/src/proxy/Proxy.ts +2 -0
  137. package/src/proxy/Service.test.ts +1 -0
  138. package/src/proxy/Service.ts +8 -2
  139. package/src/proxy/internal/Headers.test.ts +1 -0
  140. package/src/proxy/services/openai.test.ts +1 -0
  141. package/src/server/Mppx.test.ts +192 -0
  142. package/src/server/Mppx.ts +38 -19
  143. package/src/server/Request.test.ts +1 -0
  144. package/src/server/Request.ts +1 -0
  145. package/src/server/Response.test.ts +1 -0
  146. package/src/server/Transport.test.ts +1 -0
  147. package/src/stripe/Methods.ts +1 -0
  148. package/src/stripe/client/Charge.test.ts +1 -0
  149. package/src/stripe/server/Charge.test.ts +1 -0
  150. package/src/tempo/Attribution.test.ts +1 -0
  151. package/src/tempo/Methods.ts +1 -0
  152. package/src/tempo/client/ChannelOps.test.ts +1 -0
  153. package/src/tempo/client/ChannelOps.ts +1 -0
  154. package/src/tempo/client/Charge.ts +1 -0
  155. package/src/tempo/client/Session.test.ts +1 -0
  156. package/src/tempo/client/Session.ts +1 -0
  157. package/src/tempo/client/SessionManager.test.ts +28 -0
  158. package/src/tempo/client/SessionManager.ts +2 -1
  159. package/src/tempo/internal/auto-swap.test.ts +1 -0
  160. package/src/tempo/internal/auto-swap.ts +1 -0
  161. package/src/tempo/internal/defaults.test.ts +1 -0
  162. package/src/tempo/internal/fee-payer.test.ts +1 -0
  163. package/src/tempo/internal/fee-payer.ts +1 -0
  164. package/src/tempo/server/Charge.test.ts +1 -0
  165. package/src/tempo/server/Charge.ts +1 -0
  166. package/src/tempo/server/Session.test.ts +1 -0
  167. package/src/tempo/server/Session.ts +1 -0
  168. package/src/tempo/server/Sse.test.ts +1 -0
  169. package/src/tempo/server/internal/transport.test.ts +1 -0
  170. package/src/tempo/session/Chain.test.ts +1 -0
  171. package/src/tempo/session/Chain.ts +1 -0
  172. package/src/tempo/session/Channel.test.ts +1 -0
  173. package/src/tempo/session/ChannelStore.test.ts +1 -0
  174. package/src/tempo/session/ChannelStore.ts +1 -0
  175. package/src/tempo/session/Receipt.test.ts +1 -0
  176. package/src/tempo/session/Receipt.ts +1 -0
  177. package/src/tempo/session/Sse.test.ts +1 -0
  178. package/src/tempo/session/Sse.ts +1 -0
  179. package/src/tempo/session/Voucher.test.ts +1 -0
  180. package/src/tempo/session/Voucher.ts +1 -0
  181. package/src/viem/Account.test.ts +1 -0
  182. package/src/viem/Client.test.ts +1 -0
  183. package/src/viem/Client.ts +1 -0
@@ -1,5 +1,6 @@
1
1
  import type { Hex } from 'viem'
2
2
  import { describe, expect, test, vi } from 'vitest'
3
+
3
4
  import * as Challenge from '../../Challenge.js'
4
5
  import { formatNeedVoucherEvent, parseEvent } from '../session/Sse.js'
5
6
  import type { NeedVoucherEvent, SessionReceipt } from '../session/Types.js'
@@ -207,6 +208,33 @@ describe('Session', () => {
207
208
  })
208
209
  })
209
210
 
211
+ describe('.sse() headers normalization', () => {
212
+ test('preserves Headers instance properties when passed as headers', async () => {
213
+ const mockFetch = vi.fn().mockResolvedValue(makeSseResponse(['event: message\ndata: ok\n\n']))
214
+
215
+ const s = sessionManager({
216
+ account: '0x0000000000000000000000000000000000000001',
217
+ fetch: mockFetch as typeof globalThis.fetch,
218
+ })
219
+
220
+ const iterable = await s.sse('https://api.example.com/stream', {
221
+ headers: new Headers({ 'Content-Type': 'application/json', 'X-Custom': 'value' }),
222
+ })
223
+
224
+ for await (const _ of iterable) {
225
+ // drain
226
+ }
227
+
228
+ const calledHeaders = (mockFetch.mock.calls[0]![1] as RequestInit).headers as Record<
229
+ string,
230
+ string
231
+ >
232
+ expect(calledHeaders['content-type']).toBe('application/json')
233
+ expect(calledHeaders['x-custom']).toBe('value')
234
+ expect(calledHeaders.Accept).toBe('text/event-stream')
235
+ })
236
+ })
237
+
210
238
  describe('.close()', () => {
211
239
  test('is no-op when not opened', async () => {
212
240
  const mockFetch = vi.fn()
@@ -1,5 +1,6 @@
1
1
  import type { Hex } from 'ox'
2
2
  import type { Address } from 'viem'
3
+
3
4
  import type * as Challenge from '../../Challenge.js'
4
5
  import * as Fetch from '../../client/internal/Fetch.js'
5
6
  import type * as Account from '../../viem/Account.js'
@@ -157,7 +158,7 @@ export function sessionManager(parameters: sessionManager.Parameters): SessionMa
157
158
  const sseInit = {
158
159
  ...fetchInit,
159
160
  headers: {
160
- ...fetchInit.headers,
161
+ ...Fetch.normalizeHeaders(fetchInit.headers),
161
162
  Accept: 'text/event-stream',
162
163
  },
163
164
  ...(signal ? { signal } : {}),
@@ -1,5 +1,6 @@
1
1
  import type { Address } from 'viem'
2
2
  import { describe, expect, test } from 'vitest'
3
+
3
4
  import { defaultCurrencies, InsufficientFundsError, resolve } from './auto-swap.js'
4
5
 
5
6
  describe('defaultCurrencies', () => {
@@ -1,6 +1,7 @@
1
1
  import type { Address, Client } from 'viem'
2
2
  import { readContract } from 'viem/actions'
3
3
  import { Actions, Addresses } from 'viem/tempo'
4
+
4
5
  import * as TempoAddress from './address.js'
5
6
  import * as defaults from './defaults.js'
6
7
 
@@ -1,4 +1,5 @@
1
1
  import { describe, expect, test } from 'vitest'
2
+
2
3
  import {
3
4
  chainId,
4
5
  currency,
@@ -1,6 +1,7 @@
1
1
  import { encodeFunctionData } from 'viem'
2
2
  import { Abis, Addresses } from 'viem/tempo'
3
3
  import { describe, expect, test } from 'vitest'
4
+
4
5
  import { callScopes, FeePayerValidationError, validateCalls } from './fee-payer.js'
5
6
  import * as Selectors from './selectors.js'
6
7
 
@@ -2,6 +2,7 @@ import type { TempoAddress } from 'ox/tempo'
2
2
  import { TxEnvelopeTempo } from 'ox/tempo'
3
3
  import { decodeFunctionData } from 'viem'
4
4
  import { Abis, Addresses } from 'viem/tempo'
5
+
5
6
  import * as TempoAddress_internal from './address.js'
6
7
  import * as Selectors from './selectors.js'
7
8
 
@@ -11,6 +11,7 @@ import { beforeAll, describe, expect, test } from 'vitest'
11
11
  import * as Http from '~test/Http.js'
12
12
  import { closeChannelOnChain, deployEscrow, openChannel } from '~test/tempo/session.js'
13
13
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
14
+
14
15
  import * as Store from '../../Store.js'
15
16
  import * as Attribution from '../Attribution.js'
16
17
  import { signVoucher } from '../session/Voucher.js'
@@ -9,6 +9,7 @@ import {
9
9
  } from 'viem/actions'
10
10
  import { tempo as tempo_chain } from 'viem/chains'
11
11
  import { Abis, Transaction } from 'viem/tempo'
12
+
12
13
  import { PaymentExpiredError } from '../../Errors.js'
13
14
  import type { LooseOmit } from '../../internal/types.js'
14
15
  import * as Method from '../../Method.js'
@@ -13,6 +13,7 @@ import {
13
13
  topUpChannel,
14
14
  } from '~test/tempo/session.js'
15
15
  import { accounts, asset, chain, client, fundAccount, http } from '~test/tempo/viem.js'
16
+
16
17
  import {
17
18
  ChannelClosedError,
18
19
  ChannelNotFoundError,
@@ -18,6 +18,7 @@ import {
18
18
  type Client as viem_Client,
19
19
  } from 'viem'
20
20
  import { tempo as tempo_chain } from 'viem/chains'
21
+
21
22
  import {
22
23
  AmountExceedsDepositError,
23
24
  BadRequestError,
@@ -1,5 +1,6 @@
1
1
  import type { Address, Hex } from 'viem'
2
2
  import { describe, expect, test } from 'vitest'
3
+
3
4
  import { chainId, escrowContract as escrowContractDefaults } from '../internal/defaults.js'
4
5
  import type * as ChannelStore from '../session/ChannelStore.js'
5
6
  import { serve, toResponse } from '../session/Sse.js'
@@ -1,6 +1,7 @@
1
1
  import { Challenge, Credential } from 'mppx'
2
2
  import type { Address, Hex } from 'viem'
3
3
  import { describe, expect, test } from 'vitest'
4
+
4
5
  import * as Store from '../../../Store.js'
5
6
  import { chainId, escrowContract as escrowContractDefaults } from '../../internal/defaults.js'
6
7
  import * as ChannelStore from '../../session/ChannelStore.js'
@@ -11,6 +11,7 @@ import {
11
11
  topUpChannel,
12
12
  } from '~test/tempo/session.js'
13
13
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
14
+
14
15
  import {
15
16
  broadcastOpenTransaction,
16
17
  broadcastTopUpTransaction,
@@ -19,6 +19,7 @@ import {
19
19
  writeContract,
20
20
  } from 'viem/actions'
21
21
  import { Transaction } from 'viem/tempo'
22
+
22
23
  import { BadRequestError, ChannelClosedError, VerificationFailedError } from '../../Errors.js'
23
24
  import * as TempoAddress from '../internal/address.js'
24
25
  import * as defaults from '../internal/defaults.js'
@@ -1,5 +1,6 @@
1
1
  import { AbiParameters, Hash } from 'ox'
2
2
  import { describe, expect, test } from 'vitest'
3
+
3
4
  import * as Channel from './Channel.js'
4
5
 
5
6
  describe('computeId', () => {
@@ -1,5 +1,6 @@
1
1
  import type { Address, Hex } from 'viem'
2
2
  import { describe, expect, test } from 'vitest'
3
+
3
4
  import * as Store from '../../Store.js'
4
5
  import { chainId, escrowContract as escrowContractDefaults } from '../internal/defaults.js'
5
6
  import * as ChannelStore from './ChannelStore.js'
@@ -1,4 +1,5 @@
1
1
  import type { Address, Hex } from 'viem'
2
+
2
3
  import type * as Store from '../../Store.js'
3
4
  import type { SignedVoucher } from './Types.js'
4
5
 
@@ -1,5 +1,6 @@
1
1
  import type { Hex } from 'viem'
2
2
  import { describe, expect, test } from 'vitest'
3
+
3
4
  import {
4
5
  createSessionReceipt,
5
6
  deserializeSessionReceipt,
@@ -1,5 +1,6 @@
1
1
  import { Base64 } from 'ox'
2
2
  import type { Hex } from 'viem'
3
+
3
4
  import type { SessionReceipt } from './Types.js'
4
5
 
5
6
  /**
@@ -1,5 +1,6 @@
1
1
  import type { Address, Hex } from 'viem'
2
2
  import { describe, expect, test } from 'vitest'
3
+
3
4
  import { chainId, escrowContract as escrowContractDefaults } from '../internal/defaults.js'
4
5
  import type * as ChannelStore from './ChannelStore.js'
5
6
  import { formatNeedVoucherEvent, formatReceiptEvent, parseEvent, serve } from './Sse.js'
@@ -7,6 +7,7 @@
7
7
  * building HTTP responses from the stream.
8
8
  */
9
9
  import type { Hex } from 'viem'
10
+
10
11
  import * as Credential from '../../Credential.js'
11
12
  import * as ChannelStore from './ChannelStore.js'
12
13
  import { createSessionReceipt } from './Receipt.js'
@@ -1,6 +1,7 @@
1
1
  import { createClient, http } from 'viem'
2
2
  import { privateKeyToAccount } from 'viem/accounts'
3
3
  import { describe, expect, test } from 'vitest'
4
+
4
5
  import { parseVoucherFromPayload, signVoucher, verifyVoucher } from './Voucher.js'
5
6
 
6
7
  const account = privateKeyToAccount(
@@ -3,6 +3,7 @@ import { SignatureEnvelope } from 'ox/tempo'
3
3
  import type { Account, Client, Hex } from 'viem'
4
4
  import { recoverTypedDataAddress } from 'viem'
5
5
  import { signTypedData } from 'viem/actions'
6
+
6
7
  import * as TempoAddress from '../internal/address.js'
7
8
  import type { SignedVoucher, Voucher } from './Types.js'
8
9
 
@@ -2,6 +2,7 @@ import { createClient, http } from 'viem'
2
2
  import { privateKeyToAccount } from 'viem/accounts'
3
3
  import { mainnet } from 'viem/chains'
4
4
  import { describe, expect, test } from 'vitest'
5
+
5
6
  import * as Account from './Account.js'
6
7
 
7
8
  const account = privateKeyToAccount(
@@ -4,6 +4,7 @@ import { signTransaction } from 'viem/actions'
4
4
  import { tempoLocalnet } from 'viem/chains'
5
5
  import { Transaction } from 'viem/tempo'
6
6
  import { describe, expect, test } from 'vitest'
7
+
7
8
  import * as Client from './Client.js'
8
9
 
9
10
  const rpcUrl = { 42: 'https://rpc.example.com', 99: 'https://rpc2.example.com' } as const
@@ -1,5 +1,6 @@
1
1
  import { type Chain, type Client, createClient, http } from 'viem'
2
2
  import { withFeePayer } from 'viem/tempo'
3
+
3
4
  import type { MaybePromise } from '../internal/types.js'
4
5
 
5
6
  export function getResolver(