File size: 2,739 Bytes
497686c |
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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
const fs = require('fs')
const path = require('path')
const logger = require('./logger')
const ADDON_DIRECTORIES = [
path.join(process.cwd(), '.local', 'ext'),
path.join(process.cwd(), '.local', 'extensions')
]
class RuntimeAddonBus {
constructor() {
this._handlers = new Map()
this._initialized = false
}
register(eventId, handler) {
if (!eventId || typeof handler !== 'function') {
return
}
if (!this._handlers.has(eventId)) {
this._handlers.set(eventId, [])
}
this._handlers.get(eventId).push(handler)
}
emitSync(eventId, payload) {
this._ensureInitialized()
if (!eventId) {
return payload
}
const handlers = this._handlers.get(eventId)
if (!handlers || handlers.length === 0) {
return payload
}
let current = payload
for (const handler of handlers) {
try {
const result = handler(current)
if (typeof result !== 'undefined') {
current = result
}
} catch (error) {
this._log('warn', `本地扩展处理 ${eventId} 失败: ${error.message}`, error)
}
}
return current
}
_ensureInitialized() {
if (this._initialized) {
return
}
this._initialized = true
const loadedPaths = new Set()
for (const dir of ADDON_DIRECTORIES) {
if (!dir || !fs.existsSync(dir)) {
continue
}
let entries = []
try {
entries = fs.readdirSync(dir, { withFileTypes: true })
} catch (error) {
this._log('warn', `读取本地扩展目录 ${dir} 失败: ${error.message}`, error)
continue
}
for (const entry of entries) {
if (!entry.isFile()) {
continue
}
if (!entry.name.endsWith('.js')) {
continue
}
const targetPath = path.join(dir, entry.name)
if (loadedPaths.has(targetPath)) {
continue
}
loadedPaths.add(targetPath)
try {
const registrar = require(targetPath)
if (typeof registrar === 'function') {
registrar(this)
}
} catch (error) {
this._log('warn', `加载本地扩展 ${entry.name} 失败: ${error.message}`, error)
}
}
}
}
_log(level, message, error) {
const targetLevel = typeof level === 'string' ? level : 'info'
const loggerMethod =
logger && typeof logger[targetLevel] === 'function' ? logger[targetLevel].bind(logger) : null
if (loggerMethod) {
loggerMethod(message, error)
} else if (targetLevel === 'error') {
console.error(message, error)
} else {
console.log(message, error)
}
}
}
module.exports = new RuntimeAddonBus()
|