paygate-mcp 6.8.0 → 7.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 +66 -0
- package/dist/audit.d.ts +3 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +9 -0
- package/dist/audit.js.map +1 -1
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +220 -0
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -95,6 +95,8 @@ Agent → PayGate (auth + billing) → Your MCP Server (stdio or HTTP)
|
|
|
95
95
|
- **Key Comparison** — `GET /keys/compare?keys=pg_a,pg_b` returns side-by-side comparison of 2–10 keys — credits, usage, velocity, rate limits, status, metadata (namespace/group/tags) — with not-found key reporting
|
|
96
96
|
- **Key Health Score** — `GET /keys/health?key=...` returns composite health score (0–100) with weighted component breakdown: balance health (30%), quota utilization (25%), rate limit pressure (20%), error rate (25%) — status levels (healthy/good/caution/warning/critical), key issue detection (revoked/suspended/expired/expiring/zero credits), alias support
|
|
97
97
|
- **Maintenance Mode** — `POST /maintenance` enables/disables maintenance mode with custom message — `/mcp` returns 503 to clients while admin endpoints stay operational, `GET /maintenance` checks status, `GET /health` reflects maintenance state, full audit trail
|
|
98
|
+
- **Admin Event Stream** — `GET /admin/events` SSE endpoint streams real-time audit events to admin clients — tool calls, denials, key operations, maintenance changes, all with optional `?types=` filter for event type filtering, keepalive pings, multi-client support
|
|
99
|
+
- **Key Notes** — `POST /keys/notes` adds timestamped notes to API keys, `GET /keys/notes?key=...` lists notes, `DELETE /keys/notes?key=...&index=N` removes notes — max 50 per key, 1000 char limit, works on suspended/revoked keys, alias support, audit trail
|
|
98
100
|
- **Config Hot Reload** — `POST /config/reload` reloads pricing, rate limits, webhooks, quotas, and behavior flags from config file without server restart
|
|
99
101
|
- **Webhook Events** — POST batched usage events to any URL for external billing/alerting
|
|
100
102
|
- **Config File Mode** — Load all settings from a JSON file (`--config`)
|
|
@@ -1898,6 +1900,70 @@ curl -X POST http://localhost:3402/maintenance \
|
|
|
1898
1900
|
|
|
1899
1901
|
When enabled, all `/mcp` requests return **503** with the custom message. Admin endpoints (`/keys`, `/maintenance`, `/audit`, etc.) remain fully operational. `GET /health` returns `{"status": "maintenance"}`. Both enable and disable actions are recorded in the audit trail (`maintenance.enabled` / `maintenance.disabled`).
|
|
1900
1902
|
|
|
1903
|
+
### Admin Event Stream
|
|
1904
|
+
|
|
1905
|
+
Stream real-time server events to admin clients via Server-Sent Events (SSE):
|
|
1906
|
+
|
|
1907
|
+
```bash
|
|
1908
|
+
# Stream all events
|
|
1909
|
+
curl -N http://localhost:3402/admin/events \
|
|
1910
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
1911
|
+
-H "Accept: text/event-stream"
|
|
1912
|
+
|
|
1913
|
+
# Stream only key operations
|
|
1914
|
+
curl -N http://localhost:3402/admin/events?types=key.created,key.revoked,key.topup \
|
|
1915
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
1916
|
+
-H "Accept: text/event-stream"
|
|
1917
|
+
```
|
|
1918
|
+
|
|
1919
|
+
**Events:**
|
|
1920
|
+
|
|
1921
|
+
```
|
|
1922
|
+
event: connected
|
|
1923
|
+
data: {"message":"Admin event stream connected","filters":"all"}
|
|
1924
|
+
|
|
1925
|
+
event: audit
|
|
1926
|
+
data: {"id":42,"timestamp":"2025-03-15T14:30:00.000Z","type":"key.created","actor":"admin","message":"Key created: prod-agent","metadata":{...}}
|
|
1927
|
+
|
|
1928
|
+
event: audit
|
|
1929
|
+
data: {"id":43,"timestamp":"2025-03-15T14:30:01.000Z","type":"gate.allow","actor":"pg_abc12...","message":"Allowed: get_weather","metadata":{...}}
|
|
1930
|
+
```
|
|
1931
|
+
|
|
1932
|
+
Every audit event (tool calls, denials, key operations, maintenance, alerts) is broadcast in real-time. Use `?types=` to filter by comma-separated event types. Supports multiple concurrent admin clients. Keepalive pings every 15s prevent connection timeouts. Connections are cleaned up automatically on disconnect.
|
|
1933
|
+
|
|
1934
|
+
### Key Notes
|
|
1935
|
+
|
|
1936
|
+
Attach timestamped notes to API keys for operational tracking:
|
|
1937
|
+
|
|
1938
|
+
```bash
|
|
1939
|
+
# Add a note
|
|
1940
|
+
curl -X POST http://localhost:3402/keys/notes \
|
|
1941
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY" \
|
|
1942
|
+
-d '{"key": "pg_...", "text": "Increased credits per customer request #1234"}'
|
|
1943
|
+
|
|
1944
|
+
# List notes
|
|
1945
|
+
curl "http://localhost:3402/keys/notes?key=pg_..." -H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
1946
|
+
|
|
1947
|
+
# Delete a note by index
|
|
1948
|
+
curl -X DELETE "http://localhost:3402/keys/notes?key=pg_...&index=0" \
|
|
1949
|
+
-H "X-Admin-Key: YOUR_ADMIN_KEY"
|
|
1950
|
+
```
|
|
1951
|
+
|
|
1952
|
+
**Response (list):**
|
|
1953
|
+
|
|
1954
|
+
```json
|
|
1955
|
+
{
|
|
1956
|
+
"key": "pg_abc1...2345",
|
|
1957
|
+
"notes": [
|
|
1958
|
+
{ "timestamp": "2025-03-15T14:30:00.000Z", "author": "admin", "text": "Increased credits per customer request #1234" },
|
|
1959
|
+
{ "timestamp": "2025-03-16T09:00:00.000Z", "author": "admin", "text": "Upgraded to premium tier" }
|
|
1960
|
+
],
|
|
1961
|
+
"count": 2
|
|
1962
|
+
}
|
|
1963
|
+
```
|
|
1964
|
+
|
|
1965
|
+
Max 50 notes per key, 1000 characters per note. Works on suspended and revoked keys. Supports aliases. All add/delete operations recorded in audit trail (`key.note_added` / `key.note_deleted`).
|
|
1966
|
+
|
|
1901
1967
|
### IP Allowlisting
|
|
1902
1968
|
|
|
1903
1969
|
Restrict API keys to specific IP addresses or CIDR ranges:
|
package/dist/audit.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* session lifecycle, and admin operations. Ring buffer with configurable
|
|
6
6
|
* max size and age-based retention. Zero external dependencies.
|
|
7
7
|
*/
|
|
8
|
-
export type AuditEventType = 'key.created' | 'key.revoked' | 'key.suspended' | 'key.resumed' | 'key.cloned' | 'key.rotated' | 'key.topup' | 'key.acl_updated' | 'key.expiry_updated' | 'key.quota_updated' | 'key.tags_updated' | 'key.ip_updated' | 'key.limit_updated' | 'gate.allow' | 'gate.deny' | 'session.created' | 'session.destroyed' | 'oauth.client_registered' | 'oauth.token_issued' | 'oauth.token_revoked' | 'team.created' | 'team.updated' | 'team.deleted' | 'team.key_assigned' | 'team.key_removed' | 'admin.auth_failed' | 'admin.alerts_configured' | 'webhook.dead_letter_cleared' | 'webhook.replayed' | 'webhook.test' | 'webhook.pause' | 'webhook.resume' | 'key.alias_set' | 'key.expiry_warning' | 'template.created' | 'template.updated' | 'template.deleted' | 'token.created' | 'token.revoked' | 'billing.refund' | 'key.auto_topup_configured' | 'key.auto_topped_up' | 'admin_key.created' | 'admin_key.revoked' | 'group.created' | 'group.updated' | 'group.deleted' | 'group.key_assigned' | 'group.key_removed' | 'key.credits_transferred' | 'keys.exported' | 'keys.imported' | 'webhook_filter.created' | 'webhook_filter.updated' | 'webhook_filter.deleted' | 'config.reloaded' | 'config.export' | 'maintenance.enabled' | 'maintenance.disabled';
|
|
8
|
+
export type AuditEventType = 'key.created' | 'key.revoked' | 'key.suspended' | 'key.resumed' | 'key.cloned' | 'key.rotated' | 'key.topup' | 'key.acl_updated' | 'key.expiry_updated' | 'key.quota_updated' | 'key.tags_updated' | 'key.ip_updated' | 'key.limit_updated' | 'gate.allow' | 'gate.deny' | 'session.created' | 'session.destroyed' | 'oauth.client_registered' | 'oauth.token_issued' | 'oauth.token_revoked' | 'team.created' | 'team.updated' | 'team.deleted' | 'team.key_assigned' | 'team.key_removed' | 'admin.auth_failed' | 'admin.alerts_configured' | 'webhook.dead_letter_cleared' | 'webhook.replayed' | 'webhook.test' | 'webhook.pause' | 'webhook.resume' | 'key.alias_set' | 'key.expiry_warning' | 'template.created' | 'template.updated' | 'template.deleted' | 'token.created' | 'token.revoked' | 'billing.refund' | 'key.auto_topup_configured' | 'key.auto_topped_up' | 'admin_key.created' | 'admin_key.revoked' | 'group.created' | 'group.updated' | 'group.deleted' | 'group.key_assigned' | 'group.key_removed' | 'key.credits_transferred' | 'keys.exported' | 'keys.imported' | 'webhook_filter.created' | 'webhook_filter.updated' | 'webhook_filter.deleted' | 'config.reloaded' | 'config.export' | 'maintenance.enabled' | 'maintenance.disabled' | 'key.note_added' | 'key.note_deleted';
|
|
9
9
|
export interface AuditEvent {
|
|
10
10
|
/** Monotonically increasing ID */
|
|
11
11
|
id: number;
|
|
@@ -53,6 +53,8 @@ export declare class AuditLogger {
|
|
|
53
53
|
private nextId;
|
|
54
54
|
private readonly config;
|
|
55
55
|
private cleanupTimer;
|
|
56
|
+
/** Optional callback fired for every logged event (used by admin event stream). */
|
|
57
|
+
onEvent: ((event: AuditEvent) => void) | null;
|
|
56
58
|
constructor(config?: Partial<AuditLogConfig>);
|
|
57
59
|
/**
|
|
58
60
|
* Log an audit event.
|
package/dist/audit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,cAAc,GAEtB,aAAa,GACb,aAAa,GACb,eAAe,GACf,aAAa,GACb,YAAY,GACZ,aAAa,GACb,WAAW,GACX,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GAEnB,YAAY,GACZ,WAAW,GAEX,iBAAiB,GACjB,mBAAmB,GAEnB,yBAAyB,GACzB,oBAAoB,GACpB,qBAAqB,GAErB,cAAc,GACd,cAAc,GACd,cAAc,GACd,mBAAmB,GACnB,kBAAkB,GAElB,mBAAmB,GACnB,yBAAyB,GAEzB,6BAA6B,GAC7B,kBAAkB,GAClB,cAAc,GACd,eAAe,GACf,gBAAgB,GAEhB,eAAe,GAEf,oBAAoB,GAEpB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAElB,eAAe,GACf,eAAe,GAEf,gBAAgB,GAEhB,2BAA2B,GAC3B,oBAAoB,GAEpB,mBAAmB,GACnB,mBAAmB,GAEnB,eAAe,GACf,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,mBAAmB,GAEnB,yBAAyB,GAEzB,eAAe,GACf,eAAe,GAEf,wBAAwB,GACxB,wBAAwB,GACxB,wBAAwB,GAExB,iBAAiB,GACjB,eAAe,GAEf,qBAAqB,GACrB,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.js
CHANGED
|
@@ -20,6 +20,8 @@ class AuditLogger {
|
|
|
20
20
|
nextId = 1;
|
|
21
21
|
config;
|
|
22
22
|
cleanupTimer = null;
|
|
23
|
+
/** Optional callback fired for every logged event (used by admin event stream). */
|
|
24
|
+
onEvent = null;
|
|
23
25
|
constructor(config) {
|
|
24
26
|
this.config = { ...DEFAULT_AUDIT_CONFIG, ...config };
|
|
25
27
|
// Start retention cleanup timer
|
|
@@ -45,6 +47,13 @@ class AuditLogger {
|
|
|
45
47
|
if (this.events.length > this.config.maxEvents) {
|
|
46
48
|
this.events = this.events.slice(-this.config.maxEvents);
|
|
47
49
|
}
|
|
50
|
+
// Notify listeners (e.g., admin event stream)
|
|
51
|
+
if (this.onEvent) {
|
|
52
|
+
try {
|
|
53
|
+
this.onEvent(event);
|
|
54
|
+
}
|
|
55
|
+
catch { /* ignore listener errors */ }
|
|
56
|
+
}
|
|
48
57
|
return event;
|
|
49
58
|
}
|
|
50
59
|
/**
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -103,6 +103,10 @@ export declare class PayGateServer {
|
|
|
103
103
|
private maintenanceMessage;
|
|
104
104
|
/** Timestamp when maintenance mode was enabled */
|
|
105
105
|
private maintenanceSince;
|
|
106
|
+
/** Active admin SSE event stream connections */
|
|
107
|
+
private adminEventStreams;
|
|
108
|
+
/** Keepalive timer for admin event streams */
|
|
109
|
+
private adminEventKeepAliveTimer;
|
|
106
110
|
/** Number of in-flight /mcp requests */
|
|
107
111
|
private inflight;
|
|
108
112
|
/** Config file path for hot reload (null if not using config file) */
|
|
@@ -220,6 +224,10 @@ export declare class PayGateServer {
|
|
|
220
224
|
private handleWebhookReplay;
|
|
221
225
|
private handleGetMaintenance;
|
|
222
226
|
private handleSetMaintenance;
|
|
227
|
+
private handleAdminEventStream;
|
|
228
|
+
private handleGetNotes;
|
|
229
|
+
private handleAddNote;
|
|
230
|
+
private handleDeleteNote;
|
|
223
231
|
private handleConfigReload;
|
|
224
232
|
private handleWebhookStats;
|
|
225
233
|
private handleWebhookLog;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -221,6 +221,10 @@ class PayGateServer {
|
|
|
221
221
|
maintenanceMessage = 'Server is under maintenance';
|
|
222
222
|
/** Timestamp when maintenance mode was enabled */
|
|
223
223
|
maintenanceSince = null;
|
|
224
|
+
/** Active admin SSE event stream connections */
|
|
225
|
+
adminEventStreams = new Set();
|
|
226
|
+
/** Keepalive timer for admin event streams */
|
|
227
|
+
adminEventKeepAliveTimer = null;
|
|
224
228
|
/** Number of in-flight /mcp requests */
|
|
225
229
|
inflight = 0;
|
|
226
230
|
/** Config file path for hot reload (null if not using config file) */
|
|
@@ -267,6 +271,20 @@ class PayGateServer {
|
|
|
267
271
|
this.sessions = new session_1.SessionManager();
|
|
268
272
|
// Audit logger
|
|
269
273
|
this.audit = new audit_1.AuditLogger();
|
|
274
|
+
// Wire up admin event stream — broadcast every audit event to connected admin SSE clients
|
|
275
|
+
this.audit.onEvent = (event) => {
|
|
276
|
+
for (const client of this.adminEventStreams) {
|
|
277
|
+
try {
|
|
278
|
+
// Apply type filter if client specified one
|
|
279
|
+
if (client.types && !client.types.has(event.type))
|
|
280
|
+
continue;
|
|
281
|
+
client.res.write(`event: audit\ndata: ${JSON.stringify(event)}\n\n`);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// Connection died — will be cleaned up by 'close' handler
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
};
|
|
270
288
|
// Tool registry for pricing discovery
|
|
271
289
|
this.registry = new registry_1.ToolRegistry(this.config, !!this.oauth);
|
|
272
290
|
// Prometheus-compatible metrics
|
|
@@ -521,6 +539,16 @@ class PayGateServer {
|
|
|
521
539
|
return this.handleCloneKey(req, res);
|
|
522
540
|
case '/keys/alias':
|
|
523
541
|
return this.handleSetAlias(req, res);
|
|
542
|
+
case '/keys/notes':
|
|
543
|
+
if (req.method === 'GET')
|
|
544
|
+
return this.handleGetNotes(req, res);
|
|
545
|
+
if (req.method === 'POST')
|
|
546
|
+
return this.handleAddNote(req, res);
|
|
547
|
+
if (req.method === 'DELETE')
|
|
548
|
+
return this.handleDeleteNote(req, res);
|
|
549
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
550
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
551
|
+
return;
|
|
524
552
|
case '/keys/rotate':
|
|
525
553
|
return this.handleRotateKey(req, res);
|
|
526
554
|
case '/keys/acl':
|
|
@@ -671,6 +699,8 @@ class PayGateServer {
|
|
|
671
699
|
break;
|
|
672
700
|
case '/admin/keys/revoke':
|
|
673
701
|
return this.handleRevokeAdminKey(req, res);
|
|
702
|
+
case '/admin/events':
|
|
703
|
+
return this.handleAdminEventStream(req, res);
|
|
674
704
|
// ─── Plugin endpoints ──────────────────────────────────────────────
|
|
675
705
|
case '/plugins':
|
|
676
706
|
return this.handleListPlugins(req, res);
|
|
@@ -1155,6 +1185,8 @@ class PayGateServer {
|
|
|
1155
1185
|
configReload: 'POST /config/reload — Hot reload config from file (requires X-Admin-Key)',
|
|
1156
1186
|
configExport: 'GET /config — Export running config with sensitive values masked (requires X-Admin-Key)',
|
|
1157
1187
|
maintenance: 'GET /maintenance — Check status + POST to enable/disable maintenance mode (requires X-Admin-Key)',
|
|
1188
|
+
adminEvents: 'GET /admin/events — Real-time SSE stream of server events (requires X-Admin-Key, Accept: text/event-stream)',
|
|
1189
|
+
keyNotes: 'GET /keys/notes?key=... — List notes + POST to add + DELETE to remove (requires X-Admin-Key)',
|
|
1158
1190
|
...(this.oauth ? {
|
|
1159
1191
|
oauthMetadata: 'GET /.well-known/oauth-authorization-server — OAuth 2.1 server metadata',
|
|
1160
1192
|
oauthRegister: 'POST /oauth/register — Register OAuth client',
|
|
@@ -3877,6 +3909,182 @@ class PayGateServer {
|
|
|
3877
3909
|
}));
|
|
3878
3910
|
});
|
|
3879
3911
|
}
|
|
3912
|
+
// ─── /admin/events — Real-time SSE stream of server events ────────────────
|
|
3913
|
+
handleAdminEventStream(req, res) {
|
|
3914
|
+
if (req.method !== 'GET') {
|
|
3915
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
3916
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
3917
|
+
return;
|
|
3918
|
+
}
|
|
3919
|
+
if (!this.checkAdmin(req, res))
|
|
3920
|
+
return;
|
|
3921
|
+
const accept = req.headers['accept'] || '';
|
|
3922
|
+
if (!accept.includes('text/event-stream')) {
|
|
3923
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
3924
|
+
res.end(JSON.stringify({ error: 'Requires Accept: text/event-stream header' }));
|
|
3925
|
+
return;
|
|
3926
|
+
}
|
|
3927
|
+
// Parse optional type filter from query string
|
|
3928
|
+
const urlParts = req.url?.split('?') || [];
|
|
3929
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
3930
|
+
const typesParam = params.get('types');
|
|
3931
|
+
const typeFilter = typesParam ? new Set(typesParam.split(',').filter(Boolean)) : null;
|
|
3932
|
+
// Start SSE stream
|
|
3933
|
+
res.writeHead(200, {
|
|
3934
|
+
'Content-Type': 'text/event-stream',
|
|
3935
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
3936
|
+
'Connection': 'keep-alive',
|
|
3937
|
+
'X-Accel-Buffering': 'no',
|
|
3938
|
+
});
|
|
3939
|
+
// Send connected event
|
|
3940
|
+
res.write(`event: connected\ndata: ${JSON.stringify({ message: 'Admin event stream connected', filters: typesParam || 'all' })}\n\n`);
|
|
3941
|
+
// Register this connection
|
|
3942
|
+
const client = { res, types: typeFilter };
|
|
3943
|
+
this.adminEventStreams.add(client);
|
|
3944
|
+
// Start keepalive if this is the first connection
|
|
3945
|
+
if (!this.adminEventKeepAliveTimer && this.adminEventStreams.size === 1) {
|
|
3946
|
+
this.adminEventKeepAliveTimer = setInterval(() => {
|
|
3947
|
+
for (const c of this.adminEventStreams) {
|
|
3948
|
+
try {
|
|
3949
|
+
c.res.write(':keepalive\n\n');
|
|
3950
|
+
}
|
|
3951
|
+
catch { /* handled by close */ }
|
|
3952
|
+
}
|
|
3953
|
+
}, 15_000);
|
|
3954
|
+
this.adminEventKeepAliveTimer.unref();
|
|
3955
|
+
}
|
|
3956
|
+
// Cleanup on disconnect
|
|
3957
|
+
req.on('close', () => {
|
|
3958
|
+
this.adminEventStreams.delete(client);
|
|
3959
|
+
// Stop keepalive if no more connections
|
|
3960
|
+
if (this.adminEventStreams.size === 0 && this.adminEventKeepAliveTimer) {
|
|
3961
|
+
clearInterval(this.adminEventKeepAliveTimer);
|
|
3962
|
+
this.adminEventKeepAliveTimer = null;
|
|
3963
|
+
}
|
|
3964
|
+
});
|
|
3965
|
+
}
|
|
3966
|
+
// ─── /keys/notes — Timestamped notes on API keys ─────────────────────────
|
|
3967
|
+
handleGetNotes(req, res) {
|
|
3968
|
+
if (!this.checkAdmin(req, res))
|
|
3969
|
+
return;
|
|
3970
|
+
const urlParts = req.url?.split('?') || [];
|
|
3971
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
3972
|
+
const keyParam = params.get('key');
|
|
3973
|
+
if (!keyParam) {
|
|
3974
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
3975
|
+
res.end(JSON.stringify({ error: 'Missing required query parameter: key' }));
|
|
3976
|
+
return;
|
|
3977
|
+
}
|
|
3978
|
+
const record = this.gate.store.resolveKeyRaw(keyParam);
|
|
3979
|
+
if (!record) {
|
|
3980
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
3981
|
+
res.end(JSON.stringify({ error: 'Key not found' }));
|
|
3982
|
+
return;
|
|
3983
|
+
}
|
|
3984
|
+
const notes = record.notes || [];
|
|
3985
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
3986
|
+
res.end(JSON.stringify({ key: (0, audit_1.maskKeyForAudit)(record.key), notes, count: notes.length }));
|
|
3987
|
+
}
|
|
3988
|
+
handleAddNote(req, res) {
|
|
3989
|
+
if (!this.checkAdmin(req, res))
|
|
3990
|
+
return;
|
|
3991
|
+
let body = '';
|
|
3992
|
+
req.on('data', (chunk) => { body += chunk; });
|
|
3993
|
+
req.on('end', () => {
|
|
3994
|
+
let params;
|
|
3995
|
+
try {
|
|
3996
|
+
params = JSON.parse(body);
|
|
3997
|
+
}
|
|
3998
|
+
catch {
|
|
3999
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4000
|
+
res.end(JSON.stringify({ error: 'Invalid JSON body' }));
|
|
4001
|
+
return;
|
|
4002
|
+
}
|
|
4003
|
+
if (!params.key || typeof params.key !== 'string') {
|
|
4004
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4005
|
+
res.end(JSON.stringify({ error: 'Missing required field: key' }));
|
|
4006
|
+
return;
|
|
4007
|
+
}
|
|
4008
|
+
if (!params.text || typeof params.text !== 'string' || !params.text.trim()) {
|
|
4009
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4010
|
+
res.end(JSON.stringify({ error: 'Missing required field: text (non-empty string)' }));
|
|
4011
|
+
return;
|
|
4012
|
+
}
|
|
4013
|
+
if (params.text.length > 1000) {
|
|
4014
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4015
|
+
res.end(JSON.stringify({ error: 'Note text must be 1000 characters or less' }));
|
|
4016
|
+
return;
|
|
4017
|
+
}
|
|
4018
|
+
const record = this.gate.store.resolveKeyRaw(params.key);
|
|
4019
|
+
if (!record) {
|
|
4020
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
4021
|
+
res.end(JSON.stringify({ error: 'Key not found' }));
|
|
4022
|
+
return;
|
|
4023
|
+
}
|
|
4024
|
+
if (!record.notes)
|
|
4025
|
+
record.notes = [];
|
|
4026
|
+
// Cap at 50 notes per key
|
|
4027
|
+
if (record.notes.length >= 50) {
|
|
4028
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4029
|
+
res.end(JSON.stringify({ error: 'Maximum 50 notes per key reached. Delete old notes first.' }));
|
|
4030
|
+
return;
|
|
4031
|
+
}
|
|
4032
|
+
const note = {
|
|
4033
|
+
timestamp: new Date().toISOString(),
|
|
4034
|
+
author: 'admin',
|
|
4035
|
+
text: params.text.trim(),
|
|
4036
|
+
};
|
|
4037
|
+
record.notes.push(note);
|
|
4038
|
+
this.gate.store.save();
|
|
4039
|
+
this.audit.log('key.note_added', 'admin', `Note added to key`, {
|
|
4040
|
+
key: (0, audit_1.maskKeyForAudit)(record.key),
|
|
4041
|
+
text: note.text.slice(0, 100),
|
|
4042
|
+
});
|
|
4043
|
+
res.writeHead(201, { 'Content-Type': 'application/json' });
|
|
4044
|
+
res.end(JSON.stringify({ note, count: record.notes.length }));
|
|
4045
|
+
});
|
|
4046
|
+
}
|
|
4047
|
+
handleDeleteNote(req, res) {
|
|
4048
|
+
if (!this.checkAdmin(req, res))
|
|
4049
|
+
return;
|
|
4050
|
+
const urlParts = req.url?.split('?') || [];
|
|
4051
|
+
const params = new URLSearchParams(urlParts[1] || '');
|
|
4052
|
+
const keyParam = params.get('key');
|
|
4053
|
+
const indexParam = params.get('index');
|
|
4054
|
+
if (!keyParam) {
|
|
4055
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4056
|
+
res.end(JSON.stringify({ error: 'Missing required query parameter: key' }));
|
|
4057
|
+
return;
|
|
4058
|
+
}
|
|
4059
|
+
if (indexParam === null || indexParam === undefined) {
|
|
4060
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4061
|
+
res.end(JSON.stringify({ error: 'Missing required query parameter: index' }));
|
|
4062
|
+
return;
|
|
4063
|
+
}
|
|
4064
|
+
const record = this.gate.store.resolveKeyRaw(keyParam);
|
|
4065
|
+
if (!record) {
|
|
4066
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
4067
|
+
res.end(JSON.stringify({ error: 'Key not found' }));
|
|
4068
|
+
return;
|
|
4069
|
+
}
|
|
4070
|
+
const notes = record.notes || [];
|
|
4071
|
+
const index = parseInt(indexParam, 10);
|
|
4072
|
+
if (isNaN(index) || index < 0 || index >= notes.length) {
|
|
4073
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
4074
|
+
res.end(JSON.stringify({ error: `Invalid index: ${indexParam}. Must be 0-${notes.length - 1}` }));
|
|
4075
|
+
return;
|
|
4076
|
+
}
|
|
4077
|
+
const deleted = notes.splice(index, 1)[0];
|
|
4078
|
+
record.notes = notes;
|
|
4079
|
+
this.gate.store.save();
|
|
4080
|
+
this.audit.log('key.note_deleted', 'admin', `Note deleted from key`, {
|
|
4081
|
+
key: (0, audit_1.maskKeyForAudit)(record.key),
|
|
4082
|
+
text: deleted.text.slice(0, 100),
|
|
4083
|
+
index,
|
|
4084
|
+
});
|
|
4085
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
4086
|
+
res.end(JSON.stringify({ deleted, remaining: notes.length }));
|
|
4087
|
+
}
|
|
3880
4088
|
// ─── /config/reload — Hot reload configuration from file ─────────────────
|
|
3881
4089
|
async handleConfigReload(req, res) {
|
|
3882
4090
|
if (req.method !== 'POST') {
|
|
@@ -5368,6 +5576,18 @@ class PayGateServer {
|
|
|
5368
5576
|
});
|
|
5369
5577
|
}
|
|
5370
5578
|
async stop() {
|
|
5579
|
+
// Close admin event stream connections
|
|
5580
|
+
if (this.adminEventKeepAliveTimer) {
|
|
5581
|
+
clearInterval(this.adminEventKeepAliveTimer);
|
|
5582
|
+
this.adminEventKeepAliveTimer = null;
|
|
5583
|
+
}
|
|
5584
|
+
for (const client of this.adminEventStreams) {
|
|
5585
|
+
try {
|
|
5586
|
+
client.res.end();
|
|
5587
|
+
}
|
|
5588
|
+
catch { /* ignore */ }
|
|
5589
|
+
}
|
|
5590
|
+
this.adminEventStreams.clear();
|
|
5371
5591
|
// Plugin lifecycle: onStop (reverse order)
|
|
5372
5592
|
if (this.plugins.count > 0) {
|
|
5373
5593
|
await this.plugins.executeStop();
|