bare-http1 4.1.2 → 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 +12 -33
- package/index.js +1 -2
- package/lib/agent.js +55 -59
- package/lib/client-connection.js +1 -4
- package/lib/client-request.js +2 -4
- package/lib/server-connection.js +2 -8
- package/lib/server-response.js +2 -5
- package/lib/server.js +3 -4
- package/package.json +2 -2
package/index.d.ts
CHANGED
|
@@ -8,11 +8,7 @@ import {
|
|
|
8
8
|
} from 'bare-tcp'
|
|
9
9
|
import Buffer from 'bare-buffer'
|
|
10
10
|
import URL from 'bare-url'
|
|
11
|
-
import constants, {
|
|
12
|
-
HTTPMethod,
|
|
13
|
-
HTTPStatusCode,
|
|
14
|
-
HTTPStatusMessage
|
|
15
|
-
} from './lib/constants'
|
|
11
|
+
import constants, { HTTPMethod, HTTPStatusCode, HTTPStatusMessage } from './lib/constants'
|
|
16
12
|
import HTTPError from './lib/errors'
|
|
17
13
|
|
|
18
14
|
export {
|
|
@@ -111,18 +107,13 @@ export interface HTTPAgent {
|
|
|
111
107
|
|
|
112
108
|
getName(opts: { host: string; port: number }): string
|
|
113
109
|
|
|
114
|
-
addRequest(
|
|
115
|
-
req: HTTPClientRequest,
|
|
116
|
-
opts: TCPSocketOptions & TCPSocketConnectOptions
|
|
117
|
-
): void
|
|
110
|
+
addRequest(req: HTTPClientRequest, opts: TCPSocketOptions & TCPSocketConnectOptions): void
|
|
118
111
|
|
|
119
112
|
destroy(): void
|
|
120
113
|
}
|
|
121
114
|
|
|
122
115
|
export class HTTPAgent {
|
|
123
|
-
constructor(
|
|
124
|
-
opts?: HTTPAgentOptions & TCPSocketOptions & TCPSocketConnectOptions
|
|
125
|
-
)
|
|
116
|
+
constructor(opts?: HTTPAgentOptions & TCPSocketOptions & TCPSocketConnectOptions)
|
|
126
117
|
|
|
127
118
|
static global: HTTPAgent
|
|
128
119
|
}
|
|
@@ -137,8 +128,7 @@ export interface HTTPServerEvents extends TCPServerEvents {
|
|
|
137
128
|
timeout: [socket: TCPSocket]
|
|
138
129
|
}
|
|
139
130
|
|
|
140
|
-
export interface HTTPServer<M extends HTTPServerEvents = HTTPServerEvents>
|
|
141
|
-
extends TCPServer<M> {
|
|
131
|
+
export interface HTTPServer<M extends HTTPServerEvents = HTTPServerEvents> extends TCPServer<M> {
|
|
142
132
|
readonly timeout: number | undefined
|
|
143
133
|
|
|
144
134
|
setTimeout(ms: number, ontimeout?: () => void): this
|
|
@@ -150,9 +140,7 @@ export class HTTPServer {
|
|
|
150
140
|
onrequest?: (req: HTTPIncomingMessage, res: HTTPServerResponse) => void
|
|
151
141
|
)
|
|
152
142
|
|
|
153
|
-
constructor(
|
|
154
|
-
onrequest: (req: HTTPIncomingMessage, res: HTTPServerResponse) => void
|
|
155
|
-
)
|
|
143
|
+
constructor(onrequest: (req: HTTPIncomingMessage, res: HTTPServerResponse) => void)
|
|
156
144
|
}
|
|
157
145
|
|
|
158
146
|
export { HTTPServer as Server }
|
|
@@ -168,10 +156,7 @@ export interface HTTPServerResponse extends HTTPOutgoingMessage {
|
|
|
168
156
|
headers?: Record<string, string | number>
|
|
169
157
|
): void
|
|
170
158
|
|
|
171
|
-
writeHead(
|
|
172
|
-
statusCode: HTTPStatusCode,
|
|
173
|
-
headers?: Record<string, string | number>
|
|
174
|
-
): void
|
|
159
|
+
writeHead(statusCode: HTTPStatusCode, headers?: Record<string, string | number>): void
|
|
175
160
|
}
|
|
176
161
|
|
|
177
162
|
export class HTTPServerResponse {
|
|
@@ -191,14 +176,12 @@ export interface HTTPServerConnection {
|
|
|
191
176
|
|
|
192
177
|
readonly req: HTTPIncomingMessage | null
|
|
193
178
|
readonly res: HTTPServerResponse | null
|
|
179
|
+
|
|
180
|
+
readonly idle: boolean
|
|
194
181
|
}
|
|
195
182
|
|
|
196
183
|
export class HTTPServerConnection {
|
|
197
|
-
constructor(
|
|
198
|
-
server: HTTPServer,
|
|
199
|
-
socket: TCPSocket,
|
|
200
|
-
opts?: HTTPServerConnectionOptions
|
|
201
|
-
)
|
|
184
|
+
constructor(server: HTTPServer, socket: TCPSocket, opts?: HTTPServerConnectionOptions)
|
|
202
185
|
|
|
203
186
|
static for(socket: TCPSocket): HTTPServerConnection
|
|
204
187
|
}
|
|
@@ -217,9 +200,8 @@ export interface HTTPClientRequestOptions extends TCPSocketConnectOptions {
|
|
|
217
200
|
path?: string
|
|
218
201
|
}
|
|
219
202
|
|
|
220
|
-
export interface HTTPClientRequest<
|
|
221
|
-
|
|
222
|
-
> extends HTTPOutgoingMessage<M> {
|
|
203
|
+
export interface HTTPClientRequest<M extends HTTPClientRequestEvents = HTTPClientRequestEvents>
|
|
204
|
+
extends HTTPOutgoingMessage<M> {
|
|
223
205
|
readonly method: HTTPMethod
|
|
224
206
|
readonly path: string
|
|
225
207
|
readonly headers: Record<string, string | number>
|
|
@@ -251,10 +233,7 @@ export class HTTPClientConnection {
|
|
|
251
233
|
|
|
252
234
|
static for(socket: TCPSocket): HTTPClientConnection | null
|
|
253
235
|
|
|
254
|
-
static from(
|
|
255
|
-
socket: TCPSocket,
|
|
256
|
-
opts?: HTTPClientConnectionOptions
|
|
257
|
-
): HTTPClientConnection
|
|
236
|
+
static from(socket: TCPSocket, opts?: HTTPClientConnectionOptions): HTTPClientConnection
|
|
258
237
|
}
|
|
259
238
|
|
|
260
239
|
export { HTTPClientConnection as ClientConnection }
|
package/index.js
CHANGED
|
@@ -40,8 +40,7 @@ exports.request = function request(url, opts, onresponse) {
|
|
|
40
40
|
|
|
41
41
|
// For Node.js compatibility
|
|
42
42
|
opts.host = opts.hostname || opts.host
|
|
43
|
-
opts.port =
|
|
44
|
-
typeof opts.port === 'string' ? parseInt(opts.port, 10) : opts.port
|
|
43
|
+
opts.port = typeof opts.port === 'string' ? parseInt(opts.port, 10) : opts.port
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
return new exports.ClientRequest(opts, onresponse)
|
package/lib/agent.js
CHANGED
|
@@ -1,23 +1,17 @@
|
|
|
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()
|
|
14
13
|
|
|
15
|
-
this._keepAlive =
|
|
16
|
-
typeof keepAlive === 'number'
|
|
17
|
-
? keepAlive
|
|
18
|
-
: keepAlive
|
|
19
|
-
? keepAliveMsecs
|
|
20
|
-
: -1
|
|
14
|
+
this._keepAlive = typeof keepAlive === 'number' ? keepAlive : keepAlive ? keepAliveMsecs : -1
|
|
21
15
|
|
|
22
16
|
this._opts = { ...opts }
|
|
23
17
|
}
|
|
@@ -52,27 +46,67 @@ module.exports = class HTTPAgent extends EventEmitter {
|
|
|
52
46
|
|
|
53
47
|
if (this._freeSockets.has(name)) {
|
|
54
48
|
const sockets = this._freeSockets.get(name)
|
|
55
|
-
|
|
56
|
-
sockets.
|
|
57
|
-
|
|
49
|
+
|
|
50
|
+
socket = sockets.pop()
|
|
51
|
+
|
|
52
|
+
if (sockets.length === 0) this._freeSockets.delete(name)
|
|
58
53
|
|
|
59
54
|
this.reuseSocket(socket, req)
|
|
60
55
|
} else {
|
|
56
|
+
const agent = this
|
|
57
|
+
|
|
61
58
|
socket = this.createConnection(opts)
|
|
62
59
|
|
|
63
|
-
socket
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
68
98
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
99
|
+
const last = sockets.pop()
|
|
100
|
+
if (last !== socket) sockets[i] = last
|
|
101
|
+
|
|
102
|
+
if (sockets.length === 0) agent._freeSockets.delete(name)
|
|
103
|
+
}
|
|
73
104
|
}
|
|
74
105
|
|
|
75
|
-
sockets.
|
|
106
|
+
const sockets = this._sockets.get(name)
|
|
107
|
+
|
|
108
|
+
if (sockets === undefined) this._sockets.set(name, [socket])
|
|
109
|
+
else sockets.push(socket)
|
|
76
110
|
|
|
77
111
|
req.socket = socket
|
|
78
112
|
|
|
@@ -89,43 +123,5 @@ module.exports = class HTTPAgent extends EventEmitter {
|
|
|
89
123
|
}
|
|
90
124
|
}
|
|
91
125
|
|
|
92
|
-
_onfree(socket, name) {
|
|
93
|
-
if (this.keepSocketAlive(socket)) {
|
|
94
|
-
this._onremove(socket, name, false)
|
|
95
|
-
|
|
96
|
-
let sockets = this._freeSockets.get(name)
|
|
97
|
-
if (sockets === undefined) {
|
|
98
|
-
sockets = new Set()
|
|
99
|
-
this._freeSockets.set(name, sockets)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
sockets.add(socket)
|
|
103
|
-
} else {
|
|
104
|
-
socket.end()
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
this.emit('free', socket)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
_onremove(socket, name, all = true) {
|
|
111
|
-
for (const set of all
|
|
112
|
-
? [this._sockets, this._freeSockets]
|
|
113
|
-
: [this._sockets]) {
|
|
114
|
-
const sockets = set.get(name)
|
|
115
|
-
if (sockets === undefined) continue
|
|
116
|
-
|
|
117
|
-
sockets.delete(socket)
|
|
118
|
-
if (sockets.size === 0) set.delete(name)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
_ontimeout(socket, name) {
|
|
123
|
-
const sockets = this._freeSockets.get(name)
|
|
124
|
-
if (!sockets) return
|
|
125
|
-
|
|
126
|
-
if (sockets.delete(socket)) socket.destroy()
|
|
127
|
-
if (sockets.size === 0) this._freeSockets.delete(name)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
126
|
static global = new this({ keepAlive: 1000, timeout: 5000 })
|
|
131
127
|
}
|
package/lib/client-connection.js
CHANGED
|
@@ -90,10 +90,7 @@ module.exports = class HTTPClientConnection {
|
|
|
90
90
|
this.socket.emit('free')
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
-
if (
|
|
94
|
-
op.headers.connection &&
|
|
95
|
-
op.headers.connection.toLowerCase() === 'upgrade'
|
|
96
|
-
) {
|
|
93
|
+
if (op.headers.connection && op.headers.connection.toLowerCase() === 'upgrade') {
|
|
97
94
|
return this._onupgrade(this._parser.end())
|
|
98
95
|
}
|
|
99
96
|
|
package/lib/client-request.js
CHANGED
|
@@ -13,8 +13,7 @@ module.exports = class HTTPClientRequest extends HTTPOutgoingMessage {
|
|
|
13
13
|
|
|
14
14
|
opts = opts ? { ...opts } : {}
|
|
15
15
|
|
|
16
|
-
const agent =
|
|
17
|
-
opts.agent === false ? new HTTPAgent() : opts.agent || HTTPAgent.global
|
|
16
|
+
const agent = opts.agent === false ? new HTTPAgent() : opts.agent || HTTPAgent.global
|
|
18
17
|
const method = opts.method || 'GET'
|
|
19
18
|
const path = opts.path || '/'
|
|
20
19
|
const host = (opts.host = opts.host || 'localhost')
|
|
@@ -50,8 +49,7 @@ module.exports = class HTTPClientRequest extends HTTPOutgoingMessage {
|
|
|
50
49
|
const v = this.headers[name]
|
|
51
50
|
|
|
52
51
|
if (n === 'content-length') this._chunked = false
|
|
53
|
-
if (n === 'connection' && v && v.toLowerCase() === 'upgrade')
|
|
54
|
-
upgrade = true
|
|
52
|
+
if (n === 'connection' && v && v.toLowerCase() === 'upgrade') upgrade = true
|
|
55
53
|
|
|
56
54
|
h += `${httpCase(n)}: ${v}\r\n`
|
|
57
55
|
}
|
package/lib/server-connection.js
CHANGED
|
@@ -18,10 +18,7 @@ module.exports = class HTTPServerConnection {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
constructor(server, socket, opts = {}) {
|
|
21
|
-
const {
|
|
22
|
-
IncomingMessage = HTTPIncomingMessage,
|
|
23
|
-
ServerResponse = HTTPServerResponse
|
|
24
|
-
} = opts
|
|
21
|
+
const { IncomingMessage = HTTPIncomingMessage, ServerResponse = HTTPServerResponse } = opts
|
|
25
22
|
|
|
26
23
|
this.server = server
|
|
27
24
|
this.socket = socket
|
|
@@ -89,10 +86,7 @@ module.exports = class HTTPServerConnection {
|
|
|
89
86
|
this.req.resume()
|
|
90
87
|
this.req.pause()
|
|
91
88
|
|
|
92
|
-
if (
|
|
93
|
-
op.headers.connection &&
|
|
94
|
-
op.headers.connection.toLowerCase() === 'upgrade'
|
|
95
|
-
) {
|
|
89
|
+
if (op.headers.connection && op.headers.connection.toLowerCase() === 'upgrade') {
|
|
96
90
|
return this._onupgrade(this._parser.end())
|
|
97
91
|
}
|
|
98
92
|
|
package/lib/server-response.js
CHANGED
|
@@ -42,9 +42,7 @@ module.exports = class HTTPServerResponse extends HTTPOutgoingMessage {
|
|
|
42
42
|
'HTTP/1.1 ' +
|
|
43
43
|
this.statusCode +
|
|
44
44
|
' ' +
|
|
45
|
-
(this.statusMessage === null
|
|
46
|
-
? constants.status[this.statusCode]
|
|
47
|
-
: this.statusMessage) +
|
|
45
|
+
(this.statusMessage === null ? constants.status[this.statusCode] : this.statusMessage) +
|
|
48
46
|
'\r\n'
|
|
49
47
|
|
|
50
48
|
for (const name of Object.keys(this.headers)) {
|
|
@@ -52,8 +50,7 @@ module.exports = class HTTPServerResponse extends HTTPOutgoingMessage {
|
|
|
52
50
|
const v = this.headers[name]
|
|
53
51
|
|
|
54
52
|
if (n === 'content-length') this._chunked = false
|
|
55
|
-
if (n === 'connection' && v && v.toLowerCase() === 'close')
|
|
56
|
-
this._close = true
|
|
53
|
+
if (n === 'connection' && v && v.toLowerCase() === 'close') this._close = true
|
|
57
54
|
|
|
58
55
|
h += httpCase(n) + ': ' + v + '\r\n'
|
|
59
56
|
}
|
package/lib/server.js
CHANGED
|
@@ -12,10 +12,7 @@ module.exports = class HTTPServer extends TCPServer {
|
|
|
12
12
|
|
|
13
13
|
this._timeout = 0
|
|
14
14
|
|
|
15
|
-
this.on(
|
|
16
|
-
'connection',
|
|
17
|
-
(socket) => new HTTPServerConnection(this, socket, opts)
|
|
18
|
-
)
|
|
15
|
+
this.on('connection', (socket) => new HTTPServerConnection(this, socket, opts))
|
|
19
16
|
|
|
20
17
|
if (onrequest) this.on('request', onrequest)
|
|
21
18
|
}
|
|
@@ -42,5 +39,7 @@ module.exports = class HTTPServer extends TCPServer {
|
|
|
42
39
|
socket.destroy()
|
|
43
40
|
}
|
|
44
41
|
}
|
|
42
|
+
|
|
43
|
+
return this
|
|
45
44
|
}
|
|
46
45
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bare-http1",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"description": "Native HTTP/1 library for JavaScript",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package": "./package.json",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"bare-url": "^2.1.3",
|
|
47
47
|
"brittle": "^3.3.0",
|
|
48
48
|
"prettier": "^3.4.1",
|
|
49
|
-
"prettier-config-
|
|
49
|
+
"prettier-config-holepunch": "^2.0.0"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"bare-buffer": "*",
|