UNPKG

open-collaboration-protocol

Version:

Open Collaboration Protocol implementation, part of the Open Collaboration Tools project

60 lines 2.28 kB
// ****************************************************************************** // Copyright 2024 TypeFox GmbH // This program and the accompanying materials are made available under the // terms of the MIT License, which is available in the project root. // ****************************************************************************** import { Emitter, Event } from '../utils/event.js'; import { Deferred } from '../utils/promise.js'; export const WebSocketTransportProvider = { id: 'websocket', createTransport: (url, headers) => { if (url.startsWith('https')) { url = url.replace('https', 'wss'); } else if (url.startsWith('http')) { url = url.replace('http', 'ws'); } if (url.endsWith('/')) { url = url.slice(0, -1); } const query = Object.entries(headers).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&'); const socket = new WebSocketTransportProvider.Constructor(url + '/websocket' + (query ? '?' + query : '')); socket.binaryType = 'arraybuffer'; const transport = new WebSocketTransport(socket); return transport; }, Constructor: typeof WebSocket === 'undefined' ? undefined : WebSocket }; export class WebSocketTransport { socket; id = 'websocket'; onDisconnectEmitter = new Emitter(); onErrorEmitter = new Emitter(); ready = new Deferred(); get onReconnect() { return Event.None; } get onDisconnect() { return this.onDisconnectEmitter.event; } get onError() { return this.onErrorEmitter.event; } constructor(socket) { this.socket = socket; this.socket.onclose = () => this.onDisconnectEmitter.fire(); this.socket.onerror = () => this.onErrorEmitter.fire('Websocket connection closed unexpectedly.'); this.socket.onopen = () => this.ready.resolve(); } async write(data) { await this.ready.promise.then(() => this.socket.send(data)); } read(cb) { this.socket.onmessage = event => cb(event.data); } dispose() { this.onDisconnectEmitter.dispose(); this.socket.close(); } } //# sourceMappingURL=websocket-transport.js.map