2 var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5 }) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
9 var __exportStar = (this && this.__exportStar) || function(m, exports) {
10 for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
12 Object.defineProperty(exports, "__esModule", { value: true });
13 exports.createMessageConnection = exports.createServerSocketTransport = exports.createClientSocketTransport = exports.createServerPipeTransport = exports.createClientPipeTransport = exports.generateRandomPipeName = exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = void 0;
14 /* --------------------------------------------------------------------------------------------
15 * Copyright (c) Microsoft Corporation. All rights reserved.
16 * Licensed under the MIT License. See License.txt in the project root for license information.
17 * ----------------------------------------------------------------------------------------- */
18 const ril_1 = require("./ril");
19 // Install the node runtime abstract.
20 ril_1.default.install();
21 const api_1 = require("../common/api");
22 const path = require("path");
23 const os = require("os");
24 const crypto_1 = require("crypto");
25 const net_1 = require("net");
26 __exportStar(require("../common/api"), exports);
27 class IPCMessageReader extends api_1.AbstractMessageReader {
28 constructor(process) {
30 this.process = process;
31 let eventEmitter = this.process;
32 eventEmitter.on('error', (error) => this.fireError(error));
33 eventEmitter.on('close', () => this.fireClose());
36 this.process.on('message', callback);
37 return api_1.Disposable.create(() => this.process.off('message', callback));
40 exports.IPCMessageReader = IPCMessageReader;
41 class IPCMessageWriter extends api_1.AbstractMessageWriter {
42 constructor(process) {
44 this.process = process;
46 let eventEmitter = this.process;
47 eventEmitter.on('error', (error) => this.fireError(error));
48 eventEmitter.on('close', () => this.fireClose);
52 if (typeof this.process.send === 'function') {
53 this.process.send(msg, undefined, undefined, (error) => {
56 this.handleError(error, msg);
63 return Promise.resolve();
66 this.handleError(error, msg);
67 return Promise.reject(error);
70 handleError(error, msg) {
72 this.fireError(error, msg, this.errorCount);
77 exports.IPCMessageWriter = IPCMessageWriter;
78 class SocketMessageReader extends api_1.ReadableStreamMessageReader {
79 constructor(socket, encoding = 'utf-8') {
80 super(ril_1.default().stream.asReadableStream(socket), encoding);
83 exports.SocketMessageReader = SocketMessageReader;
84 class SocketMessageWriter extends api_1.WriteableStreamMessageWriter {
85 constructor(socket, options) {
86 super(ril_1.default().stream.asWritableStream(socket), options);
91 this.socket.destroy();
94 exports.SocketMessageWriter = SocketMessageWriter;
95 class StreamMessageReader extends api_1.ReadableStreamMessageReader {
96 constructor(readble, encoding) {
97 super(ril_1.default().stream.asReadableStream(readble), encoding);
100 exports.StreamMessageReader = StreamMessageReader;
101 class StreamMessageWriter extends api_1.WriteableStreamMessageWriter {
102 constructor(writable, options) {
103 super(ril_1.default().stream.asWritableStream(writable), options);
106 exports.StreamMessageWriter = StreamMessageWriter;
107 const XDG_RUNTIME_DIR = process.env['XDG_RUNTIME_DIR'];
108 const safeIpcPathLengths = new Map([
112 function generateRandomPipeName() {
113 const randomSuffix = crypto_1.randomBytes(21).toString('hex');
114 if (process.platform === 'win32') {
115 return `\\\\.\\pipe\\vscode-jsonrpc-${randomSuffix}-sock`;
118 if (XDG_RUNTIME_DIR) {
119 result = path.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`);
122 result = path.join(os.tmpdir(), `vscode-${randomSuffix}.sock`);
124 const limit = safeIpcPathLengths.get(process.platform);
125 if (limit !== undefined && result.length >= limit) {
126 ril_1.default().console.warn(`WARNING: IPC handle "${result}" is longer than ${limit} characters.`);
130 exports.generateRandomPipeName = generateRandomPipeName;
131 function createClientPipeTransport(pipeName, encoding = 'utf-8') {
133 const connected = new Promise((resolve, _reject) => {
134 connectResolve = resolve;
136 return new Promise((resolve, reject) => {
137 let server = net_1.createServer((socket) => {
140 new SocketMessageReader(socket, encoding),
141 new SocketMessageWriter(socket, encoding)
144 server.on('error', reject);
145 server.listen(pipeName, () => {
146 server.removeListener('error', reject);
148 onConnected: () => { return connected; }
153 exports.createClientPipeTransport = createClientPipeTransport;
154 function createServerPipeTransport(pipeName, encoding = 'utf-8') {
155 const socket = net_1.createConnection(pipeName);
157 new SocketMessageReader(socket, encoding),
158 new SocketMessageWriter(socket, encoding)
161 exports.createServerPipeTransport = createServerPipeTransport;
162 function createClientSocketTransport(port, encoding = 'utf-8') {
164 const connected = new Promise((resolve, _reject) => {
165 connectResolve = resolve;
167 return new Promise((resolve, reject) => {
168 const server = net_1.createServer((socket) => {
171 new SocketMessageReader(socket, encoding),
172 new SocketMessageWriter(socket, encoding)
175 server.on('error', reject);
176 server.listen(port, '127.0.0.1', () => {
177 server.removeListener('error', reject);
179 onConnected: () => { return connected; }
184 exports.createClientSocketTransport = createClientSocketTransport;
185 function createServerSocketTransport(port, encoding = 'utf-8') {
186 const socket = net_1.createConnection(port, '127.0.0.1');
188 new SocketMessageReader(socket, encoding),
189 new SocketMessageWriter(socket, encoding)
192 exports.createServerSocketTransport = createServerSocketTransport;
193 function isReadableStream(value) {
194 const candidate = value;
195 return candidate.read !== undefined && candidate.addListener !== undefined;
197 function isWritableStream(value) {
198 const candidate = value;
199 return candidate.write !== undefined && candidate.addListener !== undefined;
201 function createMessageConnection(input, output, logger, options) {
203 logger = api_1.NullLogger;
205 const reader = isReadableStream(input) ? new StreamMessageReader(input) : input;
206 const writer = isWritableStream(output) ? new StreamMessageWriter(output) : output;
207 if (api_1.ConnectionStrategy.is(options)) {
208 options = { connectionStrategy: options };
210 return api_1.createMessageConnection(reader, writer, logger, options);
212 exports.createMessageConnection = createMessageConnection;
213 //# sourceMappingURL=main.js.map