From 1476f559b7fdc307fa567f6a893fbf61513e87aa Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 14 Apr 2023 00:59:52 +0200 Subject: [PATCH] feat(frontend): cancellable inline script editor run --- .../src/lib/components/TestJobLoader.svelte | 2 +- .../helpers/RunnableComponent.svelte | 26 ++++++- .../apps/editor/AppEditorHeader.svelte | 11 ++- .../InlineScriptEditor.svelte | 73 ++++++++++++------- frontend/src/lib/components/apps/types.ts | 6 +- 5 files changed, 85 insertions(+), 33 deletions(-) diff --git a/frontend/src/lib/components/TestJobLoader.svelte b/frontend/src/lib/components/TestJobLoader.svelte index 7e2f393cf9..d93bc7bf7f 100644 --- a/frontend/src/lib/components/TestJobLoader.svelte +++ b/frontend/src/lib/components/TestJobLoader.svelte @@ -146,7 +146,7 @@ if (previewJobUpdates.new_logs) { job.logs = (job?.logs ?? '').concat(previewJobUpdates.new_logs) } - if (previewJobUpdates.mem_peak) { + if (previewJobUpdates.mem_peak && job) { job.mem_peak = previewJobUpdates.mem_peak } if ((previewJobUpdates.running ?? false) || (previewJobUpdates.completed ?? false)) { diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte index f899bdb351..b4a095e2f9 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte @@ -11,7 +11,7 @@ import { createEventDispatcher, getContext, onDestroy } from 'svelte' import type { AppInputs, Runnable } from '../../inputType' import type { Output } from '../../rx' - import type { AppViewerContext, InlineScript } from '../../types' + import type { AppViewerContext, CancelablePromise, InlineScript } from '../../types' import { computeGlobalContext, eval_like } from './eval' import InputValue from './InputValue.svelte' import RefreshButton from './RefreshButton.svelte' @@ -58,12 +58,29 @@ const dispatch = createEventDispatcher() + let donePromise: (() => void) | undefined = undefined + + const cancellableRun: (inlineScript?: InlineScript) => CancelablePromise = ( + inlineScript?: InlineScript + ) => { + let rejectCb: (err: Error) => void + let p: Partial> = new Promise((resolve, reject) => { + rejectCb = reject + donePromise = resolve + executeComponent(true, inlineScript).catch(reject) + }) + p.cancel = () => { + testJobLoader?.cancelJob() + loading = false + rejectCb(new Error('Canceled')) + } + return p as CancelablePromise + } + $runnableComponents[id] = { autoRefresh: autoRefresh && recomputableByRefreshButton, refreshOnStart, - cb: async (inlineScript?: InlineScript) => { - await executeComponent(true, inlineScript) - } + cb: cancellableRun } if (!$initialized.initializedComponents.includes(id)) { @@ -372,6 +389,7 @@ if (startedAt > lastStartedAt) { lastStartedAt = startedAt setResult(e.detail.result) + donePromise?.() } } loading = false diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte index ff2b779d24..57b6fc38ab 100644 --- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte @@ -396,7 +396,7 @@ {/if} {:else} -
+
{#if job?.['running']}
@@ -633,7 +635,12 @@
{#if $runnableComponents[id] != undefined} - + + {:else} + + {/if} {/if}
diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 01284e9646..8af9c8f3b5 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -130,6 +130,10 @@ export type ConnectingInput = { hoveredComponent: string | undefined } +export interface CancelablePromise extends Promise { + cancel: () => void +} + export type AppViewerContext = { worldStore: Writable app: Writable @@ -148,7 +152,7 @@ export type AppViewerContext = { { autoRefresh: boolean refreshOnStart?: boolean - cb: (inlineScript?: InlineScript) => Promise + cb: (inlineScript?: InlineScript) => CancelablePromise } > >