{"version":3,"file":"reportObservable.mjs","names":[],"sources":["../../../src/domain/report/reportObservable.ts"],"sourcesContent":["import { clocksNow } from '@openobserve/js-core/time'\nimport { toStackTraceString } from '../../tools/stackTrace/handlingStack'\nimport { monitor } from '../../tools/monitor'\nimport { mergeObservables, Observable } from '../../tools/observable'\nimport { addEventListener, DOM_EVENT, isEventSupported } from '../../browser/addEventListener'\nimport { safeTruncate } from '../../tools/utils/stringUtils'\nimport type { RawError } from '../error/error.types'\nimport { ErrorHandling, ErrorSource } from '../error/error.types'\nimport type { ReportType, InterventionReport, DeprecationReport } from './browser.types'\n\nexport const RawReportType = {\n  intervention: 'intervention',\n  deprecation: 'deprecation',\n  cspViolation: 'csp_violation',\n} as const\n\nexport type RawReportType = (typeof RawReportType)[keyof typeof RawReportType]\n\nexport type RawReportError = RawError & {\n  originalError: SecurityPolicyViolationEvent | DeprecationReport | InterventionReport\n}\n\nexport function initReportObservable(apis: RawReportType[]) {\n  const observables: Array<Observable<RawReportError>> = []\n\n  if (apis.includes(RawReportType.cspViolation)) {\n    observables.push(createCspViolationReportObservable())\n  }\n\n  const reportTypes = apis.filter((api: RawReportType): api is ReportType => api !== RawReportType.cspViolation)\n  if (reportTypes.length) {\n    observables.push(createReportObservable(reportTypes))\n  }\n\n  return mergeObservables(...observables)\n}\n\nfunction createReportObservable(reportTypes: ReportType[]) {\n  return new Observable<RawReportError>((observable) => {\n    if (!window.ReportingObserver) {\n      return\n    }\n\n    const handleReports = monitor((reports: Array<DeprecationReport | InterventionReport>, _: ReportingObserver) =>\n      reports.forEach((report) => observable.notify(buildRawReportErrorFromReport(report)))\n    ) as ReportingObserverCallback\n\n    const observer = new window.ReportingObserver(handleReports, {\n      types: reportTypes,\n      buffered: true,\n    })\n\n    observer.observe()\n    return () => {\n      observer.disconnect()\n    }\n  })\n}\n\nfunction createCspViolationReportObservable() {\n  return new Observable<RawReportError>((observable) => {\n    // Salesforce does not allow to add a securitypolicyviolation event listener. https://developer.salesforce.com/tools/lws-distortion-viewer\n    if (!isEventSupported(document, DOM_EVENT.SECURITY_POLICY_VIOLATION)) {\n      return\n    }\n\n    const { stop } = addEventListener(document, DOM_EVENT.SECURITY_POLICY_VIOLATION, (event) => {\n      observable.notify(buildRawReportErrorFromCspViolation(event))\n    })\n\n    return stop\n  })\n}\n\nfunction buildRawReportErrorFromReport(report: DeprecationReport | InterventionReport): RawReportError {\n  const { type, body } = report\n\n  return buildRawReportError({\n    type: body.id,\n    message: `${type}: ${body.message}`,\n    originalError: report,\n    stack: buildStack(body.id, body.message, body.sourceFile, body.lineNumber, body.columnNumber),\n  })\n}\n\nfunction buildRawReportErrorFromCspViolation(event: SecurityPolicyViolationEvent): RawReportError {\n  const message = `'${event.blockedURI}' blocked by '${event.effectiveDirective}' directive`\n  return buildRawReportError({\n    type: event.effectiveDirective,\n    message: `${RawReportType.cspViolation}: ${message}`,\n    originalError: event,\n    csp: {\n      disposition: event.disposition,\n    },\n    stack: buildStack(\n      event.effectiveDirective,\n      event.originalPolicy\n        ? `${message} of the policy \"${safeTruncate(event.originalPolicy, 100, '...')}\"`\n        : 'no policy',\n      event.sourceFile,\n      event.lineNumber,\n      event.columnNumber\n    ),\n  })\n}\n\nfunction buildRawReportError(partial: Omit<RawReportError, 'startClocks' | 'source' | 'handling'>): RawReportError {\n  return {\n    startClocks: clocksNow(),\n    source: ErrorSource.REPORT,\n    handling: ErrorHandling.UNHANDLED,\n    ...partial,\n  }\n}\n\nfunction buildStack(\n  name: string,\n  message: string,\n  sourceFile: string | null,\n  lineNumber: number | null,\n  columnNumber: number | null\n): string | undefined {\n  return sourceFile\n    ? toStackTraceString({\n        name,\n        message,\n        stack: [\n          {\n            func: '?',\n            url: sourceFile,\n            line: lineNumber ?? undefined,\n            column: columnNumber ?? undefined,\n          },\n        ],\n      })\n    : undefined\n}\n"],"mappings":";;;;;;;;AAUA,MAAa,gBAAgB;CAC3B,cAAc;CACd,aAAa;CACb,cAAc;AAChB;AAQA,SAAgB,qBAAqB,MAAuB;CAC1D,MAAM,cAAiD,CAAC;CAExD,IAAI,KAAK,SAAS,cAAc,YAAY,GAC1C,YAAY,KAAK,mCAAmC,CAAC;CAGvD,MAAM,cAAc,KAAK,QAAQ,QAA0C,QAAQ,cAAc,YAAY;CAC7G,IAAI,YAAY,QACd,YAAY,KAAK,uBAAuB,WAAW,CAAC;CAGtD,OAAO,iBAAiB,GAAG,WAAW;AACxC;AAEA,SAAS,uBAAuB,aAA2B;CACzD,OAAO,IAAI,YAA4B,eAAe;EACpD,IAAI,CAAC,OAAO,mBACV;EAGF,MAAM,gBAAgB,SAAS,SAAwD,MACrF,QAAQ,SAAS,WAAW,WAAW,OAAO,8BAA8B,MAAM,CAAC,CAAC,CACtF;EAEA,MAAM,WAAW,IAAI,OAAO,kBAAkB,eAAe;GAC3D,OAAO;GACP,UAAU;EACZ,CAAC;EAED,SAAS,QAAQ;EACjB,aAAa;GACX,SAAS,WAAW;EACtB;CACF,CAAC;AACH;AAEA,SAAS,qCAAqC;CAC5C,OAAO,IAAI,YAA4B,eAAe;EAEpD,IAAI,CAAC,iBAAiB,UAAA,yBAA6C,GACjE;EAGF,MAAM,EAAE,SAAS,iBAAiB,UAAA,4BAAgD,UAAU;GAC1F,WAAW,OAAO,oCAAoC,KAAK,CAAC;EAC9D,CAAC;EAED,OAAO;CACT,CAAC;AACH;AAEA,SAAS,8BAA8B,QAAgE;CACrG,MAAM,EAAE,MAAM,SAAS;CAEvB,OAAO,oBAAoB;EACzB,MAAM,KAAK;EACX,SAAS,GAAG,KAAK,IAAI,KAAK;EAC1B,eAAe;EACf,OAAO,WAAW,KAAK,IAAI,KAAK,SAAS,KAAK,YAAY,KAAK,YAAY,KAAK,YAAY;CAC9F,CAAC;AACH;AAEA,SAAS,oCAAoC,OAAqD;CAChG,MAAM,UAAU,IAAI,MAAM,WAAW,gBAAgB,MAAM,mBAAmB;CAC9E,OAAO,oBAAoB;EACzB,MAAM,MAAM;EACZ,SAAS,GAAG,cAAc,aAAa,IAAI;EAC3C,eAAe;EACf,KAAK,EACH,aAAa,MAAM,YACrB;EACA,OAAO,WACL,MAAM,oBACN,MAAM,iBACF,GAAG,QAAQ,kBAAkB,aAAa,MAAM,gBAAgB,KAAK,KAAK,EAAE,KAC5E,aACJ,MAAM,YACN,MAAM,YACN,MAAM,YACR;CACF,CAAC;AACH;AAEA,SAAS,oBAAoB,SAAsF;CACjH,OAAO;EACL,aAAa,UAAU;EACvB,QAAQ,YAAY;EACpB,UAAA;EACA,GAAG;CACL;AACF;AAEA,SAAS,WACP,MACA,SACA,YACA,YACA,cACoB;CACpB,OAAO,aACH,mBAAmB;EACjB;EACA;EACA,OAAO,CACL;GACE,MAAM;GACN,KAAK;GACL,MAAM,cAAc,KAAA;GACpB,QAAQ,gBAAgB,KAAA;EAC1B,CACF;CACF,CAAC,IACD,KAAA;AACN"}