mcp-compose 0.0.8 → 0.1.1

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.
Files changed (41) hide show
  1. package/README.md +16 -14
  2. package/dist/bin/mcp-compose.js +8 -8
  3. package/dist/bin/mcp-compose.js.map +1 -1
  4. package/dist/bin/mcp-gateway.d.ts +3 -0
  5. package/dist/bin/mcp-gateway.d.ts.map +1 -0
  6. package/dist/bin/mcp-gateway.js +41 -0
  7. package/dist/bin/mcp-gateway.js.map +1 -0
  8. package/dist/package.json +4 -3
  9. package/dist/src/command.d.ts +4 -0
  10. package/dist/src/command.d.ts.map +1 -0
  11. package/dist/src/command.js +66 -0
  12. package/dist/src/command.js.map +1 -0
  13. package/dist/src/config.d.ts +2 -2
  14. package/dist/src/config.d.ts.map +1 -1
  15. package/dist/src/config.js +8 -18
  16. package/dist/src/config.js.map +1 -1
  17. package/dist/src/gateway.d.ts +22 -0
  18. package/dist/src/gateway.d.ts.map +1 -0
  19. package/dist/src/gateway.js +450 -0
  20. package/dist/src/gateway.js.map +1 -0
  21. package/dist/src/index.d.ts +3 -1
  22. package/dist/src/index.d.ts.map +1 -1
  23. package/dist/src/index.js +3 -1
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/oauth.d.ts +37 -0
  26. package/dist/src/oauth.d.ts.map +1 -0
  27. package/dist/src/oauth.js +317 -0
  28. package/dist/src/oauth.js.map +1 -0
  29. package/dist/src/pm2.d.ts +2 -2
  30. package/dist/src/pm2.d.ts.map +1 -1
  31. package/dist/src/pm2.js +17 -26
  32. package/dist/src/pm2.js.map +1 -1
  33. package/dist/src/sync.js +1 -1
  34. package/dist/src/sync.js.map +1 -1
  35. package/dist/src/types.d.ts +15 -2
  36. package/dist/src/types.d.ts.map +1 -1
  37. package/package.json +4 -3
  38. package/dist/src/supergateway.d.ts +0 -5
  39. package/dist/src/supergateway.d.ts.map +0 -1
  40. package/dist/src/supergateway.js +0 -61
  41. package/dist/src/supergateway.js.map +0 -1
@@ -0,0 +1,450 @@
1
+ import { createServer as createHttpServer } from 'node:http';
2
+ import { spawn } from 'node:child_process';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { OAuthClient } from './oauth.js';
5
+ // --- Helpers ---
6
+ const REQUEST_TIMEOUT_MS = 120_000;
7
+ const MAX_NOTIFICATION_BUFFER = 1000;
8
+ function isJsonRpcMessage(value) {
9
+ return typeof value === 'object' && value !== null && 'jsonrpc' in value;
10
+ }
11
+ function hasRequestId(msg) {
12
+ return msg.id !== undefined && msg.id !== null;
13
+ }
14
+ function readBody(req) {
15
+ return new Promise((resolve, reject) => {
16
+ const chunks = [];
17
+ req.on('data', (chunk) => { chunks.push(chunk); });
18
+ req.on('end', () => { resolve(Buffer.concat(chunks).toString('utf8')); });
19
+ req.on('error', reject);
20
+ });
21
+ }
22
+ function sendSSE(res, msg) {
23
+ res.write(`event: message\nid: ${randomUUID()}\ndata: ${JSON.stringify(msg)}\n\n`);
24
+ }
25
+ function makeErrorResponse(id, code, message) {
26
+ return JSON.stringify({ jsonrpc: '2.0', error: { code, message }, id });
27
+ }
28
+ // --- Stdio Backend ---
29
+ function createStdioBackend(command, logger) {
30
+ const child = spawn(command, { stdio: ['pipe', 'pipe', 'pipe'], shell: true });
31
+ // stdio: ['pipe','pipe','pipe'] guarantees non-null streams
32
+ if (!child.stdout || !child.stderr || !child.stdin) {
33
+ throw new Error('Failed to create stdio pipes');
34
+ }
35
+ const childStdout = child.stdout;
36
+ const childStderr = child.stderr;
37
+ const childStdin = child.stdin;
38
+ const pendingRequests = new Map();
39
+ let stdoutBuffer = '';
40
+ const backend = {
41
+ onServerMessage: null,
42
+ onClose: null,
43
+ sendRequest(msg) {
44
+ return new Promise((resolve) => {
45
+ const timer = setTimeout(() => {
46
+ pendingRequests.delete(msg.id);
47
+ resolve({ jsonrpc: '2.0', id: msg.id, error: { code: -32000, message: 'Request timeout' } });
48
+ }, REQUEST_TIMEOUT_MS);
49
+ pendingRequests.set(msg.id, { resolve, timer });
50
+ childStdin.write(JSON.stringify(msg) + '\n');
51
+ });
52
+ },
53
+ sendNotification(msg) {
54
+ childStdin.write(JSON.stringify(msg) + '\n');
55
+ },
56
+ close() {
57
+ for (const [, pending] of pendingRequests) {
58
+ clearTimeout(pending.timer);
59
+ }
60
+ pendingRequests.clear();
61
+ child.kill('SIGTERM');
62
+ },
63
+ };
64
+ childStdout.on('data', (chunk) => {
65
+ stdoutBuffer += chunk.toString('utf8');
66
+ const lines = stdoutBuffer.split(/\r?\n/);
67
+ stdoutBuffer = lines.pop() ?? '';
68
+ for (const line of lines) {
69
+ if (!line.trim())
70
+ continue;
71
+ try {
72
+ const parsed = JSON.parse(line);
73
+ if (!isJsonRpcMessage(parsed))
74
+ continue;
75
+ // Route response to pending request, or forward as server-initiated message
76
+ if (hasRequestId(parsed) && pendingRequests.has(parsed.id)) {
77
+ const pending = pendingRequests.get(parsed.id);
78
+ if (pending) {
79
+ pendingRequests.delete(parsed.id);
80
+ clearTimeout(pending.timer);
81
+ pending.resolve(parsed);
82
+ }
83
+ }
84
+ else {
85
+ backend.onServerMessage?.(parsed);
86
+ }
87
+ }
88
+ catch {
89
+ logger('debug', `Non-JSON stdout: ${line.slice(0, 200)}`);
90
+ }
91
+ }
92
+ });
93
+ childStderr.on('data', (chunk) => {
94
+ logger('debug', `stderr: ${chunk.toString('utf8').trimEnd()}`);
95
+ });
96
+ child.on('exit', (code, signal) => {
97
+ logger('info', `subprocess exited (code=${String(code)}, signal=${String(signal)})`);
98
+ for (const [, pending] of pendingRequests) {
99
+ clearTimeout(pending.timer);
100
+ pending.resolve({ jsonrpc: '2.0', error: { code: -32000, message: 'Server process exited' } });
101
+ }
102
+ pendingRequests.clear();
103
+ backend.onClose?.();
104
+ });
105
+ child.on('error', (err) => {
106
+ logger('info', `subprocess error: ${err.message}`);
107
+ });
108
+ return backend;
109
+ }
110
+ // --- Proxy Backend ---
111
+ /**
112
+ * Parse an SSE response from a remote MCP server.
113
+ * Returns the JSON-RPC response matching the request, and forwards
114
+ * any other messages (notifications) to the backend's onServerMessage.
115
+ */
116
+ async function parseSseResponse(res, originalMsg, backend) {
117
+ const text = await res.text();
118
+ const requestId = hasRequestId(originalMsg) ? originalMsg.id : null;
119
+ let response;
120
+ for (const block of text.split(/\n\n+/)) {
121
+ let data;
122
+ for (const line of block.split('\n')) {
123
+ if (line.startsWith('data: ')) {
124
+ data = line.slice(6);
125
+ }
126
+ else if (line.startsWith('data:')) {
127
+ data = line.slice(5);
128
+ }
129
+ }
130
+ if (!data?.trim())
131
+ continue;
132
+ try {
133
+ const parsed = JSON.parse(data);
134
+ if (!isJsonRpcMessage(parsed))
135
+ continue;
136
+ // Match response to our request by ID
137
+ if (requestId !== null && hasRequestId(parsed) && parsed.id === requestId) {
138
+ response = parsed;
139
+ }
140
+ else {
141
+ // Notification or other server-initiated message
142
+ backend.onServerMessage?.(parsed);
143
+ }
144
+ }
145
+ catch {
146
+ // skip non-JSON data lines
147
+ }
148
+ }
149
+ return response;
150
+ }
151
+ function createProxyBackend(remoteUrl, headers, oauthClient, logger) {
152
+ let remoteSessionId;
153
+ let accessToken;
154
+ async function forwardToRemote(msg, retryCount = 0) {
155
+ const reqHeaders = {
156
+ 'Content-Type': 'application/json',
157
+ 'Accept': 'application/json, text/event-stream',
158
+ ...headers,
159
+ };
160
+ if (accessToken) {
161
+ reqHeaders['Authorization'] = `Bearer ${accessToken}`;
162
+ }
163
+ if (remoteSessionId) {
164
+ reqHeaders['Mcp-Session-Id'] = remoteSessionId;
165
+ }
166
+ const res = await fetch(remoteUrl, {
167
+ method: 'POST',
168
+ headers: reqHeaders,
169
+ body: JSON.stringify(msg),
170
+ });
171
+ if (res.status === 401 && retryCount < 2) {
172
+ const wwwAuth = res.headers.get('www-authenticate') ?? undefined;
173
+ logger('info', 'Received 401, starting OAuth flow...');
174
+ accessToken = await oauthClient.handleUnauthorized(wwwAuth);
175
+ logger('info', 'OAuth completed, retrying request...');
176
+ return await forwardToRemote(msg, retryCount + 1);
177
+ }
178
+ const sessionHeader = res.headers.get('mcp-session-id');
179
+ if (sessionHeader) {
180
+ remoteSessionId = sessionHeader;
181
+ }
182
+ if (res.status === 202)
183
+ return undefined;
184
+ if (!res.ok) {
185
+ const text = await res.text();
186
+ logger('info', `Remote error: ${String(res.status)} ${text.slice(0, 200)}`);
187
+ return {
188
+ jsonrpc: '2.0',
189
+ id: hasRequestId(msg) ? msg.id : null,
190
+ error: { code: -32000, message: `Remote server error: ${String(res.status)}` },
191
+ };
192
+ }
193
+ const contentType = res.headers.get('content-type') ?? '';
194
+ // SSE response: parse events and extract JSON-RPC messages
195
+ if (contentType.includes('text/event-stream')) {
196
+ return await parseSseResponse(res, msg, backend);
197
+ }
198
+ return await res.json();
199
+ }
200
+ const backend = {
201
+ onServerMessage: null,
202
+ onClose: null,
203
+ async sendRequest(msg) {
204
+ const response = await forwardToRemote(msg);
205
+ return response ?? { jsonrpc: '2.0', id: msg.id, error: { code: -32000, message: 'No response from remote' } };
206
+ },
207
+ sendNotification(msg) {
208
+ void forwardToRemote(msg);
209
+ },
210
+ close() {
211
+ // Send DELETE to close remote session
212
+ if (remoteSessionId) {
213
+ const reqHeaders = { ...headers, 'Mcp-Session-Id': remoteSessionId };
214
+ if (accessToken)
215
+ reqHeaders['Authorization'] = `Bearer ${accessToken}`;
216
+ void fetch(remoteUrl, { method: 'DELETE', headers: reqHeaders }).catch(() => { });
217
+ }
218
+ },
219
+ };
220
+ return backend;
221
+ }
222
+ // --- Gateway ---
223
+ export function createGateway(options) {
224
+ const logLevel = options.logLevel ?? 'info';
225
+ const { port } = options;
226
+ const sessions = new Map();
227
+ function logger(level, msg) {
228
+ if (logLevel === 'none')
229
+ return;
230
+ if (logLevel === 'info' && level === 'debug')
231
+ return;
232
+ process.stderr.write(`[${new Date().toISOString()}] [${level}] ${msg}\n`);
233
+ }
234
+ // For proxy mode, share a single OAuthClient across all sessions
235
+ const sharedOAuthClient = options.mode === 'proxy'
236
+ ? new OAuthClient({ serverUrl: options.url, headers: options.headers ?? {} })
237
+ : undefined;
238
+ function createBackend() {
239
+ if (options.mode === 'stdio') {
240
+ return createStdioBackend(options.command, logger);
241
+ }
242
+ if (!sharedOAuthClient) {
243
+ throw new Error('OAuthClient not initialized for proxy mode');
244
+ }
245
+ return createProxyBackend(options.url, options.headers ?? {}, sharedOAuthClient, logger);
246
+ }
247
+ function createSession() {
248
+ const id = randomUUID();
249
+ const backend = createBackend();
250
+ const session = {
251
+ id,
252
+ backend,
253
+ sseResponses: new Set(),
254
+ notificationBuffer: [],
255
+ };
256
+ backend.onServerMessage = (msg) => {
257
+ if (session.sseResponses.size > 0) {
258
+ for (const sseRes of session.sseResponses) {
259
+ sendSSE(sseRes, msg);
260
+ }
261
+ }
262
+ else if (session.notificationBuffer.length < MAX_NOTIFICATION_BUFFER) {
263
+ session.notificationBuffer.push(msg);
264
+ }
265
+ };
266
+ backend.onClose = () => {
267
+ for (const sseRes of session.sseResponses) {
268
+ sseRes.end();
269
+ }
270
+ session.sseResponses.clear();
271
+ sessions.delete(id);
272
+ };
273
+ sessions.set(id, session);
274
+ logger('info', `Session ${id.slice(0, 8)} created`);
275
+ return session;
276
+ }
277
+ function destroySession(session) {
278
+ session.backend.close();
279
+ for (const sseRes of session.sseResponses) {
280
+ sseRes.end();
281
+ }
282
+ session.sseResponses.clear();
283
+ sessions.delete(session.id);
284
+ logger('info', `Session ${session.id.slice(0, 8)} destroyed`);
285
+ }
286
+ // --- HTTP handlers ---
287
+ async function handlePost(req, res) {
288
+ const body = await readBody(req);
289
+ let message;
290
+ try {
291
+ message = JSON.parse(body);
292
+ }
293
+ catch {
294
+ res.writeHead(400, { 'Content-Type': 'application/json' });
295
+ res.end(makeErrorResponse(null, -32700, 'Parse error'));
296
+ return;
297
+ }
298
+ if (!isJsonRpcMessage(message)) {
299
+ res.writeHead(400, { 'Content-Type': 'application/json' });
300
+ res.end(makeErrorResponse(null, -32600, 'Invalid Request'));
301
+ return;
302
+ }
303
+ if (message.method === 'initialize') {
304
+ const session = createSession();
305
+ if (hasRequestId(message)) {
306
+ const response = await session.backend.sendRequest(message);
307
+ res.writeHead(200, { 'Content-Type': 'application/json', 'Mcp-Session-Id': session.id });
308
+ res.end(JSON.stringify(response));
309
+ }
310
+ else {
311
+ session.backend.sendNotification(message);
312
+ res.writeHead(202, { 'Mcp-Session-Id': session.id });
313
+ res.end();
314
+ }
315
+ return;
316
+ }
317
+ const sessionId = req.headers['mcp-session-id'];
318
+ if (typeof sessionId !== 'string') {
319
+ res.writeHead(400, { 'Content-Type': 'application/json' });
320
+ res.end(makeErrorResponse(message.id ?? null, -32000, 'Missing Mcp-Session-Id header'));
321
+ return;
322
+ }
323
+ const session = sessions.get(sessionId);
324
+ if (!session) {
325
+ res.writeHead(404, { 'Content-Type': 'application/json' });
326
+ res.end(makeErrorResponse(message.id ?? null, -32000, 'Session not found or expired'));
327
+ return;
328
+ }
329
+ if (hasRequestId(message) && message.method !== undefined) {
330
+ const response = await session.backend.sendRequest(message);
331
+ res.writeHead(200, { 'Content-Type': 'application/json', 'Mcp-Session-Id': sessionId });
332
+ res.end(JSON.stringify(response));
333
+ return;
334
+ }
335
+ session.backend.sendNotification(message);
336
+ res.writeHead(202);
337
+ res.end();
338
+ }
339
+ function handleGet(req, res) {
340
+ const sessionId = req.headers['mcp-session-id'];
341
+ if (typeof sessionId !== 'string') {
342
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
343
+ res.end('Missing Mcp-Session-Id header');
344
+ return;
345
+ }
346
+ const session = sessions.get(sessionId);
347
+ if (!session) {
348
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
349
+ res.end('Session not found');
350
+ return;
351
+ }
352
+ res.writeHead(200, {
353
+ 'Content-Type': 'text/event-stream',
354
+ 'Cache-Control': 'no-cache',
355
+ 'Connection': 'keep-alive',
356
+ 'X-Accel-Buffering': 'no',
357
+ });
358
+ session.sseResponses.add(res);
359
+ for (const msg of session.notificationBuffer) {
360
+ sendSSE(res, msg);
361
+ }
362
+ session.notificationBuffer = [];
363
+ req.on('close', () => { session.sseResponses.delete(res); });
364
+ }
365
+ function handleDelete(req, res) {
366
+ const sessionId = req.headers['mcp-session-id'];
367
+ if (typeof sessionId !== 'string') {
368
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
369
+ res.end('Missing Mcp-Session-Id header');
370
+ return;
371
+ }
372
+ const session = sessions.get(sessionId);
373
+ if (!session) {
374
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
375
+ res.end('Session not found');
376
+ return;
377
+ }
378
+ destroySession(session);
379
+ res.writeHead(200);
380
+ res.end();
381
+ }
382
+ // --- HTTP server ---
383
+ const httpServer = createHttpServer((req, res) => {
384
+ res.setHeader('Access-Control-Allow-Origin', '*');
385
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
386
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID');
387
+ res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
388
+ if (req.method === 'OPTIONS') {
389
+ res.writeHead(204);
390
+ res.end();
391
+ return;
392
+ }
393
+ const urlPath = new URL(req.url ?? '/', `http://localhost:${String(port)}`).pathname;
394
+ if (urlPath === '/health' || urlPath === '/healthz') {
395
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
396
+ res.end('ok');
397
+ return;
398
+ }
399
+ if (urlPath !== '/mcp') {
400
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
401
+ res.end('Not Found');
402
+ return;
403
+ }
404
+ const dispatch = async () => {
405
+ switch (req.method) {
406
+ case 'POST':
407
+ await handlePost(req, res);
408
+ break;
409
+ case 'GET':
410
+ handleGet(req, res);
411
+ break;
412
+ case 'DELETE':
413
+ handleDelete(req, res);
414
+ break;
415
+ default:
416
+ res.writeHead(405, { 'Content-Type': 'text/plain' });
417
+ res.end('Method Not Allowed');
418
+ }
419
+ };
420
+ dispatch().catch((err) => {
421
+ const errMsg = err instanceof Error ? err.message : String(err);
422
+ logger('info', `Error: ${req.method ?? '?'} ${urlPath}: ${errMsg}`);
423
+ if (!res.headersSent) {
424
+ res.writeHead(500, { 'Content-Type': 'application/json' });
425
+ res.end(makeErrorResponse(null, -32603, 'Internal error'));
426
+ }
427
+ });
428
+ });
429
+ return {
430
+ start() {
431
+ return new Promise((resolve, reject) => {
432
+ httpServer.once('error', reject);
433
+ httpServer.listen(port, '127.0.0.1', () => {
434
+ httpServer.removeListener('error', reject);
435
+ logger('info', `Gateway listening on http://127.0.0.1:${String(port)}/mcp`);
436
+ resolve();
437
+ });
438
+ });
439
+ },
440
+ stop() {
441
+ return new Promise((resolve) => {
442
+ for (const session of sessions.values()) {
443
+ destroySession(session);
444
+ }
445
+ httpServer.close(() => { resolve(); });
446
+ });
447
+ },
448
+ };
449
+ }
450
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  export type * from './types.js';
2
2
  export * from './config.js';
3
+ export * from './gateway.js';
4
+ export * from './oauth.js';
3
5
  export * from './pm2.js';
4
- export * from './supergateway.js';
6
+ export * from './command.js';
5
7
  export * from './sync.js';
6
8
  export * from './validation.js';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from './config.js';
2
+ export * from './gateway.js';
3
+ export * from './oauth.js';
2
4
  export * from './pm2.js';
3
- export * from './supergateway.js';
5
+ export * from './command.js';
4
6
  export * from './sync.js';
5
7
  export * from './validation.js';
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface OAuthTokens {
2
+ access_token: string;
3
+ token_type: string;
4
+ expires_in?: number;
5
+ refresh_token?: string;
6
+ scope?: string;
7
+ }
8
+ export interface OAuthClientOptions {
9
+ serverUrl: string;
10
+ headers?: Record<string, string>;
11
+ authTimeout?: number;
12
+ }
13
+ export declare class OAuthClient {
14
+ private readonly hash;
15
+ private readonly serverUrl;
16
+ private readonly headers;
17
+ private readonly authTimeout;
18
+ private stored;
19
+ private authServerUrl;
20
+ private authServerMetadata;
21
+ /** Deduplicates concurrent handleUnauthorized() calls into a single auth flow. */
22
+ private pendingAuth;
23
+ constructor(options: OAuthClientOptions);
24
+ /**
25
+ * Get a valid access token, loading from disk cache if available.
26
+ */
27
+ getAccessToken(): Promise<string | undefined>;
28
+ /**
29
+ * Handle a 401 response from the remote server.
30
+ * Deduplicates concurrent calls — only one auth flow runs at a time;
31
+ * subsequent callers wait for the same result.
32
+ */
33
+ handleUnauthorized(wwwAuthenticate?: string): Promise<string>;
34
+ private executeAuthFlow;
35
+ private discover;
36
+ }
37
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/oauth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8BD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+QD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,kFAAkF;IAClF,OAAO,CAAC,WAAW,CAAgC;gBAEvC,OAAO,EAAE,kBAAkB;IAOvC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKnD;;;;OAIG;IACG,kBAAkB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAarD,eAAe;YAqFf,QAAQ;CAQvB"}