-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
63 lines (51 loc) · 1.1 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
'use strict'
const { Readable } = require('stream')
function toReadable (iterator, opts) {
const readable = new Readable(opts)
readable._read = function () {
next().catch(onError)
}
function onError (err) {
readable.destroy(err)
}
let curNext
async function next () {
if (curNext) {
await curNext
return
}
const { value, done } = await (curNext = iterator.next())
curNext = null
if (done) {
readable.push(null)
return
}
if (readable.push(value)) {
await next()
}
}
return readable
}
function once (emitter, name) {
return new Promise((resolve, reject) => {
const mainListener = (...args) => {
if (secondListener !== undefined) {
emitter.removeListener('error', secondListener)
}
resolve(args)
}
let secondListener
if (name !== 'error') {
secondListener = (err) => {
emitter.removeListener(name, mainListener)
reject(err)
}
emitter.once('error', secondListener)
}
emitter.once(name, mainListener)
})
}
module.exports = {
toReadable,
once
}