feat: Rename Logger into EventEmitter

This commit is contained in:
Yann Amsellem
2025-02-17 18:17:38 +01:00
parent b564c0c4da
commit b2c4088ec6
5 changed files with 45 additions and 36 deletions

View File

@@ -0,0 +1,27 @@
type Callback = (...param: any[]) => void;
type OptionalRecord<K extends keyof any, T> = { [P in K]?: T };
export interface IEventEmitter<Events extends string> {
on(event: Events, fn: Callback): () => void;
emit(event: Events, param: any): void;
}
export abstract class EventEmitter<Events extends string> implements IEventEmitter<Events> {
#listeners: OptionalRecord<Events, Set<Callback>> = {};
on(event: Events, fn: Callback) {
this.#listeners[event] ??= new Set<Callback>();
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);
});
}
}

View File

@@ -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<Callback> } = {};
on(logEvent: 'error', fn: Callback) {
this.#listeners[logEvent] ??= new Set<Callback>();
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);
});
}
}

View File

@@ -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<Events> 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);
}
}

View File

@@ -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<Events> 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);
}
}

View File

@@ -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<ColumnDescriptor>;
@@ -24,7 +24,9 @@ export interface Table {
columns: ColumnDescriptor[];
}
export interface OLAPEngine extends ILogger {
export type Events = 'error' | 'success';
export interface OLAPEngine extends IEventEmitter<Events> {
init(): Promise<void>;
exec(query: string): Promise<OLAPResponse | undefined>;
getSchema(): Promise<Table[]>;