hyapp-h5/common/api.js
2026-05-25 22:45:15 +08:00

180 lines
5.8 KiB
JavaScript

var test_api = "https://api-test.global-interaction.com/";
var local_api = "http://localhost:13000/";
var default_api = "https://api.global-interaction.com/";
(function () {
var API_ENV_KEY = "hyapp_h5_env";
var ACCESS_TOKEN_KEY = "hyapp_access_token";
var APP_CODE_KEY = "hyapp_app_code";
var memoryEnv = "";
var memoryAccessToken = "";
var memoryAppCode = "";
function readQuery(name) {
return new URLSearchParams(window.location.search).get(name);
}
function normalizeBaseURL(value) {
return String(value || "").replace(/\/+$/, "") + "/";
}
function isLocalDevOrigin() {
var host = window.location.hostname;
return host === "127.0.0.1" || host === "localhost" || host === "::1";
}
function shouldPersist() {
return !isLocalDevOrigin();
}
function clearLocalDevCache() {
if (shouldPersist()) return;
window.localStorage.removeItem(API_ENV_KEY);
window.localStorage.removeItem(ACCESS_TOKEN_KEY);
window.localStorage.removeItem(APP_CODE_KEY);
}
function devProxyBase(path) {
return normalizeBaseURL(window.location.origin + path);
}
function resolveEnv() {
var env = readQuery("env");
if (env === "test" || env === "local") {
memoryEnv = env;
if (shouldPersist()) window.localStorage.setItem(API_ENV_KEY, env);
return env;
}
if (memoryEnv) return memoryEnv;
if (!shouldPersist()) return "";
return window.localStorage.getItem(API_ENV_KEY) || "";
}
function resolveBaseURL() {
var env = resolveEnv();
if (env === "test") return isLocalDevOrigin() ? devProxyBase("/__api_test__/") : normalizeBaseURL(test_api);
if (env === "local") return isLocalDevOrigin() ? devProxyBase("/__api_local__/") : normalizeBaseURL(local_api);
return normalizeBaseURL(default_api);
}
function buildURL(path, query) {
var url = new URL(path.replace(/^\/+/, ""), resolveBaseURL());
if (query) {
Object.keys(query).forEach(function (key) {
var value = query[key];
if (value === undefined || value === null || value === "") return;
url.searchParams.set(key, value);
});
}
return url.toString();
}
function getAccessToken() {
if (memoryAccessToken) return memoryAccessToken;
if (!shouldPersist()) return "";
return window.localStorage.getItem(ACCESS_TOKEN_KEY) || "";
}
function getAppCode() {
var queryAppCode = readQuery("app_code") || readQuery("appCode");
if (queryAppCode) {
memoryAppCode = queryAppCode;
if (shouldPersist()) window.localStorage.setItem(APP_CODE_KEY, queryAppCode);
return queryAppCode;
}
if (memoryAppCode) return memoryAppCode;
if (!shouldPersist()) return "lalu";
return window.localStorage.getItem(APP_CODE_KEY) || "lalu";
}
function setAccessToken(token) {
memoryAccessToken = token || "";
if (token) {
if (shouldPersist()) window.localStorage.setItem(ACCESS_TOKEN_KEY, token);
return;
}
if (shouldPersist()) window.localStorage.removeItem(ACCESS_TOKEN_KEY);
}
function setAppCode(appCode) {
memoryAppCode = appCode || "";
if (appCode) {
if (shouldPersist()) window.localStorage.setItem(APP_CODE_KEY, appCode);
return;
}
if (shouldPersist()) window.localStorage.removeItem(APP_CODE_KEY);
}
function parseResponse(response) {
return response.text().then(function (text) {
var payload = text ? JSON.parse(text) : {};
if (!response.ok) {
var httpError = new Error(payload.message || response.statusText || "request_failed");
httpError.status = response.status;
httpError.payload = payload;
throw httpError;
}
var code = payload && payload.code;
var isErrorCode = (typeof code === "number" && code !== 0) || (typeof code === "string" && code !== "" && code !== "OK");
if (isErrorCode) {
var apiError = new Error(payload.message || "api_request_failed");
apiError.code = payload.code;
apiError.request_id = payload.request_id;
apiError.payload = payload;
throw apiError;
}
return payload && Object.prototype.hasOwnProperty.call(payload, "data") ? payload.data : payload;
});
}
function request(path, options) {
var opts = options || {};
var headers = Object.assign({}, opts.headers || {});
var token = getAccessToken();
var appCode = getAppCode();
if (token) headers.Authorization = "Bearer " + token;
if (appCode) headers["X-App-Code"] = appCode;
if (!shouldPersist()) headers["Cache-Control"] = "no-cache";
var body = opts.body;
if (body && typeof body === "object" && !(body instanceof FormData)) {
headers["Content-Type"] = headers["Content-Type"] || "application/json";
body = JSON.stringify(body);
}
return window.fetch(buildURL(path, opts.query), {
method: opts.method || "GET",
headers: headers,
body: body,
cache: shouldPersist() ? "default" : "no-store",
credentials: opts.credentials || "omit"
}).then(parseResponse);
}
window.HyAppAPI = {
baseURL: resolveBaseURL,
buildURL: buildURL,
getAccessToken: getAccessToken,
getAppCode: getAppCode,
setAccessToken: setAccessToken,
setAppCode: setAppCode,
request: request,
get: function (path, query) {
return request(path, { method: "GET", query: query });
},
post: function (path, body, query) {
return request(path, { method: "POST", body: body, query: query });
},
put: function (path, body, query) {
return request(path, { method: "PUT", body: body, query: query });
},
patch: function (path, body, query) {
return request(path, { method: "PATCH", body: body, query: query });
},
delete: function (path, query) {
return request(path, { method: "DELETE", query: query });
}
};
clearLocalDevCache();
})();