@effect/platform-node 0.27.2 → 0.27.4
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/Http/Server/dist/effect-platform-node-Http-Server.cjs.dev.js +3 -1
- package/Http/Server/dist/effect-platform-node-Http-Server.cjs.prod.js +3 -1
- package/Http/Server/dist/effect-platform-node-Http-Server.esm.js +2 -1
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.d.mts +2 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.d.mts.map +1 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.d.ts +2 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.d.ts.map +1 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.dev.js +75 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.js +7 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.mjs +1 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.prod.js +75 -0
- package/Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.esm.js +65 -0
- package/Http/ServerRequest/package.json +4 -0
- package/HttpServer/dist/effect-platform-node-HttpServer.cjs.dev.js +6 -4
- package/HttpServer/dist/effect-platform-node-HttpServer.cjs.prod.js +6 -4
- package/HttpServer/dist/effect-platform-node-HttpServer.esm.js +5 -3
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.dev.js +9 -2
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.prod.js +9 -2
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.esm.js +9 -3
- package/dist/Server-1f2aa4ca.cjs.dev.js +83 -0
- package/dist/Server-96c17c96.cjs.prod.js +83 -0
- package/dist/Server-c315ddf2.esm.js +57 -0
- package/dist/declarations/src/Http/Server.d.ts +11 -0
- package/dist/declarations/src/Http/Server.d.ts.map +1 -1
- package/dist/declarations/src/Http/ServerRequest.d.ts +18 -0
- package/dist/declarations/src/Http/ServerRequest.d.ts.map +1 -0
- package/dist/declarations/src/HttpServer.d.ts +3 -3
- package/dist/declarations/src/HttpServer.d.ts.map +1 -1
- package/dist/declarations/src/WorkerRunner.d.ts +6 -0
- package/dist/declarations/src/WorkerRunner.d.ts.map +1 -1
- package/dist/{Server-9108df65.cjs.prod.js → server-42346e37.cjs.prod.js} +29 -69
- package/dist/{Server-c9262046.esm.js → server-442c5e69.esm.js} +29 -70
- package/dist/{Server-7a3dbcbe.cjs.dev.js → server-b13861a8.cjs.dev.js} +29 -69
- package/package.json +7 -1
- package/src/Http/Server.ts +25 -0
- package/src/Http/ServerRequest.ts +19 -0
- package/src/HttpServer.ts +3 -3
- package/src/WorkerRunner.ts +7 -0
- package/src/internal/http/server.ts +49 -24
|
@@ -4,7 +4,7 @@ var FileSystem = require('@effect/platform/FileSystem');
|
|
|
4
4
|
var App = require('@effect/platform/Http/App');
|
|
5
5
|
var IncomingMessage = require('@effect/platform/Http/IncomingMessage');
|
|
6
6
|
var Middleware = require('@effect/platform/Http/Middleware');
|
|
7
|
-
var Server
|
|
7
|
+
var Server = require('@effect/platform/Http/Server');
|
|
8
8
|
var Error = require('@effect/platform/Http/ServerError');
|
|
9
9
|
var ServerRequest = require('@effect/platform/Http/ServerRequest');
|
|
10
10
|
var Config = require('effect/Config');
|
|
@@ -39,26 +39,11 @@ function _interopNamespace(e) {
|
|
|
39
39
|
return Object.freeze(n);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
function _mergeNamespaces(n, m) {
|
|
43
|
-
m.forEach(function (e) {
|
|
44
|
-
e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {
|
|
45
|
-
if (k !== 'default' && !(k in n)) {
|
|
46
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
47
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
48
|
-
enumerable: true,
|
|
49
|
-
get: function () { return e[k]; }
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
return Object.freeze(n);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
42
|
var FileSystem__namespace = /*#__PURE__*/_interopNamespace(FileSystem);
|
|
58
43
|
var App__namespace = /*#__PURE__*/_interopNamespace(App);
|
|
59
44
|
var IncomingMessage__namespace = /*#__PURE__*/_interopNamespace(IncomingMessage);
|
|
60
45
|
var Middleware__namespace = /*#__PURE__*/_interopNamespace(Middleware);
|
|
61
|
-
var Server__namespace = /*#__PURE__*/_interopNamespace(Server
|
|
46
|
+
var Server__namespace = /*#__PURE__*/_interopNamespace(Server);
|
|
62
47
|
var Error__namespace = /*#__PURE__*/_interopNamespace(Error);
|
|
63
48
|
var ServerRequest__namespace = /*#__PURE__*/_interopNamespace(ServerRequest);
|
|
64
49
|
var Config__namespace = /*#__PURE__*/_interopNamespace(Config);
|
|
@@ -70,7 +55,7 @@ var Runtime__namespace = /*#__PURE__*/_interopNamespace(Runtime);
|
|
|
70
55
|
var Stream__namespace = /*#__PURE__*/_interopNamespace(Stream);
|
|
71
56
|
|
|
72
57
|
/** @internal */
|
|
73
|
-
const make
|
|
58
|
+
const make = (evaluate, options) => Effect__namespace.gen(function* (_) {
|
|
74
59
|
const server = evaluate();
|
|
75
60
|
const serverFiber = yield* _(Effect__namespace.addFinalizer(() => Effect__namespace.async(resume => {
|
|
76
61
|
server.close(error => {
|
|
@@ -102,24 +87,10 @@ const make$1 = (evaluate, options) => Effect__namespace.gen(function* (_) {
|
|
|
102
87
|
hostname: address.address,
|
|
103
88
|
port: address.port
|
|
104
89
|
},
|
|
105
|
-
serve: (httpApp, middleware) => {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
function handler(nodeRequest, nodeResponse) {
|
|
110
|
-
const fiber = runFork(Effect__namespace.provideService(handledApp, ServerRequest__namespace.ServerRequest, new ServerRequestImpl(nodeRequest, nodeResponse)));
|
|
111
|
-
nodeResponse.on("close", () => {
|
|
112
|
-
if (!nodeResponse.writableEnded) {
|
|
113
|
-
runFork(fiber.interruptAsFork(fiberId));
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
return Effect__namespace.all([Effect__namespace.acquireRelease(Effect__namespace.sync(() => server.on("request", handler)), () => Effect__namespace.sync(() => server.off("request", handler))), Fiber__namespace.join(serverFiber)], {
|
|
118
|
-
discard: true,
|
|
119
|
-
concurrency: "unbounded"
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
}
|
|
90
|
+
serve: (httpApp, middleware) => Effect__namespace.flatMap(makeHandler(httpApp, middleware), handler => Effect__namespace.all([Effect__namespace.acquireRelease(Effect__namespace.sync(() => server.on("request", handler)), () => Effect__namespace.sync(() => server.off("request", handler))), Fiber__namespace.join(serverFiber)], {
|
|
91
|
+
discard: true,
|
|
92
|
+
concurrency: "unbounded"
|
|
93
|
+
}))
|
|
123
94
|
});
|
|
124
95
|
}).pipe(Effect__namespace.locally(IncomingMessage__namespace.maxBodySize, Option__namespace.some(FileSystem__namespace.Size(1024 * 1024 * 10))));
|
|
125
96
|
const respond = /*#__PURE__*/Middleware__namespace.make(httpApp => Effect__namespace.flatMap(ServerRequest__namespace.ServerRequest, request => Effect__namespace.tapErrorCause(Effect__namespace.tap(Effect__namespace.flatMap(httpApp, response => Effect__namespace.flatMap(App__namespace.preResponseHandler, f => f(request, response))), response => handleResponse(request, response)), _cause => Effect__namespace.sync(() => {
|
|
@@ -131,6 +102,22 @@ const respond = /*#__PURE__*/Middleware__namespace.make(httpApp => Effect__names
|
|
|
131
102
|
nodeResponse.end();
|
|
132
103
|
}
|
|
133
104
|
}))));
|
|
105
|
+
|
|
106
|
+
/** @internal */
|
|
107
|
+
const makeHandler = (httpApp, middleware) => {
|
|
108
|
+
const handledApp = middleware ? middleware(App__namespace.withDefaultMiddleware(respond(httpApp))) : App__namespace.withDefaultMiddleware(respond(httpApp));
|
|
109
|
+
return Effect__namespace.map(Effect__namespace.zip(Effect__namespace.runtime(), Effect__namespace.fiberId), ([runtime, fiberId]) => {
|
|
110
|
+
const runFork = Runtime__namespace.runFork(runtime);
|
|
111
|
+
return function handler(nodeRequest, nodeResponse) {
|
|
112
|
+
const fiber = runFork(Effect__namespace.provideService(handledApp, ServerRequest__namespace.ServerRequest, new ServerRequestImpl(nodeRequest, nodeResponse)));
|
|
113
|
+
nodeResponse.on("close", () => {
|
|
114
|
+
if (!nodeResponse.writableEnded) {
|
|
115
|
+
runFork(fiber.interruptAsFork(fiberId));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
};
|
|
134
121
|
class ServerRequestImpl extends incomingMessage.IncomingMessageImpl {
|
|
135
122
|
constructor(source, response, url = source.url, headersOverride, remoteAddressOverride) {
|
|
136
123
|
super(source, _ => Error__namespace.RequestError({
|
|
@@ -182,10 +169,10 @@ class ServerRequestImpl extends incomingMessage.IncomingMessageImpl {
|
|
|
182
169
|
}
|
|
183
170
|
|
|
184
171
|
/** @internal */
|
|
185
|
-
const layer
|
|
172
|
+
const layer = (evaluate, options) => Layer__namespace.merge(Layer__namespace.scoped(Server__namespace.Server, make(evaluate, options)), platform.layer);
|
|
186
173
|
|
|
187
174
|
/** @internal */
|
|
188
|
-
const layerConfig
|
|
175
|
+
const layerConfig = (evaluate, options) => Layer__namespace.merge(Layer__namespace.scoped(Server__namespace.Server, Effect__namespace.flatMap(Effect__namespace.config(Config__namespace.unwrap(options)), options => make(evaluate, options))), platform.layer);
|
|
189
176
|
const handleResponse = (request, response) => Effect__namespace.suspend(() => {
|
|
190
177
|
const nodeResponse = request.response;
|
|
191
178
|
if (request.method === "HEAD") {
|
|
@@ -266,38 +253,11 @@ const handleResponse = (request, response) => Effect__namespace.suspend(() => {
|
|
|
266
253
|
}
|
|
267
254
|
});
|
|
268
255
|
|
|
269
|
-
/**
|
|
270
|
-
|
|
271
|
-
*
|
|
272
|
-
* Also includes exports from [`@effect/platform/Http/Server`](https://effect-ts.github.io/platform/platform/Http/Server.ts.html).
|
|
273
|
-
*/
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* @since 1.0.0
|
|
277
|
-
* @category constructors
|
|
278
|
-
*/
|
|
279
|
-
const make = make$1;
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* @since 1.0.0
|
|
283
|
-
* @category layers
|
|
284
|
-
*/
|
|
285
|
-
const layer = layer$1;
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* @since 1.0.0
|
|
289
|
-
* @category layers
|
|
290
|
-
*/
|
|
291
|
-
const layerConfig = layerConfig$1;
|
|
292
|
-
|
|
293
|
-
var Server = /*#__PURE__*/_mergeNamespaces({
|
|
294
|
-
__proto__: null,
|
|
295
|
-
make: make,
|
|
296
|
-
layer: layer,
|
|
297
|
-
layerConfig: layerConfig
|
|
298
|
-
}, [Server__namespace]);
|
|
256
|
+
/** @internal */
|
|
257
|
+
const requestSource = self => self.source;
|
|
299
258
|
|
|
300
|
-
exports.Server = Server;
|
|
301
259
|
exports.layer = layer;
|
|
302
260
|
exports.layerConfig = layerConfig;
|
|
303
261
|
exports.make = make;
|
|
262
|
+
exports.makeHandler = makeHandler;
|
|
263
|
+
exports.requestSource = requestSource;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/platform-node",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.4",
|
|
4
4
|
"description": "Unified interfaces for common platform-specific services",
|
|
5
5
|
"main": "dist/effect-platform-node.cjs.js",
|
|
6
6
|
"module": "dist/effect-platform-node.esm.js",
|
|
@@ -136,6 +136,12 @@
|
|
|
136
136
|
"import": "./Http/Server/dist/effect-platform-node-Http-Server.cjs.mjs",
|
|
137
137
|
"default": "./Http/Server/dist/effect-platform-node-Http-Server.cjs.js"
|
|
138
138
|
},
|
|
139
|
+
"./Http/ServerRequest": {
|
|
140
|
+
"types": "./dist/declarations/src/Http/ServerRequest.d.ts",
|
|
141
|
+
"module": "./Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.esm.js",
|
|
142
|
+
"import": "./Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.mjs",
|
|
143
|
+
"default": "./Http/ServerRequest/dist/effect-platform-node-Http-ServerRequest.cjs.js"
|
|
144
|
+
},
|
|
139
145
|
"./HttpClient": {
|
|
140
146
|
"types": "./dist/declarations/src/HttpClient.d.ts",
|
|
141
147
|
"module": "./HttpClient/dist/effect-platform-node-HttpClient.esm.js",
|
package/src/Http/Server.ts
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Also includes exports from [`@effect/platform/Http/Server`](https://effect-ts.github.io/platform/platform/Http/Server.ts.html).
|
|
5
5
|
*/
|
|
6
|
+
import type * as App from "@effect/platform/Http/App"
|
|
7
|
+
import type * as Middleware from "@effect/platform/Http/Middleware"
|
|
6
8
|
import type * as Platform from "@effect/platform/Http/Platform"
|
|
7
9
|
import type * as Server from "@effect/platform/Http/Server"
|
|
10
|
+
import type * as ServerRequest from "@effect/platform/Http/ServerRequest"
|
|
8
11
|
import type * as Config from "effect/Config"
|
|
9
12
|
import type * as ConfigError from "effect/ConfigError"
|
|
10
13
|
import type * as Effect from "effect/Effect"
|
|
@@ -29,6 +32,28 @@ export const make: (
|
|
|
29
32
|
options: Net.ListenOptions
|
|
30
33
|
) => Effect.Effect<Scope.Scope, never, Server.Server> = internal.make
|
|
31
34
|
|
|
35
|
+
/**
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
* @category constructors
|
|
38
|
+
*/
|
|
39
|
+
export const makeHandler: {
|
|
40
|
+
<R, E>(
|
|
41
|
+
httpApp: App.Default<R, E>
|
|
42
|
+
): Effect.Effect<
|
|
43
|
+
Exclude<R, ServerRequest.ServerRequest>,
|
|
44
|
+
never,
|
|
45
|
+
(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse<Http.IncomingMessage>) => void
|
|
46
|
+
>
|
|
47
|
+
<R, E, App extends App.Default<any, any>>(
|
|
48
|
+
httpApp: App.Default<R, E>,
|
|
49
|
+
middleware: Middleware.Middleware.Applied<R, E, App>
|
|
50
|
+
): Effect.Effect<
|
|
51
|
+
Exclude<Effect.Effect.Context<App>, ServerRequest.ServerRequest>,
|
|
52
|
+
never,
|
|
53
|
+
(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse<Http.IncomingMessage>) => void
|
|
54
|
+
>
|
|
55
|
+
} = internal.makeHandler
|
|
56
|
+
|
|
32
57
|
/**
|
|
33
58
|
* @since 1.0.0
|
|
34
59
|
* @category layers
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*
|
|
4
|
+
* Also includes exports from [`@effect/platform/Http/ServerRequest`](https://effect-ts.github.io/platform/platform/Http/ServerRequest.ts.html).
|
|
5
|
+
*/
|
|
6
|
+
import type * as ServerRequest from "@effect/platform/Http/ServerRequest"
|
|
7
|
+
import type * as Http from "node:http"
|
|
8
|
+
import * as internal from "../internal/http/server"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @since 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
export * from "@effect/platform/Http/ServerRequest"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @category conversions
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
export const toIncomingMessage: (self: ServerRequest.ServerRequest) => Http.IncomingMessage = internal.requestSource
|
package/src/HttpServer.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
+
import * as request from "@effect/platform-node/Http/ServerRequest"
|
|
4
5
|
import * as app from "@effect/platform/Http/App"
|
|
5
6
|
import * as body from "@effect/platform/Http/Body"
|
|
6
7
|
import * as headers from "@effect/platform/Http/Headers"
|
|
7
8
|
import * as middleware from "@effect/platform/Http/Middleware"
|
|
8
9
|
import * as router from "@effect/platform/Http/Router"
|
|
9
10
|
import * as error from "@effect/platform/Http/ServerError"
|
|
10
|
-
import * as request from "@effect/platform/Http/ServerRequest"
|
|
11
11
|
import * as response from "@effect/platform/Http/ServerResponse"
|
|
12
12
|
import * as urlParams from "@effect/platform/Http/UrlParams"
|
|
13
13
|
import * as etag from "./Http/Etag"
|
|
@@ -67,8 +67,8 @@ export {
|
|
|
67
67
|
/**
|
|
68
68
|
* @since 1.0.0
|
|
69
69
|
*
|
|
70
|
-
* - Docs: [Http/ServerRequest](https://effect-ts.github.io/platform/platform/Http/ServerRequest.ts.html)
|
|
71
|
-
* - Module: `@effect/platform/Http/ServerRequest`
|
|
70
|
+
* - Docs: [Http/ServerRequest](https://effect-ts.github.io/platform/platform-node/Http/ServerRequest.ts.html)
|
|
71
|
+
* - Module: `@effect/platform-node/Http/ServerRequest`
|
|
72
72
|
*/
|
|
73
73
|
request,
|
|
74
74
|
/**
|
package/src/WorkerRunner.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { WorkerError } from "@effect/platform/WorkerError"
|
|
7
7
|
import type * as Runner from "@effect/platform/WorkerRunner"
|
|
8
8
|
import type { Effect } from "effect"
|
|
9
|
+
import type * as Layer from "effect/Layer"
|
|
9
10
|
import type * as Scope from "effect/Scope"
|
|
10
11
|
import type * as Stream from "effect/Stream"
|
|
11
12
|
import * as internal from "./internal/workerRunner"
|
|
@@ -23,3 +24,9 @@ export const make: <I, R, E, O>(
|
|
|
23
24
|
process: (request: I) => Stream.Stream<R, E, O>,
|
|
24
25
|
options?: Runner.Runner.Options<O> | undefined
|
|
25
26
|
) => Effect.Effect<R | Scope.Scope, WorkerError, void> = internal.make
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
* @category layers
|
|
31
|
+
*/
|
|
32
|
+
export const layer: Layer.Layer<never, never, Runner.PlatformRunner> = internal.layer
|
|
@@ -78,35 +78,15 @@ export const make = (
|
|
|
78
78
|
hostname: address.address,
|
|
79
79
|
port: address.port
|
|
80
80
|
},
|
|
81
|
-
serve: (httpApp, middleware) =>
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
: App.withDefaultMiddleware(respond(httpApp))
|
|
85
|
-
return Effect.flatMap(Effect.all([Effect.runtime(), Effect.fiberId]), ([runtime, fiberId]) => {
|
|
86
|
-
const runFork = Runtime.runFork(runtime)
|
|
87
|
-
function handler(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) {
|
|
88
|
-
const fiber = runFork(
|
|
89
|
-
Effect.provideService(
|
|
90
|
-
handledApp,
|
|
91
|
-
ServerRequest.ServerRequest,
|
|
92
|
-
new ServerRequestImpl(nodeRequest, nodeResponse)
|
|
93
|
-
)
|
|
94
|
-
)
|
|
95
|
-
nodeResponse.on("close", () => {
|
|
96
|
-
if (!nodeResponse.writableEnded) {
|
|
97
|
-
runFork(fiber.interruptAsFork(fiberId))
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
return Effect.all([
|
|
81
|
+
serve: (httpApp, middleware) =>
|
|
82
|
+
Effect.flatMap(makeHandler(httpApp, middleware!), (handler) =>
|
|
83
|
+
Effect.all([
|
|
102
84
|
Effect.acquireRelease(
|
|
103
85
|
Effect.sync(() => server.on("request", handler)),
|
|
104
86
|
() => Effect.sync(() => server.off("request", handler))
|
|
105
87
|
),
|
|
106
88
|
Fiber.join(serverFiber)
|
|
107
|
-
], { discard: true, concurrency: "unbounded" }) as Effect.Effect<never, Error.ServeError, never>
|
|
108
|
-
})
|
|
109
|
-
}
|
|
89
|
+
], { discard: true, concurrency: "unbounded" }) as Effect.Effect<never, Error.ServeError, never>)
|
|
110
90
|
})
|
|
111
91
|
}).pipe(
|
|
112
92
|
Effect.locally(
|
|
@@ -138,6 +118,47 @@ const respond = Middleware.make((httpApp) =>
|
|
|
138
118
|
))
|
|
139
119
|
)
|
|
140
120
|
|
|
121
|
+
/** @internal */
|
|
122
|
+
export const makeHandler: {
|
|
123
|
+
<R, E>(httpApp: App.Default<R, E>): Effect.Effect<
|
|
124
|
+
Exclude<R, ServerRequest.ServerRequest>,
|
|
125
|
+
never,
|
|
126
|
+
(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) => void
|
|
127
|
+
>
|
|
128
|
+
<R, E, App extends App.Default<any, any>>(
|
|
129
|
+
httpApp: App.Default<R, E>,
|
|
130
|
+
middleware: Middleware.Middleware.Applied<R, E, App>
|
|
131
|
+
): Effect.Effect<
|
|
132
|
+
Exclude<Effect.Effect.Context<App>, ServerRequest.ServerRequest>,
|
|
133
|
+
never,
|
|
134
|
+
(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) => void
|
|
135
|
+
>
|
|
136
|
+
} = <R, E>(httpApp: App.Default<R, E>, middleware?: Middleware.Middleware) => {
|
|
137
|
+
const handledApp = middleware
|
|
138
|
+
? middleware(App.withDefaultMiddleware(respond(httpApp)))
|
|
139
|
+
: App.withDefaultMiddleware(respond(httpApp))
|
|
140
|
+
return Effect.map(
|
|
141
|
+
Effect.zip(Effect.runtime<R>(), Effect.fiberId),
|
|
142
|
+
([runtime, fiberId]) => {
|
|
143
|
+
const runFork = Runtime.runFork(runtime)
|
|
144
|
+
return function handler(nodeRequest: Http.IncomingMessage, nodeResponse: Http.ServerResponse) {
|
|
145
|
+
const fiber = runFork(
|
|
146
|
+
Effect.provideService(
|
|
147
|
+
handledApp,
|
|
148
|
+
ServerRequest.ServerRequest,
|
|
149
|
+
new ServerRequestImpl(nodeRequest, nodeResponse)
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
nodeResponse.on("close", () => {
|
|
153
|
+
if (!nodeResponse.writableEnded) {
|
|
154
|
+
runFork(fiber.interruptAsFork(fiberId))
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
|
|
141
162
|
class ServerRequestImpl extends IncomingMessageImpl<Error.RequestError> implements ServerRequest.ServerRequest {
|
|
142
163
|
readonly [ServerRequest.TypeId]: ServerRequest.TypeId
|
|
143
164
|
|
|
@@ -339,3 +360,7 @@ const handleResponse = (request: ServerRequest.ServerRequest, response: ServerRe
|
|
|
339
360
|
}
|
|
340
361
|
}
|
|
341
362
|
})
|
|
363
|
+
|
|
364
|
+
/** @internal */
|
|
365
|
+
export const requestSource = (self: ServerRequest.ServerRequest): Http.IncomingMessage =>
|
|
366
|
+
(self as ServerRequestImpl).source
|