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