webgme-engine
Version:
WebGME server and Client API without a GUI
178 lines (139 loc) • 8.39 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: common/executor/ExecutorOutputQueue.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: common/executor/ExecutorOutputQueue.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/*globals define*/
/*eslint-env node*/
/**
* @author pmeijer / https://github.com/pmeijer
*/
define([], function () {
'use strict';
function ExecutorOutputQueue(worker, jobInfo, interval, segmentSize) {
var self = this;
this.logger = worker.logger; //TODO: Consider using gmeLogger for ExecutorWorker
this.jobInfo = jobInfo;
this.currOutput = {
nbrOfLines: 0,
output: '',
callback: null,
finishFn: null
};
this.outputQueue = [];
this.timeoutId = null;
/**
* Adds a string to the current output (which will be queued based on interval and/or segmentSize).
* @param {string} outputStr
*/
this.addOutput = function (outputStr) {
var lines = outputStr.split(/\r\n|\r|\n/);
if (lines[lines.length - 1] === '') {
lines.pop();
}
self.currOutput.nbrOfLines += lines.length;
self.currOutput.output += outputStr;
self.logger.debug('length', self.currOutput.nbrOfLines);
if (segmentSize > -1 && self.currOutput.nbrOfLines >= segmentSize) {
self._setNewTimeout();
self._queueCurrOutput();
}
};
/**
* Stops any timeouts, queues the current output (if any) and empties the outputQueue.
* This can be invoked to ensure that all output has been sent before sending the final jobInfo update.
* @param {function} callback
*/
this.sendAllOutputs = function (callback) {
var nbrOfQueued;
clearTimeout(self.timeoutId);
// Add the remaining stored output.
self._queueCurrOutput();
nbrOfQueued = self.outputQueue.length;
self.logger.debug('sending out all outputs');
if (nbrOfQueued > 0) {
// Attach a finishFn to the last output in the queue.
self.outputQueue[self.outputQueue.length - 1].finishFn = function (err) {
callback(err);
};
} else {
callback(null);
}
};
this._queueCurrOutput = function () {
if (self.currOutput.nbrOfLines === 0) {
return;
}
// Add a callback to the output batch that will be invoked when it has been sent to the server.
self.currOutput.callback = function (err) {
var sentOutput;
if (err) {
self.logger.error('output failed to be sent', err.toString());
} else {
self.logger.debug('output sent');
}
// When it has been sent, it is removed from the queue and if an additional finishFn has been attached
// it is invoked.
sentOutput = self.outputQueue.shift();
if (typeof sentOutput.finishFn === 'function') {
sentOutput.finishFn(err || null);
}
// If there are more queued outputs after the one just sent, send the first one in the queue.
if (self.outputQueue.length > 0) {
worker.sendOutput(self.jobInfo, self.outputQueue[0].output, self.outputQueue[0].callback);
}
};
// Queue the new output and reset the current output.
self.outputQueue.push(self.currOutput);
self.currOutput = {
nbrOfLines: 0,
output: '',
callback: null,
finishFn: null
};
if (self.outputQueue.length === 1) {
worker.sendOutput(self.jobInfo, self.outputQueue[0].output, self.outputQueue[0].callback);
}
};
this._setNewTimeout = function () {
if (interval < 0) {
return;
}
clearTimeout(self.timeoutId);
self.timeoutId = setTimeout(function () {
self._queueCurrOutput();
self._setNewTimeout();
}, interval);
};
// Start a new timeout at construction.
self._setNewTimeout();
}
return ExecutorOutputQueue;
});</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="Server_GMEAuth.html">Server:GMEAuth</a></li><li><a href="Server_SafeStorage.html">Server:SafeStorage</a></li><li><a href="Server_UserProject.html">Server:UserProject</a></li><li><a href="module-Core.html">Core</a></li><li><a href="module-Storage.html">Storage</a></li><li><a href="module-crosscuts.html">crosscuts</a></li><li><a href="module-serialization.html">serialization</a></li></ul><h3>Externals</h3><ul><li><a href="external-Promise.html">Promise</a></li></ul><h3>Classes</h3><ul><li><a href="AddOnBase.html">AddOnBase</a></li><li><a href="AddOnUpdateResult.html">AddOnUpdateResult</a></li><li><a href="Artifact.html">Artifact</a></li><li><a href="BlobClient.html">BlobClient</a></li><li><a href="BlobMetadata.html">BlobMetadata</a></li><li><a href="BlobRunPluginClient.html">BlobRunPluginClient</a></li><li><a href="Client.html">Client</a></li><li><a href="Core.html">Core</a></li><li><a href="ExecutorClient.html">ExecutorClient</a></li><li><a href="GMENode.html">GMENode</a></li><li><a href="GmeLogger.html">GmeLogger</a></li><li><a href="InterPluginResult.html">InterPluginResult</a></li><li><a href="JobInfo.html">JobInfo</a></li><li><a href="OutputInfo.html">OutputInfo</a></li><li><a href="PluginBase.html">PluginBase</a></li><li><a href="PluginConfig.html">PluginConfig</a></li><li><a href="PluginMessage.html">PluginMessage</a></li><li><a href="PluginNodeDescription.html">PluginNodeDescription</a></li><li><a href="PluginResult.html">PluginResult</a></li><li><a href="Project.html">Project</a></li><li><a href="ProjectInterface.html">ProjectInterface</a></li><li><a href="Server_GMEAuth-GMEAuth.html">GMEAuth</a></li><li><a href="Server_SafeStorage-SafeStorage.html">SafeStorage</a></li><li><a href="Server_UserProject-UserProject.html">UserProject</a></li><li><a href="WebsocketRouter.html">WebsocketRouter</a></li><li><a href="WebsocketRouterUser.html">WebsocketRouterUser</a></li></ul><h3>Events</h3><ul><li><a href="Client.html#event:BRANCH_CHANGED">BRANCH_CHANGED</a></li><li><a href="Client.html#event:BRANCH_CLOSED">BRANCH_CLOSED</a></li><li><a href="Client.html#event:BRANCH_OPENED">BRANCH_OPENED</a></li><li><a href="Client.html#event:BRANCH_STATUS_CHANGED">BRANCH_STATUS_CHANGED</a></li><li><a href="Client.html#event:CONNECTED_USERS_CHANGED">CONNECTED_USERS_CHANGED</a></li><li><a href="Client.html#event:NETWORK_STATUS_CHANGED">NETWORK_STATUS_CHANGED</a></li><li><a href="Client.html#event:NOTIFICATION">NOTIFICATION</a></li><li><a href="Client.html#event:PLUGIN_FINISHED">PLUGIN_FINISHED</a></li><li><a href="Client.html#event:PLUGIN_INITIATED">PLUGIN_INITIATED</a></li><li><a href="Client.html#event:PLUGIN_NOTIFICATION">PLUGIN_NOTIFICATION</a></li><li><a href="Client.html#event:PROJECT_CLOSED">PROJECT_CLOSED</a></li><li><a href="Client.html#event:PROJECT_OPENED">PROJECT_OPENED</a></li></ul><h3><a href="global.html">Global</a></h3>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> on Fri Jun 21 2024 09:43:40 GMT-0400 (Eastern Daylight Time)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>