2019-02-10 22:06:30 +00:00
/* Under construction, lots of things to add */
/** Native type representing a raw uSockets struct us_listen_socket. */
interface us_listen_socket {
}
2019-03-03 07:15:48 +00:00
/** Recognized string types, things C++ can read and understand as strings */
type RecognizedString = string | ArrayBuffer | Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array | Float32Array | Float64Array ;
2019-02-13 03:13:35 +00:00
/** A WebSocket connection that is valid from open to close event */
interface WebSocket {
/** Sends a message. Make sure to check getBufferedAmount() before sending. Returns true for success, false for built up backpressure that will drain when time is given. */
2019-04-17 09:21:02 +00:00
send ( message : RecognizedString , isBinary? : boolean , compress? : boolean ) : boolean ;
2019-02-13 03:13:35 +00:00
/** Returns the bytes buffered in backpressure. */
getBufferedAmount ( ) : number ;
/** Gradefully closes this WebSocket. Immediately calls close handler. */
2019-04-17 09:21:02 +00:00
end ( code? : number , shortMessage? : RecognizedString ) : WebSocket ;
2019-02-13 03:13:35 +00:00
/** Forefully closes this WebSocket. Immediately calls close handler. */
close ( ) : WebSocket ;
/** Subscribe to a topic in MQTT syntax */
2019-03-03 07:15:48 +00:00
subscribe ( topic : RecognizedString ) : WebSocket ;
2019-02-13 03:13:35 +00:00
/** Publish a message to a topic in MQTT syntax */
2019-03-03 07:15:48 +00:00
publish ( topic : RecognizedString , message : RecognizedString ) : WebSocket ;
2019-02-13 03:13:35 +00:00
/** Unsubscribe from topic (not implemented yet) */
2019-03-03 07:15:48 +00:00
unsubscribe ( topic : RecognizedString ) : WebSocket ;
/** Returns the remote IP address */
getRemoteAddress ( ) : ArrayBuffer ;
2019-03-04 22:41:17 +00:00
/** Arbitrary user data may be attached to this object */
[ key : string ] : any ;
2019-02-13 03:13:35 +00:00
}
2019-02-10 22:06:30 +00:00
/** An HttpResponse is valid until either onAborted callback or any of the .end/.tryEnd calls succeed. You may attach user data to this object. */
interface HttpResponse {
2019-02-13 03:13:35 +00:00
/** Writes the HTTP status message such as "200 OK". */
2019-03-03 07:15:48 +00:00
writeStatus ( status : RecognizedString ) : HttpResponse ;
2019-02-13 03:13:35 +00:00
/** Writes key and value to HTTP response. */
2019-03-03 07:15:48 +00:00
writeHeader ( key : RecognizedString , value : RecognizedString ) : HttpResponse ;
2019-02-13 03:13:35 +00:00
/** Enters or continues chunked encoding mode. Writes part of the response. End with zero length write. */
2019-03-03 07:15:48 +00:00
write ( chunk : RecognizedString ) : HttpResponse ;
2019-02-10 22:06:30 +00:00
/** Ends this response by copying the contents of body. */
2019-03-06 22:47:43 +00:00
end ( body? : RecognizedString ) : HttpResponse ;
2019-02-10 22:06:30 +00:00
/** Ends this response, or tries to, by streaming appropriately sized chunks of body. Use in conjunction with onWritable. Returns tuple [ok, hasResponded].*/
2019-03-03 07:15:48 +00:00
tryEnd ( fullBodyOrChunk : RecognizedString , totalSize : number ) : [ boolean , boolean ] ;
2019-02-13 03:13:35 +00:00
/** Immediately force closes the connection. */
close ( ) : HttpResponse ;
/** Returns the global byte write offset for this response. Use with onWritable. */
getWriteOffset ( ) : number ;
/ * * R e g i s t e r s a h a n d l e r f o r w r i t a b l e e v e n t s . C o n t i n u e f a i l e d w r i t e a t t e m p t s i n h e r e .
* You MUST return true for success , false for failure .
* Writing nothing is always success , so by default you must return true .
* /
2019-03-05 02:43:43 +00:00
onWritable ( handler : ( offset : number ) = > boolean ) : HttpResponse ;
2019-02-13 03:13:35 +00:00
/ * * E v e r y H t t p R e s p o n s e M U S T h a v e a n a t t a c h e d a b o r t h a n d l e r I F y o u d o n o t r e s p o n d
* to it immediately inside of the callback . Returning from an Http request handler
* without attaching ( by calling onAborted ) an abort handler is ill - use and will termiante .
* When this event emits , the response has been aborted and may not be used . * /
onAborted ( handler : ( res : HttpResponse ) = > void ) : HttpResponse ;
/** Handler for reading data from POST and such requests. You MUST copy the data of chunk if isLast is not true. We Neuter ArrayBuffers on return, making it zero length.*/
2019-03-04 15:29:17 +00:00
onData ( handler : ( chunk : ArrayBuffer , isLast : boolean ) = > void ) : HttpResponse ;
2019-03-03 07:15:48 +00:00
/** Returns the remote IP address */
getRemoteAddress ( ) : ArrayBuffer ;
2019-03-04 15:29:17 +00:00
/** Arbitrary user data may be attached to this object */
[ key : string ] : any ;
2019-02-10 22:06:30 +00:00
}
/** An HttpRequest is stack allocated and only accessible during the callback invocation. */
interface HttpRequest {
2019-02-13 03:13:35 +00:00
/** Returns the lowercased header value or empty string. */
2019-03-03 07:15:48 +00:00
getHeader ( lowerCaseKey : RecognizedString ) : string ;
2019-02-13 03:13:35 +00:00
/** Returns the parsed parameter at index. Corresponds to route. */
getParameter ( index : number ) : string ;
/** Returns the URL including initial /slash */
getUrl ( ) : string ;
/** Returns the HTTP method, useful for "any" routes. */
getMethod ( ) : string ;
/** Returns the part of URL after ? sign or empty string. */
getQuery ( ) : string ;
2019-03-10 11:52:42 +00:00
/** Loops over all headers. */
2019-03-12 22:17:45 +00:00
forEach ( cb : ( key : string , value : string ) = > void ) : void ;
2019-02-13 03:13:35 +00:00
}
/** A structure holding settings and handlers for a WebSocket route handler. */
interface WebSocketBehavior {
/** Maximum length of received message. */
maxPayloadLength? : number ;
/** Maximum amount of seconds that may pass without sending or getting a message. */
idleTimeout? : number ;
/** 0 = no compression, 1 = shared compressor, 2 = dedicated compressor. See C++ project. */
2019-03-03 07:15:48 +00:00
compression? : CompressOptions ;
2019-02-13 03:13:35 +00:00
/** Handler for new WebSocket connection. WebSocket is valid from open to close, no errors. */
open ? : ( ws : WebSocket , req : HttpRequest ) = > void ;
/** Handler for a WebSocket message. */
message ? : ( ws : WebSocket , message : ArrayBuffer , isBinary : boolean ) = > void ;
/** Handler for when WebSocket backpressure drains. Check ws.getBufferedAmount(). */
drain ? : ( ws : WebSocket ) = > void ;
/** Handler for close event, no matter if error, timeout or graceful close. You may not use WebSocket after this event. */
close ? : ( ws : WebSocket , code : number , message : ArrayBuffer ) = > void ;
}
/** Options used when constructing an app. */
interface AppOptions {
2019-03-03 07:15:48 +00:00
key_file_name? : RecognizedString ;
cert_file_name? : RecognizedString ;
passphrase? : RecognizedString ;
dh_params_file_name? : RecognizedString ;
2019-03-10 13:13:06 +00:00
/** This translates to SSL_MODE_RELEASE_BUFFERS */
ssl_prefer_low_memory_usage? : boolean ;
2019-02-10 22:06:30 +00:00
}
/** TemplatedApp is either an SSL or non-SSL app. */
interface TemplatedApp {
/** Listens to hostname & port. Callback hands either false or a listen socket. */
2019-03-03 07:15:48 +00:00
listen ( host : RecognizedString , port : number , cb : ( listenSocket : us_listen_socket ) = > void ) : TemplatedApp ;
2019-02-10 22:06:30 +00:00
/** Listens to port. Callback hands either false or a listen socket. */
listen ( port : number , cb : ( listenSocket : any ) = > void ) : TemplatedApp ;
/** Registers an HTTP GET handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
get ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-10 22:06:30 +00:00
/** Registers an HTTP POST handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
post ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP OPTIONS handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
options ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP DELETE handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
del ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP PATCH handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
patch ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP PUT handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
put ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP HEAD handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
head ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP CONNECT handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
connect ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP TRACE handler matching specified URL pattern. */
2019-03-03 07:15:48 +00:00
trace ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers an HTTP handler matching specified URL pattern on any HTTP method. */
2019-03-03 07:15:48 +00:00
any ( pattern : RecognizedString , handler : ( res : HttpResponse , req : HttpRequest ) = > void ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Registers a handler matching specified URL pattern where WebSocket upgrade requests are caught. */
2019-03-03 07:15:48 +00:00
ws ( pattern : RecognizedString , behavior : WebSocketBehavior ) : TemplatedApp ;
2019-02-10 22:06:30 +00:00
}
/** Constructs a non-SSL app */
export function App ( options : AppOptions ) : TemplatedApp ;
/** Constructs an SSL app */
export function SSLApp ( options : AppOptions ) : TemplatedApp ;
2019-02-13 03:13:35 +00:00
/** Closes a uSockets listen socket. */
export function us_listen_socket_close ( listenSocket : us_listen_socket ) : void ;
2019-02-21 19:03:43 +00:00
/** WebSocket compression options */
export enum CompressOptions {
/** No compression (always a good idea) */
DISABLED ,
/** Zero memory overhead compression (recommended) */
SHARED_COMPRESSOR ,
/** Sliding dedicated compress window, requires lots of memory per socket */
DEDICATED_COMPRESSOR
}