@effect/platform-node-shared 0.57.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/README.md +3 -3
- package/dist/NodeChildProcessSpawner.d.ts +37 -0
- package/dist/NodeChildProcessSpawner.d.ts.map +1 -0
- package/dist/NodeChildProcessSpawner.js +567 -0
- package/dist/NodeChildProcessSpawner.js.map +1 -0
- package/dist/{dts/NodeClusterSocket.d.ts → NodeClusterSocket.d.ts} +4 -7
- package/dist/NodeClusterSocket.d.ts.map +1 -0
- package/dist/{esm/NodeClusterSocket.js → NodeClusterSocket.js} +9 -10
- package/dist/NodeClusterSocket.js.map +1 -0
- package/dist/NodeFileSystem.d.ts +8 -0
- package/dist/NodeFileSystem.d.ts.map +1 -0
- package/dist/{esm/internal/fileSystem.js → NodeFileSystem.js} +125 -96
- package/dist/NodeFileSystem.js.map +1 -0
- package/dist/NodePath.d.ts +18 -0
- package/dist/NodePath.d.ts.map +1 -0
- package/dist/NodePath.js +56 -0
- package/dist/NodePath.js.map +1 -0
- package/dist/NodeRuntime.d.ts +28 -0
- package/dist/NodeRuntime.d.ts.map +1 -0
- package/dist/{esm/internal/runtime.js → NodeRuntime.js} +8 -8
- package/dist/NodeRuntime.js.map +1 -0
- package/dist/NodeSink.d.ts +40 -0
- package/dist/NodeSink.d.ts.map +1 -0
- package/dist/NodeSink.js +50 -0
- package/dist/NodeSink.js.map +1 -0
- package/dist/{dts/NodeSocket.d.ts → NodeSocket.d.ts} +10 -10
- package/dist/NodeSocket.d.ts.map +1 -0
- package/dist/{esm/NodeSocket.js → NodeSocket.js} +51 -39
- package/dist/NodeSocket.js.map +1 -0
- package/dist/{dts/NodeSocketServer.d.ts → NodeSocketServer.d.ts} +8 -10
- package/dist/NodeSocketServer.d.ts.map +1 -0
- package/dist/NodeSocketServer.js +192 -0
- package/dist/NodeSocketServer.js.map +1 -0
- package/dist/NodeStdio.d.ts +11 -0
- package/dist/NodeStdio.d.ts.map +1 -0
- package/dist/NodeStdio.js +43 -0
- package/dist/NodeStdio.js.map +1 -0
- package/dist/NodeStream.d.ts +127 -0
- package/dist/NodeStream.d.ts.map +1 -0
- package/dist/NodeStream.js +249 -0
- package/dist/NodeStream.js.map +1 -0
- package/dist/NodeTerminal.d.ts +15 -0
- package/dist/NodeTerminal.d.ts.map +1 -0
- package/dist/{esm/internal/terminal.js → NodeTerminal.js} +28 -21
- package/dist/NodeTerminal.js.map +1 -0
- package/dist/internal/utils.d.ts +2 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/{esm/internal/error.js → internal/utils.js} +4 -5
- package/dist/internal/utils.js.map +1 -0
- package/package.json +53 -124
- package/src/NodeChildProcessSpawner.ts +713 -0
- package/src/NodeClusterSocket.ts +12 -13
- package/src/NodeFileSystem.ts +632 -5
- package/src/NodePath.ts +48 -9
- package/src/NodeRuntime.ts +53 -4
- package/src/NodeSink.ts +65 -62
- package/src/NodeSocket.ts +65 -49
- package/src/NodeSocketServer.ts +108 -88
- package/src/NodeStdio.ts +49 -0
- package/src/NodeStream.ts +324 -83
- package/src/NodeTerminal.ts +100 -9
- package/src/internal/{error.ts → utils.ts} +6 -7
- package/NodeClusterSocket/package.json +0 -6
- package/NodeCommandExecutor/package.json +0 -6
- package/NodeFileSystem/ParcelWatcher/package.json +0 -6
- package/NodeFileSystem/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/dist/cjs/NodeClusterSocket.js +0 -50
- package/dist/cjs/NodeClusterSocket.js.map +0 -1
- package/dist/cjs/NodeCommandExecutor.js +0 -14
- package/dist/cjs/NodeCommandExecutor.js.map +0 -1
- package/dist/cjs/NodeFileSystem/ParcelWatcher.js +0 -20
- 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/NodeKeyValueStore.js +0 -18
- package/dist/cjs/NodeKeyValueStore.js.map +0 -1
- package/dist/cjs/NodeMultipart.js +0 -24
- 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 -14
- package/dist/cjs/NodeRuntime.js.map +0 -1
- package/dist/cjs/NodeSink.js +0 -50
- package/dist/cjs/NodeSink.js.map +0 -1
- package/dist/cjs/NodeSocket.js +0 -153
- package/dist/cjs/NodeSocket.js.map +0 -1
- package/dist/cjs/NodeSocketServer.js +0 -178
- package/dist/cjs/NodeSocketServer.js.map +0 -1
- package/dist/cjs/NodeStream.js +0 -76
- package/dist/cjs/NodeStream.js.map +0 -1
- package/dist/cjs/NodeTerminal.js +0 -19
- package/dist/cjs/NodeTerminal.js.map +0 -1
- package/dist/cjs/internal/commandExecutor.js +0 -153
- package/dist/cjs/internal/commandExecutor.js.map +0 -1
- package/dist/cjs/internal/error.js +0 -45
- package/dist/cjs/internal/error.js.map +0 -1
- package/dist/cjs/internal/fileSystem/parcelWatcher.js +0 -68
- package/dist/cjs/internal/fileSystem/parcelWatcher.js.map +0 -1
- package/dist/cjs/internal/fileSystem.js +0 -400
- package/dist/cjs/internal/fileSystem.js.map +0 -1
- package/dist/cjs/internal/multipart.js +0 -147
- package/dist/cjs/internal/multipart.js.map +0 -1
- package/dist/cjs/internal/path.js +0 -53
- package/dist/cjs/internal/path.js.map +0 -1
- package/dist/cjs/internal/runtime.js +0 -37
- package/dist/cjs/internal/runtime.js.map +0 -1
- package/dist/cjs/internal/sink.js +0 -28
- package/dist/cjs/internal/sink.js.map +0 -1
- package/dist/cjs/internal/stream.js +0 -233
- package/dist/cjs/internal/stream.js.map +0 -1
- package/dist/cjs/internal/terminal.js +0 -86
- package/dist/cjs/internal/terminal.js.map +0 -1
- package/dist/dts/NodeClusterSocket.d.ts.map +0 -1
- package/dist/dts/NodeCommandExecutor.d.ts +0 -12
- package/dist/dts/NodeCommandExecutor.d.ts.map +0 -1
- package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts +0 -13
- package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts.map +0 -1
- package/dist/dts/NodeFileSystem.d.ts +0 -11
- package/dist/dts/NodeFileSystem.d.ts.map +0 -1
- package/dist/dts/NodeKeyValueStore.d.ts +0 -12
- package/dist/dts/NodeKeyValueStore.d.ts.map +0 -1
- package/dist/dts/NodeMultipart.d.ts +0 -27
- 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 -10
- package/dist/dts/NodeRuntime.d.ts.map +0 -1
- package/dist/dts/NodeSink.d.ts +0 -36
- package/dist/dts/NodeSink.d.ts.map +0 -1
- package/dist/dts/NodeSocket.d.ts.map +0 -1
- package/dist/dts/NodeSocketServer.d.ts.map +0 -1
- package/dist/dts/NodeStream.d.ts +0 -119
- package/dist/dts/NodeStream.d.ts.map +0 -1
- package/dist/dts/NodeTerminal.d.ts +0 -18
- package/dist/dts/NodeTerminal.d.ts.map +0 -1
- package/dist/dts/internal/commandExecutor.d.ts +0 -2
- package/dist/dts/internal/commandExecutor.d.ts.map +0 -1
- package/dist/dts/internal/error.d.ts +0 -2
- package/dist/dts/internal/error.d.ts.map +0 -1
- package/dist/dts/internal/fileSystem/parcelWatcher.d.ts +0 -4
- package/dist/dts/internal/fileSystem/parcelWatcher.d.ts.map +0 -1
- package/dist/dts/internal/fileSystem.d.ts +0 -2
- package/dist/dts/internal/fileSystem.d.ts.map +0 -1
- package/dist/dts/internal/multipart.d.ts +0 -2
- package/dist/dts/internal/multipart.d.ts.map +0 -1
- package/dist/dts/internal/path.d.ts +0 -2
- package/dist/dts/internal/path.d.ts.map +0 -1
- package/dist/dts/internal/runtime.d.ts +0 -2
- package/dist/dts/internal/runtime.d.ts.map +0 -1
- package/dist/dts/internal/sink.d.ts +0 -2
- package/dist/dts/internal/sink.d.ts.map +0 -1
- package/dist/dts/internal/stream.d.ts +0 -2
- package/dist/dts/internal/stream.d.ts.map +0 -1
- package/dist/dts/internal/terminal.d.ts +0 -2
- package/dist/dts/internal/terminal.d.ts.map +0 -1
- package/dist/esm/NodeClusterSocket.js.map +0 -1
- package/dist/esm/NodeCommandExecutor.js +0 -7
- package/dist/esm/NodeCommandExecutor.js.map +0 -1
- package/dist/esm/NodeFileSystem/ParcelWatcher.js +0 -12
- package/dist/esm/NodeFileSystem/ParcelWatcher.js.map +0 -1
- package/dist/esm/NodeFileSystem.js +0 -10
- package/dist/esm/NodeFileSystem.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 -17
- package/dist/esm/NodeMultipart.js.map +0 -1
- package/dist/esm/NodePath.js +0 -20
- package/dist/esm/NodePath.js.map +0 -1
- package/dist/esm/NodeRuntime.js +0 -7
- package/dist/esm/NodeRuntime.js.map +0 -1
- package/dist/esm/NodeSink.js +0 -43
- package/dist/esm/NodeSink.js.map +0 -1
- package/dist/esm/NodeSocket.js.map +0 -1
- package/dist/esm/NodeSocketServer.js +0 -167
- package/dist/esm/NodeSocketServer.js.map +0 -1
- package/dist/esm/NodeStream.js +0 -69
- package/dist/esm/NodeStream.js.map +0 -1
- package/dist/esm/NodeTerminal.js +0 -12
- package/dist/esm/NodeTerminal.js.map +0 -1
- package/dist/esm/internal/commandExecutor.js +0 -146
- package/dist/esm/internal/commandExecutor.js.map +0 -1
- package/dist/esm/internal/error.js.map +0 -1
- package/dist/esm/internal/fileSystem/parcelWatcher.js +0 -61
- package/dist/esm/internal/fileSystem/parcelWatcher.js.map +0 -1
- package/dist/esm/internal/fileSystem.js.map +0 -1
- package/dist/esm/internal/multipart.js +0 -137
- package/dist/esm/internal/multipart.js.map +0 -1
- package/dist/esm/internal/path.js +0 -46
- package/dist/esm/internal/path.js.map +0 -1
- package/dist/esm/internal/runtime.js.map +0 -1
- package/dist/esm/internal/sink.js +0 -19
- package/dist/esm/internal/sink.js.map +0 -1
- package/dist/esm/internal/stream.js +0 -217
- package/dist/esm/internal/stream.js.map +0 -1
- package/dist/esm/internal/terminal.js.map +0 -1
- package/dist/esm/package.json +0 -4
- package/src/NodeCommandExecutor.ts +0 -13
- package/src/NodeFileSystem/ParcelWatcher.ts +0 -15
- package/src/NodeKeyValueStore.ts +0 -20
- package/src/NodeMultipart.ts +0 -40
- package/src/internal/commandExecutor.ts +0 -251
- package/src/internal/fileSystem/parcelWatcher.ts +0 -64
- package/src/internal/fileSystem.ts +0 -648
- package/src/internal/multipart.ts +0 -141
- package/src/internal/path.ts +0 -63
- package/src/internal/runtime.ts +0 -34
- package/src/internal/sink.ts +0 -57
- package/src/internal/stream.ts +0 -375
- package/src/internal/terminal.ts +0 -100
package/src/NodeSocketServer.ts
CHANGED
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
-
import * as Socket from "@effect/platform/Socket"
|
|
5
|
-
import * as SocketServer from "@effect/platform/SocketServer"
|
|
6
4
|
import type { Cause } from "effect/Cause"
|
|
7
|
-
import * as Context from "effect/Context"
|
|
8
5
|
import * as Deferred from "effect/Deferred"
|
|
9
6
|
import * as Effect from "effect/Effect"
|
|
10
7
|
import * as Exit from "effect/Exit"
|
|
11
|
-
import * as
|
|
12
|
-
import * as FiberSet from "effect/FiberSet"
|
|
8
|
+
import * as Fiber from "effect/Fiber"
|
|
13
9
|
import { pipe } from "effect/Function"
|
|
10
|
+
import * as Function from "effect/Function"
|
|
14
11
|
import * as Layer from "effect/Layer"
|
|
12
|
+
import * as References from "effect/References"
|
|
15
13
|
import * as Scope from "effect/Scope"
|
|
14
|
+
import * as ServiceMap from "effect/ServiceMap"
|
|
15
|
+
import * as Socket from "effect/unstable/socket/Socket"
|
|
16
|
+
import * as SocketServer from "effect/unstable/socket/SocketServer"
|
|
16
17
|
import type * as Http from "node:http"
|
|
17
18
|
import * as Net from "node:net"
|
|
18
|
-
import * as
|
|
19
|
-
import
|
|
19
|
+
import * as NodeSocket from "./NodeSocket.ts"
|
|
20
|
+
import { NodeWS } from "./NodeSocket.ts"
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* @since 1.0.0
|
|
23
24
|
* @category tags
|
|
24
25
|
*/
|
|
25
|
-
export class IncomingMessage extends
|
|
26
|
+
export class IncomingMessage extends ServiceMap.Service<
|
|
26
27
|
IncomingMessage,
|
|
27
28
|
Http.IncomingMessage
|
|
28
|
-
>() {}
|
|
29
|
+
>()("@effect/platform-node-shared/NodeSocketServer/IncomingMessage") {}
|
|
29
30
|
|
|
30
31
|
/**
|
|
31
32
|
* @since 1.0.0
|
|
@@ -34,40 +35,44 @@ export class IncomingMessage extends Context.Tag("@effect/platform-node-shared/N
|
|
|
34
35
|
export const make = Effect.fnUntraced(function*(
|
|
35
36
|
options: Net.ServerOpts & Net.ListenOptions
|
|
36
37
|
) {
|
|
37
|
-
const errorDeferred =
|
|
38
|
-
const pending
|
|
39
|
-
|
|
40
|
-
pending.
|
|
38
|
+
const errorDeferred = Deferred.makeUnsafe<never, Error>()
|
|
39
|
+
const pending = new Set<Net.Socket>()
|
|
40
|
+
function defaultOnConnection(conn: Net.Socket) {
|
|
41
|
+
pending.add(conn)
|
|
42
|
+
const remove = () => {
|
|
43
|
+
pending.delete(conn)
|
|
44
|
+
}
|
|
45
|
+
conn.on("close", remove)
|
|
46
|
+
conn.on("error", remove)
|
|
41
47
|
}
|
|
42
48
|
let onConnection = defaultOnConnection
|
|
43
|
-
|
|
49
|
+
// oxlint-disable-next-line prefer-const
|
|
50
|
+
let server: Net.Server | undefined
|
|
44
51
|
yield* Effect.addFinalizer(() =>
|
|
45
|
-
Effect.
|
|
46
|
-
server
|
|
52
|
+
Effect.callback<void>((resume) => {
|
|
53
|
+
server?.close(() => resume(Effect.void))
|
|
47
54
|
})
|
|
48
55
|
)
|
|
49
|
-
|
|
50
|
-
server.on("error", (
|
|
56
|
+
server = Net.createServer(options, (conn) => onConnection(conn))
|
|
57
|
+
server.on("error", (err) => Deferred.doneUnsafe(errorDeferred, Exit.fail(err)))
|
|
51
58
|
|
|
52
|
-
yield* Effect.
|
|
53
|
-
server.listen(options, () =>
|
|
54
|
-
resume(Effect.void)
|
|
55
|
-
})
|
|
59
|
+
yield* Effect.callback<void, SocketServer.SocketServerError>((resume) => {
|
|
60
|
+
server.listen(options, () => resume(Effect.void))
|
|
56
61
|
}).pipe(
|
|
57
|
-
Effect.raceFirst(Effect.mapError(Deferred.await(errorDeferred), (
|
|
62
|
+
Effect.raceFirst(Effect.mapError(Deferred.await(errorDeferred), (err) =>
|
|
58
63
|
new SocketServer.SocketServerError({
|
|
59
|
-
reason:
|
|
60
|
-
|
|
64
|
+
reason: new SocketServer.SocketServerOpenError({
|
|
65
|
+
cause: err
|
|
66
|
+
})
|
|
61
67
|
})))
|
|
62
68
|
)
|
|
63
69
|
|
|
64
70
|
const run = Effect.fnUntraced(function*<R, E, _>(handler: (socket: Socket.Socket) => Effect.Effect<_, E, R>) {
|
|
65
71
|
const scope = yield* Scope.make()
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
function onConnection_(conn: Net.Socket) {
|
|
72
|
+
const services = ServiceMap.omit(Scope.Scope)(yield* Effect.services<R>()) as ServiceMap.ServiceMap<R>
|
|
73
|
+
const trackFiber = Fiber.runIn(scope)
|
|
74
|
+
const prevOnConnection = onConnection
|
|
75
|
+
onConnection = function(conn: Net.Socket) {
|
|
71
76
|
let error: Error | undefined
|
|
72
77
|
conn.on("error", (err) => {
|
|
73
78
|
error = err
|
|
@@ -77,12 +82,18 @@ export const make = Effect.fnUntraced(function*(
|
|
|
77
82
|
Effect.acquireRelease(
|
|
78
83
|
Effect.suspend((): Effect.Effect<Net.Socket, Socket.SocketError> => {
|
|
79
84
|
if (error) {
|
|
80
|
-
return Effect.fail(
|
|
85
|
+
return Effect.fail(
|
|
86
|
+
new Socket.SocketError({
|
|
87
|
+
reason: new Socket.SocketOpenError({
|
|
88
|
+
kind: "Unknown",
|
|
89
|
+
cause: error
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
)
|
|
81
93
|
} else if (conn.closed) {
|
|
82
94
|
return Effect.fail(
|
|
83
|
-
new Socket.
|
|
84
|
-
reason:
|
|
85
|
-
code: 1000
|
|
95
|
+
new Socket.SocketError({
|
|
96
|
+
reason: new Socket.SocketCloseError({ code: 1000 })
|
|
86
97
|
})
|
|
87
98
|
)
|
|
88
99
|
}
|
|
@@ -97,27 +108,23 @@ export const make = Effect.fnUntraced(function*(
|
|
|
97
108
|
)
|
|
98
109
|
),
|
|
99
110
|
Effect.flatMap(handler),
|
|
100
|
-
Effect.
|
|
101
|
-
Effect.
|
|
102
|
-
|
|
111
|
+
Effect.catchCause(reportUnhandledError),
|
|
112
|
+
Effect.runForkWith(ServiceMap.add(services, NodeSocket.NetSocket, conn)),
|
|
113
|
+
trackFiber
|
|
103
114
|
)
|
|
104
115
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
116
|
+
pending.forEach((conn) => {
|
|
117
|
+
conn.removeAllListeners("error")
|
|
118
|
+
conn.removeAllListeners("close")
|
|
119
|
+
onConnection(conn)
|
|
120
|
+
})
|
|
121
|
+
pending.clear()
|
|
122
|
+
return yield* Effect.callback<never>((_resume) => {
|
|
110
123
|
return Effect.suspend(() => {
|
|
111
|
-
onConnection =
|
|
124
|
+
onConnection = prevOnConnection
|
|
112
125
|
return Scope.close(scope, Exit.void)
|
|
113
126
|
})
|
|
114
|
-
})
|
|
115
|
-
Effect.raceFirst(Effect.mapError(Deferred.await(errorDeferred), (cause) =>
|
|
116
|
-
new SocketServer.SocketServerError({
|
|
117
|
-
reason: "Unknown",
|
|
118
|
-
cause
|
|
119
|
-
})))
|
|
120
|
-
)
|
|
127
|
+
})
|
|
121
128
|
})
|
|
122
129
|
|
|
123
130
|
const address = server.address()!
|
|
@@ -140,41 +147,51 @@ export const make = Effect.fnUntraced(function*(
|
|
|
140
147
|
* @since 1.0.0
|
|
141
148
|
* @category layers
|
|
142
149
|
*/
|
|
143
|
-
export const layer
|
|
150
|
+
export const layer: (
|
|
144
151
|
options: Net.ServerOpts & Net.ListenOptions
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
)
|
|
152
|
+
) => Layer.Layer<
|
|
153
|
+
SocketServer.SocketServer,
|
|
154
|
+
SocketServer.SocketServerError
|
|
155
|
+
> = Function.flow(make, Layer.effect(SocketServer.SocketServer))
|
|
150
156
|
|
|
151
157
|
/**
|
|
152
158
|
* @since 1.0.0
|
|
153
159
|
* @category constructors
|
|
154
160
|
*/
|
|
155
161
|
export const makeWebSocket: (
|
|
156
|
-
options:
|
|
162
|
+
options: NodeWS.ServerOptions<typeof NodeWS.WebSocket, typeof Http.IncomingMessage>
|
|
157
163
|
) => Effect.Effect<
|
|
158
|
-
SocketServer.SocketServer["
|
|
164
|
+
SocketServer.SocketServer["Service"],
|
|
159
165
|
SocketServer.SocketServerError,
|
|
160
166
|
Scope.Scope
|
|
161
167
|
> = Effect.fnUntraced(function*(
|
|
162
|
-
options:
|
|
168
|
+
options: NodeWS.ServerOptions
|
|
163
169
|
) {
|
|
164
170
|
const server = yield* Effect.acquireRelease(
|
|
165
|
-
Effect.sync(() => new
|
|
171
|
+
Effect.sync(() => new NodeWS.WebSocketServer(options)),
|
|
166
172
|
(server) =>
|
|
167
|
-
Effect.
|
|
173
|
+
Effect.callback<void>((resume) => {
|
|
168
174
|
server.close(() => resume(Effect.void))
|
|
169
175
|
})
|
|
170
176
|
)
|
|
177
|
+
const pendingConnections = new Set<readonly [globalThis.WebSocket, Http.IncomingMessage]>()
|
|
178
|
+
function defaultHandler(conn: globalThis.WebSocket, req: Http.IncomingMessage) {
|
|
179
|
+
const entry = [conn, req] as const
|
|
180
|
+
pendingConnections.add(entry)
|
|
181
|
+
conn.addEventListener("close", () => {
|
|
182
|
+
pendingConnections.delete(entry)
|
|
183
|
+
})
|
|
184
|
+
}
|
|
185
|
+
let onConnection = defaultHandler
|
|
186
|
+
server.on("connection", (conn, req) => onConnection(conn as any, req))
|
|
171
187
|
|
|
172
|
-
yield* Effect.
|
|
188
|
+
yield* Effect.callback<void, SocketServer.SocketServerError>((resume) => {
|
|
173
189
|
server.once("error", (error) => {
|
|
174
190
|
resume(Effect.fail(
|
|
175
191
|
new SocketServer.SocketServerError({
|
|
176
|
-
reason:
|
|
177
|
-
|
|
192
|
+
reason: new SocketServer.SocketServerOpenError({
|
|
193
|
+
cause: error
|
|
194
|
+
})
|
|
178
195
|
})
|
|
179
196
|
))
|
|
180
197
|
})
|
|
@@ -185,15 +202,17 @@ export const makeWebSocket: (
|
|
|
185
202
|
|
|
186
203
|
const run = Effect.fnUntraced(function*<R, E, _>(handler: (socket: Socket.Socket) => Effect.Effect<_, E, R>) {
|
|
187
204
|
const scope = yield* Scope.make()
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
205
|
+
const services = ServiceMap.omit(Scope.Scope)(yield* Effect.services<R>()) as ServiceMap.ServiceMap<R>
|
|
206
|
+
const trackFiber = Fiber.runIn(scope)
|
|
207
|
+
const prevOnConnection = onConnection
|
|
208
|
+
onConnection = function(conn: globalThis.WebSocket, req: Http.IncomingMessage) {
|
|
209
|
+
const map = new Map(services.mapUnsafe)
|
|
210
|
+
map.set(IncomingMessage.key, req)
|
|
211
|
+
map.set(Socket.WebSocket.key, conn as any)
|
|
193
212
|
pipe(
|
|
194
213
|
Socket.fromWebSocket(
|
|
195
214
|
Effect.acquireRelease(
|
|
196
|
-
Effect.succeed(conn
|
|
215
|
+
Effect.succeed(conn),
|
|
197
216
|
(conn) =>
|
|
198
217
|
Effect.sync(() => {
|
|
199
218
|
conn.close()
|
|
@@ -201,16 +220,18 @@ export const makeWebSocket: (
|
|
|
201
220
|
)
|
|
202
221
|
),
|
|
203
222
|
Effect.flatMap(handler),
|
|
204
|
-
Effect.
|
|
205
|
-
Effect.
|
|
206
|
-
|
|
207
|
-
run
|
|
223
|
+
Effect.catchCause(reportUnhandledError),
|
|
224
|
+
Effect.runForkWith(ServiceMap.makeUnsafe(map)),
|
|
225
|
+
trackFiber
|
|
208
226
|
)
|
|
209
227
|
}
|
|
210
|
-
|
|
211
|
-
|
|
228
|
+
for (const [conn, req] of pendingConnections) {
|
|
229
|
+
onConnection(conn, req)
|
|
230
|
+
}
|
|
231
|
+
pendingConnections.clear()
|
|
232
|
+
return yield* Effect.callback<never>((_resume) => {
|
|
212
233
|
return Effect.sync(() => {
|
|
213
|
-
|
|
234
|
+
onConnection = prevOnConnection
|
|
214
235
|
})
|
|
215
236
|
}).pipe(
|
|
216
237
|
Effect.ensuring(Scope.close(scope, Exit.void))
|
|
@@ -237,19 +258,18 @@ export const makeWebSocket: (
|
|
|
237
258
|
* @since 1.0.0
|
|
238
259
|
* @category layers
|
|
239
260
|
*/
|
|
240
|
-
export const layerWebSocket
|
|
241
|
-
options:
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
)
|
|
261
|
+
export const layerWebSocket: (
|
|
262
|
+
options: NodeSocket.NodeWS.ServerOptions<typeof NodeSocket.NodeWS.WebSocket, typeof Http.IncomingMessage>
|
|
263
|
+
) => Layer.Layer<
|
|
264
|
+
SocketServer.SocketServer,
|
|
265
|
+
SocketServer.SocketServerError
|
|
266
|
+
> = Function.flow(makeWebSocket, Layer.effect(SocketServer.SocketServer))
|
|
247
267
|
|
|
248
268
|
const reportUnhandledError = <E>(cause: Cause<E>) =>
|
|
249
|
-
Effect.
|
|
250
|
-
const unhandledLogLevel = fiber.
|
|
251
|
-
if (unhandledLogLevel
|
|
252
|
-
return Effect.logWithLevel(unhandledLogLevel
|
|
269
|
+
Effect.withFiber<void>((fiber) => {
|
|
270
|
+
const unhandledLogLevel = fiber.getRef(References.UnhandledLogLevel)
|
|
271
|
+
if (unhandledLogLevel) {
|
|
272
|
+
return Effect.logWithLevel(unhandledLogLevel)(cause, "Unhandled error in SocketServer")
|
|
253
273
|
}
|
|
254
274
|
return Effect.void
|
|
255
275
|
})
|
package/src/NodeStdio.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Layer from "effect/Layer"
|
|
5
|
+
import { systemError } from "effect/PlatformError"
|
|
6
|
+
import * as Stdio from "effect/Stdio"
|
|
7
|
+
import { fromWritable } from "./NodeSink.ts"
|
|
8
|
+
import { fromReadable } from "./NodeStream.ts"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @category Layers
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
export const layer: Layer.Layer<Stdio.Stdio> = Layer.succeed(
|
|
15
|
+
Stdio.Stdio,
|
|
16
|
+
Stdio.make({
|
|
17
|
+
stdout: fromWritable({
|
|
18
|
+
evaluate: () => process.stdout,
|
|
19
|
+
onError: (cause) =>
|
|
20
|
+
systemError({
|
|
21
|
+
module: "Stdio",
|
|
22
|
+
method: "stdout",
|
|
23
|
+
kind: "Unknown",
|
|
24
|
+
cause
|
|
25
|
+
})
|
|
26
|
+
}),
|
|
27
|
+
stderr: fromWritable({
|
|
28
|
+
evaluate: () => process.stderr,
|
|
29
|
+
onError: (cause) =>
|
|
30
|
+
systemError({
|
|
31
|
+
module: "Stdio",
|
|
32
|
+
method: "stderr",
|
|
33
|
+
kind: "Unknown",
|
|
34
|
+
cause
|
|
35
|
+
})
|
|
36
|
+
}),
|
|
37
|
+
stdin: fromReadable({
|
|
38
|
+
evaluate: () => process.stdin,
|
|
39
|
+
onError: (cause) =>
|
|
40
|
+
systemError({
|
|
41
|
+
module: "Stdio",
|
|
42
|
+
method: "stdin",
|
|
43
|
+
kind: "Unknown",
|
|
44
|
+
cause
|
|
45
|
+
}),
|
|
46
|
+
closeOnDone: false
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
)
|