@qiniu/miku-delivery-mp-ks
Version:
Kuaishou Mini Program SDK for Miku Delivery
91 lines (90 loc) • 4.39 kB
JavaScript
/**
* @file HTTPDNS API
* @desc https://cf.qiniu.io/pages/viewpage.action?pageId=107316632
*/
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 { Polyfilled_URL } from '../utils/url';
import { httpdnsResolveApi } from '../utils/env';
import { getAccessToken } from '../utils/access-token';
import { fetch, Headers } from '../utils/fetch/index';
import { getErrInfo, stringifyQuery, timeMinus } from '../utils/index';
import DnsLogger from './logger';
const httpdnsResolveApiDomain = new Polyfilled_URL(httpdnsResolveApi).hostname;
/** 基于 HTTP DNS 接口实现域名 resolve */
export function httpResolve(ctx, domain, app, logger) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
const dnsLogger = new DnsLogger(logger);
const params = { name: domain, type: 'A' };
const query = stringifyQuery(params);
const accessToken = getAccessToken(Object.assign(Object.assign({}, app), { path: httpdnsResolveApi, query }));
let err;
let response = null;
let result = null;
try {
response = yield fetch({
url: `${httpdnsResolveApi}?${query}`,
headers: new Headers({ 'Authorization': accessToken })
});
if (!response.ok) {
const resolveError = yield getResolveError(response);
if (resolveError == null)
throw new Error(`Resolve failed, unexpected HTTP status: ${response.status}`);
// 对于未支持的情况,将其视作一种“正常”结果(`NotSupportedAreaResolveResult`),并设置一个固定的 ttl: 5min
if (resolveError.code === 'NotSupportedArea') {
const result = { reason: 'NotSupportedArea', ttl: 60 * 5 };
return result;
}
throw new Error(`Resolve failed, code: ${resolveError.code}, error: ${resolveError.error}`);
}
const body = yield response.json();
return result = body;
}
catch (e) {
throw err = e;
}
finally {
const errInfo = result == null ? getErrInfo(err) : { err_msg: '', err_desc: '' };
const profile = response === null || response === void 0 ? void 0 : response._profile;
let profileInfo = { t_conn: -1, t_total: -1 };
if (profile != null) {
profileInfo = {
t_conn: timeMinus(profile.connectEnd, profile.connectStart),
t_total: timeMinus(profile.responseEnd, profile.fetchStart),
};
}
dnsLogger.log(Object.assign(Object.assign(Object.assign({ r_id: (_a = response === null || response === void 0 ? void 0 : response.headers.get('x-reqid')) !== null && _a !== void 0 ? _a : '', ip: '', domain: httpdnsResolveApiDomain, status_code: (_b = response === null || response === void 0 ? void 0 : response.status) !== null && _b !== void 0 ? _b : -1 }, errInfo), profileInfo), { type: 1 }));
}
});
}
export function isECDNResolveResult(result) {
return result.groups != null;
}
export function matchRule(rules, url) {
return rules.find(rule => new RegExp(rule.pattern).test(url));
}
export function shouldServeWithRule(rule) {
return Math.random() < rule.servicerate;
}
function getResolveError(response) {
return __awaiter(this, void 0, void 0, function* () {
try {
const parsed = yield response.json();
if (parsed
&& typeof parsed.code === 'string'
&& typeof parsed.error === 'string') {
return parsed;
}
}
catch (_a) { }
return null;
});
}