diff --git a/public/js/umami-share.js b/public/js/umami-share.js new file mode 100644 index 0000000..4e090c9 --- /dev/null +++ b/public/js/umami-share.js @@ -0,0 +1,47 @@ +(function (global) { + const cacheKey = 'umami-share-cache'; + const cacheTTL = 3600_000; // 1h + + async function fetchShareData(baseUrl, shareId) { + const cached = localStorage.getItem(cacheKey); + if (cached) { + try { + const parsed = JSON.parse(cached); + if (Date.now() - parsed.timestamp < cacheTTL) { + return parsed.value; + } + } catch { + localStorage.removeItem(cacheKey); + } + } + const res = await fetch(`${baseUrl}/api/share/${shareId}`); + if (!res.ok) { + throw new Error('获取 Umami 分享信息失败'); + } + const data = await res.json(); + localStorage.setItem(cacheKey, JSON.stringify({ timestamp: Date.now(), value: data })); + return data; + } + + /** + * 获取 Umami 分享数据(websiteId、token)。 + * 在缓存 TTL 内复用;并用全局 Promise 避免并发请求。 + * @param {string} baseUrl + * @param {string} shareId + * @returns {Promise<{websiteId: string, token: string}>} + */ + global.getUmamiShareData = function (baseUrl, shareId) { + if (!global.__umamiSharePromise) { + global.__umamiSharePromise = fetchShareData(baseUrl, shareId).catch((err) => { + delete global.__umamiSharePromise; + throw err; + }); + } + return global.__umamiSharePromise; + }; + + global.clearUmamiShareCache = function () { + localStorage.removeItem(cacheKey); + delete global.__umamiSharePromise; + }; +})(window); \ No newline at end of file