@@ -299,6 +299,41 @@ class RosNode extends EventEmitter {
299299 return this . _masterApi . getSystemState ( this . _nodeName , options ) ;
300300 }
301301
302+ /** Services currently do not declare their type with the master, so instead
303+ we probe the service for its headers. Just like in
304+ https://github.com/ros/ros_comm/blob/6292d54dc14395531bffb2e165f3954fb0ef2c34/tools/rosservice/src/rosservice/__init__.py#L94-L98
305+ */
306+ getServiceHeader ( serviceName ) {
307+ return new Promise ( ( resolve , reject ) => {
308+
309+ this . lookupService ( serviceName ) . then ( ( resp ) => {
310+ const serviceUri = resp [ 2 ] ;
311+ const serviceHost = NetworkUtils . getAddressAndPortFromUri ( serviceUri ) ;
312+
313+ const client = net . connect ( serviceHost , ( ) => {
314+ const serviceClientHeader = tcprosUtils . createServiceClientHeader (
315+ this . _nodeName , serviceName , '*' , '*' , false ) ;
316+
317+ let deserializer = new DeserializeStream ( ) ;
318+ client . $deserializeStream = deserializer ;
319+ client . pipe ( deserializer ) ;
320+
321+ deserializer . once ( 'message' , ( msg ) => {
322+ const header = tcprosUtils . parseTcpRosHeader ( msg ) ;
323+ resolve ( header ) ;
324+ } ) ;
325+
326+ client . on ( 'error' , ( err ) => {
327+ this . _log . warn ( `Service Client ${ this . getService ( ) } error: ${ err } ` ) ;
328+ reject ( err ) ;
329+ } ) ;
330+
331+ client . write ( serviceClientHeader ) ;
332+ } ) ;
333+ } ) . catch ( reject ) ;
334+ } ) ;
335+ }
336+
302337 /**
303338 * Delays xmlrpc calls until our servers are set up
304339 * Since we need their ports for most of our calls.
0 commit comments