UNPKG

@akala/json-rpc-ws

Version:

json-rpc websocket transport

76 lines 2.79 kB
import { Connection as BaseConnection, JsonRpcSocketAdapter, } from './shared-connection.js'; import { default as Client } from './shared-client.js'; import { default as Errors } from './errors.js'; import debug from 'debug'; const logger = debug('akala:json-rpc-ws'); import * as ws from './ws/websocket.js'; export { ws }; export { Client, Errors, BaseConnection, JsonRpcSocketAdapter }; class Readable extends ReadableStream { constructor() { super({ type: 'bytes', start: (controller) => { if (this.buffer.length) controller.enqueue(this.buffer.shift()); }, pull: (controller) => { if (this.buffer.length) controller.enqueue(this.buffer.shift()); }, cancel: reason => { } }); } buffer = []; emitError(error) { return super.cancel(error); } push(chunk) { this.buffer.push(chunk); } } export class Connection extends BaseConnection { constructor(socket, parent) { super(socket, parent); } async sendStream(id, result) { const reader = result.getReader(); const chunk = await reader.read(); if (!chunk.done && this.socket.open) this.sendRaw({ id: id, result: { event: 'data', isBuffer: true, data: { type: 'Buffer', data: chunk.value } } }); else if (this.socket.open) this.sendRaw({ id: id, result: { event: 'end' }, stream: false }); else logger('socket was closed before end of stream'); } isStream(result) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return typeof (result) != 'undefined' && !!result && typeof (result.getReader) == 'function'; } buildStream(id, result) { const s = new Readable(); const src = result; Object.getOwnPropertyNames(src).forEach(function (p) { if (Object.getOwnPropertyDescriptor(result, p) == null) { const prop = Object.getOwnPropertyDescriptor(src, p); if (prop) Object.defineProperty(result, p, prop); } }); const f = this.responseHandlers[id] = (error, result) => { if (error) s.emitError(error); else switch (result.event) { case 'data': if (result.data) s.push(Uint8Array.from(result.data.data)); this.responseHandlers[id] = f; break; case 'end': s.push(null); break; } }; return s; } } //# sourceMappingURL=browser.js.map