/** * * Agora Real Time Engagement * Created by Wei Hu in 2021-09. * Copyright (c) 2022 Agora IO. All rights reserved. * */ import * as log from '../common/logger'; import { Extension } from '../extension/extension'; import { MetadataInfo } from '../metadata/metadata'; import { RTE } from '../rte/rte'; import rte_addon from '../rte_addon'; export abstract class ExtensionGroup { constructor(name: string) { this.name = name; rte_addon.rte_nodejs_extension_group_create(this, name); } static onInit: | undefined | (( rte: RTE, manifest: MetadataInfo, property: MetadataInfo ) => Promise) = undefined; static createInstance(name: string): ExtensionGroup { if (this === ExtensionGroup) { throw new Error( `'createInstance' method must be implemented in derived classes, \ check instance ${name}!`, ); } return new (this as any)(name); } // eslint-disable-next-line @typescript-eslint/no-empty-function static destroyInstance(_extensionGroup: ExtensionGroup): void {} private async _onInit( rte: RTE, manifest: MetadataInfo, property: MetadataInfo, ): Promise { try { await this.onInit(rte, manifest, property); } catch (e) { log.error( `ExtensionGroup '${this.name}' onInit throws an exception: ${e}`, ); } finally { // Notify RTE runtime that extension_group::onInit is completed. rte_addon.rte_nodejs_rte_on_init_done(rte, manifest, property); } } async onInit( _rte: RTE, _manifest: MetadataInfo, _property: MetadataInfo, ): Promise { // stub for override } private async _onDeinit(rte: RTE): Promise { try { await this.onDeinit(rte); } catch (e) { log.error( `ExtensionGroup '${this.name}' onDeinit throws an exception: ${e}`, ); } finally { // Notify RTE runtime that extension_group::onDeinit is completed. rte_addon.rte_nodejs_rte_on_deinit_done(rte); rte_addon.rte_nodejs_extension_group_deinit(this); } } async onDeinit(_rte: RTE): Promise { // stub for override } private async _onCreateExtension(rte: RTE): Promise { let result: Extension[] = []; try { result = await this.onCreateExtension(rte); } catch (e) { log.error( `ExtensionGroup '${this.name}' onCreateExtension throws an exception: \ ${e}`, ); } finally { // Notify RTE runtime that extension::onCreateExtension is completed. rte_addon.rte_nodejs_rte_on_create_extension_done(rte, result); } } abstract onCreateExtension(_rte: RTE): Promise | Extension[]; private async _onDeleteExtension( rte: RTE, extensions: (Extension | null)[], ): Promise { try { await this.onDeleteExtension(rte, extensions); } catch (e) { log.error( `ExtensionGroup '${this.name}' onDeleteExtension throws \ an exception: ${e}`, ); } finally { // Notify RTE runtime that extension::onDeleteExtension is completed. rte_addon.rte_nodejs_rte_on_delete_extension_done(rte); } } abstract onDeleteExtension( rte: RTE, _extensions: (Extension | null)[] ): Promise | void; name: string; addonFolder: string | undefined; }