@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.
Files changed (218) hide show
  1. package/README.md +3 -3
  2. package/dist/NodeChildProcessSpawner.d.ts +37 -0
  3. package/dist/NodeChildProcessSpawner.d.ts.map +1 -0
  4. package/dist/NodeChildProcessSpawner.js +567 -0
  5. package/dist/NodeChildProcessSpawner.js.map +1 -0
  6. package/dist/{dts/NodeClusterSocket.d.ts → NodeClusterSocket.d.ts} +4 -7
  7. package/dist/NodeClusterSocket.d.ts.map +1 -0
  8. package/dist/{esm/NodeClusterSocket.js → NodeClusterSocket.js} +9 -10
  9. package/dist/NodeClusterSocket.js.map +1 -0
  10. package/dist/NodeFileSystem.d.ts +8 -0
  11. package/dist/NodeFileSystem.d.ts.map +1 -0
  12. package/dist/{esm/internal/fileSystem.js → NodeFileSystem.js} +125 -96
  13. package/dist/NodeFileSystem.js.map +1 -0
  14. package/dist/NodePath.d.ts +18 -0
  15. package/dist/NodePath.d.ts.map +1 -0
  16. package/dist/NodePath.js +56 -0
  17. package/dist/NodePath.js.map +1 -0
  18. package/dist/NodeRuntime.d.ts +28 -0
  19. package/dist/NodeRuntime.d.ts.map +1 -0
  20. package/dist/{esm/internal/runtime.js → NodeRuntime.js} +8 -8
  21. package/dist/NodeRuntime.js.map +1 -0
  22. package/dist/NodeSink.d.ts +40 -0
  23. package/dist/NodeSink.d.ts.map +1 -0
  24. package/dist/NodeSink.js +50 -0
  25. package/dist/NodeSink.js.map +1 -0
  26. package/dist/{dts/NodeSocket.d.ts → NodeSocket.d.ts} +10 -10
  27. package/dist/NodeSocket.d.ts.map +1 -0
  28. package/dist/{esm/NodeSocket.js → NodeSocket.js} +51 -39
  29. package/dist/NodeSocket.js.map +1 -0
  30. package/dist/{dts/NodeSocketServer.d.ts → NodeSocketServer.d.ts} +8 -10
  31. package/dist/NodeSocketServer.d.ts.map +1 -0
  32. package/dist/NodeSocketServer.js +192 -0
  33. package/dist/NodeSocketServer.js.map +1 -0
  34. package/dist/NodeStdio.d.ts +11 -0
  35. package/dist/NodeStdio.d.ts.map +1 -0
  36. package/dist/NodeStdio.js +43 -0
  37. package/dist/NodeStdio.js.map +1 -0
  38. package/dist/NodeStream.d.ts +127 -0
  39. package/dist/NodeStream.d.ts.map +1 -0
  40. package/dist/NodeStream.js +249 -0
  41. package/dist/NodeStream.js.map +1 -0
  42. package/dist/NodeTerminal.d.ts +15 -0
  43. package/dist/NodeTerminal.d.ts.map +1 -0
  44. package/dist/{esm/internal/terminal.js → NodeTerminal.js} +28 -21
  45. package/dist/NodeTerminal.js.map +1 -0
  46. package/dist/internal/utils.d.ts +2 -0
  47. package/dist/internal/utils.d.ts.map +1 -0
  48. package/dist/{esm/internal/error.js → internal/utils.js} +4 -5
  49. package/dist/internal/utils.js.map +1 -0
  50. package/package.json +53 -124
  51. package/src/NodeChildProcessSpawner.ts +713 -0
  52. package/src/NodeClusterSocket.ts +12 -13
  53. package/src/NodeFileSystem.ts +632 -5
  54. package/src/NodePath.ts +48 -9
  55. package/src/NodeRuntime.ts +53 -4
  56. package/src/NodeSink.ts +65 -62
  57. package/src/NodeSocket.ts +65 -49
  58. package/src/NodeSocketServer.ts +108 -88
  59. package/src/NodeStdio.ts +49 -0
  60. package/src/NodeStream.ts +324 -83
  61. package/src/NodeTerminal.ts +100 -9
  62. package/src/internal/{error.ts → utils.ts} +6 -7
  63. package/NodeClusterSocket/package.json +0 -6
  64. package/NodeCommandExecutor/package.json +0 -6
  65. package/NodeFileSystem/ParcelWatcher/package.json +0 -6
  66. package/NodeFileSystem/package.json +0 -6
  67. package/NodeKeyValueStore/package.json +0 -6
  68. package/NodeMultipart/package.json +0 -6
  69. package/NodePath/package.json +0 -6
  70. package/NodeRuntime/package.json +0 -6
  71. package/NodeSink/package.json +0 -6
  72. package/NodeSocket/package.json +0 -6
  73. package/NodeSocketServer/package.json +0 -6
  74. package/NodeStream/package.json +0 -6
  75. package/NodeTerminal/package.json +0 -6
  76. package/dist/cjs/NodeClusterSocket.js +0 -50
  77. package/dist/cjs/NodeClusterSocket.js.map +0 -1
  78. package/dist/cjs/NodeCommandExecutor.js +0 -14
  79. package/dist/cjs/NodeCommandExecutor.js.map +0 -1
  80. package/dist/cjs/NodeFileSystem/ParcelWatcher.js +0 -20
  81. package/dist/cjs/NodeFileSystem/ParcelWatcher.js.map +0 -1
  82. package/dist/cjs/NodeFileSystem.js +0 -18
  83. package/dist/cjs/NodeFileSystem.js.map +0 -1
  84. package/dist/cjs/NodeKeyValueStore.js +0 -18
  85. package/dist/cjs/NodeKeyValueStore.js.map +0 -1
  86. package/dist/cjs/NodeMultipart.js +0 -24
  87. package/dist/cjs/NodeMultipart.js.map +0 -1
  88. package/dist/cjs/NodePath.js +0 -28
  89. package/dist/cjs/NodePath.js.map +0 -1
  90. package/dist/cjs/NodeRuntime.js +0 -14
  91. package/dist/cjs/NodeRuntime.js.map +0 -1
  92. package/dist/cjs/NodeSink.js +0 -50
  93. package/dist/cjs/NodeSink.js.map +0 -1
  94. package/dist/cjs/NodeSocket.js +0 -153
  95. package/dist/cjs/NodeSocket.js.map +0 -1
  96. package/dist/cjs/NodeSocketServer.js +0 -178
  97. package/dist/cjs/NodeSocketServer.js.map +0 -1
  98. package/dist/cjs/NodeStream.js +0 -76
  99. package/dist/cjs/NodeStream.js.map +0 -1
  100. package/dist/cjs/NodeTerminal.js +0 -19
  101. package/dist/cjs/NodeTerminal.js.map +0 -1
  102. package/dist/cjs/internal/commandExecutor.js +0 -153
  103. package/dist/cjs/internal/commandExecutor.js.map +0 -1
  104. package/dist/cjs/internal/error.js +0 -45
  105. package/dist/cjs/internal/error.js.map +0 -1
  106. package/dist/cjs/internal/fileSystem/parcelWatcher.js +0 -68
  107. package/dist/cjs/internal/fileSystem/parcelWatcher.js.map +0 -1
  108. package/dist/cjs/internal/fileSystem.js +0 -400
  109. package/dist/cjs/internal/fileSystem.js.map +0 -1
  110. package/dist/cjs/internal/multipart.js +0 -147
  111. package/dist/cjs/internal/multipart.js.map +0 -1
  112. package/dist/cjs/internal/path.js +0 -53
  113. package/dist/cjs/internal/path.js.map +0 -1
  114. package/dist/cjs/internal/runtime.js +0 -37
  115. package/dist/cjs/internal/runtime.js.map +0 -1
  116. package/dist/cjs/internal/sink.js +0 -28
  117. package/dist/cjs/internal/sink.js.map +0 -1
  118. package/dist/cjs/internal/stream.js +0 -233
  119. package/dist/cjs/internal/stream.js.map +0 -1
  120. package/dist/cjs/internal/terminal.js +0 -86
  121. package/dist/cjs/internal/terminal.js.map +0 -1
  122. package/dist/dts/NodeClusterSocket.d.ts.map +0 -1
  123. package/dist/dts/NodeCommandExecutor.d.ts +0 -12
  124. package/dist/dts/NodeCommandExecutor.d.ts.map +0 -1
  125. package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts +0 -13
  126. package/dist/dts/NodeFileSystem/ParcelWatcher.d.ts.map +0 -1
  127. package/dist/dts/NodeFileSystem.d.ts +0 -11
  128. package/dist/dts/NodeFileSystem.d.ts.map +0 -1
  129. package/dist/dts/NodeKeyValueStore.d.ts +0 -12
  130. package/dist/dts/NodeKeyValueStore.d.ts.map +0 -1
  131. package/dist/dts/NodeMultipart.d.ts +0 -27
  132. package/dist/dts/NodeMultipart.d.ts.map +0 -1
  133. package/dist/dts/NodePath.d.ts +0 -21
  134. package/dist/dts/NodePath.d.ts.map +0 -1
  135. package/dist/dts/NodeRuntime.d.ts +0 -10
  136. package/dist/dts/NodeRuntime.d.ts.map +0 -1
  137. package/dist/dts/NodeSink.d.ts +0 -36
  138. package/dist/dts/NodeSink.d.ts.map +0 -1
  139. package/dist/dts/NodeSocket.d.ts.map +0 -1
  140. package/dist/dts/NodeSocketServer.d.ts.map +0 -1
  141. package/dist/dts/NodeStream.d.ts +0 -119
  142. package/dist/dts/NodeStream.d.ts.map +0 -1
  143. package/dist/dts/NodeTerminal.d.ts +0 -18
  144. package/dist/dts/NodeTerminal.d.ts.map +0 -1
  145. package/dist/dts/internal/commandExecutor.d.ts +0 -2
  146. package/dist/dts/internal/commandExecutor.d.ts.map +0 -1
  147. package/dist/dts/internal/error.d.ts +0 -2
  148. package/dist/dts/internal/error.d.ts.map +0 -1
  149. package/dist/dts/internal/fileSystem/parcelWatcher.d.ts +0 -4
  150. package/dist/dts/internal/fileSystem/parcelWatcher.d.ts.map +0 -1
  151. package/dist/dts/internal/fileSystem.d.ts +0 -2
  152. package/dist/dts/internal/fileSystem.d.ts.map +0 -1
  153. package/dist/dts/internal/multipart.d.ts +0 -2
  154. package/dist/dts/internal/multipart.d.ts.map +0 -1
  155. package/dist/dts/internal/path.d.ts +0 -2
  156. package/dist/dts/internal/path.d.ts.map +0 -1
  157. package/dist/dts/internal/runtime.d.ts +0 -2
  158. package/dist/dts/internal/runtime.d.ts.map +0 -1
  159. package/dist/dts/internal/sink.d.ts +0 -2
  160. package/dist/dts/internal/sink.d.ts.map +0 -1
  161. package/dist/dts/internal/stream.d.ts +0 -2
  162. package/dist/dts/internal/stream.d.ts.map +0 -1
  163. package/dist/dts/internal/terminal.d.ts +0 -2
  164. package/dist/dts/internal/terminal.d.ts.map +0 -1
  165. package/dist/esm/NodeClusterSocket.js.map +0 -1
  166. package/dist/esm/NodeCommandExecutor.js +0 -7
  167. package/dist/esm/NodeCommandExecutor.js.map +0 -1
  168. package/dist/esm/NodeFileSystem/ParcelWatcher.js +0 -12
  169. package/dist/esm/NodeFileSystem/ParcelWatcher.js.map +0 -1
  170. package/dist/esm/NodeFileSystem.js +0 -10
  171. package/dist/esm/NodeFileSystem.js.map +0 -1
  172. package/dist/esm/NodeKeyValueStore.js +0 -10
  173. package/dist/esm/NodeKeyValueStore.js.map +0 -1
  174. package/dist/esm/NodeMultipart.js +0 -17
  175. package/dist/esm/NodeMultipart.js.map +0 -1
  176. package/dist/esm/NodePath.js +0 -20
  177. package/dist/esm/NodePath.js.map +0 -1
  178. package/dist/esm/NodeRuntime.js +0 -7
  179. package/dist/esm/NodeRuntime.js.map +0 -1
  180. package/dist/esm/NodeSink.js +0 -43
  181. package/dist/esm/NodeSink.js.map +0 -1
  182. package/dist/esm/NodeSocket.js.map +0 -1
  183. package/dist/esm/NodeSocketServer.js +0 -167
  184. package/dist/esm/NodeSocketServer.js.map +0 -1
  185. package/dist/esm/NodeStream.js +0 -69
  186. package/dist/esm/NodeStream.js.map +0 -1
  187. package/dist/esm/NodeTerminal.js +0 -12
  188. package/dist/esm/NodeTerminal.js.map +0 -1
  189. package/dist/esm/internal/commandExecutor.js +0 -146
  190. package/dist/esm/internal/commandExecutor.js.map +0 -1
  191. package/dist/esm/internal/error.js.map +0 -1
  192. package/dist/esm/internal/fileSystem/parcelWatcher.js +0 -61
  193. package/dist/esm/internal/fileSystem/parcelWatcher.js.map +0 -1
  194. package/dist/esm/internal/fileSystem.js.map +0 -1
  195. package/dist/esm/internal/multipart.js +0 -137
  196. package/dist/esm/internal/multipart.js.map +0 -1
  197. package/dist/esm/internal/path.js +0 -46
  198. package/dist/esm/internal/path.js.map +0 -1
  199. package/dist/esm/internal/runtime.js.map +0 -1
  200. package/dist/esm/internal/sink.js +0 -19
  201. package/dist/esm/internal/sink.js.map +0 -1
  202. package/dist/esm/internal/stream.js +0 -217
  203. package/dist/esm/internal/stream.js.map +0 -1
  204. package/dist/esm/internal/terminal.js.map +0 -1
  205. package/dist/esm/package.json +0 -4
  206. package/src/NodeCommandExecutor.ts +0 -13
  207. package/src/NodeFileSystem/ParcelWatcher.ts +0 -15
  208. package/src/NodeKeyValueStore.ts +0 -20
  209. package/src/NodeMultipart.ts +0 -40
  210. package/src/internal/commandExecutor.ts +0 -251
  211. package/src/internal/fileSystem/parcelWatcher.ts +0 -64
  212. package/src/internal/fileSystem.ts +0 -648
  213. package/src/internal/multipart.ts +0 -141
  214. package/src/internal/path.ts +0 -63
  215. package/src/internal/runtime.ts +0 -34
  216. package/src/internal/sink.ts +0 -57
  217. package/src/internal/stream.ts +0 -375
  218. package/src/internal/terminal.ts +0 -100
@@ -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 FiberRef from "effect/FiberRef"
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 WS from "ws"
19
- import * as NodeSocket from "./NodeSocket.js"
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 Context.Tag("@effect/platform-node-shared/NodeSocketServer/IncomingMessage")<
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 = yield* Deferred.make<never, Error>()
38
- const pending: Array<Net.Socket> = []
39
- const defaultOnConnection = (socket: Net.Socket) => {
40
- pending.push(socket)
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.async<void>((resume) => {
46
- server.close(() => resume(Effect.void))
52
+ Effect.callback<void>((resume) => {
53
+ server?.close(() => resume(Effect.void))
47
54
  })
48
55
  )
49
- const server = Net.createServer(options, (conn) => onConnection(conn))
50
- server.on("error", (cause) => Deferred.unsafeDone(errorDeferred, Exit.fail(cause)))
56
+ server = Net.createServer(options, (conn) => onConnection(conn))
57
+ server.on("error", (err) => Deferred.doneUnsafe(errorDeferred, Exit.fail(err)))
51
58
 
52
- yield* Effect.async<void>((resume) => {
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), (cause) =>
62
+ Effect.raceFirst(Effect.mapError(Deferred.await(errorDeferred), (err) =>
58
63
  new SocketServer.SocketServerError({
59
- reason: "Open",
60
- cause
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 fiberSet = yield* FiberSet.make().pipe(
67
- Scope.extend(scope)
68
- )
69
- const run = yield* FiberSet.runtime(fiberSet)<R>()
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(new Socket.SocketGenericError({ reason: "Open", cause: error }))
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.SocketCloseError({
84
- reason: "Close",
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.catchAllCause(reportUnhandledError),
101
- Effect.provideService(NodeSocket.NetSocket, conn),
102
- run
111
+ Effect.catchCause(reportUnhandledError),
112
+ Effect.runForkWith(ServiceMap.add(services, NodeSocket.NetSocket, conn)),
113
+ trackFiber
103
114
  )
104
115
  }
105
- return yield* Effect.async<never>((_resume) => {
106
- const prev = onConnection
107
- onConnection = onConnection_
108
- pending.forEach(onConnection)
109
- pending.length = 0
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 = prev
124
+ onConnection = prevOnConnection
112
125
  return Scope.close(scope, Exit.void)
113
126
  })
114
- }).pipe(
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
- ): Layer.Layer<SocketServer.SocketServer, SocketServer.SocketServerError> =>
146
- Layer.scoped(
147
- SocketServer.SocketServer,
148
- make(options)
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: WS.ServerOptions<typeof WS.WebSocket, typeof Http.IncomingMessage>
162
+ options: NodeWS.ServerOptions<typeof NodeWS.WebSocket, typeof Http.IncomingMessage>
157
163
  ) => Effect.Effect<
158
- SocketServer.SocketServer["Type"],
164
+ SocketServer.SocketServer["Service"],
159
165
  SocketServer.SocketServerError,
160
166
  Scope.Scope
161
167
  > = Effect.fnUntraced(function*(
162
- options: WS.ServerOptions
168
+ options: NodeWS.ServerOptions
163
169
  ) {
164
170
  const server = yield* Effect.acquireRelease(
165
- Effect.sync(() => new WS.WebSocketServer(options)),
171
+ Effect.sync(() => new NodeWS.WebSocketServer(options)),
166
172
  (server) =>
167
- Effect.async<void>((resume) => {
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.async<void, SocketServer.SocketServerError>((resume) => {
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: "Open",
177
- cause: error
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 fiberSet = yield* FiberSet.make().pipe(
189
- Scope.extend(scope)
190
- )
191
- const run = yield* FiberSet.runtime(fiberSet)<R>()
192
- function onConnection(conn: Net.Socket, req: Http.IncomingMessage) {
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 as unknown as globalThis.WebSocket),
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.catchAllCause(reportUnhandledError),
205
- Effect.provideService(Socket.WebSocket, conn as any),
206
- Effect.provideService(IncomingMessage, req),
207
- run
223
+ Effect.catchCause(reportUnhandledError),
224
+ Effect.runForkWith(ServiceMap.makeUnsafe(map)),
225
+ trackFiber
208
226
  )
209
227
  }
210
- return yield* Effect.async<never>((_resume) => {
211
- server.on("connection", onConnection)
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
- server.off("connection", onConnection)
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: WS.ServerOptions
242
- ): Layer.Layer<SocketServer.SocketServer, SocketServer.SocketServerError> =>
243
- Layer.scoped(
244
- SocketServer.SocketServer,
245
- makeWebSocket(options)
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.withFiberRuntime<void>((fiber) => {
250
- const unhandledLogLevel = fiber.getFiberRef(FiberRef.unhandledErrorLogLevel)
251
- if (unhandledLogLevel._tag === "Some") {
252
- return Effect.logWithLevel(unhandledLogLevel.value, cause, "Unhandled error in SocketServer")
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
  })
@@ -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
+ )