@effect/platform-node-shared 0.2.3 → 0.2.5

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.
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/NodeSocket.js",
3
+ "module": "../dist/esm/NodeSocket.js",
4
+ "types": "../dist/dts/NodeSocket.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeNetChannel = exports.makeNet = exports.layerNet = exports.fromNetSocket = exports.NetSocket = void 0;
7
+ var Socket = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/platform/Socket"));
8
+ var Channel = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Channel"));
9
+ var Context = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Context"));
10
+ var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
11
+ var Fiber = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Fiber"));
12
+ var FiberSet = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/FiberSet"));
13
+ var Layer = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Layer"));
14
+ var Queue = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Queue"));
15
+ var Net = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("node:net"));
16
+ function _getRequireWildcardCache(e) {
17
+ if ("function" != typeof WeakMap) return null;
18
+ var r = new WeakMap(),
19
+ t = new WeakMap();
20
+ return (_getRequireWildcardCache = function (e) {
21
+ return e ? t : r;
22
+ })(e);
23
+ }
24
+ function _interopRequireWildcard(e, r) {
25
+ if (!r && e && e.__esModule) return e;
26
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
27
+ default: e
28
+ };
29
+ var t = _getRequireWildcardCache(r);
30
+ if (t && t.has(e)) return t.get(e);
31
+ var n = {
32
+ __proto__: null
33
+ },
34
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
35
+ for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) {
36
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
37
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
38
+ }
39
+ return n.default = e, t && t.set(e, n), n;
40
+ }
41
+ /**
42
+ * @since 1.0.0
43
+ */
44
+
45
+ /**
46
+ * @since 1.0.0
47
+ * @category tags
48
+ */
49
+ const NetSocket = exports.NetSocket = /*#__PURE__*/Context.GenericTag("@effect/platform-node/NodeSocket/NetSocket");
50
+ const EOF = /*#__PURE__*/Symbol.for("@effect/experimental/Socket/Node/EOF");
51
+ /**
52
+ * @since 1.0.0
53
+ * @category constructors
54
+ */
55
+ const makeNet = options => fromNetSocket(Effect.acquireRelease(Effect.async(resume => {
56
+ const conn = Net.createConnection(options);
57
+ conn.on("connect", () => {
58
+ conn.removeAllListeners();
59
+ resume(Effect.succeed(conn));
60
+ });
61
+ conn.on("error", error => {
62
+ resume(Effect.fail(new Socket.SocketError({
63
+ reason: "Open",
64
+ error
65
+ })));
66
+ });
67
+ return Effect.sync(() => {
68
+ conn.destroy();
69
+ });
70
+ }), conn => Effect.sync(() => {
71
+ if (conn.closed === false) {
72
+ conn.destroySoon();
73
+ }
74
+ conn.removeAllListeners();
75
+ })));
76
+ /**
77
+ * @since 1.0.0
78
+ * @category constructors
79
+ */
80
+ exports.makeNet = makeNet;
81
+ const fromNetSocket = open => Effect.gen(function* (_) {
82
+ const sendQueue = yield* _(Queue.unbounded());
83
+ const run = handler => Effect.gen(function* (_) {
84
+ const conn = yield* _(open);
85
+ const fiberSet = yield* _(FiberSet.make());
86
+ const run = yield* _(FiberSet.runtime(fiberSet)(), Effect.provideService(NetSocket, conn));
87
+ const writeFiber = yield* _(Queue.take(sendQueue), Effect.tap(chunk => Effect.async(resume => {
88
+ if (chunk === EOF) {
89
+ conn.end(() => resume(Effect.unit));
90
+ } else {
91
+ conn.write(chunk, error => {
92
+ resume(error ? Effect.fail(new Socket.SocketError({
93
+ reason: "Write",
94
+ error
95
+ })) : Effect.unit);
96
+ });
97
+ }
98
+ })), Effect.forever, Effect.fork);
99
+ conn.on("data", chunk => {
100
+ run(handler(chunk));
101
+ });
102
+ yield* _(Effect.async(resume => {
103
+ conn.on("end", () => {
104
+ resume(Effect.unit);
105
+ });
106
+ conn.on("error", error => {
107
+ resume(Effect.fail(new Socket.SocketError({
108
+ reason: "Read",
109
+ error
110
+ })));
111
+ });
112
+ }), Effect.raceFirst(Fiber.join(writeFiber)), Effect.raceFirst(FiberSet.join(fiberSet)));
113
+ }).pipe(Effect.scoped);
114
+ const write = chunk => Queue.offer(sendQueue, chunk);
115
+ const writer = Effect.acquireRelease(Effect.succeed(write), () => Queue.offer(sendQueue, EOF));
116
+ return Socket.Socket.of({
117
+ [Socket.SocketTypeId]: Socket.SocketTypeId,
118
+ run,
119
+ writer
120
+ });
121
+ });
122
+ /**
123
+ * @since 1.0.0
124
+ * @category constructors
125
+ */
126
+ exports.fromNetSocket = fromNetSocket;
127
+ const makeNetChannel = options => Channel.unwrapScoped(Effect.map(makeNet(options), Socket.toChannelWith()));
128
+ /**
129
+ * @since 1.0.0
130
+ * @category layers
131
+ */
132
+ exports.makeNetChannel = makeNetChannel;
133
+ const layerNet = options => Layer.scoped(Socket.Socket, makeNet(options));
134
+ exports.layerNet = layerNet;
135
+ //# sourceMappingURL=NodeSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSocket.js","names":["Socket","_interopRequireWildcard","require","Channel","Context","Effect","Fiber","FiberSet","Layer","Queue","Net","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","NetSocket","exports","GenericTag","EOF","Symbol","for","makeNet","options","fromNetSocket","acquireRelease","async","resume","conn","createConnection","on","removeAllListeners","succeed","error","fail","SocketError","reason","sync","destroy","closed","destroySoon","open","gen","_","sendQueue","unbounded","run","handler","fiberSet","make","runtime","provideService","writeFiber","take","tap","chunk","end","unit","write","forever","fork","raceFirst","join","pipe","scoped","offer","writer","of","SocketTypeId","makeNetChannel","unwrapScoped","map","toChannelWith","layerNet"],"sources":["../../src/NodeSocket.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /**
3
+ * @since 1.0.0
4
+ */
5
+ import * as Socket from "@effect/platform/Socket";
6
+ import * as Channel from "effect/Channel";
7
+ import type * as Chunk from "effect/Chunk";
8
+ import * as Context from "effect/Context";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Layer from "effect/Layer";
11
+ import type * as Scope from "effect/Scope";
12
+ import * as Net from "node:net";
13
+ /**
14
+ * @since 1.0.0
15
+ * @category tags
16
+ */
17
+ export interface NetSocket {
18
+ readonly _: unique symbol;
19
+ }
20
+ /**
21
+ * @since 1.0.0
22
+ * @category tags
23
+ */
24
+ export declare const NetSocket: Context.Tag<NetSocket, Net.Socket>;
25
+ /**
26
+ * @since 1.0.0
27
+ * @category constructors
28
+ */
29
+ export declare const makeNet: (options: Net.NetConnectOpts) => Effect.Effect<Socket.Socket, Socket.SocketError, Scope.Scope>;
30
+ /**
31
+ * @since 1.0.0
32
+ * @category constructors
33
+ */
34
+ export declare const fromNetSocket: (open: Effect.Effect<Net.Socket, Socket.SocketError, Scope.Scope>) => Effect.Effect<Socket.Socket>;
35
+ /**
36
+ * @since 1.0.0
37
+ * @category constructors
38
+ */
39
+ export declare const makeNetChannel: <IE = never>(options: Net.NetConnectOpts) => Channel.Channel<Chunk.Chunk<Uint8Array>, Chunk.Chunk<Uint8Array>, Socket.SocketError | IE, IE, void, unknown, never>;
40
+ /**
41
+ * @since 1.0.0
42
+ * @category layers
43
+ */
44
+ export declare const layerNet: (options: Net.NetConnectOpts) => Layer.Layer<Socket.Socket, Socket.SocketError>;
45
+ //# sourceMappingURL=NodeSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSocket.d.ts","sourceRoot":"","sources":["../../src/NodeSocket.ts"],"names":[],"mappings":";AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAA;AACjD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAE/B;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,CAAC,EAAE,OAAO,MAAM,CAAA;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAExD,CAAA;AAID;;;GAGG;AACH,eAAO,MAAM,OAAO,YACT,IAAI,cAAc,KAC1B,aAAa,CAAC,aAAa,EAAE,OAAO,WAAW,EAAE,WAAW,CAwB5D,CAAA;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,SAClB,aAAa,CAAC,UAAU,EAAE,OAAO,WAAW,EAAE,WAAW,CAAC,KAC/D,aAAa,CAAC,aAAa,CAwD1B,CAAA;AAEJ;;;GAGG;AACH,eAAO,MAAM,cAAc,wBAChB,IAAI,cAAc,yHAI1B,CAAA;AAEH;;;GAGG;AACH,eAAO,MAAM,QAAQ,YAAa,IAAI,cAAc,KAAG,WAAW,CAAC,aAAa,EAAE,OAAO,WAAW,CAIjG,CAAA"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Socket from "@effect/platform/Socket";
5
+ import * as Channel from "effect/Channel";
6
+ import * as Context from "effect/Context";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Fiber from "effect/Fiber";
9
+ import * as FiberSet from "effect/FiberSet";
10
+ import * as Layer from "effect/Layer";
11
+ import * as Queue from "effect/Queue";
12
+ import * as Net from "node:net";
13
+ /**
14
+ * @since 1.0.0
15
+ * @category tags
16
+ */
17
+ export const NetSocket = /*#__PURE__*/Context.GenericTag("@effect/platform-node/NodeSocket/NetSocket");
18
+ const EOF = /*#__PURE__*/Symbol.for("@effect/experimental/Socket/Node/EOF");
19
+ /**
20
+ * @since 1.0.0
21
+ * @category constructors
22
+ */
23
+ export const makeNet = options => fromNetSocket(Effect.acquireRelease(Effect.async(resume => {
24
+ const conn = Net.createConnection(options);
25
+ conn.on("connect", () => {
26
+ conn.removeAllListeners();
27
+ resume(Effect.succeed(conn));
28
+ });
29
+ conn.on("error", error => {
30
+ resume(Effect.fail(new Socket.SocketError({
31
+ reason: "Open",
32
+ error
33
+ })));
34
+ });
35
+ return Effect.sync(() => {
36
+ conn.destroy();
37
+ });
38
+ }), conn => Effect.sync(() => {
39
+ if (conn.closed === false) {
40
+ conn.destroySoon();
41
+ }
42
+ conn.removeAllListeners();
43
+ })));
44
+ /**
45
+ * @since 1.0.0
46
+ * @category constructors
47
+ */
48
+ export const fromNetSocket = open => Effect.gen(function* (_) {
49
+ const sendQueue = yield* _(Queue.unbounded());
50
+ const run = handler => Effect.gen(function* (_) {
51
+ const conn = yield* _(open);
52
+ const fiberSet = yield* _(FiberSet.make());
53
+ const run = yield* _(FiberSet.runtime(fiberSet)(), Effect.provideService(NetSocket, conn));
54
+ const writeFiber = yield* _(Queue.take(sendQueue), Effect.tap(chunk => Effect.async(resume => {
55
+ if (chunk === EOF) {
56
+ conn.end(() => resume(Effect.unit));
57
+ } else {
58
+ conn.write(chunk, error => {
59
+ resume(error ? Effect.fail(new Socket.SocketError({
60
+ reason: "Write",
61
+ error
62
+ })) : Effect.unit);
63
+ });
64
+ }
65
+ })), Effect.forever, Effect.fork);
66
+ conn.on("data", chunk => {
67
+ run(handler(chunk));
68
+ });
69
+ yield* _(Effect.async(resume => {
70
+ conn.on("end", () => {
71
+ resume(Effect.unit);
72
+ });
73
+ conn.on("error", error => {
74
+ resume(Effect.fail(new Socket.SocketError({
75
+ reason: "Read",
76
+ error
77
+ })));
78
+ });
79
+ }), Effect.raceFirst(Fiber.join(writeFiber)), Effect.raceFirst(FiberSet.join(fiberSet)));
80
+ }).pipe(Effect.scoped);
81
+ const write = chunk => Queue.offer(sendQueue, chunk);
82
+ const writer = Effect.acquireRelease(Effect.succeed(write), () => Queue.offer(sendQueue, EOF));
83
+ return Socket.Socket.of({
84
+ [Socket.SocketTypeId]: Socket.SocketTypeId,
85
+ run,
86
+ writer
87
+ });
88
+ });
89
+ /**
90
+ * @since 1.0.0
91
+ * @category constructors
92
+ */
93
+ export const makeNetChannel = options => Channel.unwrapScoped(Effect.map(makeNet(options), Socket.toChannelWith()));
94
+ /**
95
+ * @since 1.0.0
96
+ * @category layers
97
+ */
98
+ export const layerNet = options => Layer.scoped(Socket.Socket, makeNet(options));
99
+ //# sourceMappingURL=NodeSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSocket.js","names":["Socket","Channel","Context","Effect","Fiber","FiberSet","Layer","Queue","Net","NetSocket","GenericTag","EOF","Symbol","for","makeNet","options","fromNetSocket","acquireRelease","async","resume","conn","createConnection","on","removeAllListeners","succeed","error","fail","SocketError","reason","sync","destroy","closed","destroySoon","open","gen","_","sendQueue","unbounded","run","handler","fiberSet","make","runtime","provideService","writeFiber","take","tap","chunk","end","unit","write","forever","fork","raceFirst","join","pipe","scoped","offer","writer","of","SocketTypeId","makeNetChannel","unwrapScoped","map","toChannelWith","layerNet"],"sources":["../../src/NodeSocket.ts"],"sourcesContent":[null],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/platform-node-shared",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Unified interfaces for common platform-specific services",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,8 +13,8 @@
13
13
  "multipasta": "^0.1.21"
14
14
  },
15
15
  "peerDependencies": {
16
- "@effect/platform": "^0.46.3",
17
- "effect": "^2.4.1"
16
+ "@effect/platform": "^0.47.1",
17
+ "effect": "^2.4.3"
18
18
  },
19
19
  "exports": {
20
20
  "./package.json": "./package.json",
@@ -58,6 +58,11 @@
58
58
  "import": "./dist/esm/NodeSink.js",
59
59
  "default": "./dist/cjs/NodeSink.js"
60
60
  },
61
+ "./NodeSocket": {
62
+ "types": "./dist/dts/NodeSocket.d.ts",
63
+ "import": "./dist/esm/NodeSocket.js",
64
+ "default": "./dist/cjs/NodeSocket.js"
65
+ },
61
66
  "./NodeStream": {
62
67
  "types": "./dist/dts/NodeStream.d.ts",
63
68
  "import": "./dist/esm/NodeStream.js",
@@ -95,6 +100,9 @@
95
100
  "NodeSink": [
96
101
  "./dist/dts/NodeSink.d.ts"
97
102
  ],
103
+ "NodeSocket": [
104
+ "./dist/dts/NodeSocket.d.ts"
105
+ ],
98
106
  "NodeStream": [
99
107
  "./dist/dts/NodeStream.d.ts"
100
108
  ],
@@ -0,0 +1,149 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Socket from "@effect/platform/Socket"
5
+ import * as Channel from "effect/Channel"
6
+ import type * as Chunk from "effect/Chunk"
7
+ import * as Context from "effect/Context"
8
+ import * as Effect from "effect/Effect"
9
+ import * as Fiber from "effect/Fiber"
10
+ import * as FiberSet from "effect/FiberSet"
11
+ import * as Layer from "effect/Layer"
12
+ import * as Queue from "effect/Queue"
13
+ import type * as Scope from "effect/Scope"
14
+ import * as Net from "node:net"
15
+
16
+ /**
17
+ * @since 1.0.0
18
+ * @category tags
19
+ */
20
+ export interface NetSocket {
21
+ readonly _: unique symbol
22
+ }
23
+
24
+ /**
25
+ * @since 1.0.0
26
+ * @category tags
27
+ */
28
+ export const NetSocket: Context.Tag<NetSocket, Net.Socket> = Context.GenericTag(
29
+ "@effect/platform-node/NodeSocket/NetSocket"
30
+ )
31
+
32
+ const EOF = Symbol.for("@effect/experimental/Socket/Node/EOF")
33
+
34
+ /**
35
+ * @since 1.0.0
36
+ * @category constructors
37
+ */
38
+ export const makeNet = (
39
+ options: Net.NetConnectOpts
40
+ ): Effect.Effect<Socket.Socket, Socket.SocketError, Scope.Scope> =>
41
+ fromNetSocket(
42
+ Effect.acquireRelease(
43
+ Effect.async<Net.Socket, Socket.SocketError, never>((resume) => {
44
+ const conn = Net.createConnection(options)
45
+ conn.on("connect", () => {
46
+ conn.removeAllListeners()
47
+ resume(Effect.succeed(conn))
48
+ })
49
+ conn.on("error", (error) => {
50
+ resume(Effect.fail(new Socket.SocketError({ reason: "Open", error })))
51
+ })
52
+ return Effect.sync(() => {
53
+ conn.destroy()
54
+ })
55
+ }),
56
+ (conn) =>
57
+ Effect.sync(() => {
58
+ if (conn.closed === false) {
59
+ conn.destroySoon()
60
+ }
61
+ conn.removeAllListeners()
62
+ })
63
+ )
64
+ )
65
+
66
+ /**
67
+ * @since 1.0.0
68
+ * @category constructors
69
+ */
70
+ export const fromNetSocket = (
71
+ open: Effect.Effect<Net.Socket, Socket.SocketError, Scope.Scope>
72
+ ): Effect.Effect<Socket.Socket> =>
73
+ Effect.gen(function*(_) {
74
+ const sendQueue = yield* _(Queue.unbounded<Uint8Array | typeof EOF>())
75
+
76
+ const run = <R, E, _>(handler: (_: Uint8Array) => Effect.Effect<_, E, R>) =>
77
+ Effect.gen(function*(_) {
78
+ const conn = yield* _(open)
79
+ const fiberSet = yield* _(FiberSet.make<any, E | Socket.SocketError>())
80
+ const run = yield* _(
81
+ FiberSet.runtime(fiberSet)<R>(),
82
+ Effect.provideService(NetSocket, conn)
83
+ )
84
+ const writeFiber = yield* _(
85
+ Queue.take(sendQueue),
86
+ Effect.tap((chunk) =>
87
+ Effect.async<void, Socket.SocketError, never>((resume) => {
88
+ if (chunk === EOF) {
89
+ conn.end(() => resume(Effect.unit))
90
+ } else {
91
+ conn.write(chunk, (error) => {
92
+ resume(error ? Effect.fail(new Socket.SocketError({ reason: "Write", error })) : Effect.unit)
93
+ })
94
+ }
95
+ })
96
+ ),
97
+ Effect.forever,
98
+ Effect.fork
99
+ )
100
+ conn.on("data", (chunk) => {
101
+ run(handler(chunk))
102
+ })
103
+ yield* _(
104
+ Effect.async<void, Socket.SocketError, never>((resume) => {
105
+ conn.on("end", () => {
106
+ resume(Effect.unit)
107
+ })
108
+ conn.on("error", (error) => {
109
+ resume(Effect.fail(new Socket.SocketError({ reason: "Read", error })))
110
+ })
111
+ }),
112
+ Effect.raceFirst(Fiber.join(writeFiber)),
113
+ Effect.raceFirst(FiberSet.join(fiberSet))
114
+ )
115
+ }).pipe(Effect.scoped)
116
+
117
+ const write = (chunk: Uint8Array) => Queue.offer(sendQueue, chunk)
118
+ const writer = Effect.acquireRelease(
119
+ Effect.succeed(write),
120
+ () => Queue.offer(sendQueue, EOF)
121
+ )
122
+
123
+ return Socket.Socket.of({
124
+ [Socket.SocketTypeId]: Socket.SocketTypeId,
125
+ run,
126
+ writer
127
+ })
128
+ })
129
+
130
+ /**
131
+ * @since 1.0.0
132
+ * @category constructors
133
+ */
134
+ export const makeNetChannel = <IE = never>(
135
+ options: Net.NetConnectOpts
136
+ ): Channel.Channel<Chunk.Chunk<Uint8Array>, Chunk.Chunk<Uint8Array>, Socket.SocketError | IE, IE, void, unknown> =>
137
+ Channel.unwrapScoped(
138
+ Effect.map(makeNet(options), Socket.toChannelWith<IE>())
139
+ )
140
+
141
+ /**
142
+ * @since 1.0.0
143
+ * @category layers
144
+ */
145
+ export const layerNet = (options: Net.NetConnectOpts): Layer.Layer<Socket.Socket, Socket.SocketError> =>
146
+ Layer.scoped(
147
+ Socket.Socket,
148
+ makeNet(options)
149
+ )