├── .gitignore ├── package.json ├── test.js ├── lib ├── rx.node.js ├── rx_process.js ├── rx_path.js ├── rx_sys.js ├── rx_events.js ├── rx_net.js ├── rx_https.js ├── rx_http.js ├── rx_child_process.js ├── rx_dns.js └── rx_fs.js └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | lib/rx.min.js 2 | lib/rx.aggregates.min.js 3 | lib/rx.joinpatterns.min.js 4 | lib/rx.coincidence.min.js 5 | lib/rx.time.min.js 6 | lib/rx.experimental.min.js 7 | *~ -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "rxjs-node", 3 | "description" : "Reactive Extensions for JavaScript bindings for node.js", 4 | "licenses" : [ { "type": "Apache", "url": "http://www.apache.org/licenses/LICENSE-2.0" } ], 5 | "url" : "http://github.com/reactive-extensions/l2o-js", 6 | "keywords" : ["LINQ", "functional", "JavaScript"], 7 | "author" : "Matthew Podwysocki ", 8 | "contributors" : [], 9 | "dependencies" : [], 10 | "lib" : ".", 11 | "version" : "0.0.1" 12 | } -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var child_process = require("./lib/rx_child_process.js"); 2 | var events = require("./lib/rx_events.js"); 3 | var http = require("./lib/rx_http.js"); 4 | var net = require("./lib/rx_net.js"); 5 | var process = require("./lib/rx_process.js"); 6 | var dns = require("./lib/rx_dns.js"); 7 | var fs = require("./lib/rx_fs.js"); 8 | var https = require("./lib/rx_https.js"); 9 | var path = require("./lib/rx_path.js"); 10 | var sys = require("./lib/rx_sys.js"); 11 | 12 | console.log("all loaded"); 13 | -------------------------------------------------------------------------------- /lib/rx.node.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require('./rx.min'); 17 | require('./rx.aggregates.min'); 18 | require('./rx.coincidence.min'); 19 | require('./rx.joinpatterns.min'); 20 | require('./rx.time.min'); 21 | module.exports = Rx; 22 | -------------------------------------------------------------------------------- /lib/rx_process.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | process.nextTickObservable = function() { 18 | var subject = new Rx.AsyncSubject(), 19 | handler = function() { 20 | subject.onNext(); 21 | subject.onCompleted(); 22 | }; 23 | process.nextTick(handler); 24 | return subject.asObservable(); 25 | }; 26 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | node.js Bindings for the Reactive Extensions for JavaScript 2 | =========================================================== 3 | ## OVERVIEW 4 | 5 | This project provides Reactive Extensions for JavaScript (RxJS) bindings for node.js to abstract over the core modules such as http, file, and more to bring the power of RxJS to Node. The Reactive Extensions are not included with this release and must be installed separately. 6 | 7 | ## LICENSE 8 | 9 | Copyright 2011 Microsoft Corporation 10 | 11 | Licensed under the Apache License, Version 2.0 (the "License"); 12 | you may not use this file except in compliance with the License. 13 | You may obtain a copy of the License at 14 | http://www.apache.org/licenses/LICENSE-2.0 15 | 16 | Unless required by applicable law or agreed to in writing, software 17 | distributed under the License is distributed on an "AS IS" BASIS, 18 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 | See the License for the specific language governing permissions and 20 | limitations under the License. -------------------------------------------------------------------------------- /lib/rx_path.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var path = require("path"); 18 | for(var k in path) { 19 | exports[k] = path[k]; 20 | } 21 | exports.exists = function(pathName) { 22 | var subject = new Rx.AsyncSubject(), 23 | handler = function(exists) { 24 | subject.onNext(exists); 25 | subject.onCompleted(); 26 | }; 27 | path.exists(pathName, handler); 28 | return subject; 29 | }; 30 | 31 | -------------------------------------------------------------------------------- /lib/rx_sys.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var sys = require("sys"); 18 | for(var k in sys) { 19 | exports[k] = sys[k]; 20 | } 21 | exports.exec = function (command) { 22 | var subject = new Rx.AsyncSubject(), 23 | handler = function (err, stdout, stderr) { 24 | if (err) { 25 | subject.onError({ error: err, stderr: stderr }); 26 | } else { 27 | subject.onNext(stdout); 28 | subject.onCompleted(); 29 | } 30 | }; 31 | sys.exec(command, handler); 32 | return subject; 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /lib/rx_events.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var events = require("events"); 18 | 19 | for(var k in events) { 20 | exports[k] = events[k]; 21 | } 22 | exports.EventEmitter.prototype.toObservable = function(eventName) { 23 | var parent = this; 24 | return Rx.Observable.create(function(observer) { 25 | var handler = function(o) { 26 | observer.onNext(o); 27 | }; 28 | parent.addListener(eventName, handler); 29 | return function() { 30 | parent.removeListener(eventName, handler); 31 | }; 32 | }); 33 | }; 34 | Rx.Observable.prototype.toEventEmitter = function (eventName) { 35 | var emitter = new exports.EventEmitter(); 36 | this.subscribe(function (x) { 37 | emitter.emit(eventName, x); 38 | }); 39 | return emitter; 40 | }; 41 | 42 | 43 | -------------------------------------------------------------------------------- /lib/rx_net.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var net = require("net"); 18 | for (var k in net) { 19 | exports[k] = net[k]; 20 | } 21 | exports.createServer = function (options) { 22 | subject = new Rx.AsyncSubject(), 23 | handler = function (c) { 24 | subject.onNext(c); 25 | subject.onCompleted(); 26 | }, 27 | observable = subject.asObservable(); 28 | observable.server = net.createServer(options, handler); 29 | return observable; 30 | }; 31 | exports.createConnection = function () { 32 | var subject = new Rx.AsyncSubject(), 33 | handler = function (c) { 34 | subject.onNext(c); 35 | subject.onCompleted(); 36 | }, 37 | args = Array.prototype.slice.call(arguments); 38 | args.push(handler); 39 | observable = subject.asObservable(); 40 | observable.server = net.createConnection.apply(this, args); 41 | return observable; 42 | }; 43 | -------------------------------------------------------------------------------- /lib/rx_https.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var https = require("https"); 18 | 19 | for (var k in https) { 20 | exports[k] = https[k]; 21 | } 22 | exports.createServer = function () { 23 | var subject = new Rx.Subject(), 24 | handler = function (request, response) { 25 | subject.onNext({ request: request, response: response }); 26 | }, 27 | observable = subject.asObservable(); 28 | observable.server = https.createServer(handler); 29 | return observable; 30 | }; 31 | exports.request = function (options) { 32 | var subject = new Rx.Subject(), 33 | handler = function (response) { 34 | subject.onNext(response); 35 | }, 36 | observable = subject.asObservable(); 37 | observable.request = https.request(options, handler).on('error', errHandler); 38 | return observable; 39 | }; 40 | exports.get = function (options) { 41 | var subject = new Rx.Subject(), 42 | handler = function (response) { 43 | subject.onNext(response); 44 | } 45 | errHandler = function (err) { 46 | subject.onError(err); 47 | }; 48 | https.get(options, handler).on('error', errHandler); 49 | return subject; 50 | }; 51 | -------------------------------------------------------------------------------- /lib/rx_http.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var http = require("http"); 18 | for(var k in http) { 19 | exports[k] = http[k]; 20 | } 21 | exports.createServer = function() { 22 | var subject = new Rx.AsyncSubject(), 23 | handler = handler = function(request, response) { 24 | subject.onNext( { request: request, response: response }); 25 | subject.onCompleted(); 26 | }, 27 | observable = subject.asObservable(); 28 | observable.server = http.createServer(handler); 29 | return observable; 30 | }; 31 | exports.request = function(options) { 32 | var subject = new Rx.AsyncSubject(), 33 | handler = handler = function (response) { 34 | subject.onNext(response); 35 | subject.onCompleted(); 36 | }, 37 | errHandler = function (err) { 38 | subject.onError(err); 39 | }, 40 | observable = subject.asObservable(); 41 | observable.request = http.request(options, handler).on('error', errHandler); 42 | return observable; 43 | }; 44 | exports.get = function (options) { 45 | var subject = new Rx.AsyncSubject(), 46 | handler = handler = function (response) { 47 | subject.onNext(response); 48 | subject.onCompleted(); 49 | }, 50 | errHandler = function (err) { 51 | subject.onError(err); 52 | }; 53 | http.get(options, handler).on('error', errHandler); 54 | return subject; 55 | }; 56 | -------------------------------------------------------------------------------- /lib/rx_child_process.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var child_process = require("child_process"); 18 | 19 | for (var k in child_process) { 20 | exports[k] = child_process[k]; 21 | } 22 | 23 | exports.exec = function (command, options) { 24 | var subject = new Rx.AsyncSubject(), 25 | handler = function (err, stdout, stderr) { 26 | if (err !== null) { 27 | subject.onError(err); 28 | } else { 29 | subject.onNext({ stdout: stdout, stderr: stderr }); 30 | subject.onCompleted(); 31 | } 32 | }; 33 | child_process.exec(command, options, handler); 34 | return subject; 35 | }; 36 | 37 | exports.execFile = function (file, args, options) { 38 | var subject = new Rx.AsyncSubject(), 39 | handler = function (err, stdout, stderr) { 40 | if (err !== null) { 41 | subject.onError(err); 42 | } else { 43 | subject.onNext({ stdout: stdout, stderr: stderr }); 44 | subject.onCompleted(); 45 | } 46 | }; 47 | child_process.execFile(file, args, options, handler); 48 | return subject; 49 | }; 50 | 51 | exports.spawn = function (command, args, options) { 52 | return Rx.Observable.createWithDisposable(function (observer) { 53 | var process = child_process.spawn(command, args, options); 54 | process.stdout.on('data', function (data) { 55 | observer.onNext({ data: data, stdout: stdout, stderr: stderr }); 56 | }); 57 | process.stderr.on('data', function (data) { 58 | observer.onError({ data: data, stdout: stdout, stderr: stderr }); 59 | }); 60 | process.on('exit', function (code) { 61 | if (code !== 0) { 62 | observer.onCompleted(); 63 | } else { 64 | observer.onError({ code: code, stdout: stdout, stderr: stderr }); 65 | } 66 | }); 67 | return Rx.Disposable.empty; 68 | }); 69 | }; 70 | -------------------------------------------------------------------------------- /lib/rx_dns.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var dns = require("dns"); 18 | 19 | for(var k in dns) { 20 | exports[k] = dns[k]; 21 | } 22 | exports.resolve = function(domain, rrtype) { 23 | var subject = new Rx.AsyncSubject(), 24 | handler = function(err, addresses) { 25 | if (err) { 26 | subject.onError(err); 27 | } else { 28 | subject.onNext(addresses); 29 | subject.onCompleted(); 30 | } 31 | }; 32 | dns.resolve(domain, rrtype, handler); 33 | return subject; 34 | }; 35 | exports.resolve4 = function(domain) { 36 | var subject = new Rx.AsyncSubject(), 37 | handler = function (err, addresses) { 38 | if (err) { 39 | subject.onError(err); 40 | } else { 41 | subject.onNext(addresses); 42 | subject.onCompleted(); 43 | } 44 | }; 45 | dns.resolve4(domain, handler); 46 | return subject; 47 | }; 48 | exports.resolve6 = function(domain) { 49 | var subject = new Rx.AsyncSubject(), 50 | handler = function (err, addresses) { 51 | if (err) { 52 | subject.onError(err); 53 | } else { 54 | subject.onNext(addresses); 55 | subject.onCompleted(); 56 | } 57 | }; 58 | dns.resolve6(domain, handler); 59 | return subject; 60 | }; 61 | exports.resolveMx = function(domain) { 62 | var subject = new Rx.AsyncSubject(), 63 | handler = function (err, addresses) { 64 | if (err) { 65 | subject.onError(err); 66 | } else { 67 | subject.onNext(addresses); 68 | subject.onCompleted(); 69 | } 70 | }; 71 | dns.resolveMx(domain, handler); 72 | return subject; 73 | }; 74 | exports.resolveTxt = function(domain) { 75 | var subject = new Rx.AsyncSubject(), 76 | handler = function (err, addresses) { 77 | if (err) { 78 | subject.onError(err); 79 | } else { 80 | subject.onNext(addresses); 81 | subject.onCompleted(); 82 | } 83 | }; 84 | dns.resolveTxt(domain, handler); 85 | return subject; 86 | }; 87 | exports.resolveSrv = function(domain) 88 | { 89 | var subject = new Rx.AsyncSubject(), 90 | handler = function (err, addresses) { 91 | if (err) { 92 | subject.onError(err); 93 | } else { 94 | subject.onNext(addresses); 95 | subject.onCompleted(); 96 | } 97 | }; 98 | dns.resolveSrv(domain, handler); 99 | return subject; 100 | }; 101 | 102 | exports.reverse = function(ip) { 103 | var subject = new Rx.AsyncSubject(), 104 | handler = function(err, domains) { 105 | if (err) { 106 | subject.onError(err); 107 | } else { 108 | subject.onNext(domains); 109 | subject.onCompleted(); 110 | } 111 | }; 112 | dns.reverse(ip, handler); 113 | return subject; 114 | }; 115 | 116 | -------------------------------------------------------------------------------- /lib/rx_fs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2011 Microsoft Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software 10 | * distributed under the License is distributed on an "AS IS" BASIS, 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | * See the License for the specific language governing permissions and 13 | * limitations under the License. 14 | */ 15 | 16 | var Rx = require("./rx.node"); 17 | var fs = require("fs"); 18 | for(var k in fs) { 19 | exports[k] = fs[k]; 20 | } 21 | exports.rename = function(path1, path2) { 22 | var subject = new Rx.AsyncSubject(), 23 | handler = function(err) { 24 | if (err) { 25 | subject.onError(err); 26 | } else { 27 | subject.onNext(); 28 | subject.onCompleted(); 29 | } 30 | }; 31 | fs.rename(path1, path2, handler); 32 | return subject; 33 | }; 34 | exports.truncate = function(fd, len) { 35 | var subject = new Rx.AsyncSubject(), 36 | handler = function (err) { 37 | if (err) { 38 | subject.onError(err); 39 | } else { 40 | subject.onNext(); 41 | subject.onCompleted(); 42 | } 43 | }; 44 | fs.truncate(fd, len, handler); 45 | return subject; 46 | }; 47 | exports.chmod = function(path, mode) { 48 | var subject = new Rx.AsyncSubject(), 49 | handler = function (err) { 50 | if (err) { 51 | subject.onError(err); 52 | } else { 53 | subject.onNext(); 54 | subject.onCompleted(); 55 | } 56 | }; 57 | fs.chmod(path, mode, handler); 58 | return subject; 59 | }; 60 | exports.stat = function(path) { 61 | var subject = new Rx.AsyncSubject(), 62 | handler = function(err, stats) { 63 | if (err) { 64 | subject.onError(err); 65 | } else { 66 | subject.onNext(stats); 67 | subject.onCompleted(); 68 | } 69 | }; 70 | fs.stat(path, handler); 71 | return subject; 72 | }; 73 | exports.lstat = function(path) { 74 | var subject = new Rx.AsyncSubject(), 75 | handler = function(err, stats) { 76 | if (err) { 77 | subject.onError(err); 78 | } else { 79 | subject.onNext(stats); 80 | subject.onCompleted(); 81 | } 82 | }; 83 | fs.lstat(path, handler); 84 | return subject; 85 | }; 86 | exports.fstat = function (fd) { 87 | var subject = new Rx.AsyncSubject(), 88 | handler = function (err, stats) { 89 | if (err) { 90 | subject.onError(err); 91 | } else { 92 | subject.onNext(stats); 93 | subject.onCompleted(); 94 | } 95 | }; 96 | fs.fstat(fd, handler); 97 | return subject; 98 | }; 99 | exports.link = function(srcpath, dstpath) { 100 | var subject = new Rx.AsyncSubject(), 101 | handler = function(err) { 102 | if (err) { 103 | subject.onError(err); 104 | } else { 105 | subject.onNext(); 106 | subject.onCompleted(); 107 | } 108 | }; 109 | fs.link(srcpath, dstpath, handler); 110 | return subject; 111 | }; 112 | exports.symlink = function(linkdata, path) { 113 | var subject = new Rx.AsyncSubject(), 114 | handler = function (err) { 115 | if (err) { 116 | subject.onError(err); 117 | } else { 118 | subject.onNext(); 119 | subject.onCompleted(); 120 | } 121 | }; 122 | fs.symlink(linkdata, path, handler); 123 | return subject; 124 | }; 125 | exports.readlink = function(path) { 126 | var subject = new Rx.AsyncSubject(), 127 | handler = function(err, resolvedPath) { 128 | if (err) { 129 | subject.onError(err); 130 | } else { 131 | subject.onNext(resolvedPath); 132 | subject.onCompleted(); 133 | } 134 | }; 135 | fs.readlink(path, handler); 136 | return subject; 137 | }; 138 | exports.realpath = function(path) { 139 | var subject = new Rx.AsyncSubject(), 140 | handler = function(err, resolvedPath) { 141 | if (err) { 142 | subject.onError(err); 143 | } else { 144 | subject.onNext(resolvedPath); 145 | subject.onCompleted(); 146 | } 147 | }; 148 | fs.realpath(path, handler); 149 | return subject; 150 | }; 151 | exports.unlink = function(path) { 152 | var subject = new Rx.AsyncSubject(), 153 | handler = function(err) { 154 | if (err) { 155 | subject.onError(err); 156 | } else { 157 | subject.onNext(); 158 | subject.onCompleted(); 159 | } 160 | }; 161 | fs.unlink(path, handler); 162 | return subject; 163 | }; 164 | exports.rmdir = function(path) { 165 | var subject = new Rx.AsyncSubject(), 166 | handler = function (err) { 167 | if (err) { 168 | subject.onError(err); 169 | } else { 170 | subject.onNext(); 171 | subject.onCompleted(); 172 | } 173 | }; 174 | fs.rmdir(path, handler); 175 | return subject; 176 | }; 177 | exports.mkdir = function(path, mode) { 178 | var subject = new Rx.AsyncSubject(), 179 | handler = function (err) { 180 | if (err) { 181 | subject.onError(err); 182 | } else { 183 | subject.onNext(); 184 | subject.onCompleted(); 185 | } 186 | }; 187 | fs.mkdir(path, mode, handler); 188 | return subject; 189 | }; 190 | exports.readdir = function(path) { 191 | var subject = new Rx.AsyncSubject(), 192 | handler = function(err, files) { 193 | if (err) { 194 | subject.onError(err); 195 | } else { 196 | subject.onNext(files); 197 | subject.onCompleted(); 198 | } 199 | }; 200 | fs.readdir(path, handler); 201 | return subject; 202 | }; 203 | exports.close = function(fd) { 204 | var subject = new Rx.AsyncSubject(), 205 | handler = function (err) { 206 | if (err) { 207 | subject.onError(err); 208 | } else { 209 | subject.onNext(); 210 | subject.onCompleted(); 211 | } 212 | }; 213 | fs.close(fd, handler); 214 | return subject; 215 | }; 216 | exports.open = function(path, flags, mode) { 217 | var subject = new Rx.AsyncSubject(), 218 | handler = function(err, fd) { 219 | if (err) { 220 | subject.onError(err); 221 | } else { 222 | subject.onNext(fd); 223 | subject.onCompleted(); 224 | } 225 | }; 226 | fs.open(path, flags, mode, handler); 227 | return subject; 228 | }; 229 | exports.write = function (fd, buffer, offset, length, position) { 230 | var subject = new Rx.AsyncSubject(), 231 | handler = function(err, written, innerBuffer) { 232 | if (err) { 233 | subject.onError(err); 234 | } else { 235 | subject.onNext({ written: written, buffer: innerBuffer }); 236 | subject.onCompleted(); 237 | } 238 | }; 239 | fs.write(fd, buffer, offset, length, position, handler); 240 | return subject; 241 | }; 242 | exports.read = function (fd, buffer, offset, length, position) { 243 | var subject = new Rx.AsyncSubject(), 244 | handler = function (err, bytesRead, innerBuffer) { 245 | if (err) { 246 | subject.onError(err); 247 | } else { 248 | subject.onNext({ bytesRead: bytesRead, buffer: innerBuffer }); 249 | subject.onCompleted(); 250 | } 251 | }; 252 | fs.read(fd, buffer, offset, length, position, handler); 253 | return subject; 254 | }; 255 | exports.readFile = function(fileName, encoding) { 256 | var subject = new Rx.AsyncSubject(), 257 | handler = function(err, data) { 258 | if (err) 259 | { 260 | subject.onError(err); 261 | } else { 262 | subject.onNext(data); 263 | subject.onCompleted(); 264 | } 265 | }; 266 | fs.readFile(fileName, encoding, handler); 267 | return subject; 268 | }; 269 | exports.writeFile = function(fileName, data, encoding) { 270 | var subject = new Rx.AsyncSubject(), 271 | handler = function (err) { 272 | if (err) { 273 | subject.onError(err); 274 | } else { 275 | subject.onNext(); 276 | subject.onCompleted(); 277 | } 278 | }; 279 | fs.writeFile(fileName, data, encoding, handler); 280 | return subject; 281 | }; 282 | exports.watchFile = function(filename, options) { 283 | var subject = new Rx.AsyncSubject(), 284 | handler = function(curr, prev) { 285 | subject.onNext( { curr: curr, prev: prev }); 286 | subject.onCompleted(); 287 | }; 288 | fs.watchFile(filename, options, handler); 289 | return subject; 290 | }; 291 | 292 | --------------------------------------------------------------------------------