Files
flipper/desktop/app/src/comms/ServerFactory.tsx
Lorenzo Blasa 4e6b895fc9 WebSocket server GK
Summary:
This change enables a WebSocket server if the user is on the 'flipper_websocket_server' GK.

I don't expect this change to make it as the final product of the entire solution. Instead, it can be used to quickly enable/disable WebSocket during development/testing without requiring any code changes.

Reviewed By: passy

Differential Revision: D30069694

fbshipit-source-id: 75daac75e6dad7f63cf194d8287971c33d3abb61
2021-08-03 09:34:57 -07:00

94 lines
2.9 KiB
TypeScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import GK from '../fb-stubs/GK';
import {SecureServerConfig} from '../utils/CertificateProvider';
import ServerAdapter, {ServerEventsListener} from './ServerAdapter';
import ServerRSocket from './ServerRSocket';
import ServerWebSocket from './ServerWebSocket';
import ServerWebSocketBrowser from './ServerWebSocketBrowser';
function _createServer(listener: ServerEventsListener) {
/**
* GK could be setup or queried to determine whether to use RSocket or
* WebSocket. Default is RSocket, but the stage is set for different type
* of communication channels.
*/
if (GK.get('flipper_websocket_server')) {
return new ServerWebSocket(listener);
}
return new ServerRSocket(listener);
}
/**
* Creates a server to be used by Flipper. The created server will be set into
* the promise once it has started and bound to the specified port.
* @param port A port number in which to listen for incoming connections.
* @param listener An object implementing the ServerEventsListener interface.
* @param sslConfig An SSL configuration for TLS servers.
*/
export function createServer(
port: number,
listener: ServerEventsListener,
sslConfig?: SecureServerConfig,
): Promise<ServerAdapter> {
return new Promise((resolve, reject) => {
const server = _createServer(listener);
server
.start(port, sslConfig)
.then((started) => {
if (started) {
resolve(server);
} else {
reject(
new Error(`An error occurred whilst trying
to start the server listening at port ${port}`),
);
}
})
.catch((error: any) => {
reject(error);
});
});
}
/**
* Creates a server to be used by Flipper to allow Browser connections.
* The protocol is slightly different for Browser connections hence a different
* factory method. The created server will be set into the promise
* once it has started and bound to the specified port.
* @param port A port number in which to listen for incoming connections.
* @param listener An object implementing the ServerEventsListener interface.
* @returns
*/
export function createBrowserServer(
port: number,
listener: ServerEventsListener,
): Promise<ServerAdapter> {
return new Promise((resolve, reject) => {
const server = new ServerWebSocketBrowser(listener);
server
.start(port)
.then((started) => {
if (started) {
resolve(server);
} else {
reject(
new Error(`An error occurred whilst trying
to start the server listening at port ${port}`),
);
}
})
.catch((error: any) => {
reject(error);
});
});
}