Setup sdk for background plugin

Summary:
This diff sets up flipper for running plugins in background. This diff does the following

- Adds a function named `runInBackground` to the interface `FlipperPlugin` to make the plugins opt in to be run in background, default is false
- Changes the javascript side of the flipper to store the messages received by the plugins in background
- Process the stored messages when the plugin in background becomes active
- Currently I have just turned on network plugin to be in background mode.

- Remove the buffering from the network plugin, as it will run in background
- Write a batching layer to batch the messages and send to flipper.

Note: I haven't tested the wilde app yet, but the sample app works. I will remove the "[WIP]" from the title once I have tested it in wilde

Reviewed By: danielbuechele

Differential Revision: D10301403

fbshipit-source-id: 034eebf659a545d6b480a4ac1b73b0aa4b2f9797
This commit is contained in:
Pritesh Nandgaonkar
2018-10-11 15:19:19 -07:00
committed by Facebook Github Bot
parent 992ad68517
commit 5bbfa58909
11 changed files with 104 additions and 5 deletions

View File

@@ -43,6 +43,7 @@ export default class Client extends EventEmitter {
this.messageIdCounter = 0;
this.logger = logger;
this.bufferedMessages = new Map();
this.broadcastCallbacks = new Map();
this.requestCallbacks = new Map();
@@ -77,6 +78,7 @@ export default class Client extends EventEmitter {
connection: ReactiveSocket;
responder: PartialResponder;
bufferedMessages: Map<string, Array<Object>>;
broadcastCallbacks: Map<?string, Map<string, Set<Function>>>;
requestCallbacks: Map<
@@ -163,7 +165,11 @@ export default class Client extends EventEmitter {
}
const methodCallbacks: ?Set<Function> = apiCallbacks.get(params.method);
if (methodCallbacks) {
if (this.selectedPlugin != params.api) {
this.bufferMessage(params);
return;
}
if (methodCallbacks && methodCallbacks.size > 0) {
for (const callback of methodCallbacks) {
callback(params.params);
}
@@ -188,6 +194,39 @@ export default class Client extends EventEmitter {
}
}
readBufferedMessages(id: string) {
const paramsArray = this.bufferedMessages.get(id);
if (!paramsArray) {
return;
}
paramsArray.forEach((params, i) =>
setTimeout(() => {
const apiCallbacks = this.broadcastCallbacks.get(params.api);
if (!apiCallbacks) {
return;
}
const methodCallbacks: ?Set<Function> = apiCallbacks.get(params.method);
if (methodCallbacks) {
for (const callback of methodCallbacks) {
callback(params.params);
}
}
}, i * 20),
);
this.bufferedMessages.delete(id);
}
bufferMessage(msg: Object) {
const arr = this.bufferedMessages.get(msg.api);
if (arr) {
arr.push(msg);
this.bufferedMessages.set(msg.api, arr);
} else {
this.bufferedMessages.set(msg.api, [msg]);
}
}
toJSON() {
return `<Client#${this.id}>`;
}