UNPKG

webgme-engine

Version:

WebGME server and Client API without a GUI

262 lines (227 loc) 8.31 kB
/*globals define*/ /*eslint-env node*/ /** * This is the base class that add-ons should inherit from. * (Using the AddOnGenerator - the generated add-on will do that.) * @author pmeijer / https://github.com/pmeijer */ define([ 'addon/AddOnUpdateResult', 'common/storage/constants' ], function (AddOnUpdateResult, STORAGE_CONSTANTS) { 'use strict'; /** * BaseClass for AddOns which run on the server and act upon changes in a branch. * Use the AddOnGenerator to generate a new AddOn that implements this class. * @param {GmeLogger} logger * @param {GmeConfig} gmeConfig * @constructor * @alias AddOnBase */ function AddOnBase(logger, gmeConfig) { /** * @type {GmeConfig} */ this.gmeConfig = gmeConfig; /** * @type {GmeLogger} */ this.logger = logger; // Set at configure /** * @type {Core} */ this.core = null; /** * @type {Project} */ this.project = null; /** * @type {string} */ this.branchName = null; /** * @type {BlobClient} */ this.blobClient = null; this.initialized = false; /** * @type {AddOnUpdateResult} */ this.updateResult = null; this.currentlyWorking = false; this.lifespan = 0; this.logger.debug('ctor'); } /** * Configures the AddOn * @param {object} configuration * @param {function} callback */ AddOnBase.prototype.configure = function (configuration) { this.core = configuration.core; this.project = configuration.project; this.branchName = configuration.branchName; this.blobClient = configuration.blobClient; this.projectId = this.project.projectId; }; /** * Readable name of this AddOn that can contain spaces. * @returns {string} */ AddOnBase.prototype.getName = function () { throw new Error('implement this function in the derived class - getting type automatically is a bad idea,' + 'when the js scripts are minified names are useless.'); }; /** * Current version of this AddOn using semantic versioning. * @returns {string} */ AddOnBase.prototype.getVersion = function () { return '0.1.0'; }; /** * A detailed description of this AddOn and its purpose. It can be one or more sentences. * @returns {string} */ AddOnBase.prototype.getDescription = function () { return ''; }; /** * This is invoked after each commit to the branch. AddOns are allowed to make changes on updates, * but should not persist by themselves. The manager/monitor will persist after each AddOn has had its * way (ordered by the "usedAddOn" registry in the rootNode). * * Changes made by AddOns do not trigger a new update for other addOns. * @param {module:Core~Node} rootNode * @param {module:Storage~CommitObject} commitObj * @param {function(Error, AddOnUpdateResult)} callback */ AddOnBase.prototype.update = function (rootNode, commitObj, callback) { callback(new Error('The function is the main function of the addOn so it must be overwritten.')); }; /** * Called once when the AddOn is started for the first time. * @param {object} rootNode * @param {object} commitObj * @param {function(Error, AddOnUpdateResult)} callback */ AddOnBase.prototype.initialize = function (rootNode, commitObj, callback) { callback(new Error('The function is the main function of the addOn so it must be overwritten.')); }; /** * Called by the manager/monitor after each commit to the branch. * @param {object} rootNode * @param {object} commitObj * @param {function(Error, AddOnUpdateResult)} callback * @private */ AddOnBase.prototype._update = function (rootNode, commitObj, callback) { var self = this; this.updateResult = new AddOnUpdateResult(commitObj); this.currentlyWorking = true; this.lifespan += 1; this.update(rootNode, commitObj, function (err, result) { self.currentlyWorking = false; callback(err, result); }); }; /** * Called once by the manager/monitor when the AddOn is first started. * @param {object} rootNode * @param {object} commitObj * @param {function(Error, AddOnUpdateResult)} callback * @private */ AddOnBase.prototype._initialize = function (rootNode, commitObj, callback) { var self = this; this.initialized = true; this.updateResult = new AddOnUpdateResult(commitObj); this.currentlyWorking = true; this.initialize(rootNode, commitObj, function (err, result) { self.currentlyWorking = false; callback(err, result); }); }; /** * Creats or appends commit message for the current update-cycle. * @param {string} msg */ AddOnBase.prototype.addCommitMessage = function (msg) { this.updateResult.addCommitMessage(this, msg); }; /** * Adds a notification to all sockets connected to the branch room. The notification will be sent after * the update-callback has been invoked. * @param {string|object} message - Message string or object containing message. * @param {string} message.message - If object it must contain a message. * @param {string} [message.severity='info'] - Severity level ('success', 'info', 'warn', 'error') */ AddOnBase.prototype.addNotification = function (message) { var self = this, data = { type: STORAGE_CONSTANTS.ADD_ON_NOTIFICATION, notification: typeof message === 'string' ? {message: message} : message, projectId: self.projectId, branchName: self.branchName, commitHash: self.updateResult.commitObj._id, addOnName: self.getName(), addOnVersion: self.getVersion() }; self.updateResult.addNotification(self, data); }; // TODO: Query related /** * Structure of query parameters with names, descriptions, minimum, maximum values, default values and * type definitions. * @returns {object[]} */ AddOnBase.prototype.getQueryParamsStructure = function () { return []; }; /** * Queries are typically invoked by users from a client. The AddOn is not suppose to make any changes to * either the model's or the AddOn's state. (Since users can share a running instance of an AddOn). * @param {string} commitHash - State of the invoker. * @param {object} queryParams - Values based on the 'getQueryParametersStructure'. * @param {function} callback - resolves with PluginResult. */ AddOnBase.prototype.query = function (commitHash, queryParams, callback) { callback(new Error('The function is the main function of the addOn so it must be overwritten.')); }; AddOnBase.prototype._getStatus = function () { var status = this.getStatus(); status.currentlyWorking = this.currentlyWorking; status.lifespan = this.lifespan; return status; }; AddOnBase.prototype.getStatus = function () { return {}; }; /** * Overwrite this if you are sending requests to the webgme server. * Make sure to still update the blob-clients token. * * @param token */ AddOnBase.prototype.setToken = function (token) { if (this.blobClient) { this.blobClient.setToken(token); } }; /** * Returns the default values of the Query Parameters. * * @returns {object} */ AddOnBase.prototype.getDefaultQueryParams = function () { var paramStructure = this.getQueryParametersStructure(), defaultParams = {}, i; for (i = 0; i < paramStructure.length; i += 1) { defaultParams[paramStructure[i].name] = paramStructure[i].value; } return defaultParams; }; return AddOnBase; });