Extend Flipper commands to support server add-on messaging
Reviewed By: mweststrate Differential Revision: D34046466 fbshipit-source-id: 9acc172c1805ec724b8709999bacf9e899c39e6b
This commit is contained in:
committed by
Facebook GitHub Bot
parent
3b390b74ff
commit
12151e4a71
@@ -125,6 +125,9 @@ export type FlipperServerEvents = {
|
|||||||
id: string;
|
id: string;
|
||||||
message: string;
|
message: string;
|
||||||
};
|
};
|
||||||
|
'plugins-server-add-on-message': {
|
||||||
|
payload: ExecuteMessage;
|
||||||
|
};
|
||||||
'download-file-update': DownloadFileUpdate;
|
'download-file-update': DownloadFileUpdate;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -257,6 +260,9 @@ export type FlipperServerCommands = {
|
|||||||
pluginName: string,
|
pluginName: string,
|
||||||
owner: string,
|
owner: string,
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
|
'plugins-server-add-on-request-response': (
|
||||||
|
payload: ExecuteMessage,
|
||||||
|
) => Promise<ClientResponseType>;
|
||||||
'doctor-get-healthchecks': (
|
'doctor-get-healthchecks': (
|
||||||
settings: FlipperDoctor.HealthcheckSettings,
|
settings: FlipperDoctor.HealthcheckSettings,
|
||||||
) => Promise<FlipperDoctor.Healthchecks>;
|
) => Promise<FlipperDoctor.Healthchecks>;
|
||||||
|
|||||||
@@ -424,6 +424,22 @@ export class FlipperServerImpl implements FlipperServer {
|
|||||||
// TODO: Figure out if it needs to be async
|
// TODO: Figure out if it needs to be async
|
||||||
'plugins-server-add-on-stop': async (pluginName, owner) =>
|
'plugins-server-add-on-stop': async (pluginName, owner) =>
|
||||||
this.pluginManager.stopServerAddOn(pluginName, owner),
|
this.pluginManager.stopServerAddOn(pluginName, owner),
|
||||||
|
'plugins-server-add-on-request-response': async (payload) => {
|
||||||
|
const serverAddOn = this.pluginManager.getServerAddOnForMessage(payload);
|
||||||
|
if (serverAddOn) {
|
||||||
|
return await serverAddOn.connection.sendExpectResponse(payload);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
length: 0,
|
||||||
|
error: {
|
||||||
|
message: `Server add-on for message '${JSON.stringify(
|
||||||
|
payload,
|
||||||
|
)} is no longer running.`,
|
||||||
|
name: 'SERVER_ADDON_STOPPED',
|
||||||
|
stacktrace: '',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
'doctor-get-healthchecks': getHealthChecks,
|
'doctor-get-healthchecks': getHealthChecks,
|
||||||
'doctor-run-healthcheck': runHealthcheck,
|
'doctor-run-healthcheck': runHealthcheck,
|
||||||
'open-file': openFile,
|
'open-file': openFile,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {default as axios} from 'axios';
|
|||||||
import {
|
import {
|
||||||
BundledPluginDetails,
|
BundledPluginDetails,
|
||||||
DownloadablePluginDetails,
|
DownloadablePluginDetails,
|
||||||
|
ExecuteMessage,
|
||||||
InstalledPluginDetails,
|
InstalledPluginDetails,
|
||||||
} from 'flipper-common';
|
} from 'flipper-common';
|
||||||
import {getStaticPath} from '../utils/pathUtils';
|
import {getStaticPath} from '../utils/pathUtils';
|
||||||
@@ -43,6 +44,9 @@ const getTempDirName = promisify(tmp.dir) as (
|
|||||||
options?: tmp.DirOptions,
|
options?: tmp.DirOptions,
|
||||||
) => Promise<string>;
|
) => Promise<string>;
|
||||||
|
|
||||||
|
const isExecuteMessage = (message: object): message is ExecuteMessage =>
|
||||||
|
(message as ExecuteMessage).method === 'execute';
|
||||||
|
|
||||||
export class PluginManager {
|
export class PluginManager {
|
||||||
private readonly serverAddOns = new Map<string, ServerAddOn>();
|
private readonly serverAddOns = new Map<string, ServerAddOn>();
|
||||||
|
|
||||||
@@ -155,6 +159,17 @@ export class PluginManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getServerAddOnForMessage(message: object) {
|
||||||
|
if (!isExecuteMessage(message)) {
|
||||||
|
throw new Error(
|
||||||
|
`PluginManager.getServerAddOnForMessage supports only "execute" messages. Received ${JSON.stringify(
|
||||||
|
message,
|
||||||
|
)}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return this.serverAddOns.get(message.params.api);
|
||||||
|
}
|
||||||
|
|
||||||
async startServerAddOn(pluginName: string, owner: string) {
|
async startServerAddOn(pluginName: string, owner: string) {
|
||||||
console.debug('PluginManager.startServerAddOn', pluginName);
|
console.debug('PluginManager.startServerAddOn', pluginName);
|
||||||
const existingServerAddOn = this.serverAddOns.get(pluginName);
|
const existingServerAddOn = this.serverAddOns.get(pluginName);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
|
import {ClientResponseType, ExecuteMessage} from 'flipper-common';
|
||||||
import {assertNotNull} from '../comms/Utilities';
|
import {assertNotNull} from '../comms/Utilities';
|
||||||
|
|
||||||
type ServerAddOnCleanup = () => Promise<void>;
|
type ServerAddOnCleanup = () => Promise<void>;
|
||||||
@@ -20,9 +21,15 @@ const loadPlugin = (_pluginName: string): ServerAddOnModule => {
|
|||||||
return {serverAddOn: async () => async () => {}};
|
return {serverAddOn: async () => async () => {}};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface ServerAddOnConnection {
|
||||||
|
sendExpectResponse(payload: ExecuteMessage): Promise<ClientResponseType>;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Fix potential race conditions when starting/stopping concurrently
|
// TODO: Fix potential race conditions when starting/stopping concurrently
|
||||||
export class ServerAddOn {
|
export class ServerAddOn {
|
||||||
private owners: Set<string>;
|
private owners: Set<string>;
|
||||||
|
// TODO: Implement connection
|
||||||
|
public readonly connection!: ServerAddOnConnection;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
public readonly pluginName: string,
|
public readonly pluginName: string,
|
||||||
|
|||||||
Reference in New Issue
Block a user