190 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C)2014-2020 Haxe Foundation
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining a
 | |
|  * copy of this software and associated documentation files (the "Software"),
 | |
|  * to deal in the Software without restriction, including without limitation
 | |
|  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | |
|  * and/or sell copies of the Software, and to permit persons to whom the
 | |
|  * Software is furnished to do so, subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice shall be included in
 | |
|  * all copies or substantial portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | |
|  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | |
|  * DEALINGS IN THE SOFTWARE.
 | |
|  */
 | |
| 
 | |
| package js.node.http;
 | |
| 
 | |
| import haxe.DynamicAccess;
 | |
| import js.node.net.Socket;
 | |
| #if haxe4
 | |
| import js.lib.Error;
 | |
| #else
 | |
| import js.Error;
 | |
| #end
 | |
| 
 | |
| /**
 | |
| 	An `Agent` is responsible for managing connection persistence and reuse for HTTP clients.
 | |
| 	It maintains a queue of pending requests for a given host and port, reusing a single socket connection for each until the queue is empty,
 | |
| 	at which time the socket is either destroyed or put into a pool where it is kept to be used again for requests to the same host and port.
 | |
| 	Whether it is destroyed or pooled depends on the `keepAlive` option.
 | |
| 
 | |
| 	Pooled connections have TCP Keep-Alive enabled for them, but servers may still close idle connections, in which case they will be removed
 | |
| 	from the pool and a new connection will be made when a new HTTP request is made for that host and port.
 | |
| 	Servers may also refuse to allow multiple requests over the same connection, in which case the connection will have to be remade for every
 | |
| 	request and cannot be pooled.
 | |
| 	The `Agent` will still make the requests to that server, but each one will occur over a new connection.
 | |
| 
 | |
| 	When a connection is closed by the client or the server, it is removed from the pool.
 | |
| 	Any unused sockets in the pool will be unrefed so as not to keep the Node.js process running when there are no outstanding requests.
 | |
| 	(see [socket.unref()](https://nodejs.org/api/net.html#net_socket_unref)).
 | |
| 
 | |
| 	It is good practice, to `destroy()` an Agent instance when it is no longer in use, because unused sockets consume OS resources.
 | |
| 
 | |
| 	Sockets are removed from an agent when the socket emits either a `'close'` event or an `'agentRemove'` event.
 | |
| 	When intending to keep one HTTP request open for a long time without keeping it in the agent, something like the following may be done.
 | |
| 
 | |
| 	An agent may also be used for an individual request. By providing `{agent: false}` as an option to the `http.get()` or `http.request()` functions,
 | |
| 	a one-time use `Agent` with default options will be used for the client connection.
 | |
| **/
 | |
| @:jsRequire("http", "Agent")
 | |
| extern class Agent {
 | |
| 	/**
 | |
| 		`options` in socket.connect() are also supported.
 | |
| 
 | |
| 		The default `http.globalAgent` that is used by `http.request()` has all of these values set to their respective defaults.
 | |
| 
 | |
| 		To configure any of them, a custom `http.Agent` instance must be created.
 | |
| 	**/
 | |
| 	function new(?options:HttpAgentOptions);
 | |
| 
 | |
| 	/**
 | |
| 		Produces a socket/stream to be used for HTTP requests.
 | |
| 
 | |
| 		By default, this function is the same as `net.createConnection()`.
 | |
| 		However, custom agents may override this method in case greater flexibility is desired.
 | |
| 
 | |
| 		A socket/stream can be supplied in one of two ways: by returning the socket/stream from this function,
 | |
| 		or by passing the socket/stream to `callback`.
 | |
| 
 | |
| 		`callback` has a signature of `(err, stream)`.
 | |
| 	**/
 | |
| 	#if haxe4
 | |
| 	function createConnection(options:SocketConnectOptionsTcp, ?callback:(err:Error, stream:Socket) -> Void):Socket;
 | |
| 	#else
 | |
| 	function createConnection(options:SocketConnectOptionsTcp, ?callback:Error->Socket->Void):Socket;
 | |
| 	#end
 | |
| 
 | |
| 	/**
 | |
| 		Called when `socket` is detached from a request and could be persisted by the `Agent`.
 | |
| 
 | |
| 		This method can be overridden by a particular `Agent` subclass.
 | |
| 		If this method returns a falsy value, the socket will be destroyed instead of persisting it for use with the next request.
 | |
| 	**/
 | |
| 	function keepSocketAlive(socket:Socket):Void;
 | |
| 
 | |
| 	/**
 | |
| 		Called when `socket` is attached to `request` after being persisted because of the keep-alive options.
 | |
| 
 | |
| 		This method can be overridden by a particular `Agent` subclass.
 | |
| 	**/
 | |
| 	function reuseSocket(socket:Socket, request:ClientRequest):Void;
 | |
| 
 | |
| 	/**
 | |
| 		Destroy any sockets that are currently in use by the agent.
 | |
| 
 | |
| 		It is usually not necessary to do this. However, if using an agent with `keepAlive` enabled,
 | |
| 		then it is best to explicitly shut down the agent when it will no longer be used. Otherwise,
 | |
| 		sockets may hang open for quite a long time before the server terminates them.
 | |
| 	**/
 | |
| 	function destroy():Void;
 | |
| 
 | |
| 	/**
 | |
| 		An object which contains arrays of sockets currently awaiting use by the agent when keepAlive is enabled.
 | |
| 		Do not modify.
 | |
| 	 */
 | |
| 	var freeSockets(default, null):DynamicAccess<Array<Socket>>;
 | |
| 
 | |
| 	/**
 | |
| 		Get a unique name for a set of request options, to determine whether a connection can be reused.
 | |
| 		For an HTTP agent, this returns `host:port:localAddress` or `host:port:localAddress:family`.
 | |
| 		For an HTTPS agent, the name includes the CA, cert, ciphers, and other HTTPS/TLS-specific options that determine socket reusability.
 | |
| 	**/
 | |
| 	function getName(options:js.node.Http.HttpRequestOptions):String;
 | |
| 
 | |
| 	/**
 | |
| 		By default set to `256`.
 | |
| 		For agents with `keepAlive` enabled, this sets the maximum number of sockets that will be left open in the free state.
 | |
| 	**/
 | |
| 	var maxFreeSockets:Float;
 | |
| 
 | |
| 	/**
 | |
| 		By default set to `Infinity`.
 | |
| 		Determines how many concurrent sockets the agent can have open per origin. Origin is the returned value of `getName()`.
 | |
| 	**/
 | |
| 	var maxSockets:Float;
 | |
| 
 | |
| 	/**
 | |
| 		An object which contains queues of requests that have not yet been assigned to sockets.
 | |
| 		Do not modify.
 | |
| 	**/
 | |
| 	var requests(default, null):DynamicAccess<Array<ClientRequest>>;
 | |
| 
 | |
| 	/**
 | |
| 		An object which contains arrays of sockets currently in use by the agent.
 | |
| 		Do not modify.
 | |
| 	**/
 | |
| 	var sockets(default, null):DynamicAccess<Array<Socket>>;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 	Options for `Agent` constructor.
 | |
| **/
 | |
| typedef HttpAgentOptions = {
 | |
| 	/**
 | |
| 		Keep sockets around even when there are no outstanding requests, so they can be used for future requests
 | |
| 		without having to reestablish a TCP connection.
 | |
| 		Not to be confused with the `keep-alive` value of the `Connection` header.
 | |
| 		The `Connection: keep-alive` header is always sent when using an agent except when the `Connection` header
 | |
| 		is explicitly specified or when the `keepAlive` and `maxSockets` options are respectively set to `false` and `Infinity`,
 | |
| 		in which case `Connection: close` will be used.
 | |
| 
 | |
| 		Default: `false`
 | |
| 	**/
 | |
| 	@:optional var keepAlive:Bool;
 | |
| 
 | |
| 	/**
 | |
| 		When using the `keepAlive` option, specifies the [initial delay](https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay) for TCP Keep-Alive packets.
 | |
| 		Ignored when the `keepAlive` option is `false` or `undefined`.
 | |
| 
 | |
| 		Default: `1000`.
 | |
| 	**/
 | |
| 	@:optional var keepAliveMsecs:Int;
 | |
| 
 | |
| 	/**
 | |
| 		Maximum number of sockets to allow per host. Each request will use a new socket until the maximum is reached.
 | |
| 
 | |
| 		Default: `Infinity`.
 | |
| 	**/
 | |
| 	@:optional var maxSockets:Int;
 | |
| 
 | |
| 	/**
 | |
| 		Maximum number of sockets to leave open in a free state. Only relevant if `keepAlive` is set to `true`.
 | |
| 
 | |
| 		Default: `256`.
 | |
| 	**/
 | |
| 	@:optional var maxFreeSockets:Int;
 | |
| 
 | |
| 	/**
 | |
| 		Socket timeout in milliseconds. This will set the timeout when the socket is created.
 | |
| 	**/
 | |
| 	@:optional var timeout:Int;
 | |
| }
 |