@@ -100,7 +100,8 @@ func (s *Session) WorkspacePath() string {
100100
101101// OpenCanvases returns the open-canvas snapshot last reported by the runtime.
102102// The snapshot is populated from session.resume and live session.canvas.opened
103- // events. The returned slice is a copy and is safe to mutate by the caller.
103+ // and session.canvas.closed events. The returned slice is a copy and is safe to
104+ // mutate by the caller.
104105func (s * Session ) OpenCanvases () []rpc.OpenCanvasInstance {
105106 s .openCanvasesMu .RLock ()
106107 defer s .openCanvasesMu .RUnlock ()
@@ -130,27 +131,44 @@ func (s *Session) upsertOpenCanvas(canvas rpc.OpenCanvasInstance) {
130131 s .openCanvases = append (s .openCanvases , canvas )
131132}
132133
133- func (s * Session ) updateOpenCanvasesFromEvent (event SessionEvent ) {
134- data , ok := event .Data .(* SessionCanvasOpenedData )
135- if ! ok {
136- return
134+ func (s * Session ) removeOpenCanvas (instanceID string ) {
135+ s .openCanvasesMu .Lock ()
136+ defer s .openCanvasesMu .Unlock ()
137+ filtered := make ([]rpc.OpenCanvasInstance , 0 , len (s .openCanvases ))
138+ for _ , canvas := range s .openCanvases {
139+ if canvas .InstanceID != instanceID {
140+ filtered = append (filtered , canvas )
141+ }
137142 }
138- if data .InstanceID == "" || data .CanvasID == "" || data .ExtensionID == "" || data .Availability == "" {
139- fmt .Printf ("failed to deserialize session.canvas.opened payload\n " )
140- return
143+ s .openCanvases = filtered
144+ }
145+
146+ func (s * Session ) updateOpenCanvasesFromEvent (event SessionEvent ) {
147+ switch data := event .Data .(type ) {
148+ case * SessionCanvasOpenedData :
149+ if data .InstanceID == "" || data .CanvasID == "" || data .ExtensionID == "" || data .Availability == "" {
150+ fmt .Printf ("failed to deserialize session.canvas.opened payload\n " )
151+ return
152+ }
153+ s .upsertOpenCanvas (rpc.OpenCanvasInstance {
154+ Availability : rpc .CanvasInstanceAvailability (data .Availability ),
155+ CanvasID : data .CanvasID ,
156+ ExtensionID : data .ExtensionID ,
157+ ExtensionName : data .ExtensionName ,
158+ Input : data .Input ,
159+ InstanceID : data .InstanceID ,
160+ Reopen : data .Reopen ,
161+ Status : data .Status ,
162+ Title : data .Title ,
163+ URL : data .URL ,
164+ })
165+ case * SessionCanvasClosedData :
166+ if data .InstanceID == "" {
167+ fmt .Printf ("failed to deserialize session.canvas.closed payload\n " )
168+ return
169+ }
170+ s .removeOpenCanvas (data .InstanceID )
141171 }
142- s .upsertOpenCanvas (rpc.OpenCanvasInstance {
143- Availability : rpc .CanvasInstanceAvailability (data .Availability ),
144- CanvasID : data .CanvasID ,
145- ExtensionID : data .ExtensionID ,
146- ExtensionName : data .ExtensionName ,
147- Input : data .Input ,
148- InstanceID : data .InstanceID ,
149- Reopen : data .Reopen ,
150- Status : data .Status ,
151- Title : data .Title ,
152- URL : data .URL ,
153- })
154172}
155173
156174func (s * Session ) registerCanvasHandler (handler CanvasHandler ) {
0 commit comments