@fluojs/jwt 1.0.0-beta.1 → 1.0.0-beta.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/README.ko.md CHANGED
@@ -10,6 +10,7 @@ HTTP에 독립적인 JWT 토큰 코어로, 액세스 토큰의 서명 및 검증
10
10
  - [사용 시점](#사용-시점)
11
11
  - [빠른 시작](#빠른-시작)
12
12
  - [일반적인 패턴](#일반적인-패턴)
13
+ - [설정 가드레일](#설정-가드레일)
13
14
  - [공개 API 개요](#공개-api-개요)
14
15
  - [관련 패키지](#관련-패키지)
15
16
  - [예제 소스](#예제-소스)
@@ -56,6 +57,8 @@ export class AuthModule {}
56
57
 
57
58
  JWT 설정이 다른 provider에서 와야 한다면, `JwtModule.forRootAsync(...)`를 사용해도 표준 module contract 안에서 안전하게 등록할 수 있습니다.
58
59
 
60
+ 비동기 등록도 동기 경로와 동일한 JWT provider surface를 export하며, 여기에는 `RefreshTokenService`가 포함됩니다. 단, 이 서비스를 실제로 resolve하려면 `refreshToken` 옵션이 구성되어 있어야 합니다.
61
+
59
62
  ```typescript
60
63
  import { Module, type Token } from '@fluojs/core';
61
64
  import { JwtModule } from '@fluojs/jwt';
@@ -107,7 +110,7 @@ const principal = await verifier.verifyAccessToken(token);
107
110
  // principal: { subject: 'user-123', roles: ['admin'], scopes: ['read:profile'], ... }
108
111
  ```
109
112
 
110
- `JwtService.sign(payload, { expiresIn })`를 사용할 때는 payload 안에 기존 `exp` 값이 있더라도 호출 시점의 `expiresIn` 재정의가 항상 우선합니다. 따라서 토큰 수명은 호출 위치에서 결정적으로 제어됩니다.
113
+ `JwtService.sign(payload, { expiresIn })`를 사용할 때는 payload 안에 기존 `exp` 값이 있더라도 호출 시점의 `expiresIn` 재정의가 항상 우선합니다. 따라서 토큰 수명은 호출 위치에서 결정적으로 제어됩니다. `expiresIn`은 초 단위의 0 이상 숫자 또는 `60s`, `15m`, `1h`, `7d` 같은 짧은 duration 문자열을 받을 수 있습니다.
111
114
 
112
115
  ## 일반적인 패턴
113
116
 
@@ -145,6 +148,20 @@ const verifier = new DefaultJwtVerifier({
145
148
 
146
149
  `jwksRequestTimeoutMs`의 기본값은 `5_000`이며, 예산을 넘기면 진행 중인 JWKS fetch를 abort합니다.
147
150
 
151
+ `JwtService.verify(token, options)`는 호출 단위의 알고리즘/클레임 정책 재정의(`issuer`, `audience`, `clockSkewSeconds`, `maxAge`, `requireExp`)를 적용하더라도, 내부 JWKS client나 정적 key-resolution cache를 다시 만들지 않습니다. 호출 단위 검증은 `jwksUri`, `keys[]`, `publicKey`, `secret`, `secretOrKeyProvider` 같은 구성된 key source 자체를 교체하지는 않습니다.
152
+
153
+ 호환되는 키가 여러 개 설정되어 있으면 `kid`가 검증 키를 구분합니다. 호환되는 정적 키가 하나뿐이면 `kid` 없이도 토큰을 검증할 수 있고, JWKS 기반 검증은 원격 key set과 cache policy를 따릅니다.
154
+
155
+ ### 리프레시 토큰
156
+
157
+ `RefreshTokenService`는 전용 HMAC refresh-token 경로를 사용합니다. `refreshToken.secret`은 access-token 서명 키와 별도로 설정하세요. Rotation은 재사용된 토큰을 안정적으로 감지할 수 있도록 atomic `RefreshTokenStore.consume(...)` 구현을 필요로 합니다.
158
+
159
+ ## 설정 가드레일
160
+
161
+ JWT 서명과 검증에는 `algorithms`에 지원되는 알고리즘이 하나 이상 필요합니다. 기본 signer는 `HS256`, `HS384`, `HS512`, `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, `ES512`를 지원하며, 빈 알고리즘 목록은 모호한 토큰을 발행하거나 수락하지 않도록 즉시 실패합니다.
162
+
163
+ 액세스 토큰 TTL도 양의 유한 숫자여야 합니다. `accessTokenTtlSeconds`를 생략하면 `DefaultJwtSigner`는 문서화된 기본값인 `3600`초를 사용합니다. 소수 초는 JWT NumericDate `exp` 클레임에 그대로 보존됩니다. `0`, 음수 또는 유한하지 않은 값이 제공되면 토큰을 발행하기 전에 `JwtConfigurationError`로 실패합니다.
164
+
148
165
  ## 공개 API 개요
149
166
 
150
167
  ### 주요 클래스
@@ -152,10 +169,19 @@ const verifier = new DefaultJwtVerifier({
152
169
  - `DefaultJwtSigner`: 클레임 자동 채우기 기능이 포함된 토큰 발행 클래스입니다.
153
170
  - `DefaultJwtVerifier`: 토큰 검증 및 정규화를 담당하는 클래스입니다.
154
171
  - `JwtService`: 서명과 검증 기능을 결합한 편의용 파사드(facade)입니다.
172
+ - `JwksClient`: 제한된 요청 시간 안에서 원격 JWKS 키를 가져오고 캐싱합니다.
173
+ - `RefreshTokenService`: `refreshToken` 옵션이 구성된 경우 refresh token을 발행, 회전, 폐기합니다.
155
174
 
156
175
  ### 타입
157
176
  - `JwtPrincipal`: 정규화된 사용자 식별 객체 (`subject`, `roles`, `scopes`, `claims`).
158
177
  - `JwtVerifierOptions`: 알고리즘, 키, 검증 정책 설정을 위한 타입입니다.
178
+ - `SignOptions`, `VerifyOptions`: 호출 단위 서명 및 검증 재정의 타입입니다.
179
+ - `JwtClaims`, `JwtSigner`, `JwtVerifier`, `JwtKeyEntry`, `JwtAlgorithm`: 공개 서명 및 검증 계약입니다.
180
+
181
+ ### 에러와 diagnostics
182
+ - `JwtVerificationError`, `JwtInvalidTokenError`, `JwtExpiredTokenError`, `JwtConfigurationError`: 타입이 지정된 JWT 실패입니다.
183
+ - `createJwtPlatformStatusSnapshot(...)`, `createJwtPlatformDiagnosticIssues(...)`: status 및 diagnostic helper입니다.
184
+ - `JWT_OPTIONS`, `HMAC_HASH`, `ASYMMETRIC_HASH`: 모듈과 검증 레이어에서 사용하는 export token/constant입니다.
159
185
 
160
186
  ## 관련 패키지
161
187
 
package/README.md CHANGED
@@ -10,6 +10,7 @@ HTTP-agnostic JWT token core that handles signing access tokens and verifying th
10
10
  - [When to use](#when-to-use)
11
11
  - [Quick Start](#quick-start)
12
12
  - [Common Patterns](#common-patterns)
13
+ - [Configuration Guardrails](#configuration-guardrails)
13
14
  - [Public API](#public-api)
14
15
  - [Related Packages](#related-packages)
15
16
  - [Example Sources](#example-sources)
@@ -56,6 +57,8 @@ export class AuthModule {}
56
57
 
57
58
  Use `JwtModule.forRootAsync(...)` when your JWT settings must come from another provider and still need to resolve into the standard module contract.
58
59
 
60
+ Async registration exports the same JWT provider surface as the synchronous path, including `RefreshTokenService`; resolving that service still requires `refreshToken` options to be configured.
61
+
59
62
  ```typescript
60
63
  import { Module, type Token } from '@fluojs/core';
61
64
  import { JwtModule } from '@fluojs/jwt';
@@ -107,7 +110,7 @@ const principal = await verifier.verifyAccessToken(token);
107
110
  // principal: { subject: 'user-123', roles: ['admin'], scopes: ['read:profile'], ... }
108
111
  ```
109
112
 
110
- When you use `JwtService.sign(payload, { expiresIn })`, the per-call `expiresIn` override always wins over any pre-existing `payload.exp` value so token lifetime stays deterministic at the call site.
113
+ When you use `JwtService.sign(payload, { expiresIn })`, the per-call `expiresIn` override always wins over any pre-existing `payload.exp` value so token lifetime stays deterministic at the call site. `expiresIn` accepts a non-negative number of seconds or short duration strings such as `60s`, `15m`, `1h`, or `7d`.
111
114
 
112
115
  ## Common Patterns
113
116
 
@@ -145,6 +148,20 @@ const verifier = new DefaultJwtVerifier({
145
148
 
146
149
  `jwksRequestTimeoutMs` defaults to `5_000` and aborts the outbound JWKS fetch once that budget is exceeded.
147
150
 
151
+ `JwtService.verify(token, options)` applies per-call algorithm and claim-policy overrides (`issuer`, `audience`, `clockSkewSeconds`, `maxAge`, `requireExp`) without rebuilding the underlying JWKS client or static key-resolution cache. Per-call verification does not replace configured key sources such as `jwksUri`, `keys[]`, `publicKey`, `secret`, or `secretOrKeyProvider`.
152
+
153
+ When multiple compatible keys are configured, `kid` disambiguates the verification key. A single compatible static key can verify tokens without `kid`; JWKS-backed verification relies on the remote key set and its cache policy.
154
+
155
+ ### Refresh tokens
156
+
157
+ `RefreshTokenService` uses a dedicated HMAC refresh-token path. Configure `refreshToken.secret` separately from access-token signing keys. Rotation requires an atomic `RefreshTokenStore.consume(...)` implementation so replayed tokens can be detected reliably.
158
+
159
+ ## Configuration Guardrails
160
+
161
+ JWT signing and verification require at least one supported algorithm in `algorithms`. The built-in signer supports `HS256`, `HS384`, `HS512`, `RS256`, `RS384`, `RS512`, `ES256`, `ES384`, and `ES512`; configuration with an empty algorithm list fails fast instead of issuing or accepting ambiguous tokens.
162
+
163
+ Access-token TTL must also be a positive finite number. When `accessTokenTtlSeconds` is omitted, `DefaultJwtSigner` uses the documented `3600` second default. Fractional seconds are preserved in the JWT NumericDate `exp` claim; when the option is provided as `0`, a negative number, or a non-finite value, signing fails with `JwtConfigurationError` before a token is issued.
164
+
148
165
  ## Public API Overview
149
166
 
150
167
  ### Core Classes
@@ -152,10 +169,19 @@ const verifier = new DefaultJwtVerifier({
152
169
  - `DefaultJwtSigner`: Handles token issuance with default claim filling.
153
170
  - `DefaultJwtVerifier`: Handles token validation and normalization.
154
171
  - `JwtService`: A convenience facade combining signing and verification.
172
+ - `JwksClient`: Fetches and caches remote JWKS keys with bounded request timeouts.
173
+ - `RefreshTokenService`: Issues, rotates, and revokes refresh tokens when `refreshToken` options are configured.
155
174
 
156
175
  ### Types
157
176
  - `JwtPrincipal`: The normalized identity object (`subject`, `roles`, `scopes`, `claims`).
158
177
  - `JwtVerifierOptions`: Configuration for algorithms, keys, and validation policy.
178
+ - `SignOptions` and `VerifyOptions`: Per-call signing and verification overrides.
179
+ - `JwtClaims`, `JwtSigner`, `JwtVerifier`, `JwtKeyEntry`, `JwtAlgorithm`: Public signing and verification contracts.
180
+
181
+ ### Errors and diagnostics
182
+ - `JwtVerificationError`, `JwtInvalidTokenError`, `JwtExpiredTokenError`, `JwtConfigurationError`: Typed JWT failures.
183
+ - `createJwtPlatformStatusSnapshot(...)` and `createJwtPlatformDiagnosticIssues(...)`: Status and diagnostic helpers.
184
+ - `JWT_OPTIONS`, `HMAC_HASH`, `ASYMMETRIC_HASH`: Exported tokens/constants used by the module and verification layer.
159
185
 
160
186
  ## Related Packages
161
187
 
package/dist/module.d.ts CHANGED
@@ -6,7 +6,9 @@ type ModuleType = Constructor;
6
6
  */
7
7
  export declare class JwtModule {
8
8
  static forRoot(options: JwtVerifierOptions): ModuleType;
9
- static forRootAsync(options: AsyncModuleOptions<JwtVerifierOptions>): ModuleType;
9
+ static forRootAsync(options: AsyncModuleOptions<JwtVerifierOptions> & {
10
+ global?: boolean;
11
+ }): ModuleType;
10
12
  private static createModule;
11
13
  }
12
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAiC,MAAM,cAAc,CAAC;AAQhH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,KAAK,UAAU,GAAG,WAAW,CAAC;AAmF9B;;GAEG;AACH,qBAAa,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;IAQvD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,UAAU;IAShF,OAAO,CAAC,MAAM,CAAC,YAAY;CAgB5B"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAiC,MAAM,cAAc,CAAC;AAOhH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,KAAK,UAAU,GAAG,WAAW,CAAC;AAyE9B;;GAEG;AACH,qBAAa,SAAS;IACpB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;IAQvD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU;IASvG,OAAO,CAAC,MAAM,CAAC,YAAY;CAkB5B"}
package/dist/module.js CHANGED
@@ -6,7 +6,6 @@ function _setFunctionName(e, t, n) { "symbol" == typeof t && (t = (t = t.descrip
6
6
  function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; }
7
7
  import { Inject } from '@fluojs/core';
8
8
  import { defineModuleMetadata } from '@fluojs/core/internal';
9
- import { RUNTIME_CONTAINER } from '@fluojs/runtime/internal';
10
9
  import { JwtConfigurationError } from './errors.js';
11
10
  import { normalizeRefreshTokenOptions, RefreshTokenService } from './refresh/refresh-token.js';
12
11
  import { JwtService } from './service.js';
@@ -21,26 +20,16 @@ function resolveRefreshTokenOptions(value) {
21
20
  let _AsyncRefreshTokenSer;
22
21
  class AsyncRefreshTokenServiceRegistrar {
23
22
  static {
24
- [_AsyncRefreshTokenSer, _initClass] = _applyDecs(this, [Inject(JWT_OPTIONS, DefaultJwtSigner, DefaultJwtVerifier, RUNTIME_CONTAINER)], []).c;
23
+ [_AsyncRefreshTokenSer, _initClass] = _applyDecs(this, [Inject(JWT_OPTIONS, DefaultJwtSigner, DefaultJwtVerifier)], []).c;
25
24
  }
26
- registered = false;
27
- constructor(options, signer, verifier, container) {
25
+ constructor(options, _signer, _verifier) {
28
26
  this.options = options;
29
- this.signer = signer;
30
- this.verifier = verifier;
31
- this.container = container;
32
27
  }
33
28
  onModuleInit() {
34
- if (!this.options.refreshToken || this.registered) {
29
+ if (!this.options.refreshToken) {
35
30
  return;
36
31
  }
37
- const refreshTokenOptions = resolveRefreshTokenOptions(this.options);
38
- this.container.register({
39
- provide: RefreshTokenService,
40
- scope: 'transient',
41
- useFactory: () => new RefreshTokenService(refreshTokenOptions, this.signer, this.verifier)
42
- });
43
- this.registered = true;
32
+ resolveRefreshTokenOptions(this.options);
44
33
  }
45
34
  static {
46
35
  _initClass();
@@ -49,7 +38,7 @@ class AsyncRefreshTokenServiceRegistrar {
49
38
  function createJwtModuleProviders(optionsProvider, includeRefreshTokenService, refreshTokenServiceScope, deferRefreshTokenServiceRegistration = false) {
50
39
  const providers = [optionsProvider, DefaultJwtVerifier, DefaultJwtSigner, JwtService];
51
40
  if (includeRefreshTokenService) {
52
- providers.push(deferRefreshTokenServiceRegistration ? _AsyncRefreshTokenSer : {
41
+ providers.push({
53
42
  inject: [JWT_OPTIONS, DefaultJwtSigner, DefaultJwtVerifier],
54
43
  provide: RefreshTokenService,
55
44
  scope: refreshTokenServiceScope,
@@ -59,6 +48,9 @@ function createJwtModuleProviders(optionsProvider, includeRefreshTokenService, r
59
48
  return new RefreshTokenService(refreshTokenOptions, signer, verifier);
60
49
  }
61
50
  });
51
+ if (deferRefreshTokenServiceRegistration) {
52
+ providers.push(_AsyncRefreshTokenSer);
53
+ }
62
54
  }
63
55
  return providers;
64
56
  }
@@ -72,7 +64,7 @@ export class JwtModule {
72
64
  provide: JWT_OPTIONS,
73
65
  scope: 'singleton',
74
66
  useValue: options
75
- }, Boolean(options.refreshToken), Boolean(options.refreshToken), 'singleton');
67
+ }, Boolean(options.refreshToken), Boolean(options.refreshToken), 'singleton', false, options.global ?? false);
76
68
  }
77
69
  static forRootAsync(options) {
78
70
  return this.createModule({
@@ -80,12 +72,13 @@ export class JwtModule {
80
72
  provide: JWT_OPTIONS,
81
73
  scope: 'singleton',
82
74
  useFactory: options.useFactory
83
- }, true, false, 'transient', true);
75
+ }, true, true, 'transient', true, options.global ?? false);
84
76
  }
85
- static createModule(optionsProvider, includeRefreshTokenProvider, includeRefreshTokenExport, refreshTokenServiceScope, deferRefreshTokenServiceRegistration = false) {
77
+ static createModule(optionsProvider, includeRefreshTokenProvider, includeRefreshTokenExport, refreshTokenServiceScope, deferRefreshTokenServiceRegistration = false, global = false) {
86
78
  class JwtRuntimeModule {}
87
79
  defineModuleMetadata(JwtRuntimeModule, {
88
80
  exports: [JwtService, DefaultJwtVerifier, DefaultJwtSigner, ...(includeRefreshTokenExport ? [RefreshTokenService] : [])],
81
+ global,
89
82
  providers: createJwtModuleProviders(optionsProvider, includeRefreshTokenProvider, refreshTokenServiceScope, deferRefreshTokenServiceRegistration)
90
83
  });
91
84
  return JwtRuntimeModule;
@@ -1,5 +1,8 @@
1
1
  import type { DefaultJwtSigner } from '../signing/signer.js';
2
2
  import type { DefaultJwtVerifier } from '../signing/verifier.js';
3
+ /**
4
+ * Describes the refresh token store contract.
5
+ */
3
6
  export interface RefreshTokenStore {
4
7
  save(token: RefreshTokenRecord): Promise<void>;
5
8
  find(tokenId: string): Promise<RefreshTokenRecord | undefined>;
@@ -7,13 +10,22 @@ export interface RefreshTokenStore {
7
10
  revokeBySubject(subject: string): Promise<void>;
8
11
  consume?(input: RefreshTokenConsumeInput): Promise<RefreshTokenConsumeResult>;
9
12
  }
13
+ /**
14
+ * Describes the refresh token consume input contract.
15
+ */
10
16
  export interface RefreshTokenConsumeInput {
11
17
  tokenId: string;
12
18
  subject: string;
13
19
  family: string;
14
20
  now: Date;
15
21
  }
22
+ /**
23
+ * Defines the refresh token consume result type.
24
+ */
16
25
  export type RefreshTokenConsumeResult = 'consumed' | 'already_used' | 'expired' | 'not_found' | 'mismatch' | 'invalid';
26
+ /**
27
+ * Describes the refresh token record contract.
28
+ */
17
29
  export interface RefreshTokenRecord {
18
30
  id: string;
19
31
  subject: string;
@@ -22,6 +34,9 @@ export interface RefreshTokenRecord {
22
34
  used: boolean;
23
35
  createdAt: Date;
24
36
  }
37
+ /**
38
+ * Describes the refresh token options contract.
39
+ */
25
40
  export interface RefreshTokenOptions {
26
41
  secret: string;
27
42
  expiresInSeconds: number;
@@ -29,7 +44,16 @@ export interface RefreshTokenOptions {
29
44
  rotation: boolean;
30
45
  store: RefreshTokenStore;
31
46
  }
47
+ /**
48
+ * Normalize refresh token options.
49
+ *
50
+ * @param options The options.
51
+ * @returns The normalize refresh token options result.
52
+ */
32
53
  export declare function normalizeRefreshTokenOptions(options: RefreshTokenOptions | undefined): RefreshTokenOptions;
54
+ /**
55
+ * Represents the refresh token service.
56
+ */
33
57
  export declare class RefreshTokenService {
34
58
  private readonly signer;
35
59
  private readonly verifier;
@@ -1 +1 @@
1
- {"version":3,"file":"refresh-token.d.ts","sourceRoot":"","sources":["../../src/refresh/refresh-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEvH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,CA2B1G;AAQD,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAG5C,OAAO,EAAE,mBAAmB,EACX,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB;IAKzC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IA+DhG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3C,2BAA2B;YA6B3B,mBAAmB;CA4BlC"}
1
+ {"version":3,"file":"refresh-token.d.ts","sourceRoot":"","sources":["../../src/refresh/refresh-token.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAC/E;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,IAAI,CAAC;CACX;AAED;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEvH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,CA2B1G;AAQD;;GAEG;AACH,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAG5C,OAAO,EAAE,mBAAmB,EACX,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB;IAKzC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMnD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IA+DhG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3C,2BAA2B;YA6B3B,mBAAmB;CA4BlC"}
@@ -1,5 +1,32 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { JwtConfigurationError, JwtExpiredTokenError, JwtInvalidTokenError } from '../errors.js';
3
+
4
+ /**
5
+ * Describes the refresh token store contract.
6
+ */
7
+
8
+ /**
9
+ * Describes the refresh token consume input contract.
10
+ */
11
+
12
+ /**
13
+ * Defines the refresh token consume result type.
14
+ */
15
+
16
+ /**
17
+ * Describes the refresh token record contract.
18
+ */
19
+
20
+ /**
21
+ * Describes the refresh token options contract.
22
+ */
23
+
24
+ /**
25
+ * Normalize refresh token options.
26
+ *
27
+ * @param options The options.
28
+ * @returns The normalize refresh token options result.
29
+ */
3
30
  export function normalizeRefreshTokenOptions(options) {
4
31
  if (!options) {
5
32
  throw new JwtConfigurationError('JWT refresh token options are not configured.');
@@ -20,6 +47,9 @@ export function normalizeRefreshTokenOptions(options) {
20
47
  ...options
21
48
  };
22
49
  }
50
+ /**
51
+ * Represents the refresh token service.
52
+ */
23
53
  export class RefreshTokenService {
24
54
  options;
25
55
  constructor(options, signer, verifier) {
package/dist/service.d.ts CHANGED
@@ -92,10 +92,9 @@ export interface VerifyOptions {
92
92
  * patterns.
93
93
  */
94
94
  export declare class JwtService {
95
- private readonly options;
96
95
  private readonly signer;
97
96
  private readonly verifier;
98
- constructor(options: JwtVerifierOptions, signer: DefaultJwtSigner, verifier: DefaultJwtVerifier);
97
+ constructor(_options: JwtVerifierOptions, signer: DefaultJwtSigner, verifier: DefaultJwtVerifier);
99
98
  /**
100
99
  * Signs a JWT access token from arbitrary claim payload plus optional claim overrides.
101
100
  *
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAa,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAe,MAAM,uBAAuB,CAAC;AAExE,KAAK,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAoD1C;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC;IAChD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,qBACa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB;IAG/C;;;;;;;;;;;;;;;OAeG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBnE;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB7E;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAmB/B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAa,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAe,MAAM,uBAAuB,CAAC;AAExE,KAAK,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAoD1C;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC;IAChD;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,qBACa,UAAU;IAGnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFzB,QAAQ,EAAE,kBAAkB,EACX,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB;IAG/C;;;;;;;;;;;;;;;OAeG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBnE;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAQ7E;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAmB/B"}
package/dist/service.js CHANGED
@@ -74,8 +74,7 @@ class JwtService {
74
74
  static {
75
75
  [_JwtService, _initClass] = _applyDecs(this, [Inject(JWT_OPTIONS, DefaultJwtSigner, DefaultJwtVerifier)], []).c;
76
76
  }
77
- constructor(options, signer, verifier) {
78
- this.options = options;
77
+ constructor(_options, signer, verifier) {
79
78
  this.signer = signer;
80
79
  this.verifier = verifier;
81
80
  }
@@ -130,16 +129,7 @@ class JwtService {
130
129
  * @throws {JwtConfigurationError} When the active verifier configuration cannot validate the token.
131
130
  */
132
131
  async verify(token, options) {
133
- const verifier = options ? new DefaultJwtVerifier({
134
- ...this.options,
135
- algorithms: options.algorithms ?? this.options.algorithms,
136
- audience: options.audience ?? this.options.audience,
137
- clockSkewSeconds: options.clockSkewSeconds ?? this.options.clockSkewSeconds,
138
- issuer: options.issuer ?? this.options.issuer,
139
- maxAge: options.maxAge ?? this.options.maxAge,
140
- requireExp: options.requireExp ?? this.options.requireExp
141
- }) : this.verifier;
142
- const principal = await verifier.verifyAccessToken(token);
132
+ const principal = options ? await this.verifier.verifyAccessTokenWithOverrides(token, options) : await this.verifier.verifyAccessToken(token);
143
133
  return principal.claims;
144
134
  }
145
135
 
@@ -1,4 +1,7 @@
1
1
  import { type KeyObject } from 'node:crypto';
2
+ /**
3
+ * Represents the jwks client.
4
+ */
2
5
  export declare class JwksClient {
3
6
  private readonly uri;
4
7
  private readonly cacheTtl;
@@ -1 +1 @@
1
- {"version":3,"file":"jwks.d.ts","sourceRoot":"","sources":["../../src/signing/jwks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAa9D,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4D;gBAG/D,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAgB,EAC1B,gBAAgB,GAAE,MAAc;IAGnD,OAAO,CAAC,YAAY;IAId,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YA+BtC,SAAS;CAqCxB"}
1
+ {"version":3,"file":"jwks.d.ts","sourceRoot":"","sources":["../../src/signing/jwks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAa9D;;GAEG;AACH,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4D;gBAG/D,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAgB,EAC1B,gBAAgB,GAAE,MAAc;IAGnD,OAAO,CAAC,YAAY;IAId,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YA+BtC,SAAS;CAqCxB"}
@@ -1,5 +1,8 @@
1
1
  import { createPublicKey } from 'node:crypto';
2
2
  import { JwtConfigurationError, JwtInvalidTokenError } from '../errors.js';
3
+ /**
4
+ * Represents the jwks client.
5
+ */
3
6
  export class JwksClient {
4
7
  cache = new Map();
5
8
  constructor(uri, cacheTtl = 600_000, requestTimeoutMs = 5_000) {
@@ -1 +1 @@
1
- {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signing/signer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAgB,SAAS,EAAe,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAyB5F;;GAEG;AACH,qBACa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;gBAEtB,OAAO,EAAE,kBAAkB;IAMlD,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,OAAO,CAAC,4BAA4B;YAYtB,SAAS;CAkFxB"}
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signing/signer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAgB,SAAS,EAAe,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA0D5F;;GAEG;AACH,qBACa,gBAAgB;IAGf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;gBAEtB,OAAO,EAAE,kBAAkB;IAOlD,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1D,OAAO,CAAC,4BAA4B;YAYtB,SAAS;CAkFxB"}
@@ -17,11 +17,34 @@ function resolveSigningKeyEntry(options, algorithm) {
17
17
  if (!Array.isArray(keys) || keys.length === 0) {
18
18
  return undefined;
19
19
  }
20
- if (algorithm in HMAC_HASH) {
20
+ if (hasOwnAlgorithmMapping(HMAC_HASH, algorithm)) {
21
21
  return keys.find(entry => typeof entry.secret === 'string' && entry.secret.length > 0);
22
22
  }
23
23
  return keys.find(entry => entry.privateKey !== undefined);
24
24
  }
25
+ function hasOwnAlgorithmMapping(mappings, algorithm) {
26
+ return typeof algorithm === 'string' && Object.hasOwn(mappings, algorithm);
27
+ }
28
+ function isSupportedSigningAlgorithm(algorithm) {
29
+ return hasOwnAlgorithmMapping(HMAC_HASH, algorithm) || hasOwnAlgorithmMapping(ASYMMETRIC_HASH, algorithm);
30
+ }
31
+ function assertSigningAlgorithms(algorithms) {
32
+ if (!Array.isArray(algorithms) || algorithms.length === 0) {
33
+ throw new JwtConfigurationError('JWT signer requires at least one allowed JWT algorithm.');
34
+ }
35
+ for (const algorithm of algorithms) {
36
+ if (!isSupportedSigningAlgorithm(algorithm)) {
37
+ throw new JwtConfigurationError(`JWT signer received unsupported JWT algorithm "${String(algorithm)}".`);
38
+ }
39
+ }
40
+ }
41
+ function resolveAccessTokenTtlSeconds(options) {
42
+ const ttl = options.accessTokenTtlSeconds ?? 3600;
43
+ if (!Number.isFinite(ttl) || ttl <= 0) {
44
+ throw new JwtConfigurationError('JWT accessTokenTtlSeconds must be a positive finite number.');
45
+ }
46
+ return ttl;
47
+ }
25
48
 
26
49
  /**
27
50
  * Issues access and refresh tokens with the configured signing keys and algorithms.
@@ -34,7 +57,8 @@ class DefaultJwtSigner {
34
57
  refreshAlgorithms;
35
58
  constructor(options) {
36
59
  this.options = options;
37
- this.refreshAlgorithms = this.options.algorithms.filter(algorithm => algorithm in HMAC_HASH);
60
+ assertSigningAlgorithms(options.algorithms);
61
+ this.refreshAlgorithms = this.options.algorithms.filter(algorithm => hasOwnAlgorithmMapping(HMAC_HASH, algorithm));
38
62
  }
39
63
  async signAccessToken(claims) {
40
64
  return this.signToken(claims, this.options, false);
@@ -56,9 +80,9 @@ class DefaultJwtSigner {
56
80
  async signToken(claims, options, hmacOnly) {
57
81
  const algorithm = options.algorithms.find(alg => {
58
82
  if (hmacOnly) {
59
- return alg in HMAC_HASH;
83
+ return hasOwnAlgorithmMapping(HMAC_HASH, alg);
60
84
  }
61
- return alg in HMAC_HASH || alg in ASYMMETRIC_HASH;
85
+ return isSupportedSigningAlgorithm(alg);
62
86
  });
63
87
  if (!algorithm) {
64
88
  if (hmacOnly) {
@@ -66,9 +90,9 @@ class DefaultJwtSigner {
66
90
  }
67
91
  throw new JwtConfigurationError('JWT signer requires at least one supported algorithm (HS256/HS384/HS512/RS256/RS384/RS512/ES256/ES384/ES512) in the allowed algorithms list.');
68
92
  }
69
- const isAsymmetric = algorithm in ASYMMETRIC_HASH;
93
+ const isAsymmetric = hasOwnAlgorithmMapping(ASYMMETRIC_HASH, algorithm);
70
94
  const now = Math.floor(Date.now() / 1000);
71
- const ttl = options.accessTokenTtlSeconds ?? 3600;
95
+ const ttl = resolveAccessTokenTtlSeconds(options);
72
96
  const payload = {
73
97
  ...claims,
74
98
  aud: claims.aud ?? options.audience,
@@ -0,0 +1,14 @@
1
+ import type { JwtPrincipal, JwtVerifierOptions } from '../types.js';
2
+ import { DefaultJwtVerifier } from './verifier.js';
3
+ type AccessTokenVerificationOverrides = Pick<JwtVerifierOptions, 'algorithms' | 'audience' | 'clockSkewSeconds' | 'issuer' | 'maxAge' | 'requireExp'>;
4
+ /**
5
+ * Applies supported per-call access-token overrides through the verifier's public API.
6
+ *
7
+ * @param verifier Configured verifier whose shared key-resolution state should be reused.
8
+ * @param token Compact JWT string to verify.
9
+ * @param overrides Per-call algorithm and claim-policy overrides.
10
+ * @returns The normalized principal for the verified access token.
11
+ */
12
+ export declare function verifyAccessTokenWithOverrides(verifier: DefaultJwtVerifier, token: string, overrides: Partial<AccessTokenVerificationOverrides>): Promise<JwtPrincipal>;
13
+ export {};
14
+ //# sourceMappingURL=verifier-internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier-internal.d.ts","sourceRoot":"","sources":["../../src/signing/verifier-internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,KAAK,gCAAgC,GAAG,IAAI,CAC1C,kBAAkB,EAClB,YAAY,GAAG,UAAU,GAAG,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CACpF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,CAAC,gCAAgC,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC,CAEvB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Applies supported per-call access-token overrides through the verifier's public API.
3
+ *
4
+ * @param verifier Configured verifier whose shared key-resolution state should be reused.
5
+ * @param token Compact JWT string to verify.
6
+ * @param overrides Per-call algorithm and claim-policy overrides.
7
+ * @returns The normalized principal for the verified access token.
8
+ */
9
+ export function verifyAccessTokenWithOverrides(verifier, token, overrides) {
10
+ return verifier.verifyAccessTokenWithOverrides(token, overrides);
11
+ }
@@ -11,6 +11,7 @@ export declare const HMAC_HASH: Partial<Record<JwtAlgorithm, string>>;
11
11
  * Maps supported asymmetric JWT algorithms to their Node.js hash names.
12
12
  */
13
13
  export declare const ASYMMETRIC_HASH: Partial<Record<JwtAlgorithm, string>>;
14
+ type AccessTokenVerificationOverrides = Pick<JwtVerifierOptions, 'algorithms' | 'audience' | 'clockSkewSeconds' | 'issuer' | 'maxAge' | 'requireExp'>;
14
15
  /**
15
16
  * Verifies JWT access and refresh tokens against the configured key sources.
16
17
  */
@@ -22,6 +23,18 @@ export declare class DefaultJwtVerifier {
22
23
  private readonly refreshVerificationOptions;
23
24
  constructor(options: JwtVerifierOptions);
24
25
  verifyAccessToken(token: string): Promise<JwtPrincipal>;
26
+ /**
27
+ * Verifies a JWT access token with per-call claim-policy overrides while reusing configured key sources.
28
+ *
29
+ * @remarks
30
+ * This override path is intentionally limited to algorithm and claim-validation policy.
31
+ * It does not replace configured JWKS/static keys or the shared `secretOrKeyProvider`.
32
+ *
33
+ * @param token Compact JWT string to verify.
34
+ * @param overrides Per-call algorithm and claim-policy overrides layered on top of module defaults.
35
+ * @returns The normalized principal for the verified access token.
36
+ */
37
+ verifyAccessTokenWithOverrides(token: string, overrides: Partial<AccessTokenVerificationOverrides>): Promise<JwtPrincipal>;
25
38
  verifyRefreshToken(token: string): Promise<JwtPrincipal>;
26
39
  private createRefreshVerificationOptions;
27
40
  private verifyToken;
@@ -35,4 +48,5 @@ export declare class DefaultJwtVerifier {
35
48
  private validateIssuerAndAudience;
36
49
  private resolveJwksPublicKey;
37
50
  }
51
+ export {};
38
52
  //# sourceMappingURL=verifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/signing/verifier.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAA0B,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE1G;;GAEG;AACH,eAAO,MAAM,WAAW,eAAiC,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAI3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAOjE,CAAC;AAuMF;;GAEG;AACH,qBACa,kBAAkB;IAMjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqB;IAC/D,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAiC;gBAE/C,OAAO,EAAE,kBAAkB;IAYlD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvD,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ9D,OAAO,CAAC,gCAAgC;YAsB1B,WAAW;IA+BzB,OAAO,CAAC,kBAAkB;YAUZ,oBAAoB;YAgBpB,wBAAwB;YAsBxB,8BAA8B;YAsB9B,kBAAkB;IAWhC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,yBAAyB;YAiBnB,oBAAoB;CAOnC"}
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/signing/verifier.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAA0B,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG1G;;GAEG;AACH,eAAO,MAAM,WAAW,eAAiC,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAI3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAOjE,CAAC;AAiCF,KAAK,gCAAgC,GAAG,IAAI,CAC1C,kBAAkB,EAClB,YAAY,GAAG,UAAU,GAAG,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CACpF,CAAC;AA+LF;;GAEG;AACH,qBACa,kBAAkB;IAMjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqB;IAC/D,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAiC;gBAE/C,OAAO,EAAE,kBAAkB;IAalD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAI7D;;;;;;;;;;OAUG;IACG,8BAA8B,CAClC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,CAAC,gCAAgC,CAAC,GACnD,OAAO,CAAC,YAAY,CAAC;IAqBlB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ9D,OAAO,CAAC,gCAAgC;YAsB1B,WAAW;IA+BzB,OAAO,CAAC,kBAAkB;YAUZ,oBAAoB;YAgBpB,wBAAwB;YAsBxB,8BAA8B;YAsB9B,kBAAkB;IAWhC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,yBAAyB;YAiBnB,oBAAoB;CAOnC"}
@@ -7,8 +7,9 @@ function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side
7
7
  import { createHmac, createVerify, timingSafeEqual } from 'node:crypto';
8
8
  import { Inject } from '@fluojs/core';
9
9
  import { JwtConfigurationError, JwtExpiredTokenError, JwtInvalidTokenError } from '../errors.js';
10
- import { JwksClient } from './jwks.js';
11
10
  import { normalizeRefreshTokenOptions } from '../refresh/refresh-token.js';
11
+ import { JwksClient } from './jwks.js';
12
+
12
13
  /**
13
14
  * Provides the resolved JWT verifier options through dependency injection.
14
15
  */
@@ -34,8 +35,24 @@ export const ASYMMETRIC_HASH = {
34
35
  ES384: 'sha384',
35
36
  ES512: 'sha512'
36
37
  };
38
+ function hasOwnAlgorithmMapping(mappings, alg) {
39
+ return typeof alg === 'string' && Object.hasOwn(mappings, alg);
40
+ }
41
+ function isSupportedAlgorithm(alg) {
42
+ return hasOwnAlgorithmMapping(HMAC_HASH, alg) || hasOwnAlgorithmMapping(ASYMMETRIC_HASH, alg);
43
+ }
44
+ function assertJwtAlgorithms(algorithms, context) {
45
+ if (!Array.isArray(algorithms) || algorithms.length === 0) {
46
+ throw new JwtConfigurationError(`${context} requires at least one allowed JWT algorithm.`);
47
+ }
48
+ for (const algorithm of algorithms) {
49
+ if (!isSupportedAlgorithm(algorithm)) {
50
+ throw new JwtConfigurationError(`${context} received unsupported JWT algorithm "${String(algorithm)}".`);
51
+ }
52
+ }
53
+ }
37
54
  function isAllowedAlgorithm(alg, allowed) {
38
- return typeof alg === 'string' && allowed.includes(alg) && (alg in HMAC_HASH || alg in ASYMMETRIC_HASH);
55
+ return isSupportedAlgorithm(alg) && allowed.includes(alg);
39
56
  }
40
57
  function isFiniteNumericDate(value) {
41
58
  return typeof value === 'number' && Number.isFinite(value);
@@ -175,6 +192,7 @@ class DefaultJwtVerifier {
175
192
  refreshVerificationOptions;
176
193
  constructor(options) {
177
194
  this.options = options;
195
+ assertJwtAlgorithms(options.algorithms, 'JWT verifier');
178
196
  this.jwksClient = options.jwksUri ? new JwksClient(options.jwksUri, options.jwksCacheTtl, options.jwksRequestTimeoutMs) : undefined;
179
197
  this.keyResolutionState = createKeyResolutionState(options.keys);
180
198
  this.refreshVerificationOptions = options.refreshToken ? this.createRefreshVerificationOptions(normalizeRefreshTokenOptions(options.refreshToken)) : undefined;
@@ -183,6 +201,31 @@ class DefaultJwtVerifier {
183
201
  async verifyAccessToken(token) {
184
202
  return this.verifyToken(token, this.options, this.keyResolutionState, this.jwksClient);
185
203
  }
204
+
205
+ /**
206
+ * Verifies a JWT access token with per-call claim-policy overrides while reusing configured key sources.
207
+ *
208
+ * @remarks
209
+ * This override path is intentionally limited to algorithm and claim-validation policy.
210
+ * It does not replace configured JWKS/static keys or the shared `secretOrKeyProvider`.
211
+ *
212
+ * @param token Compact JWT string to verify.
213
+ * @param overrides Per-call algorithm and claim-policy overrides layered on top of module defaults.
214
+ * @returns The normalized principal for the verified access token.
215
+ */
216
+ async verifyAccessTokenWithOverrides(token, overrides) {
217
+ const algorithms = overrides.algorithms ?? this.options.algorithms;
218
+ assertJwtAlgorithms(algorithms, 'JWT verifier');
219
+ return this.verifyToken(token, {
220
+ ...this.options,
221
+ algorithms,
222
+ audience: overrides.audience ?? this.options.audience,
223
+ clockSkewSeconds: overrides.clockSkewSeconds ?? this.options.clockSkewSeconds,
224
+ issuer: overrides.issuer ?? this.options.issuer,
225
+ maxAge: overrides.maxAge ?? this.options.maxAge,
226
+ requireExp: overrides.requireExp ?? this.options.requireExp
227
+ }, this.keyResolutionState, this.jwksClient);
228
+ }
186
229
  async verifyRefreshToken(token) {
187
230
  if (!this.refreshVerificationOptions) {
188
231
  throw new JwtConfigurationError('JWT refresh token options are not configured.');
@@ -190,7 +233,7 @@ class DefaultJwtVerifier {
190
233
  return this.verifyToken(token, this.refreshVerificationOptions, this.refreshKeyResolutionState, undefined);
191
234
  }
192
235
  createRefreshVerificationOptions(refreshToken) {
193
- const algorithms = this.options.algorithms.filter(algorithm => algorithm in HMAC_HASH);
236
+ const algorithms = this.options.algorithms.filter(algorithm => hasOwnAlgorithmMapping(HMAC_HASH, algorithm));
194
237
  if (algorithms.length === 0) {
195
238
  throw new JwtConfigurationError('JWT refresh token verifier requires at least one HMAC algorithm (HS256/HS384/HS512) in the allowed algorithms list.');
196
239
  }
@@ -228,7 +271,7 @@ class DefaultJwtVerifier {
228
271
  return segments;
229
272
  }
230
273
  async verifyTokenSignature(header, signingInput, signatureSegment, options, keyResolutionState, jwksClient) {
231
- if (header.alg in HMAC_HASH) {
274
+ if (hasOwnAlgorithmMapping(HMAC_HASH, header.alg)) {
232
275
  await this.verifyHmacTokenSignature(header, signingInput, signatureSegment, options, keyResolutionState);
233
276
  return;
234
277
  }
package/dist/status.d.ts CHANGED
@@ -1,10 +1,16 @@
1
1
  import type { PlatformDiagnosticIssue, PlatformHealthReport, PlatformReadinessReport, PlatformSnapshot } from '@fluojs/runtime';
2
+ /**
3
+ * Describes the jwt platform status snapshot contract.
4
+ */
2
5
  export interface JwtPlatformStatusSnapshot {
3
6
  readiness: PlatformReadinessReport;
4
7
  health: PlatformHealthReport;
5
8
  ownership: PlatformSnapshot['ownership'];
6
9
  details: Record<string, unknown>;
7
10
  }
11
+ /**
12
+ * Describes the jwt status adapter input contract.
13
+ */
8
14
  export interface JwtStatusAdapterInput {
9
15
  componentId?: string;
10
16
  readinessCritical?: boolean;
@@ -14,6 +20,18 @@ export interface JwtStatusAdapterInput {
14
20
  refreshTokenDependencyId?: string;
15
21
  signingKeySource?: 'shared-secret' | 'key-pair' | 'jwks' | 'key-provider';
16
22
  }
23
+ /**
24
+ * Create jwt platform status snapshot.
25
+ *
26
+ * @param input The input.
27
+ * @returns The create jwt platform status snapshot result.
28
+ */
17
29
  export declare function createJwtPlatformStatusSnapshot(input: JwtStatusAdapterInput): JwtPlatformStatusSnapshot;
30
+ /**
31
+ * Create jwt platform diagnostic issues.
32
+ *
33
+ * @param input The input.
34
+ * @returns The create jwt platform diagnostic issues result.
35
+ */
18
36
  export declare function createJwtPlatformDiagnosticIssues(input: JwtStatusAdapterInput): PlatformDiagnosticIssue[];
19
37
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,uBAAuB,CAAC;IACnC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;CAC3E;AAwCD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,qBAAqB,GAAG,yBAAyB,CA4CvG;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,qBAAqB,GAAG,uBAAuB,EAAE,CAqBzG"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,uBAAuB,CAAC;IACnC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;CAC3E;AAwCD;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,qBAAqB,GAAG,yBAAyB,CA4CvG;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,qBAAqB,GAAG,uBAAuB,EAAE,CAqBzG"}
package/dist/status.js CHANGED
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Describes the jwt platform status snapshot contract.
3
+ */
4
+
5
+ /**
6
+ * Describes the jwt status adapter input contract.
7
+ */
8
+
1
9
  function isRefreshTokenStoreReady(input) {
2
10
  if (!input.refreshTokenEnabled) {
3
11
  return true;
@@ -29,6 +37,13 @@ function createHealth(input) {
29
37
  status: 'degraded'
30
38
  };
31
39
  }
40
+
41
+ /**
42
+ * Create jwt platform status snapshot.
43
+ *
44
+ * @param input The input.
45
+ * @returns The create jwt platform status snapshot result.
46
+ */
32
47
  export function createJwtPlatformStatusSnapshot(input) {
33
48
  const componentId = input.componentId ?? 'jwt.default';
34
49
  const refreshStoreReady = isRefreshTokenStoreReady(input);
@@ -65,6 +80,13 @@ export function createJwtPlatformStatusSnapshot(input) {
65
80
  readiness: createReadiness(input)
66
81
  };
67
82
  }
83
+
84
+ /**
85
+ * Create jwt platform diagnostic issues.
86
+ *
87
+ * @param input The input.
88
+ * @returns The create jwt platform diagnostic issues result.
89
+ */
68
90
  export function createJwtPlatformDiagnosticIssues(input) {
69
91
  if (isRefreshTokenStoreReady(input)) {
70
92
  return [];
package/dist/types.d.ts CHANGED
@@ -1,17 +1,28 @@
1
1
  import type { KeyObject } from 'node:crypto';
2
2
  import type { RefreshTokenOptions } from './refresh/refresh-token.js';
3
+ /**
4
+ * Defines the jwt algorithm type.
5
+ */
3
6
  export type JwtAlgorithm = 'HS256' | 'HS384' | 'HS512' | 'RS256' | 'RS384' | 'RS512' | 'ES256' | 'ES384' | 'ES512';
7
+ /**
8
+ * Describes the jwt key entry contract.
9
+ */
4
10
  export interface JwtKeyEntry {
5
11
  kid: string;
6
12
  secret?: string;
7
13
  privateKey?: string | KeyObject;
8
14
  publicKey?: string | KeyObject;
9
15
  }
16
+ /**
17
+ * Describes the jwt verifier options contract.
18
+ */
10
19
  export interface JwtVerifierOptions {
11
20
  algorithms: JwtAlgorithm[];
12
21
  accessTokenTtlSeconds?: number;
13
22
  audience?: string | string[];
14
23
  clockSkewSeconds?: number;
24
+ /** Whether JWT providers should be visible globally. Defaults to `false`. */
25
+ global?: boolean;
15
26
  issuer?: string;
16
27
  jwksCacheTtl?: number;
17
28
  jwksRequestTimeoutMs?: number;
@@ -29,6 +40,9 @@ export interface JwtVerifierOptions {
29
40
  publicKey?: string | KeyObject;
30
41
  refreshToken?: RefreshTokenOptions;
31
42
  }
43
+ /**
44
+ * Describes the jwt claims contract.
45
+ */
32
46
  export interface JwtClaims extends Record<string, unknown> {
33
47
  aud?: string | string[];
34
48
  exp?: number;
@@ -39,6 +53,9 @@ export interface JwtClaims extends Record<string, unknown> {
39
53
  scopes?: string[];
40
54
  sub?: string;
41
55
  }
56
+ /**
57
+ * Describes the jwt principal contract.
58
+ */
42
59
  export interface JwtPrincipal {
43
60
  subject: string;
44
61
  issuer?: string;
@@ -47,9 +64,15 @@ export interface JwtPrincipal {
47
64
  scopes?: string[];
48
65
  claims: Record<string, unknown>;
49
66
  }
67
+ /**
68
+ * Describes the jwt verifier contract.
69
+ */
50
70
  export interface JwtVerifier {
51
71
  verifyAccessToken(token: string): Promise<JwtPrincipal>;
52
72
  }
73
+ /**
74
+ * Describes the jwt signer contract.
75
+ */
53
76
  export interface JwtSigner {
54
77
  signAccessToken(claims: JwtClaims): Promise<string>;
55
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACrH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,WAAW,SAAU,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACrH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,SAAU,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACxD,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD"}
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "signing",
10
10
  "verification"
11
11
  ],
12
- "version": "1.0.0-beta.1",
12
+ "version": "1.0.0-beta.3",
13
13
  "private": false,
14
14
  "license": "MIT",
15
15
  "repository": {
@@ -36,9 +36,9 @@
36
36
  "dist"
37
37
  ],
38
38
  "dependencies": {
39
- "@fluojs/core": "^1.0.0-beta.1",
40
- "@fluojs/di": "^1.0.0-beta.1",
41
- "@fluojs/runtime": "^1.0.0-beta.1"
39
+ "@fluojs/core": "^1.0.0-beta.4",
40
+ "@fluojs/di": "^1.0.0-beta.6",
41
+ "@fluojs/runtime": "^1.0.0-beta.11"
42
42
  },
43
43
  "devDependencies": {
44
44
  "vitest": "^3.2.4"