microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
3c013cde4fe612455943c1ec04edd32268a040b1

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/extensionServer.ts

139lines · 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 console.log("Prewarming bundle cache for platform: " + platform);
96 return this.reactNativePackager.prewarmBundleCache(platform);
97 }
98
99 /**
100 * HTTP request handler.
101 */
102 private handleIncomingMessage(message: http.IncomingMessage, response: http.ServerResponse): void {
103 let body = "";
104 message.on("data", (chunk: string) => {
105 body += chunk;
106 });
107
108 message.on("end", () => {
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 });
126 }
127
128 /**
129 * Extension message handler.
130 */
131 private handleExtensionMessage(message: em.ExtensionMessage, args?: any[]): Q.Promise<any> {
132 let handler = this.messageHandlerDictionary[message];
133 if (handler) {
134 return handler.apply(this, args);
135 } else {
136 return Q.reject("Invalid message: " + message);
137 }
138 }
139}
140