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;
 | 
						|
}
 |