UNPKG

2.99 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4
5const CallbackDecorator = require('./callbacks/decorator');
6const HttpTransportClient = require('./client');
7
8function validatePlugin(plugin) {
9 if (typeof plugin !== 'function') throw new TypeError('Plugin is not a function');
10}
11
12/** @class */
13class 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
123module.exports = HttpTransportBuilder;