2 var $protobuf = require("../..");
3 module.exports = exports = $protobuf.descriptor = $protobuf.Root.fromJSON(require("../../google/protobuf/descriptor.json")).lookup(".google.protobuf");
5 var Namespace = $protobuf.Namespace,
9 Field = $protobuf.Field,
10 MapField = $protobuf.MapField,
11 OneOf = $protobuf.OneOf,
12 Service = $protobuf.Service,
13 Method = $protobuf.Method;
18 * Properties of a FileDescriptorSet message.
19 * @interface IFileDescriptorSet
20 * @property {IFileDescriptorProto[]} file Files
24 * Properties of a FileDescriptorProto message.
25 * @interface IFileDescriptorProto
26 * @property {string} [name] File name
27 * @property {string} [package] Package
28 * @property {*} [dependency] Not supported
29 * @property {*} [publicDependency] Not supported
30 * @property {*} [weakDependency] Not supported
31 * @property {IDescriptorProto[]} [messageType] Nested message types
32 * @property {IEnumDescriptorProto[]} [enumType] Nested enums
33 * @property {IServiceDescriptorProto[]} [service] Nested services
34 * @property {IFieldDescriptorProto[]} [extension] Nested extension fields
35 * @property {IFileOptions} [options] Options
36 * @property {*} [sourceCodeInfo] Not supported
37 * @property {string} [syntax="proto2"] Syntax
41 * Properties of a FileOptions message.
42 * @interface IFileOptions
43 * @property {string} [javaPackage]
44 * @property {string} [javaOuterClassname]
45 * @property {boolean} [javaMultipleFiles]
46 * @property {boolean} [javaGenerateEqualsAndHash]
47 * @property {boolean} [javaStringCheckUtf8]
48 * @property {IFileOptionsOptimizeMode} [optimizeFor=1]
49 * @property {string} [goPackage]
50 * @property {boolean} [ccGenericServices]
51 * @property {boolean} [javaGenericServices]
52 * @property {boolean} [pyGenericServices]
53 * @property {boolean} [deprecated]
54 * @property {boolean} [ccEnableArenas]
55 * @property {string} [objcClassPrefix]
56 * @property {string} [csharpNamespace]
60 * Values of he FileOptions.OptimizeMode enum.
61 * @typedef IFileOptionsOptimizeMode
63 * @property {number} SPEED=1
64 * @property {number} CODE_SIZE=2
65 * @property {number} LITE_RUNTIME=3
69 * Creates a root from a descriptor set.
70 * @param {IFileDescriptorSet|Reader|Uint8Array} descriptor Descriptor
71 * @returns {Root} Root instance
73 Root.fromDescriptor = function fromDescriptor(descriptor) {
75 // Decode the descriptor message if specified as a buffer:
76 if (typeof descriptor.length === "number")
77 descriptor = exports.FileDescriptorSet.decode(descriptor);
79 var root = new Root();
81 if (descriptor.file) {
84 for (var j = 0, i; j < descriptor.file.length; ++j) {
86 if ((fileDescriptor = descriptor.file[j])["package"] && fileDescriptor["package"].length)
87 filePackage = root.define(fileDescriptor["package"]);
88 if (fileDescriptor.name && fileDescriptor.name.length)
89 root.files.push(filePackage.filename = fileDescriptor.name);
90 if (fileDescriptor.messageType)
91 for (i = 0; i < fileDescriptor.messageType.length; ++i)
92 filePackage.add(Type.fromDescriptor(fileDescriptor.messageType[i], fileDescriptor.syntax));
93 if (fileDescriptor.enumType)
94 for (i = 0; i < fileDescriptor.enumType.length; ++i)
95 filePackage.add(Enum.fromDescriptor(fileDescriptor.enumType[i]));
96 if (fileDescriptor.extension)
97 for (i = 0; i < fileDescriptor.extension.length; ++i)
98 filePackage.add(Field.fromDescriptor(fileDescriptor.extension[i]));
99 if (fileDescriptor.service)
100 for (i = 0; i < fileDescriptor.service.length; ++i)
101 filePackage.add(Service.fromDescriptor(fileDescriptor.service[i]));
102 var opts = fromDescriptorOptions(fileDescriptor.options, exports.FileOptions);
104 var ks = Object.keys(opts);
105 for (i = 0; i < ks.length; ++i)
106 filePackage.setOption(ks[i], opts[ks[i]]);
115 * Converts a root to a descriptor set.
116 * @returns {Message<IFileDescriptorSet>} Descriptor
117 * @param {string} [syntax="proto2"] Syntax
119 Root.prototype.toDescriptor = function toDescriptor(syntax) {
120 var set = exports.FileDescriptorSet.create();
121 Root_toDescriptorRecursive(this, set.file, syntax);
125 // Traverses a namespace and assembles the descriptor set
126 function Root_toDescriptorRecursive(ns, files, syntax) {
129 var file = exports.FileDescriptorProto.create({ name: ns.filename || (ns.fullName.substring(1).replace(/\./g, "_") || "root") + ".proto" });
131 file.syntax = syntax;
132 if (!(ns instanceof Root))
133 file["package"] = ns.fullName.substring(1);
136 for (var i = 0, nested; i < ns.nestedArray.length; ++i)
137 if ((nested = ns._nestedArray[i]) instanceof Type)
138 file.messageType.push(nested.toDescriptor(syntax));
139 else if (nested instanceof Enum)
140 file.enumType.push(nested.toDescriptor());
141 else if (nested instanceof Field)
142 file.extension.push(nested.toDescriptor(syntax));
143 else if (nested instanceof Service)
144 file.service.push(nested.toDescriptor());
145 else if (nested instanceof /* plain */ Namespace)
146 Root_toDescriptorRecursive(nested, files, syntax); // requires new file
148 // Keep package-level options
149 file.options = toDescriptorOptions(ns.options, exports.FileOptions);
151 // And keep the file only if there is at least one nested object
152 if (file.messageType.length + file.enumType.length + file.extension.length + file.service.length)
159 * Properties of a DescriptorProto message.
160 * @interface IDescriptorProto
161 * @property {string} [name] Message type name
162 * @property {IFieldDescriptorProto[]} [field] Fields
163 * @property {IFieldDescriptorProto[]} [extension] Extension fields
164 * @property {IDescriptorProto[]} [nestedType] Nested message types
165 * @property {IEnumDescriptorProto[]} [enumType] Nested enums
166 * @property {IDescriptorProtoExtensionRange[]} [extensionRange] Extension ranges
167 * @property {IOneofDescriptorProto[]} [oneofDecl] Oneofs
168 * @property {IMessageOptions} [options] Not supported
169 * @property {IDescriptorProtoReservedRange[]} [reservedRange] Reserved ranges
170 * @property {string[]} [reservedName] Reserved names
174 * Properties of a MessageOptions message.
175 * @interface IMessageOptions
176 * @property {boolean} [mapEntry=false] Whether this message is a map entry
180 * Properties of an ExtensionRange message.
181 * @interface IDescriptorProtoExtensionRange
182 * @property {number} [start] Start field id
183 * @property {number} [end] End field id
187 * Properties of a ReservedRange message.
188 * @interface IDescriptorProtoReservedRange
189 * @property {number} [start] Start field id
190 * @property {number} [end] End field id
193 var unnamedMessageIndex = 0;
196 * Creates a type from a descriptor.
197 * @param {IDescriptorProto|Reader|Uint8Array} descriptor Descriptor
198 * @param {string} [syntax="proto2"] Syntax
199 * @returns {Type} Type instance
201 Type.fromDescriptor = function fromDescriptor(descriptor, syntax) {
203 // Decode the descriptor message if specified as a buffer:
204 if (typeof descriptor.length === "number")
205 descriptor = exports.DescriptorProto.decode(descriptor);
207 // Create the message type
208 var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports.MessageOptions)),
211 /* Oneofs */ if (descriptor.oneofDecl)
212 for (i = 0; i < descriptor.oneofDecl.length; ++i)
213 type.add(OneOf.fromDescriptor(descriptor.oneofDecl[i]));
214 /* Fields */ if (descriptor.field)
215 for (i = 0; i < descriptor.field.length; ++i) {
216 var field = Field.fromDescriptor(descriptor.field[i], syntax);
218 if (descriptor.field[i].hasOwnProperty("oneofIndex")) // eslint-disable-line no-prototype-builtins
219 type.oneofsArray[descriptor.field[i].oneofIndex].add(field);
221 /* Extension fields */ if (descriptor.extension)
222 for (i = 0; i < descriptor.extension.length; ++i)
223 type.add(Field.fromDescriptor(descriptor.extension[i], syntax));
224 /* Nested types */ if (descriptor.nestedType)
225 for (i = 0; i < descriptor.nestedType.length; ++i) {
226 type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax));
227 if (descriptor.nestedType[i].options && descriptor.nestedType[i].options.mapEntry)
228 type.setOption("map_entry", true);
230 /* Nested enums */ if (descriptor.enumType)
231 for (i = 0; i < descriptor.enumType.length; ++i)
232 type.add(Enum.fromDescriptor(descriptor.enumType[i]));
233 /* Extension ranges */ if (descriptor.extensionRange && descriptor.extensionRange.length) {
234 type.extensions = [];
235 for (i = 0; i < descriptor.extensionRange.length; ++i)
236 type.extensions.push([ descriptor.extensionRange[i].start, descriptor.extensionRange[i].end ]);
238 /* Reserved... */ if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) {
240 /* Ranges */ if (descriptor.reservedRange)
241 for (i = 0; i < descriptor.reservedRange.length; ++i)
242 type.reserved.push([ descriptor.reservedRange[i].start, descriptor.reservedRange[i].end ]);
243 /* Names */ if (descriptor.reservedName)
244 for (i = 0; i < descriptor.reservedName.length; ++i)
245 type.reserved.push(descriptor.reservedName[i]);
252 * Converts a type to a descriptor.
253 * @returns {Message<IDescriptorProto>} Descriptor
254 * @param {string} [syntax="proto2"] Syntax
256 Type.prototype.toDescriptor = function toDescriptor(syntax) {
257 var descriptor = exports.DescriptorProto.create({ name: this.name }),
260 /* Fields */ for (i = 0; i < this.fieldsArray.length; ++i) {
262 descriptor.field.push(fieldDescriptor = this._fieldsArray[i].toDescriptor(syntax));
263 if (this._fieldsArray[i] instanceof MapField) { // map fields are repeated FieldNameEntry
264 var keyType = toDescriptorType(this._fieldsArray[i].keyType, this._fieldsArray[i].resolvedKeyType),
265 valueType = toDescriptorType(this._fieldsArray[i].type, this._fieldsArray[i].resolvedType),
266 valueTypeName = valueType === /* type */ 11 || valueType === /* enum */ 14
267 ? this._fieldsArray[i].resolvedType && shortname(this.parent, this._fieldsArray[i].resolvedType) || this._fieldsArray[i].type
269 descriptor.nestedType.push(exports.DescriptorProto.create({
270 name: fieldDescriptor.typeName,
272 exports.FieldDescriptorProto.create({ name: "key", number: 1, label: 1, type: keyType }), // can't reference a type or enum
273 exports.FieldDescriptorProto.create({ name: "value", number: 2, label: 1, type: valueType, typeName: valueTypeName })
275 options: exports.MessageOptions.create({ mapEntry: true })
279 /* Oneofs */ for (i = 0; i < this.oneofsArray.length; ++i)
280 descriptor.oneofDecl.push(this._oneofsArray[i].toDescriptor());
281 /* Nested... */ for (i = 0; i < this.nestedArray.length; ++i) {
282 /* Extension fields */ if (this._nestedArray[i] instanceof Field)
283 descriptor.field.push(this._nestedArray[i].toDescriptor(syntax));
284 /* Types */ else if (this._nestedArray[i] instanceof Type)
285 descriptor.nestedType.push(this._nestedArray[i].toDescriptor(syntax));
286 /* Enums */ else if (this._nestedArray[i] instanceof Enum)
287 descriptor.enumType.push(this._nestedArray[i].toDescriptor());
288 // plain nested namespaces become packages instead in Root#toDescriptor
290 /* Extension ranges */ if (this.extensions)
291 for (i = 0; i < this.extensions.length; ++i)
292 descriptor.extensionRange.push(exports.DescriptorProto.ExtensionRange.create({ start: this.extensions[i][0], end: this.extensions[i][1] }));
293 /* Reserved... */ if (this.reserved)
294 for (i = 0; i < this.reserved.length; ++i)
295 /* Names */ if (typeof this.reserved[i] === "string")
296 descriptor.reservedName.push(this.reserved[i]);
298 descriptor.reservedRange.push(exports.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] }));
300 descriptor.options = toDescriptorOptions(this.options, exports.MessageOptions);
308 * Properties of a FieldDescriptorProto message.
309 * @interface IFieldDescriptorProto
310 * @property {string} [name] Field name
311 * @property {number} [number] Field id
312 * @property {IFieldDescriptorProtoLabel} [label] Field rule
313 * @property {IFieldDescriptorProtoType} [type] Field basic type
314 * @property {string} [typeName] Field type name
315 * @property {string} [extendee] Extended type name
316 * @property {string} [defaultValue] Literal default value
317 * @property {number} [oneofIndex] Oneof index if part of a oneof
318 * @property {*} [jsonName] Not supported
319 * @property {IFieldOptions} [options] Field options
323 * Values of the FieldDescriptorProto.Label enum.
324 * @typedef IFieldDescriptorProtoLabel
326 * @property {number} LABEL_OPTIONAL=1
327 * @property {number} LABEL_REQUIRED=2
328 * @property {number} LABEL_REPEATED=3
332 * Values of the FieldDescriptorProto.Type enum.
333 * @typedef IFieldDescriptorProtoType
335 * @property {number} TYPE_DOUBLE=1
336 * @property {number} TYPE_FLOAT=2
337 * @property {number} TYPE_INT64=3
338 * @property {number} TYPE_UINT64=4
339 * @property {number} TYPE_INT32=5
340 * @property {number} TYPE_FIXED64=6
341 * @property {number} TYPE_FIXED32=7
342 * @property {number} TYPE_BOOL=8
343 * @property {number} TYPE_STRING=9
344 * @property {number} TYPE_GROUP=10
345 * @property {number} TYPE_MESSAGE=11
346 * @property {number} TYPE_BYTES=12
347 * @property {number} TYPE_UINT32=13
348 * @property {number} TYPE_ENUM=14
349 * @property {number} TYPE_SFIXED32=15
350 * @property {number} TYPE_SFIXED64=16
351 * @property {number} TYPE_SINT32=17
352 * @property {number} TYPE_SINT64=18
356 * Properties of a FieldOptions message.
357 * @interface IFieldOptions
358 * @property {boolean} [packed] Whether packed or not (defaults to `false` for proto2 and `true` for proto3)
359 * @property {IFieldOptionsJSType} [jstype] JavaScript value type (not used by protobuf.js)
363 * Values of the FieldOptions.JSType enum.
364 * @typedef IFieldOptionsJSType
366 * @property {number} JS_NORMAL=0
367 * @property {number} JS_STRING=1
368 * @property {number} JS_NUMBER=2
371 // copied here from parse.js
372 var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/;
375 * Creates a field from a descriptor.
376 * @param {IFieldDescriptorProto|Reader|Uint8Array} descriptor Descriptor
377 * @param {string} [syntax="proto2"] Syntax
378 * @returns {Field} Field instance
380 Field.fromDescriptor = function fromDescriptor(descriptor, syntax) {
382 // Decode the descriptor message if specified as a buffer:
383 if (typeof descriptor.length === "number")
384 descriptor = exports.DescriptorProto.decode(descriptor);
386 if (typeof descriptor.number !== "number")
387 throw Error("missing field id");
391 if (descriptor.typeName && descriptor.typeName.length)
392 fieldType = descriptor.typeName;
394 fieldType = fromDescriptorType(descriptor.type);
398 switch (descriptor.label) {
399 // 0 is reserved for errors
400 case 1: fieldRule = undefined; break;
401 case 2: fieldRule = "required"; break;
402 case 3: fieldRule = "repeated"; break;
403 default: throw Error("illegal label: " + descriptor.label);
406 var extendee = descriptor.extendee;
407 if (descriptor.extendee !== undefined) {
408 extendee = extendee.length ? extendee : undefined;
410 var field = new Field(
411 descriptor.name.length ? descriptor.name : "field" + descriptor.number,
418 field.options = fromDescriptorOptions(descriptor.options, exports.FieldOptions);
420 if (descriptor.defaultValue && descriptor.defaultValue.length) {
421 var defaultValue = descriptor.defaultValue;
422 switch (defaultValue) {
423 case "true": case "TRUE":
426 case "false": case "FALSE":
427 defaultValue = false;
430 var match = numberRe.exec(defaultValue);
432 defaultValue = parseInt(defaultValue); // eslint-disable-line radix
435 field.setOption("default", defaultValue);
438 if (packableDescriptorType(descriptor.type)) {
439 if (syntax === "proto3") { // defaults to packed=true (internal preset is packed=true)
440 if (descriptor.options && !descriptor.options.packed)
441 field.setOption("packed", false);
442 } else if (!(descriptor.options && descriptor.options.packed)) // defaults to packed=false
443 field.setOption("packed", false);
450 * Converts a field to a descriptor.
451 * @returns {Message<IFieldDescriptorProto>} Descriptor
452 * @param {string} [syntax="proto2"] Syntax
454 Field.prototype.toDescriptor = function toDescriptor(syntax) {
455 var descriptor = exports.FieldDescriptorProto.create({ name: this.name, number: this.id });
459 descriptor.type = 11; // message
460 descriptor.typeName = $protobuf.util.ucFirst(this.name); // fieldName -> FieldNameEntry (built in Type#toDescriptor)
461 descriptor.label = 3; // repeated
466 switch (descriptor.type = toDescriptorType(this.type, this.resolve().resolvedType)) {
470 descriptor.typeName = this.resolvedType ? shortname(this.parent, this.resolvedType) : this.type;
476 case "repeated": descriptor.label = 3; break;
477 case "required": descriptor.label = 2; break;
478 default: descriptor.label = 1; break;
483 // Handle extension field
484 descriptor.extendee = this.extensionField ? this.extensionField.parent.fullName : this.extend;
486 // Handle part of oneof
488 if ((descriptor.oneofIndex = this.parent.oneofsArray.indexOf(this.partOf)) < 0)
489 throw Error("missing oneof");
492 descriptor.options = toDescriptorOptions(this.options, exports.FieldOptions);
493 if (this.options["default"] != null)
494 descriptor.defaultValue = String(this.options["default"]);
497 if (syntax === "proto3") { // defaults to packed=true
499 (descriptor.options || (descriptor.options = exports.FieldOptions.create())).packed = false;
500 } else if (this.packed) // defaults to packed=false
501 (descriptor.options || (descriptor.options = exports.FieldOptions.create())).packed = true;
509 * Properties of an EnumDescriptorProto message.
510 * @interface IEnumDescriptorProto
511 * @property {string} [name] Enum name
512 * @property {IEnumValueDescriptorProto[]} [value] Enum values
513 * @property {IEnumOptions} [options] Enum options
517 * Properties of an EnumValueDescriptorProto message.
518 * @interface IEnumValueDescriptorProto
519 * @property {string} [name] Name
520 * @property {number} [number] Value
521 * @property {*} [options] Not supported
525 * Properties of an EnumOptions message.
526 * @interface IEnumOptions
527 * @property {boolean} [allowAlias] Whether aliases are allowed
528 * @property {boolean} [deprecated]
531 var unnamedEnumIndex = 0;
534 * Creates an enum from a descriptor.
535 * @param {IEnumDescriptorProto|Reader|Uint8Array} descriptor Descriptor
536 * @returns {Enum} Enum instance
538 Enum.fromDescriptor = function fromDescriptor(descriptor) {
540 // Decode the descriptor message if specified as a buffer:
541 if (typeof descriptor.length === "number")
542 descriptor = exports.EnumDescriptorProto.decode(descriptor);
544 // Construct values object
546 if (descriptor.value)
547 for (var i = 0; i < descriptor.value.length; ++i) {
548 var name = descriptor.value[i].name,
549 value = descriptor.value[i].number || 0;
550 values[name && name.length ? name : "NAME" + value] = value;
554 descriptor.name && descriptor.name.length ? descriptor.name : "Enum" + unnamedEnumIndex++,
556 fromDescriptorOptions(descriptor.options, exports.EnumOptions)
561 * Converts an enum to a descriptor.
562 * @returns {Message<IEnumDescriptorProto>} Descriptor
564 Enum.prototype.toDescriptor = function toDescriptor() {
568 for (var i = 0, ks = Object.keys(this.values); i < ks.length; ++i)
569 values.push(exports.EnumValueDescriptorProto.create({ name: ks[i], number: this.values[ks[i]] }));
571 return exports.EnumDescriptorProto.create({
574 options: toDescriptorOptions(this.options, exports.EnumOptions)
581 * Properties of a OneofDescriptorProto message.
582 * @interface IOneofDescriptorProto
583 * @property {string} [name] Oneof name
584 * @property {*} [options] Not supported
587 var unnamedOneofIndex = 0;
590 * Creates a oneof from a descriptor.
591 * @param {IOneofDescriptorProto|Reader|Uint8Array} descriptor Descriptor
592 * @returns {OneOf} OneOf instance
594 OneOf.fromDescriptor = function fromDescriptor(descriptor) {
596 // Decode the descriptor message if specified as a buffer:
597 if (typeof descriptor.length === "number")
598 descriptor = exports.OneofDescriptorProto.decode(descriptor);
601 // unnamedOneOfIndex is global, not per type, because we have no ref to a type here
602 descriptor.name && descriptor.name.length ? descriptor.name : "oneof" + unnamedOneofIndex++
603 // fromDescriptorOptions(descriptor.options, exports.OneofOptions) - only uninterpreted_option
608 * Converts a oneof to a descriptor.
609 * @returns {Message<IOneofDescriptorProto>} Descriptor
611 OneOf.prototype.toDescriptor = function toDescriptor() {
612 return exports.OneofDescriptorProto.create({
614 // options: toDescriptorOptions(this.options, exports.OneofOptions) - only uninterpreted_option
621 * Properties of a ServiceDescriptorProto message.
622 * @interface IServiceDescriptorProto
623 * @property {string} [name] Service name
624 * @property {IMethodDescriptorProto[]} [method] Methods
625 * @property {IServiceOptions} [options] Options
629 * Properties of a ServiceOptions message.
630 * @interface IServiceOptions
631 * @property {boolean} [deprecated]
634 var unnamedServiceIndex = 0;
637 * Creates a service from a descriptor.
638 * @param {IServiceDescriptorProto|Reader|Uint8Array} descriptor Descriptor
639 * @returns {Service} Service instance
641 Service.fromDescriptor = function fromDescriptor(descriptor) {
643 // Decode the descriptor message if specified as a buffer:
644 if (typeof descriptor.length === "number")
645 descriptor = exports.ServiceDescriptorProto.decode(descriptor);
647 var service = new Service(descriptor.name && descriptor.name.length ? descriptor.name : "Service" + unnamedServiceIndex++, fromDescriptorOptions(descriptor.options, exports.ServiceOptions));
648 if (descriptor.method)
649 for (var i = 0; i < descriptor.method.length; ++i)
650 service.add(Method.fromDescriptor(descriptor.method[i]));
656 * Converts a service to a descriptor.
657 * @returns {Message<IServiceDescriptorProto>} Descriptor
659 Service.prototype.toDescriptor = function toDescriptor() {
663 for (var i = 0; i < this.methodsArray.length; ++i)
664 methods.push(this._methodsArray[i].toDescriptor());
666 return exports.ServiceDescriptorProto.create({
669 options: toDescriptorOptions(this.options, exports.ServiceOptions)
676 * Properties of a MethodDescriptorProto message.
677 * @interface IMethodDescriptorProto
678 * @property {string} [name] Method name
679 * @property {string} [inputType] Request type name
680 * @property {string} [outputType] Response type name
681 * @property {IMethodOptions} [options] Not supported
682 * @property {boolean} [clientStreaming=false] Whether requests are streamed
683 * @property {boolean} [serverStreaming=false] Whether responses are streamed
687 * Properties of a MethodOptions message.
688 * @interface IMethodOptions
689 * @property {boolean} [deprecated]
692 var unnamedMethodIndex = 0;
695 * Creates a method from a descriptor.
696 * @param {IMethodDescriptorProto|Reader|Uint8Array} descriptor Descriptor
697 * @returns {Method} Reflected method instance
699 Method.fromDescriptor = function fromDescriptor(descriptor) {
701 // Decode the descriptor message if specified as a buffer:
702 if (typeof descriptor.length === "number")
703 descriptor = exports.MethodDescriptorProto.decode(descriptor);
706 // unnamedMethodIndex is global, not per service, because we have no ref to a service here
707 descriptor.name && descriptor.name.length ? descriptor.name : "Method" + unnamedMethodIndex++,
709 descriptor.inputType,
710 descriptor.outputType,
711 Boolean(descriptor.clientStreaming),
712 Boolean(descriptor.serverStreaming),
713 fromDescriptorOptions(descriptor.options, exports.MethodOptions)
718 * Converts a method to a descriptor.
719 * @returns {Message<IMethodDescriptorProto>} Descriptor
721 Method.prototype.toDescriptor = function toDescriptor() {
722 return exports.MethodDescriptorProto.create({
724 inputType: this.resolvedRequestType ? this.resolvedRequestType.fullName : this.requestType,
725 outputType: this.resolvedResponseType ? this.resolvedResponseType.fullName : this.responseType,
726 clientStreaming: this.requestStream,
727 serverStreaming: this.responseStream,
728 options: toDescriptorOptions(this.options, exports.MethodOptions)
734 // Converts a descriptor type to a protobuf.js basic type
735 function fromDescriptorType(type) {
737 // 0 is reserved for errors
738 case 1: return "double";
739 case 2: return "float";
740 case 3: return "int64";
741 case 4: return "uint64";
742 case 5: return "int32";
743 case 6: return "fixed64";
744 case 7: return "fixed32";
745 case 8: return "bool";
746 case 9: return "string";
747 case 12: return "bytes";
748 case 13: return "uint32";
749 case 15: return "sfixed32";
750 case 16: return "sfixed64";
751 case 17: return "sint32";
752 case 18: return "sint64";
754 throw Error("illegal type: " + type);
757 // Tests if a descriptor type is packable
758 function packableDescriptorType(type) {
779 // Converts a protobuf.js basic type to a descriptor type
780 function toDescriptorType(type, resolvedType) {
782 // 0 is reserved for errors
783 case "double": return 1;
784 case "float": return 2;
785 case "int64": return 3;
786 case "uint64": return 4;
787 case "int32": return 5;
788 case "fixed64": return 6;
789 case "fixed32": return 7;
790 case "bool": return 8;
791 case "string": return 9;
792 case "bytes": return 12;
793 case "uint32": return 13;
794 case "sfixed32": return 15;
795 case "sfixed64": return 16;
796 case "sint32": return 17;
797 case "sint64": return 18;
799 if (resolvedType instanceof Enum)
801 if (resolvedType instanceof Type)
802 return resolvedType.group ? 10 : 11;
803 throw Error("illegal type: " + type);
806 // Converts descriptor options to an options object
807 function fromDescriptorOptions(options, type) {
811 for (var i = 0, field, key, val; i < type.fieldsArray.length; ++i)
812 if ((key = (field = type._fieldsArray[i]).name) !== "uninterpretedOption")
813 if (options.hasOwnProperty(key)) { // eslint-disable-line no-prototype-builtins
815 if (field.resolvedType instanceof Enum && typeof val === "number" && field.resolvedType.valuesById[val] !== undefined)
816 val = field.resolvedType.valuesById[val];
817 out.push(underScore(key), val);
819 return out.length ? $protobuf.util.toObject(out) : undefined;
822 // Converts an options object to descriptor options
823 function toDescriptorOptions(options, type) {
827 for (var i = 0, ks = Object.keys(options), key, val; i < ks.length; ++i) {
828 val = options[key = ks[i]];
829 if (key === "default")
831 var field = type.fields[key];
832 if (!field && !(field = type.fields[key = $protobuf.util.camelCase(key)]))
836 return out.length ? type.fromObject($protobuf.util.toObject(out)) : undefined;
839 // Calculates the shortest relative path from `from` to `to`.
840 function shortname(from, to) {
841 var fromPath = from.fullName.split("."),
842 toPath = to.fullName.split("."),
845 k = toPath.length - 1;
846 if (!(from instanceof Root) && to instanceof Namespace)
847 while (i < fromPath.length && j < k && fromPath[i] === toPath[j]) {
848 var other = to.lookup(fromPath[i++], true);
849 if (other !== null && other !== to)
854 for (; i < fromPath.length && j < k && fromPath[i] === toPath[j]; ++i, ++j);
855 return toPath.slice(j).join(".");
858 // copied here from cli/targets/proto.js
859 function underScore(str) {
860 return str.substring(0,1)
862 .replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { return "_" + $1.toLowerCase(); });
868 * Reflected file descriptor set.
869 * @name FileDescriptorSet
872 * @tstype $protobuf.Type
876 * Reflected file descriptor proto.
877 * @name FileDescriptorProto
880 * @tstype $protobuf.Type
884 * Reflected descriptor proto.
885 * @name DescriptorProto
887 * @property {Type} ExtensionRange
888 * @property {Type} ReservedRange
890 * @tstype $protobuf.Type & {
891 * ExtensionRange: $protobuf.Type,
892 * ReservedRange: $protobuf.Type
897 * Reflected field descriptor proto.
898 * @name FieldDescriptorProto
900 * @property {Enum} Label
901 * @property {Enum} Type
903 * @tstype $protobuf.Type & {
904 * Label: $protobuf.Enum,
905 * Type: $protobuf.Enum
910 * Reflected oneof descriptor proto.
911 * @name OneofDescriptorProto
914 * @tstype $protobuf.Type
918 * Reflected enum descriptor proto.
919 * @name EnumDescriptorProto
922 * @tstype $protobuf.Type
926 * Reflected service descriptor proto.
927 * @name ServiceDescriptorProto
930 * @tstype $protobuf.Type
934 * Reflected enum value descriptor proto.
935 * @name EnumValueDescriptorProto
938 * @tstype $protobuf.Type
942 * Reflected method descriptor proto.
943 * @name MethodDescriptorProto
946 * @tstype $protobuf.Type
950 * Reflected file options.
953 * @property {Enum} OptimizeMode
955 * @tstype $protobuf.Type & {
956 * OptimizeMode: $protobuf.Enum
961 * Reflected message options.
962 * @name MessageOptions
965 * @tstype $protobuf.Type
969 * Reflected field options.
972 * @property {Enum} CType
973 * @property {Enum} JSType
975 * @tstype $protobuf.Type & {
976 * CType: $protobuf.Enum,
977 * JSType: $protobuf.Enum
982 * Reflected oneof options.
986 * @tstype $protobuf.Type
990 * Reflected enum options.
994 * @tstype $protobuf.Type
998 * Reflected enum value options.
999 * @name EnumValueOptions
1002 * @tstype $protobuf.Type
1006 * Reflected service options.
1007 * @name ServiceOptions
1010 * @tstype $protobuf.Type
1014 * Reflected method options.
1015 * @name MethodOptions
1018 * @tstype $protobuf.Type
1022 * Reflected uninterpretet option.
1023 * @name UninterpretedOption
1025 * @property {Type} NamePart
1027 * @tstype $protobuf.Type & {
1028 * NamePart: $protobuf.Type
1033 * Reflected source code info.
1034 * @name SourceCodeInfo
1036 * @property {Type} Location
1038 * @tstype $protobuf.Type & {
1039 * Location: $protobuf.Type
1044 * Reflected generated code info.
1045 * @name GeneratedCodeInfo
1047 * @property {Type} Annotation
1049 * @tstype $protobuf.Type & {
1050 * Annotation: $protobuf.Type