export default async function proxy()

in packages-error-prompt/console-base-error-prompt-proxy/src/util/proxy.ts [30:103]


export default async function proxy(o?: ErrorPromptArg, extra?: ErrorPromptExtra | ErrorPromptExtraFn, detailedMode?: boolean): Promise<void> {
  let countOfCheckConsoleBaseLoadingByErrorPromptProxy = 0;

  const callErrorPromptByNotProxy = (args?: ErrorPromptArg) => {
    logToRamSls(SLS_TOPIC_FOR_RAM, {
      eventId: 'error-prompt-proxy.raise-prompt',
      c1: 'UnmanagedErrorPrompt'
    });

    return errorPrompt(args, extra, detailedMode);
  };

  const callErrorPromptByProxy = (args?: ErrorDetailedInfo) => {
    if (!args) { return; }

    try {
      // postMessage 可能抛错
      // FIXME: promptError 返回 Promise 这里其实捕获不到什么
      return promptError<IMessengerPayload>({
        error: pruneForMessage<ErrorDetailedInfo>(args),
        extra: extra ? pruneForMessage<ErrorPromptExtra>(typeof extra === 'function' ? extra(args) || {} : extra) : undefined,
        detailedMode
      });
    } catch (err) {
      // 抛错表明 message 的 payload 中含有无法序列化的数据
      return callErrorPromptByNotProxy(args);
    }
  };
  
  const errorInfo: ErrorDetailedInfo | null = o ? convertToErrorDetailedInfo(o) : null;
  
  if (!errorInfo) {
    callErrorPromptByNotProxy(o);

    return;
  }

  // 特殊处理:权限错误要求尽可能等待 ConsoleBase 加载完成后触发
  if (errorInfo.detailsAuth?.action || errorInfo.detailsAuth?.diagnosisInfo) {
    const interval = setInterval(() => {
      const proxyLoaded = getProxyErrorPrompt();

      // 等待 Proxy 加载至多 3 秒(500 * 6)
      if (!proxyLoaded && countOfCheckConsoleBaseLoadingByErrorPromptProxy < 6) {
        countOfCheckConsoleBaseLoadingByErrorPromptProxy += 1;

        return;
      }

      clearInterval(interval);

      if (proxyLoaded) {
        callErrorPromptByProxy(errorInfo);
      } else {
        callErrorPromptByNotProxy(errorInfo);
      }

      // 上报 error-prompt-proxy 包触发的权限错误到 RAM 日志库
      logToRamSls(SLS_TOPIC_FOR_RAM, {
        eventId: 'error-prompt-proxy.raise-prompt',
        c1: errorInfo.code,
        c2: errorInfo.detailsAuth?.action,
        c3: errorInfo.detailsAuth?.resource,
        c4: errorInfo.detailsAuth?.type,
        c5: errorInfo.detailsAuth?.policyType,
        c6: errorInfo.detailsAuth?.diagnosisInfo?.length || 0
      });
    }, 500);

    return;
  }

  callErrorPromptByProxy(errorInfo);
}