Skip to content

Commit

Permalink
Added an ext server example
Browse files Browse the repository at this point in the history
  • Loading branch information
akosyakov committed Apr 18, 2017
1 parent 74bc803 commit 3a8a945
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 15 deletions.
13 changes: 13 additions & 0 deletions .vscode/launch.json
Expand Up @@ -13,6 +13,19 @@
"outFiles": [
"${workspaceRoot}/example/lib/**/*.js"
]
},
{
"type": "node",
"request": "launch",
"name": "Launch Sample Server (external)",
"program": "${workspaceRoot}/example/lib/server.js",
"args": [
"--external"
],
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/example/lib/**/*.js"
]
}
]
}
3 changes: 2 additions & 1 deletion example/package.json
Expand Up @@ -11,7 +11,7 @@
"vscode-uri": "^1.0.0",
"ws": "^2.2.3",
"monaco-languageclient": "file:..",
"vscode-ws-jsonrpc": "^0.0.1-alpha.0"
"vscode-ws-jsonrpc": "file:../../vscode-ws-jsonrpc"
},
"devDependencies": {
"@types/express": "^4.0.35",
Expand All @@ -29,6 +29,7 @@
"copy": "cp src/index.html lib/index.html",
"build": "npm run compile && ./node_modules/.bin/webpack && npm run copy",
"start": "npm run build && node lib/server.js",
"start:ext": "npm run build && node lib/server.js --external",
"update:file-deps": "npm run clean:file-deps && npm install",
"clean:file-deps": "npm run clean:monaco-languageclient && npm run clean:vscode-ws-jsonrpc",
"update:monaco-languageclient": "npm run clean:monaco-languageclient && npm install",
Expand Down
10 changes: 10 additions & 0 deletions example/src/ext-json-server.ts
@@ -0,0 +1,10 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io). All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import { StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc';
import { start } from "./json-server";

const reader = new StreamMessageReader(process.stdin);
const writer = new StreamMessageWriter(process.stdout);
start(reader, writer);
32 changes: 32 additions & 0 deletions example/src/json-server-launcher.ts
@@ -0,0 +1,32 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io). All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as path from 'path';
import { SocketMessageReader, SocketMessageWriter, Socket } from "vscode-ws-jsonrpc";
import { isRequestMessage } from "vscode-jsonrpc/lib/messages";
import { createServerProcess, forward, createConnection as createSocketConnection } from "vscode-ws-jsonrpc/lib/server";
import { InitializeRequest, InitializeParams } from "vscode-languageserver";
import { start } from "./json-server";

export function launch(socket: Socket) {
const reader = new SocketMessageReader(socket);
const writer = new SocketMessageWriter(socket);
const asExternalProccess = process.argv.findIndex(value => value === '--external');
if (asExternalProccess)  {
const extJsonServerPath = path.resolve(__dirname, 'ext-json-server.js');
const socketConnection = createSocketConnection(reader, writer, () => socket.dispose());
const serverConnection = createServerProcess('JSON', 'node', [extJsonServerPath]);
forward(socketConnection, serverConnection, message => {
if (isRequestMessage(message)) {
if (message.method === InitializeRequest.type.method) {
const initializeParams = message.params as InitializeParams;
initializeParams.processId = process.pid;
}
}
return message;
});
} else {
start(reader, writer);
}
}
10 changes: 9 additions & 1 deletion example/src/json-server.ts
Expand Up @@ -5,14 +5,22 @@
import * as fs from "fs";
import { xhr, XHRResponse, getErrorStatusDescription } from 'request-light';
import Uri from 'vscode-uri';
import { IConnection, TextDocuments } from 'vscode-languageserver';
import { MessageReader, MessageWriter } from "vscode-jsonrpc";
import { IConnection, TextDocuments, createConnection } from 'vscode-languageserver';
import {
TextDocument, Diagnostic, CompletionList, CompletionItem, Hover,
SymbolInformation, DocumentSymbolParams, TextEdit
} from "vscode-languageserver-types";
import { TextDocumentPositionParams, DocumentRangeFormattingParams } from 'vscode-base-languageclient/lib/protocol';
import { getLanguageService, LanguageService, JSONDocument } from "vscode-json-languageservice";

export function start(reader: MessageReader, writer: MessageWriter): JsonServer {
const connection = createConnection(reader, writer);
const server = new JsonServer(connection);
server.start();
return server;
}

export class JsonServer {

protected workspaceRoot: Uri | undefined;
Expand Down
17 changes: 4 additions & 13 deletions example/src/server.ts
Expand Up @@ -7,9 +7,8 @@ import * as http from "http";
import * as url from "url";
import * as net from "net";
import * as express from "express";
import { Socket, SocketMessageReader, SocketMessageWriter } from "vscode-ws-jsonrpc";
import { createConnection } from "vscode-languageserver";
import { JsonServer } from "./json-server";
import { Socket } from "vscode-ws-jsonrpc";
import { launch } from "./json-server-launcher";

process.on('uncaughtException', function (err: any) {
console.error('Uncaught Exception: ', err.toString());
Expand All @@ -18,14 +17,6 @@ process.on('uncaughtException', function (err: any) {
}
});

function onOpen(socket: Socket): void {
const reader = new SocketMessageReader(socket);
const writer = new SocketMessageWriter(socket);
const connection = createConnection(reader, writer);
const server = new JsonServer(connection);
server.start();
}

const app = express();
app.use(express.static(__dirname));
const server = app.listen(3000);
Expand All @@ -49,9 +40,9 @@ server.on('upgrade', (request: http.IncomingMessage, socket: net.Socket, head: B
dispose: () => webSocket.close()
};
if (webSocket.readyState === webSocket.OPEN) {
onOpen(socket);
launch(socket);
} else {
webSocket.on('open', () => onOpen(socket));
webSocket.on('open', () => launch(socket));
}
});
}
Expand Down

0 comments on commit 3a8a945

Please sign in to comment.