@effect/platform-node 0.104.0 → 4.0.0-beta.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/dist/Mime.d.ts +15 -0
- package/dist/Mime.d.ts.map +1 -0
- package/dist/Mime.js +16 -0
- package/dist/Mime.js.map +1 -0
- package/dist/NodeChildProcessSpawner.d.ts +7 -0
- package/dist/NodeChildProcessSpawner.d.ts.map +1 -0
- package/dist/NodeChildProcessSpawner.js +7 -0
- package/dist/NodeChildProcessSpawner.js.map +1 -0
- package/dist/NodeClusterHttp.d.ts +44 -0
- package/dist/NodeClusterHttp.d.ts.map +1 -0
- package/dist/{esm/NodeClusterHttp.js → NodeClusterHttp.js} +14 -18
- package/dist/NodeClusterHttp.js.map +1 -0
- package/dist/{dts/NodeClusterSocket.d.ts → NodeClusterSocket.d.ts} +13 -13
- package/dist/NodeClusterSocket.d.ts.map +1 -0
- package/dist/{esm/NodeClusterSocket.js → NodeClusterSocket.js} +13 -13
- package/dist/NodeClusterSocket.js.map +1 -0
- package/dist/NodeFileSystem.d.ts +8 -0
- package/dist/NodeFileSystem.d.ts.map +1 -0
- package/dist/NodeFileSystem.js.map +1 -0
- package/dist/NodeHttpClient.d.ts +110 -0
- package/dist/NodeHttpClient.d.ts.map +1 -0
- package/dist/NodeHttpClient.js +446 -0
- package/dist/NodeHttpClient.js.map +1 -0
- package/dist/NodeHttpIncomingMessage.d.ts +35 -0
- package/dist/NodeHttpIncomingMessage.d.ts.map +1 -0
- package/dist/NodeHttpIncomingMessage.js +77 -0
- package/dist/NodeHttpIncomingMessage.js.map +1 -0
- package/dist/NodeHttpPlatform.d.ts +26 -0
- package/dist/NodeHttpPlatform.d.ts.map +1 -0
- package/dist/{esm/internal/httpPlatform.js → NodeHttpPlatform.js} +20 -11
- package/dist/NodeHttpPlatform.js.map +1 -0
- package/dist/NodeHttpServer.d.ts +73 -0
- package/dist/NodeHttpServer.d.ts.map +1 -0
- package/dist/NodeHttpServer.js +376 -0
- package/dist/NodeHttpServer.js.map +1 -0
- package/dist/NodeHttpServerRequest.d.ts +16 -0
- package/dist/NodeHttpServerRequest.d.ts.map +1 -0
- package/dist/NodeHttpServerRequest.js +14 -0
- package/dist/NodeHttpServerRequest.js.map +1 -0
- package/dist/NodeMultipart.d.ts +26 -0
- package/dist/NodeMultipart.d.ts.map +1 -0
- package/dist/NodeMultipart.js +131 -0
- package/dist/NodeMultipart.js.map +1 -0
- package/dist/NodePath.d.ts +18 -0
- package/dist/NodePath.d.ts.map +1 -0
- package/dist/NodePath.js.map +1 -0
- package/dist/NodeRedis.d.ts +31 -0
- package/dist/NodeRedis.d.ts.map +1 -0
- package/dist/NodeRedis.js +51 -0
- package/dist/NodeRedis.js.map +1 -0
- package/dist/NodeRuntime.d.ts +94 -0
- package/dist/NodeRuntime.d.ts.map +1 -0
- package/dist/NodeRuntime.js +33 -0
- package/dist/NodeRuntime.js.map +1 -0
- package/dist/NodeServices.d.ts +20 -0
- package/dist/NodeServices.d.ts.map +1 -0
- package/dist/NodeServices.js +12 -0
- package/dist/NodeServices.js.map +1 -0
- package/dist/NodeSink.d.ts.map +1 -0
- package/dist/NodeSink.js.map +1 -0
- package/dist/NodeSocket.d.ts +23 -0
- package/dist/NodeSocket.d.ts.map +1 -0
- package/dist/{esm/NodeSocket.js → NodeSocket.js} +9 -8
- package/dist/NodeSocket.js.map +1 -0
- package/dist/NodeSocketServer.d.ts.map +1 -0
- package/dist/NodeSocketServer.js.map +1 -0
- package/dist/NodeStdio.d.ts +8 -0
- package/dist/NodeStdio.d.ts.map +1 -0
- package/dist/NodeStdio.js +10 -0
- package/dist/NodeStdio.js.map +1 -0
- package/dist/{dts/NodeStream.d.ts → NodeStream.d.ts} +1 -1
- package/dist/NodeStream.d.ts.map +1 -0
- package/dist/{esm/NodeStream.js → NodeStream.js} +1 -1
- package/dist/NodeStream.js.map +1 -0
- package/dist/{dts/NodeTerminal.d.ts → NodeTerminal.d.ts} +2 -2
- package/dist/NodeTerminal.d.ts.map +1 -0
- package/dist/{esm/NodeTerminal.js → NodeTerminal.js} +1 -1
- package/dist/NodeTerminal.js.map +1 -0
- package/dist/NodeWorker.d.ts +15 -0
- package/dist/NodeWorker.d.ts.map +1 -0
- package/dist/NodeWorker.js +81 -0
- package/dist/NodeWorker.js.map +1 -0
- package/dist/NodeWorkerRunner.d.ts +8 -0
- package/dist/NodeWorkerRunner.d.ts.map +1 -0
- package/dist/NodeWorkerRunner.js +85 -0
- package/dist/NodeWorkerRunner.js.map +1 -0
- package/dist/{dts/Undici.d.ts → Undici.d.ts} +3 -3
- package/dist/Undici.d.ts.map +1 -0
- package/dist/{esm/Undici.js → Undici.js} +3 -3
- package/dist/Undici.js.map +1 -0
- package/dist/index.d.ts +102 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/{esm/index.js → index.js} +25 -7
- package/dist/index.js.map +1 -0
- package/package.json +60 -213
- package/src/Mime.ts +18 -0
- package/src/NodeChildProcessSpawner.ts +6 -0
- package/src/NodeClusterHttp.ts +33 -35
- package/src/NodeClusterSocket.ts +23 -24
- package/src/NodeFileSystem.ts +3 -3
- package/src/NodeHttpClient.ts +506 -70
- package/src/NodeHttpIncomingMessage.ts +105 -0
- package/src/NodeHttpPlatform.ts +44 -10
- package/src/NodeHttpServer.ts +539 -102
- package/src/NodeHttpServerRequest.ts +8 -8
- package/src/NodeMultipart.ts +156 -1
- package/src/NodePath.ts +5 -6
- package/src/NodeRedis.ts +74 -0
- package/src/NodeRuntime.ts +95 -3
- package/src/NodeServices.ts +34 -0
- package/src/NodeSocket.ts +24 -16
- package/src/NodeStdio.ts +12 -0
- package/src/NodeStream.ts +1 -1
- package/src/NodeTerminal.ts +2 -2
- package/src/NodeWorker.ts +89 -20
- package/src/NodeWorkerRunner.ts +89 -12
- package/src/Undici.ts +7 -7
- package/src/index.ts +44 -21
- package/NodeClusterHttp/package.json +0 -6
- package/NodeClusterSocket/package.json +0 -6
- package/NodeCommandExecutor/package.json +0 -6
- package/NodeContext/package.json +0 -6
- package/NodeFileSystem/ParcelWatcher/package.json +0 -6
- package/NodeFileSystem/package.json +0 -6
- package/NodeHttpClient/package.json +0 -6
- package/NodeHttpPlatform/package.json +0 -6
- package/NodeHttpServer/package.json +0 -6
- package/NodeHttpServerRequest/package.json +0 -6
- package/NodeKeyValueStore/package.json +0 -6
- package/NodeMultipart/package.json +0 -6
- package/NodePath/package.json +0 -6
- package/NodeRuntime/package.json +0 -6
- package/NodeSink/package.json +0 -6
- package/NodeSocket/package.json +0 -6
- package/NodeSocketServer/package.json +0 -6
- package/NodeStream/package.json +0 -6
- package/NodeTerminal/package.json +0 -6
- package/NodeWorker/package.json +0 -6
- package/NodeWorkerRunner/package.json +0 -6
- package/Undici/package.json +0 -6
- package/dist/cjs/NodeClusterHttp.js +0 -61
- package/dist/cjs/NodeClusterHttp.js.map +0 -1
- package/dist/cjs/NodeClusterSocket.js +0 -77
- package/dist/cjs/NodeClusterSocket.js.map +0 -1
- package/dist/cjs/NodeCommandExecutor.js +0 -18
- package/dist/cjs/NodeCommandExecutor.js.map +0 -1
- package/dist/cjs/NodeContext.js +0 -24
- package/dist/cjs/NodeContext.js.map +0 -1
- package/dist/cjs/NodeFileSystem/ParcelWatcher.js +0 -18
- package/dist/cjs/NodeFileSystem/ParcelWatcher.js.map +0 -1
- package/dist/cjs/NodeFileSystem.js +0 -18
- package/dist/cjs/NodeFileSystem.js.map +0 -1
- package/dist/cjs/NodeHttpClient.js +0 -92
- package/dist/cjs/NodeHttpClient.js.map +0 -1
- package/dist/cjs/NodeHttpPlatform.js +0 -19
- package/dist/cjs/NodeHttpPlatform.js.map +0 -1
- package/dist/cjs/NodeHttpServer.js +0 -68
- package/dist/cjs/NodeHttpServer.js.map +0 -1
- package/dist/cjs/NodeHttpServerRequest.js +0 -19
- package/dist/cjs/NodeHttpServerRequest.js.map +0 -1
- package/dist/cjs/NodeKeyValueStore.js +0 -18
- package/dist/cjs/NodeKeyValueStore.js.map +0 -1
- package/dist/cjs/NodeMultipart.js +0 -17
- package/dist/cjs/NodeMultipart.js.map +0 -1
- package/dist/cjs/NodePath.js +0 -28
- package/dist/cjs/NodePath.js.map +0 -1
- package/dist/cjs/NodeRuntime.js +0 -18
- package/dist/cjs/NodeRuntime.js.map +0 -1
- package/dist/cjs/NodeSink.js +0 -17
- package/dist/cjs/NodeSink.js.map +0 -1
- package/dist/cjs/NodeSocket.js +0 -51
- package/dist/cjs/NodeSocket.js.map +0 -1
- package/dist/cjs/NodeSocketServer.js +0 -17
- package/dist/cjs/NodeSocketServer.js.map +0 -1
- package/dist/cjs/NodeStream.js +0 -17
- package/dist/cjs/NodeStream.js.map +0 -1
- package/dist/cjs/NodeTerminal.js +0 -23
- package/dist/cjs/NodeTerminal.js.map +0 -1
- package/dist/cjs/NodeWorker.js +0 -29
- package/dist/cjs/NodeWorker.js.map +0 -1
- package/dist/cjs/NodeWorkerRunner.js +0 -21
- package/dist/cjs/NodeWorkerRunner.js.map +0 -1
- package/dist/cjs/Undici.js +0 -26
- package/dist/cjs/Undici.js.map +0 -1
- package/dist/cjs/index.js +0 -50
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/internal/httpClient.js +0 -196
- package/dist/cjs/internal/httpClient.js.map +0 -1
- package/dist/cjs/internal/httpClientUndici.js +0 -194
- package/dist/cjs/internal/httpClientUndici.js.map +0 -1
- package/dist/cjs/internal/httpIncomingMessage.js +0 -74
- package/dist/cjs/internal/httpIncomingMessage.js.map +0 -1
- package/dist/cjs/internal/httpPlatform.js +0 -49
- package/dist/cjs/internal/httpPlatform.js.map +0 -1
- package/dist/cjs/internal/httpServer.js +0 -352
- package/dist/cjs/internal/httpServer.js.map +0 -1
- package/dist/cjs/internal/worker.js +0 -82
- package/dist/cjs/internal/worker.js.map +0 -1
- package/dist/cjs/internal/workerRunner.js +0 -83
- package/dist/cjs/internal/workerRunner.js.map +0 -1
- package/dist/dts/NodeClusterHttp.d.ts +0 -41
- package/dist/dts/NodeClusterHttp.d.ts.map +0 -1
- package/dist/dts/NodeClusterSocket.d.ts.map +0 -1
- package/dist/dts/NodeCommandExecutor.d.ts +0 -9
- package/dist/dts/NodeCommandExecutor.d.ts.map +0 -1
- package/dist/dts/NodeContext.d.ts +0 -17
- package/dist/dts/NodeContext.d.ts.map +0 -1
- package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts +0 -8
- package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts.map +0 -1
- package/dist/dts/NodeFileSystem.d.ts +0 -8
- package/dist/dts/NodeFileSystem.d.ts.map +0 -1
- package/dist/dts/NodeHttpClient.d.ts +0 -116
- package/dist/dts/NodeHttpClient.d.ts.map +0 -1
- package/dist/dts/NodeHttpPlatform.d.ts +0 -19
- package/dist/dts/NodeHttpPlatform.d.ts.map +0 -1
- package/dist/dts/NodeHttpServer.d.ts +0 -91
- package/dist/dts/NodeHttpServer.d.ts.map +0 -1
- package/dist/dts/NodeHttpServerRequest.d.ts +0 -16
- package/dist/dts/NodeHttpServerRequest.d.ts.map +0 -1
- package/dist/dts/NodeKeyValueStore.d.ts +0 -9
- package/dist/dts/NodeKeyValueStore.d.ts.map +0 -1
- package/dist/dts/NodeMultipart.d.ts +0 -8
- package/dist/dts/NodeMultipart.d.ts.map +0 -1
- package/dist/dts/NodePath.d.ts +0 -21
- package/dist/dts/NodePath.d.ts.map +0 -1
- package/dist/dts/NodeRuntime.d.ts +0 -7
- package/dist/dts/NodeRuntime.d.ts.map +0 -1
- package/dist/dts/NodeSink.d.ts.map +0 -1
- package/dist/dts/NodeSocket.d.ts +0 -22
- package/dist/dts/NodeSocket.d.ts.map +0 -1
- package/dist/dts/NodeSocketServer.d.ts.map +0 -1
- package/dist/dts/NodeStream.d.ts.map +0 -1
- package/dist/dts/NodeTerminal.d.ts.map +0 -1
- package/dist/dts/NodeWorker.d.ts +0 -28
- package/dist/dts/NodeWorker.d.ts.map +0 -1
- package/dist/dts/NodeWorkerRunner.d.ts +0 -17
- package/dist/dts/NodeWorkerRunner.d.ts.map +0 -1
- package/dist/dts/Undici.d.ts.map +0 -1
- package/dist/dts/index.d.ts +0 -85
- package/dist/dts/index.d.ts.map +0 -1
- package/dist/dts/internal/httpClient.d.ts +0 -2
- package/dist/dts/internal/httpClient.d.ts.map +0 -1
- package/dist/dts/internal/httpClientUndici.d.ts +0 -2
- package/dist/dts/internal/httpClientUndici.d.ts.map +0 -1
- package/dist/dts/internal/httpIncomingMessage.d.ts +0 -2
- package/dist/dts/internal/httpIncomingMessage.d.ts.map +0 -1
- package/dist/dts/internal/httpPlatform.d.ts +0 -2
- package/dist/dts/internal/httpPlatform.d.ts.map +0 -1
- package/dist/dts/internal/httpServer.d.ts +0 -2
- package/dist/dts/internal/httpServer.d.ts.map +0 -1
- package/dist/dts/internal/worker.d.ts +0 -2
- package/dist/dts/internal/worker.d.ts.map +0 -1
- package/dist/dts/internal/workerRunner.d.ts +0 -2
- package/dist/dts/internal/workerRunner.d.ts.map +0 -1
- package/dist/esm/NodeClusterHttp.js.map +0 -1
- package/dist/esm/NodeClusterSocket.js.map +0 -1
- package/dist/esm/NodeCommandExecutor.js +0 -10
- package/dist/esm/NodeCommandExecutor.js.map +0 -1
- package/dist/esm/NodeContext.js +0 -16
- package/dist/esm/NodeContext.js.map +0 -1
- package/dist/esm/NodeFileSystem/ParcelWatcher.js +0 -10
- package/dist/esm/NodeFileSystem/ParcelWatcher.js.map +0 -1
- package/dist/esm/NodeFileSystem.js.map +0 -1
- package/dist/esm/NodeHttpClient.js +0 -84
- package/dist/esm/NodeHttpClient.js.map +0 -1
- package/dist/esm/NodeHttpPlatform.js +0 -12
- package/dist/esm/NodeHttpPlatform.js.map +0 -1
- package/dist/esm/NodeHttpServer.js +0 -61
- package/dist/esm/NodeHttpServer.js.map +0 -1
- package/dist/esm/NodeHttpServerRequest.js +0 -12
- package/dist/esm/NodeHttpServerRequest.js.map +0 -1
- package/dist/esm/NodeKeyValueStore.js +0 -10
- package/dist/esm/NodeKeyValueStore.js.map +0 -1
- package/dist/esm/NodeMultipart.js +0 -8
- package/dist/esm/NodeMultipart.js.map +0 -1
- package/dist/esm/NodePath.js.map +0 -1
- package/dist/esm/NodeRuntime.js +0 -10
- package/dist/esm/NodeRuntime.js.map +0 -1
- package/dist/esm/NodeSink.js.map +0 -1
- package/dist/esm/NodeSocket.js.map +0 -1
- package/dist/esm/NodeSocketServer.js.map +0 -1
- package/dist/esm/NodeStream.js.map +0 -1
- package/dist/esm/NodeTerminal.js.map +0 -1
- package/dist/esm/NodeWorker.js +0 -22
- package/dist/esm/NodeWorker.js.map +0 -1
- package/dist/esm/NodeWorkerRunner.js +0 -13
- package/dist/esm/NodeWorkerRunner.js.map +0 -1
- package/dist/esm/Undici.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/internal/httpClient.js +0 -187
- package/dist/esm/internal/httpClient.js.map +0 -1
- package/dist/esm/internal/httpClientUndici.js +0 -186
- package/dist/esm/internal/httpClientUndici.js.map +0 -1
- package/dist/esm/internal/httpIncomingMessage.js +0 -66
- package/dist/esm/internal/httpIncomingMessage.js.map +0 -1
- package/dist/esm/internal/httpPlatform.js.map +0 -1
- package/dist/esm/internal/httpServer.js +0 -337
- package/dist/esm/internal/httpServer.js.map +0 -1
- package/dist/esm/internal/worker.js +0 -73
- package/dist/esm/internal/worker.js.map +0 -1
- package/dist/esm/internal/workerRunner.js +0 -76
- package/dist/esm/internal/workerRunner.js.map +0 -1
- package/dist/esm/package.json +0 -4
- package/index/package.json +0 -6
- package/src/NodeCommandExecutor.ts +0 -13
- package/src/NodeContext.ts +0 -40
- package/src/NodeFileSystem/ParcelWatcher.ts +0 -12
- package/src/NodeKeyValueStore.ts +0 -15
- package/src/internal/httpClient.ts +0 -260
- package/src/internal/httpClientUndici.ts +0 -231
- package/src/internal/httpIncomingMessage.ts +0 -92
- package/src/internal/httpPlatform.ts +0 -46
- package/src/internal/httpServer.ts +0 -517
- package/src/internal/worker.ts +0 -86
- package/src/internal/workerRunner.ts +0 -77
- /package/dist/{esm/NodeFileSystem.js → NodeFileSystem.js} +0 -0
- /package/dist/{esm/NodePath.js → NodePath.js} +0 -0
- /package/dist/{dts/NodeSink.d.ts → NodeSink.d.ts} +0 -0
- /package/dist/{esm/NodeSink.js → NodeSink.js} +0 -0
- /package/dist/{dts/NodeSocketServer.d.ts → NodeSocketServer.d.ts} +0 -0
- /package/dist/{esm/NodeSocketServer.js → NodeSocketServer.js} +0 -0
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import type
|
|
4
|
+
import type { HttpServerRequest } from "effect/unstable/http/HttpServerRequest"
|
|
5
5
|
import type * as Http from "node:http"
|
|
6
|
-
import * as internal from "./internal/httpServer.js"
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
|
-
* @category conversions
|
|
10
8
|
* @since 1.0.0
|
|
9
|
+
* @category Accessors
|
|
11
10
|
*/
|
|
12
|
-
export const toIncomingMessage
|
|
13
|
-
internal.toIncomingMessage
|
|
11
|
+
export const toIncomingMessage = (self: HttpServerRequest): Http.IncomingMessage => self.source as any
|
|
14
12
|
|
|
15
13
|
/**
|
|
16
|
-
* @category conversions
|
|
17
14
|
* @since 1.0.0
|
|
15
|
+
* @category Accessors
|
|
18
16
|
*/
|
|
19
|
-
export const toServerResponse
|
|
20
|
-
|
|
17
|
+
export const toServerResponse = (self: HttpServerRequest): Http.ServerResponse => {
|
|
18
|
+
const res = (self as any).response
|
|
19
|
+
return typeof res === "function" ? res() : res
|
|
20
|
+
}
|
package/src/NodeMultipart.ts
CHANGED
|
@@ -1,8 +1,163 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
+
import * as Effect from "effect/Effect"
|
|
5
|
+
import type * as FileSystem from "effect/FileSystem"
|
|
6
|
+
import * as Inspectable from "effect/Inspectable"
|
|
7
|
+
import type * as Path from "effect/Path"
|
|
8
|
+
import type * as Scope from "effect/Scope"
|
|
9
|
+
import * as Stream from "effect/Stream"
|
|
10
|
+
import * as Multipart from "effect/unstable/http/Multipart"
|
|
11
|
+
import * as MP from "effect/unstable/http/Multipasta/Node"
|
|
12
|
+
import * as NFS from "node:fs"
|
|
13
|
+
import type { IncomingHttpHeaders } from "node:http"
|
|
14
|
+
import type { Readable } from "node:stream"
|
|
15
|
+
import * as NodeStreamP from "node:stream/promises"
|
|
16
|
+
import * as NodeStream from "./NodeStream.ts"
|
|
4
17
|
|
|
5
18
|
/**
|
|
6
19
|
* @since 1.0.0
|
|
20
|
+
* @category constructors
|
|
7
21
|
*/
|
|
8
|
-
export
|
|
22
|
+
export const stream = (
|
|
23
|
+
source: Readable,
|
|
24
|
+
headers: IncomingHttpHeaders
|
|
25
|
+
): Stream.Stream<Multipart.Part, Multipart.MultipartError> =>
|
|
26
|
+
Multipart.makeConfig(headers as any).pipe(
|
|
27
|
+
Effect.map((config) =>
|
|
28
|
+
NodeStream.fromReadable<MP.Part, Multipart.MultipartError>({
|
|
29
|
+
evaluate() {
|
|
30
|
+
const parser = MP.make(config)
|
|
31
|
+
source.pipe(parser)
|
|
32
|
+
return parser as any
|
|
33
|
+
},
|
|
34
|
+
onError: (error) => convertError(error as any)
|
|
35
|
+
})
|
|
36
|
+
),
|
|
37
|
+
Stream.unwrap,
|
|
38
|
+
Stream.map(convertPart)
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
* @category constructors
|
|
44
|
+
*/
|
|
45
|
+
export const persisted = (
|
|
46
|
+
source: Readable,
|
|
47
|
+
headers: IncomingHttpHeaders
|
|
48
|
+
): Effect.Effect<
|
|
49
|
+
Multipart.Persisted,
|
|
50
|
+
Multipart.MultipartError,
|
|
51
|
+
Scope.Scope | FileSystem.FileSystem | Path.Path
|
|
52
|
+
> =>
|
|
53
|
+
Multipart.toPersisted(stream(source, headers), (path, file) =>
|
|
54
|
+
Effect.tryPromise({
|
|
55
|
+
try: (signal) => NodeStreamP.pipeline((file as FileImpl).file, NFS.createWriteStream(path), { signal }),
|
|
56
|
+
catch: (cause) => Multipart.MultipartError.fromReason("InternalError", cause)
|
|
57
|
+
}))
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @since 1.0.0
|
|
61
|
+
*/
|
|
62
|
+
export const fileToReadable = (file: Multipart.File): Readable => (file as FileImpl).file
|
|
63
|
+
|
|
64
|
+
// -----------------------------------------------------------------------------
|
|
65
|
+
// Internal
|
|
66
|
+
// -----------------------------------------------------------------------------
|
|
67
|
+
|
|
68
|
+
const convertPart = (part: MP.Part): Multipart.Part =>
|
|
69
|
+
part._tag === "Field" ? new FieldImpl(part.info, part.value) : new FileImpl(part)
|
|
70
|
+
|
|
71
|
+
abstract class PartBase extends Inspectable.Class {
|
|
72
|
+
readonly [Multipart.TypeId]: typeof Multipart.TypeId
|
|
73
|
+
constructor() {
|
|
74
|
+
super()
|
|
75
|
+
this[Multipart.TypeId] = Multipart.TypeId
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
class FieldImpl extends PartBase implements Multipart.Field {
|
|
80
|
+
readonly _tag = "Field"
|
|
81
|
+
readonly key: string
|
|
82
|
+
readonly contentType: string
|
|
83
|
+
readonly value: string
|
|
84
|
+
|
|
85
|
+
constructor(
|
|
86
|
+
info: MP.PartInfo,
|
|
87
|
+
value: Uint8Array
|
|
88
|
+
) {
|
|
89
|
+
super()
|
|
90
|
+
this.key = info.name
|
|
91
|
+
this.contentType = info.contentType
|
|
92
|
+
this.value = MP.decodeField(info, value)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
toJSON(): unknown {
|
|
96
|
+
return {
|
|
97
|
+
_id: "@effect/platform/Multipart/Part",
|
|
98
|
+
_tag: "Field",
|
|
99
|
+
key: this.key,
|
|
100
|
+
value: this.value,
|
|
101
|
+
contentType: this.contentType
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
class FileImpl extends PartBase implements Multipart.File {
|
|
107
|
+
readonly _tag = "File"
|
|
108
|
+
readonly key: string
|
|
109
|
+
readonly name: string
|
|
110
|
+
readonly contentType: string
|
|
111
|
+
readonly content: Stream.Stream<Uint8Array, Multipart.MultipartError>
|
|
112
|
+
readonly contentEffect: Effect.Effect<Uint8Array, Multipart.MultipartError>
|
|
113
|
+
readonly file: MP.FileStream
|
|
114
|
+
|
|
115
|
+
constructor(file: MP.FileStream) {
|
|
116
|
+
super()
|
|
117
|
+
this.file = file
|
|
118
|
+
this.key = file.info.name
|
|
119
|
+
this.name = file.filename ?? file.info.name
|
|
120
|
+
this.contentType = file.info.contentType
|
|
121
|
+
this.content = NodeStream.fromReadable({
|
|
122
|
+
evaluate: () => file,
|
|
123
|
+
onError: (cause) => Multipart.MultipartError.fromReason("InternalError", cause)
|
|
124
|
+
})
|
|
125
|
+
this.contentEffect = NodeStream.toUint8Array(() => file, {
|
|
126
|
+
onError: (cause) => Multipart.MultipartError.fromReason("InternalError", cause)
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
toJSON(): unknown {
|
|
131
|
+
return {
|
|
132
|
+
_id: "@effect/platform/Multipart/Part",
|
|
133
|
+
_tag: "File",
|
|
134
|
+
key: this.key,
|
|
135
|
+
name: this.name,
|
|
136
|
+
contentType: this.contentType
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function convertError(cause: MP.MultipartError): Multipart.MultipartError {
|
|
142
|
+
switch (cause._tag) {
|
|
143
|
+
case "ReachedLimit": {
|
|
144
|
+
switch (cause.limit) {
|
|
145
|
+
case "MaxParts": {
|
|
146
|
+
return Multipart.MultipartError.fromReason("TooManyParts", cause)
|
|
147
|
+
}
|
|
148
|
+
case "MaxFieldSize": {
|
|
149
|
+
return Multipart.MultipartError.fromReason("FieldTooLarge", cause)
|
|
150
|
+
}
|
|
151
|
+
case "MaxPartSize": {
|
|
152
|
+
return Multipart.MultipartError.fromReason("FileTooLarge", cause)
|
|
153
|
+
}
|
|
154
|
+
case "MaxTotalSize": {
|
|
155
|
+
return Multipart.MultipartError.fromReason("BodyTooLarge", cause)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
default: {
|
|
160
|
+
return Multipart.MultipartError.fromReason("Parse", cause)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
package/src/NodePath.ts
CHANGED
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import * as NodePath from "@effect/platform-node-shared/NodePath"
|
|
6
|
-
import type
|
|
7
|
-
import type {
|
|
5
|
+
import type * as Layer from "effect/Layer"
|
|
6
|
+
import type { Path } from "effect/Path"
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* @since 1.0.0
|
|
11
10
|
* @category layer
|
|
12
11
|
*/
|
|
13
|
-
export const layer: Layer<Path> = NodePath.layer
|
|
12
|
+
export const layer: Layer.Layer<Path> = NodePath.layer
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* @since 1.0.0
|
|
17
16
|
* @category layer
|
|
18
17
|
*/
|
|
19
|
-
export const layerPosix: Layer<Path> = NodePath.layerPosix
|
|
18
|
+
export const layerPosix: Layer.Layer<Path> = NodePath.layerPosix
|
|
20
19
|
|
|
21
20
|
/**
|
|
22
21
|
* @since 1.0.0
|
|
23
22
|
* @category layer
|
|
24
23
|
*/
|
|
25
|
-
export const layerWin32: Layer<Path> = NodePath.layerWin32
|
|
24
|
+
export const layerWin32: Layer.Layer<Path> = NodePath.layerWin32
|
package/src/NodeRedis.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Config from "effect/Config"
|
|
5
|
+
import * as Effect from "effect/Effect"
|
|
6
|
+
import * as Fn from "effect/Function"
|
|
7
|
+
import * as Layer from "effect/Layer"
|
|
8
|
+
import * as Scope from "effect/Scope"
|
|
9
|
+
import * as ServiceMap from "effect/ServiceMap"
|
|
10
|
+
import * as Redis from "effect/unstable/persistence/Redis"
|
|
11
|
+
import * as IoRedis from "ioredis"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
* @category Service
|
|
16
|
+
*/
|
|
17
|
+
export class NodeRedis extends ServiceMap.Service<NodeRedis, {
|
|
18
|
+
readonly client: IoRedis.Redis
|
|
19
|
+
readonly use: <A>(f: (client: IoRedis.Redis) => Promise<A>) => Effect.Effect<A, Redis.RedisError>
|
|
20
|
+
}>()("@effect/platform-node/NodeRedis") {}
|
|
21
|
+
|
|
22
|
+
const make = Effect.fnUntraced(function*(
|
|
23
|
+
options?: IoRedis.RedisOptions
|
|
24
|
+
) {
|
|
25
|
+
const scope = yield* Effect.scope
|
|
26
|
+
yield* Scope.addFinalizer(scope, Effect.promise(() => client.quit()))
|
|
27
|
+
const client = new IoRedis.Redis(options ?? {})
|
|
28
|
+
|
|
29
|
+
const use = <A>(f: (client: IoRedis.Redis) => Promise<A>) =>
|
|
30
|
+
Effect.tryPromise({
|
|
31
|
+
try: () => f(client),
|
|
32
|
+
catch: (cause) => new Redis.RedisError({ cause })
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
const redis = yield* Redis.make({
|
|
36
|
+
send: <A = unknown>(command: string, ...args: ReadonlyArray<string>) =>
|
|
37
|
+
Effect.tryPromise({
|
|
38
|
+
try: () => client.call(command, ...args) as Promise<A>,
|
|
39
|
+
catch: (cause) => new Redis.RedisError({ cause })
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const nodeRedis = Fn.identity<NodeRedis["Service"]>({
|
|
44
|
+
client,
|
|
45
|
+
use
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
return ServiceMap.make(NodeRedis, nodeRedis).pipe(
|
|
49
|
+
ServiceMap.add(Redis.Redis, redis)
|
|
50
|
+
)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @since 1.0.0
|
|
55
|
+
* @category Layers
|
|
56
|
+
*/
|
|
57
|
+
export const layer = (
|
|
58
|
+
options?: IoRedis.RedisOptions | undefined
|
|
59
|
+
): Layer.Layer<Redis.Redis | NodeRedis> => Layer.effectServices(make(options))
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @since 1.0.0
|
|
63
|
+
* @category Layers
|
|
64
|
+
*/
|
|
65
|
+
export const layerConfig: (
|
|
66
|
+
options: Config.Wrap<IoRedis.RedisOptions>
|
|
67
|
+
) => Layer.Layer<Redis.Redis | NodeRedis, Config.ConfigError> = (
|
|
68
|
+
options: Config.Wrap<IoRedis.RedisOptions>
|
|
69
|
+
): Layer.Layer<Redis.Redis | NodeRedis, Config.ConfigError> =>
|
|
70
|
+
Layer.effectServices(
|
|
71
|
+
Config.unwrap(options).asEffect().pipe(
|
|
72
|
+
Effect.flatMap(make)
|
|
73
|
+
)
|
|
74
|
+
)
|
package/src/NodeRuntime.ts
CHANGED
|
@@ -2,10 +2,102 @@
|
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
4
|
import * as NodeRuntime from "@effect/platform-node-shared/NodeRuntime"
|
|
5
|
-
import type {
|
|
5
|
+
import type { Effect } from "effect/Effect"
|
|
6
|
+
import type * as Runtime from "effect/Runtime"
|
|
6
7
|
|
|
7
8
|
/**
|
|
9
|
+
* Helps you run a main effect with built-in error handling, logging, and signal management.
|
|
10
|
+
*
|
|
11
|
+
* **Details**
|
|
12
|
+
*
|
|
13
|
+
* This function launches an Effect as the main entry point, setting exit codes
|
|
14
|
+
* based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
|
|
15
|
+
* logging errors. By default, it logs errors and uses a "pretty" format, but both
|
|
16
|
+
* behaviors can be turned off. You can also provide custom teardown logic to
|
|
17
|
+
* finalize resources or produce different exit codes.
|
|
18
|
+
*
|
|
19
|
+
* **Options**
|
|
20
|
+
*
|
|
21
|
+
* An optional object that can include:
|
|
22
|
+
* - `disableErrorReporting`: Turn off automatic error logging.
|
|
23
|
+
* - `disablePrettyLogger`: Avoid adding the pretty logger.
|
|
24
|
+
* - `teardown`: Provide custom finalization logic.
|
|
25
|
+
*
|
|
26
|
+
* **When to Use**
|
|
27
|
+
*
|
|
28
|
+
* Use this function to run an Effect as your application’s main program, especially
|
|
29
|
+
* when you need structured error handling, log management, interrupt support,
|
|
30
|
+
* or advanced teardown capabilities.
|
|
31
|
+
*
|
|
8
32
|
* @since 1.0.0
|
|
9
|
-
* @category
|
|
33
|
+
* @category Run main
|
|
10
34
|
*/
|
|
11
|
-
export const runMain:
|
|
35
|
+
export const runMain: {
|
|
36
|
+
/**
|
|
37
|
+
* Helps you run a main effect with built-in error handling, logging, and signal management.
|
|
38
|
+
*
|
|
39
|
+
* **Details**
|
|
40
|
+
*
|
|
41
|
+
* This function launches an Effect as the main entry point, setting exit codes
|
|
42
|
+
* based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
|
|
43
|
+
* logging errors. By default, it logs errors and uses a "pretty" format, but both
|
|
44
|
+
* behaviors can be turned off. You can also provide custom teardown logic to
|
|
45
|
+
* finalize resources or produce different exit codes.
|
|
46
|
+
*
|
|
47
|
+
* **Options**
|
|
48
|
+
*
|
|
49
|
+
* An optional object that can include:
|
|
50
|
+
* - `disableErrorReporting`: Turn off automatic error logging.
|
|
51
|
+
* - `disablePrettyLogger`: Avoid adding the pretty logger.
|
|
52
|
+
* - `teardown`: Provide custom finalization logic.
|
|
53
|
+
*
|
|
54
|
+
* **When to Use**
|
|
55
|
+
*
|
|
56
|
+
* Use this function to run an Effect as your application’s main program, especially
|
|
57
|
+
* when you need structured error handling, log management, interrupt support,
|
|
58
|
+
* or advanced teardown capabilities.
|
|
59
|
+
*
|
|
60
|
+
* @since 1.0.0
|
|
61
|
+
* @category Run main
|
|
62
|
+
*/
|
|
63
|
+
(
|
|
64
|
+
options?: {
|
|
65
|
+
readonly disableErrorReporting?: boolean | undefined
|
|
66
|
+
readonly teardown?: Runtime.Teardown | undefined
|
|
67
|
+
}
|
|
68
|
+
): <E, A>(effect: Effect<A, E>) => void
|
|
69
|
+
/**
|
|
70
|
+
* Helps you run a main effect with built-in error handling, logging, and signal management.
|
|
71
|
+
*
|
|
72
|
+
* **Details**
|
|
73
|
+
*
|
|
74
|
+
* This function launches an Effect as the main entry point, setting exit codes
|
|
75
|
+
* based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
|
|
76
|
+
* logging errors. By default, it logs errors and uses a "pretty" format, but both
|
|
77
|
+
* behaviors can be turned off. You can also provide custom teardown logic to
|
|
78
|
+
* finalize resources or produce different exit codes.
|
|
79
|
+
*
|
|
80
|
+
* **Options**
|
|
81
|
+
*
|
|
82
|
+
* An optional object that can include:
|
|
83
|
+
* - `disableErrorReporting`: Turn off automatic error logging.
|
|
84
|
+
* - `disablePrettyLogger`: Avoid adding the pretty logger.
|
|
85
|
+
* - `teardown`: Provide custom finalization logic.
|
|
86
|
+
*
|
|
87
|
+
* **When to Use**
|
|
88
|
+
*
|
|
89
|
+
* Use this function to run an Effect as your application’s main program, especially
|
|
90
|
+
* when you need structured error handling, log management, interrupt support,
|
|
91
|
+
* or advanced teardown capabilities.
|
|
92
|
+
*
|
|
93
|
+
* @since 1.0.0
|
|
94
|
+
* @category Run main
|
|
95
|
+
*/
|
|
96
|
+
<E, A>(
|
|
97
|
+
effect: Effect<A, E>,
|
|
98
|
+
options?: {
|
|
99
|
+
readonly disableErrorReporting?: boolean | undefined
|
|
100
|
+
readonly teardown?: Runtime.Teardown | undefined
|
|
101
|
+
}
|
|
102
|
+
): void
|
|
103
|
+
} = NodeRuntime.runMain
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type { FileSystem } from "effect/FileSystem"
|
|
5
|
+
import * as Layer from "effect/Layer"
|
|
6
|
+
import type { Path } from "effect/Path"
|
|
7
|
+
import type { Stdio } from "effect/Stdio"
|
|
8
|
+
import type { Terminal } from "effect/Terminal"
|
|
9
|
+
import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner"
|
|
10
|
+
import * as NodeChildProcessSpawner from "./NodeChildProcessSpawner.ts"
|
|
11
|
+
import * as NodeFileSystem from "./NodeFileSystem.ts"
|
|
12
|
+
import * as NodePath from "./NodePath.ts"
|
|
13
|
+
import * as NodeStdio from "./NodeStdio.ts"
|
|
14
|
+
import * as NodeTerminal from "./NodeTerminal.ts"
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
* @category models
|
|
19
|
+
*/
|
|
20
|
+
export type NodeServices = ChildProcessSpawner | FileSystem | Path | Stdio | Terminal
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
* @category layer
|
|
25
|
+
*/
|
|
26
|
+
export const layer: Layer.Layer<NodeServices> = Layer.provideMerge(
|
|
27
|
+
NodeChildProcessSpawner.layer,
|
|
28
|
+
Layer.mergeAll(
|
|
29
|
+
NodeFileSystem.layer,
|
|
30
|
+
NodePath.layer,
|
|
31
|
+
NodeStdio.layer,
|
|
32
|
+
NodeTerminal.layer
|
|
33
|
+
)
|
|
34
|
+
)
|
package/src/NodeSocket.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
4
|
+
import { NodeWS as WS } from "@effect/platform-node-shared/NodeSocket"
|
|
5
|
+
import type * as Duration from "effect/Duration"
|
|
6
|
+
import type * as Effect from "effect/Effect"
|
|
7
|
+
import { flow } from "effect/Function"
|
|
5
8
|
import * as Layer from "effect/Layer"
|
|
6
|
-
import * as
|
|
9
|
+
import * as Socket from "effect/unstable/socket/Socket"
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
12
|
* @since 1.0.0
|
|
@@ -14,23 +17,28 @@ export * from "@effect/platform-node-shared/NodeSocket"
|
|
|
14
17
|
* @since 1.0.0
|
|
15
18
|
* @category layers
|
|
16
19
|
*/
|
|
17
|
-
export const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
export const layerWebSocketConstructor: Layer.Layer<
|
|
21
|
+
Socket.WebSocketConstructor
|
|
22
|
+
> = Layer.sync(Socket.WebSocketConstructor)(() => {
|
|
23
|
+
if ("WebSocket" in globalThis) {
|
|
24
|
+
return (url, protocols) => new globalThis.WebSocket(url, protocols)
|
|
25
|
+
}
|
|
26
|
+
return (url, protocols) => new WS.WebSocket(url, protocols) as unknown as globalThis.WebSocket
|
|
27
|
+
})
|
|
23
28
|
|
|
24
29
|
/**
|
|
25
30
|
* @since 1.0.0
|
|
26
31
|
* @category layers
|
|
27
32
|
*/
|
|
28
|
-
export const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
export const layerWebSocket: (
|
|
34
|
+
url: string | Effect.Effect<string>,
|
|
35
|
+
options?: {
|
|
36
|
+
readonly closeCodeIsError?: ((code: number) => boolean) | undefined
|
|
37
|
+
readonly openTimeout?: Duration.DurationInput | undefined
|
|
38
|
+
readonly protocols?: string | Array<string> | undefined
|
|
39
|
+
} | undefined
|
|
40
|
+
) => Layer.Layer<Socket.Socket, never, never> = flow(
|
|
41
|
+
Socket.makeWebSocket,
|
|
42
|
+
Layer.effect(Socket.Socket),
|
|
43
|
+
Layer.provide(layerWebSocketConstructor)
|
|
36
44
|
)
|
package/src/NodeStdio.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as NodeStdio from "@effect/platform-node-shared/NodeStdio"
|
|
5
|
+
import type * as Layer from "effect/Layer"
|
|
6
|
+
import type { Stdio } from "effect/Stdio"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @since 1.0.0
|
|
10
|
+
* @category layer
|
|
11
|
+
*/
|
|
12
|
+
export const layer: Layer.Layer<Stdio> = NodeStdio.layer
|
package/src/NodeStream.ts
CHANGED
package/src/NodeTerminal.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
4
|
import * as NodeTerminal from "@effect/platform-node-shared/NodeTerminal"
|
|
5
|
-
import type { Terminal, UserInput } from "@effect/platform/Terminal"
|
|
6
5
|
import type { Effect } from "effect/Effect"
|
|
7
6
|
import type { Layer } from "effect/Layer"
|
|
8
7
|
import type { Scope } from "effect/Scope"
|
|
8
|
+
import type { Terminal, UserInput } from "effect/Terminal"
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* @since 1.0.0
|
|
@@ -15,6 +15,6 @@ export const make: (shouldQuit?: (input: UserInput) => boolean) => Effect<Termin
|
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* @since 1.0.0
|
|
18
|
-
* @category
|
|
18
|
+
* @category layers
|
|
19
19
|
*/
|
|
20
20
|
export const layer: Layer<Terminal> = NodeTerminal.layer
|
package/src/NodeWorker.ts
CHANGED
|
@@ -1,36 +1,105 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import * as Deferred from "effect/Deferred"
|
|
5
|
+
import * as Effect from "effect/Effect"
|
|
6
|
+
import * as Exit from "effect/Exit"
|
|
7
|
+
import * as Layer from "effect/Layer"
|
|
8
|
+
import * as Scope from "effect/Scope"
|
|
9
|
+
import * as Worker from "effect/unstable/workers/Worker"
|
|
10
|
+
import { WorkerError, WorkerReceiveError } from "effect/unstable/workers/WorkerError"
|
|
6
11
|
import type * as ChildProcess from "node:child_process"
|
|
7
12
|
import type * as WorkerThreads from "node:worker_threads"
|
|
8
|
-
import * as internal from "./internal/worker.js"
|
|
9
13
|
|
|
10
14
|
/**
|
|
11
15
|
* @since 1.0.0
|
|
12
16
|
* @category layers
|
|
13
17
|
*/
|
|
14
|
-
export const
|
|
18
|
+
export const layerPlatform: Layer.Layer<Worker.WorkerPlatform> = Layer.succeed(Worker.WorkerPlatform)(
|
|
19
|
+
Worker.makePlatform<WorkerThreads.Worker | ChildProcess.ChildProcess>()({
|
|
20
|
+
setup({ scope, worker }) {
|
|
21
|
+
const exitDeferred = Deferred.makeUnsafe<void, WorkerError>()
|
|
22
|
+
const thing = "postMessage" in worker ?
|
|
23
|
+
{
|
|
24
|
+
postMessage(msg: any, t?: any) {
|
|
25
|
+
worker.postMessage(msg, t)
|
|
26
|
+
},
|
|
27
|
+
kill: () => worker.terminate(),
|
|
28
|
+
worker
|
|
29
|
+
} :
|
|
30
|
+
{
|
|
31
|
+
postMessage(msg: any, _?: any) {
|
|
32
|
+
worker.send(msg)
|
|
33
|
+
},
|
|
34
|
+
kill: () => worker.kill("SIGKILL"),
|
|
35
|
+
worker
|
|
36
|
+
}
|
|
37
|
+
worker.on("exit", () => {
|
|
38
|
+
Deferred.doneUnsafe(exitDeferred, Exit.void)
|
|
39
|
+
})
|
|
40
|
+
return Effect.as(
|
|
41
|
+
Scope.addFinalizer(
|
|
42
|
+
scope,
|
|
43
|
+
Effect.suspend(() => {
|
|
44
|
+
thing.postMessage([1])
|
|
45
|
+
return Deferred.await(exitDeferred)
|
|
46
|
+
}).pipe(
|
|
47
|
+
Effect.timeout(5000),
|
|
48
|
+
Effect.catchCause(() => Effect.sync(() => thing.kill()))
|
|
49
|
+
)
|
|
50
|
+
),
|
|
51
|
+
thing
|
|
52
|
+
)
|
|
53
|
+
},
|
|
54
|
+
listen({ deferred, emit, port }) {
|
|
55
|
+
port.worker.on("message", (message) => {
|
|
56
|
+
emit(message)
|
|
57
|
+
})
|
|
58
|
+
port.worker.on("messageerror", (cause) => {
|
|
59
|
+
Deferred.doneUnsafe(
|
|
60
|
+
deferred,
|
|
61
|
+
new WorkerError({
|
|
62
|
+
reason: new WorkerReceiveError({
|
|
63
|
+
message: "An messageerror event was emitted",
|
|
64
|
+
cause
|
|
65
|
+
})
|
|
66
|
+
}).asEffect()
|
|
67
|
+
)
|
|
68
|
+
})
|
|
69
|
+
port.worker.on("error", (cause) => {
|
|
70
|
+
Deferred.doneUnsafe(
|
|
71
|
+
deferred,
|
|
72
|
+
new WorkerError({
|
|
73
|
+
reason: new WorkerReceiveError({
|
|
74
|
+
message: "An error event was emitted",
|
|
75
|
+
cause
|
|
76
|
+
})
|
|
77
|
+
}).asEffect()
|
|
78
|
+
)
|
|
79
|
+
})
|
|
80
|
+
port.worker.on("exit", (code) => {
|
|
81
|
+
Deferred.doneUnsafe(
|
|
82
|
+
deferred,
|
|
83
|
+
new WorkerError({
|
|
84
|
+
reason: new WorkerReceiveError({
|
|
85
|
+
message: "The worker has exited with code: " + code
|
|
86
|
+
})
|
|
87
|
+
}).asEffect()
|
|
88
|
+
)
|
|
89
|
+
})
|
|
90
|
+
return Effect.void
|
|
91
|
+
}
|
|
92
|
+
})
|
|
93
|
+
)
|
|
15
94
|
|
|
16
95
|
/**
|
|
17
96
|
* @since 1.0.0
|
|
18
97
|
* @category layers
|
|
19
98
|
*/
|
|
20
|
-
export const
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @since 1.0.0
|
|
24
|
-
* @category layers
|
|
25
|
-
*/
|
|
26
|
-
export const layer: (
|
|
27
|
-
spawn: (id: number) => WorkerThreads.Worker | ChildProcess.ChildProcess
|
|
28
|
-
) => Layer.Layer<Worker.WorkerManager | Worker.Spawner> = internal.layer
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* @since 1.0.0
|
|
32
|
-
* @category layers
|
|
33
|
-
*/
|
|
34
|
-
export const layerPlatform: (
|
|
99
|
+
export const layer = (
|
|
35
100
|
spawn: (id: number) => WorkerThreads.Worker | ChildProcess.ChildProcess
|
|
36
|
-
)
|
|
101
|
+
): Layer.Layer<Worker.WorkerPlatform | Worker.Spawner> =>
|
|
102
|
+
Layer.merge(
|
|
103
|
+
Worker.layerSpawner(spawn),
|
|
104
|
+
layerPlatform
|
|
105
|
+
)
|