utils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. 'use strict'
  2. const { SymbolAsyncIterator, SymbolIterator, SymbolFor } = require('../../ours/primordials')
  3. // We need to use SymbolFor to make these globally available
  4. // for interopt with readable-stream, i.e. readable-stream
  5. // and node core needs to be able to read/write private state
  6. // from each other for proper interoperability.
  7. const kIsDestroyed = SymbolFor('nodejs.stream.destroyed')
  8. const kIsErrored = SymbolFor('nodejs.stream.errored')
  9. const kIsReadable = SymbolFor('nodejs.stream.readable')
  10. const kIsWritable = SymbolFor('nodejs.stream.writable')
  11. const kIsDisturbed = SymbolFor('nodejs.stream.disturbed')
  12. const kIsClosedPromise = SymbolFor('nodejs.webstream.isClosedPromise')
  13. const kControllerErrorFunction = SymbolFor('nodejs.webstream.controllerErrorFunction')
  14. function isReadableNodeStream(obj, strict = false) {
  15. var _obj$_readableState
  16. return !!(
  17. (
  18. obj &&
  19. typeof obj.pipe === 'function' &&
  20. typeof obj.on === 'function' &&
  21. (!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) &&
  22. (!obj._writableState ||
  23. ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined
  24. ? undefined
  25. : _obj$_readableState.readable) !== false) &&
  26. // Duplex
  27. (!obj._writableState || obj._readableState)
  28. ) // Writable has .pipe.
  29. )
  30. }
  31. function isWritableNodeStream(obj) {
  32. var _obj$_writableState
  33. return !!(
  34. (
  35. obj &&
  36. typeof obj.write === 'function' &&
  37. typeof obj.on === 'function' &&
  38. (!obj._readableState ||
  39. ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined
  40. ? undefined
  41. : _obj$_writableState.writable) !== false)
  42. ) // Duplex
  43. )
  44. }
  45. function isDuplexNodeStream(obj) {
  46. return !!(
  47. obj &&
  48. typeof obj.pipe === 'function' &&
  49. obj._readableState &&
  50. typeof obj.on === 'function' &&
  51. typeof obj.write === 'function'
  52. )
  53. }
  54. function isNodeStream(obj) {
  55. return (
  56. obj &&
  57. (obj._readableState ||
  58. obj._writableState ||
  59. (typeof obj.write === 'function' && typeof obj.on === 'function') ||
  60. (typeof obj.pipe === 'function' && typeof obj.on === 'function'))
  61. )
  62. }
  63. function isReadableStream(obj) {
  64. return !!(
  65. obj &&
  66. !isNodeStream(obj) &&
  67. typeof obj.pipeThrough === 'function' &&
  68. typeof obj.getReader === 'function' &&
  69. typeof obj.cancel === 'function'
  70. )
  71. }
  72. function isWritableStream(obj) {
  73. return !!(obj && !isNodeStream(obj) && typeof obj.getWriter === 'function' && typeof obj.abort === 'function')
  74. }
  75. function isTransformStream(obj) {
  76. return !!(obj && !isNodeStream(obj) && typeof obj.readable === 'object' && typeof obj.writable === 'object')
  77. }
  78. function isWebStream(obj) {
  79. return isReadableStream(obj) || isWritableStream(obj) || isTransformStream(obj)
  80. }
  81. function isIterable(obj, isAsync) {
  82. if (obj == null) return false
  83. if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'
  84. if (isAsync === false) return typeof obj[SymbolIterator] === 'function'
  85. return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function'
  86. }
  87. function isDestroyed(stream) {
  88. if (!isNodeStream(stream)) return null
  89. const wState = stream._writableState
  90. const rState = stream._readableState
  91. const state = wState || rState
  92. return !!(stream.destroyed || stream[kIsDestroyed] || (state !== null && state !== undefined && state.destroyed))
  93. }
  94. // Have been end():d.
  95. function isWritableEnded(stream) {
  96. if (!isWritableNodeStream(stream)) return null
  97. if (stream.writableEnded === true) return true
  98. const wState = stream._writableState
  99. if (wState !== null && wState !== undefined && wState.errored) return false
  100. if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null
  101. return wState.ended
  102. }
  103. // Have emitted 'finish'.
  104. function isWritableFinished(stream, strict) {
  105. if (!isWritableNodeStream(stream)) return null
  106. if (stream.writableFinished === true) return true
  107. const wState = stream._writableState
  108. if (wState !== null && wState !== undefined && wState.errored) return false
  109. if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null
  110. return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0))
  111. }
  112. // Have been push(null):d.
  113. function isReadableEnded(stream) {
  114. if (!isReadableNodeStream(stream)) return null
  115. if (stream.readableEnded === true) return true
  116. const rState = stream._readableState
  117. if (!rState || rState.errored) return false
  118. if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null
  119. return rState.ended
  120. }
  121. // Have emitted 'end'.
  122. function isReadableFinished(stream, strict) {
  123. if (!isReadableNodeStream(stream)) return null
  124. const rState = stream._readableState
  125. if (rState !== null && rState !== undefined && rState.errored) return false
  126. if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null
  127. return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0))
  128. }
  129. function isReadable(stream) {
  130. if (stream && stream[kIsReadable] != null) return stream[kIsReadable]
  131. if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null
  132. if (isDestroyed(stream)) return false
  133. return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream)
  134. }
  135. function isWritable(stream) {
  136. if (stream && stream[kIsWritable] != null) return stream[kIsWritable]
  137. if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null
  138. if (isDestroyed(stream)) return false
  139. return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream)
  140. }
  141. function isFinished(stream, opts) {
  142. if (!isNodeStream(stream)) {
  143. return null
  144. }
  145. if (isDestroyed(stream)) {
  146. return true
  147. }
  148. if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) {
  149. return false
  150. }
  151. if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) {
  152. return false
  153. }
  154. return true
  155. }
  156. function isWritableErrored(stream) {
  157. var _stream$_writableStat, _stream$_writableStat2
  158. if (!isNodeStream(stream)) {
  159. return null
  160. }
  161. if (stream.writableErrored) {
  162. return stream.writableErrored
  163. }
  164. return (_stream$_writableStat =
  165. (_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined
  166. ? undefined
  167. : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined
  168. ? _stream$_writableStat
  169. : null
  170. }
  171. function isReadableErrored(stream) {
  172. var _stream$_readableStat, _stream$_readableStat2
  173. if (!isNodeStream(stream)) {
  174. return null
  175. }
  176. if (stream.readableErrored) {
  177. return stream.readableErrored
  178. }
  179. return (_stream$_readableStat =
  180. (_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined
  181. ? undefined
  182. : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined
  183. ? _stream$_readableStat
  184. : null
  185. }
  186. function isClosed(stream) {
  187. if (!isNodeStream(stream)) {
  188. return null
  189. }
  190. if (typeof stream.closed === 'boolean') {
  191. return stream.closed
  192. }
  193. const wState = stream._writableState
  194. const rState = stream._readableState
  195. if (
  196. typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' ||
  197. typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean'
  198. ) {
  199. return (
  200. (wState === null || wState === undefined ? undefined : wState.closed) ||
  201. (rState === null || rState === undefined ? undefined : rState.closed)
  202. )
  203. }
  204. if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {
  205. return stream._closed
  206. }
  207. return null
  208. }
  209. function isOutgoingMessage(stream) {
  210. return (
  211. typeof stream._closed === 'boolean' &&
  212. typeof stream._defaultKeepAlive === 'boolean' &&
  213. typeof stream._removedConnection === 'boolean' &&
  214. typeof stream._removedContLen === 'boolean'
  215. )
  216. }
  217. function isServerResponse(stream) {
  218. return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream)
  219. }
  220. function isServerRequest(stream) {
  221. var _stream$req
  222. return (
  223. typeof stream._consuming === 'boolean' &&
  224. typeof stream._dumped === 'boolean' &&
  225. ((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) ===
  226. undefined
  227. )
  228. }
  229. function willEmitClose(stream) {
  230. if (!isNodeStream(stream)) return null
  231. const wState = stream._writableState
  232. const rState = stream._readableState
  233. const state = wState || rState
  234. return (
  235. (!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false)
  236. )
  237. }
  238. function isDisturbed(stream) {
  239. var _stream$kIsDisturbed
  240. return !!(
  241. stream &&
  242. ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined
  243. ? _stream$kIsDisturbed
  244. : stream.readableDidRead || stream.readableAborted)
  245. )
  246. }
  247. function isErrored(stream) {
  248. var _ref,
  249. _ref2,
  250. _ref3,
  251. _ref4,
  252. _ref5,
  253. _stream$kIsErrored,
  254. _stream$_readableStat3,
  255. _stream$_writableStat3,
  256. _stream$_readableStat4,
  257. _stream$_writableStat4
  258. return !!(
  259. stream &&
  260. ((_ref =
  261. (_ref2 =
  262. (_ref3 =
  263. (_ref4 =
  264. (_ref5 =
  265. (_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined
  266. ? _stream$kIsErrored
  267. : stream.readableErrored) !== null && _ref5 !== undefined
  268. ? _ref5
  269. : stream.writableErrored) !== null && _ref4 !== undefined
  270. ? _ref4
  271. : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined
  272. ? undefined
  273. : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined
  274. ? _ref3
  275. : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined
  276. ? undefined
  277. : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined
  278. ? _ref2
  279. : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined
  280. ? undefined
  281. : _stream$_readableStat4.errored) !== null && _ref !== undefined
  282. ? _ref
  283. : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined
  284. ? undefined
  285. : _stream$_writableStat4.errored)
  286. )
  287. }
  288. module.exports = {
  289. isDestroyed,
  290. kIsDestroyed,
  291. isDisturbed,
  292. kIsDisturbed,
  293. isErrored,
  294. kIsErrored,
  295. isReadable,
  296. kIsReadable,
  297. kIsClosedPromise,
  298. kControllerErrorFunction,
  299. kIsWritable,
  300. isClosed,
  301. isDuplexNodeStream,
  302. isFinished,
  303. isIterable,
  304. isReadableNodeStream,
  305. isReadableStream,
  306. isReadableEnded,
  307. isReadableFinished,
  308. isReadableErrored,
  309. isNodeStream,
  310. isWebStream,
  311. isWritable,
  312. isWritableNodeStream,
  313. isWritableStream,
  314. isWritableEnded,
  315. isWritableFinished,
  316. isWritableErrored,
  317. isServerRequest,
  318. isServerResponse,
  319. willEmitClose,
  320. isTransformStream
  321. }