open-collaboration-protocol
Version:
Open Collaboration Protocol implementation, part of the Open Collaboration Tools project
60 lines • 2.28 kB
JavaScript
// ******************************************************************************
// 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