Refactor server implementation for WebSockets
Summary: Standardize WS implementation for JS environments. Why do we need a separate server implementation for browsers? Browser targets cannot authenticate via the default certificate exchange flow. For browser targets we verify the origin instead. Moreover, for already forgotten reasons the initial implementation of the WS server for browsers used a different kind of message structure and added extra `connect`/`disconnect` messages. After examination, it seems the `connect`/`disconnect` flow is redundant. Major changes: 1. Updated class hierarchy for WS server implementations. 2. Updated browser WS server to support the modern and the legacy protocols. 3. Now a websocket connection with the device is closed on error. The idea is it is highly unlikely to handle any subsequent messages properly once we observe an error. It is better to bail and reconnect. What do you think? Reviewed By: mweststrate Differential Revision: D31532172 fbshipit-source-id: f86aa63a40efe4d5263353cc124fac8c63b80e45
This commit is contained in:
committed by
Facebook GitHub Bot
parent
6bd4a07286
commit
37498ad5a9
@@ -10,8 +10,9 @@
|
||||
import {SecureServerConfig} from '../utils/CertificateProvider';
|
||||
import ServerAdapter, {ServerEventsListener} from './ServerAdapter';
|
||||
import ServerRSocket from './ServerRSocket';
|
||||
import SecureServerWebSocket from './SecureServerWebSocket';
|
||||
import BrowserServerWebSocket from './BrowserServerWebSocket';
|
||||
import ServerWebSocket from './ServerWebSocket';
|
||||
import ServerWebSocketBrowser from './ServerWebSocketBrowser';
|
||||
|
||||
export enum TransportType {
|
||||
RSocket,
|
||||
@@ -25,33 +26,22 @@ export enum TransportType {
|
||||
* @param listener An object implementing the ServerEventsListener interface.
|
||||
* @param sslConfig An SSL configuration for TLS servers.
|
||||
*/
|
||||
export function createServer(
|
||||
export async function createServer(
|
||||
port: number,
|
||||
listener: ServerEventsListener,
|
||||
sslConfig?: SecureServerConfig,
|
||||
transportType: TransportType = TransportType.RSocket,
|
||||
): Promise<ServerAdapter> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const server =
|
||||
transportType === TransportType.RSocket
|
||||
? new ServerRSocket(listener)
|
||||
: new ServerWebSocket(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);
|
||||
});
|
||||
});
|
||||
let server: ServerAdapter;
|
||||
if (transportType === TransportType.RSocket) {
|
||||
server = new ServerRSocket(listener);
|
||||
} else if (sslConfig) {
|
||||
server = new SecureServerWebSocket(listener);
|
||||
} else {
|
||||
server = new ServerWebSocket(listener);
|
||||
}
|
||||
await server.start(port, sslConfig);
|
||||
return server;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -63,26 +53,11 @@ export function createServer(
|
||||
* @param listener An object implementing the ServerEventsListener interface.
|
||||
* @returns
|
||||
*/
|
||||
export function createBrowserServer(
|
||||
export async 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);
|
||||
});
|
||||
});
|
||||
const server = new BrowserServerWebSocket(listener);
|
||||
await server.start(port);
|
||||
return server;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user