-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
92 lines (78 loc) · 2.4 KB
/
index.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
const request = require('request')
const chalk = require('chalk')
class RequestQueue {
/**
* Initialize Queue Object
* @param {*} delay delay between requests (in ms)
*/
constructor(delay, debug) {
this.queue = []
this.routineActive = false
this.debug = debug || false
this.changeDelay(delay)
/* Helper function */
this.sleep = ms => new Promise(resolve => setTimeout(resolve), ms)
}
/**
* Change delay between requests
* @param {*} delay between requests in ms
*/
changeDelay(delay) {
this.delay = typeof parseInt(delay) == 'number' && parseInt(delay) >= 0 ? parseInt(delay) : 1000
}
/**
* Adds element to queue
* and starts routine if queue is empty
* @param {{request: Object, callback: Function}} data data object for queue
*/
add(data) {
this.debugLog('Add', `Adding new request [${data.request.method || 'GET'} ${data.request.url}]`)
this.queue.push(data)
if(!this.routineActive) {
this.debugLog('Check', 'Routine offline, starting...')
this.execute()
}
}
/**
* Checks whether current queue has items
* @returns true / false
*/
hasQueueElements() {
return this.queue.lengh > 0
}
/**
* Executes routine until no element is left
*/
execute() {
this.routineActive = true
this.sint = setInterval(() => {
this.debugLog('Interval', 'New interval check')
this.send(this.queue.shift())
if(this.queue.length < 1) {
clearInterval(this.sint)
this.routineActive = false
this.debugLog('Clear', 'Queue empty, stopping routine')
}
}, this.delay);
}
/**
* Sends Data
* @param {{request: Object, callback: Function}} data
*/
send(data) {
this.debugLog('Send', `Sending ${data.request.method || 'GET'} ${data.request.url}`)
request(data.request, (err, req, body) => {
if(data.callback)
data.callback(err, req, body)
})
}
/**
* Console logs steps for debug purposes
* @param {*} data
*/
debugLog(step, data) {
if(this.debug)
console.log(`${new Date().toISOString()} [${chalk.green(step)}]: \t${chalk.cyan(data)}`)
}
}
module.exports = RequestQueue