forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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; | ||
|  | } |