sx-peerjs-http-util 1.0.6 → 1.2.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.
@@ -0,0 +1,172 @@
1
+ /**
2
+ * PeerJsWrapper - 封装 PeerJS 为类似 HTTP 的 API
3
+ *
4
+ * 核心功能:
5
+ * 1. 类似 HTTP 的请求/响应机制(send/relaySend)
6
+ * 2. 语音/视频通话(call/onIncomingCall)
7
+ * 3. 中继路由(relaySend/getRoutingTable/getKnownNodes)
8
+ *
9
+ * @example
10
+ * // 基本请求
11
+ * const wrapper = new PeerJsWrapper();
12
+ * const data = await wrapper.send(peerId, '/api/hello', { name: 'world' });
13
+ *
14
+ * // 中继请求
15
+ * await wrapper.relaySend(targetId, '/api/data', 'test', ['relayNode1', 'relayNode2']);
16
+ *
17
+ * // 语音通话
18
+ * const call = await wrapper.call(peerId, { video: true });
19
+ */
20
+ import type { Request, Response, SimpleHandler, CallOptions, CallSession, CallState, CallStateListener, IncomingCallEvent, IncomingCallListener, RouteEntry, RelayConfig, RelayMessage, ServerConfig } from './types';
21
+ export declare const VERSION: string;
22
+ /**
23
+ * PeerJsWrapper 主类
24
+ * 封装 PeerJS,提供类似 HTTP 的 API
25
+ */
26
+ export declare class PeerJsWrapper {
27
+ /** 本地 Peer ID */
28
+ private myPeerId;
29
+ /** PeerJS 实例 */
30
+ private peerInstance;
31
+ /** 当前活跃的传入连接集合 */
32
+ private connections;
33
+ /** 待处理的请求映射表(用于请求-响应匹配) */
34
+ private pendingRequests;
35
+ /** 路径处理器映射表 */
36
+ private simpleHandlers;
37
+ /** 重连定时器 */
38
+ private reconnectTimer;
39
+ /** 是否已销毁 */
40
+ private isDestroyed;
41
+ /** 是否开启调试模式 */
42
+ private isDebug;
43
+ /** 服务器配置 */
44
+ private serverConfig?;
45
+ /** 当前活跃的通话 */
46
+ private activeCall;
47
+ /** 来电监听器集合 */
48
+ private incomingCallListeners;
49
+ /** 路由管理器 */
50
+ private router;
51
+ /** 消息处理器 */
52
+ private messageHandler;
53
+ /**
54
+ * 创建 PeerJsWrapper 实例
55
+ * @param peerId 可选的 Peer ID,如果不提供则自动生成 UUID
56
+ * @param isDebug 是否开启调试模式,开启后会打印事件日志
57
+ * @param server 可选的信令服务器配置,不提供则使用 PeerJS 公共服务器
58
+ * @param relayConfig 可选的中继配置
59
+ */
60
+ constructor(peerId?: string, isDebug?: boolean, server?: ServerConfig, relayConfig?: RelayConfig);
61
+ /**
62
+ * 创建实例并等待就绪(语法糖)
63
+ * @param peerId 可选的 Peer ID
64
+ * @param isDebug 是否开启调试模式
65
+ * @param server 可选的信令服务器配置
66
+ * @param relayConfig 可选的中继配置
67
+ * @returns Promise<PeerJsWrapper>
68
+ */
69
+ static create(peerId?: string, isDebug?: boolean, server?: ServerConfig, relayConfig?: RelayConfig): Promise<PeerJsWrapper>;
70
+ private debugLog;
71
+ private connect;
72
+ private setupPeerEventHandlers;
73
+ private scheduleReconnect;
74
+ private reconnect;
75
+ getPeerId(): string;
76
+ private whenReady;
77
+ private waitForReady;
78
+ getRoutingTable(): Record<string, RouteEntry>;
79
+ getKnownNodes(): string[];
80
+ /**
81
+ * 发送中继消息的辅助方法
82
+ * @param targetId 目标节点 ID
83
+ * @param message 中继消息
84
+ */
85
+ private sendRelayMessage;
86
+ /**
87
+ * 尝试直连目标节点
88
+ * @param targetId 目标节点 ID
89
+ * @param path 请求路径
90
+ * @param data 请求数据
91
+ * @param requestId 请求 ID
92
+ * @returns Promise<unknown> - 响应数据
93
+ */
94
+ private tryDirectConnect;
95
+ /**
96
+ * 通过中继节点转发请求
97
+ * @param nextHopId 下一跳节点 ID
98
+ * @param targetId 原始目标节点 ID
99
+ * @param path 请求路径
100
+ * @param data 请求数据
101
+ * @returns Promise<unknown> - 响应数据
102
+ */
103
+ private relayVia;
104
+ /**
105
+ * 自动路由发送
106
+ *
107
+ * 1. 查路由表 → 有路由 → 尝试中继 → 全部失败 → 降级直连 → 失败 → 结束
108
+ * 2. 路由表无目标 → 直连 → 失败 → 结束
109
+ * @param peerId 目标节点 ID
110
+ * @param path 请求路径
111
+ * @param data 请求数据
112
+ * @returns Promise<unknown> - 响应数据
113
+ */
114
+ send(peerId: string, path: string, data?: unknown): Promise<unknown>;
115
+ /**
116
+ * 处理发送错误
117
+ * @param peerId 目标节点 ID
118
+ * @param error 错误对象
119
+ * @returns Promise
120
+ */
121
+ private handleSendError;
122
+ /**
123
+ * 降级到直连尝试
124
+ * @param peerId 目标节点 ID
125
+ * @param path 请求路径
126
+ * @param data 请求数据
127
+ * @param requestId 请求 ID
128
+ * @returns Promise
129
+ */
130
+ private fallbackToDirect;
131
+ /**
132
+ * 尝试通过中继链转发
133
+ * @param targetId 目标节点 ID
134
+ * @param path 请求路径
135
+ * @param data 请求数据
136
+ * @param nextHops 下一跳列表
137
+ * @param index 当前尝试的下一跳索引
138
+ * @returns Promise<unknown>
139
+ */
140
+ private tryRelayChain;
141
+ /**
142
+ * 执行路由发现
143
+ * @param targetId 目标节点 ID
144
+ * @param path 请求路径
145
+ * @param data 请求数据
146
+ * @param requestId 请求 ID
147
+ * @returns Promise<unknown>
148
+ */
149
+ private performRouteDiscovery;
150
+ /**
151
+ * 中继发送(内部方法,不对外暴露)
152
+ * @param targetId 目标节点 ID
153
+ * @param path 请求路径
154
+ * @param data 请求数据
155
+ * @param relayNodes 手动指定的中继节点(可选,不指定则自动路由)
156
+ * @returns Promise<unknown>
157
+ */
158
+ private relaySend;
159
+ private setupIncomingConnectionHandler;
160
+ call(peerId: string, options?: CallOptions): Promise<CallSession>;
161
+ onIncomingCall(listener: IncomingCallListener): void;
162
+ offIncomingCall(listener: IncomingCallListener): void;
163
+ getActiveCall(): CallSession | null;
164
+ private setupMediaConnectionHandlers;
165
+ private cleanupCall;
166
+ private handleIncomingCall;
167
+ registerHandler(path: string, handler: SimpleHandler): void;
168
+ unregisterHandler(path: string): void;
169
+ destroy(): void;
170
+ }
171
+ export type { Request, Response, SimpleHandler, CallOptions, CallSession, CallState, CallStateListener, IncomingCallEvent, IncomingCallListener, RouteEntry, RelayConfig, RelayMessage };
172
+ //# sourceMappingURL=PeerJsWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeerJsWrapper.d.ts","sourceRoot":"","sources":["../src/PeerJsWrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Router - 路由管理器
3
+ *
4
+ * 负责中继通信的核心功能:
5
+ * - 维护直连节点列表及延迟(directNodes)
6
+ * - 维护路由表(routingTable):目标节点 -> 多个下一跳(含延迟)
7
+ * - 广播路由更新到邻居节点
8
+ * - 路由发现:当直连和路由表都失败时,广播询问谁能连通目标
9
+ * - 处理路由查询和响应
10
+ *
11
+ * 路由机制:
12
+ * 1. 每次成功通信后,记录对方节点为直连节点并测量延迟
13
+ * 2. 成功后广播路由更新,告知对方自己可达的节点
14
+ * 3. 收到路由更新后,合并到本地路由表
15
+ * 4. 直连失败且路由表为空时,执行路由发现广播
16
+ */
17
+ import type { Peer } from 'peerjs';
18
+ import type { RouteEntry, NextHop, DirectNodeLatency, RelayConfig, RelayMessage } from './types';
19
+ /**
20
+ * 路由管理器回调接口
21
+ */
22
+ export interface RoutingCallbacks {
23
+ /** 获取本地 Peer ID */
24
+ getMyPeerId(): string;
25
+ /** 获取 PeerJS 实例 */
26
+ getPeerInstance(): Peer | null;
27
+ /** 调试日志函数 */
28
+ debugLog: (obj: string, event: string, data?: unknown) => void;
29
+ /** 发送中继消息 */
30
+ sendRelayMessage(targetId: string, message: RelayMessage): Promise<void>;
31
+ /** 处理路由查询响应 */
32
+ onRouteDiscoveryResponse?: (targetId: string, latency: number) => void;
33
+ }
34
+ /**
35
+ * 路由器类
36
+ * 负责维护路由表、节点发现和自动路由选择
37
+ */
38
+ export declare class Router {
39
+ /** 路由表:target -> RouteEntry */
40
+ private routingTable;
41
+ /** 直连节点及延迟列表 */
42
+ private directNodes;
43
+ /** 中继配置 */
44
+ private relayConfig;
45
+ /** 回调函数集合 */
46
+ private callbacks;
47
+ /** 等待路由发现响应的 pending 队列 */
48
+ private pendingRouteQueries;
49
+ /** 定时清理定时器 */
50
+ private cleanupTimer;
51
+ /** 周期广播定时器 */
52
+ private broadcastTimer;
53
+ /**
54
+ * 创建路由管理器
55
+ * @param callbacks 回调函数集合
56
+ * @param relayConfig 中继配置(可选)
57
+ */
58
+ constructor(callbacks: RoutingCallbacks, relayConfig?: RelayConfig);
59
+ /**
60
+ * 初始化路由管理器(从 IndexedDB 加载数据并启动定时任务)
61
+ */
62
+ init(): Promise<void>;
63
+ /**
64
+ * 从 IndexedDB 加载路由数据
65
+ */
66
+ private loadFromDB;
67
+ /**
68
+ * 启动定时维护任务
69
+ */
70
+ private startMaintenanceTasks;
71
+ /**
72
+ * 清理过期路由条目
73
+ */
74
+ private cleanupExpiredEntries;
75
+ /**
76
+ * 持久化路由表到 IndexedDB
77
+ */
78
+ persist(): Promise<void>;
79
+ /**
80
+ * 销毁路由管理器(清理定时器)
81
+ */
82
+ destroy(): void;
83
+ /**
84
+ * 记录成功的直连通信
85
+ * @param nodeId 节点 ID
86
+ * @param latency 延迟(毫秒)
87
+ */
88
+ recordDirectNode(nodeId: string, latency: number): void;
89
+ /**
90
+ * 获取直连节点列表(按延迟升序)
91
+ * @returns 直连节点列表
92
+ */
93
+ getDirectNodes(): DirectNodeLatency[];
94
+ /**
95
+ * 检查是否可以直连目标节点
96
+ * @param targetId 目标节点 ID
97
+ * @returns 是否可以直连
98
+ */
99
+ canReachDirectly(targetId: string): boolean;
100
+ /**
101
+ * 获取到直连节点的延迟
102
+ * @param nodeId 节点 ID
103
+ * @returns 延迟(毫秒),如果不存在返回 null
104
+ */
105
+ getDirectLatency(nodeId: string): number | null;
106
+ /**
107
+ * 移除失效的路由(通信失败时调用)
108
+ * @param nodeId 失效的节点 ID
109
+ */
110
+ removeRoute(nodeId: string): void;
111
+ /**
112
+ * 检查路由表是否为空
113
+ * @returns 是否为空
114
+ */
115
+ isRoutingTableEmpty(): boolean;
116
+ /**
117
+ * 记录成功通信的节点(兼容旧接口)
118
+ * @param nodeId 节点 ID
119
+ */
120
+ recordSuccessfulNode(nodeId: string): void;
121
+ /**
122
+ * 广播路由更新
123
+ * 向所有直连节点发送路由更新消息,告知它们本节点可达的节点列表
124
+ */
125
+ broadcastRouteUpdate(): Promise<void>;
126
+ /**
127
+ * 获取本节点可达的节点列表
128
+ * @returns 可达节点数组(直连节点 + 自己)
129
+ */
130
+ private getReachableNodes;
131
+ /**
132
+ * 发送路由更新到指定节点
133
+ * @param targetId 目标节点 ID
134
+ * @param reachableNodes 可达的节点列表
135
+ */
136
+ private sendRouteUpdate;
137
+ /**
138
+ * 处理收到的路由更新
139
+ * 合并对端发来的可达节点信息到本地路由表
140
+ * @param fromPeerId 发送路由更新的节点 ID
141
+ * @param message 路由更新消息
142
+ */
143
+ handleRouteUpdate(fromPeerId: string, message: RelayMessage): void;
144
+ /**
145
+ * 执行路由发现广播
146
+ * 当直连和路由表都失败时,向所有直连节点广播询问谁能连通目标
147
+ * @param targetId 目标节点 ID
148
+ * @returns 路由条目(如果发现)
149
+ */
150
+ discoverRoute(targetId: string): Promise<RouteEntry | null>;
151
+ /**
152
+ * 处理路由查询消息
153
+ * @param fromPeerId 发送查询的节点
154
+ * @param message 路由查询消息
155
+ */
156
+ handleRouteQuery(fromPeerId: string, message: RelayMessage): void;
157
+ /**
158
+ * 处理路由查询响应
159
+ * @param fromPeerId 响应者节点
160
+ * @param message 路由响应消息
161
+ */
162
+ handleRouteResponse(fromPeerId: string, message: RelayMessage): void;
163
+ /**
164
+ * 查找到目标节点的下一跳
165
+ * @param targetId 目标节点 ID
166
+ * @returns 下一跳信息,如果没有则返回 null
167
+ */
168
+ findNextHopToTarget(targetId: string): NextHop | null;
169
+ /**
170
+ * 获取到目标节点的所有下一跳(按延迟升序)
171
+ * @param targetId 目标节点 ID
172
+ * @returns 下一跳列表
173
+ */
174
+ getNextHopsToTarget(targetId: string): NextHop[];
175
+ /**
176
+ * 获取路由表
177
+ * @returns 路由表对象
178
+ */
179
+ getRoutingTable(): Record<string, RouteEntry>;
180
+ /**
181
+ * 获取已知节点列表(兼容旧接口)
182
+ * @returns 节点 ID 数组
183
+ */
184
+ getKnownNodes(): string[];
185
+ }
186
+ //# sourceMappingURL=Router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * RoutingDB.ts - 路由表 IndexedDB 持久化模块
3
+ *
4
+ * 提供路由表的持久化存储功能,使用 IndexedDB 而非 localStorage
5
+ * 以支持大规模路由表存储
6
+ *
7
+ * 数据库结构:
8
+ * - peerjs-routing-db (版本 1)
9
+ * - routing-table: 路由表条目 (keyPath: target)
10
+ * - direct-nodes: 直连节点 (keyPath: nodeId)
11
+ */
12
+ import type { RouteEntry, DirectNodeLatency } from './types';
13
+ /**
14
+ * 初始化数据库
15
+ * @returns Promise<void>
16
+ */
17
+ export declare function initRoutingDB(): Promise<void>;
18
+ /**
19
+ * 保存路由表条目
20
+ * @param entry 路由表条目
21
+ */
22
+ export declare function saveRouteEntry(entry: RouteEntry): Promise<void>;
23
+ /**
24
+ * 批量保存路由表条目
25
+ * @param entries 路由表条目数组
26
+ */
27
+ export declare function saveRouteEntries(entries: RouteEntry[]): Promise<void>;
28
+ /**
29
+ * 删除路由表条目
30
+ * @param target 目标节点 ID
31
+ */
32
+ export declare function deleteRouteEntry(target: string): Promise<void>;
33
+ /**
34
+ * 加载全部路由表
35
+ * @returns Promise<RouteEntry[]>
36
+ */
37
+ export declare function loadRoutingTable(): Promise<RouteEntry[]>;
38
+ /**
39
+ * 清理过期路由表条目
40
+ * @param maxAgeMs 最大保留时间(毫秒),默认 5 分钟
41
+ * @returns Promise<number> 删除的条目数量
42
+ */
43
+ export declare function cleanupExpiredRoutes(maxAgeMs?: number): Promise<number>;
44
+ /**
45
+ * 保存直连节点
46
+ * @param node 直连节点
47
+ */
48
+ export declare function saveDirectNode(node: DirectNodeLatency): Promise<void>;
49
+ /**
50
+ * 批量保存直连节点
51
+ * @param nodes 直连节点数组
52
+ */
53
+ export declare function saveDirectNodes(nodes: DirectNodeLatency[]): Promise<void>;
54
+ /**
55
+ * 加载全部直连节点
56
+ * @returns Promise<DirectNodeLatency[]>
57
+ */
58
+ export declare function loadDirectNodes(): Promise<DirectNodeLatency[]>;
59
+ /**
60
+ * 删除直连节点
61
+ * @param nodeId 节点 ID
62
+ */
63
+ export declare function deleteDirectNode(nodeId: string): Promise<void>;
64
+ /**
65
+ * 清理过期直连节点
66
+ * @param maxAgeMs 最大保留时间(毫秒),默认 5 分钟
67
+ * @returns Promise<number> 删除的节点数量
68
+ */
69
+ export declare function cleanupExpiredNodes(maxAgeMs?: number): Promise<number>;
70
+ /**
71
+ * 清除全部路由数据
72
+ * @returns Promise<void>
73
+ */
74
+ export declare function clearAllRoutingData(): Promise<void>;
75
+ //# sourceMappingURL=RoutingDB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoutingDB.d.ts","sourceRoot":"","sources":["../src/RoutingDB.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA+E7D;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAE9D;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,GAAE,MAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBlG;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/E;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAEpE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,GAAE,MAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBjG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBzD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 常量定义
3
+ * 集中管理所有魔法数字和配置值
4
+ */
5
+ /** 连接超时(毫秒) */
6
+ export declare const CONNECTION_TIMEOUT_MS = 30000;
7
+ /** 发送超时(毫秒) */
8
+ export declare const SEND_TIMEOUT_MS = 10000;
9
+ /** 重连延迟(毫秒) */
10
+ export declare const RECONNECT_DELAY_MS = 1000;
11
+ /** 路由过期时间(毫秒) */
12
+ export declare const ROUTE_EXPIRE_AGE_MS: number;
13
+ /** 路由表容量限制 */
14
+ export declare const MAX_ROUTING_ENTRIES = 50;
15
+ /** 直连节点容量限制 */
16
+ export declare const MAX_DIRECT_NODES = 5;
17
+ /** 路由清理周期(毫秒) */
18
+ export declare const ROUTE_CLEANUP_INTERVAL_MS: number;
19
+ /** 路由广播周期(毫秒) */
20
+ export declare const ROUTE_BROADCAST_INTERVAL_MS: number;
21
+ /** 默认 TTL(Time To Live)- 消息最大跳数 */
22
+ export declare const DEFAULT_TTL = 128;
23
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAe;AACf,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAE3C,eAAe;AACf,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,eAAe;AACf,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,iBAAiB;AACjB,eAAO,MAAM,mBAAmB,QAAgB,CAAC;AAEjD,cAAc;AACd,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,eAAe;AACf,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,iBAAiB;AACjB,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD,iBAAiB;AACjB,eAAO,MAAM,2BAA2B,QAAY,CAAC;AAErD,mCAAmC;AACnC,eAAO,MAAM,WAAW,MAAM,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,185 +1,4 @@
1
- import type { Request, Response, SimpleHandler, CallOptions, CallSession, CallState, CallStateListener, IncomingCallEvent, IncomingCallListener } from './types';
2
- export declare const VERSION: string;
3
- /**
4
- * 服务器配置(PeerJS 信令服务器)
5
- */
6
- export interface ServerConfig {
7
- host?: string;
8
- port?: number;
9
- path?: string;
10
- secure?: boolean;
11
- }
12
- /**
13
- * PeerJsWrapper - 封装 PeerJS 为类似 HTTP 的 API
14
- *
15
- * @example
16
- * ```js
17
- * const wrapper = new PeerJsWrapper();
18
- * const data = await wrapper.send(peerId, '/api/hello', { name: 'world' });
19
- * console.log(data); // 直接输出响应数据
20
- *
21
- * // 服务端注册处理器
22
- * wrapper.registerHandler('/api/hello', (data) => {
23
- * return { message: 'hello' }; // 直接返回数据
24
- * });
25
- * ```
26
- */
27
- export declare class PeerJsWrapper {
28
- /**
29
- * 本地 Peer ID,构造时确定(传入或自动生成)
30
- */
31
- private myPeerId;
32
- /**
33
- * PeerJS 实例
34
- */
35
- private peerInstance;
36
- /**
37
- * 当前活跃的传入连接集合
38
- */
39
- private connections;
40
- /**
41
- * 待处理的请求映射表(用于请求-响应匹配)
42
- */
43
- private pendingRequests;
44
- /**
45
- * 路径处理器映射表
46
- */
47
- private simpleHandlers;
48
- /**
49
- * 重连定时器
50
- */
51
- private reconnectTimer;
52
- /**
53
- * 是否已销毁
54
- */
55
- private isDestroyed;
56
- /**
57
- * 是否开启调试模式
58
- */
59
- private isDebug;
60
- /**
61
- * 服务器配置
62
- */
63
- private serverConfig?;
64
- /**
65
- * 当前活跃的通话
66
- */
67
- private activeCall;
68
- /**
69
- * 来电监听器集合
70
- */
71
- private incomingCallListeners;
72
- /**
73
- * 创建 PeerJsWrapper 实例
74
- * @param peerId 可选的 Peer ID,如果不提供则自动生成 UUID
75
- * @param isDebug 是否开启调试模式,开启后会打印事件日志
76
- * @param server 可选的信令服务器配置,不提供则使用 PeerJS 公共服务器
77
- */
78
- constructor(peerId?: string, isDebug?: boolean, server?: ServerConfig);
79
- /**
80
- * 调试日志输出
81
- * @param obj 对象名
82
- * @param event 事件名
83
- * @param data 事件数据
84
- */
85
- private debugLog;
86
- /**
87
- * 连接到 PeerJS 服务器
88
- */
89
- private connect;
90
- /**
91
- * 设置 Peer 实例的事件处理器
92
- */
93
- private setupPeerEventHandlers;
94
- /**
95
- * 安排重连
96
- */
97
- private scheduleReconnect;
98
- /**
99
- * 执行重连
100
- */
101
- private reconnect;
102
- /**
103
- * 获取当前 Peer ID
104
- * @returns string 当前 Peer ID
105
- */
106
- getPeerId(): string;
107
- /**
108
- * 等待 Peer 连接就绪(连接到信令服务器)
109
- * @returns Promise<void> 当连接成功时 resolve
110
- */
111
- whenReady(): Promise<void>;
112
- /**
113
- * 等待 Peer 连接就绪
114
- */
115
- private waitForReady;
116
- /**
117
- * 发送请求到指定 Peer
118
- * @param peerId 对端设备 ID
119
- * @param path 请求路径
120
- * @param data 请求数据
121
- * @returns Promise<unknown> 返回响应数据(自动拆箱,只返回 data 部分)
122
- */
123
- send(peerId: string, path: string, data?: unknown): Promise<unknown>;
124
- /**
125
- * 设置传入连接处理器
126
- */
127
- private setupIncomingConnectionHandler;
128
- /**
129
- * 发起语音/视频通话
130
- * @param peerId 对端设备 ID
131
- * @param options 通话选项
132
- * @returns Promise<CallSession> 通话会话对象
133
- */
134
- call(peerId: string, options?: CallOptions): Promise<CallSession>;
135
- /**
136
- * 注册来电监听器
137
- * @param listener 来电回调函数
138
- */
139
- onIncomingCall(listener: IncomingCallListener): void;
140
- /**
141
- * 移除来电监听器
142
- * @param listener 来电回调函数
143
- */
144
- offIncomingCall(listener: IncomingCallListener): void;
145
- /**
146
- * 获取当前活跃的通话
147
- * @returns CallSession | null 当前通话会话,无通话时返回 null
148
- */
149
- getActiveCall(): CallSession | null;
150
- /**
151
- * 设置 MediaConnection 事件处理器
152
- */
153
- private setupMediaConnectionHandlers;
154
- /**
155
- * 清理通话资源
156
- */
157
- private cleanupCall;
158
- /**
159
- * 处理来电
160
- */
161
- private handleIncomingCall;
162
- /**
163
- * 注册简化处理器(直接返回数据,自动装箱)
164
- * @param path 请求路径
165
- * @param handler 处理器函数,接收请求数据,直接返回响应数据
166
- */
167
- registerHandler(path: string, handler: SimpleHandler): void;
168
- /**
169
- * 注销简化处理器
170
- * @param path 请求路径
171
- */
172
- unregisterHandler(path: string): void;
173
- /**
174
- * 内部请求处理方法
175
- * @param from 发送者的 Peer ID
176
- * @param request 请求数据
177
- */
178
- private handleRequest;
179
- /**
180
- * 关闭所有连接并销毁 Peer 实例
181
- */
182
- destroy(): void;
183
- }
184
- export type { Request, Response, SimpleHandler, CallOptions, CallSession, CallState, CallStateListener, IncomingCallEvent, IncomingCallListener };
1
+ export { PeerJsWrapper, VERSION } from './PeerJsWrapper';
2
+ export { initRoutingDB, loadRoutingTable, saveRouteEntry, saveRouteEntries, deleteRouteEntry, loadDirectNodes, saveDirectNode, saveDirectNodes, clearAllRoutingData } from './RoutingDB';
3
+ export type { Request, Response, SimpleHandler, CallOptions, CallSession, CallState, CallStateListener, IncomingCallEvent, IncomingCallListener, RouteEntry, NextHop, DirectNodeLatency, RelayConfig, RelayMessage, ServerConfig } from './types';
185
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,OAAO,QAAc,CAAC;AAanC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsID;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAqB;IAEzC;;OAEG;IACH,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,OAAO,CAAC,eAAe,CAOnB;IAEJ;;OAEG;IACH,OAAO,CAAC,cAAc,CAAoC;IAE1D;;OAEG;IACH,OAAO,CAAC,cAAc,CAA8C;IAEpE;;OAEG;IACH,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAU;IAEzB;;OAEG;IACH,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAgC;IAElD;;OAEG;IACH,OAAO,CAAC,qBAAqB,CAAmC;IAEhE;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,YAAY;IAOrE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,OAAO;IAUf;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAmBjB;;;OAGG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAuFpE;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAuDtC;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAwFjE;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIpD;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIrD;;;OAGG;IACH,aAAa,IAAI,WAAW,GAAG,IAAI;IAInC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAuBpC;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqE1B;;;;OAIG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAI3D;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;OAIG;YACW,aAAa;IAe3B;;OAEG;IACH,OAAO,IAAI,IAAI;CAmChB;AAGD,YAAY,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACrB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,SAAS,CAAC"}