Я сделал так: протокол взял
json rpc:
let requestCounter = 0
let jsonRpcPromises = {}
function jsonrpc (method, params) {
const dataToSend = { jsonrpc: '2.0', method, params, id: ++requestCounter }
socket.send(JSON.stringify(dataToSend))
return new Promise((resolve, reject) => {
jsonRpcPromises[requestCounter] = { resolve, reject }
})
}
function completeJsonrpc (message) {
const { id, error, result } = message
if (error !== undefined) {
jsonRpcPromises[id]?.reject(error)
} else {
jsonRpcPromises[id]?.resolve(result)
}
delete (jsonRpcPromises[id])
}
//
socket.onmessage = function (event) {
const message = JSON.parse(event.data)
///
if (message.jsonrpc) {
completeJsonrpc(message)
} else if (...) {
///
}
Код выше намеренно упрощен, в нем нет обработок крайних случаев (типа обрыва связи, реконнекта с продолжением или без продолжения обработки, кривых id и т.п.)
сам протокол упрощен, нет пакетного режима, передача идет по одному сообщению, а не массивами (потому что с сокетом это не нужно)