@@ -10,16 +10,13 @@ var _ = bitcore.deps._;
1010var index = require ( './' ) ;
1111var log = index . log ;
1212var Bus = require ( './bus' ) ;
13- var BaseService = require ( './service' ) ;
1413var errors = require ( './errors' ) ;
1514
1615function Node ( config ) {
1716 if ( ! ( this instanceof Node ) ) {
1817 return new Node ( config ) ;
1918 }
2019
21- var self = this ;
22-
2320 this . errors = errors ; // So services can use errors without having to have bitcore-node as a dependency
2421 this . log = log ;
2522 this . network = null ;
@@ -38,13 +35,6 @@ function Node(config) {
3835
3936 this . _setNetwork ( config ) ;
4037
41- this . start ( function ( err ) {
42- if ( err ) {
43- return self . emit ( 'error' , err ) ;
44- }
45- self . emit ( 'ready' ) ;
46- } ) ;
47-
4838}
4939
5040util . inherits ( Node , EventEmitter ) ;
@@ -137,35 +127,53 @@ Node.prototype.getServiceOrder = function() {
137127 return stack ;
138128} ;
139129
140- Node . prototype . _instantiateService = function ( service ) {
130+ Node . prototype . _startService = function ( serviceInfo , callback ) {
141131 var self = this ;
142132
143- $ . checkState ( _ . isObject ( service . config ) ) ;
144- $ . checkState ( ! service . config . node ) ;
133+ $ . checkState ( _ . isObject ( serviceInfo . config ) ) ;
134+ $ . checkState ( ! serviceInfo . config . node ) ;
135+ $ . checkState ( ! serviceInfo . config . name ) ;
145136
146- var config = service . config ;
137+ log . info ( 'Starting ' + serviceInfo . name ) ;
138+
139+ var config = serviceInfo . config ;
147140 config . node = this ;
148- config . name = service . name ;
149- var mod = new service . module ( config ) ;
150-
151- // include in loaded services
152- this . services [ service . name ] = mod ;
153-
154- // add API methods
155- var methodData = mod . getAPIMethods ( ) ;
156- methodData . forEach ( function ( data ) {
157- var name = data [ 0 ] ;
158- var instance = data [ 1 ] ;
159- var method = data [ 2 ] ;
160-
161- if ( self [ name ] ) {
162- throw new Error ( 'Existing API method exists: ' + name ) ;
163- } else {
164- self [ name ] = function ( ) {
165- return method . apply ( instance , arguments ) ;
166- } ;
141+ config . name = serviceInfo . name ;
142+ var service = new serviceInfo . module ( config ) ;
143+
144+ service . start ( function ( err ) {
145+ if ( err ) {
146+ return callback ( err ) ;
147+ }
148+
149+ // include in loaded services
150+ self . services [ serviceInfo . name ] = service ;
151+
152+ // add API methods
153+ var methodData = service . getAPIMethods ( ) ;
154+ var methodNameConflicts = [ ] ;
155+ methodData . forEach ( function ( data ) {
156+ var name = data [ 0 ] ;
157+ var instance = data [ 1 ] ;
158+ var method = data [ 2 ] ;
159+
160+ if ( self [ name ] ) {
161+ methodNameConflicts . push ( name ) ;
162+ } else {
163+ self [ name ] = function ( ) {
164+ return method . apply ( instance , arguments ) ;
165+ } ;
166+ }
167+ } ) ;
168+
169+ if ( methodNameConflicts . length > 0 ) {
170+ return callback ( new Error ( 'Existing API method(s) exists: ' + methodNameConflicts . join ( ', ' ) ) ) ;
167171 }
172+
173+ callback ( ) ;
174+
168175 } ) ;
176+
169177} ;
170178
171179Node . prototype . start = function ( callback ) {
@@ -175,15 +183,15 @@ Node.prototype.start = function(callback) {
175183 async . eachSeries (
176184 servicesOrder ,
177185 function ( service , next ) {
178- log . info ( 'Starting ' + service . name ) ;
179- try {
180- self . _instantiateService ( service ) ;
181- } catch ( err ) {
186+ self . _startService ( service , next ) ;
187+ } ,
188+ function ( err ) {
189+ if ( err ) {
182190 return callback ( err ) ;
183191 }
184- self . services [ service . name ] . start ( next ) ;
185- } ,
186- callback
192+ self . emit ( 'ready' ) ;
193+ callback ( ) ;
194+ }
187195 ) ;
188196} ;
189197
@@ -198,8 +206,13 @@ Node.prototype.stop = function(callback) {
198206 async . eachSeries (
199207 services ,
200208 function ( service , next ) {
201- log . info ( 'Stopping ' + service . name ) ;
202- self . services [ service . name ] . stop ( next ) ;
209+ if ( self . services [ service . name ] ) {
210+ log . info ( 'Stopping ' + service . name ) ;
211+ self . services [ service . name ] . stop ( next ) ;
212+ } else {
213+ log . info ( 'Stopping ' + service . name + ' (not started)' ) ;
214+ setImmediate ( next ) ;
215+ }
203216 } ,
204217 callback
205218 ) ;
0 commit comments