(function() { 'use strict'; // 防重复加载检查 if (window.hxChatPluginLoaded) { console.log('Chat plugin already loaded'); return; } window.hxChatPluginLoaded = true; // 获取插件代码(优先 runtime,其次从当前脚本 URL 参数读取) function getQueryParam(name) { try { var cs = document.currentScript; if (!cs || !cs.src) return null; var url = new URL(cs.src); return url.searchParams.get(name); } catch(e) { return null; } } var pluginCode = (window.__hxChat && window.__hxChat.pluginCode) || getQueryParam('pluginCode'); if (!pluginCode) { console.error('HX Chat: Plugin code not found'); return; } // 确定基础URL var currentScript = document.currentScript; var baseUrl = 'https://gateway.im30v.com'; if (currentScript && currentScript.src) { try { var scriptURL = new URL(currentScript.src); baseUrl = scriptURL.origin; } catch(e) { console.warn('Failed to detect base URL:', e); } } var resourceBaseUrl = baseUrl + '/static/plugins'; var apiBaseUrl = baseUrl + '/api/plugins'; // 资源清单:通用静态文件(所有插件共用) var staticManifest = { 'chunk-common.css': 'css/chunk-common.css', 'chunk-common.js': 'js/chunk-common.js' }; // 动态资源:插件特定的文件(使用预编译文件) var dynamicManifest = { 'plugin.css': apiBaseUrl + '/public/' + pluginCode + '/style.css', 'plugin.bundle.js': resourceBaseUrl + '/plugin.bundle.js' }; // 加载CSS文件(静态或动态) function loadCSS(href, isDynamic) { var id = 'hx-chat-' + (isDynamic ? href : href).replace(/[^a-z0-9]/gi, '-'); if (document.getElementById(id)) return; var link = document.createElement('link'); link.id = id; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = isDynamic ? href : (resourceBaseUrl + '/' + href); document.head.appendChild(link); } // 加载JS文件(静态或动态) function loadJS(src, callback, isDynamic) { var id = 'hx-chat-' + (isDynamic ? src : src).replace(/[^a-z0-9]/gi, '-'); if (document.getElementById(id)) { if (callback) callback(); return; } var script = document.createElement('script'); script.id = id; script.src = isDynamic ? src : (resourceBaseUrl + '/' + src); if (callback) { script.onload = callback; script.onerror = function() { console.error('Failed to load script:', src); }; } document.head.appendChild(script); } // 加载资源 function loadResources() { // 第一步:加载通用静态CSS Object.keys(staticManifest).forEach(function(key) { if (key.indexOf('.css') > -1) { loadCSS(staticManifest[key], false); } }); // 第二步:加载通用静态JS var staticJsFiles = []; Object.keys(staticManifest).forEach(function(key) { if (key.indexOf('.js') > -1) { staticJsFiles.push({ src: staticManifest[key], dynamic: false }); } }); // 第三步:加载动态生成的CSS(插件特定) Object.keys(dynamicManifest).forEach(function(key) { if (key.indexOf('.css') > -1) { loadCSS(dynamicManifest[key], true); } }); // 第四步:加载预编译的 bundle 文件 var dynamicJsFiles = []; if (dynamicManifest['plugin.bundle.js']) { dynamicJsFiles.push({ src: dynamicManifest['plugin.bundle.js'], dynamic: true }); } var allJsFiles = staticJsFiles.concat(dynamicJsFiles); // 顺序加载JS文件 function loadNext(index) { if (index >= allJsFiles.length) { // 所有资源加载完成,初始化插件 initializePlugin(); return; } var file = allJsFiles[index]; loadJS(file.src, function() { loadNext(index + 1); }, file.dynamic); } loadNext(0); } // 初始化插件 function initializePlugin() { // 获取配置并初始化 fetch(apiBaseUrl + '/config?pluginCode=' + pluginCode) .then(function(response) { return response.json(); }) .then(function(result) { // 兼容 ApiResult 格式:{ code: 200, data: {...} } 或 { success: true, data: {...} } var isSuccess = (result.success === true) || (result.code === 200); if (isSuccess && result.data) { // 检查插件初始化函数是否存在 if (typeof window.HxChatPlugin !== 'undefined' && typeof window.HxChatPlugin.init === 'function') { window.HxChatPlugin.init({ pluginCode: pluginCode, gatewayUrl: baseUrl, imServiceUrl: 'http://127.0.0.1:5003' }); } else if (typeof window.hxChatPluginInit === 'function') { // 兼容旧版本 window.hxChatPluginInit({ pluginCode: pluginCode, gatewayUrl: baseUrl, imServiceUrl: 'http://127.0.0.1:5003' }); } else { console.error('HX Chat: Plugin initialization function not found'); } } else { console.error('HX Chat: Failed to load plugin config:', result.message); } }) .catch(function(error) { console.error('HX Chat: Failed to fetch plugin config:', error); }); } // 页面加载完成后加载资源 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', loadResources); } else { loadResources(); } })();