1 | ;
|
2 |
|
3 | const _ = require('lodash');
|
4 |
|
5 | const CallbackDecorator = require('./callbacks/decorator');
|
6 | const HttpTransportClient = require('./client');
|
7 |
|
8 | function validatePlugin(plugin) {
|
9 | if (typeof plugin !== 'function') throw new TypeError('Plugin is not a function');
|
10 | }
|
11 |
|
12 | /** @class */
|
13 | class HttpTransportBuilder {
|
14 | /**
|
15 | * Configures HttpTransport client
|
16 | * @param {Transport} transport - Transport instance.
|
17 | */
|
18 | constructor(transport) {
|
19 | this._callback = false;
|
20 | this._transport = transport;
|
21 | this._defaults = {
|
22 | plugins: []
|
23 | };
|
24 | }
|
25 |
|
26 | /**
|
27 | * Sets a default user agent
|
28 | *
|
29 | * @param {string} agent - user agant
|
30 | * @return a HttpTransportBuilder instance
|
31 | * @example
|
32 | * const httpTransport = require('@bbc/http-transport');
|
33 | *
|
34 | * const builder = httpTransport.createBuilder();
|
35 | * builder.userAgent('some-user-agent');
|
36 | */
|
37 | userAgent(userAgent) {
|
38 | _.set(this._defaults, 'ctx.userAgent', userAgent);
|
39 | return this;
|
40 | }
|
41 |
|
42 | /**
|
43 | * Set the default number of retries
|
44 | *
|
45 | * @param {integer} retries - number of retry attempts
|
46 | * @return a HttpTransportBuilder instance
|
47 | * @example
|
48 | * const httpTransport = require('@bbc/http-transport');
|
49 | *
|
50 | * const builder = httpTransport.createBuilder();
|
51 | * builder.retries(5);
|
52 | */
|
53 | retries(retries) {
|
54 | _.set(this._defaults, 'ctx.retries', retries);
|
55 | return this;
|
56 | }
|
57 |
|
58 | /**
|
59 | * default time delay between retries
|
60 | *
|
61 | * @param {integer} delay - delay time in ms
|
62 | * @return a HttpTransportBuilder instance
|
63 | * @example
|
64 | * const httpTransport = require('@bbc/http-transport');
|
65 | *
|
66 | * const builder = httpTransport.createBuilder();
|
67 | * builder.retryDelay(1000);
|
68 | */
|
69 | retryDelay(delay) {
|
70 | _.set(this._defaults, 'ctx.retryDelay', delay);
|
71 | return this;
|
72 | }
|
73 |
|
74 | /**
|
75 | * Registers a global plugin, which is used for all requests
|
76 | *
|
77 | * @param {function} fn - a global plugin
|
78 | * @return a HttpTransportBuilder instance
|
79 | * @example
|
80 | * const toError = require('@bbc/http-transport-errors');
|
81 | * const httpTransport = require('@bbc/http-transport');
|
82 | *
|
83 | * const client = httpTransport.createClient();
|
84 | * client.useGlobal(toError(404));
|
85 | */
|
86 | use(fn) {
|
87 | validatePlugin(fn);
|
88 | this._defaults.plugins.push(fn);
|
89 | return this;
|
90 | }
|
91 |
|
92 | /**
|
93 | * Callbackify the client
|
94 | *
|
95 | * @return a HttpTransport instance supporting callbacks
|
96 | * @example
|
97 | *
|
98 | * const client = httpTransport.asCallback().createClient();
|
99 | */
|
100 | asCallback() {
|
101 | this._callback = true;
|
102 | return this;
|
103 | }
|
104 |
|
105 | /**
|
106 | * Instantiates a HttpTransport
|
107 | *
|
108 | * @param {function} fn - a global plugin
|
109 | * @return a HttpTransport instance
|
110 | * @example
|
111 | *
|
112 | * const client = httpTransport.createClient();
|
113 | */
|
114 | createClient() {
|
115 | const transportClient = new HttpTransportClient(this._transport, this._defaults);
|
116 | if (this._callback) {
|
117 | return new CallbackDecorator(transportClient);
|
118 | }
|
119 | return transportClient;
|
120 | }
|
121 | }
|
122 |
|
123 | module.exports = HttpTransportBuilder;
|