1
1
var fs = require ( 'fs' ) ;
2
2
var argv = require ( 'minimist' ) ( process . argv . slice ( 2 ) ) ;
3
+ var scErrors = require ( 'sc-errors' ) ;
4
+ var TimeoutError = scErrors . TimeoutError ;
5
+
3
6
var SocketCluster = require ( 'socketcluster' ) . SocketCluster ;
4
- var scHotReboot = require ( 'sc-hot-reboot' ) ;
5
7
6
8
var workerControllerPath = argv . wc || process . env . SOCKETCLUSTER_WORKER_CONTROLLER ;
7
9
var brokerControllerPath = argv . bc || process . env . SOCKETCLUSTER_BROKER_CONTROLLER ;
@@ -33,6 +35,7 @@ var options = {
33
35
environment : environment
34
36
} ;
35
37
38
+ var SOCKETCLUSTER_CONTROLLER_BOOT_TIMEOUT = Number ( process . env . SOCKETCLUSTER_CONTROLLER_BOOT_TIMEOUT ) || 10000 ;
36
39
var SOCKETCLUSTER_OPTIONS ;
37
40
38
41
if ( process . env . SOCKETCLUSTER_OPTIONS ) {
@@ -48,22 +51,29 @@ for (var i in SOCKETCLUSTER_OPTIONS) {
48
51
var optionsControllerPath = argv . oc || process . env . SOCKETCLUSTER_OPTIONS_CONTROLLER ;
49
52
var masterControllerPath = argv . mc || process . env . SOCKETCLUSTER_MASTER_CONTROLLER ;
50
53
54
+ var fileExists = function ( filePath , callback ) {
55
+ fs . access ( filePath , fs . constants . F_OK , ( err ) => {
56
+ callback ( ! err ) ;
57
+ } ) ;
58
+ } ;
59
+
60
+ var runMasterController = function ( socketCluster , filePath ) {
61
+ var masterController = require ( filePath ) ;
62
+ masterController . run ( socketCluster ) ;
63
+ } ;
64
+
51
65
var launch = function ( startOptions ) {
52
66
var socketCluster = new SocketCluster ( startOptions ) ;
67
+ var masterController ;
53
68
54
69
if ( masterControllerPath ) {
55
- var masterController = require ( masterControllerPath ) ;
56
- masterController . run ( socketCluster ) ;
57
- }
58
-
59
- if ( environment == 'dev' ) {
60
- // This will cause SC workers to reboot when code changes anywhere in the app directory.
61
- // The second options argument here is passed directly to chokidar.
62
- // See https://github.com/paulmillr/chokidar#api for details.
63
- console . log ( ` !! The sc-hot-reboot plugin is watching for code changes in the ${ __dirname } directory` ) ;
64
- scHotReboot . attach ( socketCluster , {
65
- cwd : __dirname ,
66
- ignored : [ 'public' , 'node_modules' , 'README.md' , 'Dockerfile' , 'server.js' , 'broker.js' , / [ \/ \\ ] \. / , '*.log' ]
70
+ runMasterController ( socketCluster , masterControllerPath ) ;
71
+ } else {
72
+ var defaultMasterControllerPath = __dirname + '/master.js' ;
73
+ fileExists ( defaultMasterControllerPath , ( exists ) => {
74
+ if ( exists ) {
75
+ runMasterController ( socketCluster , defaultMasterControllerPath ) ;
76
+ }
67
77
} ) ;
68
78
}
69
79
} ;
@@ -78,37 +88,49 @@ var start = function () {
78
88
} ;
79
89
80
90
var bootCheckInterval = Number ( process . env . SOCKETCLUSTER_BOOT_CHECK_INTERVAL ) || 200 ;
91
+ var bootStartTime = Date . now ( ) ;
81
92
82
- if ( workerControllerPath ) {
83
- // Detect when Docker volumes are ready.
84
- var startWhenFileIsReady = ( filePath ) => {
85
- return new Promise ( ( resolve ) => {
86
- if ( ! filePath ) {
87
- resolve ( ) ;
88
- return ;
89
- }
90
- var checkIsReady = ( ) => {
91
- fs . exists ( filePath , ( exists ) => {
92
- if ( exists ) {
93
- resolve ( ) ;
93
+ // Detect when Docker volumes are ready.
94
+ var startWhenFileIsReady = ( filePath ) => {
95
+ return new Promise ( ( resolve , reject ) => {
96
+ if ( ! filePath ) {
97
+ resolve ( ) ;
98
+ return ;
99
+ }
100
+ var checkIsReady = ( ) => {
101
+ var now = Date . now ( ) ;
102
+
103
+ fileExists ( filePath , ( exists ) => {
104
+ if ( exists ) {
105
+ resolve ( ) ;
106
+ } else {
107
+ if ( now - bootStartTime >= SOCKETCLUSTER_CONTROLLER_BOOT_TIMEOUT ) {
108
+ var errorMessage = `Could not locate a controller file at path ${ filePath } ` +
109
+ `before SOCKETCLUSTER_CONTROLLER_BOOT_TIMEOUT` ;
110
+ var volumeBootTimeoutError = new TimeoutError ( errorMessage ) ;
111
+ reject ( volumeBootTimeoutError ) ;
94
112
} else {
95
113
setTimeout ( checkIsReady , bootCheckInterval ) ;
96
114
}
97
- } ) ;
98
- } ;
99
- checkIsReady ( ) ;
100
- } ) ;
101
- } ;
102
- var filesReadyPromises = [
103
- startWhenFileIsReady ( optionsControllerPath ) ,
104
- startWhenFileIsReady ( masterControllerPath ) ,
105
- startWhenFileIsReady ( workerControllerPath ) ,
106
- startWhenFileIsReady ( brokerControllerPath ) ,
107
- startWhenFileIsReady ( initControllerPath )
108
- ] ;
109
- Promise . all ( filesReadyPromises ) . then ( ( ) => {
110
- start ( ) ;
115
+ }
116
+ } ) ;
117
+ } ;
118
+ checkIsReady ( ) ;
111
119
} ) ;
112
- } else {
120
+ } ;
121
+
122
+ var filesReadyPromises = [
123
+ startWhenFileIsReady ( optionsControllerPath ) ,
124
+ startWhenFileIsReady ( masterControllerPath ) ,
125
+ startWhenFileIsReady ( workerControllerPath ) ,
126
+ startWhenFileIsReady ( brokerControllerPath ) ,
127
+ startWhenFileIsReady ( initControllerPath )
128
+ ] ;
129
+ Promise . all ( filesReadyPromises )
130
+ . then ( ( ) => {
113
131
start ( ) ;
114
- }
132
+ } )
133
+ . catch ( ( err ) => {
134
+ console . error ( err . stack ) ;
135
+ process . exit ( 1 ) ;
136
+ } ) ;
0 commit comments