路径 superset-frontend/src/middleware/asyncEvent.ts
`asyncEvent.ts` 文件主要负责处理 Superset 中的异步事件。
它实现了一个中间件,用于管理异步查询的状态和结果,支持两种传输方式:轮询(polling)和 WebSocket(ws)。该文件的核心功能包括:
- 监听和处理异步事件。
- 通过 API 获取异步事件的状态和结果。
- 管理事件的监听器和重试机制。
- 处理 WebSocket 连接和消息。
import {ensureIsArray,isFeatureEnabled,FeatureFlag,makeApi,SupersetClient,logging,
} from '@superset-ui/core';
import { SupersetError } from 'src/components/ErrorMessage/types';
import getBootstrapData from 'src/utils/getBootstrapData';
import {getClientErrorObject,parseErrorJson,
} from '../utils/getClientErrorObject';type AsyncEvent = {id?: string | null;channel_id: string;job_id: string;user_id?: string;status: string;errors?: SupersetError[];result_url: string | null;
};type CachedDataResponse = {status: string;data: any;
};
type AppConfig = Record<string, any>;
type ListenerFn = (asyncEvent: AsyncEvent) => Promise<any>;const TRANSPORT_POLLING = 'polling';
const TRANSPORT_WS = 'ws';
const JOB_STATUS = {PENDING: 'pending',RUNNING: 'running',ERROR: 'error',DONE: 'done',
};
const LOCALSTORAGE_KEY = 'last_async_event_id';
const POLLING_URL = '/api/v1/async_event/';
const MAX_RETRIES = 6;
const RETRY_DELAY = 100;let config: AppConfig;
let transport: string;
let pollingDelayMs: number;
let pollingTimeoutId: number;
let listenersByJobId: Record<string, ListenerFn>;
let retriesByJobId: Record<string, number>;
let lastReceivedEventId: string | null | undefined;const addListener = (id: string, fn: any) => {listenersByJobId[id] = fn;
};const removeListener &#