@eclipse-glsp/theia-integration
Version:
Glue code to integrate GLSP clients into Eclipse Theia
64 lines • 2.83 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocketConnectionForwarder = void 0;
/********************************************************************************
* Copyright (c) 2022-2024 STMicroelectronics and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
const core_1 = require("@theia/core");
const node_1 = require("vscode-jsonrpc/node");
/**
* Creates a new {@link MessageConnection} on top of a given socket and forwards messages from service channel to this connection
*/
class SocketConnectionForwarder {
constructor(channel, socket) {
this.channel = channel;
this.socket = socket;
this.toDispose = new core_1.DisposableCollection();
const reader = new node_1.SocketMessageReader(socket);
const writer = new node_1.SocketMessageWriter(socket);
const connection = this.createMessageConnection(reader, writer);
this.toDispose.pushAll([
connection.onClose(() => socket.destroy()),
reader.listen(message => this.writeMessage(message)),
this.channel.onMessage(msgProvider => {
const message = this.decodeMessage(msgProvider);
writer.write(message);
}),
this.channel.onClose(() => connection.dispose()),
connection.onClose(() => this.channel.close()),
core_1.Disposable.create(() => {
this.channel.close();
connection.dispose();
})
]);
}
createMessageConnection(reader, writer) {
return (0, node_1.createMessageConnection)(reader, writer);
}
decodeMessage(msgProvider) {
const buffer = msgProvider().readBytes();
return JSON.parse(new TextDecoder().decode(buffer));
}
writeMessage(message) {
const writeBuffer = this.channel.getWriteBuffer();
writeBuffer.writeBytes(Buffer.from(JSON.stringify(message, undefined, 0)));
writeBuffer.commit();
}
dispose() {
this.toDispose.dispose();
}
}
exports.SocketConnectionForwarder = SocketConnectionForwarder;
//# sourceMappingURL=socket-connection-forwarder.js.map