microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
acf08bc211b251f5aae90239291dbef21894989c

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/extension/extensionServer.ts

112lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as em from "../common/extensionMessaging";
5import * as http from "http";
6import {ILaunchArgs} from "../common/launchArgs";
7import * as Q from "q";
8import {SettingsHelper} from "./settingsHelper";
9import * as vscode from "vscode";
10
11
12export class ExtensionServer implements vscode.Disposable {
13
14 private serverInstance: http.Server = null;
15
16 /**
17 * Starts the server.
18 */
19 public setup(): Q.Promise<void> {
20
21 let deferred = Q.defer<void>();
22
23 let requestHandler = (request: http.IncomingMessage, response: http.ServerResponse) => {
24 this.handleIncomingMessage(request, response);
25 };
26
27 let launchCallback = (error: any) => {
28 if (error) {
29 deferred.reject(error);
30 } else {
31 deferred.resolve(null);
32 }
33 };
34
35 let port = em.ServerDefaultParams.PORT;
36 SettingsHelper.readLaunchJson()
37 .then((launchJson: any) => {
38 if (launchJson) {
39 /* take the fist configuration that specifies the port */
40 port = (<Array<ILaunchArgs>>launchJson.configurations)
41 .filter((configuration: ILaunchArgs, index: number, array: any[]) => {
42 return !!configuration.extensionServerPort;
43 })[0].extensionServerPort;
44 }
45 })
46 .fail(() => { /* using default port in case of any error */ })
47 .done(() => {
48 console.log("Using port: " + port);
49 this.serverInstance = http.createServer(requestHandler);
50 this.serverInstance.listen(port, null, null, launchCallback);
51 });
52
53 return deferred.promise;
54 }
55
56 /**
57 * Stops the server.
58 */
59 public dispose(): void {
60 if (this.serverInstance) {
61 this.serverInstance.close();
62 this.serverInstance = null;
63 }
64 }
65
66 /**
67 * HTTP request handler.
68 */
69 private handleIncomingMessage(message: http.IncomingMessage, response: http.ServerResponse): void {
70 let body = "";
71 message.on("data", (chunk: string) => {
72 body += chunk;
73 });
74
75 message.on("end", () => {
76 let arg: any = JSON.parse(body);
77 let extensionMessage: em.ExtensionIncomingMessage = <any>em.ExtensionIncomingMessage[<any>message.url.substring(1)];
78 console.log("Received message: " + message.url);
79
80 this.handleExtensionMessage(extensionMessage, arg)
81 .then(result => {
82 response.writeHead(200, "OK", { "Content-Type": "application/json" });
83 response.end(JSON.stringify(result));
84 })
85 .catch(() => {
86 response.writeHead(404, "Not Found");
87 response.end();
88 })
89 .done();
90 });
91 }
92
93 /**
94 * Extension message handler.
95 */
96 private handleExtensionMessage(message: em.ExtensionIncomingMessage, args: any): Q.Promise<any> {
97 let deferred = Q.defer<any>();
98 /* handle each extension message here and return the result */
99 switch (message) {
100 case em.ExtensionIncomingMessage.START_PACKAGER:
101 /* TODO */
102 break;
103 case em.ExtensionIncomingMessage.STOP_PACKAGER:
104 /* TODO */
105 break;
106 default:
107 throw new Error("Invalid message: " + message);
108 }
109
110 return deferred.promise;
111 }
112}