Superset二次开发之源码asyncEvent.ts 分析
路径 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 &#