@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/LICENSE +201 -0
- package/NOTICE +22 -0
- package/THIRD_PARTY_NOTICES +4 -0
- package/dist/index.d.mts +351 -0
- package/dist/index.d.ts +351 -0
- package/dist/index.js +361 -0
- package/dist/index.mjs +327 -0
- package/package.json +40 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { OnModuleDestroy, Provider, DynamicModule } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 网络组件类型标识。
|
|
5
|
+
*
|
|
6
|
+
* 对应 jetlinks NetworkType — 用于区分 TCP / HTTP / MQTT / WebSocket 等
|
|
7
|
+
* 不同网络组件,以字符串 id 作为唯一键。
|
|
8
|
+
*
|
|
9
|
+
* 与 jetlinks 的差异:去掉了 Java 枚举字典依赖,改用纯接口 + 工厂函数。
|
|
10
|
+
*/
|
|
11
|
+
interface NetworkType {
|
|
12
|
+
/** 类型唯一标识,如 'TCP_SERVER'、'HTTP_CLIENT' */
|
|
13
|
+
readonly id: string;
|
|
14
|
+
/** 可读名称(可选,默认等于 id) */
|
|
15
|
+
readonly name: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 用 id 创建一个 NetworkType(等价 jetlinks `NetworkType.of(id)`)。
|
|
19
|
+
*/
|
|
20
|
+
declare function networkType(id: string, name?: string): NetworkType;
|
|
21
|
+
/**
|
|
22
|
+
* 内置网络类型常量,对应 jetlinks DefaultNetworkType 的通用子集。
|
|
23
|
+
* IoT 专用类型(CoAP 等)不迁移。
|
|
24
|
+
*/
|
|
25
|
+
declare const NetworkTypes: {
|
|
26
|
+
readonly TCP_CLIENT: NetworkType;
|
|
27
|
+
readonly TCP_SERVER: NetworkType;
|
|
28
|
+
readonly HTTP_CLIENT: NetworkType;
|
|
29
|
+
readonly HTTP_SERVER: NetworkType;
|
|
30
|
+
readonly MQTT_CLIENT: NetworkType;
|
|
31
|
+
readonly MQTT_SERVER: NetworkType;
|
|
32
|
+
readonly WEB_SOCKET_CLIENT: NetworkType;
|
|
33
|
+
readonly WEB_SOCKET_SERVER: NetworkType;
|
|
34
|
+
readonly UDP: NetworkType;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 动态类型注册表 — 对齐 jetlinks NetworkTypes 的 register/lookup 模式。
|
|
38
|
+
*
|
|
39
|
+
* 允许运行时注册自定义网络类型(如 CoAP、自定义协议等),
|
|
40
|
+
* 与 jetlinks 中 NetworkTypes.register() 语义一致。
|
|
41
|
+
*/
|
|
42
|
+
declare class NetworkTypeRegistry {
|
|
43
|
+
private readonly types;
|
|
44
|
+
constructor();
|
|
45
|
+
/** 注册网络类型 — 对齐 jetlinks NetworkTypes.register() */
|
|
46
|
+
register(type: NetworkType): void;
|
|
47
|
+
/** 批量注册 */
|
|
48
|
+
registerAll(types: NetworkType[]): void;
|
|
49
|
+
/** 根据 ID 查找网络类型 — 对齐 jetlinks NetworkTypes.lookup() */
|
|
50
|
+
lookup(id: string): NetworkType | undefined;
|
|
51
|
+
/** 获取所有已注册的网络类型 — 对齐 jetlinks NetworkTypes.get() */
|
|
52
|
+
getAll(): NetworkType[];
|
|
53
|
+
}
|
|
54
|
+
/** 全局网络类型注册表单例 */
|
|
55
|
+
declare const networkTypeRegistry: NetworkTypeRegistry;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 传输协议抽象。
|
|
59
|
+
*
|
|
60
|
+
* 对应 jetlinks NetworkTransport(TCP / UDP)以及 NetworkConfig.schema
|
|
61
|
+
* (http / mqtt / ws 等应用层协议)。
|
|
62
|
+
*
|
|
63
|
+
* 在 zucker 中将两层合并为一个 Transport 枚举 + schema 字段,
|
|
64
|
+
* 使消费方只需关心一个类型。
|
|
65
|
+
*/
|
|
66
|
+
/** 底层传输协议 */
|
|
67
|
+
type TransportProtocol = 'TCP' | 'UDP';
|
|
68
|
+
/**
|
|
69
|
+
* 传输描述 — 包含底层协议 + 应用层 schema。
|
|
70
|
+
*
|
|
71
|
+
* 例如 MQTT over TCP: `{ protocol: 'TCP', schema: 'mqtt' }`
|
|
72
|
+
*/
|
|
73
|
+
interface Transport {
|
|
74
|
+
/** 底层协议:TCP 或 UDP */
|
|
75
|
+
readonly protocol: TransportProtocol;
|
|
76
|
+
/** 应用层 schema,如 http / mqtt / ws */
|
|
77
|
+
readonly schema: string;
|
|
78
|
+
}
|
|
79
|
+
declare function createTransport(protocol: TransportProtocol, schema: string): Transport;
|
|
80
|
+
/** 常见传输常量 */
|
|
81
|
+
declare const Transports: {
|
|
82
|
+
readonly TCP: Transport;
|
|
83
|
+
readonly UDP: Transport;
|
|
84
|
+
readonly HTTP: Transport;
|
|
85
|
+
readonly HTTPS: Transport;
|
|
86
|
+
readonly MQTT: Transport;
|
|
87
|
+
readonly MQTTS: Transport;
|
|
88
|
+
readonly WS: Transport;
|
|
89
|
+
readonly WSS: Transport;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 网络组件根接口。
|
|
94
|
+
*
|
|
95
|
+
* 对应 jetlinks `Network` — 所有具体网络实现(TCP Server、MQTT Client 等)
|
|
96
|
+
* 的统一抽象。提供生命周期管理(shutdown / isAlive / isAutoReload)。
|
|
97
|
+
*/
|
|
98
|
+
interface Network {
|
|
99
|
+
/** 网络组件实例唯一标识 */
|
|
100
|
+
readonly id: string;
|
|
101
|
+
/** 网络类型 */
|
|
102
|
+
readonly type: NetworkType;
|
|
103
|
+
/** 关闭网络组件,释放底层资源 */
|
|
104
|
+
shutdown(): Promise<void> | void;
|
|
105
|
+
/** 组件是否存活 */
|
|
106
|
+
isAlive(): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* 当 isAlive() 返回 false 时,是否由 NetworkManager 自动重新加载。
|
|
109
|
+
* 默认 false。
|
|
110
|
+
*/
|
|
111
|
+
isAutoReload(): boolean;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 服务端网络组件,额外暴露绑定地址。
|
|
115
|
+
*
|
|
116
|
+
* 对应 jetlinks `ServerNetwork`。
|
|
117
|
+
*/
|
|
118
|
+
interface ServerNetwork extends Network {
|
|
119
|
+
/** 绑定的 host:port;如未绑定返回 undefined */
|
|
120
|
+
getBindAddress(): {
|
|
121
|
+
host: string;
|
|
122
|
+
port: number;
|
|
123
|
+
} | undefined;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 网络组件配置基础接口。
|
|
128
|
+
*
|
|
129
|
+
* 对应 jetlinks `NetworkConfig` — 抽象出所有网络组件共有的配置属性。
|
|
130
|
+
*/
|
|
131
|
+
interface NetworkConfig {
|
|
132
|
+
/** 配置唯一标识 */
|
|
133
|
+
readonly id: string;
|
|
134
|
+
/** 传输协议 */
|
|
135
|
+
readonly transport: Transport;
|
|
136
|
+
/** 是否启用 TLS/DTLS 安全加密 */
|
|
137
|
+
readonly secure: boolean;
|
|
138
|
+
/** 安全证书标识(secure 为 true 时必须) */
|
|
139
|
+
readonly certId?: string;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 服务端网络配置。
|
|
143
|
+
*
|
|
144
|
+
* 对应 jetlinks `ServerNetworkConfig`。
|
|
145
|
+
*/
|
|
146
|
+
interface ServerNetworkConfig extends NetworkConfig {
|
|
147
|
+
/** 监听地址 */
|
|
148
|
+
readonly host: string;
|
|
149
|
+
/** 监听端口 */
|
|
150
|
+
readonly port: number;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 客户端网络配置。
|
|
154
|
+
*
|
|
155
|
+
* 对应 jetlinks `ClientNetworkConfig`。
|
|
156
|
+
*/
|
|
157
|
+
interface ClientNetworkConfig extends NetworkConfig {
|
|
158
|
+
/** 远端地址 */
|
|
159
|
+
readonly remoteHost: string;
|
|
160
|
+
/** 远端端口 */
|
|
161
|
+
readonly remotePort: number;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 通用可序列化的网络属性,对应 jetlinks `NetworkProperties`。
|
|
165
|
+
*
|
|
166
|
+
* 与 jetlinks 完全对齐:type + configurations map 的组合
|
|
167
|
+
* 让 NetworkProvider 可以按需反序列化成具体 Config。
|
|
168
|
+
*/
|
|
169
|
+
interface NetworkProperties {
|
|
170
|
+
/** 配置 ID */
|
|
171
|
+
id: string;
|
|
172
|
+
/** 网络类型标识 */
|
|
173
|
+
type: string;
|
|
174
|
+
/** 配置名称 */
|
|
175
|
+
name: string;
|
|
176
|
+
/** 是否启用 */
|
|
177
|
+
enabled: boolean;
|
|
178
|
+
/** 自由 KV 配置 — 不同网络类型内容不同 */
|
|
179
|
+
configurations: Record<string, unknown>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* 网络组件提供商 SPI。
|
|
184
|
+
*
|
|
185
|
+
* 对应 jetlinks `NetworkProvider<P>` — 每种网络类型注册一个 Provider,
|
|
186
|
+
* 负责根据配置创建/重载网络实例。
|
|
187
|
+
*
|
|
188
|
+
* 泛型 P 为具体的配置类型(如 TcpServerConfig、MqttClientConfig)。
|
|
189
|
+
*
|
|
190
|
+
* 与 jetlinks 的差异:
|
|
191
|
+
* - 去掉 Reactor Mono,使用 async/Promise
|
|
192
|
+
* - 去掉 ConfigMetadata(Java UI 元数据,在 TS 中用 JSON Schema 替代)
|
|
193
|
+
*/
|
|
194
|
+
interface NetworkProvider<P = unknown> {
|
|
195
|
+
/** 该 Provider 支持的网络类型 */
|
|
196
|
+
readonly type: NetworkType;
|
|
197
|
+
/** 根据具体配置创建网络组件 */
|
|
198
|
+
createNetwork(config: P): Promise<Network>;
|
|
199
|
+
/** 重载已有网络组件(热更新配置) */
|
|
200
|
+
reload(network: Network, config: P): Promise<Network>;
|
|
201
|
+
/**
|
|
202
|
+
* 将通用 NetworkProperties 转换为具体配置对象 P。
|
|
203
|
+
* 对应 jetlinks `NetworkProvider.createConfig(NetworkProperties)`。
|
|
204
|
+
*/
|
|
205
|
+
createConfig(properties: NetworkProperties): Promise<P>;
|
|
206
|
+
/**
|
|
207
|
+
* 网络组件是否可被多个消费者复用。
|
|
208
|
+
*
|
|
209
|
+
* 例如 TCP Server 通常不可复用(一个端口只能被一个网关占用),
|
|
210
|
+
* 而 HTTP Client 可复用。
|
|
211
|
+
* 默认 false。
|
|
212
|
+
*/
|
|
213
|
+
isReusable(): boolean;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* 网络组件配置管理接口 — 用于从持久层获取 NetworkProperties。
|
|
218
|
+
*
|
|
219
|
+
* 对应 jetlinks `NetworkConfigManager`。
|
|
220
|
+
* 具体实现由应用层提供(数据库、文件等)。
|
|
221
|
+
*/
|
|
222
|
+
interface NetworkConfigManager {
|
|
223
|
+
getConfig(type: NetworkType, id: string): Promise<NetworkProperties | undefined>;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 网络管理器接口。
|
|
227
|
+
*
|
|
228
|
+
* 对应 jetlinks `NetworkManager` — 统一管理多种类型的网络组件实例,
|
|
229
|
+
* 提供按类型+ID 获取、重载、关闭、销毁等操作。
|
|
230
|
+
*/
|
|
231
|
+
interface INetworkManager {
|
|
232
|
+
/** 按类型和 ID 获取网络组件(懒创建) */
|
|
233
|
+
getNetwork<T extends Network = Network>(type: NetworkType, id: string): Promise<T>;
|
|
234
|
+
/** 获取所有已创建的网络组件 */
|
|
235
|
+
getNetworks(): Network[];
|
|
236
|
+
/** 获取所有已注册的 Provider */
|
|
237
|
+
getProviders(): NetworkProvider[];
|
|
238
|
+
/** 按类型 ID 获取 Provider */
|
|
239
|
+
getProvider(typeId: string): NetworkProvider | undefined;
|
|
240
|
+
/** 重载指定网络组件 */
|
|
241
|
+
reload(type: NetworkType, id: string): Promise<void>;
|
|
242
|
+
/** 关闭指定网络组件(不移除缓存) */
|
|
243
|
+
shutdown(type: NetworkType, id: string): Promise<void>;
|
|
244
|
+
/** 销毁指定网络组件(关闭并移除缓存) */
|
|
245
|
+
destroy(type: NetworkType, id: string): Promise<void>;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 默认网络管理器实现。
|
|
249
|
+
*
|
|
250
|
+
* 对应 jetlinks `DefaultNetworkManager` — 通过 Provider SPI 按需创建
|
|
251
|
+
* 网络组件实例,内部按 type + id 缓存。
|
|
252
|
+
*
|
|
253
|
+
* 与 jetlinks 的差异:
|
|
254
|
+
* - 去掉了 Spring BeanPostProcessor 自动发现,改为手动 registerProvider
|
|
255
|
+
* - 去掉了 EventBus 集群同步(zucker 已有 @zucker-framework/cluster)
|
|
256
|
+
* - 健康检查用 setInterval 而非 Flux.interval
|
|
257
|
+
*/
|
|
258
|
+
declare class DefaultNetworkManager implements INetworkManager, OnModuleDestroy {
|
|
259
|
+
private readonly configManager;
|
|
260
|
+
private readonly logger;
|
|
261
|
+
/** type-id -> Provider */
|
|
262
|
+
private readonly providers;
|
|
263
|
+
/** type-id -> (network-id -> Network) */
|
|
264
|
+
private readonly store;
|
|
265
|
+
private checkTimer;
|
|
266
|
+
constructor(configManager: NetworkConfigManager);
|
|
267
|
+
registerProvider(provider: NetworkProvider<unknown>): void;
|
|
268
|
+
getNetwork<T extends Network = Network>(type: NetworkType, id: string): Promise<T>;
|
|
269
|
+
getNetworks(): Network[];
|
|
270
|
+
getProviders(): NetworkProvider[];
|
|
271
|
+
getProvider(typeId: string): NetworkProvider | undefined;
|
|
272
|
+
reload(type: NetworkType, id: string): Promise<void>;
|
|
273
|
+
shutdown(type: NetworkType, id: string): Promise<void>;
|
|
274
|
+
destroy(type: NetworkType, id: string): Promise<void>;
|
|
275
|
+
onModuleDestroy(): Promise<void>;
|
|
276
|
+
private getNetworkStore;
|
|
277
|
+
private requireProvider;
|
|
278
|
+
private createFromConfig;
|
|
279
|
+
/**
|
|
280
|
+
* 定期检查网络组件存活状态 — 与 jetlinks checkNetwork() 逻辑对齐。
|
|
281
|
+
*/
|
|
282
|
+
private checkNetworks;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* 消息编解码器抽象。
|
|
287
|
+
*
|
|
288
|
+
* 对应 jetlinks `DeviceMessageCodec` 的通用子集 — 去掉了 IoT 设备
|
|
289
|
+
* 消息特定部分,保留通用的 encode / decode / transport 关联。
|
|
290
|
+
*
|
|
291
|
+
* 在 zucker 中,Codec 用于任意协议的消息序列化/反序列化,
|
|
292
|
+
* 例如 MQTT payload 解析、TCP 帧编解码等。
|
|
293
|
+
*/
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* 编解码上下文 — 携带编解码时可能需要的环境信息。
|
|
297
|
+
*/
|
|
298
|
+
interface CodecContext {
|
|
299
|
+
/** 当前网络组件 ID */
|
|
300
|
+
readonly networkId?: string;
|
|
301
|
+
/** 额外上下文 KV */
|
|
302
|
+
readonly attributes: Record<string, unknown>;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* 消息编解码器。
|
|
306
|
+
*
|
|
307
|
+
* 泛型参数:
|
|
308
|
+
* - TEncoded : 编码后的格式(如 Buffer、string)
|
|
309
|
+
* - TDecoded : 解码后的业务对象
|
|
310
|
+
*/
|
|
311
|
+
interface Codec<TEncoded = Buffer, TDecoded = unknown> {
|
|
312
|
+
/** 编解码器标识 */
|
|
313
|
+
readonly id: string;
|
|
314
|
+
/** 该编解码器绑定的传输协议 */
|
|
315
|
+
readonly transport: Transport;
|
|
316
|
+
/** 将业务对象编码为传输格式 */
|
|
317
|
+
encode(message: TDecoded, context?: CodecContext): Promise<TEncoded> | TEncoded;
|
|
318
|
+
/** 将传输格式解码为业务对象 */
|
|
319
|
+
decode(payload: TEncoded, context?: CodecContext): Promise<TDecoded> | TDecoded;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* JSON 编解码器 — 最常见的实现,将对象序列化为 JSON Buffer。
|
|
323
|
+
*/
|
|
324
|
+
declare class JsonCodec<T = unknown> implements Codec<Buffer, T> {
|
|
325
|
+
readonly id: string;
|
|
326
|
+
readonly transport: Transport;
|
|
327
|
+
constructor(id: string, transport: Transport);
|
|
328
|
+
encode(message: T): Buffer;
|
|
329
|
+
decode(payload: Buffer): T;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
declare const NETWORK_MANAGER: unique symbol;
|
|
333
|
+
declare const NETWORK_CONFIG_MANAGER: unique symbol;
|
|
334
|
+
/**
|
|
335
|
+
* Zucker 网络模块。
|
|
336
|
+
*
|
|
337
|
+
* 使用 `forRoot` 注册时,需提供 `NetworkConfigManager` 实现。
|
|
338
|
+
*
|
|
339
|
+
* ```ts
|
|
340
|
+
* ZuckerNetworkModule.forRoot({
|
|
341
|
+
* configManager: MyNetworkConfigManager,
|
|
342
|
+
* })
|
|
343
|
+
* ```
|
|
344
|
+
*/
|
|
345
|
+
declare class ZuckerNetworkModule {
|
|
346
|
+
static forRoot(options: {
|
|
347
|
+
configManager: Provider;
|
|
348
|
+
}): DynamicModule;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export { type ClientNetworkConfig, type Codec, type CodecContext, DefaultNetworkManager, type INetworkManager, JsonCodec, NETWORK_CONFIG_MANAGER, NETWORK_MANAGER, type Network, type NetworkConfig, type NetworkConfigManager, type NetworkProperties, type NetworkProvider, type NetworkType, NetworkTypes, type ServerNetwork, type ServerNetworkConfig, type Transport, type TransportProtocol, Transports, ZuckerNetworkModule, createTransport, networkType, networkTypeRegistry };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/index.ts
|
|
22
|
+
var index_exports = {};
|
|
23
|
+
__export(index_exports, {
|
|
24
|
+
DefaultNetworkManager: () => DefaultNetworkManager,
|
|
25
|
+
JsonCodec: () => JsonCodec,
|
|
26
|
+
NETWORK_CONFIG_MANAGER: () => NETWORK_CONFIG_MANAGER,
|
|
27
|
+
NETWORK_MANAGER: () => NETWORK_MANAGER,
|
|
28
|
+
NetworkTypes: () => NetworkTypes,
|
|
29
|
+
Transports: () => Transports,
|
|
30
|
+
ZuckerNetworkModule: () => ZuckerNetworkModule,
|
|
31
|
+
createTransport: () => createTransport,
|
|
32
|
+
networkType: () => networkType,
|
|
33
|
+
networkTypeRegistry: () => networkTypeRegistry
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(index_exports);
|
|
36
|
+
|
|
37
|
+
// src/network-type.ts
|
|
38
|
+
function networkType(id, name) {
|
|
39
|
+
return {
|
|
40
|
+
id,
|
|
41
|
+
name: name ?? id
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
__name(networkType, "networkType");
|
|
45
|
+
var NetworkTypes = {
|
|
46
|
+
TCP_CLIENT: networkType("TCP_CLIENT", "TCP Client"),
|
|
47
|
+
TCP_SERVER: networkType("TCP_SERVER", "TCP Server"),
|
|
48
|
+
HTTP_CLIENT: networkType("HTTP_CLIENT", "HTTP Client"),
|
|
49
|
+
HTTP_SERVER: networkType("HTTP_SERVER", "HTTP Server"),
|
|
50
|
+
MQTT_CLIENT: networkType("MQTT_CLIENT", "MQTT Client"),
|
|
51
|
+
MQTT_SERVER: networkType("MQTT_SERVER", "MQTT Server"),
|
|
52
|
+
WEB_SOCKET_CLIENT: networkType("WEB_SOCKET_CLIENT", "WebSocket Client"),
|
|
53
|
+
WEB_SOCKET_SERVER: networkType("WEB_SOCKET_SERVER", "WebSocket Server"),
|
|
54
|
+
UDP: networkType("UDP", "UDP")
|
|
55
|
+
};
|
|
56
|
+
var NetworkTypeRegistry = class NetworkTypeRegistry2 {
|
|
57
|
+
static {
|
|
58
|
+
__name(this, "NetworkTypeRegistry");
|
|
59
|
+
}
|
|
60
|
+
types = /* @__PURE__ */ new Map();
|
|
61
|
+
constructor() {
|
|
62
|
+
for (const t of Object.values(NetworkTypes)) {
|
|
63
|
+
this.types.set(t.id.toUpperCase(), t);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** 注册网络类型 — 对齐 jetlinks NetworkTypes.register() */
|
|
67
|
+
register(type) {
|
|
68
|
+
this.types.set(type.id.toUpperCase(), type);
|
|
69
|
+
}
|
|
70
|
+
/** 批量注册 */
|
|
71
|
+
registerAll(types) {
|
|
72
|
+
for (const t of types) {
|
|
73
|
+
this.register(t);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** 根据 ID 查找网络类型 — 对齐 jetlinks NetworkTypes.lookup() */
|
|
77
|
+
lookup(id) {
|
|
78
|
+
return this.types.get(id.toUpperCase());
|
|
79
|
+
}
|
|
80
|
+
/** 获取所有已注册的网络类型 — 对齐 jetlinks NetworkTypes.get() */
|
|
81
|
+
getAll() {
|
|
82
|
+
return Array.from(this.types.values());
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var networkTypeRegistry = new NetworkTypeRegistry();
|
|
86
|
+
|
|
87
|
+
// src/transport.ts
|
|
88
|
+
function createTransport(protocol, schema) {
|
|
89
|
+
return {
|
|
90
|
+
protocol,
|
|
91
|
+
schema
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
__name(createTransport, "createTransport");
|
|
95
|
+
var Transports = {
|
|
96
|
+
TCP: createTransport("TCP", "tcp"),
|
|
97
|
+
UDP: createTransport("UDP", "udp"),
|
|
98
|
+
HTTP: createTransport("TCP", "http"),
|
|
99
|
+
HTTPS: createTransport("TCP", "https"),
|
|
100
|
+
MQTT: createTransport("TCP", "mqtt"),
|
|
101
|
+
MQTTS: createTransport("TCP", "mqtts"),
|
|
102
|
+
WS: createTransport("TCP", "ws"),
|
|
103
|
+
WSS: createTransport("TCP", "wss")
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// src/network-manager.ts
|
|
107
|
+
var import_common = require("@nestjs/common");
|
|
108
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
109
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
110
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
111
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
112
|
+
} else {
|
|
113
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
114
|
+
if (d = decorators[i]) {
|
|
115
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
120
|
+
}
|
|
121
|
+
__name(_ts_decorate, "_ts_decorate");
|
|
122
|
+
function _ts_metadata(metadataKey, metadataValue) {
|
|
123
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
124
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
__name(_ts_metadata, "_ts_metadata");
|
|
128
|
+
var DefaultNetworkManager = class _DefaultNetworkManager {
|
|
129
|
+
static {
|
|
130
|
+
__name(this, "DefaultNetworkManager");
|
|
131
|
+
}
|
|
132
|
+
configManager;
|
|
133
|
+
logger = new import_common.Logger(_DefaultNetworkManager.name);
|
|
134
|
+
/** type-id -> Provider */
|
|
135
|
+
providers = /* @__PURE__ */ new Map();
|
|
136
|
+
/** type-id -> (network-id -> Network) */
|
|
137
|
+
store = /* @__PURE__ */ new Map();
|
|
138
|
+
checkTimer;
|
|
139
|
+
constructor(configManager) {
|
|
140
|
+
this.configManager = configManager;
|
|
141
|
+
this.checkTimer = setInterval(() => {
|
|
142
|
+
this.checkNetworks().catch((err) => this.logger.error("Network health-check failed", err));
|
|
143
|
+
}, 1e4);
|
|
144
|
+
}
|
|
145
|
+
/* ------------------------------------------------------------------ */
|
|
146
|
+
/* Provider 注册 */
|
|
147
|
+
/* ------------------------------------------------------------------ */
|
|
148
|
+
registerProvider(provider) {
|
|
149
|
+
this.providers.set(provider.type.id, provider);
|
|
150
|
+
this.logger.log(`NetworkProvider registered: ${provider.type.id}`);
|
|
151
|
+
}
|
|
152
|
+
/* ------------------------------------------------------------------ */
|
|
153
|
+
/* INetworkManager 实现 */
|
|
154
|
+
/* ------------------------------------------------------------------ */
|
|
155
|
+
async getNetwork(type, id) {
|
|
156
|
+
const networkMap = this.getNetworkStore(type.id);
|
|
157
|
+
let network = networkMap.get(id);
|
|
158
|
+
if (network) return network;
|
|
159
|
+
network = await this.createFromConfig(type, id);
|
|
160
|
+
networkMap.set(id, network);
|
|
161
|
+
return network;
|
|
162
|
+
}
|
|
163
|
+
getNetworks() {
|
|
164
|
+
const result = [];
|
|
165
|
+
for (const map of this.store.values()) {
|
|
166
|
+
for (const n of map.values()) {
|
|
167
|
+
result.push(n);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
getProviders() {
|
|
173
|
+
return Array.from(this.providers.values());
|
|
174
|
+
}
|
|
175
|
+
getProvider(typeId) {
|
|
176
|
+
return this.providers.get(typeId);
|
|
177
|
+
}
|
|
178
|
+
async reload(type, id) {
|
|
179
|
+
const provider = this.requireProvider(type.id);
|
|
180
|
+
const props = await this.configManager.getConfig(type, id);
|
|
181
|
+
if (!props || !props.enabled) return;
|
|
182
|
+
const config = await provider.createConfig(props);
|
|
183
|
+
const networkMap = this.getNetworkStore(type.id);
|
|
184
|
+
const existing = networkMap.get(id);
|
|
185
|
+
const network = existing ? await provider.reload(existing, config) : await provider.createNetwork(config);
|
|
186
|
+
networkMap.set(id, network);
|
|
187
|
+
}
|
|
188
|
+
async shutdown(type, id) {
|
|
189
|
+
const network = this.getNetworkStore(type.id).get(id);
|
|
190
|
+
if (network) {
|
|
191
|
+
await network.shutdown();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async destroy(type, id) {
|
|
195
|
+
const networkMap = this.getNetworkStore(type.id);
|
|
196
|
+
const network = networkMap.get(id);
|
|
197
|
+
if (network) {
|
|
198
|
+
networkMap.delete(id);
|
|
199
|
+
await network.shutdown();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/* ------------------------------------------------------------------ */
|
|
203
|
+
/* 生命周期 */
|
|
204
|
+
/* ------------------------------------------------------------------ */
|
|
205
|
+
async onModuleDestroy() {
|
|
206
|
+
if (this.checkTimer) {
|
|
207
|
+
clearInterval(this.checkTimer);
|
|
208
|
+
this.checkTimer = void 0;
|
|
209
|
+
}
|
|
210
|
+
const shutdowns = [];
|
|
211
|
+
for (const map of this.store.values()) {
|
|
212
|
+
for (const network of map.values()) {
|
|
213
|
+
shutdowns.push(Promise.resolve(network.shutdown()).catch((err) => this.logger.error(`Failed to shutdown network ${network.id}`, err)));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
await Promise.all(shutdowns);
|
|
217
|
+
this.store.clear();
|
|
218
|
+
}
|
|
219
|
+
/* ------------------------------------------------------------------ */
|
|
220
|
+
/* 内部方法 */
|
|
221
|
+
/* ------------------------------------------------------------------ */
|
|
222
|
+
getNetworkStore(typeId) {
|
|
223
|
+
let map = this.store.get(typeId);
|
|
224
|
+
if (!map) {
|
|
225
|
+
map = /* @__PURE__ */ new Map();
|
|
226
|
+
this.store.set(typeId, map);
|
|
227
|
+
}
|
|
228
|
+
return map;
|
|
229
|
+
}
|
|
230
|
+
requireProvider(typeId) {
|
|
231
|
+
const provider = this.providers.get(typeId);
|
|
232
|
+
if (!provider) {
|
|
233
|
+
throw new Error(`Unsupported network type: ${typeId}`);
|
|
234
|
+
}
|
|
235
|
+
return provider;
|
|
236
|
+
}
|
|
237
|
+
async createFromConfig(type, id) {
|
|
238
|
+
const provider = this.requireProvider(type.id);
|
|
239
|
+
const props = await this.configManager.getConfig(type, id);
|
|
240
|
+
if (!props || !props.enabled) {
|
|
241
|
+
throw new Error(`Network config not found or disabled: ${type.id}/${id}`);
|
|
242
|
+
}
|
|
243
|
+
const config = await provider.createConfig(props);
|
|
244
|
+
return provider.createNetwork(config);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 定期检查网络组件存活状态 — 与 jetlinks checkNetwork() 逻辑对齐。
|
|
248
|
+
*/
|
|
249
|
+
async checkNetworks() {
|
|
250
|
+
for (const [typeId, networkMap] of this.store) {
|
|
251
|
+
const provider = this.providers.get(typeId);
|
|
252
|
+
if (!provider) continue;
|
|
253
|
+
for (const [id, network] of networkMap) {
|
|
254
|
+
if (network.isAlive() || !network.isAutoReload()) continue;
|
|
255
|
+
try {
|
|
256
|
+
const props = await this.configManager.getConfig(network.type, id);
|
|
257
|
+
if (!props || !props.enabled) continue;
|
|
258
|
+
const config = await provider.createConfig(props);
|
|
259
|
+
const reloaded = await provider.reload(network, config);
|
|
260
|
+
networkMap.set(id, reloaded);
|
|
261
|
+
this.logger.log(`Reloaded network: ${typeId}/${id}`);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
this.logger.warn(`Failed to reload network ${typeId}/${id}`, err);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
DefaultNetworkManager = _ts_decorate([
|
|
270
|
+
(0, import_common.Injectable)(),
|
|
271
|
+
_ts_metadata("design:type", Function),
|
|
272
|
+
_ts_metadata("design:paramtypes", [
|
|
273
|
+
typeof NetworkConfigManager === "undefined" ? Object : NetworkConfigManager
|
|
274
|
+
])
|
|
275
|
+
], DefaultNetworkManager);
|
|
276
|
+
|
|
277
|
+
// src/codec.ts
|
|
278
|
+
var JsonCodec = class {
|
|
279
|
+
static {
|
|
280
|
+
__name(this, "JsonCodec");
|
|
281
|
+
}
|
|
282
|
+
id;
|
|
283
|
+
transport;
|
|
284
|
+
constructor(id, transport) {
|
|
285
|
+
this.id = id;
|
|
286
|
+
this.transport = transport;
|
|
287
|
+
}
|
|
288
|
+
encode(message) {
|
|
289
|
+
return Buffer.from(JSON.stringify(message));
|
|
290
|
+
}
|
|
291
|
+
decode(payload) {
|
|
292
|
+
return JSON.parse(payload.toString("utf-8"));
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// src/network.module.ts
|
|
297
|
+
var import_common2 = require("@nestjs/common");
|
|
298
|
+
function _ts_decorate2(decorators, target, key, desc) {
|
|
299
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
300
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
301
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
302
|
+
} else {
|
|
303
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
304
|
+
if (d = decorators[i]) {
|
|
305
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
310
|
+
}
|
|
311
|
+
__name(_ts_decorate2, "_ts_decorate");
|
|
312
|
+
var NETWORK_MANAGER = /* @__PURE__ */ Symbol("NETWORK_MANAGER");
|
|
313
|
+
var NETWORK_CONFIG_MANAGER = /* @__PURE__ */ Symbol("NETWORK_CONFIG_MANAGER");
|
|
314
|
+
var ZuckerNetworkModule = class _ZuckerNetworkModule {
|
|
315
|
+
static {
|
|
316
|
+
__name(this, "ZuckerNetworkModule");
|
|
317
|
+
}
|
|
318
|
+
static forRoot(options) {
|
|
319
|
+
const configManagerProvider = typeof options.configManager === "function" ? {
|
|
320
|
+
provide: NETWORK_CONFIG_MANAGER,
|
|
321
|
+
useClass: options.configManager
|
|
322
|
+
} : options.configManager;
|
|
323
|
+
const networkManagerProvider = {
|
|
324
|
+
provide: NETWORK_MANAGER,
|
|
325
|
+
useFactory: /* @__PURE__ */ __name((configManager) => {
|
|
326
|
+
return new DefaultNetworkManager(configManager);
|
|
327
|
+
}, "useFactory"),
|
|
328
|
+
inject: [
|
|
329
|
+
NETWORK_CONFIG_MANAGER
|
|
330
|
+
]
|
|
331
|
+
};
|
|
332
|
+
return {
|
|
333
|
+
module: _ZuckerNetworkModule,
|
|
334
|
+
global: true,
|
|
335
|
+
providers: [
|
|
336
|
+
configManagerProvider,
|
|
337
|
+
networkManagerProvider
|
|
338
|
+
],
|
|
339
|
+
exports: [
|
|
340
|
+
NETWORK_MANAGER,
|
|
341
|
+
NETWORK_CONFIG_MANAGER
|
|
342
|
+
]
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
ZuckerNetworkModule = _ts_decorate2([
|
|
347
|
+
(0, import_common2.Module)({})
|
|
348
|
+
], ZuckerNetworkModule);
|
|
349
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
350
|
+
0 && (module.exports = {
|
|
351
|
+
DefaultNetworkManager,
|
|
352
|
+
JsonCodec,
|
|
353
|
+
NETWORK_CONFIG_MANAGER,
|
|
354
|
+
NETWORK_MANAGER,
|
|
355
|
+
NetworkTypes,
|
|
356
|
+
Transports,
|
|
357
|
+
ZuckerNetworkModule,
|
|
358
|
+
createTransport,
|
|
359
|
+
networkType,
|
|
360
|
+
networkTypeRegistry
|
|
361
|
+
});
|