-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathindex.js
107 lines (94 loc) · 3.91 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
'use strict';
var _ = require('underscore');
var npm = require('npm');
var async = require('async');
var labeledLogger = require('./lib/logger');
var Player = require('./lib/player');
var nodeplayerConfig = require('./lib/config');
var config = nodeplayerConfig.getConfig();
var logger = labeledLogger('core');
function Core() {
this.player = new Player();
}
Core.prototype.checkModule = function(module) {
try {
require.resolve(module);
return true;
} catch (e) {
return false;
}
};
Core.prototype.installModule = function(moduleName, callback) {
logger.info('installing module: ' + moduleName);
npm.load({}, function(err) {
npm.commands.install(__dirname, [moduleName], function(err) {
if (err) {
logger.error(moduleName + ' installation failed:', err);
callback();
} else {
logger.info(moduleName + ' successfully installed');
callback();
}
});
});
};
// make sure all modules are installed, installs missing ones, then calls loadCallback
Core.prototype.installModules = function(modules, moduleType, update, loadCallback) {
async.eachSeries(modules, _.bind(function(moduleShortName, callback) {
var moduleName = 'nodeplayer-' + moduleType + '-' + moduleShortName;
if (!this.checkModule(moduleName) || update) {
// perform install / update
this.installModule(moduleName, callback);
} else {
// skip already installed
callback();
}
}, this), loadCallback);
};
Core.prototype.initModule = function(moduleShortName, moduleType, callback) {
var moduleTypeCapital = moduleType.charAt(0).toUpperCase() + moduleType.slice(1);
var moduleName = 'nodeplayer-' + moduleType + '-' + moduleShortName;
var module = require(moduleName);
var moduleLogger = labeledLogger(moduleShortName);
module.init(this.player, moduleLogger, _.bind(function(err) {
if (!err) {
this[moduleType + 's'][moduleShortName] = module;
if (moduleType === 'backend') {
this.songsPreparing[moduleShortName] = {};
}
moduleLogger.info(moduleType + ' module initialized');
this.callHooks('on' + moduleTypeCapital + 'Initialized', [moduleShortName]);
} else {
moduleLogger.error('while initializing: ' + err);
this.callHooks('on' + moduleTypeCapital + 'InitError', [moduleShortName]);
}
callback(err);
}, this.player));
};
Core.prototype.initModules = function(update, callback) {
async.eachSeries(['plugin', 'backend'], _.bind(function(moduleType, installCallback) {
// first install missing modules
this.installModules(config[moduleType + 's'], moduleType, update, installCallback);
}, this), _.bind(function() {
// then initialize modules, first all plugins in series, then all backends in parallel
async.eachSeries(['plugin', 'backend'], _.bind(function(moduleType, typeCallback) {
var moduleTypeCapital = moduleType.charAt(0).toUpperCase() + moduleType.slice(1);
(moduleType === 'plugin' ? async.eachSeries : async.each)
(config[moduleType + 's'], _.bind(function(moduleName, moduleCallback) {
if (this.checkModule('nodeplayer-' + moduleType + '-' + moduleName)) {
this.initModule(moduleName, moduleType, moduleCallback);
}
}, this), _.bind(function(err) {
logger.info('all ' + moduleType + ' modules initialized');
this.callHooks('on' + moduleTypeCapital + 'sInitialized');
typeCallback();
}, this.player));
}, this), function() {
callback();
});
}, this));
};
exports.Player = Player;
exports.labeledLogger = labeledLogger;
exports.config = nodeplayerConfig;
exports.Core = Core;