@akala/json-rpc-ws
Version:
json-rpc websocket transport
76 lines • 2.79 kB
JavaScript
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