protobufjs 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +727 -727
  3. package/dist/light/protobuf.js +7724 -7591
  4. package/dist/light/protobuf.js.map +1 -1
  5. package/dist/light/protobuf.min.js +3 -3
  6. package/dist/light/protobuf.min.js.map +1 -1
  7. package/dist/minimal/protobuf.js +2606 -2546
  8. package/dist/minimal/protobuf.js.map +1 -1
  9. package/dist/minimal/protobuf.min.js +3 -3
  10. package/dist/minimal/protobuf.min.js.map +1 -1
  11. package/dist/protobuf.js +9593 -9436
  12. package/dist/protobuf.js.map +1 -1
  13. package/dist/protobuf.min.js +3 -3
  14. package/dist/protobuf.min.js.map +1 -1
  15. package/ext/debug/README.md +4 -4
  16. package/ext/debug/index.js +71 -71
  17. package/ext/descriptor/README.md +72 -72
  18. package/ext/descriptor/index.d.ts +195 -191
  19. package/ext/descriptor/index.js +1181 -1163
  20. package/ext/descriptor/test.js +54 -54
  21. package/google/LICENSE +27 -27
  22. package/google/README.md +1 -1
  23. package/google/api/annotations.json +82 -82
  24. package/google/api/annotations.proto +10 -10
  25. package/google/api/http.json +85 -85
  26. package/google/api/http.proto +30 -30
  27. package/google/protobuf/api.json +117 -117
  28. package/google/protobuf/api.proto +33 -33
  29. package/google/protobuf/descriptor.json +1381 -1381
  30. package/google/protobuf/descriptor.proto +534 -534
  31. package/google/protobuf/source_context.json +19 -19
  32. package/google/protobuf/source_context.proto +7 -7
  33. package/google/protobuf/type.json +201 -201
  34. package/google/protobuf/type.proto +89 -89
  35. package/index.d.ts +2817 -2799
  36. package/index.js +4 -4
  37. package/light.d.ts +2 -2
  38. package/light.js +3 -3
  39. package/minimal.d.ts +2 -2
  40. package/minimal.js +4 -4
  41. package/package.json +96 -114
  42. package/scripts/postinstall.js +32 -32
  43. package/src/common.js +399 -399
  44. package/src/converter.js +310 -301
  45. package/src/decoder.js +135 -127
  46. package/src/encoder.js +100 -100
  47. package/src/enum.js +226 -223
  48. package/src/field.js +453 -453
  49. package/src/index-light.js +104 -104
  50. package/src/index-minimal.js +36 -36
  51. package/src/index.js +12 -12
  52. package/src/mapfield.js +126 -126
  53. package/src/message.js +139 -143
  54. package/src/method.js +160 -160
  55. package/src/namespace.js +550 -546
  56. package/src/object.js +385 -381
  57. package/src/oneof.js +222 -222
  58. package/src/parse.js +1032 -1013
  59. package/src/reader.js +426 -416
  60. package/src/reader_buffer.js +51 -51
  61. package/src/root.js +403 -403
  62. package/src/roots.js +17 -17
  63. package/src/rpc/service.js +142 -142
  64. package/src/rpc.js +36 -36
  65. package/src/service.js +193 -189
  66. package/src/tokenize.js +421 -416
  67. package/src/type.js +625 -615
  68. package/src/types.js +196 -196
  69. package/src/typescript.jsdoc +15 -15
  70. package/src/util/aspromise.d.ts +13 -0
  71. package/src/util/aspromise.js +52 -0
  72. package/src/util/base64.d.ts +32 -0
  73. package/src/util/base64.js +139 -0
  74. package/src/util/codegen.d.ts +31 -0
  75. package/src/util/codegen.js +113 -0
  76. package/src/util/eventemitter.d.ts +45 -0
  77. package/src/util/eventemitter.js +84 -0
  78. package/src/util/fetch.d.ts +56 -0
  79. package/src/util/fetch.js +114 -0
  80. package/src/util/float.d.ts +83 -0
  81. package/src/util/float.js +335 -0
  82. package/src/util/inquire.d.ts +9 -0
  83. package/src/util/inquire.js +37 -0
  84. package/src/util/longbits.js +200 -200
  85. package/src/util/minimal.js +461 -438
  86. package/src/util/path.d.ts +22 -0
  87. package/src/util/path.js +72 -0
  88. package/src/util/patterns.js +8 -0
  89. package/src/util/pool.d.ts +32 -0
  90. package/src/util/pool.js +48 -0
  91. package/src/util/utf8.d.ts +24 -0
  92. package/src/util/utf8.js +104 -0
  93. package/src/util.js +215 -215
  94. package/src/verifier.js +180 -177
  95. package/src/wrappers.js +103 -102
  96. package/src/writer.js +465 -465
  97. package/src/writer_buffer.js +85 -85
  98. package/tsconfig.json +8 -8
package/src/verifier.js CHANGED
@@ -1,177 +1,180 @@
1
- "use strict";
2
- module.exports = verifier;
3
-
4
- var Enum = require("./enum"),
5
- util = require("./util");
6
-
7
- function invalid(field, expected) {
8
- return field.name + ": " + expected + (field.repeated && expected !== "array" ? "[]" : field.map && expected !== "object" ? "{k:"+field.keyType+"}" : "") + " expected";
9
- }
10
-
11
- /**
12
- * Generates a partial value verifier.
13
- * @param {Codegen} gen Codegen instance
14
- * @param {Field} field Reflected field
15
- * @param {number} fieldIndex Field index
16
- * @param {string} ref Variable reference
17
- * @returns {Codegen} Codegen instance
18
- * @ignore
19
- */
20
- function genVerifyValue(gen, field, fieldIndex, ref) {
21
- /* eslint-disable no-unexpected-multiline */
22
- if (field.resolvedType) {
23
- if (field.resolvedType instanceof Enum) { gen
24
- ("switch(%s){", ref)
25
- ("default:")
26
- ("return%j", invalid(field, "enum value"));
27
- for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen
28
- ("case %i:", field.resolvedType.values[keys[j]]);
29
- gen
30
- ("break")
31
- ("}");
32
- } else {
33
- gen
34
- ("{")
35
- ("var e=types[%i].verify(%s);", fieldIndex, ref)
36
- ("if(e)")
37
- ("return%j+e", field.name + ".")
38
- ("}");
39
- }
40
- } else {
41
- switch (field.type) {
42
- case "int32":
43
- case "uint32":
44
- case "sint32":
45
- case "fixed32":
46
- case "sfixed32": gen
47
- ("if(!util.isInteger(%s))", ref)
48
- ("return%j", invalid(field, "integer"));
49
- break;
50
- case "int64":
51
- case "uint64":
52
- case "sint64":
53
- case "fixed64":
54
- case "sfixed64": gen
55
- ("if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))", ref, ref, ref, ref)
56
- ("return%j", invalid(field, "integer|Long"));
57
- break;
58
- case "float":
59
- case "double": gen
60
- ("if(typeof %s!==\"number\")", ref)
61
- ("return%j", invalid(field, "number"));
62
- break;
63
- case "bool": gen
64
- ("if(typeof %s!==\"boolean\")", ref)
65
- ("return%j", invalid(field, "boolean"));
66
- break;
67
- case "string": gen
68
- ("if(!util.isString(%s))", ref)
69
- ("return%j", invalid(field, "string"));
70
- break;
71
- case "bytes": gen
72
- ("if(!(%s&&typeof %s.length===\"number\"||util.isString(%s)))", ref, ref, ref)
73
- ("return%j", invalid(field, "buffer"));
74
- break;
75
- }
76
- }
77
- return gen;
78
- /* eslint-enable no-unexpected-multiline */
79
- }
80
-
81
- /**
82
- * Generates a partial key verifier.
83
- * @param {Codegen} gen Codegen instance
84
- * @param {Field} field Reflected field
85
- * @param {string} ref Variable reference
86
- * @returns {Codegen} Codegen instance
87
- * @ignore
88
- */
89
- function genVerifyKey(gen, field, ref) {
90
- /* eslint-disable no-unexpected-multiline */
91
- switch (field.keyType) {
92
- case "int32":
93
- case "uint32":
94
- case "sint32":
95
- case "fixed32":
96
- case "sfixed32": gen
97
- ("if(!util.key32Re.test(%s))", ref)
98
- ("return%j", invalid(field, "integer key"));
99
- break;
100
- case "int64":
101
- case "uint64":
102
- case "sint64":
103
- case "fixed64":
104
- case "sfixed64": gen
105
- ("if(!util.key64Re.test(%s))", ref) // see comment above: x is ok, d is not
106
- ("return%j", invalid(field, "integer|Long key"));
107
- break;
108
- case "bool": gen
109
- ("if(!util.key2Re.test(%s))", ref)
110
- ("return%j", invalid(field, "boolean key"));
111
- break;
112
- }
113
- return gen;
114
- /* eslint-enable no-unexpected-multiline */
115
- }
116
-
117
- /**
118
- * Generates a verifier specific to the specified message type.
119
- * @param {Type} mtype Message type
120
- * @returns {Codegen} Codegen instance
121
- */
122
- function verifier(mtype) {
123
- /* eslint-disable no-unexpected-multiline */
124
-
125
- var gen = util.codegen(["m"], mtype.name + "$verify")
126
- ("if(typeof m!==\"object\"||m===null)")
127
- ("return%j", "object expected");
128
- var oneofs = mtype.oneofsArray,
129
- seenFirstField = {};
130
- if (oneofs.length) gen
131
- ("var p={}");
132
-
133
- for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
134
- var field = mtype._fieldsArray[i].resolve(),
135
- ref = "m" + util.safeProp(field.name);
136
-
137
- if (field.optional) gen
138
- ("if(%s!=null&&m.hasOwnProperty(%j)){", ref, field.name); // !== undefined && !== null
139
-
140
- // map fields
141
- if (field.map) { gen
142
- ("if(!util.isObject(%s))", ref)
143
- ("return%j", invalid(field, "object"))
144
- ("var k=Object.keys(%s)", ref)
145
- ("for(var i=0;i<k.length;++i){");
146
- genVerifyKey(gen, field, "k[i]");
147
- genVerifyValue(gen, field, i, ref + "[k[i]]")
148
- ("}");
149
-
150
- // repeated fields
151
- } else if (field.repeated) { gen
152
- ("if(!Array.isArray(%s))", ref)
153
- ("return%j", invalid(field, "array"))
154
- ("for(var i=0;i<%s.length;++i){", ref);
155
- genVerifyValue(gen, field, i, ref + "[i]")
156
- ("}");
157
-
158
- // required or present fields
159
- } else {
160
- if (field.partOf) {
161
- var oneofProp = util.safeProp(field.partOf.name);
162
- if (seenFirstField[field.partOf.name] === 1) gen
163
- ("if(p%s===1)", oneofProp)
164
- ("return%j", field.partOf.name + ": multiple values");
165
- seenFirstField[field.partOf.name] = 1;
166
- gen
167
- ("p%s=1", oneofProp);
168
- }
169
- genVerifyValue(gen, field, i, ref);
170
- }
171
- if (field.optional) gen
172
- ("}");
173
- }
174
- return gen
175
- ("return null");
176
- /* eslint-enable no-unexpected-multiline */
177
- }
1
+ "use strict";
2
+ module.exports = verifier;
3
+
4
+ var Enum = require("./enum"),
5
+ util = require("./util");
6
+
7
+ function invalid(field, expected) {
8
+ return field.name + ": " + expected + (field.repeated && expected !== "array" ? "[]" : field.map && expected !== "object" ? "{k:"+field.keyType+"}" : "") + " expected";
9
+ }
10
+
11
+ /**
12
+ * Generates a partial value verifier.
13
+ * @param {Codegen} gen Codegen instance
14
+ * @param {Field} field Reflected field
15
+ * @param {number} fieldIndex Field index
16
+ * @param {string} ref Variable reference
17
+ * @returns {Codegen} Codegen instance
18
+ * @ignore
19
+ */
20
+ function genVerifyValue(gen, field, fieldIndex, ref) {
21
+ /* eslint-disable no-unexpected-multiline */
22
+ if (field.resolvedType) {
23
+ if (field.resolvedType instanceof Enum) { gen
24
+ ("switch(%s){", ref)
25
+ ("default:")
26
+ ("return%j", invalid(field, "enum value"));
27
+ for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen
28
+ ("case %i:", field.resolvedType.values[keys[j]]);
29
+ gen
30
+ ("break")
31
+ ("}");
32
+ } else {
33
+ gen
34
+ ("{")
35
+ ("var e=types[%i].verify(%s,n+1);", fieldIndex, ref)
36
+ ("if(e)")
37
+ ("return%j+e", field.name + ".")
38
+ ("}");
39
+ }
40
+ } else {
41
+ switch (field.type) {
42
+ case "int32":
43
+ case "uint32":
44
+ case "sint32":
45
+ case "fixed32":
46
+ case "sfixed32": gen
47
+ ("if(!util.isInteger(%s))", ref)
48
+ ("return%j", invalid(field, "integer"));
49
+ break;
50
+ case "int64":
51
+ case "uint64":
52
+ case "sint64":
53
+ case "fixed64":
54
+ case "sfixed64": gen
55
+ ("if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))", ref, ref, ref, ref)
56
+ ("return%j", invalid(field, "integer|Long"));
57
+ break;
58
+ case "float":
59
+ case "double": gen
60
+ ("if(typeof %s!==\"number\")", ref)
61
+ ("return%j", invalid(field, "number"));
62
+ break;
63
+ case "bool": gen
64
+ ("if(typeof %s!==\"boolean\")", ref)
65
+ ("return%j", invalid(field, "boolean"));
66
+ break;
67
+ case "string": gen
68
+ ("if(!util.isString(%s))", ref)
69
+ ("return%j", invalid(field, "string"));
70
+ break;
71
+ case "bytes": gen
72
+ ("if(!(%s&&typeof %s.length===\"number\"||util.isString(%s)))", ref, ref, ref)
73
+ ("return%j", invalid(field, "buffer"));
74
+ break;
75
+ }
76
+ }
77
+ return gen;
78
+ /* eslint-enable no-unexpected-multiline */
79
+ }
80
+
81
+ /**
82
+ * Generates a partial key verifier.
83
+ * @param {Codegen} gen Codegen instance
84
+ * @param {Field} field Reflected field
85
+ * @param {string} ref Variable reference
86
+ * @returns {Codegen} Codegen instance
87
+ * @ignore
88
+ */
89
+ function genVerifyKey(gen, field, ref) {
90
+ /* eslint-disable no-unexpected-multiline */
91
+ switch (field.keyType) {
92
+ case "int32":
93
+ case "uint32":
94
+ case "sint32":
95
+ case "fixed32":
96
+ case "sfixed32": gen
97
+ ("if(!util.key32Re.test(%s))", ref)
98
+ ("return%j", invalid(field, "integer key"));
99
+ break;
100
+ case "int64":
101
+ case "uint64":
102
+ case "sint64":
103
+ case "fixed64":
104
+ case "sfixed64": gen
105
+ ("if(!util.key64Re.test(%s))", ref) // see comment above: x is ok, d is not
106
+ ("return%j", invalid(field, "integer|Long key"));
107
+ break;
108
+ case "bool": gen
109
+ ("if(!util.key2Re.test(%s))", ref)
110
+ ("return%j", invalid(field, "boolean key"));
111
+ break;
112
+ }
113
+ return gen;
114
+ /* eslint-enable no-unexpected-multiline */
115
+ }
116
+
117
+ /**
118
+ * Generates a verifier specific to the specified message type.
119
+ * @param {Type} mtype Message type
120
+ * @returns {Codegen} Codegen instance
121
+ */
122
+ function verifier(mtype) {
123
+ /* eslint-disable no-unexpected-multiline */
124
+
125
+ var gen = util.codegen(["m", "n"], mtype.name + "$verify")
126
+ ("if(typeof m!==\"object\"||m===null)")
127
+ ("return%j", "object expected")
128
+ ("if(n===undefined)n=0")
129
+ ("if(n>util.recursionLimit)")
130
+ ("return%j", "maximum nesting depth exceeded");
131
+ var oneofs = mtype.oneofsArray,
132
+ seenFirstField = {};
133
+ if (oneofs.length) gen
134
+ ("var p={}");
135
+
136
+ for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
137
+ var field = mtype._fieldsArray[i].resolve(),
138
+ ref = "m" + util.safeProp(field.name);
139
+
140
+ if (field.optional) gen
141
+ ("if(%s!=null&&m.hasOwnProperty(%j)){", ref, field.name); // !== undefined && !== null
142
+
143
+ // map fields
144
+ if (field.map) { gen
145
+ ("if(!util.isObject(%s))", ref)
146
+ ("return%j", invalid(field, "object"))
147
+ ("var k=Object.keys(%s)", ref)
148
+ ("for(var i=0;i<k.length;++i){");
149
+ genVerifyKey(gen, field, "k[i]");
150
+ genVerifyValue(gen, field, i, ref + "[k[i]]")
151
+ ("}");
152
+
153
+ // repeated fields
154
+ } else if (field.repeated) { gen
155
+ ("if(!Array.isArray(%s))", ref)
156
+ ("return%j", invalid(field, "array"))
157
+ ("for(var i=0;i<%s.length;++i){", ref);
158
+ genVerifyValue(gen, field, i, ref + "[i]")
159
+ ("}");
160
+
161
+ // required or present fields
162
+ } else {
163
+ if (field.partOf) {
164
+ var oneofProp = util.safeProp(field.partOf.name);
165
+ if (seenFirstField[field.partOf.name] === 1) gen
166
+ ("if(p%s===1)", oneofProp)
167
+ ("return%j", field.partOf.name + ": multiple values");
168
+ seenFirstField[field.partOf.name] = 1;
169
+ gen
170
+ ("p%s=1", oneofProp);
171
+ }
172
+ genVerifyValue(gen, field, i, ref);
173
+ }
174
+ if (field.optional) gen
175
+ ("}");
176
+ }
177
+ return gen
178
+ ("return null");
179
+ /* eslint-enable no-unexpected-multiline */
180
+ }
package/src/wrappers.js CHANGED
@@ -1,102 +1,103 @@
1
- "use strict";
2
-
3
- /**
4
- * Wrappers for common types.
5
- * @type {Object.<string,IWrapper>}
6
- * @const
7
- */
8
- var wrappers = exports;
9
-
10
- var Message = require("./message");
11
-
12
- /**
13
- * From object converter part of an {@link IWrapper}.
14
- * @typedef WrapperFromObjectConverter
15
- * @type {function}
16
- * @param {Object.<string,*>} object Plain object
17
- * @returns {Message<{}>} Message instance
18
- * @this Type
19
- */
20
-
21
- /**
22
- * To object converter part of an {@link IWrapper}.
23
- * @typedef WrapperToObjectConverter
24
- * @type {function}
25
- * @param {Message<{}>} message Message instance
26
- * @param {IConversionOptions} [options] Conversion options
27
- * @returns {Object.<string,*>} Plain object
28
- * @this Type
29
- */
30
-
31
- /**
32
- * Common type wrapper part of {@link wrappers}.
33
- * @interface IWrapper
34
- * @property {WrapperFromObjectConverter} [fromObject] From object converter
35
- * @property {WrapperToObjectConverter} [toObject] To object converter
36
- */
37
-
38
- // Custom wrapper for Any
39
- wrappers[".google.protobuf.Any"] = {
40
-
41
- fromObject: function(object) {
42
-
43
- // unwrap value type if mapped
44
- if (object && object["@type"]) {
45
- // Only use fully qualified type name after the last '/'
46
- var name = object["@type"].substring(object["@type"].lastIndexOf("/") + 1);
47
- var type = this.lookup(name);
48
- /* istanbul ignore else */
49
- if (type) {
50
- // type_url does not accept leading "."
51
- var type_url = object["@type"].charAt(0) === "." ?
52
- object["@type"].slice(1) : object["@type"];
53
- // type_url prefix is optional, but path seperator is required
54
- if (type_url.indexOf("/") === -1) {
55
- type_url = "/" + type_url;
56
- }
57
- return this.create({
58
- type_url: type_url,
59
- value: type.encode(type.fromObject(object)).finish()
60
- });
61
- }
62
- }
63
-
64
- return this.fromObject(object);
65
- },
66
-
67
- toObject: function(message, options) {
68
-
69
- // Default prefix
70
- var googleApi = "type.googleapis.com/";
71
- var prefix = "";
72
- var name = "";
73
-
74
- // decode value if requested and unmapped
75
- if (options && options.json && message.type_url && message.value) {
76
- // Only use fully qualified type name after the last '/'
77
- name = message.type_url.substring(message.type_url.lastIndexOf("/") + 1);
78
- // Separate the prefix used
79
- prefix = message.type_url.substring(0, message.type_url.lastIndexOf("/") + 1);
80
- var type = this.lookup(name);
81
- /* istanbul ignore else */
82
- if (type)
83
- message = type.decode(message.value);
84
- }
85
-
86
- // wrap value if unmapped
87
- if (!(message instanceof this.ctor) && message instanceof Message) {
88
- var object = message.$type.toObject(message, options);
89
- var messageName = message.$type.fullName[0] === "." ?
90
- message.$type.fullName.slice(1) : message.$type.fullName;
91
- // Default to type.googleapis.com prefix if no prefix is used
92
- if (prefix === "") {
93
- prefix = googleApi;
94
- }
95
- name = prefix + messageName;
96
- object["@type"] = name;
97
- return object;
98
- }
99
-
100
- return this.toObject(message, options);
101
- }
102
- };
1
+ "use strict";
2
+
3
+ /**
4
+ * Wrappers for common types.
5
+ * @type {Object.<string,IWrapper>}
6
+ * @const
7
+ */
8
+ var wrappers = exports;
9
+
10
+ var Message = require("./message");
11
+
12
+ /**
13
+ * From object converter part of an {@link IWrapper}.
14
+ * @typedef WrapperFromObjectConverter
15
+ * @type {function}
16
+ * @param {Object.<string,*>} object Plain object
17
+ * @returns {Message<{}>} Message instance
18
+ * @this Type
19
+ */
20
+
21
+ /**
22
+ * To object converter part of an {@link IWrapper}.
23
+ * @typedef WrapperToObjectConverter
24
+ * @type {function}
25
+ * @param {Message<{}>} message Message instance
26
+ * @param {IConversionOptions} [options] Conversion options
27
+ * @returns {Object.<string,*>} Plain object
28
+ * @this Type
29
+ */
30
+
31
+ /**
32
+ * Common type wrapper part of {@link wrappers}.
33
+ * @interface IWrapper
34
+ * @property {WrapperFromObjectConverter} [fromObject] From object converter
35
+ * @property {WrapperToObjectConverter} [toObject] To object converter
36
+ */
37
+
38
+ // Custom wrapper for Any
39
+ wrappers[".google.protobuf.Any"] = {
40
+
41
+ fromObject: function(object, depth) {
42
+
43
+ // unwrap value type if mapped
44
+ if (object && object["@type"]) {
45
+ // Only use fully qualified type name after the last '/'
46
+ var name = object["@type"].substring(object["@type"].lastIndexOf("/") + 1);
47
+ var type = this.lookup(name);
48
+ /* istanbul ignore else */
49
+ if (type) {
50
+ // type_url does not accept leading "."
51
+ var type_url = object["@type"].charAt(0) === "." ?
52
+ object["@type"].slice(1) : object["@type"];
53
+ // type_url prefix is optional, but path seperator is required
54
+ if (type_url.indexOf("/") === -1) {
55
+ type_url = "/" + type_url;
56
+ }
57
+ var nextDepth = depth === undefined ? 1 : depth + 1;
58
+ return this.create({
59
+ type_url: type_url,
60
+ value: type.encode(type.fromObject(object, nextDepth)).finish()
61
+ });
62
+ }
63
+ }
64
+
65
+ return this.fromObject(object, depth);
66
+ },
67
+
68
+ toObject: function(message, options) {
69
+
70
+ // Default prefix
71
+ var googleApi = "type.googleapis.com/";
72
+ var prefix = "";
73
+ var name = "";
74
+
75
+ // decode value if requested and unmapped
76
+ if (options && options.json && message.type_url && message.value) {
77
+ // Only use fully qualified type name after the last '/'
78
+ name = message.type_url.substring(message.type_url.lastIndexOf("/") + 1);
79
+ // Separate the prefix used
80
+ prefix = message.type_url.substring(0, message.type_url.lastIndexOf("/") + 1);
81
+ var type = this.lookup(name);
82
+ /* istanbul ignore else */
83
+ if (type)
84
+ message = type.decode(message.value);
85
+ }
86
+
87
+ // wrap value if unmapped
88
+ if (!(message instanceof this.ctor) && message instanceof Message) {
89
+ var object = message.$type.toObject(message, options);
90
+ var messageName = message.$type.fullName[0] === "." ?
91
+ message.$type.fullName.slice(1) : message.$type.fullName;
92
+ // Default to type.googleapis.com prefix if no prefix is used
93
+ if (prefix === "") {
94
+ prefix = googleApi;
95
+ }
96
+ name = prefix + messageName;
97
+ object["@type"] = name;
98
+ return object;
99
+ }
100
+
101
+ return this.toObject(message, options);
102
+ }
103
+ };