const maxSmallIntegerV8 = 2 ** 30; // Max number that can be stored in V8's smis (small integers) const scopes = new Map(); let scopeCounter = 0; export interface LogScope { readonly scopeId?: number; readonly prefix: string; exitDetails?: string; } export function clearLogScope(scopeId: number) { scopes.delete(scopeId); } export function getLogScope(): LogScope | undefined { return scopes.get(scopeCounter); } export function getNewLogScope(prefix: string): LogScope { const scopeId = getNextLogScopeId(); return { scopeId: scopeId, prefix: `[${String(scopeId).padStart(5)}] ${prefix}`, }; } export function getLogScopeId(): number { return scopeCounter; } export function getNextLogScopeId(): number { if (scopeCounter === maxSmallIntegerV8) { scopeCounter = 0; } return ++scopeCounter; } export function setLogScope(scopeId: number, scope: LogScope) { scopes.set(scopeId, scope); }