Make client.device fulfill type constraints

Summary:
This is an interesting invariant that TS caught here. We
expect `getDevice()` to always return a device but it
cannot because it's set lazily. John Knox suggested we instead
set up a promise in the constructor and resolve it instead of
overriding the stateful promise later.

Reviewed By: jknoxville

Differential Revision: D17313468

fbshipit-source-id: 8fd75f2720546abf67beead23db56216f1a5e0df
This commit is contained in:
Pascal Hartig
2019-09-11 05:36:42 -07:00
committed by Facebook Github Bot
parent a35fd7389f
commit f48fe21eaa
2 changed files with 15 additions and 6 deletions

View File

@@ -115,7 +115,9 @@ export default class Client extends EventEmitter {
responder: Partial<Responder<string, any>>;
store: Store;
activePlugins: Set<string>;
device: Promise<BaseDevice> | undefined;
device: Promise<BaseDevice>;
_deviceResolve: (device: BaseDevice) => void = _ => {};
_deviceSet: boolean = false;
logger: Logger;
lastSeenDeviceList: Array<BaseDevice>;
broadcastCallbacks: Map<string, Map<string, Set<Function>>>;
@@ -154,6 +156,10 @@ export default class Client extends EventEmitter {
this.activePlugins = new Set();
this.lastSeenDeviceList = [];
this.device = new Promise((resolve, _reject) => {
this._deviceResolve = resolve;
});
const client = this;
// node.js doesn't support requestIdleCallback
const rIC =
@@ -211,11 +217,11 @@ export default class Client extends EventEmitter {
However, clients can connect before a device is registered, so wait a
while for the device to be registered if it isn't already. */
setMatchingDevice(): void {
if (this.device) {
if (this._deviceSet) {
return;
}
this.device = reportPlatformFailures(
new Promise((resolve, reject) => {
reportPlatformFailures(
new Promise<BaseDevice>((resolve, reject) => {
const device = this.store
.getState()
.connections.devices.find(
@@ -248,7 +254,10 @@ export default class Client extends EventEmitter {
}, 5000);
}),
'client-setMatchingDevice',
);
).then(device => {
this._deviceSet = true;
this._deviceResolve(device);
});
}
supportsPlugin(Plugin: typeof FlipperPlugin): boolean {

View File

@@ -120,7 +120,7 @@ export abstract class FlipperBasePlugin<
reducers: {
[actionName: string]: (state: State, actionData: any) => Partial<State>;
} = {};
app: App;
app: App | null = null;
onKeyboardAction: ((action: string) => void) | undefined;
toJSON() {