@ichaingo/web-socket 1.3.73 → 1.3.75

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,57 @@
1
+ import { ConnectionStatus, WebSocketConfig, WebSocketEvents } from './index.js';
2
+ /**
3
+ * useSocket Hook 的配置选项
4
+ */
5
+ export interface UseSocketConfig extends WebSocketConfig {
6
+ autoConnect?: boolean;
7
+ reconnectOnMount?: boolean;
8
+ }
9
+ /**
10
+ * useSocket Hook 的返回值
11
+ */
12
+ export interface UseSocketReturn {
13
+ status: ConnectionStatus;
14
+ isConnected: boolean;
15
+ connect: () => Promise<void>;
16
+ disconnect: () => void;
17
+ send: (data: string | ArrayBuffer | Blob) => boolean;
18
+ sendJSON: (data: unknown) => boolean;
19
+ on: <K extends keyof WebSocketEvents>(event: K, listener: WebSocketEvents[K]) => void;
20
+ off: <K extends keyof WebSocketEvents>(event: K) => void;
21
+ error: Event | null;
22
+ reconnectAttempts: number;
23
+ reconnect: () => void;
24
+ }
25
+ /**
26
+ * useSocket Hook
27
+ * 提供在React组件中使用WebSocket连接的便捷方法
28
+ *
29
+ * @param config WebSocket配置选项
30
+ * @returns useSocket的返回值对象
31
+ */
32
+ export declare function useSocket(config: UseSocketConfig): UseSocketReturn;
33
+ /**
34
+ * useSocketMessage Hook
35
+ * 专门用于监听特定类型消息的简化Hook
36
+ *
37
+ * @param config WebSocket配置选项
38
+ * @param messageHandler 消息处理函数
39
+ * @returns useSocket的返回值对象
40
+ */
41
+ export declare function useSocketMessage<T = any>(config: UseSocketConfig, messageHandler: (data: T) => void): UseSocketReturn;
42
+ /**
43
+ * useSocketStatus Hook
44
+ * 专门用于监听连接状态的简化Hook
45
+ *
46
+ * @param config WebSocket配置选项
47
+ * @returns 连接状态和状态变化回调
48
+ */
49
+ export declare function useSocketStatus(config: UseSocketConfig): {
50
+ status: ConnectionStatus;
51
+ isConnected: boolean;
52
+ isConnecting: boolean;
53
+ isReconnecting: boolean;
54
+ isDisconnected: boolean;
55
+ hasError: boolean;
56
+ };
57
+ //# sourceMappingURL=useSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSocket.d.ts","sourceRoot":"","sources":["../src/useSocket.ts"],"names":[],"mappings":"AACA,OAAyB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAE9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IAGrB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IAGvB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC;IACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IAGrC,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtF,GAAG,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAGzD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAGpB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAiKlE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,GAAG,EACtC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,GAChC,eAAe,CAmBjB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;;;;;;;EAmBtD"}
@@ -0,0 +1,203 @@
1
+ import { useEffect, useRef, useState, useCallback } from 'react';
2
+ import SocketConnection, { ConnectionStatus } from './index.js';
3
+ /**
4
+ * useSocket Hook
5
+ * 提供在React组件中使用WebSocket连接的便捷方法
6
+ *
7
+ * @param config WebSocket配置选项
8
+ * @returns useSocket的返回值对象
9
+ */
10
+ export function useSocket(config) {
11
+ const [status, setStatus] = useState(ConnectionStatus.DISCONNECTED);
12
+ const [error, setError] = useState(null);
13
+ const [reconnectAttempts, setReconnectAttempts] = useState(0);
14
+ const socketRef = useRef(null);
15
+ const isInitializedRef = useRef(false);
16
+ const configRef = useRef(config);
17
+ // 更新配置引用
18
+ useEffect(() => {
19
+ configRef.current = config;
20
+ }, [config]);
21
+ // 获取或创建socket实例
22
+ const getSocket = useCallback(() => {
23
+ if (!socketRef.current) {
24
+ try {
25
+ socketRef.current = SocketConnection.getInstance(configRef.current);
26
+ }
27
+ catch (err) {
28
+ console.error('Failed to create socket instance:', err);
29
+ throw err;
30
+ }
31
+ }
32
+ return socketRef.current;
33
+ }, []);
34
+ // 连接WebSocket
35
+ const connect = useCallback(async () => {
36
+ try {
37
+ setError(null);
38
+ const socket = getSocket();
39
+ await socket.connect();
40
+ }
41
+ catch (err) {
42
+ const errorEvent = err;
43
+ setError(errorEvent);
44
+ throw err;
45
+ }
46
+ }, [getSocket]);
47
+ // 断开连接
48
+ const disconnect = useCallback(() => {
49
+ const socket = socketRef.current;
50
+ if (socket) {
51
+ socket.disconnect();
52
+ }
53
+ }, []);
54
+ // 发送消息
55
+ const send = useCallback((data) => {
56
+ const socket = socketRef.current;
57
+ if (socket) {
58
+ return socket.send(data);
59
+ }
60
+ return false;
61
+ }, []);
62
+ // 发送JSON消息
63
+ const sendJSON = useCallback((data) => {
64
+ const socket = socketRef.current;
65
+ if (socket) {
66
+ return socket.sendJSON(data);
67
+ }
68
+ return false;
69
+ }, []);
70
+ // 添加事件监听器
71
+ const on = useCallback((event, listener) => {
72
+ const socket = socketRef.current;
73
+ if (socket) {
74
+ socket.on(event, listener);
75
+ }
76
+ }, []);
77
+ // 移除事件监听器
78
+ const off = useCallback((event) => {
79
+ const socket = socketRef.current;
80
+ if (socket) {
81
+ socket.off(event);
82
+ }
83
+ }, []);
84
+ // 手动重连
85
+ const reconnect = useCallback(async () => {
86
+ disconnect();
87
+ await new Promise(resolve => setTimeout(resolve, 1000)); // 等待1秒
88
+ await connect();
89
+ }, [disconnect, connect]);
90
+ // 初始化socket和事件监听
91
+ useEffect(() => {
92
+ if (isInitializedRef.current)
93
+ return;
94
+ try {
95
+ const socket = getSocket();
96
+ // 监听状态变化
97
+ socket.on('statusChange', (newStatus) => {
98
+ setStatus(newStatus);
99
+ // 更新重连次数
100
+ if (newStatus === ConnectionStatus.RECONNECTING) {
101
+ setReconnectAttempts(prev => prev + 1);
102
+ }
103
+ else if (newStatus === ConnectionStatus.CONNECTED) {
104
+ setReconnectAttempts(0);
105
+ }
106
+ });
107
+ // 监听错误
108
+ socket.on('error', (errorEvent) => {
109
+ setError(errorEvent);
110
+ });
111
+ // 监听连接关闭
112
+ socket.on('close', () => {
113
+ setError(null);
114
+ });
115
+ isInitializedRef.current = true;
116
+ }
117
+ catch (err) {
118
+ console.error('Failed to initialize socket:', err);
119
+ setError(err);
120
+ }
121
+ }, [getSocket]);
122
+ // 自动连接
123
+ useEffect(() => {
124
+ if (config.autoConnect !== false && !isInitializedRef.current) {
125
+ connect().catch(console.error);
126
+ }
127
+ }, [config.autoConnect, connect]);
128
+ // 组件卸载时清理
129
+ useEffect(() => {
130
+ return () => {
131
+ const socket = socketRef.current;
132
+ if (socket && config.autoConnect !== false) {
133
+ socket.disconnect();
134
+ }
135
+ };
136
+ }, [config.autoConnect]);
137
+ // 检查是否已连接
138
+ const isConnected = status === ConnectionStatus.CONNECTED;
139
+ return {
140
+ status,
141
+ isConnected,
142
+ connect,
143
+ disconnect,
144
+ send,
145
+ sendJSON,
146
+ on,
147
+ off,
148
+ error,
149
+ reconnectAttempts,
150
+ reconnect,
151
+ };
152
+ }
153
+ /**
154
+ * useSocketMessage Hook
155
+ * 专门用于监听特定类型消息的简化Hook
156
+ *
157
+ * @param config WebSocket配置选项
158
+ * @param messageHandler 消息处理函数
159
+ * @returns useSocket的返回值对象
160
+ */
161
+ export function useSocketMessage(config, messageHandler) {
162
+ const socket = useSocket(config);
163
+ useEffect(() => {
164
+ socket.on('message', (data) => {
165
+ try {
166
+ const parsedData = typeof data === 'string' ? JSON.parse(data) : data;
167
+ messageHandler(parsedData);
168
+ }
169
+ catch (err) {
170
+ console.error('Failed to parse message:', err);
171
+ }
172
+ });
173
+ return () => {
174
+ socket.off('message');
175
+ };
176
+ }, [socket, messageHandler]);
177
+ return socket;
178
+ }
179
+ /**
180
+ * useSocketStatus Hook
181
+ * 专门用于监听连接状态的简化Hook
182
+ *
183
+ * @param config WebSocket配置选项
184
+ * @returns 连接状态和状态变化回调
185
+ */
186
+ export function useSocketStatus(config) {
187
+ const [status, setStatus] = useState(ConnectionStatus.DISCONNECTED);
188
+ const socket = useSocket(config);
189
+ useEffect(() => {
190
+ socket.on('statusChange', setStatus);
191
+ return () => {
192
+ socket.off('statusChange');
193
+ };
194
+ }, [socket]);
195
+ return {
196
+ status,
197
+ isConnected: status === ConnectionStatus.CONNECTED,
198
+ isConnecting: status === ConnectionStatus.CONNECTING,
199
+ isReconnecting: status === ConnectionStatus.RECONNECTING,
200
+ isDisconnected: status === ConnectionStatus.DISCONNECTED,
201
+ hasError: status === ConnectionStatus.ERROR,
202
+ };
203
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ichaingo/web-socket",
3
- "version": "1.3.73",
3
+ "version": "1.3.75",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",