From 6883f53bd770df1655d8ee1c02ab9d1c3a1a4aac Mon Sep 17 00:00:00 2001 From: Michele Riva Date: Fri, 12 Jan 2024 17:10:21 +0100 Subject: [PATCH] fix: #605 - orama crashes inside web worker (#606) --- packages/orama/src/utils.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/orama/src/utils.ts b/packages/orama/src/utils.ts index 06c2b818c..546497ce8 100644 --- a/packages/orama/src/utils.ts +++ b/packages/orama/src/utils.ts @@ -82,6 +82,19 @@ export async function formatBytes(bytes: number, decimals = 2): Promise return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}` } +export function isInsideWebWorker(): boolean { + // @ts-expect-error - WebWorker global scope + return typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope +} + +export function isInsideNode(): boolean { + return typeof process !== 'undefined' && process.release.name === 'node' +} + +export function getNanosecondTimeViaPerformance() { + return BigInt(Math.floor(performance.now() * 1e6)) +} + export async function formatNanoseconds(value: number | bigint): Promise { if (typeof value === 'number') { value = BigInt(value) @@ -99,12 +112,20 @@ export async function formatNanoseconds(value: number | bigint): Promise } export async function getNanosecondsTime(): Promise { + if (isInsideWebWorker()) { + return getNanosecondTimeViaPerformance() + } + + if (isInsideNode()) { + return process.hrtime.bigint() + } + if (typeof process !== 'undefined' && process.hrtime !== undefined) { return process.hrtime.bigint() } if (typeof performance !== 'undefined') { - return BigInt(Math.floor(performance.now() * 1e6)) + return getNanosecondTimeViaPerformance() } // @todo: fallback to V8 native method to get microtime