From 2b2ea7264348621d895a7ca082e2d8d2d6f84603 Mon Sep 17 00:00:00 2001 From: Francesco Stasi Date: Wed, 2 Mar 2022 17:55:11 +0100 Subject: [PATCH] backend structure WIP --- .../src/node/arduino-ide-backend-module.ts | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index 223b52b8..bd2dd868 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -40,16 +40,8 @@ import { ArduinoDaemon, ArduinoDaemonPath, } from '../common/protocol/arduino-daemon'; -import { - SerialServiceImpl, - SerialServiceName, -} from './serial/serial-service-impl'; -import { - SerialService, - SerialServicePath, - SerialServiceClient, -} from '../common/protocol/serial-service'; -import { MonitorClientProvider } from './serial/monitor-client-provider'; +import { SerialServiceName } from './serial/serial-service-impl'; + import { ConfigServiceImpl } from './config-service-impl'; import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { EnvVariablesServer } from './theia/env-variables/env-variables-server'; @@ -205,19 +197,25 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // #endregion Theia customizations + // a single MonitorManager is responsible for handling the actual connections to the pluggable monitors + bind(MonitorManager).toSelf().inSingletonScope(); + // Serial client provider per connected frontend. bind(ConnectionContainerModule).toConstantValue( ConnectionContainerModule.create(({ bind, bindBackendService }) => { - bind(MonitorClientProvider).toSelf().inSingletonScope(); - bind(SerialServiceImpl).toSelf().inSingletonScope(); - bind(SerialService).toService(SerialServiceImpl); - bindBackendService( - SerialServicePath, - SerialService, - (service, client) => { - service.setClient(client); - client.onDidCloseConnection(() => service.dispose()); - return service; + bind(MonitorManagerProxyImpl).toSelf().inSingletonScope(); + bind(MonitorManagerProxy).toService(MonitorManagerProxyImpl); + bindBackendService( + MonitorManagerProxyPath, + MonitorManagerProxy, + (monitorMgrProxy, client) => { + monitorMgrProxy.setClient(client); + // when the client close the connection, the proxy is disposed. + // when the MonitorManagerProxy is disposed, it informs the MonitorManager + // telling him that it does not need an address/board anymore. + // the MonitorManager will then dispose the actual connection if there are no proxies using it + client.onDidCloseConnection(() => monitorMgrProxy.dispose()); + return monitorMgrProxy; } ); })