forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathServerUtils.js
More file actions
1 lines (1 loc) · 7.45 KB
/
ServerUtils.js
File metadata and controls
1 lines (1 loc) · 7.45 KB
1
!function(){var protocol=require("vscode-languageserver-protocol"),cp=require("child_process"),fs=require("fs"),CommunicationTypes={NodeIPC:{type:"ipc",flag:"--node-ipc"},StandardIO:{type:"stdio",flag:"--stdio"},Pipe:{type:"pipe",flag:"--pipe"},Socket:{type:"socket",flag:"--socket"}},CLIENT_PROCESS_ID_FLAG="--clientProcessId";function addCommunicationArgs(communication,processArgs,isRuntime){switch(communication){case CommunicationTypes.NodeIPC.type:isRuntime?(processArgs.options.stdio=[null,null,null,"ipc"],processArgs.args.push(CommunicationTypes.NodeIPC.flag)):processArgs.args.push(CommunicationTypes.NodeIPC.flag);break;case CommunicationTypes.StandardIO.type:processArgs.args.push(CommunicationTypes.StandardIO.flag);break;case CommunicationTypes.Pipe.type:var pipeName=protocol.generateRandomPipeName(),pipeflag=CommunicationTypes.Pipe.flag+"="+pipeName.toString();processArgs.args.push(pipeflag),processArgs.pipeName=pipeName;break;default:if(communication&&communication.type===CommunicationTypes.Socket.type){var socketFlag=CommunicationTypes.Socket.flag+"="+communication.port.toString();processArgs.args.push(socketFlag)}}var clientProcessIdFlag=CLIENT_PROCESS_ID_FLAG+"="+process.pid.toString();processArgs.args.push(clientProcessIdFlag)}function _getEnvironment(env){return env?Object.assign({},process.env,env):process.env;var result}function _createReaderAndWriteByCommunicationType(resp,type){var retval=null;switch(type){case CommunicationTypes.NodeIPC.type:resp.process&&(resp.process.stderr.on("data",function(data){global.LanguageClientInfo.preferences.showServerLogsInConsole&&console.error('[Server logs @ stderr] "%s"',String(data))}),resp.process.stdout.on("data",function(data){global.LanguageClientInfo.preferences.showServerLogsInConsole&&console.info('[Server logs @ stdout] "%s"',String(data))}),retval={reader:new protocol.IPCMessageReader(resp.process),writer:new protocol.IPCMessageWriter(resp.process)});break;case CommunicationTypes.StandardIO.type:resp.process&&(resp.process.stderr.on("data",function(data){global.LanguageClientInfo.preferences.showServerLogsInConsole&&console.error('[Server logs @ stderr] "%s"',String(data))}),retval={reader:new protocol.StreamMessageReader(resp.process.stdout),writer:new protocol.StreamMessageWriter(resp.process.stdin)});break;case CommunicationTypes.Pipe.type:case CommunicationTypes.Socket.type:resp.reader&&resp.writer&&resp.process&&(resp.process.stderr.on("data",function(data){global.LanguageClientInfo.preferences.showServerLogsInConsole&&console.error('[Server logs @ stderr] "%s"',String(data))}),resp.process.stdout.on("data",function(data){global.LanguageClientInfo.preferences.showServerLogsInConsole&&console.info('[Server logs @ stdout] "%s"',String(data))}),retval={reader:resp.reader,writer:resp.writer})}return retval}function _createReaderAndWriter(resp){var retval=null;return resp?(resp.reader&&resp.writer?retval={reader:resp.reader,writer:resp.writer}:resp.process&&(retval={reader:new protocol.StreamMessageReader(resp.process.stdout),writer:new protocol.StreamMessageWriter(resp.process.stdin)},resp.process.stderr.on("data",function(data){global.LanguageClientInfo.preferences.showServerLogsInConsole&&console.error('[Server logs @ stderr] "%s"',String(data))})),retval):retval}function _isServerProcessValid(serverProcess){return!(!serverProcess||!serverProcess.pid)}function _startServerAndGetTransports(communication,processArgs,isRuntime){return new Promise(function(resolve,reject){var serverProcess=null,result=null,protocolTransport=null,type="object"==typeof communication?communication.type:communication,processFunc=isRuntime?cp.spawn:cp.fork;switch(type){case CommunicationTypes.NodeIPC.type:case CommunicationTypes.StandardIO.type:_isServerProcessValid(serverProcess=processFunc(processArgs.primaryArg,processArgs.args,processArgs.options))?(result=_createReaderAndWriteByCommunicationType({process:serverProcess},type),resolve(result)):reject(null);break;case CommunicationTypes.Pipe.type:protocolTransport=protocol.createClientPipeTransport(processArgs.pipeName);case CommunicationTypes.Socket.type:if(communication&&communication.type===CommunicationTypes.Socket.type&&(protocolTransport=protocol.createClientSocketTransport(communication.port)),!protocolTransport)return void reject("Invalid Communications Object. Can't create connection with server");protocolTransport.then(function(transportObj){_isServerProcessValid(serverProcess=processFunc(processArgs.primaryArg,processArgs.args,processArgs.options))&&transportObj.onConnected().then(function(protocolObj){result=_createReaderAndWriteByCommunicationType({process:serverProcess,reader:protocolObj[0],writer:protocolObj[1]},type),resolve(result)}).catch(reject)}).catch(reject)}})}function _handleOtherRuntime(serverOptions){function _getArguments(sOptions){var args=[];return sOptions.options&&sOptions.options.execArgv&&(args=args.concat(sOptions.options.execArgv)),args.push(sOptions.module),sOptions.args&&(args=args.concat(sOptions.args)),args}function _getOptions(sOptions){var cwd=void 0,env=void 0,options;if(sOptions.options){if(sOptions.options.cwd)try{fs.lstatSync(sOptions.options.cwd).isDirectory(sOptions.options.cwd)&&(cwd=sOptions.options.cwd)}catch(e){}cwd=cwd||__dirname,sOptions.options.env&&(env=sOptions.options.env)}return{cwd:cwd,env:_getEnvironment(env)}}var communication=serverOptions.communication||CommunicationTypes.StandardIO.type,args,options,processArgs={args:_getArguments(serverOptions),options:_getOptions(serverOptions),primaryArg:serverOptions.runtime};return addCommunicationArgs(communication,processArgs,!0),_startServerAndGetTransports(communication,processArgs,!0)}function _handleNodeRuntime(serverOptions){function _getArguments(sOptions){var args=[];return sOptions.args&&(args=args.concat(sOptions.args)),args}function _getOptions(sOptions){var cwd=void 0;if(sOptions.options){if(sOptions.options.cwd)try{fs.lstatSync(sOptions.options.cwd).isDirectory(sOptions.options.cwd)&&(cwd=sOptions.options.cwd)}catch(e){}cwd=cwd||__dirname}var options=Object.assign({},sOptions.options);return options.cwd=cwd,options.execArgv=options.execArgv||[],options.silent=!0,options}var communication=serverOptions.communication||CommunicationTypes.StandardIO.type,args,options,processArgs={args:_getArguments(serverOptions),options:_getOptions(serverOptions),primaryArg:serverOptions.module};return addCommunicationArgs(communication,processArgs,!1),_startServerAndGetTransports(communication,processArgs,!1)}function _handleServerFunction(func){return func().then(function(resp){var result;return _createReaderAndWriter(resp)})}function _handleModules(serverOptions){return serverOptions.runtime?_handleOtherRuntime(serverOptions):_handleNodeRuntime(serverOptions)}function _handleExecutable(serverOptions){return new Promise(function(resolve,reject){var command=serverOptions.command,args=serverOptions.args,options=Object.assign({},serverOptions.options),serverProcess=cp.spawn(command,args,options);serverProcess&&serverProcess.pid||reject("Failed to launch server using command :",command);var result=_createReaderAndWriter({process:serverProcess,detached:!!options.detached});result?resolve(result):reject(result)})}function startServerAndGetConnectionArgs(serverOptions){if("function"==typeof serverOptions)return _handleServerFunction(serverOptions);if("object"==typeof serverOptions){if(serverOptions.module)return _handleModules(serverOptions);if(serverOptions.command)return _handleExecutable(serverOptions)}return Promise.reject(null)}exports.startServerAndGetConnectionArgs=startServerAndGetConnectionArgs}();