231 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			231 lines
		
	
	
		
			8.2 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.dgram; | ||
|  | 
 | ||
|  | import js.node.events.EventEmitter; | ||
|  | import js.node.net.Socket.SocketAdress; | ||
|  | #if haxe4 | ||
|  | import js.lib.Error; | ||
|  | #else | ||
|  | import js.Error; | ||
|  | #end | ||
|  | 
 | ||
|  | /** | ||
|  | 	Enumeration of events for the `Socket` object. | ||
|  | **/ | ||
|  | @:enum abstract SocketEvent<T:haxe.Constraints.Function>(Event<T>) to Event<T> { | ||
|  | 	/** | ||
|  | 		Emitted when a new datagram is available on a socket. | ||
|  | 		Listener arguments: | ||
|  | 			msg - received data | ||
|  | 			rinfo - sender's address information and the number of bytes in the datagram
 | ||
|  | 	**/ | ||
|  | 	var Message:SocketEvent<MessageListener> = "message"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when a socket starts listening for datagrams. | ||
|  | 		This happens as soon as UDP sockets are created. | ||
|  | 	**/ | ||
|  | 	var Listening:SocketEvent<Void->Void> = "listening"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when a socket is closed with `close`. | ||
|  | 		No new message events will be emitted on this socket. | ||
|  | 	**/ | ||
|  | 	var Close:SocketEvent<Void->Void> = "close"; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Emitted when an error occurs. | ||
|  | 	**/ | ||
|  | 	var Error:SocketEvent<Error->Void> = "error"; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Remote address information for the `SocketEvent.Message` event. | ||
|  | **/ | ||
|  | typedef MessageRemoteInfo = { | ||
|  | 	> SocketAdress, | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The message size. | ||
|  | 	**/ | ||
|  | 	var size:Int; | ||
|  | } | ||
|  | 
 | ||
|  | typedef MessageListener = Buffer->MessageRemoteInfo->Void; | ||
|  | 
 | ||
|  | /** | ||
|  | 	Enumeration of possible datagram socket types | ||
|  | **/ | ||
|  | @:enum abstract SocketType(String) from String to String { | ||
|  | 	var Udp4 = "udp4"; | ||
|  | 	var Udp6 = "udp6"; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Options passed to the Socket consturctor. | ||
|  | **/ | ||
|  | typedef SocketOptions = { | ||
|  | 	/** | ||
|  | 		Type of the socket. Either udp4 or udp6. | ||
|  | 	**/ | ||
|  | 	var type:SocketType; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		When true, `Socket.bind` will reuse the address, even if another process has already bound a socket on it. | ||
|  | 		Defaults to false. | ||
|  | 	**/ | ||
|  | 	@:optional var reuseAddr:Bool; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Options for `Socket.bind` method. | ||
|  | **/ | ||
|  | typedef SocketBindOptions = { | ||
|  | 	var port:Int; | ||
|  | 	@:optional var address:String; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		If false (default), then cluster workers will use the same underlying handle, allowing connection handling | ||
|  | 		duties to be shared. When true, the handle is not shared, and attempted port sharing results in an error. | ||
|  | 	**/ | ||
|  | 	@:optional var exclusive:Bool; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  | 	Encapsulates the datagram functionality. | ||
|  | 	It should be created via `Dgram.createSocket`. | ||
|  | **/ | ||
|  | @:jsRequire("dgram", "Socket") | ||
|  | extern class Socket extends EventEmitter<Socket> { | ||
|  | 	@:overload(function(type:SocketType, ?callback:MessageListener):Void {}) | ||
|  | 	private function new(options:SocketOptions, ?callback:MessageListener); | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		The destination `port` and `address` must be specified. | ||
|  | 		A string may be supplied for the `address` parameter, and it will be resolved with DNS. | ||
|  | 
 | ||
|  | 		If the `address` is omitted or is an empty string, '0.0.0.0' or '::0' is used instead. | ||
|  | 		Depending on the network configuration, those defaults may or may not work; it's best to be
 | ||
|  | 		explicit about the destination address. | ||
|  | 
 | ||
|  | 		If the socket has not been previously bound with a call to `bind`, it gets assigned a random | ||
|  | 		port number and is bound to the "all interfaces" address ('0.0.0.0' for udp4 sockets, '::0' for udp6 sockets.) | ||
|  | 
 | ||
|  | 		An optional `callback` may be specified to detect DNS errors or for determining when it's safe | ||
|  | 		to reuse the buf object. Note that DNS lookups delay the time to send for at least one tick. | ||
|  | 		The only way to know for sure that the datagram has been sent is by using a `callback`. | ||
|  | 	**/ | ||
|  | 	function send(buf:Buffer, offset:Int, length:Int, port:Int, address:String, ?callback:Error->Int->Void):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Listen for datagrams on a named `port` and optional `address`. | ||
|  | 		If `port` is not specified, the OS will try to bind to a random port. | ||
|  | 		If `address` is not specified, the OS will try to listen on all addresses. | ||
|  | 		After binding is done, a "listening" event is emitted and the `callback` (if specified) is called. | ||
|  | 		Specifying both a "listening" event listener and `callback` is not harmful but not very useful. | ||
|  | 
 | ||
|  | 		A bound datagram socket keeps the node process running to receive datagrams. | ||
|  | 
 | ||
|  | 		If binding fails, an "error" event is generated. In rare case (e.g. binding a closed socket), | ||
|  | 		an `Error` may be thrown by this method. | ||
|  | 	**/ | ||
|  | 	@:overload(function(options:SocketBindOptions, ?callback:Void->Void):Void {}) | ||
|  | 	@:overload(function(port:Int, address:String, ?callback:Void->Void):Void {}) | ||
|  | 	@:overload(function(port:Int, ?callback:Void->Void):Void {}) | ||
|  | 	function bind(?callback:Void->Void):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Close the underlying socket and stop listening for data on it. | ||
|  | 
 | ||
|  | 		If a `callback` is provided, it is added as a listener for the 'close' event. | ||
|  | 	**/ | ||
|  | 	function close(?callback:Void->Void):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Returns an object containing the address information for a socket. | ||
|  | 	**/ | ||
|  | 	function address():SocketAdress; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Sets or clears the SO_BROADCAST socket option. | ||
|  | 		When this option is set, UDP packets may be sent to a local interface's broadcast address. | ||
|  | 	**/ | ||
|  | 	function setBroadcast(flag:Bool):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Sets the IP_TTL socket option. TTL stands for "Time to Live," but in this context it specifies | ||
|  | 		the number of IP hops that a packet is allowed to go through. Each router or gateway that forwards | ||
|  | 		a packet decrements the TTL. If the TTL is decremented to 0 by a router, it will not be forwarded. | ||
|  | 		Changing TTL values is typically done for network probes or when multicasting. | ||
|  | 
 | ||
|  | 		The argument to `setTTL` is a number of hops between 1 and 255. The default on most systems is 64. | ||
|  | 	**/ | ||
|  | 	function setTTL(ttl:Int):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Sets the IP_MULTICAST_TTL socket option. TTL stands for "Time to Live," but in this context it specifies | ||
|  | 		the number of IP hops that a packet is allowed to go through, specifically for multicast traffic. | ||
|  | 		Each router or gateway that forwards a packet decrements the TTL. If the TTL is decremented to 0 by a router, | ||
|  | 		it will not be forwarded. | ||
|  | 
 | ||
|  | 		The argument to `setMulticastTTL` is a number of hops between 0 and 255. The default on most systems is 1. | ||
|  | 	**/ | ||
|  | 	function setMulticastTTL(ttl:Int):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Sets or clears the IP_MULTICAST_LOOP socket option. | ||
|  | 		When this option is set, multicast packets will also be received on the local interface. | ||
|  | 	**/ | ||
|  | 	function setMulticastLoopback(flag:Bool):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Tells the kernel to join a multicast group with IP_ADD_MEMBERSHIP socket option. | ||
|  | 
 | ||
|  | 		If `multicastInterface` is not specified, the OS will try to add membership to all valid interfaces. | ||
|  | 	**/ | ||
|  | 	function addMembership(multicastAddress:String, ?multicastInterface:String):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Opposite of `addMembership` - tells the kernel to leave a multicast group with IP_DROP_MEMBERSHIP socket option. | ||
|  | 		This is automatically called by the kernel when the socket is closed or process terminates, | ||
|  | 		so most apps will never need to call this. | ||
|  | 
 | ||
|  | 		If `multicastInterface` is not specified, the OS will try to drop membership to all valid interfaces. | ||
|  | 	**/ | ||
|  | 	function dropMembership(multicastAddress:String, ?multicastInterface:String):Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Calling `unref` on a socket will allow the program to exit if this is the only active socket in the event system. | ||
|  | 		If the socket is already `unref`d calling `unref` again will have no effect. | ||
|  | 	**/ | ||
|  | 	function unref():Void; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 		Opposite of `unref`, calling `ref` on a previously `unref`d socket will not let | ||
|  | 		the program exit if it's the only socket left (the default behavior). | ||
|  | 		If the socket is `ref`d calling `ref` again will have no effect. | ||
|  | 	**/ | ||
|  | 	function ref():Void; | ||
|  | } |