From b2c4088ec62bc8afb650008258ce750d4e52b2ae Mon Sep 17 00:00:00 2001 From: Yann Amsellem Date: Mon, 17 Feb 2025 18:17:38 +0100 Subject: [PATCH] feat: Rename Logger into EventEmitter --- src/lib/olap-engine/EventEmitter.ts | 27 +++++++++++++++++++++++++++ src/lib/olap-engine/Logger.ts | 25 ------------------------- src/lib/olap-engine/engine-chdb.ts | 13 ++++++++----- src/lib/olap-engine/engine-remote.ts | 10 ++++++---- src/lib/olap-engine/index.ts | 6 ++++-- 5 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 src/lib/olap-engine/EventEmitter.ts delete mode 100644 src/lib/olap-engine/Logger.ts diff --git a/src/lib/olap-engine/EventEmitter.ts b/src/lib/olap-engine/EventEmitter.ts new file mode 100644 index 0000000..47036e1 --- /dev/null +++ b/src/lib/olap-engine/EventEmitter.ts @@ -0,0 +1,27 @@ +type Callback = (...param: any[]) => void; + +type OptionalRecord = { [P in K]?: T }; + +export interface IEventEmitter { + on(event: Events, fn: Callback): () => void; + emit(event: Events, param: any): void; +} + +export abstract class EventEmitter implements IEventEmitter { + #listeners: OptionalRecord> = {}; + + on(event: Events, fn: Callback) { + this.#listeners[event] ??= new Set(); + + this.#listeners[event].add(fn); + return () => this.#listeners[event]?.delete(fn); + } + + emit(event: Events, ...param: any[]) { + if (!this.#listeners[event]?.size) return; + + queueMicrotask(() => { + if (this.#listeners[event]) for (const fn of this.#listeners[event]) fn(...param); + }); + } +} diff --git a/src/lib/olap-engine/Logger.ts b/src/lib/olap-engine/Logger.ts deleted file mode 100644 index 694bc9a..0000000 --- a/src/lib/olap-engine/Logger.ts +++ /dev/null @@ -1,25 +0,0 @@ -type Callback = (param: any) => void; - -export interface ILogger { - on(level: 'error', fn: Callback): () => void; - log(level: 'error', param: any): void; -} - -export abstract class Logger implements ILogger { - #listeners: { [key: string]: Set } = {}; - - on(logEvent: 'error', fn: Callback) { - this.#listeners[logEvent] ??= new Set(); - - this.#listeners[logEvent].add(fn); - return () => this.#listeners[logEvent].delete(fn); - } - - log(level: 'error', param: any) { - if (!this.#listeners[level]?.size) return; - - queueMicrotask(() => { - for (const fn of this.#listeners[level]) fn(param); - }); - } -} diff --git a/src/lib/olap-engine/engine-chdb.ts b/src/lib/olap-engine/engine-chdb.ts index a246cc0..975a0f0 100644 --- a/src/lib/olap-engine/engine-chdb.ts +++ b/src/lib/olap-engine/engine-chdb.ts @@ -1,12 +1,12 @@ import { invoke } from '@tauri-apps/api/core'; -import type { OLAPEngine, OLAPResponse, Table } from './index'; -import { Logger } from './Logger'; +import { EventEmitter } from './EventEmitter'; +import type { Events, OLAPEngine, OLAPResponse, Table } from './index'; import CLICKHOUSE_GET_SCHEMA from './queries/clickhouse_get_schema.sql?raw'; import CLICKHOUSE_GET_UDFS from './queries/clickhouse_get_udfs.sql?raw'; import CLICKHOUSE_INIT_DB from './queries/clickhouse_init_db.sql?raw'; -export class CHDBEngine extends Logger implements OLAPEngine { +export class CHDBEngine extends EventEmitter implements OLAPEngine { async init() { await this.exec(CLICKHOUSE_INIT_DB); } @@ -15,12 +15,15 @@ export class CHDBEngine extends Logger implements OLAPEngine { try { const r: string = await invoke('query', { query }); if (!r) return; + const data = JSON.parse(r) as OLAPResponse; - return JSON.parse(r) as OLAPResponse; + this.emit('success', query, data); + + return data; } catch (e) { if (typeof e === 'string') e = new Error(e); console.error(e); - this.log('error', e); + this.emit('error', e); } } diff --git a/src/lib/olap-engine/engine-remote.ts b/src/lib/olap-engine/engine-remote.ts index 77b88dd..e96b918 100644 --- a/src/lib/olap-engine/engine-remote.ts +++ b/src/lib/olap-engine/engine-remote.ts @@ -1,10 +1,10 @@ -import type { OLAPEngine, OLAPResponse, Table } from './index'; -import { Logger } from './Logger'; +import { EventEmitter } from './EventEmitter'; +import type { Events, OLAPEngine, OLAPResponse, Table } from './index'; import CLICKHOUSE_GET_SCHEMA from './queries/clickhouse_get_schema.sql?raw'; import CLICKHOUSE_GET_UDFS from './queries/clickhouse_get_udfs.sql?raw'; -export class RemoteEngine extends Logger implements OLAPEngine { +export class RemoteEngine extends EventEmitter implements OLAPEngine { async init() {} async exec(query: string) { @@ -22,10 +22,12 @@ export class RemoteEngine extends Logger implements OLAPEngine { if ('exception' in data) throw new Error(data.exception); + this.emit('success', query, data); + return data; } catch (e) { console.error(e); - this.log('error', e); + this.emit('error', e); } } diff --git a/src/lib/olap-engine/index.ts b/src/lib/olap-engine/index.ts index fe1f6ac..4bc511b 100644 --- a/src/lib/olap-engine/index.ts +++ b/src/lib/olap-engine/index.ts @@ -1,6 +1,6 @@ import { CHDBEngine } from './engine-chdb'; import { RemoteEngine } from './engine-remote'; -import type { ILogger } from './Logger'; +import type { IEventEmitter } from './EventEmitter'; export type OLAPResponse = { meta: Array; @@ -24,7 +24,9 @@ export interface Table { columns: ColumnDescriptor[]; } -export interface OLAPEngine extends ILogger { +export type Events = 'error' | 'success'; + +export interface OLAPEngine extends IEventEmitter { init(): Promise; exec(query: string): Promise; getSchema(): Promise;