@@ -13,30 +13,28 @@ const latestBuild = (builds: TypesGen.WorkspaceBuild[]) => {
13
13
}
14
14
15
15
const Language = {
16
- refreshTemplateError : "Error updating workspace: latest template could not be fetched." ,
16
+ refreshTemplateWarning : "Error updating workspace: latest template could not be fetched." ,
17
17
buildError : "Workspace action failed." ,
18
18
}
19
19
20
20
type Permissions = Record < keyof ReturnType < typeof permissionsToCheck > , boolean >
21
21
22
22
export interface WorkspaceContext {
23
23
// our server side events instance
24
- sse : EventSource | undefined ,
24
+ eventSource ? : EventSource ,
25
25
workspace ?: TypesGen . Workspace
26
26
template ?: TypesGen . Template
27
27
build ?: TypesGen . WorkspaceBuild
28
- resources ?: TypesGen . WorkspaceResource [ ]
29
28
getWorkspaceError ?: Error | unknown
30
- // error creating a new WorkspaceBuild
31
- buildError ?: Error | unknown
32
- // these are separate from getX errors because they don't make the page unusable
33
- refreshWorkspaceError : Error | unknown
34
- refreshTemplateError : Error | unknown
35
- getResourcesError : Error | unknown
29
+ // these are labeled as warnings because they don't make the page unusable
30
+ refreshWorkspaceWarning ?: Error | unknown
31
+ refreshTemplateWarning : Error | unknown
36
32
// Builds
37
33
builds ?: TypesGen . WorkspaceBuild [ ]
38
34
getBuildsError ?: Error | unknown
39
35
loadMoreBuildsError ?: Error | unknown
36
+ // error creating a new WorkspaceBuild
37
+ buildError ?: Error | unknown
40
38
cancellationMessage ?: Types . Message
41
39
cancellationError ?: Error | unknown
42
40
// permissions
@@ -47,6 +45,7 @@ export interface WorkspaceContext {
47
45
48
46
export type WorkspaceEvent =
49
47
| { type : "GET_WORKSPACE" ; workspaceName : string ; username : string }
48
+ | { type : "REFRESH_WORKSPACE" , data : TypesGen . ServerSentEvent [ "data" ] }
50
49
| { type : "START" }
51
50
| { type : "STOP" }
52
51
| { type : "ASK_DELETE" }
@@ -57,8 +56,7 @@ export type WorkspaceEvent =
57
56
| { type : "LOAD_MORE_BUILDS" }
58
57
| { type : "CHECK_REFRESH_TIMELINE" , data : TypesGen . ServerSentEvent [ "data" ] }
59
58
| { type : "REFRESH_TIMELINE" }
60
- | { type : "UPDATE_EVENT" , data : TypesGen . ServerSentEvent [ "data" ] }
61
- | { type : "SSE_ERROR" , error : Error | unknown }
59
+ | { type : "EVENT_SOURCE_ERROR" , error : Error | unknown }
62
60
63
61
export const checks = {
64
62
readWorkspace : "readWorkspace" ,
@@ -114,7 +112,7 @@ export const workspaceMachine = createMachine(
114
112
cancelWorkspace : {
115
113
data : Types . Message
116
114
}
117
- listenForEvents : {
115
+ listening : {
118
116
data : TypesGen . ServerSentEvent
119
117
} ,
120
118
getBuilds : {
@@ -160,7 +158,7 @@ export const workspaceMachine = createMachine(
160
158
tags : "loading" ,
161
159
} ,
162
160
refreshingTemplate : {
163
- entry : "clearRefreshTemplateError " ,
161
+ entry : "clearRefreshTemplateWarning " ,
164
162
invoke : {
165
163
src : "getTemplate" ,
166
164
id : "refreshTemplate" ,
@@ -172,7 +170,7 @@ export const workspaceMachine = createMachine(
172
170
] ,
173
171
onError : [
174
172
{
175
- actions : [ "assignRefreshTemplateError " , "displayRefreshTemplateError " ] ,
173
+ actions : [ "assignRefreshTemplateWarning " , "displayRefreshTemplateWarning " ] ,
176
174
target : "error" ,
177
175
} ,
178
176
] ,
@@ -198,34 +196,39 @@ export const workspaceMachine = createMachine(
198
196
] ,
199
197
} ,
200
198
} ,
201
- sseFailure : {
202
- entry : [ "assignRefreshWorkspaceError" , "assignGetResourcesError" ] ,
203
- after : {
204
- "1000" : {
205
- target : 'ready.listenForEvents'
206
- }
207
- }
208
- } ,
209
199
ready : {
210
200
type : "parallel" ,
211
201
states : {
212
- listenForEvents : {
213
- on : {
214
- UPDATE_EVENT : {
215
- actions : [ "updateWorkspace" , "assignResources" ]
216
- } ,
217
- SSE_ERROR : {
218
- target : "#workspaceState.sseFailure"
202
+ listening : {
203
+ initial : "gettingEvents" ,
204
+ states : {
205
+ gettingEvents : {
206
+ entry : [ 'clearRefreshWorkspaceWarning' , 'initializeEventSource' ] ,
207
+ exit : "closeEventSource" ,
208
+ invoke : {
209
+ src : "listening" ,
210
+ } ,
211
+ on : {
212
+ REFRESH_WORKSPACE : {
213
+ actions : [ "refreshWorkspace" ]
214
+ } ,
215
+ EVENT_SOURCE_ERROR : {
216
+ target : "error"
217
+ } ,
218
+ CHECK_REFRESH_TIMELINE : {
219
+ actions : [ "refreshTimeline" ]
220
+ }
221
+ } ,
219
222
} ,
220
- CHECK_REFRESH_TIMELINE : {
221
- actions : [ "refreshTimeline" ]
223
+ error : {
224
+ entry : "assignRefreshWorkspaceWarning" ,
225
+ after : {
226
+ "1000" : {
227
+ target : 'gettingEvents'
228
+ }
229
+ }
222
230
}
223
- } ,
224
- entry : [ "clearGetWorkspaceError" , "clearGetResourcesError" , "initSse" ] ,
225
- exit : "closeSse" ,
226
- invoke : {
227
- src : "listenForEvents" ,
228
- } ,
231
+ }
229
232
} ,
230
233
build : {
231
234
initial : "idle" ,
@@ -345,7 +348,7 @@ export const workspaceMachine = createMachine(
345
348
} ,
346
349
} ,
347
350
refreshingTemplate : {
348
- entry : "clearRefreshTemplateError " ,
351
+ entry : "clearRefreshTemplateWarning " ,
349
352
invoke : {
350
353
src : "getTemplate" ,
351
354
id : "refreshTemplate" ,
@@ -357,7 +360,7 @@ export const workspaceMachine = createMachine(
357
360
] ,
358
361
onError : [
359
362
{
360
- actions : [ "assignRefreshTemplateError " , "displayRefreshTemplateError " ] ,
363
+ actions : [ "assignRefreshTemplateWarning " , "displayRefreshTemplateWarning " ] ,
361
364
target : "idle" ,
362
365
} ,
363
366
] ,
@@ -443,6 +446,7 @@ export const workspaceMachine = createMachine(
443
446
template : undefined ,
444
447
build : undefined ,
445
448
permissions : undefined ,
449
+ eventSource : undefined ,
446
450
} ) ,
447
451
assignWorkspace : assign ( {
448
452
workspace : ( _ , event ) => event . data ,
@@ -493,35 +497,27 @@ export const workspaceMachine = createMachine(
493
497
} ) ,
494
498
// SSE related actions
495
499
// open a new EventSource so we can stream SSE
496
- initSse : assign ( {
497
- sse : ( context ) => context . workspace ?. id ? API . watchWorkspace ( context . workspace . id ) : undefined
500
+ initializeEventSource : assign ( {
501
+ eventSource : ( context ) => context . workspace && API . watchWorkspace ( context . workspace . id )
498
502
} ) ,
499
- closeSse : ( context ) => context . sse && context . sse . close ( ) ,
500
- // updating workspaces
501
- updateWorkspace : assign ( {
503
+ closeEventSource : ( context ) => context . eventSource && context . eventSource . close ( ) ,
504
+ refreshWorkspace : assign ( {
502
505
workspace : ( _ , event ) => event . data ,
503
506
} ) ,
504
- assignRefreshWorkspaceError : assign ( {
505
- refreshWorkspaceError : ( _ , event ) => event ,
506
- } ) ,
507
- // getting resources
508
- assignResources : assign ( {
509
- resources : ( _ , event ) => event . data . latest_build . resources ,
510
- } ) ,
511
- assignGetResourcesError : assign ( {
512
- getResourcesError : ( _ , event ) => event ,
507
+ assignRefreshWorkspaceWarning : assign ( {
508
+ refreshWorkspaceWarning : ( _ , event ) => event ,
513
509
} ) ,
514
- clearGetResourcesError : assign ( {
515
- getResourcesError : ( _ ) => undefined ,
510
+ clearRefreshWorkspaceWarning : assign ( {
511
+ refreshWorkspaceWarning : ( _ ) => undefined ,
516
512
} ) ,
517
- assignRefreshTemplateError : assign ( {
518
- refreshTemplateError : ( _ , event ) => event . data ,
513
+ assignRefreshTemplateWarning : assign ( {
514
+ refreshTemplateWarning : ( _ , event ) => event . data ,
519
515
} ) ,
520
- displayRefreshTemplateError : ( ) => {
521
- displayError ( Language . refreshTemplateError )
516
+ displayRefreshTemplateWarning : ( ) => {
517
+ displayError ( Language . refreshTemplateWarning )
522
518
} ,
523
- clearRefreshTemplateError : assign ( {
524
- refreshTemplateError : ( _ ) => undefined ,
519
+ clearRefreshTemplateWarning : assign ( {
520
+ refreshTemplateWarning : ( _ ) => undefined ,
525
521
} ) ,
526
522
// Timeline
527
523
assignBuilds : assign ( {
@@ -624,28 +620,28 @@ export const workspaceMachine = createMachine(
624
620
throw Error ( "Cannot cancel workspace without build id" )
625
621
}
626
622
} ,
627
- listenForEvents : ( context ) => ( send ) => {
628
- if ( ! context . sse ) {
629
- send ( { type : "SSE_ERROR " , error : "error initializing sse" } )
623
+ listening : ( context ) => ( send ) => {
624
+ if ( ! context . eventSource ) {
625
+ send ( { type : "EVENT_SOURCE_ERROR " , error : "error initializing sse" } )
630
626
return
631
627
}
632
628
633
- context . sse . addEventListener ( "data" , ( event ) => {
634
- // update our data objects ( workspace, resources) with each SSE that comes back from the server
635
- send ( { type : "UPDATE_EVENT " , data : JSON . parse ( event . data ) } )
629
+ context . eventSource . addEventListener ( "data" , ( event ) => {
630
+ // refresh our workspace with each SSE
631
+ send ( { type : "REFRESH_WORKSPACE " , data : JSON . parse ( event . data ) } ) // i wonder if this is problematic
636
632
// refresh our timeline
637
633
send ( { type : "CHECK_REFRESH_TIMELINE" , data : JSON . parse ( event . data ) } )
638
634
} )
639
635
640
636
// handle any error events returned by our sse
641
- context . sse . addEventListener ( "error" , ( event ) => {
642
- send ( { type : "SSE_ERROR " , error : event } )
637
+ context . eventSource . addEventListener ( "error" , ( event ) => {
638
+ send ( { type : "EVENT_SOURCE_ERROR " , error : event } )
643
639
} )
644
640
645
641
// handle any sse implementation exceptions
646
- context . sse . onerror = ( ) => {
647
- context . sse && context . sse . close ( ) ;
648
- send ( { type : "SSE_ERROR " , error : "sse error" } )
642
+ context . eventSource . onerror = ( ) => {
643
+ context . eventSource && context . eventSource . close ( ) ;
644
+ send ( { type : "EVENT_SOURCE_ERROR " , error : "sse error" } )
649
645
}
650
646
651
647
} ,
0 commit comments