ec8753754f495fbb14b47a6949f2f9bb9a43f2313919989b6ef7ae343cb9c4148b410787745b5b7e5d7ca44ba314715eec10cee1d6704a699aeeabbf56b8be 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. 'use strict'
  2. var transport = require('../../../spdy-transport')
  3. var util = require('util')
  4. var utils = require('./').utils
  5. var OffsetBuffer = require('obuf')
  6. var Transform = require('readable-stream').Transform
  7. function Parser (options) {
  8. Transform.call(this, {
  9. readableObjectMode: true
  10. })
  11. this.buffer = new OffsetBuffer()
  12. this.partial = false
  13. this.waiting = 0
  14. this.window = options.window
  15. this.version = null
  16. this.decompress = null
  17. this.dead = false
  18. }
  19. module.exports = Parser
  20. util.inherits(Parser, Transform)
  21. Parser.prototype.error = utils.error
  22. Parser.prototype.kill = function kill () {
  23. this.dead = true
  24. }
  25. Parser.prototype._transform = function transform (data, encoding, cb) {
  26. if (!this.dead) { this.buffer.push(data) }
  27. this._consume(cb)
  28. }
  29. Parser.prototype._consume = function _consume (cb) {
  30. var self = this
  31. function next (err, frame) {
  32. if (err) {
  33. return cb(err)
  34. }
  35. if (Array.isArray(frame)) {
  36. for (var i = 0; i < frame.length; i++) {
  37. self.push(frame[i])
  38. }
  39. } else if (frame) {
  40. self.push(frame)
  41. }
  42. // Consume more packets
  43. if (!sync) {
  44. return self._consume(cb)
  45. }
  46. process.nextTick(function () {
  47. self._consume(cb)
  48. })
  49. }
  50. if (this.dead) {
  51. return cb()
  52. }
  53. if (this.buffer.size < this.waiting) {
  54. // No data at all
  55. if (this.buffer.size === 0) {
  56. return cb()
  57. }
  58. // Partial DATA frame or something that we can process partially
  59. if (this.partial) {
  60. var partial = this.buffer.clone(this.buffer.size)
  61. this.buffer.skip(partial.size)
  62. this.waiting -= partial.size
  63. this.executePartial(partial, next)
  64. return
  65. }
  66. // We shall not do anything until we get all expected data
  67. return cb()
  68. }
  69. var sync = true
  70. var content = this.buffer.clone(this.waiting)
  71. this.buffer.skip(this.waiting)
  72. this.execute(content, next)
  73. sync = false
  74. }
  75. Parser.prototype.setVersion = function setVersion (version) {
  76. this.version = version
  77. this.emit('version', version)
  78. }
  79. Parser.prototype.setCompression = function setCompresion (pair) {
  80. this.decompress = new transport.utils.LockStream(pair.decompress)
  81. }