( request: HttpClientRequest.HttpClientRequest, options: DiscoveryRequestOptions, errorMessage: string, )
| 205 | effect.pipe(Effect.provide(options.httpClientLayer ?? FetchHttpClient.layer)); |
| 206 | |
| 207 | const executeText = ( |
| 208 | request: HttpClientRequest.HttpClientRequest, |
| 209 | options: DiscoveryRequestOptions, |
| 210 | errorMessage: string, |
| 211 | ): Effect.Effect<{ readonly status: number; readonly body: string }, OAuthDiscoveryError> => |
| 212 | provideHttpClient( |
| 213 | Effect.gen(function* () { |
| 214 | const client = yield* HttpClient.HttpClient; |
| 215 | const response = yield* client.execute(request).pipe( |
| 216 | Effect.timeoutOrElse({ |
| 217 | duration: Duration.millis(options.timeoutMs ?? OAUTH2_DEFAULT_TIMEOUT_MS), |
| 218 | orElse: () => |
| 219 | Effect.fail( |
| 220 | new OAuthDiscoveryError({ |
| 221 | message: errorMessage, |
| 222 | cause: "timeout", |
| 223 | }), |
| 224 | ), |
| 225 | }), |
| 226 | Effect.mapError((cause) => |
| 227 | Predicate.isTagged(cause, "OAuthDiscoveryError") |
| 228 | ? cause |
| 229 | : new OAuthDiscoveryError({ |
| 230 | message: errorMessage, |
| 231 | cause, |
| 232 | }), |
| 233 | ), |
| 234 | ); |
| 235 | const body = yield* response.text.pipe( |
| 236 | Effect.catch(() => Effect.succeed("")), |
| 237 | Effect.mapError( |
| 238 | (cause) => |
| 239 | new OAuthDiscoveryError({ |
| 240 | message: `${errorMessage}: response body could not be read`, |
| 241 | status: response.status, |
| 242 | cause, |
| 243 | }), |
| 244 | ), |
| 245 | ); |
| 246 | return { status: response.status, body }; |
| 247 | }), |
| 248 | options, |
| 249 | ); |
| 250 | |
| 251 | // --------------------------------------------------------------------------- |
| 252 | // RFC 9728 — Protected Resource Metadata |
no test coverage detected