diff options
-rw-r--r-- | src/logging.ts | 49 | ||||
-rw-r--r-- | src/query.ts | 2 |
2 files changed, 33 insertions, 18 deletions
diff --git a/src/logging.ts b/src/logging.ts index 3f8757a07..16aa851bc 100644 --- a/src/logging.ts +++ b/src/logging.ts @@ -20,7 +20,7 @@ * @author Florian Dold */ -import {Store, QueryRoot} from "./query"; +import {Store, QueryRoot, openPromise} from "./query"; export type Level = "error" | "debug" | "info" | "warn"; @@ -126,31 +126,46 @@ export async function getLogs(): Promise<LogEntry[]> { return await new QueryRoot(db).iter(logsStore).toArray(); } +let barrier: any; + export async function record(level: Level, msg: string, source?: string, line?: number, col?: number): Promise<void> { if (typeof indexedDB === "undefined") { return; } - if (!db) { - db = await openLoggingDb(); + + let myBarrier: any; + + if (barrier) { + let p = barrier.promise; + myBarrier = barrier = openPromise(); + await p; + } else { + myBarrier = barrier = openPromise(); } - let count = await new QueryRoot(db).count(logsStore); + try { + if (!db) { + db = await openLoggingDb(); + } - console.log("count is", count); + let count = await new QueryRoot(db).count(logsStore); - if (count > 1000) { - await new QueryRoot(db).deleteIf(logsStore, (e, i) => (i < 200)); - } + if (count > 1000) { + await new QueryRoot(db).deleteIf(logsStore, (e, i) => (i < 200)); + } - let entry: LogEntry = { - timestamp: new Date().getTime(), - level, - msg, - source, - line, - col, - }; - await new QueryRoot(db).put(logsStore, entry); + let entry: LogEntry = { + timestamp: new Date().getTime(), + level, + msg, + source, + line, + col, + }; + await new QueryRoot(db).put(logsStore, entry); + } finally { + await Promise.resolve().then(() => myBarrier.resolve()); + } } const loggingDbVersion = 1; diff --git a/src/query.ts b/src/query.ts index f8a6255b4..2c5a6002f 100644 --- a/src/query.ts +++ b/src/query.ts @@ -86,7 +86,7 @@ export let AbortTransaction = Symbol("abort_transaction"); * Get an unresolved promise together with its extracted resolve / reject * function. */ -function openPromise<T>() { +export function openPromise<T>() { let resolve: ((value?: T | PromiseLike<T>) => void) | null = null; let reject: ((reason?: any) => void) | null = null; const promise = new Promise<T>((res, rej) => { |