XuqmGroup-RNSDK/packages/common/src/sdk.ts

125 行
4.4 KiB
TypeScript

import { initConfigFromRemote, isInitialized, type XuqmInitOptions, type XuqmUserInfo, setUserInfo as setCommonUserInfo, getUserInfo as getCommonUserInfo, getUserId as getCommonUserId } from './config'
import { DEFAULT_TENANT_PLATFORM_URL } from './constants'
2026-05-08 09:27:38 +08:00
import { configureHttp } from './http'
import { decryptConfigFile } from './configCrypto'
let _initPromise: Promise<void> | null = null
let _initResolve: (() => void) | null = null
let _initReject: ((e: unknown) => void) | null = null
function ensureInitPromise(): Promise<void> {
if (!_initPromise) {
_initPromise = new Promise((resolve, reject) => {
_initResolve = resolve
_initReject = reject
})
}
return _initPromise
}
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 = {
/**
* B
*
* appKey IMPush URL
*
*
* @param options.appKey
* @param options.platformUrl 使
* @param options.debug
*/
async initialize(options: XuqmInitOptions): Promise<void> {
if (isInitialized()) return
ensureInitPromise()
const baseUrl = options.platformUrl ?? DEFAULT_TENANT_PLATFORM_URL
const configUrl = `${baseUrl}/api/sdk/config?appKey=${options.appKey}`
try {
const res = await fetch(configUrl)
if (!res.ok) throw new Error(`[XuqmSDK] Platform config request failed: ${res.status}`)
const json = await res.json() as Record<string, unknown>
const remote = (json.data ?? json) as Record<string, unknown>
initConfigFromRemote(options, {
apiUrl: remote.apiUrl as string | undefined,
imWsUrl: remote.imWsUrl as string | undefined,
fileServiceUrl: remote.fileServiceUrl as string | undefined,
licenseUrl: remote.licenseUrl as string | undefined,
imEnabled: remote.imEnabled as boolean | undefined,
pushEnabled: remote.pushEnabled as boolean | undefined,
licenseEnabled: remote.licenseEnabled as boolean | undefined,
bugCollectApiUrl: remote.bugCollectApiUrl as string | undefined,
bugCollectEnabled: remote.bugCollectEnabled as boolean | undefined,
})
2026-05-08 09:27:38 +08:00
configureHttp({
baseUrl: (remote.apiUrl as string | undefined) ?? baseUrl,
2026-05-08 09:27:38 +08:00
debug: options.debug,
})
markInitialized()
} catch (e) {
markInitializationFailed(e)
throw e
}
},
/**
* A SDK
*
* 宿 .xuqmconfig autoInit SDK initialize()
* index.ts export
*
* @param encryptedContent XUQM-CONFIG-V1 XUQM-LICENSE-V1
*/
async initWithConfigFile(encryptedContent: string, options?: { debug?: boolean }): Promise<void> {
if (isInitialized()) return
const file = await decryptConfigFile(encryptedContent)
// 配置文件解密后包含 appKey 和 platformUrl字段名 serverUrl 或 baseUrl
const platformUrl = file.serverUrl ?? file.baseUrl ?? undefined
await this.initialize({ appKey: file.appKey, platformUrl, debug: options?.debug })
},
/**
* SDK XuqmSDK
*/
async awaitInitialization(): Promise<void> {
if (isInitialized()) return
await ensureInitPromise()
},
getUserId(): string | null {
return getCommonUserId()
},
/**
* SDKPushIMLicense
* null SDK
*/
setUserInfo(info: XuqmUserInfo | null): void {
setCommonUserInfo(info)
},
getUserInfo(): XuqmUserInfo | null {
return getCommonUserInfo()
},
}
export async function awaitInitialization(): Promise<void> {
if (isInitialized()) return
await ensureInitPromise()
}