function noPromise(){ let resolve, reject; let np = new Promise((ok, fail) => {resolve = ok; reject = fail}); np.resolve = resolve; np.reject = reject; return np } function asynchronize({s, chunkEventName, endEventName}){ return function* wrapper(){ const chunks = {}; const promises = {}; const clear = i => (delete chunks[i], delete promises[i]) let chunkCount = 0; let promiseCount = 0; let end = false; s.on(chunkEventName, data => { chunks[chunkCount] = data if (chunkCount in promises){ promises[chunkCount].resolve(chunks[chunkCount]) clear(chunkCount) } chunkCount++ }) s.on(endEventName, () => { end = true; for (let i in promises){ promises[i].reject(new Error('End Of S')) } }) while (!end){ let p = noPromise() if (promiseCount in chunks){ p.resolve(chunks[promiseCount]) clear(promiseCount) } promises[promiseCount] = p; promiseCount++ yield p; } } }