@effect/platform 0.11.5 → 0.12.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/FileSystem.d.ts +16 -9
- package/FileSystem.d.ts.map +1 -1
- package/FileSystem.js.map +1 -1
- package/Http/App.d.ts +18 -0
- package/Http/App.d.ts.map +1 -0
- package/Http/App.js +6 -0
- package/Http/App.js.map +1 -0
- package/Http/Body.d.ts +37 -14
- package/Http/Body.d.ts.map +1 -1
- package/Http/Body.js +17 -5
- package/Http/Body.js.map +1 -1
- package/Http/Client.d.ts +2 -2
- package/Http/Client.d.ts.map +1 -1
- package/Http/Client.js +3 -3
- package/Http/Client.js.map +1 -1
- package/Http/ClientRequest.d.ts +44 -1
- package/Http/ClientRequest.d.ts.map +1 -1
- package/Http/ClientRequest.js +21 -3
- package/Http/ClientRequest.js.map +1 -1
- package/Http/ClientResponse.d.ts +13 -1
- package/Http/ClientResponse.d.ts.map +1 -1
- package/Http/ClientResponse.js +14 -2
- package/Http/ClientResponse.js.map +1 -1
- package/Http/FormData.d.ts +97 -4
- package/Http/FormData.d.ts.map +1 -1
- package/Http/FormData.js +77 -2
- package/Http/FormData.js.map +1 -1
- package/Http/Headers.d.ts +29 -3
- package/Http/Headers.d.ts.map +1 -1
- package/Http/Headers.js +13 -1
- package/Http/Headers.js.map +1 -1
- package/Http/IncomingMessage.d.ts +26 -5
- package/Http/IncomingMessage.d.ts.map +1 -1
- package/Http/IncomingMessage.js +38 -3
- package/Http/IncomingMessage.js.map +1 -1
- package/Http/Middleware.d.ts +56 -0
- package/Http/Middleware.d.ts.map +1 -0
- package/Http/Middleware.js +46 -0
- package/Http/Middleware.js.map +1 -0
- package/Http/Router.d.ts +221 -0
- package/Http/Router.d.ts.map +1 -0
- package/Http/Router.js +148 -0
- package/Http/Router.js.map +1 -0
- package/Http/Server.d.ts +85 -0
- package/Http/Server.d.ts.map +1 -0
- package/Http/Server.js +34 -0
- package/Http/Server.js.map +1 -0
- package/Http/ServerError.d.ts +96 -0
- package/Http/ServerError.d.ts.map +1 -0
- package/Http/ServerError.js +40 -0
- package/Http/ServerError.js.map +1 -0
- package/Http/ServerRequest.d.ts +82 -0
- package/Http/ServerRequest.d.ts.map +1 -0
- package/Http/ServerRequest.js +66 -0
- package/Http/ServerRequest.js.map +1 -0
- package/Http/ServerResponse.d.ts +168 -0
- package/Http/ServerResponse.d.ts.map +1 -0
- package/Http/ServerResponse.js +116 -0
- package/Http/ServerResponse.js.map +1 -0
- package/Http/UrlParams.d.ts +20 -5
- package/Http/UrlParams.d.ts.map +1 -1
- package/Http/UrlParams.js.map +1 -1
- package/HttpServer.d.ts +44 -0
- package/HttpServer.d.ts.map +1 -0
- package/HttpServer.js +29 -0
- package/HttpServer.js.map +1 -0
- package/internal/fileSystem.js +15 -11
- package/internal/fileSystem.js.map +1 -1
- package/internal/http/body.js +28 -28
- package/internal/http/body.js.map +1 -1
- package/internal/http/client.d.ts.map +1 -1
- package/internal/http/client.js +32 -26
- package/internal/http/client.js.map +1 -1
- package/internal/http/clientRequest.js +22 -6
- package/internal/http/clientRequest.js.map +1 -1
- package/internal/http/clientResponse.js +15 -12
- package/internal/http/clientResponse.js.map +1 -1
- package/internal/http/formData.d.ts +8 -0
- package/internal/http/formData.d.ts.map +1 -0
- package/internal/http/formData.js +88 -0
- package/internal/http/formData.js.map +1 -0
- package/internal/http/middleware.d.ts +2 -0
- package/internal/http/middleware.d.ts.map +1 -0
- package/internal/http/middleware.js +43 -0
- package/internal/http/middleware.js.map +1 -0
- package/internal/http/router.d.ts +2 -0
- package/internal/http/router.d.ts.map +1 -0
- package/internal/http/router.js +187 -0
- package/internal/http/router.js.map +1 -0
- package/internal/http/server.d.ts +2 -0
- package/internal/http/server.d.ts.map +1 -0
- package/internal/http/server.js +30 -0
- package/internal/http/server.js.map +1 -0
- package/internal/http/serverError.d.ts +2 -0
- package/internal/http/serverError.d.ts.map +1 -0
- package/internal/http/serverError.js +30 -0
- package/internal/http/serverError.js.map +1 -0
- package/internal/http/serverRequest.d.ts +2 -0
- package/internal/http/serverRequest.d.ts.map +1 -0
- package/internal/http/serverRequest.js +57 -0
- package/internal/http/serverRequest.js.map +1 -0
- package/internal/http/serverResponse.d.ts +2 -0
- package/internal/http/serverResponse.d.ts.map +1 -0
- package/internal/http/serverResponse.js +109 -0
- package/internal/http/serverResponse.js.map +1 -0
- package/mjs/FileSystem.mjs.map +1 -1
- package/mjs/Http/App.mjs +2 -0
- package/mjs/Http/App.mjs.map +1 -0
- package/mjs/Http/Body.mjs +12 -2
- package/mjs/Http/Body.mjs.map +1 -1
- package/mjs/Http/Client.mjs +1 -1
- package/mjs/Http/Client.mjs.map +1 -1
- package/mjs/Http/ClientRequest.mjs +16 -1
- package/mjs/Http/ClientRequest.mjs.map +1 -1
- package/mjs/Http/ClientResponse.mjs +11 -1
- package/mjs/Http/ClientResponse.mjs.map +1 -1
- package/mjs/Http/FormData.mjs +62 -1
- package/mjs/Http/FormData.mjs.map +1 -1
- package/mjs/Http/Headers.mjs +10 -0
- package/mjs/Http/Headers.mjs.map +1 -1
- package/mjs/Http/IncomingMessage.mjs +32 -1
- package/mjs/Http/IncomingMessage.mjs.map +1 -1
- package/mjs/Http/Middleware.mjs +32 -0
- package/mjs/Http/Middleware.mjs.map +1 -0
- package/mjs/Http/Router.mjs +117 -0
- package/mjs/Http/Router.mjs.map +1 -0
- package/mjs/Http/Server.mjs +22 -0
- package/mjs/Http/Server.mjs.map +1 -0
- package/mjs/Http/ServerError.mjs +27 -0
- package/mjs/Http/ServerError.mjs.map +1 -0
- package/mjs/Http/ServerRequest.mjs +48 -0
- package/mjs/Http/ServerRequest.mjs.map +1 -0
- package/mjs/Http/ServerResponse.mjs +90 -0
- package/mjs/Http/ServerResponse.mjs.map +1 -0
- package/mjs/Http/UrlParams.mjs.map +1 -1
- package/mjs/HttpServer.mjs +24 -0
- package/mjs/HttpServer.mjs.map +1 -0
- package/mjs/internal/fileSystem.mjs +15 -11
- package/mjs/internal/fileSystem.mjs.map +1 -1
- package/mjs/internal/http/body.mjs +23 -25
- package/mjs/internal/http/body.mjs.map +1 -1
- package/mjs/internal/http/client.mjs +30 -24
- package/mjs/internal/http/client.mjs.map +1 -1
- package/mjs/internal/http/clientRequest.mjs +16 -4
- package/mjs/internal/http/clientRequest.mjs.map +1 -1
- package/mjs/internal/http/clientResponse.mjs +15 -12
- package/mjs/internal/http/clientResponse.mjs.map +1 -1
- package/mjs/internal/http/formData.mjs +67 -0
- package/mjs/internal/http/formData.mjs.map +1 -0
- package/mjs/internal/http/middleware.mjs +29 -0
- package/mjs/internal/http/middleware.mjs.map +1 -0
- package/mjs/internal/http/router.mjs +155 -0
- package/mjs/internal/http/router.mjs.map +1 -0
- package/mjs/internal/http/server.mjs +17 -0
- package/mjs/internal/http/server.mjs.map +1 -0
- package/mjs/internal/http/serverError.mjs +17 -0
- package/mjs/internal/http/serverError.mjs.map +1 -0
- package/mjs/internal/http/serverRequest.mjs +41 -0
- package/mjs/internal/http/serverRequest.mjs.map +1 -0
- package/mjs/internal/http/serverResponse.mjs +82 -0
- package/mjs/internal/http/serverResponse.mjs.map +1 -0
- package/package.json +2 -1
- package/src/FileSystem.ts +20 -25
- package/src/Http/App.ts +19 -0
- package/src/Http/Body.ts +41 -14
- package/src/Http/Client.ts +6 -3
- package/src/Http/ClientRequest.ts +52 -2
- package/src/Http/ClientResponse.ts +13 -1
- package/src/Http/FormData.ts +121 -5
- package/src/Http/Headers.ts +37 -3
- package/src/Http/IncomingMessage.ts +46 -3
- package/src/Http/Middleware.ts +69 -0
- package/src/Http/Router.ts +342 -0
- package/src/Http/Server.ts +134 -0
- package/src/Http/ServerError.ts +111 -0
- package/src/Http/ServerRequest.ts +120 -0
- package/src/Http/ServerResponse.ts +202 -0
- package/src/Http/UrlParams.ts +20 -5
- package/src/HttpServer.ts +44 -0
- package/src/internal/fileSystem.ts +10 -7
- package/src/internal/http/body.ts +65 -39
- package/src/internal/http/client.ts +45 -36
- package/src/internal/http/clientRequest.ts +64 -4
- package/src/internal/http/clientResponse.ts +21 -13
- package/src/internal/http/formData.ts +140 -0
- package/src/internal/http/middleware.ts +72 -0
- package/src/internal/http/router.ts +298 -0
- package/src/internal/http/server.ts +80 -0
- package/src/internal/http/serverError.ts +26 -0
- package/src/internal/http/serverRequest.ts +71 -0
- package/src/internal/http/serverResponse.ts +255 -0
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
4
|
import type { Pipeable } from "@effect/data/Pipeable"
|
|
5
|
+
import type * as Effect from "@effect/io/Effect"
|
|
6
|
+
import type * as PlatformError from "@effect/platform/Error"
|
|
7
|
+
import type * as FileSystem from "@effect/platform/FileSystem"
|
|
5
8
|
import type * as Body from "@effect/platform/Http/Body"
|
|
6
9
|
import type * as Error from "@effect/platform/Http/ClientError"
|
|
7
10
|
import type * as Headers from "@effect/platform/Http/Headers"
|
|
@@ -36,6 +39,19 @@ export interface ClientRequest extends Pipeable {
|
|
|
36
39
|
readonly body: Body.Body
|
|
37
40
|
}
|
|
38
41
|
|
|
42
|
+
/**
|
|
43
|
+
* @since 1.0.0
|
|
44
|
+
*/
|
|
45
|
+
export namespace ClientRequest {
|
|
46
|
+
/**
|
|
47
|
+
* @since 1.0.0
|
|
48
|
+
* @category models
|
|
49
|
+
*/
|
|
50
|
+
export interface NonEffectBody extends ClientRequest {
|
|
51
|
+
readonly body: Body.NonEffect
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
39
55
|
/**
|
|
40
56
|
* @since 1.0.0
|
|
41
57
|
* @category models
|
|
@@ -253,10 +269,19 @@ export const setBody: {
|
|
|
253
269
|
* @since 1.0.0
|
|
254
270
|
* @category combinators
|
|
255
271
|
*/
|
|
256
|
-
export const
|
|
272
|
+
export const uint8ArrayBody: {
|
|
257
273
|
(body: Uint8Array, contentType?: string): (self: ClientRequest) => ClientRequest
|
|
258
274
|
(self: ClientRequest, body: Uint8Array, contentType?: string): ClientRequest
|
|
259
|
-
} = internal.
|
|
275
|
+
} = internal.uint8ArrayBody
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* @since 1.0.0
|
|
279
|
+
* @category combinators
|
|
280
|
+
*/
|
|
281
|
+
export const effectBody: {
|
|
282
|
+
(body: Effect.Effect<never, unknown, Body.NonEffect>): (self: ClientRequest) => ClientRequest
|
|
283
|
+
(self: ClientRequest, body: Effect.Effect<never, unknown, Body.NonEffect>): ClientRequest
|
|
284
|
+
} = internal.effectBody
|
|
260
285
|
|
|
261
286
|
/**
|
|
262
287
|
* @since 1.0.0
|
|
@@ -276,6 +301,15 @@ export const jsonBody: {
|
|
|
276
301
|
(self: ClientRequest, body: unknown): ClientRequest
|
|
277
302
|
} = internal.jsonBody
|
|
278
303
|
|
|
304
|
+
/**
|
|
305
|
+
* @since 1.0.0
|
|
306
|
+
* @category combinators
|
|
307
|
+
*/
|
|
308
|
+
export const unsafeJsonBody: {
|
|
309
|
+
(body: unknown): (self: ClientRequest) => ClientRequest
|
|
310
|
+
(self: ClientRequest, body: unknown): ClientRequest
|
|
311
|
+
} = internal.unsafeJsonBody
|
|
312
|
+
|
|
279
313
|
/**
|
|
280
314
|
* @since 1.0.0
|
|
281
315
|
* @category combinators
|
|
@@ -318,3 +352,19 @@ export const streamBody: {
|
|
|
318
352
|
options?: { readonly contentType?: string; readonly contentLength?: number }
|
|
319
353
|
): ClientRequest
|
|
320
354
|
} = internal.streamBody
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* @since 1.0.0
|
|
358
|
+
* @category combinators
|
|
359
|
+
*/
|
|
360
|
+
export const fileBody: {
|
|
361
|
+
(
|
|
362
|
+
path: string,
|
|
363
|
+
options?: FileSystem.StreamOptions & { readonly contentType?: string }
|
|
364
|
+
): (self: ClientRequest) => Effect.Effect<FileSystem.FileSystem, PlatformError.PlatformError, ClientRequest>
|
|
365
|
+
(
|
|
366
|
+
self: ClientRequest,
|
|
367
|
+
path: string,
|
|
368
|
+
options?: FileSystem.StreamOptions & { readonly contentType?: string }
|
|
369
|
+
): Effect.Effect<FileSystem.FileSystem, PlatformError.PlatformError, ClientRequest>
|
|
370
|
+
} = internal.fileBody
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
+
import type * as Effect from "@effect/io/Effect"
|
|
4
5
|
import type * as Error from "@effect/platform/Http/ClientError"
|
|
5
6
|
import type * as ClientRequest from "@effect/platform/Http/ClientRequest"
|
|
6
7
|
import type * as IncomingMessage from "@effect/platform/Http/IncomingMessage"
|
|
@@ -11,7 +12,17 @@ export {
|
|
|
11
12
|
* @since 1.0.0
|
|
12
13
|
* @category schema
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
+
schemaBodyJson,
|
|
16
|
+
/**
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
* @category schema
|
|
19
|
+
*/
|
|
20
|
+
schemaBodyUrlParams,
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
* @category schema
|
|
24
|
+
*/
|
|
25
|
+
schemaHeaders
|
|
15
26
|
} from "@effect/platform/Http/IncomingMessage"
|
|
16
27
|
|
|
17
28
|
/**
|
|
@@ -33,6 +44,7 @@ export type TypeId = typeof TypeId
|
|
|
33
44
|
export interface ClientResponse extends IncomingMessage.IncomingMessage<Error.ResponseError> {
|
|
34
45
|
readonly [TypeId]: TypeId
|
|
35
46
|
readonly status: number
|
|
47
|
+
readonly formData: Effect.Effect<never, Error.ResponseError, FormData>
|
|
36
48
|
}
|
|
37
49
|
|
|
38
50
|
/**
|
package/src/Http/FormData.ts
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import type * as
|
|
4
|
+
import type * as Chunk from "@effect/data/Chunk"
|
|
5
|
+
import type * as Data from "@effect/data/Data"
|
|
6
|
+
import type * as Option from "@effect/data/Option"
|
|
7
|
+
import type * as Effect from "@effect/io/Effect"
|
|
8
|
+
import type * as FiberRef from "@effect/io/FiberRef"
|
|
9
|
+
import type * as FileSystem from "@effect/platform/FileSystem"
|
|
10
|
+
import * as internal from "@effect/platform/internal/http/formData"
|
|
11
|
+
import type * as ParseResult from "@effect/schema/ParseResult"
|
|
12
|
+
import type * as Schema from "@effect/schema/Schema"
|
|
5
13
|
import type * as Stream from "@effect/stream/Stream"
|
|
6
14
|
|
|
7
15
|
/**
|
|
8
16
|
* @since 1.0.0
|
|
9
17
|
* @category type ids
|
|
10
18
|
*/
|
|
11
|
-
export const TypeId =
|
|
19
|
+
export const TypeId: unique symbol = internal.TypeId
|
|
12
20
|
|
|
13
21
|
/**
|
|
14
22
|
* @since 1.0.0
|
|
@@ -41,7 +49,7 @@ export namespace Part {
|
|
|
41
49
|
* @category models
|
|
42
50
|
*/
|
|
43
51
|
export interface Field extends Part.Proto {
|
|
44
|
-
readonly _tag: "
|
|
52
|
+
readonly _tag: "Field"
|
|
45
53
|
readonly key: string
|
|
46
54
|
readonly contentType: string
|
|
47
55
|
readonly value: string
|
|
@@ -56,6 +64,114 @@ export interface File extends Part.Proto {
|
|
|
56
64
|
readonly key: string
|
|
57
65
|
readonly name: string
|
|
58
66
|
readonly contentType: string
|
|
59
|
-
readonly content: Stream.Stream<never,
|
|
60
|
-
readonly source?: unknown
|
|
67
|
+
readonly content: Stream.Stream<never, FormDataError, Uint8Array>
|
|
61
68
|
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @since 1.0.0
|
|
72
|
+
* @category type ids
|
|
73
|
+
*/
|
|
74
|
+
export const ErrorTypeId: unique symbol = internal.ErrorTypeId
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @since 1.0.0
|
|
78
|
+
* @category type ids
|
|
79
|
+
*/
|
|
80
|
+
export type ErrorTypeId = typeof ErrorTypeId
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @since 1.0.0
|
|
84
|
+
* @category errors
|
|
85
|
+
*/
|
|
86
|
+
export interface FormDataError extends Data.Case {
|
|
87
|
+
readonly [ErrorTypeId]: ErrorTypeId
|
|
88
|
+
readonly _tag: "FormDataError"
|
|
89
|
+
readonly reason: "FileTooLarge" | "FieldTooLarge" | "InternalError" | "Parse"
|
|
90
|
+
readonly error: unknown
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @since 1.0.0
|
|
95
|
+
* @category errors
|
|
96
|
+
*/
|
|
97
|
+
export const FormDataError: (
|
|
98
|
+
reason: FormDataError["reason"],
|
|
99
|
+
error: unknown
|
|
100
|
+
) => FormDataError = internal.FormDataError
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @since 1.0.0
|
|
104
|
+
* @category fiber refs
|
|
105
|
+
*/
|
|
106
|
+
export const maxFieldSize: FiberRef.FiberRef<FileSystem.Size> = internal.maxFieldSize
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @since 1.0.0
|
|
110
|
+
* @category fiber refs
|
|
111
|
+
*/
|
|
112
|
+
export const withMaxFieldSize: {
|
|
113
|
+
(size: FileSystem.SizeInput): <R, E, A>(effect: Effect.Effect<R, E, A>) => Effect.Effect<R, E, A>
|
|
114
|
+
<R, E, A>(effect: Effect.Effect<R, E, A>, size: FileSystem.SizeInput): Effect.Effect<R, E, A>
|
|
115
|
+
} = internal.withMaxFieldSize
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @since 1.0.0
|
|
119
|
+
* @category fiber refs
|
|
120
|
+
*/
|
|
121
|
+
export const maxFileSize: FiberRef.FiberRef<Option.Option<FileSystem.Size>> = internal.maxFileSize
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @since 1.0.0
|
|
125
|
+
* @category fiber refs
|
|
126
|
+
*/
|
|
127
|
+
export const withMaxFileSize: {
|
|
128
|
+
(size: Option.Option<FileSystem.SizeInput>): <R, E, A>(effect: Effect.Effect<R, E, A>) => Effect.Effect<R, E, A>
|
|
129
|
+
<R, E, A>(effect: Effect.Effect<R, E, A>, size: Option.Option<FileSystem.SizeInput>): Effect.Effect<R, E, A>
|
|
130
|
+
} = internal.withMaxFileSize
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @since 1.0.0
|
|
134
|
+
* @category fiber refs
|
|
135
|
+
*/
|
|
136
|
+
export const fieldMimeTypes: FiberRef.FiberRef<Chunk.Chunk<string>> = internal.fieldMimeTypes
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @since 1.0.0
|
|
140
|
+
* @category fiber refs
|
|
141
|
+
*/
|
|
142
|
+
export const withFieldMimeTypes: {
|
|
143
|
+
(mimeTypes: ReadonlyArray<string>): <R, E, A>(effect: Effect.Effect<R, E, A>) => Effect.Effect<R, E, A>
|
|
144
|
+
<R, E, A>(effect: Effect.Effect<R, E, A>, mimeTypes: ReadonlyArray<string>): Effect.Effect<R, E, A>
|
|
145
|
+
} = internal.withFieldMimeTypes
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @since 1.0.0
|
|
149
|
+
* @category conversions
|
|
150
|
+
*/
|
|
151
|
+
export const toRecord: (formData: FormData) => Record<string, string | Array<globalThis.File>> = internal.toRecord
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @since 1.0.0
|
|
155
|
+
* @category schema
|
|
156
|
+
*/
|
|
157
|
+
export const filesSchema: Schema.Schema<ReadonlyArray<globalThis.File>, ReadonlyArray<globalThis.File>> =
|
|
158
|
+
internal.filesSchema
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @since 1.0.0
|
|
162
|
+
* @category schema
|
|
163
|
+
*/
|
|
164
|
+
export const schemaJson: <I, A>(
|
|
165
|
+
schema: Schema.Schema<I, A>
|
|
166
|
+
) => {
|
|
167
|
+
(field: string): (formData: FormData) => Effect.Effect<never, FormDataError | ParseResult.ParseError, A>
|
|
168
|
+
(formData: FormData, field: string): Effect.Effect<never, FormDataError | ParseResult.ParseError, A>
|
|
169
|
+
} = internal.schemaJson
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @since 1.0.0
|
|
173
|
+
* @category schema
|
|
174
|
+
*/
|
|
175
|
+
export const schemaRecord: <I extends Readonly<Record<string, string | ReadonlyArray<globalThis.File>>>, A>(
|
|
176
|
+
schema: Schema.Schema<I, A>
|
|
177
|
+
) => (formData: FormData) => Effect.Effect<never, ParseResult.ParseError, A> = internal.schemaRecord
|
package/src/Http/Headers.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { dual } from "@effect/data/Function"
|
|
5
5
|
import * as HashMap from "@effect/data/HashMap"
|
|
6
|
+
import type * as Option from "@effect/data/Option"
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* @since 1.0.0
|
|
@@ -41,7 +42,34 @@ export const fromInput: (input?: Input) => Headers = (input) => {
|
|
|
41
42
|
* @since 1.0.0
|
|
42
43
|
* @category combinators
|
|
43
44
|
*/
|
|
44
|
-
export const
|
|
45
|
+
export const has: {
|
|
46
|
+
(key: string): (self: Headers) => boolean
|
|
47
|
+
(self: Headers, key: string): boolean
|
|
48
|
+
} = dual<
|
|
49
|
+
(key: string) => (self: Headers) => boolean,
|
|
50
|
+
(self: Headers, key: string) => boolean
|
|
51
|
+
>(2, (self, key) => HashMap.has(self, key.toLowerCase()))
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @since 1.0.0
|
|
55
|
+
* @category combinators
|
|
56
|
+
*/
|
|
57
|
+
export const get: {
|
|
58
|
+
(key: string): (self: Headers) => Option.Option<string>
|
|
59
|
+
(self: Headers, key: string): Option.Option<string>
|
|
60
|
+
} = dual<
|
|
61
|
+
(key: string) => (self: Headers) => Option.Option<string>,
|
|
62
|
+
(self: Headers, key: string) => Option.Option<string>
|
|
63
|
+
>(2, (self, key) => HashMap.get(self, key.toLowerCase()))
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
* @category combinators
|
|
68
|
+
*/
|
|
69
|
+
export const set: {
|
|
70
|
+
(key: string, value: string): (self: Headers) => Headers
|
|
71
|
+
(self: Headers, key: string, value: string): Headers
|
|
72
|
+
} = dual<
|
|
45
73
|
(key: string, value: string) => (self: Headers) => Headers,
|
|
46
74
|
(self: Headers, key: string, value: string) => Headers
|
|
47
75
|
>(3, (self, key, value) => HashMap.set(self, key.toLowerCase(), value))
|
|
@@ -50,7 +78,10 @@ export const set = dual<
|
|
|
50
78
|
* @since 1.0.0
|
|
51
79
|
* @category combinators
|
|
52
80
|
*/
|
|
53
|
-
export const setAll
|
|
81
|
+
export const setAll: {
|
|
82
|
+
(headers: Input): (self: Headers) => Headers
|
|
83
|
+
(self: Headers, headers: Input): Headers
|
|
84
|
+
} = dual<
|
|
54
85
|
(headers: Input) => (self: Headers) => Headers,
|
|
55
86
|
(self: Headers, headers: Input) => Headers
|
|
56
87
|
>(2, (self, headers) =>
|
|
@@ -63,7 +94,10 @@ export const setAll = dual<
|
|
|
63
94
|
* @since 1.0.0
|
|
64
95
|
* @category combinators
|
|
65
96
|
*/
|
|
66
|
-
export const remove
|
|
97
|
+
export const remove: {
|
|
98
|
+
(key: string): (self: Headers) => Headers
|
|
99
|
+
(self: Headers, key: string): Headers
|
|
100
|
+
} = dual<
|
|
67
101
|
(key: string) => (self: Headers) => Headers,
|
|
68
102
|
(self: Headers, key: string) => Headers
|
|
69
103
|
>(2, (self, key) => HashMap.remove(self, key.toLowerCase()))
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
+
import { dual } from "@effect/data/Function"
|
|
5
|
+
import * as Global from "@effect/data/Global"
|
|
6
|
+
import * as Option from "@effect/data/Option"
|
|
4
7
|
import * as Effect from "@effect/io/Effect"
|
|
8
|
+
import * as FiberRef from "@effect/io/FiberRef"
|
|
9
|
+
import * as FileSystem from "@effect/platform/FileSystem"
|
|
5
10
|
import type * as Headers from "@effect/platform/Http/Headers"
|
|
11
|
+
import type * as UrlParams from "@effect/platform/Http/UrlParams"
|
|
6
12
|
import type * as ParseResult from "@effect/schema/ParseResult"
|
|
7
13
|
import * as Schema from "@effect/schema/Schema"
|
|
8
14
|
import type * as Stream from "@effect/stream/Stream"
|
|
@@ -28,9 +34,8 @@ export interface IncomingMessage<E> {
|
|
|
28
34
|
readonly headers: Headers.Headers
|
|
29
35
|
readonly json: Effect.Effect<never, E, unknown>
|
|
30
36
|
readonly text: Effect.Effect<never, E, string>
|
|
37
|
+
readonly urlParams: Effect.Effect<never, E, UrlParams.UrlParams>
|
|
31
38
|
readonly arrayBuffer: Effect.Effect<never, E, ArrayBuffer>
|
|
32
|
-
readonly formData: Effect.Effect<never, E, FormData>
|
|
33
|
-
// readonly formDataStream: Stream.Stream<never, Error.TransportError, FormData.Part>
|
|
34
39
|
readonly stream: Stream.Stream<never, E, Uint8Array>
|
|
35
40
|
}
|
|
36
41
|
|
|
@@ -38,8 +43,46 @@ export interface IncomingMessage<E> {
|
|
|
38
43
|
* @since 1.0.0
|
|
39
44
|
* @category schema
|
|
40
45
|
*/
|
|
41
|
-
export const
|
|
46
|
+
export const schemaBodyJson = <I, A>(schema: Schema.Schema<I, A>) => {
|
|
42
47
|
const parse = Schema.parse(schema)
|
|
43
48
|
return <E>(self: IncomingMessage<E>): Effect.Effect<never, E | ParseResult.ParseError, A> =>
|
|
44
49
|
Effect.flatMap(self.json, parse)
|
|
45
50
|
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @since 1.0.0
|
|
54
|
+
* @category schema
|
|
55
|
+
*/
|
|
56
|
+
export const schemaBodyUrlParams = <I extends Readonly<Record<string, string>>, A>(schema: Schema.Schema<I, A>) => {
|
|
57
|
+
const parse = Schema.parse(schema)
|
|
58
|
+
return <E>(self: IncomingMessage<E>): Effect.Effect<never, E | ParseResult.ParseError, A> =>
|
|
59
|
+
Effect.flatMap(self.urlParams, (_) => parse(Object.fromEntries(_)))
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @since 1.0.0
|
|
64
|
+
* @category schema
|
|
65
|
+
*/
|
|
66
|
+
export const schemaHeaders = <I extends Readonly<Record<string, string>>, A>(schema: Schema.Schema<I, A>) => {
|
|
67
|
+
const parse = Schema.parse(schema)
|
|
68
|
+
return <E>(self: IncomingMessage<E>): Effect.Effect<never, ParseResult.ParseError, A> =>
|
|
69
|
+
parse(Object.fromEntries(self.headers))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @since 1.0.0
|
|
74
|
+
* @category fiber refs
|
|
75
|
+
*/
|
|
76
|
+
export const maxBodySize: FiberRef.FiberRef<Option.Option<FileSystem.Size>> = Global.globalValue(
|
|
77
|
+
"@effect/platform/Http/ImcomingMessage/maxBodySize",
|
|
78
|
+
() => FiberRef.unsafeMake(Option.none<FileSystem.Size>())
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @since 1.0.0
|
|
83
|
+
* @category fiber refs
|
|
84
|
+
*/
|
|
85
|
+
export const withMaxBodySize = dual<
|
|
86
|
+
(size: Option.Option<FileSystem.SizeInput>) => <R, E, A>(effect: Effect.Effect<R, E, A>) => Effect.Effect<R, E, A>,
|
|
87
|
+
<R, E, A>(effect: Effect.Effect<R, E, A>, size: Option.Option<FileSystem.SizeInput>) => Effect.Effect<R, E, A>
|
|
88
|
+
>(2, (effect, size) => Effect.locally(effect, maxBodySize, Option.map(size, FileSystem.Size)))
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as App from "@effect/platform/Http/App"
|
|
5
|
+
import * as internal from "@effect/platform/internal/http/middleware"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
* @category models
|
|
10
|
+
*/
|
|
11
|
+
export interface Middleware {
|
|
12
|
+
<R, E>(self: App.Default<R, E>): App.Default<any, any>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
export namespace Middleware {
|
|
19
|
+
/**
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export interface Applied<R, E, A extends App.Default<any, any>> {
|
|
23
|
+
(self: App.Default<R, E>): A
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
* @category constructors
|
|
30
|
+
*/
|
|
31
|
+
export const make: <M extends Middleware>(middleware: M) => M = internal.make
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
* @category combinators
|
|
36
|
+
*/
|
|
37
|
+
export const compose: {
|
|
38
|
+
<B extends App.Default<any, any>, C extends App.Default<any, any>>(
|
|
39
|
+
that: (b: B) => C
|
|
40
|
+
): <A extends App.Default<any, any>>(self: (a: A) => B) => (a: A) => C
|
|
41
|
+
<A extends App.Default<any, any>, B extends App.Default<any, any>, C extends App.Default<any, any>>(
|
|
42
|
+
self: (a: A) => B,
|
|
43
|
+
that: (b: B) => C
|
|
44
|
+
): (a: A) => C
|
|
45
|
+
} = internal.compose
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
* @category constructors
|
|
50
|
+
*/
|
|
51
|
+
export const logger: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.logger
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @since 1.0.0
|
|
55
|
+
* @category constructors
|
|
56
|
+
*/
|
|
57
|
+
export const tracer: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.tracer
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @since 1.0.0
|
|
61
|
+
* @category constructors
|
|
62
|
+
*/
|
|
63
|
+
export const loggerTracer: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.loggerTracer
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
* @category constructors
|
|
68
|
+
*/
|
|
69
|
+
export const xForwardedHeaders: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.xForwardedHeaders
|