Add onServerAddOnStart and onServerAddOnStop plugin hooks

Reviewed By: mweststrate

Differential Revision: D34378231

fbshipit-source-id: e086eebcf94c01da76bfe8b88c6528bd21d89968
This commit is contained in:
Andrey Goncharov
2022-02-28 03:50:34 -08:00
committed by Facebook GitHub Bot
parent 9e4ac0aaa9
commit dcfc84cce6

View File

@@ -136,6 +136,20 @@ export interface BasePluginClient<
*/ */
logger: Logger; logger: Logger;
/**
* Triggered when a server add-on starts.
* You should send messages to the server add-on only after it connects.
* Do not forget to stop all communication when the add-on stops.
* See `onServerAddStop`.
*/
onServerAddOnStart(callback: () => void): void;
/**
* Triggered when a server add-on stops.
* You should stop all communication with the server add-on when the add-on stops.
*/
onServerAddOnStop(callback: () => void): void;
/** /**
* Subscribe to a specific event arriving from the server add-on. * Subscribe to a specific event arriving from the server add-on.
* *
@@ -216,6 +230,8 @@ export abstract class BasePluginInstance {
activated = false; activated = false;
destroyed = false; destroyed = false;
private serverAddOnStarted = false;
private serverAddOnStopped = false;
readonly events = new EventEmitter(); readonly events = new EventEmitter();
// temporarily field that is used during deserialization // temporarily field that is used during deserialization
@@ -379,6 +395,18 @@ export abstract class BasePluginInstance {
this.flipperLib.showNotification(this.pluginKey, notification); this.flipperLib.showNotification(this.pluginKey, notification);
}, },
logger: this.flipperLib.logger, logger: this.flipperLib.logger,
onServerAddOnStart: (cb) => {
this.events.on('serverAddOnStart', batched(cb));
if (this.serverAddOnStarted) {
batched(cb)();
}
},
onServerAddOnStop: (cb) => {
this.events.on('serverAddOnStop', batched(cb));
if (this.serverAddOnStopped) {
batched(cb)();
}
},
sendToServerAddOn: (method, params) => sendToServerAddOn: (method, params) =>
this.serverAddOnControls.sendMessage( this.serverAddOnControls.sendMessage(
this.definition.packageName, this.definition.packageName,
@@ -519,6 +547,10 @@ export abstract class BasePluginInstance {
: {path: pluginDetails.serverAddOnEntry!}, : {path: pluginDetails.serverAddOnEntry!},
this.serverAddOnOwner, this.serverAddOnOwner,
) )
.then(() => {
this.events.emit('serverAddOnStart');
this.serverAddOnStarted = true;
})
.catch((e) => { .catch((e) => {
console.warn( console.warn(
'Failed to start a server add on', 'Failed to start a server add on',
@@ -533,9 +565,15 @@ export abstract class BasePluginInstance {
protected stopServerAddOn() { protected stopServerAddOn() {
const {serverAddOn, name} = this.definition.details; const {serverAddOn, name} = this.definition.details;
if (serverAddOn) { if (serverAddOn) {
this.serverAddOnControls.stop(name, this.serverAddOnOwner).catch((e) => { this.serverAddOnControls
.stop(name, this.serverAddOnOwner)
.finally(() => {
this.events.emit('serverAddOnStop');
this.serverAddOnStopped = true;
})
.catch((e) => {
console.warn( console.warn(
'Failed to start a server add on', 'Failed to stop a server add on',
name, name,
this.serverAddOnOwner, this.serverAddOnOwner,
e, e,