├── .gitignore ├── Ex1.hx ├── Ex2.hx ├── README ├── build └── js └── Node.hx /.gitignore: -------------------------------------------------------------------------------- 1 | .hgignore 2 | .hg 3 | eproject.cfg 4 | haxelib.xml 5 | /ex1.js 6 | /ex2.js 7 | nodejs.zip 8 | .DS_Store 9 | -------------------------------------------------------------------------------- /Ex1.hx: -------------------------------------------------------------------------------- 1 | 2 | import js.Node; 3 | 4 | class Ex1 { 5 | public static function main() { 6 | trace(Node.process.memoryUsage()); 7 | trace(Node.process.memoryUsage().heapTotal); 8 | 9 | Node.dns.resolve("ipowerhouse.com","A",function(err,ips:Array) { 10 | trace(ips); 11 | }); 12 | } 13 | 14 | } 15 | 16 | // Compile with 17 | // haxe -D nodejs -cp . -js ex1.js -main Ex1 18 | -------------------------------------------------------------------------------- /Ex2.hx: -------------------------------------------------------------------------------- 1 | 2 | // Compile with 3 | // haxe -D nodejs -cp . -js ex2.js -main Ex2 4 | 5 | 6 | import js.Node; 7 | 8 | class Ex2 { 9 | 10 | public static 11 | function main() { 12 | clientTest(); 13 | // tcpTest(); 14 | //flashCrossDomain(); 15 | } 16 | 17 | public static function 18 | tcpTest() { 19 | 20 | var tcp = Node.net; 21 | 22 | var s = tcp.createServer(function(c) { 23 | c.addListener('connect',function(d) { 24 | trace("got connection"); 25 | c.write("hello\r\n"); 26 | }); 27 | 28 | c.addListener('data',function(d) { 29 | c.write(d); 30 | }); 31 | 32 | c.addListener('data',function(d) { 33 | trace("lost connection"); 34 | c.end(); 35 | }); 36 | }); 37 | 38 | s.listen(5000,"localhost"); 39 | 40 | trace("here"); 41 | } 42 | 43 | public static function 44 | flashCrossDomain() { 45 | var tcp = Node.net; 46 | 47 | var s = tcp.createServer(function(c) { 48 | c.addListener('connect',function(d) { 49 | c.write(' 50 | 52 | 53 | 54 | '); 55 | c.end(); 56 | }); 57 | 58 | c.addListener('end',function(d) { 59 | trace("lost connection"); 60 | c.end(); 61 | }); 62 | }); 63 | 64 | trace("args[1] "+Node.process.argv[2]); 65 | s.listen(843,Node.process.argv[2]); 66 | 67 | } 68 | 69 | 70 | static function 71 | clientTest() { 72 | var 73 | console = Node.console, 74 | http = Node.http, 75 | google = http.createClient(80, "www.google.cl"), 76 | request = google.request("GET","/", {host: "www.google.cl"}); 77 | 78 | 79 | request.addListener('response',function (response) { 80 | console.log("STATUS: " + response.statusCode); 81 | console.log("HEADERS: " + Node.stringify(response.headers)); 82 | response.addListener("data", function (chunk) { 83 | console.log("BODY: " + chunk); 84 | }); 85 | }); 86 | 87 | request.end(); 88 | 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | 2 | hx-node provides haxe type signatures to Node.js 0.6x. 3 | 4 | The base Node API is in js/Node.hx. 5 | 6 | There are no abstractions or wrappers just the raw api, this allows you to 7 | implement wrappers on top to your own taste. For example, I've wrapped basic 8 | functionality with futures and map strings events to enums here 9 | https://github.com/cloudshift/Sys. 10 | 11 | Also find on haxelib as "nodejs". 12 | 13 | Compiling with haxe 14 | ------------------- 15 | 16 | For example, file Ex1.hx 17 | 18 | import js.Node; 19 | 20 | class Ex1 { 21 | public static function main() { 22 | trace(Node.process.memoryUsage()); 23 | trace(Node.process.memoryUsage().heapTotal); 24 | 25 | Node.dns.resolve("cloudshift.cl","A",function(err,ips:Array) { 26 | trace(ips); 27 | }); 28 | } 29 | 30 | } 31 | 32 | Compile with 33 | 34 | haxe -D nodejs -cp . -js ex1.js -main Ex1 35 | 36 | where -cp . adds the current directory to the classpath which should include the provided js 37 | directory. You must add -D nodejs to the compile line. 38 | 39 | and then to execute 40 | 41 | node ex1.js 42 | 43 | Ex1.hx:6: { 44 | rss : 10039296, 45 | vsize : 638578688, 46 | heapTotal : 5005376, 47 | heapUsed : 2497376 48 | } 49 | Ex1.hx:7: 5029952 50 | Ex1.hx:11: [204.232.203.106] 51 | 52 | 53 | To compile with haxelib 54 | 55 | haxe -lib nodejs .... etc 56 | 57 | 58 | 59 | Other sources of info 60 | --------------------- 61 | 62 | haxenode.org describes using these wrappers 63 | haxe-node.js google group to leave a message -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | zip \ 4 | --exclude \*.git/\* \ 5 | --exclude js/node/\* \ 6 | --exclude haxe/\* \ 7 | --exclude Makefile \ 8 | --exclude \*.js \ 9 | --exclude build \ 10 | --exclude eproject.cfg \ 11 | -r nodejs.zip . 12 | -------------------------------------------------------------------------------- /js/Node.hx: -------------------------------------------------------------------------------- 1 | /* Same license as Node.js 2 | Maintainer: Ritchie Turner, blackdog@cloudshift.cl 3 | 4 | Node.js 0.8 api without haXe embellishments so that other apis may be implemented 5 | on top without being hindered by design choices here. 6 | 7 | Domain not added. 8 | */ 9 | 10 | package js; 11 | 12 | typedef NodeListener = Dynamic; 13 | typedef NodeErr = Null; 14 | 15 | /* 16 | emits: newListener 17 | */ 18 | typedef NodeEventEmitter = { 19 | function addListener(event:String,fn:NodeListener):Dynamic; 20 | function on(event:String,fn:NodeListener):Dynamic; 21 | function once(event:String,fn:NodeListener):Void; 22 | function removeListener(event:String,listener:NodeListener):Void; 23 | function removeAllListeners(event:String):Void; 24 | function listeners(event:String):Array; 25 | function setMaxListeners(m:Int):Void; 26 | function emit(event:String,?arg1:Dynamic,?arg2:Dynamic,?arg3:Dynamic):Void; 27 | } 28 | 29 | typedef NodeWatchOpt = {persistent:Bool,interval:Int}; 30 | 31 | typedef NodeExecOpt = { 32 | var encoding:String; 33 | var timeout:Int; 34 | var maxBuffer:Int; 35 | var killSignal:String; 36 | var env:Dynamic; 37 | var cwd:String; 38 | } 39 | 40 | typedef NodeSpawnOpt = { 41 | var cwd:String; 42 | var env:Dynamic; 43 | var customFds:Array; 44 | var setsid:Bool; 45 | } 46 | 47 | /* note:can't spec multiple optional args, so adding an arbitrary 3 */ 48 | typedef NodeConsole = { 49 | function log(s:String,?a1:Dynamic,?a2:Dynamic,?a3:Dynamic):Void; 50 | function info(s:String,?a1:Dynamic,?a2:Dynamic,?a3:Dynamic):Void; 51 | function warn(s:String,?a1:Dynamic,?a2:Dynamic,?a3:Dynamic):Void; 52 | function error(s:String,?a1:Dynamic,?a2:Dynamic,?a3:Dynamic):Void; 53 | function time(label:String):Void; 54 | function timeEnd(label:String):Void; 55 | function dir(obj:Dynamic):Void; 56 | function trace():Void; 57 | function assert():Void; 58 | } 59 | 60 | typedef NodePath = { 61 | function join(?p1:String,?p2:String,?p3:String):String; 62 | function normalize(p:String):String; 63 | function resolve(from:Array,to:String):Void; 64 | function dirname(p:String):String; 65 | function basename(p:String,?ext:String):String; 66 | function extname(p:String):String; 67 | 68 | /* deprecated 0.8, use NodeFs equivs instead */ 69 | function exists(p:String,cb:Bool->Void):Void; 70 | function existsSync(p:String):Bool; 71 | } 72 | 73 | typedef NodeUrlObj = { 74 | var href:String; 75 | var host:String; 76 | var protocol:String; 77 | var auth:String; 78 | var hostname:String; 79 | var port:String; 80 | var pathname:String; 81 | var search:String; 82 | var query:Dynamic; 83 | var hash:String; 84 | } 85 | 86 | typedef NodeUrl = { 87 | function parse(p:String,?andQueryString:Bool):NodeUrlObj; 88 | function format(o:NodeUrlObj):String; 89 | function resolve(from:Array,to:String):String; 90 | } 91 | 92 | typedef NodeQueryString = { 93 | function parse(s:String,?sep:String,?eq:String,?options:{maxKeys:Int}):Dynamic; 94 | function escape(s:String):String; 95 | function unescape(s:String):String; 96 | function stringify(obj:Dynamic,?sep:String,?eq:String):String; 97 | } 98 | 99 | @:native("Buffer") extern class NodeBuffer implements ArrayAccess { 100 | 101 | @:overload(function(str:String,?enc:String):Void {}) 102 | @:overload(function(arr:Array):Void {}) 103 | function new(size:Int):Void; 104 | 105 | var length(default,null) : Int; 106 | var INSPECT_MAX_BYTES:Int; 107 | 108 | function copy(targetBuffer:NodeBuffer,targetStart:Int,sourceStart:Int,sourceEnd:Int):Void; 109 | function slice(start:Int,end:Int):NodeBuffer; 110 | function write(s:String,?offset:Int,?length:Int,?enc:String):Int; 111 | function toString(enc:String,?start:Int,?end:Int):String; 112 | function fill(value:Float,offset:Int,?end:Int):Void; 113 | static function isBuffer(o:Dynamic):Bool; 114 | static function byteLength(s:String,?enc:String):Int; 115 | 116 | function readUInt8(offset:Int,?noAssert:Bool):Int; 117 | function readUInt16LE(offset:Int,?noAssert:Bool):Int; 118 | function readUInt16BE(offset:Int,?noAssert:Bool):Int; 119 | function readUInt32LE(offset:Int,?noAssert:Bool):Int; 120 | function readUInt32BE(offset:Int,?noAssert:Bool):Int; 121 | 122 | function readInt8(offset:Int,?noAssert:Bool):Int; 123 | function readInt16LE(offset:Int,?noAssert:Bool):Int; 124 | function readInt16BE(offset:Int,?noAssert:Bool):Int; 125 | function readInt32LE(offset:Int,?noAssert:Bool):Int; 126 | function readInt32BE(offset:Int,?noAssert:Bool):Int; 127 | 128 | function readFloatLE(offset:Int,?noAssert:Bool):Float; 129 | function readFloatBE(offset:Int,?noAssert:Bool):Float; 130 | function readDoubleLE(offset:Int,?noAssert:Bool):Float; // is this right? 131 | function readDoubleBE(offset:Int,?noAssert:Bool):Float; // is this right? 132 | 133 | function writeUInt8(value:Int,offset:Int,?noAssert:Bool):Void; 134 | function writeUInt16LE(value:Int,offset:Int,?noAssert:Bool):Void; 135 | function writeUInt16BE(value:Int,offset:Int,?noAssert:Bool):Void; 136 | function writeUInt32LE(value:Int,offset:Int,?noAssert:Bool):Void; 137 | function writeUInt32BE(value:Int,offset:Int,?noAssert:Bool):Void; 138 | 139 | function writeInt8(value:Int,offset:Int,?noAssert:Bool):Void; 140 | function writeInt16LE(value:Int,offset:Int,?noAssert:Bool):Void; 141 | function writeInt16BE(value:Int,offset:Int,?noAssert:Bool):Void; 142 | function writeInt32LE(value:Int,offset:Int,?noAssert:Bool):Void; 143 | function writeInt32BE(value:Int,offset:Int,?noAssert:Bool):Void; 144 | 145 | function writeFloatLE(value:Float,offset:Int,?noAssert:Bool):Void; 146 | function writeFloatBE(value:Float,offset:Int,?noAssert:Bool):Void; 147 | function writeDoubleLE(value:Float,offset:Int,?noAssert:Bool):Void; // is this right? 148 | function writeDoubleBE(value:Float,offset:Int,?noAssert:Bool):Void; // is this right? 149 | } 150 | 151 | typedef NodeScript = { 152 | function runInThisContext():Dynamic; 153 | function runInNewContext(?sandbox:Dynamic):Void; 154 | } 155 | 156 | typedef NodeVM = { 157 | function runInThisContext(code:String,?fileName:String):Dynamic; 158 | function runInNewContext(?sandbox:Dynamic):Void; 159 | function createScript(code:Dynamic,?fileName:String):NodeScript; 160 | } 161 | 162 | typedef ReadStreamOpt = { 163 | flags:String, 164 | encoding:String, 165 | fd:Null, 166 | mode:Int, 167 | bufferSize:Int, 168 | ?start:Int, 169 | ?end:Int 170 | } 171 | 172 | typedef WriteStreamOpt = { 173 | var flags:String; 174 | var encoding:String; 175 | var mode:Int; 176 | } 177 | 178 | /* 179 | Emits: 180 | data,end,error,close 181 | */ 182 | typedef NodeReadStream = { > NodeEventEmitter, 183 | var readable:Bool; 184 | function pause():Void; 185 | function resume():Void; 186 | function destroy():Void; 187 | function destroySoon():Void; 188 | function setEncoding(enc:String):Void; 189 | function pipe(dest:NodeWriteStream,?opts:{end:Bool}):Void; 190 | } 191 | 192 | /* 193 | Emits: 194 | drain,error,close,pipe 195 | */ 196 | typedef NodeWriteStream = { > NodeEventEmitter, 197 | var writeable:Bool; 198 | @:overload(function(chunk:NodeBuffer):Bool {}) 199 | function write(d:String,?enc:String,?fd:Int):Bool; 200 | @:overload(function(b:NodeBuffer):Void {}) 201 | function end(?s:String,?enc:String):Void; 202 | function destroy():Void; 203 | function destroySoon():Void; 204 | } 205 | 206 | typedef NodeOs = { 207 | function hostname():String; 208 | function type():String; 209 | function release():String; 210 | function uptime():Int; 211 | function loadavg():Array; 212 | function totalmem():Int; 213 | function freemem():Int; 214 | function cpus():Int; 215 | function platform():String; 216 | function arch():String; 217 | function networkInterfaces():Dynamic; 218 | } 219 | 220 | 221 | typedef NodeJsDate = { 222 | function getTime():Int; 223 | function toDateString():String; 224 | function toUTCString():String; 225 | } 226 | 227 | typedef NodeStat = { 228 | var dev:Int; 229 | var ino:Int; 230 | var mode:Int; 231 | var nlink:Int; 232 | var uid:Int; 233 | var gid:Int; 234 | var rdev:Int; 235 | var size:Int; 236 | var blkSize:Int; 237 | var blocks:Int; 238 | var atime:NodeJsDate; 239 | var mtime:NodeJsDate; 240 | var ctime:NodeJsDate; 241 | 242 | function isFile():Bool; 243 | function isDirectory():Bool; 244 | function isBlockDevice():Bool; 245 | function isCharacterDevice():Bool; 246 | function isSymbolicLink():Bool; 247 | function isFIFO():Bool; 248 | function isSocket():Bool; 249 | } 250 | 251 | /* 252 | Emits: error,change 253 | */ 254 | typedef NodeFSWatcher = { > NodeEventEmitter, 255 | function close():Void; 256 | } 257 | 258 | typedef NodeFS = { 259 | function rename(from:String,to:String,cb:NodeErr->Void):Void; 260 | function renameSync(from:String,to:String):Void; 261 | 262 | function stat(path:String,cb:NodeErr->NodeStat->Void):Void; 263 | function statSync(path:String):NodeStat; 264 | 265 | function lstat(path:Dynamic,cb:NodeErr->NodeStat->Void):Void; 266 | function lstatSync(path:String):NodeStat; 267 | 268 | function fstat(fd:Int,cb:NodeErr->NodeStat->Void):Void; 269 | function fstatSync(fd:Int):NodeStat; 270 | 271 | function link(srcPath:String,dstPath:String,cb:NodeErr->Void):Void; 272 | function linkSync(srcPath:String,dstPath:String):Void; 273 | 274 | function unlink(path:String,cn:NodeErr->Void):Void; 275 | function unlinkSync(path:String):Void; 276 | 277 | function symlink(linkData:Dynamic,path:String,?type:String,?cb:NodeErr->Void):Void; 278 | function symlinkSync(linkData:Dynamic,path:String,?type:String):Void; 279 | 280 | function readlink(path:String,cb:NodeErr->String->Void):Void; 281 | function readlinkSync(path:String):String; 282 | 283 | function realpath(path:String,cb:NodeErr->String->Void):Void; 284 | function realpathSync(path:String):String; 285 | 286 | function chmod(path:String,mode:Int,cb:NodeErr->Void):Void; 287 | function chmodSync(path:String,?mode:Int):Void; 288 | 289 | function fchmod(fd:Int,mode:Int,cb:NodeErr->Void):Void; 290 | function fchmodSync(fd:Int,?mode:Int):Void; 291 | 292 | function chown(path:String,uid:Int,gid:Int,cb:NodeErr->Void):Void ; 293 | function chownSync(path:String,uid:Int,gid:Int):Void; 294 | 295 | function fchown(fd:Int,uid:Int,gid:Int,cb:NodeErr->Void):Void ; 296 | function fchownSync(fd:Int,uid:Int,gid:Int):Void; 297 | 298 | function rmdir(path:String,cb:NodeErr->Void):Void; 299 | function rmdirSync(path:String):Void; 300 | 301 | function mkdir(path:String,?mode:Int,?cb:NodeErr->Void):Void; 302 | function mkdirSync(path:String,?mode:Int):Void; 303 | 304 | function readdir(path:String,cb:NodeErr->Array->Void):Void; 305 | function readdirSync(path:String):Array; 306 | 307 | function close(fd:Int,cb:NodeErr->Void):Void; 308 | function closeSync(fd:Int):Void; 309 | 310 | function open(path:String,flags:String,?mode:Int,cb:NodeErr->Int->Void):Void; 311 | 312 | function openSync(path:String,flags:String,?mode:Int):Int; 313 | 314 | function write(fd:Int,bufOrStr:Dynamic,offset:Int,length:Int,position:Null,?cb:NodeErr->Int->Void):Void; 315 | function writeSync(fd:Int,bufOrStr:Dynamic,offset:Int,length:Int,position:Null):Int; 316 | 317 | function read(fd:Int,buffer:NodeBuffer,offset:Int,length:Int,position:Int,cb:NodeErr->Int->NodeBuffer->Void):Void; 318 | function readSync(fd:Int,buffer:NodeBuffer,offset:Int,length:Int,position:Int):Int; 319 | 320 | function truncate(fd:Int,len:Int,cb:NodeErr->Void):Void; 321 | function truncateSync(fd:Int,len:Int):NodeErr; 322 | 323 | function readFile(path:String,?enc:String,cb:NodeErr->String->Void):Void; 324 | function readFileSync(path:String,?enc:String):String; 325 | 326 | @:overload(function(fileName:String,data:NodeBuffer,cb:NodeErr->Void):Void {}) 327 | function writeFile(fileName:String,contents:String,?enc:String,cb:NodeErr->Void):Void; 328 | @:overload(function(fileName:String,data:NodeBuffer):Void {}) 329 | function writeFileSync(fileName:String,contents:String,?enc:String):Void; 330 | 331 | @:overload(function(fileName:String,data:NodeBuffer,cb:NodeErr->Void):Void {}) 332 | function appendFile(fileName:String,contents:String,?enc:String,cb:NodeErr->Void):Void; 333 | 334 | @:overload(function(fileName:String,data:NodeBuffer):Void {}) 335 | function appendFileSync(fileName:String,contents:String,?enc:String):Void; 336 | 337 | 338 | function utimes(path:String,atime:Dynamic,mtime:Dynamic,cb:NodeErr->Void):Void; 339 | function utimeSync(path:String,atime:Dynamic,mtime:Dynamic):Void; 340 | 341 | function futimes(fd:Int,atime:Dynamic,mtime:Dynamic,cb:NodeErr->Void):Void; 342 | function futimeSync(fd:Int,atime:Dynamic,mtime:Dynamic):Void; 343 | 344 | function fsync(fd:Int,cb:NodeErr->Void):Void; 345 | function fsyncSync(fd:Int):Void; 346 | 347 | function watchFile(fileName:String,?options:NodeWatchOpt,listener:NodeStat->NodeStat->Void):Void; 348 | function unwatchFile(fileName:String):Void; 349 | function watch(fileName:String,?options:NodeWatchOpt,listener:String->String->Void):NodeFSWatcher; 350 | function createReadStream(path:String,?options:ReadStreamOpt):NodeReadStream; 351 | function createWriteStream(path:String,?options:WriteStreamOpt):NodeWriteStream; 352 | 353 | function exists(p:String,cb:Bool->Void):Void; 354 | function existsSync(p:String):Bool; 355 | } 356 | 357 | typedef NodeUtil = { 358 | function debug(s:String):Void; 359 | function inspect(o:Dynamic,?showHidden:Bool,?depth:Int):Void; 360 | function log(s:String):Void; 361 | function pump(rs:NodeReadStream,ws:NodeWriteStream,cb:Dynamic->Void):Void; 362 | function inherits(constructor:Dynamic,superConstructor:Dynamic):Void; 363 | function isArray(o:Dynamic):Bool; 364 | function isRegExp(o:Dynamic):Bool; 365 | function isDate(o:Dynamic):Bool; 366 | function isError(o:Dynamic):Bool; 367 | function format(out:String,?a1:Dynamic,?a2:Dynamic,?a3:Dynamic):Void; // should be arbitrary # of args 368 | } 369 | 370 | /* 371 | Emits: 372 | exit, uncaughtException + SIGNAL events (SIGINT etc) 373 | */ 374 | typedef NodeProcess = { > NodeEventEmitter, 375 | var stdout:NodeWriteStream; 376 | var stdin:NodeReadStream; 377 | var stderr:NodeWriteStream; 378 | var argv:Array; 379 | var env:Dynamic; 380 | var pid:Int; 381 | var title:String; 382 | var arch:String; 383 | var platform:String; 384 | var installPrefix:String; 385 | var execPath:String; 386 | var version:String; 387 | var versions:Dynamic; 388 | 389 | function memoryUsage():{rss:Int,vsize:Int,heapUsed:Int,heapTotal:Int}; 390 | function nextTick(fn:Void->Void):Void; 391 | function exit(code:Int):Void; 392 | function cwd():String; 393 | function getuid():Int; 394 | function getgid():Int; 395 | function setuid(u:Int):Void; 396 | function setgid(g:Int):Void; 397 | function umask(?m:Int):Int; 398 | function chdir(d:String):Void; 399 | function kill(pid:Int,?signal:String):Void; 400 | function uptime():Int; 401 | function abort():Void; 402 | function hrtime():Array; 403 | } 404 | 405 | /* 406 | Emits: exit,close 407 | */ 408 | typedef NodeChildProcess = { > NodeEventEmitter, 409 | var stdin:NodeWriteStream; 410 | var stdout:NodeReadStream; 411 | var stderr:NodeReadStream; 412 | var pid:Int; 413 | function kill(signal:String):Void; 414 | } 415 | 416 | /* 417 | Emits: message 418 | */ 419 | typedef NodeChildForkProcess = { > NodeChildProcess, 420 | @:overload(function(o:Dynamic,?socket:NodeNetSocket):Void {}) 421 | function send(o:Dynamic,?server:NodeNetServer):Void; 422 | } 423 | 424 | typedef NodeChildProcessCommands = { 425 | function spawn(command: String,args: Array,?options: Dynamic ) : NodeChildProcess; 426 | function exec(command: String,?options:Dynamic,cb: {code:Int}->String->String->Void ): NodeChildProcess; 427 | function execFile(command: String,?options:Dynamic,cb: {code:Int}->String->String->Void ): NodeChildProcess; 428 | function fork(path:String,?args:Dynamic,?options:Dynamic):NodeChildForkProcess; 429 | } 430 | 431 | typedef NodeClusterSettings = { 432 | var exec:String; 433 | var args:Array; 434 | var silent:Bool; 435 | } 436 | 437 | 438 | /* emits: message, online,listening,disconnect,exit, setup */ 439 | typedef NodeWorker = { > NodeEventEmitter, 440 | var uniqueID:String; // indexes into cluster.workers 441 | var process:NodeChildProcess; 442 | var suicide:Bool; 443 | function send(message:Dynamic,?sendHandle:Dynamic):Void; 444 | function destroy():Void; 445 | } 446 | 447 | /* Emits: death,message, fork, online, listening */ 448 | typedef NodeCluster = { > NodeEventEmitter, 449 | var isMaster:Bool; 450 | var isWorker:Bool; 451 | var workers:Array; 452 | function fork(?env:Dynamic):NodeWorker; 453 | function send(o:Dynamic):Void; 454 | function setupMaster(?settings:NodeClusterSettings):Void; 455 | function disconnect(?cb:Void->Void):Void; 456 | } 457 | 458 | 459 | /* NET ............................................. */ 460 | 461 | /* 462 | Emits: 463 | connection 464 | */ 465 | typedef NodeNet = { > NodeEventEmitter, 466 | function createServer(?options:{allowHalfOpen:Bool},fn:NodeNetSocket->Void):NodeNetServer; 467 | @:overload(function(cs:String):NodeNetSocket {}) 468 | function createConnection(port:Int,host:String):NodeNetSocket; 469 | @:overload(function(cs:String):NodeNetSocket {}) 470 | function connect(port:Int,host:String):NodeNetSocket; 471 | function isIP(input:String):Int; // 4 or 6 472 | function isIPv4(input:String):Bool; 473 | function isIPv6(input:String):Bool; 474 | } 475 | 476 | /* 477 | Emits: 478 | connection,close,error,listening 479 | */ 480 | typedef NodeNetServer = { > NodeEventEmitter, 481 | var maxConnections:Int; 482 | var connections:Int; 483 | 484 | @:overload(function(path:String,?cb:Void->Void):Void {}) 485 | @:overload(function(fd:Int,?cb:Void->Void):Void {}) 486 | function listen(port:Int,?host:String,?cb:Void->Void):Void; 487 | function close(cb:Void->Void):Void; 488 | function address():Void; 489 | function pause(msecs:Int):Void; 490 | } 491 | 492 | typedef NodeConnectionOpt = { 493 | port:Int, 494 | ?host:String, 495 | ?localAddress:String 496 | } 497 | 498 | /* 499 | 500 | Emits: 501 | connect,data,end,timeout,drain,error,close 502 | 503 | implements a duplex stream interface 504 | */ 505 | typedef NodeNetSocket = { > NodeEventEmitter, 506 | var remoteAddress:String; 507 | var remotePort:Int; 508 | var bufferSize:Int; 509 | var bytesRead:Int; 510 | var bytesWritten:Int; 511 | 512 | @:overload(function(path:String,?cb:Void->Void):Void {}) 513 | @:overload(function(options:NodeConnectionOpt,connectionListener:Void->Void):Void {}) 514 | function connect(port:Int,?host:String,?cb:Void->Void):Void; 515 | function setEncoding(enc:String):Void; 516 | function setSecure():Void; 517 | @:overload(function(data:Dynamic,?enc:String,?fileDesc:Int,?cb:Void->Void):Bool {}) 518 | function write(data:Dynamic,?enc:String,?cb:Void->Void):Bool; 519 | function end(?data:Dynamic,?enc:String):Void; 520 | function destroy():Void; 521 | function pause():Void; 522 | function resume():Void; 523 | function setTimeout(timeout:Int,?cb:Void->Void):Void; 524 | function setNoDelay(?noDelay:Bool):Void; 525 | function setKeepAlive(enable:Bool,?delay:Int):Void; 526 | function address():{address:String,port:Int}; 527 | } 528 | 529 | /* HTTP ............................................*/ 530 | 531 | 532 | /* 533 | Emits: 534 | data,end,close 535 | */ 536 | typedef NodeHttpServerReq = { >NodeEventEmitter, 537 | var method:String; 538 | var url:String; 539 | var headers:Dynamic; 540 | var trailers:Dynamic; 541 | var httpVersion:String; 542 | var connection:NodeNetSocket; 543 | function setEncoding(enc:String):Void; 544 | function pause():Void; 545 | function resume():Void; 546 | } 547 | 548 | /* 549 | */ 550 | typedef NodeHttpServerResp = { > NodeWriteStream, 551 | var statusCode:Int; 552 | function writeContinue():Void; 553 | @:overload(function(statusCode:Int,?reasonPhrase:String,?headers:Dynamic):Void {}) 554 | function writeHead(statusCode:Int,headers:Dynamic):Void; 555 | function setHeader(name:String,value:Dynamic):Void; 556 | function getHeader(name:String):Dynamic; 557 | function removeHeader(name:String):Void; 558 | function addTrailers(headers:Dynamic):Void; 559 | } 560 | 561 | /* Emits: 562 | continue,response 563 | */ 564 | typedef NodeHttpClientReq = { > NodeEventEmitter, 565 | function write(data:Dynamic,?enc:String):Void; 566 | function end(?data:Dynamic,?enc:String):Void; 567 | function abort():Void; 568 | } 569 | 570 | /* Emits: 571 | data,end,close 572 | */ 573 | typedef NodeHttpClientResp = { > NodeEventEmitter, 574 | var statusCode:Int; 575 | var httpVersion:String; 576 | var headers:Dynamic; 577 | var client:NodeHttpClient; 578 | function setEncoding(enc:String):Void; 579 | function resume():Void; 580 | function pause():Void; 581 | } 582 | 583 | 584 | typedef NodeHttpClient = { > NodeEventEmitter, 585 | function request(method:String,path:String,?headers:Dynamic):NodeHttpClientReq; 586 | function verifyPeer():Bool; 587 | function getPeerCertificate():NodePeerCert; 588 | } 589 | 590 | /* 591 | Emits: 592 | request,connection,checkContinue,connect,clientError,close 593 | */ 594 | typedef NodeHttpServer = { > NodeEventEmitter, 595 | @:overload(function(path:String,?cb:Void->Void):Void {}) 596 | function listen(port:Int,?host:String,?cb:Void->Void):Void; 597 | function close(?cb:Void->Void):Void; 598 | } 599 | 600 | /* 601 | */ 602 | typedef NodeHttpReqOpt = { 603 | var host:String; 604 | var port:Int; 605 | var path:String; 606 | var method:String; 607 | var headers:Dynamic; 608 | } 609 | 610 | typedef NodeHttpsReqOpt = { > NodeHttpReqOpt, 611 | var ciphers:Dynamic; 612 | var rejectUnauthorized:Dynamic; 613 | } 614 | 615 | /* 616 | Emits: 617 | upgrade,continue 618 | */ 619 | typedef NodeAgent = { > NodeEventEmitter, 620 | var maxSockets:Int; 621 | var sockets:Array; 622 | var queue:Array; 623 | } 624 | 625 | typedef NodeHttp = { 626 | function createServer(listener:NodeHttpServerReq->NodeHttpServerResp->Void):NodeHttpServer; 627 | function createClient(port:Int,host:String):NodeHttpClient; 628 | @:overload(function(parsedUrl:NodeUrlObj,res:NodeHttpClientResp->Void):NodeHttpClientReq {}) 629 | function request(options:NodeHttpReqOpt,res:NodeHttpClientResp->Void):NodeHttpClientReq; 630 | @:overload(function(parsedUrl:NodeUrlObj,res:NodeHttpClientResp->Void):Void {}) 631 | function get(options:NodeHttpReqOpt,res:NodeHttpClientResp->Void):Void; 632 | function getAgent(host:String,port:Int):NodeAgent; 633 | } 634 | 635 | typedef NodeHttps = { 636 | function createServer(options:{key:String,cert:String}, 637 | listener:NodeHttpServerReq->NodeHttpServerResp->Void):NodeHttpServer; 638 | function request(options:NodeHttpsReqOpt,res:NodeHttpClientResp->Void):Void; 639 | function get(options:NodeHttpsReqOpt,res:NodeHttpClientResp->Void):Void; 640 | } 641 | 642 | typedef NodeDns = { 643 | function resolve(domain:String,?rrtype:String,cb:NodeErr->Array->Void):Void; 644 | function resolveNs(domain:String,cb:NodeErr->Array->Void):Void; 645 | function resolve4(domain:String,cb:NodeErr->Array->Void):Void; 646 | function resolve6(domain:String,cb:NodeErr->Array->Void):Void; 647 | function resolveMx(domain:String,cb:NodeErr->Array<{priority:Int,exchange:String}>->Void):Void; 648 | function resolveSrv(domain:String,cb:NodeErr->Array<{priority:Int,weight:Int,port:Int,name:String}->Void>):Void; 649 | function resolveCname(domain:String,cb:NodeErr->Array->Void):Void; 650 | function reverse(ip:String,cb:NodeErr->Array->Void):Void; 651 | function resolveTxt(domain:String,cb:NodeErr->Array->Void):Void; 652 | function lookup(domain:String,?family:String,cb:NodeErr->String->Int->Void):Void; 653 | } 654 | 655 | typedef NodeTTY = { 656 | /* returns a non homogenous array of elements, el[0].fd, el[1] is a child process obj 657 | best check it manually */ 658 | function open(path:String,args:Dynamic):Array; 659 | function isatty(fd:Int):Bool; 660 | function setRawMode(mode:Bool):Void; 661 | function setWindowSize(fd:Int,row:Int,col:Int):Void; 662 | function getWindowSize(fd:Int):{row:Int,col:Int}; 663 | } 664 | 665 | /* UDP ........................................ */ 666 | 667 | typedef NodeUDPCallback = NodeErr->haxe.io.Bytes->Void; 668 | 669 | typedef NodeUDP = { 670 | // Valid types: udp6, and unix_dgram. 671 | function createSocket(type:String,cb:NodeUDPCallback):NodeDGSocket; 672 | } 673 | 674 | /* 675 | Emits: message,listening,close 676 | */ 677 | typedef NodeDGSocket = { > NodeEventEmitter, 678 | function send(buf:NodeBuffer,offset:Int,length:Int,port:Int,address:String,cb:NodeUDPCallback):Void; 679 | function bind(port:Int,?address:String):Void; 680 | function close():Void; 681 | function address():Dynamic; 682 | function setBroadcast(flag:Bool):Void; 683 | function setTTL(ttl:Int):Void; 684 | function setMulticastTTL(ttl:Int):Void; 685 | function setMulticastLoopback(flag:Bool):Void; 686 | function addMembership(multicastAddress:String,?multicastInterface:String):Void; 687 | function dropMembership(multicastAddress:String,?multicastInterface:String):Void; 688 | } 689 | 690 | 691 | /* CRYPTO ..................................... */ 692 | 693 | typedef NodeCredDetails = { 694 | var key:String; 695 | var cert:String; 696 | var ca:Array; 697 | /* 698 | TODO 699 | */ 700 | } 701 | 702 | typedef NodePeerCert = { 703 | var subject:String; 704 | var issuer:String; 705 | var valid_from:String; 706 | var valid_to:String; 707 | } 708 | 709 | typedef NodeCreds = Dynamic; 710 | 711 | typedef NodeHmac = { 712 | function update(data:Dynamic):Void; 713 | function digest(?enc:String):String; 714 | } 715 | 716 | typedef NodeHash = { 717 | function update(data:Dynamic):Void; 718 | function digest(?enc:String):String; 719 | function createHmac(algo:String,key:String):NodeHmac; 720 | } 721 | 722 | typedef NodeCipher = { 723 | function update(data:Dynamic,?input_enc:String,?output_enc:String):Dynamic; 724 | function final(output_enc:String):Void; 725 | function setAutoPadding(padding:Bool):Void; // default true 726 | } 727 | 728 | typedef NodeDecipher = { 729 | function update(data:Dynamic,?input_enc:String,?output_enc:String):Dynamic; 730 | function final(?output_enc:String):Dynamic; 731 | function setAutoPadding(padding:Bool):Void; // default true 732 | } 733 | 734 | typedef NodeSigner = { 735 | function update(data:Dynamic):Void; 736 | function sign(private_key:String,?output_format:String):Dynamic; 737 | } 738 | 739 | typedef NodeVerify = { 740 | function update(data:Dynamic):Void; 741 | function verify(cert:String,?sig_format:String):Bool; 742 | } 743 | 744 | typedef NodeDiffieHellman = { 745 | function generateKeys(?enc:String):String; 746 | function computeSecret(otherPublicKey:String,?inputEnc:String,?outputEnc:String):String; 747 | function getPrime(?enc:String):Int; 748 | function getGenerator(?enc:String):String; 749 | function getPublicKey(?enc:String):String; 750 | function getPrivateKey(?enc:String):String; 751 | function setPublicKey(pubKey:String,?enc:String):Void; 752 | function setPrivateKey(privKey:String,?enc:String):Void; 753 | } 754 | 755 | typedef NodeCrypto = { 756 | function createCredentials(details:NodeCredDetails):NodeCreds; 757 | function createHash(algo:String):NodeHash; // 'sha1', 'md5', 'sha256', 'sha512' 758 | function createCipher(algo:String,password:String):NodeCipher; 759 | function createCipheriv(algo:String,key:String,iv:String):NodeCipher; 760 | function createDecipher(algo:String,key:String):NodeDecipher; 761 | function createDecipheriv(algo:String,key:String,iv:String):NodeDecipher; 762 | function createSign(algo:String):NodeSigner; 763 | function createVerify(algo:String):NodeVerify; 764 | @:overload(function(prime_length:Int):NodeDiffieHellman {}) 765 | function createDiffieHellman(prime:String,?enc:String):NodeDiffieHellman; 766 | function getDiffieHellman(groupName:String):NodeDiffieHellman; 767 | function pbkdf2(password:String,salt:String,iterations:Int,keylen:Int,cb:NodeErr->String):Void; 768 | function randomBytes(size:Int,cb:NodeErr->NodeBuffer):Void; 769 | 770 | } 771 | 772 | /* TLS/SSL ................................................ */ 773 | 774 | /* 775 | Emits: 776 | secureConnection 777 | */ 778 | typedef NodeTLSServer = { > NodeNetServer, 779 | function addContext(hostName:String,credentials:NodeCreds):Void; 780 | 781 | } 782 | 783 | /* Emits: secure */ 784 | typedef NodeSecurePair = { > NodeEventEmitter, 785 | // ?? todo 786 | } 787 | typedef NodeTLS ={ 788 | function connect(port:Int,host:String,opts:Dynamic,cb:Void->Void):Void; 789 | function createServer(opts:Dynamic,cb:NodeTLSServer->Void):Void; 790 | function createSecurePair(creds:NodeCreds,isServer:Bool,requestCert:Bool,rejectUnauthorized:Bool):NodeSecurePair; 791 | } 792 | 793 | /* 794 | Snarfed from Tong's version ... 795 | */ 796 | typedef NodeAssert = { 797 | function fail(actual:Dynamic,expected:Dynamic,message:Dynamic,operator:Dynamic): Void; 798 | function ok(value:Dynamic,?message:Dynamic):Void; 799 | function equal(actual:Dynamic,expected:Dynamic,?message:Dynamic):Void; 800 | function notEqual(actual:Dynamic,expected:Dynamic,?message:Dynamic):Void; 801 | function deepEqual(actual:Dynamic,expected:Dynamic,?message:Dynamic):Void; 802 | function notDeepEqual(actual:Dynamic,expected:Dynamic,?message:Dynamic):Void; 803 | function strictEqual(actual:Dynamic,expected:Dynamic,?message:Dynamic):Void; 804 | function notStrictEqual(actual:Dynamic,expected:Dynamic,?message:Dynamic):Void; 805 | function throws(block:Dynamic,error:Dynamic,?message:Dynamic):Void; 806 | function doesNotThrow(block:Dynamic,error:Dynamic,?message:Dynamic):Void; 807 | function ifError(value:Dynamic):Void; 808 | } 809 | 810 | typedef NodeREPL = { 811 | function start( prompt : String, ?stream : Dynamic ) : Void; 812 | } 813 | 814 | typedef NodeGZip = {} 815 | typedef NodeGUnzip = {} 816 | typedef NodeDeflate = {} 817 | typedef NodeInflate = {} 818 | typedef NodeDeflateRaw = {} 819 | typedef NodeInflateRaw = {} 820 | typedef NodeUnzip = {} 821 | 822 | 823 | typedef NodeZLib = { 824 | function createGzip(?options:Dynamic):NodeGZip; 825 | function createGunzip(?options:Dynamic):NodeGUnzip; 826 | function createDeflate(?options:Dynamic):NodeDeflate; 827 | function createInflate(?options:Dynamic):NodeInflate; 828 | function createInflateRaw(?options:Dynamic):NodeInflateRaw; 829 | function createDeflateRaw(?options:Dynamic):NodeDeflateRaw; 830 | function createUnzip(?options:Dynamic):NodeUnzip; 831 | 832 | // convenience 833 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 834 | function deflate(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 835 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 836 | function deflateRaw(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 837 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 838 | function gzip(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 839 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 840 | function gunzip(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 841 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 842 | function inflate(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 843 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 844 | function inflateRaw(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 845 | @:overload(function (str:String,cb:NodeErr->Dynamic->Void):Void {}) 846 | function unzip(buf:NodeBuffer,cb:NodeErr->Dynamic->Void):Void; 847 | } 848 | 849 | // Node Constants 850 | class NodeC { 851 | public static inline var UTF8 = "utf8"; 852 | public static inline var ASCII = "ascii"; 853 | public static inline var BINARY = "binary"; 854 | public static inline var BASE64 = "base64"; 855 | public static inline var HEX = "hex"; 856 | 857 | //events - thanks tmedema 858 | public static inline var EVENT_EVENTEMITTER_NEWLISTENER = "newListener"; 859 | public static inline var EVENT_EVENTEMITTER_ERROR = "error"; 860 | 861 | public static inline var EVENT_STREAM_DATA = "data"; 862 | public static inline var EVENT_STREAM_END = "end"; 863 | public static inline var EVENT_STREAM_ERROR = "error"; 864 | public static inline var EVENT_STREAM_CLOSE = "close"; 865 | public static inline var EVENT_STREAM_DRAIN = "drain"; 866 | public static inline var EVENT_STREAM_CONNECT = "connect"; 867 | public static inline var EVENT_STREAM_SECURE = "secure"; 868 | public static inline var EVENT_STREAM_TIMEOUT = "timeout"; 869 | public static inline var EVENT_STREAM_PIPE = "pipe"; 870 | 871 | public static inline var EVENT_PROCESS_EXIT = "exit"; 872 | public static inline var EVENT_PROCESS_UNCAUGHTEXCEPTION = "uncaughtException"; 873 | public static inline var EVENT_PROCESS_SIGINT = "SIGINT"; 874 | public static inline var EVENT_PROCESS_SIGUSR1 = "SIGUSR1"; 875 | public static inline var EVENT_CHILDPROCESS_EXIT = "exit"; 876 | public static inline var EVENT_HTTPSERVER_REQUEST = "request"; 877 | public static inline var EVENT_HTTPSERVER_CONNECTION = "connection"; 878 | public static inline var EVENT_HTTPSERVER_CLOSE = "close"; 879 | public static inline var EVENT_HTTPSERVER_UPGRADE = "upgrade"; 880 | public static inline var EVENT_HTTPSERVER_CLIENTERROR = "clientError"; 881 | public static inline var EVENT_HTTPSERVERREQUEST_DATA = "data"; 882 | public static inline var EVENT_HTTPSERVERREQUEST_END = "end"; 883 | public static inline var EVENT_CLIENTREQUEST_RESPONSE = "response"; 884 | public static inline var EVENT_CLIENTRESPONSE_DATA = "data"; 885 | public static inline var EVENT_CLIENTRESPONSE_END = "end"; 886 | public static inline var EVENT_NETSERVER_CONNECTION = "connection"; 887 | public static inline var EVENT_NETSERVER_CLOSE = "close"; 888 | 889 | public static inline var FILE_READ = "r"; 890 | public static inline var FILE_READ_APPEND = "r+"; 891 | public static inline var FILE_WRITE = "w"; 892 | public static inline var FILE_WRITE_APPEND = "a+"; 893 | public static inline var FILE_READWRITE = "a"; 894 | public static inline var FILE_READWRITE_APPEND = "a+"; 895 | } 896 | 897 | class Node { 898 | public static var require(default,null) : String->Dynamic; 899 | public static var querystring(default,null) : NodeQueryString; 900 | public static var util(default,null) : NodeUtil; 901 | public static var fs(default,null) : NodeFS; 902 | public static var dgram(default,null) :NodeUDP ; 903 | public static var net(default,null) : NodeNet; 904 | public static var os(default,null) : NodeOs; 905 | public static var http(default,null) : NodeHttp; 906 | public static var https(default,null) : NodeHttps; 907 | public static var path(default,null) : NodePath; 908 | public static var url(default,null) : NodeUrl; 909 | public static var dns(default,null) : NodeDns; 910 | public static var vm(default,null) : NodeVM; 911 | public static var process(default,null) : NodeProcess; 912 | public static var tty(default,null) : NodeTTY; 913 | public static var assert(default,null) : NodeAssert; 914 | public static var crypto(default,null) : NodeCrypto; 915 | public static var tls(default,null) : NodeTLS; 916 | public static var repl(default,null) : NodeREPL; 917 | public static var childProcess(default,null) : NodeChildProcessCommands; 918 | public static var console(default,null) : NodeConsole; 919 | public static var cluster(default,null) : NodeCluster; 920 | 921 | // public static var paths:Array; 922 | public static var setTimeout:Dynamic->Int->?Array->Int; 923 | public static var clearTimeout:Int->Void; 924 | public static var setInterval:Dynamic->Int->?Array->Int; 925 | public static var clearInterval:Int->Void; 926 | public static var global:Dynamic; 927 | 928 | public static var __filename:String; 929 | public static var __dirname:String; 930 | public static var module:Dynamic; 931 | public static var stringify:Dynamic->String; 932 | public static var parse:String->Dynamic; 933 | public static var queryString:NodeQueryString; 934 | 935 | public static function newSocket(?options):NodeNetSocket { 936 | return untyped __js__("new js.Node.net.Socket(options)"); 937 | } 938 | 939 | public static function 940 | __init__() { 941 | __filename = untyped __js__('__filename'); 942 | __dirname = untyped __js__('__dirname'); 943 | 944 | setTimeout = untyped __js__('setTimeout'); 945 | clearTimeout = untyped __js__('clearTimeout'); 946 | setInterval = untyped __js__('setInterval'); 947 | clearInterval = untyped __js__('clearInterval'); 948 | global = untyped __js__('global'); 949 | process = untyped __js__('process'); 950 | require = untyped __js__('require'); 951 | console = untyped __js__('console'); 952 | module = untyped __js__('module'); // ref to the current module 953 | stringify = untyped __js__('JSON.stringify'); 954 | parse = untyped __js__('JSON.parse'); 955 | 956 | // just load everything, maybe not to everyone's taste 957 | util = require("util"); 958 | fs = require("fs"); 959 | net = require("net"); 960 | http = require("http"); 961 | https = require("https"); 962 | path = require('path'); 963 | url = require('url'); 964 | os = require('os'); 965 | crypto = require("crypto"); 966 | dns = require("dns"); 967 | queryString = require('querystring'); 968 | assert = require('assert'); 969 | childProcess = require('child_process'); 970 | vm = require('vm'); 971 | tls = require('tls'); 972 | dgram = require('dgram'); 973 | assert = require('assert'); 974 | repl = require('repl'); 975 | cluster = require("cluster"); 976 | } 977 | 978 | } 979 | 980 | 981 | --------------------------------------------------------------------------------