@n24q02m/mcp-core 1.0.0-beta.3 → 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.
Files changed (40) hide show
  1. package/build/auth/credential-form.d.ts +45 -0
  2. package/build/auth/credential-form.d.ts.map +1 -0
  3. package/build/auth/credential-form.js +668 -0
  4. package/build/auth/credential-form.js.map +1 -0
  5. package/build/auth/delegated-oauth-app.d.ts +53 -0
  6. package/build/auth/delegated-oauth-app.d.ts.map +1 -0
  7. package/build/auth/delegated-oauth-app.js +531 -0
  8. package/build/auth/delegated-oauth-app.js.map +1 -0
  9. package/build/auth/index.d.ts +10 -0
  10. package/build/auth/index.d.ts.map +1 -0
  11. package/build/auth/index.js +10 -0
  12. package/build/auth/index.js.map +1 -0
  13. package/build/auth/local-oauth-app.d.ts +83 -0
  14. package/build/auth/local-oauth-app.d.ts.map +1 -0
  15. package/build/auth/local-oauth-app.js +355 -0
  16. package/build/auth/local-oauth-app.js.map +1 -0
  17. package/build/auth/router.d.ts +18 -0
  18. package/build/auth/router.d.ts.map +1 -0
  19. package/build/auth/router.js +62 -0
  20. package/build/auth/router.js.map +1 -0
  21. package/build/auth/well-known.d.ts +4 -0
  22. package/build/auth/well-known.d.ts.map +1 -0
  23. package/build/auth/well-known.js +20 -0
  24. package/build/auth/well-known.js.map +1 -0
  25. package/build/index.d.ts +3 -1
  26. package/build/index.d.ts.map +1 -1
  27. package/build/index.js +5 -1
  28. package/build/index.js.map +1 -1
  29. package/build/relay/browser.d.ts.map +1 -1
  30. package/build/relay/browser.js +10 -0
  31. package/build/relay/browser.js.map +1 -1
  32. package/build/storage/config-file.d.ts +10 -0
  33. package/build/storage/config-file.d.ts.map +1 -1
  34. package/build/storage/config-file.js +20 -7
  35. package/build/storage/config-file.js.map +1 -1
  36. package/build/transport/local-server.d.ts +67 -0
  37. package/build/transport/local-server.d.ts.map +1 -0
  38. package/build/transport/local-server.js +131 -0
  39. package/build/transport/local-server.js.map +1 -0
  40. package/package.json +5 -1
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Delegated OAuth 2.1 Authorization Server as an HTTP request handler.
3
+ *
4
+ * Unified abstraction for upstream OAuth providers. Fronts two upstream
5
+ * flows behind a single local OAuth 2.1 PKCE facade for the MCP client:
6
+ *
7
+ * - ``redirect`` flow -- classic authorization_code redirect (Notion,
8
+ * Grafana, GitHub, ...). The local server proxies ``/authorize`` to the
9
+ * upstream authorize endpoint, handles the callback, exchanges the
10
+ * upstream code for upstream tokens via ``upstream.tokenUrl``, forwards
11
+ * the tokens to the consumer via ``onTokenReceived``, then finishes the
12
+ * local PKCE exchange so the MCP client receives a local JWT.
13
+ * - ``device_code`` flow (RFC 8628) -- used by GDrive, Outlook, etc. The
14
+ * local server initiates the upstream device authorization, renders a
15
+ * page showing ``user_code`` + ``verification_url``, runs a background
16
+ * polling task on ``upstream.tokenUrl`` until the upstream grants a
17
+ * token, invokes ``onTokenReceived``, and signals completion via the
18
+ * setup-status endpoint.
19
+ *
20
+ * This is a TypeScript port of core-py's ``delegated_oauth_app.py``.
21
+ * Behavior, protocol, and TTL constants are kept identical for parity.
22
+ */
23
+ import { JWTIssuer } from '../oauth/jwt-issuer.js';
24
+ import { type RequestHandler } from './router.js';
25
+ export type FlowType = 'device_code' | 'redirect';
26
+ export interface UpstreamOAuthConfig {
27
+ tokenUrl: string;
28
+ clientId: string;
29
+ clientSecret?: string;
30
+ scopes?: string[];
31
+ authorizeUrl?: string;
32
+ callbackPath?: string;
33
+ deviceAuthUrl?: string;
34
+ pollIntervalMs?: number;
35
+ }
36
+ export type OAuthTokens = Record<string, unknown>;
37
+ export type TokenCallback = (tokens: OAuthTokens) => void | Promise<void>;
38
+ export interface DelegatedOAuthAppOptions {
39
+ serverName: string;
40
+ flow: FlowType;
41
+ upstream: UpstreamOAuthConfig;
42
+ onTokenReceived: TokenCallback;
43
+ jwtIssuer?: JWTIssuer;
44
+ }
45
+ export interface DelegatedOAuthAppResult {
46
+ handler: RequestHandler;
47
+ jwtIssuer: JWTIssuer;
48
+ markSetupComplete: (key?: string) => void;
49
+ /** Shut down background polling tasks (device_code flow). */
50
+ shutdown: () => Promise<void>;
51
+ }
52
+ export declare function createDelegatedOAuthApp(options: DelegatedOAuthAppOptions): Promise<DelegatedOAuthAppResult>;
53
+ //# sourceMappingURL=delegated-oauth-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegated-oauth-app.d.ts","sourceRoot":"","sources":["../../src/auth/delegated-oauth-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAA2D,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAG1G,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAA;AAEjD,MAAM,WAAW,mBAAmB;IAElC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IAEjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAEzE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,mBAAmB,CAAA;IAC7B,eAAe,EAAE,aAAa,CAAA;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,SAAS,CAAA;IACpB,iBAAiB,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAiHD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmdjH"}
@@ -0,0 +1,531 @@
1
+ /**
2
+ * Delegated OAuth 2.1 Authorization Server as an HTTP request handler.
3
+ *
4
+ * Unified abstraction for upstream OAuth providers. Fronts two upstream
5
+ * flows behind a single local OAuth 2.1 PKCE facade for the MCP client:
6
+ *
7
+ * - ``redirect`` flow -- classic authorization_code redirect (Notion,
8
+ * Grafana, GitHub, ...). The local server proxies ``/authorize`` to the
9
+ * upstream authorize endpoint, handles the callback, exchanges the
10
+ * upstream code for upstream tokens via ``upstream.tokenUrl``, forwards
11
+ * the tokens to the consumer via ``onTokenReceived``, then finishes the
12
+ * local PKCE exchange so the MCP client receives a local JWT.
13
+ * - ``device_code`` flow (RFC 8628) -- used by GDrive, Outlook, etc. The
14
+ * local server initiates the upstream device authorization, renders a
15
+ * page showing ``user_code`` + ``verification_url``, runs a background
16
+ * polling task on ``upstream.tokenUrl`` until the upstream grants a
17
+ * token, invokes ``onTokenReceived``, and signals completion via the
18
+ * setup-status endpoint.
19
+ *
20
+ * This is a TypeScript port of core-py's ``delegated_oauth_app.py``.
21
+ * Behavior, protocol, and TTL constants are kept identical for parity.
22
+ */
23
+ import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
24
+ import { JWTIssuer } from '../oauth/jwt-issuer.js';
25
+ import { createRouter, htmlResponse, jsonResponse, parseFormBody } from './router.js';
26
+ import { authorizationServerMetadata, protectedResourceMetadata } from './well-known.js';
27
+ const AUTH_CODE_TTL_S = 600;
28
+ const SESSION_TTL_S = 600;
29
+ function s256Verify(codeVerifier, codeChallenge) {
30
+ const computed = createHash('sha256').update(codeVerifier, 'ascii').digest('base64url');
31
+ if (computed.length !== codeChallenge.length)
32
+ return false;
33
+ try {
34
+ return timingSafeEqual(Buffer.from(computed, 'ascii'), Buffer.from(codeChallenge, 'ascii'));
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ function pruneExpired(store, ttlMs) {
41
+ const now = Date.now();
42
+ for (const [key, value] of store) {
43
+ if (now - value.createdAt > ttlMs)
44
+ store.delete(key);
45
+ }
46
+ }
47
+ function getBaseUrl(req) {
48
+ const host = req.headers.host ?? 'localhost';
49
+ const encrypted = req.socket.encrypted === true;
50
+ const forwardedProto = req.headers['x-forwarded-proto'];
51
+ const protocol = typeof forwardedProto === 'string' && forwardedProto.length > 0
52
+ ? forwardedProto.split(',')[0].trim()
53
+ : encrypted
54
+ ? 'https'
55
+ : 'http';
56
+ return `${protocol}://${host}`;
57
+ }
58
+ function escapeHtml(value) {
59
+ return value
60
+ .replace(/&/g, '&amp;')
61
+ .replace(/</g, '&lt;')
62
+ .replace(/>/g, '&gt;')
63
+ .replace(/"/g, '&quot;')
64
+ .replace(/'/g, '&#39;');
65
+ }
66
+ function renderDeviceCodePage(opts) {
67
+ const safeName = escapeHtml(opts.serverName);
68
+ const safeCode = escapeHtml(opts.userCode);
69
+ const safeUrl = escapeHtml(opts.verificationUrl);
70
+ return `<!DOCTYPE html>
71
+ <html lang="en">
72
+ <head>
73
+ <meta charset="utf-8" />
74
+ <title>Authorize ${safeName}</title>
75
+ <style>
76
+ body { font-family: system-ui, sans-serif; background: #0d0d0d; color: #eee;
77
+ display: flex; align-items: center; justify-content: center;
78
+ min-height: 100vh; margin: 0; }
79
+ .card { background: #181818; padding: 2rem 3rem; border-radius: 12px;
80
+ border: 1px solid #333; max-width: 480px; text-align: center; }
81
+ h1 { margin-top: 0; }
82
+ .code { font-size: 2rem; font-family: ui-monospace, monospace;
83
+ letter-spacing: 0.25em; padding: 1rem 1.5rem; background: #000;
84
+ border-radius: 8px; border: 1px solid #444; margin: 1.5rem 0; }
85
+ a { color: #4ea1ff; }
86
+ .status { margin-top: 1.5rem; color: #888; font-size: 0.9rem; }
87
+ </style>
88
+ </head>
89
+ <body>
90
+ <div class="card">
91
+ <h1>Authorize ${safeName}</h1>
92
+ <p>Visit the URL below and enter this code:</p>
93
+ <div class="code">${safeCode}</div>
94
+ <p><a href="${safeUrl}" target="_blank" rel="noopener noreferrer">${safeUrl}</a></p>
95
+ <p class="status" id="status">Waiting for you to approve...</p>
96
+ </div>
97
+ <script>
98
+ async function poll() {
99
+ try {
100
+ const r = await fetch('/setup-status');
101
+ const j = await r.json();
102
+ const s = j[Object.keys(j)[0]] || 'idle';
103
+ if (s === 'complete') {
104
+ document.getElementById('status').textContent = 'Authorized! You can close this window.';
105
+ return;
106
+ }
107
+ if (s === 'error') {
108
+ document.getElementById('status').textContent = 'Authorization failed. Please restart.';
109
+ return;
110
+ }
111
+ } catch (e) {}
112
+ setTimeout(poll, 2000);
113
+ }
114
+ poll();
115
+ </script>
116
+ </body>
117
+ </html>`;
118
+ }
119
+ export async function createDelegatedOAuthApp(options) {
120
+ if (options.flow === 'redirect' && !options.upstream.authorizeUrl) {
121
+ throw new Error('authorizeUrl is required for redirect flow');
122
+ }
123
+ if (options.flow === 'device_code' && !options.upstream.deviceAuthUrl) {
124
+ throw new Error('deviceAuthUrl is required for device_code flow');
125
+ }
126
+ const jwtIssuer = options.jwtIssuer ?? new JWTIssuer(options.serverName);
127
+ await jwtIssuer.init();
128
+ const pendingSessions = new Map();
129
+ const authCodes = new Map();
130
+ const setupStatus = { [options.serverName]: 'idle' };
131
+ // Each entry: AbortController for the background poll loop.
132
+ const pollControllers = new Set();
133
+ const callbackPath = options.upstream.callbackPath ?? '/callback';
134
+ function markSetupComplete(key) {
135
+ setupStatus[key ?? options.serverName] = 'complete';
136
+ }
137
+ function markSetupError(key) {
138
+ setupStatus[key ?? options.serverName] = 'error';
139
+ }
140
+ async function invokeTokenCallback(tokens) {
141
+ await options.onTokenReceived(tokens);
142
+ }
143
+ // ------------------------------------------------------------------
144
+ // Redirect flow
145
+ // ------------------------------------------------------------------
146
+ async function authorizeRedirect(req, res) {
147
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
148
+ const p = url.searchParams;
149
+ const clientId = p.get('client_id');
150
+ const redirectUri = p.get('redirect_uri');
151
+ const state = p.get('state');
152
+ const codeChallenge = p.get('code_challenge');
153
+ const codeChallengeMethod = p.get('code_challenge_method') ?? 'S256';
154
+ if (!clientId || !redirectUri || !state || !codeChallenge) {
155
+ jsonResponse(res, 400, {
156
+ error: 'invalid_request',
157
+ error_description: 'Missing required parameters'
158
+ });
159
+ return;
160
+ }
161
+ const nonce = randomBytes(32).toString('base64url');
162
+ pendingSessions.set(nonce, {
163
+ clientId,
164
+ redirectUri,
165
+ state,
166
+ codeChallenge,
167
+ codeChallengeMethod,
168
+ createdAt: Date.now()
169
+ });
170
+ pruneExpired(pendingSessions, SESSION_TTL_S * 1000);
171
+ const base = getBaseUrl(req);
172
+ const qs = new URLSearchParams({
173
+ client_id: options.upstream.clientId,
174
+ redirect_uri: `${base}${callbackPath}`,
175
+ response_type: 'code',
176
+ state: nonce
177
+ });
178
+ if (options.upstream.scopes && options.upstream.scopes.length > 0) {
179
+ qs.set('scope', options.upstream.scopes.join(' '));
180
+ }
181
+ const authorizeUrl = options.upstream.authorizeUrl;
182
+ const separator = authorizeUrl.includes('?') ? '&' : '?';
183
+ const target = `${authorizeUrl}${separator}${qs.toString()}`;
184
+ res.writeHead(302, { Location: target });
185
+ res.end();
186
+ }
187
+ async function callback(req, res) {
188
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
189
+ const code = url.searchParams.get('code');
190
+ const state = url.searchParams.get('state');
191
+ if (!code || !state) {
192
+ jsonResponse(res, 400, {
193
+ error: 'invalid_request',
194
+ error_description: 'Missing code or state'
195
+ });
196
+ return;
197
+ }
198
+ const session = pendingSessions.get(state);
199
+ if (session === undefined) {
200
+ jsonResponse(res, 400, { error: 'invalid_request', error_description: 'Invalid state' });
201
+ return;
202
+ }
203
+ pendingSessions.delete(state);
204
+ if (Date.now() - session.createdAt > SESSION_TTL_S * 1000) {
205
+ jsonResponse(res, 400, { error: 'invalid_request', error_description: 'Session expired' });
206
+ return;
207
+ }
208
+ const base = getBaseUrl(req);
209
+ const form = new URLSearchParams({
210
+ grant_type: 'authorization_code',
211
+ code,
212
+ client_id: options.upstream.clientId,
213
+ redirect_uri: `${base}${callbackPath}`
214
+ });
215
+ if (options.upstream.clientSecret) {
216
+ form.set('client_secret', options.upstream.clientSecret);
217
+ }
218
+ let upstreamResp;
219
+ try {
220
+ upstreamResp = await fetch(options.upstream.tokenUrl, {
221
+ method: 'POST',
222
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
223
+ body: form.toString()
224
+ });
225
+ }
226
+ catch {
227
+ jsonResponse(res, 502, {
228
+ error: 'server_error',
229
+ error_description: 'Upstream token exchange failed'
230
+ });
231
+ return;
232
+ }
233
+ if (!upstreamResp.ok) {
234
+ const text = await upstreamResp.text().catch(() => '');
235
+ jsonResponse(res, 400, {
236
+ error: 'invalid_grant',
237
+ error_description: `Upstream rejected token exchange: ${text}`
238
+ });
239
+ return;
240
+ }
241
+ let tokens;
242
+ try {
243
+ tokens = (await upstreamResp.json());
244
+ }
245
+ catch {
246
+ jsonResponse(res, 502, {
247
+ error: 'server_error',
248
+ error_description: 'Upstream returned invalid JSON'
249
+ });
250
+ return;
251
+ }
252
+ try {
253
+ await invokeTokenCallback(tokens);
254
+ }
255
+ catch {
256
+ jsonResponse(res, 500, {
257
+ error: 'server_error',
258
+ error_description: 'Failed to persist tokens'
259
+ });
260
+ return;
261
+ }
262
+ const authCode = randomBytes(32).toString('base64url');
263
+ authCodes.set(authCode, {
264
+ codeChallenge: session.codeChallenge,
265
+ codeChallengeMethod: session.codeChallengeMethod,
266
+ createdAt: Date.now()
267
+ });
268
+ pruneExpired(authCodes, AUTH_CODE_TTL_S * 1000);
269
+ const separator = session.redirectUri.includes('?') ? '&' : '?';
270
+ const redirectUrl = `${session.redirectUri}${separator}code=${authCode}&state=${session.state}`;
271
+ res.writeHead(302, { Location: redirectUrl });
272
+ res.end();
273
+ }
274
+ // ------------------------------------------------------------------
275
+ // Device code flow
276
+ // ------------------------------------------------------------------
277
+ async function pollDeviceToken(deviceCode, initialIntervalMs, controller) {
278
+ let intervalMs = Math.max(initialIntervalMs, 0);
279
+ const body = new URLSearchParams({
280
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
281
+ device_code: deviceCode,
282
+ client_id: options.upstream.clientId
283
+ });
284
+ if (options.upstream.clientSecret) {
285
+ body.set('client_secret', options.upstream.clientSecret);
286
+ }
287
+ while (!controller.signal.aborted) {
288
+ await new Promise((resolve) => {
289
+ const t = setTimeout(resolve, intervalMs);
290
+ controller.signal.addEventListener('abort', () => {
291
+ clearTimeout(t);
292
+ resolve();
293
+ }, { once: true });
294
+ });
295
+ if (controller.signal.aborted)
296
+ return;
297
+ let resp;
298
+ try {
299
+ resp = await fetch(options.upstream.tokenUrl, {
300
+ method: 'POST',
301
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
302
+ body: body.toString(),
303
+ signal: controller.signal
304
+ });
305
+ }
306
+ catch {
307
+ if (controller.signal.aborted)
308
+ return;
309
+ markSetupError();
310
+ return;
311
+ }
312
+ if (resp.ok) {
313
+ let tokens;
314
+ try {
315
+ tokens = (await resp.json());
316
+ }
317
+ catch {
318
+ markSetupError();
319
+ return;
320
+ }
321
+ try {
322
+ await invokeTokenCallback(tokens);
323
+ }
324
+ catch {
325
+ markSetupError();
326
+ return;
327
+ }
328
+ markSetupComplete();
329
+ return;
330
+ }
331
+ let errBody;
332
+ try {
333
+ errBody = (await resp.json());
334
+ }
335
+ catch {
336
+ markSetupError();
337
+ return;
338
+ }
339
+ const err = errBody.error;
340
+ if (err === 'authorization_pending')
341
+ continue;
342
+ if (err === 'slow_down') {
343
+ intervalMs += 5000;
344
+ continue;
345
+ }
346
+ markSetupError();
347
+ return;
348
+ }
349
+ }
350
+ async function authorizeDeviceCode(req, res) {
351
+ const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
352
+ const p = url.searchParams;
353
+ const clientId = p.get('client_id');
354
+ const redirectUri = p.get('redirect_uri');
355
+ const state = p.get('state');
356
+ const codeChallenge = p.get('code_challenge');
357
+ const codeChallengeMethod = p.get('code_challenge_method') ?? 'S256';
358
+ if (!clientId || !redirectUri || !state || !codeChallenge) {
359
+ jsonResponse(res, 400, {
360
+ error: 'invalid_request',
361
+ error_description: 'Missing required parameters'
362
+ });
363
+ return;
364
+ }
365
+ // Initiate upstream device authorization.
366
+ const body = new URLSearchParams({ client_id: options.upstream.clientId });
367
+ if (options.upstream.scopes && options.upstream.scopes.length > 0) {
368
+ body.set('scope', options.upstream.scopes.join(' '));
369
+ }
370
+ let upstreamResp;
371
+ try {
372
+ upstreamResp = await fetch(options.upstream.deviceAuthUrl, {
373
+ method: 'POST',
374
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
375
+ body: body.toString()
376
+ });
377
+ }
378
+ catch {
379
+ jsonResponse(res, 502, {
380
+ error: 'server_error',
381
+ error_description: 'Upstream device auth failed'
382
+ });
383
+ return;
384
+ }
385
+ if (!upstreamResp.ok) {
386
+ const text = await upstreamResp.text().catch(() => '');
387
+ jsonResponse(res, 502, {
388
+ error: 'server_error',
389
+ error_description: `Upstream device auth rejected: ${text}`
390
+ });
391
+ return;
392
+ }
393
+ let device;
394
+ try {
395
+ device = (await upstreamResp.json());
396
+ }
397
+ catch {
398
+ jsonResponse(res, 502, {
399
+ error: 'server_error',
400
+ error_description: 'Upstream device auth returned invalid JSON'
401
+ });
402
+ return;
403
+ }
404
+ const deviceCode = typeof device.device_code === 'string' ? device.device_code : undefined;
405
+ const userCode = typeof device.user_code === 'string' ? device.user_code : undefined;
406
+ const verificationUrl = typeof device.verification_url === 'string'
407
+ ? device.verification_url
408
+ : typeof device.verification_uri === 'string'
409
+ ? device.verification_uri
410
+ : undefined;
411
+ const intervalSecs = typeof device.interval === 'number'
412
+ ? device.interval
413
+ : Math.max((options.upstream.pollIntervalMs ?? 5000) / 1000, 1);
414
+ if (!deviceCode || !userCode || !verificationUrl) {
415
+ jsonResponse(res, 502, {
416
+ error: 'server_error',
417
+ error_description: 'Upstream device auth response missing fields'
418
+ });
419
+ return;
420
+ }
421
+ // Pre-allocate auth code so /token can complete once polling succeeds.
422
+ const authCode = randomBytes(32).toString('base64url');
423
+ authCodes.set(authCode, {
424
+ codeChallenge,
425
+ codeChallengeMethod,
426
+ createdAt: Date.now()
427
+ });
428
+ pruneExpired(authCodes, AUTH_CODE_TTL_S * 1000);
429
+ setupStatus[options.serverName] = 'pending';
430
+ const controller = new AbortController();
431
+ pollControllers.add(controller);
432
+ // Run in background; intentionally not awaited.
433
+ pollDeviceToken(deviceCode, intervalSecs * 1000, controller).finally(() => {
434
+ pollControllers.delete(controller);
435
+ });
436
+ htmlResponse(res, 200, renderDeviceCodePage({
437
+ serverName: options.serverName,
438
+ userCode,
439
+ verificationUrl
440
+ }));
441
+ }
442
+ // ------------------------------------------------------------------
443
+ // Shared endpoints
444
+ // ------------------------------------------------------------------
445
+ async function authorize(req, res) {
446
+ if (options.flow === 'redirect') {
447
+ await authorizeRedirect(req, res);
448
+ return;
449
+ }
450
+ await authorizeDeviceCode(req, res);
451
+ }
452
+ async function token(req, res) {
453
+ let form;
454
+ try {
455
+ form = await parseFormBody(req);
456
+ }
457
+ catch {
458
+ jsonResponse(res, 400, { error: 'invalid_request' });
459
+ return;
460
+ }
461
+ if (form.grant_type !== 'authorization_code') {
462
+ jsonResponse(res, 400, { error: 'unsupported_grant_type' });
463
+ return;
464
+ }
465
+ const code = form.code;
466
+ const codeVerifier = form.code_verifier;
467
+ if (!code || !codeVerifier) {
468
+ jsonResponse(res, 400, {
469
+ error: 'invalid_request',
470
+ error_description: 'Missing code or code_verifier'
471
+ });
472
+ return;
473
+ }
474
+ const entry = authCodes.get(code);
475
+ if (entry === undefined) {
476
+ jsonResponse(res, 400, { error: 'invalid_grant' });
477
+ return;
478
+ }
479
+ authCodes.delete(code);
480
+ if (Date.now() - entry.createdAt > AUTH_CODE_TTL_S * 1000) {
481
+ jsonResponse(res, 400, { error: 'invalid_grant' });
482
+ return;
483
+ }
484
+ if (entry.codeChallengeMethod !== 'S256') {
485
+ jsonResponse(res, 400, {
486
+ error: 'invalid_request',
487
+ error_description: 'Only S256 is supported'
488
+ });
489
+ return;
490
+ }
491
+ if (!s256Verify(codeVerifier, entry.codeChallenge)) {
492
+ jsonResponse(res, 400, { error: 'invalid_grant' });
493
+ return;
494
+ }
495
+ const accessToken = await jwtIssuer.issueAccessToken('local-user');
496
+ jsonResponse(res, 200, {
497
+ access_token: accessToken,
498
+ token_type: 'Bearer',
499
+ expires_in: 3600
500
+ });
501
+ }
502
+ async function setupStatusHandler(_req, res) {
503
+ jsonResponse(res, 200, setupStatus);
504
+ }
505
+ async function wellKnownAs(req, res) {
506
+ jsonResponse(res, 200, authorizationServerMetadata(getBaseUrl(req)));
507
+ }
508
+ async function wellKnownPr(req, res) {
509
+ const base = getBaseUrl(req);
510
+ jsonResponse(res, 200, protectedResourceMetadata(base, [base]));
511
+ }
512
+ const routes = [
513
+ { method: 'GET', path: '/authorize', handler: authorize },
514
+ { method: 'POST', path: '/token', handler: token },
515
+ { method: 'GET', path: '/setup-status', handler: setupStatusHandler },
516
+ { method: 'GET', path: '/.well-known/oauth-authorization-server', handler: wellKnownAs },
517
+ { method: 'GET', path: '/.well-known/oauth-protected-resource', handler: wellKnownPr }
518
+ ];
519
+ if (options.flow === 'redirect') {
520
+ routes.push({ method: 'GET', path: callbackPath, handler: callback });
521
+ }
522
+ const handler = createRouter(routes);
523
+ async function shutdown() {
524
+ for (const controller of pollControllers) {
525
+ controller.abort();
526
+ }
527
+ pollControllers.clear();
528
+ }
529
+ return { handler, jwtIssuer, markSetupComplete, shutdown };
530
+ }
531
+ //# sourceMappingURL=delegated-oauth-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegated-oauth-app.js","sourceRoot":"","sources":["../../src/auth/delegated-oauth-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Public exports for the ``auth`` subpath.
3
+ *
4
+ * Intentionally does NOT export ``router`` (internal HTTP glue).
5
+ */
6
+ export { type CapabilityInfo, type ConfigField, type RelayConfigSchema, type RenderOptions, renderCredentialForm } from './credential-form.js';
7
+ export { createDelegatedOAuthApp, type DelegatedOAuthAppOptions, type DelegatedOAuthAppResult, type FlowType, type OAuthTokens, type TokenCallback, type UpstreamOAuthConfig } from './delegated-oauth-app.js';
8
+ export { type CredentialsCallback, createLocalOAuthApp, type LocalOAuthAppOptions, type LocalOAuthAppResult, type NextStep, type StepCallback } from './local-oauth-app.js';
9
+ export { authorizationServerMetadata, protectedResourceMetadata } from './well-known.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Public exports for the ``auth`` subpath.
3
+ *
4
+ * Intentionally does NOT export ``router`` (internal HTTP glue).
5
+ */
6
+ export { renderCredentialForm } from './credential-form.js';
7
+ export { createDelegatedOAuthApp } from './delegated-oauth-app.js';
8
+ export { createLocalOAuthApp } from './local-oauth-app.js';
9
+ export { authorizationServerMetadata, protectedResourceMetadata } from './well-known.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKL,oBAAoB,EACrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,uBAAuB,EAOxB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAEL,mBAAmB,EAKpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA"}