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 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
- M extends HTTPClientRequestEvents = HTTPClientRequestEvents
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
- socket = sockets.values().next().value
56
- sockets.delete(socket)
57
- if (sockets.size === 0) this._freeSockets.delete(name)
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
- .on('free', () => this._onfree(socket, name))
65
- .on('close', () => this._onremove(socket, name))
66
- .on('timeout', () => this._ontimeout(socket, name))
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
- let sockets = this._sockets.get(name)
70
- if (sockets === undefined) {
71
- sockets = new Set()
72
- this._sockets.set(name, sockets)
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.add(socket)
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
  }
@@ -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
 
@@ -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
  }
@@ -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
 
@@ -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.2",
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-standard": "^7.0.0"
49
+ "prettier-config-holepunch": "^2.0.0"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "bare-buffer": "*",