protobufjs 8.6.0 → 8.6.2

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