Add companion logging
Summary: Add top-level error logging to flipper-server. Use the top-level logging mechanism in flipper-companion. Reviewed By: lblasa Differential Revision: D36252218 fbshipit-source-id: 58d22b3b9bd51e597b5250478640f54d10277861
This commit is contained in:
committed by
Facebook GitHub Bot
parent
e218b79de2
commit
98dde53cda
@@ -41,6 +41,8 @@ export {
|
||||
UserUnauthorizedError,
|
||||
UserNotSignedInError,
|
||||
NoLongerConnectedToClientError,
|
||||
UserError,
|
||||
SystemError,
|
||||
isConnectivityOrAuthError,
|
||||
isError,
|
||||
isAuthError,
|
||||
|
||||
@@ -30,6 +30,24 @@ export function isConnectivityOrAuthError(
|
||||
);
|
||||
}
|
||||
|
||||
export class SystemError extends Error {
|
||||
name = 'SystemError';
|
||||
readonly context?: unknown;
|
||||
constructor(msg: string, ...args: unknown[]) {
|
||||
super(msg);
|
||||
this.context = args;
|
||||
}
|
||||
}
|
||||
|
||||
export class UserError extends Error {
|
||||
name = 'UserError';
|
||||
readonly context?: unknown;
|
||||
constructor(msg: string, ...args: unknown[]) {
|
||||
super(msg);
|
||||
this.context = args;
|
||||
}
|
||||
}
|
||||
|
||||
export class UnableToExtractClientQueryError extends Error {
|
||||
constructor(msg: string) {
|
||||
super(msg);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {FlipperServer, Logger} from 'flipper-common';
|
||||
import {FlipperServer, Logger, UserError, SystemError} from 'flipper-common';
|
||||
import {BaseDevice} from 'flipper-frontend-core';
|
||||
import {_SandyPluginDefinition} from 'flipper-plugin';
|
||||
import {HeadlessClient} from './HeadlessClient';
|
||||
@@ -121,8 +121,9 @@ export class FlipperServerCompanion {
|
||||
destroyClient(clientId: string) {
|
||||
const client = this.clients.get(clientId);
|
||||
if (!client) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.destroyClient -> client not found',
|
||||
client,
|
||||
);
|
||||
}
|
||||
client.destroy();
|
||||
@@ -136,8 +137,9 @@ export class FlipperServerCompanion {
|
||||
destroyDevice(deviceSerial: string) {
|
||||
const device = this.devices.get(deviceSerial);
|
||||
if (!device) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.destroyDevice -> device not found',
|
||||
deviceSerial,
|
||||
);
|
||||
}
|
||||
device.destroy();
|
||||
@@ -159,8 +161,9 @@ export class FlipperServerCompanion {
|
||||
|
||||
const clientInfo = await this.flipperServer.exec('client-find', clientId);
|
||||
if (!clientInfo) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.createHeadlessClientIfNeeded -> client not found',
|
||||
clientId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -206,8 +209,9 @@ export class FlipperServerCompanion {
|
||||
deviceSerial,
|
||||
);
|
||||
if (!deviceInfo) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.createHeadlessDeviceIfNeeded -> device not found',
|
||||
deviceSerial,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -228,8 +232,9 @@ export class FlipperServerCompanion {
|
||||
const handler: (...args: any[]) => Promise<any> =
|
||||
this.commandHandler[event];
|
||||
if (!handler) {
|
||||
throw new Error(
|
||||
`Unimplemented FlipperServerCompanion command: ${event}`,
|
||||
throw new UserError(
|
||||
`Unimplemented FlipperServerCompanion command`,
|
||||
event,
|
||||
);
|
||||
}
|
||||
const result = await handler(...args);
|
||||
@@ -267,14 +272,18 @@ export class FlipperServerCompanion {
|
||||
|
||||
const pluginInstance = client.sandyPluginStates.get(pluginId);
|
||||
if (!pluginInstance) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-start -> plugin not found',
|
||||
clientId,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!client.connected.get()) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-start -> client not connected',
|
||||
clientId,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -283,15 +292,19 @@ export class FlipperServerCompanion {
|
||||
'companion-plugin-stop': async (clientId, pluginId) => {
|
||||
const client = this.clients.get(clientId);
|
||||
if (!client) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-stop -> client not found',
|
||||
clientId,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
const pluginInstance = client.sandyPluginStates.get(pluginId);
|
||||
if (!pluginInstance) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-stop -> plugin not found',
|
||||
clientId,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -302,8 +315,10 @@ export class FlipperServerCompanion {
|
||||
}
|
||||
|
||||
if (!pluginInstance.activated) {
|
||||
throw new Error(
|
||||
throw new SystemError(
|
||||
'FlipperServerCompanion.companion-plugin-stop -> plugin not activated',
|
||||
clientId,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -312,33 +327,53 @@ export class FlipperServerCompanion {
|
||||
'companion-plugin-exec': async (clientId, pluginId, api, params) => {
|
||||
const client = this.clients.get(clientId);
|
||||
if (!client) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> client not found',
|
||||
clientId,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
const pluginInstance = client.sandyPluginStates.get(pluginId);
|
||||
if (!pluginInstance) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> plugin not found',
|
||||
clientId,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
if (!client.connected.get()) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> client not connected',
|
||||
clientId,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
if (!pluginInstance.companionApi) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> plugin does not expose API',
|
||||
clientId,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
if (typeof pluginInstance.companionApi[api] !== 'function') {
|
||||
throw new Error(
|
||||
throw new SystemError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> plugin does not expose requested API method or it is not callable',
|
||||
clientId,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -368,20 +403,26 @@ export class FlipperServerCompanion {
|
||||
|
||||
const pluginDefinition = this.loadablePlugins.get(pluginId);
|
||||
if (!pluginDefinition) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-start -> plugin definition not found',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!device.connected.get()) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-start -> device not connected',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!device.supportsPlugin(pluginDefinition)) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-start -> device does not support plugin',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -391,27 +432,35 @@ export class FlipperServerCompanion {
|
||||
'companion-device-plugin-stop': async (deviceSerial, pluginId) => {
|
||||
const device = this.devices.get(deviceSerial);
|
||||
if (!device) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-stop -> client not found',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
const pluginInstance = device.sandyPluginStates.get(pluginId);
|
||||
if (!pluginInstance) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-stop -> plugin not found',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!device.connected.get()) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-stop -> device not connected',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
if (!pluginInstance.activated) {
|
||||
throw new Error(
|
||||
throw new SystemError(
|
||||
'FlipperServerCompanion.companion-device-plugin-stop -> plugin not activated',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -425,33 +474,53 @@ export class FlipperServerCompanion {
|
||||
) => {
|
||||
const device = this.devices.get(deviceSerial);
|
||||
if (!device) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-exec -> device not found',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
const pluginInstance = device.sandyPluginStates.get(pluginId);
|
||||
if (!pluginInstance) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-device-plugin-exec -> plugin not found',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
if (!device.connected.get()) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> client not connected',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
if (!pluginInstance.companionApi) {
|
||||
throw new Error(
|
||||
throw new UserError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> plugin does not expose API',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
if (typeof pluginInstance.companionApi[api] !== 'function') {
|
||||
throw new Error(
|
||||
throw new SystemError(
|
||||
'FlipperServerCompanion.companion-plugin-exec -> plugin does not expose requested API method or it is not callable',
|
||||
deviceSerial,
|
||||
pluginId,
|
||||
api,
|
||||
params,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ import {
|
||||
ExecResponseErrorWebSocketMessage,
|
||||
ServerEventWebSocketMessage,
|
||||
GenericWebSocketError,
|
||||
UserError,
|
||||
SystemError,
|
||||
} from 'flipper-common';
|
||||
import {FlipperServerImpl} from 'flipper-server-core';
|
||||
import {WebSocketServer} from 'ws';
|
||||
@@ -99,6 +101,20 @@ export function startSocketServer(
|
||||
}
|
||||
})
|
||||
.catch((error: any) => {
|
||||
if (error instanceof UserError) {
|
||||
console.warn(
|
||||
`flipper-server.startSocketServer.exec: ${error.message}`,
|
||||
error.context,
|
||||
error.stack,
|
||||
);
|
||||
}
|
||||
if (error instanceof SystemError) {
|
||||
console.error(
|
||||
`flipper-server.startSocketServer.exec: ${error.message}`,
|
||||
error.context,
|
||||
error.stack,
|
||||
);
|
||||
}
|
||||
if (connected) {
|
||||
// TODO: Serialize error
|
||||
// TODO: log if verbose console.warn('Failed to handle response', error);
|
||||
|
||||
Reference in New Issue
Block a user