await.js 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. 'use strict';
  2. const Stream = require('stream').Stream;
  3. module.exports = (stream, type) => {
  4. return new Promise((resolve, reject) => {
  5. if (type === 'read' && !isReadable(stream)) return reject(new Error('Only support readable stream'));
  6. if (type === 'write' && !isWritable(stream)) return reject(new Error('Only support writable stream'));
  7. const event = type === 'read' ? 'end' : 'finish';
  8. stream.once(event, success);
  9. stream.once('error', fail);
  10. if (isReadable(stream)) stream.resume();
  11. function success() {
  12. clean();
  13. resolve();
  14. }
  15. function fail(err) {
  16. clean();
  17. reject(err);
  18. }
  19. function clean() {
  20. stream.removeListener(event, success);
  21. stream.removeListener('error', fail);
  22. }
  23. });
  24. };
  25. function isReadable(stream) {
  26. return isStream(stream) && typeof stream._read === 'function';
  27. }
  28. function isWritable(stream) {
  29. return isStream(stream) && typeof stream._write === 'function';
  30. }
  31. function isStream(stream) {
  32. return stream instanceof Stream;
  33. }