Skip to main content

core.websocket

Coroutine-based WebSocket client for Pragtical Code Editor. Supports ws/wss connections, subprotocol negotiation, fragmented messages, automatic pong replies, optional keepalive pings, reconnect backoff, session restore hooks, and async callbacks.

local websocket = require "core.websocket"

client

(field) client: websocket.client

websocket.client

__index

(field) __index: websocket.client

_close_received

(field) _close_received: boolean

_close_request_code

(field) _close_request_code: unknown

_close_request_reason

(field) _close_request_reason: unknown

_close_requested

(field) _close_requested: table

_close_sent

(field) _close_sent: boolean

_conn

(field) _conn: net.tcp

A TCP network connection.


_did_open

(field) _did_open: boolean

_last_ping_time

(field) _last_ping_time: number|unknown

_manual_close

(field) _manual_close: table

_message_opcode

(field) _message_opcode: unknown

_message_parts

(field) _message_parts: table

_recv_buffer

(field) _recv_buffer: string?

_remote_close_code

(field) _remote_close_code: integer?

_remote_close_reason

(field) _remote_close_reason: string?

_send_queue

(field) _send_queue: table

error

(field) error: string?

protocol

(field) protocol: string?

reconnect_attempt

(field) reconnect_attempt: integer

response_info

(field) response_info: (websocket.response_info)?

status

(field) status: "closed"|"closing"|"connecting"|"open"|"reconnecting"

url

(field) url: string

new

function websocket.client.new(url: any, options: websocket.connect.options)
-> websocket.client

_build_session_info

(method) websocket.client:_build_session_info(attempt: integer, previous_outcome?: websocket.disconnect_info)
-> websocket.session_info

_drop_stale_control_frames

(method) websocket.client:_drop_stale_control_frames()

_flush_send_queue

(method) websocket.client:_flush_send_queue(touch: fun(), should_abort: fun():string?)
-> boolean?
2. string?

_get_reconnect_delay

(method) websocket.client:_get_reconnect_delay(attempt: integer)
-> number

_handle_frame

(method) websocket.client:_handle_frame(frame: table)
-> did_work: boolean
2. should_stop: boolean
3. err: string?

_pump_incoming

(method) websocket.client:_pump_incoming(touch: fun())
-> did_work: boolean
2. should_stop: boolean
3. err: string?

_reset_session_state

(method) websocket.client:_reset_session_state()

_run

(method) websocket.client:_run()

_run_session

(method) websocket.client:_run_session(parsed: table, session_info: websocket.session_info)
-> websocket.disconnect_info

_should_reconnect

(method) websocket.client:_should_reconnect(outcome: websocket.disconnect_info, attempt: integer)
-> boolean

_wait_reconnect

(method) websocket.client:_wait_reconnect(delay: number)
-> string?

close

(method) websocket.client:close(code?: integer, reason?: string)
-> boolean?
2. string?

Close the connection.


get_status

(method) websocket.client:get_status()
-> status: "closed"|"closing"|"connecting"|"open"|"reconnecting"
2. errmsg: string?

Get the current connection status.

status:
| "connecting"
| "reconnecting"
| "open"
| "closing"
| "closed"

ping

(method) websocket.client:ping(payload?: string)
-> boolean?
2. string?

Queue a ping frame for sending.


send

(method) websocket.client:send(data: string)
-> boolean?
2. string?

Queue a text message for sending.


send_binary

(method) websocket.client:send_binary(data: string)
-> boolean?
2. string?

Queue a binary message for sending.


send_text

(method) websocket.client:send_text(data: string)
-> boolean?
2. string?

Queue a text message for sending.


websocket.connect.options

headers

(field) headers: table<string, string>?

is_cancelled

(field) is_cancelled: (fun():boolean)?

max_reconnect_attempts

(field) max_reconnect_attempts: integer?

Maximum reconnect attempts. Unlimited when nil.


on_close

(field) on_close: fun(client: websocket.client, code?: integer, reason?: string, was_clean: boolean)?

on_connect

(field) on_connect: fun(client: websocket.client, info: websocket.response_info, session: websocket.session_info)?

on_error

(field) on_error: fun(client: websocket.client, err: string)?

on_message

(field) on_message: fun(client: websocket.client, message: string, is_binary: boolean)?

on_ping

(field) on_ping: fun(client: websocket.client, payload: string)?

on_pong

(field) on_pong: fun(client: websocket.client, payload: string)?

on_reconnect

(field) on_reconnect: fun(client: websocket.client, info: websocket.reconnect_info)?

ping_interval

(field) ping_interval: number?

Seconds between automatic ping frames.


ping_payload

(field) ping_payload: string?

Payload used for automatic ping frames.


protocols

(field) protocols: (string|string[])?

reconnect

(field) reconnect: boolean?

Retry automatically after disconnections.


reconnect_backoff

(field) reconnect_backoff: number?

Backoff multiplier. Default: 2


reconnect_delay

(field) reconnect_delay: number?

Initial reconnect delay in seconds. Default: 1


reconnect_delay_max

(field) reconnect_delay_max: number?

Maximum reconnect delay in seconds. Default: 30


reconnect_jitter

(field) reconnect_jitter: number?

Random delay jitter in seconds. Default: 0


restore_session

(field) restore_session: fun(client: websocket.client, info: websocket.session_info, response: websocket.response_info)?

should_reconnect

(field) should_reconnect: fun(client: websocket.client, info: websocket.disconnect_info):boolean??

timeout

(field) timeout: number?

Inactivity timeout in seconds.


websocket.disconnect_info

attempt

(field) attempt: integer

close_code

(field) close_code: integer?

close_reason

(field) close_reason: string

error

(field) error: string?

opened

(field) opened: boolean

was_clean

(field) was_clean: boolean

websocket.header_value

websocket.on_close

websocket.on_connect

websocket.on_error

websocket.on_message

websocket.on_ping

websocket.on_pong

websocket.on_reconnect

websocket.reconnect_info

attempt

(field) attempt: integer

close_code

(field) close_code: integer?

close_reason

(field) close_reason: string

delay

(field) delay: number

error

(field) error: string?

is_reconnect

(field) is_reconnect: boolean

opened

(field) opened: boolean

previous_close_code

(field) previous_close_code: integer?

previous_close_reason

(field) previous_close_reason: string?

previous_error

(field) previous_error: string?

previous_was_clean

(field) previous_was_clean: boolean?

was_clean

(field) was_clean: boolean

websocket.response_info

headers

(field) headers: table<string, string|string[]>

protocol

(field) protocol: string?

status

(field) status: integer

url

(field) url: string

websocket.restore_session

websocket.session_info

attempt

(field) attempt: integer

is_reconnect

(field) is_reconnect: boolean

previous_close_code

(field) previous_close_code: integer?

previous_close_reason

(field) previous_close_reason: string?

previous_error

(field) previous_error: string?

previous_was_clean

(field) previous_was_clean: boolean?

websocket.should_reconnect

websocket.status

websocket.status:
| "connecting"
| "reconnecting"
| "open"
| "closing"
| "closed"

connect

function core.websocket.connect(url: string, options?: websocket.connect.options)
-> client: websocket.client

Open a WebSocket connection asynchronously.