@@ -14,6 +14,7 @@ export enum WorkspaceQuery {
1414export class WorkspaceProvider implements vscode . TreeDataProvider < vscode . TreeItem > {
1515 private workspaces : WorkspaceTreeItem [ ] = [ ]
1616 private agentMetadata : Record < WorkspaceAgent [ "id" ] , AgentMetadataEvent [ ] > = { }
17+ private watcherDisposers : ( ( ) => void ) [ ] = [ ]
1718
1819 constructor ( private readonly getWorkspacesQuery : WorkspaceQuery , private readonly storage : Storage ) {
1920 this . fetchAndRefresh ( )
@@ -22,6 +23,8 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
2223 // fetchAndRefrehsh fetches new workspaces then re-renders the entire tree.
2324 async fetchAndRefresh ( ) {
2425 const workspacesTreeItem : WorkspaceTreeItem [ ] = [ ]
26+ this . watcherDisposers . forEach ( ( dispose ) => dispose ( ) )
27+ this . watcherDisposers = [ ]
2528 // If the URL is set then we are logged in.
2629 if ( this . storage . getURL ( ) ) {
2730 const resp = await getWorkspaces ( { q : this . getWorkspacesQuery } )
@@ -71,6 +74,9 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
7174 return Promise . resolve ( this . workspaces )
7275 }
7376
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.
7480 async monitorMetadata ( agentId : WorkspaceAgent [ "id" ] ) : Promise < void > {
7581 const agentMetadataURL = new URL ( `${ this . storage . getURL ( ) } /api/v2/workspaceagents/${ agentId } /watch-metadata` )
7682 const agentMetadataEventSource = new EventSource ( agentMetadataURL . toString ( ) , {
@@ -97,6 +103,9 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
97103 agentMetadataEventSource . close ( )
98104 }
99105 } )
106+ this . watcherDisposers . push ( ( ) => {
107+ agentMetadataEventSource . close ( )
108+ } )
100109 }
101110}
102111
0 commit comments