@effect/platform-node-shared 0.29.4 → 0.30.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/NodeClusterRunnerSocket/package.json +6 -0
- package/NodeClusterShardManagerSocket/package.json +6 -0
- package/NodeClusterSocketCommon/package.json +6 -0
- package/NodeSocketServer/package.json +6 -0
- package/dist/cjs/NodeClusterRunnerSocket.js +49 -0
- package/dist/cjs/NodeClusterRunnerSocket.js.map +1 -0
- package/dist/cjs/NodeClusterShardManagerSocket.js +38 -0
- package/dist/cjs/NodeClusterShardManagerSocket.js.map +1 -0
- package/dist/cjs/NodeClusterSocketCommon.js +34 -0
- package/dist/cjs/NodeClusterSocketCommon.js.map +1 -0
- package/dist/cjs/NodeSocket.js +2 -1
- package/dist/cjs/NodeSocket.js.map +1 -1
- package/dist/cjs/NodeSocketServer.js +149 -0
- package/dist/cjs/NodeSocketServer.js.map +1 -0
- package/dist/dts/NodeClusterRunnerSocket.d.ts +24 -0
- package/dist/dts/NodeClusterRunnerSocket.d.ts.map +1 -0
- package/dist/dts/NodeClusterShardManagerSocket.d.ts +22 -0
- package/dist/dts/NodeClusterShardManagerSocket.d.ts.map +1 -0
- package/dist/dts/NodeClusterSocketCommon.d.ts +12 -0
- package/dist/dts/NodeClusterSocketCommon.d.ts.map +1 -0
- package/dist/dts/NodeSocket.d.ts.map +1 -1
- package/dist/dts/NodeSocketServer.d.ts +44 -0
- package/dist/dts/NodeSocketServer.d.ts.map +1 -0
- package/dist/esm/NodeClusterRunnerSocket.js +39 -0
- package/dist/esm/NodeClusterRunnerSocket.js.map +1 -0
- package/dist/esm/NodeClusterShardManagerSocket.js +28 -0
- package/dist/esm/NodeClusterShardManagerSocket.js.map +1 -0
- package/dist/esm/NodeClusterSocketCommon.js +25 -0
- package/dist/esm/NodeClusterSocketCommon.js.map +1 -0
- package/dist/esm/NodeSocket.js +2 -1
- package/dist/esm/NodeSocket.js.map +1 -1
- package/dist/esm/NodeSocketServer.js +137 -0
- package/dist/esm/NodeSocketServer.js.map +1 -0
- package/package.json +40 -4
- package/src/NodeClusterRunnerSocket.ts +78 -0
- package/src/NodeClusterShardManagerSocket.ts +54 -0
- package/src/NodeClusterSocketCommon.ts +35 -0
- package/src/NodeSocket.ts +47 -48
- package/src/NodeSocketServer.ts +225 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as RunnerHealth from "@effect/cluster/RunnerHealth";
|
|
5
|
+
import * as ShardingConfig from "@effect/cluster/ShardingConfig";
|
|
6
|
+
import * as ShardManager from "@effect/cluster/ShardManager";
|
|
7
|
+
import * as ShardStorage from "@effect/cluster/ShardStorage";
|
|
8
|
+
import * as SocketShardManager from "@effect/cluster/SocketShardManager";
|
|
9
|
+
import * as SqlShardStorage from "@effect/cluster/SqlShardStorage";
|
|
10
|
+
import * as RpcSerialization from "@effect/rpc/RpcSerialization";
|
|
11
|
+
import * as Effect from "effect/Effect";
|
|
12
|
+
import * as Layer from "effect/Layer";
|
|
13
|
+
import { layerClientProtocol } from "./NodeClusterSocketCommon.js";
|
|
14
|
+
import * as NodeSocketServer from "./NodeSocketServer.js";
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
* @category Layers
|
|
18
|
+
*/
|
|
19
|
+
export const layerSocketServer = /*#__PURE__*/Effect.gen(function* () {
|
|
20
|
+
const config = yield* ShardingConfig.ShardingConfig;
|
|
21
|
+
return NodeSocketServer.layer(config.shardManagerAddress);
|
|
22
|
+
}).pipe(Layer.unwrapEffect);
|
|
23
|
+
/**
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
* @category Layers
|
|
26
|
+
*/
|
|
27
|
+
export const layer = options => SocketShardManager.layer.pipe(Layer.provide([RunnerHealth.layerRpc, layerSocketServer, ShardManager.layerConfigFromEnv]), Layer.provide(layerClientProtocol), Layer.provide(options?.storage === "sql" ? SqlShardStorage.layer : ShardStorage.layerNoop), Layer.provide([options?.serialization === "ndjson" ? RpcSerialization.layerNdjson : RpcSerialization.layerMsgPack, ShardingConfig.layerFromEnv(options?.shardingConfig)]));
|
|
28
|
+
//# sourceMappingURL=NodeClusterShardManagerSocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeClusterShardManagerSocket.js","names":["RunnerHealth","ShardingConfig","ShardManager","ShardStorage","SocketShardManager","SqlShardStorage","RpcSerialization","Effect","Layer","layerClientProtocol","NodeSocketServer","layerSocketServer","gen","config","layer","shardManagerAddress","pipe","unwrapEffect","options","provide","layerRpc","layerConfigFromEnv","storage","layerNoop","serialization","layerNdjson","layerMsgPack","layerFromEnv","shardingConfig"],"sources":["../../src/NodeClusterShardManagerSocket.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,YAAY,MAAM,8BAA8B;AAC5D,OAAO,KAAKC,cAAc,MAAM,gCAAgC;AAChE,OAAO,KAAKC,YAAY,MAAM,8BAA8B;AAC5D,OAAO,KAAKC,YAAY,MAAM,8BAA8B;AAC5D,OAAO,KAAKC,kBAAkB,MAAM,oCAAoC;AACxE,OAAO,KAAKC,eAAe,MAAM,iCAAiC;AAElE,OAAO,KAAKC,gBAAgB,MAAM,8BAA8B;AAIhE,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,SAASC,mBAAmB,QAAQ,8BAA8B;AAClE,OAAO,KAAKC,gBAAgB,MAAM,uBAAuB;AAEzD;;;;AAIA,OAAO,MAAMC,iBAAiB,gBAI1BJ,MAAM,CAACK,GAAG,CAAC,aAAS;EACtB,MAAMC,MAAM,GAAG,OAAOZ,cAAc,CAACA,cAAc;EACnD,OAAOS,gBAAgB,CAACI,KAAK,CAACD,MAAM,CAACE,mBAAmB,CAAC;AAC3D,CAAC,CAAC,CAACC,IAAI,CAACR,KAAK,CAACS,YAAY,CAAC;AAE3B;;;;AAIA,OAAO,MAAMH,KAAK,GAAmDI,OAIpE,IAKCd,kBAAkB,CAACU,KAAK,CAACE,IAAI,CAC3BR,KAAK,CAACW,OAAO,CAAC,CAACnB,YAAY,CAACoB,QAAQ,EAAET,iBAAiB,EAAET,YAAY,CAACmB,kBAAkB,CAAC,CAAC,EAC1Fb,KAAK,CAACW,OAAO,CAACV,mBAAmB,CAAC,EAClCD,KAAK,CAACW,OAAO,CAACD,OAAO,EAAEI,OAAO,KAAK,KAAK,GAAGjB,eAAe,CAACS,KAAK,GAAGX,YAAY,CAACoB,SAAS,CAAC,EAC1Ff,KAAK,CAACW,OAAO,CAAC,CACZD,OAAO,EAAEM,aAAa,KAAK,QAAQ,GAAGlB,gBAAgB,CAACmB,WAAW,GAAGnB,gBAAgB,CAACoB,YAAY,EAClGzB,cAAc,CAAC0B,YAAY,CAACT,OAAO,EAAEU,cAAc,CAAC,CACrD,CAAC,CACI","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Runners from "@effect/cluster/Runners";
|
|
5
|
+
import { Socket } from "@effect/platform/Socket";
|
|
6
|
+
import * as RpcClient from "@effect/rpc/RpcClient";
|
|
7
|
+
import * as RpcSerialization from "@effect/rpc/RpcSerialization";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
10
|
+
import * as NodeSocket from "./NodeSocket.js";
|
|
11
|
+
/**
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
* @category Layers
|
|
14
|
+
*/
|
|
15
|
+
export const layerClientProtocol = /*#__PURE__*/Layer.effect(Runners.RpcClientProtocol, /*#__PURE__*/Effect.gen(function* () {
|
|
16
|
+
const serialization = yield* RpcSerialization.RpcSerialization;
|
|
17
|
+
return Effect.fnUntraced(function* (address) {
|
|
18
|
+
const socket = yield* NodeSocket.makeNet({
|
|
19
|
+
host: address.host,
|
|
20
|
+
port: address.port
|
|
21
|
+
});
|
|
22
|
+
return yield* RpcClient.makeProtocolSocket.pipe(Effect.provideService(Socket, socket), Effect.provideService(RpcSerialization.RpcSerialization, serialization));
|
|
23
|
+
}, Effect.orDie);
|
|
24
|
+
}));
|
|
25
|
+
//# sourceMappingURL=NodeClusterSocketCommon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeClusterSocketCommon.js","names":["Runners","Socket","RpcClient","RpcSerialization","Effect","Layer","NodeSocket","layerClientProtocol","effect","RpcClientProtocol","gen","serialization","fnUntraced","address","socket","makeNet","host","port","makeProtocolSocket","pipe","provideService","orDie"],"sources":["../../src/NodeClusterSocketCommon.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,yBAAyB;AAClD,SAASC,MAAM,QAAQ,yBAAyB;AAChD,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAClD,OAAO,KAAKC,gBAAgB,MAAM,8BAA8B;AAChE,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;;AAIA,OAAO,MAAMC,mBAAmB,gBAI5BF,KAAK,CAACG,MAAM,CACdR,OAAO,CAACS,iBAAiB,eACzBL,MAAM,CAACM,GAAG,CAAC,aAAS;EAClB,MAAMC,aAAa,GAAG,OAAOR,gBAAgB,CAACA,gBAAgB;EAC9D,OAAOC,MAAM,CAACQ,UAAU,CAAC,WAAUC,OAAO;IACxC,MAAMC,MAAM,GAAG,OAAOR,UAAU,CAACS,OAAO,CAAC;MACvCC,IAAI,EAAEH,OAAO,CAACG,IAAI;MAClBC,IAAI,EAAEJ,OAAO,CAACI;KACf,CAAC;IACF,OAAO,OAAOf,SAAS,CAACgB,kBAAkB,CAACC,IAAI,CAC7Cf,MAAM,CAACgB,cAAc,CAACnB,MAAM,EAAEa,MAAM,CAAC,EACrCV,MAAM,CAACgB,cAAc,CAACjB,gBAAgB,CAACA,gBAAgB,EAAEQ,aAAa,CAAC,CACxE;EACH,CAAC,EAAEP,MAAM,CAACiB,KAAK,CAAC;AAClB,CAAC,CAAC,CACH","ignoreList":[]}
|
package/dist/esm/NodeSocket.js
CHANGED
|
@@ -26,6 +26,7 @@ export const makeNet = options => fromDuplex(Effect.acquireRelease(Effect.async(
|
|
|
26
26
|
resume(Effect.succeed(conn));
|
|
27
27
|
});
|
|
28
28
|
conn.on("error", cause => {
|
|
29
|
+
conn.removeAllListeners();
|
|
29
30
|
resume(Effect.fail(new Socket.SocketGenericError({
|
|
30
31
|
reason: "Open",
|
|
31
32
|
cause
|
|
@@ -53,7 +54,7 @@ export const fromDuplex = open => Effect.withFiberRuntime(fiber => {
|
|
|
53
54
|
let currentSocket;
|
|
54
55
|
const latch = Effect.unsafeMakeLatch(false);
|
|
55
56
|
const openContext = fiber.currentContext;
|
|
56
|
-
const run = handler => Effect.scopedWith(
|
|
57
|
+
const run = handler => Effect.scopedWith(Effect.fnUntraced(function* (scope) {
|
|
57
58
|
const fiberSet = yield* FiberSet.make().pipe(Scope.extend(scope));
|
|
58
59
|
const conn = yield* Scope.extend(open, scope);
|
|
59
60
|
const run = yield* Effect.provideService(FiberSet.runtime(fiberSet)(), NetSocket, conn);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeSocket.js","names":["Socket","Channel","Context","Deferred","Effect","FiberSet","Layer","Scope","Net","NetSocket","GenericTag","makeNet","options","fromDuplex","acquireRelease","async","resume","conn","createConnection","on","removeAllListeners","succeed","cause","fail","SocketGenericError","reason","sync","destroy","closed","destroySoon","open","withFiberRuntime","fiber","currentSocket","latch","unsafeMakeLatch","openContext","currentContext","run","handler","scopedWith","
|
|
1
|
+
{"version":3,"file":"NodeSocket.js","names":["Socket","Channel","Context","Deferred","Effect","FiberSet","Layer","Scope","Net","NetSocket","GenericTag","makeNet","options","fromDuplex","acquireRelease","async","resume","conn","createConnection","on","removeAllListeners","succeed","cause","fail","SocketGenericError","reason","sync","destroy","closed","destroySoon","open","withFiberRuntime","fiber","currentSocket","latch","unsafeMakeLatch","openContext","currentContext","run","handler","scopedWith","fnUntraced","scope","fiberSet","make","pipe","extend","provideService","runtime","onData","chunk","result","isEffect","onEnd","unsafeDone","deferred","void","onError","onClose","hadError","SocketCloseError","code","addFinalizer","off","join","mapInputContext","input","merge","ensuring","unsafeClose","undefined","interruptible","write","whenOpen","isCloseEvent","Error","writer","writableEnded","end","of","TypeId","runRaw","makeNetChannel","unwrapScoped","map","toChannelWith","layerNet","effect"],"sources":["../../src/NodeSocket.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Socket from "@effect/platform/Socket";
|
|
5
|
+
import * as SocketServer from "@effect/platform/SocketServer";
|
|
6
|
+
import * as Context from "effect/Context";
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import * as Exit from "effect/Exit";
|
|
9
|
+
import * as FiberRef from "effect/FiberRef";
|
|
10
|
+
import * as FiberSet from "effect/FiberSet";
|
|
11
|
+
import { pipe } from "effect/Function";
|
|
12
|
+
import * as Layer from "effect/Layer";
|
|
13
|
+
import * as Scope from "effect/Scope";
|
|
14
|
+
import * as Net from "node:net";
|
|
15
|
+
import * as WS from "ws";
|
|
16
|
+
import * as NodeSocket from "./NodeSocket.js";
|
|
17
|
+
/**
|
|
18
|
+
* @since 1.0.0
|
|
19
|
+
* @category tags
|
|
20
|
+
*/
|
|
21
|
+
export class IncomingMessage extends /*#__PURE__*/Context.Tag("@effect/platform-node-shared/NodeSocketServer/IncomingMessage")() {}
|
|
22
|
+
/**
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
* @category constructors
|
|
25
|
+
*/
|
|
26
|
+
export const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {
|
|
27
|
+
const server = yield* Effect.acquireRelease(Effect.sync(() => Net.createServer(options)), server => Effect.async(resume => {
|
|
28
|
+
server.close(() => resume(Effect.void));
|
|
29
|
+
}));
|
|
30
|
+
yield* Effect.async(resume => {
|
|
31
|
+
server.once("error", cause => {
|
|
32
|
+
resume(Effect.fail(new SocketServer.SocketServerError({
|
|
33
|
+
reason: "Open",
|
|
34
|
+
cause
|
|
35
|
+
})));
|
|
36
|
+
});
|
|
37
|
+
server.listen(options, () => {
|
|
38
|
+
resume(Effect.void);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
const run = Effect.fnUntraced(function* (handler) {
|
|
42
|
+
const scope = yield* Scope.make();
|
|
43
|
+
const fiberSet = yield* FiberSet.make().pipe(Scope.extend(scope));
|
|
44
|
+
const run = yield* FiberSet.runtime(fiberSet)();
|
|
45
|
+
function onConnection(conn) {
|
|
46
|
+
pipe(NodeSocket.fromDuplex(Effect.acquireRelease(Effect.succeed(conn), conn => Effect.sync(() => {
|
|
47
|
+
if (conn.closed === false) {
|
|
48
|
+
conn.destroySoon();
|
|
49
|
+
}
|
|
50
|
+
}))), Effect.flatMap(handler), Effect.catchAllCause(reportUnhandledError), Effect.provideService(NodeSocket.NetSocket, conn), run);
|
|
51
|
+
}
|
|
52
|
+
return yield* Effect.async(_resume => {
|
|
53
|
+
server.on("connection", onConnection);
|
|
54
|
+
return Effect.sync(() => {
|
|
55
|
+
server.off("connection", onConnection);
|
|
56
|
+
});
|
|
57
|
+
}).pipe(Effect.ensuring(Scope.close(scope, Exit.void)));
|
|
58
|
+
});
|
|
59
|
+
const address = server.address();
|
|
60
|
+
return SocketServer.SocketServer.of({
|
|
61
|
+
address: typeof address === "string" ? {
|
|
62
|
+
_tag: "UnixAddress",
|
|
63
|
+
path: address
|
|
64
|
+
} : {
|
|
65
|
+
_tag: "TcpAddress",
|
|
66
|
+
hostname: address.address,
|
|
67
|
+
port: address.port
|
|
68
|
+
},
|
|
69
|
+
run
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* @since 1.0.0
|
|
74
|
+
* @category layers
|
|
75
|
+
*/
|
|
76
|
+
export const layer = options => Layer.scoped(SocketServer.SocketServer, make(options));
|
|
77
|
+
/**
|
|
78
|
+
* @since 1.0.0
|
|
79
|
+
* @category constructors
|
|
80
|
+
*/
|
|
81
|
+
export const makeWebSocket = /*#__PURE__*/Effect.fnUntraced(function* (options) {
|
|
82
|
+
const server = yield* Effect.acquireRelease(Effect.sync(() => new WS.WebSocketServer(options)), server => Effect.async(resume => {
|
|
83
|
+
server.close(() => resume(Effect.void));
|
|
84
|
+
}));
|
|
85
|
+
yield* Effect.async(resume => {
|
|
86
|
+
server.once("error", error => {
|
|
87
|
+
resume(Effect.fail(new SocketServer.SocketServerError({
|
|
88
|
+
reason: "Open",
|
|
89
|
+
cause: error
|
|
90
|
+
})));
|
|
91
|
+
});
|
|
92
|
+
server.once("listening", () => {
|
|
93
|
+
resume(Effect.void);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
const run = Effect.fnUntraced(function* (handler) {
|
|
97
|
+
const scope = yield* Scope.make();
|
|
98
|
+
const fiberSet = yield* FiberSet.make().pipe(Scope.extend(scope));
|
|
99
|
+
const run = yield* FiberSet.runtime(fiberSet)();
|
|
100
|
+
function onConnection(conn, req) {
|
|
101
|
+
pipe(Socket.fromWebSocket(Effect.acquireRelease(Effect.succeed(conn), conn => Effect.sync(() => {
|
|
102
|
+
conn.close();
|
|
103
|
+
}))), Effect.flatMap(handler), Effect.catchAllCause(reportUnhandledError), Effect.provideService(Socket.WebSocket, conn), Effect.provideService(IncomingMessage, req), run);
|
|
104
|
+
}
|
|
105
|
+
return yield* Effect.async(_resume => {
|
|
106
|
+
server.on("connection", onConnection);
|
|
107
|
+
return Effect.sync(() => {
|
|
108
|
+
server.off("connection", onConnection);
|
|
109
|
+
});
|
|
110
|
+
}).pipe(Effect.ensuring(Scope.close(scope, Exit.void)));
|
|
111
|
+
});
|
|
112
|
+
const address = server.address();
|
|
113
|
+
return SocketServer.SocketServer.of({
|
|
114
|
+
address: typeof address === "string" ? {
|
|
115
|
+
_tag: "UnixAddress",
|
|
116
|
+
path: address
|
|
117
|
+
} : {
|
|
118
|
+
_tag: "TcpAddress",
|
|
119
|
+
hostname: address.address,
|
|
120
|
+
port: address.port
|
|
121
|
+
},
|
|
122
|
+
run
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
/**
|
|
126
|
+
* @since 1.0.0
|
|
127
|
+
* @category layers
|
|
128
|
+
*/
|
|
129
|
+
export const layerWebSocket = options => Layer.scoped(SocketServer.SocketServer, makeWebSocket(options));
|
|
130
|
+
const reportUnhandledError = cause => Effect.withFiberRuntime(fiber => {
|
|
131
|
+
const unhandledLogLevel = fiber.getFiberRef(FiberRef.unhandledErrorLogLevel);
|
|
132
|
+
if (unhandledLogLevel._tag === "Some") {
|
|
133
|
+
return Effect.logWithLevel(unhandledLogLevel.value, cause, "Unhandled error in SocketServer");
|
|
134
|
+
}
|
|
135
|
+
return Effect.void;
|
|
136
|
+
});
|
|
137
|
+
//# sourceMappingURL=NodeSocketServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeSocketServer.js","names":["Socket","SocketServer","Context","Effect","Exit","FiberRef","FiberSet","pipe","Layer","Scope","Net","WS","NodeSocket","IncomingMessage","Tag","make","fnUntraced","options","server","acquireRelease","sync","createServer","async","resume","close","void","once","cause","fail","SocketServerError","reason","listen","run","handler","scope","fiberSet","extend","runtime","onConnection","conn","fromDuplex","succeed","closed","destroySoon","flatMap","catchAllCause","reportUnhandledError","provideService","NetSocket","_resume","on","off","ensuring","address","of","_tag","path","hostname","port","layer","scoped","makeWebSocket","WebSocketServer","error","req","fromWebSocket","WebSocket","layerWebSocket","withFiberRuntime","fiber","unhandledLogLevel","getFiberRef","unhandledErrorLogLevel","logWithLevel","value"],"sources":["../../src/NodeSocketServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/platform-node-shared",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"description": "Unified interfaces for common platform-specific services",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -11,17 +11,36 @@
|
|
|
11
11
|
"sideEffects": [],
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@parcel/watcher": "^2.4.1",
|
|
14
|
-
"multipasta": "^0.2.5"
|
|
14
|
+
"multipasta": "^0.2.5",
|
|
15
|
+
"ws": "^8.18.0"
|
|
15
16
|
},
|
|
16
17
|
"peerDependencies": {
|
|
17
|
-
"@effect/
|
|
18
|
-
"effect": "^
|
|
18
|
+
"@effect/cluster": "^0.29.0",
|
|
19
|
+
"@effect/platform": "^0.80.0",
|
|
20
|
+
"@effect/rpc": "^0.55.0",
|
|
21
|
+
"@effect/sql": "^0.33.0",
|
|
22
|
+
"effect": "^3.14.0"
|
|
19
23
|
},
|
|
20
24
|
"publishConfig": {
|
|
21
25
|
"provenance": true
|
|
22
26
|
},
|
|
23
27
|
"exports": {
|
|
24
28
|
"./package.json": "./package.json",
|
|
29
|
+
"./NodeClusterRunnerSocket": {
|
|
30
|
+
"types": "./dist/dts/NodeClusterRunnerSocket.d.ts",
|
|
31
|
+
"import": "./dist/esm/NodeClusterRunnerSocket.js",
|
|
32
|
+
"default": "./dist/cjs/NodeClusterRunnerSocket.js"
|
|
33
|
+
},
|
|
34
|
+
"./NodeClusterShardManagerSocket": {
|
|
35
|
+
"types": "./dist/dts/NodeClusterShardManagerSocket.d.ts",
|
|
36
|
+
"import": "./dist/esm/NodeClusterShardManagerSocket.js",
|
|
37
|
+
"default": "./dist/cjs/NodeClusterShardManagerSocket.js"
|
|
38
|
+
},
|
|
39
|
+
"./NodeClusterSocketCommon": {
|
|
40
|
+
"types": "./dist/dts/NodeClusterSocketCommon.d.ts",
|
|
41
|
+
"import": "./dist/esm/NodeClusterSocketCommon.js",
|
|
42
|
+
"default": "./dist/cjs/NodeClusterSocketCommon.js"
|
|
43
|
+
},
|
|
25
44
|
"./NodeCommandExecutor": {
|
|
26
45
|
"types": "./dist/dts/NodeCommandExecutor.d.ts",
|
|
27
46
|
"import": "./dist/esm/NodeCommandExecutor.js",
|
|
@@ -67,6 +86,11 @@
|
|
|
67
86
|
"import": "./dist/esm/NodeSocket.js",
|
|
68
87
|
"default": "./dist/cjs/NodeSocket.js"
|
|
69
88
|
},
|
|
89
|
+
"./NodeSocketServer": {
|
|
90
|
+
"types": "./dist/dts/NodeSocketServer.d.ts",
|
|
91
|
+
"import": "./dist/esm/NodeSocketServer.js",
|
|
92
|
+
"default": "./dist/cjs/NodeSocketServer.js"
|
|
93
|
+
},
|
|
70
94
|
"./NodeStream": {
|
|
71
95
|
"types": "./dist/dts/NodeStream.d.ts",
|
|
72
96
|
"import": "./dist/esm/NodeStream.js",
|
|
@@ -80,6 +104,15 @@
|
|
|
80
104
|
},
|
|
81
105
|
"typesVersions": {
|
|
82
106
|
"*": {
|
|
107
|
+
"NodeClusterRunnerSocket": [
|
|
108
|
+
"./dist/dts/NodeClusterRunnerSocket.d.ts"
|
|
109
|
+
],
|
|
110
|
+
"NodeClusterShardManagerSocket": [
|
|
111
|
+
"./dist/dts/NodeClusterShardManagerSocket.d.ts"
|
|
112
|
+
],
|
|
113
|
+
"NodeClusterSocketCommon": [
|
|
114
|
+
"./dist/dts/NodeClusterSocketCommon.d.ts"
|
|
115
|
+
],
|
|
83
116
|
"NodeCommandExecutor": [
|
|
84
117
|
"./dist/dts/NodeCommandExecutor.d.ts"
|
|
85
118
|
],
|
|
@@ -107,6 +140,9 @@
|
|
|
107
140
|
"NodeSocket": [
|
|
108
141
|
"./dist/dts/NodeSocket.d.ts"
|
|
109
142
|
],
|
|
143
|
+
"NodeSocketServer": [
|
|
144
|
+
"./dist/dts/NodeSocketServer.d.ts"
|
|
145
|
+
],
|
|
110
146
|
"NodeStream": [
|
|
111
147
|
"./dist/dts/NodeStream.d.ts"
|
|
112
148
|
],
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as MessageStorage from "@effect/cluster/MessageStorage"
|
|
5
|
+
import type * as Runners from "@effect/cluster/Runners"
|
|
6
|
+
import type { Sharding } from "@effect/cluster/Sharding"
|
|
7
|
+
import * as ShardingConfig from "@effect/cluster/ShardingConfig"
|
|
8
|
+
import * as ShardStorage from "@effect/cluster/ShardStorage"
|
|
9
|
+
import * as SocketRunner from "@effect/cluster/SocketRunner"
|
|
10
|
+
import * as SqlMessageStorage from "@effect/cluster/SqlMessageStorage"
|
|
11
|
+
import * as SqlShardStorage from "@effect/cluster/SqlShardStorage"
|
|
12
|
+
import type * as SocketServer from "@effect/platform/SocketServer"
|
|
13
|
+
import * as RpcSerialization from "@effect/rpc/RpcSerialization"
|
|
14
|
+
import type { SqlClient } from "@effect/sql/SqlClient"
|
|
15
|
+
import type { SqlError } from "@effect/sql/SqlError"
|
|
16
|
+
import type { ConfigError } from "effect/ConfigError"
|
|
17
|
+
import * as Effect from "effect/Effect"
|
|
18
|
+
import * as Layer from "effect/Layer"
|
|
19
|
+
import * as Option from "effect/Option"
|
|
20
|
+
import { layerClientProtocol } from "./NodeClusterSocketCommon.js"
|
|
21
|
+
import * as NodeSocketServer from "./NodeSocketServer.js"
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
* @category Layers
|
|
26
|
+
*/
|
|
27
|
+
export const layerSocketServer: Layer.Layer<
|
|
28
|
+
SocketServer.SocketServer,
|
|
29
|
+
SocketServer.SocketServerError,
|
|
30
|
+
ShardingConfig.ShardingConfig
|
|
31
|
+
> = Effect.gen(function*() {
|
|
32
|
+
const config = yield* ShardingConfig.ShardingConfig
|
|
33
|
+
if (Option.isNone(config.runnerAddress)) {
|
|
34
|
+
return yield* Effect.dieMessage("layerSocketServer: ShardingConfig.runnerAddress is None")
|
|
35
|
+
}
|
|
36
|
+
return NodeSocketServer.layer(config.runnerAddress.value)
|
|
37
|
+
}).pipe(Layer.unwrapEffect)
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @since 1.0.0
|
|
41
|
+
* @category Layers
|
|
42
|
+
*/
|
|
43
|
+
export const layer = <const ClientOnly extends boolean = false, const Storage extends "noop" | "sql" = "noop">(
|
|
44
|
+
options?: {
|
|
45
|
+
readonly serialization?: "msgpack" | "ndjson" | undefined
|
|
46
|
+
readonly clientOnly?: ClientOnly | undefined
|
|
47
|
+
readonly storage?: Storage | undefined
|
|
48
|
+
readonly shardingConfig?: Partial<ShardingConfig.ShardingConfig["Type"]> | undefined
|
|
49
|
+
}
|
|
50
|
+
): ClientOnly extends true ? Layer.Layer<
|
|
51
|
+
Sharding | Runners.Runners,
|
|
52
|
+
ConfigError,
|
|
53
|
+
Storage extends "sql" ? SqlClient : never
|
|
54
|
+
> :
|
|
55
|
+
Layer.Layer<
|
|
56
|
+
Sharding | Runners.Runners,
|
|
57
|
+
SocketServer.SocketServerError | ConfigError | (Storage extends "sql" ? SqlError : never),
|
|
58
|
+
Storage extends "sql" ? SqlClient : never
|
|
59
|
+
> =>
|
|
60
|
+
{
|
|
61
|
+
const layer: Layer.Layer<any, any, any> = options?.clientOnly
|
|
62
|
+
// client only
|
|
63
|
+
? Layer.provide(SocketRunner.layerClientOnly, layerClientProtocol)
|
|
64
|
+
// with server
|
|
65
|
+
: Layer.provide(SocketRunner.layer, [layerSocketServer, layerClientProtocol])
|
|
66
|
+
|
|
67
|
+
return layer.pipe(
|
|
68
|
+
Layer.provide(
|
|
69
|
+
options?.storage === "sql"
|
|
70
|
+
? options.clientOnly ? [SqlMessageStorage.layer] : [SqlMessageStorage.layer, SqlShardStorage.layer]
|
|
71
|
+
: [MessageStorage.layerNoop, ShardStorage.layerNoop]
|
|
72
|
+
),
|
|
73
|
+
Layer.provide(ShardingConfig.layerFromEnv(options?.shardingConfig)),
|
|
74
|
+
Layer.provide(
|
|
75
|
+
options?.serialization === "ndjson" ? RpcSerialization.layerNdjson : RpcSerialization.layerMsgPack
|
|
76
|
+
)
|
|
77
|
+
) as any
|
|
78
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as RunnerHealth from "@effect/cluster/RunnerHealth"
|
|
5
|
+
import * as ShardingConfig from "@effect/cluster/ShardingConfig"
|
|
6
|
+
import * as ShardManager from "@effect/cluster/ShardManager"
|
|
7
|
+
import * as ShardStorage from "@effect/cluster/ShardStorage"
|
|
8
|
+
import * as SocketShardManager from "@effect/cluster/SocketShardManager"
|
|
9
|
+
import * as SqlShardStorage from "@effect/cluster/SqlShardStorage"
|
|
10
|
+
import type * as SocketServer from "@effect/platform/SocketServer"
|
|
11
|
+
import * as RpcSerialization from "@effect/rpc/RpcSerialization"
|
|
12
|
+
import type { SqlClient } from "@effect/sql/SqlClient"
|
|
13
|
+
import type { SqlError } from "@effect/sql/SqlError"
|
|
14
|
+
import type { ConfigError } from "effect/ConfigError"
|
|
15
|
+
import * as Effect from "effect/Effect"
|
|
16
|
+
import * as Layer from "effect/Layer"
|
|
17
|
+
import { layerClientProtocol } from "./NodeClusterSocketCommon.js"
|
|
18
|
+
import * as NodeSocketServer from "./NodeSocketServer.js"
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @since 1.0.0
|
|
22
|
+
* @category Layers
|
|
23
|
+
*/
|
|
24
|
+
export const layerSocketServer: Layer.Layer<
|
|
25
|
+
SocketServer.SocketServer,
|
|
26
|
+
SocketServer.SocketServerError,
|
|
27
|
+
ShardingConfig.ShardingConfig
|
|
28
|
+
> = Effect.gen(function*() {
|
|
29
|
+
const config = yield* ShardingConfig.ShardingConfig
|
|
30
|
+
return NodeSocketServer.layer(config.shardManagerAddress)
|
|
31
|
+
}).pipe(Layer.unwrapEffect)
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
* @category Layers
|
|
36
|
+
*/
|
|
37
|
+
export const layer = <const Storage extends "sql" | "noop" = "noop">(options?: {
|
|
38
|
+
readonly serialization?: "msgpack" | "ndjson" | undefined
|
|
39
|
+
readonly shardingConfig?: Partial<ShardingConfig.ShardingConfig["Type"]> | undefined
|
|
40
|
+
readonly storage?: Storage | undefined
|
|
41
|
+
}): Layer.Layer<
|
|
42
|
+
ShardManager.ShardManager,
|
|
43
|
+
SocketServer.SocketServerError | ConfigError | (Storage extends "sql" ? SqlError : never),
|
|
44
|
+
Storage extends "sql" ? SqlClient : never
|
|
45
|
+
> =>
|
|
46
|
+
SocketShardManager.layer.pipe(
|
|
47
|
+
Layer.provide([RunnerHealth.layerRpc, layerSocketServer, ShardManager.layerConfigFromEnv]),
|
|
48
|
+
Layer.provide(layerClientProtocol),
|
|
49
|
+
Layer.provide(options?.storage === "sql" ? SqlShardStorage.layer : ShardStorage.layerNoop),
|
|
50
|
+
Layer.provide([
|
|
51
|
+
options?.serialization === "ndjson" ? RpcSerialization.layerNdjson : RpcSerialization.layerMsgPack,
|
|
52
|
+
ShardingConfig.layerFromEnv(options?.shardingConfig)
|
|
53
|
+
])
|
|
54
|
+
) as any
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as Runners from "@effect/cluster/Runners"
|
|
5
|
+
import { Socket } from "@effect/platform/Socket"
|
|
6
|
+
import * as RpcClient from "@effect/rpc/RpcClient"
|
|
7
|
+
import * as RpcSerialization from "@effect/rpc/RpcSerialization"
|
|
8
|
+
import * as Effect from "effect/Effect"
|
|
9
|
+
import * as Layer from "effect/Layer"
|
|
10
|
+
import * as NodeSocket from "./NodeSocket.js"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
* @category Layers
|
|
15
|
+
*/
|
|
16
|
+
export const layerClientProtocol: Layer.Layer<
|
|
17
|
+
Runners.RpcClientProtocol,
|
|
18
|
+
never,
|
|
19
|
+
RpcSerialization.RpcSerialization
|
|
20
|
+
> = Layer.effect(
|
|
21
|
+
Runners.RpcClientProtocol,
|
|
22
|
+
Effect.gen(function*() {
|
|
23
|
+
const serialization = yield* RpcSerialization.RpcSerialization
|
|
24
|
+
return Effect.fnUntraced(function*(address) {
|
|
25
|
+
const socket = yield* NodeSocket.makeNet({
|
|
26
|
+
host: address.host,
|
|
27
|
+
port: address.port
|
|
28
|
+
})
|
|
29
|
+
return yield* RpcClient.makeProtocolSocket.pipe(
|
|
30
|
+
Effect.provideService(Socket, socket),
|
|
31
|
+
Effect.provideService(RpcSerialization.RpcSerialization, serialization)
|
|
32
|
+
)
|
|
33
|
+
}, Effect.orDie)
|
|
34
|
+
})
|
|
35
|
+
)
|
package/src/NodeSocket.ts
CHANGED
|
@@ -45,6 +45,7 @@ export const makeNet = (
|
|
|
45
45
|
resume(Effect.succeed(conn))
|
|
46
46
|
})
|
|
47
47
|
conn.on("error", (cause) => {
|
|
48
|
+
conn.removeAllListeners()
|
|
48
49
|
resume(Effect.fail(new Socket.SocketGenericError({ reason: "Open", cause })))
|
|
49
50
|
})
|
|
50
51
|
return Effect.sync(() => {
|
|
@@ -77,60 +78,58 @@ export const fromDuplex = <RO>(
|
|
|
77
78
|
const latch = Effect.unsafeMakeLatch(false)
|
|
78
79
|
const openContext = fiber.currentContext as Context.Context<RO>
|
|
79
80
|
const run = <R, E, _>(handler: (_: Uint8Array) => Effect.Effect<_, E, R> | void) =>
|
|
80
|
-
Effect.scopedWith((scope)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const run = yield* Effect.provideService(FiberSet.runtime(fiberSet)<R>(), NetSocket, conn as Net.Socket)
|
|
81
|
+
Effect.scopedWith(Effect.fnUntraced(function*(scope) {
|
|
82
|
+
const fiberSet = yield* FiberSet.make<any, E | Socket.SocketError>().pipe(
|
|
83
|
+
Scope.extend(scope)
|
|
84
|
+
)
|
|
85
|
+
const conn = yield* Scope.extend(open, scope)
|
|
86
|
+
const run = yield* Effect.provideService(FiberSet.runtime(fiberSet)<R>(), NetSocket, conn as Net.Socket)
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
function onEnd() {
|
|
95
|
-
Deferred.unsafeDone(fiberSet.deferred, Effect.void)
|
|
88
|
+
function onData(chunk: Uint8Array) {
|
|
89
|
+
const result = handler(chunk)
|
|
90
|
+
if (Effect.isEffect(result)) {
|
|
91
|
+
run(result)
|
|
96
92
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
}
|
|
94
|
+
function onEnd() {
|
|
95
|
+
Deferred.unsafeDone(fiberSet.deferred, Effect.void)
|
|
96
|
+
}
|
|
97
|
+
function onError(cause: Error) {
|
|
98
|
+
Deferred.unsafeDone(
|
|
99
|
+
fiberSet.deferred,
|
|
100
|
+
Effect.fail(new Socket.SocketGenericError({ reason: "Read", cause }))
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
function onClose(hadError: boolean) {
|
|
104
|
+
Deferred.unsafeDone(
|
|
105
|
+
fiberSet.deferred,
|
|
106
|
+
Effect.fail(
|
|
107
|
+
new Socket.SocketCloseError({
|
|
108
|
+
reason: "Close",
|
|
109
|
+
code: hadError ? 1006 : 1000
|
|
110
|
+
})
|
|
112
111
|
)
|
|
113
|
-
}
|
|
114
|
-
yield* Scope.addFinalizer(
|
|
115
|
-
scope,
|
|
116
|
-
Effect.sync(() => {
|
|
117
|
-
conn.off("data", onData)
|
|
118
|
-
conn.off("end", onEnd)
|
|
119
|
-
conn.off("error", onError)
|
|
120
|
-
conn.off("close", onClose)
|
|
121
|
-
})
|
|
122
112
|
)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
113
|
+
}
|
|
114
|
+
yield* Scope.addFinalizer(
|
|
115
|
+
scope,
|
|
116
|
+
Effect.sync(() => {
|
|
117
|
+
conn.off("data", onData)
|
|
118
|
+
conn.off("end", onEnd)
|
|
119
|
+
conn.off("error", onError)
|
|
120
|
+
conn.off("close", onClose)
|
|
121
|
+
})
|
|
122
|
+
)
|
|
123
|
+
conn.on("data", onData)
|
|
124
|
+
conn.on("end", onEnd)
|
|
125
|
+
conn.on("error", onError)
|
|
126
|
+
conn.on("close", onClose)
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
currentSocket = conn
|
|
129
|
+
yield* latch.open
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
).pipe(
|
|
131
|
+
return yield* FiberSet.join(fiberSet)
|
|
132
|
+
})).pipe(
|
|
134
133
|
Effect.mapInputContext((input: Context.Context<R>) => Context.merge(openContext, input)),
|
|
135
134
|
Effect.ensuring(Effect.sync(() => {
|
|
136
135
|
latch.unsafeClose()
|