( request: HttpClientRequest.HttpClientRequest, options: DiscoveryRequestOptions, errorMessage: string, )
| 182 | effect.pipe(Effect.provide(options.httpClientLayer ?? FetchHttpClient.layer)); |
| 183 | |
| 184 | const executeText = ( |
| 185 | request: HttpClientRequest.HttpClientRequest, |
| 186 | options: DiscoveryRequestOptions, |
| 187 | errorMessage: string, |
| 188 | ): Effect.Effect<{ readonly status: number; readonly body: string }, OAuthDiscoveryError> => |
| 189 | provideHttpClient( |
| 190 | Effect.gen(function* () { |
| 191 | const client = yield* HttpClient.HttpClient; |
| 192 | const response = yield* client.execute(request).pipe( |
| 193 | Effect.timeoutOrElse({ |
| 194 | duration: Duration.millis(options.timeoutMs ?? OAUTH2_DEFAULT_TIMEOUT_MS), |
| 195 | orElse: () => |
| 196 | Effect.fail( |
| 197 | new OAuthDiscoveryError({ |
| 198 | message: errorMessage, |
| 199 | cause: "timeout", |
| 200 | }), |
| 201 | ), |
| 202 | }), |
| 203 | Effect.mapError((cause) => |
| 204 | Predicate.isTagged(cause, "OAuthDiscoveryError") |
| 205 | ? cause |
| 206 | : new OAuthDiscoveryError({ |
| 207 | message: errorMessage, |
| 208 | cause, |
| 209 | }), |
| 210 | ), |
| 211 | ); |
| 212 | const body = yield* response.text.pipe( |
| 213 | Effect.catch(() => Effect.succeed("")), |
| 214 | Effect.mapError( |
| 215 | (cause) => |
| 216 | new OAuthDiscoveryError({ |
| 217 | message: `${errorMessage}: response body could not be read`, |
| 218 | status: response.status, |
| 219 | cause, |
| 220 | }), |
| 221 | ), |
| 222 | ); |
| 223 | return { status: response.status, body }; |
| 224 | }), |
| 225 | options, |
| 226 | ); |
| 227 | |
| 228 | // --------------------------------------------------------------------------- |
| 229 | // RFC 9728 — Protected Resource Metadata |
no test coverage detected