--- category: Network --- # useWebSocket Reactive [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket) client. ## Usage ```ts import { useWebSocket } from '@vueuse/core'; const { status, data, send, open, close } = useWebSocket('ws://websocketurl'); ``` See the [Type Declarations](#type-declarations) for more options. ### immediate Enable by default. Establish the connection immediately when the composable is called. ### autoConnect Enable by default. If a URL is provided as a ref, when the URL changes, it will automatically reconnect to the new URL. ### autoClose Enable by default. This will call `close()` automatically when the `beforeunload` event is triggered or the associated effect scope is stopped. ### autoReconnect Reconnect on errors automatically (disabled by default). ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, close } = useWebSocket('ws://websocketurl', { autoReconnect: true, }); ``` Or with more controls over its behavior: ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, close } = useWebSocket('ws://websocketurl', { autoReconnect: { retries: 3, delay: 1000, onFailed() { alert('Failed to connect WebSocket after 3 retries'); }, }, }); ``` You can also pass a function to `delay` to calculate the delay based on the number of retries. This is useful for implementing exponential backoff: ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, close } = useWebSocket('ws://websocketurl', { autoReconnect: { retries: 5, // Exponential backoff: 1s, 2s, 4s, 8s, 16s delay: (retries) => Math.min(1000 * 2 ** (retries - 1), 30000), }, }); ``` ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, close } = useWebSocket('ws://websocketurl', { autoReconnect: { retries: 5, // Linear backoff: 1s, 2s, 3s, 4s, 5s delay: (retries) => retries * 1000, }, }); ``` Explicitly calling `close()` won't trigger the auto reconnection. ### heartbeat It's common practice to send a small message (heartbeat) for every given time passed to keep the connection active. In this function we provide a convenient helper to do it: ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, close } = useWebSocket('ws://websocketurl', { heartbeat: true, }); ``` Or with more controls: ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, close } = useWebSocket('ws://websocketurl', { heartbeat: { message: 'ping', interval: 1000, pongTimeout: 1000, }, }); ``` ### Sub-protocols List of one or more subprotocols to use, in this case SOAP and WAMP. ```ts import { useWebSocket } from '@vueuse/core'; // ---cut--- const { status, data, send, open, close } = useWebSocket('ws://websocketurl', { protocols: ['soap'], // ['soap', 'wamp'] }); ``` ## Type Declarations ```ts export type WebSocketStatus = 'OPEN' | 'CONNECTING' | 'CLOSED'; export type WebSocketHeartbeatMessage = string | ArrayBuffer | Blob; export interface UseWebSocketOptions { onConnected?: (ws: WebSocket) => void; onDisconnected?: (ws: WebSocket, event: CloseEvent) => void; onError?: (ws: WebSocket, event: Event) => void; onMessage?: (ws: WebSocket, event: MessageEvent) => void; /** * Send heartbeat for every x milliseconds passed * * @default false */ heartbeat?: | boolean | { /** * Message for the heartbeat * * @default 'ping' */ message?: MaybeRefOrGetter; /** * Response message for the heartbeat, if undefined the message will be used */ responseMessage?: MaybeRefOrGetter; /** * Interval, in milliseconds * * @default 1000 */ interval?: number; /** * Heartbeat response timeout, in milliseconds * * @default 1000 */ pongTimeout?: number; }; /** * Enabled auto reconnect * * @default false */ autoReconnect?: | boolean | { /** * Maximum retry times. * * Or you can pass a predicate function (which returns true if you want to retry). * * @default -1 */ retries?: number | ((retried: number) => boolean); /** * Delay for reconnect, in milliseconds * * Or you can pass a function to calculate the delay based on the number of retries. * * @default 1000 */ delay?: number | ((retries: number) => number); /** * On maximum retry times reached. */ onFailed?: Fn; }; /** * Immediately open the connection when calling this composable * * @default true */ immediate?: boolean; /** * Automatically connect to the websocket when URL changes * * @default true */ autoConnect?: boolean; /** * Automatically close a connection * * @default true */ autoClose?: boolean; /** * List of one or more sub-protocol strings * * @default [] */ protocols?: string[]; } export interface UseWebSocketReturn { /** * Reference to the latest data received via the websocket, * can be watched to respond to incoming messages */ data: Ref; /** * The current websocket status, can be only one of: * 'OPEN', 'CONNECTING', 'CLOSED' */ status: ShallowRef; /** * Closes the websocket connection gracefully. */ close: WebSocket['close']; /** * Reopen the websocket connection. * If there the current one is active, will close it before opening a new one. */ open: Fn; /** * Sends data through the websocket connection. * * @param data * @param useBuffer when the socket is not yet open, store the data into the buffer and sent them one connected. Default to true. */ send: (data: string | ArrayBuffer | Blob, useBuffer?: boolean) => boolean; /** * Reference to the WebSocket instance. */ ws: Ref; } /** * Reactive WebSocket client. * * @see https://vueuse.org/useWebSocket * @param url */ export declare function useWebSocket( url: MaybeRefOrGetter, options?: UseWebSocketOptions, ): UseWebSocketReturn; ```