@zucker-framework/network 1.0.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/dist/index.mjs ADDED
@@ -0,0 +1,327 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/network-type.ts
5
+ function networkType(id, name) {
6
+ return {
7
+ id,
8
+ name: name ?? id
9
+ };
10
+ }
11
+ __name(networkType, "networkType");
12
+ var NetworkTypes = {
13
+ TCP_CLIENT: networkType("TCP_CLIENT", "TCP Client"),
14
+ TCP_SERVER: networkType("TCP_SERVER", "TCP Server"),
15
+ HTTP_CLIENT: networkType("HTTP_CLIENT", "HTTP Client"),
16
+ HTTP_SERVER: networkType("HTTP_SERVER", "HTTP Server"),
17
+ MQTT_CLIENT: networkType("MQTT_CLIENT", "MQTT Client"),
18
+ MQTT_SERVER: networkType("MQTT_SERVER", "MQTT Server"),
19
+ WEB_SOCKET_CLIENT: networkType("WEB_SOCKET_CLIENT", "WebSocket Client"),
20
+ WEB_SOCKET_SERVER: networkType("WEB_SOCKET_SERVER", "WebSocket Server"),
21
+ UDP: networkType("UDP", "UDP")
22
+ };
23
+ var NetworkTypeRegistry = class NetworkTypeRegistry2 {
24
+ static {
25
+ __name(this, "NetworkTypeRegistry");
26
+ }
27
+ types = /* @__PURE__ */ new Map();
28
+ constructor() {
29
+ for (const t of Object.values(NetworkTypes)) {
30
+ this.types.set(t.id.toUpperCase(), t);
31
+ }
32
+ }
33
+ /** 注册网络类型 — 对齐 jetlinks NetworkTypes.register() */
34
+ register(type) {
35
+ this.types.set(type.id.toUpperCase(), type);
36
+ }
37
+ /** 批量注册 */
38
+ registerAll(types) {
39
+ for (const t of types) {
40
+ this.register(t);
41
+ }
42
+ }
43
+ /** 根据 ID 查找网络类型 — 对齐 jetlinks NetworkTypes.lookup() */
44
+ lookup(id) {
45
+ return this.types.get(id.toUpperCase());
46
+ }
47
+ /** 获取所有已注册的网络类型 — 对齐 jetlinks NetworkTypes.get() */
48
+ getAll() {
49
+ return Array.from(this.types.values());
50
+ }
51
+ };
52
+ var networkTypeRegistry = new NetworkTypeRegistry();
53
+
54
+ // src/transport.ts
55
+ function createTransport(protocol, schema) {
56
+ return {
57
+ protocol,
58
+ schema
59
+ };
60
+ }
61
+ __name(createTransport, "createTransport");
62
+ var Transports = {
63
+ TCP: createTransport("TCP", "tcp"),
64
+ UDP: createTransport("UDP", "udp"),
65
+ HTTP: createTransport("TCP", "http"),
66
+ HTTPS: createTransport("TCP", "https"),
67
+ MQTT: createTransport("TCP", "mqtt"),
68
+ MQTTS: createTransport("TCP", "mqtts"),
69
+ WS: createTransport("TCP", "ws"),
70
+ WSS: createTransport("TCP", "wss")
71
+ };
72
+
73
+ // src/network-manager.ts
74
+ import { Injectable, Logger } from "@nestjs/common";
75
+ function _ts_decorate(decorators, target, key, desc) {
76
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
77
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
78
+ r = Reflect.decorate(decorators, target, key, desc);
79
+ } else {
80
+ for (var i = decorators.length - 1; i >= 0; i--) {
81
+ if (d = decorators[i]) {
82
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
83
+ }
84
+ }
85
+ }
86
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
87
+ }
88
+ __name(_ts_decorate, "_ts_decorate");
89
+ function _ts_metadata(metadataKey, metadataValue) {
90
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
91
+ return Reflect.metadata(metadataKey, metadataValue);
92
+ }
93
+ }
94
+ __name(_ts_metadata, "_ts_metadata");
95
+ var DefaultNetworkManager = class _DefaultNetworkManager {
96
+ static {
97
+ __name(this, "DefaultNetworkManager");
98
+ }
99
+ configManager;
100
+ logger = new Logger(_DefaultNetworkManager.name);
101
+ /** type-id -> Provider */
102
+ providers = /* @__PURE__ */ new Map();
103
+ /** type-id -> (network-id -> Network) */
104
+ store = /* @__PURE__ */ new Map();
105
+ checkTimer;
106
+ constructor(configManager) {
107
+ this.configManager = configManager;
108
+ this.checkTimer = setInterval(() => {
109
+ this.checkNetworks().catch((err) => this.logger.error("Network health-check failed", err));
110
+ }, 1e4);
111
+ }
112
+ /* ------------------------------------------------------------------ */
113
+ /* Provider 注册 */
114
+ /* ------------------------------------------------------------------ */
115
+ registerProvider(provider) {
116
+ this.providers.set(provider.type.id, provider);
117
+ this.logger.log(`NetworkProvider registered: ${provider.type.id}`);
118
+ }
119
+ /* ------------------------------------------------------------------ */
120
+ /* INetworkManager 实现 */
121
+ /* ------------------------------------------------------------------ */
122
+ async getNetwork(type, id) {
123
+ const networkMap = this.getNetworkStore(type.id);
124
+ let network = networkMap.get(id);
125
+ if (network) return network;
126
+ network = await this.createFromConfig(type, id);
127
+ networkMap.set(id, network);
128
+ return network;
129
+ }
130
+ getNetworks() {
131
+ const result = [];
132
+ for (const map of this.store.values()) {
133
+ for (const n of map.values()) {
134
+ result.push(n);
135
+ }
136
+ }
137
+ return result;
138
+ }
139
+ getProviders() {
140
+ return Array.from(this.providers.values());
141
+ }
142
+ getProvider(typeId) {
143
+ return this.providers.get(typeId);
144
+ }
145
+ async reload(type, id) {
146
+ const provider = this.requireProvider(type.id);
147
+ const props = await this.configManager.getConfig(type, id);
148
+ if (!props || !props.enabled) return;
149
+ const config = await provider.createConfig(props);
150
+ const networkMap = this.getNetworkStore(type.id);
151
+ const existing = networkMap.get(id);
152
+ const network = existing ? await provider.reload(existing, config) : await provider.createNetwork(config);
153
+ networkMap.set(id, network);
154
+ }
155
+ async shutdown(type, id) {
156
+ const network = this.getNetworkStore(type.id).get(id);
157
+ if (network) {
158
+ await network.shutdown();
159
+ }
160
+ }
161
+ async destroy(type, id) {
162
+ const networkMap = this.getNetworkStore(type.id);
163
+ const network = networkMap.get(id);
164
+ if (network) {
165
+ networkMap.delete(id);
166
+ await network.shutdown();
167
+ }
168
+ }
169
+ /* ------------------------------------------------------------------ */
170
+ /* 生命周期 */
171
+ /* ------------------------------------------------------------------ */
172
+ async onModuleDestroy() {
173
+ if (this.checkTimer) {
174
+ clearInterval(this.checkTimer);
175
+ this.checkTimer = void 0;
176
+ }
177
+ const shutdowns = [];
178
+ for (const map of this.store.values()) {
179
+ for (const network of map.values()) {
180
+ shutdowns.push(Promise.resolve(network.shutdown()).catch((err) => this.logger.error(`Failed to shutdown network ${network.id}`, err)));
181
+ }
182
+ }
183
+ await Promise.all(shutdowns);
184
+ this.store.clear();
185
+ }
186
+ /* ------------------------------------------------------------------ */
187
+ /* 内部方法 */
188
+ /* ------------------------------------------------------------------ */
189
+ getNetworkStore(typeId) {
190
+ let map = this.store.get(typeId);
191
+ if (!map) {
192
+ map = /* @__PURE__ */ new Map();
193
+ this.store.set(typeId, map);
194
+ }
195
+ return map;
196
+ }
197
+ requireProvider(typeId) {
198
+ const provider = this.providers.get(typeId);
199
+ if (!provider) {
200
+ throw new Error(`Unsupported network type: ${typeId}`);
201
+ }
202
+ return provider;
203
+ }
204
+ async createFromConfig(type, id) {
205
+ const provider = this.requireProvider(type.id);
206
+ const props = await this.configManager.getConfig(type, id);
207
+ if (!props || !props.enabled) {
208
+ throw new Error(`Network config not found or disabled: ${type.id}/${id}`);
209
+ }
210
+ const config = await provider.createConfig(props);
211
+ return provider.createNetwork(config);
212
+ }
213
+ /**
214
+ * 定期检查网络组件存活状态 — 与 jetlinks checkNetwork() 逻辑对齐。
215
+ */
216
+ async checkNetworks() {
217
+ for (const [typeId, networkMap] of this.store) {
218
+ const provider = this.providers.get(typeId);
219
+ if (!provider) continue;
220
+ for (const [id, network] of networkMap) {
221
+ if (network.isAlive() || !network.isAutoReload()) continue;
222
+ try {
223
+ const props = await this.configManager.getConfig(network.type, id);
224
+ if (!props || !props.enabled) continue;
225
+ const config = await provider.createConfig(props);
226
+ const reloaded = await provider.reload(network, config);
227
+ networkMap.set(id, reloaded);
228
+ this.logger.log(`Reloaded network: ${typeId}/${id}`);
229
+ } catch (err) {
230
+ this.logger.warn(`Failed to reload network ${typeId}/${id}`, err);
231
+ }
232
+ }
233
+ }
234
+ }
235
+ };
236
+ DefaultNetworkManager = _ts_decorate([
237
+ Injectable(),
238
+ _ts_metadata("design:type", Function),
239
+ _ts_metadata("design:paramtypes", [
240
+ typeof NetworkConfigManager === "undefined" ? Object : NetworkConfigManager
241
+ ])
242
+ ], DefaultNetworkManager);
243
+
244
+ // src/codec.ts
245
+ var JsonCodec = class {
246
+ static {
247
+ __name(this, "JsonCodec");
248
+ }
249
+ id;
250
+ transport;
251
+ constructor(id, transport) {
252
+ this.id = id;
253
+ this.transport = transport;
254
+ }
255
+ encode(message) {
256
+ return Buffer.from(JSON.stringify(message));
257
+ }
258
+ decode(payload) {
259
+ return JSON.parse(payload.toString("utf-8"));
260
+ }
261
+ };
262
+
263
+ // src/network.module.ts
264
+ import { Module } from "@nestjs/common";
265
+ function _ts_decorate2(decorators, target, key, desc) {
266
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
267
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
268
+ r = Reflect.decorate(decorators, target, key, desc);
269
+ } else {
270
+ for (var i = decorators.length - 1; i >= 0; i--) {
271
+ if (d = decorators[i]) {
272
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
273
+ }
274
+ }
275
+ }
276
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
277
+ }
278
+ __name(_ts_decorate2, "_ts_decorate");
279
+ var NETWORK_MANAGER = /* @__PURE__ */ Symbol("NETWORK_MANAGER");
280
+ var NETWORK_CONFIG_MANAGER = /* @__PURE__ */ Symbol("NETWORK_CONFIG_MANAGER");
281
+ var ZuckerNetworkModule = class _ZuckerNetworkModule {
282
+ static {
283
+ __name(this, "ZuckerNetworkModule");
284
+ }
285
+ static forRoot(options) {
286
+ const configManagerProvider = typeof options.configManager === "function" ? {
287
+ provide: NETWORK_CONFIG_MANAGER,
288
+ useClass: options.configManager
289
+ } : options.configManager;
290
+ const networkManagerProvider = {
291
+ provide: NETWORK_MANAGER,
292
+ useFactory: /* @__PURE__ */ __name((configManager) => {
293
+ return new DefaultNetworkManager(configManager);
294
+ }, "useFactory"),
295
+ inject: [
296
+ NETWORK_CONFIG_MANAGER
297
+ ]
298
+ };
299
+ return {
300
+ module: _ZuckerNetworkModule,
301
+ global: true,
302
+ providers: [
303
+ configManagerProvider,
304
+ networkManagerProvider
305
+ ],
306
+ exports: [
307
+ NETWORK_MANAGER,
308
+ NETWORK_CONFIG_MANAGER
309
+ ]
310
+ };
311
+ }
312
+ };
313
+ ZuckerNetworkModule = _ts_decorate2([
314
+ Module({})
315
+ ], ZuckerNetworkModule);
316
+ export {
317
+ DefaultNetworkManager,
318
+ JsonCodec,
319
+ NETWORK_CONFIG_MANAGER,
320
+ NETWORK_MANAGER,
321
+ NetworkTypes,
322
+ Transports,
323
+ ZuckerNetworkModule,
324
+ createTransport,
325
+ networkType,
326
+ networkTypeRegistry
327
+ };
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@zucker-framework/network",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "module": "dist/index.mjs",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "LICENSE",
10
+ "NOTICE",
11
+ "THIRD_PARTY_NOTICES"
12
+ ],
13
+ "dependencies": {
14
+ "@zucker-framework/core": "1.0.0",
15
+ "@zucker-framework/provider": "1.0.0"
16
+ },
17
+ "peerDependencies": {
18
+ "@nestjs/common": "^12.0.0",
19
+ "@nestjs/core": "^12.0.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^20.19.43"
23
+ },
24
+ "license": "Apache-2.0",
25
+ "author": "Lind",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/Lind-pro/zucker-framework.git",
29
+ "directory": "packages/network"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "registry": "https://registry.npmjs.org/"
34
+ },
35
+ "scripts": {
36
+ "build": "tsup src/index.ts --format cjs,esm --dts",
37
+ "clean": "rm -rf dist",
38
+ "lint": "eslint src/"
39
+ }
40
+ }