WIP - moving to Buffer internally from Uint8Array, not passing all tests yet.
This commit is contained in:
parent
b51957ea77
commit
1914f7a52b
|
@ -0,0 +1,34 @@
|
||||||
|
/**
|
||||||
|
* Provide guarantees about Buffer vs. Uint8Array for internal code
|
||||||
|
* that has a preference.
|
||||||
|
*
|
||||||
|
* From the node.js Buffer docs: http://nodejs.org/api/buffer.html#buffer_buffer
|
||||||
|
*
|
||||||
|
* "A Buffer object can also be used with typed arrays. The buffer
|
||||||
|
* object is cloned to an ArrayBuffer that is used as the backing
|
||||||
|
* store for the typed array. The memory of the buffer and the
|
||||||
|
* ArrayBuffer is not shared."
|
||||||
|
*
|
||||||
|
* In a browser, where we use https://github.com/feross/buffer, a Buffer
|
||||||
|
* is really a Uint8Array augmented with other methods and properties. As
|
||||||
|
* such, we do feature detection instead of type identifiation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function ensureBuffer(maybeBuffer) {
|
||||||
|
if(!(typeof maybeBuffer.copy === 'function')) {
|
||||||
|
maybeBuffer = new Buffer(maybeBuffer);
|
||||||
|
}
|
||||||
|
return maybeBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureUint8Array(maybeU8) {
|
||||||
|
if(!('buffer' in maybeU8 && 'byteOffset' in maybeU8 && 'byteLength' in maybeU8)) {
|
||||||
|
maybeU8 = new Uint8Array(maybeU8);
|
||||||
|
}
|
||||||
|
return maybeU8;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
ensureBuffer: ensureBuffer,
|
||||||
|
ensureUint8Array: ensureUint8Array
|
||||||
|
};
|
|
@ -0,0 +1,19 @@
|
||||||
|
var TextEncoder = require('../lib/encoding.js').TextEncoder;
|
||||||
|
var TextDecoder = require('../lib/encoding.js').TextDecoder;
|
||||||
|
var BufferUtils = require('./buffer-utils.js');
|
||||||
|
|
||||||
|
// Adapt encodings to work with Buffer or Uint8Array, they expect the latter
|
||||||
|
function decode(buf) {
|
||||||
|
buf = BufferUtils.ensureUint8Array(buf);
|
||||||
|
return (new TextDecoder('utf8')).decode(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
function encode(string) {
|
||||||
|
var u8 = (new TextEncoder('utf8')).encode(string);
|
||||||
|
return BufferUtils.ensureBuffer(u8);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
encode: encode,
|
||||||
|
decode: decode
|
||||||
|
};
|
|
@ -1,8 +1,5 @@
|
||||||
var _ = require('../../lib/nodash.js');
|
var _ = require('../../lib/nodash.js');
|
||||||
|
|
||||||
var TextDecoder = require('../../lib/encoding.js').TextDecoder;
|
|
||||||
var TextEncoder = require('../../lib/encoding.js').TextEncoder;
|
|
||||||
|
|
||||||
var Path = require('../path.js');
|
var Path = require('../path.js');
|
||||||
var normalize = Path.normalize;
|
var normalize = Path.normalize;
|
||||||
var dirname = Path.dirname;
|
var dirname = Path.dirname;
|
||||||
|
@ -33,6 +30,8 @@ var XATTR_REPLACE = Constants.XATTR_REPLACE;
|
||||||
var FS_NOMTIME = Constants.FS_NOMTIME;
|
var FS_NOMTIME = Constants.FS_NOMTIME;
|
||||||
var FS_NOCTIME = Constants.FS_NOCTIME;
|
var FS_NOCTIME = Constants.FS_NOCTIME;
|
||||||
|
|
||||||
|
var Encoding = require('../encoding.js');
|
||||||
|
var BufferUtils = require('../buffer-utils.js');
|
||||||
var Errors = require('../errors.js');
|
var Errors = require('../errors.js');
|
||||||
var DirectoryEntry = require('../directory-entry.js');
|
var DirectoryEntry = require('../directory-entry.js');
|
||||||
var OpenFileDescription = require('../open-file-description.js');
|
var OpenFileDescription = require('../open-file-description.js');
|
||||||
|
@ -641,7 +640,7 @@ function open_file(context, path, flags, callback) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error);
|
callback(error);
|
||||||
} else {
|
} else {
|
||||||
fileData = new Uint8Array(0);
|
fileData = new Buffer(0);
|
||||||
context.put(fileNode.data, fileData, update_directory_data);
|
context.put(fileNode.data, fileData, update_directory_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -676,6 +675,8 @@ function open_file(context, path, flags, callback) {
|
||||||
function replace_data(context, ofd, buffer, offset, length, callback) {
|
function replace_data(context, ofd, buffer, offset, length, callback) {
|
||||||
var fileNode;
|
var fileNode;
|
||||||
|
|
||||||
|
buffer = BufferUtils.ensureBuffer(buffer);
|
||||||
|
|
||||||
function return_nbytes(error) {
|
function return_nbytes(error) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error);
|
callback(error);
|
||||||
|
@ -706,9 +707,9 @@ function replace_data(context, ofd, buffer, offset, length, callback) {
|
||||||
callback(error);
|
callback(error);
|
||||||
} else {
|
} else {
|
||||||
fileNode = result;
|
fileNode = result;
|
||||||
var newData = new Uint8Array(length);
|
var newData = new Buffer(length);
|
||||||
var bufferWindow = buffer.subarray(offset, offset + length);
|
var bufferWindow = buffer.slice(offset, offset + length);
|
||||||
newData.set(bufferWindow);
|
bufferWindow.copy(newData);
|
||||||
ofd.position = length;
|
ofd.position = length;
|
||||||
|
|
||||||
fileNode.size = length;
|
fileNode.size = length;
|
||||||
|
@ -725,6 +726,8 @@ function write_data(context, ofd, buffer, offset, length, position, callback) {
|
||||||
var fileNode;
|
var fileNode;
|
||||||
var fileData;
|
var fileData;
|
||||||
|
|
||||||
|
buffer = BufferUtils.ensureBuffer(buffer);
|
||||||
|
|
||||||
function return_nbytes(error) {
|
function return_nbytes(error) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error);
|
callback(error);
|
||||||
|
@ -757,12 +760,12 @@ function write_data(context, ofd, buffer, offset, length, position, callback) {
|
||||||
fileData = result;
|
fileData = result;
|
||||||
var _position = (!(undefined === position || null === position)) ? position : ofd.position;
|
var _position = (!(undefined === position || null === position)) ? position : ofd.position;
|
||||||
var newSize = Math.max(fileData.length, _position + length);
|
var newSize = Math.max(fileData.length, _position + length);
|
||||||
var newData = new Uint8Array(newSize);
|
var newData = new Buffer(newSize);
|
||||||
if(fileData) {
|
if(fileData) {
|
||||||
newData.set(fileData);
|
newData.copy(fileData);
|
||||||
}
|
}
|
||||||
var bufferWindow = buffer.subarray(offset, offset + length);
|
var bufferWindow = buffer.slice(offset, offset + length);
|
||||||
newData.set(bufferWindow, _position);
|
bufferWindow.copy(newData, _position);
|
||||||
if(undefined === position) {
|
if(undefined === position) {
|
||||||
ofd.position += length;
|
ofd.position += length;
|
||||||
}
|
}
|
||||||
|
@ -790,6 +793,8 @@ function read_data(context, ofd, buffer, offset, length, position, callback) {
|
||||||
var fileNode;
|
var fileNode;
|
||||||
var fileData;
|
var fileData;
|
||||||
|
|
||||||
|
buffer = BufferUtils.ensureBuffer(buffer);
|
||||||
|
|
||||||
function handle_file_data(error, result) {
|
function handle_file_data(error, result) {
|
||||||
if(error) {
|
if(error) {
|
||||||
callback(error);
|
callback(error);
|
||||||
|
@ -797,8 +802,8 @@ function read_data(context, ofd, buffer, offset, length, position, callback) {
|
||||||
fileData = result;
|
fileData = result;
|
||||||
var _position = (!(undefined === position || null === position)) ? position : ofd.position;
|
var _position = (!(undefined === position || null === position)) ? position : ofd.position;
|
||||||
length = (_position + length > buffer.length) ? length - _position : length;
|
length = (_position + length > buffer.length) ? length - _position : length;
|
||||||
var dataView = fileData.subarray(_position, _position + length);
|
var dataView = fileData.slice(_position, _position + length);
|
||||||
buffer.set(dataView, offset);
|
dataView.copy(buffer, offset);
|
||||||
if(undefined === position) {
|
if(undefined === position) {
|
||||||
ofd.position += length;
|
ofd.position += length;
|
||||||
}
|
}
|
||||||
|
@ -1182,9 +1187,9 @@ function truncate_file(context, path, length, callback) {
|
||||||
if (error) {
|
if (error) {
|
||||||
callback(error);
|
callback(error);
|
||||||
} else {
|
} else {
|
||||||
var data = new Uint8Array(length);
|
var data = new Buffer(length);
|
||||||
if(fileData) {
|
if(fileData) {
|
||||||
data.set(fileData.subarray(0, length));
|
fileData.copy(data);
|
||||||
}
|
}
|
||||||
context.put(fileNode.data, data, update_file_node);
|
context.put(fileNode.data, data, update_file_node);
|
||||||
}
|
}
|
||||||
|
@ -1234,9 +1239,11 @@ function ftruncate_file(context, ofd, length, callback) {
|
||||||
if (error) {
|
if (error) {
|
||||||
callback(error);
|
callback(error);
|
||||||
} else {
|
} else {
|
||||||
var data = new Uint8Array(length);
|
var data;
|
||||||
if(fileData) {
|
if(fileData) {
|
||||||
data.set(fileData.subarray(0, length));
|
data = fileData.slice(0, length);
|
||||||
|
} else {
|
||||||
|
data = new Buffer(length);
|
||||||
}
|
}
|
||||||
context.put(fileNode.data, data, update_file_node);
|
context.put(fileNode.data, data, update_file_node);
|
||||||
}
|
}
|
||||||
|
@ -1651,7 +1658,7 @@ function readFile(fs, context, path, options, callback) {
|
||||||
|
|
||||||
var stats = new Stats(fstatResult, fs.name);
|
var stats = new Stats(fstatResult, fs.name);
|
||||||
var size = stats.size;
|
var size = stats.size;
|
||||||
var buffer = new Uint8Array(size);
|
var buffer = new Buffer(size);
|
||||||
|
|
||||||
read_data(context, ofd, buffer, 0, size, 0, function(err3, nbytes) {
|
read_data(context, ofd, buffer, 0, size, 0, function(err3, nbytes) {
|
||||||
if(err3) {
|
if(err3) {
|
||||||
|
@ -1661,7 +1668,7 @@ function readFile(fs, context, path, options, callback) {
|
||||||
|
|
||||||
var data;
|
var data;
|
||||||
if(options.encoding === 'utf8') {
|
if(options.encoding === 'utf8') {
|
||||||
data = new TextDecoder('utf-8').decode(buffer);
|
data = Encoding.decode(buffer);
|
||||||
} else {
|
} else {
|
||||||
data = buffer;
|
data = buffer;
|
||||||
}
|
}
|
||||||
|
@ -1704,7 +1711,7 @@ function writeFile(fs, context, path, data, options, callback) {
|
||||||
data = '' + data;
|
data = '' + data;
|
||||||
}
|
}
|
||||||
if(typeof data === "string" && options.encoding === 'utf8') {
|
if(typeof data === "string" && options.encoding === 'utf8') {
|
||||||
data = new TextEncoder('utf-8').encode(data);
|
data = Encoding.encode(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
open_file(context, path, flags, function(err, fileNode) {
|
open_file(context, path, flags, function(err, fileNode) {
|
||||||
|
@ -1740,7 +1747,7 @@ function appendFile(fs, context, path, data, options, callback) {
|
||||||
data = '' + data;
|
data = '' + data;
|
||||||
}
|
}
|
||||||
if(typeof data === "string" && options.encoding === 'utf8') {
|
if(typeof data === "string" && options.encoding === 'utf8') {
|
||||||
data = new TextEncoder('utf-8').encode(data);
|
data = Encoding.encode(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
open_file(context, path, flags, function(err, fileNode) {
|
open_file(context, path, flags, function(err, fileNode) {
|
||||||
|
|
|
@ -72,11 +72,11 @@ describe('fs.appendFile', function() {
|
||||||
|
|
||||||
// String and utf8 binary encoded versions of the same thing:
|
// String and utf8 binary encoded versions of the same thing:
|
||||||
var contents = "This is a file.";
|
var contents = "This is a file.";
|
||||||
var binary = new Uint8Array([84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 102, 105, 108, 101, 46]);
|
var binary = new Buffer([84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 102, 105, 108, 101, 46]);
|
||||||
var more = " Appended.";
|
var more = " Appended.";
|
||||||
var binary2 = new Uint8Array([32, 65, 112, 112, 101, 110, 100, 101, 100, 46]);
|
var binary2 = new Buffer([32, 65, 112, 112, 101, 110, 100, 101, 100, 46]);
|
||||||
var binary3 = new Uint8Array([84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 102, 105, 108, 101, 46,
|
var binary3 = new Buffer([84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 102, 105, 108, 101, 46,
|
||||||
32, 65, 112, 112, 101, 110, 100, 101, 100, 46]);
|
32, 65, 112, 112, 101, 110, 100, 101, 100, 46]);
|
||||||
|
|
||||||
fs.writeFile('/mybinaryfile', binary, function(error) {
|
fs.writeFile('/mybinaryfile', binary, function(error) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
|
|
@ -38,8 +38,8 @@ describe('fs.truncate', function() {
|
||||||
|
|
||||||
it('should truncate a file', function(done) {
|
it('should truncate a file', function(done) {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
var buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8]);
|
||||||
var truncated = new Uint8Array([1]);
|
var truncated = new Buffer([1]);
|
||||||
|
|
||||||
fs.open('/myfile', 'w', function(error, result) {
|
fs.open('/myfile', 'w', function(error, result) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
@ -68,8 +68,8 @@ describe('fs.truncate', function() {
|
||||||
|
|
||||||
it('should pad a file with zeros when the length is greater than the file size', function(done) {
|
it('should pad a file with zeros when the length is greater than the file size', function(done) {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
var buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8]);
|
||||||
var truncated = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 0]);
|
var truncated = new Buffer([1, 2, 3, 4, 5, 6, 7, 8, 0]);
|
||||||
|
|
||||||
fs.open('/myfile', 'w', function(error, result) {
|
fs.open('/myfile', 'w', function(error, result) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
@ -98,7 +98,7 @@ describe('fs.truncate', function() {
|
||||||
|
|
||||||
it('should update the file size', function(done) {
|
it('should update the file size', function(done) {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
var buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8]);
|
||||||
|
|
||||||
fs.open('/myfile', 'w', function(error, result) {
|
fs.open('/myfile', 'w', function(error, result) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
@ -127,7 +127,7 @@ describe('fs.truncate', function() {
|
||||||
|
|
||||||
it('should truncate a valid descriptor', function(done) {
|
it('should truncate a valid descriptor', function(done) {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
var buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8]);
|
||||||
|
|
||||||
fs.open('/myfile', 'w', function(error, result) {
|
fs.open('/myfile', 'w', function(error, result) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
@ -152,7 +152,7 @@ describe('fs.truncate', function() {
|
||||||
|
|
||||||
it('should follow symbolic links', function(done) {
|
it('should follow symbolic links', function(done) {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
var buffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
|
var buffer = new Buffer([1, 2, 3, 4, 5, 6, 7, 8]);
|
||||||
|
|
||||||
fs.open('/myfile', 'w', function(error, result) {
|
fs.open('/myfile', 'w', function(error, result) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
|
|
@ -70,7 +70,7 @@ describe('fs.writeFile, fs.readFile', function() {
|
||||||
var fs = util.fs();
|
var fs = util.fs();
|
||||||
// String and utf8 binary encoded versions of the same thing:
|
// String and utf8 binary encoded versions of the same thing:
|
||||||
var contents = "This is a file.";
|
var contents = "This is a file.";
|
||||||
var binary = new Uint8Array([84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 102, 105, 108, 101, 46]);
|
var binary = new Buffer([84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 102, 105, 108, 101, 46]);
|
||||||
|
|
||||||
fs.writeFile('/myfile', binary, function(error) {
|
fs.writeFile('/myfile', binary, function(error) {
|
||||||
if(error) throw error;
|
if(error) throw error;
|
||||||
|
|
Loading…
Reference in New Issue