import { AsyncLocalStorage } from 'node:async_hooks';
import { formatWithOptions as utilFormatWithOptions } from 'node:util';

const asyncLocalStorage = new AsyncLocalStorage();

export const getAsyncStorage = (): any => {
  return asyncLocalStorage.getStore();
};

export const runWithAsyncStorage = <T>(storage: any, callback: () => T): T => {
  return asyncLocalStorage.run(storage, callback);
};

const log = (...args: any[]) => {
  const storage = getAsyncStorage();
  const msg = utilFormatWithOptions({ compact: true, breakLength: Infinity }, ...args);
  console.log(`${storage?.remoteIP || '-'} ${storage?.userInfo || '-'} ${msg}`);
};

export const logger = {
  debug: log,
  info: log,
  warning: log,
  error: log,
};
