(config: Config)
| 143 | } |
| 144 | |
| 145 | const makeResolveConfig = (config: Config) => { |
| 146 | let cached: Promise<ResolvedConfig> | undefined |
| 147 | |
| 148 | return Effect.tryPromise({ |
| 149 | try: () => { |
| 150 | if (!cached) { |
| 151 | cached = (async (): Promise<ResolvedConfig> => { |
| 152 | const discovery = config.issuerBaseURL |
| 153 | ? await fetchDiscoveryDocumentPromise(config.issuerBaseURL) |
| 154 | : undefined |
| 155 | |
| 156 | const issuer = config.issuer ?? discovery?.issuer |
| 157 | const jwksUri = config.jwksUri ?? discovery?.jwksUri |
| 158 | const secret = config.secret |
| 159 | const base = { |
| 160 | audience: normalizeAudience(config.audience), |
| 161 | clockTolerance: config.clockTolerance ?? 5, |
| 162 | issuer, |
| 163 | maxTokenAge: config.maxTokenAge, |
| 164 | strict: config.strict ?? false, |
| 165 | tokenSigningAlg: config.tokenSigningAlg |
| 166 | } satisfies ResolvedConfigBase |
| 167 | |
| 168 | if (!issuer && !secret) { |
| 169 | throw new InvalidRequestError("JWT config requires 'issuer', 'issuerBaseURL', or 'secret'") |
| 170 | } |
| 171 | |
| 172 | if (!secret) { |
| 173 | if (!jwksUri) { |
| 174 | throw new InvalidRequestError("JWT config requires 'jwksUri', 'issuerBaseURL', or 'secret'") |
| 175 | } |
| 176 | |
| 177 | return { |
| 178 | ...base, |
| 179 | key: createRemoteJWKSet(new URL(jwksUri)), |
| 180 | keyType: "jwks" |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | return { |
| 185 | ...base, |
| 186 | key: new TextEncoder().encode(secret), |
| 187 | keyType: "secret" |
| 188 | } |
| 189 | })() |
| 190 | } |
| 191 | |
| 192 | return cached |
| 193 | }, |
| 194 | catch: (error) => |
| 195 | error instanceof InvalidRequestError || error instanceof InvalidTokenError |
| 196 | ? error |
| 197 | : new InvalidTokenError(getErrorMessage(error)) |
| 198 | }) |
| 199 | } |
| 200 | |
| 201 | const verifyToken = |
| 202 | (resolveConfig: Effect.Effect<ResolvedConfig, InvalidRequestError | InvalidTokenError>) => (token: string) => |
no test coverage detected
searching dependent graphs…