1{"version":3,"file":"LogBoxLog.js","sourceRoot":"","sources":["../../../src/error-overlay/Data/LogBoxLog.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 650 Industries.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport * as LogBoxSymbolication from './LogBoxSymbolication';\nimport type { Stack } from './LogBoxSymbolication';\nimport type { Category, Message, ComponentStack, CodeFrame } from './parseLogBoxLog';\n\ntype SymbolicationStatus = 'NONE' | 'PENDING' | 'COMPLETE' | 'FAILED';\n\nexport type LogLevel = 'warn' | 'error' | 'fatal' | 'syntax' | 'static';\n\nexport type LogBoxLogData = {\n  level: LogLevel;\n  type?: string;\n  message: Message;\n  stack: Stack;\n  category: string;\n  componentStack: ComponentStack;\n  codeFrame?: CodeFrame;\n  isComponentError: boolean;\n};\n\nexport type StackType = 'stack' | 'component';\n\nfunction componentStackToStack(componentStack: ComponentStack): Stack {\n  return componentStack.map((stack) => ({\n    file: stack.fileName,\n    methodName: stack.content,\n    lineNumber: stack.location?.row ?? 0,\n    column: stack.location?.column ?? 0,\n    arguments: [],\n  }));\n}\n\ntype SymbolicationCallback = (status: SymbolicationStatus) => void;\n\ntype SymbolicationResult =\n  | { error: null; stack: null; status: 'NONE' }\n  | { error: null; stack: null; status: 'PENDING' }\n  | { error: null; stack: Stack; status: 'COMPLETE' }\n  | { error: Error; stack: null; status: 'FAILED' };\n\nexport class LogBoxLog {\n  message: Message;\n  type: string;\n  category: Category;\n  componentStack: ComponentStack;\n  stack: Stack;\n  count: number;\n  level: LogLevel;\n  codeFrame?: CodeFrame;\n  isComponentError: boolean;\n  symbolicated: Record<StackType, SymbolicationResult> = {\n    stack: {\n      error: null,\n      stack: null,\n      status: 'NONE',\n    },\n    component: {\n      error: null,\n      stack: null,\n      status: 'NONE',\n    },\n  };\n\n  private callbacks: Map<StackType, Set<SymbolicationCallback>> = new Map();\n\n  constructor(\n    data: LogBoxLogData & {\n      symbolicated?: Record<StackType, SymbolicationResult>;\n    }\n  ) {\n    this.level = data.level;\n    this.type = data.type ?? 'error';\n    this.message = data.message;\n    this.stack = data.stack;\n    this.category = data.category;\n    this.componentStack = data.componentStack;\n    this.codeFrame = data.codeFrame;\n    this.isComponentError = data.isComponentError;\n    this.count = 1;\n    this.symbolicated = data.symbolicated ?? this.symbolicated;\n  }\n\n  incrementCount(): void {\n    this.count += 1;\n  }\n\n  getAvailableStack(type: StackType): Stack | null {\n    if (this.symbolicated[type].status === 'COMPLETE') {\n      return this.symbolicated[type].stack;\n    }\n    return this.getStack(type);\n  }\n\n  private flushCallbacks(type: StackType): void {\n    const callbacks = this.callbacks.get(type);\n    const status = this.symbolicated[type].status;\n    if (callbacks) {\n      for (const callback of callbacks) {\n        callback(status);\n      }\n      callbacks.clear();\n    }\n  }\n\n  private pushCallback(type: StackType, callback: SymbolicationCallback): void {\n    let callbacks = this.callbacks.get(type);\n    if (!callbacks) {\n      callbacks = new Set();\n      this.callbacks.set(type, callbacks);\n    }\n    callbacks.add(callback);\n  }\n\n  retrySymbolicate(type: StackType, callback?: (status: SymbolicationStatus) => void): void {\n    this._symbolicate(type, true, callback);\n  }\n\n  symbolicate(type: StackType, callback?: (status: SymbolicationStatus) => void): void {\n    this._symbolicate(type, false, callback);\n  }\n\n  private _symbolicate(\n    type: StackType,\n    retry: boolean,\n    callback?: (status: SymbolicationStatus) => void\n  ): void {\n    if (callback) {\n      this.pushCallback(type, callback);\n    }\n    const status = this.symbolicated[type].status;\n\n    if (status === 'COMPLETE') {\n      return this.flushCallbacks(type);\n    }\n\n    if (retry) {\n      LogBoxSymbolication.deleteStack(this.getStack(type));\n      this.handleSymbolicate(type);\n    } else {\n      if (status === 'NONE') {\n        this.handleSymbolicate(type);\n      }\n    }\n  }\n\n  private componentStackCache: Stack | null = null;\n\n  private getStack(type: StackType): Stack {\n    if (type === 'component') {\n      if (this.componentStackCache == null) {\n        this.componentStackCache = componentStackToStack(this.componentStack);\n      }\n      return this.componentStackCache;\n    }\n    return this.stack;\n  }\n\n  private handleSymbolicate(type: StackType): void {\n    if (type === 'component' && !this.componentStack?.length) {\n      return;\n    }\n\n    if (this.symbolicated[type].status !== 'PENDING') {\n      this.updateStatus(type, null, null, null);\n      LogBoxSymbolication.symbolicate(this.getStack(type)).then(\n        (data) => {\n          this.updateStatus(type, null, data?.stack, data?.codeFrame);\n        },\n        (error) => {\n          this.updateStatus(type, error, null, null);\n        }\n      );\n    }\n  }\n\n  private updateStatus(\n    type: StackType,\n    error?: Error | null,\n    stack?: Stack | null,\n    codeFrame?: CodeFrame | null\n  ): void {\n    const lastStatus = this.symbolicated[type].status;\n    if (error != null) {\n      this.symbolicated[type] = {\n        error,\n        stack: null,\n        status: 'FAILED',\n      };\n    } else if (stack != null) {\n      if (codeFrame) {\n        this.codeFrame = codeFrame;\n      }\n\n      this.symbolicated[type] = {\n        error: null,\n        stack,\n        status: 'COMPLETE',\n      };\n    } else {\n      this.symbolicated[type] = {\n        error: null,\n        stack: null,\n        status: 'PENDING',\n      };\n    }\n\n    const status = this.symbolicated[type].status;\n    if (lastStatus !== status) {\n      if (['COMPLETE', 'FAILED'].includes(status)) {\n        this.flushCallbacks(type);\n      }\n    }\n  }\n}\n"]}