mirror of https://github.com/status-im/metro.git
metro-memory-fs: clean up createWriteStream()
Reviewed By: rafeca Differential Revision: D7257022 fbshipit-source-id: 30598f2dd24a66bf07d75133ca10fb6b9082010a
This commit is contained in:
parent
167117fe36
commit
43ab7ab811
|
@ -60,7 +60,7 @@ it('can write then read a file as buffer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('createWriteStream', () => {
|
describe('createWriteStream', () => {
|
||||||
it('can write a file', done => {
|
it('writes a file', done => {
|
||||||
const st = fs.createWriteStream('/foo.txt');
|
const st = fs.createWriteStream('/foo.txt');
|
||||||
let opened = false;
|
let opened = false;
|
||||||
let closed = false;
|
let closed = false;
|
||||||
|
@ -76,7 +76,7 @@ describe('createWriteStream', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can write a file, as buffer', done => {
|
it('writes a file, as buffer', done => {
|
||||||
const st = fs.createWriteStream('/foo.txt');
|
const st = fs.createWriteStream('/foo.txt');
|
||||||
let opened = false;
|
let opened = false;
|
||||||
let closed = false;
|
let closed = false;
|
||||||
|
@ -92,7 +92,7 @@ describe('createWriteStream', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('can write a file, with a starting position', done => {
|
it('writes a file, with a starting position', done => {
|
||||||
fs.writeFileSync('/foo.txt', 'test bar');
|
fs.writeFileSync('/foo.txt', 'test bar');
|
||||||
const st = fs.createWriteStream('/foo.txt', {start: 5, flags: 'r+'});
|
const st = fs.createWriteStream('/foo.txt', {start: 5, flags: 'r+'});
|
||||||
let opened = false;
|
let opened = false;
|
||||||
|
@ -107,6 +107,22 @@ describe('createWriteStream', () => {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('writes a file with a custom fd', done => {
|
||||||
|
const fd = fs.openSync('/bar.txt', 'w');
|
||||||
|
const st = fs.createWriteStream('/foo.txt', {fd});
|
||||||
|
let opened = false;
|
||||||
|
let closed = false;
|
||||||
|
st.on('open', () => (opened = true));
|
||||||
|
st.on('close', () => (closed = true));
|
||||||
|
st.write('beep boop');
|
||||||
|
st.end(() => {
|
||||||
|
expect(opened).toBe(false);
|
||||||
|
expect(closed).toBe(true);
|
||||||
|
expect(fs.readFileSync('/bar.txt', 'utf8')).toEqual('beep boop');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('createReadStream', () => {
|
describe('createReadStream', () => {
|
||||||
|
|
|
@ -482,22 +482,9 @@ class MemoryFs {
|
||||||
fd = this._open(pathStr(filePath), flags || 'w', mode);
|
fd = this._open(pathStr(filePath), flags || 'w', mode);
|
||||||
process.nextTick(() => (st: any).emit('open', fd));
|
process.nextTick(() => (st: any).emit('open', fd));
|
||||||
}
|
}
|
||||||
if (start != null) {
|
|
||||||
this._write(fd, new Buffer(0), 0, 0, start);
|
|
||||||
}
|
|
||||||
const ffd = fd;
|
const ffd = fd;
|
||||||
const rst = new stream.Writable({
|
const ropt = {fd, writeSync: this._write.bind(this), filePath, start};
|
||||||
write: (buffer, encoding, callback) => {
|
const rst = new WriteFileStream(ropt);
|
||||||
try {
|
|
||||||
this._write(ffd, buffer, 0, buffer.length);
|
|
||||||
(st: any).bytesWritten += buffer.length;
|
|
||||||
} catch (error) {
|
|
||||||
callback(error);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
callback();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
st = rst;
|
st = rst;
|
||||||
if (autoClose !== false) {
|
if (autoClose !== false) {
|
||||||
const doClose = () => {
|
const doClose = () => {
|
||||||
|
@ -507,8 +494,6 @@ class MemoryFs {
|
||||||
rst.on('finish', doClose);
|
rst.on('finish', doClose);
|
||||||
rst.on('error', doClose);
|
rst.on('error', doClose);
|
||||||
}
|
}
|
||||||
(st: any).path = filePath;
|
|
||||||
(st: any).bytesWritten = 0;
|
|
||||||
return st;
|
return st;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -811,6 +796,48 @@ class ReadFileSteam extends stream.Readable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type WriteSync = (
|
||||||
|
fd: number,
|
||||||
|
buffer: Buffer,
|
||||||
|
offset: number,
|
||||||
|
length: number,
|
||||||
|
position?: number,
|
||||||
|
) => number;
|
||||||
|
|
||||||
|
class WriteFileStream extends stream.Writable {
|
||||||
|
bytesWritten: number;
|
||||||
|
path: string | Buffer;
|
||||||
|
_fd: number;
|
||||||
|
_writeSync: WriteSync;
|
||||||
|
|
||||||
|
constructor(opts: {
|
||||||
|
fd: number,
|
||||||
|
filePath: string | Buffer,
|
||||||
|
writeSync: WriteSync,
|
||||||
|
start: ?number,
|
||||||
|
}) {
|
||||||
|
super();
|
||||||
|
this.path = opts.filePath;
|
||||||
|
this.bytesWritten = 0;
|
||||||
|
this._fd = opts.fd;
|
||||||
|
this._writeSync = opts.writeSync;
|
||||||
|
if (opts.start != null) {
|
||||||
|
this._writeSync(opts.fd, new Buffer(0), 0, 0, opts.start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_write(buffer, encoding, callback) {
|
||||||
|
try {
|
||||||
|
const bytesWritten = this._writeSync(this._fd, buffer, 0, buffer.length);
|
||||||
|
this.bytesWritten += bytesWritten;
|
||||||
|
} catch (error) {
|
||||||
|
callback(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function checkPathLength(entNames, filePath) {
|
function checkPathLength(entNames, filePath) {
|
||||||
if (entNames.length > 32) {
|
if (entNames.length > 32) {
|
||||||
throw makeError(
|
throw makeError(
|
||||||
|
|
Loading…
Reference in New Issue