11var consts = require ( '../../consts' )
2+ var EventEmitter = require ( 'events' )
23
34function wrapQuery ( original , args , agent , params ) {
45 var childCommId = agent . generateCommId ( )
@@ -9,68 +10,103 @@ function wrapQuery (original, args, agent, params) {
910 var host = _params . host
1011 var url = _params . url
1112 var method = _params . method
12- var returnsPromise = _params . returnsPromise || false
13- var disableCallback = _params . disableCallback
13+ var continuationMethod = _params . continuationMethod || false // promise || readStream || callback
1414
1515 // custom error parsing depending on the instrumentation
1616 var parseError = _params . parseError || function ( ) { }
1717
18- var reportSend = function reportSend ( ) {
19- agent . clientSend ( {
20- protocol : protocol ,
21- requestId : requestId ,
22- childCommId : childCommId ,
23- host : host ,
24- time : clientSendTime ,
25- method : method ,
26- type : agent . CLIENT_SEND ,
27- url : url
28- } )
18+ var reporter = {
19+ reportSend : function reportSend ( ) {
20+ agent . clientSend ( {
21+ protocol : protocol ,
22+ requestId : requestId ,
23+ childCommId : childCommId ,
24+ host : host ,
25+ time : clientSendTime ,
26+ method : method ,
27+ type : agent . CLIENT_SEND ,
28+ url : url
29+ } )
30+ } ,
31+ reportReceive : function reportReceive ( err ) {
32+ var clientReceiveTime = agent . getMicrotime ( )
33+ agent . clientReceive ( {
34+ protocol : protocol ,
35+ requestId : requestId ,
36+ childCommId : childCommId ,
37+ host : host ,
38+ time : clientReceiveTime ,
39+ url : url ,
40+ method : method ,
41+ mustCollect : err ? consts . MUST_COLLECT . ERROR : undefined ,
42+ responseTime : clientReceiveTime - clientSendTime ,
43+ status : err ? consts . EDGE_STATUS . NOT_OK : consts . EDGE_STATUS . OK ,
44+ statusDescription : parseError ( err )
45+ } )
46+ }
2947 }
3048
31- var reportReceive = function reportReceive ( err ) {
32- var clientReceiveTime = agent . getMicrotime ( )
33- agent . clientReceive ( {
34- protocol : protocol ,
35- requestId : requestId ,
36- childCommId : childCommId ,
37- host : host ,
38- time : clientReceiveTime ,
39- url : url ,
40- method : method ,
41- mustCollect : err ? consts . MUST_COLLECT . ERROR : undefined ,
42- responseTime : clientReceiveTime - clientSendTime ,
43- status : err ? consts . EDGE_STATUS . NOT_OK : consts . EDGE_STATUS . OK ,
44- statusDescription : parseError ( err )
45- } )
49+ if ( continuationMethod === 'promise' ) {
50+ return wrapPromise . call ( this , original , args , reporter )
51+ } else if ( continuationMethod === 'readStream' ) {
52+ return wrapReadStream . call ( this , original , args , reporter )
53+ } else if ( continuationMethod === 'callback' ) { // uses callback
54+ return wrapCallback . call ( this , original , _params , args , reporter )
55+ } else {
56+ return original . apply ( this , args ) // we might not want to instrument the method
4657 }
58+ }
4759
48- if ( returnsPromise ) {
49- reportSend ( )
50- var originalPromise = original . apply ( this , args )
51- return originalPromise . then (
52- function ( v ) { reportReceive ( ) ; return v } ,
53- function ( err ) { reportReceive ( err ) ; return err }
54- )
55- } else { // uses callback
56- var wrappedCallback = function ( original ) {
57- return function ( err ) {
58- reportReceive ( err )
59- return original . apply ( this , arguments )
60- }
61- }
62- var last = args [ args . length - 1 ]
63- if ( last && typeof last === 'function' ) {
64- args [ args . length - 1 ] = wrappedCallback ( last )
65- } else if ( Array . isArray ( last ) && typeof last [ last . length - 1 ] === 'function' ) {
66- var lastOfLast = last . length - 1
67- args [ args . length - 1 ] [ lastOfLast ] = wrappedCallback ( last [ lastOfLast ] )
68- } else if ( ! disableCallback ) {
69- args . push ( wrappedCallback ( function ( ) { } ) )
60+ function wrapCallback ( original , params , args , reporter ) {
61+ var wrappedCallback = function ( original ) {
62+ return function ( err ) {
63+ reporter . reportReceive ( err )
64+ return original . apply ( this , arguments )
7065 }
71- reportSend ( )
72- return original . apply ( this , args )
7366 }
67+ var last = args [ args . length - 1 ]
68+ if ( last && typeof last === 'function' ) {
69+ args [ args . length - 1 ] = wrappedCallback ( last )
70+ } else if ( Array . isArray ( last ) && typeof last [ last . length - 1 ] === 'function' ) {
71+ var lastOfLast = last . length - 1
72+ args [ args . length - 1 ] [ lastOfLast ] = wrappedCallback ( last [ lastOfLast ] )
73+ } else {
74+ args . push ( wrappedCallback ( function ( ) { } ) )
75+ }
76+ reporter . reportSend ( )
77+ return original . apply ( this , args )
78+ }
79+
80+ function wrapPromise ( original , args , reporter ) {
81+ reporter . reportSend ( )
82+ var originalPromise = original . apply ( this , args )
83+ return originalPromise . then (
84+ function ( v ) { reporter . reportReceive ( ) ; return v } ,
85+ function ( err ) { reporter . reportReceive ( err ) ; throw err }
86+ )
87+ }
88+
89+ function wrapReadStream ( original , args , reporter ) {
90+ reporter . reportSend ( )
91+ var originalStream = original . apply ( this , args )
92+
93+ originalStream . on ( 'end' , function ( ) {
94+ reporter . reportReceive ( )
95+ } )
96+
97+ originalStream . on ( 'error' , function ( err ) {
98+ reporter . reportReceive ( err )
99+
100+ if ( typeof originalStream . listenerCount === 'function' ) {
101+ if ( originalStream . listenerCount ( 'error' ) < 2 ) {
102+ throw err
103+ }
104+ } else if ( EventEmitter . listenerCount ( originalStream , 'error' ) < 2 ) {
105+ throw err
106+ }
107+ } )
108+
109+ return originalStream
74110}
75111
76112module . exports = wrapQuery
0 commit comments