2015-11-28 03:49:24 +08:00
|
|
|
import _ from 'underscore';
|
|
|
|
import {Listener, Publisher} from './flux/modules/reflux-coffee';
|
|
|
|
import {includeModule} from './flux/coffee-helpers';
|
2015-12-31 00:36:47 +08:00
|
|
|
import composerExtAdapter from './extensions/composer-extension-adapter';
|
|
|
|
import messageViewExtAdapter from './extensions/message-view-extension-adapter';
|
2015-11-28 03:49:24 +08:00
|
|
|
|
|
|
|
export class Registry {
|
|
|
|
|
|
|
|
static include = includeModule;
|
|
|
|
|
|
|
|
constructor(name, deprecationAdapter = (ext)=> ext) {
|
|
|
|
this.name = name;
|
|
|
|
this._deprecationAdapter = deprecationAdapter;
|
|
|
|
this._registry = new Map();
|
|
|
|
}
|
|
|
|
|
|
|
|
register(extension) {
|
|
|
|
this.validateExtension(extension, 'register');
|
|
|
|
this._registry.set(extension.name, this._deprecationAdapter(extension));
|
|
|
|
this.triggerDebounced();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
unregister(extension) {
|
|
|
|
this.validateExtension(extension, 'unregister');
|
|
|
|
this._registry.delete(extension.name);
|
|
|
|
this.triggerDebounced();
|
|
|
|
}
|
|
|
|
|
|
|
|
extensions() {
|
|
|
|
return Array.from(this._registry.values());
|
|
|
|
}
|
|
|
|
|
|
|
|
clear() {
|
|
|
|
this._registry = new Map();
|
|
|
|
}
|
|
|
|
|
|
|
|
triggerDebounced() {
|
|
|
|
_.debounce(()=> this.trigger(), 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
validateExtension(extension, method) {
|
|
|
|
if (!extension || Array.isArray(extension) || !_.isObject(extension)) {
|
|
|
|
throw new Error(`ExtensionRegistry.${this.name}.${method} requires a valid \\
|
|
|
|
extension object that implements one of the functions defined by ${this.name}Extension`);
|
|
|
|
}
|
|
|
|
if (!extension.name) {
|
|
|
|
throw new Error(`ExtensionRegistry.${this.name}.${method} requires a \\
|
|
|
|
\`name\` property defined on the extension object`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Registry.include(Publisher);
|
|
|
|
Registry.include(Listener);
|
|
|
|
|
|
|
|
export const Composer = new Registry(
|
|
|
|
'Composer',
|
2015-12-31 00:36:47 +08:00
|
|
|
composerExtAdapter
|
2015-11-28 03:49:24 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
export const MessageView = new Registry(
|
|
|
|
'MessageView',
|
2015-12-31 00:36:47 +08:00
|
|
|
messageViewExtAdapter
|
2015-11-28 03:49:24 +08:00
|
|
|
);
|