UNPKG

@qiniu/miku-delivery-mp-ks

Version:

Kuaishou Mini Program SDK for Miku Delivery

134 lines (133 loc) 5.65 kB
/** * @file 小程序 Component 实现的工具函数 * @desc 提供如 uuid、log 等逻辑相关的辅助工具 */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { deferedShared } from './index'; import { getErrInfo, timeMinus, uuid } from '../utils/index'; import MediaEventLogger from './media-event-logger'; import Context from '../utils/context'; import ResolveSrcLogger from './resolve-src-logger'; import ApplyResolvedLogger from './apply-resolved-logger'; /** 媒体组件 error 事件 */ export class MediaError extends Error { constructor() { super(...arguments); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: 'MediaError' }); } } /** 获取自定义媒体组件的唯一 ID,如果没有,则会生成一个并与当前组件实例绑定 */ export function getUuid(comp) { if (comp['__uuid__'] != null) return comp['__uuid__']; return comp['__uuid__'] = uuid(); } /** 获取适用于当前自定义媒体组件的 MediaEventLogger 实例 */ function getMediaEventLogger(comp) { return __awaiter(this, void 0, void 0, function* () { if (comp['__media_event_logger__'] != null) return comp['__media_event_logger__']; const { logger } = yield deferedShared.promise; return comp['__media_event_logger__'] = new MediaEventLogger(logger); }); } /** 记录自定义媒体组件的类型(`video` / `image`) */ function setType(comp, type) { comp['__type__'] = type; } /** 获取自定义媒体组件的类型(`video` / `image`) */ function getType(comp) { var _a; return (_a = comp['__type__']) !== null && _a !== void 0 ? _a : '[unknown]'; } /** 获取自定义媒体组件当前的资源 URL */ function getUrl(comp) { return comp.data.finalSrc || comp.properties.src; } function logMediaEvent(comp, type, err_msg = '', err_desc = '') { return __awaiter(this, void 0, void 0, function* () { const eventLogger = yield getMediaEventLogger(comp); eventLogger.log({ m_id: getUuid(comp), m_type: getType(comp), m_url: getUrl(comp), type, err_msg, err_desc }); }); } /** 回调函数,预期自定义媒体组件 attached 时被调用 */ export function onAttached(comp, type) { return __awaiter(this, void 0, void 0, function* () { setType(comp, type); logMediaEvent(comp, 'attached'); }); } /** 回调函数,预期媒体组件中的原生媒体组件上有事件触发时被调用 */ export function onMediaEvent(comp, event) { var _a; return __awaiter(this, void 0, void 0, function* () { if (event.type === 'loadedmetadata' || event.type === 'load') { return logMediaEvent(comp, event.type); } if (event.type === 'error') { const detail = event.detail; return logMediaEvent(comp, event.type, 'MediaError', (_a = detail.errMsg) !== null && _a !== void 0 ? _a : ''); } }); } /** 基于外部设置的 src 进行 ECDN 解析 & 调度 */ export function resolveSrc(comp, logger, resolver, src, job) { var _a; return __awaiter(this, void 0, void 0, function* () { const resolveSrcId = uuid(); const compId = getUuid(comp); const ctx = new Context(); const resolveSrcLogger = new ResolveSrcLogger(logger); const applyResolvedLogger = new ApplyResolvedLogger(logger); const startAt = Date.now(); let err = null; let currentRetryCount = -1; try { yield resolver.do(ctx, src, 2, (resolved) => __awaiter(this, void 0, void 0, function* () { currentRetryCount++; const applyStartAt = Date.now(); const applyEltId = ctx.get('downloadEltID'); let applyErr = null; try { yield job(resolved); } catch (e) { applyErr = e; throw e; } finally { const applyFinishAt = Date.now(); applyResolvedLogger.log(Object.assign({ m_id: compId, r_id: resolveSrcId, retry: currentRetryCount, elt_id: applyEltId !== null && applyEltId !== void 0 ? applyEltId : '', t_total: timeMinus(applyFinishAt, applyStartAt), err_msg: '', err_desc: '' }, (applyErr != null && getErrInfo(applyErr)))); } })); } catch (e) { err = e; throw e; } finally { const finishAt = Date.now(); resolveSrcLogger.log(Object.assign({ id: resolveSrcId, m_id: compId, ts_st: startAt, t_lookup: (_a = ctx.get('dnsResolveTotalTime')) !== null && _a !== void 0 ? _a : -1, t_total: timeMinus(finishAt, startAt), err_msg: '', err_desc: '' }, (err != null && getErrInfo(err)))); } }); }