protobufjs 8.6.2 → 8.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +441 -441
  3. package/dist/light/protobuf.js +8575 -8454
  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 +3064 -2999
  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 +10479 -10358
  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 -87
  22. package/ext/descriptor.js +1354 -1354
  23. package/ext/protojson.LICENSE +201 -201
  24. package/ext/protojson.d.ts +20 -20
  25. package/ext/protojson.js +925 -925
  26. package/ext/textformat.d.ts +19 -19
  27. package/ext/textformat.js +1256 -1256
  28. package/google/LICENSE +27 -27
  29. package/google/README.md +1 -1
  30. package/google/api/annotations.json +82 -82
  31. package/google/api/annotations.proto +10 -10
  32. package/google/api/http.json +85 -85
  33. package/google/api/http.proto +30 -30
  34. package/google/protobuf/api.json +117 -117
  35. package/google/protobuf/api.proto +33 -33
  36. package/google/protobuf/compiler/plugin.json +126 -126
  37. package/google/protobuf/compiler/plugin.proto +47 -47
  38. package/google/protobuf/descriptor.json +1381 -1381
  39. package/google/protobuf/descriptor.proto +534 -534
  40. package/google/protobuf/source_context.json +19 -19
  41. package/google/protobuf/source_context.proto +7 -7
  42. package/google/protobuf/type.json +201 -201
  43. package/google/protobuf/type.proto +89 -89
  44. package/index.d.ts +30 -0
  45. package/index.js +4 -4
  46. package/light.d.ts +2 -2
  47. package/light.js +3 -3
  48. package/minimal.d.ts +2 -2
  49. package/minimal.js +4 -4
  50. package/package.json +93 -93
  51. package/src/common.js +399 -399
  52. package/src/converter.js +344 -344
  53. package/src/decoder.js +214 -208
  54. package/src/encoder.js +111 -111
  55. package/src/enum.js +231 -231
  56. package/src/field.js +497 -497
  57. package/src/index-light.js +104 -104
  58. package/src/index-minimal.js +35 -36
  59. package/src/index.js +12 -12
  60. package/src/mapfield.js +136 -136
  61. package/src/message.js +137 -137
  62. package/src/method.js +175 -175
  63. package/src/namespace.js +566 -565
  64. package/src/object.js +382 -382
  65. package/src/oneof.js +225 -225
  66. package/src/parse.js +1068 -1068
  67. package/src/reader.js +558 -543
  68. package/src/reader_buffer.js +72 -72
  69. package/src/root.js +416 -416
  70. package/src/roots.js +18 -18
  71. package/src/rpc/service.js +148 -148
  72. package/src/rpc.js +36 -36
  73. package/src/service.js +198 -198
  74. package/src/tokenize.js +421 -421
  75. package/src/type.js +654 -655
  76. package/src/types.js +196 -196
  77. package/src/typescript.js +25 -25
  78. package/src/util/aspromise.d.ts +13 -13
  79. package/src/util/aspromise.js +52 -52
  80. package/src/util/base64.d.ts +32 -32
  81. package/src/util/base64.js +146 -146
  82. package/src/util/codegen.d.ts +31 -31
  83. package/src/util/codegen.js +113 -113
  84. package/src/util/eventemitter.d.ts +45 -45
  85. package/src/util/eventemitter.js +86 -86
  86. package/src/util/fetch.d.ts +56 -56
  87. package/src/util/fetch.js +112 -112
  88. package/src/util/float.d.ts +83 -83
  89. package/src/util/float.js +335 -335
  90. package/src/util/fs.js +11 -11
  91. package/src/util/longbits.js +200 -200
  92. package/src/util/minimal.js +515 -515
  93. package/src/util/path.d.ts +22 -22
  94. package/src/util/path.js +100 -72
  95. package/src/util/patterns.js +7 -7
  96. package/src/util/pool.d.ts +32 -32
  97. package/src/util/pool.js +48 -48
  98. package/src/util/utf8.d.ts +24 -24
  99. package/src/util/utf8.js +181 -130
  100. package/src/util.js +264 -242
  101. package/src/verifier.js +180 -180
  102. package/src/wrappers.js +106 -106
  103. package/src/writer.js +495 -495
  104. package/src/writer_buffer.js +102 -102
  105. package/tsconfig.json +6 -6
package/ext/descriptor.js CHANGED
@@ -1,1354 +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
- * 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
- */
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
+ */