protobufjs 8.0.3-experimental → 8.0.3

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