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