protobufjs 8.4.1 → 8.5.0

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.
package/ext/descriptor.js CHANGED
@@ -268,13 +268,13 @@ Type.fromDescriptor = function fromDescriptor(descriptor, edition, nested, depth
268
268
  /* Extension ranges */ if (descriptor.extensionRange && descriptor.extensionRange.length) {
269
269
  type.extensions = [];
270
270
  for (i = 0; i < descriptor.extensionRange.length; ++i)
271
- type.extensions.push([ descriptor.extensionRange[i].start, descriptor.extensionRange[i].end ]);
271
+ type.extensions.push([ descriptor.extensionRange[i].start, descriptor.extensionRange[i].end - 1 ]);
272
272
  }
273
273
  /* Reserved... */ if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) {
274
274
  type.reserved = [];
275
275
  /* Ranges */ if (descriptor.reservedRange)
276
276
  for (i = 0; i < descriptor.reservedRange.length; ++i)
277
- type.reserved.push([ descriptor.reservedRange[i].start, descriptor.reservedRange[i].end ]);
277
+ type.reserved.push([ descriptor.reservedRange[i].start, descriptor.reservedRange[i].end - 1 ]);
278
278
  /* Names */ if (descriptor.reservedName)
279
279
  for (i = 0; i < descriptor.reservedName.length; ++i)
280
280
  type.reserved.push(descriptor.reservedName[i]);
@@ -324,13 +324,13 @@ Type.prototype.toDescriptor = function toDescriptor(edition) {
324
324
  }
325
325
  /* Extension ranges */ if (this.extensions)
326
326
  for (i = 0; i < this.extensions.length; ++i)
327
- descriptor.extensionRange.push(exports.DescriptorProto.ExtensionRange.create({ start: this.extensions[i][0], end: this.extensions[i][1] }));
327
+ descriptor.extensionRange.push(exports.DescriptorProto.ExtensionRange.create({ start: this.extensions[i][0], end: this.extensions[i][1] + 1 }));
328
328
  /* Reserved... */ if (this.reserved)
329
329
  for (i = 0; i < this.reserved.length; ++i)
330
330
  /* Names */ if (typeof this.reserved[i] === "string")
331
331
  descriptor.reservedName.push(this.reserved[i]);
332
332
  /* Ranges */ else
333
- descriptor.reservedRange.push(exports.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] }));
333
+ descriptor.reservedRange.push(exports.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] + 1 }));
334
334
 
335
335
  descriptor.options = toDescriptorOptions(this.options, exports.MessageOptions);
336
336
 
@@ -657,9 +657,10 @@ Enum.fromDescriptor = function fromDescriptor(descriptor, edition, nested) {
657
657
 
658
658
  // Construct values object
659
659
  var values = {},
660
- valuesOptions;
660
+ valuesOptions,
661
+ i;
661
662
  if (descriptor.value)
662
- for (var i = 0; i < descriptor.value.length; ++i) {
663
+ for (i = 0; i < descriptor.value.length; ++i) {
663
664
  var name = descriptor.value[i].name,
664
665
  valueName = name && name.length ? name : "NAME" + (descriptor.value[i].number || 0),
665
666
  value = descriptor.value[i].number || 0,
@@ -681,6 +682,16 @@ Enum.fromDescriptor = function fromDescriptor(descriptor, edition, nested) {
681
682
  if (!nested)
682
683
  enm._edition = edition;
683
684
 
685
+ /* Reserved... */ if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) {
686
+ enm.reserved = [];
687
+ /* Ranges */ if (descriptor.reservedRange)
688
+ for (i = 0; i < descriptor.reservedRange.length; ++i)
689
+ enm.reserved.push([ descriptor.reservedRange[i].start, descriptor.reservedRange[i].end ]);
690
+ /* Names */ if (descriptor.reservedName)
691
+ for (i = 0; i < descriptor.reservedName.length; ++i)
692
+ enm.reserved.push(descriptor.reservedName[i]);
693
+ }
694
+
684
695
  return enm;
685
696
  };
686
697
 
@@ -691,19 +702,30 @@ Enum.fromDescriptor = function fromDescriptor(descriptor, edition, nested) {
691
702
  Enum.prototype.toDescriptor = function toDescriptor() {
692
703
 
693
704
  // Values
694
- var values = [];
695
- for (var i = 0, ks = Object.keys(this.values); i < ks.length; ++i)
705
+ var values = [],
706
+ i,
707
+ ks = Object.keys(this.values);
708
+ for (i = 0; i < ks.length; ++i)
696
709
  values.push(exports.EnumValueDescriptorProto.create({
697
710
  name: ks[i],
698
711
  number: this.values[ks[i]],
699
712
  options: this.valuesOptions && toDescriptorOptions(this.valuesOptions[ks[i]], exports.EnumValueOptions)
700
713
  }));
701
714
 
702
- return exports.EnumDescriptorProto.create({
715
+ var descriptor = exports.EnumDescriptorProto.create({
703
716
  name: this.name,
704
717
  value: values,
705
718
  options: toDescriptorOptions(this.options, exports.EnumOptions)
706
719
  });
720
+
721
+ /* Reserved... */ if (this.reserved)
722
+ for (i = 0; i < this.reserved.length; ++i)
723
+ /* Names */ if (typeof this.reserved[i] === "string")
724
+ descriptor.reservedName.push(this.reserved[i]);
725
+ /* Ranges */ else
726
+ descriptor.reservedRange.push(exports.EnumDescriptorProto.EnumReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] }));
727
+
728
+ return descriptor;
707
729
  };
708
730
 
709
731
  // --- OneOf ---
package/index.d.ts CHANGED
@@ -666,13 +666,16 @@ export class Method extends ReflectionObject {
666
666
  requestType: string;
667
667
 
668
668
  /** Whether requests are streamed or not. */
669
- requestStream?: boolean;
669
+ requestStream?: true;
670
670
 
671
671
  /** Response type. */
672
672
  responseType: string;
673
673
 
674
674
  /** Whether responses are streamed or not. */
675
- responseStream?: boolean;
675
+ responseStream?: true;
676
+
677
+ /** gRPC-style method path. */
678
+ path: string;
676
679
 
677
680
  /** Resolved request type. */
678
681
  resolvedRequestType: (Type|null);
@@ -1204,6 +1207,9 @@ export class Reader {
1204
1207
  /** Read buffer length. */
1205
1208
  len: number;
1206
1209
 
1210
+ /** Whether to discard unknown fields while decoding. */
1211
+ discardUnknown: boolean;
1212
+
1207
1213
  /**
1208
1214
  * Creates a new reader using the specified buffer.
1209
1215
  * @param buffer Buffer to read from
@@ -1326,6 +1332,9 @@ export class Reader {
1326
1332
  /** Recursion limit. */
1327
1333
  static recursionLimit: number;
1328
1334
 
1335
+ /** Whether readers discard unknown fields while decoding. */
1336
+ static discardUnknown: boolean;
1337
+
1329
1338
  /**
1330
1339
  * Skips the next element of the specified wire type.
1331
1340
  * @param wireType Wire type received
@@ -1453,13 +1462,17 @@ export namespace rpc {
1453
1462
  */
1454
1463
  type ServiceMethodCallback<TRes extends Message<TRes>> = (error: (Error|null), response?: TRes) => void;
1455
1464
 
1456
- /**
1457
- * A service method part of a {@link rpc.Service} as created by {@link Service.create}.
1458
- * @param request Request message or plain object
1459
- * @param [callback] Node-style callback called with the error, if any, and the response message
1460
- * @returns Promise if `callback` has been omitted, otherwise `undefined`
1461
- */
1462
- type ServiceMethod<TReq extends Message<TReq>, TRes extends Message<TRes>> = (request: (TReq|Properties<TReq>), callback?: rpc.ServiceMethodCallback<TRes>) => Promise<Message<TRes>>;
1465
+ /** A service method part of a {@link rpc.Service} as created by {@link Service.create}. */
1466
+ type ServiceMethod<TReq extends Message<TReq>, TRes extends Message<TRes>> = {
1467
+ (request: TReq|Properties<TReq>, callback: rpc.ServiceMethodCallback<TRes>): void;
1468
+ (request: TReq|Properties<TReq>): Promise<TRes>;
1469
+ readonly name: string;
1470
+ readonly path: string;
1471
+ readonly requestType: string;
1472
+ readonly responseType: string;
1473
+ readonly requestStream: true|undefined;
1474
+ readonly responseStream: true|undefined;
1475
+ };
1463
1476
 
1464
1477
  /** An RPC service as returned by {@link Service#create}. */
1465
1478
  class Service extends util.EventEmitter {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "protobufjs",
3
- "version": "8.4.1",
3
+ "version": "8.5.0",
4
4
  "versionScheme": "~",
5
5
  "description": "Protocol Buffers for JavaScript & TypeScript.",
6
6
  "author": "Daniel Wirtz <dcode+protobufjs@dcode.io>",
@@ -26,6 +26,7 @@
26
26
  "bench": "node bench",
27
27
  "build": "npm run build:bundle && npm run build:types",
28
28
  "build:bundle": "gulp --gulpfile scripts/gulpfile.js",
29
+ "build:tests": "node ./scripts/gentests.js",
29
30
  "build:types": "node cli/bin/pbts --main --global protobuf --out index.d.ts src/ && node cli/bin/pbts --main --import \"\\$protobuf=..\" --out ext/descriptor.generated.d.ts ext/descriptor.js && node cli/bin/pbts --main --out ext/textformat.generated.d.ts ext/textformat.js",
30
31
  "coverage": "npm run coverage:test && npm run coverage:report",
31
32
  "coverage:test": "nyc --silent tape -r ./lib/tape-adapter tests/*.js tests/node/*.js",
@@ -43,7 +44,7 @@
43
44
  "test": "npm run test:sources && npm run test:types",
44
45
  "test:sources": "tape -r ./lib/tape-adapter tests/*.js tests/node/*.js",
45
46
  "test:types": "tsc tests/comp_typescript.ts --target es2019 --module commonjs --types node --lib es2019 --esModuleInterop --strictNullChecks --experimentalDecorators --emitDecoratorMetadata && tsc -p tsconfig.test-types.json",
46
- "make": "npm run lint:sources && npm run build && npm run lint:types && node ./scripts/gentests.js && npm test"
47
+ "make": "npm run lint:sources && npm run build && npm run lint:types && npm run build:tests && npm test"
47
48
  },
48
49
  "dependencies": {
49
50
  "long": "^5.3.2"
package/src/converter.js CHANGED
@@ -42,7 +42,7 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
42
42
  } gen
43
43
  ("}");
44
44
  } else gen
45
- ("if(typeof d%s!==\"object\")", prop)
45
+ ("if(!util.isObject(d%s))", prop)
46
46
  ("throw TypeError(%j)", field.fullName + ": object expected")
47
47
  ("m%s=types[%i].fromObject(d%s,q+1)", prop, fieldIndex, prop);
48
48
  } else {
@@ -109,6 +109,8 @@ converter.fromObject = function fromObject(mtype) {
109
109
  var gen = util.codegen(["d", "q"], mtype.name + "$fromObject")
110
110
  ("if(d instanceof C)")
111
111
  ("return d")
112
+ ("if(!util.isObject(d))")
113
+ ("throw TypeError(%j)", mtype.fullName + ": object expected")
112
114
  ("if(q===undefined)q=0")
113
115
  ("if(q>util.recursionLimit)")
114
116
  ("throw Error(\"max depth exceeded\")");
@@ -125,7 +127,7 @@ converter.fromObject = function fromObject(mtype) {
125
127
  // Map fields
126
128
  if (field.map) { gen
127
129
  ("if(d%s){", prop)
128
- ("if(typeof d%s!==\"object\")", prop)
130
+ ("if(!util.isObject(d%s))", prop)
129
131
  ("throw TypeError(%j)", field.fullName + ": object expected")
130
132
  ("m%s={}", prop)
131
133
  ("for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){", prop);
package/src/decoder.js CHANGED
@@ -186,8 +186,10 @@ function decoder(mtype) {
186
186
  // Unknown fields
187
187
  gen
188
188
  ("r.skipType(%s,q,t)", i ? "u" : "t&7")
189
- ("util.makeProp(m,\"$unknowns\",false);")
190
- ("(m.$unknowns||(m.$unknowns=[])).push(r.raw(s,r.pos))")
189
+ ("if(!r.discardUnknown){")
190
+ ("util.makeProp(m,\"$unknowns\",false);")
191
+ ("(m.$unknowns||(m.$unknowns=[])).push(r.raw(s,r.pos))")
192
+ ("}")
191
193
  ("}")
192
194
  ("if(z!==undefined)")
193
195
  ("throw Error(\"missing end group\")");
package/src/method.js CHANGED
@@ -61,7 +61,7 @@ function Method(name, type, requestType, responseType, requestStream, responseSt
61
61
 
62
62
  /**
63
63
  * Whether requests are streamed or not.
64
- * @type {boolean|undefined}
64
+ * @type {true|undefined}
65
65
  */
66
66
  this.requestStream = requestStream ? true : undefined; // toJSON
67
67
 
@@ -73,10 +73,16 @@ function Method(name, type, requestType, responseType, requestStream, responseSt
73
73
 
74
74
  /**
75
75
  * Whether responses are streamed or not.
76
- * @type {boolean|undefined}
76
+ * @type {true|undefined}
77
77
  */
78
78
  this.responseStream = responseStream ? true : undefined; // toJSON
79
79
 
80
+ /**
81
+ * gRPC-style method path.
82
+ * @type {string}
83
+ */
84
+ this.path = "/" + this.name;
85
+
80
86
  /**
81
87
  * Resolved request type.
82
88
  * @type {Type|null}
@@ -154,6 +160,14 @@ Method.prototype.resolve = function resolve() {
154
160
  if (this.resolved)
155
161
  return this;
156
162
 
163
+ if (this.parent) {
164
+ var serviceName = this.parent.fullName;
165
+ if (serviceName.charAt(0) === ".")
166
+ serviceName = serviceName.substring(1);
167
+ this.path = "/" + serviceName + "/" + this.name;
168
+ } else
169
+ this.path = "/" + this.name;
170
+
157
171
  this.resolvedRequestType = this.parent.lookupType(this.requestType);
158
172
  this.resolvedResponseType = this.parent.lookupType(this.responseType);
159
173
 
package/src/namespace.js CHANGED
@@ -68,7 +68,7 @@ Namespace.arrayToJSON = arrayToJSON;
68
68
  Namespace.isReservedId = function isReservedId(reserved, id) {
69
69
  if (reserved)
70
70
  for (var i = 0; i < reserved.length; ++i)
71
- if (typeof reserved[i] !== "string" && reserved[i][0] <= id && reserved[i][1] > id)
71
+ if (typeof reserved[i] !== "string" && reserved[i][0] <= id && reserved[i][1] >= id)
72
72
  return true;
73
73
  return false;
74
74
  };
@@ -426,14 +426,14 @@ Namespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChe
426
426
  if (path[0] === "")
427
427
  return this.root.lookup(path.slice(1), filterTypes);
428
428
 
429
- // Early bailout for objects with matching absolute paths
430
- var found = this.root._fullyQualifiedObjects && this.root._fullyQualifiedObjects["." + flatPath];
429
+ // Lookup at this namespace and below
430
+ var found = this._lookupImpl(path, flatPath);
431
431
  if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {
432
432
  return found;
433
433
  }
434
434
 
435
- // Do a regular lookup at this namespace and below
436
- found = this._lookupImpl(path, flatPath);
435
+ // Fall back to respective absolute path once relative scope has been checked (non-standard)
436
+ found = this.root._fullyQualifiedObjects && this.root._fullyQualifiedObjects["." + flatPath];
437
437
  if (found && (!filterTypes || filterTypes.indexOf(found.constructor) > -1)) {
438
438
  return found;
439
439
  }
package/src/parse.js CHANGED
@@ -27,6 +27,9 @@ var base10Re = /^[1-9][0-9]*$/,
27
27
  nameRe = /^[a-zA-Z_][a-zA-Z_0-9]*$/,
28
28
  typeRefRe = util.patterns.typeRefRe;
29
29
 
30
+ var maxFieldId = 536870911, // 2^29 - 1
31
+ maxEnumId = 2147483647; // 2^31 - 1
32
+
30
33
  /**
31
34
  * Result object returned from {@link parse}.
32
35
  * @interface IParserResult
@@ -146,7 +149,7 @@ function parse(source, root, options) {
146
149
  }
147
150
  }
148
151
 
149
- function readRanges(target, acceptStrings) {
152
+ function readRanges(target, acceptStrings, max, acceptNegative) {
150
153
  var token, start;
151
154
  do {
152
155
  if (acceptStrings && ((token = peek()) === "\"" || token === "'")) {
@@ -157,7 +160,7 @@ function parse(source, root, options) {
157
160
  }
158
161
  } else {
159
162
  try {
160
- target.push([ start = parseId(next()), skip("to", true) ? parseId(next()) : start ]);
163
+ target.push([ start = parseId(next(), acceptNegative, max), skip("to", true) ? parseId(next(), acceptNegative, max) : start ]);
161
164
  } catch (err) {
162
165
  if (acceptStrings && typeRefRe.test(token) && edition >= 2023) {
163
166
  target.push(token);
@@ -216,10 +219,10 @@ function parse(source, root, options) {
216
219
  throw illegal(token, "number", insideTryCatch);
217
220
  }
218
221
 
219
- function parseId(token, acceptNegative) {
222
+ function parseId(token, acceptNegative, max) {
220
223
  switch (token) {
221
224
  case "max": case "MAX": case "Max":
222
- return 536870911;
225
+ return max || maxFieldId;
223
226
  case "0":
224
227
  return 0;
225
228
  }
@@ -677,7 +680,7 @@ function parse(source, root, options) {
677
680
  break;
678
681
 
679
682
  case "reserved":
680
- readRanges(enm.reserved || (enm.reserved = []), true);
683
+ readRanges(enm.reserved || (enm.reserved = []), true, maxEnumId, true);
681
684
  if(enm.reserved === undefined) enm.reserved = [];
682
685
  break;
683
686
 
package/src/reader.js CHANGED
@@ -38,6 +38,12 @@ function Reader(buffer) {
38
38
  * @type {number}
39
39
  */
40
40
  this.len = buffer.length;
41
+
42
+ /**
43
+ * Whether to discard unknown fields while decoding.
44
+ * @type {boolean}
45
+ */
46
+ this.discardUnknown = Reader.discardUnknown;
41
47
  }
42
48
 
43
49
  var create_array = typeof Uint8Array !== "undefined"
@@ -450,6 +456,12 @@ Reader.prototype.skip = function skip(length) {
450
456
  */
451
457
  Reader.recursionLimit = util.recursionLimit;
452
458
 
459
+ /**
460
+ * Whether readers discard unknown fields while decoding.
461
+ * @type {boolean}
462
+ */
463
+ Reader.discardUnknown = false;
464
+
453
465
  /**
454
466
  * Skips the next element of the specified wire type.
455
467
  * @param {number} wireType Wire type received
package/src/roots.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- module.exports = {};
2
+ module.exports = Object.create(null);
3
3
 
4
4
  /**
5
5
  * Named roots.
@@ -23,10 +23,16 @@ var util = require("../util/minimal");
23
23
  * @typedef rpc.ServiceMethod
24
24
  * @template TReq extends Message<TReq>
25
25
  * @template TRes extends Message<TRes>
26
- * @type {function}
27
- * @param {TReq|Properties<TReq>} request Request message or plain object
28
- * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message
29
- * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`
26
+ * @type {{
27
+ * (request: TReq|Properties<TReq>, callback: rpc.ServiceMethodCallback<TRes>): void;
28
+ * (request: TReq|Properties<TReq>): Promise<TRes>;
29
+ * readonly name: string;
30
+ * readonly path: string;
31
+ * readonly requestType: string;
32
+ * readonly responseType: string;
33
+ * readonly requestStream: true|undefined;
34
+ * readonly responseStream: true|undefined;
35
+ * }}
30
36
  */
31
37
 
32
38
  /**
package/src/writer.js CHANGED
@@ -230,7 +230,7 @@ Writer.prototype.uint32 = function write_uint32(value) {
230
230
  * @returns {Writer} `this`
231
231
  */
232
232
  Writer.prototype.int32 = function write_int32(value) {
233
- return value < 0
233
+ return (value |= 0) < 0
234
234
  ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec
235
235
  : this.uint32(value);
236
236
  };
@@ -245,16 +245,18 @@ Writer.prototype.sint32 = function write_sint32(value) {
245
245
  };
246
246
 
247
247
  function writeVarint64(val, buf, pos) {
248
- while (val.hi) {
249
- buf[pos++] = val.lo & 127 | 128;
250
- val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;
251
- val.hi >>>= 7;
248
+ var lo = val.lo,
249
+ hi = val.hi;
250
+ while (hi) {
251
+ buf[pos++] = lo & 127 | 128;
252
+ lo = (lo >>> 7 | hi << 25) >>> 0;
253
+ hi >>>= 7;
252
254
  }
253
- while (val.lo > 127) {
254
- buf[pos++] = val.lo & 127 | 128;
255
- val.lo = val.lo >>> 7;
255
+ while (lo > 127) {
256
+ buf[pos++] = lo & 127 | 128;
257
+ lo = lo >>> 7;
256
258
  }
257
- buf[pos++] = val.lo;
259
+ buf[pos++] = lo;
258
260
  }
259
261
 
260
262
  /**