@@ -14,6 +14,7 @@ export enum WorkspaceQuery {
14
14
export class WorkspaceProvider implements vscode . TreeDataProvider < vscode . TreeItem > {
15
15
private workspaces : WorkspaceTreeItem [ ] = [ ]
16
16
private agentMetadata : Record < WorkspaceAgent [ "id" ] , AgentMetadataEvent [ ] > = { }
17
+ private watcherDisposers : ( ( ) => void ) [ ] = [ ]
17
18
18
19
constructor ( private readonly getWorkspacesQuery : WorkspaceQuery , private readonly storage : Storage ) {
19
20
this . fetchAndRefresh ( )
@@ -22,6 +23,8 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
22
23
// fetchAndRefrehsh fetches new workspaces then re-renders the entire tree.
23
24
async fetchAndRefresh ( ) {
24
25
const workspacesTreeItem : WorkspaceTreeItem [ ] = [ ]
26
+ this . watcherDisposers . forEach ( ( dispose ) => dispose ( ) )
27
+ this . watcherDisposers = [ ]
25
28
// If the URL is set then we are logged in.
26
29
if ( this . storage . getURL ( ) ) {
27
30
const resp = await getWorkspaces ( { q : this . getWorkspacesQuery } )
@@ -71,6 +74,9 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
71
74
return Promise . resolve ( this . workspaces )
72
75
}
73
76
77
+ // monitorMetadata opens a web socket to monitor metadata on the specified
78
+ // agent and registers a disposer on this.watcherDisposers that can be used to
79
+ // stop the watch.
74
80
async monitorMetadata ( agentId : WorkspaceAgent [ "id" ] ) : Promise < void > {
75
81
const agentMetadataURL = new URL ( `${ this . storage . getURL ( ) } /api/v2/workspaceagents/${ agentId } /watch-metadata` )
76
82
const agentMetadataEventSource = new EventSource ( agentMetadataURL . toString ( ) , {
@@ -97,6 +103,9 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
97
103
agentMetadataEventSource . close ( )
98
104
}
99
105
} )
106
+ this . watcherDisposers . push ( ( ) => {
107
+ agentMetadataEventSource . close ( )
108
+ } )
100
109
}
101
110
}
102
111
0 commit comments