@effect/platform 0.11.4 → 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.
Files changed (201) hide show
  1. package/Command.d.ts +3 -2
  2. package/Command.d.ts.map +1 -1
  3. package/Command.js.map +1 -1
  4. package/FileSystem.d.ts +16 -9
  5. package/FileSystem.d.ts.map +1 -1
  6. package/FileSystem.js.map +1 -1
  7. package/Http/App.d.ts +18 -0
  8. package/Http/App.d.ts.map +1 -0
  9. package/Http/App.js +6 -0
  10. package/Http/App.js.map +1 -0
  11. package/Http/Body.d.ts +37 -14
  12. package/Http/Body.d.ts.map +1 -1
  13. package/Http/Body.js +17 -5
  14. package/Http/Body.js.map +1 -1
  15. package/Http/Client.d.ts +8 -2
  16. package/Http/Client.d.ts.map +1 -1
  17. package/Http/Client.js +10 -4
  18. package/Http/Client.js.map +1 -1
  19. package/Http/ClientRequest.d.ts +44 -1
  20. package/Http/ClientRequest.d.ts.map +1 -1
  21. package/Http/ClientRequest.js +21 -3
  22. package/Http/ClientRequest.js.map +1 -1
  23. package/Http/ClientResponse.d.ts +13 -1
  24. package/Http/ClientResponse.d.ts.map +1 -1
  25. package/Http/ClientResponse.js +14 -2
  26. package/Http/ClientResponse.js.map +1 -1
  27. package/Http/FormData.d.ts +97 -4
  28. package/Http/FormData.d.ts.map +1 -1
  29. package/Http/FormData.js +77 -2
  30. package/Http/FormData.js.map +1 -1
  31. package/Http/Headers.d.ts +29 -3
  32. package/Http/Headers.d.ts.map +1 -1
  33. package/Http/Headers.js +13 -1
  34. package/Http/Headers.js.map +1 -1
  35. package/Http/IncomingMessage.d.ts +26 -5
  36. package/Http/IncomingMessage.d.ts.map +1 -1
  37. package/Http/IncomingMessage.js +38 -3
  38. package/Http/IncomingMessage.js.map +1 -1
  39. package/Http/Middleware.d.ts +56 -0
  40. package/Http/Middleware.d.ts.map +1 -0
  41. package/Http/Middleware.js +46 -0
  42. package/Http/Middleware.js.map +1 -0
  43. package/Http/Router.d.ts +221 -0
  44. package/Http/Router.d.ts.map +1 -0
  45. package/Http/Router.js +148 -0
  46. package/Http/Router.js.map +1 -0
  47. package/Http/Server.d.ts +85 -0
  48. package/Http/Server.d.ts.map +1 -0
  49. package/Http/Server.js +34 -0
  50. package/Http/Server.js.map +1 -0
  51. package/Http/ServerError.d.ts +96 -0
  52. package/Http/ServerError.d.ts.map +1 -0
  53. package/Http/ServerError.js +40 -0
  54. package/Http/ServerError.js.map +1 -0
  55. package/Http/ServerRequest.d.ts +82 -0
  56. package/Http/ServerRequest.d.ts.map +1 -0
  57. package/Http/ServerRequest.js +66 -0
  58. package/Http/ServerRequest.js.map +1 -0
  59. package/Http/ServerResponse.d.ts +168 -0
  60. package/Http/ServerResponse.d.ts.map +1 -0
  61. package/Http/ServerResponse.js +116 -0
  62. package/Http/ServerResponse.js.map +1 -0
  63. package/Http/UrlParams.d.ts +20 -5
  64. package/Http/UrlParams.d.ts.map +1 -1
  65. package/Http/UrlParams.js.map +1 -1
  66. package/HttpServer.d.ts +44 -0
  67. package/HttpServer.d.ts.map +1 -0
  68. package/HttpServer.js +29 -0
  69. package/HttpServer.js.map +1 -0
  70. package/internal/command.js +9 -2
  71. package/internal/command.js.map +1 -1
  72. package/internal/fileSystem.js +15 -11
  73. package/internal/fileSystem.js.map +1 -1
  74. package/internal/http/body.js +28 -28
  75. package/internal/http/body.js.map +1 -1
  76. package/internal/http/client.d.ts.map +1 -1
  77. package/internal/http/client.js +41 -27
  78. package/internal/http/client.js.map +1 -1
  79. package/internal/http/clientRequest.js +22 -6
  80. package/internal/http/clientRequest.js.map +1 -1
  81. package/internal/http/clientResponse.js +15 -12
  82. package/internal/http/clientResponse.js.map +1 -1
  83. package/internal/http/formData.d.ts +8 -0
  84. package/internal/http/formData.d.ts.map +1 -0
  85. package/internal/http/formData.js +88 -0
  86. package/internal/http/formData.js.map +1 -0
  87. package/internal/http/middleware.d.ts +2 -0
  88. package/internal/http/middleware.d.ts.map +1 -0
  89. package/internal/http/middleware.js +43 -0
  90. package/internal/http/middleware.js.map +1 -0
  91. package/internal/http/router.d.ts +2 -0
  92. package/internal/http/router.d.ts.map +1 -0
  93. package/internal/http/router.js +187 -0
  94. package/internal/http/router.js.map +1 -0
  95. package/internal/http/server.d.ts +2 -0
  96. package/internal/http/server.d.ts.map +1 -0
  97. package/internal/http/server.js +30 -0
  98. package/internal/http/server.js.map +1 -0
  99. package/internal/http/serverError.d.ts +2 -0
  100. package/internal/http/serverError.d.ts.map +1 -0
  101. package/internal/http/serverError.js +30 -0
  102. package/internal/http/serverError.js.map +1 -0
  103. package/internal/http/serverRequest.d.ts +2 -0
  104. package/internal/http/serverRequest.d.ts.map +1 -0
  105. package/internal/http/serverRequest.js +57 -0
  106. package/internal/http/serverRequest.js.map +1 -0
  107. package/internal/http/serverResponse.d.ts +2 -0
  108. package/internal/http/serverResponse.d.ts.map +1 -0
  109. package/internal/http/serverResponse.js +109 -0
  110. package/internal/http/serverResponse.js.map +1 -0
  111. package/mjs/Command.mjs.map +1 -1
  112. package/mjs/FileSystem.mjs.map +1 -1
  113. package/mjs/Http/App.mjs +2 -0
  114. package/mjs/Http/App.mjs.map +1 -0
  115. package/mjs/Http/Body.mjs +12 -2
  116. package/mjs/Http/Body.mjs.map +1 -1
  117. package/mjs/Http/Client.mjs +6 -1
  118. package/mjs/Http/Client.mjs.map +1 -1
  119. package/mjs/Http/ClientRequest.mjs +16 -1
  120. package/mjs/Http/ClientRequest.mjs.map +1 -1
  121. package/mjs/Http/ClientResponse.mjs +11 -1
  122. package/mjs/Http/ClientResponse.mjs.map +1 -1
  123. package/mjs/Http/FormData.mjs +62 -1
  124. package/mjs/Http/FormData.mjs.map +1 -1
  125. package/mjs/Http/Headers.mjs +10 -0
  126. package/mjs/Http/Headers.mjs.map +1 -1
  127. package/mjs/Http/IncomingMessage.mjs +32 -1
  128. package/mjs/Http/IncomingMessage.mjs.map +1 -1
  129. package/mjs/Http/Middleware.mjs +32 -0
  130. package/mjs/Http/Middleware.mjs.map +1 -0
  131. package/mjs/Http/Router.mjs +117 -0
  132. package/mjs/Http/Router.mjs.map +1 -0
  133. package/mjs/Http/Server.mjs +22 -0
  134. package/mjs/Http/Server.mjs.map +1 -0
  135. package/mjs/Http/ServerError.mjs +27 -0
  136. package/mjs/Http/ServerError.mjs.map +1 -0
  137. package/mjs/Http/ServerRequest.mjs +48 -0
  138. package/mjs/Http/ServerRequest.mjs.map +1 -0
  139. package/mjs/Http/ServerResponse.mjs +90 -0
  140. package/mjs/Http/ServerResponse.mjs.map +1 -0
  141. package/mjs/Http/UrlParams.mjs.map +1 -1
  142. package/mjs/HttpServer.mjs +24 -0
  143. package/mjs/HttpServer.mjs.map +1 -0
  144. package/mjs/internal/command.mjs +9 -2
  145. package/mjs/internal/command.mjs.map +1 -1
  146. package/mjs/internal/fileSystem.mjs +15 -11
  147. package/mjs/internal/fileSystem.mjs.map +1 -1
  148. package/mjs/internal/http/body.mjs +23 -25
  149. package/mjs/internal/http/body.mjs.map +1 -1
  150. package/mjs/internal/http/client.mjs +37 -24
  151. package/mjs/internal/http/client.mjs.map +1 -1
  152. package/mjs/internal/http/clientRequest.mjs +16 -4
  153. package/mjs/internal/http/clientRequest.mjs.map +1 -1
  154. package/mjs/internal/http/clientResponse.mjs +15 -12
  155. package/mjs/internal/http/clientResponse.mjs.map +1 -1
  156. package/mjs/internal/http/formData.mjs +67 -0
  157. package/mjs/internal/http/formData.mjs.map +1 -0
  158. package/mjs/internal/http/middleware.mjs +29 -0
  159. package/mjs/internal/http/middleware.mjs.map +1 -0
  160. package/mjs/internal/http/router.mjs +155 -0
  161. package/mjs/internal/http/router.mjs.map +1 -0
  162. package/mjs/internal/http/server.mjs +17 -0
  163. package/mjs/internal/http/server.mjs.map +1 -0
  164. package/mjs/internal/http/serverError.mjs +17 -0
  165. package/mjs/internal/http/serverError.mjs.map +1 -0
  166. package/mjs/internal/http/serverRequest.mjs +41 -0
  167. package/mjs/internal/http/serverRequest.mjs.map +1 -0
  168. package/mjs/internal/http/serverResponse.mjs +82 -0
  169. package/mjs/internal/http/serverResponse.mjs.map +1 -0
  170. package/package.json +2 -1
  171. package/src/Command.ts +3 -2
  172. package/src/FileSystem.ts +20 -25
  173. package/src/Http/App.ts +19 -0
  174. package/src/Http/Body.ts +41 -14
  175. package/src/Http/Client.ts +13 -2
  176. package/src/Http/ClientRequest.ts +52 -2
  177. package/src/Http/ClientResponse.ts +13 -1
  178. package/src/Http/FormData.ts +121 -5
  179. package/src/Http/Headers.ts +37 -3
  180. package/src/Http/IncomingMessage.ts +46 -3
  181. package/src/Http/Middleware.ts +69 -0
  182. package/src/Http/Router.ts +342 -0
  183. package/src/Http/Server.ts +134 -0
  184. package/src/Http/ServerError.ts +111 -0
  185. package/src/Http/ServerRequest.ts +120 -0
  186. package/src/Http/ServerResponse.ts +202 -0
  187. package/src/Http/UrlParams.ts +20 -5
  188. package/src/HttpServer.ts +44 -0
  189. package/src/internal/command.ts +9 -2
  190. package/src/internal/fileSystem.ts +10 -7
  191. package/src/internal/http/body.ts +65 -39
  192. package/src/internal/http/client.ts +96 -76
  193. package/src/internal/http/clientRequest.ts +64 -4
  194. package/src/internal/http/clientResponse.ts +21 -13
  195. package/src/internal/http/formData.ts +140 -0
  196. package/src/internal/http/middleware.ts +72 -0
  197. package/src/internal/http/router.ts +298 -0
  198. package/src/internal/http/server.ts +80 -0
  199. package/src/internal/http/serverError.ts +26 -0
  200. package/src/internal/http/serverRequest.ts +71 -0
  201. package/src/internal/http/serverResponse.ts +255 -0
@@ -0,0 +1,255 @@
1
+ import { dual } from "@effect/data/Function"
2
+ import { pipeArguments } from "@effect/data/Pipeable"
3
+ import * as Effect from "@effect/io/Effect"
4
+ import type * as PlatformError from "@effect/platform/Error"
5
+ import type * as FileSystem from "@effect/platform/FileSystem"
6
+ import type * as Body from "@effect/platform/Http/Body"
7
+ import * as Headers from "@effect/platform/Http/Headers"
8
+ import type * as Error from "@effect/platform/Http/ServerError"
9
+ import * as ServerRequest from "@effect/platform/Http/ServerRequest"
10
+ import type * as ServerResponse from "@effect/platform/Http/ServerResponse"
11
+ import * as UrlParams from "@effect/platform/Http/UrlParams"
12
+ import * as internalBody from "@effect/platform/internal/http/body"
13
+ import * as internalError from "@effect/platform/internal/http/serverError"
14
+ import type * as Schema from "@effect/schema/Schema"
15
+ import type * as Stream from "@effect/stream/Stream"
16
+
17
+ /** @internal */
18
+ export const TypeId: ServerResponse.TypeId = Symbol.for("@effect/platform/Http/ServerResponse") as ServerResponse.TypeId
19
+
20
+ class ServerResponseImpl implements ServerResponse.ServerResponse {
21
+ readonly [TypeId]: ServerResponse.TypeId
22
+ constructor(
23
+ readonly status: number,
24
+ readonly statusText: string | undefined,
25
+ readonly headers: Headers.Headers,
26
+ readonly body: Body.Body
27
+ ) {
28
+ this[TypeId] = TypeId
29
+ }
30
+ pipe() {
31
+ return pipeArguments(this, arguments)
32
+ }
33
+ }
34
+
35
+ /** @internal */
36
+ export const isServerResponse = (u: unknown): u is ServerResponse.ServerResponse =>
37
+ typeof u === "object" && u !== null && TypeId in u
38
+
39
+ /** @internal */
40
+ export const toNonEffectBody = (
41
+ self: ServerResponse.ServerResponse
42
+ ): Effect.Effect<ServerRequest.ServerRequest, Error.ResponseError, ServerResponse.ServerResponse.NonEffectBody> =>
43
+ self.body._tag === "Effect" ?
44
+ Effect.map(
45
+ Effect.catchAll(self.body.effect, (error) =>
46
+ Effect.flatMap(
47
+ ServerRequest.ServerRequest,
48
+ (request) =>
49
+ Effect.fail(
50
+ internalError.responseError({
51
+ reason: "Decode",
52
+ request,
53
+ response: self,
54
+ error
55
+ })
56
+ )
57
+ )),
58
+ (body) => setBody(self, body) as ServerResponse.ServerResponse.NonEffectBody
59
+ ) :
60
+ Effect.succeed(self as ServerResponse.ServerResponse.NonEffectBody)
61
+
62
+ /** @internal */
63
+ export const empty = (options?: ServerResponse.Options.WithContent): ServerResponse.ServerResponse =>
64
+ new ServerResponseImpl(
65
+ options?.status ?? 204,
66
+ options?.statusText,
67
+ options?.headers ?? Headers.empty,
68
+ internalBody.empty
69
+ )
70
+
71
+ /** @internal */
72
+ export const uint8Array = (
73
+ body: Uint8Array,
74
+ options?: ServerResponse.Options.WithContentType
75
+ ): ServerResponse.ServerResponse =>
76
+ new ServerResponseImpl(
77
+ options?.status ?? 200,
78
+ options?.statusText,
79
+ options?.headers ?? Headers.empty,
80
+ internalBody.uint8Array(body, options?.contentType)
81
+ )
82
+
83
+ /** @internal */
84
+ export const text = (body: string, options?: ServerResponse.Options.WithContentType): ServerResponse.ServerResponse =>
85
+ new ServerResponseImpl(
86
+ options?.status ?? 200,
87
+ options?.statusText,
88
+ options?.headers ?? Headers.empty,
89
+ internalBody.text(body, options?.contentType)
90
+ )
91
+
92
+ /** @internal */
93
+ export const json = (body: unknown, options?: ServerResponse.Options.WithContent): ServerResponse.ServerResponse =>
94
+ new ServerResponseImpl(
95
+ options?.status ?? 200,
96
+ options?.statusText,
97
+ options?.headers ?? Headers.empty,
98
+ internalBody.json(body)
99
+ )
100
+
101
+ /** @internal */
102
+ export const unsafeJson = (
103
+ body: unknown,
104
+ options?: ServerResponse.Options.WithContent
105
+ ): ServerResponse.ServerResponse =>
106
+ new ServerResponseImpl(
107
+ options?.status ?? 200,
108
+ options?.statusText,
109
+ options?.headers ?? Headers.empty,
110
+ internalBody.unsafeJson(body)
111
+ )
112
+
113
+ /** @internal */
114
+ export const schemaJson = <I, A>(
115
+ schema: Schema.Schema<I, A>
116
+ ) => {
117
+ const encode = internalBody.jsonSchema(schema)
118
+ return (body: A, options?: ServerResponse.Options.WithContent): ServerResponse.ServerResponse =>
119
+ new ServerResponseImpl(
120
+ options?.status ?? 200,
121
+ options?.statusText,
122
+ options?.headers ?? Headers.empty,
123
+ encode(body)
124
+ )
125
+ }
126
+
127
+ /** @internal */
128
+ export const file = (
129
+ path: string,
130
+ options?: ServerResponse.Options & FileSystem.StreamOptions
131
+ ): Effect.Effect<FileSystem.FileSystem, PlatformError.PlatformError, ServerResponse.ServerResponse> =>
132
+ Effect.map(internalBody.file(path, options), (body) =>
133
+ new ServerResponseImpl(
134
+ options?.status ?? 200,
135
+ options?.statusText,
136
+ options?.headers ?? Headers.empty,
137
+ body
138
+ ))
139
+
140
+ /** @internal */
141
+ export const urlParams = (
142
+ body: UrlParams.Input,
143
+ options?: ServerResponse.Options.WithContent
144
+ ): ServerResponse.ServerResponse =>
145
+ new ServerResponseImpl(
146
+ options?.status ?? 200,
147
+ options?.statusText,
148
+ options?.headers ?? Headers.empty,
149
+ internalBody.text(UrlParams.toString(UrlParams.fromInput(body)), "application/x-www-form-urlencoded")
150
+ )
151
+
152
+ /** @internal */
153
+ export const effect = (
154
+ body: Effect.Effect<never, unknown, Body.NonEffect>,
155
+ options?: ServerResponse.Options.WithContent
156
+ ): ServerResponse.ServerResponse =>
157
+ new ServerResponseImpl(
158
+ options?.status ?? 200,
159
+ options?.statusText,
160
+ options?.headers ?? Headers.empty,
161
+ internalBody.effect(body)
162
+ )
163
+
164
+ /** @internal */
165
+ export const raw = (body: unknown, options?: ServerResponse.Options): ServerResponse.ServerResponse =>
166
+ new ServerResponseImpl(
167
+ options?.status ?? 200,
168
+ options?.statusText,
169
+ options?.headers ?? Headers.empty,
170
+ internalBody.raw(body)
171
+ )
172
+
173
+ /** @internal */
174
+ export const formData = (body: FormData, options?: ServerResponse.Options.WithContent): ServerResponse.ServerResponse =>
175
+ new ServerResponseImpl(
176
+ options?.status ?? 200,
177
+ options?.statusText,
178
+ options?.headers ?? Headers.empty,
179
+ internalBody.formData(body)
180
+ )
181
+
182
+ /** @internal */
183
+ export const stream = (
184
+ body: Stream.Stream<never, unknown, Uint8Array>,
185
+ options?: ServerResponse.Options
186
+ ): ServerResponse.ServerResponse =>
187
+ new ServerResponseImpl(
188
+ options?.status ?? 200,
189
+ options?.statusText,
190
+ options?.headers ?? Headers.empty,
191
+ internalBody.stream(body, options?.contentType, options?.contentLength)
192
+ )
193
+
194
+ /** @internal */
195
+ export const setHeader = dual<
196
+ (key: string, value: string) => (self: ServerResponse.ServerResponse) => ServerResponse.ServerResponse,
197
+ (self: ServerResponse.ServerResponse, key: string, value: string) => ServerResponse.ServerResponse
198
+ >(3, (self, key, value) =>
199
+ new ServerResponseImpl(
200
+ self.status,
201
+ self.statusText,
202
+ Headers.set(self.headers, key, value),
203
+ self.body
204
+ ))
205
+
206
+ /** @internal */
207
+ export const setHeaders = dual<
208
+ (input: Headers.Input) => (self: ServerResponse.ServerResponse) => ServerResponse.ServerResponse,
209
+ (self: ServerResponse.ServerResponse, input: Headers.Input) => ServerResponse.ServerResponse
210
+ >(2, (self, input) =>
211
+ new ServerResponseImpl(
212
+ self.status,
213
+ self.statusText,
214
+ Headers.setAll(self.headers, input),
215
+ self.body
216
+ ))
217
+
218
+ /** @internal */
219
+ export const setStatus = dual<
220
+ (status: number, statusText?: string) => (self: ServerResponse.ServerResponse) => ServerResponse.ServerResponse,
221
+ (self: ServerResponse.ServerResponse, status: number, statusText?: string) => ServerResponse.ServerResponse
222
+ >((args) => isServerResponse(args[0]), (self, status, statusText) =>
223
+ new ServerResponseImpl(
224
+ status,
225
+ statusText,
226
+ self.headers,
227
+ self.body
228
+ ))
229
+
230
+ /** @internal */
231
+ export const setBody = dual<
232
+ (body: Body.Body) => (self: ServerResponse.ServerResponse) => ServerResponse.ServerResponse,
233
+ (self: ServerResponse.ServerResponse, body: Body.Body) => ServerResponse.ServerResponse
234
+ >(2, (self, body) => {
235
+ let headers = self.headers
236
+ if (body._tag === "Empty") {
237
+ headers = Headers.remove(Headers.remove(headers, "Content-Type"), "Content-length")
238
+ } else {
239
+ const contentType = body.contentType
240
+ if (contentType) {
241
+ headers = Headers.set(headers, "content-type", contentType)
242
+ }
243
+
244
+ const contentLength = body.contentLength
245
+ if (contentLength) {
246
+ headers = Headers.set(headers, "content-length", contentLength.toString())
247
+ }
248
+ }
249
+ return new ServerResponseImpl(
250
+ self.status,
251
+ self.statusText,
252
+ headers,
253
+ body
254
+ )
255
+ })