@contextvm/sdk 0.12.4 → 0.13.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.
- package/dist/esm/core/constants.d.ts +2 -0
- package/dist/esm/core/constants.d.ts.map +1 -1
- package/dist/esm/core/constants.js +2 -0
- package/dist/esm/core/constants.js.map +1 -1
- package/dist/esm/payments/authorization-store.d.ts +55 -0
- package/dist/esm/payments/authorization-store.d.ts.map +1 -0
- package/dist/esm/payments/authorization-store.js +115 -0
- package/dist/esm/payments/authorization-store.js.map +1 -0
- package/dist/esm/payments/canonical-identity.d.ts +21 -0
- package/dist/esm/payments/canonical-identity.d.ts.map +1 -0
- package/dist/esm/payments/canonical-identity.js +54 -0
- package/dist/esm/payments/canonical-identity.js.map +1 -0
- package/dist/esm/payments/client-payments.d.ts +43 -0
- package/dist/esm/payments/client-payments.d.ts.map +1 -1
- package/dist/esm/payments/client-payments.js +248 -28
- package/dist/esm/payments/client-payments.js.map +1 -1
- package/dist/esm/payments/constants.d.ts +12 -0
- package/dist/esm/payments/constants.d.ts.map +1 -1
- package/dist/esm/payments/constants.js +12 -0
- package/dist/esm/payments/constants.js.map +1 -1
- package/dist/esm/payments/server-explicit-gating.d.ts +13 -0
- package/dist/esm/payments/server-explicit-gating.d.ts.map +1 -0
- package/dist/esm/payments/server-explicit-gating.js +189 -0
- package/dist/esm/payments/server-explicit-gating.js.map +1 -0
- package/dist/esm/payments/server-payments-utils.d.ts +39 -0
- package/dist/esm/payments/server-payments-utils.d.ts.map +1 -0
- package/dist/esm/payments/server-payments-utils.js +117 -0
- package/dist/esm/payments/server-payments-utils.js.map +1 -0
- package/dist/esm/payments/server-payments.d.ts +10 -1
- package/dist/esm/payments/server-payments.d.ts.map +1 -1
- package/dist/esm/payments/server-payments.js +74 -150
- package/dist/esm/payments/server-payments.js.map +1 -1
- package/dist/esm/payments/server-transport-payments.d.ts +6 -0
- package/dist/esm/payments/server-transport-payments.d.ts.map +1 -1
- package/dist/esm/payments/server-transport-payments.js +46 -3
- package/dist/esm/payments/server-transport-payments.js.map +1 -1
- package/dist/esm/payments/types.d.ts +77 -9
- package/dist/esm/payments/types.d.ts.map +1 -1
- package/dist/esm/payments/types.js.map +1 -1
- package/dist/esm/relay/applesauce-relay-pool.d.ts.map +1 -1
- package/dist/esm/relay/applesauce-relay-pool.js +22 -9
- package/dist/esm/relay/applesauce-relay-pool.js.map +1 -1
- package/dist/esm/transport/capability-negotiator.d.ts +17 -2
- package/dist/esm/transport/capability-negotiator.d.ts.map +1 -1
- package/dist/esm/transport/capability-negotiator.js +27 -2
- package/dist/esm/transport/capability-negotiator.js.map +1 -1
- package/dist/esm/transport/middleware.d.ts +8 -0
- package/dist/esm/transport/middleware.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client/event-pipeline.d.ts +14 -0
- package/dist/esm/transport/nostr-client/event-pipeline.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client/event-pipeline.js +90 -61
- package/dist/esm/transport/nostr-client/event-pipeline.js.map +1 -1
- package/dist/esm/transport/nostr-client/inbound-coordinator.d.ts +1 -1
- package/dist/esm/transport/nostr-client/inbound-coordinator.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client/inbound-coordinator.js +16 -1
- package/dist/esm/transport/nostr-client/inbound-coordinator.js.map +1 -1
- package/dist/esm/transport/nostr-client/outbound-sender.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client/outbound-sender.js +2 -2
- package/dist/esm/transport/nostr-client/outbound-sender.js.map +1 -1
- package/dist/esm/transport/nostr-client/server-metadata-store.d.ts +4 -0
- package/dist/esm/transport/nostr-client/server-metadata-store.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client/server-metadata-store.js +7 -0
- package/dist/esm/transport/nostr-client/server-metadata-store.js.map +1 -1
- package/dist/esm/transport/nostr-client-transport.d.ts +9 -0
- package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client-transport.js +19 -3
- package/dist/esm/transport/nostr-client-transport.js.map +1 -1
- package/dist/esm/transport/nostr-server/inbound-coordinator.d.ts +3 -0
- package/dist/esm/transport/nostr-server/inbound-coordinator.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server/inbound-coordinator.js +58 -3
- package/dist/esm/transport/nostr-server/inbound-coordinator.js.map +1 -1
- package/dist/esm/transport/nostr-server/outbound-response-router.d.ts +7 -0
- package/dist/esm/transport/nostr-server/outbound-response-router.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server/outbound-response-router.js +43 -1
- package/dist/esm/transport/nostr-server/outbound-response-router.js.map +1 -1
- package/dist/esm/transport/nostr-server/session-store.d.ts +7 -0
- package/dist/esm/transport/nostr-server/session-store.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server/session-store.js.map +1 -1
- package/dist/esm/transport/nostr-server-transport.d.ts +16 -1
- package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server-transport.js +18 -0
- package/dist/esm/transport/nostr-server-transport.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { isJsonRpcRequest } from './types.js';
|
|
2
|
+
import { computeCanonicalInvocationIdentity } from './canonical-identity.js';
|
|
3
|
+
import { buildProcessorsByPmi, matchPricedCapability, resolveAndInitiatePayment, } from './server-payments-utils.js';
|
|
4
|
+
import { createLogger } from '../core/utils/logger.js';
|
|
5
|
+
import { withTimeout } from '../core/utils/utils.js';
|
|
6
|
+
import { PAYMENT_PENDING_ERROR_CODE, PAYMENT_REQUIRED_ERROR_CODE, } from './constants.js';
|
|
7
|
+
export function createExplicitGatingMiddleware(params) {
|
|
8
|
+
var _a;
|
|
9
|
+
const { options, authorizationStore, sendResponse } = params;
|
|
10
|
+
const logger = createLogger('server-explicit-gating');
|
|
11
|
+
const processorsByPmi = (_a = params.processorsByPmi) !== null && _a !== void 0 ? _a : buildProcessorsByPmi(options.processors, logger);
|
|
12
|
+
return async (message, ctx, forward) => {
|
|
13
|
+
var _a;
|
|
14
|
+
// Only gate requests.
|
|
15
|
+
if (!isJsonRpcRequest(message)) {
|
|
16
|
+
await forward(message);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (ctx.paymentInteraction !== 'explicit_gating') {
|
|
20
|
+
await forward(message);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const priced = matchPricedCapability(message, options.pricedCapabilities);
|
|
24
|
+
if (!priced) {
|
|
25
|
+
await forward(message);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const requestEventId = String(message.id);
|
|
29
|
+
const identity = computeCanonicalInvocationIdentity(ctx.clientPubkey, message.method, message.params);
|
|
30
|
+
// 1. Try to claim an existing authorization
|
|
31
|
+
if (authorizationStore.claim(identity)) {
|
|
32
|
+
logger.debug('authorization claimed, forwarding request', {
|
|
33
|
+
requestEventId,
|
|
34
|
+
method: message.method,
|
|
35
|
+
});
|
|
36
|
+
await forward(message);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const paymentTtlMs = (_a = options.paymentTtlMs) !== null && _a !== void 0 ? _a : 300000;
|
|
40
|
+
// 2. Try to set pending state atomically
|
|
41
|
+
// We use a safe default TTL here, but will override it below if the payment option has a specific TTL
|
|
42
|
+
if (!authorizationStore.trySetPending(identity, paymentTtlMs)) {
|
|
43
|
+
logger.debug('payment already pending, returning -32043', {
|
|
44
|
+
requestEventId,
|
|
45
|
+
});
|
|
46
|
+
const errorResponse = {
|
|
47
|
+
jsonrpc: '2.0',
|
|
48
|
+
id: message.id,
|
|
49
|
+
error: {
|
|
50
|
+
code: PAYMENT_PENDING_ERROR_CODE,
|
|
51
|
+
message: 'Payment Pending',
|
|
52
|
+
data: {
|
|
53
|
+
instructions: 'A payment is already pending for this invocation. Retry the same request later with exactly the same method and params.',
|
|
54
|
+
// Suggest a short polling interval (e.g. 2 seconds) rather than the full TTL
|
|
55
|
+
retry_after: Math.min(2, Math.max(1, Math.ceil(authorizationStore.getPendingRemainingMs(identity) / 1000))),
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
await sendResponse(ctx.clientPubkey, errorResponse, requestEventId);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// 3. Resolve price and initiate new payment
|
|
63
|
+
try {
|
|
64
|
+
const initResult = await resolveAndInitiatePayment({
|
|
65
|
+
message,
|
|
66
|
+
priced,
|
|
67
|
+
requestEventId,
|
|
68
|
+
clientPubkey: ctx.clientPubkey,
|
|
69
|
+
clientPmis: ctx.clientPmis,
|
|
70
|
+
options,
|
|
71
|
+
processorsByPmi,
|
|
72
|
+
});
|
|
73
|
+
if (initResult.kind === 'rejected') {
|
|
74
|
+
logger.info('payment rejected', {
|
|
75
|
+
requestEventId,
|
|
76
|
+
pmi: initResult.pmi,
|
|
77
|
+
amount: priced.amount,
|
|
78
|
+
reason: initResult.message,
|
|
79
|
+
});
|
|
80
|
+
authorizationStore.clearPending(identity);
|
|
81
|
+
// Spec: When a capability is rejected by policy, return a standard error.
|
|
82
|
+
// We'll use -32000 (Internal error or application-defined error) since CEP-8 doesn't specify a special rejection code.
|
|
83
|
+
const errorResponse = {
|
|
84
|
+
jsonrpc: '2.0',
|
|
85
|
+
id: message.id,
|
|
86
|
+
error: {
|
|
87
|
+
code: -32000,
|
|
88
|
+
message: initResult.message || 'Payment rejected by policy',
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
await sendResponse(ctx.clientPubkey, errorResponse, requestEventId);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (initResult.kind === 'waived') {
|
|
95
|
+
logger.debug('payment waived, forwarding priced request', {
|
|
96
|
+
requestEventId,
|
|
97
|
+
method: message.method,
|
|
98
|
+
});
|
|
99
|
+
authorizationStore.clearPending(identity);
|
|
100
|
+
await forward(message);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const { paymentRequired, mergedMeta, processor, verifyTimeoutMs } = initResult;
|
|
104
|
+
// Use the strict verification timeout bound for polling
|
|
105
|
+
const pollingTimeoutMs = Math.min(verifyTimeoutMs, paymentTtlMs);
|
|
106
|
+
// Note: use the original payment request's TTL as the limit for the grant, not the verify timeout.
|
|
107
|
+
// verifyTimeoutMs includes standard bounds, but for grants we want to honor the
|
|
108
|
+
// payment option's TTL explicitly if it is smaller, or the fallback paymentTtlMs.
|
|
109
|
+
const grantTtlMs = paymentRequired.ttl !== undefined
|
|
110
|
+
? paymentRequired.ttl * 1000
|
|
111
|
+
: paymentTtlMs;
|
|
112
|
+
// Update pending with the precise TTL
|
|
113
|
+
authorizationStore.updatePendingTtl(identity, grantTtlMs);
|
|
114
|
+
const errorResponse = {
|
|
115
|
+
jsonrpc: '2.0',
|
|
116
|
+
id: message.id,
|
|
117
|
+
error: {
|
|
118
|
+
code: PAYMENT_REQUIRED_ERROR_CODE,
|
|
119
|
+
message: 'Payment Required',
|
|
120
|
+
data: {
|
|
121
|
+
instructions: 'Payment is required to process this request. Pay one of the offered options, then retry the same request with exactly the same method and params.',
|
|
122
|
+
payment_options: [
|
|
123
|
+
{
|
|
124
|
+
amount: paymentRequired.amount,
|
|
125
|
+
pmi: paymentRequired.pmi,
|
|
126
|
+
pay_req: paymentRequired.pay_req,
|
|
127
|
+
description: paymentRequired.description,
|
|
128
|
+
ttl: paymentRequired.ttl,
|
|
129
|
+
_meta: mergedMeta,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
logger.info('payment required error sent', {
|
|
136
|
+
requestEventId,
|
|
137
|
+
pmi: paymentRequired.pmi,
|
|
138
|
+
amount: paymentRequired.amount,
|
|
139
|
+
ttl: paymentRequired.ttl,
|
|
140
|
+
});
|
|
141
|
+
await sendResponse(ctx.clientPubkey, errorResponse, requestEventId);
|
|
142
|
+
// Start async verification
|
|
143
|
+
// Do not await this, we must let the middleware chain return the error response.
|
|
144
|
+
(async () => {
|
|
145
|
+
const controller = new AbortController();
|
|
146
|
+
try {
|
|
147
|
+
logger.debug('verifying explicit payment', {
|
|
148
|
+
requestEventId,
|
|
149
|
+
pmi: paymentRequired.pmi,
|
|
150
|
+
timeoutMs: pollingTimeoutMs,
|
|
151
|
+
});
|
|
152
|
+
await withTimeout(processor.verifyPayment({
|
|
153
|
+
pay_req: paymentRequired.pay_req,
|
|
154
|
+
requestEventId,
|
|
155
|
+
clientPubkey: ctx.clientPubkey,
|
|
156
|
+
abortSignal: controller.signal,
|
|
157
|
+
}), pollingTimeoutMs, 'verifyPayment timed out');
|
|
158
|
+
logger.info('explicit payment accepted, granting authorization', {
|
|
159
|
+
requestEventId,
|
|
160
|
+
pmi: paymentRequired.pmi,
|
|
161
|
+
amount: paymentRequired.amount,
|
|
162
|
+
});
|
|
163
|
+
authorizationStore.grant(identity, grantTtlMs);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
logger.info('explicit payment verification failed or timed out', {
|
|
167
|
+
requestEventId,
|
|
168
|
+
error: err instanceof Error ? err.message : String(err),
|
|
169
|
+
});
|
|
170
|
+
authorizationStore.clearPending(identity);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
controller.abort();
|
|
174
|
+
}
|
|
175
|
+
})().catch((err) => {
|
|
176
|
+
logger.error('unhandled exception in async payment verification', {
|
|
177
|
+
requestEventId,
|
|
178
|
+
pmi: paymentRequired.pmi,
|
|
179
|
+
error: err instanceof Error ? err.message : String(err),
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
authorizationStore.clearPending(identity);
|
|
185
|
+
throw err;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=server-explicit-gating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-explicit-gating.js","sourceRoot":"","sources":["../../../src/payments/server-explicit-gating.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAcxB,MAAM,UAAU,8BAA8B,CAC5C,MAAsC;;IAEtC,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;IACtD,MAAM,eAAe,GACnB,MAAA,MAAM,CAAC,eAAe,mCAAI,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;;QACrC,sBAAsB;QACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,kBAAkB,KAAK,iBAAiB,EAAE,CAAC;YACjD,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,kCAAkC,CACjD,GAAG,CAAC,YAAY,EAChB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;QAEF,4CAA4C;QAC5C,IAAI,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;gBACxD,cAAc;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,MAAA,OAAO,CAAC,YAAY,mCAAI,MAAO,CAAC;QAErD,yCAAyC;QACzC,sGAAsG;QACtG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;gBACxD,cAAc;aACf,CAAC,CAAC;YACH,MAAM,aAAa,GAAyB;gBAC1C,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,iBAAiB;oBAC1B,IAAI,EAAE;wBACJ,YAAY,EACV,yHAAyH;wBAC3H,6EAA6E;wBAC7E,WAAW,EAAE,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,GAAG,CACN,CAAC,EACD,IAAI,CAAC,IAAI,CACP,kBAAkB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAC1D,CACF,CACF;qBACF;iBACF;aACF,CAAC;YACF,MAAM,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC;gBACjD,OAAO;gBACP,MAAM;gBACN,cAAc;gBACd,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,OAAO;gBACP,eAAe;aAChB,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAC9B,cAAc;oBACd,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,UAAU,CAAC,OAAO;iBAC3B,CAAC,CAAC;gBAEH,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAE1C,0EAA0E;gBAC1E,uHAAuH;gBACvH,MAAM,aAAa,GAAyB;oBAC1C,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,4BAA4B;qBAC5D;iBACF,CAAC;gBACF,MAAM,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YAED,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;oBACxD,cAAc;oBACd,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;gBAEH,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC1C,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,GAC/D,UAAU,CAAC;YAEb,wDAAwD;YACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YAEjE,mGAAmG;YACnG,gFAAgF;YAChF,kFAAkF;YAClF,MAAM,UAAU,GACd,eAAe,CAAC,GAAG,KAAK,SAAS;gBAC/B,CAAC,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI;gBAC5B,CAAC,CAAC,YAAY,CAAC;YAEnB,sCAAsC;YACtC,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE1D,MAAM,aAAa,GAAyB;gBAC1C,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,2BAA2B;oBACjC,OAAO,EAAE,kBAAkB;oBAC3B,IAAI,EAAE;wBACJ,YAAY,EACV,mJAAmJ;wBACrJ,eAAe,EAAE;4BACf;gCACE,MAAM,EAAE,eAAe,CAAC,MAAM;gCAC9B,GAAG,EAAE,eAAe,CAAC,GAAG;gCACxB,OAAO,EAAE,eAAe,CAAC,OAAO;gCAChC,WAAW,EAAE,eAAe,CAAC,WAAW;gCACxC,GAAG,EAAE,eAAe,CAAC,GAAG;gCACxB,KAAK,EAAE,UAAU;6BAClB;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBACzC,cAAc;gBACd,GAAG,EAAE,eAAe,CAAC,GAAG;gBACxB,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,GAAG,EAAE,eAAe,CAAC,GAAG;aACzB,CAAC,CAAC;YAEH,MAAM,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;YAEpE,2BAA2B;YAC3B,iFAAiF;YACjF,CAAC,KAAK,IAAI,EAAE;gBACV,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;wBACzC,cAAc;wBACd,GAAG,EAAE,eAAe,CAAC,GAAG;wBACxB,SAAS,EAAE,gBAAgB;qBAC5B,CAAC,CAAC;oBAEH,MAAM,WAAW,CACf,SAAS,CAAC,aAAa,CAAC;wBACtB,OAAO,EAAE,eAAe,CAAC,OAAO;wBAChC,cAAc;wBACd,YAAY,EAAE,GAAG,CAAC,YAAY;wBAC9B,WAAW,EAAE,UAAU,CAAC,MAAM;qBAC/B,CAAC,EACF,gBAAgB,EAChB,yBAAyB,CAC1B,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;wBAC/D,cAAc;wBACd,GAAG,EAAE,eAAe,CAAC,GAAG;wBACxB,MAAM,EAAE,eAAe,CAAC,MAAM;qBAC/B,CAAC,CAAC;oBAEH,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACjD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;wBAC/D,cAAc;wBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;qBACxD,CAAC,CAAC;oBACH,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC5C,CAAC;wBAAS,CAAC;oBACT,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjB,MAAM,CAAC,KAAK,CAAC,mDAAmD,EAAE;oBAChE,cAAc;oBACd,GAAG,EAAE,eAAe,CAAC,GAAG;oBACxB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { JSONRPCRequest } from '@contextvm/mcp-sdk/types.js';
|
|
2
|
+
import { type Logger } from '../core/utils/logger.js';
|
|
3
|
+
import type { PricedCapability, ResolvePriceRejection, ResolvePriceResult, PaymentProcessor, PaymentRequired } from './types.js';
|
|
4
|
+
/** Builds the PMI → processor map, warning once on duplicate PMIs. */
|
|
5
|
+
export declare function buildProcessorsByPmi(processors: readonly PaymentProcessor[], logger: Logger): Map<string, PaymentProcessor>;
|
|
6
|
+
export declare function matchPricedCapability(message: JSONRPCRequest, priced: readonly PricedCapability[]): PricedCapability | undefined;
|
|
7
|
+
export type InitiationResult = {
|
|
8
|
+
kind: 'rejected';
|
|
9
|
+
pmi: string;
|
|
10
|
+
amount: number;
|
|
11
|
+
message?: string;
|
|
12
|
+
quote: ResolvePriceRejection;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'waived';
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'payment_required';
|
|
17
|
+
processor: PaymentProcessor;
|
|
18
|
+
paymentRequired: PaymentRequired;
|
|
19
|
+
mergedMeta: Record<string, unknown> | undefined;
|
|
20
|
+
verifyTimeoutMs: number;
|
|
21
|
+
};
|
|
22
|
+
export declare function resolveAndInitiatePayment(params: {
|
|
23
|
+
message: JSONRPCRequest;
|
|
24
|
+
priced: PricedCapability;
|
|
25
|
+
requestEventId: string;
|
|
26
|
+
clientPubkey: string;
|
|
27
|
+
clientPmis: readonly string[] | undefined;
|
|
28
|
+
options: {
|
|
29
|
+
processors: readonly PaymentProcessor[];
|
|
30
|
+
resolvePrice?: (params: {
|
|
31
|
+
capability: PricedCapability;
|
|
32
|
+
request: JSONRPCRequest;
|
|
33
|
+
clientPubkey: string;
|
|
34
|
+
requestEventId: string;
|
|
35
|
+
}) => Promise<ResolvePriceResult>;
|
|
36
|
+
};
|
|
37
|
+
processorsByPmi: Map<string, PaymentProcessor>;
|
|
38
|
+
}): Promise<InitiationResult>;
|
|
39
|
+
//# sourceMappingURL=server-payments-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-payments-utils.d.ts","sourceRoot":"","sources":["../../../src/payments/server-payments-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EAErB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,sEAAsE;AACtE,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,SAAS,gBAAgB,EAAE,EACvC,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAW/B;AAiBD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAClC,gBAAgB,GAAG,SAAS,CAQ9B;AAsDD,MAAM,MAAM,gBAAgB,GACxB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,qBAAqB,CAAC;CAC9B,GACD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAChD,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE;QACP,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;QACxC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE;YACtB,UAAU,EAAE,gBAAgB,CAAC;YAC7B,OAAO,EAAE,cAAc,CAAC;YACxB,YAAY,EAAE,MAAM,CAAC;YACrB,cAAc,EAAE,MAAM,CAAC;SACxB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;KACnC,CAAC;IACF,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAChD,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyD5B"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/** Builds the PMI → processor map, warning once on duplicate PMIs. */
|
|
2
|
+
export function buildProcessorsByPmi(processors, logger) {
|
|
3
|
+
const seenProcessorPmis = new Set();
|
|
4
|
+
for (const p of processors) {
|
|
5
|
+
if (seenProcessorPmis.has(p.pmi)) {
|
|
6
|
+
logger.warn('duplicate PMI processor registered, last one wins', {
|
|
7
|
+
pmi: p.pmi,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
seenProcessorPmis.add(p.pmi);
|
|
11
|
+
}
|
|
12
|
+
return new Map(processors.map((p) => [p.pmi, p]));
|
|
13
|
+
}
|
|
14
|
+
function getVerificationTimeoutMs(params) {
|
|
15
|
+
// CEP-8 TTL is in seconds. If TTL is absent, default is 5 minutes.
|
|
16
|
+
const ttlSeconds = params.ttlSeconds;
|
|
17
|
+
if (ttlSeconds === undefined) {
|
|
18
|
+
return 5 * 60 * 1000;
|
|
19
|
+
}
|
|
20
|
+
if (!Number.isFinite(ttlSeconds) || ttlSeconds <= 0) {
|
|
21
|
+
return 5 * 60 * 1000;
|
|
22
|
+
}
|
|
23
|
+
const ms = ttlSeconds * 1000;
|
|
24
|
+
return Number.isFinite(ms) ? Math.floor(ms) : 5 * 60 * 1000;
|
|
25
|
+
}
|
|
26
|
+
export function matchPricedCapability(message, priced) {
|
|
27
|
+
const capabilityName = getCapabilityNameForPricing(message);
|
|
28
|
+
return priced.find((p) => {
|
|
29
|
+
if (p.method !== message.method)
|
|
30
|
+
return false;
|
|
31
|
+
if (p.name === undefined)
|
|
32
|
+
return true;
|
|
33
|
+
return p.name === capabilityName;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function getCapabilityNameForPricing(message) {
|
|
37
|
+
const params = message.params;
|
|
38
|
+
switch (message.method) {
|
|
39
|
+
case 'tools/call':
|
|
40
|
+
case 'prompts/get': {
|
|
41
|
+
const name = params === null || params === void 0 ? void 0 : params.name;
|
|
42
|
+
return typeof name === 'string' ? name : undefined;
|
|
43
|
+
}
|
|
44
|
+
case 'resources/read': {
|
|
45
|
+
const uri = params === null || params === void 0 ? void 0 : params.uri;
|
|
46
|
+
return typeof uri === 'string' ? uri : undefined;
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function isResolvePriceRejection(quote) {
|
|
53
|
+
return 'reject' in quote && quote.reject;
|
|
54
|
+
}
|
|
55
|
+
function isResolvePriceWaiver(quote) {
|
|
56
|
+
return 'waive' in quote && quote.waive;
|
|
57
|
+
}
|
|
58
|
+
function resolvePaymentProcessor(clientPmis, processorsByPmi, processors) {
|
|
59
|
+
const chosenPmi = clientPmis
|
|
60
|
+
? clientPmis.find((pmi) => processorsByPmi.has(pmi))
|
|
61
|
+
: undefined;
|
|
62
|
+
const chosenProcessor = chosenPmi
|
|
63
|
+
? processorsByPmi.get(chosenPmi)
|
|
64
|
+
: processors[0];
|
|
65
|
+
if (!chosenProcessor) {
|
|
66
|
+
throw new Error('No payment processors configured');
|
|
67
|
+
}
|
|
68
|
+
return chosenProcessor;
|
|
69
|
+
}
|
|
70
|
+
export async function resolveAndInitiatePayment(params) {
|
|
71
|
+
var _a, _b;
|
|
72
|
+
const processor = resolvePaymentProcessor(params.clientPmis, params.processorsByPmi, params.options.processors);
|
|
73
|
+
const quote = params.options.resolvePrice
|
|
74
|
+
? await params.options.resolvePrice({
|
|
75
|
+
capability: params.priced,
|
|
76
|
+
request: params.message,
|
|
77
|
+
clientPubkey: params.clientPubkey,
|
|
78
|
+
requestEventId: params.requestEventId,
|
|
79
|
+
})
|
|
80
|
+
: { amount: params.priced.amount, description: params.priced.description };
|
|
81
|
+
if (isResolvePriceRejection(quote)) {
|
|
82
|
+
return {
|
|
83
|
+
kind: 'rejected',
|
|
84
|
+
pmi: processor.pmi,
|
|
85
|
+
amount: params.priced.amount,
|
|
86
|
+
message: quote.message,
|
|
87
|
+
quote,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (isResolvePriceWaiver(quote)) {
|
|
91
|
+
return { kind: 'waived' };
|
|
92
|
+
}
|
|
93
|
+
const resolvedQuote = quote;
|
|
94
|
+
const paymentRequired = await processor.createPaymentRequired({
|
|
95
|
+
amount: resolvedQuote.amount,
|
|
96
|
+
description: resolvedQuote.description,
|
|
97
|
+
requestEventId: params.requestEventId,
|
|
98
|
+
clientPubkey: params.clientPubkey,
|
|
99
|
+
});
|
|
100
|
+
const mergedMeta = resolvedQuote.meta === undefined && paymentRequired._meta === undefined
|
|
101
|
+
? undefined
|
|
102
|
+
: {
|
|
103
|
+
...((_a = paymentRequired._meta) !== null && _a !== void 0 ? _a : {}),
|
|
104
|
+
...((_b = resolvedQuote.meta) !== null && _b !== void 0 ? _b : {}),
|
|
105
|
+
};
|
|
106
|
+
const verifyTimeoutMs = getVerificationTimeoutMs({
|
|
107
|
+
ttlSeconds: paymentRequired.ttl,
|
|
108
|
+
});
|
|
109
|
+
return {
|
|
110
|
+
kind: 'payment_required',
|
|
111
|
+
processor,
|
|
112
|
+
paymentRequired,
|
|
113
|
+
mergedMeta,
|
|
114
|
+
verifyTimeoutMs,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=server-payments-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-payments-utils.js","sourceRoot":"","sources":["../../../src/payments/server-payments-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CorrelatedNotificationSender, PaymentProcessor, PricedCapability, ResolvePriceFn, ServerMiddlewareFn } from './types.js';
|
|
1
|
+
import type { CorrelatedNotificationSender, PaymentInteractionPolicy, PaymentProcessor, PricedCapability, ResolvePriceFn, ServerMiddlewareFn } from './types.js';
|
|
2
2
|
export interface ServerPaymentsOptions {
|
|
3
3
|
processors: readonly PaymentProcessor[];
|
|
4
4
|
pricedCapabilities: readonly PricedCapability[];
|
|
@@ -21,6 +21,13 @@ export interface ServerPaymentsOptions {
|
|
|
21
21
|
* @default 1000
|
|
22
22
|
*/
|
|
23
23
|
maxPendingPayments?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Server-side policy for which payment interaction lifecycles this server
|
|
26
|
+
* accepts. `optional` mirrors the client's requested mode (the default);
|
|
27
|
+
* `transparent` makes the server transparent-only.
|
|
28
|
+
* @default 'optional'
|
|
29
|
+
*/
|
|
30
|
+
paymentInteraction?: PaymentInteractionPolicy;
|
|
24
31
|
}
|
|
25
32
|
/**
|
|
26
33
|
* Creates a server-side middleware that gates priced requests until payment is verified.
|
|
@@ -28,5 +35,7 @@ export interface ServerPaymentsOptions {
|
|
|
28
35
|
export declare function createServerPaymentsMiddleware(params: {
|
|
29
36
|
sender: CorrelatedNotificationSender;
|
|
30
37
|
options: ServerPaymentsOptions;
|
|
38
|
+
/** Pre-built PMI → processor map. Built locally when omitted (standalone use). */
|
|
39
|
+
processorsByPmi?: Map<string, PaymentProcessor>;
|
|
31
40
|
}): ServerMiddlewareFn;
|
|
32
41
|
//# sourceMappingURL=server-payments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-payments.d.ts","sourceRoot":"","sources":["../../../src/payments/server-payments.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"server-payments.d.ts","sourceRoot":"","sources":["../../../src/payments/server-payments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,4BAA4B,EAE5B,wBAAwB,EACxB,gBAAgB,EAGhB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACxC,kBAAkB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAEhD,6EAA6E;IAC7E,YAAY,CAAC,EAAE,cAAc,CAAC;IAC9B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;CAC/C;AA+DD;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,MAAM,EAAE,4BAA4B,CAAC;IACrC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,kFAAkF;IAClF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACjD,GAAG,kBAAkB,CA8LrB"}
|