paygate-mcp 0.9.0 → 1.0.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/README.md +110 -5
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -1
- package/dist/gate.d.ts +4 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +30 -6
- package/dist/gate.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +177 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +380 -0
- package/dist/oauth.js.map +1 -0
- package/dist/quota.d.ts +37 -0
- package/dist/quota.d.ts.map +1 -0
- package/dist/quota.js +107 -0
- package/dist/quota.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +401 -2
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +7 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +42 -0
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -37,6 +37,9 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
37
37
|
- **Per-Tool Rate Limits** — Independent rate limits per tool, not just global
|
|
38
38
|
- **Key Expiry (TTL)** — Auto-expire API keys after a set time
|
|
39
39
|
- **Spending Limits** — Cap total spend per API key to prevent runaway costs
|
|
40
|
+
- **Usage Quotas** — Daily/monthly call and credit limits per key (with UTC auto-reset)
|
|
41
|
+
- **Dynamic Pricing** — Charge extra credits based on input size (`creditsPerKbInput`)
|
|
42
|
+
- **OAuth 2.1** — Full authorization server with PKCE, client registration, Bearer tokens
|
|
40
43
|
- **Refund on Failure** — Automatically refund credits when downstream tool calls fail
|
|
41
44
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
42
45
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -244,19 +247,26 @@ A real-time admin UI for managing keys, viewing usage, and monitoring tool calls
|
|
|
244
247
|
|
|
245
248
|
| Endpoint | Method | Auth | Description |
|
|
246
249
|
|----------|--------|------|-------------|
|
|
247
|
-
| `/mcp` | POST | `X-API-Key` | JSON-RPC 2.0 proxy to wrapped MCP server |
|
|
248
|
-
| `/balance` | GET | `X-API-Key` | Client self-service — check
|
|
249
|
-
| `/keys` | POST | `X-Admin-Key` | Create API key (with ACL, expiry, credits) |
|
|
250
|
+
| `/mcp` | POST | `X-API-Key` or `Bearer` | JSON-RPC 2.0 proxy to wrapped MCP server |
|
|
251
|
+
| `/balance` | GET | `X-API-Key` | Client self-service — check credits, quota, ACL, expiry |
|
|
252
|
+
| `/keys` | POST | `X-Admin-Key` | Create API key (with ACL, expiry, quota, credits) |
|
|
250
253
|
| `/keys` | GET | `X-Admin-Key` | List all keys (masked, with expiry status) |
|
|
251
254
|
| `/topup` | POST | `X-Admin-Key` | Add credits to an existing key |
|
|
252
255
|
| `/keys/revoke` | POST | `X-Admin-Key` | Revoke an API key |
|
|
253
256
|
| `/keys/acl` | POST | `X-Admin-Key` | Set tool ACL (whitelist/blacklist) on a key |
|
|
254
257
|
| `/keys/expiry` | POST | `X-Admin-Key` | Set or remove key expiry (TTL) |
|
|
258
|
+
| `/keys/quota` | POST | `X-Admin-Key` | Set usage quota (daily/monthly limits) |
|
|
255
259
|
| `/limits` | POST | `X-Admin-Key` | Set spending limit on a key |
|
|
256
260
|
| `/usage` | GET | `X-Admin-Key` | Export usage data (JSON or CSV) |
|
|
257
261
|
| `/status` | GET | `X-Admin-Key` | Full dashboard with usage stats |
|
|
258
262
|
| `/dashboard` | GET | None (admin key in-browser) | Real-time admin web dashboard |
|
|
259
263
|
| `/stripe/webhook` | POST | Stripe Signature | Auto-top-up credits on payment |
|
|
264
|
+
| `/.well-known/oauth-authorization-server` | GET | None | OAuth 2.1 server metadata |
|
|
265
|
+
| `/oauth/register` | POST | None | Dynamic Client Registration (RFC 7591) |
|
|
266
|
+
| `/oauth/authorize` | GET | None | Authorization endpoint (PKCE required) |
|
|
267
|
+
| `/oauth/token` | POST | None | Token endpoint (code exchange + refresh) |
|
|
268
|
+
| `/oauth/revoke` | POST | None | Token revocation (RFC 7009) |
|
|
269
|
+
| `/oauth/clients` | GET | `X-Admin-Key` | List registered OAuth clients |
|
|
260
270
|
| `/` | GET | None | Health check |
|
|
261
271
|
|
|
262
272
|
### Free Methods
|
|
@@ -435,6 +445,88 @@ npx paygate-mcp wrap --server "node server.js" --webhook-url "https://billing.ex
|
|
|
435
445
|
|
|
436
446
|
Events are batched (up to 10 per POST) and flushed every 5 seconds. Each event includes tool name, credits charged, API key, and timestamp. Fire-and-forget with one retry on failure.
|
|
437
447
|
|
|
448
|
+
### Usage Quotas
|
|
449
|
+
|
|
450
|
+
Set daily or monthly usage limits per API key:
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
# Create a key with 10 calls/day, 200 calls/month
|
|
454
|
+
curl -X POST http://localhost:3402/keys \
|
|
455
|
+
-H "Content-Type: application/json" \
|
|
456
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
457
|
+
-d '{"name": "metered-user", "credits": 1000, "quota": {"dailyCallLimit": 10, "monthlyCallLimit": 200}}'
|
|
458
|
+
|
|
459
|
+
# Set credit-based quotas (max 50 credits/day)
|
|
460
|
+
curl -X POST http://localhost:3402/keys/quota \
|
|
461
|
+
-H "Content-Type: application/json" \
|
|
462
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
463
|
+
-d '{"key": "CLIENT_API_KEY", "dailyCreditLimit": 50}'
|
|
464
|
+
|
|
465
|
+
# Remove per-key quota (fall back to global defaults)
|
|
466
|
+
curl -X POST http://localhost:3402/keys/quota \
|
|
467
|
+
-H "Content-Type: application/json" \
|
|
468
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
469
|
+
-d '{"key": "CLIENT_API_KEY", "remove": true}'
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Quota types: `dailyCallLimit`, `monthlyCallLimit`, `dailyCreditLimit`, `monthlyCreditLimit`. Set to 0 for unlimited. Counters reset at UTC midnight (daily) and UTC month boundary (monthly). Set global defaults in the config file with `globalQuota`.
|
|
473
|
+
|
|
474
|
+
### Dynamic Pricing
|
|
475
|
+
|
|
476
|
+
Charge extra credits based on input argument size:
|
|
477
|
+
|
|
478
|
+
```json
|
|
479
|
+
{
|
|
480
|
+
"toolPricing": {
|
|
481
|
+
"analyze_text": { "creditsPerCall": 2, "creditsPerKbInput": 5 },
|
|
482
|
+
"search": { "creditsPerCall": 1 }
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
For `analyze_text`, a 3 KB input would cost `2 + ceil(3 × 5) = 17` credits. Small inputs round up to at least 1 KB. Tools without `creditsPerKbInput` use the flat base price.
|
|
488
|
+
|
|
489
|
+
### OAuth 2.1
|
|
490
|
+
|
|
491
|
+
Full OAuth 2.1 authorization server for MCP clients. Implements PKCE, dynamic client registration, token refresh, and revocation.
|
|
492
|
+
|
|
493
|
+
Enable OAuth in config:
|
|
494
|
+
```json
|
|
495
|
+
{
|
|
496
|
+
"oauth": {
|
|
497
|
+
"accessTokenTtl": 3600,
|
|
498
|
+
"refreshTokenTtl": 2592000,
|
|
499
|
+
"scopes": ["tools:*", "tools:read", "tools:write"]
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
**Full flow:**
|
|
505
|
+
```bash
|
|
506
|
+
# 1. Register an OAuth client
|
|
507
|
+
curl -X POST http://localhost:3402/oauth/register \
|
|
508
|
+
-H "Content-Type: application/json" \
|
|
509
|
+
-d '{"client_name": "My Agent", "redirect_uris": ["http://localhost:8080/callback"], "api_key": "pg_..."}'
|
|
510
|
+
|
|
511
|
+
# 2. Generate PKCE challenge (code_verifier → SHA256 → base64url)
|
|
512
|
+
# 3. Authorize: GET /oauth/authorize?response_type=code&client_id=...&redirect_uri=...&code_challenge=...&code_challenge_method=S256
|
|
513
|
+
# 4. Exchange code for tokens
|
|
514
|
+
curl -X POST http://localhost:3402/oauth/token \
|
|
515
|
+
-H "Content-Type: application/json" \
|
|
516
|
+
-d '{"grant_type": "authorization_code", "code": "...", "client_id": "...", "redirect_uri": "...", "code_verifier": "..."}'
|
|
517
|
+
|
|
518
|
+
# 5. Use Bearer token on /mcp
|
|
519
|
+
curl -X POST http://localhost:3402/mcp \
|
|
520
|
+
-H "Authorization: Bearer pg_at_..." \
|
|
521
|
+
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "search", "arguments": {"query": "hello"}}}'
|
|
522
|
+
|
|
523
|
+
# 6. Refresh token
|
|
524
|
+
curl -X POST http://localhost:3402/oauth/token \
|
|
525
|
+
-d '{"grant_type": "refresh_token", "refresh_token": "pg_rt_...", "client_id": "..."}'
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
OAuth tokens are backed by API keys — each token maps to an API key for billing. The `/mcp` endpoint accepts both `X-API-Key` and `Authorization: Bearer` headers.
|
|
529
|
+
|
|
438
530
|
### Config File Mode
|
|
439
531
|
|
|
440
532
|
Load all settings from a JSON file instead of CLI flags:
|
|
@@ -455,7 +547,15 @@ Example `paygate.json`:
|
|
|
455
547
|
"refundOnFailure": true,
|
|
456
548
|
"stateFile": "~/.paygate/state.json",
|
|
457
549
|
"toolPricing": {
|
|
458
|
-
"premium_analyze": { "creditsPerCall": 10 }
|
|
550
|
+
"premium_analyze": { "creditsPerCall": 10, "creditsPerKbInput": 5 }
|
|
551
|
+
},
|
|
552
|
+
"globalQuota": {
|
|
553
|
+
"dailyCallLimit": 1000,
|
|
554
|
+
"monthlyCreditLimit": 50000
|
|
555
|
+
},
|
|
556
|
+
"oauth": {
|
|
557
|
+
"accessTokenTtl": 3600,
|
|
558
|
+
"scopes": ["tools:*"]
|
|
459
559
|
},
|
|
460
560
|
"importKeys": {
|
|
461
561
|
"pg_abc123def456": 500
|
|
@@ -521,6 +621,9 @@ const result = await client.callTool('search', { query: 'hello' });
|
|
|
521
621
|
- Spending limits enforced with integer arithmetic (no float bypass)
|
|
522
622
|
- Per-tool ACL enforcement (whitelist + blacklist, sanitized inputs)
|
|
523
623
|
- Key expiry with fail-closed behavior (expired = denied)
|
|
624
|
+
- OAuth 2.1 with PKCE (S256) — no implicit grant, no plain challenge
|
|
625
|
+
- OAuth tokens are opaque hex strings (no JWT data leakage)
|
|
626
|
+
- Quota counters reset atomically at UTC boundaries
|
|
524
627
|
- Red-teamed with 101 adversarial security tests across 14 passes
|
|
525
628
|
|
|
526
629
|
## Current Limitations
|
|
@@ -545,7 +648,9 @@ const result = await client.callTool('search', { query: 'hello' });
|
|
|
545
648
|
- [x] Key expiry (TTL) — auto-expire API keys
|
|
546
649
|
- [x] Multi-server mode — wrap N MCP servers behind one PayGate
|
|
547
650
|
- [x] Client SDK — `PayGateClient` with auto 402 retry
|
|
548
|
-
- [
|
|
651
|
+
- [x] Usage quotas — daily/monthly call and credit limits per key
|
|
652
|
+
- [x] Dynamic pricing — charge by input size (`creditsPerKbInput`)
|
|
653
|
+
- [x] OAuth 2.1 — PKCE, client registration, Bearer tokens, token refresh/revocation
|
|
549
654
|
|
|
550
655
|
## Requirements
|
|
551
656
|
|
package/dist/cli.js
CHANGED
|
@@ -159,6 +159,13 @@ async function main() {
|
|
|
159
159
|
const stripeSecret = flags['stripe-secret'] || fileConfig.stripeWebhookSecret;
|
|
160
160
|
const webhookUrl = flags['webhook-url'] || fileConfig.webhookUrl || null;
|
|
161
161
|
const refundOnFailure = flags['refund-on-failure'] === 'true' || 'refund-on-failure' in flags || fileConfig.refundOnFailure || false;
|
|
162
|
+
// Parse global quota from config file
|
|
163
|
+
const globalQuota = fileConfig.globalQuota ? {
|
|
164
|
+
dailyCallLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.dailyCallLimit) || 0)),
|
|
165
|
+
monthlyCallLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.monthlyCallLimit) || 0)),
|
|
166
|
+
dailyCreditLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.dailyCreditLimit) || 0)),
|
|
167
|
+
monthlyCreditLimit: Math.max(0, Math.floor(Number(fileConfig.globalQuota.monthlyCreditLimit) || 0)),
|
|
168
|
+
} : undefined;
|
|
162
169
|
const server = new server_1.PayGateServer({
|
|
163
170
|
serverCommand,
|
|
164
171
|
serverArgs,
|
|
@@ -170,6 +177,8 @@ async function main() {
|
|
|
170
177
|
toolPricing,
|
|
171
178
|
webhookUrl,
|
|
172
179
|
refundOnFailure: !!refundOnFailure,
|
|
180
|
+
globalQuota,
|
|
181
|
+
oauth: fileConfig.oauth,
|
|
173
182
|
}, adminKey, stateFile, remoteUrl, stripeSecret, multiServers);
|
|
174
183
|
// Import keys from CLI flags
|
|
175
184
|
if (flags['import-key']) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;;;GAOG;;AAEH,qCAAyC;AAEzC,2BAAkC;AAClC,+BAA4B;AAE5B,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,OAAO,CAAC;IAAC,CAAC;AAC7B,CAAC,CAAC,EAAE,CAAC;AAEL,gFAAgF;AAEhF,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAClC,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAClB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,OAAO,GAAgC,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/gate.d.ts
CHANGED
|
@@ -15,11 +15,13 @@ import { KeyStore } from './store';
|
|
|
15
15
|
import { RateLimiter } from './rate-limiter';
|
|
16
16
|
import { UsageMeter } from './meter';
|
|
17
17
|
import { WebhookEmitter } from './webhook';
|
|
18
|
+
import { QuotaTracker } from './quota';
|
|
18
19
|
export declare class Gate {
|
|
19
20
|
readonly store: KeyStore;
|
|
20
21
|
readonly rateLimiter: RateLimiter;
|
|
21
22
|
readonly meter: UsageMeter;
|
|
22
23
|
readonly webhook: WebhookEmitter | null;
|
|
24
|
+
readonly quotaTracker: QuotaTracker;
|
|
23
25
|
private readonly config;
|
|
24
26
|
constructor(config: PayGateConfig, statePath?: string);
|
|
25
27
|
/**
|
|
@@ -47,8 +49,9 @@ export declare class Gate {
|
|
|
47
49
|
isFreeMethod(method: string): boolean;
|
|
48
50
|
/**
|
|
49
51
|
* Get price for a tool in credits.
|
|
52
|
+
* With dynamic pricing: base price + per-KB surcharge for large inputs.
|
|
50
53
|
*/
|
|
51
|
-
getToolPrice(toolName: string): number;
|
|
54
|
+
getToolPrice(toolName: string, args?: Record<string, unknown>): number;
|
|
52
55
|
/**
|
|
53
56
|
* Get full status for dashboard.
|
|
54
57
|
*/
|
package/dist/gate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAc,cAAc,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAc,cAAc,EAAE,YAAY,EAAe,MAAM,SAAS,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,IAAI;IACf,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM;IASrD;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,YAAY;IAuHvE;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;;OAGG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;IAmBpJ;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrC;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAetE;;OAEG;IACH,SAAS;;;;;;;;;;;;;;;;;;IAkBT;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAa/D,2CAA2C;IAC3C,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,WAAW;CAgBpB"}
|
package/dist/gate.js
CHANGED
|
@@ -17,11 +17,13 @@ const store_1 = require("./store");
|
|
|
17
17
|
const rate_limiter_1 = require("./rate-limiter");
|
|
18
18
|
const meter_1 = require("./meter");
|
|
19
19
|
const webhook_1 = require("./webhook");
|
|
20
|
+
const quota_1 = require("./quota");
|
|
20
21
|
class Gate {
|
|
21
22
|
store;
|
|
22
23
|
rateLimiter;
|
|
23
24
|
meter;
|
|
24
25
|
webhook;
|
|
26
|
+
quotaTracker;
|
|
25
27
|
config;
|
|
26
28
|
constructor(config, statePath) {
|
|
27
29
|
this.config = config;
|
|
@@ -29,13 +31,14 @@ class Gate {
|
|
|
29
31
|
this.rateLimiter = new rate_limiter_1.RateLimiter(config.globalRateLimitPerMin);
|
|
30
32
|
this.meter = new meter_1.UsageMeter();
|
|
31
33
|
this.webhook = config.webhookUrl ? new webhook_1.WebhookEmitter(config.webhookUrl) : null;
|
|
34
|
+
this.quotaTracker = new quota_1.QuotaTracker();
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
37
|
* Evaluate a tool call request.
|
|
35
38
|
*/
|
|
36
39
|
evaluate(apiKey, toolCall) {
|
|
37
40
|
const toolName = toolCall.name;
|
|
38
|
-
const creditsRequired = this.getToolPrice(toolName);
|
|
41
|
+
const creditsRequired = this.getToolPrice(toolName, toolCall.arguments);
|
|
39
42
|
// Step 1: API key present?
|
|
40
43
|
if (!apiKey) {
|
|
41
44
|
this.recordEvent(apiKey || 'none', '', toolName, 0, false, 'missing_api_key');
|
|
@@ -117,13 +120,25 @@ class Gate {
|
|
|
117
120
|
};
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
|
-
// Step 8:
|
|
123
|
+
// Step 8: Usage quota check (daily/monthly limits)
|
|
124
|
+
const quotaResult = this.quotaTracker.check(keyRecord, creditsRequired, this.config.globalQuota);
|
|
125
|
+
if (!quotaResult.allowed) {
|
|
126
|
+
this.recordEvent(apiKey, keyRecord.name, toolName, 0, false, quotaResult.reason);
|
|
127
|
+
if (this.config.shadowMode) {
|
|
128
|
+
return { allowed: true, reason: `shadow:${quotaResult.reason}`, creditsCharged: 0, remainingCredits: keyRecord.credits };
|
|
129
|
+
}
|
|
130
|
+
return { allowed: false, reason: quotaResult.reason, creditsCharged: 0, remainingCredits: keyRecord.credits };
|
|
131
|
+
}
|
|
132
|
+
// Step 9: ALLOW — deduct credits, record usage, and update quotas
|
|
121
133
|
this.store.deductCredits(apiKey, creditsRequired);
|
|
122
134
|
this.rateLimiter.record(apiKey);
|
|
123
135
|
// Record per-tool rate limit usage
|
|
124
136
|
if (toolPricing?.rateLimitPerMin && toolPricing.rateLimitPerMin > 0) {
|
|
125
137
|
this.rateLimiter.recordCustom(`${apiKey}:tool:${toolName}`);
|
|
126
138
|
}
|
|
139
|
+
// Update quota counters
|
|
140
|
+
this.quotaTracker.record(keyRecord, creditsRequired);
|
|
141
|
+
this.store.save();
|
|
127
142
|
const remaining = this.store.getKey(apiKey)?.credits ?? 0;
|
|
128
143
|
this.recordEvent(apiKey, keyRecord.name, toolName, creditsRequired, true);
|
|
129
144
|
return { allowed: true, creditsCharged: creditsRequired, remainingCredits: remaining };
|
|
@@ -178,12 +193,19 @@ class Gate {
|
|
|
178
193
|
}
|
|
179
194
|
/**
|
|
180
195
|
* Get price for a tool in credits.
|
|
196
|
+
* With dynamic pricing: base price + per-KB surcharge for large inputs.
|
|
181
197
|
*/
|
|
182
|
-
getToolPrice(toolName) {
|
|
198
|
+
getToolPrice(toolName, args) {
|
|
183
199
|
const override = this.config.toolPricing[toolName];
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
200
|
+
const basePrice = override ? override.creditsPerCall : this.config.defaultCreditsPerCall;
|
|
201
|
+
// Dynamic pricing: add per-KB surcharge for input size
|
|
202
|
+
if (override?.creditsPerKbInput && override.creditsPerKbInput > 0 && args) {
|
|
203
|
+
const inputBytes = Buffer.byteLength(JSON.stringify(args), 'utf-8');
|
|
204
|
+
const inputKb = inputBytes / 1024;
|
|
205
|
+
const surcharge = Math.ceil(inputKb * override.creditsPerKbInput);
|
|
206
|
+
return basePrice + surcharge;
|
|
207
|
+
}
|
|
208
|
+
return basePrice;
|
|
187
209
|
}
|
|
188
210
|
/**
|
|
189
211
|
* Get full status for dashboard.
|
|
@@ -215,6 +237,8 @@ class Gate {
|
|
|
215
237
|
if (keyRecord) {
|
|
216
238
|
keyRecord.totalSpent = Math.max(0, keyRecord.totalSpent - credits);
|
|
217
239
|
keyRecord.totalCalls = Math.max(0, keyRecord.totalCalls - 1);
|
|
240
|
+
// Undo quota tracking
|
|
241
|
+
this.quotaTracker.unrecord(keyRecord, credits);
|
|
218
242
|
this.store.save();
|
|
219
243
|
}
|
|
220
244
|
this.recordEvent(apiKey, keyRecord?.name || 'unknown', toolName, -credits, true, 'refund');
|
package/dist/gate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAGH,mCAAmC;AACnC,iDAA6C;AAC7C,mCAAqC;AACrC,uCAA2C;
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,9 +24,12 @@ export { UsageMeter } from './meter';
|
|
|
24
24
|
export { RateLimiter } from './rate-limiter';
|
|
25
25
|
export { StripeWebhookHandler } from './stripe';
|
|
26
26
|
export { WebhookEmitter } from './webhook';
|
|
27
|
+
export { QuotaTracker } from './quota';
|
|
28
|
+
export { OAuthProvider } from './oauth';
|
|
29
|
+
export type { OAuthClientRecord, OAuthTokenRecord, OAuthServerMetadata, OAuthConfig } from './oauth';
|
|
27
30
|
export { getDashboardHtml } from './dashboard';
|
|
28
31
|
export { PayGateClient, PayGateError } from './client';
|
|
29
32
|
export type { PayGateClientConfig, CreditsNeededInfo, BalanceInfo } from './client';
|
|
30
|
-
export type { PayGateConfig, JsonRpcRequest, JsonRpcResponse, JsonRpcError, ToolCallParams, ToolInfo, ToolPricing, ServerBackendConfig, ApiKeyRecord, UsageEvent, UsageSummary, GateDecision, } from './types';
|
|
33
|
+
export type { PayGateConfig, JsonRpcRequest, JsonRpcResponse, JsonRpcError, ToolCallParams, ToolInfo, ToolPricing, ServerBackendConfig, ApiKeyRecord, UsageEvent, UsageSummary, GateDecision, QuotaConfig, } from './types';
|
|
31
34
|
export { DEFAULT_CONFIG } from './types';
|
|
32
35
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpF,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpF,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.DEFAULT_CONFIG = exports.PayGateError = exports.PayGateClient = exports.getDashboardHtml = exports.WebhookEmitter = exports.StripeWebhookHandler = exports.RateLimiter = exports.UsageMeter = exports.KeyStore = exports.MultiServerRouter = exports.HttpMcpProxy = exports.McpProxy = exports.Gate = exports.PayGateServer = void 0;
|
|
19
|
+
exports.DEFAULT_CONFIG = exports.PayGateError = exports.PayGateClient = exports.getDashboardHtml = exports.OAuthProvider = exports.QuotaTracker = exports.WebhookEmitter = exports.StripeWebhookHandler = exports.RateLimiter = exports.UsageMeter = exports.KeyStore = exports.MultiServerRouter = exports.HttpMcpProxy = exports.McpProxy = exports.Gate = exports.PayGateServer = void 0;
|
|
20
20
|
var server_1 = require("./server");
|
|
21
21
|
Object.defineProperty(exports, "PayGateServer", { enumerable: true, get: function () { return server_1.PayGateServer; } });
|
|
22
22
|
var gate_1 = require("./gate");
|
|
@@ -37,6 +37,10 @@ var stripe_1 = require("./stripe");
|
|
|
37
37
|
Object.defineProperty(exports, "StripeWebhookHandler", { enumerable: true, get: function () { return stripe_1.StripeWebhookHandler; } });
|
|
38
38
|
var webhook_1 = require("./webhook");
|
|
39
39
|
Object.defineProperty(exports, "WebhookEmitter", { enumerable: true, get: function () { return webhook_1.WebhookEmitter; } });
|
|
40
|
+
var quota_1 = require("./quota");
|
|
41
|
+
Object.defineProperty(exports, "QuotaTracker", { enumerable: true, get: function () { return quota_1.QuotaTracker; } });
|
|
42
|
+
var oauth_1 = require("./oauth");
|
|
43
|
+
Object.defineProperty(exports, "OAuthProvider", { enumerable: true, get: function () { return oauth_1.OAuthProvider; } });
|
|
40
44
|
var dashboard_1 = require("./dashboard");
|
|
41
45
|
Object.defineProperty(exports, "getDashboardHtml", { enumerable: true, get: function () { return dashboard_1.getDashboardHtml; } });
|
|
42
46
|
var client_1 = require("./client");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AACjB,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AACrB,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAC1B,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AACjB,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,mCAAgD;AAAvC,8GAAA,oBAAoB,OAAA;AAC7B,qCAA2C;AAAlC,yGAAA,cAAc,OAAA;AACvB,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AACzB,mCAAuD;AAA9C,uGAAA,aAAa,OAAA;AAAE,sGAAA,YAAY,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AACjB,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AACrB,mCAA6C;AAApC,2GAAA,iBAAiB,OAAA;AAC1B,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AACjB,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,mCAAgD;AAAvC,8GAAA,oBAAoB,OAAA;AAC7B,qCAA2C;AAAlC,yGAAA,cAAc,OAAA;AACvB,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAEtB,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AACzB,mCAAuD;AAA9C,uGAAA,aAAa,OAAA;AAAE,sGAAA,YAAY,OAAA;AAmBpC,iCAAyC;AAAhC,uGAAA,cAAc,OAAA"}
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuthProvider — OAuth 2.1 authorization server for MCP.
|
|
3
|
+
*
|
|
4
|
+
* Implements:
|
|
5
|
+
* - Dynamic Client Registration (RFC 7591)
|
|
6
|
+
* - Authorization Code Grant with PKCE (RFC 7636)
|
|
7
|
+
* - Token Refresh
|
|
8
|
+
* - Token Revocation (RFC 7009)
|
|
9
|
+
* - Server Metadata (RFC 8414)
|
|
10
|
+
*
|
|
11
|
+
* Design:
|
|
12
|
+
* - Each OAuth access token is backed by an API key (for billing/credits).
|
|
13
|
+
* - Clients register with redirect URIs and requested scopes.
|
|
14
|
+
* - PKCE is REQUIRED (OAuth 2.1 mandate).
|
|
15
|
+
* - Tokens are opaque hex strings (no JWT overhead, simple storage).
|
|
16
|
+
* - In-memory storage with optional file persistence.
|
|
17
|
+
*/
|
|
18
|
+
export interface OAuthClientRecord {
|
|
19
|
+
clientId: string;
|
|
20
|
+
clientSecret: string | null;
|
|
21
|
+
clientName: string;
|
|
22
|
+
redirectUris: string[];
|
|
23
|
+
grantTypes: string[];
|
|
24
|
+
scope: string;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
/** API key to link tokens to. Set by admin. */
|
|
27
|
+
apiKeyRef: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface OAuthAuthCode {
|
|
30
|
+
code: string;
|
|
31
|
+
clientId: string;
|
|
32
|
+
redirectUri: string;
|
|
33
|
+
codeChallenge: string;
|
|
34
|
+
codeChallengeMethod: 'S256';
|
|
35
|
+
scope: string;
|
|
36
|
+
apiKeyRef: string;
|
|
37
|
+
expiresAt: number;
|
|
38
|
+
}
|
|
39
|
+
export interface OAuthTokenRecord {
|
|
40
|
+
token: string;
|
|
41
|
+
tokenType: 'access' | 'refresh';
|
|
42
|
+
clientId: string;
|
|
43
|
+
scope: string;
|
|
44
|
+
apiKeyRef: string;
|
|
45
|
+
expiresAt: number;
|
|
46
|
+
createdAt: string;
|
|
47
|
+
/** For refresh tokens: associated access token family */
|
|
48
|
+
family?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface OAuthServerMetadata {
|
|
51
|
+
issuer: string;
|
|
52
|
+
authorization_endpoint: string;
|
|
53
|
+
token_endpoint: string;
|
|
54
|
+
registration_endpoint: string;
|
|
55
|
+
revocation_endpoint: string;
|
|
56
|
+
scopes_supported: string[];
|
|
57
|
+
response_types_supported: string[];
|
|
58
|
+
grant_types_supported: string[];
|
|
59
|
+
code_challenge_methods_supported: string[];
|
|
60
|
+
token_endpoint_auth_methods_supported: string[];
|
|
61
|
+
}
|
|
62
|
+
export interface OAuthConfig {
|
|
63
|
+
/** Issuer URL (base URL of the server). */
|
|
64
|
+
issuer: string;
|
|
65
|
+
/** Access token lifetime in seconds. Default: 3600 (1 hour). */
|
|
66
|
+
accessTokenTtl: number;
|
|
67
|
+
/** Refresh token lifetime in seconds. Default: 2592000 (30 days). 0 = never. */
|
|
68
|
+
refreshTokenTtl: number;
|
|
69
|
+
/** Authorization code lifetime in seconds. Default: 300 (5 minutes). */
|
|
70
|
+
codeTtl: number;
|
|
71
|
+
/** Supported scopes. */
|
|
72
|
+
scopes: string[];
|
|
73
|
+
}
|
|
74
|
+
export declare class OAuthProvider {
|
|
75
|
+
private clients;
|
|
76
|
+
private codes;
|
|
77
|
+
private tokens;
|
|
78
|
+
private readonly config;
|
|
79
|
+
private readonly statePath;
|
|
80
|
+
constructor(config?: Partial<OAuthConfig>, statePath?: string);
|
|
81
|
+
private cleanupInterval;
|
|
82
|
+
/**
|
|
83
|
+
* Register a new OAuth client.
|
|
84
|
+
*/
|
|
85
|
+
registerClient(options: {
|
|
86
|
+
clientName: string;
|
|
87
|
+
redirectUris: string[];
|
|
88
|
+
grantTypes?: string[];
|
|
89
|
+
scope?: string;
|
|
90
|
+
apiKeyRef?: string;
|
|
91
|
+
}): OAuthClientRecord;
|
|
92
|
+
/**
|
|
93
|
+
* Get a client by ID.
|
|
94
|
+
*/
|
|
95
|
+
getClient(clientId: string): OAuthClientRecord | null;
|
|
96
|
+
/**
|
|
97
|
+
* Update client's API key reference (admin operation).
|
|
98
|
+
*/
|
|
99
|
+
linkClientToApiKey(clientId: string, apiKey: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* List all registered clients (with secrets masked).
|
|
102
|
+
*/
|
|
103
|
+
listClients(): Array<Omit<OAuthClientRecord, 'clientSecret'> & {
|
|
104
|
+
clientSecretPrefix: string;
|
|
105
|
+
}>;
|
|
106
|
+
/**
|
|
107
|
+
* Create an authorization code (after user approval).
|
|
108
|
+
* Returns the code to be sent back via redirect.
|
|
109
|
+
*/
|
|
110
|
+
createAuthCode(options: {
|
|
111
|
+
clientId: string;
|
|
112
|
+
redirectUri: string;
|
|
113
|
+
codeChallenge: string;
|
|
114
|
+
codeChallengeMethod?: string;
|
|
115
|
+
scope?: string;
|
|
116
|
+
apiKeyRef?: string;
|
|
117
|
+
}): string;
|
|
118
|
+
/**
|
|
119
|
+
* Exchange an authorization code for tokens.
|
|
120
|
+
* Validates PKCE code_verifier.
|
|
121
|
+
*/
|
|
122
|
+
exchangeCode(options: {
|
|
123
|
+
code: string;
|
|
124
|
+
clientId: string;
|
|
125
|
+
redirectUri: string;
|
|
126
|
+
codeVerifier: string;
|
|
127
|
+
}): {
|
|
128
|
+
accessToken: string;
|
|
129
|
+
refreshToken: string;
|
|
130
|
+
expiresIn: number;
|
|
131
|
+
tokenType: string;
|
|
132
|
+
scope: string;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Refresh an access token using a refresh token.
|
|
136
|
+
*/
|
|
137
|
+
refreshAccessToken(options: {
|
|
138
|
+
refreshToken: string;
|
|
139
|
+
clientId: string;
|
|
140
|
+
scope?: string;
|
|
141
|
+
}): {
|
|
142
|
+
accessToken: string;
|
|
143
|
+
expiresIn: number;
|
|
144
|
+
tokenType: string;
|
|
145
|
+
scope: string;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Validate a bearer token and return the associated API key.
|
|
149
|
+
* Returns null if token is invalid or expired.
|
|
150
|
+
*/
|
|
151
|
+
validateToken(bearerToken: string): {
|
|
152
|
+
apiKey: string;
|
|
153
|
+
scope: string;
|
|
154
|
+
clientId: string;
|
|
155
|
+
} | null;
|
|
156
|
+
/**
|
|
157
|
+
* Revoke a token. Also revokes all tokens in the same family.
|
|
158
|
+
*/
|
|
159
|
+
revokeToken(token: string): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Return OAuth Authorization Server Metadata.
|
|
162
|
+
*/
|
|
163
|
+
getMetadata(): OAuthServerMetadata;
|
|
164
|
+
private createToken;
|
|
165
|
+
/**
|
|
166
|
+
* Remove expired codes and tokens.
|
|
167
|
+
*/
|
|
168
|
+
private cleanup;
|
|
169
|
+
/** Get active token count */
|
|
170
|
+
get tokenCount(): number;
|
|
171
|
+
/** Get client count */
|
|
172
|
+
get clientCount(): number;
|
|
173
|
+
destroy(): void;
|
|
174
|
+
private save;
|
|
175
|
+
private load;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|