@lsby/net-core 0.13.10 → 0.14.1
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/dist/cjs/global/model/hub.cjs +34 -26
- package/dist/cjs/global/model/hub.d.cts +26 -10
- package/dist/cjs/global/model/web-socket.cjs +23 -42
- package/dist/cjs/global/model/web-socket.d.cts +3 -5
- package/dist/cjs/global/web-socket.cjs +23 -42
- package/dist/cjs/help/help.cjs +23 -42
- package/dist/cjs/index.cjs +58 -45
- package/dist/cjs/index.d.cts +1 -1
- package/dist/cjs/interface/interface-logic.cjs +23 -42
- package/dist/cjs/plugin/web-socket.cjs +49 -29
- package/dist/cjs/plugin/web-socket.d.cts +5 -2
- package/dist/cjs/server/server.cjs +23 -42
- package/dist/esm/{chunk-MRTIZDKN.js → chunk-AFK5ATXH.js} +6 -17
- package/dist/esm/{chunk-AB35ZHL3.js → chunk-F3TAHAJB.js} +1 -1
- package/dist/esm/chunk-IONVNCYO.js +67 -0
- package/dist/esm/{chunk-MVMDWJTB.js → chunk-L37E7HVL.js} +1 -1
- package/dist/esm/{chunk-7GT72IUT.js → chunk-LGDSCDOJ.js} +19 -7
- package/dist/esm/{chunk-P23ZAK4I.js → chunk-MPNYB4TQ.js} +1 -1
- package/dist/esm/{chunk-TE6CG2FF.js → chunk-ON373JA4.js} +1 -1
- package/dist/esm/global/model/hub.d.ts +26 -10
- package/dist/esm/global/model/hub.js +3 -3
- package/dist/esm/global/model/web-socket.d.ts +3 -5
- package/dist/esm/global/model/web-socket.js +2 -2
- package/dist/esm/global/web-socket.js +3 -3
- package/dist/esm/help/help.js +4 -4
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +21 -16
- package/dist/esm/interface/interface-logic.js +5 -5
- package/dist/esm/plugin/web-socket.d.ts +5 -2
- package/dist/esm/plugin/web-socket.js +2 -2
- package/dist/esm/server/server.js +4 -4
- package/package.json +1 -1
- package/dist/esm/chunk-NTDDPUP7.js +0 -59
package/dist/cjs/index.cjs
CHANGED
|
@@ -55,6 +55,8 @@ __export(index_exports, {
|
|
|
55
55
|
\u865A\u62DF\u6587\u4EF6\u8FD4\u56DE\u5668: () => \u865A\u62DF\u6587\u4EF6\u8FD4\u56DE\u5668,
|
|
56
56
|
\u8C03\u8BD5\u8BF7\u6C42\u5934\u63D2\u4EF6: () => \u8C03\u8BD5\u8BF7\u6C42\u5934\u63D2\u4EF6,
|
|
57
57
|
\u8DEF\u5F84\u89E3\u6790\u63D2\u4EF6: () => \u8DEF\u5F84\u89E3\u6790\u63D2\u4EF6,
|
|
58
|
+
\u96C6\u7EBF\u5668\u6A21\u578B: () => \u96C6\u7EBF\u5668\u6A21\u578B,
|
|
59
|
+
\u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B: () => \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B,
|
|
58
60
|
\u9759\u6001\u6587\u4EF6\u8FD4\u56DE\u5668: () => \u9759\u6001\u6587\u4EF6\u8FD4\u56DE\u5668,
|
|
59
61
|
\u9ED8\u8BA4\u8BF7\u6C42\u9644\u52A0\u53C2\u6570: () => \u9ED8\u8BA4\u8BF7\u6C42\u9644\u52A0\u53C2\u6570
|
|
60
62
|
});
|
|
@@ -65,9 +67,20 @@ var import_ts_log = require("@lsby/ts-log");
|
|
|
65
67
|
var \u5168\u5C40\u65E5\u5FD7\u5355\u4F8B = new import_ts_log.Log("@lsby:net-core");
|
|
66
68
|
|
|
67
69
|
// src/global/model/hub.ts
|
|
68
|
-
var \u96C6\u7EBF\u5668\u76D1\u542C\u5668\
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
var \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B = class {
|
|
71
|
+
\u89E3\u9664\u56DE\u8C03 = null;
|
|
72
|
+
/** @internal */
|
|
73
|
+
\u7ED1\u5B9A\u56DE\u8C03(\u56DE\u8C03) {
|
|
74
|
+
if (this.\u89E3\u9664\u56DE\u8C03 !== null) {
|
|
75
|
+
throw new Error("\u6B64\u5BBF\u4E3B\u5DF2\u88AB\u7ED1\u5B9A\u5230\u4E00\u4E2A\u76D1\u542C\u5668\uFF0C\u4E0D\u53EF\u91CD\u590D\u7ED1\u5B9A");
|
|
76
|
+
}
|
|
77
|
+
this.\u89E3\u9664\u56DE\u8C03 = \u56DE\u8C03;
|
|
78
|
+
}
|
|
79
|
+
\u89E3\u7ED1() {
|
|
80
|
+
if (this.\u89E3\u9664\u56DE\u8C03 !== null) {
|
|
81
|
+
this.\u89E3\u9664\u56DE\u8C03();
|
|
82
|
+
this.\u89E3\u9664\u56DE\u8C03 = null;
|
|
83
|
+
}
|
|
71
84
|
}
|
|
72
85
|
};
|
|
73
86
|
var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
@@ -75,11 +88,9 @@ var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
|
75
88
|
static \u6E05\u7406\u6CE8\u518C\u5668 = new FinalizationRegistry(({ \u5B9E\u4F8B\u5F15\u7528, \u76D1\u542C\u5668 }) => {
|
|
76
89
|
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F15\u7528.deref();
|
|
77
90
|
if (\u5B9E\u4F8B === void 0) return;
|
|
78
|
-
|
|
79
|
-
if (\u7D22\u5F15 !== -1) \u5B9E\u4F8B.\u76D1\u542C\u5668\u5217\u8868.splice(\u7D22\u5F15, 1);
|
|
91
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
80
92
|
});
|
|
81
|
-
\u76D1\u542C\u5668\
|
|
82
|
-
\u6301\u6709\u8005\u6620\u5C04 = /* @__PURE__ */ new WeakMap();
|
|
93
|
+
\u76D1\u542C\u5668\u96C6\u5408 = /* @__PURE__ */ new Set();
|
|
83
94
|
\u9519\u8BEF\u5904\u7406\u5668 = null;
|
|
84
95
|
/**
|
|
85
96
|
* 设置广播错误时的处理器。
|
|
@@ -89,27 +100,26 @@ var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
|
89
100
|
}
|
|
90
101
|
/**
|
|
91
102
|
* 注册监听器。
|
|
92
|
-
*
|
|
93
|
-
*
|
|
103
|
+
* 必须提供一个 `集线器监听器宿主` 实例。若宿主对象不被持有并被回收,监听器会在未来自动回收。
|
|
104
|
+
*
|
|
105
|
+
* ⚠️ 危险警告: 即使在该方法的同一逻辑层面的词法作用域内,若未显式调用 `宿主.解绑` 或保留长期强引用使用痕迹,
|
|
106
|
+
* 那么随着控制权转交和可达性缩减,仍然存在被 V8 提前进行垃圾回收而突然导致监听失效的极大风险。
|
|
107
|
+
* 建议详细阅读 `集线器监听器宿主` 类的文档备注以此警醒。
|
|
94
108
|
*/
|
|
95
|
-
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668) {
|
|
96
|
-
this.\u76D1\u542C\u5668\u5217\u8868.push(\u76D1\u542C\u5668);
|
|
97
|
-
let \u6301\u6709\u8005 = new \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u6301\u6709\u8005(\u76D1\u542C\u5668);
|
|
98
|
-
this.\u6301\u6709\u8005\u6620\u5C04.set(\u6301\u6709\u8005, \u76D1\u542C\u5668);
|
|
109
|
+
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668, \u5BBF\u4E3B) {
|
|
99
110
|
let \u5B9E\u4F8B\u5F31\u5F15\u7528 = new WeakRef(this);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.
|
|
109
|
-
this.\u6301\u6709\u8005\u6620\u5C04.delete(\u6301\u6709\u8005);
|
|
111
|
+
\u5BBF\u4E3B.\u7ED1\u5B9A\u56DE\u8C03(() => {
|
|
112
|
+
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F31\u5F15\u7528.deref();
|
|
113
|
+
if (\u5B9E\u4F8B !== void 0) {
|
|
114
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
115
|
+
}
|
|
116
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.unregister(\u5BBF\u4E3B);
|
|
117
|
+
});
|
|
118
|
+
this.\u76D1\u542C\u5668\u96C6\u5408.add(\u76D1\u542C\u5668);
|
|
119
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.register(\u5BBF\u4E3B, { \u5B9E\u4F8B\u5F15\u7528: \u5B9E\u4F8B\u5F31\u5F15\u7528, \u76D1\u542C\u5668 }, \u5BBF\u4E3B);
|
|
110
120
|
}
|
|
111
121
|
async \u5E7F\u64AD(\u6570\u636E) {
|
|
112
|
-
let snapshot = [...this.\u76D1\u542C\u5668\
|
|
122
|
+
let snapshot = [...this.\u76D1\u542C\u5668\u96C6\u5408];
|
|
113
123
|
let \u7ED3\u679C = await Promise.allSettled(snapshot.map((l) => l(\u6570\u636E)));
|
|
114
124
|
for (let [\u7D22\u5F15, \u7ED3\u679C\u9879] of \u7ED3\u679C.entries()) {
|
|
115
125
|
if (\u7ED3\u679C\u9879.status === "rejected" && this.\u9519\u8BEF\u5904\u7406\u5668 !== null) {
|
|
@@ -124,8 +134,6 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
124
134
|
log = \u5168\u5C40\u65E5\u5FD7\u5355\u4F8B.extend("WebSocket\u7BA1\u7406\u5668");
|
|
125
135
|
\u8FDE\u63A5\u8868 = {};
|
|
126
136
|
\u6D88\u606F\u76D1\u542C\u8868 = {};
|
|
127
|
-
\u8FDE\u63A5\u6E05\u7406\u6A21\u578B = new \u96C6\u7EBF\u5668\u6A21\u578B();
|
|
128
|
-
\u8FDE\u63A5\u6301\u6709\u8005\u8868 = {};
|
|
129
137
|
\u6E05\u7406\u51FD\u6570\u8868 = {};
|
|
130
138
|
\u589E\u52A0\u8FDE\u63A5(id, ws\u53E5\u67C4) {
|
|
131
139
|
if (id in this.\u8FDE\u63A5\u8868) this.\u5220\u9664\u8FDE\u63A5(id);
|
|
@@ -138,15 +146,11 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
138
146
|
this.\u6D88\u606F\u76D1\u542C\u8868[id] = \u6A21\u578B;
|
|
139
147
|
}
|
|
140
148
|
this.\u6CE8\u518Conmessage(id, ws\u53E5\u67C4);
|
|
141
|
-
let \u6301\u6709\u8005 = this.\u8FDE\u63A5\u6E05\u7406\u6A21\u578B.\u6DFB\u52A0\u76D1\u542C\u5668(async () => {
|
|
142
|
-
if (id in this.\u8FDE\u63A5\u8868) this.\u5220\u9664\u8FDE\u63A5(id);
|
|
143
|
-
});
|
|
144
|
-
this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id] = \u6301\u6709\u8005;
|
|
145
|
-
return \u6301\u6709\u8005;
|
|
146
149
|
}
|
|
147
150
|
\u5220\u9664\u8FDE\u63A5(id) {
|
|
148
151
|
let ws = this.\u8FDE\u63A5\u8868[id];
|
|
149
|
-
if (ws
|
|
152
|
+
if (ws === void 0) return;
|
|
153
|
+
if (ws !== null) {
|
|
150
154
|
ws.onmessage = null;
|
|
151
155
|
ws.once("error", (err) => void this.log.error(`WebSocket \u5F02\u6B65\u9519\u8BEF, id: ${id}, \u9519\u8BEF: ${err}`));
|
|
152
156
|
ws.once(
|
|
@@ -164,11 +168,6 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
164
168
|
delete this.\u8FDE\u63A5\u8868[id];
|
|
165
169
|
delete this.\u6E05\u7406\u51FD\u6570\u8868[id];
|
|
166
170
|
delete this.\u6D88\u606F\u76D1\u542C\u8868[id];
|
|
167
|
-
let \u6301\u6709\u8005 = this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id];
|
|
168
|
-
if (\u6301\u6709\u8005 !== void 0) {
|
|
169
|
-
this.\u8FDE\u63A5\u6E05\u7406\u6A21\u578B.\u79FB\u9664\u76D1\u542C\u5668(\u6301\u6709\u8005);
|
|
170
|
-
delete this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id];
|
|
171
|
-
}
|
|
172
171
|
}
|
|
173
172
|
\u6CE8\u518Conmessage(id, ws\u53E5\u67C4) {
|
|
174
173
|
ws\u53E5\u67C4.onmessage = async (event) => {
|
|
@@ -190,10 +189,10 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
190
189
|
async \u8BBE\u7F6E\u6E05\u7406\u51FD\u6570(id, \u6E05\u7406\u51FD\u6570) {
|
|
191
190
|
if (id in this.\u8FDE\u63A5\u8868) this.\u6E05\u7406\u51FD\u6570\u8868[id] = \u6E05\u7406\u51FD\u6570;
|
|
192
191
|
}
|
|
193
|
-
\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(id, \u56DE\u8C03\u51FD\u6570) {
|
|
192
|
+
\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(id, \u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B) {
|
|
194
193
|
let \u6A21\u578B = this.\u6D88\u606F\u76D1\u542C\u8868[id];
|
|
195
|
-
if (\u6A21\u578B === void 0) return
|
|
196
|
-
|
|
194
|
+
if (\u6A21\u578B === void 0) return;
|
|
195
|
+
\u6A21\u578B.\u6DFB\u52A0\u76D1\u542C\u5668(\u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B);
|
|
197
196
|
}
|
|
198
197
|
};
|
|
199
198
|
|
|
@@ -647,8 +646,8 @@ var WebSocket\u63D2\u4EF6 = class _WebSocket\u63D2\u4EF6 extends \u63D2\u4EF6 {
|
|
|
647
646
|
ws\u64CD\u4F5C: import_zod8.z.object({
|
|
648
647
|
\u53D1\u9001ws\u4FE1\u606F: import_zod8.z.function(import_zod8.z.tuple([\u540E\u63A8\u524D\u4FE1\u606F\u63CF\u8FF0]), import_zod8.z.promise(import_zod8.z.void())),
|
|
649
648
|
\u76D1\u542Cws\u4FE1\u606F: import_zod8.z.function(
|
|
650
|
-
import_zod8.z.tuple([import_zod8.z.function(import_zod8.z.tuple([\u524D\u63A8\u540E\u4FE1\u606F\u63CF\u8FF0]), import_zod8.z.promise(import_zod8.z.void()))]),
|
|
651
|
-
import_zod8.z.promise(import_zod8.z.
|
|
649
|
+
import_zod8.z.tuple([import_zod8.z.function(import_zod8.z.tuple([\u524D\u63A8\u540E\u4FE1\u606F\u63CF\u8FF0]), import_zod8.z.promise(import_zod8.z.void())), import_zod8.z.instanceof(\u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B)]),
|
|
650
|
+
import_zod8.z.promise(import_zod8.z.void())
|
|
652
651
|
),
|
|
653
652
|
\u5173\u95EDws\u8FDE\u63A5: import_zod8.z.function(import_zod8.z.tuple([]), import_zod8.z.promise(import_zod8.z.void())),
|
|
654
653
|
\u8BBE\u7F6E\u6E05\u7406\u51FD\u6570: import_zod8.z.function(import_zod8.z.tuple([import_zod8.z.function(import_zod8.z.tuple([]), import_zod8.z.promise(import_zod8.z.void()))]), import_zod8.z.promise(import_zod8.z.void()))
|
|
@@ -697,16 +696,28 @@ var WebSocket\u63D2\u4EF6 = class _WebSocket\u63D2\u4EF6 extends \u63D2\u4EF6 {
|
|
|
697
696
|
await log.debug("\u8BBE\u7F6E WebSocket \u6E05\u7406\u51FD\u6570", { wsId });
|
|
698
697
|
await WebSocket\u7BA1\u7406\u56682.\u8BBE\u7F6E\u6E05\u7406\u51FD\u6570(wsId, \u6E05\u7406\u51FD\u6570);
|
|
699
698
|
},
|
|
700
|
-
async \u76D1\u542Cws\u4FE1\u606F(\u56DE\u8C03\u51FD\u6570) {
|
|
699
|
+
async \u76D1\u542Cws\u4FE1\u606F(\u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B) {
|
|
701
700
|
if (ws\u53E5\u67C4 === null) {
|
|
702
701
|
ws\u53E5\u67C4 = await WebSocket\u7BA1\u7406\u56682.\u83B7\u5F97ws\u53E5\u67C4(wsId);
|
|
703
702
|
}
|
|
704
703
|
if (ws\u53E5\u67C4 === null) {
|
|
705
704
|
await log.error("\u672A\u80FD\u83B7\u53D6\u5230\u6709\u6548\u7684 WebSocket \u53E5\u67C4");
|
|
706
|
-
return
|
|
705
|
+
return;
|
|
706
|
+
}
|
|
707
|
+
let \u79C1\u6709\u5C5E\u6027\u53E5\u67C4 = ws\u53E5\u67C4;
|
|
708
|
+
let \u5173\u8054\u5BBF\u4E3B\u96C6\u5408 = \u79C1\u6709\u5C5E\u6027\u53E5\u67C4.__hosts;
|
|
709
|
+
if (\u5173\u8054\u5BBF\u4E3B\u96C6\u5408 === void 0) {
|
|
710
|
+
\u5173\u8054\u5BBF\u4E3B\u96C6\u5408 = /* @__PURE__ */ new Set();
|
|
711
|
+
\u79C1\u6709\u5C5E\u6027\u53E5\u67C4.__hosts = \u5173\u8054\u5BBF\u4E3B\u96C6\u5408;
|
|
707
712
|
}
|
|
713
|
+
\u5173\u8054\u5BBF\u4E3B\u96C6\u5408.add(\u5BBF\u4E3B);
|
|
714
|
+
let \u539F\u59CB\u89E3\u7ED1 = \u5BBF\u4E3B.\u89E3\u7ED1.bind(\u5BBF\u4E3B);
|
|
715
|
+
\u5BBF\u4E3B.\u89E3\u7ED1 = () => {
|
|
716
|
+
\u539F\u59CB\u89E3\u7ED1();
|
|
717
|
+
\u5173\u8054\u5BBF\u4E3B\u96C6\u5408.delete(\u5BBF\u4E3B);
|
|
718
|
+
};
|
|
708
719
|
await log.debug("\u6CE8\u518C WebSocket \u6D88\u606F\u76D1\u542C", { wsId });
|
|
709
|
-
|
|
720
|
+
WebSocket\u7BA1\u7406\u56682.\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(wsId, \u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B);
|
|
710
721
|
}
|
|
711
722
|
}
|
|
712
723
|
});
|
|
@@ -1121,6 +1132,8 @@ var EXPORT_TYPE = /* @__PURE__ */ Symbol();
|
|
|
1121
1132
|
\u865A\u62DF\u6587\u4EF6\u8FD4\u56DE\u5668,
|
|
1122
1133
|
\u8C03\u8BD5\u8BF7\u6C42\u5934\u63D2\u4EF6,
|
|
1123
1134
|
\u8DEF\u5F84\u89E3\u6790\u63D2\u4EF6,
|
|
1135
|
+
\u96C6\u7EBF\u5668\u6A21\u578B,
|
|
1136
|
+
\u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B,
|
|
1124
1137
|
\u9759\u6001\u6587\u4EF6\u8FD4\u56DE\u5668,
|
|
1125
1138
|
\u9ED8\u8BA4\u8BF7\u6C42\u9644\u52A0\u53C2\u6570
|
|
1126
1139
|
});
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { 严格递归合并对象, 普通对象深合并, 构造元组, 构造对象, 默认请求附加参数 } from './help/help.cjs';
|
|
2
|
+
export { 广播错误处理, 集线器模型, 集线器监听器, 集线器监听器宿主 } from './global/model/hub.cjs';
|
|
2
3
|
export { 任意接口, 接口, 接口方法类型, 接口路径类型, 获得接口方法类型, 获得接口路径类型, 获得接口返回器类型, 获得接口逻辑类型 } from './interface/interface-base.cjs';
|
|
3
4
|
export { 任意接口逻辑, 接口逻辑, 接口逻辑Base, 接口逻辑正确类型, 接口逻辑错误类型, 接口逻辑附加参数类型, 清理函数类型, 获得接口逻辑上游接口类型, 获得接口逻辑插件类型, 获得接口逻辑最后接口类型, 获得接口逻辑正确类型, 获得接口逻辑错误类型, 获得接口逻辑附加参数类型, 计算接口逻辑参数, 计算接口逻辑正确结果, 计算接口逻辑错误结果 } from './interface/interface-logic.cjs';
|
|
4
5
|
export { 任意插件, 取插件正确ts类型, 取插件错误ts类型, 合并插件正确结果, 插件 } from './interface/interface-plugin.cjs';
|
|
@@ -27,7 +28,6 @@ import 'express';
|
|
|
27
28
|
import './help/interior.cjs';
|
|
28
29
|
import 'zod';
|
|
29
30
|
import 'multer';
|
|
30
|
-
import './global/model/hub.cjs';
|
|
31
31
|
import 'node:stream';
|
|
32
32
|
import 'node:http';
|
|
33
33
|
import '@lsby/ts-log';
|
|
@@ -31,21 +31,14 @@ var import_ts_log = require("@lsby/ts-log");
|
|
|
31
31
|
var \u5168\u5C40\u65E5\u5FD7\u5355\u4F8B = new import_ts_log.Log("@lsby:net-core");
|
|
32
32
|
|
|
33
33
|
// src/global/model/hub.ts
|
|
34
|
-
var \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u6301\u6709\u8005 = class {
|
|
35
|
-
constructor(\u76D1\u542C\u5668) {
|
|
36
|
-
this.\u76D1\u542C\u5668 = \u76D1\u542C\u5668;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
34
|
var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
40
35
|
// 使用 WeakRef + FinalizationRegistry 防止"反向持有" this
|
|
41
36
|
static \u6E05\u7406\u6CE8\u518C\u5668 = new FinalizationRegistry(({ \u5B9E\u4F8B\u5F15\u7528, \u76D1\u542C\u5668 }) => {
|
|
42
37
|
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F15\u7528.deref();
|
|
43
38
|
if (\u5B9E\u4F8B === void 0) return;
|
|
44
|
-
|
|
45
|
-
if (\u7D22\u5F15 !== -1) \u5B9E\u4F8B.\u76D1\u542C\u5668\u5217\u8868.splice(\u7D22\u5F15, 1);
|
|
39
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
46
40
|
});
|
|
47
|
-
\u76D1\u542C\u5668\
|
|
48
|
-
\u6301\u6709\u8005\u6620\u5C04 = /* @__PURE__ */ new WeakMap();
|
|
41
|
+
\u76D1\u542C\u5668\u96C6\u5408 = /* @__PURE__ */ new Set();
|
|
49
42
|
\u9519\u8BEF\u5904\u7406\u5668 = null;
|
|
50
43
|
/**
|
|
51
44
|
* 设置广播错误时的处理器。
|
|
@@ -55,27 +48,26 @@ var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
|
55
48
|
}
|
|
56
49
|
/**
|
|
57
50
|
* 注册监听器。
|
|
58
|
-
*
|
|
59
|
-
*
|
|
51
|
+
* 必须提供一个 `集线器监听器宿主` 实例。若宿主对象不被持有并被回收,监听器会在未来自动回收。
|
|
52
|
+
*
|
|
53
|
+
* ⚠️ 危险警告: 即使在该方法的同一逻辑层面的词法作用域内,若未显式调用 `宿主.解绑` 或保留长期强引用使用痕迹,
|
|
54
|
+
* 那么随着控制权转交和可达性缩减,仍然存在被 V8 提前进行垃圾回收而突然导致监听失效的极大风险。
|
|
55
|
+
* 建议详细阅读 `集线器监听器宿主` 类的文档备注以此警醒。
|
|
60
56
|
*/
|
|
61
|
-
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668) {
|
|
62
|
-
this.\u76D1\u542C\u5668\u5217\u8868.push(\u76D1\u542C\u5668);
|
|
63
|
-
let \u6301\u6709\u8005 = new \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u6301\u6709\u8005(\u76D1\u542C\u5668);
|
|
64
|
-
this.\u6301\u6709\u8005\u6620\u5C04.set(\u6301\u6709\u8005, \u76D1\u542C\u5668);
|
|
57
|
+
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668, \u5BBF\u4E3B) {
|
|
65
58
|
let \u5B9E\u4F8B\u5F31\u5F15\u7528 = new WeakRef(this);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.
|
|
75
|
-
this.\u6301\u6709\u8005\u6620\u5C04.delete(\u6301\u6709\u8005);
|
|
59
|
+
\u5BBF\u4E3B.\u7ED1\u5B9A\u56DE\u8C03(() => {
|
|
60
|
+
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F31\u5F15\u7528.deref();
|
|
61
|
+
if (\u5B9E\u4F8B !== void 0) {
|
|
62
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
63
|
+
}
|
|
64
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.unregister(\u5BBF\u4E3B);
|
|
65
|
+
});
|
|
66
|
+
this.\u76D1\u542C\u5668\u96C6\u5408.add(\u76D1\u542C\u5668);
|
|
67
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.register(\u5BBF\u4E3B, { \u5B9E\u4F8B\u5F15\u7528: \u5B9E\u4F8B\u5F31\u5F15\u7528, \u76D1\u542C\u5668 }, \u5BBF\u4E3B);
|
|
76
68
|
}
|
|
77
69
|
async \u5E7F\u64AD(\u6570\u636E) {
|
|
78
|
-
let snapshot = [...this.\u76D1\u542C\u5668\
|
|
70
|
+
let snapshot = [...this.\u76D1\u542C\u5668\u96C6\u5408];
|
|
79
71
|
let \u7ED3\u679C = await Promise.allSettled(snapshot.map((l) => l(\u6570\u636E)));
|
|
80
72
|
for (let [\u7D22\u5F15, \u7ED3\u679C\u9879] of \u7ED3\u679C.entries()) {
|
|
81
73
|
if (\u7ED3\u679C\u9879.status === "rejected" && this.\u9519\u8BEF\u5904\u7406\u5668 !== null) {
|
|
@@ -90,8 +82,6 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
90
82
|
log = \u5168\u5C40\u65E5\u5FD7\u5355\u4F8B.extend("WebSocket\u7BA1\u7406\u5668");
|
|
91
83
|
\u8FDE\u63A5\u8868 = {};
|
|
92
84
|
\u6D88\u606F\u76D1\u542C\u8868 = {};
|
|
93
|
-
\u8FDE\u63A5\u6E05\u7406\u6A21\u578B = new \u96C6\u7EBF\u5668\u6A21\u578B();
|
|
94
|
-
\u8FDE\u63A5\u6301\u6709\u8005\u8868 = {};
|
|
95
85
|
\u6E05\u7406\u51FD\u6570\u8868 = {};
|
|
96
86
|
\u589E\u52A0\u8FDE\u63A5(id, ws\u53E5\u67C4) {
|
|
97
87
|
if (id in this.\u8FDE\u63A5\u8868) this.\u5220\u9664\u8FDE\u63A5(id);
|
|
@@ -104,15 +94,11 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
104
94
|
this.\u6D88\u606F\u76D1\u542C\u8868[id] = \u6A21\u578B;
|
|
105
95
|
}
|
|
106
96
|
this.\u6CE8\u518Conmessage(id, ws\u53E5\u67C4);
|
|
107
|
-
let \u6301\u6709\u8005 = this.\u8FDE\u63A5\u6E05\u7406\u6A21\u578B.\u6DFB\u52A0\u76D1\u542C\u5668(async () => {
|
|
108
|
-
if (id in this.\u8FDE\u63A5\u8868) this.\u5220\u9664\u8FDE\u63A5(id);
|
|
109
|
-
});
|
|
110
|
-
this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id] = \u6301\u6709\u8005;
|
|
111
|
-
return \u6301\u6709\u8005;
|
|
112
97
|
}
|
|
113
98
|
\u5220\u9664\u8FDE\u63A5(id) {
|
|
114
99
|
let ws = this.\u8FDE\u63A5\u8868[id];
|
|
115
|
-
if (ws
|
|
100
|
+
if (ws === void 0) return;
|
|
101
|
+
if (ws !== null) {
|
|
116
102
|
ws.onmessage = null;
|
|
117
103
|
ws.once("error", (err) => void this.log.error(`WebSocket \u5F02\u6B65\u9519\u8BEF, id: ${id}, \u9519\u8BEF: ${err}`));
|
|
118
104
|
ws.once(
|
|
@@ -130,11 +116,6 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
130
116
|
delete this.\u8FDE\u63A5\u8868[id];
|
|
131
117
|
delete this.\u6E05\u7406\u51FD\u6570\u8868[id];
|
|
132
118
|
delete this.\u6D88\u606F\u76D1\u542C\u8868[id];
|
|
133
|
-
let \u6301\u6709\u8005 = this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id];
|
|
134
|
-
if (\u6301\u6709\u8005 !== void 0) {
|
|
135
|
-
this.\u8FDE\u63A5\u6E05\u7406\u6A21\u578B.\u79FB\u9664\u76D1\u542C\u5668(\u6301\u6709\u8005);
|
|
136
|
-
delete this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id];
|
|
137
|
-
}
|
|
138
119
|
}
|
|
139
120
|
\u6CE8\u518Conmessage(id, ws\u53E5\u67C4) {
|
|
140
121
|
ws\u53E5\u67C4.onmessage = async (event) => {
|
|
@@ -156,10 +137,10 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
156
137
|
async \u8BBE\u7F6E\u6E05\u7406\u51FD\u6570(id, \u6E05\u7406\u51FD\u6570) {
|
|
157
138
|
if (id in this.\u8FDE\u63A5\u8868) this.\u6E05\u7406\u51FD\u6570\u8868[id] = \u6E05\u7406\u51FD\u6570;
|
|
158
139
|
}
|
|
159
|
-
\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(id, \u56DE\u8C03\u51FD\u6570) {
|
|
140
|
+
\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(id, \u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B) {
|
|
160
141
|
let \u6A21\u578B = this.\u6D88\u606F\u76D1\u542C\u8868[id];
|
|
161
|
-
if (\u6A21\u578B === void 0) return
|
|
162
|
-
|
|
142
|
+
if (\u6A21\u578B === void 0) return;
|
|
143
|
+
\u6A21\u578B.\u6DFB\u52A0\u76D1\u542C\u5668(\u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B);
|
|
163
144
|
}
|
|
164
145
|
};
|
|
165
146
|
|
|
@@ -28,9 +28,20 @@ var import_ws = require("ws");
|
|
|
28
28
|
var import_zod = require("zod");
|
|
29
29
|
|
|
30
30
|
// src/global/model/hub.ts
|
|
31
|
-
var \u96C6\u7EBF\u5668\u76D1\u542C\u5668\
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
var \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B = class {
|
|
32
|
+
\u89E3\u9664\u56DE\u8C03 = null;
|
|
33
|
+
/** @internal */
|
|
34
|
+
\u7ED1\u5B9A\u56DE\u8C03(\u56DE\u8C03) {
|
|
35
|
+
if (this.\u89E3\u9664\u56DE\u8C03 !== null) {
|
|
36
|
+
throw new Error("\u6B64\u5BBF\u4E3B\u5DF2\u88AB\u7ED1\u5B9A\u5230\u4E00\u4E2A\u76D1\u542C\u5668\uFF0C\u4E0D\u53EF\u91CD\u590D\u7ED1\u5B9A");
|
|
37
|
+
}
|
|
38
|
+
this.\u89E3\u9664\u56DE\u8C03 = \u56DE\u8C03;
|
|
39
|
+
}
|
|
40
|
+
\u89E3\u7ED1() {
|
|
41
|
+
if (this.\u89E3\u9664\u56DE\u8C03 !== null) {
|
|
42
|
+
this.\u89E3\u9664\u56DE\u8C03();
|
|
43
|
+
this.\u89E3\u9664\u56DE\u8C03 = null;
|
|
44
|
+
}
|
|
34
45
|
}
|
|
35
46
|
};
|
|
36
47
|
var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
@@ -38,11 +49,9 @@ var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
|
38
49
|
static \u6E05\u7406\u6CE8\u518C\u5668 = new FinalizationRegistry(({ \u5B9E\u4F8B\u5F15\u7528, \u76D1\u542C\u5668 }) => {
|
|
39
50
|
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F15\u7528.deref();
|
|
40
51
|
if (\u5B9E\u4F8B === void 0) return;
|
|
41
|
-
|
|
42
|
-
if (\u7D22\u5F15 !== -1) \u5B9E\u4F8B.\u76D1\u542C\u5668\u5217\u8868.splice(\u7D22\u5F15, 1);
|
|
52
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
43
53
|
});
|
|
44
|
-
\u76D1\u542C\u5668\
|
|
45
|
-
\u6301\u6709\u8005\u6620\u5C04 = /* @__PURE__ */ new WeakMap();
|
|
54
|
+
\u76D1\u542C\u5668\u96C6\u5408 = /* @__PURE__ */ new Set();
|
|
46
55
|
\u9519\u8BEF\u5904\u7406\u5668 = null;
|
|
47
56
|
/**
|
|
48
57
|
* 设置广播错误时的处理器。
|
|
@@ -52,27 +61,26 @@ var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
|
52
61
|
}
|
|
53
62
|
/**
|
|
54
63
|
* 注册监听器。
|
|
55
|
-
*
|
|
56
|
-
*
|
|
64
|
+
* 必须提供一个 `集线器监听器宿主` 实例。若宿主对象不被持有并被回收,监听器会在未来自动回收。
|
|
65
|
+
*
|
|
66
|
+
* ⚠️ 危险警告: 即使在该方法的同一逻辑层面的词法作用域内,若未显式调用 `宿主.解绑` 或保留长期强引用使用痕迹,
|
|
67
|
+
* 那么随着控制权转交和可达性缩减,仍然存在被 V8 提前进行垃圾回收而突然导致监听失效的极大风险。
|
|
68
|
+
* 建议详细阅读 `集线器监听器宿主` 类的文档备注以此警醒。
|
|
57
69
|
*/
|
|
58
|
-
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668) {
|
|
59
|
-
this.\u76D1\u542C\u5668\u5217\u8868.push(\u76D1\u542C\u5668);
|
|
60
|
-
let \u6301\u6709\u8005 = new \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u6301\u6709\u8005(\u76D1\u542C\u5668);
|
|
61
|
-
this.\u6301\u6709\u8005\u6620\u5C04.set(\u6301\u6709\u8005, \u76D1\u542C\u5668);
|
|
70
|
+
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668, \u5BBF\u4E3B) {
|
|
62
71
|
let \u5B9E\u4F8B\u5F31\u5F15\u7528 = new WeakRef(this);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.
|
|
72
|
-
this.\u6301\u6709\u8005\u6620\u5C04.delete(\u6301\u6709\u8005);
|
|
72
|
+
\u5BBF\u4E3B.\u7ED1\u5B9A\u56DE\u8C03(() => {
|
|
73
|
+
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F31\u5F15\u7528.deref();
|
|
74
|
+
if (\u5B9E\u4F8B !== void 0) {
|
|
75
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
76
|
+
}
|
|
77
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.unregister(\u5BBF\u4E3B);
|
|
78
|
+
});
|
|
79
|
+
this.\u76D1\u542C\u5668\u96C6\u5408.add(\u76D1\u542C\u5668);
|
|
80
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.register(\u5BBF\u4E3B, { \u5B9E\u4F8B\u5F15\u7528: \u5B9E\u4F8B\u5F31\u5F15\u7528, \u76D1\u542C\u5668 }, \u5BBF\u4E3B);
|
|
73
81
|
}
|
|
74
82
|
async \u5E7F\u64AD(\u6570\u636E) {
|
|
75
|
-
let snapshot = [...this.\u76D1\u542C\u5668\
|
|
83
|
+
let snapshot = [...this.\u76D1\u542C\u5668\u96C6\u5408];
|
|
76
84
|
let \u7ED3\u679C = await Promise.allSettled(snapshot.map((l) => l(\u6570\u636E)));
|
|
77
85
|
for (let [\u7D22\u5F15, \u7ED3\u679C\u9879] of \u7ED3\u679C.entries()) {
|
|
78
86
|
if (\u7ED3\u679C\u9879.status === "rejected" && this.\u9519\u8BEF\u5904\u7406\u5668 !== null) {
|
|
@@ -110,8 +118,8 @@ var WebSocket\u63D2\u4EF6 = class _WebSocket\u63D2\u4EF6 extends \u63D2\u4EF6 {
|
|
|
110
118
|
ws\u64CD\u4F5C: import_zod.z.object({
|
|
111
119
|
\u53D1\u9001ws\u4FE1\u606F: import_zod.z.function(import_zod.z.tuple([\u540E\u63A8\u524D\u4FE1\u606F\u63CF\u8FF0]), import_zod.z.promise(import_zod.z.void())),
|
|
112
120
|
\u76D1\u542Cws\u4FE1\u606F: import_zod.z.function(
|
|
113
|
-
import_zod.z.tuple([import_zod.z.function(import_zod.z.tuple([\u524D\u63A8\u540E\u4FE1\u606F\u63CF\u8FF0]), import_zod.z.promise(import_zod.z.void()))]),
|
|
114
|
-
import_zod.z.promise(import_zod.z.
|
|
121
|
+
import_zod.z.tuple([import_zod.z.function(import_zod.z.tuple([\u524D\u63A8\u540E\u4FE1\u606F\u63CF\u8FF0]), import_zod.z.promise(import_zod.z.void())), import_zod.z.instanceof(\u96C6\u7EBF\u5668\u76D1\u542C\u5668\u5BBF\u4E3B)]),
|
|
122
|
+
import_zod.z.promise(import_zod.z.void())
|
|
115
123
|
),
|
|
116
124
|
\u5173\u95EDws\u8FDE\u63A5: import_zod.z.function(import_zod.z.tuple([]), import_zod.z.promise(import_zod.z.void())),
|
|
117
125
|
\u8BBE\u7F6E\u6E05\u7406\u51FD\u6570: import_zod.z.function(import_zod.z.tuple([import_zod.z.function(import_zod.z.tuple([]), import_zod.z.promise(import_zod.z.void()))]), import_zod.z.promise(import_zod.z.void()))
|
|
@@ -160,16 +168,28 @@ var WebSocket\u63D2\u4EF6 = class _WebSocket\u63D2\u4EF6 extends \u63D2\u4EF6 {
|
|
|
160
168
|
await log.debug("\u8BBE\u7F6E WebSocket \u6E05\u7406\u51FD\u6570", { wsId });
|
|
161
169
|
await WebSocket\u7BA1\u7406\u5668.\u8BBE\u7F6E\u6E05\u7406\u51FD\u6570(wsId, \u6E05\u7406\u51FD\u6570);
|
|
162
170
|
},
|
|
163
|
-
async \u76D1\u542Cws\u4FE1\u606F(\u56DE\u8C03\u51FD\u6570) {
|
|
171
|
+
async \u76D1\u542Cws\u4FE1\u606F(\u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B) {
|
|
164
172
|
if (ws\u53E5\u67C4 === null) {
|
|
165
173
|
ws\u53E5\u67C4 = await WebSocket\u7BA1\u7406\u5668.\u83B7\u5F97ws\u53E5\u67C4(wsId);
|
|
166
174
|
}
|
|
167
175
|
if (ws\u53E5\u67C4 === null) {
|
|
168
176
|
await log.error("\u672A\u80FD\u83B7\u53D6\u5230\u6709\u6548\u7684 WebSocket \u53E5\u67C4");
|
|
169
|
-
return
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
let \u79C1\u6709\u5C5E\u6027\u53E5\u67C4 = ws\u53E5\u67C4;
|
|
180
|
+
let \u5173\u8054\u5BBF\u4E3B\u96C6\u5408 = \u79C1\u6709\u5C5E\u6027\u53E5\u67C4.__hosts;
|
|
181
|
+
if (\u5173\u8054\u5BBF\u4E3B\u96C6\u5408 === void 0) {
|
|
182
|
+
\u5173\u8054\u5BBF\u4E3B\u96C6\u5408 = /* @__PURE__ */ new Set();
|
|
183
|
+
\u79C1\u6709\u5C5E\u6027\u53E5\u67C4.__hosts = \u5173\u8054\u5BBF\u4E3B\u96C6\u5408;
|
|
170
184
|
}
|
|
185
|
+
\u5173\u8054\u5BBF\u4E3B\u96C6\u5408.add(\u5BBF\u4E3B);
|
|
186
|
+
let \u539F\u59CB\u89E3\u7ED1 = \u5BBF\u4E3B.\u89E3\u7ED1.bind(\u5BBF\u4E3B);
|
|
187
|
+
\u5BBF\u4E3B.\u89E3\u7ED1 = () => {
|
|
188
|
+
\u539F\u59CB\u89E3\u7ED1();
|
|
189
|
+
\u5173\u8054\u5BBF\u4E3B\u96C6\u5408.delete(\u5BBF\u4E3B);
|
|
190
|
+
};
|
|
171
191
|
await log.debug("\u6CE8\u518C WebSocket \u6D88\u606F\u76D1\u542C", { wsId });
|
|
172
|
-
|
|
192
|
+
WebSocket\u7BA1\u7406\u5668.\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(wsId, \u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B);
|
|
173
193
|
}
|
|
174
194
|
}
|
|
175
195
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { 集线器监听器宿主 as ________ } from '../global/model/hub.cjs';
|
|
3
3
|
import { 插件 as __, 任意插件 as ____ } from '../interface/interface-plugin.cjs';
|
|
4
4
|
import '@lsby/ts-fp-data';
|
|
5
5
|
import 'express';
|
|
@@ -13,7 +13,10 @@ declare class WebSocket插件<后推前信息 extends z.AnyZodObject | z.ZodNeve
|
|
|
13
13
|
ws操作: z.ZodUnion<[
|
|
14
14
|
z.ZodObject<{
|
|
15
15
|
发送ws信息: z.ZodFunction<z.ZodTuple<[后推前信息], null>, z.ZodPromise<z.ZodVoid>>;
|
|
16
|
-
监听ws信息: z.ZodFunction<z.ZodTuple<[
|
|
16
|
+
监听ws信息: z.ZodFunction<z.ZodTuple<[
|
|
17
|
+
z.ZodFunction<z.ZodTuple<[前推后信息], null>, z.ZodPromise<z.ZodVoid>>,
|
|
18
|
+
z.ZodType<________>
|
|
19
|
+
], null>, z.ZodPromise<z.ZodVoid>>;
|
|
17
20
|
关闭ws连接: z.ZodFunction<z.ZodTuple<[], null>, z.ZodPromise<z.ZodVoid>>;
|
|
18
21
|
设置清理函数: z.ZodFunction<z.ZodTuple<[z.ZodFunction<z.ZodTuple<[], null>, z.ZodPromise<z.ZodVoid>>], null>, z.ZodPromise<z.ZodVoid>>;
|
|
19
22
|
}>,
|
|
@@ -43,21 +43,14 @@ var import_ts_log = require("@lsby/ts-log");
|
|
|
43
43
|
var \u5168\u5C40\u65E5\u5FD7\u5355\u4F8B = new import_ts_log.Log("@lsby:net-core");
|
|
44
44
|
|
|
45
45
|
// src/global/model/hub.ts
|
|
46
|
-
var \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u6301\u6709\u8005 = class {
|
|
47
|
-
constructor(\u76D1\u542C\u5668) {
|
|
48
|
-
this.\u76D1\u542C\u5668 = \u76D1\u542C\u5668;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
46
|
var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
52
47
|
// 使用 WeakRef + FinalizationRegistry 防止"反向持有" this
|
|
53
48
|
static \u6E05\u7406\u6CE8\u518C\u5668 = new FinalizationRegistry(({ \u5B9E\u4F8B\u5F15\u7528, \u76D1\u542C\u5668 }) => {
|
|
54
49
|
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F15\u7528.deref();
|
|
55
50
|
if (\u5B9E\u4F8B === void 0) return;
|
|
56
|
-
|
|
57
|
-
if (\u7D22\u5F15 !== -1) \u5B9E\u4F8B.\u76D1\u542C\u5668\u5217\u8868.splice(\u7D22\u5F15, 1);
|
|
51
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
58
52
|
});
|
|
59
|
-
\u76D1\u542C\u5668\
|
|
60
|
-
\u6301\u6709\u8005\u6620\u5C04 = /* @__PURE__ */ new WeakMap();
|
|
53
|
+
\u76D1\u542C\u5668\u96C6\u5408 = /* @__PURE__ */ new Set();
|
|
61
54
|
\u9519\u8BEF\u5904\u7406\u5668 = null;
|
|
62
55
|
/**
|
|
63
56
|
* 设置广播错误时的处理器。
|
|
@@ -67,27 +60,26 @@ var \u96C6\u7EBF\u5668\u6A21\u578B = class _\u96C6\u7EBF\u5668\u6A21\u578B {
|
|
|
67
60
|
}
|
|
68
61
|
/**
|
|
69
62
|
* 注册监听器。
|
|
70
|
-
*
|
|
71
|
-
*
|
|
63
|
+
* 必须提供一个 `集线器监听器宿主` 实例。若宿主对象不被持有并被回收,监听器会在未来自动回收。
|
|
64
|
+
*
|
|
65
|
+
* ⚠️ 危险警告: 即使在该方法的同一逻辑层面的词法作用域内,若未显式调用 `宿主.解绑` 或保留长期强引用使用痕迹,
|
|
66
|
+
* 那么随着控制权转交和可达性缩减,仍然存在被 V8 提前进行垃圾回收而突然导致监听失效的极大风险。
|
|
67
|
+
* 建议详细阅读 `集线器监听器宿主` 类的文档备注以此警醒。
|
|
72
68
|
*/
|
|
73
|
-
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668) {
|
|
74
|
-
this.\u76D1\u542C\u5668\u5217\u8868.push(\u76D1\u542C\u5668);
|
|
75
|
-
let \u6301\u6709\u8005 = new \u96C6\u7EBF\u5668\u76D1\u542C\u5668\u6301\u6709\u8005(\u76D1\u542C\u5668);
|
|
76
|
-
this.\u6301\u6709\u8005\u6620\u5C04.set(\u6301\u6709\u8005, \u76D1\u542C\u5668);
|
|
69
|
+
\u6DFB\u52A0\u76D1\u542C\u5668(\u76D1\u542C\u5668, \u5BBF\u4E3B) {
|
|
77
70
|
let \u5B9E\u4F8B\u5F31\u5F15\u7528 = new WeakRef(this);
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.
|
|
87
|
-
this.\u6301\u6709\u8005\u6620\u5C04.delete(\u6301\u6709\u8005);
|
|
71
|
+
\u5BBF\u4E3B.\u7ED1\u5B9A\u56DE\u8C03(() => {
|
|
72
|
+
let \u5B9E\u4F8B = \u5B9E\u4F8B\u5F31\u5F15\u7528.deref();
|
|
73
|
+
if (\u5B9E\u4F8B !== void 0) {
|
|
74
|
+
\u5B9E\u4F8B.\u76D1\u542C\u5668\u96C6\u5408.delete(\u76D1\u542C\u5668);
|
|
75
|
+
}
|
|
76
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.unregister(\u5BBF\u4E3B);
|
|
77
|
+
});
|
|
78
|
+
this.\u76D1\u542C\u5668\u96C6\u5408.add(\u76D1\u542C\u5668);
|
|
79
|
+
_\u96C6\u7EBF\u5668\u6A21\u578B.\u6E05\u7406\u6CE8\u518C\u5668.register(\u5BBF\u4E3B, { \u5B9E\u4F8B\u5F15\u7528: \u5B9E\u4F8B\u5F31\u5F15\u7528, \u76D1\u542C\u5668 }, \u5BBF\u4E3B);
|
|
88
80
|
}
|
|
89
81
|
async \u5E7F\u64AD(\u6570\u636E) {
|
|
90
|
-
let snapshot = [...this.\u76D1\u542C\u5668\
|
|
82
|
+
let snapshot = [...this.\u76D1\u542C\u5668\u96C6\u5408];
|
|
91
83
|
let \u7ED3\u679C = await Promise.allSettled(snapshot.map((l) => l(\u6570\u636E)));
|
|
92
84
|
for (let [\u7D22\u5F15, \u7ED3\u679C\u9879] of \u7ED3\u679C.entries()) {
|
|
93
85
|
if (\u7ED3\u679C\u9879.status === "rejected" && this.\u9519\u8BEF\u5904\u7406\u5668 !== null) {
|
|
@@ -102,8 +94,6 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
102
94
|
log = \u5168\u5C40\u65E5\u5FD7\u5355\u4F8B.extend("WebSocket\u7BA1\u7406\u5668");
|
|
103
95
|
\u8FDE\u63A5\u8868 = {};
|
|
104
96
|
\u6D88\u606F\u76D1\u542C\u8868 = {};
|
|
105
|
-
\u8FDE\u63A5\u6E05\u7406\u6A21\u578B = new \u96C6\u7EBF\u5668\u6A21\u578B();
|
|
106
|
-
\u8FDE\u63A5\u6301\u6709\u8005\u8868 = {};
|
|
107
97
|
\u6E05\u7406\u51FD\u6570\u8868 = {};
|
|
108
98
|
\u589E\u52A0\u8FDE\u63A5(id, ws\u53E5\u67C4) {
|
|
109
99
|
if (id in this.\u8FDE\u63A5\u8868) this.\u5220\u9664\u8FDE\u63A5(id);
|
|
@@ -116,15 +106,11 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
116
106
|
this.\u6D88\u606F\u76D1\u542C\u8868[id] = \u6A21\u578B;
|
|
117
107
|
}
|
|
118
108
|
this.\u6CE8\u518Conmessage(id, ws\u53E5\u67C4);
|
|
119
|
-
let \u6301\u6709\u8005 = this.\u8FDE\u63A5\u6E05\u7406\u6A21\u578B.\u6DFB\u52A0\u76D1\u542C\u5668(async () => {
|
|
120
|
-
if (id in this.\u8FDE\u63A5\u8868) this.\u5220\u9664\u8FDE\u63A5(id);
|
|
121
|
-
});
|
|
122
|
-
this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id] = \u6301\u6709\u8005;
|
|
123
|
-
return \u6301\u6709\u8005;
|
|
124
109
|
}
|
|
125
110
|
\u5220\u9664\u8FDE\u63A5(id) {
|
|
126
111
|
let ws = this.\u8FDE\u63A5\u8868[id];
|
|
127
|
-
if (ws
|
|
112
|
+
if (ws === void 0) return;
|
|
113
|
+
if (ws !== null) {
|
|
128
114
|
ws.onmessage = null;
|
|
129
115
|
ws.once("error", (err) => void this.log.error(`WebSocket \u5F02\u6B65\u9519\u8BEF, id: ${id}, \u9519\u8BEF: ${err}`));
|
|
130
116
|
ws.once(
|
|
@@ -142,11 +128,6 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
142
128
|
delete this.\u8FDE\u63A5\u8868[id];
|
|
143
129
|
delete this.\u6E05\u7406\u51FD\u6570\u8868[id];
|
|
144
130
|
delete this.\u6D88\u606F\u76D1\u542C\u8868[id];
|
|
145
|
-
let \u6301\u6709\u8005 = this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id];
|
|
146
|
-
if (\u6301\u6709\u8005 !== void 0) {
|
|
147
|
-
this.\u8FDE\u63A5\u6E05\u7406\u6A21\u578B.\u79FB\u9664\u76D1\u542C\u5668(\u6301\u6709\u8005);
|
|
148
|
-
delete this.\u8FDE\u63A5\u6301\u6709\u8005\u8868[id];
|
|
149
|
-
}
|
|
150
131
|
}
|
|
151
132
|
\u6CE8\u518Conmessage(id, ws\u53E5\u67C4) {
|
|
152
133
|
ws\u53E5\u67C4.onmessage = async (event) => {
|
|
@@ -168,10 +149,10 @@ var WebSocket\u7BA1\u7406\u5668 = class {
|
|
|
168
149
|
async \u8BBE\u7F6E\u6E05\u7406\u51FD\u6570(id, \u6E05\u7406\u51FD\u6570) {
|
|
169
150
|
if (id in this.\u8FDE\u63A5\u8868) this.\u6E05\u7406\u51FD\u6570\u8868[id] = \u6E05\u7406\u51FD\u6570;
|
|
170
151
|
}
|
|
171
|
-
\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(id, \u56DE\u8C03\u51FD\u6570) {
|
|
152
|
+
\u8BBE\u7F6E\u6D88\u606F\u76D1\u542C(id, \u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B) {
|
|
172
153
|
let \u6A21\u578B = this.\u6D88\u606F\u76D1\u542C\u8868[id];
|
|
173
|
-
if (\u6A21\u578B === void 0) return
|
|
174
|
-
|
|
154
|
+
if (\u6A21\u578B === void 0) return;
|
|
155
|
+
\u6A21\u578B.\u6DFB\u52A0\u76D1\u542C\u5668(\u56DE\u8C03\u51FD\u6570, \u5BBF\u4E3B);
|
|
175
156
|
}
|
|
176
157
|
};
|
|
177
158
|
|