@effect/platform-node 0.23.1 → 0.23.2
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/CommandExecutor/dist/effect-platform-node-CommandExecutor.cjs.dev.js +1 -1
- package/CommandExecutor/dist/effect-platform-node-CommandExecutor.cjs.prod.js +1 -1
- package/CommandExecutor/dist/effect-platform-node-CommandExecutor.esm.js +1 -1
- package/Http/NodeClient/dist/effect-platform-node-Http-NodeClient.cjs.dev.js +2 -2
- package/Http/NodeClient/dist/effect-platform-node-Http-NodeClient.cjs.prod.js +2 -2
- package/Http/NodeClient/dist/effect-platform-node-Http-NodeClient.esm.js +2 -2
- package/Http/Server/dist/effect-platform-node-Http-Server.cjs.dev.js +2 -2
- package/Http/Server/dist/effect-platform-node-Http-Server.cjs.prod.js +2 -2
- package/Http/Server/dist/effect-platform-node-Http-Server.esm.js +2 -2
- package/HttpClient/dist/effect-platform-node-HttpClient.cjs.dev.js +2 -2
- package/HttpClient/dist/effect-platform-node-HttpClient.cjs.prod.js +2 -2
- package/HttpClient/dist/effect-platform-node-HttpClient.esm.js +2 -2
- package/HttpServer/dist/effect-platform-node-HttpServer.cjs.dev.js +2 -2
- package/HttpServer/dist/effect-platform-node-HttpServer.cjs.prod.js +2 -2
- package/HttpServer/dist/effect-platform-node-HttpServer.esm.js +2 -2
- package/NodeContext/dist/effect-platform-node-NodeContext.cjs.dev.js +1 -1
- package/NodeContext/dist/effect-platform-node-NodeContext.cjs.prod.js +1 -1
- package/NodeContext/dist/effect-platform-node-NodeContext.esm.js +1 -1
- package/Sink/dist/effect-platform-node-Sink.cjs.dev.js +1 -1
- package/Sink/dist/effect-platform-node-Sink.cjs.prod.js +1 -1
- package/Sink/dist/effect-platform-node-Sink.esm.js +1 -1
- package/Worker/dist/effect-platform-node-Worker.cjs.d.mts +2 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.d.mts.map +1 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.d.ts +2 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.d.ts.map +1 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.dev.js +129 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.js +7 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.mjs +1 -0
- package/Worker/dist/effect-platform-node-Worker.cjs.prod.js +129 -0
- package/Worker/dist/effect-platform-node-Worker.esm.js +93 -0
- package/Worker/package.json +4 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.d.mts +2 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.d.mts.map +1 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.d.ts +2 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.d.ts.map +1 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.dev.js +96 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.js +7 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.mjs +1 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.prod.js +96 -0
- package/WorkerRunner/dist/effect-platform-node-WorkerRunner.esm.js +63 -0
- package/WorkerRunner/package.json +4 -0
- package/dist/declarations/src/Worker.d.ts +37 -0
- package/dist/declarations/src/Worker.d.ts.map +1 -0
- package/dist/declarations/src/WorkerRunner.d.ts +20 -0
- package/dist/declarations/src/WorkerRunner.d.ts.map +1 -0
- package/dist/declarations/src/index.d.ts +12 -0
- package/dist/declarations/src/index.d.ts.map +1 -1
- package/dist/effect-platform-node.cjs.dev.js +6 -0
- package/dist/effect-platform-node.cjs.mjs +3 -1
- package/dist/effect-platform-node.cjs.prod.js +6 -0
- package/dist/effect-platform-node.esm.js +4 -0
- package/dist/{sink-00a7f5a4.cjs.dev.js → sink-1665024d.cjs.dev.js} +7 -12
- package/dist/{sink-8f5eb47c.cjs.prod.js → sink-2e5c0562.cjs.prod.js} +7 -12
- package/dist/{sink-f4bcb905.esm.js → sink-6f7ec01c.esm.js} +7 -12
- package/package.json +19 -5
- package/src/Worker.ts +46 -0
- package/src/WorkerRunner.ts +25 -0
- package/src/index.ts +14 -0
- package/src/internal/sink.ts +13 -16
- package/src/internal/worker.ts +63 -0
- package/src/internal/workerRunner.ts +53 -0
- /package/dist/{NodeClient-9eb46e81.cjs.dev.js → NodeClient-537e7d57.cjs.dev.js} +0 -0
- /package/dist/{NodeClient-25aa9b30.esm.js → NodeClient-7d78f700.esm.js} +0 -0
- /package/dist/{NodeClient-4a5a22a9.cjs.prod.js → NodeClient-881f6bd6.cjs.prod.js} +0 -0
- /package/dist/{Server-6257bf68.cjs.dev.js → Server-173b9a31.cjs.dev.js} +0 -0
- /package/dist/{Server-94a686e6.cjs.prod.js → Server-f3212345.cjs.prod.js} +0 -0
- /package/dist/{Server-a565a430.esm.js → Server-fce717d2.esm.js} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/platform-node",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.2",
|
|
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",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"sideEffects": false,
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@effect/schema": "^0.43.
|
|
36
|
+
"@effect/schema": "^0.43.2",
|
|
37
37
|
"@types/busboy": "^1.5.1",
|
|
38
38
|
"@types/mime": "^3.0.2",
|
|
39
39
|
"@types/tar": "^6.1.6",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"busboy": "^1.6.0",
|
|
48
48
|
"mime": "^3.0.0",
|
|
49
|
-
"@effect/platform": "^0.22.
|
|
49
|
+
"@effect/platform": "^0.22.1"
|
|
50
50
|
},
|
|
51
51
|
"files": [
|
|
52
52
|
"src",
|
|
@@ -64,7 +64,9 @@
|
|
|
64
64
|
"Path",
|
|
65
65
|
"Runtime",
|
|
66
66
|
"Sink",
|
|
67
|
-
"Stream"
|
|
67
|
+
"Stream",
|
|
68
|
+
"Worker",
|
|
69
|
+
"WorkerRunner"
|
|
68
70
|
],
|
|
69
71
|
"exports": {
|
|
70
72
|
".": {
|
|
@@ -181,10 +183,22 @@
|
|
|
181
183
|
"module": "./Stream/dist/effect-platform-node-Stream.esm.js",
|
|
182
184
|
"import": "./Stream/dist/effect-platform-node-Stream.cjs.mjs",
|
|
183
185
|
"default": "./Stream/dist/effect-platform-node-Stream.cjs.js"
|
|
186
|
+
},
|
|
187
|
+
"./Worker": {
|
|
188
|
+
"types": "./dist/declarations/src/Worker.d.ts",
|
|
189
|
+
"module": "./Worker/dist/effect-platform-node-Worker.esm.js",
|
|
190
|
+
"import": "./Worker/dist/effect-platform-node-Worker.cjs.mjs",
|
|
191
|
+
"default": "./Worker/dist/effect-platform-node-Worker.cjs.js"
|
|
192
|
+
},
|
|
193
|
+
"./WorkerRunner": {
|
|
194
|
+
"types": "./dist/declarations/src/WorkerRunner.d.ts",
|
|
195
|
+
"module": "./WorkerRunner/dist/effect-platform-node-WorkerRunner.esm.js",
|
|
196
|
+
"import": "./WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.mjs",
|
|
197
|
+
"default": "./WorkerRunner/dist/effect-platform-node-WorkerRunner.cjs.js"
|
|
184
198
|
}
|
|
185
199
|
},
|
|
186
200
|
"scripts": {
|
|
187
|
-
"example": "ts-node
|
|
201
|
+
"example": "node -r ts-node/register",
|
|
188
202
|
"lint": "eslint src/**/*.ts test/**/*.ts",
|
|
189
203
|
"tc": "tsc --noEmit",
|
|
190
204
|
"test": "vitest",
|
package/src/Worker.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*
|
|
4
|
+
* Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
|
|
5
|
+
*/
|
|
6
|
+
import type * as Worker from "@effect/platform/Worker"
|
|
7
|
+
import type { Effect } from "effect"
|
|
8
|
+
import type * as Context from "effect/Context"
|
|
9
|
+
import type * as Layer from "effect/Layer"
|
|
10
|
+
import type * as Scope from "effect/Scope"
|
|
11
|
+
import type * as WorkerThreads from "node:worker_threads"
|
|
12
|
+
import * as internal from "./internal/worker"
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @since 1.0.0
|
|
16
|
+
*/
|
|
17
|
+
export * from "@effect/platform/Worker"
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
* @category constructors
|
|
22
|
+
*/
|
|
23
|
+
export const makePool: <I, E, O>(
|
|
24
|
+
options: Worker.WorkerPool.Options<I, WorkerThreads.Worker>
|
|
25
|
+
) => Effect.Effect<Worker.WorkerManager | Scope.Scope, never, Worker.WorkerPool<I, E, O>> = internal.makePool
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @since 1.0.0
|
|
29
|
+
* @category constructors
|
|
30
|
+
*/
|
|
31
|
+
export const makePoolLayer: <Tag, I, E, O>(
|
|
32
|
+
tag: Context.Tag<Tag, Worker.WorkerPool<I, E, O>>,
|
|
33
|
+
options: Worker.WorkerPool.Options<I, WorkerThreads.Worker>
|
|
34
|
+
) => Layer.Layer<never, never, Tag> = internal.makePoolLayer
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @since 1.0.0
|
|
38
|
+
* @category layers
|
|
39
|
+
*/
|
|
40
|
+
export const layerManager: Layer.Layer<never, never, Worker.WorkerManager> = internal.layerManager
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @since 1.0.0
|
|
44
|
+
* @category layers
|
|
45
|
+
*/
|
|
46
|
+
export const layerWorker: Layer.Layer<never, never, Worker.PlatformWorker> = internal.layerWorker
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*
|
|
4
|
+
* Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
|
|
5
|
+
*/
|
|
6
|
+
import type { WorkerError } from "@effect/platform/WorkerError"
|
|
7
|
+
import type * as Runner from "@effect/platform/WorkerRunner"
|
|
8
|
+
import type { Effect } from "effect"
|
|
9
|
+
import type * as Scope from "effect/Scope"
|
|
10
|
+
import type * as Stream from "effect/Stream"
|
|
11
|
+
import * as internal from "./internal/workerRunner"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export * from "@effect/platform/WorkerRunner"
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
* @category constructors
|
|
21
|
+
*/
|
|
22
|
+
export const make: <I, R, E, O>(
|
|
23
|
+
process: (request: I) => Stream.Stream<R, E, O>,
|
|
24
|
+
options?: Runner.Runner.Options<O> | undefined
|
|
25
|
+
) => Effect.Effect<R | Scope.Scope, WorkerError, void> = internal.make
|
package/src/index.ts
CHANGED
|
@@ -64,3 +64,17 @@ export * as Sink from "@effect/platform-node/Sink"
|
|
|
64
64
|
* @since 1.0.0
|
|
65
65
|
*/
|
|
66
66
|
export * as Stream from "@effect/platform-node/Stream"
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
*
|
|
71
|
+
* Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/platform/platform/Worker.ts.html).
|
|
72
|
+
*/
|
|
73
|
+
export * as Worker from "@effect/platform-node/Worker"
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
*
|
|
78
|
+
* Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/platform/platform/WorkerRunner.ts.html).
|
|
79
|
+
*/
|
|
80
|
+
export * as WorkerRunner from "@effect/platform-node/WorkerRunner"
|
package/src/internal/sink.ts
CHANGED
|
@@ -23,29 +23,27 @@ const writeChannel = <IE, OE, A>(
|
|
|
23
23
|
): Channel.Channel<never, IE, Chunk.Chunk<A>, unknown, IE | OE, Chunk.Chunk<never>, void> =>
|
|
24
24
|
Channel.flatMap(
|
|
25
25
|
Deferred.make<IE | OE, void>(),
|
|
26
|
-
(deferred) =>
|
|
27
|
-
|
|
28
|
-
writable,
|
|
29
|
-
(_) => Deferred.failCause(deferred, _),
|
|
30
|
-
options,
|
|
31
|
-
Deferred.complete(deferred, Effect.unit)
|
|
32
|
-
)
|
|
33
|
-
return Channel.embedInput(
|
|
26
|
+
(deferred) =>
|
|
27
|
+
Channel.embedInput(
|
|
34
28
|
writableOutput(writable, deferred, onError),
|
|
35
|
-
|
|
29
|
+
writeInput<IE, A>(
|
|
30
|
+
writable,
|
|
31
|
+
(_) => Deferred.failCause(deferred, _),
|
|
32
|
+
options,
|
|
33
|
+
Deferred.complete(deferred, Effect.unit)
|
|
34
|
+
)
|
|
36
35
|
)
|
|
37
|
-
}
|
|
38
36
|
)
|
|
39
37
|
|
|
40
38
|
const writableOutput = <IE, E>(
|
|
41
39
|
writable: Writable | NodeJS.WritableStream,
|
|
42
40
|
deferred: Deferred.Deferred<IE | E, void>,
|
|
43
41
|
onError: (error: unknown) => E
|
|
44
|
-
) =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
) =>
|
|
43
|
+
Effect.suspend(() => {
|
|
44
|
+
function handleError(err: unknown) {
|
|
45
|
+
Deferred.unsafeDone(deferred, Effect.fail(onError(err)))
|
|
46
|
+
}
|
|
49
47
|
writable.on("error", handleError)
|
|
50
48
|
return Effect.ensuring(
|
|
51
49
|
Deferred.await(deferred),
|
|
@@ -54,4 +52,3 @@ const writableOutput = <IE, E>(
|
|
|
54
52
|
})
|
|
55
53
|
)
|
|
56
54
|
})
|
|
57
|
-
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as Worker from "@effect/platform/Worker"
|
|
2
|
+
import { WorkerError } from "@effect/platform/WorkerError"
|
|
3
|
+
import * as Effect from "effect/Effect"
|
|
4
|
+
import * as Fiber from "effect/Fiber"
|
|
5
|
+
import * as Layer from "effect/Layer"
|
|
6
|
+
import * as Queue from "effect/Queue"
|
|
7
|
+
import type * as WorkerThreads from "node:worker_threads"
|
|
8
|
+
|
|
9
|
+
const platformWorkerImpl = Worker.PlatformWorker.of({
|
|
10
|
+
[Worker.PlatformWorkerTypeId]: Worker.PlatformWorkerTypeId,
|
|
11
|
+
spawn<I, O>(worker_: unknown) {
|
|
12
|
+
return Effect.gen(function*(_) {
|
|
13
|
+
const worker = worker_ as WorkerThreads.Worker
|
|
14
|
+
yield* _(Effect.addFinalizer(() =>
|
|
15
|
+
Effect.suspend(() => {
|
|
16
|
+
worker.postMessage([1])
|
|
17
|
+
return Effect.async<never, never, void>((resume) => {
|
|
18
|
+
worker.once("exit", () => {
|
|
19
|
+
resume(Effect.unit)
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
})
|
|
23
|
+
))
|
|
24
|
+
const fiberId = yield* _(Effect.fiberId)
|
|
25
|
+
const queue = yield* _(Queue.unbounded<Worker.BackingWorker.Message<O>>())
|
|
26
|
+
yield* _(Effect.addFinalizer(() => Queue.shutdown(queue)))
|
|
27
|
+
const fiber = yield* _(
|
|
28
|
+
Effect.async<never, WorkerError, never>((resume) => {
|
|
29
|
+
worker.on("message", (message: Worker.BackingWorker.Message<O>) => {
|
|
30
|
+
queue.unsafeOffer(message)
|
|
31
|
+
})
|
|
32
|
+
worker.on("messageerror", (error) => {
|
|
33
|
+
resume(Effect.fail(WorkerError("decode", error)))
|
|
34
|
+
})
|
|
35
|
+
worker.on("error", (error) => {
|
|
36
|
+
resume(Effect.fail(WorkerError("unknown", error)))
|
|
37
|
+
})
|
|
38
|
+
worker.on("exit", (code) => {
|
|
39
|
+
resume(Effect.fail(WorkerError("unknown", new Error(`exited with code ${code}`))))
|
|
40
|
+
})
|
|
41
|
+
}),
|
|
42
|
+
Effect.forkDaemon
|
|
43
|
+
)
|
|
44
|
+
yield* _(Effect.addFinalizer(() => fiber.interruptAsFork(fiberId)))
|
|
45
|
+
const join = Fiber.join(fiber)
|
|
46
|
+
const send = (message: I, transfers?: ReadonlyArray<unknown>) =>
|
|
47
|
+
Effect.sync(() => worker.postMessage([0, message], transfers as any))
|
|
48
|
+
return { join, queue, send }
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
/** @internal */
|
|
54
|
+
export const layerWorker = Layer.succeed(Worker.PlatformWorker, platformWorkerImpl)
|
|
55
|
+
|
|
56
|
+
/** @internal */
|
|
57
|
+
export const layerManager = Layer.provide(layerWorker, Worker.layerManager)
|
|
58
|
+
|
|
59
|
+
/** @internal */
|
|
60
|
+
export const makePool = Worker.makePool<WorkerThreads.Worker>()
|
|
61
|
+
|
|
62
|
+
/** @internal */
|
|
63
|
+
export const makePoolLayer = Worker.makePoolLayer<WorkerThreads.Worker>(layerManager)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { WorkerError } from "@effect/platform/WorkerError"
|
|
2
|
+
import * as Runner from "@effect/platform/WorkerRunner"
|
|
3
|
+
import * as Effect from "effect/Effect"
|
|
4
|
+
import * as Layer from "effect/Layer"
|
|
5
|
+
import * as Queue from "effect/Queue"
|
|
6
|
+
import type * as Scope from "effect/Scope"
|
|
7
|
+
import type * as Stream from "effect/Stream"
|
|
8
|
+
import * as WorkerThreads from "node:worker_threads"
|
|
9
|
+
|
|
10
|
+
const platformRunnerImpl = Runner.PlatformRunner.of({
|
|
11
|
+
[Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId,
|
|
12
|
+
start<I, O>() {
|
|
13
|
+
return Effect.gen(function*(_) {
|
|
14
|
+
if (!WorkerThreads.parentPort) {
|
|
15
|
+
return yield* _(Effect.fail(WorkerError("spawn", "not in worker")))
|
|
16
|
+
}
|
|
17
|
+
const port = WorkerThreads.parentPort
|
|
18
|
+
const queue = yield* _(Queue.unbounded<I>())
|
|
19
|
+
const fiber = yield* _(
|
|
20
|
+
Effect.async<never, WorkerError, never>((resume) => {
|
|
21
|
+
port.on("message", (message: Runner.BackingRunner.Message<I>) => {
|
|
22
|
+
if (message[0] === 0) {
|
|
23
|
+
queue.unsafeOffer(message[1])
|
|
24
|
+
} else {
|
|
25
|
+
Effect.runFork(Queue.shutdown(queue))
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
port.on("messageerror", (error) => {
|
|
29
|
+
resume(Effect.fail(WorkerError("decode", error)))
|
|
30
|
+
})
|
|
31
|
+
port.on("error", (error) => {
|
|
32
|
+
resume(Effect.fail(WorkerError("unknown", error)))
|
|
33
|
+
})
|
|
34
|
+
}),
|
|
35
|
+
Effect.forkScoped
|
|
36
|
+
)
|
|
37
|
+
const send = (message: O, transfers?: ReadonlyArray<unknown>) =>
|
|
38
|
+
Effect.sync(() => port.postMessage([1, message], transfers as any))
|
|
39
|
+
// ready
|
|
40
|
+
port.postMessage([0])
|
|
41
|
+
return { fiber, queue, send }
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/** @internal */
|
|
47
|
+
export const layer = Layer.succeed(Runner.PlatformRunner, platformRunnerImpl)
|
|
48
|
+
|
|
49
|
+
/** @internal */
|
|
50
|
+
export const make = <I, R, E, O>(
|
|
51
|
+
process: (request: I) => Stream.Stream<R, E, O>,
|
|
52
|
+
options?: Runner.Runner.Options<O>
|
|
53
|
+
): Effect.Effect<Scope.Scope | R, WorkerError, void> => Effect.provide(Runner.make(process, options), layer)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|