Как узнать о количестве буферизованных данных websocket ws nodejs?
Имеется внешний сервер биржи, к которому я, как клиент подключаюсь при помощи ReconnectingWebSocket на слабом PC Ситуация: Читаю сообщения ws.onmessage. Сообщения поступают с приличной скоростью- порядка 100-200 мс. Я сравниваю время своего клиента и время сервера (это информация от самой биржи api). Разница времени постоянно растет, начиная с примерно 1-2 секунд и доходит до более 1 минуты ( за то время пока я тестировал).
Следующая ситуация: Запустил клиент подождал несколько минут, отключил интернет а информация в консоли все еще поступает - обрабатывается ( моим кодом), И только спустя примерно 30 секунд ошибка timeout. Таким образом я полагаю, что информация в ws поступает быстрее чем может обрабатываться. Эта информация- сообщения накапливаются в сокете, а когда я разорвал интернет соединение, то все накопленные сообщения обрабатывались в течении 30 секунд пока автоматически не отключился сокет по ошибке timeout.
Протестировал на мощном PC, такого эффекта не наблюдалось.
Вопрос. Есть ли свойство в ws клиенте показывающее количество необработанных сообщений?
Я не нашел такого свойства в API. Есть свойство bufferedAmount, но это не оно - это буфер сообщений отправленных серверу, но еще не доставленные ему ws.send()
Подключение ReconnectingWebSocket :
const WS = require('ws');
const options = {
WebSocket: WS, // custom WebSocket constructor
connectionTimeout: 5000,
};
const ws = new ReconnectingWebSocket(config.get('WS_URL_GATE_v4'), [], options);
Вот содержимое ReconnectingWebSocket :
_listeners: { error: [], message: [], open: [], close: [] },
_retryCount: 0,
_shouldReconnect: true,
_connectLock: false,
_binaryType: 'blob',
_closeCalled: false,
_messageQueue: [],
onclose: [Function (anonymous)],
onerror: [Function (anonymous)],
onmessage: [Function (anonymous)],
onopen: [Function (anonymous)],
_handleOpen: [Function (anonymous)],
_handleMessage: [Function (anonymous)],
_handleError: [Function (anonymous)],
_handleClose: [Function (anonymous)],
_url: 'wss://api.gateio.ws/ws/v4/',
_protocols: [],
_options: {
WebSocket: [class WebSocket extends EventEmitter] {
CONNECTING: 0,
OPEN: 1,
CLOSING: 2,
CLOSED: 3,
createWebSocketStream: [Function: createWebSocketStream],
Server: [class WebSocketServer extends EventEmitter],
Receiver: [class Receiver extends Writable],
Sender: [class Sender]
},
connectionTimeout: 5000,
perMessageDeflate: false
},
_ws: <ref *1> WebSocket {
_events: [Object: null prototype] {
open: [Function],
close: [Function],
message: [Function],
error: [Function]
},
_eventsCount: 4,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_closeCode: 1006,
_closeFrameReceived: false,
_closeFrameSent: false,
_closeMessage: '',
_closeTimer: null,
_extensions: { 'permessage-deflate': [PerMessageDeflate] },
_protocol: '',
_readyState: 1,
_receiver: Receiver {
_writableState: [WritableState],
_events: [Object: null prototype],
_eventsCount: 6,
_maxListeners: undefined,
_binaryType: 'nodebuffer',
_extensions: [Object],
_isServer: false,
_maxPayload: 104857600,
_bufferedBytes: 0,
_buffers: [],
_compressed: true,
_payloadLength: 301,
_mask: undefined,
_fragmented: 0,
_masked: false,
_fin: true,
_opcode: 1,
_totalPayloadLength: 0,
_messageLength: 0,
_fragments: [],
_state: 5,
_loop: false,
[Symbol(kCapture)]: false,
[Symbol(websocket)]: [Circular *1]
},
_sender: Sender {
_extensions: [Object],
_socket: [TLSSocket],
_firstFragment: true,
_compress: false,
_bufferedBytes: 0,
_deflating: false,
_queue: []
},
_socket: TLSSocket {
_tlsOptions: [Object],
_secureEstablished: true,
_securePending: false,
_newSessionPending: false,
_controlReleased: true,
secureConnecting: false,
_SNICallback: null,
servername: 'api.gateio.ws',
alpnProtocol: false,
authorized: true,
authorizationError: null,
encrypted: true,
_events: [Object: null prototype],
_eventsCount: 6,
connecting: false,
_hadError: false,
_parent: null,
_host: 'api.gateio.ws',
_readableState: [ReadableState],
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: false,
_sockname: null,
_pendingData: null,
_pendingEncoding: '',
server: undefined,
_server: null,
ssl: [TLSWrap],
_requestCert: true,
_rejectUnauthorized: true,
parser: null,
_httpMessage: null,
timeout: 0,
[Symbol(res)]: [TLSWrap],
[Symbol(verified)]: true,
[Symbol(pendingSession)]: null,
[Symbol(async_id_symbol)]: 21,
[Symbol(kHandle)]: [TLSWrap],
[Symbol(kSetNoDelay)]: true,
[Symbol(lastWriteQueueSize)]: 0,
[Symbol(timeout)]: null,
[Symbol(kBuffer)]: null,
[Symbol(kBufferCb)]: null,
[Symbol(kBufferGen)]: null,
[Symbol(kCapture)]: false,
[Symbol(kBytesRead)]: 0,
[Symbol(kBytesWritten)]: 0,
[Symbol(connect-options)]: [Object],
[Symbol(RequestTimeout)]: undefined,
[Symbol(websocket)]: [Circular *1]
},
_bufferedAmount: 0,
_isServer: false,
_redirects: 0,
_url: 'wss://api.gateio.ws/ws/v4/',
_req: null,
[Symbol(kCapture)]: false
},
_connectTimeout: Timeout {
_idleTimeout: -1,
_idlePrev: null,
_idleNext: null,
_idleStart: 567,
_onTimeout: null,
_timerArgs: undefined,
_repeat: null,
_destroyed: true,
[Symbol(refed)]: true,
[Symbol(kHasPrimitive)]: false,
[Symbol(asyncId)]: 25,
[Symbol(triggerId)]: 0
},
_uptimeTimeout: Timeout {
_idleTimeout: 5000,
_idlePrev: null,
_idleNext: null,
_idleStart: 2880,
_onTimeout: [Function (anonymous)],
_timerArgs: undefined,
_repeat: null,
_destroyed: true,
[Symbol(refed)]: true,
[Symbol(kHasPrimitive)]: false,
[Symbol(asyncId)]: 143,
[Symbol(triggerId)]: 21
}
}