@effect/platform-node-shared 0.2.3 → 0.2.4
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/NodeSocket/package.json +6 -0
- package/dist/cjs/NodeSocket.js +135 -0
- package/dist/cjs/NodeSocket.js.map +1 -0
- package/dist/dts/NodeSocket.d.ts +45 -0
- package/dist/dts/NodeSocket.d.ts.map +1 -0
- package/dist/esm/NodeSocket.js +99 -0
- package/dist/esm/NodeSocket.js.map +1 -0
- package/package.json +11 -3
- package/src/NodeSocket.ts +149 -0
|
@@ -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
|
+
"version": "0.2.4",
|
|
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.
|
|
17
|
-
"effect": "^2.4.
|
|
16
|
+
"@effect/platform": "^0.47.0",
|
|
17
|
+
"effect": "^2.4.2"
|
|
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
|
+
)
|