@bufbuild/protobuf 2.11.0 → 2.12.1

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 (198) hide show
  1. package/README.md +3 -3
  2. package/dist/commonjs/codegenv1/boot.d.ts +1 -0
  3. package/dist/{cjs/codegenv1/types.js → commonjs/codegenv1/boot.js} +3 -7
  4. package/dist/{cjs → commonjs}/codegenv1/types.d.ts +9 -5
  5. package/dist/{cjs → commonjs}/codegenv2/types.d.ts +9 -5
  6. package/dist/{cjs → commonjs}/descriptors.d.ts +12 -5
  7. package/dist/{cjs → commonjs}/equals.d.ts +8 -3
  8. package/dist/{cjs → commonjs}/equals.js +8 -3
  9. package/dist/{cjs → commonjs}/extensions.d.ts +2 -1
  10. package/dist/{cjs → commonjs}/extensions.js +3 -4
  11. package/dist/{cjs → commonjs}/from-binary.d.ts +16 -2
  12. package/dist/{cjs → commonjs}/from-binary.js +37 -31
  13. package/dist/{cjs → commonjs}/from-json.d.ts +20 -3
  14. package/dist/{cjs → commonjs}/from-json.js +175 -55
  15. package/dist/commonjs/json-value.js +15 -0
  16. package/dist/commonjs/package.json +4 -0
  17. package/dist/{cjs → commonjs}/proto-int64.js +1 -0
  18. package/dist/{cjs → commonjs}/reflect/path.d.ts +1 -1
  19. package/dist/{cjs → commonjs}/reflect/reflect-check.js +3 -1
  20. package/dist/commonjs/reflect/scalar.d.ts +43 -0
  21. package/dist/{cjs → commonjs}/reflect/scalar.js +33 -6
  22. package/dist/{cjs → commonjs}/registry.js +24 -1
  23. package/dist/{cjs → commonjs}/to-json.d.ts +1 -1
  24. package/dist/{cjs → commonjs}/to-json.js +9 -10
  25. package/dist/{cjs → commonjs}/types.d.ts +1 -1
  26. package/dist/{cjs/codegenv2 → commonjs}/types.js +0 -7
  27. package/dist/{cjs → commonjs}/wire/binary-encoding.d.ts +13 -9
  28. package/dist/{cjs → commonjs}/wire/binary-encoding.js +26 -11
  29. package/dist/{cjs → commonjs}/wire/size-delimited.d.ts +1 -1
  30. package/dist/{cjs → commonjs}/wire/text-encoding.d.ts +4 -2
  31. package/dist/{cjs → commonjs}/wire/text-encoding.js +8 -1
  32. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  33. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  34. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  35. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  36. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  37. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  38. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/go_features_pb.js +38 -2
  39. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  40. package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  41. package/dist/{cjs → commonjs}/wkt/wrappers.d.ts +10 -0
  42. package/dist/{cjs → commonjs}/wkt/wrappers.js +24 -0
  43. package/dist/esm/codegenv1/boot.d.ts +1 -0
  44. package/dist/esm/codegenv1/boot.js +14 -0
  45. package/dist/esm/codegenv1/types.d.ts +9 -5
  46. package/dist/esm/codegenv1/types.js +0 -7
  47. package/dist/esm/codegenv2/types.d.ts +9 -5
  48. package/dist/esm/codegenv2/types.js +0 -7
  49. package/dist/esm/descriptors.d.ts +12 -5
  50. package/dist/esm/equals.d.ts +8 -3
  51. package/dist/esm/equals.js +8 -3
  52. package/dist/esm/extensions.d.ts +2 -1
  53. package/dist/esm/extensions.js +4 -5
  54. package/dist/esm/from-binary.d.ts +16 -2
  55. package/dist/esm/from-binary.js +36 -31
  56. package/dist/esm/from-json.d.ts +20 -3
  57. package/dist/esm/from-json.js +176 -56
  58. package/dist/esm/package.json +4 -0
  59. package/dist/esm/proto-int64.js +1 -0
  60. package/dist/esm/reflect/path.d.ts +1 -1
  61. package/dist/esm/reflect/reflect-check.js +3 -1
  62. package/dist/esm/reflect/scalar.d.ts +27 -5
  63. package/dist/esm/reflect/scalar.js +33 -6
  64. package/dist/esm/registry.js +24 -1
  65. package/dist/esm/to-json.d.ts +1 -1
  66. package/dist/esm/to-json.js +10 -11
  67. package/dist/esm/types.d.ts +1 -1
  68. package/dist/esm/wire/binary-encoding.d.ts +13 -9
  69. package/dist/esm/wire/binary-encoding.js +26 -11
  70. package/dist/esm/wire/size-delimited.d.ts +1 -1
  71. package/dist/esm/wire/text-encoding.d.ts +4 -2
  72. package/dist/esm/wire/text-encoding.js +8 -1
  73. package/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
  74. package/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
  75. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
  76. package/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
  77. package/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
  78. package/dist/esm/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
  79. package/dist/esm/wkt/gen/google/protobuf/go_features_pb.js +37 -1
  80. package/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
  81. package/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
  82. package/dist/esm/wkt/wrappers.d.ts +10 -0
  83. package/dist/esm/wkt/wrappers.js +23 -0
  84. package/package.json +97 -31
  85. package/dist/cjs/package.json +0 -1
  86. package/dist/cjs/reflect/scalar.d.ts +0 -21
  87. /package/dist/{cjs → commonjs}/clone.d.ts +0 -0
  88. /package/dist/{cjs → commonjs}/clone.js +0 -0
  89. /package/dist/{cjs → commonjs}/codegenv1/enum.d.ts +0 -0
  90. /package/dist/{cjs → commonjs}/codegenv1/enum.js +0 -0
  91. /package/dist/{cjs → commonjs}/codegenv1/extension.d.ts +0 -0
  92. /package/dist/{cjs → commonjs}/codegenv1/extension.js +0 -0
  93. /package/dist/{cjs → commonjs}/codegenv1/file.d.ts +0 -0
  94. /package/dist/{cjs → commonjs}/codegenv1/file.js +0 -0
  95. /package/dist/{cjs → commonjs}/codegenv1/index.d.ts +0 -0
  96. /package/dist/{cjs → commonjs}/codegenv1/index.js +0 -0
  97. /package/dist/{cjs → commonjs}/codegenv1/message.d.ts +0 -0
  98. /package/dist/{cjs → commonjs}/codegenv1/message.js +0 -0
  99. /package/dist/{cjs → commonjs}/codegenv1/service.d.ts +0 -0
  100. /package/dist/{cjs → commonjs}/codegenv1/service.js +0 -0
  101. /package/dist/{cjs → commonjs}/codegenv1/symbols.d.ts +0 -0
  102. /package/dist/{cjs → commonjs}/codegenv1/symbols.js +0 -0
  103. /package/dist/{cjs → commonjs/codegenv1}/types.js +0 -0
  104. /package/dist/{cjs → commonjs}/codegenv2/boot.d.ts +0 -0
  105. /package/dist/{cjs → commonjs}/codegenv2/boot.js +0 -0
  106. /package/dist/{cjs → commonjs}/codegenv2/embed.d.ts +0 -0
  107. /package/dist/{cjs → commonjs}/codegenv2/embed.js +0 -0
  108. /package/dist/{cjs → commonjs}/codegenv2/enum.d.ts +0 -0
  109. /package/dist/{cjs → commonjs}/codegenv2/enum.js +0 -0
  110. /package/dist/{cjs → commonjs}/codegenv2/extension.d.ts +0 -0
  111. /package/dist/{cjs → commonjs}/codegenv2/extension.js +0 -0
  112. /package/dist/{cjs → commonjs}/codegenv2/file.d.ts +0 -0
  113. /package/dist/{cjs → commonjs}/codegenv2/file.js +0 -0
  114. /package/dist/{cjs → commonjs}/codegenv2/index.d.ts +0 -0
  115. /package/dist/{cjs → commonjs}/codegenv2/index.js +0 -0
  116. /package/dist/{cjs → commonjs}/codegenv2/message.d.ts +0 -0
  117. /package/dist/{cjs → commonjs}/codegenv2/message.js +0 -0
  118. /package/dist/{cjs → commonjs}/codegenv2/restore-json-names.d.ts +0 -0
  119. /package/dist/{cjs → commonjs}/codegenv2/restore-json-names.js +0 -0
  120. /package/dist/{cjs → commonjs}/codegenv2/scalar.d.ts +0 -0
  121. /package/dist/{cjs → commonjs}/codegenv2/scalar.js +0 -0
  122. /package/dist/{cjs → commonjs}/codegenv2/service.d.ts +0 -0
  123. /package/dist/{cjs → commonjs}/codegenv2/service.js +0 -0
  124. /package/dist/{cjs → commonjs}/codegenv2/symbols.d.ts +0 -0
  125. /package/dist/{cjs → commonjs}/codegenv2/symbols.js +0 -0
  126. /package/dist/{cjs/json-value.js → commonjs/codegenv2/types.js} +0 -0
  127. /package/dist/{cjs → commonjs}/create.d.ts +0 -0
  128. /package/dist/{cjs → commonjs}/create.js +0 -0
  129. /package/dist/{cjs → commonjs}/descriptors.js +0 -0
  130. /package/dist/{cjs → commonjs}/fields.d.ts +0 -0
  131. /package/dist/{cjs → commonjs}/fields.js +0 -0
  132. /package/dist/{cjs → commonjs}/index.d.ts +0 -0
  133. /package/dist/{cjs → commonjs}/index.js +0 -0
  134. /package/dist/{cjs → commonjs}/is-message.d.ts +0 -0
  135. /package/dist/{cjs → commonjs}/is-message.js +0 -0
  136. /package/dist/{cjs → commonjs}/json-value.d.ts +0 -0
  137. /package/dist/{cjs → commonjs}/merge.d.ts +0 -0
  138. /package/dist/{cjs → commonjs}/merge.js +0 -0
  139. /package/dist/{cjs → commonjs}/proto-int64.d.ts +0 -0
  140. /package/dist/{cjs → commonjs}/reflect/error.d.ts +0 -0
  141. /package/dist/{cjs → commonjs}/reflect/error.js +0 -0
  142. /package/dist/{cjs → commonjs}/reflect/guard.d.ts +0 -0
  143. /package/dist/{cjs → commonjs}/reflect/guard.js +0 -0
  144. /package/dist/{cjs → commonjs}/reflect/index.d.ts +0 -0
  145. /package/dist/{cjs → commonjs}/reflect/index.js +0 -0
  146. /package/dist/{cjs → commonjs}/reflect/names.d.ts +0 -0
  147. /package/dist/{cjs → commonjs}/reflect/names.js +0 -0
  148. /package/dist/{cjs → commonjs}/reflect/nested-types.d.ts +0 -0
  149. /package/dist/{cjs → commonjs}/reflect/nested-types.js +0 -0
  150. /package/dist/{cjs → commonjs}/reflect/path.js +0 -0
  151. /package/dist/{cjs → commonjs}/reflect/reflect-check.d.ts +0 -0
  152. /package/dist/{cjs → commonjs}/reflect/reflect-types.d.ts +0 -0
  153. /package/dist/{cjs → commonjs}/reflect/reflect-types.js +0 -0
  154. /package/dist/{cjs → commonjs}/reflect/reflect.d.ts +0 -0
  155. /package/dist/{cjs → commonjs}/reflect/reflect.js +0 -0
  156. /package/dist/{cjs → commonjs}/reflect/unsafe.d.ts +0 -0
  157. /package/dist/{cjs → commonjs}/reflect/unsafe.js +0 -0
  158. /package/dist/{cjs → commonjs}/registry.d.ts +0 -0
  159. /package/dist/{cjs → commonjs}/to-binary.d.ts +0 -0
  160. /package/dist/{cjs → commonjs}/to-binary.js +0 -0
  161. /package/dist/{cjs → commonjs}/wire/base64-encoding.d.ts +0 -0
  162. /package/dist/{cjs → commonjs}/wire/base64-encoding.js +0 -0
  163. /package/dist/{cjs → commonjs}/wire/index.d.ts +0 -0
  164. /package/dist/{cjs → commonjs}/wire/index.js +0 -0
  165. /package/dist/{cjs → commonjs}/wire/size-delimited.js +0 -0
  166. /package/dist/{cjs → commonjs}/wire/text-format.d.ts +0 -0
  167. /package/dist/{cjs → commonjs}/wire/text-format.js +0 -0
  168. /package/dist/{cjs → commonjs}/wire/varint.d.ts +0 -0
  169. /package/dist/{cjs → commonjs}/wire/varint.js +0 -0
  170. /package/dist/{cjs → commonjs}/wkt/any.d.ts +0 -0
  171. /package/dist/{cjs → commonjs}/wkt/any.js +0 -0
  172. /package/dist/{cjs → commonjs}/wkt/duration.d.ts +0 -0
  173. /package/dist/{cjs → commonjs}/wkt/duration.js +0 -0
  174. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/any_pb.d.ts +0 -0
  175. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/any_pb.js +0 -0
  176. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/api_pb.js +0 -0
  177. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/compiler/plugin_pb.js +0 -0
  178. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/cpp_features_pb.d.ts +0 -0
  179. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/cpp_features_pb.js +0 -0
  180. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/duration_pb.d.ts +0 -0
  181. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/duration_pb.js +0 -0
  182. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/empty_pb.d.ts +0 -0
  183. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/empty_pb.js +0 -0
  184. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/field_mask_pb.js +0 -0
  185. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/java_features_pb.d.ts +0 -0
  186. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/java_features_pb.js +0 -0
  187. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/source_context_pb.d.ts +0 -0
  188. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/source_context_pb.js +0 -0
  189. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/struct_pb.d.ts +0 -0
  190. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/struct_pb.js +0 -0
  191. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/timestamp_pb.js +0 -0
  192. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/type_pb.js +0 -0
  193. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/wrappers_pb.d.ts +0 -0
  194. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/wrappers_pb.js +0 -0
  195. /package/dist/{cjs → commonjs}/wkt/index.d.ts +0 -0
  196. /package/dist/{cjs → commonjs}/wkt/index.js +0 -0
  197. /package/dist/{cjs → commonjs}/wkt/timestamp.d.ts +0 -0
  198. /package/dist/{cjs → commonjs}/wkt/timestamp.js +0 -0
@@ -11,11 +11,4 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- class brandv2 {
15
- constructor() {
16
- this.v = "codegenv2";
17
- this.a = false;
18
- this.b = false;
19
- }
20
- }
21
14
  export {};
@@ -114,7 +114,7 @@ export interface DescEnum {
114
114
  * A prefix shared by all enum values.
115
115
  * For example, `my_enum_` for `enum MyEnum {MY_ENUM_A=0; MY_ENUM_B=1;}`
116
116
  */
117
- readonly sharedPrefix?: string;
117
+ readonly sharedPrefix?: string | undefined;
118
118
  /**
119
119
  * Marked as deprecated in the protobuf source.
120
120
  */
@@ -192,8 +192,8 @@ export interface DescMessage {
192
192
  */
193
193
  readonly oneofs: DescOneof[];
194
194
  /**
195
- * Fields and oneof groups for this message, ordered by their appearance in the
196
- * protobuf source.
195
+ * Standalone fields and oneof groups for this message, ordered by
196
+ * their appearance in the protobuf source.
197
197
  */
198
198
  readonly members: (DescField | DescOneof)[];
199
199
  /**
@@ -283,6 +283,13 @@ interface descFieldAndExtensionShared {
283
283
  * See https://protobuf.dev/programming-guides/field_presence/
284
284
  */
285
285
  readonly presence: SupportedFieldPresence;
286
+ /**
287
+ * Whether to reject invalid UTF-8 when reading this field from the binary
288
+ * wire format. Reflects the resolved `utf8_validation` feature: true for
289
+ * VERIFY (proto3 and editions 2023+ default), false for NONE (proto2
290
+ * default).
291
+ */
292
+ readonly utf8Validation: boolean;
286
293
  /**
287
294
  * The compiler-generated descriptor.
288
295
  */
@@ -620,8 +627,8 @@ export interface DescMethod {
620
627
  */
621
628
  export interface DescComments {
622
629
  readonly leadingDetached: readonly string[];
623
- readonly leading?: string;
624
- readonly trailing?: string;
630
+ readonly leading?: string | undefined;
631
+ readonly trailing?: string | undefined;
625
632
  readonly sourcePath: readonly number[];
626
633
  }
627
634
  export {};
@@ -32,10 +32,15 @@ interface EqualsOptions {
32
32
  unknown?: boolean;
33
33
  }
34
34
  /**
35
- * Compare two messages of the same type.
35
+ * Compare two messages of the same type for equality.
36
36
  *
37
- * Note that this function disregards extensions and unknown fields, and that
38
- * NaN is not equal NaN, following the IEEE standard.
37
+ * Fields are compared one by one, but only when set: a field set in one message
38
+ * but not the other makes them unequal, while fields set in both are compared
39
+ * by value. Extensions and unknown fields are disregarded by default.
40
+ *
41
+ * Float and double values are compared with IEEE semantics: NaN does not equal
42
+ * NaN, and -0 equals 0 (with the exception for singular fields with implicit
43
+ * presence: -0 is set, +0 is unset).
39
44
  */
40
45
  export declare function equals<Desc extends DescMessage>(schema: Desc, a: MessageShape<Desc>, b: MessageShape<Desc>, options?: EqualsOptions): boolean;
41
46
  export {};
@@ -17,10 +17,15 @@ import { ScalarType, } from "./descriptors.js";
17
17
  import { anyUnpack } from "./wkt/index.js";
18
18
  import { createExtensionContainer, getExtension } from "./extensions.js";
19
19
  /**
20
- * Compare two messages of the same type.
20
+ * Compare two messages of the same type for equality.
21
21
  *
22
- * Note that this function disregards extensions and unknown fields, and that
23
- * NaN is not equal NaN, following the IEEE standard.
22
+ * Fields are compared one by one, but only when set: a field set in one message
23
+ * but not the other makes them unequal, while fields set in both are compared
24
+ * by value. Extensions and unknown fields are disregarded by default.
25
+ *
26
+ * Float and double values are compared with IEEE semantics: NaN does not equal
27
+ * NaN, and -0 equals 0 (with the exception for singular fields with implicit
28
+ * presence: -0 is set, +0 is unset).
24
29
  */
25
30
  export function equals(schema, a, b, options) {
26
31
  if (a.$typeName != schema.typeName || b.$typeName != schema.typeName) {
@@ -1,4 +1,5 @@
1
1
  import type { AnyDesc, DescEnum, DescEnumValue, DescExtension, DescField, DescFile, DescMessage, DescMethod, DescOneof, DescService } from "./descriptors.js";
2
+ import type { BinaryReadOptions } from "./from-binary.js";
2
3
  import type { ReflectMessage } from "./reflect/reflect-types.js";
3
4
  import type { Extendee, ExtensionValueShape } from "./types.js";
4
5
  import type { EnumOptions, EnumValueOptions, FieldOptions, FileOptions, MessageOptions, MethodOptions, OneofOptions, ServiceOptions } from "./wkt/gen/google/protobuf/descriptor_pb.js";
@@ -16,7 +17,7 @@ import type { EnumOptions, EnumValueOptions, FieldOptions, FileOptions, MessageO
16
17
  *
17
18
  * If the extension does not extend the given message, an error is raised.
18
19
  */
19
- export declare function getExtension<Desc extends DescExtension>(message: Extendee<Desc>, extension: Desc): ExtensionValueShape<Desc>;
20
+ export declare function getExtension<Desc extends DescExtension>(message: Extendee<Desc>, extension: Desc, options?: Partial<BinaryReadOptions>): ExtensionValueShape<Desc>;
20
21
  /**
21
22
  * Set an extension value on a message. If the message already has a value for
22
23
  * this extension, the value is replaced.
@@ -12,7 +12,7 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
  import { create } from "./create.js";
15
- import { readField } from "./from-binary.js";
15
+ import { makeReadContext, readField } from "./from-binary.js";
16
16
  import { reflect } from "./reflect/reflect.js";
17
17
  import { scalarZeroValue } from "./reflect/scalar.js";
18
18
  import { writeField } from "./to-binary.js";
@@ -32,14 +32,13 @@ import { isWrapperDesc } from "./wkt/wrappers.js";
32
32
  *
33
33
  * If the extension does not extend the given message, an error is raised.
34
34
  */
35
- export function getExtension(message, extension) {
35
+ export function getExtension(message, extension, options) {
36
36
  assertExtendee(extension, message);
37
37
  const ufs = filterUnknownFields(message.$unknown, extension);
38
38
  const [container, field, get] = createExtensionContainer(extension);
39
+ const ctx = makeReadContext(options);
39
40
  for (const uf of ufs) {
40
- readField(container, new BinaryReader(uf.data), field, uf.wireType, {
41
- readUnknownFields: true,
42
- });
41
+ readField(container, new BinaryReader(uf.data), field, uf.wireType, ctx);
43
42
  }
44
43
  return get();
45
44
  }
@@ -13,7 +13,20 @@ export interface BinaryReadOptions {
13
13
  * For more details see https://developers.google.com/protocol-buffers/docs/proto3#unknowns
14
14
  */
15
15
  readUnknownFields: boolean;
16
+ /**
17
+ * The maximum depth of nested messages to parse. If a message nests deeper
18
+ * than this limit, parsing fails with an error instead of exhausting the
19
+ * call stack. Defaults to 100.
20
+ */
21
+ recursionLimit: number;
22
+ }
23
+ interface BinaryReadContext extends BinaryReadOptions {
24
+ depth: number;
16
25
  }
26
+ /**
27
+ * @private Only exported for getExtension()
28
+ */
29
+ export declare function makeReadContext(options?: Partial<BinaryReadOptions>): BinaryReadContext;
17
30
  /**
18
31
  * Parse serialized binary data.
19
32
  */
@@ -29,6 +42,7 @@ export declare function fromBinary<Desc extends DescMessage>(schema: Desc, bytes
29
42
  */
30
43
  export declare function mergeFromBinary<Desc extends DescMessage>(schema: Desc, target: MessageShape<Desc>, bytes: Uint8Array, options?: Partial<BinaryReadOptions>): MessageShape<Desc>;
31
44
  /**
32
- * @private
45
+ * @private Only exported for getExtension()
33
46
  */
34
- export declare function readField(message: ReflectMessage, reader: BinaryReader, field: DescField, wireType: WireType, options: BinaryReadOptions): void;
47
+ export declare function readField(message: ReflectMessage, reader: BinaryReader, field: DescField, wireType: WireType, ctx: BinaryReadContext): void;
48
+ export {};
@@ -16,19 +16,18 @@ import { scalarZeroValue } from "./reflect/scalar.js";
16
16
  import { reflect } from "./reflect/reflect.js";
17
17
  import { BinaryReader, WireType } from "./wire/binary-encoding.js";
18
18
  import { varint32write } from "./wire/varint.js";
19
- // Default options for parsing binary data.
20
- const readDefaults = {
21
- readUnknownFields: true,
22
- };
23
- function makeReadOptions(options) {
24
- return options ? Object.assign(Object.assign({}, readDefaults), options) : readDefaults;
19
+ /**
20
+ * @private Only exported for getExtension()
21
+ */
22
+ export function makeReadContext(options) {
23
+ return Object.assign(Object.assign({ readUnknownFields: true, recursionLimit: 100 }, options), { depth: 0 });
25
24
  }
26
25
  /**
27
26
  * Parse serialized binary data.
28
27
  */
29
28
  export function fromBinary(schema, bytes, options) {
30
29
  const msg = reflect(schema, undefined, false);
31
- readMessage(msg, new BinaryReader(bytes), makeReadOptions(options), false, bytes.byteLength);
30
+ readMessage(msg, new BinaryReader(bytes), makeReadContext(options), false, bytes.byteLength);
32
31
  return msg.message;
33
32
  }
34
33
  /**
@@ -41,7 +40,7 @@ export function fromBinary(schema, bytes, options) {
41
40
  * new data.
42
41
  */
43
42
  export function mergeFromBinary(schema, target, bytes, options) {
44
- readMessage(reflect(schema, target, false), new BinaryReader(bytes), makeReadOptions(options), false, bytes.byteLength);
43
+ readMessage(reflect(schema, target, false), new BinaryReader(bytes), makeReadContext(options), false, bytes.byteLength);
45
44
  return target;
46
45
  }
47
46
  /**
@@ -52,8 +51,11 @@ export function mergeFromBinary(schema, target, bytes, options) {
52
51
  *
53
52
  * @private
54
53
  */
55
- function readMessage(message, reader, options, delimited, lengthOrDelimitedFieldNo) {
54
+ function readMessage(message, reader, ctx, delimited, lengthOrDelimitedFieldNo) {
56
55
  var _a;
56
+ if (++ctx.depth > ctx.recursionLimit) {
57
+ throw new Error(`cannot decode ${message.desc} from binary: maximum recursion depth of ${ctx.recursionLimit} reached`);
58
+ }
57
59
  const end = delimited ? reader.len : reader.pos + lengthOrDelimitedFieldNo;
58
60
  let fieldNo;
59
61
  let wireType;
@@ -65,13 +67,15 @@ function readMessage(message, reader, options, delimited, lengthOrDelimitedField
65
67
  }
66
68
  const field = message.findNumber(fieldNo);
67
69
  if (!field) {
68
- const data = reader.skip(wireType, fieldNo);
69
- if (options.readUnknownFields) {
70
+ // Use remaining recursion budget for skipping nested groups
71
+ const recursionLimit = ctx.recursionLimit - ctx.depth;
72
+ const data = reader.skip(wireType, fieldNo, recursionLimit);
73
+ if (ctx.readUnknownFields) {
70
74
  unknownFields.push({ no: fieldNo, wireType, data });
71
75
  }
72
76
  continue;
73
77
  }
74
- readField(message, reader, field, wireType, options);
78
+ readField(message, reader, field, wireType, ctx);
75
79
  }
76
80
  if (delimited) {
77
81
  if (wireType != WireType.EndGroup || fieldNo !== lengthOrDelimitedFieldNo) {
@@ -81,15 +85,16 @@ function readMessage(message, reader, options, delimited, lengthOrDelimitedField
81
85
  if (unknownFields.length > 0) {
82
86
  message.setUnknown(unknownFields);
83
87
  }
88
+ ctx.depth--;
84
89
  }
85
90
  /**
86
- * @private
91
+ * @private Only exported for getExtension()
87
92
  */
88
- export function readField(message, reader, field, wireType, options) {
93
+ export function readField(message, reader, field, wireType, ctx) {
89
94
  var _a;
90
95
  switch (field.fieldKind) {
91
96
  case "scalar":
92
- message.set(field, readScalar(reader, field.scalar));
97
+ message.set(field, readScalar(reader, field.scalar, field.utf8Validation));
93
98
  break;
94
99
  case "enum":
95
100
  const val = readScalar(reader, ScalarType.INT32);
@@ -101,7 +106,7 @@ export function readField(message, reader, field, wireType, options) {
101
106
  if (ok) {
102
107
  message.set(field, val);
103
108
  }
104
- else if (options.readUnknownFields) {
109
+ else if (ctx.readUnknownFields) {
105
110
  const bytes = [];
106
111
  varint32write(val, bytes);
107
112
  const unknownFields = (_a = message.getUnknown()) !== null && _a !== void 0 ? _a : [];
@@ -115,18 +120,18 @@ export function readField(message, reader, field, wireType, options) {
115
120
  }
116
121
  break;
117
122
  case "message":
118
- message.set(field, readMessageField(reader, options, field, message.get(field)));
123
+ message.set(field, readMessageField(reader, ctx, field, message.get(field)));
119
124
  break;
120
125
  case "list":
121
- readListField(reader, wireType, message.get(field), options);
126
+ readListField(reader, wireType, message.get(field), ctx);
122
127
  break;
123
128
  case "map":
124
- readMapEntry(reader, message.get(field), options);
129
+ readMapEntry(reader, message.get(field), ctx);
125
130
  break;
126
131
  }
127
132
  }
128
133
  // Read a map field, expecting key field = 1, value field = 2
129
- function readMapEntry(reader, map, options) {
134
+ function readMapEntry(reader, map, ctx) {
130
135
  const field = map.field();
131
136
  let key;
132
137
  let val;
@@ -139,18 +144,18 @@ function readMapEntry(reader, map, options) {
139
144
  const [fieldNo] = reader.tag();
140
145
  switch (fieldNo) {
141
146
  case 1:
142
- key = readScalar(reader, field.mapKey);
147
+ key = readScalar(reader, field.mapKey, field.utf8Validation);
143
148
  break;
144
149
  case 2:
145
150
  switch (field.mapKind) {
146
151
  case "scalar":
147
- val = readScalar(reader, field.scalar);
152
+ val = readScalar(reader, field.scalar, field.utf8Validation);
148
153
  break;
149
154
  case "enum":
150
155
  val = reader.int32();
151
156
  break;
152
157
  case "message":
153
- val = readMessageField(reader, options, field);
158
+ val = readMessageField(reader, ctx, field);
154
159
  break;
155
160
  }
156
161
  break;
@@ -174,11 +179,11 @@ function readMapEntry(reader, map, options) {
174
179
  }
175
180
  map.set(key, val);
176
181
  }
177
- function readListField(reader, wireType, list, options) {
182
+ function readListField(reader, wireType, list, ctx) {
178
183
  var _a;
179
184
  const field = list.field();
180
185
  if (field.listKind === "message") {
181
- list.add(readMessageField(reader, options, field));
186
+ list.add(readMessageField(reader, ctx, field));
182
187
  return;
183
188
  }
184
189
  const scalarType = (_a = field.scalar) !== null && _a !== void 0 ? _a : ScalarType.INT32;
@@ -186,24 +191,24 @@ function readListField(reader, wireType, list, options) {
186
191
  scalarType != ScalarType.STRING &&
187
192
  scalarType != ScalarType.BYTES;
188
193
  if (!packed) {
189
- list.add(readScalar(reader, scalarType));
194
+ list.add(readScalar(reader, scalarType, field.utf8Validation));
190
195
  return;
191
196
  }
192
197
  const e = reader.uint32() + reader.pos;
193
198
  while (reader.pos < e) {
194
- list.add(readScalar(reader, scalarType));
199
+ list.add(readScalar(reader, scalarType, field.utf8Validation));
195
200
  }
196
201
  }
197
- function readMessageField(reader, options, field, mergeMessage) {
202
+ function readMessageField(reader, ctx, field, mergeMessage) {
198
203
  const delimited = field.delimitedEncoding;
199
204
  const message = mergeMessage !== null && mergeMessage !== void 0 ? mergeMessage : reflect(field.message, undefined, false);
200
- readMessage(message, reader, options, delimited, delimited ? field.number : reader.uint32());
205
+ readMessage(message, reader, ctx, delimited, delimited ? field.number : reader.uint32());
201
206
  return message;
202
207
  }
203
- function readScalar(reader, type) {
208
+ function readScalar(reader, type, validateUtf8 = false) {
204
209
  switch (type) {
205
210
  case ScalarType.STRING:
206
- return reader.string();
211
+ return reader.string(validateUtf8);
207
212
  case ScalarType.BOOL:
208
213
  return reader.bool();
209
214
  case ScalarType.DOUBLE:
@@ -16,34 +16,51 @@ export interface JsonReadOptions {
16
16
  * This option is required to read `google.protobuf.Any` and extensions
17
17
  * from JSON format.
18
18
  */
19
- registry?: Registry;
19
+ registry?: Registry | undefined;
20
+ /**
21
+ * The maximum depth of nested messages to parse. If a message nests deeper
22
+ * than this limit, parsing fails with an error instead of exhausting the
23
+ * call stack. Defaults to 100.
24
+ */
25
+ recursionLimit: number;
20
26
  }
21
27
  /**
22
28
  * Parse a message from a JSON string.
29
+ *
30
+ * Duplicate keys are rejected.
23
31
  */
24
32
  export declare function fromJsonString<Desc extends DescMessage>(schema: Desc, json: string, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
25
33
  /**
26
- * Parse a message from a JSON string, merging fields.
34
+ * Parse a message from a JSON string, merging fields into the target.
27
35
  *
28
36
  * Repeated fields are appended. Map entries are added, overwriting
29
37
  * existing keys.
30
38
  *
31
39
  * If a message field is already present, it will be merged with the
32
40
  * new data.
41
+ *
42
+ * Duplicate keys in the JSON are rejected, as in `fromJsonString`.
33
43
  */
34
44
  export declare function mergeFromJsonString<Desc extends DescMessage>(schema: Desc, target: MessageShape<Desc>, json: string, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
35
45
  /**
36
46
  * Parse a message from a JSON value.
47
+ *
48
+ * Duplicate keys are rejected, but a value parsed by JSON.parse has already
49
+ * dropped duplicates (the last one wins). Use `fromJsonString` for strict
50
+ * duplicate-key checking.
37
51
  */
38
52
  export declare function fromJson<Desc extends DescMessage>(schema: Desc, json: JsonValue, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
39
53
  /**
40
- * Parse a message from a JSON value, merging fields.
54
+ * Parse a message from a JSON value, merging fields into the target.
41
55
  *
42
56
  * Repeated fields are appended. Map entries are added, overwriting
43
57
  * existing keys.
44
58
  *
45
59
  * If a message field is already present, it will be merged with the
46
60
  * new data.
61
+ *
62
+ * Duplicate keys are rejected as in `fromJson`; use `mergeFromJsonString`
63
+ * for strict checking.
47
64
  */
48
65
  export declare function mergeFromJson<Desc extends DescMessage>(schema: Desc, target: MessageShape<Desc>, json: JsonValue, options?: Partial<JsonReadOptions>): MessageShape<Desc>;
49
66
  /**