Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion core/frontend/src/views/ExtensionManagerView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,29 @@ const API_URL = '/kraken/v1.0'
const notifier = new Notifier(kraken_service)
const ansi = new AnsiUp()

// Axios `timeout` is a hard deadline from request start, so large or slow pulls die
// while Docker is still streaming. Cancel only after this long with no new bytes.
const PULL_IDLE_TIMEOUT_MS = 120000

function startPullIdleWatchdog() {
const source = axios.CancelToken.source()
let timer: ReturnType<typeof setTimeout> | undefined
const stop = () => {
if (timer !== undefined) {
clearTimeout(timer)
timer = undefined
}
}
const bump = () => {
stop()
timer = setTimeout(() => {
source.cancel(`No data received for ${PULL_IDLE_TIMEOUT_MS}ms`)
}, PULL_IDLE_TIMEOUT_MS)
}
bump()
return { cancelToken: source.token, bump, stop }
}

export default Vue.extend({
name: 'ExtensionManagerView',
components: {
Expand Down Expand Up @@ -330,15 +353,17 @@ export default Vue.extend({
notifier.pushBackError('EXTENSIONS_INSTALL_FAIL', error)
},
)
const watchdog = startPullIdleWatchdog()
back_axios({
url: `${API_URL}/extension/update_to_version`,
method: 'POST',
params: {
extension_identifier: extension.identifier,
new_version: version,
},
timeout: 120000,
cancelToken: watchdog.cancelToken,
onDownloadProgress: (progressEvent) => {
watchdog.bump()
tracker.digestNewData(progressEvent)
this.pull_output = tracker.pull_output
this.download_percentage = tracker.download_percentage
Expand All @@ -355,6 +380,7 @@ export default Vue.extend({
notifier.pushBackError('EXTENSIONS_INSTALL_FAIL', error)
})
.finally(() => {
watchdog.stop()
this.show_pull_output = false
this.show_dialog = false
this.pull_output = ''
Expand Down Expand Up @@ -549,6 +575,7 @@ export default Vue.extend({
},
)

const watchdog = startPullIdleWatchdog()
back_axios({
url: `${API_URL}/extension/install`,
method: 'POST',
Expand All @@ -561,7 +588,9 @@ export default Vue.extend({
permissions,
user_permissions,
},
cancelToken: watchdog.cancelToken,
onDownloadProgress: (progressEvent) => {
watchdog.bump()
tracker.digestNewData(progressEvent)
this.pull_output = tracker.pull_output
this.download_percentage = tracker.download_percentage
Expand All @@ -578,6 +607,7 @@ export default Vue.extend({
notifier.pushBackError('EXTENSIONS_INSTALL_FAIL', error)
})
.finally(() => {
watchdog.stop()
this.show_pull_output = false
this.show_dialog = false
this.pull_output = ''
Expand Down
Loading