mppx 0.6.18 → 0.6.20
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.
- package/CHANGELOG.md +13 -0
- package/dist/Challenge.d.ts +2 -2
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +1 -1
- package/dist/Challenge.js.map +1 -1
- package/dist/Method.d.ts +34 -0
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +3 -1
- package/dist/Method.js.map +1 -1
- package/dist/Receipt.d.ts +1 -0
- package/dist/Receipt.d.ts.map +1 -1
- package/dist/Receipt.js +2 -0
- package/dist/Receipt.js.map +1 -1
- package/dist/client/Methods.d.ts +1 -0
- package/dist/client/Methods.d.ts.map +1 -1
- package/dist/client/Methods.js +1 -0
- package/dist/client/Methods.js.map +1 -1
- package/dist/middlewares/elysia.d.ts.map +1 -1
- package/dist/middlewares/elysia.js +14 -0
- package/dist/middlewares/elysia.js.map +1 -1
- package/dist/middlewares/express.d.ts.map +1 -1
- package/dist/middlewares/express.js +1 -2
- package/dist/middlewares/express.js.map +1 -1
- package/dist/middlewares/hono.d.ts.map +1 -1
- package/dist/middlewares/hono.js +14 -0
- package/dist/middlewares/hono.js.map +1 -1
- package/dist/middlewares/nextjs.d.ts.map +1 -1
- package/dist/middlewares/nextjs.js +14 -0
- package/dist/middlewares/nextjs.js.map +1 -1
- package/dist/proxy/Proxy.d.ts.map +1 -1
- package/dist/proxy/Proxy.js +2 -2
- package/dist/proxy/Proxy.js.map +1 -1
- package/dist/proxy/Service.d.ts.map +1 -1
- package/dist/proxy/Service.js +1 -1
- package/dist/proxy/Service.js.map +1 -1
- package/dist/server/Mppx.d.ts +15 -3
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +190 -40
- package/dist/server/Mppx.js.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/Methods.d.ts +96 -0
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.js +97 -0
- package/dist/tempo/Methods.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +3 -0
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +3 -0
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/Subscription.d.ts +114 -0
- package/dist/tempo/client/Subscription.d.ts.map +1 -0
- package/dist/tempo/client/Subscription.js +100 -0
- package/dist/tempo/client/Subscription.js.map +1 -0
- package/dist/tempo/client/index.d.ts +1 -0
- package/dist/tempo/client/index.d.ts.map +1 -1
- package/dist/tempo/client/index.js +1 -0
- package/dist/tempo/client/index.js.map +1 -1
- package/dist/tempo/index.d.ts +1 -0
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +1 -0
- package/dist/tempo/index.js.map +1 -1
- package/dist/tempo/server/Charge.js +2 -2
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +5 -0
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +5 -0
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +221 -0
- package/dist/tempo/server/Subscription.d.ts.map +1 -0
- package/dist/tempo/server/Subscription.js +637 -0
- package/dist/tempo/server/Subscription.js.map +1 -0
- package/dist/tempo/server/index.d.ts +1 -0
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +1 -0
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/session/Chain.d.ts.map +1 -1
- package/dist/tempo/session/Chain.js +3 -4
- package/dist/tempo/session/Chain.js.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +282 -0
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -0
- package/dist/tempo/subscription/KeyAuthorization.js +297 -0
- package/dist/tempo/subscription/KeyAuthorization.js.map +1 -0
- package/dist/tempo/subscription/Receipt.d.ts +10 -0
- package/dist/tempo/subscription/Receipt.d.ts.map +1 -0
- package/dist/tempo/subscription/Receipt.js +16 -0
- package/dist/tempo/subscription/Receipt.js.map +1 -0
- package/dist/tempo/subscription/Store.d.ts +99 -0
- package/dist/tempo/subscription/Store.d.ts.map +1 -0
- package/dist/tempo/subscription/Store.js +292 -0
- package/dist/tempo/subscription/Store.js.map +1 -0
- package/dist/tempo/subscription/Types.d.ts +65 -0
- package/dist/tempo/subscription/Types.d.ts.map +1 -0
- package/dist/tempo/subscription/Types.js +2 -0
- package/dist/tempo/subscription/Types.js.map +1 -0
- package/dist/tempo/subscription/index.d.ts +6 -0
- package/dist/tempo/subscription/index.d.ts.map +1 -0
- package/dist/tempo/subscription/index.js +4 -0
- package/dist/tempo/subscription/index.js.map +1 -0
- package/dist/zod.d.ts +7 -0
- package/dist/zod.d.ts.map +1 -1
- package/dist/zod.js +18 -0
- package/dist/zod.js.map +1 -1
- package/package.json +3 -3
- package/src/Challenge.test.ts +13 -0
- package/src/Challenge.ts +3 -3
- package/src/Method.ts +46 -1
- package/src/Receipt.ts +2 -0
- package/src/client/Methods.ts +1 -0
- package/src/middlewares/elysia.test.ts +31 -1
- package/src/middlewares/elysia.ts +13 -0
- package/src/middlewares/express.ts +1 -5
- package/src/middlewares/hono.test.ts +30 -1
- package/src/middlewares/hono.ts +13 -0
- package/src/middlewares/nextjs.test.ts +28 -1
- package/src/middlewares/nextjs.ts +13 -0
- package/src/proxy/Proxy.ts +2 -5
- package/src/proxy/Service.test.ts +34 -0
- package/src/proxy/Service.ts +7 -0
- package/src/server/Mppx.authorize.test.ts +210 -0
- package/src/server/Mppx.test-d.ts +23 -1
- package/src/server/Mppx.test.ts +73 -3
- package/src/server/Mppx.ts +291 -58
- package/src/stripe/server/internal/html/package.json +1 -1
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/Methods.test.ts +131 -0
- package/src/tempo/Methods.ts +136 -0
- package/src/tempo/Subscription.integration.test.ts +591 -0
- package/src/tempo/client/Methods.ts +3 -0
- package/src/tempo/client/Subscription.test.ts +131 -0
- package/src/tempo/client/Subscription.ts +155 -0
- package/src/tempo/client/index.ts +1 -0
- package/src/tempo/index.ts +1 -0
- package/src/tempo/server/Charge.ts +2 -2
- package/src/tempo/server/Methods.ts +5 -0
- package/src/tempo/server/Subscription.test.ts +1410 -0
- package/src/tempo/server/Subscription.ts +1014 -0
- package/src/tempo/server/index.ts +1 -0
- package/src/tempo/server/internal/html/package.json +1 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/session/Chain.ts +3 -5
- package/src/tempo/subscription/KeyAuthorization.test.ts +204 -0
- package/src/tempo/subscription/KeyAuthorization.ts +394 -0
- package/src/tempo/subscription/Receipt.ts +28 -0
- package/src/tempo/subscription/Store.test.ts +554 -0
- package/src/tempo/subscription/Store.ts +431 -0
- package/src/tempo/subscription/Types.ts +68 -0
- package/src/tempo/subscription/index.ts +23 -0
- package/src/zod.test.ts +23 -1
- package/src/zod.ts +24 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { KeyAuthorization, SignatureEnvelope } from 'ox/tempo';
|
|
2
|
+
import { isAddress, isAddressEqual } from 'viem';
|
|
3
|
+
import { VerificationFailedError } from '../../Errors.js';
|
|
4
|
+
/** 4-byte selector for TIP-20 `transfer(address,uint256)`. */
|
|
5
|
+
export const transferSelector = '0xa9059cbb';
|
|
6
|
+
/** 4-byte selector for TIP-20 `transferWithMemo(address,uint256,bytes)`. */
|
|
7
|
+
export const transferWithMemoSelector = '0x95777d59';
|
|
8
|
+
const uint64Max = (1n << 64n) - 1n;
|
|
9
|
+
const secondsPerDay = 86400n;
|
|
10
|
+
const secondsPerWeek = 604800n;
|
|
11
|
+
/**
|
|
12
|
+
* Converts a subscription expiry timestamp into the Unix seconds value required by Tempo key
|
|
13
|
+
* authorizations.
|
|
14
|
+
*/
|
|
15
|
+
export function toSubscriptionExpiryDate(subscriptionExpires) {
|
|
16
|
+
return subscriptionExpires instanceof Date ? subscriptionExpires : new Date(subscriptionExpires);
|
|
17
|
+
}
|
|
18
|
+
export function toSubscriptionExpirySeconds(subscriptionExpires) {
|
|
19
|
+
const milliseconds = subscriptionExpires.getTime();
|
|
20
|
+
if (!Number.isFinite(milliseconds)) {
|
|
21
|
+
throw new VerificationFailedError({ reason: 'subscriptionExpires is invalid' });
|
|
22
|
+
}
|
|
23
|
+
if (milliseconds % 1_000 !== 0) {
|
|
24
|
+
throw new VerificationFailedError({
|
|
25
|
+
reason: 'subscriptionExpires must be representable as whole seconds',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const seconds = milliseconds / 1_000;
|
|
29
|
+
if (seconds <= 0 || !Number.isSafeInteger(seconds)) {
|
|
30
|
+
throw new VerificationFailedError({
|
|
31
|
+
reason: 'subscriptionExpires cannot be represented in a Tempo key authorization',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return seconds;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Converts the shared subscription period fields into the numeric period accepted by Tempo key
|
|
38
|
+
* authorizations.
|
|
39
|
+
*/
|
|
40
|
+
export function toSubscriptionPeriodSeconds(request) {
|
|
41
|
+
if (!/^[1-9]\d*$/.test(request.periodCount)) {
|
|
42
|
+
throw new VerificationFailedError({ reason: 'periodCount is invalid' });
|
|
43
|
+
}
|
|
44
|
+
if (request.periodUnit !== 'day' && request.periodUnit !== 'week') {
|
|
45
|
+
throw new VerificationFailedError({ reason: 'periodUnit is invalid' });
|
|
46
|
+
}
|
|
47
|
+
const unitSeconds = request.periodUnit === 'day' ? secondsPerDay : secondsPerWeek;
|
|
48
|
+
const value = BigInt(request.periodCount) * unitSeconds;
|
|
49
|
+
if (value > uint64Max) {
|
|
50
|
+
throw new VerificationFailedError({
|
|
51
|
+
reason: 'subscription period cannot be represented as an unsigned 64-bit integer',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
55
|
+
throw new VerificationFailedError({
|
|
56
|
+
reason: 'subscription period cannot be represented exactly by this Tempo client',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return Number(value);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Verifies that the subscription duration is representable and lasts beyond the payment challenge.
|
|
63
|
+
*/
|
|
64
|
+
export function assertSubscriptionTiming(parameters) {
|
|
65
|
+
const { challengeExpires, request } = parameters;
|
|
66
|
+
toSubscriptionPeriodSeconds(request);
|
|
67
|
+
const subscriptionExpiry = toSubscriptionExpirySeconds(toSubscriptionExpiryDate(request.subscriptionExpires));
|
|
68
|
+
if (challengeExpires) {
|
|
69
|
+
const challengeExpiry = Math.floor(new Date(challengeExpires).getTime() / 1_000);
|
|
70
|
+
if (!Number.isFinite(challengeExpiry) || subscriptionExpiry <= challengeExpiry) {
|
|
71
|
+
throw new VerificationFailedError({
|
|
72
|
+
reason: 'subscriptionExpires must be strictly later than challenge expires',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Builds the Tempo access-key call scopes required for a subscription payment. */
|
|
78
|
+
export function getSubscriptionScopes(request) {
|
|
79
|
+
const currency = normalizeAddress(request.currency, 'currency');
|
|
80
|
+
const recipient = normalizeAddress(request.recipient, 'recipient');
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
address: currency,
|
|
84
|
+
selector: transferSelector,
|
|
85
|
+
recipients: [recipient],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
address: currency,
|
|
89
|
+
selector: transferWithMemoSelector,
|
|
90
|
+
recipients: [recipient],
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
/** Builds the RPC `allowedCalls` payload passed to `wallet_authorizeAccessKey`. */
|
|
95
|
+
export function getSubscriptionRpcAllowedCalls(request) {
|
|
96
|
+
const [transfer, transferWithMemo] = getSubscriptionScopes(request);
|
|
97
|
+
return [
|
|
98
|
+
{
|
|
99
|
+
target: normalizeAddress(request.currency, 'currency'),
|
|
100
|
+
selectorRules: [
|
|
101
|
+
{
|
|
102
|
+
selector: transfer.selector,
|
|
103
|
+
recipients: transfer.recipients,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
selector: transferWithMemo.selector,
|
|
107
|
+
recipients: transferWithMemo.recipients,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Creates and signs a Tempo key authorization for subscription payments when the account can sign
|
|
115
|
+
* arbitrary hashes locally.
|
|
116
|
+
*/
|
|
117
|
+
export async function signSubscriptionKeyAuthorization(parameters) {
|
|
118
|
+
const { accessKey, account, chainId, request } = parameters;
|
|
119
|
+
if (typeof account.sign !== 'function')
|
|
120
|
+
return undefined;
|
|
121
|
+
const authorization = createUnsignedAuthorization({
|
|
122
|
+
accessKey,
|
|
123
|
+
chainId,
|
|
124
|
+
request,
|
|
125
|
+
});
|
|
126
|
+
const signature = await account.sign({
|
|
127
|
+
hash: KeyAuthorization.getSignPayload(authorization),
|
|
128
|
+
});
|
|
129
|
+
return KeyAuthorization.from(authorization, {
|
|
130
|
+
signature: SignatureEnvelope.from(signature),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Verifies that a subscription credential contains a key authorization scoped to the requested
|
|
135
|
+
* token, recipient, amount, period, expiry, chain, and server-issued access key.
|
|
136
|
+
*/
|
|
137
|
+
export function verifySubscriptionKeyAuthorization(parameters) {
|
|
138
|
+
const { accessKey, chainId, payload, request } = parameters;
|
|
139
|
+
if (payload.type !== 'keyAuthorization') {
|
|
140
|
+
throw new VerificationFailedError({ reason: 'invalid keyAuthorization payload' });
|
|
141
|
+
}
|
|
142
|
+
const authorization = deserializeAuthorization(payload.signature);
|
|
143
|
+
const signature = getPrimitiveSignature(authorization);
|
|
144
|
+
assertAuthorizationKey({
|
|
145
|
+
accessKey,
|
|
146
|
+
authorization,
|
|
147
|
+
chainId,
|
|
148
|
+
});
|
|
149
|
+
assertAuthorizationExpiry(authorization, request);
|
|
150
|
+
assertAuthorizationLimit(getSingleTokenLimit(authorization), request);
|
|
151
|
+
assertAuthorizationScopes(authorization.scopes, request);
|
|
152
|
+
const source = recoverAuthorizationSource(authorization, signature);
|
|
153
|
+
return {
|
|
154
|
+
authorization,
|
|
155
|
+
source: {
|
|
156
|
+
address: source,
|
|
157
|
+
chainId,
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function createUnsignedAuthorization(parameters) {
|
|
162
|
+
const { accessKey, chainId, request } = parameters;
|
|
163
|
+
return KeyAuthorization.from({
|
|
164
|
+
address: normalizeAddress(accessKey.accessKeyAddress, 'accessKeyAddress'),
|
|
165
|
+
chainId: BigInt(chainId),
|
|
166
|
+
expiry: toSubscriptionExpirySeconds(toSubscriptionExpiryDate(request.subscriptionExpires)),
|
|
167
|
+
limits: [
|
|
168
|
+
{
|
|
169
|
+
token: normalizeAddress(request.currency, 'currency'),
|
|
170
|
+
limit: BigInt(request.amount),
|
|
171
|
+
period: toSubscriptionPeriodSeconds(request),
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
scopes: getSubscriptionScopes(request),
|
|
175
|
+
type: accessKey.keyType,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function deserializeAuthorization(signature) {
|
|
179
|
+
try {
|
|
180
|
+
return KeyAuthorization.deserialize(signature);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
throw new VerificationFailedError({ reason: 'invalid keyAuthorization payload' });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function getPrimitiveSignature(authorization) {
|
|
187
|
+
const signature = authorization.signature;
|
|
188
|
+
if (!signature || signature.type === 'keychain') {
|
|
189
|
+
throw new VerificationFailedError({
|
|
190
|
+
reason: 'keyAuthorization must use a primitive signature',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return signature;
|
|
194
|
+
}
|
|
195
|
+
function assertAuthorizationKey(parameters) {
|
|
196
|
+
const { accessKey, authorization, chainId } = parameters;
|
|
197
|
+
if (authorization.chainId !== BigInt(chainId)) {
|
|
198
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization chainId mismatch' });
|
|
199
|
+
}
|
|
200
|
+
if (!accessKey)
|
|
201
|
+
return;
|
|
202
|
+
if (!isAddressEqual(authorization.address, normalizeAddress(accessKey.accessKeyAddress, 'accessKeyAddress'))) {
|
|
203
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization access key mismatch' });
|
|
204
|
+
}
|
|
205
|
+
if (authorization.type !== accessKey.keyType) {
|
|
206
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization key type mismatch' });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function assertAuthorizationExpiry(authorization, request) {
|
|
210
|
+
assertSubscriptionTiming({ request });
|
|
211
|
+
if (authorization.expiry !==
|
|
212
|
+
toSubscriptionExpirySeconds(toSubscriptionExpiryDate(request.subscriptionExpires))) {
|
|
213
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization expiry mismatch' });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function getSingleTokenLimit(authorization) {
|
|
217
|
+
const [limit] = authorization.limits ?? [];
|
|
218
|
+
if (!limit || authorization.limits?.length !== 1) {
|
|
219
|
+
throw new VerificationFailedError({
|
|
220
|
+
reason: 'keyAuthorization must contain exactly one token limit',
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return limit;
|
|
224
|
+
}
|
|
225
|
+
function assertAuthorizationLimit(limit, request) {
|
|
226
|
+
if (!isAddressEqual(limit.token, normalizeAddress(request.currency, 'currency'))) {
|
|
227
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization currency mismatch' });
|
|
228
|
+
}
|
|
229
|
+
if (limit.limit !== BigInt(request.amount)) {
|
|
230
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization amount mismatch' });
|
|
231
|
+
}
|
|
232
|
+
if (limit.period !== toSubscriptionPeriodSeconds(request)) {
|
|
233
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization period mismatch' });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function assertAuthorizationScopes(scopes, request) {
|
|
237
|
+
if (!scopes || scopes.length < 1 || scopes.length > 2) {
|
|
238
|
+
throw new VerificationFailedError({
|
|
239
|
+
reason: 'keyAuthorization must contain recipient-scoped transfer calls',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
const currency = normalizeAddress(request.currency, 'currency');
|
|
243
|
+
const recipient = normalizeAddress(request.recipient, 'recipient');
|
|
244
|
+
const seen = new Set();
|
|
245
|
+
for (const scope of scopes) {
|
|
246
|
+
if (!isAddressEqual(scope.address, currency)) {
|
|
247
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization call target mismatch' });
|
|
248
|
+
}
|
|
249
|
+
const selector = normalizeSelector(scope.selector);
|
|
250
|
+
if (selector !== transferSelector && selector !== transferWithMemoSelector) {
|
|
251
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization selector not allowed' });
|
|
252
|
+
}
|
|
253
|
+
if (seen.has(selector)) {
|
|
254
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization duplicate selector' });
|
|
255
|
+
}
|
|
256
|
+
seen.add(selector);
|
|
257
|
+
if (scope.recipients?.length !== 1 || !isAddressEqual(scope.recipients[0], recipient)) {
|
|
258
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization recipient mismatch' });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (!seen.has(transferSelector)) {
|
|
262
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization must allow transfer' });
|
|
263
|
+
}
|
|
264
|
+
if (!seen.has(transferWithMemoSelector)) {
|
|
265
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization must allow transferWithMemo' });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function recoverAuthorizationSource(authorization, signature) {
|
|
269
|
+
const signPayload = KeyAuthorization.getSignPayload(authorization);
|
|
270
|
+
try {
|
|
271
|
+
const source = SignatureEnvelope.extractAddress({
|
|
272
|
+
payload: signPayload,
|
|
273
|
+
signature,
|
|
274
|
+
});
|
|
275
|
+
if (!SignatureEnvelope.verify(signature, { address: source, payload: signPayload })) {
|
|
276
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization signature is invalid' });
|
|
277
|
+
}
|
|
278
|
+
return source;
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
if (error instanceof VerificationFailedError)
|
|
282
|
+
throw error;
|
|
283
|
+
throw new VerificationFailedError({ reason: 'keyAuthorization signature is invalid' });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function normalizeAddress(value, name) {
|
|
287
|
+
if (!isAddress(value)) {
|
|
288
|
+
throw new VerificationFailedError({ reason: `${name} must be an address` });
|
|
289
|
+
}
|
|
290
|
+
return value.toLowerCase();
|
|
291
|
+
}
|
|
292
|
+
function normalizeSelector(value) {
|
|
293
|
+
if (typeof value !== 'string')
|
|
294
|
+
return '';
|
|
295
|
+
return value.toLowerCase();
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=KeyAuthorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeyAuthorization.js","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SubscriptionRecord, SubscriptionReceipt } from './Types.js';
|
|
2
|
+
/** Creates a subscription receipt from persisted subscription fields. */
|
|
3
|
+
export declare function createSubscriptionReceipt(parameters: createSubscriptionReceipt.Parameters): SubscriptionReceipt;
|
|
4
|
+
export declare namespace createSubscriptionReceipt {
|
|
5
|
+
/** Fields required to build a subscription receipt. */
|
|
6
|
+
type Parameters = Pick<SubscriptionRecord, 'externalId' | 'reference' | 'subscriptionId' | 'timestamp'>;
|
|
7
|
+
}
|
|
8
|
+
/** Converts a stored subscription record into a receipt. */
|
|
9
|
+
export declare function fromRecord(record: SubscriptionRecord): SubscriptionReceipt;
|
|
10
|
+
//# sourceMappingURL=Receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Receipt.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/Receipt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEzE,yEAAyE;AACzE,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,yBAAyB,CAAC,UAAU,GAC/C,mBAAmB,CASrB;AAED,MAAM,CAAC,OAAO,WAAW,yBAAyB,CAAC;IACjD,uDAAuD;IACvD,KAAK,UAAU,GAAG,IAAI,CACpB,kBAAkB,EAClB,YAAY,GAAG,WAAW,GAAG,gBAAgB,GAAG,WAAW,CAC5D,CAAA;CACF;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,mBAAmB,CAE1E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Creates a subscription receipt from persisted subscription fields. */
|
|
2
|
+
export function createSubscriptionReceipt(parameters) {
|
|
3
|
+
return {
|
|
4
|
+
method: 'tempo',
|
|
5
|
+
reference: parameters.reference,
|
|
6
|
+
status: 'success',
|
|
7
|
+
subscriptionId: parameters.subscriptionId,
|
|
8
|
+
timestamp: parameters.timestamp,
|
|
9
|
+
...(parameters.externalId ? { externalId: parameters.externalId } : {}),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Converts a stored subscription record into a receipt. */
|
|
13
|
+
export function fromRecord(record) {
|
|
14
|
+
return createSubscriptionReceipt(record);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Receipt.js","sourceRoot":"","sources":["../../../src/tempo/subscription/Receipt.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,UAAU,yBAAyB,CACvC,UAAgD;IAEhD,OAAO;QACL,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,MAAM,EAAE,SAAS;QACjB,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAA;AACH,CAAC;AAUD,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,MAA0B;IACnD,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as Store from '../../Store.js';
|
|
2
|
+
import type { SubscriptionAccessKeyRecord, SubscriptionRecord } from './Types.js';
|
|
3
|
+
/** Subscription-aware wrapper around a generic key-value store. */
|
|
4
|
+
export type SubscriptionStore = {
|
|
5
|
+
/** Runs activation once for a challenge and resolved lookup key. */
|
|
6
|
+
activate<result extends {
|
|
7
|
+
subscription: SubscriptionRecord;
|
|
8
|
+
}>(parameters: ActivateParameters<result>): Promise<ActivateResult<result>>;
|
|
9
|
+
/** Looks up a subscription by subscription ID. */
|
|
10
|
+
get(subscriptionId: string): Promise<SubscriptionRecord | null>;
|
|
11
|
+
/** Looks up a generated access key for a resolved request key. */
|
|
12
|
+
getAccessKey(key: string): Promise<SubscriptionAccessKeyRecord | null>;
|
|
13
|
+
/** Looks up the active subscription for a resolved request key. */
|
|
14
|
+
getByKey(key: string): Promise<SubscriptionRecord | null>;
|
|
15
|
+
/** Gets or creates the server-owned access key for a resolved request key. */
|
|
16
|
+
getOrCreateAccessKey(key: string): Promise<SubscriptionAccessKeyRecord>;
|
|
17
|
+
/** Upserts a subscription record and marks it as active for its lookup key. */
|
|
18
|
+
put(record: SubscriptionRecord): Promise<void>;
|
|
19
|
+
/** Runs renewal once for a subscription period. */
|
|
20
|
+
renew<result extends {
|
|
21
|
+
subscription: SubscriptionRecord;
|
|
22
|
+
}>(parameters: RenewParameters<result>): Promise<RenewResult<result>>;
|
|
23
|
+
};
|
|
24
|
+
type ActivateParameters<result extends {
|
|
25
|
+
subscription: SubscriptionRecord;
|
|
26
|
+
}> = {
|
|
27
|
+
challengeId: string;
|
|
28
|
+
create: () => Promise<result>;
|
|
29
|
+
isReusable?: ((subscription: SubscriptionRecord) => boolean) | undefined;
|
|
30
|
+
lookupKey: string;
|
|
31
|
+
};
|
|
32
|
+
export type ActivateResult<result extends {
|
|
33
|
+
subscription: SubscriptionRecord;
|
|
34
|
+
}> = {
|
|
35
|
+
status: 'activated';
|
|
36
|
+
result: result;
|
|
37
|
+
} | {
|
|
38
|
+
status: 'claimMismatch';
|
|
39
|
+
} | {
|
|
40
|
+
status: 'existing';
|
|
41
|
+
subscription: SubscriptionRecord;
|
|
42
|
+
} | {
|
|
43
|
+
status: 'inFlight';
|
|
44
|
+
} | {
|
|
45
|
+
status: 'replayed';
|
|
46
|
+
};
|
|
47
|
+
type RenewParameters<result extends {
|
|
48
|
+
subscription: SubscriptionRecord;
|
|
49
|
+
}> = {
|
|
50
|
+
inFlightReference: string;
|
|
51
|
+
periodIndex: number;
|
|
52
|
+
renew: (parameters: {
|
|
53
|
+
inFlightReference: string;
|
|
54
|
+
periodIndex: number;
|
|
55
|
+
subscription: SubscriptionRecord;
|
|
56
|
+
}) => Promise<result>;
|
|
57
|
+
subscriptionId: string;
|
|
58
|
+
};
|
|
59
|
+
export type RenewResult<result extends {
|
|
60
|
+
subscription: SubscriptionRecord;
|
|
61
|
+
}> = {
|
|
62
|
+
status: 'charged';
|
|
63
|
+
subscription: SubscriptionRecord;
|
|
64
|
+
} | {
|
|
65
|
+
status: 'inFlight';
|
|
66
|
+
subscription: SubscriptionRecord;
|
|
67
|
+
} | {
|
|
68
|
+
status: 'missing';
|
|
69
|
+
} | {
|
|
70
|
+
status: 'renewed';
|
|
71
|
+
result: result;
|
|
72
|
+
} | {
|
|
73
|
+
status: 'superseded';
|
|
74
|
+
subscription: SubscriptionRecord;
|
|
75
|
+
} | {
|
|
76
|
+
status: 'claimMismatch';
|
|
77
|
+
};
|
|
78
|
+
/** Wraps a generic key-value {@link Store.Store} with subscription-specific accessors. */
|
|
79
|
+
export declare function fromStore(store: Store.AtomicStore<Record<string, unknown>>, options?: fromStore.Options): SubscriptionStore;
|
|
80
|
+
export declare namespace fromStore {
|
|
81
|
+
type Options = {
|
|
82
|
+
/** Key prefix for server-owned subscription access keys. @default `'tempo:subscription:access-key:'` */
|
|
83
|
+
accessKeyPrefix?: string | undefined;
|
|
84
|
+
/** Key prefix for resolved subscription activation locks. @default `'tempo:subscription:activation:'` */
|
|
85
|
+
activationPrefix?: string | undefined;
|
|
86
|
+
/** Milliseconds before a stuck activation lock can be replaced. @default `900000` */
|
|
87
|
+
activationTimeoutMs?: number | undefined;
|
|
88
|
+
/** Key prefix for single-use activation credential markers. @default `'tempo:subscription:credential:'` */
|
|
89
|
+
credentialPrefix?: string | undefined;
|
|
90
|
+
/** Key prefix for subscription records. @default `'tempo:subscription:record:'` */
|
|
91
|
+
recordPrefix?: string | undefined;
|
|
92
|
+
/** Milliseconds before a stuck renewal lock can be replaced. @default `900000` */
|
|
93
|
+
renewalTimeoutMs?: number | undefined;
|
|
94
|
+
/** Key prefix for resolved request keys. @default `'tempo:subscription:key:'` */
|
|
95
|
+
keyPrefix?: string | undefined;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export {};
|
|
99
|
+
//# sourceMappingURL=Store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/Store.ts"],"names":[],"mappings":"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"}
|