From 0b13b715cebfb28540c31d3955bcbb8fa845814e Mon Sep 17 00:00:00 2001 From: Carlo Piovesan Date: Wed, 22 Jan 2025 12:40:05 +0100 Subject: [PATCH] ProgressUpdate --- lib/src/webdb.cc | 4 ++-- packages/duckdb-wasm/src/bindings/runtime.ts | 4 ++-- .../duckdb-wasm/src/bindings/runtime_browser.ts | 15 ++++++++++++--- packages/duckdb-wasm/src/bindings/runtime_node.ts | 2 +- packages/duckdb-wasm/src/log.ts | 4 ++++ .../duckdb-wasm/src/parallel/async_bindings.ts | 7 +++++++ .../duckdb-wasm/src/parallel/worker_request.ts | 4 +++- 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/src/webdb.cc b/lib/src/webdb.cc index 12f27b356..cbdf2ffda 100644 --- a/lib/src/webdb.cc +++ b/lib/src/webdb.cc @@ -797,8 +797,8 @@ class ProgressBarCustom : public ProgressBarDisplay { to_send = 1.0; } ~ProgressBarCustom() {} - static void SendMessage(bool end, double percentage, double times) { - emscripten::val::global("DUCKDB_RUNTIME").call("progressUpdate", end, percentage, times); + static void SendMessage(double end, double percentage, double times) { + emscripten::val::global("DUCKDB_RUNTIME").call("progressUpdate", end ? 1.0 : 0.0, percentage, times); } public: diff --git a/packages/duckdb-wasm/src/bindings/runtime.ts b/packages/duckdb-wasm/src/bindings/runtime.ts index 4964278fb..0c80885a4 100644 --- a/packages/duckdb-wasm/src/bindings/runtime.ts +++ b/packages/duckdb-wasm/src/bindings/runtime.ts @@ -135,7 +135,7 @@ export interface DuckDBRuntime { syncFile(mod: DuckDBModule, fileId: number): void; closeFile(mod: DuckDBModule, fileId: number): void; getLastFileModificationTime(mod: DuckDBModule, fileId: number): number; - progressUpdate(mod: DuckDBModule, final: number, a: number, b:number): void; + progressUpdate(final: number, a: number, b:number): void; truncateFile(mod: DuckDBModule, fileId: number, newSize: number): void; readFile(mod: DuckDBModule, fileId: number, buffer: number, bytes: number, location: number): number; writeFile(mod: DuckDBModule, fileId: number, buffer: number, bytes: number, location: number): number; @@ -173,7 +173,7 @@ export const DEFAULT_RUNTIME: DuckDBRuntime = { getLastFileModificationTime: (_mod: DuckDBModule, _fileId: number): number => { return 0; }, - progressUpdate: (_mod: DuckDBModule, _fileId: number, a: number, b: number): void => { + progressUpdate: (_fileId: number, a: number, b: number): void => { return; }, truncateFile: (_mod: DuckDBModule, _fileId: number, _newSize: number): void => {}, diff --git a/packages/duckdb-wasm/src/bindings/runtime_browser.ts b/packages/duckdb-wasm/src/bindings/runtime_browser.ts index 8597ce117..6f5fa34a5 100644 --- a/packages/duckdb-wasm/src/bindings/runtime_browser.ts +++ b/packages/duckdb-wasm/src/bindings/runtime_browser.ts @@ -1,4 +1,8 @@ import { StatusCode } from '../status'; +import { + WorkerResponseType, +} from '../parallel/worker_request'; + import { addS3Headers, getHTTPUrl } from '../utils'; import { @@ -550,9 +554,14 @@ export const BROWSER_RUNTIME: DuckDBRuntime & { } return 0; }, - progressUpdate: (_mod: DuckDBModule, done: number, a: number, b: number): void => { - //postMessage(""); - console.log("Update progress: ", done, a, b); + progressUpdate: (done: number, percentage: number, repeat: number): void => { + if (postMessage) { + const map = new Map(); + map.set("status", done ? "completed" : "in-progress"); + map.set("percentage", percentage); + map.set("repetitions", repeat); + postMessage({requestId: 0, type: WorkerResponseType.PROGRESS_UPDATE, data: {data: map}}); + } }, checkDirectory: (mod: DuckDBModule, pathPtr: number, pathLen: number) => { const path = readString(mod, pathPtr, pathLen); diff --git a/packages/duckdb-wasm/src/bindings/runtime_node.ts b/packages/duckdb-wasm/src/bindings/runtime_node.ts index c97338a5c..51543f6ab 100644 --- a/packages/duckdb-wasm/src/bindings/runtime_node.ts +++ b/packages/duckdb-wasm/src/bindings/runtime_node.ts @@ -196,7 +196,7 @@ export const NODE_RUNTIME: DuckDBRuntime & { } return 0; }, - progressUpdate: (_mod: DuckDBModule, _fileId: number, a: number, b: number): void => { + progressUpdate: (_fileId: number, a: number, b: number): void => { return; }, getLastFileModificationTime: (mod: DuckDBModule, fileId: number) => { diff --git a/packages/duckdb-wasm/src/log.ts b/packages/duckdb-wasm/src/log.ts index e6ff577ca..fb510fcd4 100644 --- a/packages/duckdb-wasm/src/log.ts +++ b/packages/duckdb-wasm/src/log.ts @@ -41,6 +41,10 @@ export type LogEntry = { readonly value: V; }; +export type ProgressEntry = { + readonly data: Map; +} + export type LogEntryVariant = | LogEntry | LogEntry diff --git a/packages/duckdb-wasm/src/parallel/async_bindings.ts b/packages/duckdb-wasm/src/parallel/async_bindings.ts index 14a03b547..efea3a1fb 100644 --- a/packages/duckdb-wasm/src/parallel/async_bindings.ts +++ b/packages/duckdb-wasm/src/parallel/async_bindings.ts @@ -32,6 +32,9 @@ export class AsyncDuckDB implements AsyncDuckDBBindings { /** Instantiate the module */ protected _onInstantiationProgress: ((p: InstantiationProgress) => void)[] = []; + /** Progress callbacks */ + //protected _onProgressCallback: ((p: InstantiationProgress) => void)[] = []; + /** The logger */ protected readonly _logger: Logger; /** The worker */ @@ -122,6 +125,10 @@ export class AsyncDuckDB implements AsyncDuckDBBindings { const response = event.data as WorkerResponseVariant; switch (response.type) { // Request failed? + case WorkerResponseType.PROGRESS_UPDATE: { + console.log(response.data); + return; + } case WorkerResponseType.LOG: { this._logger.log(response.data); return; diff --git a/packages/duckdb-wasm/src/parallel/worker_request.ts b/packages/duckdb-wasm/src/parallel/worker_request.ts index cf128cdbb..b210f0edf 100644 --- a/packages/duckdb-wasm/src/parallel/worker_request.ts +++ b/packages/duckdb-wasm/src/parallel/worker_request.ts @@ -1,5 +1,5 @@ import { CSVInsertOptions, JSONInsertOptions, ArrowInsertOptions } from '../bindings/insert_options'; -import { LogEntryVariant } from '../log'; +import { LogEntryVariant, ProgressEntry } from '../log'; import { ScriptTokens } from '../bindings/tokens'; import { FileStatistics } from '../bindings/file_stats'; import { DuckDBConfig } from '../bindings/config'; @@ -56,6 +56,7 @@ export enum WorkerResponseType { FILE_STATISTICS = 'FILE_STATISTICS', INSTANTIATE_PROGRESS = 'INSTANTIATE_PROGRESS', LOG = 'LOG', + PROGRESS_UPDATE = 'PROGRESS_UPDATE', OK = 'OK', PREPARED_STATEMENT_ID = 'PREPARED_STATEMENT_ID', QUERY_PLAN = 'QUERY_PLAN', @@ -152,6 +153,7 @@ export type WorkerResponseVariant = | WorkerResponse | WorkerResponse | WorkerResponse + | WorkerResponse | WorkerResponse | WorkerResponse | WorkerResponse