mppx 0.6.19 → 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 +7 -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/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/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/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/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,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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"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { Secp256k1 } from 'ox';
|
|
2
|
+
import { Account as TempoAccount } from 'viem/tempo';
|
|
3
|
+
const defaultRecordPrefix = 'tempo:subscription:record:';
|
|
4
|
+
const defaultKeyPrefix = 'tempo:subscription:key:';
|
|
5
|
+
const defaultActivationPrefix = 'tempo:subscription:activation:';
|
|
6
|
+
const defaultAccessKeyPrefix = 'tempo:subscription:access-key:';
|
|
7
|
+
const defaultCredentialPrefix = 'tempo:subscription:credential:';
|
|
8
|
+
const defaultActivationTimeoutMs = 15 * 60 * 1_000;
|
|
9
|
+
const defaultRenewalTimeoutMs = 15 * 60 * 1_000;
|
|
10
|
+
/** Wraps a generic key-value {@link Store.Store} with subscription-specific accessors. */
|
|
11
|
+
export function fromStore(store, options) {
|
|
12
|
+
const { accessKeyPrefix = defaultAccessKeyPrefix, activationPrefix = defaultActivationPrefix, activationTimeoutMs = defaultActivationTimeoutMs, credentialPrefix = defaultCredentialPrefix, keyPrefix = defaultKeyPrefix, recordPrefix = defaultRecordPrefix, renewalTimeoutMs = defaultRenewalTimeoutMs, } = options ?? {};
|
|
13
|
+
function recordKey(subscriptionId) {
|
|
14
|
+
return `${recordPrefix}${subscriptionId}`;
|
|
15
|
+
}
|
|
16
|
+
function activationKey(key) {
|
|
17
|
+
return `${activationPrefix}${key}`;
|
|
18
|
+
}
|
|
19
|
+
function credentialKey(challengeId) {
|
|
20
|
+
return `${credentialPrefix}${challengeId}`;
|
|
21
|
+
}
|
|
22
|
+
function accessKeyKey(key) {
|
|
23
|
+
return `${accessKeyPrefix}${key}`;
|
|
24
|
+
}
|
|
25
|
+
function lookupRecordKey(key) {
|
|
26
|
+
return `${keyPrefix}${key}`;
|
|
27
|
+
}
|
|
28
|
+
async function getByLookupKey(key) {
|
|
29
|
+
const subscriptionId = (await store.get(lookupRecordKey(key)));
|
|
30
|
+
if (!subscriptionId)
|
|
31
|
+
return null;
|
|
32
|
+
return (await store.get(recordKey(subscriptionId)));
|
|
33
|
+
}
|
|
34
|
+
async function clearRenewalState(subscriptionId, periodIndex, attempt) {
|
|
35
|
+
await store.update(recordKey(subscriptionId), (current) => {
|
|
36
|
+
const subscription = current;
|
|
37
|
+
if (!subscription ||
|
|
38
|
+
subscription.inFlightPeriod !== periodIndex ||
|
|
39
|
+
subscription.inFlightAttempt !== attempt) {
|
|
40
|
+
return { op: 'noop', result: undefined };
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
op: 'set',
|
|
44
|
+
value: clearRenewal(subscription),
|
|
45
|
+
result: undefined,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async function clearActivationState(lookupKey, challengeId) {
|
|
50
|
+
await store.update(activationKey(lookupKey), (current) => {
|
|
51
|
+
const marker = current;
|
|
52
|
+
if (marker?.challengeId !== challengeId)
|
|
53
|
+
return { op: 'noop', result: undefined };
|
|
54
|
+
return { op: 'delete', result: undefined };
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async function ownsActivation(lookupKey, challengeId) {
|
|
58
|
+
const marker = (await store.get(activationKey(lookupKey)));
|
|
59
|
+
return marker?.challengeId === challengeId;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
async activate({ challengeId, create, isReusable, lookupKey }) {
|
|
63
|
+
const claimed = await store.update(credentialKey(challengeId), (current) => {
|
|
64
|
+
if (current)
|
|
65
|
+
return { op: 'noop', result: false };
|
|
66
|
+
return {
|
|
67
|
+
op: 'set',
|
|
68
|
+
value: { claimedAt: timestamp() },
|
|
69
|
+
result: true,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
if (!claimed)
|
|
73
|
+
return { status: 'replayed' };
|
|
74
|
+
const existing = await getByLookupKey(lookupKey);
|
|
75
|
+
if (existing && isReusable?.(existing)) {
|
|
76
|
+
return { status: 'existing', subscription: existing };
|
|
77
|
+
}
|
|
78
|
+
const started = await store.update(activationKey(lookupKey), (current) => {
|
|
79
|
+
const marker = current;
|
|
80
|
+
if (marker && !isStaleActivation(marker, activationTimeoutMs)) {
|
|
81
|
+
return { op: 'noop', result: { status: 'inFlight' } };
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
op: 'set',
|
|
85
|
+
value: {
|
|
86
|
+
challengeId,
|
|
87
|
+
startedAt: timestamp(),
|
|
88
|
+
},
|
|
89
|
+
result: { status: 'started' },
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
if (started.status !== 'started')
|
|
93
|
+
return { status: 'inFlight' };
|
|
94
|
+
const claimedExisting = await getByLookupKey(lookupKey);
|
|
95
|
+
if (claimedExisting && isReusable?.(claimedExisting)) {
|
|
96
|
+
await clearActivationState(lookupKey, challengeId);
|
|
97
|
+
return { status: 'existing', subscription: claimedExisting };
|
|
98
|
+
}
|
|
99
|
+
const result = await create().catch(async (error) => {
|
|
100
|
+
await clearActivationState(lookupKey, challengeId);
|
|
101
|
+
throw error;
|
|
102
|
+
});
|
|
103
|
+
const { subscription } = result;
|
|
104
|
+
const committed = await store.update(activationKey(subscription.lookupKey), (current) => {
|
|
105
|
+
const marker = current;
|
|
106
|
+
if (marker?.challengeId !== challengeId)
|
|
107
|
+
return { op: 'noop', result: false };
|
|
108
|
+
return {
|
|
109
|
+
op: 'set',
|
|
110
|
+
value: {
|
|
111
|
+
...marker,
|
|
112
|
+
committingAt: timestamp(),
|
|
113
|
+
startedAt: timestamp(),
|
|
114
|
+
},
|
|
115
|
+
result: true,
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
if (!committed) {
|
|
119
|
+
await store.put(recordKey(subscription.subscriptionId), {
|
|
120
|
+
...subscription,
|
|
121
|
+
canceledAt: subscription.canceledAt ?? timestamp(),
|
|
122
|
+
});
|
|
123
|
+
return { status: 'claimMismatch' };
|
|
124
|
+
}
|
|
125
|
+
const previous = await getByLookupKey(subscription.lookupKey);
|
|
126
|
+
if (previous && previous.subscriptionId !== subscription.subscriptionId) {
|
|
127
|
+
if (!(await ownsActivation(subscription.lookupKey, challengeId))) {
|
|
128
|
+
return { status: 'claimMismatch' };
|
|
129
|
+
}
|
|
130
|
+
await store.put(recordKey(previous.subscriptionId), {
|
|
131
|
+
...previous,
|
|
132
|
+
canceledAt: previous.canceledAt ?? timestamp(),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (!(await ownsActivation(subscription.lookupKey, challengeId))) {
|
|
136
|
+
return { status: 'claimMismatch' };
|
|
137
|
+
}
|
|
138
|
+
await store.put(recordKey(subscription.subscriptionId), subscription);
|
|
139
|
+
if (!(await ownsActivation(subscription.lookupKey, challengeId))) {
|
|
140
|
+
return { status: 'claimMismatch' };
|
|
141
|
+
}
|
|
142
|
+
await store.put(lookupRecordKey(subscription.lookupKey), subscription.subscriptionId);
|
|
143
|
+
await clearActivationState(subscription.lookupKey, challengeId);
|
|
144
|
+
return { status: 'activated', result };
|
|
145
|
+
},
|
|
146
|
+
async get(subscriptionId) {
|
|
147
|
+
return (await store.get(recordKey(subscriptionId)));
|
|
148
|
+
},
|
|
149
|
+
async getAccessKey(key) {
|
|
150
|
+
return (await store.get(accessKeyKey(key)));
|
|
151
|
+
},
|
|
152
|
+
async getByKey(key) {
|
|
153
|
+
return getByLookupKey(key);
|
|
154
|
+
},
|
|
155
|
+
async getOrCreateAccessKey(key) {
|
|
156
|
+
const existing = (await store.get(accessKeyKey(key)));
|
|
157
|
+
if (existing)
|
|
158
|
+
return existing;
|
|
159
|
+
const privateKey = Secp256k1.randomPrivateKey();
|
|
160
|
+
const account = TempoAccount.fromSecp256k1(privateKey);
|
|
161
|
+
const candidate = {
|
|
162
|
+
accessKeyAddress: account.address.toLowerCase(),
|
|
163
|
+
keyType: account.keyType,
|
|
164
|
+
privateKey,
|
|
165
|
+
};
|
|
166
|
+
return store.update(accessKeyKey(key), (current) => {
|
|
167
|
+
if (current) {
|
|
168
|
+
return { op: 'noop', result: current };
|
|
169
|
+
}
|
|
170
|
+
return { op: 'set', value: candidate, result: candidate };
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
async put(record) {
|
|
174
|
+
await store.put(recordKey(record.subscriptionId), record);
|
|
175
|
+
await store.put(lookupRecordKey(record.lookupKey), record.subscriptionId);
|
|
176
|
+
},
|
|
177
|
+
async renew({ inFlightReference, periodIndex, renew, subscriptionId }) {
|
|
178
|
+
const attempt = createAttemptToken();
|
|
179
|
+
const started = await store.update(recordKey(subscriptionId), (current) => {
|
|
180
|
+
const subscription = current;
|
|
181
|
+
if (!subscription)
|
|
182
|
+
return { op: 'noop', result: { status: 'missing' } };
|
|
183
|
+
if (subscription.lastChargedPeriod >= periodIndex) {
|
|
184
|
+
return {
|
|
185
|
+
op: 'noop',
|
|
186
|
+
result: { status: 'charged', subscription },
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
if (subscription.inFlightPeriod !== undefined &&
|
|
190
|
+
!isStaleRenewal(subscription, renewalTimeoutMs)) {
|
|
191
|
+
return {
|
|
192
|
+
op: 'noop',
|
|
193
|
+
result: { status: 'inFlight', subscription },
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const next = {
|
|
197
|
+
...subscription,
|
|
198
|
+
inFlightAttempt: attempt,
|
|
199
|
+
inFlightPeriod: periodIndex,
|
|
200
|
+
inFlightReference,
|
|
201
|
+
inFlightStartedAt: timestamp(),
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
op: 'set',
|
|
205
|
+
value: next,
|
|
206
|
+
result: { status: 'started', subscription: next },
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
if (started.status !== 'started')
|
|
210
|
+
return started;
|
|
211
|
+
const active = await getByLookupKey(started.subscription.lookupKey);
|
|
212
|
+
if (active?.subscriptionId !== subscriptionId) {
|
|
213
|
+
await clearRenewalState(subscriptionId, periodIndex, attempt);
|
|
214
|
+
return { status: 'superseded', subscription: started.subscription };
|
|
215
|
+
}
|
|
216
|
+
const result = await renew({
|
|
217
|
+
inFlightReference,
|
|
218
|
+
periodIndex,
|
|
219
|
+
subscription: started.subscription,
|
|
220
|
+
}).catch(async (error) => {
|
|
221
|
+
await clearRenewalState(subscriptionId, periodIndex, attempt);
|
|
222
|
+
throw error;
|
|
223
|
+
});
|
|
224
|
+
const activeAfterRenew = await getByLookupKey(result.subscription.lookupKey);
|
|
225
|
+
if (activeAfterRenew?.subscriptionId !== subscriptionId) {
|
|
226
|
+
await clearRenewalState(subscriptionId, periodIndex, attempt);
|
|
227
|
+
return { status: 'superseded', subscription: started.subscription };
|
|
228
|
+
}
|
|
229
|
+
const committed = await store.update(recordKey(subscriptionId), (current) => {
|
|
230
|
+
const existing = current;
|
|
231
|
+
if (!existing ||
|
|
232
|
+
existing.inFlightPeriod !== periodIndex ||
|
|
233
|
+
existing.inFlightAttempt !== attempt) {
|
|
234
|
+
return { op: 'noop', result: false };
|
|
235
|
+
}
|
|
236
|
+
const terminal = {
|
|
237
|
+
...(existing.canceledAt ? { canceledAt: existing.canceledAt } : {}),
|
|
238
|
+
...(existing.revokedAt ? { revokedAt: existing.revokedAt } : {}),
|
|
239
|
+
};
|
|
240
|
+
return {
|
|
241
|
+
op: 'set',
|
|
242
|
+
value: clearRenewal({
|
|
243
|
+
...result.subscription,
|
|
244
|
+
...terminal,
|
|
245
|
+
lastChargedPeriod: periodIndex,
|
|
246
|
+
subscriptionId,
|
|
247
|
+
}),
|
|
248
|
+
result: true,
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
if (!committed)
|
|
252
|
+
return { status: 'claimMismatch' };
|
|
253
|
+
const ownsLookup = await store.update(lookupRecordKey(result.subscription.lookupKey), (current) => {
|
|
254
|
+
if (current !== subscriptionId)
|
|
255
|
+
return { op: 'noop', result: false };
|
|
256
|
+
return { op: 'set', value: subscriptionId, result: true };
|
|
257
|
+
});
|
|
258
|
+
if (!ownsLookup)
|
|
259
|
+
return { status: 'superseded', subscription: started.subscription };
|
|
260
|
+
return { status: 'renewed', result };
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function isStaleActivation(marker, timeoutMs) {
|
|
265
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 0)
|
|
266
|
+
return false;
|
|
267
|
+
if ('committingAt' in marker && marker.committingAt)
|
|
268
|
+
return false;
|
|
269
|
+
const startedAt = new Date(marker.startedAt ?? '').getTime();
|
|
270
|
+
if (!Number.isFinite(startedAt))
|
|
271
|
+
return true;
|
|
272
|
+
return Date.now() - startedAt >= timeoutMs;
|
|
273
|
+
}
|
|
274
|
+
function isStaleRenewal(subscription, timeoutMs) {
|
|
275
|
+
return isStaleActivation({ startedAt: subscription.inFlightStartedAt }, timeoutMs);
|
|
276
|
+
}
|
|
277
|
+
function clearRenewal(subscription) {
|
|
278
|
+
return {
|
|
279
|
+
...subscription,
|
|
280
|
+
inFlightAttempt: undefined,
|
|
281
|
+
inFlightPeriod: undefined,
|
|
282
|
+
inFlightReference: undefined,
|
|
283
|
+
inFlightStartedAt: undefined,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function timestamp() {
|
|
287
|
+
return new Date().toISOString();
|
|
288
|
+
}
|
|
289
|
+
function createAttemptToken() {
|
|
290
|
+
return globalThis.crypto.randomUUID();
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=Store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Store.js","sourceRoot":"","sources":["../../../src/tempo/subscription/Store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
/** Tempo-supported subscription period units. The shared intent also defines `month`, but Tempo cannot represent calendar-month periods exactly. */
|
|
3
|
+
export type SubscriptionPeriodUnit = 'day' | 'week';
|
|
4
|
+
/** Access key information used to authorize recurring Tempo payments. */
|
|
5
|
+
export type SubscriptionAccessKey = {
|
|
6
|
+
accessKeyAddress: Address;
|
|
7
|
+
keyType: 'p256' | 'secp256k1' | 'webAuthn';
|
|
8
|
+
};
|
|
9
|
+
/** Server-owned subscription access key persisted for automatic billing. */
|
|
10
|
+
export type SubscriptionAccessKeyRecord = SubscriptionAccessKey & {
|
|
11
|
+
privateKey: `0x${string}`;
|
|
12
|
+
};
|
|
13
|
+
/** Request-scoped lookup key for the active subscription tied to a route. */
|
|
14
|
+
export type SubscriptionLookup = {
|
|
15
|
+
accessKey?: SubscriptionAccessKey | undefined;
|
|
16
|
+
key: string;
|
|
17
|
+
};
|
|
18
|
+
/** Persisted recurring Tempo subscription state. */
|
|
19
|
+
export type SubscriptionRecord = {
|
|
20
|
+
amount: string;
|
|
21
|
+
billingAnchor: string;
|
|
22
|
+
chainId?: number | undefined;
|
|
23
|
+
currency: Address | string;
|
|
24
|
+
externalId?: string | undefined;
|
|
25
|
+
accessKey?: SubscriptionAccessKey | undefined;
|
|
26
|
+
inFlightPeriod?: number | undefined;
|
|
27
|
+
/** Per-attempt ownership token for the renewal currently in progress. */
|
|
28
|
+
inFlightAttempt?: string | undefined;
|
|
29
|
+
/** Stable idempotency/reconciliation reference for a renewal currently in progress. */
|
|
30
|
+
inFlightReference?: string | undefined;
|
|
31
|
+
inFlightStartedAt?: string | undefined;
|
|
32
|
+
/** Signed key authorization used to activate the access key. */
|
|
33
|
+
keyAuthorization?: `0x${string}` | undefined;
|
|
34
|
+
lastChargedPeriod: number;
|
|
35
|
+
lookupKey: string;
|
|
36
|
+
/** Root account that authorized the stored subscription access key. */
|
|
37
|
+
payer?: {
|
|
38
|
+
address: Address;
|
|
39
|
+
chainId: number;
|
|
40
|
+
} | undefined;
|
|
41
|
+
periodCount: string;
|
|
42
|
+
periodUnit: SubscriptionPeriodUnit;
|
|
43
|
+
recipient: Address | string;
|
|
44
|
+
reference: string;
|
|
45
|
+
subscriptionExpires: string;
|
|
46
|
+
subscriptionId: string;
|
|
47
|
+
timestamp: string;
|
|
48
|
+
canceledAt?: string | undefined;
|
|
49
|
+
revokedAt?: string | undefined;
|
|
50
|
+
};
|
|
51
|
+
/** Credential payload for a Tempo subscription activation. */
|
|
52
|
+
export type SubscriptionCredentialPayload = {
|
|
53
|
+
signature: `0x${string}`;
|
|
54
|
+
type: 'keyAuthorization';
|
|
55
|
+
};
|
|
56
|
+
/** Receipt returned for a Tempo subscription activation or renewal. */
|
|
57
|
+
export type SubscriptionReceipt = {
|
|
58
|
+
method: 'tempo';
|
|
59
|
+
reference: string;
|
|
60
|
+
status: 'success';
|
|
61
|
+
subscriptionId: string;
|
|
62
|
+
timestamp: string;
|
|
63
|
+
externalId?: string | undefined;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=Types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/Types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,oJAAoJ;AACpJ,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,MAAM,CAAA;AAEnD,yEAAyE;AACzE,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,OAAO,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;CAC3C,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,GAAG;IAChE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC7C,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,oDAAoD;AACpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC7C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,KAAK,MAAM,EAAE,GAAG,SAAS,CAAA;IAC5C,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,sBAAsB,CAAA;IAClC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B,CAAA;AAED,8DAA8D;AAC9D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;IACxB,IAAI,EAAE,kBAAkB,CAAA;CACzB,CAAA;AAED,uEAAuE;AACvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAChC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../src/tempo/subscription/Types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createSubscriptionReceipt, fromRecord } from './Receipt.js';
|
|
2
|
+
export { getSubscriptionRpcAllowedCalls, getSubscriptionScopes, signSubscriptionKeyAuthorization, toSubscriptionExpiryDate, toSubscriptionExpirySeconds, toSubscriptionPeriodSeconds, transferSelector, transferWithMemoSelector, verifySubscriptionKeyAuthorization, } from './KeyAuthorization.js';
|
|
3
|
+
export { fromStore } from './Store.js';
|
|
4
|
+
export type { ActivateResult, RenewResult, SubscriptionStore } from './Store.js';
|
|
5
|
+
export type { SubscriptionAccessKey, SubscriptionAccessKeyRecord, SubscriptionCredentialPayload, SubscriptionLookup, SubscriptionPeriodUnit, SubscriptionRecord, SubscriptionReceipt, } from './Types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,gCAAgC,EAChC,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,EACxB,kCAAkC,GACnC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAChF,YAAY,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,6BAA6B,EAC7B,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createSubscriptionReceipt, fromRecord } from './Receipt.js';
|
|
2
|
+
export { getSubscriptionRpcAllowedCalls, getSubscriptionScopes, signSubscriptionKeyAuthorization, toSubscriptionExpiryDate, toSubscriptionExpirySeconds, toSubscriptionPeriodSeconds, transferSelector, transferWithMemoSelector, verifySubscriptionKeyAuthorization, } from './KeyAuthorization.js';
|
|
3
|
+
export { fromStore } from './Store.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tempo/subscription/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,gCAAgC,EAChC,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,wBAAwB,EACxB,kCAAkC,GACnC,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/zod.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { type ZodMiniType, z } from 'zod/mini';
|
|
2
2
|
export * from 'zod/mini';
|
|
3
|
+
export type DatetimeInput = string | Date;
|
|
3
4
|
/** Numeric string amount (e.g., "1", "1.5", "1000000"). */
|
|
4
5
|
export declare function amount(): z.ZodMiniString<string>;
|
|
5
6
|
/** ISO 8601 datetime string (e.g., "2025-01-06T12:00:00Z"). */
|
|
6
7
|
export declare function datetime(): z.ZodMiniString<string>;
|
|
8
|
+
/** ISO 8601 datetime string or Date object, transformed to a Date. */
|
|
9
|
+
export declare function datetimeInput(message?: string): z.ZodMiniPipe<z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniCustom<Date, Date>]>, z.ZodMiniTransform<Date, DatetimeInput>>;
|
|
10
|
+
/** Converts an ISO 8601 datetime string or Date object to a Date. */
|
|
11
|
+
export declare function toDate(value: DatetimeInput): Date;
|
|
12
|
+
/** Serializes an ISO 8601 datetime string or Date object for wire output. */
|
|
13
|
+
export declare function toDatetimeString(value: DatetimeInput): string;
|
|
7
14
|
/** Hex-encoded address string (0x-prefixed, 40 hex chars). */
|
|
8
15
|
export declare function address(): z.ZodMiniString<string>;
|
|
9
16
|
/** Hex-encoded hash string (0x-prefixed, 64 hex chars). */
|
package/dist/zod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,WAAW,EAAE,CAAC,EAAE,MAAM,UAAU,CAAA;AAEpE,cAAc,UAAU,CAAA;AAExB,2DAA2D;AAC3D,wBAAgB,MAAM,4BAErB;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,4BASvB;AAED,8DAA8D;AAC9D,wBAAgB,OAAO,4BAEtB;AAED,2DAA2D;AAC3D,wBAAgB,IAAI,4BAEnB;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,4BAErB;AAED,kDAAkD;AAClD,wBAAgB,SAAS,4BAExB;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,MAAM,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAItF"}
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,WAAW,EAAE,CAAC,EAAE,MAAM,UAAU,CAAA;AAEpE,cAAc,UAAU,CAAA;AAExB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,CAAA;AAEzC,2DAA2D;AAC3D,wBAAgB,MAAM,4BAErB;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,4BASvB;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,OAAO,SAA8B,2IAOlE;AAED,qEAAqE;AACrE,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEjD;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAI7D;AAED,8DAA8D;AAC9D,wBAAgB,OAAO,4BAEtB;AAED,2DAA2D;AAC3D,wBAAgB,IAAI,4BAEnB;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,4BAErB;AAED,kDAAkD;AAClD,wBAAgB,SAAS,4BAExB;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,MAAM,SAAS,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAItF"}
|
package/dist/zod.js
CHANGED
|
@@ -10,6 +10,24 @@ export function datetime() {
|
|
|
10
10
|
.string()
|
|
11
11
|
.check(z.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/, 'Invalid ISO 8601 datetime'));
|
|
12
12
|
}
|
|
13
|
+
/** ISO 8601 datetime string or Date object, transformed to a Date. */
|
|
14
|
+
export function datetimeInput(message = 'Invalid ISO 8601 datetime') {
|
|
15
|
+
return z
|
|
16
|
+
.pipe(z.union([datetime(), z.custom((value) => value instanceof Date)]), z.transform(toDate))
|
|
17
|
+
.check(z.refine((value) => Number.isFinite(value.getTime()), message));
|
|
18
|
+
}
|
|
19
|
+
/** Converts an ISO 8601 datetime string or Date object to a Date. */
|
|
20
|
+
export function toDate(value) {
|
|
21
|
+
return value instanceof Date ? value : new Date(value);
|
|
22
|
+
}
|
|
23
|
+
/** Serializes an ISO 8601 datetime string or Date object for wire output. */
|
|
24
|
+
export function toDatetimeString(value) {
|
|
25
|
+
if (!(value instanceof Date))
|
|
26
|
+
return value;
|
|
27
|
+
if (!Number.isFinite(value.getTime()))
|
|
28
|
+
return 'Invalid Date';
|
|
29
|
+
return value.toISOString();
|
|
30
|
+
}
|
|
13
31
|
/** Hex-encoded address string (0x-prefixed, 40 hex chars). */
|
|
14
32
|
export function address() {
|
|
15
33
|
return z.string().check(z.regex(/^0x[0-9a-fA-F]{40}$/, 'Invalid address'));
|
package/dist/zod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,CAAC,EAAE,MAAM,UAAU,CAAA;AAEpE,cAAc,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,CAAC,EAAE,MAAM,UAAU,CAAA;AAEpE,cAAc,UAAU,CAAA;AAIxB,2DAA2D;AAC3D,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAA;AACrE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,KAAK,CACL,sEAAsE,EACtE,2BAA2B,CAC5B,CACF,CAAA;AACL,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,2BAA2B;IACjE,OAAO,CAAC;SACL,IAAI,CACH,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,CAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,EACvE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CACpB;SACA,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AAC1E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,MAAM,CAAC,KAAoB;IACzC,OAAO,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;AACxD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACnD,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,cAAc,CAAA;IAC5D,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;AAC5B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAA;AACzE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAAC,CAAA;AACnF,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,CAAA;AAC3E,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAA6B,MAAc;IACvE,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU;QACrC,OAAQ,MAAqC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAwB,CAAA;IACjF,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mppx",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.20",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"files": [
|
|
@@ -124,8 +124,8 @@
|
|
|
124
124
|
},
|
|
125
125
|
"dependencies": {
|
|
126
126
|
"incur": "^0.4.5",
|
|
127
|
-
"ox": "0.14.
|
|
128
|
-
"zod": "^4.3
|
|
127
|
+
"ox": "0.14.20",
|
|
128
|
+
"zod": "^4.4.3"
|
|
129
129
|
},
|
|
130
130
|
"repository": {
|
|
131
131
|
"type": "git",
|
package/src/Challenge.test.ts
CHANGED
|
@@ -53,6 +53,19 @@ describe('from', () => {
|
|
|
53
53
|
`)
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
+
test('behavior: accepts expires as a Date', () => {
|
|
57
|
+
const challenge = Challenge.from({
|
|
58
|
+
id: 'abc123',
|
|
59
|
+
realm: 'api.example.com',
|
|
60
|
+
method: 'tempo',
|
|
61
|
+
intent: 'charge',
|
|
62
|
+
request: { amount: '1000000' },
|
|
63
|
+
expires: new Date('2025-01-06T12:00:00Z'),
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
expect(challenge.expires).toBe('2025-01-06T12:00:00.000Z')
|
|
67
|
+
})
|
|
68
|
+
|
|
56
69
|
// ---------------------------------------------------------------------------
|
|
57
70
|
// HMAC Challenge ID Test Vectors
|
|
58
71
|
//
|
package/src/Challenge.ts
CHANGED
|
@@ -129,7 +129,7 @@ export function from<
|
|
|
129
129
|
secretKey,
|
|
130
130
|
} = parameters
|
|
131
131
|
|
|
132
|
-
const expires = parameters.expires
|
|
132
|
+
const expires = parameters.expires ? z.toDatetimeString(parameters.expires) : undefined
|
|
133
133
|
const opaque =
|
|
134
134
|
parameters.opaque ?? (meta !== undefined ? PaymentRequest.serialize(meta) : undefined)
|
|
135
135
|
const id = secretKey
|
|
@@ -173,7 +173,7 @@ export declare namespace from {
|
|
|
173
173
|
/** Optional digest of the request body. */
|
|
174
174
|
digest?: string | undefined
|
|
175
175
|
/** Optional expiration timestamp (ISO 8601). */
|
|
176
|
-
expires?:
|
|
176
|
+
expires?: z.DatetimeInput | undefined
|
|
177
177
|
/** Intent type (e.g., "charge", "session"). */
|
|
178
178
|
intent: string
|
|
179
179
|
/** Optional server-defined correlation data (serialized as `opaque` on the challenge). Flat string-to-string map; clients MUST NOT modify. */
|
|
@@ -266,7 +266,7 @@ export declare namespace fromMethod {
|
|
|
266
266
|
/** Optional digest of the request body. */
|
|
267
267
|
digest?: string | undefined
|
|
268
268
|
/** Optional expiration timestamp (ISO 8601). */
|
|
269
|
-
expires?:
|
|
269
|
+
expires?: z.DatetimeInput | undefined
|
|
270
270
|
/** Optional server-defined correlation data (serialized as `opaque` on the challenge). Flat string-to-string map; clients MUST NOT modify. */
|
|
271
271
|
meta?: Record<string, string> | undefined
|
|
272
272
|
/** Server realm (e.g., hostname). */
|