/js/lib/Socket.IO-node/lib/socket.io/transports/websocket/parser.js

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs · JavaScript · 99 lines · 36 code · 20 blank · 43 comment · 6 complexity · 86ca839994a7bb956c7b8d899e44cb54 MD5 · raw file

  1. /*!
  2. * Socket.IO - transports - WebSocket - Parser
  3. * Copyright (c) 2010-2011 Guillermo Rauch <guillermo@learnboost.com>
  4. * MIT Licensed
  5. */
  6. /**
  7. * Module dependencies.
  8. */
  9. var EventEmitter = require('events').EventEmitter;
  10. /**
  11. * Expose `Parser`.
  12. */
  13. module.exports = Parser;
  14. /**
  15. * Initialize a new `Parser`.
  16. *
  17. * @api private
  18. */
  19. function Parser(){
  20. this.reset();
  21. };
  22. /**
  23. * Inherit from `EventEmitter.prototype`.
  24. */
  25. Parser.prototype.__proto__ = EventEmitter.prototype;
  26. /**
  27. * Write `data`.
  28. *
  29. * @param {String} data
  30. * @api private
  31. */
  32. Parser.prototype.write = function(data){
  33. this.buffer += data;
  34. this.parse();
  35. };
  36. /**
  37. * Frame the input, outputting "data" events.
  38. *
  39. * TODO: optimize
  40. * @api private
  41. */
  42. Parser.prototype.parse = function(){
  43. var buf = this.buffer
  44. , len = buf.length
  45. , chr;
  46. for (var i = this.pos; i < len; ++i){
  47. chr = buf[i];
  48. // verify NUL
  49. if (i === 0){
  50. if ('\u0000' == chr) continue;
  51. this.error('Bad framing. Expected null byte as first frame');
  52. }
  53. if ('\ufffd' == chr){
  54. this.emit('data', buf.substr(1, buf.length - 2));
  55. this.buffer = buf.substr(i + 1);
  56. this.pos = 0;
  57. return this.parse();
  58. }
  59. }
  60. };
  61. /**
  62. * Reset parser state.
  63. *
  64. * @api private
  65. */
  66. Parser.prototype.reset = function(){
  67. this.pos = 0;
  68. this.buffer = '';
  69. };
  70. /**
  71. * Emit an error `msg`, and reset the parser.
  72. *
  73. * @param {String} msg
  74. * @api private
  75. */
  76. Parser.prototype.error = function(msg){
  77. this.reset();
  78. this.emit('error', msg);
  79. };