refactor: 热重载

This commit is contained in:
手瓜一十雪
2024-11-25 15:16:12 +08:00
parent 74a316e758
commit 01d11d6213
3 changed files with 23 additions and 51 deletions

View File

@@ -176,67 +176,33 @@ export class NapCatOneBot11Adapter {
};
}
private async reloadNetwork(prev: OneBotConfig, now: OneBotConfig) {
private async reloadNetwork(prev: OneBotConfig, now: OneBotConfig): Promise<void> {
const prevLog = await this.creatOneBotLog(prev);
const newLog = await this.creatOneBotLog(now);
this.context.logger.log(`[Notice] [OneBot11] 配置变更前:\n${prevLog}`);
this.context.logger.log(`[Notice] [OneBot11] 配置变更后:\n${newLog}`);
const { added: addedHttpServers, removed: removedHttpServers } = this.findDifference(prev.network.httpServers, now.network.httpServers);
const { added: addedHttpClients, removed: removedHttpClients } = this.findDifference(prev.network.httpClients, now.network.httpClients);
const { added: addedWebSocketServers, removed: removedWebSocketServers } = this.findDifference(prev.network.websocketServers, now.network.websocketServers);
const { added: addedWebSocketClients, removed: removedWebSocketClients } = this.findDifference(prev.network.websocketClients, now.network.websocketClients);
await this.handleRemovedAdapters(removedHttpServers);
await this.handleRemovedAdapters(removedHttpClients);
await this.handleRemovedAdapters(removedWebSocketServers);
await this.handleRemovedAdapters(removedWebSocketClients);
await this.handlerConfigChange(now.network.httpServers);
await this.handlerConfigChange(now.network.httpClients);
await this.handlerConfigChange(now.network.websocketServers);
await this.handlerConfigChange(now.network.websocketClients);
await this.handleAddedAdapters(addedHttpServers, OB11PassiveHttpAdapter);
await this.handleAddedAdapters(addedHttpClients, OB11ActiveHttpAdapter);
await this.handleAddedAdapters(addedWebSocketServers, OB11PassiveWebSocketAdapter);
await this.handleAddedAdapters(addedWebSocketClients, OB11ActiveWebSocketAdapter);
await this.handleConfigChange(now.network.httpServers, OB11PassiveHttpAdapter);
await this.handleConfigChange(now.network.httpClients, OB11ActiveHttpAdapter);
await this.handleConfigChange(now.network.websocketServers, OB11PassiveWebSocketAdapter);
await this.handleConfigChange(now.network.websocketClients, OB11ActiveWebSocketAdapter);
}
private async handlerConfigChange(adapters: Array<NetworkConfigAdapter>) {
private async handleConfigChange(adapters: NetworkConfigAdapter[], adapterClass: new (...args: any[]) => IOB11NetworkAdapter): Promise<void> {
for (const adapterConfig of adapters) {
const existingAdapter = this.networkManager.findSomeAdapter(adapterConfig.name);
if (existingAdapter) {
const networkChange = await existingAdapter.reload(adapterConfig);
if (networkChange === OB11NetworkReloadType.NetWorkClose) {
this.networkManager.closeSomeAdapters([existingAdapter]);
await this.networkManager.closeSomeAdaterWhenOpen([existingAdapter]);
}
} else {
const newAdapter = new adapterClass(adapterConfig.name, adapterConfig, this.core, this.actions);
await this.networkManager.registerAdapterAndOpen(newAdapter);
}
}
}
private async handleRemovedAdapters(adapters: Array<{ name: string }>): Promise<void> {
for (const adapter of adapters) {
await this.networkManager.closeAdapterByPredicate((existingAdapter) => existingAdapter.name === adapter.name);
}
}
private async handleAddedAdapters<T extends new (...args: any[]) => IOB11NetworkAdapter>(addedAdapters: Array<NetworkConfigAdapter>, AdapterClass: T) {
for (const adapter of addedAdapters) {
if (adapter.enable) {
const newAdapter = new AdapterClass(adapter.name, adapter, this.core, this.actions);
await newAdapter.open();
this.networkManager.registerAdapter(newAdapter);
}
}
}
private findDifference<T>(prev: T[], now: T[]): { added: T[]; removed: T[] } {
const added = now.filter((item) => !prev.includes(item));
const removed = prev.filter((item) => !now.includes(item));
return { added, removed };
}
private initMsgListener() {
const msgListener = new NodeIKernelMsgListener();
msgListener.onRecvSysMsg = (msg) => {

View File

@@ -68,6 +68,14 @@ export class OB11NetworkManager {
await adapter.close();
}
}
async closeSomeAdaterWhenOpen(adaptersToClose: IOB11NetworkAdapter[]) {
for (const adapter of adaptersToClose) {
this.adapters.delete(adapter.name);
if(adapter.isEnable){
await adapter.close();
}
}
}
findSomeAdapter(name: string) {
return this.adapters.get(name);

View File

@@ -31,13 +31,9 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter {
) {
this.config = structuredClone(config);
this.logger = core.context.logger;
if (this.config.host === '0.0.0.0') {
//兼容配置同时处理0.0.0.0逻辑
this.config.host = '';
}
this.wsServer = new WebSocketServer({
port: this.config.port,
host: this.config.host,
host: this.config.host === '0.0.0.0' ? '' : this.config.host,
maxPayload: 1024 * 1024 * 1024,
});
this.wsServer.on('connection', async (wsClient, wsReq) => {
@@ -202,11 +198,13 @@ export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter {
this.open();
return OB11NetworkReloadType.NetWorkOpen;
} else if (!newConfig.enable && wasEnabled) {
console.log(newConfig.enable, wasEnabled);
this.close();
return OB11NetworkReloadType.NetWorkClose;
}
if (oldPort !== newConfig.port || oldHost !== newConfig.host) {
console.log(oldPort, newConfig.port, oldHost, newConfig.host);
this.close();
this.wsServer = new WebSocketServer({
port: newConfig.port,