JS apps support 1/n

Summary:
### Connecting Flipper with JS apps by using electron's BrowserWindow and IPC

1. UI: there is a menu item in Devices tab which opens JS Emulator Launcher Sheet. Here we can configure URL to open and initial size of the window.
2. BrowserWindow, preloaded js: there is SupportJSClientPreload.js which initialize communication between flipper and app via electron's ipc
3. On flipper's side there is src/utils/js-client/serverUtils.tsx which contains most of JS emulator related code
4. Extracting of FlipperClientConnection: since we don't use RScocket to communicate with JS app I extracted needed methods to FlipperClientConnection (located in Client) and partly implemented them in JSClientFlipperConnection (requestResponse is just send a message now, doesn't return actual result)

Reviewed By: jknoxville

Differential Revision: D18572882

fbshipit-source-id: 56d1ca1a60ed2e51329b917021a09382cbb1ceec
This commit is contained in:
Timur Valiev
2019-11-22 03:09:41 -08:00
committed by Facebook Github Bot
parent e7ad713df8
commit c685493db0
10 changed files with 496 additions and 11 deletions

View File

@@ -13,7 +13,8 @@ import {App} from './App.js';
import {Logger} from './fb-interfaces/Logger';
import {Store} from './reducers/index';
import {setPluginState} from './reducers/pluginStates';
import {RSocketClientSocket} from 'rsocket-core/RSocketClient';
import {Payload, ConnectionStatus} from 'rsocket-types';
import {Flowable, Single} from 'rsocket-flowable';
import {performance} from 'perf_hooks';
import {reportPlatformFailures, reportPluginFailures} from './utils/metrics';
import {notNull} from './utils/typeUtils';
@@ -97,6 +98,13 @@ const handleError = (
}
};
export interface FlipperClientConnection<D, M> {
connectionStatus(): Flowable<ConnectionStatus>;
close(): void;
fireAndForget(payload: Payload<D, M>): void;
requestResponse(payload: Payload<D, M>): Single<Payload<D, M>>;
}
export default class Client extends EventEmitter {
app: App | undefined;
connected: boolean;
@@ -105,7 +113,7 @@ export default class Client extends EventEmitter {
sdkVersion: number;
messageIdCounter: number;
plugins: Plugins;
connection: RSocketClientSocket<any, any> | null | undefined;
connection: FlipperClientConnection<any, any> | null | undefined;
store: Store;
activePlugins: Set<string>;
device: Promise<BaseDevice>;
@@ -129,7 +137,7 @@ export default class Client extends EventEmitter {
constructor(
id: string,
query: ClientQuery,
conn: RSocketClientSocket<any, any> | null | undefined,
conn: FlipperClientConnection<any, any> | null | undefined,
logger: Logger,
store: Store,
plugins?: Plugins | null | undefined,