Skip to content

Commit c5421f1

Browse files
authored
fix: store emitted events and re-emit them for late listeners (#39)
1 parent 0deb78e commit c5421f1

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

lib/index.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ const getOptString = options => !options || !options.length
3030

3131
const _onEnd = Symbol('_onEnd')
3232
const _getOptions = Symbol('_getOptions')
33+
const _emittedSize = Symbol('_emittedSize')
34+
const _emittedIntegrity = Symbol('_emittedIntegrity')
35+
const _emittedVerified = Symbol('_emittedVerified')
36+
3337
class IntegrityStream extends MiniPass {
3438
constructor (opts) {
3539
super()
@@ -63,6 +67,22 @@ class IntegrityStream extends MiniPass {
6367
this.optString = getOptString(options)
6468
}
6569

70+
on (ev, handler) {
71+
if (ev === 'size' && this[_emittedSize]) {
72+
return handler(this[_emittedSize])
73+
}
74+
75+
if (ev === 'integrity' && this[_emittedIntegrity]) {
76+
return handler(this[_emittedIntegrity])
77+
}
78+
79+
if (ev === 'verified' && this[_emittedVerified]) {
80+
return handler(this[_emittedVerified])
81+
}
82+
83+
return super.on(ev, handler)
84+
}
85+
6686
emit (ev, data) {
6787
if (ev === 'end') {
6888
this[_onEnd]()
@@ -103,9 +123,14 @@ class IntegrityStream extends MiniPass {
103123
err.sri = this.sri
104124
this.emit('error', err)
105125
} else {
126+
this[_emittedSize] = this.size
106127
this.emit('size', this.size)
128+
this[_emittedIntegrity] = newSri
107129
this.emit('integrity', newSri)
108-
match && this.emit('verified', match)
130+
if (match) {
131+
this[_emittedVerified] = match
132+
this.emit('verified', match)
133+
}
109134
}
110135
}
111136
}

test/integrity-stream.js

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,28 @@ const test = require('tap').test
44

55
const ssri = require('..')
66

7-
test('generates integrity', t => {
7+
test('works with no options', t => {
88
const TARGET = ssri.fromData('foo')
99
const stream = ssri.integrityStream()
1010
stream.write('foo')
11+
let integrity
12+
stream.on('integrity', i => {
13+
integrity = i
14+
})
15+
16+
stream.on('end', () => {
17+
t.same(integrity, TARGET, 'matching integrity emitted')
18+
t.end()
19+
})
20+
21+
stream.resume()
22+
stream.end()
23+
})
24+
25+
test('generates integrity', t => {
26+
const TARGET = ssri.fromData('foo')
27+
const stream = ssri.integrityStream({ integrity: TARGET })
28+
stream.write('foo')
1129
let collected = ''
1230
stream.on('data', d => {
1331
collected += d.toString()
@@ -16,9 +34,54 @@ test('generates integrity', t => {
1634
stream.on('integrity', i => {
1735
integrity = i
1836
})
37+
let size
38+
stream.on('size', s => {
39+
size = s
40+
})
41+
let verified
42+
stream.on('verified', v => {
43+
verified = v
44+
})
45+
stream.on('end', () => {
46+
t.equal(collected, 'foo', 'stream output is complete')
47+
t.equal(size, 3, 'size emitted')
48+
t.same(integrity, TARGET, 'matching integrity emitted')
49+
t.same(verified, TARGET.sha512[0], 'verified emitted')
50+
t.end()
51+
})
52+
stream.end()
53+
})
54+
55+
test('re-emits for late listeners', t => {
56+
const TARGET = ssri.fromData('foo')
57+
const stream = ssri.integrityStream({ integrity: TARGET })
58+
stream.write('foo')
59+
let collected = ''
60+
stream.on('data', d => {
61+
collected += d.toString()
62+
})
63+
1964
stream.on('end', () => {
65+
// we add the listeners _after_ the end event this time to ensure that the events
66+
// get emitted again for late listeners
67+
let integrity
68+
stream.on('integrity', i => {
69+
integrity = i
70+
})
71+
72+
let size
73+
stream.on('size', s => {
74+
size = s
75+
})
76+
77+
let verified
78+
stream.on('verified', v => {
79+
verified = v
80+
})
2081
t.equal(collected, 'foo', 'stream output is complete')
82+
t.equal(size, 3, 'size emitted')
2183
t.same(integrity, TARGET, 'matching integrity emitted')
84+
t.same(verified, TARGET.sha512[0], 'verified emitted')
2285
t.end()
2386
})
2487
stream.end()

0 commit comments

Comments
 (0)