Skip to content

Commit 6472384

Browse files
committedJun 8, 2022
readable event emitted right away when listened for
Fix: #36
1 parent 781dd86 commit 6472384

3 files changed

+32
-2
lines changed
 

‎index.js

+2
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ module.exports = class Minipass extends Stream {
372372
const ret = super.on(ev, fn)
373373
if (ev === 'data' && !this.pipes.length && !this.flowing)
374374
this[RESUME]()
375+
else if (ev === 'readable' && this[BUFFERLENGTH] !== 0)
376+
super.emit('readable')
375377
else if (isEndish(ev) && this[EMITTED_END]) {
376378
super.emit(ev)
377379
this.removeAllListeners(ev)

‎test/readable-emits-immediately.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// https://github.com/isaacs/minipass/issues/36
2+
const Minipass = require('../')
3+
const t = require('tap')
4+
5+
const m = new Minipass({ encoding: 'utf8' })
6+
m.write('hello')
7+
t.equal(m.flowing, false)
8+
let readableEmitted = false
9+
m.on('readable', () => {
10+
readableEmitted = true
11+
m.on('data', c => t.equal(c, 'hello'))
12+
})
13+
t.equal(m.flowing, true)
14+
t.equal(readableEmitted, true)

‎test/write-returns-true-when-readable-triggers-flow.js

+16-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@ t.test('empty write', async t => {
1111
const p = dest.concat().then(d => t.equal(d, 'a', 'got data'))
1212
t.equal(s.write('a'), false, 'first write returns false')
1313
t.equal(s.write(''), false, 'empty write returns false')
14-
s.on('readable', () => s.pipe(dest))
14+
// since readable emits immediately, the NEXT one needs to trigger
15+
let firstReadable = false
16+
s.on('readable', () => {
17+
if (!firstReadable)
18+
firstReadable = true
19+
else
20+
s.pipe(dest)
21+
})
1522
t.equal(s.flowing, false, 'src is not flowing yet')
1623
t.equal(s.write(''), true, 'return true, now flowing')
1724
s.end()
@@ -24,7 +31,14 @@ t.test('non-empty write', async t => {
2431
const p = dest.concat().then(d => t.equal(d, 'ab', 'got data'))
2532
t.equal(s.write('a'), false, 'first write returns false')
2633
t.equal(s.write(''), false, 'empty write returns false')
27-
s.on('readable', () => s.pipe(dest))
34+
// since readable emits immediately, the NEXT one needs to trigger
35+
let firstReadable = false
36+
s.on('readable', () => {
37+
if (!firstReadable)
38+
firstReadable = true
39+
else
40+
s.pipe(dest)
41+
})
2842
t.equal(s.flowing, false, 'src is not flowing yet')
2943
t.equal(s.write('b'), true, 'return true, now flowing')
3044
s.end()

0 commit comments

Comments
 (0)
Please sign in to comment.