Skip to content

Commit 19e99cb

Browse files
committed
Merge pull request #61 from soldair/master
adding entity.abort() to stop writes from the parser
2 parents 2cbe6c8 + 84489d4 commit 19e99cb

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

lib/entry.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ function Entry (header, extended, global) {
2424
this._ending = false
2525
this._ended = false
2626
this._remaining = 0
27+
this._abort = false
2728
this._queue = []
2829
this._index = 0
2930
this._queueLen = 0
@@ -209,5 +210,11 @@ Entry.prototype._setProps = function () {
209210
this._remaining = props.size
210211
}
211212

213+
// the parser may not call write if _abort is true.
214+
// useful for skipping data from some files quickly.
215+
Entry.prototype.abort = function(){
216+
this._abort = true
217+
}
218+
212219
Entry.prototype.warn = fstream.warn
213220
Entry.prototype.error = fstream.error

lib/parse.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,11 @@ Parse.prototype._process = function (c) {
102102

103103
if (this._entry) {
104104
var entry = this._entry
105-
entry.write(c)
105+
if(!entry._abort) entry.write(c)
106+
else {
107+
entry._remaining -= c.length
108+
if(entry._remaining < 0) entry._remaining = 0
109+
}
106110
if (entry._remaining === 0) {
107111
entry.end()
108112
this._entry = null

test/parse-discard.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var tap = require("tap")
2+
, tar = require("../tar.js")
3+
, fs = require("fs")
4+
, path = require("path")
5+
, file = path.resolve(__dirname, "fixtures/c.tar")
6+
7+
tap.test("parser test", function (t) {
8+
var parser = tar.Parse()
9+
var total = 0
10+
var dataTotal = 0
11+
12+
parser.on("end", function () {
13+
14+
t.equals(total-513,dataTotal,'should have discarded only c.txt')
15+
16+
t.end()
17+
})
18+
19+
fs.createReadStream(file)
20+
.pipe(parser)
21+
.on('entry',function(entry){
22+
if(entry.path === 'c.txt') entry.abort()
23+
24+
total += entry.size;
25+
entry.on('data',function(data){
26+
dataTotal += data.length
27+
})
28+
})
29+
})

0 commit comments

Comments
 (0)