@@ -2,7 +2,7 @@ import { assign, createMachine } from "xstate"
2
2
import * as API from "../../api/api"
3
3
import * as TypesGen from "../../api/typesGenerated"
4
4
5
- interface WorkspaceContext {
5
+ export interface WorkspaceContext {
6
6
workspace ?: TypesGen . Workspace
7
7
template ?: TypesGen . Template
8
8
organization ?: TypesGen . Organization
@@ -19,13 +19,12 @@ interface WorkspaceContext {
19
19
refreshTemplateError : Error | unknown
20
20
}
21
21
22
- type WorkspaceEvent =
22
+ export type WorkspaceEvent =
23
23
| { type : "GET_WORKSPACE" ; workspaceId : string }
24
24
| { type : "START" }
25
25
| { type : "STOP" }
26
26
| { type : "RETRY" }
27
27
| { type : "UPDATE" }
28
- | { type : "REFRESH_WORKSPACE" }
29
28
30
29
export const workspaceMachine = createMachine (
31
30
{
@@ -82,7 +81,7 @@ export const workspaceMachine = createMachine(
82
81
ready : {
83
82
type : "parallel" ,
84
83
states : {
85
- // We poll the workspace consistently to know if it becomes outdated
84
+ // We poll the workspace consistently to know if it becomes outdated and to update build status
86
85
pollingWorkspace : {
87
86
initial : "refreshingWorkspace" ,
88
87
states : {
@@ -91,13 +90,13 @@ export const workspaceMachine = createMachine(
91
90
invoke : {
92
91
id : "refreshWorkspace" ,
93
92
src : "refreshWorkspace" ,
94
- onDone : { actions : "assignWorkspace" } ,
93
+ onDone : { target : "waiting" , actions : "assignWorkspace" } ,
95
94
onError : { target : "waiting" , actions : "assignRefreshWorkspaceError" } ,
96
95
} ,
97
96
} ,
98
97
waiting : {
99
98
after : {
100
- 5000 : "refreshingWorkspace"
99
+ 1000 : "refreshingWorkspace"
101
100
}
102
101
}
103
102
}
@@ -140,157 +139,65 @@ export const workspaceMachine = createMachine(
140
139
} ,
141
140
} ,
142
141
build : {
143
- initial : "dispatch" ,
144
- on : {
145
- UPDATE : "#workspaceState.ready.build.refreshingTemplate" ,
146
- } ,
142
+ initial : "idle" ,
147
143
states : {
148
- dispatch : {
149
- always : [
150
- {
151
- cond : "workspaceIsStarted" ,
152
- target : "started" ,
153
- } ,
154
- {
155
- cond : "workspaceIsStopped" ,
156
- target : "stopped" ,
157
- } ,
158
- {
159
- cond : "workspaceIsStarting" ,
160
- target : "buildingStart" ,
161
- } ,
162
- {
163
- cond : "workspaceIsStopping" ,
164
- target : "buildingStop" ,
165
- } ,
166
- { target : "error" } ,
167
- ] ,
168
- } ,
169
- started : {
170
- on : {
171
- STOP : "requestingStop" ,
172
- } ,
173
- tags : "buildReady" ,
174
- } ,
175
- stopped : {
144
+ idle : {
176
145
on : {
177
146
START : "requestingStart" ,
147
+ STOP : "requestingStop" ,
148
+ RETRY : [
149
+ { cond : "triedToStart" , target : "requestingStart" } ,
150
+ { target : "requestingStop" }
151
+ ] ,
152
+ UPDATE : "refreshingTemplate" ,
178
153
} ,
179
- tags : "buildReady" ,
180
154
} ,
181
155
requestingStart : {
156
+ entry : "clearBuildError" ,
182
157
invoke : {
183
158
id : "startWorkspace" ,
184
159
src : "startWorkspace" ,
185
160
onDone : {
186
- target : "buildingStart " ,
187
- actions : [ "assignBuild" , "clearJobError" ] ,
161
+ target : "idle " ,
162
+ actions : "assignBuild"
188
163
} ,
189
164
onError : {
190
- target : "error" ,
191
- actions : "assignJobError" ,
192
- } ,
193
- } ,
194
- tags : [ "buildLoading" , "starting" ] ,
165
+ target : "idle" ,
166
+ actions : "assignBuildError"
167
+ }
168
+ }
195
169
} ,
196
170
requestingStop : {
171
+ entry : "clearBuildError" ,
197
172
invoke : {
198
173
id : "stopWorkspace" ,
199
174
src : "stopWorkspace" ,
200
- onDone : { target : "buildingStop" , actions : [ "assignBuild" , "clearJobError" ] } ,
201
- onError : {
202
- target : "error" ,
203
- actions : "assignJobError" ,
204
- } ,
205
- } ,
206
- tags : [ "buildLoading" , "stopping" ] ,
207
- } ,
208
- buildingStart : {
209
- initial : "refreshingWorkspace" ,
210
- states : {
211
- refreshingWorkspace : {
212
- entry : "clearRefreshWorkspaceError" ,
213
- invoke : {
214
- id : "refreshWorkspace" ,
215
- src : "refreshWorkspace" ,
216
- onDone : [
217
- {
218
- cond : "jobSucceeded" ,
219
- target : "#workspaceState.ready.build.started" ,
220
- actions : [ "clearBuildError" , "assignWorkspace" ] ,
221
- } ,
222
- { cond : "jobPendingOrRunning" , target : "waiting" , actions : "assignWorkspace" } ,
223
- {
224
- target : "#workspaceState.ready.build.error" ,
225
- actions : [ "assignWorkspace" , "assignBuildError" ] ,
226
- } ,
227
- ] ,
228
- onError : { target : "waiting" , actions : "assignRefreshWorkspaceError" } ,
229
- } ,
230
- } ,
231
- waiting : {
232
- after : {
233
- 1000 : "refreshingWorkspace" ,
234
- } ,
235
- } ,
236
- } ,
237
- tags : [ "buildLoading" , "starting" ] ,
238
- } ,
239
- buildingStop : {
240
- initial : "refreshingWorkspace" ,
241
- states : {
242
- refreshingWorkspace : {
243
- entry : "clearRefreshWorkspaceError" ,
244
- invoke : {
245
- id : "refreshWorkspace" ,
246
- src : "refreshWorkspace" ,
247
- onDone : [
248
- {
249
- cond : "jobSucceeded" ,
250
- target : "#workspaceState.ready.build.stopped" ,
251
- actions : [ "clearBuildError" , "assignWorkspace" ] ,
252
- } ,
253
- { cond : "jobPendingOrRunning" , target : "waiting" , actions : "assignWorkspace" } ,
254
- {
255
- target : "#workspaceState.ready.build.error" ,
256
- actions : [ "assignWorkspace" , "assignBuildError" ] ,
257
- } ,
258
- ] ,
259
- onError : { target : "waiting" , actions : "assignRefreshWorkspaceError" } ,
260
- } ,
261
- } ,
262
- waiting : {
263
- after : {
264
- 1000 : "refreshingWorkspace" ,
265
- } ,
175
+ onDone : {
176
+ target : "idle" ,
177
+ actions : "assignBuild"
266
178
} ,
267
- } ,
268
- tags : [ "buildLoading" , "stopping" ] ,
179
+ onError : {
180
+ target : "idle" ,
181
+ actions : "assignBuildError"
182
+ }
183
+ }
269
184
} ,
270
185
refreshingTemplate : {
271
186
entry : "clearRefreshTemplateError" ,
272
187
invoke : {
273
188
id : "refreshTemplate" ,
274
189
src : "getTemplate" ,
275
- onDone : { target : "#workspaceState.ready.build.requestingStart" , actions : "assignTemplate" } ,
276
- onError : { target : "error" , actions : "assignRefreshTemplateError" } ,
277
- } ,
278
- } ,
279
- error : {
280
- on : {
281
- RETRY : [
282
- {
283
- cond : "triedToStart" ,
284
- target : "requestingStart" ,
285
- } ,
286
- {
287
- // this could also be post-delete
288
- target : "requestingStop" ,
289
- } ,
290
- ] ,
291
- } ,
190
+ onDone : {
191
+ target : "requestingStart" ,
192
+ actions : "assignTemplate"
193
+ } ,
194
+ onError : {
195
+ target : "idle" ,
196
+ actions : "assignRefreshTemplateError"
197
+ }
198
+ }
292
199
} ,
293
- } ,
200
+ }
294
201
} ,
295
202
} ,
296
203
} ,
@@ -336,14 +243,6 @@ export const workspaceMachine = createMachine(
336
243
assign ( {
337
244
build : event . data ,
338
245
} ) ,
339
- assignJobError : ( _ , event ) =>
340
- assign ( {
341
- jobError : event . data ,
342
- } ) ,
343
- clearJobError : ( _ ) =>
344
- assign ( {
345
- jobError : undefined ,
346
- } ) ,
347
246
assignBuildError : ( _ , event ) =>
348
247
assign ( {
349
248
buildError : event . data ,
@@ -370,24 +269,7 @@ export const workspaceMachine = createMachine(
370
269
} ) ,
371
270
} ,
372
271
guards : {
373
- workspaceIsStarted : ( context ) =>
374
- context . workspace ?. latest_build . transition === "start" &&
375
- context . workspace . latest_build . job . status === "succeeded" ,
376
- workspaceIsStopped : ( context ) =>
377
- context . workspace ?. latest_build . transition === "stop" &&
378
- context . workspace . latest_build . job . status === "succeeded" ,
379
- workspaceIsStarting : ( context ) =>
380
- context . workspace ?. latest_build . transition === "start" &&
381
- [ "pending" , "running" ] . includes ( context . workspace . latest_build . job . status ) ,
382
- workspaceIsStopping : ( context ) =>
383
- context . workspace ?. latest_build . transition === "stop" &&
384
- [ "pending" , "running" ] . includes ( context . workspace . latest_build . job . status ) ,
385
272
triedToStart : ( context ) => context . workspace ?. latest_build . transition === "start" ,
386
- jobSucceeded : ( context ) => context . workspace ?. latest_build . job . status === "succeeded" ,
387
- jobPendingOrRunning : ( context ) => {
388
- const status = context . workspace ?. latest_build . job . status
389
- return status === "pending" || status === "running"
390
- } ,
391
273
} ,
392
274
services : {
393
275
getWorkspace : async ( _ , event ) => {
0 commit comments