fix: Use WebSockets to stream workspace build logs (#2569)

* fix: Use WebSockets to stream workspace build logs

This was using a streaming HTTP request before, which didn't work
on my version of Chrome. This method seemed less reliable and standard
than a WebSocket, so figured switching would be best.

* Update site/src/xServices/workspaceBuild/workspaceBuildXService.ts

Co-authored-by: Abhineet Jain <AbhineetJain@users.noreply.github.com>

* Update site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.test.tsx

Co-authored-by: Abhineet Jain <AbhineetJain@users.noreply.github.com>

* Update site/src/api/api.ts

Co-authored-by: Abhineet Jain <AbhineetJain@users.noreply.github.com>

* Remove unused prop

Co-authored-by: Abhineet Jain <AbhineetJain@users.noreply.github.com>
This commit is contained in:
Kyle Carberry
2022-06-22 13:23:14 +00:00
committed by GitHub
co-authored by Abhineet Jain
parent dc7d6def8e
commit 1778db23cb
12 changed files with 130 additions and 108 deletions
+4 -17
View File
@@ -1,5 +1,4 @@
import axios, { AxiosRequestHeaders } from "axios"
import ndjsonStream from "can-ndjson-stream"
import * as Types from "./types"
import { WorkspaceBuildTransition } from "./types"
import * as TypesGen from "./typesGenerated"
@@ -280,25 +279,13 @@ export const getWorkspaceBuildByNumber = async (
return response.data
}
export const getWorkspaceBuildLogs = async (buildname: string): Promise<TypesGen.ProvisionerJobLog[]> => {
const response = await axios.get<TypesGen.ProvisionerJobLog[]>(`/api/v2/workspacebuilds/${buildname}/logs`)
export const getWorkspaceBuildLogs = async (buildname: string, before: Date): Promise<TypesGen.ProvisionerJobLog[]> => {
const response = await axios.get<TypesGen.ProvisionerJobLog[]>(
`/api/v2/workspacebuilds/${buildname}/logs?before=${before.getTime()}`,
)
return response.data
}
export const streamWorkspaceBuildLogs = async (
buildname: string,
): Promise<ReadableStreamDefaultReader<TypesGen.ProvisionerJobLog>> => {
// Axios does not support HTTP stream in the browser
// https://github.com/axios/axios/issues/1474
// So we are going to use window.fetch and return a "stream" reader
const reader = await window
.fetch(`/api/v2/workspacebuilds/${buildname}/logs?follow=true`)
.then((res) => ndjsonStream<TypesGen.ProvisionerJobLog>(res.body))
.then((stream) => stream.getReader())
return reader
}
export const putWorkspaceExtension = async (
workspaceId: string,
extendWorkspaceRequest: TypesGen.PutExtendWorkspaceRequest,
+6 -6
View File
@@ -201,7 +201,7 @@ export interface ParameterSchema {
readonly validation_contains?: string[]
}
// From codersdk/provisionerdaemons.go:33:6
// From codersdk/provisionerdaemons.go:38:6
export interface ProvisionerDaemon {
readonly id: string
readonly created_at: string
@@ -210,7 +210,7 @@ export interface ProvisionerDaemon {
readonly provisioners: ProvisionerType[]
}
// From codersdk/provisionerdaemons.go:62:6
// From codersdk/provisionerdaemons.go:67:6
export interface ProvisionerJob {
readonly id: string
readonly created_at: string
@@ -222,7 +222,7 @@ export interface ProvisionerJob {
readonly storage_source: string
}
// From codersdk/provisionerdaemons.go:73:6
// From codersdk/provisionerdaemons.go:78:6
export interface ProvisionerJobLog {
readonly id: string
readonly created_at: string
@@ -485,10 +485,10 @@ export interface WorkspaceResource {
// From codersdk/workspacebuilds.go:22:6
export type BuildReason = "autostart" | "autostop" | "initiator"
// From codersdk/provisionerdaemons.go:23:6
// From codersdk/provisionerdaemons.go:28:6
export type LogLevel = "debug" | "error" | "info" | "trace" | "warn"
// From codersdk/provisionerdaemons.go:16:6
// From codersdk/provisionerdaemons.go:21:6
export type LogSource = "provisioner" | "provisioner_daemon"
// From codersdk/parameters.go:29:6
@@ -503,7 +503,7 @@ export type ParameterSourceScheme = "data" | "none"
// From codersdk/parameters.go:37:6
export type ParameterTypeSystem = "hcl" | "none"
// From codersdk/provisionerdaemons.go:42:6
// From codersdk/provisionerdaemons.go:47:6
export type ProvisionerJobStatus = "canceled" | "canceling" | "failed" | "pending" | "running" | "succeeded"
// From codersdk/organizations.go:14:6