mppx 0.8.13 → 0.8.15

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 (156) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/Errors.d.ts +10 -0
  3. package/dist/Errors.d.ts.map +1 -1
  4. package/dist/Errors.js +11 -2
  5. package/dist/Errors.js.map +1 -1
  6. package/dist/Method.d.ts +105 -3
  7. package/dist/Method.d.ts.map +1 -1
  8. package/dist/Method.js +102 -2
  9. package/dist/Method.js.map +1 -1
  10. package/dist/cli/validate/payment.d.ts.map +1 -1
  11. package/dist/cli/validate/payment.js +18 -4
  12. package/dist/cli/validate/payment.js.map +1 -1
  13. package/dist/client/internal/Fetch.d.ts.map +1 -1
  14. package/dist/client/internal/Fetch.js +98 -5
  15. package/dist/client/internal/Fetch.js.map +1 -1
  16. package/dist/client/internal/MethodChallenge.d.ts +19 -0
  17. package/dist/client/internal/MethodChallenge.d.ts.map +1 -0
  18. package/dist/client/internal/MethodChallenge.js +15 -0
  19. package/dist/client/internal/MethodChallenge.js.map +1 -0
  20. package/dist/client/internal/MethodResponse.d.ts +15 -0
  21. package/dist/client/internal/MethodResponse.d.ts.map +1 -1
  22. package/dist/client/internal/MethodResponse.js +10 -0
  23. package/dist/client/internal/MethodResponse.js.map +1 -1
  24. package/dist/server/Mppx.d.ts +23 -4
  25. package/dist/server/Mppx.d.ts.map +1 -1
  26. package/dist/server/Mppx.js +91 -82
  27. package/dist/server/Mppx.js.map +1 -1
  28. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  29. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  30. package/dist/stripe/server/internal/html.gen.js +1 -1
  31. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  32. package/dist/tempo/client/Methods.d.ts +1 -0
  33. package/dist/tempo/client/Methods.d.ts.map +1 -1
  34. package/dist/tempo/internal/fee-payer.d.ts +1 -0
  35. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  36. package/dist/tempo/internal/fee-payer.js +7 -2
  37. package/dist/tempo/internal/fee-payer.js.map +1 -1
  38. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -1
  39. package/dist/tempo/legacy/client/ChannelOps.js +2 -1
  40. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -1
  41. package/dist/tempo/server/Charge.d.ts +46 -77
  42. package/dist/tempo/server/Charge.d.ts.map +1 -1
  43. package/dist/tempo/server/Charge.js +289 -209
  44. package/dist/tempo/server/Charge.js.map +1 -1
  45. package/dist/tempo/server/Methods.d.ts +12 -1
  46. package/dist/tempo/server/Methods.d.ts.map +1 -1
  47. package/dist/tempo/server/Methods.js +4 -0
  48. package/dist/tempo/server/Methods.js.map +1 -1
  49. package/dist/tempo/server/Relay.d.ts +57 -0
  50. package/dist/tempo/server/Relay.d.ts.map +1 -0
  51. package/dist/tempo/server/Relay.js +179 -0
  52. package/dist/tempo/server/Relay.js.map +1 -0
  53. package/dist/tempo/server/SponsorBudget.d.ts +59 -0
  54. package/dist/tempo/server/SponsorBudget.d.ts.map +1 -0
  55. package/dist/tempo/server/SponsorBudget.js +150 -0
  56. package/dist/tempo/server/SponsorBudget.js.map +1 -0
  57. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  58. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  59. package/dist/tempo/server/internal/html.gen.js +1 -1
  60. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  61. package/dist/tempo/session/client/ChannelOps.d.ts +7 -1
  62. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -1
  63. package/dist/tempo/session/client/ChannelOps.js +9 -4
  64. package/dist/tempo/session/client/ChannelOps.js.map +1 -1
  65. package/dist/tempo/session/client/CredentialState.d.ts +5 -1
  66. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -1
  67. package/dist/tempo/session/client/CredentialState.js +37 -19
  68. package/dist/tempo/session/client/CredentialState.js.map +1 -1
  69. package/dist/tempo/session/client/Runtime.d.ts +8 -0
  70. package/dist/tempo/session/client/Runtime.d.ts.map +1 -1
  71. package/dist/tempo/session/client/Runtime.js +17 -0
  72. package/dist/tempo/session/client/Runtime.js.map +1 -1
  73. package/dist/tempo/session/client/Session.d.ts +15 -5
  74. package/dist/tempo/session/client/Session.d.ts.map +1 -1
  75. package/dist/tempo/session/client/Session.js +216 -45
  76. package/dist/tempo/session/client/Session.js.map +1 -1
  77. package/dist/tempo/session/client/SessionManager.d.ts +8 -1
  78. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
  79. package/dist/tempo/session/client/SessionManager.js +114 -44
  80. package/dist/tempo/session/client/SessionManager.js.map +1 -1
  81. package/dist/tempo/session/client/Transports.d.ts +16 -6
  82. package/dist/tempo/session/client/Transports.d.ts.map +1 -1
  83. package/dist/tempo/session/client/Transports.js +84 -37
  84. package/dist/tempo/session/client/Transports.js.map +1 -1
  85. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -1
  86. package/dist/tempo/session/precompile/Chain.js +96 -8
  87. package/dist/tempo/session/precompile/Chain.js.map +1 -1
  88. package/dist/tempo/session/precompile/Channel.d.ts +2 -0
  89. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -1
  90. package/dist/tempo/session/precompile/Channel.js +4 -0
  91. package/dist/tempo/session/precompile/Channel.js.map +1 -1
  92. package/dist/tempo/session/server/RequestState.js +3 -1
  93. package/dist/tempo/session/server/RequestState.js.map +1 -1
  94. package/dist/tempo/session/server/Ws.d.ts.map +1 -1
  95. package/dist/tempo/session/server/Ws.js +3 -0
  96. package/dist/tempo/session/server/Ws.js.map +1 -1
  97. package/dist/tempo/subscription/KeyAuthorization.d.ts +1 -829
  98. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  99. package/dist/tempo/subscription/KeyAuthorization.js +14 -3
  100. package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
  101. package/dist/viem/Client.d.ts.map +1 -1
  102. package/dist/viem/Client.js +6 -1
  103. package/dist/viem/Client.js.map +1 -1
  104. package/package.json +2 -2
  105. package/src/Errors.test.ts +23 -0
  106. package/src/Errors.ts +21 -2
  107. package/src/Method.test.ts +102 -1
  108. package/src/Method.ts +241 -5
  109. package/src/cli/validate/payment.ts +18 -4
  110. package/src/cli/validate.test.ts +16 -0
  111. package/src/client/Mppx.test-d.ts +3 -3
  112. package/src/client/internal/Fetch.test.ts +77 -0
  113. package/src/client/internal/Fetch.ts +122 -11
  114. package/src/client/internal/MethodChallenge.ts +35 -0
  115. package/src/client/internal/MethodResponse.ts +28 -0
  116. package/src/server/Mppx.test-d.ts +2 -0
  117. package/src/server/Mppx.test.ts +205 -0
  118. package/src/server/Mppx.ts +167 -103
  119. package/src/stripe/server/internal/html.gen.ts +1 -1
  120. package/src/tempo/PublicExports.test-d.ts +20 -0
  121. package/src/tempo/internal/fee-payer.ts +7 -3
  122. package/src/tempo/legacy/client/ChannelOps.test.ts +7 -0
  123. package/src/tempo/legacy/client/ChannelOps.ts +2 -1
  124. package/src/tempo/server/Charge.test.ts +337 -63
  125. package/src/tempo/server/Charge.ts +443 -267
  126. package/src/tempo/server/Methods.ts +11 -0
  127. package/src/tempo/server/Relay.test.ts +677 -0
  128. package/src/tempo/server/Relay.ts +297 -0
  129. package/src/tempo/server/SponsorBudget.test.ts +154 -0
  130. package/src/tempo/server/SponsorBudget.ts +219 -0
  131. package/src/tempo/server/internal/html.gen.ts +1 -1
  132. package/src/tempo/session/README.md +7 -0
  133. package/src/tempo/session/client/ChannelOps.test.ts +17 -2
  134. package/src/tempo/session/client/ChannelOps.ts +12 -4
  135. package/src/tempo/session/client/CredentialState.ts +61 -20
  136. package/src/tempo/session/client/Runtime.test.ts +12 -0
  137. package/src/tempo/session/client/Runtime.ts +22 -0
  138. package/src/tempo/session/client/Session.test.ts +506 -7
  139. package/src/tempo/session/client/Session.ts +279 -54
  140. package/src/tempo/session/client/SessionManager.test.ts +318 -13
  141. package/src/tempo/session/client/SessionManager.ts +132 -42
  142. package/src/tempo/session/client/Transports.test.ts +54 -1
  143. package/src/tempo/session/client/Transports.ts +137 -57
  144. package/src/tempo/session/precompile/Chain.integration.test.ts +19 -1
  145. package/src/tempo/session/precompile/Chain.test.ts +197 -10
  146. package/src/tempo/session/precompile/Chain.ts +102 -8
  147. package/src/tempo/session/precompile/Channel.test.ts +9 -0
  148. package/src/tempo/session/precompile/Channel.ts +5 -0
  149. package/src/tempo/session/server/RequestState.test.ts +8 -1
  150. package/src/tempo/session/server/RequestState.ts +2 -2
  151. package/src/tempo/session/server/Session.test.ts +66 -4
  152. package/src/tempo/session/server/Ws.ts +3 -0
  153. package/src/tempo/subscription/KeyAuthorization.test.ts +70 -1
  154. package/src/tempo/subscription/KeyAuthorization.ts +14 -3
  155. package/src/viem/Client.test.ts +18 -1
  156. package/src/viem/Client.ts +7 -1
@@ -0,0 +1,150 @@
1
+ import { VerificationFailedError } from '../../Errors.js';
2
+ const initialPollIntervalMs = 10;
3
+ const maxPollIntervalMs = 250;
4
+ const preparedLeaseMs = 30_000;
5
+ function key(parameters) {
6
+ return `mppx:charge:sponsor-budget:${parameters.chainId}:${parameters.sponsor.toLowerCase()}`;
7
+ }
8
+ function isState(value) {
9
+ return value?.version === 1 && typeof value.reservations === 'object';
10
+ }
11
+ async function mutateOwned(store, handle, mutate) {
12
+ return store.update(key(handle), (current) => {
13
+ if (!isState(current))
14
+ return { op: 'noop', result: false };
15
+ const reservation = current.reservations[handle.id];
16
+ if (!reservation || reservation.owner !== handle.owner)
17
+ return { op: 'noop', result: false };
18
+ const reservations = { ...current.reservations };
19
+ const next = mutate(reservation);
20
+ if (next)
21
+ reservations[handle.id] = next;
22
+ else
23
+ delete reservations[handle.id];
24
+ if (Object.keys(reservations).length === 0)
25
+ return { op: 'delete', result: true };
26
+ return {
27
+ op: 'set',
28
+ value: { reservations, version: 1 },
29
+ result: true,
30
+ };
31
+ });
32
+ }
33
+ async function reconcile(store, parameters) {
34
+ const state = await store.get(key(parameters));
35
+ if (!isState(state))
36
+ return;
37
+ const now = Date.now();
38
+ await Promise.all(Object.entries(state.reservations).map(async ([id, reservation]) => {
39
+ const handle = {
40
+ chainId: parameters.chainId,
41
+ id,
42
+ owner: reservation.owner,
43
+ sponsor: parameters.sponsor,
44
+ };
45
+ if (reservation.expiresAt <= now ||
46
+ (reservation.phase === 'prepared' && reservation.leaseUntil <= now)) {
47
+ await release(store, handle);
48
+ return;
49
+ }
50
+ // The broadcasting owner has submitted (or is about to submit) the
51
+ // transaction but has not yet published that outcome to this store.
52
+ // Releasing its reservation here races the owner's transition to
53
+ // `pending`: the transaction can settle while the owner observes a lost
54
+ // reservation and reports a retryable payment failure. Only reconcile
55
+ // receipts after the owner has completed that hand-off.
56
+ if (reservation.phase !== 'pending')
57
+ return;
58
+ try {
59
+ await parameters.getReceipt(reservation.transactionHash);
60
+ }
61
+ catch {
62
+ return;
63
+ }
64
+ await release(store, handle);
65
+ }));
66
+ }
67
+ /**
68
+ * Reserves aggregate sponsor fee capacity across processes.
69
+ *
70
+ * Pending broadcasts remain charged to the budget until a receipt is observed
71
+ * or their expiring nonce becomes invalid. Capacity waiters do not rewrite the
72
+ * shared state while waiting.
73
+ *
74
+ * @internal
75
+ */
76
+ export async function reserve(store, parameters) {
77
+ if (parameters.fee > parameters.maxTotalFee)
78
+ throw new VerificationFailedError({
79
+ reason: 'Sponsored transaction fee exceeds the aggregate sponsor budget',
80
+ });
81
+ let pollIntervalMs = initialPollIntervalMs;
82
+ for (;;) {
83
+ const now = Date.now();
84
+ if (now >= parameters.waitUntil)
85
+ throw new VerificationFailedError({
86
+ reason: 'Sponsored transaction expired while waiting for sponsor budget',
87
+ });
88
+ await reconcile(store, parameters);
89
+ const result = await store.update(key(parameters), (current) => {
90
+ if (current !== null && !isState(current))
91
+ return { op: 'noop', result: 'invalid' };
92
+ const reservations = { ...(current?.reservations ?? {}) };
93
+ const existing = reservations[parameters.id];
94
+ if (existing)
95
+ return { op: 'noop', result: 'duplicate' };
96
+ const values = Object.values(reservations);
97
+ const totalFee = values.reduce((total, reservation) => total + BigInt(reservation.fee), 0n);
98
+ if (values.length >= parameters.maxReservations ||
99
+ totalFee + parameters.fee > parameters.maxTotalFee)
100
+ return { op: 'noop', result: 'wait' };
101
+ reservations[parameters.id] = {
102
+ expiresAt: parameters.expiresAt,
103
+ fee: parameters.fee.toString(),
104
+ leaseUntil: Math.min(parameters.expiresAt, now + preparedLeaseMs),
105
+ owner: parameters.owner,
106
+ phase: 'prepared',
107
+ transactionHash: parameters.transactionHash,
108
+ };
109
+ return {
110
+ op: 'set',
111
+ value: { reservations, version: 1 },
112
+ result: 'reserved',
113
+ };
114
+ });
115
+ if (result === 'reserved')
116
+ return parameters;
117
+ if (result === 'invalid')
118
+ throw new VerificationFailedError({
119
+ reason: 'Sponsor budget store contains incompatible state',
120
+ });
121
+ if (result === 'duplicate')
122
+ throw new VerificationFailedError({
123
+ reason: 'Sponsored transaction already has a budget reservation',
124
+ });
125
+ await new Promise((resolve) => setTimeout(resolve, Math.min(pollIntervalMs, parameters.waitUntil - now)));
126
+ pollIntervalMs = Math.min(pollIntervalMs * 2, maxPollIntervalMs);
127
+ }
128
+ }
129
+ /**
130
+ * Advances a reservation before and after the broadcast call.
131
+ *
132
+ * The owner token fences stale workers from mutating a replacement reservation.
133
+ *
134
+ * @internal
135
+ */
136
+ export async function transition(store, handle, phase) {
137
+ return mutateOwned(store, handle, (reservation) => ({
138
+ ...reservation,
139
+ phase,
140
+ }));
141
+ }
142
+ /**
143
+ * Releases a reservation only when the caller still owns it.
144
+ *
145
+ * @internal
146
+ */
147
+ export async function release(store, handle) {
148
+ return mutateOwned(store, handle, () => null);
149
+ }
150
+ //# sourceMappingURL=SponsorBudget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SponsorBudget.js","sourceRoot":"","sources":["../../../src/tempo/server/SponsorBudget.ts"],"names":[],"mappings":"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"}