@k03mad/request 2.2.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/app/lib/queue.js CHANGED
@@ -3,26 +3,25 @@ import PQueue from 'p-queue';
3
3
 
4
4
  const debug = _debug('mad:queue');
5
5
 
6
- // const rps = num => ({intervalCap: num, interval: 1000});
7
- const concurrency = num => ({concurrency: num});
6
+ const intervals = {
7
+ concurrency: num => ({concurrency: num}),
8
+ rpm: num => ({intervalCap: num, interval: 60_000}),
9
+ rps: num => ({intervalCap: num, interval: 1000}),
10
+ };
8
11
 
9
- // first level — host
10
- // second level — method
11
- // third level — p-queue options
12
+ // host: p-queue options
12
13
  const requestQueue = {
13
- '*': {
14
- '*': concurrency(3),
15
- },
14
+ // default
15
+ '*': intervals.concurrency(3),
16
16
  };
17
17
 
18
18
  /**
19
19
  * @param {string} host
20
- * @param {string} method
21
20
  * @param {object} opts
22
21
  * @returns {object}
23
22
  */
24
- const getLoggedQueue = (host, method, opts) => {
25
- const queue = requestQueue[host][method];
23
+ const getLoggedQueue = (host, opts) => {
24
+ const queue = requestQueue[host];
26
25
 
27
26
  queue.on('active', () => {
28
27
  const {pending, size} = queue;
@@ -32,9 +31,7 @@ const getLoggedQueue = (host, method, opts) => {
32
31
  ? `${concurrent} concurrent`
33
32
  : `${intervalCap} rp ${interval} ms`;
34
33
 
35
- const logMessage = `[${
36
- method === '*' ? '' : `${method}: `
37
- }${host}] ${parallel} | queue: ${size} | running: ${pending}`;
34
+ const logMessage = `[${host}] ${parallel} | queue: ${size} | running: ${pending}`;
38
35
 
39
36
  debug(logMessage);
40
37
  });
@@ -44,35 +41,31 @@ const getLoggedQueue = (host, method, opts) => {
44
41
 
45
42
  /**
46
43
  * @param {string} host
47
- * @param {string} method
44
+ * @param {object} [params]
45
+ * @param {number} [params.concurrency]
46
+ * @param {number} [params.rpm]
47
+ * @param {number} [params.rps]
48
48
  * @returns {object}
49
49
  */
50
- export default (host, method = 'GET') => {
51
- for (const elem of [method, '*']) {
52
- if (requestQueue[host]?.[elem]?._events) {
53
- return requestQueue[host][elem];
54
- }
50
+ export default (host, params = {}) => {
51
+ if (requestQueue[host]?._events) {
52
+ return requestQueue[host];
53
+ }
55
54
 
56
- if (requestQueue[host]?.[elem]) {
57
- const opts = requestQueue[host][elem];
58
- requestQueue[host][elem] = new PQueue(opts);
59
- return getLoggedQueue(host, elem, opts);
55
+ for (const [key, value] of Object.entries(params)) {
56
+ if (intervals[key]) {
57
+ requestQueue[host] = intervals[key](value);
58
+ break;
60
59
  }
61
60
  }
62
61
 
63
62
  if (requestQueue[host]) {
64
- const opts = requestQueue['*']['*'];
65
- requestQueue[host]['*'] = new PQueue(opts);
66
- return getLoggedQueue(host, '*', opts);
67
- }
68
-
69
- if (requestQueue['*'][method]) {
70
- const opts = requestQueue['*'][method];
71
- requestQueue[host] = {[method]: new PQueue(opts)};
72
- return getLoggedQueue(host, method, opts);
63
+ const opts = requestQueue[host];
64
+ requestQueue[host] = new PQueue(opts);
65
+ return getLoggedQueue(host, opts);
73
66
  }
74
67
 
75
- const opts = requestQueue['*']['*'];
76
- requestQueue[host] = {'*': new PQueue(opts)};
77
- return getLoggedQueue(host, '*', opts);
68
+ const opts = requestQueue['*'];
69
+ requestQueue[host] = new PQueue(opts);
70
+ return getLoggedQueue(host, opts);
78
71
  };
@@ -84,10 +84,14 @@ const sendRequest = async (url, opts) => {
84
84
  /**
85
85
  * @param {string} url
86
86
  * @param {object} [opts]
87
+ * @param {object} [params]
88
+ * @param {number} [params.concurrency]
89
+ * @param {number} [params.rpm]
90
+ * @param {number} [params.rps]
87
91
  * @returns {Promise<object>}
88
92
  */
89
- export const request = (url, opts = {}) => {
90
- const queue = getQueue(new URL(url).host, opts.method);
93
+ export const request = (url, opts = {}, params = {}) => {
94
+ const queue = getQueue(new URL(url).host, params);
91
95
  return queue.add(() => sendRequest(url, opts));
92
96
  };
93
97
 
@@ -97,10 +101,13 @@ export const request = (url, opts = {}) => {
97
101
  * @param {object} [params]
98
102
  * @param {number} [params.expire] seconds
99
103
  * @param {object} [params.cacheBy]
104
+ * @param {number} [params.concurrency]
105
+ * @param {number} [params.rpm]
106
+ * @param {number} [params.rps]
100
107
  * @returns {Promise<object>}
101
108
  */
102
- export const requestCache = (url, opts = {}, {cacheBy, expire = 43_200} = {}) => {
103
- const queue = getQueue(new URL(url).host, opts.method);
109
+ export const requestCache = (url, opts = {}, {cacheBy, expire = 43_200, ...params} = {}) => {
110
+ const queue = getQueue(new URL(url).host, params);
104
111
 
105
112
  return queue.add(async () => {
106
113
  const cacheKey = `${url}::${JSON.stringify(cacheBy || opts)}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k03mad/request",
3
- "version": "2.2.0",
3
+ "version": "3.0.1",
4
4
  "description": "Request library",
5
5
  "maintainers": [
6
6
  "Kirill Molchanov <k03.mad@gmail.com"