id-scanner-lib
Version:
Browser-based ID card, QR code, and face recognition scanner with liveness detection
237 lines (199 loc) • 6.02 kB
text/typescript
/**
* @file 扫描器工厂
* @description 提供统一的组件创建和访问接口
* @module core/scanner-factory
*/
import { ConfigManager } from './config';
import { Logger } from './logger';
import { ResourceManager } from './resource-manager';
import { EventEmitter } from './event-emitter';
import { InitializationError } from './errors';
import { VERSION } from '../version';
/**
* 扫描器初始化选项
*/
export interface ScannerFactoryOptions {
/** 配置选项 */
config?: Record<string, any>;
/** 资源基础路径 */
resourceBasePath?: string;
/** 调试模式 */
debug?: boolean;
/** 自动初始化模块 */
autoInitModules?: boolean;
}
/**
* 扫描器工厂
* 作为整个库的核心入口点,管理组件生命周期并提供统一接口
*/
export class ScannerFactory extends EventEmitter {
/** 单例实例 */
private static instance: ScannerFactory;
/** 配置管理器 */
private readonly config: ConfigManager;
/** 日志记录器 */
private readonly logger: Logger;
/** 资源管理器 */
private readonly resources: ResourceManager;
/** 是否已初始化 */
private initialized: boolean = false;
/** 初始化锁,防止多次调用 */
private initializing: boolean = false;
/**
* 私有构造函数
*/
private constructor() {
super();
this.config = ConfigManager.getInstance();
this.logger = Logger.getInstance();
this.resources = ResourceManager.getInstance();
}
/**
* 获取单例实例
*/
public static getInstance(): ScannerFactory {
if (!ScannerFactory.instance) {
ScannerFactory.instance = new ScannerFactory();
}
return ScannerFactory.instance;
}
/**
* 初始化扫描器工厂
* @param options 初始化选项
*/
async initialize(options: ScannerFactoryOptions = {}): Promise<boolean> {
// 防止重复初始化
if (this.initialized) {
this.logger.warn('ScannerFactory', 'Already initialized');
return true;
}
if (this.initializing) {
this.logger.warn('ScannerFactory', 'Initialization already in progress');
return false;
}
this.initializing = true;
try {
const {
config = {},
resourceBasePath = '',
debug = false,
autoInitModules = true
} = options;
// 应用配置
if (debug) {
config.debug = true;
}
this.config.updateConfig(config);
// 设置资源基础路径
if (resourceBasePath) {
this.resources.setBasePath(resourceBasePath);
}
// 记录初始化日志
this.logger.info('ScannerFactory', `Initializing ID Scanner Library v${VERSION}`);
// 如果启用了自动初始化模块,则加载相应模块
if (autoInitModules) {
await this.initEnabledModules();
}
this.initialized = true;
this.initializing = false;
this.emit('initialized', { success: true });
this.logger.info('ScannerFactory', 'ID Scanner Library initialized successfully');
return true;
} catch (error) {
this.initializing = false;
const errorMessage = error instanceof Error ? error.message : String(error);
this.logger.error('ScannerFactory', `Initialization failed: ${errorMessage}`, error instanceof Error ? error : new Error(errorMessage));
this.emit('initialized', { success: false, error });
throw new InitializationError(
'扫描器初始化失败',
errorMessage
);
}
}
/**
* 初始化已启用的模块
*/
private async initEnabledModules(): Promise<void> {
const enabledModules = [];
// 检查每个模块的启用状态
if (this.config.get('modules.face.enabled', false)) {
enabledModules.push(this.initFaceModule());
}
if (this.config.get('modules.qr.enabled', false)) {
enabledModules.push(this.initQRModule());
}
if (this.config.get('modules.idcard.enabled', false)) {
enabledModules.push(this.initIDCardModule());
}
if (this.config.get('modules.ocr.enabled', false)) {
enabledModules.push(this.initOCRModule());
}
// 并行初始化所有启用的模块
if (enabledModules.length > 0) {
await Promise.all(enabledModules);
}
}
/**
* 初始化人脸识别模块
*/
private async initFaceModule(): Promise<void> {
this.logger.info('ScannerFactory', 'Initializing Face module');
// 实际初始化代码将在模块实现中完成
}
/**
* 初始化二维码扫描模块
*/
private async initQRModule(): Promise<void> {
this.logger.info('ScannerFactory', 'Initializing QR Code module');
// 实际初始化代码将在模块实现中完成
}
/**
* 初始化身份证扫描模块
*/
private async initIDCardModule(): Promise<void> {
this.logger.info('ScannerFactory', 'Initializing ID Card module');
// 实际初始化代码将在模块实现中完成
}
/**
* 初始化OCR模块
*/
private async initOCRModule(): Promise<void> {
this.logger.info('ScannerFactory', 'Initializing OCR module');
// 实际初始化代码将在模块实现中完成
}
/**
* 销毁实例,释放资源
*/
destroy(): void {
if (!this.initialized) return;
this.logger.info('ScannerFactory', 'Destroying ID Scanner Library');
// 释放所有资源
this.resources.releaseAll();
this.initialized = false;
this.emit('destroyed');
}
/**
* 获取配置管理器
*/
getConfig(): ConfigManager {
return this.config;
}
/**
* 获取日志记录器
*/
getLogger(): Logger {
return this.logger;
}
/**
* 获取资源管理器
*/
getResources(): ResourceManager {
return this.resources;
}
/**
* 检查是否已初始化
*/
isInitialized(): boolean {
return this.initialized;
}
}