@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
JavaScript
;
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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