111 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package eval.luv; | |||
|  | 
 | |||
|  | @:coreType abstract TStream<T> to Stream {} | |||
|  | // typedef TStream<T> = Stream; | |||
|  | 
 | |||
|  | enum SendHandle { | |||
|  | 	TCP(tcp:Tcp); | |||
|  | 	PIPE(pipe:Pipe); | |||
|  | } | |||
|  | 
 | |||
|  | /** | |||
|  | 	Streams. | |||
|  | 
 | |||
|  | 	@see https://aantron.github.io/luv/luv/Luv/Stream | |||
|  | **/ | |||
|  | @:coreType abstract Stream to Handle { | |||
|  | 	/** | |||
|  | 		Shuts down the write side of the stream. | |||
|  | 	**/ | |||
|  | 	extern static public function shutdown(stream:Stream, callback:(result:Result<Result.NoData>)->Void):Void; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Starts listening for incoming connections. | |||
|  | 
 | |||
|  | 		`backlog` indicates the number of connections the kernel might queue. | |||
|  | 		When a new incoming connection is received the `callback` is called. | |||
|  | 	**/ | |||
|  | 	extern static public function listen(stream:Stream, callback:(result:Result<Result.NoData>)->Void, ?backlog:Int):Void; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		This call is used in conjunction with `Stream.listen()` to accept incoming | |||
|  | 		connections. Call this function after receiving a `callback` of `listen(callback)` | |||
|  | 		to accept the connection. Before calling this function the client handle | |||
|  | 		must be initialized. | |||
|  | 
 | |||
|  | 		When the `callback` of `listen(callback)` is called it is guaranteed that | |||
|  | 		this function will complete successfully the first time. | |||
|  | 
 | |||
|  | 		`client` should be a freshly-initialized stream. | |||
|  | 	**/ | |||
|  | 	extern static public function accept<T>(server:TStream<T>, client:TStream<T>):Result<Result.NoData>; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Calls the `callback` whenever data is available on the stream. | |||
|  | 
 | |||
|  | 		The amount of data read is equal to the length of the buffer passed to | |||
|  | 		the `callback`. `allocate` is called immediately before each call to the | |||
|  | 		main `callback`, to create buffer, into which the data will be read. | |||
|  | 
 | |||
|  | 		The end of the stream (typically, when the remote peer closes or shuts down | |||
|  | 		the connection) is indicated by `UVError.UV_EOF` being passed to the `callback`. | |||
|  | 		Note that this behavior is different from `eval.luv.File.read`. | |||
|  | 
 | |||
|  | 		Zero-length reads are possible, and do not indicate the end of stream. Instead, | |||
|  | 		they usually indicate `UVError.UV_EAGAIN` inside libuv; libuv still calls the | |||
|  | 		`callback` in order to give the C user a chance to deallocate the data buffer. | |||
|  | 		This is not usually an issue in OCaml (which is the backend for eval target of | |||
|  | 		Haxe), so a wrapper of this function can usually simply ignore zero-length reads. | |||
|  | 		It is then also safe to convert `UVError.UV_EOF` to zero-length reads in a | |||
|  | 		higher-level API, for consistency with reading files, and in accordance with OS | |||
|  | 		API convention. | |||
|  | 
 | |||
|  | 		To read only once, call `eval.luv.Stream.readStop` immediately, in the `callback`. | |||
|  | 		Otherwise, the main callback will be called repeatedly. | |||
|  | 	**/ | |||
|  | 	extern static public function readStart(stream:Stream, callback:(result:Result<Buffer>)->Void, ?allocate:(size:Int)->Buffer):Void; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Stops reading. | |||
|  | 	**/ | |||
|  | 	extern static public function readStop(stream:Stream):Result<Result.NoData>; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Writes the given buffer to the stream. | |||
|  | 
 | |||
|  | 		The second argument passed to the `callback` is the number of bytes written. | |||
|  | 		libuv has an internal queue of writes, in part to implement retry. This means | |||
|  | 		that writes can be partial at the libuv API level, so it is possible to receive | |||
|  | 		both an `UVError` result, and for some data to have been successfully written. | |||
|  | 	**/ | |||
|  | 	extern static public function write(stream:Stream, data:Array<Buffer>, callback:(result:Result<Result.NoData>, bytesWritten:Int)->Void):Result<Result.NoData>; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Like `eval.luv.Stream.write`, but allows sending a TCP socket or pipe over the | |||
|  | 		stream. | |||
|  | 	**/ | |||
|  | 	extern static public function write2(stream:TStream<Pipe>, data:Array<Buffer>, sendHandle:SendHandle, callback:(result:Result<Result.NoData>, bytesWritten:Int)->Void):Result<Result.NoData>; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Same as `eval.luv.Stream.write()`, but won’t queue a write request if it can’t | |||
|  | 		be completed immediately. | |||
|  | 
 | |||
|  | 		Returns the number of bytes written. | |||
|  | 	**/ | |||
|  | 	extern static public function tryWrite(stream:Stream, data:Array<Buffer>):Result<Int>; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Indicates whether the stream is readable (has data). | |||
|  | 	**/ | |||
|  | 	extern static public function isReadable(stream:Stream):Bool; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Indicates whether the stream is writable (has space in buffers). | |||
|  | 	**/ | |||
|  | 	extern static public function isWritable(stream:Stream):Bool; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 		Sets the blocking mode of the stream. | |||
|  | 	**/ | |||
|  | 	extern static public function setBlocking(stream:Stream, block:Bool):Result<Result.NoData>; | |||
|  | } |