diff --git a/packages/common/src/sdk.ts b/packages/common/src/sdk.ts index 481060f..544dbc5 100644 --- a/packages/common/src/sdk.ts +++ b/packages/common/src/sdk.ts @@ -5,10 +5,14 @@ import { decryptConfigFile } from './configCrypto' let _initPromise: Promise | null = null let _initResolve: (() => void) | null = null +let _initReject: ((e: unknown) => void) | null = null function ensureInitPromise(): Promise { if (!_initPromise) { - _initPromise = new Promise((resolve) => { _initResolve = resolve }) + _initPromise = new Promise((resolve, reject) => { + _initResolve = resolve + _initReject = reject + }) } return _initPromise } @@ -17,9 +21,19 @@ function markInitialized(): void { if (_initResolve) { _initResolve() _initResolve = null + _initReject = null } } +function markInitializationFailed(e: unknown): void { + const reject = _initReject + // Reset so a retry can call initialize() again + _initPromise = null + _initResolve = null + _initReject = null + reject?.(e) +} + export const XuqmSDK = { /** * @param options.appKey - Your application key (from the tenant platform) @@ -27,6 +41,7 @@ export const XuqmSDK = { */ async initialize(options: XuqmInitOptions): Promise { if (isInitialized()) return + ensureInitPromise() const configUrl = `${DEFAULT_TENANT_PLATFORM_URL}/api/sdk/config?appKey=${options.appKey}` try { const res = await fetch(configUrl) @@ -41,20 +56,11 @@ export const XuqmSDK = { baseUrl: remote.imApiUrl ?? DEFAULT_TENANT_PLATFORM_URL, debug: options.debug, }) + markInitialized() } catch (e) { - // Fallback: construct URLs from the built-in platform endpoint - initConfigFromRemote(options, { - imWsUrl: DEFAULT_IM_WS_URL, - fileServiceUrl: DEFAULT_TENANT_PLATFORM_URL, - apiUrl: DEFAULT_TENANT_PLATFORM_URL, - }) - configureHttp({ - baseUrl: DEFAULT_TENANT_PLATFORM_URL, - debug: options.debug, - }) - if (options.debug) console.warn('[XuqmSDK] Config fetch failed, using fallback URLs', e) + markInitializationFailed(e) + throw e } - markInitialized() }, /**