Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

websocket透传ws实例给options里的事件 #1445

Merged
merged 2 commits into from
Jan 20, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions packages/hooks/src/useWebSocket/demo/demo2.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import React, { useRef, useMemo } from 'react';
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议把 demo2 删了吧,没有啥特别大的差异。

其它都没问题了。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好,删掉了。

import { useWebSocket } from 'ahooks';

enum ReadyState {
Connecting = 0,
Open = 1,
Closing = 2,
Closed = 3,
}

export default () => {
const messageHistory = useRef<any[]>([]);

const { readyState, sendMessage, latestMessage, disconnect, connect } = useWebSocket(
'wss://echo.websocket.org',
{
onOpen(e, ws) {
ws.send('hello');
},
},
);

messageHistory.current = useMemo(
() => messageHistory.current.concat(latestMessage),
[latestMessage],
);

return (
<div>
{/* send message */}
<button
onClick={() => sendMessage && sendMessage(`${Date.now()}`)}
disabled={readyState !== ReadyState.Open}
style={{ marginRight: 8 }}
>
✉️ send
</button>
{/* disconnect */}
<button
onClick={() => disconnect && disconnect()}
disabled={readyState !== ReadyState.Open}
style={{ marginRight: 8 }}
>
❌ disconnect
</button>
{/* connect */}
<button onClick={() => connect && connect()} disabled={readyState === ReadyState.Open}>
{readyState === ReadyState.Connecting ? 'connecting' : '📞 connect'}
</button>
<div style={{ marginTop: 8 }}>readyState: {readyState}</div>
<div style={{ marginTop: 8 }}>
<p>received message: </p>
{messageHistory.current.map((message, index) => (
<p key={index}>{message?.data}</p>
))}
</div>
</div>
);
};
20 changes: 12 additions & 8 deletions packages/hooks/src/useWebSocket/index.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ A hook for WebSocket.

<code src="./demo/demo1.tsx" />

### Options Provided

<code src="./demo/demo2.tsx" />

## API

```typescript
Expand All @@ -26,10 +30,10 @@ enum ReadyState {
interface Options {
reconnectLimit?: number;
reconnectInterval?: number;
onOpen?: (event: WebSocketEventMap['open']) => void;
onClose?: (event: WebSocketEventMap['close']) => void;
onMessage?: (message: WebSocketEventMap['message']) => void;
onError?: (event: WebSocketEventMap['error']) => void;
onOpen?: (event: WebSocketEventMap['open'], instance: WebSocket) => void;
onClose?: (event: WebSocketEventMap['close'], instance: WebSocket) => void;
onMessage?: (message: WebSocketEventMap['message'], instance: WebSocket) => void;
onError?: (event: WebSocketEventMap['error'], instance: WebSocket) => void;
protocols?: string | string[];
}

Expand Down Expand Up @@ -57,10 +61,10 @@ useWebSocket(socketUrl: string, options?: Options): Result;

| Options Property | Description | Type | Default |
|-------------------|------------------------------------|---------------------------------------------------|---------|
| onOpen | The webSocket connect callback | `(event: WebSocketEventMap['open']) => void` | - |
| onClose | WebSocket close callback | `(event: WebSocketEventMap['close']) => void` | - |
| onMessage | WebSocket receive message callback | `(message: WebSocketEventMap['message']) => void` | - |
| onError | WebSocket error callback | `(event: WebSocketEventMap['error']) => void` | - |
| onOpen | The webSocket connect callback | `(event: WebSocketEventMap['open'], instance: WebSocket) => void` | - |
| onClose | WebSocket close callback | `(event: WebSocketEventMap['close'], instance: WebSocket) => void` | - |
| onMessage | WebSocket receive message callback | `(message: WebSocketEventMap['message'], instance: WebSocket) => void` | - |
| onError | WebSocket error callback | `(event: WebSocketEventMap['error'], instance: WebSocket) => void` | - |
| reconnectLimit | Retry times | `number` | `3` |
| reconnectInterval | Retry interval(ms) | `number` | `3000` |
| manual | Manually starts connection | `boolean` | `false` |
Expand Down
34 changes: 18 additions & 16 deletions packages/hooks/src/useWebSocket/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ export interface Options {
reconnectLimit?: number;
reconnectInterval?: number;
manual?: boolean;
onOpen?: (event: WebSocketEventMap['open']) => void;
onClose?: (event: WebSocketEventMap['close']) => void;
onMessage?: (message: WebSocketEventMap['message']) => void;
onError?: (event: WebSocketEventMap['error']) => void;
onOpen?: (event: WebSocketEventMap['open'], instance: WebSocket) => void;
onClose?: (event: WebSocketEventMap['close'], instance: WebSocket) => void;
onMessage?: (message: WebSocketEventMap['message'], instance: WebSocket) => void;
onError?: (event: WebSocketEventMap['error'], instance: WebSocket) => void;

protocols?: string | string[];
}
Expand Down Expand Up @@ -83,40 +83,42 @@ export default function useWebSocket(socketUrl: string, options: Options = {}):
websocketRef.current.close();
}

websocketRef.current = new WebSocket(socketUrl, protocols);
const ws = new WebSocket(socketUrl, protocols);
setReadyState(ReadyState.Connecting);

websocketRef.current.onerror = (event) => {
ws.onerror = (event) => {
if (unmountedRef.current) {
return;
}
reconnect();
onErrorRef.current?.(event);
setReadyState(websocketRef.current?.readyState || ReadyState.Closed);
onErrorRef.current?.(event, ws);
setReadyState(ws.readyState || ReadyState.Closed);
};
websocketRef.current.onopen = (event) => {
ws.onopen = (event) => {
if (unmountedRef.current) {
return;
}
onOpenRef.current?.(event);
onOpenRef.current?.(event, ws);
reconnectTimesRef.current = 0;
setReadyState(websocketRef.current?.readyState || ReadyState.Open);
setReadyState(ws.readyState || ReadyState.Open);
};
websocketRef.current.onmessage = (message: WebSocketEventMap['message']) => {
ws.onmessage = (message: WebSocketEventMap['message']) => {
if (unmountedRef.current) {
return;
}
onMessageRef.current?.(message);
onMessageRef.current?.(message, ws);
setLatestMessage(message);
};
websocketRef.current.onclose = (event) => {
ws.onclose = (event) => {
if (unmountedRef.current) {
return;
}
reconnect();
onCloseRef.current?.(event);
setReadyState(websocketRef.current?.readyState || ReadyState.Closed);
onCloseRef.current?.(event, ws);
setReadyState(ws.readyState || ReadyState.Closed);
};

websocketRef.current = ws;
};

const sendMessage: WebSocket['send'] = (message) => {
Expand Down
20 changes: 12 additions & 8 deletions packages/hooks/src/useWebSocket/index.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ nav:

<code src="./demo/demo1.tsx" />

### Options配置

<code src="./demo/demo2.tsx" />

## API

```typescript
Expand All @@ -26,10 +30,10 @@ enum ReadyState {
interface Options {
reconnectLimit?: number;
reconnectInterval?: number;
onOpen?: (event: WebSocketEventMap['open']) => void;
onClose?: (event: WebSocketEventMap['close']) => void;
onMessage?: (message: WebSocketEventMap['message']) => void;
onError?: (event: WebSocketEventMap['error']) => void;
onOpen?: (event: WebSocketEventMap['open'], instance: WebSocket) => void;
onClose?: (event: WebSocketEventMap['close'], instance: WebSocket) => void;
onMessage?: (message: WebSocketEventMap['message'], instance: WebSocket) => void;
onError?: (event: WebSocketEventMap['error'], instance: WebSocket) => void;
protocols?: string | string[];
}

Expand All @@ -56,10 +60,10 @@ useWebSocket(socketUrl: string, options?: Options): Result;

| 参数 | 说明 | 类型 | 默认值 |
|-------------------|------------------------|---------------------------------------------------|---------|
| onOpen | webSocket 连接成功回调 | `(event: WebSocketEventMap['open']) => void` | - |
| onClose | webSocket 关闭回调 | `(event: WebSocketEventMap['close']) => void` | - |
| onMessage | webSocket 收到消息回调 | `(message: WebSocketEventMap['message']) => void` | - |
| onError | webSocket 错误回调 | `(event: WebSocketEventMap['error']) => void` | - |
| onOpen | webSocket 连接成功回调 | `(event: WebSocketEventMap['open'], instance: WebSocket) => void` | - |
| onClose | webSocket 关闭回调 | `(event: WebSocketEventMap['close'], instance: WebSocket) => void` | - |
| onMessage | webSocket 收到消息回调 | `(message: WebSocketEventMap['message'], instance: WebSocket) => void` | - |
| onError | webSocket 错误回调 | `(event: WebSocketEventMap['error'], instance: WebSocket) => void` | - |
| reconnectLimit | 重试次数 | `number` | `3` |
| reconnectInterval | 重试时间间隔(ms) | `number` | `3000` |
| manual | 手动启动连接 | `boolean` | `false` |
Expand Down