wrappers.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. "use strict";
  2. /**
  3. * Wrappers for common types.
  4. * @type {Object.<string,IWrapper>}
  5. * @const
  6. */
  7. var wrappers = exports;
  8. var Message = require("./message");
  9. /**
  10. * From object converter part of an {@link IWrapper}.
  11. * @typedef WrapperFromObjectConverter
  12. * @type {function}
  13. * @param {Object.<string,*>} object Plain object
  14. * @returns {Message<{}>} Message instance
  15. * @this Type
  16. */
  17. /**
  18. * To object converter part of an {@link IWrapper}.
  19. * @typedef WrapperToObjectConverter
  20. * @type {function}
  21. * @param {Message<{}>} message Message instance
  22. * @param {IConversionOptions} [options] Conversion options
  23. * @returns {Object.<string,*>} Plain object
  24. * @this Type
  25. */
  26. /**
  27. * Common type wrapper part of {@link wrappers}.
  28. * @interface IWrapper
  29. * @property {WrapperFromObjectConverter} [fromObject] From object converter
  30. * @property {WrapperToObjectConverter} [toObject] To object converter
  31. */
  32. // Custom wrapper for Any
  33. wrappers[".google.protobuf.Any"] = {
  34. fromObject: function(object) {
  35. // unwrap value type if mapped
  36. if (object && object["@type"]) {
  37. // Only use fully qualified type name after the last '/'
  38. var name = object["@type"].substring(object["@type"].lastIndexOf("/") + 1);
  39. var type = this.lookup(name);
  40. /* istanbul ignore else */
  41. if (type) {
  42. // type_url does not accept leading "."
  43. var type_url = object["@type"].charAt(0) === "." ?
  44. object["@type"].slice(1) : object["@type"];
  45. // type_url prefix is optional, but path seperator is required
  46. if (type_url.indexOf("/") === -1) {
  47. type_url = "/" + type_url;
  48. }
  49. return this.create({
  50. type_url: type_url,
  51. value: type.encode(type.fromObject(object)).finish()
  52. });
  53. }
  54. }
  55. return this.fromObject(object);
  56. },
  57. toObject: function(message, options) {
  58. // Default prefix
  59. var googleApi = "type.googleapis.com/";
  60. var prefix = "";
  61. var name = "";
  62. // decode value if requested and unmapped
  63. if (options && options.json && message.type_url && message.value) {
  64. // Only use fully qualified type name after the last '/'
  65. name = message.type_url.substring(message.type_url.lastIndexOf("/") + 1);
  66. // Separate the prefix used
  67. prefix = message.type_url.substring(0, message.type_url.lastIndexOf("/") + 1);
  68. var type = this.lookup(name);
  69. /* istanbul ignore else */
  70. if (type)
  71. message = type.decode(message.value);
  72. }
  73. // wrap value if unmapped
  74. if (!(message instanceof this.ctor) && message instanceof Message) {
  75. var object = message.$type.toObject(message, options);
  76. var messageName = message.$type.fullName[0] === "." ?
  77. message.$type.fullName.slice(1) : message.$type.fullName;
  78. // Default to type.googleapis.com prefix if no prefix is used
  79. if (prefix === "") {
  80. prefix = googleApi;
  81. }
  82. name = prefix + messageName;
  83. object["@type"] = name;
  84. return object;
  85. }
  86. return this.toObject(message, options);
  87. }
  88. };