mirror of
https://github.com/Koenkk/zigbee2mqtt.git
synced 2026-07-02 10:01:37 +00:00
9907005256
* feat: Live loading of external JS (converters/extensions) * Fix imports * Improve error message on MQTT save * Handle non-existing base path * Throw on bad converter * Add tests * Fix use of ext conv in network map tests. * More coverage. * Dont mock zhc for basics, tests actual live loading * Update * feat: Live loading of external JS (converters/extensions) * Fix imports * Improve error message on MQTT save * Handle non-existing base path * Throw on bad converter * Add tests * Fix use of ext conv in network map tests. * More coverage. * Dont mock zhc for basics, tests actual live loading * Update * Fix rebase * Fix * Bump zhc * pretty * fix typing * Cleanup `external_converters` setting remnants. --------- Co-authored-by: Koen Kanters <koenkanters94@gmail.com>
60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
import type Extension from './extension';
|
|
|
|
import logger from '../util/logger';
|
|
import * as settings from '../util/settings';
|
|
import ExternalJSExtension from './externalJS';
|
|
|
|
type ModuleExports = typeof Extension;
|
|
|
|
export default class ExternalExtensions extends ExternalJSExtension<ModuleExports> {
|
|
constructor(
|
|
zigbee: Zigbee,
|
|
mqtt: MQTT,
|
|
state: State,
|
|
publishEntityState: PublishEntityState,
|
|
eventBus: EventBus,
|
|
enableDisableExtension: (enable: boolean, name: string) => Promise<void>,
|
|
restartCallback: () => Promise<void>,
|
|
addExtension: (extension: Extension) => Promise<void>,
|
|
) {
|
|
super(
|
|
zigbee,
|
|
mqtt,
|
|
state,
|
|
publishEntityState,
|
|
eventBus,
|
|
enableDisableExtension,
|
|
restartCallback,
|
|
addExtension,
|
|
'extension',
|
|
'external_extensions',
|
|
);
|
|
}
|
|
|
|
protected async removeJS(name: string, module: ModuleExports): Promise<void> {
|
|
await this.enableDisableExtension(false, module.name);
|
|
}
|
|
|
|
protected async loadJS(name: string, module: ModuleExports): Promise<void> {
|
|
// stop if already started
|
|
await this.enableDisableExtension(false, module.name);
|
|
await this.addExtension(
|
|
// @ts-expect-error `module` is the interface, not the actual passed class
|
|
new module(
|
|
this.zigbee,
|
|
this.mqtt,
|
|
this.state,
|
|
this.publishEntityState,
|
|
this.eventBus,
|
|
this.enableDisableExtension,
|
|
this.restartCallback,
|
|
this.addExtension,
|
|
settings,
|
|
logger,
|
|
),
|
|
);
|
|
|
|
logger.info(`Loaded external extension '${name}'.`);
|
|
}
|
|
}
|