microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
a503690b21087a9ed082683b27b60d42ca536723

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/extensionServer.ts

143lines · 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 {Packager} from "../common/packager";
8import * as Q from "q";
9import {SettingsHelper} from "./settingsHelper";
10import * as vscode from "vscode";
11
12
13export class ExtensionServer implements vscode.Disposable {
14
15 private serverInstance: http.Server = null;
16 private messageHandlerDictionary: { [id: number]: ((...argArray: any[]) => Q.Promise<any>) } = {};
17 private reactNativePackager: Packager;
18
19 public constructor(reactNativePackager: Packager) {
20 this.reactNativePackager = reactNativePackager;
21
22 /* register handlers for all messages */
23 this.messageHandlerDictionary[em.ExtensionMessage.START_PACKAGER] = this.startPackager;
24 this.messageHandlerDictionary[em.ExtensionMessage.STOP_PACKAGER] = this.stopPackager;
25 this.messageHandlerDictionary[em.ExtensionMessage.PREWARM_BUNDLE_CACHE] = this.prewarmBundleCache;
26 }
27
28 /**
29 * Starts the server.
30 */
31 public setup(): Q.Promise<void> {
32
33 let deferred = Q.defer<void>();
34
35 let requestHandler = (request: http.IncomingMessage, response: http.ServerResponse) => {
36 this.handleIncomingMessage(request, response);
37 };
38
39 let launchCallback = (error: any) => {
40 if (error) {
41 deferred.reject(error);
42 } else {
43 deferred.resolve(null);
44 }
45 };
46
47 let port = em.ServerDefaultParams.PORT;
48 SettingsHelper.readLaunchJson()
49 .then((launchJson: any) => {
50 if (launchJson) {
51 /* take the fist configuration that specifies the port */
52 port = (<Array<ILaunchArgs>>launchJson.configurations)
53 .filter((configuration: ILaunchArgs, index: number, array: any[]) => {
54 return !!configuration.internalExtensionPort;
55 })[0].internalExtensionPort;
56 }
57 })
58 .fail(() => { /* using default port in case of any error */ })
59 .done(() => {
60 this.serverInstance = http.createServer(requestHandler);
61 this.serverInstance.listen(port, null, null, launchCallback);
62 });
63
64 return deferred.promise;
65 }
66
67 /**
68 * Stops the server.
69 */
70 public dispose(): void {
71 if (this.serverInstance) {
72 this.serverInstance.close();
73 this.serverInstance = null;
74 }
75 }
76
77 /**
78 * Message handler for START_PACKAGER.
79 */
80 private startPackager(): Q.Promise<any> {
81 return this.reactNativePackager.start(vscode.window.createOutputChannel("React-Native"));
82 }
83
84 /**
85 * Message handler for STOP_PACKAGER.
86 */
87 private stopPackager(): Q.Promise<any> {
88 return this.reactNativePackager.stop(vscode.window.createOutputChannel("React-Native"));
89 }
90
91 /**
92 * Message handler for PREWARM_BUNDLE_CACHE.
93 */
94 private prewarmBundleCache(platform: string): Q.Promise<any> {
95 return this.reactNativePackager.prewarmBundleCache(platform);
96 }
97
98 /**
99 * HTTP request handler.
100 */
101 private handleIncomingMessage(message: http.IncomingMessage, response: http.ServerResponse): void {
102 let body = "";
103 message.on("data", (chunk: string) => {
104 body += chunk;
105 });
106
107 message.on("end", () => {
108 try {
109 let args: any[];
110 if (body) {
111 args = JSON.parse(body);
112 }
113 let extensionMessage: em.ExtensionMessage = <any>em.ExtensionMessage[<any>message.url.substring(1)];
114
115 this.handleExtensionMessage(extensionMessage, args)
116 .then(result => {
117 response.writeHead(200, "OK", { "Content-Type": "application/json" });
118 response.end(JSON.stringify(result));
119 })
120 .catch(() => {
121 response.writeHead(404, "Not Found");
122 response.end();
123 })
124 .done();
125 } catch (e) {
126 response.writeHead(404, "Not Found");
127 response.end();
128 }
129 });
130 }
131
132 /**
133 * Extension message handler.
134 */
135 private handleExtensionMessage(message: em.ExtensionMessage, args?: any[]): Q.Promise<any> {
136 let handler = this.messageHandlerDictionary[message];
137 if (handler) {
138 return handler.apply(this, args);
139 } else {
140 return Q.reject("Invalid message: " + message);
141 }
142 }
143}