graphql-language-service-server
Version:
Server process backing the GraphQL Language Service
125 lines • 6.24 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.addHandlers = exports.initializeHandlers = exports.buildOptions = void 0;
const MessageProcessor_1 = require("./MessageProcessor");
const node_1 = require("vscode-jsonrpc/node");
const node_2 = require("vscode-languageserver/node");
const Logger_1 = require("./Logger");
const constants_1 = require("./constants");
const node_net_1 = require("node:net");
const buildOptions = (options) => {
const serverOptions = { ...options };
if (serverOptions.loadConfigOptions) {
const { extensions, rootDir } = serverOptions.loadConfigOptions;
if (extensions) {
serverOptions.loadConfigOptions.extensions = extensions;
}
if (!rootDir) {
if (serverOptions.configDir) {
serverOptions.loadConfigOptions.rootDir = serverOptions.configDir;
}
else {
serverOptions.loadConfigOptions.rootDir = process.cwd();
}
}
}
else {
serverOptions.loadConfigOptions = {
rootDir: options.configDir || process.cwd(),
extensions: serverOptions.extensions || [],
};
}
return serverOptions;
};
exports.buildOptions = buildOptions;
async function startServer(options) {
const finalOptions = (0, exports.buildOptions)({ method: 'node', ...options });
let reader;
let writer;
switch (finalOptions.method) {
case 'socket':
if (!finalOptions.port) {
process.stderr.write('--port is required to establish socket connection.');
process.exit(1);
}
const { port, hostname, encoding } = finalOptions;
const socket = (0, node_net_1.createConnection)(port, hostname !== null && hostname !== void 0 ? hostname : '127.0.01');
reader = new node_1.SocketMessageReader(socket, encoding !== null && encoding !== void 0 ? encoding : 'utf-8');
writer = new node_1.SocketMessageWriter(socket, encoding !== null && encoding !== void 0 ? encoding : 'utf-8');
break;
case 'stream':
reader = new node_1.StreamMessageReader(process.stdin);
writer = new node_1.StreamMessageWriter(process.stdout);
break;
default:
reader = new node_1.IPCMessageReader(process);
writer = new node_1.IPCMessageWriter(process);
break;
}
const streamServer = await initializeHandlers({
reader,
writer,
options: finalOptions,
});
streamServer.listen();
return streamServer;
}
exports.default = startServer;
async function initializeHandlers({ reader, writer, options, }) {
const connection = (0, node_2.createConnection)(reader, writer);
const logger = new Logger_1.Logger(connection, options.debug);
try {
await addHandlers({ connection, logger, ...options });
return connection;
}
catch (err) {
logger.error('There was an error initializing the server connection');
logger.error(String(err));
process.exit(1);
}
}
exports.initializeHandlers = initializeHandlers;
function reportDiagnostics(diagnostics, connection) {
if (diagnostics) {
void connection.sendNotification(node_2.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 || constants_1.DEFAULT_SUPPORTED_EXTENSIONS,
graphqlFileExtensions: graphqlFileExtensions || constants_1.DEFAULT_SUPPORTED_GRAPHQL_EXTENSIONS,
tmpDir,
loadConfigOptions,
connection,
});
connection.onNotification(node_2.DidOpenTextDocumentNotification.type, async (params) => {
const diagnostics = await messageProcessor.handleDidOpenOrSaveNotification(params);
reportDiagnostics(diagnostics, connection);
});
connection.onNotification(node_2.DidSaveTextDocumentNotification.type, async (params) => {
const diagnostics = await messageProcessor.handleDidOpenOrSaveNotification(params);
reportDiagnostics(diagnostics, connection);
});
connection.onNotification(node_2.DidChangeTextDocumentNotification.type, async (params) => {
const diagnostics = await messageProcessor.handleDidChangeNotification(params);
reportDiagnostics(diagnostics, connection);
});
connection.onNotification(node_2.DidCloseTextDocumentNotification.type, messageProcessor.handleDidCloseNotification);
connection.onRequest(node_2.ShutdownRequest.type, () => messageProcessor.handleShutdownRequest());
connection.onNotification(node_2.ExitNotification.type, () => messageProcessor.handleExitNotification());
connection.onNotification('$/cancelRequest', () => ({}));
connection.onRequest(node_2.InitializeRequest.type, (params, token) => messageProcessor.handleInitializeRequest(params, token, loadConfigOptions.rootDir));
connection.onRequest(node_2.CompletionRequest.type, params => messageProcessor.handleCompletionRequest(params));
connection.onRequest(node_2.CompletionResolveRequest.type, item => item);
connection.onRequest(node_2.DefinitionRequest.type, params => messageProcessor.handleDefinitionRequest(params));
connection.onRequest(node_2.HoverRequest.type, params => messageProcessor.handleHoverRequest(params));
connection.onNotification(node_2.DidChangeWatchedFilesNotification.type, params => messageProcessor.handleWatchedFilesChangedNotification(params));
connection.onRequest(node_2.DocumentSymbolRequest.type, params => messageProcessor.handleDocumentSymbolRequest(params));
connection.onRequest(node_2.WorkspaceSymbolRequest.type, params => messageProcessor.handleWorkspaceSymbolRequest(params));
connection.onNotification(node_2.DidChangeConfigurationNotification.type, params => messageProcessor.handleDidChangeConfiguration(params));
}
exports.addHandlers = addHandlers;
//# sourceMappingURL=startServer.js.map
;