@bufbuild/protobuf 2.12.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 (180) 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}/equals.d.ts +8 -3
  7. package/dist/{cjs → commonjs}/equals.js +8 -3
  8. package/dist/{cjs → commonjs}/extensions.d.ts +2 -1
  9. package/dist/{cjs → commonjs}/extensions.js +3 -4
  10. package/dist/{cjs → commonjs}/from-binary.d.ts +16 -2
  11. package/dist/{cjs → commonjs}/from-binary.js +30 -24
  12. package/dist/{cjs → commonjs}/from-json.d.ts +19 -2
  13. package/dist/{cjs → commonjs}/from-json.js +174 -54
  14. package/dist/commonjs/json-value.js +15 -0
  15. package/dist/commonjs/package.json +4 -0
  16. package/dist/{cjs → commonjs}/proto-int64.js +1 -0
  17. package/dist/{cjs → commonjs}/reflect/reflect-check.js +3 -1
  18. package/dist/commonjs/reflect/scalar.d.ts +43 -0
  19. package/dist/{cjs → commonjs}/reflect/scalar.js +33 -6
  20. package/dist/{cjs → commonjs}/registry.js +1 -1
  21. package/dist/{cjs/codegenv2 → commonjs}/types.js +0 -7
  22. package/dist/{cjs → commonjs}/wire/binary-encoding.d.ts +4 -2
  23. package/dist/{cjs → commonjs}/wire/binary-encoding.js +8 -3
  24. package/dist/{cjs → commonjs}/wire/size-delimited.d.ts +1 -1
  25. package/dist/esm/codegenv1/boot.d.ts +1 -0
  26. package/dist/esm/codegenv1/boot.js +14 -0
  27. package/dist/esm/codegenv1/types.d.ts +9 -5
  28. package/dist/esm/codegenv1/types.js +0 -7
  29. package/dist/esm/codegenv2/types.d.ts +9 -5
  30. package/dist/esm/codegenv2/types.js +0 -7
  31. package/dist/esm/equals.d.ts +8 -3
  32. package/dist/esm/equals.js +8 -3
  33. package/dist/esm/extensions.d.ts +2 -1
  34. package/dist/esm/extensions.js +4 -5
  35. package/dist/esm/from-binary.d.ts +16 -2
  36. package/dist/esm/from-binary.js +29 -24
  37. package/dist/esm/from-json.d.ts +19 -2
  38. package/dist/esm/from-json.js +174 -54
  39. package/dist/esm/package.json +4 -0
  40. package/dist/esm/proto-int64.js +1 -0
  41. package/dist/esm/reflect/reflect-check.js +3 -1
  42. package/dist/esm/reflect/scalar.d.ts +27 -5
  43. package/dist/esm/reflect/scalar.js +33 -6
  44. package/dist/esm/registry.js +1 -1
  45. package/dist/esm/wire/binary-encoding.d.ts +4 -2
  46. package/dist/esm/wire/binary-encoding.js +8 -3
  47. package/dist/esm/wire/size-delimited.d.ts +1 -1
  48. package/package.json +97 -31
  49. package/dist/cjs/package.json +0 -1
  50. package/dist/cjs/reflect/scalar.d.ts +0 -21
  51. /package/dist/{cjs → commonjs}/clone.d.ts +0 -0
  52. /package/dist/{cjs → commonjs}/clone.js +0 -0
  53. /package/dist/{cjs → commonjs}/codegenv1/enum.d.ts +0 -0
  54. /package/dist/{cjs → commonjs}/codegenv1/enum.js +0 -0
  55. /package/dist/{cjs → commonjs}/codegenv1/extension.d.ts +0 -0
  56. /package/dist/{cjs → commonjs}/codegenv1/extension.js +0 -0
  57. /package/dist/{cjs → commonjs}/codegenv1/file.d.ts +0 -0
  58. /package/dist/{cjs → commonjs}/codegenv1/file.js +0 -0
  59. /package/dist/{cjs → commonjs}/codegenv1/index.d.ts +0 -0
  60. /package/dist/{cjs → commonjs}/codegenv1/index.js +0 -0
  61. /package/dist/{cjs → commonjs}/codegenv1/message.d.ts +0 -0
  62. /package/dist/{cjs → commonjs}/codegenv1/message.js +0 -0
  63. /package/dist/{cjs → commonjs}/codegenv1/service.d.ts +0 -0
  64. /package/dist/{cjs → commonjs}/codegenv1/service.js +0 -0
  65. /package/dist/{cjs → commonjs}/codegenv1/symbols.d.ts +0 -0
  66. /package/dist/{cjs → commonjs}/codegenv1/symbols.js +0 -0
  67. /package/dist/{cjs → commonjs/codegenv1}/types.js +0 -0
  68. /package/dist/{cjs → commonjs}/codegenv2/boot.d.ts +0 -0
  69. /package/dist/{cjs → commonjs}/codegenv2/boot.js +0 -0
  70. /package/dist/{cjs → commonjs}/codegenv2/embed.d.ts +0 -0
  71. /package/dist/{cjs → commonjs}/codegenv2/embed.js +0 -0
  72. /package/dist/{cjs → commonjs}/codegenv2/enum.d.ts +0 -0
  73. /package/dist/{cjs → commonjs}/codegenv2/enum.js +0 -0
  74. /package/dist/{cjs → commonjs}/codegenv2/extension.d.ts +0 -0
  75. /package/dist/{cjs → commonjs}/codegenv2/extension.js +0 -0
  76. /package/dist/{cjs → commonjs}/codegenv2/file.d.ts +0 -0
  77. /package/dist/{cjs → commonjs}/codegenv2/file.js +0 -0
  78. /package/dist/{cjs → commonjs}/codegenv2/index.d.ts +0 -0
  79. /package/dist/{cjs → commonjs}/codegenv2/index.js +0 -0
  80. /package/dist/{cjs → commonjs}/codegenv2/message.d.ts +0 -0
  81. /package/dist/{cjs → commonjs}/codegenv2/message.js +0 -0
  82. /package/dist/{cjs → commonjs}/codegenv2/restore-json-names.d.ts +0 -0
  83. /package/dist/{cjs → commonjs}/codegenv2/restore-json-names.js +0 -0
  84. /package/dist/{cjs → commonjs}/codegenv2/scalar.d.ts +0 -0
  85. /package/dist/{cjs → commonjs}/codegenv2/scalar.js +0 -0
  86. /package/dist/{cjs → commonjs}/codegenv2/service.d.ts +0 -0
  87. /package/dist/{cjs → commonjs}/codegenv2/service.js +0 -0
  88. /package/dist/{cjs → commonjs}/codegenv2/symbols.d.ts +0 -0
  89. /package/dist/{cjs → commonjs}/codegenv2/symbols.js +0 -0
  90. /package/dist/{cjs/json-value.js → commonjs/codegenv2/types.js} +0 -0
  91. /package/dist/{cjs → commonjs}/create.d.ts +0 -0
  92. /package/dist/{cjs → commonjs}/create.js +0 -0
  93. /package/dist/{cjs → commonjs}/descriptors.d.ts +0 -0
  94. /package/dist/{cjs → commonjs}/descriptors.js +0 -0
  95. /package/dist/{cjs → commonjs}/fields.d.ts +0 -0
  96. /package/dist/{cjs → commonjs}/fields.js +0 -0
  97. /package/dist/{cjs → commonjs}/index.d.ts +0 -0
  98. /package/dist/{cjs → commonjs}/index.js +0 -0
  99. /package/dist/{cjs → commonjs}/is-message.d.ts +0 -0
  100. /package/dist/{cjs → commonjs}/is-message.js +0 -0
  101. /package/dist/{cjs → commonjs}/json-value.d.ts +0 -0
  102. /package/dist/{cjs → commonjs}/merge.d.ts +0 -0
  103. /package/dist/{cjs → commonjs}/merge.js +0 -0
  104. /package/dist/{cjs → commonjs}/proto-int64.d.ts +0 -0
  105. /package/dist/{cjs → commonjs}/reflect/error.d.ts +0 -0
  106. /package/dist/{cjs → commonjs}/reflect/error.js +0 -0
  107. /package/dist/{cjs → commonjs}/reflect/guard.d.ts +0 -0
  108. /package/dist/{cjs → commonjs}/reflect/guard.js +0 -0
  109. /package/dist/{cjs → commonjs}/reflect/index.d.ts +0 -0
  110. /package/dist/{cjs → commonjs}/reflect/index.js +0 -0
  111. /package/dist/{cjs → commonjs}/reflect/names.d.ts +0 -0
  112. /package/dist/{cjs → commonjs}/reflect/names.js +0 -0
  113. /package/dist/{cjs → commonjs}/reflect/nested-types.d.ts +0 -0
  114. /package/dist/{cjs → commonjs}/reflect/nested-types.js +0 -0
  115. /package/dist/{cjs → commonjs}/reflect/path.d.ts +0 -0
  116. /package/dist/{cjs → commonjs}/reflect/path.js +0 -0
  117. /package/dist/{cjs → commonjs}/reflect/reflect-check.d.ts +0 -0
  118. /package/dist/{cjs → commonjs}/reflect/reflect-types.d.ts +0 -0
  119. /package/dist/{cjs → commonjs}/reflect/reflect-types.js +0 -0
  120. /package/dist/{cjs → commonjs}/reflect/reflect.d.ts +0 -0
  121. /package/dist/{cjs → commonjs}/reflect/reflect.js +0 -0
  122. /package/dist/{cjs → commonjs}/reflect/unsafe.d.ts +0 -0
  123. /package/dist/{cjs → commonjs}/reflect/unsafe.js +0 -0
  124. /package/dist/{cjs → commonjs}/registry.d.ts +0 -0
  125. /package/dist/{cjs → commonjs}/to-binary.d.ts +0 -0
  126. /package/dist/{cjs → commonjs}/to-binary.js +0 -0
  127. /package/dist/{cjs → commonjs}/to-json.d.ts +0 -0
  128. /package/dist/{cjs → commonjs}/to-json.js +0 -0
  129. /package/dist/{cjs → commonjs}/types.d.ts +0 -0
  130. /package/dist/{cjs → commonjs}/wire/base64-encoding.d.ts +0 -0
  131. /package/dist/{cjs → commonjs}/wire/base64-encoding.js +0 -0
  132. /package/dist/{cjs → commonjs}/wire/index.d.ts +0 -0
  133. /package/dist/{cjs → commonjs}/wire/index.js +0 -0
  134. /package/dist/{cjs → commonjs}/wire/size-delimited.js +0 -0
  135. /package/dist/{cjs → commonjs}/wire/text-encoding.d.ts +0 -0
  136. /package/dist/{cjs → commonjs}/wire/text-encoding.js +0 -0
  137. /package/dist/{cjs → commonjs}/wire/text-format.d.ts +0 -0
  138. /package/dist/{cjs → commonjs}/wire/text-format.js +0 -0
  139. /package/dist/{cjs → commonjs}/wire/varint.d.ts +0 -0
  140. /package/dist/{cjs → commonjs}/wire/varint.js +0 -0
  141. /package/dist/{cjs → commonjs}/wkt/any.d.ts +0 -0
  142. /package/dist/{cjs → commonjs}/wkt/any.js +0 -0
  143. /package/dist/{cjs → commonjs}/wkt/duration.d.ts +0 -0
  144. /package/dist/{cjs → commonjs}/wkt/duration.js +0 -0
  145. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/any_pb.d.ts +0 -0
  146. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/any_pb.js +0 -0
  147. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/api_pb.d.ts +0 -0
  148. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/api_pb.js +0 -0
  149. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +0 -0
  150. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/compiler/plugin_pb.js +0 -0
  151. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/cpp_features_pb.d.ts +0 -0
  152. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/cpp_features_pb.js +0 -0
  153. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/descriptor_pb.d.ts +0 -0
  154. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/descriptor_pb.js +0 -0
  155. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/duration_pb.d.ts +0 -0
  156. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/duration_pb.js +0 -0
  157. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/empty_pb.d.ts +0 -0
  158. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/empty_pb.js +0 -0
  159. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/field_mask_pb.d.ts +0 -0
  160. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/field_mask_pb.js +0 -0
  161. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/go_features_pb.d.ts +0 -0
  162. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/go_features_pb.js +0 -0
  163. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/java_features_pb.d.ts +0 -0
  164. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/java_features_pb.js +0 -0
  165. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/source_context_pb.d.ts +0 -0
  166. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/source_context_pb.js +0 -0
  167. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/struct_pb.d.ts +0 -0
  168. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/struct_pb.js +0 -0
  169. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/timestamp_pb.d.ts +0 -0
  170. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/timestamp_pb.js +0 -0
  171. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/type_pb.d.ts +0 -0
  172. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/type_pb.js +0 -0
  173. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/wrappers_pb.d.ts +0 -0
  174. /package/dist/{cjs → commonjs}/wkt/gen/google/protobuf/wrappers_pb.js +0 -0
  175. /package/dist/{cjs → commonjs}/wkt/index.d.ts +0 -0
  176. /package/dist/{cjs → commonjs}/wkt/index.js +0 -0
  177. /package/dist/{cjs → commonjs}/wkt/timestamp.d.ts +0 -0
  178. /package/dist/{cjs → commonjs}/wkt/timestamp.js +0 -0
  179. /package/dist/{cjs → commonjs}/wkt/wrappers.d.ts +0 -0
  180. /package/dist/{cjs → commonjs}/wkt/wrappers.js +0 -0
@@ -194,9 +194,11 @@ export declare class BinaryReader {
194
194
  * Skip one element and return the skipped data.
195
195
  *
196
196
  * When skipping StartGroup, provide the tags field number to check for
197
- * matching field number in the EndGroup tag.
197
+ * matching field number in the EndGroup tag. Recursion into nested groups
198
+ * is guarded by the `recursionLimit` argument: When the limit is reached,
199
+ * this method throws.
198
200
  */
199
- skip(wireType: WireType, fieldNo?: number): Uint8Array;
201
+ skip(wireType: WireType, fieldNo?: number, recursionLimit?: number): Uint8Array;
200
202
  protected varint64: () => [number, number];
201
203
  /**
202
204
  * Throws error if position in byte array is out of range.
@@ -328,9 +328,11 @@ class BinaryReader {
328
328
  * Skip one element and return the skipped data.
329
329
  *
330
330
  * When skipping StartGroup, provide the tags field number to check for
331
- * matching field number in the EndGroup tag.
331
+ * matching field number in the EndGroup tag. Recursion into nested groups
332
+ * is guarded by the `recursionLimit` argument: When the limit is reached,
333
+ * this method throws.
332
334
  */
333
- skip(wireType, fieldNo) {
335
+ skip(wireType, fieldNo, recursionLimit = 100) {
334
336
  let start = this.pos;
335
337
  switch (wireType) {
336
338
  case WireType.Varint:
@@ -349,6 +351,9 @@ class BinaryReader {
349
351
  this.pos += len;
350
352
  break;
351
353
  case WireType.StartGroup:
354
+ if (recursionLimit <= 0) {
355
+ throw new Error("maximum recursion depth reached");
356
+ }
352
357
  for (;;) {
353
358
  const [fn, wt] = this.tag();
354
359
  if (wt === WireType.EndGroup) {
@@ -357,7 +362,7 @@ class BinaryReader {
357
362
  }
358
363
  break;
359
364
  }
360
- this.skip(wt, fn);
365
+ this.skip(wt, fn, recursionLimit - 1);
361
366
  }
362
367
  break;
363
368
  default:
@@ -21,7 +21,7 @@ export declare function sizeDelimitedEncode<Desc extends DescMessage>(messageDes
21
21
  * This size-delimited format is compatible with other implementations.
22
22
  * For details, see https://github.com/protocolbuffers/protobuf/issues/10229
23
23
  */
24
- export declare function sizeDelimitedDecodeStream<Desc extends DescMessage>(messageDesc: Desc, iterable: AsyncIterable<Uint8Array>, options?: BinaryReadOptions): AsyncIterableIterator<MessageShape<Desc>>;
24
+ export declare function sizeDelimitedDecodeStream<Desc extends DescMessage>(messageDesc: Desc, iterable: AsyncIterable<Uint8Array>, options?: Partial<BinaryReadOptions>): AsyncIterableIterator<MessageShape<Desc>>;
25
25
  /**
26
26
  * Decodes the size from the given size-delimited message, which may be
27
27
  * incomplete.
@@ -0,0 +1 @@
1
+ export { boot } from "../codegenv2/boot.js";
@@ -0,0 +1,14 @@
1
+ // Copyright 2021-2026 Buf Technologies, Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ export { boot } from "../codegenv2/boot.js";
@@ -56,11 +56,15 @@ export type GenService<RuntimeShape extends GenServiceMethods> = Omit<DescServic
56
56
  * @private
57
57
  */
58
58
  export type GenServiceMethods = Record<string, Pick<DescMethod, "input" | "output" | "methodKind">>;
59
- declare class brandv1<A, B = unknown> {
60
- protected v: "codegenv1";
61
- protected a: A | boolean;
62
- protected b: B | boolean;
63
- }
59
+ type brandv1<A, B = unknown> = {
60
+ /**
61
+ * @internal
62
+ */
63
+ readonly $codegenv1: {
64
+ a: A;
65
+ b: B;
66
+ };
67
+ };
64
68
  /**
65
69
  * Union of the property names of all fields, including oneof members.
66
70
  * For an anonymous message (no generated message shape), it's simply a string.
@@ -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 brandv1 {
15
- constructor() {
16
- this.v = "codegenv1";
17
- this.a = false;
18
- this.b = false;
19
- }
20
- }
21
14
  export {};
@@ -62,11 +62,15 @@ export type GenService<RuntimeShape extends GenServiceMethods> = Omit<DescServic
62
62
  * @private
63
63
  */
64
64
  export type GenServiceMethods = Record<string, Pick<DescMethod, "input" | "output" | "methodKind">>;
65
- declare class brandv2<A, B = unknown> {
66
- protected v: "codegenv2";
67
- protected a: A | boolean;
68
- protected b: B | boolean;
69
- }
65
+ type brandv2<A, B = unknown> = {
66
+ /**
67
+ * @internal
68
+ */
69
+ readonly $codegenv2: {
70
+ a: A;
71
+ b: B;
72
+ };
73
+ };
70
74
  /**
71
75
  * Union of the property names of all fields, including oneof members.
72
76
  * For an anonymous message (no generated message shape), it's simply a string.
@@ -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 {};
@@ -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,11 +85,12 @@ 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":
@@ -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;
@@ -150,7 +155,7 @@ function readMapEntry(reader, map, options) {
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;
@@ -194,10 +199,10 @@ function readListField(reader, wireType, list, options) {
194
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
208
  function readScalar(reader, type, validateUtf8 = false) {
@@ -17,33 +17,50 @@ export interface JsonReadOptions {
17
17
  * from JSON format.
18
18
  */
19
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
  /**