{"version":3,"file":"consoleObservable.mjs","names":[],"sources":["../../../src/domain/console/consoleObservable.ts"],"sourcesContent":["import { clocksNow } from '@openobserve/js-core/time'\nimport { ConsoleApiName, globalConsole } from '@openobserve/js-core/util'\nimport { isError, computeRawError } from '../error/error'\nimport { Observable, mergeObservables } from '../../tools/observable'\nimport { callMonitored } from '../../tools/monitor'\nimport { sanitize } from '../../tools/serialisation/sanitize'\nimport { jsonStringify } from '../../tools/serialisation/jsonStringify'\nimport type { RawError } from '../error/error.types'\nimport { ErrorHandling, ErrorSource, NonErrorPrefix } from '../error/error.types'\nimport { computeStackTrace } from '../../tools/stackTrace/computeStackTrace'\nimport { createHandlingStack, formatErrorMessage } from '../../tools/stackTrace/handlingStack'\n\nexport type ConsoleLog = NonErrorConsoleLog | ErrorConsoleLog\n\ninterface NonErrorConsoleLog extends ConsoleLogBase {\n  api: Exclude<ConsoleApiName, typeof ConsoleApiName.error>\n  error: undefined\n}\n\nexport interface ErrorConsoleLog extends ConsoleLogBase {\n  api: typeof ConsoleApiName.error\n  error: RawError\n}\n\ninterface ConsoleLogBase {\n  message: string\n  api: ConsoleApiName\n  handlingStack: string\n}\n\ntype ConsoleLogForApi<T extends ConsoleApiName> = T extends typeof ConsoleApiName.error\n  ? ErrorConsoleLog\n  : NonErrorConsoleLog\n\nlet consoleObservablesByApi: { [K in ConsoleApiName]?: Observable<ConsoleLogForApi<K>> } = {}\n\nexport function initConsoleObservable<T extends ConsoleApiName[]>(apis: T): Observable<ConsoleLogForApi<T[number]>> {\n  const consoleObservables = apis.map((api) => {\n    if (!consoleObservablesByApi[api]) {\n      consoleObservablesByApi[api] = createConsoleObservable(api) as any // we are sure that the observable created for this api will yield the expected ConsoleLog type\n    }\n    return consoleObservablesByApi[api] as unknown as Observable<ConsoleLogForApi<T[number]>>\n  })\n\n  return mergeObservables(...consoleObservables)\n}\n\nexport function resetConsoleObservable() {\n  consoleObservablesByApi = {}\n}\n\nfunction createConsoleObservable(api: ConsoleApiName) {\n  return new Observable<ConsoleLog>((observable) => {\n    const originalConsoleApi = globalConsole[api]\n\n    globalConsole[api] = (...params: unknown[]) => {\n      originalConsoleApi.apply(console, params)\n      const handlingStack = createHandlingStack('console error')\n\n      callMonitored(() => {\n        observable.notify(buildConsoleLog(params, api, handlingStack))\n      })\n    }\n\n    return () => {\n      globalConsole[api] = originalConsoleApi\n    }\n  })\n}\n\nfunction buildConsoleLog(params: unknown[], api: ConsoleApiName, handlingStack: string): ConsoleLog {\n  const message = params.map((param) => formatConsoleParameters(param)).join(' ')\n\n  if (api === ConsoleApiName.error) {\n    const firstErrorParam = params.find(isError)\n\n    const rawError = computeRawError({\n      originalError: firstErrorParam,\n      handlingStack,\n      startClocks: clocksNow(),\n      source: ErrorSource.CONSOLE,\n      handling: ErrorHandling.HANDLED,\n      nonErrorPrefix: NonErrorPrefix.PROVIDED,\n\n      // if no good stack is computed from the error, let's not use the fallback stack message\n      // advising the user to use an instance of Error, as console.error is commonly used without an\n      // Error instance.\n      useFallbackStack: false,\n    })\n\n    // Use the full log message as the error message instead of just the error instance message.\n    rawError.message = message\n\n    return {\n      api,\n      message,\n      handlingStack,\n      error: rawError,\n    }\n  }\n\n  return {\n    api,\n    message,\n    error: undefined,\n    handlingStack,\n  }\n}\n\nfunction formatConsoleParameters(param: unknown) {\n  if (typeof param === 'string') {\n    return sanitize(param)\n  }\n  if (isError(param)) {\n    return formatErrorMessage(computeStackTrace(param))\n  }\n  return jsonStringify(sanitize(param), undefined, 2)\n}\n"],"mappings":";;;;;;;;;;;AAkCA,IAAI,0BAAuF,CAAC;AAE5F,SAAgB,sBAAkD,MAAkD;CAQlH,OAAO,iBAAiB,GAPG,KAAK,KAAK,QAAQ;EAC3C,IAAI,CAAC,wBAAwB,MAC3B,wBAAwB,OAAO,wBAAwB,GAAG;EAE5D,OAAO,wBAAwB;CACjC,CAE4C,CAAC;AAC/C;AAMA,SAAS,wBAAwB,KAAqB;CACpD,OAAO,IAAI,YAAwB,eAAe;EAChD,MAAM,qBAAqB,cAAc;EAEzC,cAAc,QAAQ,GAAG,WAAsB;GAC7C,mBAAmB,MAAM,SAAS,MAAM;GACxC,MAAM,gBAAgB,oBAAoB,eAAe;GAEzD,oBAAoB;IAClB,WAAW,OAAO,gBAAgB,QAAQ,KAAK,aAAa,CAAC;GAC/D,CAAC;EACH;EAEA,aAAa;GACX,cAAc,OAAO;EACvB;CACF,CAAC;AACH;AAEA,SAAS,gBAAgB,QAAmB,KAAqB,eAAmC;CAClG,MAAM,UAAU,OAAO,KAAK,UAAU,wBAAwB,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;CAE9E,IAAI,QAAQ,eAAe,OAAO;EAGhC,MAAM,WAAW,gBAAgB;GAC/B,eAHsB,OAAO,KAAK,OAGL;GAC7B;GACA,aAAa,UAAU;GACvB,QAAQ,YAAY;GACpB,UAAA;GACA,gBAAA;GAKA,kBAAkB;EACpB,CAAC;EAGD,SAAS,UAAU;EAEnB,OAAO;GACL;GACA;GACA;GACA,OAAO;EACT;CACF;CAEA,OAAO;EACL;EACA;EACA,OAAO,KAAA;EACP;CACF;AACF;AAEA,SAAS,wBAAwB,OAAgB;CAC/C,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,KAAK;CAEvB,IAAI,QAAQ,KAAK,GACf,OAAO,mBAAmB,kBAAkB,KAAK,CAAC;CAEpD,OAAO,cAAc,SAAS,KAAK,GAAG,KAAA,GAAW,CAAC;AACpD"}