protobufjs 6.8.5 → 6.8.9

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 (103) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +39 -39
  3. package/README.md +879 -879
  4. package/cli/LICENSE +33 -33
  5. package/cli/README.md +11 -11
  6. package/cli/index.d.ts +3 -3
  7. package/cli/index.js +3 -3
  8. package/cli/lib/tsd-jsdoc/LICENSE +20 -20
  9. package/cli/lib/tsd-jsdoc/README.md +23 -23
  10. package/cli/lib/tsd-jsdoc/plugin.js +21 -21
  11. package/cli/lib/tsd-jsdoc/publish.js +693 -693
  12. package/cli/lib/tsd-jsdoc.json +18 -18
  13. package/cli/package.standalone.json +31 -31
  14. package/cli/pbjs.d.ts +9 -9
  15. package/cli/pbjs.js +329 -319
  16. package/cli/pbts.d.ts +9 -9
  17. package/cli/pbts.js +197 -168
  18. package/cli/targets/json-module.js +38 -38
  19. package/cli/targets/json.js +8 -8
  20. package/cli/targets/proto.js +326 -326
  21. package/cli/targets/proto2.js +10 -10
  22. package/cli/targets/proto3.js +10 -10
  23. package/cli/targets/static-module.js +29 -29
  24. package/cli/targets/static.js +702 -705
  25. package/cli/util.js +183 -183
  26. package/cli/wrappers/amd.js +7 -7
  27. package/cli/wrappers/closure.js +7 -7
  28. package/cli/wrappers/commonjs.js +7 -7
  29. package/cli/wrappers/default.js +15 -15
  30. package/cli/wrappers/es6.js +5 -5
  31. package/dist/README.md +31 -31
  32. package/dist/light/README.md +31 -31
  33. package/dist/light/protobuf.js +6031 -6011
  34. package/dist/light/protobuf.js.map +1 -1
  35. package/dist/light/protobuf.min.js +3 -3
  36. package/dist/light/protobuf.min.js.map +1 -1
  37. package/dist/minimal/README.md +31 -31
  38. package/dist/minimal/protobuf.js +1877 -1868
  39. package/dist/minimal/protobuf.js.map +1 -1
  40. package/dist/minimal/protobuf.min.js +3 -3
  41. package/dist/minimal/protobuf.min.js.map +1 -1
  42. package/dist/protobuf.js +7594 -7573
  43. package/dist/protobuf.js.map +1 -1
  44. package/dist/protobuf.min.js +3 -3
  45. package/dist/protobuf.min.js.map +1 -1
  46. package/ext/debug/README.md +4 -4
  47. package/ext/debug/index.js +71 -71
  48. package/ext/descriptor/README.md +72 -72
  49. package/ext/descriptor/index.d.ts +0 -1
  50. package/ext/descriptor/index.js +1052 -1049
  51. package/ext/descriptor/test.js +54 -54
  52. package/google/LICENSE +27 -27
  53. package/google/README.md +1 -1
  54. package/google/api/annotations.proto +10 -10
  55. package/google/protobuf/descriptor.proto +286 -286
  56. package/google/protobuf/source_context.proto +7 -7
  57. package/index.d.ts +3 -1
  58. package/index.js +4 -4
  59. package/light.d.ts +2 -2
  60. package/light.js +3 -3
  61. package/minimal.d.ts +2 -2
  62. package/minimal.js +4 -4
  63. package/package-lock.json +5810 -3344
  64. package/package.json +24 -30
  65. package/scripts/changelog.js +150 -150
  66. package/scripts/postinstall.js +35 -35
  67. package/src/common.js +399 -399
  68. package/src/converter.js +293 -287
  69. package/src/decoder.js +106 -106
  70. package/src/encoder.js +99 -99
  71. package/src/enum.js +181 -181
  72. package/src/field.js +371 -370
  73. package/src/index-light.js +104 -104
  74. package/src/index-minimal.js +36 -36
  75. package/src/index.js +12 -12
  76. package/src/mapfield.js +126 -126
  77. package/src/message.js +138 -138
  78. package/src/method.js +151 -151
  79. package/src/namespace.js +433 -431
  80. package/src/object.js +200 -199
  81. package/src/oneof.js +203 -203
  82. package/src/parse.js +758 -757
  83. package/src/reader.js +405 -407
  84. package/src/reader_buffer.js +44 -44
  85. package/src/root.js +351 -350
  86. package/src/roots.js +18 -18
  87. package/src/rpc/service.js +142 -142
  88. package/src/rpc.js +36 -36
  89. package/src/service.js +167 -167
  90. package/src/tokenize.js +397 -397
  91. package/src/type.js +589 -589
  92. package/src/types.js +196 -196
  93. package/src/typescript.jsdoc +15 -15
  94. package/src/util/longbits.js +200 -200
  95. package/src/util/minimal.js +414 -405
  96. package/src/util.js +178 -178
  97. package/src/verifier.js +176 -176
  98. package/src/wrappers.js +83 -83
  99. package/src/writer.js +459 -459
  100. package/src/writer_buffer.js +81 -81
  101. package/tsconfig.json +6 -6
  102. package/google/protobuf/field_mask.json +0 -21
  103. package/google/protobuf/field_mask.proto +0 -7
@@ -1,1049 +1,1052 @@
1
- "use strict";
2
- var $protobuf = require("../..");
3
- module.exports = exports = $protobuf.descriptor = $protobuf.Root.fromJSON(require("../../google/protobuf/descriptor.json")).lookup(".google.protobuf");
4
-
5
- var Namespace = $protobuf.Namespace,
6
- Root = $protobuf.Root,
7
- Enum = $protobuf.Enum,
8
- Type = $protobuf.Type,
9
- Field = $protobuf.Field,
10
- MapField = $protobuf.MapField,
11
- OneOf = $protobuf.OneOf,
12
- Service = $protobuf.Service,
13
- Method = $protobuf.Method;
14
-
15
- // --- Root ---
16
-
17
- /**
18
- * Properties of a FileDescriptorSet message.
19
- * @interface IFileDescriptorSet
20
- * @property {IFileDescriptorProto[]} file Files
21
- */
22
-
23
- /**
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
38
- */
39
-
40
- /**
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]
57
- */
58
-
59
- /**
60
- * Values of he FileOptions.OptimizeMode enum.
61
- * @typedef IFileOptionsOptimizeMode
62
- * @type {number}
63
- * @property {number} SPEED=1
64
- * @property {number} CODE_SIZE=2
65
- * @property {number} LITE_RUNTIME=3
66
- */
67
-
68
- /**
69
- * Creates a root from a descriptor set.
70
- * @param {IFileDescriptorSet|Reader|Uint8Array} descriptor Descriptor
71
- * @returns {Root} Root instance
72
- */
73
- Root.fromDescriptor = function fromDescriptor(descriptor) {
74
-
75
- // Decode the descriptor message if specified as a buffer:
76
- if (typeof descriptor.length === "number")
77
- descriptor = exports.FileDescriptorSet.decode(descriptor);
78
-
79
- var root = new Root();
80
-
81
- if (descriptor.file) {
82
- var fileDescriptor,
83
- filePackage;
84
- for (var j = 0, i; j < descriptor.file.length; ++j) {
85
- filePackage = root;
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
- var opts = fromDescriptorOptions(fileDescriptor.options, exports.FileOptions);
100
- if (opts) {
101
- var ks = Object.keys(opts);
102
- for (i = 0; i < ks.length; ++i)
103
- filePackage.setOption(ks[i], opts[ks[i]]);
104
- }
105
- }
106
- }
107
-
108
- return root;
109
- };
110
-
111
- /**
112
- * Converts a root to a descriptor set.
113
- * @returns {Message<IFileDescriptorSet>} Descriptor
114
- * @param {string} [syntax="proto2"] Syntax
115
- */
116
- Root.prototype.toDescriptor = function toDescriptor(syntax) {
117
- var set = exports.FileDescriptorSet.create();
118
- Root_toDescriptorRecursive(this, set.file, syntax);
119
- return set;
120
- };
121
-
122
- // Traverses a namespace and assembles the descriptor set
123
- function Root_toDescriptorRecursive(ns, files, syntax) {
124
-
125
- // Create a new file
126
- var file = exports.FileDescriptorProto.create({ name: ns.filename || (ns.fullName.substring(1).replace(/\./g, "_") || "root") + ".proto" });
127
- if (syntax)
128
- file.syntax = syntax;
129
- if (!(ns instanceof Root))
130
- file["package"] = ns.fullName.substring(1);
131
-
132
- // Add nested types
133
- for (var i = 0, nested; i < ns.nestedArray.length; ++i)
134
- if ((nested = ns._nestedArray[i]) instanceof Type)
135
- file.messageType.push(nested.toDescriptor(syntax));
136
- else if (nested instanceof Enum)
137
- file.enumType.push(nested.toDescriptor());
138
- else if (nested instanceof Field)
139
- file.extension.push(nested.toDescriptor(syntax));
140
- else if (nested instanceof Service)
141
- file.service.push(nested.toDescriptor());
142
- else if (nested instanceof /* plain */ Namespace)
143
- Root_toDescriptorRecursive(nested, files, syntax); // requires new file
144
-
145
- // Keep package-level options
146
- file.options = toDescriptorOptions(ns.options, exports.FileOptions);
147
-
148
- // And keep the file only if there is at least one nested object
149
- if (file.messageType.length + file.enumType.length + file.extension.length + file.service.length)
150
- files.push(file);
151
- }
152
-
153
- // --- Type ---
154
-
155
- /**
156
- * Properties of a DescriptorProto message.
157
- * @interface IDescriptorProto
158
- * @property {string} [name] Message type name
159
- * @property {IFieldDescriptorProto[]} [field] Fields
160
- * @property {IFieldDescriptorProto[]} [extension] Extension fields
161
- * @property {IDescriptorProto[]} [nestedType] Nested message types
162
- * @property {IEnumDescriptorProto[]} [enumType] Nested enums
163
- * @property {IDescriptorProtoExtensionRange[]} [extensionRange] Extension ranges
164
- * @property {IOneofDescriptorProto[]} [oneofDecl] Oneofs
165
- * @property {IMessageOptions} [options] Not supported
166
- * @property {IDescriptorProtoReservedRange[]} [reservedRange] Reserved ranges
167
- * @property {string[]} [reservedName] Reserved names
168
- */
169
-
170
- /**
171
- * Properties of a MessageOptions message.
172
- * @interface IMessageOptions
173
- * @property {boolean} [mapEntry=false] Whether this message is a map entry
174
- */
175
-
176
- /**
177
- * Properties of an ExtensionRange message.
178
- * @interface IDescriptorProtoExtensionRange
179
- * @property {number} [start] Start field id
180
- * @property {number} [end] End field id
181
- */
182
-
183
- /**
184
- * Properties of a ReservedRange message.
185
- * @interface IDescriptorProtoReservedRange
186
- * @property {number} [start] Start field id
187
- * @property {number} [end] End field id
188
- */
189
-
190
- var unnamedMessageIndex = 0;
191
-
192
- /**
193
- * Creates a type from a descriptor.
194
- * @param {IDescriptorProto|Reader|Uint8Array} descriptor Descriptor
195
- * @param {string} [syntax="proto2"] Syntax
196
- * @returns {Type} Type instance
197
- */
198
- Type.fromDescriptor = function fromDescriptor(descriptor, syntax) {
199
-
200
- // Decode the descriptor message if specified as a buffer:
201
- if (typeof descriptor.length === "number")
202
- descriptor = exports.DescriptorProto.decode(descriptor);
203
-
204
- // Create the message type
205
- var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports.MessageOptions)),
206
- i;
207
-
208
- /* Oneofs */ if (descriptor.oneofDecl)
209
- for (i = 0; i < descriptor.oneofDecl.length; ++i)
210
- type.add(OneOf.fromDescriptor(descriptor.oneofDecl[i]));
211
- /* Fields */ if (descriptor.field)
212
- for (i = 0; i < descriptor.field.length; ++i) {
213
- var field = Field.fromDescriptor(descriptor.field[i], syntax);
214
- type.add(field);
215
- if (descriptor.field[i].hasOwnProperty("oneofIndex")) // eslint-disable-line no-prototype-builtins
216
- type.oneofsArray[descriptor.field[i].oneofIndex].add(field);
217
- }
218
- /* Extension fields */ if (descriptor.extension)
219
- for (i = 0; i < descriptor.extension.length; ++i)
220
- type.add(Field.fromDescriptor(descriptor.extension[i], syntax));
221
- /* Nested types */ if (descriptor.nestedType)
222
- for (i = 0; i < descriptor.nestedType.length; ++i) {
223
- type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax));
224
- if (descriptor.nestedType[i].options && descriptor.nestedType[i].options.mapEntry)
225
- type.setOption("map_entry", true);
226
- }
227
- /* Nested enums */ if (descriptor.enumType)
228
- for (i = 0; i < descriptor.enumType.length; ++i)
229
- type.add(Enum.fromDescriptor(descriptor.enumType[i]));
230
- /* Extension ranges */ if (descriptor.extensionRange && descriptor.extensionRange.length) {
231
- type.extensions = [];
232
- for (i = 0; i < descriptor.extensionRange.length; ++i)
233
- type.extensions.push([ descriptor.extensionRange[i].start, descriptor.extensionRange[i].end ]);
234
- }
235
- /* Reserved... */ if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) {
236
- type.reserved = [];
237
- /* Ranges */ if (descriptor.reservedRange)
238
- for (i = 0; i < descriptor.reservedRange.length; ++i)
239
- type.reserved.push([ descriptor.reservedRange[i].start, descriptor.reservedRange[i].end ]);
240
- /* Names */ if (descriptor.reservedName)
241
- for (i = 0; i < descriptor.reservedName.length; ++i)
242
- type.reserved.push(descriptor.reservedName[i]);
243
- }
244
-
245
- return type;
246
- };
247
-
248
- /**
249
- * Converts a type to a descriptor.
250
- * @returns {Message<IDescriptorProto>} Descriptor
251
- * @param {string} [syntax="proto2"] Syntax
252
- */
253
- Type.prototype.toDescriptor = function toDescriptor(syntax) {
254
- var descriptor = exports.DescriptorProto.create({ name: this.name }),
255
- i;
256
-
257
- /* Fields */ for (i = 0; i < this.fieldsArray.length; ++i) {
258
- var fieldDescriptor;
259
- descriptor.field.push(fieldDescriptor = this._fieldsArray[i].toDescriptor(syntax));
260
- if (this._fieldsArray[i] instanceof MapField) { // map fields are repeated FieldNameEntry
261
- var keyType = toDescriptorType(this._fieldsArray[i].keyType, this._fieldsArray[i].resolvedKeyType),
262
- valueType = toDescriptorType(this._fieldsArray[i].type, this._fieldsArray[i].resolvedType),
263
- valueTypeName = valueType === /* type */ 11 || valueType === /* enum */ 14
264
- ? this._fieldsArray[i].resolvedType && shortname(this.parent, this._fieldsArray[i].resolvedType) || this._fieldsArray[i].type
265
- : undefined;
266
- descriptor.nestedType.push(exports.DescriptorProto.create({
267
- name: fieldDescriptor.typeName,
268
- field: [
269
- exports.FieldDescriptorProto.create({ name: "key", number: 1, label: 1, type: keyType }), // can't reference a type or enum
270
- exports.FieldDescriptorProto.create({ name: "value", number: 2, label: 1, type: valueType, typeName: valueTypeName })
271
- ],
272
- options: exports.MessageOptions.create({ mapEntry: true })
273
- }));
274
- }
275
- }
276
- /* Oneofs */ for (i = 0; i < this.oneofsArray.length; ++i)
277
- descriptor.oneofDecl.push(this._oneofsArray[i].toDescriptor());
278
- /* Nested... */ for (i = 0; i < this.nestedArray.length; ++i) {
279
- /* Extension fields */ if (this._nestedArray[i] instanceof Field)
280
- descriptor.field.push(this._nestedArray[i].toDescriptor(syntax));
281
- /* Types */ else if (this._nestedArray[i] instanceof Type)
282
- descriptor.nestedType.push(this._nestedArray[i].toDescriptor(syntax));
283
- /* Enums */ else if (this._nestedArray[i] instanceof Enum)
284
- descriptor.enumType.push(this._nestedArray[i].toDescriptor());
285
- // plain nested namespaces become packages instead in Root#toDescriptor
286
- }
287
- /* Extension ranges */ if (this.extensions)
288
- for (i = 0; i < this.extensions.length; ++i)
289
- descriptor.extensionRange.push(exports.DescriptorProto.ExtensionRange.create({ start: this.extensions[i][0], end: this.extensions[i][1] }));
290
- /* Reserved... */ if (this.reserved)
291
- for (i = 0; i < this.reserved.length; ++i)
292
- /* Names */ if (typeof this.reserved[i] === "string")
293
- descriptor.reservedName.push(this.reserved[i]);
294
- /* Ranges */ else
295
- descriptor.reservedRange.push(exports.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] }));
296
-
297
- descriptor.options = toDescriptorOptions(this.options, exports.MessageOptions);
298
-
299
- return descriptor;
300
- };
301
-
302
- // --- Field ---
303
-
304
- /**
305
- * Properties of a FieldDescriptorProto message.
306
- * @interface IFieldDescriptorProto
307
- * @property {string} [name] Field name
308
- * @property {number} [number] Field id
309
- * @property {IFieldDescriptorProtoLabel} [label] Field rule
310
- * @property {IFieldDescriptorProtoType} [type] Field basic type
311
- * @property {string} [typeName] Field type name
312
- * @property {string} [extendee] Extended type name
313
- * @property {string} [defaultValue] Literal default value
314
- * @property {number} [oneofIndex] Oneof index if part of a oneof
315
- * @property {*} [jsonName] Not supported
316
- * @property {IFieldOptions} [options] Field options
317
- */
318
-
319
- /**
320
- * Values of the FieldDescriptorProto.Label enum.
321
- * @typedef IFieldDescriptorProtoLabel
322
- * @type {number}
323
- * @property {number} LABEL_OPTIONAL=1
324
- * @property {number} LABEL_REQUIRED=2
325
- * @property {number} LABEL_REPEATED=3
326
- */
327
-
328
- /**
329
- * Values of the FieldDescriptorProto.Type enum.
330
- * @typedef IFieldDescriptorProtoType
331
- * @type {number}
332
- * @property {number} TYPE_DOUBLE=1
333
- * @property {number} TYPE_FLOAT=2
334
- * @property {number} TYPE_INT64=3
335
- * @property {number} TYPE_UINT64=4
336
- * @property {number} TYPE_INT32=5
337
- * @property {number} TYPE_FIXED64=6
338
- * @property {number} TYPE_FIXED32=7
339
- * @property {number} TYPE_BOOL=8
340
- * @property {number} TYPE_STRING=9
341
- * @property {number} TYPE_GROUP=10
342
- * @property {number} TYPE_MESSAGE=11
343
- * @property {number} TYPE_BYTES=12
344
- * @property {number} TYPE_UINT32=13
345
- * @property {number} TYPE_ENUM=14
346
- * @property {number} TYPE_SFIXED32=15
347
- * @property {number} TYPE_SFIXED64=16
348
- * @property {number} TYPE_SINT32=17
349
- * @property {number} TYPE_SINT64=18
350
- */
351
-
352
- /**
353
- * Properties of a FieldOptions message.
354
- * @interface IFieldOptions
355
- * @property {boolean} [packed] Whether packed or not (defaults to `false` for proto2 and `true` for proto3)
356
- * @property {IFieldOptionsJSType} [jstype] JavaScript value type (not used by protobuf.js)
357
- */
358
-
359
- /**
360
- * Values of the FieldOptions.JSType enum.
361
- * @typedef IFieldOptionsJSType
362
- * @type {number}
363
- * @property {number} JS_NORMAL=0
364
- * @property {number} JS_STRING=1
365
- * @property {number} JS_NUMBER=2
366
- */
367
-
368
- // copied here from parse.js
369
- var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/;
370
-
371
- /**
372
- * Creates a field from a descriptor.
373
- * @param {IFieldDescriptorProto|Reader|Uint8Array} descriptor Descriptor
374
- * @param {string} [syntax="proto2"] Syntax
375
- * @returns {Field} Field instance
376
- */
377
- Field.fromDescriptor = function fromDescriptor(descriptor, syntax) {
378
-
379
- // Decode the descriptor message if specified as a buffer:
380
- if (typeof descriptor.length === "number")
381
- descriptor = exports.DescriptorProto.decode(descriptor);
382
-
383
- if (typeof descriptor.number !== "number")
384
- throw Error("missing field id");
385
-
386
- // Rewire field type
387
- var fieldType;
388
- if (descriptor.typeName && descriptor.typeName.length)
389
- fieldType = descriptor.typeName;
390
- else
391
- fieldType = fromDescriptorType(descriptor.type);
392
-
393
- // Rewire field rule
394
- var fieldRule;
395
- switch (descriptor.label) {
396
- // 0 is reserved for errors
397
- case 1: fieldRule = undefined; break;
398
- case 2: fieldRule = "required"; break;
399
- case 3: fieldRule = "repeated"; break;
400
- default: throw Error("illegal label: " + descriptor.label);
401
- }
402
-
403
- var extendee = descriptor.extendee;
404
- if (descriptor.extendee !== undefined) {
405
- extendee = extendee.length ? extendee : undefined;
406
- }
407
- var field = new Field(
408
- descriptor.name.length ? descriptor.name : "field" + descriptor.number,
409
- descriptor.number,
410
- fieldType,
411
- fieldRule,
412
- extendee
413
- );
414
-
415
- field.options = fromDescriptorOptions(descriptor.options, exports.FieldOptions);
416
-
417
- if (descriptor.defaultValue && descriptor.defaultValue.length) {
418
- var defaultValue = descriptor.defaultValue;
419
- switch (defaultValue) {
420
- case "true": case "TRUE":
421
- defaultValue = true;
422
- break;
423
- case "false": case "FALSE":
424
- defaultValue = false;
425
- break;
426
- default:
427
- var match = numberRe.exec(defaultValue);
428
- if (match)
429
- defaultValue = parseInt(defaultValue); // eslint-disable-line radix
430
- break;
431
- }
432
- field.setOption("default", defaultValue);
433
- }
434
-
435
- if (packableDescriptorType(descriptor.type)) {
436
- if (syntax === "proto3") { // defaults to packed=true (internal preset is packed=true)
437
- if (descriptor.options && !descriptor.options.packed)
438
- field.setOption("packed", false);
439
- } else if (!(descriptor.options && descriptor.options.packed)) // defaults to packed=false
440
- field.setOption("packed", false);
441
- }
442
-
443
- return field;
444
- };
445
-
446
- /**
447
- * Converts a field to a descriptor.
448
- * @returns {Message<IFieldDescriptorProto>} Descriptor
449
- * @param {string} [syntax="proto2"] Syntax
450
- */
451
- Field.prototype.toDescriptor = function toDescriptor(syntax) {
452
- var descriptor = exports.FieldDescriptorProto.create({ name: this.name, number: this.id });
453
-
454
- if (this.map) {
455
-
456
- descriptor.type = 11; // message
457
- descriptor.typeName = $protobuf.util.ucFirst(this.name); // fieldName -> FieldNameEntry (built in Type#toDescriptor)
458
- descriptor.label = 3; // repeated
459
-
460
- } else {
461
-
462
- // Rewire field type
463
- switch (descriptor.type = toDescriptorType(this.type, this.resolve().resolvedType)) {
464
- case 10: // group
465
- case 11: // type
466
- case 14: // enum
467
- descriptor.typeName = this.resolvedType ? shortname(this.parent, this.resolvedType) : this.type;
468
- break;
469
- }
470
-
471
- // Rewire field rule
472
- switch (this.rule) {
473
- case "repeated": descriptor.label = 3; break;
474
- case "required": descriptor.label = 2; break;
475
- default: descriptor.label = 1; break;
476
- }
477
-
478
- }
479
-
480
- // Handle extension field
481
- descriptor.extendee = this.extensionField ? this.extensionField.parent.fullName : this.extend;
482
-
483
- // Handle part of oneof
484
- if (this.partOf)
485
- if ((descriptor.oneofIndex = this.parent.oneofsArray.indexOf(this.partOf)) < 0)
486
- throw Error("missing oneof");
487
-
488
- if (this.options) {
489
- descriptor.options = toDescriptorOptions(this.options, exports.FieldOptions);
490
- if (this.options["default"] != null)
491
- descriptor.defaultValue = String(this.options["default"]);
492
- }
493
-
494
- if (syntax === "proto3") { // defaults to packed=true
495
- if (!this.packed)
496
- (descriptor.options || (descriptor.options = exports.FieldOptions.create())).packed = false;
497
- } else if (this.packed) // defaults to packed=false
498
- (descriptor.options || (descriptor.options = exports.FieldOptions.create())).packed = true;
499
-
500
- return descriptor;
501
- };
502
-
503
- // --- Enum ---
504
-
505
- /**
506
- * Properties of an EnumDescriptorProto message.
507
- * @interface IEnumDescriptorProto
508
- * @property {string} [name] Enum name
509
- * @property {IEnumValueDescriptorProto[]} [value] Enum values
510
- * @property {IEnumOptions} [options] Enum options
511
- */
512
-
513
- /**
514
- * Properties of an EnumValueDescriptorProto message.
515
- * @interface IEnumValueDescriptorProto
516
- * @property {string} [name] Name
517
- * @property {number} [number] Value
518
- * @property {*} [options] Not supported
519
- */
520
-
521
- /**
522
- * Properties of an EnumOptions message.
523
- * @interface IEnumOptions
524
- * @property {boolean} [allowAlias] Whether aliases are allowed
525
- * @property {boolean} [deprecated]
526
- */
527
-
528
- var unnamedEnumIndex = 0;
529
-
530
- /**
531
- * Creates an enum from a descriptor.
532
- * @param {IEnumDescriptorProto|Reader|Uint8Array} descriptor Descriptor
533
- * @returns {Enum} Enum instance
534
- */
535
- Enum.fromDescriptor = function fromDescriptor(descriptor) {
536
-
537
- // Decode the descriptor message if specified as a buffer:
538
- if (typeof descriptor.length === "number")
539
- descriptor = exports.EnumDescriptorProto.decode(descriptor);
540
-
541
- // Construct values object
542
- var values = {};
543
- if (descriptor.value)
544
- for (var i = 0; i < descriptor.value.length; ++i) {
545
- var name = descriptor.value[i].name,
546
- value = descriptor.value[i].number || 0;
547
- values[name && name.length ? name : "NAME" + value] = value;
548
- }
549
-
550
- return new Enum(
551
- descriptor.name && descriptor.name.length ? descriptor.name : "Enum" + unnamedEnumIndex++,
552
- values,
553
- fromDescriptorOptions(descriptor.options, exports.EnumOptions)
554
- );
555
- };
556
-
557
- /**
558
- * Converts an enum to a descriptor.
559
- * @returns {Message<IEnumDescriptorProto>} Descriptor
560
- */
561
- Enum.prototype.toDescriptor = function toDescriptor() {
562
-
563
- // Values
564
- var values = [];
565
- for (var i = 0, ks = Object.keys(this.values); i < ks.length; ++i)
566
- values.push(exports.EnumValueDescriptorProto.create({ name: ks[i], number: this.values[ks[i]] }));
567
-
568
- return exports.EnumDescriptorProto.create({
569
- name: this.name,
570
- value: values,
571
- options: toDescriptorOptions(this.options, exports.EnumOptions)
572
- });
573
- };
574
-
575
- // --- OneOf ---
576
-
577
- /**
578
- * Properties of a OneofDescriptorProto message.
579
- * @interface IOneofDescriptorProto
580
- * @property {string} [name] Oneof name
581
- * @property {*} [options] Not supported
582
- */
583
-
584
- var unnamedOneofIndex = 0;
585
-
586
- /**
587
- * Creates a oneof from a descriptor.
588
- * @param {IOneofDescriptorProto|Reader|Uint8Array} descriptor Descriptor
589
- * @returns {OneOf} OneOf instance
590
- */
591
- OneOf.fromDescriptor = function fromDescriptor(descriptor) {
592
-
593
- // Decode the descriptor message if specified as a buffer:
594
- if (typeof descriptor.length === "number")
595
- descriptor = exports.OneofDescriptorProto.decode(descriptor);
596
-
597
- return new OneOf(
598
- // unnamedOneOfIndex is global, not per type, because we have no ref to a type here
599
- descriptor.name && descriptor.name.length ? descriptor.name : "oneof" + unnamedOneofIndex++
600
- // fromDescriptorOptions(descriptor.options, exports.OneofOptions) - only uninterpreted_option
601
- );
602
- };
603
-
604
- /**
605
- * Converts a oneof to a descriptor.
606
- * @returns {Message<IOneofDescriptorProto>} Descriptor
607
- */
608
- OneOf.prototype.toDescriptor = function toDescriptor() {
609
- return exports.OneofDescriptorProto.create({
610
- name: this.name
611
- // options: toDescriptorOptions(this.options, exports.OneofOptions) - only uninterpreted_option
612
- });
613
- };
614
-
615
- // --- Service ---
616
-
617
- /**
618
- * Properties of a ServiceDescriptorProto message.
619
- * @interface IServiceDescriptorProto
620
- * @property {string} [name] Service name
621
- * @property {IMethodDescriptorProto[]} [method] Methods
622
- * @property {IServiceOptions} [options] Options
623
- */
624
-
625
- /**
626
- * Properties of a ServiceOptions message.
627
- * @interface IServiceOptions
628
- * @property {boolean} [deprecated]
629
- */
630
-
631
- var unnamedServiceIndex = 0;
632
-
633
- /**
634
- * Creates a service from a descriptor.
635
- * @param {IServiceDescriptorProto|Reader|Uint8Array} descriptor Descriptor
636
- * @returns {Service} Service instance
637
- */
638
- Service.fromDescriptor = function fromDescriptor(descriptor) {
639
-
640
- // Decode the descriptor message if specified as a buffer:
641
- if (typeof descriptor.length === "number")
642
- descriptor = exports.ServiceDescriptorProto.decode(descriptor);
643
-
644
- var service = new Service(descriptor.name && descriptor.name.length ? descriptor.name : "Service" + unnamedServiceIndex++, fromDescriptorOptions(descriptor.options, exports.ServiceOptions));
645
- if (descriptor.method)
646
- for (var i = 0; i < descriptor.method.length; ++i)
647
- service.add(Method.fromDescriptor(descriptor.method[i]));
648
-
649
- return service;
650
- };
651
-
652
- /**
653
- * Converts a service to a descriptor.
654
- * @returns {Message<IServiceDescriptorProto>} Descriptor
655
- */
656
- Service.prototype.toDescriptor = function toDescriptor() {
657
-
658
- // Methods
659
- var methods = [];
660
- for (var i = 0; i < this.methodsArray; ++i)
661
- methods.push(this._methodsArray[i].toDescriptor());
662
-
663
- return exports.ServiceDescriptorProto.create({
664
- name: this.name,
665
- methods: methods,
666
- options: toDescriptorOptions(this.options, exports.ServiceOptions)
667
- });
668
- };
669
-
670
- // --- Method ---
671
-
672
- /**
673
- * Properties of a MethodDescriptorProto message.
674
- * @interface IMethodDescriptorProto
675
- * @property {string} [name] Method name
676
- * @property {string} [inputType] Request type name
677
- * @property {string} [outputType] Response type name
678
- * @property {IMethodOptions} [options] Not supported
679
- * @property {boolean} [clientStreaming=false] Whether requests are streamed
680
- * @property {boolean} [serverStreaming=false] Whether responses are streamed
681
- */
682
-
683
- /**
684
- * Properties of a MethodOptions message.
685
- * @interface IMethodOptions
686
- * @property {boolean} [deprecated]
687
- */
688
-
689
- var unnamedMethodIndex = 0;
690
-
691
- /**
692
- * Creates a method from a descriptor.
693
- * @param {IMethodDescriptorProto|Reader|Uint8Array} descriptor Descriptor
694
- * @returns {Method} Reflected method instance
695
- */
696
- Method.fromDescriptor = function fromDescriptor(descriptor) {
697
-
698
- // Decode the descriptor message if specified as a buffer:
699
- if (typeof descriptor.length === "number")
700
- descriptor = exports.MethodDescriptorProto.decode(descriptor);
701
-
702
- return new Method(
703
- // unnamedMethodIndex is global, not per service, because we have no ref to a service here
704
- descriptor.name && descriptor.name.length ? descriptor.name : "Method" + unnamedMethodIndex++,
705
- "rpc",
706
- descriptor.inputType,
707
- descriptor.outputType,
708
- Boolean(descriptor.clientStreaming),
709
- Boolean(descriptor.serverStreaming),
710
- fromDescriptorOptions(descriptor.options, exports.MethodOptions)
711
- );
712
- };
713
-
714
- /**
715
- * Converts a method to a descriptor.
716
- * @returns {Message<IMethodDescriptorProto>} Descriptor
717
- */
718
- Method.prototype.toDescriptor = function toDescriptor() {
719
- return exports.MethodDescriptorProto.create({
720
- name: this.name,
721
- inputType: this.resolvedRequestType ? this.resolvedRequestType.fullName : this.requestType,
722
- outputType: this.resolvedResponseType ? this.resolvedResponseType.fullName : this.responseType,
723
- clientStreaming: this.requestStream,
724
- serverStreaming: this.responseStream,
725
- options: toDescriptorOptions(this.options, exports.MethodOptions)
726
- });
727
- };
728
-
729
- // --- utility ---
730
-
731
- // Converts a descriptor type to a protobuf.js basic type
732
- function fromDescriptorType(type) {
733
- switch (type) {
734
- // 0 is reserved for errors
735
- case 1: return "double";
736
- case 2: return "float";
737
- case 3: return "int64";
738
- case 4: return "uint64";
739
- case 5: return "int32";
740
- case 6: return "fixed64";
741
- case 7: return "fixed32";
742
- case 8: return "bool";
743
- case 9: return "string";
744
- case 12: return "bytes";
745
- case 13: return "uint32";
746
- case 15: return "sfixed32";
747
- case 16: return "sfixed64";
748
- case 17: return "sint32";
749
- case 18: return "sint64";
750
- }
751
- throw Error("illegal type: " + type);
752
- }
753
-
754
- // Tests if a descriptor type is packable
755
- function packableDescriptorType(type) {
756
- switch (type) {
757
- case 1: // double
758
- case 2: // float
759
- case 3: // int64
760
- case 4: // uint64
761
- case 5: // int32
762
- case 6: // fixed64
763
- case 7: // fixed32
764
- case 8: // bool
765
- case 13: // uint32
766
- case 14: // enum (!)
767
- case 15: // sfixed32
768
- case 16: // sfixed64
769
- case 17: // sint32
770
- case 18: // sint64
771
- return true;
772
- }
773
- return false;
774
- }
775
-
776
- // Converts a protobuf.js basic type to a descriptor type
777
- function toDescriptorType(type, resolvedType) {
778
- switch (type) {
779
- // 0 is reserved for errors
780
- case "double": return 1;
781
- case "float": return 2;
782
- case "int64": return 3;
783
- case "uint64": return 4;
784
- case "int32": return 5;
785
- case "fixed64": return 6;
786
- case "fixed32": return 7;
787
- case "bool": return 8;
788
- case "string": return 9;
789
- case "bytes": return 12;
790
- case "uint32": return 13;
791
- case "sfixed32": return 15;
792
- case "sfixed64": return 16;
793
- case "sint32": return 17;
794
- case "sint64": return 18;
795
- }
796
- if (resolvedType instanceof Enum)
797
- return 14;
798
- if (resolvedType instanceof Type)
799
- return resolvedType.group ? 10 : 11;
800
- throw Error("illegal type: " + type);
801
- }
802
-
803
- // Converts descriptor options to an options object
804
- function fromDescriptorOptions(options, type) {
805
- if (!options)
806
- return undefined;
807
- var out = [];
808
- for (var i = 0, field, key, val; i < type.fieldsArray.length; ++i)
809
- if ((key = (field = type._fieldsArray[i]).name) !== "uninterpretedOption")
810
- if (options.hasOwnProperty(key)) { // eslint-disable-line no-prototype-builtins
811
- val = options[key];
812
- if (field.resolvedType instanceof Enum && typeof val === "number" && field.resolvedType.valuesById[val] !== undefined)
813
- val = field.resolvedType.valuesById[val];
814
- out.push(underScore(key), val);
815
- }
816
- return out.length ? $protobuf.util.toObject(out) : undefined;
817
- }
818
-
819
- // Converts an options object to descriptor options
820
- function toDescriptorOptions(options, type) {
821
- if (!options)
822
- return undefined;
823
- var out = [];
824
- for (var i = 0, ks = Object.keys(options), key, val; i < ks.length; ++i) {
825
- val = options[key = ks[i]];
826
- if (key === "default")
827
- continue;
828
- var field = type.fields[key];
829
- if (!field && !(field = type.fields[key = $protobuf.util.camelCase(key)]))
830
- continue;
831
- out.push(key, val);
832
- }
833
- return out.length ? type.fromObject($protobuf.util.toObject(out)) : undefined;
834
- }
835
-
836
- // Calculates the shortest relative path from `from` to `to`.
837
- function shortname(from, to) {
838
- var fromPath = from.fullName.split("."),
839
- toPath = to.fullName.split("."),
840
- i = 0,
841
- j = 0,
842
- k = toPath.length - 1;
843
- if (!(from instanceof Root) && to instanceof Namespace)
844
- while (i < fromPath.length && j < k && fromPath[i] === toPath[j]) {
845
- var other = to.lookup(fromPath[i++], true);
846
- if (other !== null && other !== to)
847
- break;
848
- ++j;
849
- }
850
- else
851
- for (; i < fromPath.length && j < k && fromPath[i] === toPath[j]; ++i, ++j);
852
- return toPath.slice(j).join(".");
853
- }
854
-
855
- // copied here from cli/targets/proto.js
856
- function underScore(str) {
857
- return str.substring(0,1)
858
- + str.substring(1)
859
- .replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { return "_" + $1.toLowerCase(); });
860
- }
861
-
862
- // --- exports ---
863
-
864
- /**
865
- * Reflected file descriptor set.
866
- * @name FileDescriptorSet
867
- * @type {Type}
868
- * @const
869
- * @tstype $protobuf.Type
870
- */
871
-
872
- /**
873
- * Reflected file descriptor proto.
874
- * @name FileDescriptorProto
875
- * @type {Type}
876
- * @const
877
- * @tstype $protobuf.Type
878
- */
879
-
880
- /**
881
- * Reflected descriptor proto.
882
- * @name DescriptorProto
883
- * @type {Type}
884
- * @property {Type} ExtensionRange
885
- * @property {Type} ReservedRange
886
- * @const
887
- * @tstype $protobuf.Type & {
888
- * ExtensionRange: $protobuf.Type,
889
- * ReservedRange: $protobuf.Type
890
- * }
891
- */
892
-
893
- /**
894
- * Reflected field descriptor proto.
895
- * @name FieldDescriptorProto
896
- * @type {Type}
897
- * @property {Enum} Label
898
- * @property {Enum} Type
899
- * @const
900
- * @tstype $protobuf.Type & {
901
- * Label: $protobuf.Enum,
902
- * Type: $protobuf.Enum
903
- * }
904
- */
905
-
906
- /**
907
- * Reflected oneof descriptor proto.
908
- * @name OneofDescriptorProto
909
- * @type {Type}
910
- * @const
911
- * @tstype $protobuf.Type
912
- */
913
-
914
- /**
915
- * Reflected enum descriptor proto.
916
- * @name EnumDescriptorProto
917
- * @type {Type}
918
- * @const
919
- * @tstype $protobuf.Type
920
- */
921
-
922
- /**
923
- * Reflected service descriptor proto.
924
- * @name ServiceDescriptorProto
925
- * @type {Type}
926
- * @const
927
- * @tstype $protobuf.Type
928
- */
929
-
930
- /**
931
- * Reflected enum value descriptor proto.
932
- * @name EnumValueDescriptorProto
933
- * @type {Type}
934
- * @const
935
- * @tstype $protobuf.Type
936
- */
937
-
938
- /**
939
- * Reflected method descriptor proto.
940
- * @name MethodDescriptorProto
941
- * @type {Type}
942
- * @const
943
- * @tstype $protobuf.Type
944
- */
945
-
946
- /**
947
- * Reflected file options.
948
- * @name FileOptions
949
- * @type {Type}
950
- * @property {Enum} OptimizeMode
951
- * @const
952
- * @tstype $protobuf.Type & {
953
- * OptimizeMode: $protobuf.Enum
954
- * }
955
- */
956
-
957
- /**
958
- * Reflected message options.
959
- * @name MessageOptions
960
- * @type {Type}
961
- * @const
962
- * @tstype $protobuf.Type
963
- */
964
-
965
- /**
966
- * Reflected field options.
967
- * @name FieldOptions
968
- * @type {Type}
969
- * @property {Enum} CType
970
- * @property {Enum} JSType
971
- * @const
972
- * @tstype $protobuf.Type & {
973
- * CType: $protobuf.Enum,
974
- * JSType: $protobuf.Enum
975
- * }
976
- */
977
-
978
- /**
979
- * Reflected oneof options.
980
- * @name OneofOptions
981
- * @type {Type}
982
- * @const
983
- * @tstype $protobuf.Type
984
- */
985
-
986
- /**
987
- * Reflected enum options.
988
- * @name EnumOptions
989
- * @type {Type}
990
- * @const
991
- * @tstype $protobuf.Type
992
- */
993
-
994
- /**
995
- * Reflected enum value options.
996
- * @name EnumValueOptions
997
- * @type {Type}
998
- * @const
999
- * @tstype $protobuf.Type
1000
- */
1001
-
1002
- /**
1003
- * Reflected service options.
1004
- * @name ServiceOptions
1005
- * @type {Type}
1006
- * @const
1007
- * @tstype $protobuf.Type
1008
- */
1009
-
1010
- /**
1011
- * Reflected method options.
1012
- * @name MethodOptions
1013
- * @type {Type}
1014
- * @const
1015
- * @tstype $protobuf.Type
1016
- */
1017
-
1018
- /**
1019
- * Reflected uninterpretet option.
1020
- * @name UninterpretedOption
1021
- * @type {Type}
1022
- * @property {Type} NamePart
1023
- * @const
1024
- * @tstype $protobuf.Type & {
1025
- * NamePart: $protobuf.Type
1026
- * }
1027
- */
1028
-
1029
- /**
1030
- * Reflected source code info.
1031
- * @name SourceCodeInfo
1032
- * @type {Type}
1033
- * @property {Type} Location
1034
- * @const
1035
- * @tstype $protobuf.Type & {
1036
- * Location: $protobuf.Type
1037
- * }
1038
- */
1039
-
1040
- /**
1041
- * Reflected generated code info.
1042
- * @name GeneratedCodeInfo
1043
- * @type {Type}
1044
- * @property {Type} Annotation
1045
- * @const
1046
- * @tstype $protobuf.Type & {
1047
- * Annotation: $protobuf.Type
1048
- * }
1049
- */
1
+ "use strict";
2
+ var $protobuf = require("../..");
3
+ module.exports = exports = $protobuf.descriptor = $protobuf.Root.fromJSON(require("../../google/protobuf/descriptor.json")).lookup(".google.protobuf");
4
+
5
+ var Namespace = $protobuf.Namespace,
6
+ Root = $protobuf.Root,
7
+ Enum = $protobuf.Enum,
8
+ Type = $protobuf.Type,
9
+ Field = $protobuf.Field,
10
+ MapField = $protobuf.MapField,
11
+ OneOf = $protobuf.OneOf,
12
+ Service = $protobuf.Service,
13
+ Method = $protobuf.Method;
14
+
15
+ // --- Root ---
16
+
17
+ /**
18
+ * Properties of a FileDescriptorSet message.
19
+ * @interface IFileDescriptorSet
20
+ * @property {IFileDescriptorProto[]} file Files
21
+ */
22
+
23
+ /**
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
38
+ */
39
+
40
+ /**
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]
57
+ */
58
+
59
+ /**
60
+ * Values of he FileOptions.OptimizeMode enum.
61
+ * @typedef IFileOptionsOptimizeMode
62
+ * @type {number}
63
+ * @property {number} SPEED=1
64
+ * @property {number} CODE_SIZE=2
65
+ * @property {number} LITE_RUNTIME=3
66
+ */
67
+
68
+ /**
69
+ * Creates a root from a descriptor set.
70
+ * @param {IFileDescriptorSet|Reader|Uint8Array} descriptor Descriptor
71
+ * @returns {Root} Root instance
72
+ */
73
+ Root.fromDescriptor = function fromDescriptor(descriptor) {
74
+
75
+ // Decode the descriptor message if specified as a buffer:
76
+ if (typeof descriptor.length === "number")
77
+ descriptor = exports.FileDescriptorSet.decode(descriptor);
78
+
79
+ var root = new Root();
80
+
81
+ if (descriptor.file) {
82
+ var fileDescriptor,
83
+ filePackage;
84
+ for (var j = 0, i; j < descriptor.file.length; ++j) {
85
+ filePackage = root;
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);
103
+ if (opts) {
104
+ var ks = Object.keys(opts);
105
+ for (i = 0; i < ks.length; ++i)
106
+ filePackage.setOption(ks[i], opts[ks[i]]);
107
+ }
108
+ }
109
+ }
110
+
111
+ return root;
112
+ };
113
+
114
+ /**
115
+ * Converts a root to a descriptor set.
116
+ * @returns {Message<IFileDescriptorSet>} Descriptor
117
+ * @param {string} [syntax="proto2"] Syntax
118
+ */
119
+ Root.prototype.toDescriptor = function toDescriptor(syntax) {
120
+ var set = exports.FileDescriptorSet.create();
121
+ Root_toDescriptorRecursive(this, set.file, syntax);
122
+ return set;
123
+ };
124
+
125
+ // Traverses a namespace and assembles the descriptor set
126
+ function Root_toDescriptorRecursive(ns, files, syntax) {
127
+
128
+ // Create a new file
129
+ var file = exports.FileDescriptorProto.create({ name: ns.filename || (ns.fullName.substring(1).replace(/\./g, "_") || "root") + ".proto" });
130
+ if (syntax)
131
+ file.syntax = syntax;
132
+ if (!(ns instanceof Root))
133
+ file["package"] = ns.fullName.substring(1);
134
+
135
+ // Add nested types
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
147
+
148
+ // Keep package-level options
149
+ file.options = toDescriptorOptions(ns.options, exports.FileOptions);
150
+
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)
153
+ files.push(file);
154
+ }
155
+
156
+ // --- Type ---
157
+
158
+ /**
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
171
+ */
172
+
173
+ /**
174
+ * Properties of a MessageOptions message.
175
+ * @interface IMessageOptions
176
+ * @property {boolean} [mapEntry=false] Whether this message is a map entry
177
+ */
178
+
179
+ /**
180
+ * Properties of an ExtensionRange message.
181
+ * @interface IDescriptorProtoExtensionRange
182
+ * @property {number} [start] Start field id
183
+ * @property {number} [end] End field id
184
+ */
185
+
186
+ /**
187
+ * Properties of a ReservedRange message.
188
+ * @interface IDescriptorProtoReservedRange
189
+ * @property {number} [start] Start field id
190
+ * @property {number} [end] End field id
191
+ */
192
+
193
+ var unnamedMessageIndex = 0;
194
+
195
+ /**
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
200
+ */
201
+ Type.fromDescriptor = function fromDescriptor(descriptor, syntax) {
202
+
203
+ // Decode the descriptor message if specified as a buffer:
204
+ if (typeof descriptor.length === "number")
205
+ descriptor = exports.DescriptorProto.decode(descriptor);
206
+
207
+ // Create the message type
208
+ var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports.MessageOptions)),
209
+ i;
210
+
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);
217
+ type.add(field);
218
+ if (descriptor.field[i].hasOwnProperty("oneofIndex")) // eslint-disable-line no-prototype-builtins
219
+ type.oneofsArray[descriptor.field[i].oneofIndex].add(field);
220
+ }
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);
229
+ }
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 ]);
237
+ }
238
+ /* Reserved... */ if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) {
239
+ type.reserved = [];
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]);
246
+ }
247
+
248
+ return type;
249
+ };
250
+
251
+ /**
252
+ * Converts a type to a descriptor.
253
+ * @returns {Message<IDescriptorProto>} Descriptor
254
+ * @param {string} [syntax="proto2"] Syntax
255
+ */
256
+ Type.prototype.toDescriptor = function toDescriptor(syntax) {
257
+ var descriptor = exports.DescriptorProto.create({ name: this.name }),
258
+ i;
259
+
260
+ /* Fields */ for (i = 0; i < this.fieldsArray.length; ++i) {
261
+ var fieldDescriptor;
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
268
+ : undefined;
269
+ descriptor.nestedType.push(exports.DescriptorProto.create({
270
+ name: fieldDescriptor.typeName,
271
+ field: [
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 })
274
+ ],
275
+ options: exports.MessageOptions.create({ mapEntry: true })
276
+ }));
277
+ }
278
+ }
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
289
+ }
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]);
297
+ /* Ranges */ else
298
+ descriptor.reservedRange.push(exports.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] }));
299
+
300
+ descriptor.options = toDescriptorOptions(this.options, exports.MessageOptions);
301
+
302
+ return descriptor;
303
+ };
304
+
305
+ // --- Field ---
306
+
307
+ /**
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
320
+ */
321
+
322
+ /**
323
+ * Values of the FieldDescriptorProto.Label enum.
324
+ * @typedef IFieldDescriptorProtoLabel
325
+ * @type {number}
326
+ * @property {number} LABEL_OPTIONAL=1
327
+ * @property {number} LABEL_REQUIRED=2
328
+ * @property {number} LABEL_REPEATED=3
329
+ */
330
+
331
+ /**
332
+ * Values of the FieldDescriptorProto.Type enum.
333
+ * @typedef IFieldDescriptorProtoType
334
+ * @type {number}
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
353
+ */
354
+
355
+ /**
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)
360
+ */
361
+
362
+ /**
363
+ * Values of the FieldOptions.JSType enum.
364
+ * @typedef IFieldOptionsJSType
365
+ * @type {number}
366
+ * @property {number} JS_NORMAL=0
367
+ * @property {number} JS_STRING=1
368
+ * @property {number} JS_NUMBER=2
369
+ */
370
+
371
+ // copied here from parse.js
372
+ var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/;
373
+
374
+ /**
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
379
+ */
380
+ Field.fromDescriptor = function fromDescriptor(descriptor, syntax) {
381
+
382
+ // Decode the descriptor message if specified as a buffer:
383
+ if (typeof descriptor.length === "number")
384
+ descriptor = exports.DescriptorProto.decode(descriptor);
385
+
386
+ if (typeof descriptor.number !== "number")
387
+ throw Error("missing field id");
388
+
389
+ // Rewire field type
390
+ var fieldType;
391
+ if (descriptor.typeName && descriptor.typeName.length)
392
+ fieldType = descriptor.typeName;
393
+ else
394
+ fieldType = fromDescriptorType(descriptor.type);
395
+
396
+ // Rewire field rule
397
+ var fieldRule;
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);
404
+ }
405
+
406
+ var extendee = descriptor.extendee;
407
+ if (descriptor.extendee !== undefined) {
408
+ extendee = extendee.length ? extendee : undefined;
409
+ }
410
+ var field = new Field(
411
+ descriptor.name.length ? descriptor.name : "field" + descriptor.number,
412
+ descriptor.number,
413
+ fieldType,
414
+ fieldRule,
415
+ extendee
416
+ );
417
+
418
+ field.options = fromDescriptorOptions(descriptor.options, exports.FieldOptions);
419
+
420
+ if (descriptor.defaultValue && descriptor.defaultValue.length) {
421
+ var defaultValue = descriptor.defaultValue;
422
+ switch (defaultValue) {
423
+ case "true": case "TRUE":
424
+ defaultValue = true;
425
+ break;
426
+ case "false": case "FALSE":
427
+ defaultValue = false;
428
+ break;
429
+ default:
430
+ var match = numberRe.exec(defaultValue);
431
+ if (match)
432
+ defaultValue = parseInt(defaultValue); // eslint-disable-line radix
433
+ break;
434
+ }
435
+ field.setOption("default", defaultValue);
436
+ }
437
+
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);
444
+ }
445
+
446
+ return field;
447
+ };
448
+
449
+ /**
450
+ * Converts a field to a descriptor.
451
+ * @returns {Message<IFieldDescriptorProto>} Descriptor
452
+ * @param {string} [syntax="proto2"] Syntax
453
+ */
454
+ Field.prototype.toDescriptor = function toDescriptor(syntax) {
455
+ var descriptor = exports.FieldDescriptorProto.create({ name: this.name, number: this.id });
456
+
457
+ if (this.map) {
458
+
459
+ descriptor.type = 11; // message
460
+ descriptor.typeName = $protobuf.util.ucFirst(this.name); // fieldName -> FieldNameEntry (built in Type#toDescriptor)
461
+ descriptor.label = 3; // repeated
462
+
463
+ } else {
464
+
465
+ // Rewire field type
466
+ switch (descriptor.type = toDescriptorType(this.type, this.resolve().resolvedType)) {
467
+ case 10: // group
468
+ case 11: // type
469
+ case 14: // enum
470
+ descriptor.typeName = this.resolvedType ? shortname(this.parent, this.resolvedType) : this.type;
471
+ break;
472
+ }
473
+
474
+ // Rewire field rule
475
+ switch (this.rule) {
476
+ case "repeated": descriptor.label = 3; break;
477
+ case "required": descriptor.label = 2; break;
478
+ default: descriptor.label = 1; break;
479
+ }
480
+
481
+ }
482
+
483
+ // Handle extension field
484
+ descriptor.extendee = this.extensionField ? this.extensionField.parent.fullName : this.extend;
485
+
486
+ // Handle part of oneof
487
+ if (this.partOf)
488
+ if ((descriptor.oneofIndex = this.parent.oneofsArray.indexOf(this.partOf)) < 0)
489
+ throw Error("missing oneof");
490
+
491
+ if (this.options) {
492
+ descriptor.options = toDescriptorOptions(this.options, exports.FieldOptions);
493
+ if (this.options["default"] != null)
494
+ descriptor.defaultValue = String(this.options["default"]);
495
+ }
496
+
497
+ if (syntax === "proto3") { // defaults to packed=true
498
+ if (!this.packed)
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;
502
+
503
+ return descriptor;
504
+ };
505
+
506
+ // --- Enum ---
507
+
508
+ /**
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
514
+ */
515
+
516
+ /**
517
+ * Properties of an EnumValueDescriptorProto message.
518
+ * @interface IEnumValueDescriptorProto
519
+ * @property {string} [name] Name
520
+ * @property {number} [number] Value
521
+ * @property {*} [options] Not supported
522
+ */
523
+
524
+ /**
525
+ * Properties of an EnumOptions message.
526
+ * @interface IEnumOptions
527
+ * @property {boolean} [allowAlias] Whether aliases are allowed
528
+ * @property {boolean} [deprecated]
529
+ */
530
+
531
+ var unnamedEnumIndex = 0;
532
+
533
+ /**
534
+ * Creates an enum from a descriptor.
535
+ * @param {IEnumDescriptorProto|Reader|Uint8Array} descriptor Descriptor
536
+ * @returns {Enum} Enum instance
537
+ */
538
+ Enum.fromDescriptor = function fromDescriptor(descriptor) {
539
+
540
+ // Decode the descriptor message if specified as a buffer:
541
+ if (typeof descriptor.length === "number")
542
+ descriptor = exports.EnumDescriptorProto.decode(descriptor);
543
+
544
+ // Construct values object
545
+ var values = {};
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;
551
+ }
552
+
553
+ return new Enum(
554
+ descriptor.name && descriptor.name.length ? descriptor.name : "Enum" + unnamedEnumIndex++,
555
+ values,
556
+ fromDescriptorOptions(descriptor.options, exports.EnumOptions)
557
+ );
558
+ };
559
+
560
+ /**
561
+ * Converts an enum to a descriptor.
562
+ * @returns {Message<IEnumDescriptorProto>} Descriptor
563
+ */
564
+ Enum.prototype.toDescriptor = function toDescriptor() {
565
+
566
+ // Values
567
+ var values = [];
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]] }));
570
+
571
+ return exports.EnumDescriptorProto.create({
572
+ name: this.name,
573
+ value: values,
574
+ options: toDescriptorOptions(this.options, exports.EnumOptions)
575
+ });
576
+ };
577
+
578
+ // --- OneOf ---
579
+
580
+ /**
581
+ * Properties of a OneofDescriptorProto message.
582
+ * @interface IOneofDescriptorProto
583
+ * @property {string} [name] Oneof name
584
+ * @property {*} [options] Not supported
585
+ */
586
+
587
+ var unnamedOneofIndex = 0;
588
+
589
+ /**
590
+ * Creates a oneof from a descriptor.
591
+ * @param {IOneofDescriptorProto|Reader|Uint8Array} descriptor Descriptor
592
+ * @returns {OneOf} OneOf instance
593
+ */
594
+ OneOf.fromDescriptor = function fromDescriptor(descriptor) {
595
+
596
+ // Decode the descriptor message if specified as a buffer:
597
+ if (typeof descriptor.length === "number")
598
+ descriptor = exports.OneofDescriptorProto.decode(descriptor);
599
+
600
+ return new OneOf(
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
604
+ );
605
+ };
606
+
607
+ /**
608
+ * Converts a oneof to a descriptor.
609
+ * @returns {Message<IOneofDescriptorProto>} Descriptor
610
+ */
611
+ OneOf.prototype.toDescriptor = function toDescriptor() {
612
+ return exports.OneofDescriptorProto.create({
613
+ name: this.name
614
+ // options: toDescriptorOptions(this.options, exports.OneofOptions) - only uninterpreted_option
615
+ });
616
+ };
617
+
618
+ // --- Service ---
619
+
620
+ /**
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
626
+ */
627
+
628
+ /**
629
+ * Properties of a ServiceOptions message.
630
+ * @interface IServiceOptions
631
+ * @property {boolean} [deprecated]
632
+ */
633
+
634
+ var unnamedServiceIndex = 0;
635
+
636
+ /**
637
+ * Creates a service from a descriptor.
638
+ * @param {IServiceDescriptorProto|Reader|Uint8Array} descriptor Descriptor
639
+ * @returns {Service} Service instance
640
+ */
641
+ Service.fromDescriptor = function fromDescriptor(descriptor) {
642
+
643
+ // Decode the descriptor message if specified as a buffer:
644
+ if (typeof descriptor.length === "number")
645
+ descriptor = exports.ServiceDescriptorProto.decode(descriptor);
646
+
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]));
651
+
652
+ return service;
653
+ };
654
+
655
+ /**
656
+ * Converts a service to a descriptor.
657
+ * @returns {Message<IServiceDescriptorProto>} Descriptor
658
+ */
659
+ Service.prototype.toDescriptor = function toDescriptor() {
660
+
661
+ // Methods
662
+ var methods = [];
663
+ for (var i = 0; i < this.methodsArray; ++i)
664
+ methods.push(this._methodsArray[i].toDescriptor());
665
+
666
+ return exports.ServiceDescriptorProto.create({
667
+ name: this.name,
668
+ methods: methods,
669
+ options: toDescriptorOptions(this.options, exports.ServiceOptions)
670
+ });
671
+ };
672
+
673
+ // --- Method ---
674
+
675
+ /**
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
684
+ */
685
+
686
+ /**
687
+ * Properties of a MethodOptions message.
688
+ * @interface IMethodOptions
689
+ * @property {boolean} [deprecated]
690
+ */
691
+
692
+ var unnamedMethodIndex = 0;
693
+
694
+ /**
695
+ * Creates a method from a descriptor.
696
+ * @param {IMethodDescriptorProto|Reader|Uint8Array} descriptor Descriptor
697
+ * @returns {Method} Reflected method instance
698
+ */
699
+ Method.fromDescriptor = function fromDescriptor(descriptor) {
700
+
701
+ // Decode the descriptor message if specified as a buffer:
702
+ if (typeof descriptor.length === "number")
703
+ descriptor = exports.MethodDescriptorProto.decode(descriptor);
704
+
705
+ return new Method(
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++,
708
+ "rpc",
709
+ descriptor.inputType,
710
+ descriptor.outputType,
711
+ Boolean(descriptor.clientStreaming),
712
+ Boolean(descriptor.serverStreaming),
713
+ fromDescriptorOptions(descriptor.options, exports.MethodOptions)
714
+ );
715
+ };
716
+
717
+ /**
718
+ * Converts a method to a descriptor.
719
+ * @returns {Message<IMethodDescriptorProto>} Descriptor
720
+ */
721
+ Method.prototype.toDescriptor = function toDescriptor() {
722
+ return exports.MethodDescriptorProto.create({
723
+ name: this.name,
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)
729
+ });
730
+ };
731
+
732
+ // --- utility ---
733
+
734
+ // Converts a descriptor type to a protobuf.js basic type
735
+ function fromDescriptorType(type) {
736
+ switch (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";
753
+ }
754
+ throw Error("illegal type: " + type);
755
+ }
756
+
757
+ // Tests if a descriptor type is packable
758
+ function packableDescriptorType(type) {
759
+ switch (type) {
760
+ case 1: // double
761
+ case 2: // float
762
+ case 3: // int64
763
+ case 4: // uint64
764
+ case 5: // int32
765
+ case 6: // fixed64
766
+ case 7: // fixed32
767
+ case 8: // bool
768
+ case 13: // uint32
769
+ case 14: // enum (!)
770
+ case 15: // sfixed32
771
+ case 16: // sfixed64
772
+ case 17: // sint32
773
+ case 18: // sint64
774
+ return true;
775
+ }
776
+ return false;
777
+ }
778
+
779
+ // Converts a protobuf.js basic type to a descriptor type
780
+ function toDescriptorType(type, resolvedType) {
781
+ switch (type) {
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;
798
+ }
799
+ if (resolvedType instanceof Enum)
800
+ return 14;
801
+ if (resolvedType instanceof Type)
802
+ return resolvedType.group ? 10 : 11;
803
+ throw Error("illegal type: " + type);
804
+ }
805
+
806
+ // Converts descriptor options to an options object
807
+ function fromDescriptorOptions(options, type) {
808
+ if (!options)
809
+ return undefined;
810
+ var out = [];
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
814
+ val = options[key];
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);
818
+ }
819
+ return out.length ? $protobuf.util.toObject(out) : undefined;
820
+ }
821
+
822
+ // Converts an options object to descriptor options
823
+ function toDescriptorOptions(options, type) {
824
+ if (!options)
825
+ return undefined;
826
+ var out = [];
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")
830
+ continue;
831
+ var field = type.fields[key];
832
+ if (!field && !(field = type.fields[key = $protobuf.util.camelCase(key)]))
833
+ continue;
834
+ out.push(key, val);
835
+ }
836
+ return out.length ? type.fromObject($protobuf.util.toObject(out)) : undefined;
837
+ }
838
+
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("."),
843
+ i = 0,
844
+ j = 0,
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)
850
+ break;
851
+ ++j;
852
+ }
853
+ else
854
+ for (; i < fromPath.length && j < k && fromPath[i] === toPath[j]; ++i, ++j);
855
+ return toPath.slice(j).join(".");
856
+ }
857
+
858
+ // copied here from cli/targets/proto.js
859
+ function underScore(str) {
860
+ return str.substring(0,1)
861
+ + str.substring(1)
862
+ .replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { return "_" + $1.toLowerCase(); });
863
+ }
864
+
865
+ // --- exports ---
866
+
867
+ /**
868
+ * Reflected file descriptor set.
869
+ * @name FileDescriptorSet
870
+ * @type {Type}
871
+ * @const
872
+ * @tstype $protobuf.Type
873
+ */
874
+
875
+ /**
876
+ * Reflected file descriptor proto.
877
+ * @name FileDescriptorProto
878
+ * @type {Type}
879
+ * @const
880
+ * @tstype $protobuf.Type
881
+ */
882
+
883
+ /**
884
+ * Reflected descriptor proto.
885
+ * @name DescriptorProto
886
+ * @type {Type}
887
+ * @property {Type} ExtensionRange
888
+ * @property {Type} ReservedRange
889
+ * @const
890
+ * @tstype $protobuf.Type & {
891
+ * ExtensionRange: $protobuf.Type,
892
+ * ReservedRange: $protobuf.Type
893
+ * }
894
+ */
895
+
896
+ /**
897
+ * Reflected field descriptor proto.
898
+ * @name FieldDescriptorProto
899
+ * @type {Type}
900
+ * @property {Enum} Label
901
+ * @property {Enum} Type
902
+ * @const
903
+ * @tstype $protobuf.Type & {
904
+ * Label: $protobuf.Enum,
905
+ * Type: $protobuf.Enum
906
+ * }
907
+ */
908
+
909
+ /**
910
+ * Reflected oneof descriptor proto.
911
+ * @name OneofDescriptorProto
912
+ * @type {Type}
913
+ * @const
914
+ * @tstype $protobuf.Type
915
+ */
916
+
917
+ /**
918
+ * Reflected enum descriptor proto.
919
+ * @name EnumDescriptorProto
920
+ * @type {Type}
921
+ * @const
922
+ * @tstype $protobuf.Type
923
+ */
924
+
925
+ /**
926
+ * Reflected service descriptor proto.
927
+ * @name ServiceDescriptorProto
928
+ * @type {Type}
929
+ * @const
930
+ * @tstype $protobuf.Type
931
+ */
932
+
933
+ /**
934
+ * Reflected enum value descriptor proto.
935
+ * @name EnumValueDescriptorProto
936
+ * @type {Type}
937
+ * @const
938
+ * @tstype $protobuf.Type
939
+ */
940
+
941
+ /**
942
+ * Reflected method descriptor proto.
943
+ * @name MethodDescriptorProto
944
+ * @type {Type}
945
+ * @const
946
+ * @tstype $protobuf.Type
947
+ */
948
+
949
+ /**
950
+ * Reflected file options.
951
+ * @name FileOptions
952
+ * @type {Type}
953
+ * @property {Enum} OptimizeMode
954
+ * @const
955
+ * @tstype $protobuf.Type & {
956
+ * OptimizeMode: $protobuf.Enum
957
+ * }
958
+ */
959
+
960
+ /**
961
+ * Reflected message options.
962
+ * @name MessageOptions
963
+ * @type {Type}
964
+ * @const
965
+ * @tstype $protobuf.Type
966
+ */
967
+
968
+ /**
969
+ * Reflected field options.
970
+ * @name FieldOptions
971
+ * @type {Type}
972
+ * @property {Enum} CType
973
+ * @property {Enum} JSType
974
+ * @const
975
+ * @tstype $protobuf.Type & {
976
+ * CType: $protobuf.Enum,
977
+ * JSType: $protobuf.Enum
978
+ * }
979
+ */
980
+
981
+ /**
982
+ * Reflected oneof options.
983
+ * @name OneofOptions
984
+ * @type {Type}
985
+ * @const
986
+ * @tstype $protobuf.Type
987
+ */
988
+
989
+ /**
990
+ * Reflected enum options.
991
+ * @name EnumOptions
992
+ * @type {Type}
993
+ * @const
994
+ * @tstype $protobuf.Type
995
+ */
996
+
997
+ /**
998
+ * Reflected enum value options.
999
+ * @name EnumValueOptions
1000
+ * @type {Type}
1001
+ * @const
1002
+ * @tstype $protobuf.Type
1003
+ */
1004
+
1005
+ /**
1006
+ * Reflected service options.
1007
+ * @name ServiceOptions
1008
+ * @type {Type}
1009
+ * @const
1010
+ * @tstype $protobuf.Type
1011
+ */
1012
+
1013
+ /**
1014
+ * Reflected method options.
1015
+ * @name MethodOptions
1016
+ * @type {Type}
1017
+ * @const
1018
+ * @tstype $protobuf.Type
1019
+ */
1020
+
1021
+ /**
1022
+ * Reflected uninterpretet option.
1023
+ * @name UninterpretedOption
1024
+ * @type {Type}
1025
+ * @property {Type} NamePart
1026
+ * @const
1027
+ * @tstype $protobuf.Type & {
1028
+ * NamePart: $protobuf.Type
1029
+ * }
1030
+ */
1031
+
1032
+ /**
1033
+ * Reflected source code info.
1034
+ * @name SourceCodeInfo
1035
+ * @type {Type}
1036
+ * @property {Type} Location
1037
+ * @const
1038
+ * @tstype $protobuf.Type & {
1039
+ * Location: $protobuf.Type
1040
+ * }
1041
+ */
1042
+
1043
+ /**
1044
+ * Reflected generated code info.
1045
+ * @name GeneratedCodeInfo
1046
+ * @type {Type}
1047
+ * @property {Type} Annotation
1048
+ * @const
1049
+ * @tstype $protobuf.Type & {
1050
+ * Annotation: $protobuf.Type
1051
+ * }
1052
+ */