Implement sending messages from desktop to add-on
Reviewed By: antonk52 Differential Revision: D34239803 fbshipit-source-id: 1a18d522ba877ade3d0703fbb374c15b596241d7
This commit is contained in:
committed by
Facebook GitHub Bot
parent
2ce037d96b
commit
4067f5bd88
@@ -16,6 +16,11 @@ import {
|
||||
export interface ServerAddOnControls {
|
||||
start: FlipperServerCommands['plugins-server-add-on-start'];
|
||||
stop: FlipperServerCommands['plugins-server-add-on-stop'];
|
||||
sendMessage: (
|
||||
pluginName: string,
|
||||
method: string,
|
||||
params?: unknown,
|
||||
) => Promise<object | string | number | boolean | null>;
|
||||
}
|
||||
|
||||
// TODO: Share with js-flipper? Is it worth it?
|
||||
|
||||
@@ -45,6 +45,7 @@ export {
|
||||
isAuthError,
|
||||
getStringFromErrorLike,
|
||||
getErrorFromErrorLike,
|
||||
deserializeRemoteError,
|
||||
} from './utils/errors';
|
||||
export * from './GK';
|
||||
export * from './clientUtils';
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {ClientErrorType} from '../server-types';
|
||||
|
||||
export function isAuthError(
|
||||
err: any,
|
||||
): err is UserNotSignedInError | UserUnauthorizedError {
|
||||
@@ -114,3 +116,10 @@ export function getStringFromErrorLike(e: any): string {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const deserializeRemoteError = (serializedError: ClientErrorType) => {
|
||||
const err = new Error(serializedError.message);
|
||||
err.name = serializedError.name;
|
||||
err.stack += `. Caused by: ${serializedError.stacktrace}`;
|
||||
return err;
|
||||
};
|
||||
|
||||
@@ -69,7 +69,7 @@ export class SandyDevicePluginInstance extends BasePluginInstance {
|
||||
}
|
||||
|
||||
/** client that is bound to this instance */
|
||||
readonly client: DevicePluginClient;
|
||||
readonly client: DevicePluginClient<any, any>;
|
||||
|
||||
constructor(
|
||||
serverAddOnControls: ServerAddOnControls,
|
||||
|
||||
@@ -379,9 +379,13 @@ export abstract class BasePluginInstance {
|
||||
this.flipperLib.showNotification(this.pluginKey, notification);
|
||||
},
|
||||
logger: this.flipperLib.logger,
|
||||
sendToServerAddOn: (_method, _params): any => {
|
||||
// TODO: Implement me
|
||||
},
|
||||
sendToServerAddOn: (method, params) =>
|
||||
this.serverAddOnControls.sendMessage(
|
||||
this.definition.packageName,
|
||||
// TODO: Remove type cast
|
||||
method as string,
|
||||
params,
|
||||
),
|
||||
onServerAddOnMessage: (_event, _cb) => {
|
||||
// TODO: Implement me
|
||||
},
|
||||
|
||||
@@ -647,5 +647,6 @@ function createServerAddOnControlsMock(): ServerAddOnControls {
|
||||
return {
|
||||
start: createStubFunction(),
|
||||
stop: createStubFunction(),
|
||||
sendMessage: createStubFunction(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ export class ServerAddOn {
|
||||
);
|
||||
|
||||
const serverAddOnModuleToDesktopConnection =
|
||||
new ServerAddOnModuleToDesktopConnection();
|
||||
new ServerAddOnModuleToDesktopConnection(pluginName);
|
||||
|
||||
const cleanup = await serverAddOn(serverAddOnModuleToDesktopConnection, {
|
||||
flipperServer,
|
||||
|
||||
@@ -27,6 +27,10 @@ export class ServerAddOnModuleToDesktopConnection
|
||||
{
|
||||
private subscriptions: Map<string, FlipperPluginReceiver> = new Map();
|
||||
|
||||
constructor(private readonly pluginName: string) {
|
||||
super();
|
||||
}
|
||||
|
||||
send(method: string, params: unknown) {
|
||||
const event = 'message';
|
||||
const message: ServerAddOnModuleToDesktopConnectionEvents[typeof event] = {
|
||||
@@ -34,7 +38,7 @@ export class ServerAddOnModuleToDesktopConnection
|
||||
params: {
|
||||
method,
|
||||
params,
|
||||
api: '', // TODO: Consider using here pluginName and validate it
|
||||
api: this.pluginName,
|
||||
},
|
||||
};
|
||||
this.emit('message', message);
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {FlipperServer, ServerAddOnControls} from 'flipper-common';
|
||||
import {
|
||||
FlipperServer,
|
||||
ServerAddOnControls,
|
||||
deserializeRemoteError,
|
||||
} from 'flipper-common';
|
||||
|
||||
export const createServerAddOnControls = (
|
||||
flipperServer: Pick<FlipperServer, 'exec'>,
|
||||
@@ -16,4 +20,23 @@ export const createServerAddOnControls = (
|
||||
flipperServer.exec('plugins-server-add-on-start', pluginName, owner),
|
||||
stop: (pluginName, owner) =>
|
||||
flipperServer.exec('plugins-server-add-on-stop', pluginName, owner),
|
||||
sendMessage: async (pluginName, method, params) => {
|
||||
const res = await flipperServer.exec(
|
||||
'plugins-server-add-on-request-response',
|
||||
{
|
||||
method: 'execute',
|
||||
params: {
|
||||
method,
|
||||
api: pluginName,
|
||||
params,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
if (res.error) {
|
||||
throw deserializeRemoteError(res.error);
|
||||
}
|
||||
|
||||
return res.success;
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user