fastmcp 4.12.1 → 4.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/FastMCP.cjs CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- var _chunkPOXZCEYEcjs = require('./chunk-POXZCEYE.cjs');
13
+ var _chunk3O5ZKWCCcjs = require('./chunk-3O5ZKWCC.cjs');
14
14
 
15
15
 
16
16
 
@@ -23,7 +23,7 @@ var _chunkPOXZCEYEcjs = require('./chunk-POXZCEYE.cjs');
23
23
 
24
24
 
25
25
 
26
- var _chunkDZYT6QAHcjs = require('./chunk-DZYT6QAH.cjs');
26
+ var _chunkENMHHQJFcjs = require('./chunk-ENMHHQJF.cjs');
27
27
 
28
28
 
29
29
 
@@ -47,5 +47,5 @@ var _chunkDZYT6QAHcjs = require('./chunk-DZYT6QAH.cjs');
47
47
 
48
48
 
49
49
 
50
- exports.AuthProvider = _chunkDZYT6QAHcjs.AuthProvider; exports.AzureProvider = _chunkDZYT6QAHcjs.AzureProvider; exports.DiscoveryDocumentCache = _chunkPOXZCEYEcjs.DiscoveryDocumentCache; exports.FastMCP = _chunkPOXZCEYEcjs.FastMCP; exports.FastMCPError = _chunkPOXZCEYEcjs.FastMCPError; exports.FastMCPSession = _chunkPOXZCEYEcjs.FastMCPSession; exports.GitHubProvider = _chunkDZYT6QAHcjs.GitHubProvider; exports.GoogleProvider = _chunkDZYT6QAHcjs.GoogleProvider; exports.OAuthProvider = _chunkDZYT6QAHcjs.OAuthProvider; exports.ServerState = _chunkPOXZCEYEcjs.ServerState; exports.SessionError = _chunkPOXZCEYEcjs.SessionError; exports.UnexpectedStateError = _chunkPOXZCEYEcjs.UnexpectedStateError; exports.UserError = _chunkPOXZCEYEcjs.UserError; exports.audioContent = _chunkPOXZCEYEcjs.audioContent; exports.getAuthSession = _chunkDZYT6QAHcjs.getAuthSession; exports.imageContent = _chunkPOXZCEYEcjs.imageContent; exports.jsonSchemaAdapter = _chunkPOXZCEYEcjs.jsonSchemaAdapter; exports.requireAll = _chunkDZYT6QAHcjs.requireAll; exports.requireAny = _chunkDZYT6QAHcjs.requireAny; exports.requireAuth = _chunkDZYT6QAHcjs.requireAuth; exports.requireRole = _chunkDZYT6QAHcjs.requireRole; exports.requireScopes = _chunkDZYT6QAHcjs.requireScopes;
50
+ exports.AuthProvider = _chunkENMHHQJFcjs.AuthProvider; exports.AzureProvider = _chunkENMHHQJFcjs.AzureProvider; exports.DiscoveryDocumentCache = _chunk3O5ZKWCCcjs.DiscoveryDocumentCache; exports.FastMCP = _chunk3O5ZKWCCcjs.FastMCP; exports.FastMCPError = _chunk3O5ZKWCCcjs.FastMCPError; exports.FastMCPSession = _chunk3O5ZKWCCcjs.FastMCPSession; exports.GitHubProvider = _chunkENMHHQJFcjs.GitHubProvider; exports.GoogleProvider = _chunkENMHHQJFcjs.GoogleProvider; exports.OAuthProvider = _chunkENMHHQJFcjs.OAuthProvider; exports.ServerState = _chunk3O5ZKWCCcjs.ServerState; exports.SessionError = _chunk3O5ZKWCCcjs.SessionError; exports.UnexpectedStateError = _chunk3O5ZKWCCcjs.UnexpectedStateError; exports.UserError = _chunk3O5ZKWCCcjs.UserError; exports.audioContent = _chunk3O5ZKWCCcjs.audioContent; exports.getAuthSession = _chunkENMHHQJFcjs.getAuthSession; exports.imageContent = _chunk3O5ZKWCCcjs.imageContent; exports.jsonSchemaAdapter = _chunk3O5ZKWCCcjs.jsonSchemaAdapter; exports.requireAll = _chunkENMHHQJFcjs.requireAll; exports.requireAny = _chunkENMHHQJFcjs.requireAny; exports.requireAuth = _chunkENMHHQJFcjs.requireAuth; exports.requireRole = _chunkENMHHQJFcjs.requireRole; exports.requireScopes = _chunkENMHHQJFcjs.requireScopes;
51
51
  //# sourceMappingURL=FastMCP.cjs.map
@@ -12,8 +12,8 @@ import { CorsOptions } from 'mcp-proxy';
12
12
  export { CorsOptions } from 'mcp-proxy';
13
13
  import { StrictEventEmitter } from 'strict-event-emitter-types';
14
14
  import { z } from 'zod';
15
- import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-BNqoBTYA.cjs';
16
- export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-BNqoBTYA.cjs';
15
+ import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-B_E71LUD.cjs';
16
+ export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-B_E71LUD.cjs';
17
17
  import 'node:http';
18
18
 
19
19
  declare class DiscoveryDocumentCache {
@@ -21,9 +21,11 @@ declare class DiscoveryDocumentCache {
21
21
  get size(): number;
22
22
  /**
23
23
  * @param options - configuration options
24
+ * @param options.timeoutMs - timeout in miliseconds for the upstream fetch
24
25
  * @param options.ttl - time-to-live in miliseconds
25
26
  */
26
27
  constructor(options?: {
28
+ timeoutMs?: number;
27
29
  ttl?: number;
28
30
  });
29
31
  /**
package/dist/FastMCP.d.ts CHANGED
@@ -12,8 +12,8 @@ import { CorsOptions } from 'mcp-proxy';
12
12
  export { CorsOptions } from 'mcp-proxy';
13
13
  import { StrictEventEmitter } from 'strict-event-emitter-types';
14
14
  import { z } from 'zod';
15
- import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-BNqoBTYA.js';
16
- export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-BNqoBTYA.js';
15
+ import { A as AuthProvider, O as OAuthSession, a as OAuthProxy } from './OAuthProvider-B_E71LUD.js';
16
+ export { j as AuthProviderConfig, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, d as OAuthProvider, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from './OAuthProvider-B_E71LUD.js';
17
17
  import 'node:http';
18
18
 
19
19
  declare class DiscoveryDocumentCache {
@@ -21,9 +21,11 @@ declare class DiscoveryDocumentCache {
21
21
  get size(): number;
22
22
  /**
23
23
  * @param options - configuration options
24
+ * @param options.timeoutMs - timeout in miliseconds for the upstream fetch
24
25
  * @param options.ttl - time-to-live in miliseconds
25
26
  */
26
27
  constructor(options?: {
28
+ timeoutMs?: number;
27
29
  ttl?: number;
28
30
  });
29
31
  /**
package/dist/FastMCP.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  audioContent,
11
11
  imageContent,
12
12
  jsonSchemaAdapter
13
- } from "./chunk-5BQXF2VT.js";
13
+ } from "./chunk-5K4GLQMV.js";
14
14
  import {
15
15
  AuthProvider,
16
16
  AzureProvider,
@@ -23,7 +23,7 @@ import {
23
23
  requireAuth,
24
24
  requireRole,
25
25
  requireScopes
26
- } from "./chunk-GM44BOI7.js";
26
+ } from "./chunk-2ZFQSPXZ.js";
27
27
  export {
28
28
  AuthProvider,
29
29
  AzureProvider,
@@ -260,6 +260,8 @@ interface OAuthProxyConfig {
260
260
  upstreamClientId: string;
261
261
  /** Pre-registered client secret with upstream provider */
262
262
  upstreamClientSecret: string;
263
+ /** Timeout in milliseconds for upstream token/refresh HTTP requests (default: 10000) */
264
+ upstreamRequestTimeoutMs?: number;
263
265
  /** Upstream provider's token endpoint URL */
264
266
  upstreamTokenEndpoint: string;
265
267
  /** Upstream token endpoint authentication method (default: "client_secret_basic") */
@@ -540,6 +542,13 @@ declare class OAuthProxy {
540
542
  * Combines claims from access token and ID token (if present)
541
543
  */
542
544
  private extractUpstreamClaims;
545
+ /**
546
+ * POST to the upstream token endpoint with a bounded wait.
547
+ *
548
+ * Maps an abort of the configured timeout signal to a clean OAuth error
549
+ * instead of letting the raw `TimeoutError`/`AbortError` propagate.
550
+ */
551
+ private fetchUpstream;
543
552
  /**
544
553
  * Generate authorization code for client
545
554
  */
@@ -260,6 +260,8 @@ interface OAuthProxyConfig {
260
260
  upstreamClientId: string;
261
261
  /** Pre-registered client secret with upstream provider */
262
262
  upstreamClientSecret: string;
263
+ /** Timeout in milliseconds for upstream token/refresh HTTP requests (default: 10000) */
264
+ upstreamRequestTimeoutMs?: number;
263
265
  /** Upstream provider's token endpoint URL */
264
266
  upstreamTokenEndpoint: string;
265
267
  /** Upstream token endpoint authentication method (default: "client_secret_basic") */
@@ -540,6 +542,13 @@ declare class OAuthProxy {
540
542
  * Combines claims from access token and ID token (if present)
541
543
  */
542
544
  private extractUpstreamClaims;
545
+ /**
546
+ * POST to the upstream token endpoint with a bounded wait.
547
+ *
548
+ * Maps an abort of the configured timeout signal to a clean OAuth error
549
+ * instead of letting the raw `TimeoutError`/`AbortError` propagate.
550
+ */
551
+ private fetchUpstream;
543
552
  /**
544
553
  * Generate authorization code for client
545
554
  */
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- var _chunkDZYT6QAHcjs = require('../chunk-DZYT6QAH.cjs');
27
+ var _chunkENMHHQJFcjs = require('../chunk-ENMHHQJF.cjs');
28
28
 
29
29
 
30
30
 
@@ -51,5 +51,5 @@ var _chunkDZYT6QAHcjs = require('../chunk-DZYT6QAH.cjs');
51
51
 
52
52
 
53
53
 
54
- exports.AuthProvider = _chunkDZYT6QAHcjs.AuthProvider; exports.AzureProvider = _chunkDZYT6QAHcjs.AzureProvider; exports.ConsentManager = _chunkDZYT6QAHcjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkDZYT6QAHcjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkDZYT6QAHcjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkDZYT6QAHcjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkDZYT6QAHcjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkDZYT6QAHcjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkDZYT6QAHcjs.DiskStore; exports.EncryptedTokenStorage = _chunkDZYT6QAHcjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkDZYT6QAHcjs.GitHubProvider; exports.GoogleProvider = _chunkDZYT6QAHcjs.GoogleProvider; exports.JWKSVerifier = _chunkDZYT6QAHcjs.JWKSVerifier; exports.JWTIssuer = _chunkDZYT6QAHcjs.JWTIssuer; exports.MemoryTokenStorage = _chunkDZYT6QAHcjs.MemoryTokenStorage; exports.OAuthProvider = _chunkDZYT6QAHcjs.OAuthProvider; exports.OAuthProxy = _chunkDZYT6QAHcjs.OAuthProxy; exports.OAuthProxyError = _chunkDZYT6QAHcjs.OAuthProxyError; exports.PKCEUtils = _chunkDZYT6QAHcjs.PKCEUtils; exports.getAuthSession = _chunkDZYT6QAHcjs.getAuthSession; exports.requireAll = _chunkDZYT6QAHcjs.requireAll; exports.requireAny = _chunkDZYT6QAHcjs.requireAny; exports.requireAuth = _chunkDZYT6QAHcjs.requireAuth; exports.requireRole = _chunkDZYT6QAHcjs.requireRole; exports.requireScopes = _chunkDZYT6QAHcjs.requireScopes;
54
+ exports.AuthProvider = _chunkENMHHQJFcjs.AuthProvider; exports.AzureProvider = _chunkENMHHQJFcjs.AzureProvider; exports.ConsentManager = _chunkENMHHQJFcjs.ConsentManager; exports.DEFAULT_ACCESS_TOKEN_TTL = _chunkENMHHQJFcjs.DEFAULT_ACCESS_TOKEN_TTL; exports.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = _chunkENMHHQJFcjs.DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH; exports.DEFAULT_AUTHORIZATION_CODE_TTL = _chunkENMHHQJFcjs.DEFAULT_AUTHORIZATION_CODE_TTL; exports.DEFAULT_REFRESH_TOKEN_TTL = _chunkENMHHQJFcjs.DEFAULT_REFRESH_TOKEN_TTL; exports.DEFAULT_TRANSACTION_TTL = _chunkENMHHQJFcjs.DEFAULT_TRANSACTION_TTL; exports.DiskStore = _chunkENMHHQJFcjs.DiskStore; exports.EncryptedTokenStorage = _chunkENMHHQJFcjs.EncryptedTokenStorage; exports.GitHubProvider = _chunkENMHHQJFcjs.GitHubProvider; exports.GoogleProvider = _chunkENMHHQJFcjs.GoogleProvider; exports.JWKSVerifier = _chunkENMHHQJFcjs.JWKSVerifier; exports.JWTIssuer = _chunkENMHHQJFcjs.JWTIssuer; exports.MemoryTokenStorage = _chunkENMHHQJFcjs.MemoryTokenStorage; exports.OAuthProvider = _chunkENMHHQJFcjs.OAuthProvider; exports.OAuthProxy = _chunkENMHHQJFcjs.OAuthProxy; exports.OAuthProxyError = _chunkENMHHQJFcjs.OAuthProxyError; exports.PKCEUtils = _chunkENMHHQJFcjs.PKCEUtils; exports.getAuthSession = _chunkENMHHQJFcjs.getAuthSession; exports.requireAll = _chunkENMHHQJFcjs.requireAll; exports.requireAny = _chunkENMHHQJFcjs.requireAny; exports.requireAuth = _chunkENMHHQJFcjs.requireAuth; exports.requireRole = _chunkENMHHQJFcjs.requireRole; exports.requireScopes = _chunkENMHHQJFcjs.requireScopes;
55
55
  //# sourceMappingURL=index.cjs.map
@@ -1,5 +1,5 @@
1
- import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-BNqoBTYA.cjs';
2
- export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-BNqoBTYA.cjs';
1
+ import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-B_E71LUD.cjs';
2
+ export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-B_E71LUD.cjs';
3
3
  import 'node:http';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-BNqoBTYA.js';
2
- export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-BNqoBTYA.js';
1
+ import { p as OAuthTransaction, C as ConsentData, T as TokenStorage, q as TokenVerifier, s as TokenVerificationResult, P as PKCEPair } from '../OAuthProvider-B_E71LUD.js';
2
+ export { A as AuthProvider, j as AuthProviderConfig, y as AuthorizationParams, b as AzureProvider, k as AzureProviderConfig, l as AzureSession, z as ClientCode, B as DCRClientMetadata, E as DCRRequest, F as DCRResponse, D as DEFAULT_ACCESS_TOKEN_TTL, u as DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH, v as DEFAULT_AUTHORIZATION_CODE_TTL, w as DEFAULT_REFRESH_TOKEN_TTL, x as DEFAULT_TRANSACTION_TTL, m as GenericOAuthProviderConfig, G as GitHubProvider, n as GitHubSession, c as GoogleProvider, o as GoogleSession, H as OAuthError, d as OAuthProvider, I as OAuthProviderConfig, a as OAuthProxy, J as OAuthProxyConfig, t as OAuthProxyError, O as OAuthSession, K as ProxyDCRClient, R as RefreshRequest, L as TokenMapping, M as TokenRequest, N as TokenResponse, U as UpstreamTokenSet, g as getAuthSession, r as requireAll, e as requireAny, f as requireAuth, h as requireRole, i as requireScopes } from '../OAuthProvider-B_E71LUD.js';
3
3
  import 'node:http';
4
4
 
5
5
  /**
@@ -24,7 +24,7 @@ import {
24
24
  requireAuth,
25
25
  requireRole,
26
26
  requireScopes
27
- } from "../chunk-GM44BOI7.js";
27
+ } from "../chunk-2ZFQSPXZ.js";
28
28
  export {
29
29
  AuthProvider,
30
30
  AzureProvider,
@@ -274,6 +274,7 @@ var DEFAULT_ACCESS_TOKEN_TTL_NO_REFRESH = 31536e3;
274
274
  var DEFAULT_REFRESH_TOKEN_TTL = 2592e3;
275
275
  var DEFAULT_AUTHORIZATION_CODE_TTL = 300;
276
276
  var DEFAULT_TRANSACTION_TTL = 600;
277
+ var DEFAULT_UPSTREAM_REQUEST_TIMEOUT_MS = 1e4;
277
278
 
278
279
  // src/auth/utils/claimsExtractor.ts
279
280
  var ClaimsExtractor = class {
@@ -417,7 +418,7 @@ var ClaimsExtractor = class {
417
418
  };
418
419
 
419
420
  // src/auth/utils/consent.ts
420
- import { createHmac } from "crypto";
421
+ import { createHmac, timingSafeEqual } from "crypto";
421
422
  var ConsentManager = class {
422
423
  signingKey;
423
424
  constructor(signingKey) {
@@ -670,7 +671,9 @@ var ConsentManager = class {
670
671
  }
671
672
  const payload = Buffer.from(payloadB64, "base64").toString("utf8");
672
673
  const expectedSignature = this.sign(payload);
673
- if (signature !== expectedSignature) {
674
+ const actualBuf = Buffer.from(signature);
675
+ const expectedBuf = Buffer.from(expectedSignature);
676
+ if (actualBuf.length !== expectedBuf.length || !timingSafeEqual(actualBuf, expectedBuf)) {
674
677
  return null;
675
678
  }
676
679
  const data = JSON.parse(payload);
@@ -725,7 +728,7 @@ var ConsentManager = class {
725
728
  };
726
729
 
727
730
  // src/auth/utils/jwtIssuer.ts
728
- import { createHmac as createHmac2, pbkdf2, randomBytes } from "crypto";
731
+ import { createHmac as createHmac2, pbkdf2, randomBytes, timingSafeEqual as timingSafeEqual2 } from "crypto";
729
732
  import { promisify } from "util";
730
733
  var pbkdf2Async = promisify(pbkdf2);
731
734
  var JWTIssuer = class {
@@ -802,7 +805,9 @@ var JWTIssuer = class {
802
805
  }
803
806
  const [headerB64, payloadB64, signatureB64] = parts;
804
807
  const expectedSignature = this.sign(`${headerB64}.${payloadB64}`);
805
- if (signatureB64 !== expectedSignature) {
808
+ const actualBuf = Buffer.from(signatureB64);
809
+ const expectedBuf = Buffer.from(expectedSignature);
810
+ if (actualBuf.length !== expectedBuf.length || !timingSafeEqual2(actualBuf, expectedBuf)) {
806
811
  return {
807
812
  error: "Invalid signature",
808
813
  valid: false
@@ -1147,6 +1152,7 @@ var OAuthProxy = class {
1147
1152
  // Enabled by default for security
1148
1153
  redirectPath: "/oauth/callback",
1149
1154
  transactionTtl: DEFAULT_TRANSACTION_TTL,
1155
+ upstreamRequestTimeoutMs: DEFAULT_UPSTREAM_REQUEST_TIMEOUT_MS,
1150
1156
  upstreamTokenEndpointAuthMethod: "client_secret_basic",
1151
1157
  ...config
1152
1158
  };
@@ -1591,11 +1597,7 @@ var OAuthProxy = class {
1591
1597
  if (useBasicAuth) {
1592
1598
  headers["Authorization"] = this.getBasicAuthHeader();
1593
1599
  }
1594
- const tokenResponse = await fetch(this.config.upstreamTokenEndpoint, {
1595
- body: new URLSearchParams(bodyParams),
1596
- headers,
1597
- method: "POST"
1598
- });
1600
+ const tokenResponse = await this.fetchUpstream(bodyParams, headers);
1599
1601
  if (!tokenResponse.ok) {
1600
1602
  let errorCode = "server_error";
1601
1603
  let errorDescription;
@@ -1664,6 +1666,31 @@ var OAuthProxy = class {
1664
1666
  }
1665
1667
  return Object.keys(allClaims).length > 0 ? allClaims : null;
1666
1668
  }
1669
+ /**
1670
+ * POST to the upstream token endpoint with a bounded wait.
1671
+ *
1672
+ * Maps an abort of the configured timeout signal to a clean OAuth error
1673
+ * instead of letting the raw `TimeoutError`/`AbortError` propagate.
1674
+ */
1675
+ async fetchUpstream(bodyParams, headers) {
1676
+ let tokenResponse;
1677
+ try {
1678
+ tokenResponse = await fetch(this.config.upstreamTokenEndpoint, {
1679
+ body: new URLSearchParams(bodyParams),
1680
+ headers,
1681
+ method: "POST",
1682
+ signal: AbortSignal.timeout(
1683
+ this.config.upstreamRequestTimeoutMs ?? DEFAULT_UPSTREAM_REQUEST_TIMEOUT_MS
1684
+ )
1685
+ });
1686
+ } catch (error) {
1687
+ if (error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError")) {
1688
+ throw new OAuthProxyError("server_error", "Upstream request timed out");
1689
+ }
1690
+ throw error;
1691
+ }
1692
+ return tokenResponse;
1693
+ }
1667
1694
  /**
1668
1695
  * Generate authorization code for client
1669
1696
  */
@@ -1734,11 +1761,7 @@ var OAuthProxy = class {
1734
1761
  if (useBasicAuth) {
1735
1762
  headers["Authorization"] = this.getBasicAuthHeader();
1736
1763
  }
1737
- const tokenResponse = await fetch(this.config.upstreamTokenEndpoint, {
1738
- body: new URLSearchParams(bodyParams),
1739
- headers,
1740
- method: "POST"
1741
- });
1764
+ const tokenResponse = await this.fetchUpstream(bodyParams, headers);
1742
1765
  if (!tokenResponse.ok) {
1743
1766
  let errorCode = "invalid_grant";
1744
1767
  let errorDescription;
@@ -2060,11 +2083,7 @@ var OAuthProxy = class {
2060
2083
  if (useBasicAuth) {
2061
2084
  headers["Authorization"] = this.getBasicAuthHeader();
2062
2085
  }
2063
- const tokenResponse = await fetch(this.config.upstreamTokenEndpoint, {
2064
- body: new URLSearchParams(bodyParams),
2065
- headers,
2066
- method: "POST"
2067
- });
2086
+ const tokenResponse = await this.fetchUpstream(bodyParams, headers);
2068
2087
  if (!tokenResponse.ok) {
2069
2088
  let errorCode = "invalid_grant";
2070
2089
  let errorDescription = "Upstream refresh failed";
@@ -2619,15 +2638,15 @@ var JWKSVerifier = class {
2619
2638
  verifyOptions
2620
2639
  );
2621
2640
  const claims = {
2641
+ ...payload,
2642
+ // Include all other claims
2622
2643
  aud: payload.aud,
2623
2644
  client_id: payload.client_id || payload.sub,
2624
2645
  exp: payload.exp,
2625
2646
  iat: payload.iat,
2626
2647
  iss: payload.iss,
2627
2648
  jti: payload.jti || "",
2628
- scope: this.parseScope(payload.scope),
2629
- ...payload
2630
- // Include all other claims
2649
+ scope: this.parseScope(payload.scope)
2631
2650
  };
2632
2651
  return {
2633
2652
  claims,
@@ -2714,4 +2733,4 @@ export {
2714
2733
  DiskStore,
2715
2734
  JWKSVerifier
2716
2735
  };
2717
- //# sourceMappingURL=chunk-GM44BOI7.js.map
2736
+ //# sourceMappingURL=chunk-2ZFQSPXZ.js.map