mppx 0.6.30 → 0.7.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 (483) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +9 -7
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Constants.d.ts +46 -0
  6. package/dist/Constants.d.ts.map +1 -0
  7. package/dist/Constants.js +46 -0
  8. package/dist/Constants.js.map +1 -0
  9. package/dist/Credential.d.ts.map +1 -1
  10. package/dist/Credential.js +5 -4
  11. package/dist/Credential.js.map +1 -1
  12. package/dist/Method.d.ts +32 -4
  13. package/dist/Method.d.ts.map +1 -1
  14. package/dist/Method.js +5 -2
  15. package/dist/Method.js.map +1 -1
  16. package/dist/Receipt.d.ts.map +1 -1
  17. package/dist/Receipt.js +3 -2
  18. package/dist/Receipt.js.map +1 -1
  19. package/dist/cli/cli.d.ts.map +1 -1
  20. package/dist/cli/cli.js +19 -11
  21. package/dist/cli/cli.js.map +1 -1
  22. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  23. package/dist/cli/plugins/tempo.js +17 -6
  24. package/dist/cli/plugins/tempo.js.map +1 -1
  25. package/dist/cli/utils.d.ts +5 -0
  26. package/dist/cli/utils.d.ts.map +1 -1
  27. package/dist/cli/utils.js +10 -0
  28. package/dist/cli/utils.js.map +1 -1
  29. package/dist/client/Methods.d.ts +5 -2
  30. package/dist/client/Methods.d.ts.map +1 -1
  31. package/dist/client/Methods.js +5 -2
  32. package/dist/client/Methods.js.map +1 -1
  33. package/dist/client/Transport.d.ts.map +1 -1
  34. package/dist/client/Transport.js +4 -5
  35. package/dist/client/Transport.js.map +1 -1
  36. package/dist/client/index.d.ts +2 -1
  37. package/dist/client/index.d.ts.map +1 -1
  38. package/dist/client/index.js +2 -1
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/internal/Fetch.d.ts.map +1 -1
  41. package/dist/client/internal/Fetch.js +14 -6
  42. package/dist/client/internal/Fetch.js.map +1 -1
  43. package/dist/evm/server/Methods.d.ts +1 -1
  44. package/dist/evm/server/Methods.d.ts.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/internal/AcceptPayment.d.ts +3 -0
  50. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  51. package/dist/internal/AcceptPayment.js +15 -11
  52. package/dist/internal/AcceptPayment.js.map +1 -1
  53. package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
  54. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
  55. package/dist/mcp-sdk/client/McpClient.js +55 -42
  56. package/dist/mcp-sdk/client/McpClient.js.map +1 -1
  57. package/dist/server/Mppx.d.ts +11 -3
  58. package/dist/server/Mppx.d.ts.map +1 -1
  59. package/dist/server/Mppx.js +76 -27
  60. package/dist/server/Mppx.js.map +1 -1
  61. package/dist/server/Request.js +24 -10
  62. package/dist/server/Request.js.map +1 -1
  63. package/dist/server/Response.d.ts.map +1 -1
  64. package/dist/server/Response.js +2 -1
  65. package/dist/server/Response.js.map +1 -1
  66. package/dist/server/Transport.d.ts.map +1 -1
  67. package/dist/server/Transport.js +4 -3
  68. package/dist/server/Transport.js.map +1 -1
  69. package/dist/server/index.d.ts +1 -0
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +1 -0
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/stripe/client/Charge.d.ts +1 -1
  74. package/dist/stripe/client/Charge.d.ts.map +1 -1
  75. package/dist/stripe/client/Charge.js +3 -1
  76. package/dist/stripe/client/Charge.js.map +1 -1
  77. package/dist/stripe/server/Charge.d.ts +1 -1
  78. package/dist/stripe/server/Charge.d.ts.map +1 -1
  79. package/dist/stripe/server/Charge.js +9 -2
  80. package/dist/stripe/server/Charge.js.map +1 -1
  81. package/dist/stripe/server/Methods.d.ts +1 -1
  82. package/dist/stripe/server/Methods.d.ts.map +1 -1
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  85. package/dist/stripe/server/internal/html.gen.js +1 -1
  86. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  87. package/dist/tempo/Methods.d.ts +18 -0
  88. package/dist/tempo/Methods.d.ts.map +1 -1
  89. package/dist/tempo/Methods.js +16 -1
  90. package/dist/tempo/Methods.js.map +1 -1
  91. package/dist/tempo/client/Charge.d.ts +6 -0
  92. package/dist/tempo/client/Charge.d.ts.map +1 -1
  93. package/dist/tempo/client/Charge.js +9 -2
  94. package/dist/tempo/client/Charge.js.map +1 -1
  95. package/dist/tempo/client/Methods.d.ts +36 -7
  96. package/dist/tempo/client/Methods.d.ts.map +1 -1
  97. package/dist/tempo/client/Methods.js +12 -5
  98. package/dist/tempo/client/Methods.js.map +1 -1
  99. package/dist/tempo/client/index.d.ts +7 -4
  100. package/dist/tempo/client/index.d.ts.map +1 -1
  101. package/dist/tempo/client/index.js +5 -3
  102. package/dist/tempo/client/index.js.map +1 -1
  103. package/dist/tempo/index.d.ts +1 -0
  104. package/dist/tempo/index.d.ts.map +1 -1
  105. package/dist/tempo/index.js +1 -0
  106. package/dist/tempo/index.js.map +1 -1
  107. package/dist/tempo/internal/fee-payer.d.ts +21 -1
  108. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  109. package/dist/tempo/internal/fee-payer.js +109 -4
  110. package/dist/tempo/internal/fee-payer.js.map +1 -1
  111. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  112. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  113. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  114. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  115. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  116. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  117. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  118. package/dist/tempo/legacy/client/Session.js.map +1 -0
  119. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  120. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  121. package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
  122. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  123. package/dist/tempo/legacy/client/index.d.ts +7 -0
  124. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  125. package/dist/tempo/legacy/client/index.js +5 -0
  126. package/dist/tempo/legacy/client/index.js.map +1 -0
  127. package/dist/tempo/legacy/index.d.ts +7 -0
  128. package/dist/tempo/legacy/index.d.ts.map +1 -0
  129. package/dist/tempo/legacy/index.js +7 -0
  130. package/dist/tempo/legacy/index.js.map +1 -0
  131. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  132. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  133. package/dist/tempo/{server → legacy/server}/Session.js +28 -23
  134. package/dist/tempo/legacy/server/Session.js.map +1 -0
  135. package/dist/tempo/legacy/server/index.d.ts +5 -0
  136. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  137. package/dist/tempo/legacy/server/index.js +5 -0
  138. package/dist/tempo/legacy/server/index.js.map +1 -0
  139. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  140. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  141. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  142. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  143. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  144. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  145. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  146. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  147. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  148. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  149. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  150. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  151. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  152. package/dist/tempo/legacy/session/Types.js.map +1 -0
  153. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  154. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  155. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  156. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  157. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  158. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  159. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  160. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  161. package/dist/tempo/legacy/session/index.d.ts +9 -0
  162. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  163. package/dist/tempo/legacy/session/index.js +9 -0
  164. package/dist/tempo/legacy/session/index.js.map +1 -0
  165. package/dist/tempo/server/Charge.d.ts +1 -1
  166. package/dist/tempo/server/Charge.d.ts.map +1 -1
  167. package/dist/tempo/server/Charge.js +13 -16
  168. package/dist/tempo/server/Charge.js.map +1 -1
  169. package/dist/tempo/server/Methods.d.ts +63 -6
  170. package/dist/tempo/server/Methods.d.ts.map +1 -1
  171. package/dist/tempo/server/Methods.js +36 -8
  172. package/dist/tempo/server/Methods.js.map +1 -1
  173. package/dist/tempo/server/Subscription.d.ts +1 -1
  174. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  175. package/dist/tempo/server/index.d.ts +6 -5
  176. package/dist/tempo/server/index.d.ts.map +1 -1
  177. package/dist/tempo/server/index.js +5 -5
  178. package/dist/tempo/server/index.js.map +1 -1
  179. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  180. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  181. package/dist/tempo/server/internal/html.gen.js +1 -1
  182. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  183. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  184. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  185. package/dist/tempo/server/internal/request-body.js +20 -3
  186. package/dist/tempo/server/internal/request-body.js.map +1 -1
  187. package/dist/tempo/server/internal/transport.d.ts +8 -4
  188. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  189. package/dist/tempo/server/internal/transport.js +8 -7
  190. package/dist/tempo/server/internal/transport.js.map +1 -1
  191. package/dist/tempo/session/Snapshot.d.ts +32 -0
  192. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  193. package/dist/tempo/session/Snapshot.js +37 -0
  194. package/dist/tempo/session/Snapshot.js.map +1 -0
  195. package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
  196. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  197. package/dist/tempo/session/client/ChannelOps.js +204 -0
  198. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  199. package/dist/tempo/session/client/CredentialState.d.ts +262 -0
  200. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  201. package/dist/tempo/session/client/CredentialState.js +417 -0
  202. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  203. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  204. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  205. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  206. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  207. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  208. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  209. package/dist/tempo/session/client/Runtime.js +499 -0
  210. package/dist/tempo/session/client/Runtime.js.map +1 -0
  211. package/dist/tempo/session/client/Session.d.ts +132 -0
  212. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  213. package/dist/tempo/session/client/Session.js +55 -0
  214. package/dist/tempo/session/client/Session.js.map +1 -0
  215. package/dist/tempo/session/client/SessionManager.d.ts +120 -0
  216. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  217. package/dist/tempo/session/client/SessionManager.js +627 -0
  218. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  219. package/dist/tempo/session/client/Transports.d.ts +449 -0
  220. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  221. package/dist/tempo/session/client/Transports.js +721 -0
  222. package/dist/tempo/session/client/Transports.js.map +1 -0
  223. package/dist/tempo/session/client/index.d.ts +12 -0
  224. package/dist/tempo/session/client/index.d.ts.map +1 -0
  225. package/dist/tempo/session/client/index.js +5 -0
  226. package/dist/tempo/session/client/index.js.map +1 -0
  227. package/dist/tempo/session/index.d.ts +7 -8
  228. package/dist/tempo/session/index.d.ts.map +1 -1
  229. package/dist/tempo/session/index.js +7 -8
  230. package/dist/tempo/session/index.js.map +1 -1
  231. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  232. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  233. package/dist/tempo/session/precompile/Chain.js +492 -0
  234. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  235. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  236. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  237. package/dist/tempo/session/precompile/Channel.js +56 -0
  238. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  239. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  240. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  241. package/dist/tempo/session/precompile/Protocol.js +264 -0
  242. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  243. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  244. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  245. package/dist/tempo/session/precompile/Voucher.js +126 -0
  246. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  247. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  248. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  249. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  250. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  251. package/dist/tempo/session/precompile/index.d.ts +24 -0
  252. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  253. package/dist/tempo/session/precompile/index.js +22 -0
  254. package/dist/tempo/session/precompile/index.js.map +1 -0
  255. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  256. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  257. package/dist/tempo/session/server/ChannelOps.js +91 -0
  258. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  259. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  260. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  261. package/dist/tempo/session/server/ChannelStore.js +404 -0
  262. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  263. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  264. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  265. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  266. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  267. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  268. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  269. package/dist/tempo/session/server/MeteredStream.js +42 -0
  270. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  271. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  272. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  273. package/dist/tempo/session/server/RequestState.js +252 -0
  274. package/dist/tempo/session/server/RequestState.js.map +1 -0
  275. package/dist/tempo/session/server/Session.d.ts +169 -0
  276. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  277. package/dist/tempo/session/server/Session.js +351 -0
  278. package/dist/tempo/session/server/Session.js.map +1 -0
  279. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  280. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  281. package/dist/tempo/session/server/Settlement.js +250 -0
  282. package/dist/tempo/session/server/Settlement.js.map +1 -0
  283. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  284. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  285. package/dist/tempo/session/server/Sse.js +184 -0
  286. package/dist/tempo/session/server/Sse.js.map +1 -0
  287. package/dist/tempo/session/server/Transports.d.ts +89 -0
  288. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  289. package/dist/tempo/session/server/Transports.js +149 -0
  290. package/dist/tempo/session/server/Transports.js.map +1 -0
  291. package/dist/tempo/session/server/Ws.d.ts +48 -0
  292. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  293. package/dist/tempo/session/server/Ws.js +244 -0
  294. package/dist/tempo/session/server/Ws.js.map +1 -0
  295. package/dist/tempo/session/server/index.d.ts +4 -0
  296. package/dist/tempo/session/server/index.d.ts.map +1 -0
  297. package/dist/tempo/session/server/index.js +2 -0
  298. package/dist/tempo/session/server/index.js.map +1 -0
  299. package/package.json +8 -3
  300. package/src/Challenge.ts +9 -7
  301. package/src/Constants.ts +58 -0
  302. package/src/Credential.ts +5 -4
  303. package/src/Method.ts +46 -5
  304. package/src/Receipt.ts +3 -2
  305. package/src/cli/cli.test.ts +23 -28
  306. package/src/cli/cli.ts +23 -10
  307. package/src/cli/mcp.test.ts +21 -7
  308. package/src/cli/plugins/tempo.ts +21 -8
  309. package/src/cli/utils.test.ts +25 -1
  310. package/src/cli/utils.ts +10 -0
  311. package/src/client/Methods.ts +5 -2
  312. package/src/client/Mppx.test-d.ts +10 -0
  313. package/src/client/Mppx.test.ts +75 -0
  314. package/src/client/Transport.ts +4 -5
  315. package/src/client/index.ts +11 -1
  316. package/src/client/internal/Fetch.test.ts +29 -4
  317. package/src/client/internal/Fetch.ts +17 -5
  318. package/src/env.d.ts +1 -1
  319. package/src/index.ts +1 -0
  320. package/src/internal/AcceptPayment.test.ts +61 -0
  321. package/src/internal/AcceptPayment.ts +21 -14
  322. package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
  323. package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
  324. package/src/mcp-sdk/client/McpClient.ts +99 -67
  325. package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
  326. package/src/middlewares/elysia.test.ts +8 -4
  327. package/src/middlewares/express.test.ts +8 -4
  328. package/src/middlewares/hono.test.ts +4 -4
  329. package/src/middlewares/nextjs.test.ts +8 -4
  330. package/src/proxy/Proxy.test.ts +8 -8
  331. package/src/server/Mppx.test-d.ts +54 -0
  332. package/src/server/Mppx.test.ts +274 -7
  333. package/src/server/Mppx.ts +487 -406
  334. package/src/server/Request.test.ts +81 -0
  335. package/src/server/Request.ts +23 -9
  336. package/src/server/Response.ts +2 -1
  337. package/src/server/Transport.ts +4 -3
  338. package/src/server/index.ts +1 -0
  339. package/src/stripe/client/Charge.test.ts +20 -5
  340. package/src/stripe/client/Charge.ts +6 -2
  341. package/src/stripe/server/Charge.test.ts +114 -1
  342. package/src/stripe/server/Charge.ts +13 -2
  343. package/src/stripe/server/internal/html/package.json +1 -1
  344. package/src/stripe/server/internal/html.gen.ts +1 -1
  345. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  346. package/src/tempo/Methods.test.ts +45 -17
  347. package/src/tempo/Methods.ts +22 -0
  348. package/src/tempo/PublicExports.test-d.ts +105 -0
  349. package/src/tempo/client/Charge.test.ts +85 -0
  350. package/src/tempo/client/Charge.ts +19 -2
  351. package/src/tempo/client/Methods.ts +18 -6
  352. package/src/tempo/client/index.ts +15 -4
  353. package/src/tempo/index.ts +1 -0
  354. package/src/tempo/internal/fee-payer.test.ts +241 -17
  355. package/src/tempo/internal/fee-payer.ts +150 -4
  356. package/src/tempo/internal/fee-token.test.ts +14 -9
  357. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  358. package/src/tempo/legacy/README.md +9 -0
  359. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  360. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  361. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  362. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  363. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  364. package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
  365. package/src/tempo/legacy/client/index.ts +6 -0
  366. package/src/tempo/legacy/index.ts +6 -0
  367. package/src/tempo/{server → legacy/server}/Session.test.ts +162 -63
  368. package/src/tempo/{server → legacy/server}/Session.ts +49 -37
  369. package/src/tempo/legacy/server/index.ts +4 -0
  370. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  371. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  372. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  373. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  374. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  375. package/src/tempo/legacy/session/Types.ts +91 -0
  376. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  377. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  378. package/src/tempo/legacy/session/index.ts +8 -0
  379. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  380. package/src/tempo/server/Charge.test.ts +92 -14
  381. package/src/tempo/server/Charge.ts +18 -16
  382. package/src/tempo/server/Methods.ts +54 -8
  383. package/src/tempo/server/Sse.test.ts +2 -2
  384. package/src/tempo/server/index.ts +6 -5
  385. package/src/tempo/server/internal/html/package.json +1 -1
  386. package/src/tempo/server/internal/html.gen.ts +1 -1
  387. package/src/tempo/server/internal/request-body.test.ts +37 -4
  388. package/src/tempo/server/internal/request-body.ts +25 -6
  389. package/src/tempo/server/internal/transport.test.ts +4 -4
  390. package/src/tempo/server/internal/transport.ts +19 -10
  391. package/src/tempo/session/Snapshot.test.ts +41 -0
  392. package/src/tempo/session/Snapshot.ts +74 -0
  393. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  394. package/src/tempo/session/client/ChannelOps.ts +344 -0
  395. package/src/tempo/session/client/CredentialState.test.ts +645 -0
  396. package/src/tempo/session/client/CredentialState.ts +814 -0
  397. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  398. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  399. package/src/tempo/session/client/Runtime.ts +986 -0
  400. package/src/tempo/session/client/Session.test.ts +734 -0
  401. package/src/tempo/session/client/Session.ts +97 -0
  402. package/src/tempo/session/client/SessionManager.test.ts +1308 -0
  403. package/src/tempo/session/client/SessionManager.ts +845 -0
  404. package/src/tempo/session/client/Transports.test.ts +837 -0
  405. package/src/tempo/session/client/Transports.ts +1292 -0
  406. package/src/tempo/session/client/index.ts +37 -0
  407. package/src/tempo/session/index.ts +7 -8
  408. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  409. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  410. package/src/tempo/session/precompile/Chain.ts +979 -0
  411. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  412. package/src/tempo/session/precompile/Channel.ts +103 -0
  413. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  414. package/src/tempo/session/precompile/Protocol.ts +520 -0
  415. package/src/tempo/session/precompile/Voucher.test.ts +316 -0
  416. package/src/tempo/session/precompile/Voucher.ts +160 -0
  417. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  418. package/src/tempo/session/precompile/index.ts +33 -0
  419. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  420. package/src/tempo/session/server/ChannelOps.ts +157 -0
  421. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  422. package/src/tempo/session/server/ChannelStore.ts +835 -0
  423. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  424. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  425. package/src/tempo/session/server/MeteredStream.ts +88 -0
  426. package/src/tempo/session/server/RequestState.test.ts +531 -0
  427. package/src/tempo/session/server/RequestState.ts +499 -0
  428. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  429. package/src/tempo/session/server/Session.test.ts +3253 -0
  430. package/src/tempo/session/server/Session.ts +543 -0
  431. package/src/tempo/session/server/Settlement.test.ts +242 -0
  432. package/src/tempo/session/server/Settlement.ts +470 -0
  433. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  434. package/src/tempo/session/server/Sse.ts +256 -0
  435. package/src/tempo/session/server/Transports.test.ts +346 -0
  436. package/src/tempo/session/server/Transports.ts +255 -0
  437. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  438. package/src/tempo/session/server/Ws.ts +384 -0
  439. package/src/tempo/session/server/index.ts +8 -0
  440. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  441. package/dist/tempo/client/ChannelOps.js.map +0 -1
  442. package/dist/tempo/client/Session.d.ts.map +0 -1
  443. package/dist/tempo/client/Session.js.map +0 -1
  444. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  445. package/dist/tempo/client/SessionManager.js.map +0 -1
  446. package/dist/tempo/server/Session.d.ts.map +0 -1
  447. package/dist/tempo/server/Session.js.map +0 -1
  448. package/dist/tempo/session/Chain.d.ts.map +0 -1
  449. package/dist/tempo/session/Chain.js.map +0 -1
  450. package/dist/tempo/session/Channel.d.ts.map +0 -1
  451. package/dist/tempo/session/Channel.js.map +0 -1
  452. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  453. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  454. package/dist/tempo/session/ChannelStore.js +0 -172
  455. package/dist/tempo/session/ChannelStore.js.map +0 -1
  456. package/dist/tempo/session/Receipt.d.ts +0 -22
  457. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  458. package/dist/tempo/session/Receipt.js +0 -34
  459. package/dist/tempo/session/Receipt.js.map +0 -1
  460. package/dist/tempo/session/Sse.d.ts.map +0 -1
  461. package/dist/tempo/session/Sse.js +0 -363
  462. package/dist/tempo/session/Sse.js.map +0 -1
  463. package/dist/tempo/session/Types.d.ts +0 -78
  464. package/dist/tempo/session/Types.d.ts.map +0 -1
  465. package/dist/tempo/session/Types.js.map +0 -1
  466. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  467. package/dist/tempo/session/Voucher.js.map +0 -1
  468. package/dist/tempo/session/Ws.d.ts +0 -87
  469. package/dist/tempo/session/Ws.d.ts.map +0 -1
  470. package/dist/tempo/session/Ws.js +0 -443
  471. package/dist/tempo/session/Ws.js.map +0 -1
  472. package/dist/tempo/session/escrow.abi.js.map +0 -1
  473. package/src/tempo/session/ChannelStore.ts +0 -308
  474. package/src/tempo/session/Receipt.test.ts +0 -89
  475. package/src/tempo/session/Receipt.ts +0 -46
  476. package/src/tempo/session/Sse.ts +0 -462
  477. package/src/tempo/session/Types.ts +0 -86
  478. package/src/tempo/session/Ws.ts +0 -576
  479. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  480. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  481. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  482. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  483. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -1,308 +0,0 @@
1
- import type { Address, Hex } from 'viem'
2
-
3
- import type * as Store from '../../Store.js'
4
- import type { SignedVoucher } from './Types.js'
5
-
6
- /**
7
- * State for an on-chain payment channel, including per-session accounting.
8
- *
9
- * Tracks the channel's identity, on-chain balance, the highest voucher
10
- * the server has accepted, and the current session's spend counters.
11
- * A channel is created when a payer opens an escrow on-chain and persists
12
- * until the channel is finalized (closed/settled).
13
- *
14
- * One channel = one session. The client owns the key and can't race with
15
- * itself, so concurrent session support is unnecessary.
16
- *
17
- * Monotonicity invariants (enforced by update callbacks):
18
- * - `highestVoucherAmount` only increases
19
- * - `settledOnChain` only increases
20
- * - `deposit` reflects the latest on-chain value
21
- */
22
- export interface State {
23
- /** Address authorized to sign vouchers on behalf of the payer. */
24
- authorizedSigner: Address
25
- /** Chain ID the channel was opened on. */
26
- chainId: number
27
- /** Escrow contract address the channel was opened on. */
28
- escrowContract: Address
29
- /** Unique identifier for this payment channel. */
30
- channelId: Hex
31
- /** On-chain timestamp when a force-close was requested (0n if not requested). */
32
- closeRequestedAt: bigint
33
- /** ISO 8601 timestamp when the channel was created. */
34
- createdAt: string
35
- /** Current on-chain deposit in the escrow contract. */
36
- deposit: bigint
37
- /** Whether the channel has been finalized (closed) on-chain. */
38
- finalized: boolean
39
- /** The signed voucher corresponding to `highestVoucherAmount`. */
40
- highestVoucher: SignedVoucher | null
41
- /** Highest cumulative voucher amount accepted by the server. */
42
- highestVoucherAmount: bigint
43
- /** Address of the payment recipient. */
44
- payee: Address
45
- /** Address of the payment sender. */
46
- payer: Address
47
- /** Cumulative amount settled on-chain so far. */
48
- settledOnChain: bigint
49
- /** Cumulative amount spent (charged) against this channel's current session. */
50
- spent: bigint
51
- /** Token contract address used for payments. */
52
- token: Address
53
- /** Number of charge operations (API requests) fulfilled in the current session. */
54
- units: number
55
- }
56
-
57
- /**
58
- * Internal store interface for channel state persistence.
59
- *
60
- * ## Atomicity contract
61
- *
62
- * The `updateChannel` method uses an atomic read-modify-write callback.
63
- * The callback receives the current state (or `null` if none exists), and
64
- * returns the next state (or `null` to delete). Implementations must
65
- * guarantee that no concurrent mutation occurs between reading `current`
66
- * and writing the return value.
67
- *
68
- * Callbacks should be synchronous and deterministic. When a `ChannelStore`
69
- * is backed by `Store.update()`, adapters may retry them internally.
70
- *
71
- * Backends implement this via their native mechanisms:
72
- * - **In-memory / JS single-thread**: Synchronous callback execution
73
- * - **Durable Objects**: Single-threaded execution model
74
- * - **D1 / SQL**: Database transactions
75
- */
76
- export type ChannelStore = {
77
- getChannel(channelId: Hex): Promise<State | null>
78
-
79
- /**
80
- * Atomic read-modify-write for channel state.
81
- * Return `null` from `fn` to delete the channel.
82
- */
83
- updateChannel(channelId: Hex, fn: (current: State | null) => State | null): Promise<State | null>
84
-
85
- /**
86
- * Wait for the next update to a channel.
87
- *
88
- * Returns a `Promise` that resolves once `updateChannel` is called for
89
- * `channelId`. Implementations should resolve immediately if the channel
90
- * was updated between the call to `waitForUpdate` and the `Promise`
91
- * being awaited.
92
- *
93
- * When not implemented, callers fall back to polling.
94
- */
95
- waitForUpdate?(channelId: Hex): Promise<void>
96
-
97
- /**
98
- * Atomic read-modify-write that returns the callback's `result` directly.
99
- *
100
- * Used by {@link deductFromChannel} to atomically compute the deduction
101
- * outcome. When backed by `Store.update()`, this delegates to the store's
102
- * native atomic primitive.
103
- */
104
- updateChannelResult?<result>(
105
- channelId: Hex,
106
- fn: (current: State | null) => Store.Change<State, result>,
107
- ): Promise<result>
108
- }
109
-
110
- export type DeductResult = { ok: true; channel: State } | { ok: false; channel: State }
111
-
112
- export function normalizeChannelId(channelId: Hex): Hex {
113
- return channelId.toLowerCase() as Hex
114
- }
115
-
116
- function normalizeState(channelId: Hex, state: State): State {
117
- return state.channelId === channelId ? state : { ...state, channelId }
118
- }
119
-
120
- function normalizeMaybeState(channelId: Hex, state: State | null): State | null {
121
- return state ? normalizeState(channelId, state) : null
122
- }
123
-
124
- /**
125
- * Atomically deduct `amount` from a channel's available balance.
126
- *
127
- * Returns `{ ok: true, channel }` if the deduction succeeded, or
128
- * `{ ok: false, channel }` with the unchanged state if balance is
129
- * insufficient. Throws if the channel does not exist.
130
- */
131
- export async function deductFromChannel(
132
- store: ChannelStore,
133
- channelId: Hex,
134
- amount: bigint,
135
- ): Promise<DeductResult> {
136
- if (store.updateChannelResult) {
137
- const result = await store.updateChannelResult<DeductResult | null>(
138
- channelId,
139
- (current): Store.Change<State, DeductResult | null> => {
140
- if (!current) return { op: 'noop', result: null }
141
- if (current.finalized)
142
- return { op: 'noop', result: { ok: false, channel: current } as const }
143
- if (current.closeRequestedAt !== 0n)
144
- return { op: 'noop', result: { ok: false, channel: current } as const }
145
- if (current.highestVoucherAmount - current.spent >= amount) {
146
- const next = { ...current, spent: current.spent + amount, units: current.units + 1 }
147
- return { op: 'set', value: next, result: { ok: true, channel: next } as const }
148
- }
149
- return { op: 'noop', result: { ok: false, channel: current } as const }
150
- },
151
- )
152
- if (!result) throw new Error('channel not found')
153
- return result
154
- }
155
-
156
- let result: DeductResult | null = null
157
- const channel = await store.updateChannel(channelId, (current) => {
158
- if (!current) return null
159
- if (current.finalized) {
160
- result = { ok: false, channel: current }
161
- return current
162
- }
163
- if (current.closeRequestedAt !== 0n) {
164
- result = { ok: false, channel: current }
165
- return current
166
- }
167
- if (current.highestVoucherAmount - current.spent >= amount) {
168
- const next = { ...current, spent: current.spent + amount, units: current.units + 1 }
169
- result = { ok: true, channel: next }
170
- return next
171
- }
172
- result = { ok: false, channel: current }
173
- return current
174
- })
175
- if (!channel) throw new Error('channel not found')
176
- return result ?? { ok: false, channel }
177
- }
178
-
179
- /**
180
- * Wraps a generic {@link Store} into the internal {@link Store}
181
- * interface used by server handlers and the SSE metering loop.
182
- *
183
- * Provides `waitForUpdate` notifications so the SSE `chargeOrWait` loop
184
- * can wake up without polling.
185
- *
186
- * ## Atomicity
187
- *
188
- * Mutations use `get` → `fn` → `set` guarded by a per-key in-process
189
- * mutex. This serializes concurrent `updateChannel` calls within a
190
- * single JS runtime but does **not** protect against races across
191
- * multiple processes or instances.
192
- *
193
- * Backends that need true atomicity (e.g., Durable Objects, D1)
194
- * should implement {@link Store} directly.
195
- */
196
- const storeCache = new WeakMap<Store.Store, ChannelStore>()
197
-
198
- export function fromStore(store: Store.Store | Store.AtomicStore): ChannelStore {
199
- const cached = storeCache.get(store)
200
- if (cached) return cached
201
-
202
- const atomicUpdate = 'update' in store ? (store as Store.AtomicStore).update : undefined
203
-
204
- const waiters = new Map<string, Set<() => void>>()
205
- const locks = new Map<string, Promise<void>>()
206
-
207
- function notify(channelId: string) {
208
- const set = waiters.get(channelId)
209
- if (!set) return
210
- for (const resolve of set) resolve()
211
- waiters.delete(channelId)
212
- }
213
-
214
- async function update(
215
- channelId: Hex,
216
- fn: (current: State | null) => State | null,
217
- ): Promise<State | null> {
218
- return updateResult(channelId, (current) => {
219
- const next = fn(current)
220
- if (next) return { op: 'set', value: next, result: next }
221
- return { op: 'delete', result: null }
222
- })
223
- }
224
-
225
- async function updateResult<result>(
226
- channelId: Hex,
227
- fn: (current: State | null) => Store.Change<State, result>,
228
- ): Promise<result> {
229
- const normalizedChannelId = normalizeChannelId(channelId)
230
- let change: Store.Change<State, result> | undefined
231
-
232
- if (atomicUpdate) {
233
- const result = await atomicUpdate(normalizedChannelId, (current) => {
234
- change = fn(normalizeMaybeState(normalizedChannelId, (current as State | null) ?? null))
235
- if (change.op === 'set') {
236
- change = {
237
- ...change,
238
- value: normalizeState(normalizedChannelId, change.value),
239
- }
240
- }
241
- if (change.op !== 'set') return change
242
- return { ...change, value: change.value as never }
243
- })
244
- if (change?.op !== 'noop') notify(normalizedChannelId)
245
- return result
246
- }
247
-
248
- while (locks.has(normalizedChannelId)) await locks.get(normalizedChannelId)
249
-
250
- let release!: () => void
251
- locks.set(
252
- normalizedChannelId,
253
- new Promise<void>((r) => {
254
- release = r
255
- }),
256
- )
257
-
258
- try {
259
- const current = normalizeMaybeState(
260
- normalizedChannelId,
261
- (await store.get(normalizedChannelId)) as State | null,
262
- )
263
- change = fn(current)
264
- if (change.op === 'set') {
265
- change = {
266
- ...change,
267
- value: normalizeState(normalizedChannelId, change.value),
268
- }
269
- await store.put(normalizedChannelId, change.value as never)
270
- }
271
- if (change.op === 'delete') await store.delete(normalizedChannelId)
272
- if (change.op !== 'noop') notify(normalizedChannelId)
273
- return change.result
274
- } finally {
275
- locks.delete(normalizedChannelId)
276
- release()
277
- }
278
- }
279
-
280
- const cs: ChannelStore = {
281
- async getChannel(channelId) {
282
- const normalizedChannelId = normalizeChannelId(channelId)
283
- return normalizeMaybeState(
284
- normalizedChannelId,
285
- (await store.get(normalizedChannelId)) as State | null,
286
- )
287
- },
288
- async updateChannel(channelId, fn) {
289
- return update(channelId, fn)
290
- },
291
- waitForUpdate(channelId) {
292
- return new Promise<void>((resolve) => {
293
- const normalizedChannelId = normalizeChannelId(channelId)
294
- let set = waiters.get(normalizedChannelId)
295
- if (!set) {
296
- set = new Set()
297
- waiters.set(normalizedChannelId, set)
298
- }
299
- set.add(resolve)
300
- })
301
- },
302
- }
303
-
304
- cs.updateChannelResult = updateResult
305
-
306
- storeCache.set(store, cs)
307
- return cs
308
- }
@@ -1,89 +0,0 @@
1
- import type { Hex } from 'viem'
2
- import { describe, expect, test } from 'vp/test'
3
-
4
- import {
5
- createSessionReceipt,
6
- deserializeSessionReceipt,
7
- serializeSessionReceipt,
8
- } from './Receipt.js'
9
-
10
- const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
11
-
12
- describe('Receipt', () => {
13
- test('createSessionReceipt', () => {
14
- const receipt = createSessionReceipt({
15
- challengeId: 'test-challenge-id',
16
- channelId,
17
- acceptedCumulative: 5000000n,
18
- spent: 3000000n,
19
- units: 42,
20
- })
21
-
22
- expect(receipt.method).toBe('tempo')
23
- expect(receipt.intent).toBe('session')
24
- expect(receipt.status).toBe('success')
25
- expect(receipt.reference).toBe(channelId)
26
- expect(receipt.challengeId).toBe('test-challenge-id')
27
- expect(receipt.channelId).toBe(channelId)
28
- expect(receipt.acceptedCumulative).toBe('5000000')
29
- expect(receipt.spent).toBe('3000000')
30
- expect(receipt.units).toBe(42)
31
- expect(receipt.timestamp).toBeTruthy()
32
- expect(receipt.txHash).toBeUndefined()
33
- })
34
-
35
- test('createSessionReceipt with txHash', () => {
36
- const txHash = '0xabcdef' as Hex
37
- const receipt = createSessionReceipt({
38
- challengeId: 'test-challenge-id',
39
- channelId,
40
- acceptedCumulative: 5000000n,
41
- spent: 3000000n,
42
- txHash,
43
- })
44
-
45
- expect(receipt.txHash).toBe(txHash)
46
- expect(receipt.units).toBeUndefined()
47
- })
48
-
49
- test('createSessionReceipt omits optional fields when undefined', () => {
50
- const receipt = createSessionReceipt({
51
- challengeId: 'test-challenge-id',
52
- channelId,
53
- acceptedCumulative: 1000n,
54
- spent: 0n,
55
- })
56
-
57
- expect('units' in receipt).toBe(false)
58
- expect('txHash' in receipt).toBe(false)
59
- })
60
-
61
- test('serialize and deserialize round-trip', () => {
62
- const receipt = createSessionReceipt({
63
- challengeId: 'test-challenge-id',
64
- channelId,
65
- acceptedCumulative: 5000000n,
66
- spent: 3000000n,
67
- units: 42,
68
- })
69
-
70
- const encoded = serializeSessionReceipt(receipt)
71
- expect(typeof encoded).toBe('string')
72
-
73
- const decoded = deserializeSessionReceipt(encoded)
74
- expect(decoded).toEqual(receipt)
75
- })
76
-
77
- test('serialize produces base64url without padding', () => {
78
- const receipt = createSessionReceipt({
79
- challengeId: 'test-challenge-id',
80
- channelId,
81
- acceptedCumulative: 1n,
82
- spent: 0n,
83
- })
84
-
85
- const encoded = serializeSessionReceipt(receipt)
86
- // base64url uses - and _ instead of + and /, no = padding
87
- expect(encoded).not.toMatch(/[+/=]/)
88
- })
89
- })
@@ -1,46 +0,0 @@
1
- import { Base64 } from 'ox'
2
- import type { Hex } from 'viem'
3
-
4
- import type { SessionReceipt } from './Types.js'
5
-
6
- /**
7
- * Create a session receipt.
8
- */
9
- export function createSessionReceipt(params: {
10
- challengeId: string
11
- channelId: Hex
12
- acceptedCumulative: bigint
13
- spent: bigint
14
- units?: number | undefined
15
- txHash?: Hex | undefined
16
- }): SessionReceipt {
17
- return {
18
- method: 'tempo',
19
- intent: 'session',
20
- status: 'success',
21
- timestamp: new Date().toISOString(),
22
- reference: params.channelId,
23
- challengeId: params.challengeId,
24
- channelId: params.channelId,
25
- acceptedCumulative: params.acceptedCumulative.toString(),
26
- spent: params.spent.toString(),
27
- ...(params.units !== undefined && { units: params.units }),
28
- ...(params.txHash !== undefined && { txHash: params.txHash }),
29
- }
30
- }
31
-
32
- /**
33
- * Serialize a session receipt to the Payment-Receipt header format.
34
- */
35
- export function serializeSessionReceipt(receipt: SessionReceipt): string {
36
- const json = JSON.stringify(receipt)
37
- return Base64.fromString(json, { pad: false, url: true })
38
- }
39
-
40
- /**
41
- * Deserialize a Payment-Receipt header value to a session receipt.
42
- */
43
- export function deserializeSessionReceipt(encoded: string): SessionReceipt {
44
- const json = Base64.toString(encoded)
45
- return JSON.parse(json) as SessionReceipt
46
- }