UNPKG

@akala/core

Version:
96 lines 3.68 kB
import { EventEmitter } from "../events/event-emitter.js"; import { IsomorphicBuffer } from "../helpers.js"; import { StatefulSubscription } from "../teardown-manager.js"; export class TcpSocketAdapter extends EventEmitter { socket; constructor(socket) { super(); this.socket = socket; } pipe(socket) { this.on('message', (message) => socket.send(message)); this.on('close', () => socket.close()); } get open() { return !this.socket.closed; } close() { return new Promise(resolve => this.socket.end(resolve)); } send(data) { return new Promise((resolve, reject) => this.socket.write(data instanceof IsomorphicBuffer ? data.toArray() : data, err => err ? reject(err) : resolve())); } messageListeners = []; off(event, handler) { switch (event) { case 'message': { let listeners = this.messageListeners; if (handler) listeners = listeners.filter(f => f[0] == handler); var result = false; for (const listener of listeners) { this.socket.off('message', listener[1]); result = !!this.messageListeners.splice(this.messageListeners.indexOf(listener), 1)?.length || result; } } break; case 'close': case 'error': case 'open': //eslint-disable-next-line @typescript-eslint/no-explicit-any this.socket.off(event, handler); break; default: throw new Error(`Unsupported event ${String(event)}`); } return true; } on(event, handler, options) { switch (event) { case 'message': { const x = function (data) { return handler.call(this, typeof data === 'string' ? data : IsomorphicBuffer.fromBuffer(data)); }; this.messageListeners.push([handler, x]); if (options?.once) this.socket.once('data', x); else this.socket.on('data', x); return new StatefulSubscription(() => { this.messageListeners.splice(this.messageListeners.findIndex(x => x[0] === handler), 1); this.socket.off('data', x); }).unsubscribe; } case 'close': case 'error': case 'open': //eslint-disable-next-line @typescript-eslint/no-explicit-any if (options?.once) this.socket.once(event, handler); else this.socket.on(event, handler); return new StatefulSubscription(() => { this.socket.off(event, handler); }).unsubscribe; case Symbol.dispose: return super.on(event, handler, options); default: throw new Error(`Unsupported event ${String(event)}`); } } once(event, handler) { switch (event) { case 'message': return this.on(event, handler, { once: true }); case 'close': case 'error': case 'open': case Symbol.dispose: return this.on(event, handler, { once: true }); default: let x = event; throw new Error(`Unsupported event ${x}`); } } } //# sourceMappingURL=tcp.js.map