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 da1ef8a0..50cc4d16 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -90,9 +90,15 @@ import { MonitorManagerProxyClient, MonitorManagerProxyPath, } from '../common/protocol/monitor-service'; -import { MonitorServiceName } from './monitor-service'; +import { MonitorService, MonitorServiceName } from './monitor-service'; import { MonitorSettingsProvider } from './monitor-settings/monitor-settings-provider'; import { MonitorSettingsProviderImpl } from './monitor-settings/monitor-settings-provider-impl'; +import { + MonitorServiceFactory, + MonitorServiceFactoryOptions, +} from './monitor-service-factory'; +import WebSocketProviderImpl from './web-socket/web-socket-provider-impl'; +import { WebSocketProvider } from './web-socket/web-socket-provider'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(BackendApplication).toSelf().inSingletonScope(); @@ -204,9 +210,38 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // a single MonitorManager is responsible for handling the actual connections to the pluggable monitors bind(MonitorManager).toSelf().inSingletonScope(); + // monitor service & factory bindings bind(MonitorSettingsProviderImpl).toSelf().inSingletonScope(); bind(MonitorSettingsProvider).toService(MonitorSettingsProviderImpl); + bind(WebSocketProviderImpl).toSelf(); + bind(WebSocketProvider).toService(WebSocketProviderImpl); + + bind(MonitorServiceFactory).toFactory( + ({ container }) => + (options: MonitorServiceFactoryOptions) => { + const logger = container.get(ILogger); + + const monitorSettingsProvider = container.get( + MonitorSettingsProvider + ); + + const webSocketProvider = + container.get(WebSocketProvider); + + const { board, port, coreClientProvider } = options; + + return new MonitorService( + logger, + monitorSettingsProvider, + webSocketProvider, + board, + port, + coreClientProvider + ); + } + ); + // Serial client provider per connected frontend. bind(ConnectionContainerModule).toConstantValue( ConnectionContainerModule.create(({ bind, bindBackendService }) => { diff --git a/arduino-ide-extension/src/node/monitor-manager.ts b/arduino-ide-extension/src/node/monitor-manager.ts index 265f1f18..02b79274 100644 --- a/arduino-ide-extension/src/node/monitor-manager.ts +++ b/arduino-ide-extension/src/node/monitor-manager.ts @@ -3,6 +3,7 @@ import { inject, injectable, named } from '@theia/core/shared/inversify'; import { Board, Port, Status } from '../common/protocol'; import { CoreClientAware } from './core-client-provider'; import { MonitorService } from './monitor-service'; +import { MonitorServiceFactory } from './monitor-service-factory'; import { PluggableMonitorSettings } from './monitor-settings/monitor-settings-provider'; type MonitorID = string; @@ -17,6 +18,9 @@ export class MonitorManager extends CoreClientAware { // be started. private monitorServices = new Map(); + @inject(MonitorServiceFactory) + private monitorServiceFactory: MonitorServiceFactory; + constructor( @inject(ILogger) @named(MonitorManagerName) @@ -183,12 +187,11 @@ export class MonitorManager extends CoreClientAware { */ private createMonitor(board: Board, port: Port): MonitorService { const monitorID = this.monitorID(board, port); - const monitor = new MonitorService( - this.logger, + const monitor = this.monitorServiceFactory({ board, port, - this.coreClientProvider - ); + coreClientProvider: this.coreClientProvider, + }); this.monitorServices.set(monitorID, monitor); monitor.onDispose( (() => { diff --git a/arduino-ide-extension/src/node/monitor-service-factory.ts b/arduino-ide-extension/src/node/monitor-service-factory.ts new file mode 100644 index 00000000..30213536 --- /dev/null +++ b/arduino-ide-extension/src/node/monitor-service-factory.ts @@ -0,0 +1,18 @@ +import { Board, Port } from '../common/protocol'; +import { CoreClientProvider } from './core-client-provider'; +import { MonitorService } from './monitor-service'; + +export const MonitorServiceFactory = Symbol('MonitorServiceFactory'); +export interface MonitorServiceFactory { + (options: { + board: Board; + port: Port; + coreClientProvider: CoreClientProvider; + }): MonitorService; +} + +export interface MonitorServiceFactoryOptions { + board: Board; + port: Port; + coreClientProvider: CoreClientProvider; +} diff --git a/arduino-ide-extension/src/node/monitor-service.ts b/arduino-ide-extension/src/node/monitor-service.ts index e3facecf..d522f55e 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -13,7 +13,6 @@ import { import { CoreClientAware, CoreClientProvider } from './core-client-provider'; import { WebSocketProvider } from './web-socket/web-socket-provider'; import { Port as gRPCPort } from 'arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb'; -import WebSocketProviderImpl from './web-socket/web-socket-provider-impl'; import { PluggableMonitorSettings, MonitorSettingsProvider, @@ -48,19 +47,16 @@ export class MonitorService extends CoreClientAware implements Disposable { protected readonly onDisposeEmitter = new Emitter(); readonly onDispose = this.onDisposeEmitter.event; - @inject(MonitorSettingsProvider) - protected readonly monitorSettingsProvider: MonitorSettingsProvider; - - // TODO: use dependency injection - protected readonly webSocketProvider: WebSocketProvider = - new WebSocketProviderImpl(); - protected uploadInProgress = false; constructor( @inject(ILogger) @named(MonitorServiceName) protected readonly logger: ILogger, + @inject(MonitorSettingsProvider) + protected readonly monitorSettingsProvider: MonitorSettingsProvider, + @inject(WebSocketProvider) + protected readonly webSocketProvider: WebSocketProvider, private readonly board: Board, private readonly port: Port, diff --git a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts index 54e3b569..a32f8c48 100644 --- a/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts +++ b/arduino-ide-extension/src/node/monitor-settings/monitor-settings-provider-impl.ts @@ -40,7 +40,7 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { ); // read existing settings - this.readFile(); + await this.readFile(); console.log(this.monitorSettings); this.ready.resolve(); diff --git a/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts b/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts index 268928dd..463dadcf 100644 --- a/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts +++ b/arduino-ide-extension/src/node/web-socket/web-socket-provider-impl.ts @@ -1,7 +1,9 @@ import { Emitter } from '@theia/core'; +import { injectable } from '@theia/core/shared/inversify'; import * as WebSocket from 'ws'; import { WebSocketProvider } from './web-socket-provider'; +@injectable() export default class WebSocketProviderImpl implements WebSocketProvider { protected wsClients: WebSocket[]; protected server: WebSocket.Server; diff --git a/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts b/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts index 7c402ad5..6aa10204 100644 --- a/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts +++ b/arduino-ide-extension/src/node/web-socket/web-socket-provider.ts @@ -1,6 +1,7 @@ import { Event } from '@theia/core/lib/common/event'; import * as WebSocket from 'ws'; +export const WebSocketProvider = Symbol('WebSocketProvider'); export interface WebSocketProvider { getAddress(): WebSocket.AddressInfo; sendMessage(message: string): void;