-
Notifications
You must be signed in to change notification settings - Fork 224
/
_mock_http_client.js
95 lines (86 loc) · 2.38 KB
/
_mock_http_client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
* Copyright Elasticsearch B.V. and other contributors where applicable.
* Licensed under the BSD 2-Clause License; you may not use this file except in
* compliance with the BSD 2-Clause License.
*/
'use strict';
// This is a mock "elastic-apm-http-client".
//
// Usage:
//
// 1. Create a client for an expected number of writes:
//
// var mockClient = require('.../_mock_http_client')
// agent._apmClient = mockClient(expected, done)
//
// The `done` callback will be called with the written data (`_writes`)
// once the `expected` number of writes have occurred.
//
// 2. Create a client that calls back after a delay without writes:
//
// var mockClient = require('.../_mock_http_client')
// agent._apmClient = mockClient(done)
//
// The `done` callback will be called with the written data (`_writes`)
// after a 200ms delay with no writes (the timer only starts after the
// first write).
module.exports = function (expected, done) {
const timerBased = typeof expected === 'function';
if (timerBased) done = expected;
let timer;
const client = {
_writes: {
length: 0,
spans: [],
transactions: [],
errors: [],
metricsets: [],
},
_write(obj, cb) {
cb = cb || noop;
const type = Object.keys(obj)[0];
this._writes.length++;
this._writes[type + 's'].push(obj[type]);
process.nextTick(cb);
if (timerBased) resetTimer();
else if (this._writes.length === expected) done(this._writes);
else if (this._writes.length > expected)
throw new Error('too many writes');
},
sendSpan(span, cb) {
this._write({ span }, cb);
},
sendTransaction(transaction, cb) {
this._write({ transaction }, cb);
},
sendError(error, cb) {
this._write({ error }, cb);
},
sendMetricSet(metricset, cb) {
this._write({ metricset }, cb);
},
flush(opts, cb) {
if (typeof opts === 'function') {
cb = opts;
opts = {};
} else if (!opts) {
opts = {};
}
if (cb) process.nextTick(cb);
},
supportsKeepingUnsampledTransaction() {
return true;
},
supportsActivationMethodField() {
return true;
},
};
return client;
function resetTimer() {
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
done(client._writes);
}, 200);
}
};
function noop() {}