${description}
),
duration: 0,
});
}
export async function handleClientConnected(
server: FlipperServer,
store: Store,
logger: Logger,
{id, query}: ClientDescription,
) {
const {connections} = store.getState();
const existingClient = connections.clients.get(id);
if (existingClient) {
existingClient.destroy();
store.dispatch({
type: 'CLEAR_CLIENT_PLUGINS_STATE',
payload: {
clientId: id,
devicePlugins: new Set(),
},
});
store.dispatch({
type: 'CLIENT_REMOVED',
payload: id,
});
}
console.log(
`Searching matching device ${query.device_id} for client ${query.app}...`,
);
const device =
getDeviceBySerial(store.getState(), query.device_id) ??
(await findDeviceForConnection(store, query.app, query.device_id).catch(
(e) => {
console.warn(
`Failed to find device '${query.device_id}' while connection app '${query.app}'`,
e,
);
const key = `device-find-failure-${query.device_id}`;
showConnectivityTroubleshootNotification(
store,
key,
'Connection failed',
`Failed to find device '${query.device_id}' while trying to
connect app '${query.app}'`,
);
},
));
if (!device) {
return;
}
const client = new Client(
id,
query,
{
send(data: any) {
server.exec('client-request', id, data).catch((e) => {
console.warn(e);
});
},
async sendExpectResponse(data: any) {
return await server.exec('client-request-response', id, data);
},
},
logger,
store,
undefined,
device,
server,
);
console.debug(
`Device client initialized: ${client.id}. Supported plugins: ${Array.from(
client.plugins,
).join(', ')}`,
'server',
);
store.dispatch({
type: 'NEW_CLIENT',
payload: client,
});
try {
await timeout(
30 * 1000,
client.init(),
`Failed to initialize client ${query.app} on ${query.device_id} in a timely manner`,
);
console.log(`${query.app} on ${query.device_id} connected and ready.`);
} catch (e) {
if (e instanceof NoLongerConnectedToClientError) {
console.warn(
`Client ${query.app} on ${query.device_id} disconnected while initialising`,
);
return;
}
console.warn(`Failed to handle client connected: ${e}`);
}
}
function getDeviceBySerial(
state: State,
serial: string,
): BaseDevice | undefined {
return state.connections.devices.find((device) => device.serial === serial);
}
async function findDeviceForConnection(
store: Store,
clientId: string,
serial: string,
): Promise