Skip to content

Commit f24d70b

Browse files
committed
general cleanup
1 parent a3bc55e commit f24d70b

File tree

3 files changed

+78
-78
lines changed

3 files changed

+78
-78
lines changed

site/src/api/api.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@ export const getWorkspace = async (
203203
return response.data
204204
}
205205

206+
/**
207+
*
208+
* @param workspaceId
209+
* @returns An EventSource that emits workspace event objects (ServerSentEvent)
210+
*/
206211
export const watchWorkspace = (workspaceId: string): EventSource => {
207212
return new EventSource(`${location.protocol}//${location.host}/api/v2/workspaces/${workspaceId}/watch`,
208213
{ withCredentials: true }

site/src/pages/WorkspacePage/WorkspacePage.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ export const WorkspacePage: FC = () => {
4040
workspace,
4141
getWorkspaceError,
4242
template,
43-
refreshTemplateError,
44-
resources,
45-
getResourcesError,
43+
refreshTemplateWarning,
44+
refreshWorkspaceWarning,
4645
builds,
4746
getBuildsError,
4847
permissions,
@@ -70,7 +69,7 @@ export const WorkspacePage: FC = () => {
7069
return (
7170
<div className={styles.error}>
7271
{Boolean(getWorkspaceError) && <ErrorSummary error={getWorkspaceError} />}
73-
{Boolean(refreshTemplateError) && <ErrorSummary error={refreshTemplateError} />}
72+
{Boolean(refreshTemplateWarning) && <ErrorSummary error={refreshTemplateWarning} />}
7473
{Boolean(checkPermissionsError) && <ErrorSummary error={checkPermissionsError} />}
7574
</div>
7675
)
@@ -128,11 +127,11 @@ export const WorkspacePage: FC = () => {
128127
handleDelete={() => workspaceSend("ASK_DELETE")}
129128
handleUpdate={() => workspaceSend("UPDATE")}
130129
handleCancel={() => workspaceSend("CANCEL")}
131-
resources={resources}
130+
resources={workspace.latest_build.resources}
132131
builds={builds}
133132
canUpdateWorkspace={canUpdateWorkspace}
134133
workspaceErrors={{
135-
[WorkspaceErrors.GET_RESOURCES_ERROR]: getResourcesError,
134+
[WorkspaceErrors.GET_RESOURCES_ERROR]: refreshWorkspaceWarning,
136135
[WorkspaceErrors.GET_BUILDS_ERROR]: getBuildsError,
137136
[WorkspaceErrors.BUILD_ERROR]: buildError,
138137
[WorkspaceErrors.CANCELLATION_ERROR]: cancellationError,

site/src/xServices/workspace/workspaceXService.ts

Lines changed: 68 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,28 @@ const latestBuild = (builds: TypesGen.WorkspaceBuild[]) => {
1313
}
1414

1515
const Language = {
16-
refreshTemplateError: "Error updating workspace: latest template could not be fetched.",
16+
refreshTemplateWarning: "Error updating workspace: latest template could not be fetched.",
1717
buildError: "Workspace action failed.",
1818
}
1919

2020
type Permissions = Record<keyof ReturnType<typeof permissionsToCheck>, boolean>
2121

2222
export interface WorkspaceContext {
2323
// our server side events instance
24-
sse: EventSource | undefined,
24+
eventSource?: EventSource,
2525
workspace?: TypesGen.Workspace
2626
template?: TypesGen.Template
2727
build?: TypesGen.WorkspaceBuild
28-
resources?: TypesGen.WorkspaceResource[]
2928
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
3632
// Builds
3733
builds?: TypesGen.WorkspaceBuild[]
3834
getBuildsError?: Error | unknown
3935
loadMoreBuildsError?: Error | unknown
36+
// error creating a new WorkspaceBuild
37+
buildError?: Error | unknown
4038
cancellationMessage?: Types.Message
4139
cancellationError?: Error | unknown
4240
// permissions
@@ -47,6 +45,7 @@ export interface WorkspaceContext {
4745

4846
export type WorkspaceEvent =
4947
| { type: "GET_WORKSPACE"; workspaceName: string; username: string }
48+
| { type: "REFRESH_WORKSPACE", data: TypesGen.ServerSentEvent["data"] }
5049
| { type: "START" }
5150
| { type: "STOP" }
5251
| { type: "ASK_DELETE" }
@@ -57,8 +56,7 @@ export type WorkspaceEvent =
5756
| { type: "LOAD_MORE_BUILDS" }
5857
| { type: "CHECK_REFRESH_TIMELINE", data: TypesGen.ServerSentEvent["data"] }
5958
| { 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 }
6260

6361
export const checks = {
6462
readWorkspace: "readWorkspace",
@@ -114,7 +112,7 @@ export const workspaceMachine = createMachine(
114112
cancelWorkspace: {
115113
data: Types.Message
116114
}
117-
listenForEvents: {
115+
listening: {
118116
data: TypesGen.ServerSentEvent
119117
},
120118
getBuilds: {
@@ -160,7 +158,7 @@ export const workspaceMachine = createMachine(
160158
tags: "loading",
161159
},
162160
refreshingTemplate: {
163-
entry: "clearRefreshTemplateError",
161+
entry: "clearRefreshTemplateWarning",
164162
invoke: {
165163
src: "getTemplate",
166164
id: "refreshTemplate",
@@ -172,7 +170,7 @@ export const workspaceMachine = createMachine(
172170
],
173171
onError: [
174172
{
175-
actions: ["assignRefreshTemplateError", "displayRefreshTemplateError"],
173+
actions: ["assignRefreshTemplateWarning", "displayRefreshTemplateWarning"],
176174
target: "error",
177175
},
178176
],
@@ -198,34 +196,39 @@ export const workspaceMachine = createMachine(
198196
],
199197
},
200198
},
201-
sseFailure: {
202-
entry: ["assignRefreshWorkspaceError", "assignGetResourcesError"],
203-
after: {
204-
"1000": {
205-
target: 'ready.listenForEvents'
206-
}
207-
}
208-
},
209199
ready: {
210200
type: "parallel",
211201
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+
},
219222
},
220-
CHECK_REFRESH_TIMELINE: {
221-
actions: ["refreshTimeline"]
223+
error: {
224+
entry: "assignRefreshWorkspaceWarning",
225+
after: {
226+
"1000": {
227+
target: 'gettingEvents'
228+
}
229+
}
222230
}
223-
},
224-
entry: ["clearGetWorkspaceError", "clearGetResourcesError", "initSse"],
225-
exit: "closeSse",
226-
invoke: {
227-
src: "listenForEvents",
228-
},
231+
}
229232
},
230233
build: {
231234
initial: "idle",
@@ -345,7 +348,7 @@ export const workspaceMachine = createMachine(
345348
},
346349
},
347350
refreshingTemplate: {
348-
entry: "clearRefreshTemplateError",
351+
entry: "clearRefreshTemplateWarning",
349352
invoke: {
350353
src: "getTemplate",
351354
id: "refreshTemplate",
@@ -357,7 +360,7 @@ export const workspaceMachine = createMachine(
357360
],
358361
onError: [
359362
{
360-
actions: ["assignRefreshTemplateError", "displayRefreshTemplateError"],
363+
actions: ["assignRefreshTemplateWarning", "displayRefreshTemplateWarning"],
361364
target: "idle",
362365
},
363366
],
@@ -443,6 +446,7 @@ export const workspaceMachine = createMachine(
443446
template: undefined,
444447
build: undefined,
445448
permissions: undefined,
449+
eventSource: undefined,
446450
}),
447451
assignWorkspace: assign({
448452
workspace: (_, event) => event.data,
@@ -493,35 +497,27 @@ export const workspaceMachine = createMachine(
493497
}),
494498
// SSE related actions
495499
// 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)
498502
}),
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({
502505
workspace: (_, event) => event.data,
503506
}),
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,
513509
}),
514-
clearGetResourcesError: assign({
515-
getResourcesError: (_) => undefined,
510+
clearRefreshWorkspaceWarning: assign({
511+
refreshWorkspaceWarning: (_) => undefined,
516512
}),
517-
assignRefreshTemplateError: assign({
518-
refreshTemplateError: (_, event) => event.data,
513+
assignRefreshTemplateWarning: assign({
514+
refreshTemplateWarning: (_, event) => event.data,
519515
}),
520-
displayRefreshTemplateError: () => {
521-
displayError(Language.refreshTemplateError)
516+
displayRefreshTemplateWarning: () => {
517+
displayError(Language.refreshTemplateWarning)
522518
},
523-
clearRefreshTemplateError: assign({
524-
refreshTemplateError: (_) => undefined,
519+
clearRefreshTemplateWarning: assign({
520+
refreshTemplateWarning: (_) => undefined,
525521
}),
526522
// Timeline
527523
assignBuilds: assign({
@@ -624,28 +620,28 @@ export const workspaceMachine = createMachine(
624620
throw Error("Cannot cancel workspace without build id")
625621
}
626622
},
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" })
630626
return
631627
}
632628

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
636632
// refresh our timeline
637633
send({ type: "CHECK_REFRESH_TIMELINE", data: JSON.parse(event.data) })
638634
})
639635

640636
// 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 })
643639
})
644640

645641
// 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" })
649645
}
650646

651647
},

0 commit comments

Comments
 (0)