siosocket.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. var util = require('util');
  2. var EventEmitter = require('events').EventEmitter;
  3. var ST_INITED = 0;
  4. var ST_CLOSED = 1;
  5. /**
  6. * Socket class that wraps socket.io socket to provide unified interface for up level.
  7. */
  8. var Socket = function(id, socket) {
  9. EventEmitter.call(this);
  10. this.id = id;
  11. this.socket = socket;
  12. this.remoteAddress = {
  13. ip: socket.handshake.address.address,
  14. port: socket.handshake.address.port
  15. };
  16. var self = this;
  17. socket.on('disconnect', this.emit.bind(this, 'disconnect'));
  18. socket.on('error', this.emit.bind(this, 'error'));
  19. socket.on('message', function(msg) {
  20. self.emit('message', msg);
  21. });
  22. this.state = ST_INITED;
  23. // TODO: any other events?
  24. };
  25. util.inherits(Socket, EventEmitter);
  26. module.exports = Socket;
  27. Socket.prototype.send = function(msg) {
  28. if(this.state !== ST_INITED) {
  29. return;
  30. }
  31. if(typeof msg !== 'string') {
  32. msg = JSON.stringify(msg);
  33. }
  34. this.socket.send(msg);
  35. };
  36. Socket.prototype.disconnect = function() {
  37. if(this.state === ST_CLOSED) {
  38. return;
  39. }
  40. this.state = ST_CLOSED;
  41. this.socket.disconnect();
  42. };
  43. Socket.prototype.sendBatch = function(msgs) {
  44. this.send(encodeBatch(msgs));
  45. };
  46. /**
  47. * Encode batch msg to client
  48. */
  49. var encodeBatch = function(msgs){
  50. var res = '[', msg;
  51. for(var i=0, l=msgs.length; i<l; i++) {
  52. if(i > 0) {
  53. res += ',';
  54. }
  55. msg = msgs[i];
  56. if(typeof msg === 'string') {
  57. res += msg;
  58. } else {
  59. res += JSON.stringify(msg);
  60. }
  61. }
  62. res += ']';
  63. return res;
  64. };