Buckets:
| const fs = require('fs') | |
| const proxyquire = require('proxyquire') | |
| const SonicBoom = require('../') | |
| const { file, runTests } = require('./helper') | |
| runTests(buildTests) | |
| function buildTests (test, sync) { | |
| // Reset the umask for testing | |
| process.umask(0o000) | |
| test('reopen', (t) => { | |
| t.plan(9) | |
| const dest = file() | |
| const stream = new SonicBoom({ dest, sync }) | |
| t.ok(stream.write('hello world\n')) | |
| t.ok(stream.write('something else\n')) | |
| const after = dest + '-moved' | |
| stream.once('drain', () => { | |
| t.pass('drain emitted') | |
| fs.renameSync(dest, after) | |
| stream.reopen() | |
| stream.once('ready', () => { | |
| t.pass('ready emitted') | |
| t.ok(stream.write('after reopen\n')) | |
| stream.once('drain', () => { | |
| fs.readFile(after, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'hello world\nsomething else\n') | |
| fs.readFile(dest, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'after reopen\n') | |
| stream.end() | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| test('reopen with buffer', (t) => { | |
| t.plan(9) | |
| const dest = file() | |
| const stream = new SonicBoom({ dest, minLength: 4096, sync }) | |
| t.ok(stream.write('hello world\n')) | |
| t.ok(stream.write('something else\n')) | |
| const after = dest + '-moved' | |
| stream.once('ready', () => { | |
| t.pass('drain emitted') | |
| stream.flush() | |
| fs.renameSync(dest, after) | |
| stream.reopen() | |
| stream.once('ready', () => { | |
| t.pass('ready emitted') | |
| t.ok(stream.write('after reopen\n')) | |
| stream.flush() | |
| stream.once('drain', () => { | |
| fs.readFile(after, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'hello world\nsomething else\n') | |
| fs.readFile(dest, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'after reopen\n') | |
| stream.end() | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| test('reopen if not open', (t) => { | |
| t.plan(3) | |
| const dest = file() | |
| const stream = new SonicBoom({ dest, sync }) | |
| t.ok(stream.write('hello world\n')) | |
| t.ok(stream.write('something else\n')) | |
| stream.reopen() | |
| stream.end() | |
| stream.on('close', function () { | |
| t.pass('ended') | |
| }) | |
| }) | |
| test('reopen with file', (t) => { | |
| t.plan(10) | |
| const dest = file() | |
| const stream = new SonicBoom({ dest, minLength: 0, sync }) | |
| t.ok(stream.write('hello world\n')) | |
| t.ok(stream.write('something else\n')) | |
| const after = dest + '-new' | |
| stream.once('drain', () => { | |
| t.pass('drain emitted') | |
| stream.reopen(after) | |
| t.equal(stream.file, after) | |
| stream.once('ready', () => { | |
| t.pass('ready emitted') | |
| t.ok(stream.write('after reopen\n')) | |
| stream.once('drain', () => { | |
| fs.readFile(dest, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'hello world\nsomething else\n') | |
| fs.readFile(after, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'after reopen\n') | |
| stream.end() | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| test('reopen throws an error', (t) => { | |
| t.plan(sync ? 10 : 9) | |
| const fakeFs = Object.create(fs) | |
| const SonicBoom = proxyquire('../', { | |
| fs: fakeFs | |
| }) | |
| const dest = file() | |
| const stream = new SonicBoom({ dest, sync }) | |
| t.ok(stream.write('hello world\n')) | |
| t.ok(stream.write('something else\n')) | |
| const after = dest + '-moved' | |
| stream.on('error', () => { | |
| t.pass('error emitted') | |
| }) | |
| stream.once('drain', () => { | |
| t.pass('drain emitted') | |
| fs.renameSync(dest, after) | |
| if (sync) { | |
| fakeFs.openSync = function (file, flags) { | |
| t.pass('fake fs.openSync called') | |
| throw new Error('open error') | |
| } | |
| } else { | |
| fakeFs.open = function (file, flags, mode, cb) { | |
| t.pass('fake fs.open called') | |
| setTimeout(() => cb(new Error('open error')), 0) | |
| } | |
| } | |
| if (sync) { | |
| try { | |
| stream.reopen() | |
| } catch (err) { | |
| t.pass('reopen throwed') | |
| } | |
| } else { | |
| stream.reopen() | |
| } | |
| setTimeout(() => { | |
| t.ok(stream.write('after reopen\n')) | |
| stream.end() | |
| stream.on('finish', () => { | |
| fs.readFile(after, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'hello world\nsomething else\nafter reopen\n') | |
| }) | |
| }) | |
| stream.on('close', () => { | |
| t.pass('close emitted') | |
| }) | |
| }, 0) | |
| }) | |
| }) | |
| test('reopen emits drain', (t) => { | |
| t.plan(9) | |
| const dest = file() | |
| const stream = new SonicBoom({ dest, sync }) | |
| t.ok(stream.write('hello world\n')) | |
| t.ok(stream.write('something else\n')) | |
| const after = dest + '-moved' | |
| stream.once('drain', () => { | |
| t.pass('drain emitted') | |
| fs.renameSync(dest, after) | |
| stream.reopen() | |
| stream.once('drain', () => { | |
| t.pass('drain emitted') | |
| t.ok(stream.write('after reopen\n')) | |
| stream.once('drain', () => { | |
| fs.readFile(after, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'hello world\nsomething else\n') | |
| fs.readFile(dest, 'utf8', (err, data) => { | |
| t.error(err) | |
| t.equal(data, 'after reopen\n') | |
| stream.end() | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| }) | |
| } | |
Xet Storage Details
- Size:
- 5.61 kB
- Xet hash:
- 377200a307cc98afbc6acbaf8004e70f14de5725c8c9223a601500c86df2c936
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.