mirror of
https://github.com/musix-org/musix-oss
synced 2024-12-23 22:33:17 +00:00
84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
/**
|
||
|
* Wrappers for common types.
|
||
|
* @type {Object.<string,IWrapper>}
|
||
|
* @const
|
||
|
*/
|
||
|
var wrappers = exports;
|
||
|
|
||
|
var Message = require("./message");
|
||
|
|
||
|
/**
|
||
|
* From object converter part of an {@link IWrapper}.
|
||
|
* @typedef WrapperFromObjectConverter
|
||
|
* @type {function}
|
||
|
* @param {Object.<string,*>} object Plain object
|
||
|
* @returns {Message<{}>} Message instance
|
||
|
* @this Type
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* To object converter part of an {@link IWrapper}.
|
||
|
* @typedef WrapperToObjectConverter
|
||
|
* @type {function}
|
||
|
* @param {Message<{}>} message Message instance
|
||
|
* @param {IConversionOptions} [options] Conversion options
|
||
|
* @returns {Object.<string,*>} Plain object
|
||
|
* @this Type
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Common type wrapper part of {@link wrappers}.
|
||
|
* @interface IWrapper
|
||
|
* @property {WrapperFromObjectConverter} [fromObject] From object converter
|
||
|
* @property {WrapperToObjectConverter} [toObject] To object converter
|
||
|
*/
|
||
|
|
||
|
// Custom wrapper for Any
|
||
|
wrappers[".google.protobuf.Any"] = {
|
||
|
|
||
|
fromObject: function(object) {
|
||
|
|
||
|
// unwrap value type if mapped
|
||
|
if (object && object["@type"]) {
|
||
|
var type = this.lookup(object["@type"]);
|
||
|
/* istanbul ignore else */
|
||
|
if (type) {
|
||
|
// type_url does not accept leading "."
|
||
|
var type_url = object["@type"].charAt(0) === "." ?
|
||
|
object["@type"].substr(1) : object["@type"];
|
||
|
// type_url prefix is optional, but path seperator is required
|
||
|
return this.create({
|
||
|
type_url: "/" + type_url,
|
||
|
value: type.encode(type.fromObject(object)).finish()
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return this.fromObject(object);
|
||
|
},
|
||
|
|
||
|
toObject: function(message, options) {
|
||
|
|
||
|
// decode value if requested and unmapped
|
||
|
if (options && options.json && message.type_url && message.value) {
|
||
|
// Only use fully qualified type name after the last '/'
|
||
|
var name = message.type_url.substring(message.type_url.lastIndexOf("/") + 1);
|
||
|
var type = this.lookup(name);
|
||
|
/* istanbul ignore else */
|
||
|
if (type)
|
||
|
message = type.decode(message.value);
|
||
|
}
|
||
|
|
||
|
// wrap value if unmapped
|
||
|
if (!(message instanceof this.ctor) && message instanceof Message) {
|
||
|
var object = message.$type.toObject(message, options);
|
||
|
object["@type"] = message.$type.fullName;
|
||
|
return object;
|
||
|
}
|
||
|
|
||
|
return this.toObject(message, options);
|
||
|
}
|
||
|
};
|