bare-http1 4.1.3 → 4.1.4
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/index.d.ts +2 -0
- package/index.js +0 -3
- package/lib/agent.js +54 -51
- package/lib/server.js +2 -0
- package/package.json +1 -1
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -43,9 +43,6 @@ exports.request = function request(url, opts, onresponse) {
|
|
|
43
43
|
opts.port = typeof opts.port === 'string' ? parseInt(opts.port, 10) : opts.port
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
// TODO: Renable the default global agent when hangs have been sorted
|
|
47
|
-
opts.agent = opts.agent || new exports.Agent()
|
|
48
|
-
|
|
49
46
|
return new exports.ClientRequest(opts, onresponse)
|
|
50
47
|
}
|
|
51
48
|
|
package/lib/agent.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
+
const EventEmitter = require('bare-events')
|
|
1
2
|
const tcp = require('bare-tcp')
|
|
2
3
|
const HTTPClientConnection = require('./client-connection')
|
|
3
|
-
const EventEmitter = require('bare-events')
|
|
4
4
|
|
|
5
5
|
module.exports = class HTTPAgent extends EventEmitter {
|
|
6
6
|
constructor(opts = {}) {
|
|
7
7
|
super()
|
|
8
8
|
|
|
9
9
|
const { keepAlive = false, keepAliveMsecs = 1000 } = opts
|
|
10
|
-
this.options = { keepAlive, keepAliveMsecs }
|
|
11
10
|
|
|
12
11
|
this._sockets = new Map()
|
|
13
12
|
this._freeSockets = new Map()
|
|
@@ -47,27 +46,67 @@ module.exports = class HTTPAgent extends EventEmitter {
|
|
|
47
46
|
|
|
48
47
|
if (this._freeSockets.has(name)) {
|
|
49
48
|
const sockets = this._freeSockets.get(name)
|
|
50
|
-
|
|
51
|
-
sockets.
|
|
52
|
-
|
|
49
|
+
|
|
50
|
+
socket = sockets.pop()
|
|
51
|
+
|
|
52
|
+
if (sockets.length === 0) this._freeSockets.delete(name)
|
|
53
53
|
|
|
54
54
|
this.reuseSocket(socket, req)
|
|
55
55
|
} else {
|
|
56
|
+
const agent = this
|
|
57
|
+
|
|
56
58
|
socket = this.createConnection(opts)
|
|
57
59
|
|
|
58
|
-
socket
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
socket.on('free', onfree).on('end', onremove).on('finish', onremove).on('timeout', ontimeout)
|
|
61
|
+
|
|
62
|
+
function onfree() {
|
|
63
|
+
if (agent.keepSocketAlive(socket)) {
|
|
64
|
+
onremove(false)
|
|
65
|
+
|
|
66
|
+
const sockets = agent._freeSockets.get(name)
|
|
67
|
+
|
|
68
|
+
if (sockets === undefined) agent._freeSockets.set(name, [socket])
|
|
69
|
+
else sockets.push(socket)
|
|
70
|
+
} else {
|
|
71
|
+
socket.end()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
agent.emit('free', socket)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function onremove(destroy = true) {
|
|
78
|
+
for (const set of destroy ? [agent._sockets, agent._freeSockets] : [agent._sockets]) {
|
|
79
|
+
const sockets = set.get(name)
|
|
80
|
+
if (sockets === undefined) continue
|
|
81
|
+
|
|
82
|
+
const i = sockets.indexOf(socket)
|
|
83
|
+
if (i === -1) continue
|
|
84
|
+
|
|
85
|
+
const last = sockets.pop()
|
|
86
|
+
if (last !== socket) sockets[i] = last
|
|
87
|
+
|
|
88
|
+
if (sockets.length === 0) set.delete(name)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function ontimeout(socket, name) {
|
|
93
|
+
const sockets = agent._freeSockets.get(name)
|
|
94
|
+
if (sockets === undefined) return
|
|
95
|
+
|
|
96
|
+
const i = sockets.indexOf(socket)
|
|
97
|
+
if (i === -1) return
|
|
63
98
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
99
|
+
const last = sockets.pop()
|
|
100
|
+
if (last !== socket) sockets[i] = last
|
|
101
|
+
|
|
102
|
+
if (sockets.length === 0) agent._freeSockets.delete(name)
|
|
103
|
+
}
|
|
68
104
|
}
|
|
69
105
|
|
|
70
|
-
sockets.
|
|
106
|
+
const sockets = this._sockets.get(name)
|
|
107
|
+
|
|
108
|
+
if (sockets === undefined) this._sockets.set(name, [socket])
|
|
109
|
+
else sockets.push(socket)
|
|
71
110
|
|
|
72
111
|
req.socket = socket
|
|
73
112
|
|
|
@@ -84,41 +123,5 @@ module.exports = class HTTPAgent extends EventEmitter {
|
|
|
84
123
|
}
|
|
85
124
|
}
|
|
86
125
|
|
|
87
|
-
_onfree(socket, name) {
|
|
88
|
-
if (this.keepSocketAlive(socket)) {
|
|
89
|
-
this._onremove(socket, name, false)
|
|
90
|
-
|
|
91
|
-
let sockets = this._freeSockets.get(name)
|
|
92
|
-
if (sockets === undefined) {
|
|
93
|
-
sockets = new Set()
|
|
94
|
-
this._freeSockets.set(name, sockets)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
sockets.add(socket)
|
|
98
|
-
} else {
|
|
99
|
-
socket.end()
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
this.emit('free', socket)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
_onremove(socket, name, all = true) {
|
|
106
|
-
for (const set of all ? [this._sockets, this._freeSockets] : [this._sockets]) {
|
|
107
|
-
const sockets = set.get(name)
|
|
108
|
-
if (sockets === undefined) continue
|
|
109
|
-
|
|
110
|
-
sockets.delete(socket)
|
|
111
|
-
if (sockets.size === 0) set.delete(name)
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
_ontimeout(socket, name) {
|
|
116
|
-
const sockets = this._freeSockets.get(name)
|
|
117
|
-
if (!sockets) return
|
|
118
|
-
|
|
119
|
-
if (sockets.delete(socket)) socket.destroy()
|
|
120
|
-
if (sockets.size === 0) this._freeSockets.delete(name)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
126
|
static global = new this({ keepAlive: 1000, timeout: 5000 })
|
|
124
127
|
}
|
package/lib/server.js
CHANGED