22// dependencies
33// #########################################################################
44
5- var socket = require ( './libs/socket' )
6- , ReadyNAS = require ( './libs/readynas' )
7- , _ = require ( 'lodash' ) ;
5+ var dgram = require ( 'dgram' )
6+ , EventEmitter = require ( 'events' ) . EventEmitter
7+ , _ = require ( 'lodash' )
8+ , ReadyNAS = require ( './readynas' ) ;
89
910
1011
1112// #########################################################################
1213// module vars
1314// #########################################################################
1415
15- var _events = { } ;
16+ var _defaultOptions = {
17+ socketType : 'udp4' ,
18+ portToListen : 57877 ,
19+ targetHost : '255.255.255.255' ,
20+ targetPort : 22081 ,
21+ magicPacket : new Buffer ( '0000073e0000000100000000f8d496c3ffffffff0000001c00000000' , 'hex' )
22+ } ;
23+
24+ var _socket = null
25+ , _options = null
26+ , _events = new EventEmitter ( ) ;
1627
1728
1829
1930// #########################################################################
2031// utility functions
2132// #########################################################################
2233
23- var notifyEvent = function ( ) {
24- var args = _ . values ( arguments )
25- , event = args . shift ( )
26- , callback = _events [ event ] ;
34+ var firstValueByType = function ( obj , type ) {
35+ for ( var i in obj ) {
36+ if ( typeof obj [ i ] === type )
37+ return obj [ i ] ;
38+ }
39+ } ;
40+
41+ var firstNumber = function ( obj ) {
42+ return firstValueByType ( obj , 'number' ) ;
43+ } ;
2744
28- if ( typeof callback !== 'function' ) return ;
45+ var firstFunction = function ( obj ) {
46+ return firstValueByType ( obj , 'function' ) ;
47+ } ;
2948
30- callback . apply ( this , args ) ;
49+ var firstObject = function ( obj ) {
50+ return firstValueByType ( obj , 'object' ) ;
3151} ;
3252
3353
3454
3555// #########################################################################
36- // socket settings
56+ // socket functions
3757// #########################################################################
3858
39- socket . on ( 'error' , function ( err ) {
40- notifyEvent ( 'error' , err ) ;
41- } ) ;
4259
43- socket . on ( 'message' , function ( msg ) {
60+ var socketError = function ( err ) {
61+ _events . emit ( 'error' , err ) ;
62+ } ;
63+
64+ var socketMessage = function ( msg ) {
65+ _events . emit ( 'message' , msg ) ;
66+
4467 try {
4568 var device = new ReadyNAS ( msg ) ;
46-
47- notifyEvent ( 'device' , device ) ;
48- notifyEvent ( device . ip , device ) ;
49- notifyEvent ( device . hostname , device ) ;
50- notifyEvent ( device . mac , device ) ;
69+ [ 'device' , device . ip , device . hostname , device . mac ] . forEach ( function ( e ) {
70+ _events . emit ( e , device ) ;
71+ } ) ;
5172 } catch ( e ) {
52- notifyEvent ( 'error' , e ) ;
73+ _events . emit ( 'fail' , msg , e ) ;
5374 }
54- } ) ;
75+ } ;
76+
77+ var openNewSocket = function ( ) {
78+ var options = firstObject ( arguments )
79+ , callback = firstFunction ( arguments ) ;
80+
81+ _options = _ . extend ( _ . clone ( _defaultOptions ) , options ) ;
82+
83+ _socket = dgram . createSocket ( _options . socketType ) ;
84+
85+ _socket . on ( 'error' , socketError ) ;
86+ _socket . on ( 'message' , socketMessage ) ;
5587
56- socket . open ( ) ;
88+ _socket . bind ( _options . portToListen , function ( ) {
89+ _socket . setBroadcast ( true ) ;
90+ if ( callback ) callback ( ) ;
91+ } ) ;
92+ } ;
93+
94+ var closeSocket = function ( ) {
95+ if ( _socket ) _socket . close ( ) ;
96+ _socket = null ;
97+ } ;
98+
99+ var sendMagic = function ( ) {
100+ var callback = firstFunction ( arguments ) ;
101+
102+ var send = function ( ) {
103+ _socket . send ( _options . magicPacket , 0 , _options . magicPacket . length , _options . targetPort , _options . targetHost , function ( err ) {
104+ if ( callback ) callback ( err ) ;
105+ } ) ;
106+ } ;
107+
108+ if ( ! _socket ) openNewSocket ( send ) ; else send ( ) ;
109+ } ;
57110
58111
59112
60113// #########################################################################
61- // functions
114+ // exports
62115// #########################################################################
63116
64- module . exports . options = function ( options ) {
65- socket . close ( ) ;
66- socket . open ( options ) ;
117+ module . exports . on = function ( event , callback ) {
118+ return _events . on ( event , callback . bind ( _events ) ) ;
67119} ;
68120
69- module . exports . sendMagic = function ( options , callback ) {
70- socket . sendMagic ( ) ;
121+ module . exports . once = function ( event , callback ) {
122+ return _events . once ( event , callback . bind ( _events ) ) ;
71123} ;
72124
73- module . exports . on = function ( event , callback ) {
74- _events [ event ] = callback ;
125+ module . exports . open = openNewSocket ;
126+
127+ module . exports . close = closeSocket ;
128+
129+ module . exports . request = function ( ) {
130+ var timeout = firstNumber ( arguments )
131+ , callback = firstFunction ( arguments )
132+ , founded = [ ] ;
133+
134+ if ( ! callback ) return sendMagic ( ) ;
135+
136+ var cbDevice = function ( device ) {
137+ founded . push ( device ) ;
138+ } ;
139+
140+ sendMagic ( function ( err ) {
141+ if ( err ) return callback ( err ) ;
142+
143+ _events . on ( 'device' , cbDevice ) ;
144+
145+ setTimeout ( function ( ) {
146+ _events . removeListener ( 'device' , cbDevice ) ;
147+ callback ( null , founded ) ;
148+ } , timeout || 5000 ) ;
149+ } ) ;
75150} ;
0 commit comments