123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- /**
- * Node fs module that returns promises
- */
- if (typeof java === "object"){
- var fs = require("./engines/rhino/fs");
- // for rhino
- for(var i in fs){
- exports[i] = fs[i];
- }
- }
- else{
- var fs = require("fs"),
- LazyArray = require("./lazy-array").LazyArray,
- Buffer = require("buffer").Buffer,
- defer = require("./promise").defer,
- when = require("./promise").when,
- convertNodeAsyncFunction = require("./promise").convertNodeAsyncFunction;
- // convert all the non-sync functions that have a sync counterpart
- for (var i in fs) {
- if ((i + 'Sync') in fs) {
- // async
- if (fs[i]) {
- exports[i] = convertNodeAsyncFunction(fs[i], i === "readFile");
- }
- }
- else{
- // sync, or something that we can't auto-convert
- exports[i] = fs[i];
- }
- }
- function File(fd){
- var file = new LazyArray({
- some: function(callback){
- var deferred = defer();
- function readAndSend(){
- var buffer = new Buffer(4096);
- if(fd.then){
- fd.then(function(resolvedFd){
- fd = resolvedFd;
- fs.read(fd, buffer, 0, 4096, null, readResponse);
- });
- }else{
- fs.read(fd, buffer, 0, 4096, null, readResponse);
- }
- function readResponse(err, bytesRead){
- if(err){
- deferred.reject(err);
- return;
- }
- if (bytesRead === 0){
- fs.close(fd, function (err) {
- if(err){
- deferred.reject(err);
- return;
- }
- deferred.resolve();
- });
- }
- else {
- var result;
- if(bytesRead < 4096){
- result = callback(buffer.slice(0, bytesRead));
- }else{
- result = callback(buffer);
- }
- if(result){
- // if a promise is returned, we wait for it be fulfilled, allows for back-pressure indication
- if(result.then){
- result.then(function(result){
- if(result){
- deferred.resolve();
- }
- else{
- readAndSend(fd);
- }
- }, deferred.reject);
- }
- else{
- deferred.resolve();
- }
- }else{
- readAndSend(fd);
- }
- }
- }
- }
- readAndSend();
- return deferred.promise;
- },
- length: 0
- });
- file.fd = fd;
- file.then = function(callback, errback){
- fd.then(function(){
- callback(file);
- }, errback);
- };
- file.write = function(contents, options, encoding){
- return exports.write(file, contents, options, encoding);
- }
- file.close = function(){
- return exports.close(file);
- }
- file.writeSync = function(contents, options, encoding){
- return exports.writeSync(file.fd, contents, options, encoding);
- }
- file.closeSync = function(){
- return exports.closeSync(file.fd);
- }
- return file;
- }
- File.prototype = LazyArray.prototype;
- var nodeRead = exports.read;
- exports.read = function(path, options){
- if(path instanceof File){
- var args = arguments;
- return when(path.fd, function(fd){
- args[0] = fd;
- return nodeRead.apply(this, args);
- });
- }else{
- return exports.readFileSync(path, options).toString((options && options.charset) || "utf8");
- }
- };
- var nodeWrite = exports.write;
- exports.write = function(path, contents, options, encoding){
- if(path instanceof File){
- var id = Math.random();
- var args = arguments;
- return when(path.fd, function(fd){
- args[0] = fd;
- if(typeof contents == "string"){
- return nodeWrite(fd, contents, options, encoding);
- }
- return nodeWrite(fd, contents, 0, contents.length, null);
- });
- }else{
- return exports.writeFileSync(path, contents, options);
- }
- };
- var nodeClose = exports.close;
- exports.close = function(file){
- if(file instanceof File){
- var args = arguments;
- return when(file.fd, function(fd){
- args[0] = fd;
- return nodeClose.apply(this, args);
- });
- }
- throw new Error("Must be given a file descriptor");
- };
- var nodeOpenSync = exports.openSync;
- exports.openSync = function(){
- if(typeof mode == "string"){
- arguments[1] = mode.replace(/b/,'');
- }
- return File(nodeOpenSync.apply(this, arguments));
- };
- nodeOpen = exports.open;
- exports.open = function(path, mode){
- if(typeof mode == "string"){
- arguments[1] = mode.replace(/b/,'');
- }
- return File(nodeOpen.apply(this, arguments));
- };
- exports.makeDirectory = exports.mkdirSync;
- exports.makeTree = function(path){
- if(path.charAt(path.length-1) == '/') {
- path = path.substring(0, path.length - 1);
- }
- try{
- fs.statSync(path);
- }catch(e){
- var index = path.lastIndexOf('/');
- if(index > -1){
- exports.makeTree(path.substring(0, index));
- }
- fs.mkdirSync(path, 0777);
- }
- };
- exports.absolute = exports.realpathSync;
- exports.list = exports.readdirSync;
- exports.move = exports.rename;
- }
|