coder.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. var Message = require('pomelo-protocol').Message;
  2. var Constants = require('../../util/constants');
  3. var logger = require('pomelo-logger').getLogger('pomelo', __filename);
  4. var encode = function(reqId, route, msg) {
  5. if(!!reqId) {
  6. return composeResponse(this, reqId, route, msg);
  7. } else {
  8. return composePush(this, route, msg);
  9. }
  10. };
  11. var decode = function(msg) {
  12. msg = Message.decode(msg.body);
  13. var route = msg.route;
  14. // decode use dictionary
  15. if(!!msg.compressRoute) {
  16. if(!!this.connector.useDict) {
  17. var abbrs = this.dictionary.getAbbrs();
  18. if(!abbrs[route]) {
  19. logger.error('dictionary error! no abbrs for route : %s', route);
  20. return null;
  21. }
  22. route = msg.route = abbrs[route];
  23. } else {
  24. logger.error('fail to uncompress route code for msg: %j, server not enable dictionary.', msg);
  25. return null;
  26. }
  27. }
  28. // decode use protobuf
  29. if(!!this.protobuf && !!this.protobuf.getProtos().client[route]) {
  30. msg.body = this.protobuf.decode(route, msg.body);
  31. } else if(!!this.decodeIO_protobuf && !!this.decodeIO_protobuf.check(Constants.RESERVED.CLIENT, route)) {
  32. msg.body = this.decodeIO_protobuf.decode(route, msg.body);
  33. } else {
  34. try {
  35. msg.body = JSON.parse(msg.body.toString('utf8'));
  36. } catch (ex) {
  37. msg.body = {};
  38. }
  39. }
  40. return msg;
  41. };
  42. var composeResponse = function(server, msgId, route, msgBody) {
  43. if(!msgId || !route || !msgBody) {
  44. return null;
  45. }
  46. msgBody = encodeBody(server, route, msgBody);
  47. return Message.encode(msgId, Message.TYPE_RESPONSE, 0, null, msgBody);
  48. };
  49. var composePush = function(server, route, msgBody) {
  50. if(!route || !msgBody){
  51. return null;
  52. }
  53. msgBody = encodeBody(server, route, msgBody);
  54. // encode use dictionary
  55. var compressRoute = 0;
  56. if(!!server.dictionary) {
  57. var dict = server.dictionary.getDict();
  58. if(!!server.connector.useDict && !!dict[route]) {
  59. route = dict[route];
  60. compressRoute = 1;
  61. }
  62. }
  63. return Message.encode(0, Message.TYPE_PUSH, compressRoute, route, msgBody);
  64. };
  65. var encodeBody = function(server, route, msgBody) {
  66. // encode use protobuf
  67. if(!!server.protobuf && !!server.protobuf.getProtos().server[route]) {
  68. msgBody = server.protobuf.encode(route, msgBody);
  69. } else if(!!server.decodeIO_protobuf && !!server.decodeIO_protobuf.check(Constants.RESERVED.SERVER, route)) {
  70. msgBody = server.decodeIO_protobuf.encode(route, msgBody);
  71. } else {
  72. msgBody = new Buffer(JSON.stringify(msgBody), 'utf8');
  73. }
  74. return msgBody;
  75. };
  76. module.exports = {
  77. encode: encode,
  78. decode: decode
  79. };