@qiniu/miku-delivery-mp-ks
Version:
Kuaishou Mini Program SDK for Miku Delivery
134 lines (133 loc) • 5.65 kB
JavaScript
/**
* @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))));
}
});
}