@effect/platform 0.68.6 → 0.69.0
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/HttpApiMiddleware/package.json +6 -0
- package/README.md +306 -233
- package/dist/cjs/Headers.js +7 -2
- package/dist/cjs/Headers.js.map +1 -1
- package/dist/cjs/HttpApi.js +90 -78
- package/dist/cjs/HttpApi.js.map +1 -1
- package/dist/cjs/HttpApiBuilder.js +243 -255
- package/dist/cjs/HttpApiBuilder.js.map +1 -1
- package/dist/cjs/HttpApiClient.js +64 -59
- package/dist/cjs/HttpApiClient.js.map +1 -1
- package/dist/cjs/HttpApiEndpoint.js +74 -109
- package/dist/cjs/HttpApiEndpoint.js.map +1 -1
- package/dist/cjs/HttpApiError.js +3 -4
- package/dist/cjs/HttpApiError.js.map +1 -1
- package/dist/cjs/HttpApiGroup.js +103 -100
- package/dist/cjs/HttpApiGroup.js.map +1 -1
- package/dist/cjs/HttpApiMiddleware.js +67 -0
- package/dist/cjs/HttpApiMiddleware.js.map +1 -0
- package/dist/cjs/HttpApiSchema.js +33 -7
- package/dist/cjs/HttpApiSchema.js.map +1 -1
- package/dist/cjs/HttpApiSecurity.js +2 -2
- package/dist/cjs/HttpApiSecurity.js.map +1 -1
- package/dist/cjs/HttpApiSwagger.js +3 -1
- package/dist/cjs/HttpApiSwagger.js.map +1 -1
- package/dist/cjs/HttpBody.js.map +1 -1
- package/dist/cjs/HttpIncomingMessage.js +5 -1
- package/dist/cjs/HttpIncomingMessage.js.map +1 -1
- package/dist/cjs/HttpServer.js +12 -1
- package/dist/cjs/HttpServer.js.map +1 -1
- package/dist/cjs/HttpServerRespondable.js +1 -1
- package/dist/cjs/HttpServerRespondable.js.map +1 -1
- package/dist/cjs/OpenApi.js +102 -63
- package/dist/cjs/OpenApi.js.map +1 -1
- package/dist/cjs/OpenApiJsonSchema.js +58 -47
- package/dist/cjs/OpenApiJsonSchema.js.map +1 -1
- package/dist/cjs/Transferable.js +2 -2
- package/dist/cjs/Transferable.js.map +1 -1
- package/dist/cjs/UrlParams.js +5 -1
- package/dist/cjs/UrlParams.js.map +1 -1
- package/dist/cjs/Worker.js.map +1 -1
- package/dist/cjs/WorkerError.js +1 -5
- package/dist/cjs/WorkerError.js.map +1 -1
- package/dist/cjs/WorkerRunner.js.map +1 -1
- package/dist/cjs/index.js +3 -1
- package/dist/cjs/internal/httpBody.js +1 -1
- package/dist/cjs/internal/httpBody.js.map +1 -1
- package/dist/cjs/internal/httpClientRequest.js.map +1 -1
- package/dist/cjs/internal/httpClientResponse.js +1 -1
- package/dist/cjs/internal/httpClientResponse.js.map +1 -1
- package/dist/cjs/internal/httpRouter.js +1 -1
- package/dist/cjs/internal/httpRouter.js.map +1 -1
- package/dist/cjs/internal/httpServer.js +7 -1
- package/dist/cjs/internal/httpServer.js.map +1 -1
- package/dist/cjs/internal/httpServerRequest.js +1 -1
- package/dist/cjs/internal/httpServerRequest.js.map +1 -1
- package/dist/cjs/internal/httpServerResponse.js.map +1 -1
- package/dist/cjs/internal/keyValueStore.js +1 -1
- package/dist/cjs/internal/keyValueStore.js.map +1 -1
- package/dist/cjs/internal/multipart.js +1 -1
- package/dist/cjs/internal/multipart.js.map +1 -1
- package/dist/cjs/internal/worker.js +6 -7
- package/dist/cjs/internal/worker.js.map +1 -1
- package/dist/cjs/internal/workerRunner.js +3 -4
- package/dist/cjs/internal/workerRunner.js.map +1 -1
- package/dist/dts/Headers.d.ts +4 -6
- package/dist/dts/Headers.d.ts.map +1 -1
- package/dist/dts/HttpApi.d.ts +64 -140
- package/dist/dts/HttpApi.d.ts.map +1 -1
- package/dist/dts/HttpApiBuilder.d.ts +84 -167
- package/dist/dts/HttpApiBuilder.d.ts.map +1 -1
- package/dist/dts/HttpApiClient.d.ts +34 -11
- package/dist/dts/HttpApiClient.d.ts.map +1 -1
- package/dist/dts/HttpApiEndpoint.d.ts +119 -273
- package/dist/dts/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/dts/HttpApiError.d.ts +5 -2
- package/dist/dts/HttpApiError.d.ts.map +1 -1
- package/dist/dts/HttpApiGroup.d.ts +96 -194
- package/dist/dts/HttpApiGroup.d.ts.map +1 -1
- package/dist/dts/HttpApiMiddleware.d.ts +231 -0
- package/dist/dts/HttpApiMiddleware.d.ts.map +1 -0
- package/dist/dts/HttpApiSchema.d.ts +6 -2
- package/dist/dts/HttpApiSchema.d.ts.map +1 -1
- package/dist/dts/HttpApiSecurity.d.ts +1 -1
- package/dist/dts/HttpApiSecurity.d.ts.map +1 -1
- package/dist/dts/HttpApiSwagger.d.ts +2 -2
- package/dist/dts/HttpApiSwagger.d.ts.map +1 -1
- package/dist/dts/HttpBody.d.ts +2 -2
- package/dist/dts/HttpBody.d.ts.map +1 -1
- package/dist/dts/HttpClientRequest.d.ts +2 -2
- package/dist/dts/HttpClientRequest.d.ts.map +1 -1
- package/dist/dts/HttpClientResponse.d.ts +3 -3
- package/dist/dts/HttpClientResponse.d.ts.map +1 -1
- package/dist/dts/HttpIncomingMessage.d.ts +3 -3
- package/dist/dts/HttpIncomingMessage.d.ts.map +1 -1
- package/dist/dts/HttpRouter.d.ts +3 -3
- package/dist/dts/HttpRouter.d.ts.map +1 -1
- package/dist/dts/HttpServer.d.ts +15 -0
- package/dist/dts/HttpServer.d.ts.map +1 -1
- package/dist/dts/HttpServerRequest.d.ts +3 -3
- package/dist/dts/HttpServerRequest.d.ts.map +1 -1
- package/dist/dts/HttpServerRespondable.d.ts.map +1 -1
- package/dist/dts/HttpServerResponse.d.ts +2 -2
- package/dist/dts/HttpServerResponse.d.ts.map +1 -1
- package/dist/dts/KeyValueStore.d.ts +2 -2
- package/dist/dts/KeyValueStore.d.ts.map +1 -1
- package/dist/dts/Multipart.d.ts +3 -3
- package/dist/dts/Multipart.d.ts.map +1 -1
- package/dist/dts/OpenApi.d.ts +17 -39
- package/dist/dts/OpenApi.d.ts.map +1 -1
- package/dist/dts/OpenApiJsonSchema.d.ts +10 -5
- package/dist/dts/OpenApiJsonSchema.d.ts.map +1 -1
- package/dist/dts/Transferable.d.ts +4 -1
- package/dist/dts/Transferable.d.ts.map +1 -1
- package/dist/dts/UrlParams.d.ts +3 -6
- package/dist/dts/UrlParams.d.ts.map +1 -1
- package/dist/dts/Worker.d.ts +7 -8
- package/dist/dts/Worker.d.ts.map +1 -1
- package/dist/dts/WorkerError.d.ts +1 -1
- package/dist/dts/WorkerError.d.ts.map +1 -1
- package/dist/dts/WorkerRunner.d.ts +2 -3
- package/dist/dts/WorkerRunner.d.ts.map +1 -1
- package/dist/dts/index.d.ts +4 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/httpRouter.d.ts.map +1 -1
- package/dist/esm/Headers.js +7 -2
- package/dist/esm/Headers.js.map +1 -1
- package/dist/esm/HttpApi.js +88 -77
- package/dist/esm/HttpApi.js.map +1 -1
- package/dist/esm/HttpApiBuilder.js +236 -244
- package/dist/esm/HttpApiBuilder.js.map +1 -1
- package/dist/esm/HttpApiClient.js +64 -59
- package/dist/esm/HttpApiClient.js.map +1 -1
- package/dist/esm/HttpApiEndpoint.js +73 -106
- package/dist/esm/HttpApiEndpoint.js.map +1 -1
- package/dist/esm/HttpApiError.js +3 -4
- package/dist/esm/HttpApiError.js.map +1 -1
- package/dist/esm/HttpApiGroup.js +102 -99
- package/dist/esm/HttpApiGroup.js.map +1 -1
- package/dist/esm/HttpApiMiddleware.js +56 -0
- package/dist/esm/HttpApiMiddleware.js.map +1 -0
- package/dist/esm/HttpApiSchema.js +31 -5
- package/dist/esm/HttpApiSchema.js.map +1 -1
- package/dist/esm/HttpApiSecurity.js +1 -1
- package/dist/esm/HttpApiSecurity.js.map +1 -1
- package/dist/esm/HttpApiSwagger.js +4 -2
- package/dist/esm/HttpApiSwagger.js.map +1 -1
- package/dist/esm/HttpBody.js.map +1 -1
- package/dist/esm/HttpIncomingMessage.js +4 -1
- package/dist/esm/HttpIncomingMessage.js.map +1 -1
- package/dist/esm/HttpServer.js +11 -0
- package/dist/esm/HttpServer.js.map +1 -1
- package/dist/esm/HttpServerRespondable.js +1 -1
- package/dist/esm/HttpServerRespondable.js.map +1 -1
- package/dist/esm/OpenApi.js +97 -59
- package/dist/esm/OpenApi.js.map +1 -1
- package/dist/esm/OpenApiJsonSchema.js +56 -46
- package/dist/esm/OpenApiJsonSchema.js.map +1 -1
- package/dist/esm/Transferable.js +2 -2
- package/dist/esm/Transferable.js.map +1 -1
- package/dist/esm/UrlParams.js +4 -1
- package/dist/esm/UrlParams.js.map +1 -1
- package/dist/esm/Worker.js.map +1 -1
- package/dist/esm/WorkerError.js +1 -4
- package/dist/esm/WorkerError.js.map +1 -1
- package/dist/esm/WorkerRunner.js.map +1 -1
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/httpBody.js +1 -1
- package/dist/esm/internal/httpBody.js.map +1 -1
- package/dist/esm/internal/httpClientRequest.js.map +1 -1
- package/dist/esm/internal/httpClientResponse.js +1 -1
- package/dist/esm/internal/httpClientResponse.js.map +1 -1
- package/dist/esm/internal/httpRouter.js +1 -1
- package/dist/esm/internal/httpRouter.js.map +1 -1
- package/dist/esm/internal/httpServer.js +6 -0
- package/dist/esm/internal/httpServer.js.map +1 -1
- package/dist/esm/internal/httpServerRequest.js +1 -1
- package/dist/esm/internal/httpServerRequest.js.map +1 -1
- package/dist/esm/internal/httpServerResponse.js.map +1 -1
- package/dist/esm/internal/keyValueStore.js +1 -1
- package/dist/esm/internal/keyValueStore.js.map +1 -1
- package/dist/esm/internal/multipart.js +1 -1
- package/dist/esm/internal/multipart.js.map +1 -1
- package/dist/esm/internal/worker.js +6 -7
- package/dist/esm/internal/worker.js.map +1 -1
- package/dist/esm/internal/workerRunner.js +3 -4
- package/dist/esm/internal/workerRunner.js.map +1 -1
- package/package.json +10 -3
- package/src/Headers.ts +12 -4
- package/src/HttpApi.ts +183 -258
- package/src/HttpApiBuilder.ts +532 -481
- package/src/HttpApiClient.ts +163 -112
- package/src/HttpApiEndpoint.ts +443 -564
- package/src/HttpApiError.ts +4 -6
- package/src/HttpApiGroup.ts +277 -325
- package/src/HttpApiMiddleware.ts +318 -0
- package/src/HttpApiSchema.ts +39 -2
- package/src/HttpApiSecurity.ts +1 -1
- package/src/HttpApiSwagger.ts +3 -3
- package/src/HttpBody.ts +2 -2
- package/src/HttpClientRequest.ts +2 -2
- package/src/HttpClientResponse.ts +3 -3
- package/src/HttpIncomingMessage.ts +3 -3
- package/src/HttpRouter.ts +3 -3
- package/src/HttpServer.ts +21 -0
- package/src/HttpServerRequest.ts +3 -3
- package/src/HttpServerRespondable.ts +1 -1
- package/src/HttpServerResponse.ts +2 -2
- package/src/KeyValueStore.ts +2 -2
- package/src/Multipart.ts +3 -3
- package/src/OpenApi.ts +113 -104
- package/src/OpenApiJsonSchema.ts +67 -53
- package/src/Transferable.ts +2 -2
- package/src/UrlParams.ts +3 -3
- package/src/Worker.ts +7 -8
- package/src/WorkerError.ts +1 -1
- package/src/WorkerRunner.ts +2 -3
- package/src/index.ts +5 -0
- package/src/internal/httpBody.ts +2 -2
- package/src/internal/httpClientRequest.ts +2 -2
- package/src/internal/httpClientResponse.ts +3 -3
- package/src/internal/httpRouter.ts +2 -2
- package/src/internal/httpServer.ts +13 -0
- package/src/internal/httpServerRequest.ts +3 -3
- package/src/internal/httpServerResponse.ts +2 -2
- package/src/internal/keyValueStore.ts +1 -1
- package/src/internal/multipart.ts +3 -3
- package/src/internal/worker.ts +6 -7
- package/src/internal/workerRunner.ts +3 -4
package/src/HttpApiClient.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import * as ParseResult from "@effect/schema/ParseResult"
|
|
5
|
-
import * as Schema from "@effect/schema/Schema"
|
|
6
4
|
import * as Context from "effect/Context"
|
|
7
5
|
import * as Effect from "effect/Effect"
|
|
8
6
|
import { identity } from "effect/Function"
|
|
9
7
|
import * as Option from "effect/Option"
|
|
8
|
+
import * as ParseResult from "effect/ParseResult"
|
|
9
|
+
import * as Schema from "effect/Schema"
|
|
10
|
+
import type * as AST from "effect/SchemaAST"
|
|
11
|
+
import type { Scope } from "effect/Scope"
|
|
10
12
|
import type { Simplify } from "effect/Types"
|
|
11
13
|
import * as HttpApi from "./HttpApi.js"
|
|
12
14
|
import type { HttpApiEndpoint } from "./HttpApiEndpoint.js"
|
|
@@ -17,49 +19,89 @@ import * as HttpClientError from "./HttpClientError.js"
|
|
|
17
19
|
import * as HttpClientRequest from "./HttpClientRequest.js"
|
|
18
20
|
import * as HttpClientResponse from "./HttpClientResponse.js"
|
|
19
21
|
import * as HttpMethod from "./HttpMethod.js"
|
|
22
|
+
import type { HttpApiMiddleware } from "./index.js"
|
|
20
23
|
|
|
21
24
|
/**
|
|
22
25
|
* @since 1.0.0
|
|
23
26
|
* @category models
|
|
24
27
|
*/
|
|
25
|
-
export type Client<
|
|
26
|
-
|
|
27
|
-
readonly [
|
|
28
|
-
[HttpApiGroup<
|
|
29
|
-
readonly [
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
infer _Payload,
|
|
35
|
-
infer _Headers,
|
|
36
|
-
infer _Success,
|
|
37
|
-
infer _Error,
|
|
38
|
-
infer _R
|
|
39
|
-
>
|
|
40
|
-
] ? (
|
|
41
|
-
request: Simplify<HttpApiEndpoint.ClientRequest<_Path, _Payload, _Headers>>
|
|
42
|
-
) => Effect.Effect<
|
|
43
|
-
_Success,
|
|
44
|
-
_Error | _GroupError | _ApiError | HttpClientError.HttpClientError
|
|
45
|
-
> :
|
|
46
|
-
never
|
|
28
|
+
export type Client<Groups extends HttpApiGroup.Any, ApiError> = Simplify<
|
|
29
|
+
& {
|
|
30
|
+
readonly [Group in Extract<Groups, { readonly topLevel: false }> as HttpApiGroup.Name<Group>]: [Group] extends
|
|
31
|
+
[HttpApiGroup<infer _GroupName, infer _Endpoints, infer _GroupError, infer _GroupErrorR>] ? {
|
|
32
|
+
readonly [Endpoint in _Endpoints as HttpApiEndpoint.Name<Endpoint>]: Client.Method<
|
|
33
|
+
Endpoint,
|
|
34
|
+
ApiError,
|
|
35
|
+
_GroupError
|
|
36
|
+
>
|
|
47
37
|
} :
|
|
48
38
|
never
|
|
49
|
-
}
|
|
50
|
-
|
|
39
|
+
}
|
|
40
|
+
& {
|
|
41
|
+
readonly [Method in Client.TopLevelMethods<Groups, ApiError> as Method[0]]: Method[1]
|
|
42
|
+
}
|
|
43
|
+
>
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @since 1.0.0
|
|
47
|
+
* @category models
|
|
48
|
+
*/
|
|
49
|
+
export declare namespace Client {
|
|
50
|
+
/**
|
|
51
|
+
* @since 1.0.0
|
|
52
|
+
* @category models
|
|
53
|
+
*/
|
|
54
|
+
export type Method<Endpoint, ApiError, GroupError> = [Endpoint] extends [
|
|
55
|
+
HttpApiEndpoint<
|
|
56
|
+
infer _Name,
|
|
57
|
+
infer _Method,
|
|
58
|
+
infer _Path,
|
|
59
|
+
infer _UrlParams,
|
|
60
|
+
infer _Payload,
|
|
61
|
+
infer _Headers,
|
|
62
|
+
infer _Success,
|
|
63
|
+
infer _Error,
|
|
64
|
+
infer _R,
|
|
65
|
+
infer _RE
|
|
66
|
+
>
|
|
67
|
+
] ? (
|
|
68
|
+
request: Simplify<HttpApiEndpoint.ClientRequest<_Path, _UrlParams, _Payload, _Headers>>
|
|
69
|
+
) => Effect.Effect<
|
|
70
|
+
_Success,
|
|
71
|
+
_Error | GroupError | ApiError | HttpClientError.HttpClientError
|
|
72
|
+
> :
|
|
73
|
+
never
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
* @category models
|
|
78
|
+
*/
|
|
79
|
+
export type TopLevelMethods<Groups extends HttpApiGroup.Any, ApiError> =
|
|
80
|
+
Extract<Groups, { readonly topLevel: true }> extends
|
|
81
|
+
HttpApiGroup<infer _Id, infer _Endpoints, infer _Error, infer _ErrorR, infer _TopLevel> ?
|
|
82
|
+
_Endpoints extends infer Endpoint ? [HttpApiEndpoint.Name<Endpoint>, Client.Method<Endpoint, ApiError, _Error>]
|
|
83
|
+
: never :
|
|
84
|
+
never
|
|
85
|
+
}
|
|
51
86
|
|
|
52
87
|
/**
|
|
53
88
|
* @since 1.0.0
|
|
54
89
|
* @category constructors
|
|
55
90
|
*/
|
|
56
|
-
export const make = <
|
|
57
|
-
api:
|
|
91
|
+
export const make = <Groups extends HttpApiGroup.Any, ApiError, ApiR>(
|
|
92
|
+
api: HttpApi.HttpApi<Groups, ApiError, ApiR>,
|
|
58
93
|
options?: {
|
|
59
94
|
readonly transformClient?: ((client: HttpClient.HttpClient) => HttpClient.HttpClient) | undefined
|
|
95
|
+
readonly transformResponse?:
|
|
96
|
+
| ((effect: Effect.Effect<unknown, unknown, Scope>) => Effect.Effect<unknown, unknown, Scope>)
|
|
97
|
+
| undefined
|
|
60
98
|
readonly baseUrl?: string | undefined
|
|
61
99
|
}
|
|
62
|
-
): Effect.Effect<
|
|
100
|
+
): Effect.Effect<
|
|
101
|
+
Simplify<Client<Groups, ApiError>>,
|
|
102
|
+
never,
|
|
103
|
+
HttpApiMiddleware.HttpApiMiddleware.Without<ApiR | HttpApiGroup.ClientContext<Groups>> | HttpClient.HttpClient
|
|
104
|
+
> =>
|
|
63
105
|
Effect.gen(function*() {
|
|
64
106
|
const context = yield* Effect.context<any>()
|
|
65
107
|
const httpClient = (yield* HttpClient.HttpClient).pipe(
|
|
@@ -69,82 +111,26 @@ export const make = <A extends HttpApi.HttpApi.Any>(
|
|
|
69
111
|
const client: Record<string, Record<string, any>> = {}
|
|
70
112
|
HttpApi.reflect(api as any, {
|
|
71
113
|
onGroup({ group }) {
|
|
114
|
+
if (group.topLevel) return
|
|
72
115
|
client[group.identifier] = {}
|
|
73
116
|
},
|
|
74
|
-
onEndpoint({ endpoint, errors, group,
|
|
117
|
+
onEndpoint({ endpoint, errors, group, successes }) {
|
|
75
118
|
const makeUrl = compilePath(endpoint.path)
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return HttpClientResponse.schemaBodyUrlParams(schema as any)
|
|
85
|
-
}
|
|
86
|
-
case "Uint8Array": {
|
|
87
|
-
return (response: HttpClientResponse.HttpClientResponse) =>
|
|
88
|
-
response.arrayBuffer.pipe(
|
|
89
|
-
Effect.map((buffer) => new Uint8Array(buffer)),
|
|
90
|
-
Effect.flatMap(Schema.decodeUnknown(schema))
|
|
91
|
-
)
|
|
92
|
-
}
|
|
93
|
-
case "Text": {
|
|
94
|
-
return (response: HttpClientResponse.HttpClientResponse) =>
|
|
95
|
-
Effect.flatMap(response.text, Schema.decodeUnknown(schema))
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
})
|
|
99
|
-
)
|
|
100
|
-
const handleError = (
|
|
101
|
-
request: HttpClientRequest.HttpClientRequest,
|
|
102
|
-
response: HttpClientResponse.HttpClientResponse
|
|
103
|
-
) => {
|
|
104
|
-
const error = errors.get(response.status)
|
|
105
|
-
if (error === undefined) {
|
|
106
|
-
return Effect.die(
|
|
107
|
-
new HttpClientError.ResponseError({
|
|
108
|
-
reason: "Decode",
|
|
109
|
-
request,
|
|
110
|
-
response
|
|
111
|
-
})
|
|
112
|
-
)
|
|
113
|
-
} else if (Option.isNone(error)) {
|
|
114
|
-
return Effect.fail(
|
|
115
|
-
new HttpClientError.ResponseError({
|
|
116
|
-
reason: "StatusCode",
|
|
117
|
-
request,
|
|
118
|
-
response
|
|
119
|
-
})
|
|
120
|
-
)
|
|
119
|
+
const decodeMap: Record<
|
|
120
|
+
number | "orElse",
|
|
121
|
+
(response: HttpClientResponse.HttpClientResponse) => Effect.Effect<any, any>
|
|
122
|
+
> = { orElse: statusOrElse }
|
|
123
|
+
errors.forEach((ast, status) => {
|
|
124
|
+
if (ast._tag === "None") {
|
|
125
|
+
decodeMap[status] = statusCodeError
|
|
126
|
+
return
|
|
121
127
|
}
|
|
122
|
-
const decode =
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
new HttpClientError.ResponseError({
|
|
129
|
-
reason: "Decode",
|
|
130
|
-
request,
|
|
131
|
-
response,
|
|
132
|
-
cause
|
|
133
|
-
})
|
|
134
|
-
})
|
|
135
|
-
),
|
|
136
|
-
Effect.flatMap((json) =>
|
|
137
|
-
Effect.mapError(decode(json), (cause) =>
|
|
138
|
-
new HttpClientError.ResponseError({
|
|
139
|
-
reason: "Decode",
|
|
140
|
-
request,
|
|
141
|
-
response,
|
|
142
|
-
cause
|
|
143
|
-
}))
|
|
144
|
-
),
|
|
145
|
-
Effect.flatMap(Effect.fail)
|
|
146
|
-
)
|
|
147
|
-
}
|
|
128
|
+
const decode = schemaToResponse(ast.value)
|
|
129
|
+
decodeMap[status] = (response) => Effect.flatMap(decode(response), Effect.fail)
|
|
130
|
+
})
|
|
131
|
+
successes.forEach((ast, status) => {
|
|
132
|
+
decodeMap[status] = ast._tag === "None" ? responseAsVoid : schemaToResponse(ast.value)
|
|
133
|
+
})
|
|
148
134
|
const isMultipart = endpoint.payloadSchema.pipe(
|
|
149
135
|
Option.map((schema) => HttpApiSchema.getMultipart(schema.ast)),
|
|
150
136
|
Option.getOrElse(() => false)
|
|
@@ -156,12 +142,16 @@ export const make = <A extends HttpApi.HttpApi.Any>(
|
|
|
156
142
|
const encodeHeaders = endpoint.headersSchema.pipe(
|
|
157
143
|
Option.map(Schema.encodeUnknown)
|
|
158
144
|
)
|
|
159
|
-
|
|
145
|
+
const encodeUrlParams = endpoint.urlParamsSchema.pipe(
|
|
146
|
+
Option.map(Schema.encodeUnknown)
|
|
147
|
+
)
|
|
148
|
+
;(group.topLevel ? client : client[group.identifier])[endpoint.name] = (request: {
|
|
160
149
|
readonly path: any
|
|
150
|
+
readonly urlParams: any
|
|
161
151
|
readonly payload: any
|
|
162
152
|
readonly headers: any
|
|
163
153
|
}) => {
|
|
164
|
-
const url = request && request.path ? makeUrl(request
|
|
154
|
+
const url = request && request.path ? makeUrl(request.path) : endpoint.path
|
|
165
155
|
const baseRequest = HttpClientRequest.make(endpoint.method)(url)
|
|
166
156
|
return (isMultipart ?
|
|
167
157
|
Effect.succeed(baseRequest.pipe(
|
|
@@ -185,15 +175,17 @@ export const make = <A extends HttpApi.HttpApi.Any>(
|
|
|
185
175
|
)
|
|
186
176
|
)
|
|
187
177
|
: identity,
|
|
188
|
-
|
|
189
|
-
Effect.flatMap(
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
178
|
+
encodeUrlParams._tag === "Some"
|
|
179
|
+
? Effect.flatMap((httpRequest) =>
|
|
180
|
+
encodeUrlParams.value(request.urlParams).pipe(
|
|
181
|
+
Effect.orDie,
|
|
182
|
+
Effect.map((params) => HttpClientRequest.appendUrlParams(httpRequest, params as any))
|
|
183
|
+
)
|
|
184
|
+
)
|
|
185
|
+
: identity,
|
|
186
|
+
Effect.flatMap(httpClient.execute),
|
|
187
|
+
Effect.flatMap(HttpClientResponse.matchStatus(decodeMap)),
|
|
188
|
+
options?.transformResponse === undefined ? identity : options.transformResponse,
|
|
197
189
|
Effect.scoped,
|
|
198
190
|
Effect.catchIf(ParseResult.isParseError, Effect.die),
|
|
199
191
|
Effect.mapInputContext((input) => Context.merge(context, input))
|
|
@@ -226,3 +218,62 @@ const compilePath = (path: string) => {
|
|
|
226
218
|
return url
|
|
227
219
|
}
|
|
228
220
|
}
|
|
221
|
+
|
|
222
|
+
const schemaToResponse = (
|
|
223
|
+
ast: AST.AST
|
|
224
|
+
): (response: HttpClientResponse.HttpClientResponse) => Effect.Effect<any, any> => {
|
|
225
|
+
const schema = Schema.make(ast)
|
|
226
|
+
const encoding = HttpApiSchema.getEncoding(ast)
|
|
227
|
+
const decode = Schema.decodeUnknown(schema)
|
|
228
|
+
switch (encoding.kind) {
|
|
229
|
+
case "Json": {
|
|
230
|
+
return (response) => Effect.flatMap(responseJson(response), decode)
|
|
231
|
+
}
|
|
232
|
+
case "UrlParams": {
|
|
233
|
+
return HttpClientResponse.schemaBodyUrlParams(schema as any)
|
|
234
|
+
}
|
|
235
|
+
case "Uint8Array": {
|
|
236
|
+
return (response: HttpClientResponse.HttpClientResponse) =>
|
|
237
|
+
response.arrayBuffer.pipe(
|
|
238
|
+
Effect.map((buffer) => new Uint8Array(buffer)),
|
|
239
|
+
Effect.flatMap(decode)
|
|
240
|
+
)
|
|
241
|
+
}
|
|
242
|
+
case "Text": {
|
|
243
|
+
return (response) => Effect.flatMap(response.text, decode)
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const responseJson = (response: HttpClientResponse.HttpClientResponse) =>
|
|
249
|
+
Effect.flatMap(response.text, (text) =>
|
|
250
|
+
text === "" ? Effect.void : Effect.try({
|
|
251
|
+
try: () => JSON.parse(text),
|
|
252
|
+
catch: (cause) =>
|
|
253
|
+
new HttpClientError.ResponseError({
|
|
254
|
+
reason: "Decode",
|
|
255
|
+
request: response.request,
|
|
256
|
+
response,
|
|
257
|
+
cause
|
|
258
|
+
})
|
|
259
|
+
}))
|
|
260
|
+
|
|
261
|
+
const statusOrElse = (response: HttpClientResponse.HttpClientResponse) =>
|
|
262
|
+
Effect.fail(
|
|
263
|
+
new HttpClientError.ResponseError({
|
|
264
|
+
reason: "Decode",
|
|
265
|
+
request: response.request,
|
|
266
|
+
response
|
|
267
|
+
})
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
const statusCodeError = (response: HttpClientResponse.HttpClientResponse) =>
|
|
271
|
+
Effect.fail(
|
|
272
|
+
new HttpClientError.ResponseError({
|
|
273
|
+
reason: "StatusCode",
|
|
274
|
+
request: response.request,
|
|
275
|
+
response
|
|
276
|
+
})
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
const responseAsVoid = (_response: HttpClientResponse.HttpClientResponse) => Effect.void
|