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