index.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. function noPromise(){
  2. let resolve, reject;
  3. let np = new Promise((ok, fail) => {resolve = ok; reject = fail});
  4. np.resolve = resolve;
  5. np.reject = reject;
  6. return np
  7. }
  8. function asynchronize({s, chunkEventName, endEventName}){
  9. return function* wrapper(){
  10. const chunks = {};
  11. const promises = {};
  12. const clear = i => (delete chunks[i], delete promises[i])
  13. let chunkCount = 0;
  14. let promiseCount = 0;
  15. let end = false;
  16. s.on(chunkEventName, data => {
  17. chunks[chunkCount] = data
  18. if (chunkCount in promises){
  19. promises[chunkCount].resolve(chunks[chunkCount])
  20. clear(chunkCount)
  21. }
  22. chunkCount++
  23. })
  24. s.on(endEventName, () => {
  25. end = true;
  26. for (let i in promises){
  27. promises[i].reject(new Error('End Of S'))
  28. }
  29. })
  30. while (!end){
  31. let p = noPromise()
  32. if (promiseCount in chunks){
  33. p.resolve(chunks[promiseCount])
  34. clear(promiseCount)
  35. }
  36. promises[promiseCount] = p;
  37. promiseCount++
  38. yield p;
  39. }
  40. }
  41. }