graphql-language-service-server
Version:
Server process backing the GraphQL Language Service
170 lines • 8.11 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const net = __importStar(require("net"));
const MessageProcessor_1 = require("./MessageProcessor");
const vscode_jsonrpc_1 = require("vscode-jsonrpc");
const vscode_languageserver_1 = require("vscode-languageserver");
const Logger_1 = require("./Logger");
const parseDocument_1 = require("./parseDocument");
const buildOptions = (options) => {
const serverOptions = { ...options };
if (serverOptions.loadConfigOptions) {
const { extensions } = serverOptions.loadConfigOptions;
if (!serverOptions.loadConfigOptions.rootDir) {
if (serverOptions.configDir) {
serverOptions.loadConfigOptions.rootDir = serverOptions.configDir;
}
else {
serverOptions.loadConfigOptions.rootDir = process.cwd();
}
}
if (serverOptions.extensions) {
serverOptions.loadConfigOptions.extensions = [
...serverOptions.extensions,
...(extensions || []),
];
}
}
else {
serverOptions.loadConfigOptions = {
rootDir: options.configDir || process.cwd(),
extensions: [],
};
}
return serverOptions;
};
async function startServer(options) {
if (options && options.method) {
const stderrOnly = options.method === 'stream';
const logger = new Logger_1.Logger(options.tmpDir, stderrOnly);
const finalOptions = buildOptions(options);
let reader;
let writer;
switch (options.method) {
case 'socket':
if (!options.port) {
process.stderr.write('--port is required to establish socket connection.');
process.exit(1);
}
const port = options.port;
const hostname = options.hostname;
const socket = net
.createServer(client => {
client.setEncoding('utf8');
reader = new vscode_jsonrpc_1.SocketMessageReader(client);
writer = new vscode_jsonrpc_1.SocketMessageWriter(client);
client.on('end', () => {
socket.close();
process.exit(0);
});
return initializeHandlers({
reader,
writer,
logger,
options: finalOptions,
}).then(s => {
s.listen();
});
})
.listen(port, hostname);
return;
case 'stream':
reader = new vscode_jsonrpc_1.StreamMessageReader(process.stdin);
writer = new vscode_jsonrpc_1.StreamMessageWriter(process.stdout);
break;
case 'node':
default:
reader = new vscode_jsonrpc_1.IPCMessageReader(process);
writer = new vscode_jsonrpc_1.IPCMessageWriter(process);
break;
}
try {
const serverWithHandlers = await initializeHandlers({
reader,
writer,
logger,
options: finalOptions,
});
serverWithHandlers.listen();
}
catch (err) {
logger.error('There was a Graphql LSP handler exception:');
logger.error(err);
}
}
}
exports.default = startServer;
async function initializeHandlers({ reader, writer, logger, options, }) {
try {
const connection = vscode_languageserver_1.createConnection(reader, writer);
await addHandlers({ connection, logger, ...options });
return connection;
}
catch (err) {
logger.error('There was an error initializing the server connection');
logger.error(err);
process.exit(1);
}
}
function reportDiagnostics(diagnostics, connection) {
if (diagnostics) {
connection.sendNotification(vscode_languageserver_1.PublishDiagnosticsNotification.type, diagnostics);
}
}
async function addHandlers({ connection, logger, config, parser, fileExtensions, graphqlFileExtensions, tmpDir, loadConfigOptions, }) {
const messageProcessor = new MessageProcessor_1.MessageProcessor({
logger,
config,
parser,
fileExtensions: fileExtensions || parseDocument_1.DEFAULT_SUPPORTED_EXTENSIONS,
graphqlFileExtensions: graphqlFileExtensions || parseDocument_1.DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,
tmpDir,
loadConfigOptions,
connection,
});
connection.onNotification(vscode_languageserver_1.DidOpenTextDocumentNotification.type, async (params) => {
const diagnostics = await messageProcessor.handleDidOpenOrSaveNotification(params);
reportDiagnostics(diagnostics, connection);
});
connection.onNotification(vscode_languageserver_1.DidSaveTextDocumentNotification.type, async (params) => {
const diagnostics = await messageProcessor.handleDidOpenOrSaveNotification(params);
reportDiagnostics(diagnostics, connection);
});
connection.onNotification(vscode_languageserver_1.DidChangeTextDocumentNotification.type, async (params) => {
const diagnostics = await messageProcessor.handleDidChangeNotification(params);
reportDiagnostics(diagnostics, connection);
});
connection.onNotification(vscode_languageserver_1.DidCloseTextDocumentNotification.type, params => messageProcessor.handleDidCloseNotification(params));
connection.onRequest(vscode_languageserver_1.ShutdownRequest.type, () => messageProcessor.handleShutdownRequest());
connection.onNotification(vscode_languageserver_1.ExitNotification.type, () => messageProcessor.handleExitNotification());
connection.onNotification('$/cancelRequest', () => ({}));
connection.onRequest(vscode_languageserver_1.InitializeRequest.type, (params, token) => messageProcessor.handleInitializeRequest(params, token, loadConfigOptions.rootDir));
connection.onRequest(vscode_languageserver_1.CompletionRequest.type, params => messageProcessor.handleCompletionRequest(params));
connection.onRequest(vscode_languageserver_1.CompletionResolveRequest.type, item => item);
connection.onRequest(vscode_languageserver_1.DefinitionRequest.type, params => messageProcessor.handleDefinitionRequest(params));
connection.onRequest(vscode_languageserver_1.HoverRequest.type, params => messageProcessor.handleHoverRequest(params));
connection.onNotification(vscode_languageserver_1.DidChangeWatchedFilesNotification.type, params => messageProcessor.handleWatchedFilesChangedNotification(params));
connection.onRequest(vscode_languageserver_1.DocumentSymbolRequest.type, params => messageProcessor.handleDocumentSymbolRequest(params));
connection.onRequest(vscode_languageserver_1.WorkspaceSymbolRequest.type, params => messageProcessor.handleWorkspaceSymbolRequest(params));
connection.onDidChangeConfiguration(messageProcessor.handleDidChangeConfiguration);
}
//# sourceMappingURL=startServer.js.map