UNPKG

@qiniu/miku-delivery-mp-ks

Version:

Kuaishou Mini Program SDK for Miku Delivery

126 lines (125 loc) 4.3 kB
/** Unix time, the number of seconds elapsed since January 1, 1970 UTC. */ export function unixTime() { return Math.round(Date.now() / 1000); } /** 简易的 query parse 实现,也可用于简单的 application/x-www-form-urlencoded 反序列化 */ export function parseQuery(querystring) { if (querystring[0] === '?') querystring = querystring.slice(1); const parsed = {}; querystring.split('&').forEach(kv => { const [k, v] = kv.split('='); parsed[decodeURIComponent(k)] = v == null ? null : decodeURIComponent(v); }); return parsed; } /** 简易的 query stringify 实现,也可用于简单的 application/x-www-form-urlencoded 序列化 */ export function stringifyQuery(params) { return Object.keys(params).map(k => [k, params[k]]).filter(([k, v]) => v !== undefined).map(([k, v]) => (v === null ? encodeURIComponent(k) : [k, v].map(encodeURIComponent).join('='))).join('&'); } export function uuid(length = 16) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; const charNum = chars.length; let text = ''; for (let i = 0; i < length; i++) { text += chars[Math.floor(Math.random() * charNum)]; } return text; } export function mapObj(obj, mapper) { const o = {}; Object.keys(obj).forEach(k => { o[k] = mapper(obj[k]); }); return o; } export function createDefered() { const defered = { resolve: undefined, reject: undefined, promise: undefined, status: 'pending', value: null }; defered.promise = new Promise((res, rej) => { defered.resolve = res; defered.reject = rej; }); defered.promise.then(v => { defered.value = v; defered.status = 'resolved'; }, () => { defered.status = 'rejected'; }); return defered; } export function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } export class TimeoutError extends Error { constructor() { super(...arguments); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: 'TimeoutError' }); } } export function waitTimeout(timeout, operation) { return new Promise((_, reject) => { setTimeout(() => reject(new TimeoutError(operation + ' timeout')), timeout); }); } /** 被取消的操作会抛出的异常 */ export class AbortError extends Error { constructor() { super(...arguments); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: 'AbortError' }); // 注意这里特意跟 DOMException name `AbortError` 保持一致,详见 https://developer.mozilla.org/en-US/docs/Web/API/DOMException#aborterror } } /** 将任意类型的异常转换为用于上报的 `err_msg` & `err_desc` */ export function getErrInfo(err) { if (err instanceof Error) { return { err_msg: err.name, err_desc: err.message }; } return { err_msg: 'Unknown', err_desc: err + '' }; } /** 将时间点相减,用于日志上报:1) 处理时间点缺失的逻辑 2) 单位 `ms` 转为上报需要的 `s` */ export function timeMinus(t1, t2) { if (t1 == null || t1 === -1 || t2 == null || t2 === -1) return -1; return (t1 - t2) / 1000; } /** 毫秒转换为秒 */ export function formatMillisecondToSecond(time) { return parseFloat((time / 1e3).toFixed(2)); } /** hostname (`${host}:${port}`) -> host + port */ export function parseHost(hostname, defaultPort = 80) { const [host, portStr] = hostname.split(':'); const port = portStr ? parseInt(portStr, 10) : defaultPort; return [host, port]; } export function getExt(pathname) { const segs = pathname.split('/'); const lastSeg = segs[segs.length - 1]; const extIndex = lastSeg.lastIndexOf('.'); return extIndex >= 0 ? lastSeg.slice(extIndex + 1) : ''; } export function isM3u8Url(url) { const [withoutQuery] = url.split('?'); return withoutQuery.endsWith('.m3u8'); } export function isFlvUrl(url) { const [withoutQuery] = url.split('?'); return withoutQuery.endsWith('.flv'); }