UNPKG

@microsoft/teams.apps

Version:

<p> <a href="https://www.npmjs.com/package/@microsoft/teams.apps" target="_blank"> <img src="https://img.shields.io/npm/v/@microsoft/teams.apps/latest" /> </a> <a href="https://www.npmjs.com/package/@microsoft/teams.apps?activeTab=code

168 lines • 11.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PluginManager = void 0; exports.getMetadata = getMetadata; const events_1 = require("./events"); const dependency_1 = require("./types/plugin/decorators/dependency"); const event_1 = require("./types/plugin/decorators/event"); const plugin_1 = require("./types/plugin/decorators/plugin"); // // PLUGIN HELPERS // function getMetadata(plugin) { if (!Reflect.hasMetadata(plugin_1.PLUGIN_METADATA_KEY, plugin.constructor)) { throw new Error(`type "${plugin.constructor.name}" is not a valid plugin`); } const metadata = Reflect.getMetadata(plugin_1.PLUGIN_METADATA_KEY, plugin.constructor); const dependencies = Reflect.getMetadata(dependency_1.PLUGIN_DEPENDENCIES_METADATA_KEY, plugin.constructor) || []; const events = Reflect.getMetadata(event_1.PLUGIN_EVENTS_METADATA_KEY, plugin.constructor) || []; return { ...metadata, dependencies, events, }; } /** * Owns every plugin concern that used to be scattered across {@link App}: * the plugin registry, duplicate-name validation, container registration, * dependency/event injection, and the `onInit`/`onStart`/`onStop` lifecycle. * * `App` constructs a `PluginManager`, shares its {@link PluginManager.plugins} * array with the other collaborators (e.g. `EventManager`, `ActivityProcessor`), * and delegates lifecycle to it from `initialize`/`start`/`stop`. */ class PluginManager { _plugins = []; container; log; handlers; constructor(options) { this.container = options.container; this.log = options.log; this.handlers = options.handlers; } /** * the registered plugins. Returned as the live array so collaborators that * capture it (e.g. {@link EventManager}) observe plugins added later. */ get plugins() { return this._plugins; } /** * find the `http` plugin in a raw plugins list, if present. Used during app * construction to support the deprecated `plugins: [new HttpPlugin()]` path. */ static findHttpPlugin(plugins) { return plugins.find((plugin) => getMetadata(plugin).name === 'http'); } /** * register a plugin and make it injectable via the container * @param plugin plugin to add */ add(plugin) { const { name } = getMetadata(plugin); if (this.get(name)) { throw new Error(`duplicate plugin "${name}" found`); } this._plugins.push(plugin); this.container.register(name, { useValue: plugin }); if (plugin.constructor.name !== name) { this.container.register(plugin.constructor.name, { useValue: plugin }); } } /** * get a registered plugin by name */ get(name) { return this._plugins.find((plugin) => getMetadata(plugin).name === name); } /** * initialize every plugin: inject its dependencies/events then call `onInit` */ async init() { for (const plugin of this._plugins) { this.inject(plugin); if (plugin.onInit) { await plugin.onInit(); } } } /** * start every plugin via `onStart` */ async start(event) { for (const plugin of this._plugins) { if (plugin.onStart) { await plugin.onStart(event); } } } /** * stop every plugin via `onStop` */ async stop() { for (const plugin of this._plugins) { if (plugin.onStop) { await plugin.onStop(); } } } /** * inject fields/events into a plugin */ inject(plugin) { const { name, dependencies, events } = getMetadata(plugin); // inject dependencies for (const { key, type, optional } of dependencies) { let dependency = this.container.resolve(type); if (!dependency) { dependency = this.container.resolve(key); } if (!dependency) { if (optional) continue; throw new Error(`dependency "${type}" of property "${key}" not found, but plugin "${name}" depends on it`); } if (type === 'ILogger') { dependency = dependency.child(name); } Object.defineProperty(plugin, key, { value: dependency, writable: true, enumerable: false, configurable: false, }); } // inject event handlers for (const { key, name: eventName } of events) { let handler = (..._) => { }; if (eventName === 'error') { handler = (event) => { this.handlers.onError(event); }; } else if (eventName === 'activity') { handler = (event) => { return this.handlers.onActivity(event); }; } else if (eventName === 'custom') { handler = (customName, event) => { if (events_1.allIEventKeys.includes(customName)) { this.log.warn(`event "${customName}" is reserved by core app-events but an plugin is trying to emit it`); return; } this.handlers.emit(customName, event); }; } Object.defineProperty(plugin, key, { value: handler, writable: false, enumerable: false, configurable: false, }); } } } exports.PluginManager = PluginManager; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXBwLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBcUJBLGtDQWdCQztBQWxDRCxxQ0FBa0U7QUFPbEUscUVBRzhDO0FBQzlDLDJEQUE0RjtBQUM1Riw2REFBc0Y7QUFFdEYsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQixFQUFFO0FBRUYsU0FBZ0IsV0FBVyxDQUFDLE1BQWU7SUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsNEJBQW1CLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBa0IsT0FBTyxDQUFDLFdBQVcsQ0FBQyw0QkFBbUIsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0YsTUFBTSxZQUFZLEdBQ2hCLE9BQU8sQ0FBQyxXQUFXLENBQUMsNkNBQWdDLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsRixNQUFNLE1BQU0sR0FDVixPQUFPLENBQUMsV0FBVyxDQUFDLGtDQUEwQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFNUUsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLFlBQVk7UUFDWixNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUF1QkQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxRQUFRLEdBQW1CLEVBQUUsQ0FBQztJQUM5QixTQUFTLENBQWE7SUFDdEIsR0FBRyxDQUFVO0lBQ2IsUUFBUSxDQUF5QjtJQUVsRCxZQUFZLE9BQThCO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJ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