1
1
import { ClientDuplexStream } from '@grpc/grpc-js' ;
2
2
import { Disposable , Emitter , ILogger } from '@theia/core' ;
3
- import { inject , named } from '@theia/core/shared/inversify' ;
3
+ import { inject , named , postConstruct } from '@theia/core/shared/inversify' ;
4
4
import { Board , Port , Status , Monitor } from '../common/protocol' ;
5
5
import {
6
6
EnumerateMonitorPortSettingsRequest ,
@@ -10,7 +10,7 @@ import {
10
10
MonitorRequest ,
11
11
MonitorResponse ,
12
12
} from './cli-protocol/cc/arduino/cli/commands/v1/monitor_pb' ;
13
- import { CoreClientAware , CoreClientProvider } from './core-client-provider' ;
13
+ import { CoreClientAware } from './core-client-provider' ;
14
14
import { WebSocketProvider } from './web-socket/web-socket-provider' ;
15
15
import { Port as gRPCPort } from 'arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/port_pb' ;
16
16
import {
@@ -19,6 +19,7 @@ import {
19
19
MonitorSettingsProvider ,
20
20
} from './monitor-settings/monitor-settings-provider' ;
21
21
import { Deferred } from '@theia/core/lib/common/promise-util' ;
22
+ import { MonitorServiceFactoryOptions } from './monitor-service-factory' ;
22
23
23
24
export const MonitorServiceName = 'monitor-service' ;
24
25
type DuplexHandlerKeys =
@@ -33,55 +34,63 @@ interface DuplexHandler {
33
34
callback : ( ...args : any ) => void ;
34
35
}
35
36
37
+ const MAX_WRITE_TO_STREAM_TRIES = 10 ;
38
+ const WRITE_TO_STREAM_TIMEOUT_MS = 30000 ;
39
+
36
40
export class MonitorService extends CoreClientAware implements Disposable {
41
+ @inject ( ILogger )
42
+ @named ( MonitorServiceName )
43
+ private readonly logger : ILogger ;
44
+
45
+ @inject ( MonitorSettingsProvider )
46
+ private readonly monitorSettingsProvider : MonitorSettingsProvider ;
47
+
48
+ @inject ( WebSocketProvider )
49
+ private readonly webSocketProvider : WebSocketProvider ;
50
+
37
51
// Bidirectional gRPC stream used to receive and send data from the running
38
52
// pluggable monitor managed by the Arduino CLI.
39
- protected duplex : ClientDuplexStream < MonitorRequest , MonitorResponse > | null ;
53
+ private duplex : ClientDuplexStream < MonitorRequest , MonitorResponse > | null ;
40
54
41
55
// Settings used by the currently running pluggable monitor.
42
56
// They can be freely modified while running.
43
- protected settings : MonitorSettings = { } ;
57
+ private settings : MonitorSettings = { } ;
44
58
45
59
// List of messages received from the running pluggable monitor.
46
60
// These are flushed from time to time to the frontend.
47
- protected messages : string [ ] = [ ] ;
61
+ private messages : string [ ] = [ ] ;
48
62
49
63
// Handles messages received from the frontend via websocket.
50
- protected onMessageReceived ?: Disposable ;
64
+ private onMessageReceived ?: Disposable ;
51
65
52
66
// Sends messages to the frontend from time to time.
53
- protected flushMessagesInterval ?: NodeJS . Timeout ;
67
+ private flushMessagesInterval ?: NodeJS . Timeout ;
54
68
55
69
// Triggered each time the number of clients connected
56
70
// to the this service WebSocket changes.
57
- protected onWSClientsNumberChanged ?: Disposable ;
71
+ private onWSClientsNumberChanged ?: Disposable ;
58
72
59
73
// Used to notify that the monitor is being disposed
60
- protected readonly onDisposeEmitter = new Emitter < void > ( ) ;
74
+ private readonly onDisposeEmitter = new Emitter < void > ( ) ;
61
75
readonly onDispose = this . onDisposeEmitter . event ;
62
76
63
- protected _initialized = new Deferred < void > ( ) ;
64
- protected creating : Deferred < Status > ;
65
-
66
- MAX_WRITE_TO_STREAM_TRIES = 10 ;
67
- WRITE_TO_STREAM_TIMEOUT_MS = 30000 ;
77
+ private _initialized = new Deferred < void > ( ) ;
78
+ private creating : Deferred < Status > ;
79
+ private readonly board : Board ;
80
+ private readonly port : Port ;
81
+ private readonly monitorID : string ;
68
82
69
83
constructor (
70
- @inject ( ILogger )
71
- @named ( MonitorServiceName )
72
- protected readonly logger : ILogger ,
73
- @inject ( MonitorSettingsProvider )
74
- protected readonly monitorSettingsProvider : MonitorSettingsProvider ,
75
- @inject ( WebSocketProvider )
76
- protected readonly webSocketProvider : WebSocketProvider ,
77
-
78
- private readonly board : Board ,
79
- private readonly port : Port ,
80
- protected override readonly coreClientProvider : CoreClientProvider ,
81
- private readonly monitorID : string
84
+ @inject ( MonitorServiceFactoryOptions ) options : MonitorServiceFactoryOptions
82
85
) {
83
86
super ( ) ;
87
+ this . board = options . board ;
88
+ this . port = options . port ;
89
+ this . monitorID = options . monitorID ;
90
+ }
84
91
92
+ @postConstruct ( )
93
+ protected init ( ) : void {
85
94
this . onWSClientsNumberChanged =
86
95
this . webSocketProvider . onClientsNumberChanged ( async ( clients : number ) => {
87
96
if ( clients === 0 ) {
@@ -94,7 +103,7 @@ export class MonitorService extends CoreClientAware implements Disposable {
94
103
this . updateClientsSettings ( this . settings ) ;
95
104
} ) ;
96
105
97
- this . portMonitorSettings ( port . protocol , board . fqbn ! ) . then (
106
+ this . portMonitorSettings ( this . port . protocol , this . board . fqbn ! ) . then (
98
107
async ( settings ) => {
99
108
this . settings = {
100
109
...this . settings ,
@@ -258,8 +267,8 @@ export class MonitorService extends CoreClientAware implements Disposable {
258
267
}
259
268
260
269
pollWriteToStream ( request : MonitorRequest ) : Promise < boolean > {
261
- let attemptsRemaining = this . MAX_WRITE_TO_STREAM_TRIES ;
262
- const writeTimeoutMs = this . WRITE_TO_STREAM_TIMEOUT_MS ;
270
+ let attemptsRemaining = MAX_WRITE_TO_STREAM_TRIES ;
271
+ const writeTimeoutMs = WRITE_TO_STREAM_TIMEOUT_MS ;
263
272
264
273
const createWriteToStreamExecutor =
265
274
( duplex : ClientDuplexStream < MonitorRequest , MonitorResponse > ) =>
0 commit comments