Pulled ALL skills from 15 source repositories: - anthropics/skills: 16 (docs, design, MCP, testing) - obra/superpowers: 14 (TDD, debugging, agents, planning) - coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth) - better-auth/skills: 5 (auth patterns) - vercel-labs/agent-skills: 5 (React, design, Vercel) - antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo) - Plus 13 individual skills from various repos Mosaic Stack is not limited to coding — the Orchestrator and subagents serve coding, business, design, marketing, writing, logistics, analysis, and more. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
269 lines
6.3 KiB
Markdown
269 lines
6.3 KiB
Markdown
---
|
|
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<WebSocketHeartbeatMessage>
|
|
/**
|
|
* Response message for the heartbeat, if undefined the message will be used
|
|
*/
|
|
responseMessage?: MaybeRefOrGetter<WebSocketHeartbeatMessage>
|
|
/**
|
|
* 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<T> {
|
|
/**
|
|
* Reference to the latest data received via the websocket,
|
|
* can be watched to respond to incoming messages
|
|
*/
|
|
data: Ref<T | null>
|
|
/**
|
|
* The current websocket status, can be only one of:
|
|
* 'OPEN', 'CONNECTING', 'CLOSED'
|
|
*/
|
|
status: ShallowRef<WebSocketStatus>
|
|
/**
|
|
* 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<WebSocket | undefined>
|
|
}
|
|
/**
|
|
* Reactive WebSocket client.
|
|
*
|
|
* @see https://vueuse.org/useWebSocket
|
|
* @param url
|
|
*/
|
|
export declare function useWebSocket<Data = any>(
|
|
url: MaybeRefOrGetter<string | URL | undefined>,
|
|
options?: UseWebSocketOptions,
|
|
): UseWebSocketReturn<Data>
|
|
```
|