// phone-sms/providers/registry.js - phone SMS provider registry (function attachPhoneSmsProviderRegistry(root, factory) { root.PhoneSmsProviderRegistry = factory(root); })(typeof self !== 'undefined' ? self : globalThis, function createPhoneSmsProviderRegistry(root) { const PROVIDER_HERO_SMS = 'hero-sms'; const PROVIDER_FIVE_SIM = '5sim'; const PROVIDER_NEXSMS = 'nexsms'; const DEFAULT_PROVIDER = PROVIDER_HERO_SMS; const DEFAULT_PROVIDER_ORDER = Object.freeze([ PROVIDER_HERO_SMS, PROVIDER_FIVE_SIM, PROVIDER_NEXSMS, ]); const PROVIDER_DEFINITIONS = Object.freeze({ [PROVIDER_HERO_SMS]: Object.freeze({ id: PROVIDER_HERO_SMS, label: 'HeroSMS', moduleKey: 'PhoneSmsHeroSmsProvider', }), [PROVIDER_FIVE_SIM]: Object.freeze({ id: PROVIDER_FIVE_SIM, label: '5sim', moduleKey: 'PhoneSmsFiveSimProvider', }), [PROVIDER_NEXSMS]: Object.freeze({ id: PROVIDER_NEXSMS, label: 'NexSMS', moduleKey: 'PhoneSmsNexSmsProvider', }), }); function resolveProviderKey(value = '') { if (value && typeof value === 'object' && !Array.isArray(value)) { return String(value.provider || value.id || value.value || '').trim().toLowerCase(); } return String(value || '').trim().toLowerCase(); } function isKnownProviderId(providerId = '') { return Boolean(PROVIDER_DEFINITIONS[providerId]); } function normalizeProviderId(value = '', fallback = DEFAULT_PROVIDER) { const normalized = resolveProviderKey(value); if (isKnownProviderId(normalized)) { return normalized; } const fallbackNormalized = resolveProviderKey(fallback); if (isKnownProviderId(fallbackNormalized)) { return fallbackNormalized; } return DEFAULT_PROVIDER; } function normalizeProviderOrder(value = [], fallbackOrder = DEFAULT_PROVIDER_ORDER) { const source = Array.isArray(value) ? value : String(value || '') .split(/[\r\n,,;;]+/) .map((entry) => String(entry || '').trim()) .filter(Boolean); const normalized = []; const seen = new Set(); const pushProvider = (entry) => { const provider = normalizeProviderId(entry, DEFAULT_PROVIDER); if (!provider || seen.has(provider)) { return; } seen.add(provider); normalized.push(provider); }; source.forEach((entry) => { pushProvider(entry && typeof entry === 'object' && !Array.isArray(entry) ? (entry.provider || entry.id || entry.value || '') : entry); }); if (normalized.length) { return normalized.slice(0, DEFAULT_PROVIDER_ORDER.length); } const fallback = Array.isArray(fallbackOrder) ? fallbackOrder : []; fallback.forEach((entry) => { pushProvider(entry && typeof entry === 'object' && !Array.isArray(entry) ? (entry.provider || entry.id || entry.value || '') : entry); }); return normalized.slice(0, DEFAULT_PROVIDER_ORDER.length); } function getProviderIds() { return DEFAULT_PROVIDER_ORDER.slice(); } function getProviderDefinition(providerId = DEFAULT_PROVIDER) { return PROVIDER_DEFINITIONS[normalizeProviderId(providerId)] || PROVIDER_DEFINITIONS[DEFAULT_PROVIDER]; } function getProviderModule(providerId = DEFAULT_PROVIDER) { const definition = getProviderDefinition(providerId); const moduleKey = definition?.moduleKey; if (!moduleKey) { return null; } return root?.[moduleKey] || null; } function createProvider(providerId = DEFAULT_PROVIDER, deps = {}) { const definition = getProviderDefinition(providerId); const module = getProviderModule(providerId); if (!module || typeof module.createProvider !== 'function') { throw new Error(`接码平台模块未加载:${definition.id}`); } return module.createProvider(deps); } function getProviderLabel(providerId = DEFAULT_PROVIDER) { return getProviderDefinition(providerId)?.label || 'HeroSMS'; } return { PROVIDER_HERO_SMS, PROVIDER_FIVE_SIM, PROVIDER_NEXSMS, DEFAULT_PROVIDER, DEFAULT_PROVIDER_ORDER, PROVIDER_DEFINITIONS, normalizeProviderId, normalizeProviderOrder, getProviderIds, getProviderDefinition, getProviderModule, createProvider, getProviderLabel, }; });