UNPKG

strider

Version:

Brilliant continuous deployment platform

130 lines 4.99 kB
const path = require('path'); const passport = require('passport'); const async = require('async'); const Loader = require('strider-extension-loader'); const globalTunnel = require('global-tunnel'); const app = require('./app'); const common = require('./common'); const config = require('./config'); const middleware = require('./middleware'); const auth = require('./auth'); const models = require('./models'); const pluginTemplates = require('./plugin-templates'); const upgrade = require('./models/upgrade').ensure; const loadExtensions = require('./utils/load-extensions'); const killZombies = require('./utils/kill-zombies'); const registerPanel = require('./utils/register-panel'); const Job = models.Job; const Config = models.Config; common.extensions = {}; // // Use globa-tunnel to provide proxy support. // The http_proxy environment variable will be used if the first parameter to globalTunnel.initialize is null. // globalTunnel.initialize(); module.exports = function (extdir, c, callback) { const appConfig = config; let k; // override with c for (k in c) { appConfig[k] = c[k]; } // Initialize the (web) app const appInstance = app.init(appConfig); const cb = callback || defaultCallback; function defaultCallback(err) { if (err) { throw err; } } if (typeof Loader !== 'function') { throw new Error('Your version of strider-extension-loader is out of date'); } const loader = new Loader([path.join(__dirname, '../client/styles')], true); appInstance.loader = loader; common.loader = loader; // // ### Strider Context Object // // Context object is passed to each extension. It carries various config // settings, as well as handles to enable functions to register things. // Context can also be accessed as a singleton within Strider as // common.context. const context = { serverName: appConfig.server_name, config: appConfig, enablePty: config.enablePty, emitter: common.emitter, extensionRoutes: [], extensionPaths: extdir, extdir: extdir, loader: loader, models: models, logger: console, middleware: middleware, auth: auth, passport: passport, registerPanel: registerPanel(common), registerBlock: pluginTemplates.registerBlock, app: appInstance, }; // Make extension context available throughout application. common.context = context; const SCHEMA_VERSION = Config.SCHEMA_VERSION; upgrade(SCHEMA_VERSION, function (err) { if (err) { return cb(err); } loadExtensions(loader, extdir, context, appInstance, function () { // kill zombie jobs killZombies(function () { const tasks = []; if (!common.extensions.runner || typeof common.extensions.runner !== 'object') { console.error('Strider seems to have been misconfigured - there are no available runner plugins. ' + 'Please make sure all dependencies are up to date.'); process.exit(1); } Object.keys(common.extensions.runner).forEach(function (name) { const runner = common.extensions.runner[name]; if (!runner) { console.log('no runner', name); return; } tasks.push(function (next) { Job.find({ 'runner.id': name, finished: null, }, function (error, jobs) { if (error) { return next(error); } runner.findZombies(jobs, next); }); }); }); async.parallel(tasks, function (err, zombies) { if (err) return cb(err); const ids = [].concat.apply([], zombies).map(function (job) { return job._id; }); const now = new Date(); Job.updateOne({ _id: { $in: ids } }, { $set: { finished: now, errored: true, error: { message: 'Job timeout', stack: '' }, }, }, function () { Job.updateOne({ _id: { $in: ids }, started: null }, { $set: { started: now } }, function (err) { cb(err, appInstance); }); }); }); }); }); }); return appInstance; }; //# sourceMappingURL=index.js.map