1
0

wrappers.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. var type = this.lookup(object["@type"]);
  38. /* istanbul ignore else */
  39. if (type) {
  40. // type_url does not accept leading "."
  41. var type_url = object["@type"].charAt(0) === "." ?
  42. object["@type"].substr(1) : object["@type"];
  43. // type_url prefix is optional, but path seperator is required
  44. return this.create({
  45. type_url: "/" + type_url,
  46. value: type.encode(type.fromObject(object)).finish()
  47. });
  48. }
  49. }
  50. return this.fromObject(object);
  51. },
  52. toObject: function(message, options) {
  53. // decode value if requested and unmapped
  54. if (options && options.json && message.type_url && message.value) {
  55. // Only use fully qualified type name after the last '/'
  56. var name = message.type_url.substring(message.type_url.lastIndexOf("/") + 1);
  57. var type = this.lookup(name);
  58. /* istanbul ignore else */
  59. if (type)
  60. message = type.decode(message.value);
  61. }
  62. // wrap value if unmapped
  63. if (!(message instanceof this.ctor) && message instanceof Message) {
  64. var object = message.$type.toObject(message, options);
  65. object["@type"] = message.$type.fullName;
  66. return object;
  67. }
  68. return this.toObject(message, options);
  69. }
  70. };