Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | import type { Certificate } from '@https-enable/mkcert' import type { Prettify } from '@https-enable/types' import type { HttpsEnablerEvents } from './emitter' import type { HttpsAdapter } from './https-adapter' import type { AppType, CertificateManagerOptions, MiddlewareType, ServerOptions } from './type' import { EventEmitter } from 'node:events' import { CertificateManager } from './certificate-manager' import logger from './logger' export class HttpsEnabler< App extends AppType, Middleware = MiddlewareType, > extends EventEmitter<HttpsEnablerEvents> { public adapter: HttpsAdapter<App, Middleware> protected options: Prettify<ServerOptions & { /** * http 301 重定向至 https */ redirect?: boolean }> protected certificateOptions: CertificateManagerOptions protected certManager: CertificateManager constructor(config: { adapter: typeof HttpsEnabler.prototype.adapter options: typeof HttpsEnabler.prototype.options certificateOptions: typeof HttpsEnabler.prototype.certificateOptions }) { super() this.adapter = config.adapter if (!this.adapter) { throw logger.error('Must provide the adapter') } if ( (!this.adapter.app && (!this.adapter.init || typeof this.adapter.init !== 'function')) || typeof this.adapter.createServer !== 'function' ) { throw logger.error('The adapter is invalid') } this.options = config.options this.certificateOptions = config.certificateOptions this.certManager = new CertificateManager(this.certificateOptions) // 证书更新监听 this.certManager.on('cert-renewed', async (newCert) => { this.emit('cert-renewed', newCert) // 通知适配器证书更新(如热重载) await this.adapter.serverInstance?.refresh(newCert) this.adapter.onCertRenewed?.(newCert) }) } public async init() { // 初始化证书 await this.certManager.initialize().catch(err => this.emit('error', err)) } /** * 生成框架特定的中间件 */ public middleware() { return this.adapter.createMiddleware?.(this.options) } public refresh(options: Certificate) { if (!this.adapter.serverInstance) return return this.adapter.serverInstance.refresh(options) } public kill() { if (!this.adapter.serverInstance) return return this.adapter.serverInstance.kill() } /** * 启动 HTTPS 服务 */ public async startServer(app?: App) { // 确保证书已就绪 await this.certManager.ensureValidCert() // 如果适配器有自定义服务启动逻辑,优先使用 if (typeof this.adapter.createServer === 'function' && this.certManager.currentCert) { const options = { ...this.options, ...this.certManager.currentCert } await this.adapter.createServer(options, app) return options } else { throw new TypeError('Unsupported framework: default server logic requires an app with listen()') } } } |