protobufjs 6.8.8 → 6.9.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +941 -921
  2. package/LICENSE +39 -39
  3. package/README.md +901 -879
  4. package/cli/LICENSE +33 -33
  5. package/cli/README.md +11 -11
  6. package/cli/index.d.ts +3 -3
  7. package/cli/index.js +3 -3
  8. package/cli/lib/tsd-jsdoc/LICENSE +20 -20
  9. package/cli/lib/tsd-jsdoc/README.md +23 -23
  10. package/cli/lib/tsd-jsdoc/plugin.js +21 -21
  11. package/cli/lib/tsd-jsdoc/publish.js +705 -693
  12. package/cli/lib/tsd-jsdoc.json +18 -18
  13. package/cli/package.json +1 -1
  14. package/cli/package.standalone.json +32 -32
  15. package/cli/pbjs.d.ts +9 -9
  16. package/cli/pbjs.js +329 -329
  17. package/cli/pbts.d.ts +9 -9
  18. package/cli/pbts.js +197 -197
  19. package/cli/targets/json-module.js +38 -38
  20. package/cli/targets/json.js +8 -8
  21. package/cli/targets/proto.js +326 -326
  22. package/cli/targets/proto2.js +10 -10
  23. package/cli/targets/proto3.js +10 -10
  24. package/cli/targets/static-module.js +29 -29
  25. package/cli/targets/static.js +702 -702
  26. package/cli/util.js +183 -183
  27. package/cli/wrappers/amd.js +7 -7
  28. package/cli/wrappers/closure.js +7 -7
  29. package/cli/wrappers/commonjs.js +7 -7
  30. package/cli/wrappers/default.js +15 -15
  31. package/cli/wrappers/es6.js +5 -5
  32. package/dist/README.md +31 -31
  33. package/dist/light/README.md +31 -31
  34. package/dist/light/protobuf.js +6058 -6032
  35. package/dist/light/protobuf.js.map +1 -1
  36. package/dist/light/protobuf.min.js +3 -3
  37. package/dist/light/protobuf.min.js.map +1 -1
  38. package/dist/minimal/README.md +31 -31
  39. package/dist/minimal/protobuf.js +1900 -1877
  40. package/dist/minimal/protobuf.js.map +1 -1
  41. package/dist/minimal/protobuf.min.js +3 -3
  42. package/dist/minimal/protobuf.min.js.map +1 -1
  43. package/dist/protobuf.js +7625 -7596
  44. package/dist/protobuf.js.map +1 -1
  45. package/dist/protobuf.min.js +3 -3
  46. package/dist/protobuf.min.js.map +1 -1
  47. package/ext/debug/README.md +4 -4
  48. package/ext/debug/index.js +71 -71
  49. package/ext/descriptor/README.md +72 -72
  50. package/ext/descriptor/index.js +1052 -1052
  51. package/ext/descriptor/test.js +54 -54
  52. package/google/LICENSE +27 -27
  53. package/google/README.md +1 -1
  54. package/google/api/annotations.proto +10 -10
  55. package/google/protobuf/descriptor.proto +286 -286
  56. package/google/protobuf/source_context.proto +7 -7
  57. package/index.d.ts +6 -6
  58. package/index.js +4 -4
  59. package/light.d.ts +2 -2
  60. package/light.js +3 -3
  61. package/minimal.d.ts +2 -2
  62. package/minimal.js +4 -4
  63. package/package-lock.json +4223 -3171
  64. package/package.json +122 -122
  65. package/scripts/changelog.js +150 -150
  66. package/scripts/postinstall.js +35 -35
  67. package/src/common.js +399 -399
  68. package/src/converter.js +293 -293
  69. package/src/decoder.js +106 -106
  70. package/src/encoder.js +100 -100
  71. package/src/enum.js +181 -181
  72. package/src/field.js +371 -371
  73. package/src/index-light.js +104 -104
  74. package/src/index-minimal.js +36 -36
  75. package/src/index.js +12 -12
  76. package/src/mapfield.js +126 -126
  77. package/src/message.js +138 -138
  78. package/src/method.js +151 -151
  79. package/src/namespace.js +433 -433
  80. package/src/object.js +200 -200
  81. package/src/oneof.js +203 -203
  82. package/src/parse.js +761 -758
  83. package/src/reader.js +411 -405
  84. package/src/reader_buffer.js +51 -44
  85. package/src/root.js +353 -351
  86. package/src/roots.js +18 -18
  87. package/src/rpc/service.js +142 -142
  88. package/src/rpc.js +36 -36
  89. package/src/service.js +167 -167
  90. package/src/tokenize.js +397 -397
  91. package/src/type.js +589 -589
  92. package/src/types.js +196 -196
  93. package/src/typescript.jsdoc +15 -15
  94. package/src/util/longbits.js +200 -200
  95. package/src/util/minimal.js +414 -414
  96. package/src/util.js +178 -178
  97. package/src/verifier.js +176 -176
  98. package/src/wrappers.js +83 -83
  99. package/src/writer.js +465 -459
  100. package/src/writer_buffer.js +85 -81
  101. package/tsconfig.json +6 -6
  102. package/cli/node_modules/os-tmpdir/index.js +0 -25
  103. package/cli/node_modules/os-tmpdir/license +0 -21
  104. package/cli/node_modules/os-tmpdir/readme.md +0 -32
  105. package/cli/node_modules/tmp/LICENSE +0 -21
  106. package/cli/node_modules/tmp/README.md +0 -314
  107. package/cli/node_modules/tmp/lib/tmp.js +0 -611
  108. package/cli/package-lock.json +0 -20
package/src/writer.js CHANGED
@@ -1,459 +1,465 @@
1
- "use strict";
2
- module.exports = Writer;
3
-
4
- var util = require("./util/minimal");
5
-
6
- var BufferWriter; // cyclic
7
-
8
- var LongBits = util.LongBits,
9
- base64 = util.base64,
10
- utf8 = util.utf8;
11
-
12
- /**
13
- * Constructs a new writer operation instance.
14
- * @classdesc Scheduled writer operation.
15
- * @constructor
16
- * @param {function(*, Uint8Array, number)} fn Function to call
17
- * @param {number} len Value byte length
18
- * @param {*} val Value to write
19
- * @ignore
20
- */
21
- function Op(fn, len, val) {
22
-
23
- /**
24
- * Function to call.
25
- * @type {function(Uint8Array, number, *)}
26
- */
27
- this.fn = fn;
28
-
29
- /**
30
- * Value byte length.
31
- * @type {number}
32
- */
33
- this.len = len;
34
-
35
- /**
36
- * Next operation.
37
- * @type {Writer.Op|undefined}
38
- */
39
- this.next = undefined;
40
-
41
- /**
42
- * Value to write.
43
- * @type {*}
44
- */
45
- this.val = val; // type varies
46
- }
47
-
48
- /* istanbul ignore next */
49
- function noop() {} // eslint-disable-line no-empty-function
50
-
51
- /**
52
- * Constructs a new writer state instance.
53
- * @classdesc Copied writer state.
54
- * @memberof Writer
55
- * @constructor
56
- * @param {Writer} writer Writer to copy state from
57
- * @ignore
58
- */
59
- function State(writer) {
60
-
61
- /**
62
- * Current head.
63
- * @type {Writer.Op}
64
- */
65
- this.head = writer.head;
66
-
67
- /**
68
- * Current tail.
69
- * @type {Writer.Op}
70
- */
71
- this.tail = writer.tail;
72
-
73
- /**
74
- * Current buffer length.
75
- * @type {number}
76
- */
77
- this.len = writer.len;
78
-
79
- /**
80
- * Next state.
81
- * @type {State|null}
82
- */
83
- this.next = writer.states;
84
- }
85
-
86
- /**
87
- * Constructs a new writer instance.
88
- * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.
89
- * @constructor
90
- */
91
- function Writer() {
92
-
93
- /**
94
- * Current length.
95
- * @type {number}
96
- */
97
- this.len = 0;
98
-
99
- /**
100
- * Operations head.
101
- * @type {Object}
102
- */
103
- this.head = new Op(noop, 0, 0);
104
-
105
- /**
106
- * Operations tail
107
- * @type {Object}
108
- */
109
- this.tail = this.head;
110
-
111
- /**
112
- * Linked forked states.
113
- * @type {Object|null}
114
- */
115
- this.states = null;
116
-
117
- // When a value is written, the writer calculates its byte length and puts it into a linked
118
- // list of operations to perform when finish() is called. This both allows us to allocate
119
- // buffers of the exact required size and reduces the amount of work we have to do compared
120
- // to first calculating over objects and then encoding over objects. In our case, the encoding
121
- // part is just a linked list walk calling operations with already prepared values.
122
- }
123
-
124
- /**
125
- * Creates a new writer.
126
- * @function
127
- * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}
128
- */
129
- Writer.create = util.Buffer
130
- ? function create_buffer_setup() {
131
- return (Writer.create = function create_buffer() {
132
- return new BufferWriter();
133
- })();
134
- }
135
- /* istanbul ignore next */
136
- : function create_array() {
137
- return new Writer();
138
- };
139
-
140
- /**
141
- * Allocates a buffer of the specified size.
142
- * @param {number} size Buffer size
143
- * @returns {Uint8Array} Buffer
144
- */
145
- Writer.alloc = function alloc(size) {
146
- return new util.Array(size);
147
- };
148
-
149
- // Use Uint8Array buffer pool in the browser, just like node does with buffers
150
- /* istanbul ignore else */
151
- if (util.Array !== Array)
152
- Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);
153
-
154
- /**
155
- * Pushes a new operation to the queue.
156
- * @param {function(Uint8Array, number, *)} fn Function to call
157
- * @param {number} len Value byte length
158
- * @param {number} val Value to write
159
- * @returns {Writer} `this`
160
- * @private
161
- */
162
- Writer.prototype._push = function push(fn, len, val) {
163
- this.tail = this.tail.next = new Op(fn, len, val);
164
- this.len += len;
165
- return this;
166
- };
167
-
168
- function writeByte(val, buf, pos) {
169
- buf[pos] = val & 255;
170
- }
171
-
172
- function writeVarint32(val, buf, pos) {
173
- while (val > 127) {
174
- buf[pos++] = val & 127 | 128;
175
- val >>>= 7;
176
- }
177
- buf[pos] = val;
178
- }
179
-
180
- /**
181
- * Constructs a new varint writer operation instance.
182
- * @classdesc Scheduled varint writer operation.
183
- * @extends Op
184
- * @constructor
185
- * @param {number} len Value byte length
186
- * @param {number} val Value to write
187
- * @ignore
188
- */
189
- function VarintOp(len, val) {
190
- this.len = len;
191
- this.next = undefined;
192
- this.val = val;
193
- }
194
-
195
- VarintOp.prototype = Object.create(Op.prototype);
196
- VarintOp.prototype.fn = writeVarint32;
197
-
198
- /**
199
- * Writes an unsigned 32 bit value as a varint.
200
- * @param {number} value Value to write
201
- * @returns {Writer} `this`
202
- */
203
- Writer.prototype.uint32 = function write_uint32(value) {
204
- // here, the call to this.push has been inlined and a varint specific Op subclass is used.
205
- // uint32 is by far the most frequently used operation and benefits significantly from this.
206
- this.len += (this.tail = this.tail.next = new VarintOp(
207
- (value = value >>> 0)
208
- < 128 ? 1
209
- : value < 16384 ? 2
210
- : value < 2097152 ? 3
211
- : value < 268435456 ? 4
212
- : 5,
213
- value)).len;
214
- return this;
215
- };
216
-
217
- /**
218
- * Writes a signed 32 bit value as a varint.
219
- * @function
220
- * @param {number} value Value to write
221
- * @returns {Writer} `this`
222
- */
223
- Writer.prototype.int32 = function write_int32(value) {
224
- return value < 0
225
- ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec
226
- : this.uint32(value);
227
- };
228
-
229
- /**
230
- * Writes a 32 bit value as a varint, zig-zag encoded.
231
- * @param {number} value Value to write
232
- * @returns {Writer} `this`
233
- */
234
- Writer.prototype.sint32 = function write_sint32(value) {
235
- return this.uint32((value << 1 ^ value >> 31) >>> 0);
236
- };
237
-
238
- function writeVarint64(val, buf, pos) {
239
- while (val.hi) {
240
- buf[pos++] = val.lo & 127 | 128;
241
- val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;
242
- val.hi >>>= 7;
243
- }
244
- while (val.lo > 127) {
245
- buf[pos++] = val.lo & 127 | 128;
246
- val.lo = val.lo >>> 7;
247
- }
248
- buf[pos++] = val.lo;
249
- }
250
-
251
- /**
252
- * Writes an unsigned 64 bit value as a varint.
253
- * @param {Long|number|string} value Value to write
254
- * @returns {Writer} `this`
255
- * @throws {TypeError} If `value` is a string and no long library is present.
256
- */
257
- Writer.prototype.uint64 = function write_uint64(value) {
258
- var bits = LongBits.from(value);
259
- return this._push(writeVarint64, bits.length(), bits);
260
- };
261
-
262
- /**
263
- * Writes a signed 64 bit value as a varint.
264
- * @function
265
- * @param {Long|number|string} value Value to write
266
- * @returns {Writer} `this`
267
- * @throws {TypeError} If `value` is a string and no long library is present.
268
- */
269
- Writer.prototype.int64 = Writer.prototype.uint64;
270
-
271
- /**
272
- * Writes a signed 64 bit value as a varint, zig-zag encoded.
273
- * @param {Long|number|string} value Value to write
274
- * @returns {Writer} `this`
275
- * @throws {TypeError} If `value` is a string and no long library is present.
276
- */
277
- Writer.prototype.sint64 = function write_sint64(value) {
278
- var bits = LongBits.from(value).zzEncode();
279
- return this._push(writeVarint64, bits.length(), bits);
280
- };
281
-
282
- /**
283
- * Writes a boolish value as a varint.
284
- * @param {boolean} value Value to write
285
- * @returns {Writer} `this`
286
- */
287
- Writer.prototype.bool = function write_bool(value) {
288
- return this._push(writeByte, 1, value ? 1 : 0);
289
- };
290
-
291
- function writeFixed32(val, buf, pos) {
292
- buf[pos ] = val & 255;
293
- buf[pos + 1] = val >>> 8 & 255;
294
- buf[pos + 2] = val >>> 16 & 255;
295
- buf[pos + 3] = val >>> 24;
296
- }
297
-
298
- /**
299
- * Writes an unsigned 32 bit value as fixed 32 bits.
300
- * @param {number} value Value to write
301
- * @returns {Writer} `this`
302
- */
303
- Writer.prototype.fixed32 = function write_fixed32(value) {
304
- return this._push(writeFixed32, 4, value >>> 0);
305
- };
306
-
307
- /**
308
- * Writes a signed 32 bit value as fixed 32 bits.
309
- * @function
310
- * @param {number} value Value to write
311
- * @returns {Writer} `this`
312
- */
313
- Writer.prototype.sfixed32 = Writer.prototype.fixed32;
314
-
315
- /**
316
- * Writes an unsigned 64 bit value as fixed 64 bits.
317
- * @param {Long|number|string} value Value to write
318
- * @returns {Writer} `this`
319
- * @throws {TypeError} If `value` is a string and no long library is present.
320
- */
321
- Writer.prototype.fixed64 = function write_fixed64(value) {
322
- var bits = LongBits.from(value);
323
- return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);
324
- };
325
-
326
- /**
327
- * Writes a signed 64 bit value as fixed 64 bits.
328
- * @function
329
- * @param {Long|number|string} value Value to write
330
- * @returns {Writer} `this`
331
- * @throws {TypeError} If `value` is a string and no long library is present.
332
- */
333
- Writer.prototype.sfixed64 = Writer.prototype.fixed64;
334
-
335
- /**
336
- * Writes a float (32 bit).
337
- * @function
338
- * @param {number} value Value to write
339
- * @returns {Writer} `this`
340
- */
341
- Writer.prototype.float = function write_float(value) {
342
- return this._push(util.float.writeFloatLE, 4, value);
343
- };
344
-
345
- /**
346
- * Writes a double (64 bit float).
347
- * @function
348
- * @param {number} value Value to write
349
- * @returns {Writer} `this`
350
- */
351
- Writer.prototype.double = function write_double(value) {
352
- return this._push(util.float.writeDoubleLE, 8, value);
353
- };
354
-
355
- var writeBytes = util.Array.prototype.set
356
- ? function writeBytes_set(val, buf, pos) {
357
- buf.set(val, pos); // also works for plain array values
358
- }
359
- /* istanbul ignore next */
360
- : function writeBytes_for(val, buf, pos) {
361
- for (var i = 0; i < val.length; ++i)
362
- buf[pos + i] = val[i];
363
- };
364
-
365
- /**
366
- * Writes a sequence of bytes.
367
- * @param {Uint8Array|string} value Buffer or base64 encoded string to write
368
- * @returns {Writer} `this`
369
- */
370
- Writer.prototype.bytes = function write_bytes(value) {
371
- var len = value.length >>> 0;
372
- if (!len)
373
- return this._push(writeByte, 1, 0);
374
- if (util.isString(value)) {
375
- var buf = Writer.alloc(len = base64.length(value));
376
- base64.decode(value, buf, 0);
377
- value = buf;
378
- }
379
- return this.uint32(len)._push(writeBytes, len, value);
380
- };
381
-
382
- /**
383
- * Writes a string.
384
- * @param {string} value Value to write
385
- * @returns {Writer} `this`
386
- */
387
- Writer.prototype.string = function write_string(value) {
388
- var len = utf8.length(value);
389
- return len
390
- ? this.uint32(len)._push(utf8.write, len, value)
391
- : this._push(writeByte, 1, 0);
392
- };
393
-
394
- /**
395
- * Forks this writer's state by pushing it to a stack.
396
- * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.
397
- * @returns {Writer} `this`
398
- */
399
- Writer.prototype.fork = function fork() {
400
- this.states = new State(this);
401
- this.head = this.tail = new Op(noop, 0, 0);
402
- this.len = 0;
403
- return this;
404
- };
405
-
406
- /**
407
- * Resets this instance to the last state.
408
- * @returns {Writer} `this`
409
- */
410
- Writer.prototype.reset = function reset() {
411
- if (this.states) {
412
- this.head = this.states.head;
413
- this.tail = this.states.tail;
414
- this.len = this.states.len;
415
- this.states = this.states.next;
416
- } else {
417
- this.head = this.tail = new Op(noop, 0, 0);
418
- this.len = 0;
419
- }
420
- return this;
421
- };
422
-
423
- /**
424
- * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.
425
- * @returns {Writer} `this`
426
- */
427
- Writer.prototype.ldelim = function ldelim() {
428
- var head = this.head,
429
- tail = this.tail,
430
- len = this.len;
431
- this.reset().uint32(len);
432
- if (len) {
433
- this.tail.next = head.next; // skip noop
434
- this.tail = tail;
435
- this.len += len;
436
- }
437
- return this;
438
- };
439
-
440
- /**
441
- * Finishes the write operation.
442
- * @returns {Uint8Array} Finished buffer
443
- */
444
- Writer.prototype.finish = function finish() {
445
- var head = this.head.next, // skip noop
446
- buf = this.constructor.alloc(this.len),
447
- pos = 0;
448
- while (head) {
449
- head.fn(head.val, buf, pos);
450
- pos += head.len;
451
- head = head.next;
452
- }
453
- // this.head = this.tail = null;
454
- return buf;
455
- };
456
-
457
- Writer._configure = function(BufferWriter_) {
458
- BufferWriter = BufferWriter_;
459
- };
1
+ "use strict";
2
+ module.exports = Writer;
3
+
4
+ var util = require("./util/minimal");
5
+
6
+ var BufferWriter; // cyclic
7
+
8
+ var LongBits = util.LongBits,
9
+ base64 = util.base64,
10
+ utf8 = util.utf8;
11
+
12
+ /**
13
+ * Constructs a new writer operation instance.
14
+ * @classdesc Scheduled writer operation.
15
+ * @constructor
16
+ * @param {function(*, Uint8Array, number)} fn Function to call
17
+ * @param {number} len Value byte length
18
+ * @param {*} val Value to write
19
+ * @ignore
20
+ */
21
+ function Op(fn, len, val) {
22
+
23
+ /**
24
+ * Function to call.
25
+ * @type {function(Uint8Array, number, *)}
26
+ */
27
+ this.fn = fn;
28
+
29
+ /**
30
+ * Value byte length.
31
+ * @type {number}
32
+ */
33
+ this.len = len;
34
+
35
+ /**
36
+ * Next operation.
37
+ * @type {Writer.Op|undefined}
38
+ */
39
+ this.next = undefined;
40
+
41
+ /**
42
+ * Value to write.
43
+ * @type {*}
44
+ */
45
+ this.val = val; // type varies
46
+ }
47
+
48
+ /* istanbul ignore next */
49
+ function noop() {} // eslint-disable-line no-empty-function
50
+
51
+ /**
52
+ * Constructs a new writer state instance.
53
+ * @classdesc Copied writer state.
54
+ * @memberof Writer
55
+ * @constructor
56
+ * @param {Writer} writer Writer to copy state from
57
+ * @ignore
58
+ */
59
+ function State(writer) {
60
+
61
+ /**
62
+ * Current head.
63
+ * @type {Writer.Op}
64
+ */
65
+ this.head = writer.head;
66
+
67
+ /**
68
+ * Current tail.
69
+ * @type {Writer.Op}
70
+ */
71
+ this.tail = writer.tail;
72
+
73
+ /**
74
+ * Current buffer length.
75
+ * @type {number}
76
+ */
77
+ this.len = writer.len;
78
+
79
+ /**
80
+ * Next state.
81
+ * @type {State|null}
82
+ */
83
+ this.next = writer.states;
84
+ }
85
+
86
+ /**
87
+ * Constructs a new writer instance.
88
+ * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.
89
+ * @constructor
90
+ */
91
+ function Writer() {
92
+
93
+ /**
94
+ * Current length.
95
+ * @type {number}
96
+ */
97
+ this.len = 0;
98
+
99
+ /**
100
+ * Operations head.
101
+ * @type {Object}
102
+ */
103
+ this.head = new Op(noop, 0, 0);
104
+
105
+ /**
106
+ * Operations tail
107
+ * @type {Object}
108
+ */
109
+ this.tail = this.head;
110
+
111
+ /**
112
+ * Linked forked states.
113
+ * @type {Object|null}
114
+ */
115
+ this.states = null;
116
+
117
+ // When a value is written, the writer calculates its byte length and puts it into a linked
118
+ // list of operations to perform when finish() is called. This both allows us to allocate
119
+ // buffers of the exact required size and reduces the amount of work we have to do compared
120
+ // to first calculating over objects and then encoding over objects. In our case, the encoding
121
+ // part is just a linked list walk calling operations with already prepared values.
122
+ }
123
+
124
+ var create = function create() {
125
+ return util.Buffer
126
+ ? function create_buffer_setup() {
127
+ return (Writer.create = function create_buffer() {
128
+ return new BufferWriter();
129
+ })();
130
+ }
131
+ /* istanbul ignore next */
132
+ : function create_array() {
133
+ return new Writer();
134
+ };
135
+ };
136
+
137
+ /**
138
+ * Creates a new writer.
139
+ * @function
140
+ * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}
141
+ */
142
+ Writer.create = create();
143
+
144
+ /**
145
+ * Allocates a buffer of the specified size.
146
+ * @param {number} size Buffer size
147
+ * @returns {Uint8Array} Buffer
148
+ */
149
+ Writer.alloc = function alloc(size) {
150
+ return new util.Array(size);
151
+ };
152
+
153
+ // Use Uint8Array buffer pool in the browser, just like node does with buffers
154
+ /* istanbul ignore else */
155
+ if (util.Array !== Array)
156
+ Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);
157
+
158
+ /**
159
+ * Pushes a new operation to the queue.
160
+ * @param {function(Uint8Array, number, *)} fn Function to call
161
+ * @param {number} len Value byte length
162
+ * @param {number} val Value to write
163
+ * @returns {Writer} `this`
164
+ * @private
165
+ */
166
+ Writer.prototype._push = function push(fn, len, val) {
167
+ this.tail = this.tail.next = new Op(fn, len, val);
168
+ this.len += len;
169
+ return this;
170
+ };
171
+
172
+ function writeByte(val, buf, pos) {
173
+ buf[pos] = val & 255;
174
+ }
175
+
176
+ function writeVarint32(val, buf, pos) {
177
+ while (val > 127) {
178
+ buf[pos++] = val & 127 | 128;
179
+ val >>>= 7;
180
+ }
181
+ buf[pos] = val;
182
+ }
183
+
184
+ /**
185
+ * Constructs a new varint writer operation instance.
186
+ * @classdesc Scheduled varint writer operation.
187
+ * @extends Op
188
+ * @constructor
189
+ * @param {number} len Value byte length
190
+ * @param {number} val Value to write
191
+ * @ignore
192
+ */
193
+ function VarintOp(len, val) {
194
+ this.len = len;
195
+ this.next = undefined;
196
+ this.val = val;
197
+ }
198
+
199
+ VarintOp.prototype = Object.create(Op.prototype);
200
+ VarintOp.prototype.fn = writeVarint32;
201
+
202
+ /**
203
+ * Writes an unsigned 32 bit value as a varint.
204
+ * @param {number} value Value to write
205
+ * @returns {Writer} `this`
206
+ */
207
+ Writer.prototype.uint32 = function write_uint32(value) {
208
+ // here, the call to this.push has been inlined and a varint specific Op subclass is used.
209
+ // uint32 is by far the most frequently used operation and benefits significantly from this.
210
+ this.len += (this.tail = this.tail.next = new VarintOp(
211
+ (value = value >>> 0)
212
+ < 128 ? 1
213
+ : value < 16384 ? 2
214
+ : value < 2097152 ? 3
215
+ : value < 268435456 ? 4
216
+ : 5,
217
+ value)).len;
218
+ return this;
219
+ };
220
+
221
+ /**
222
+ * Writes a signed 32 bit value as a varint.
223
+ * @function
224
+ * @param {number} value Value to write
225
+ * @returns {Writer} `this`
226
+ */
227
+ Writer.prototype.int32 = function write_int32(value) {
228
+ return value < 0
229
+ ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec
230
+ : this.uint32(value);
231
+ };
232
+
233
+ /**
234
+ * Writes a 32 bit value as a varint, zig-zag encoded.
235
+ * @param {number} value Value to write
236
+ * @returns {Writer} `this`
237
+ */
238
+ Writer.prototype.sint32 = function write_sint32(value) {
239
+ return this.uint32((value << 1 ^ value >> 31) >>> 0);
240
+ };
241
+
242
+ function writeVarint64(val, buf, pos) {
243
+ while (val.hi) {
244
+ buf[pos++] = val.lo & 127 | 128;
245
+ val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;
246
+ val.hi >>>= 7;
247
+ }
248
+ while (val.lo > 127) {
249
+ buf[pos++] = val.lo & 127 | 128;
250
+ val.lo = val.lo >>> 7;
251
+ }
252
+ buf[pos++] = val.lo;
253
+ }
254
+
255
+ /**
256
+ * Writes an unsigned 64 bit value as a varint.
257
+ * @param {Long|number|string} value Value to write
258
+ * @returns {Writer} `this`
259
+ * @throws {TypeError} If `value` is a string and no long library is present.
260
+ */
261
+ Writer.prototype.uint64 = function write_uint64(value) {
262
+ var bits = LongBits.from(value);
263
+ return this._push(writeVarint64, bits.length(), bits);
264
+ };
265
+
266
+ /**
267
+ * Writes a signed 64 bit value as a varint.
268
+ * @function
269
+ * @param {Long|number|string} value Value to write
270
+ * @returns {Writer} `this`
271
+ * @throws {TypeError} If `value` is a string and no long library is present.
272
+ */
273
+ Writer.prototype.int64 = Writer.prototype.uint64;
274
+
275
+ /**
276
+ * Writes a signed 64 bit value as a varint, zig-zag encoded.
277
+ * @param {Long|number|string} value Value to write
278
+ * @returns {Writer} `this`
279
+ * @throws {TypeError} If `value` is a string and no long library is present.
280
+ */
281
+ Writer.prototype.sint64 = function write_sint64(value) {
282
+ var bits = LongBits.from(value).zzEncode();
283
+ return this._push(writeVarint64, bits.length(), bits);
284
+ };
285
+
286
+ /**
287
+ * Writes a boolish value as a varint.
288
+ * @param {boolean} value Value to write
289
+ * @returns {Writer} `this`
290
+ */
291
+ Writer.prototype.bool = function write_bool(value) {
292
+ return this._push(writeByte, 1, value ? 1 : 0);
293
+ };
294
+
295
+ function writeFixed32(val, buf, pos) {
296
+ buf[pos ] = val & 255;
297
+ buf[pos + 1] = val >>> 8 & 255;
298
+ buf[pos + 2] = val >>> 16 & 255;
299
+ buf[pos + 3] = val >>> 24;
300
+ }
301
+
302
+ /**
303
+ * Writes an unsigned 32 bit value as fixed 32 bits.
304
+ * @param {number} value Value to write
305
+ * @returns {Writer} `this`
306
+ */
307
+ Writer.prototype.fixed32 = function write_fixed32(value) {
308
+ return this._push(writeFixed32, 4, value >>> 0);
309
+ };
310
+
311
+ /**
312
+ * Writes a signed 32 bit value as fixed 32 bits.
313
+ * @function
314
+ * @param {number} value Value to write
315
+ * @returns {Writer} `this`
316
+ */
317
+ Writer.prototype.sfixed32 = Writer.prototype.fixed32;
318
+
319
+ /**
320
+ * Writes an unsigned 64 bit value as fixed 64 bits.
321
+ * @param {Long|number|string} value Value to write
322
+ * @returns {Writer} `this`
323
+ * @throws {TypeError} If `value` is a string and no long library is present.
324
+ */
325
+ Writer.prototype.fixed64 = function write_fixed64(value) {
326
+ var bits = LongBits.from(value);
327
+ return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);
328
+ };
329
+
330
+ /**
331
+ * Writes a signed 64 bit value as fixed 64 bits.
332
+ * @function
333
+ * @param {Long|number|string} value Value to write
334
+ * @returns {Writer} `this`
335
+ * @throws {TypeError} If `value` is a string and no long library is present.
336
+ */
337
+ Writer.prototype.sfixed64 = Writer.prototype.fixed64;
338
+
339
+ /**
340
+ * Writes a float (32 bit).
341
+ * @function
342
+ * @param {number} value Value to write
343
+ * @returns {Writer} `this`
344
+ */
345
+ Writer.prototype.float = function write_float(value) {
346
+ return this._push(util.float.writeFloatLE, 4, value);
347
+ };
348
+
349
+ /**
350
+ * Writes a double (64 bit float).
351
+ * @function
352
+ * @param {number} value Value to write
353
+ * @returns {Writer} `this`
354
+ */
355
+ Writer.prototype.double = function write_double(value) {
356
+ return this._push(util.float.writeDoubleLE, 8, value);
357
+ };
358
+
359
+ var writeBytes = util.Array.prototype.set
360
+ ? function writeBytes_set(val, buf, pos) {
361
+ buf.set(val, pos); // also works for plain array values
362
+ }
363
+ /* istanbul ignore next */
364
+ : function writeBytes_for(val, buf, pos) {
365
+ for (var i = 0; i < val.length; ++i)
366
+ buf[pos + i] = val[i];
367
+ };
368
+
369
+ /**
370
+ * Writes a sequence of bytes.
371
+ * @param {Uint8Array|string} value Buffer or base64 encoded string to write
372
+ * @returns {Writer} `this`
373
+ */
374
+ Writer.prototype.bytes = function write_bytes(value) {
375
+ var len = value.length >>> 0;
376
+ if (!len)
377
+ return this._push(writeByte, 1, 0);
378
+ if (util.isString(value)) {
379
+ var buf = Writer.alloc(len = base64.length(value));
380
+ base64.decode(value, buf, 0);
381
+ value = buf;
382
+ }
383
+ return this.uint32(len)._push(writeBytes, len, value);
384
+ };
385
+
386
+ /**
387
+ * Writes a string.
388
+ * @param {string} value Value to write
389
+ * @returns {Writer} `this`
390
+ */
391
+ Writer.prototype.string = function write_string(value) {
392
+ var len = utf8.length(value);
393
+ return len
394
+ ? this.uint32(len)._push(utf8.write, len, value)
395
+ : this._push(writeByte, 1, 0);
396
+ };
397
+
398
+ /**
399
+ * Forks this writer's state by pushing it to a stack.
400
+ * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.
401
+ * @returns {Writer} `this`
402
+ */
403
+ Writer.prototype.fork = function fork() {
404
+ this.states = new State(this);
405
+ this.head = this.tail = new Op(noop, 0, 0);
406
+ this.len = 0;
407
+ return this;
408
+ };
409
+
410
+ /**
411
+ * Resets this instance to the last state.
412
+ * @returns {Writer} `this`
413
+ */
414
+ Writer.prototype.reset = function reset() {
415
+ if (this.states) {
416
+ this.head = this.states.head;
417
+ this.tail = this.states.tail;
418
+ this.len = this.states.len;
419
+ this.states = this.states.next;
420
+ } else {
421
+ this.head = this.tail = new Op(noop, 0, 0);
422
+ this.len = 0;
423
+ }
424
+ return this;
425
+ };
426
+
427
+ /**
428
+ * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.
429
+ * @returns {Writer} `this`
430
+ */
431
+ Writer.prototype.ldelim = function ldelim() {
432
+ var head = this.head,
433
+ tail = this.tail,
434
+ len = this.len;
435
+ this.reset().uint32(len);
436
+ if (len) {
437
+ this.tail.next = head.next; // skip noop
438
+ this.tail = tail;
439
+ this.len += len;
440
+ }
441
+ return this;
442
+ };
443
+
444
+ /**
445
+ * Finishes the write operation.
446
+ * @returns {Uint8Array} Finished buffer
447
+ */
448
+ Writer.prototype.finish = function finish() {
449
+ var head = this.head.next, // skip noop
450
+ buf = this.constructor.alloc(this.len),
451
+ pos = 0;
452
+ while (head) {
453
+ head.fn(head.val, buf, pos);
454
+ pos += head.len;
455
+ head = head.next;
456
+ }
457
+ // this.head = this.tail = null;
458
+ return buf;
459
+ };
460
+
461
+ Writer._configure = function(BufferWriter_) {
462
+ BufferWriter = BufferWriter_;
463
+ Writer.create = create();
464
+ BufferWriter._configure();
465
+ };