UNPKG

@qiniu/miku-delivery-mp-ks

Version:

Kuaishou Mini Program SDK for Miku Delivery

91 lines (90 loc) 4.39 kB
/** * @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; }); }