protobufjs 6.8.8 → 6.8.9

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 (104) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +879 -879
  3. package/cli/LICENSE +33 -33
  4. package/cli/README.md +11 -11
  5. package/cli/index.d.ts +3 -3
  6. package/cli/index.js +3 -3
  7. package/cli/lib/tsd-jsdoc/LICENSE +20 -20
  8. package/cli/lib/tsd-jsdoc/README.md +23 -23
  9. package/cli/lib/tsd-jsdoc/plugin.js +21 -21
  10. package/cli/lib/tsd-jsdoc/publish.js +693 -693
  11. package/cli/lib/tsd-jsdoc.json +18 -18
  12. package/cli/package.standalone.json +31 -31
  13. package/cli/pbjs.d.ts +9 -9
  14. package/cli/pbjs.js +329 -329
  15. package/cli/pbts.d.ts +9 -9
  16. package/cli/pbts.js +197 -197
  17. package/cli/targets/json-module.js +38 -38
  18. package/cli/targets/json.js +8 -8
  19. package/cli/targets/proto.js +326 -326
  20. package/cli/targets/proto2.js +10 -10
  21. package/cli/targets/proto3.js +10 -10
  22. package/cli/targets/static-module.js +29 -29
  23. package/cli/targets/static.js +702 -702
  24. package/cli/util.js +183 -183
  25. package/cli/wrappers/amd.js +7 -7
  26. package/cli/wrappers/closure.js +7 -7
  27. package/cli/wrappers/commonjs.js +7 -7
  28. package/cli/wrappers/default.js +15 -15
  29. package/cli/wrappers/es6.js +5 -5
  30. package/dist/README.md +31 -31
  31. package/dist/light/README.md +31 -31
  32. package/dist/light/protobuf.js +6030 -6030
  33. package/dist/light/protobuf.js.map +1 -1
  34. package/dist/light/protobuf.min.js +1 -1
  35. package/dist/light/protobuf.min.js.map +1 -1
  36. package/dist/minimal/README.md +31 -31
  37. package/dist/minimal/protobuf.js +1876 -1876
  38. package/dist/minimal/protobuf.js.map +1 -1
  39. package/dist/minimal/protobuf.min.js +1 -1
  40. package/dist/minimal/protobuf.min.js.map +1 -1
  41. package/dist/protobuf.js +7595 -7595
  42. package/dist/protobuf.js.map +1 -1
  43. package/dist/protobuf.min.js +1 -1
  44. package/dist/protobuf.min.js.map +1 -1
  45. package/ext/debug/README.md +4 -4
  46. package/ext/debug/index.js +71 -71
  47. package/ext/descriptor/README.md +72 -72
  48. package/ext/descriptor/index.js +1052 -1052
  49. package/ext/descriptor/test.js +54 -54
  50. package/google/LICENSE +27 -27
  51. package/google/README.md +1 -1
  52. package/google/api/annotations.proto +10 -10
  53. package/google/protobuf/descriptor.proto +286 -286
  54. package/google/protobuf/source_context.proto +7 -7
  55. package/index.js +4 -4
  56. package/light.d.ts +2 -2
  57. package/light.js +3 -3
  58. package/minimal.d.ts +2 -2
  59. package/minimal.js +4 -4
  60. package/package-lock.json +1748 -642
  61. package/package.json +119 -122
  62. package/scripts/changelog.js +150 -150
  63. package/scripts/postinstall.js +35 -35
  64. package/src/common.js +399 -399
  65. package/src/converter.js +293 -293
  66. package/src/decoder.js +106 -106
  67. package/src/encoder.js +99 -99
  68. package/src/enum.js +181 -181
  69. package/src/field.js +371 -371
  70. package/src/index-light.js +104 -104
  71. package/src/index-minimal.js +36 -36
  72. package/src/index.js +12 -12
  73. package/src/mapfield.js +126 -126
  74. package/src/message.js +138 -138
  75. package/src/method.js +151 -151
  76. package/src/namespace.js +433 -433
  77. package/src/object.js +200 -200
  78. package/src/oneof.js +203 -203
  79. package/src/parse.js +758 -758
  80. package/src/reader.js +405 -405
  81. package/src/reader_buffer.js +44 -44
  82. package/src/root.js +351 -351
  83. package/src/roots.js +18 -18
  84. package/src/rpc/service.js +142 -142
  85. package/src/rpc.js +36 -36
  86. package/src/service.js +167 -167
  87. package/src/tokenize.js +397 -397
  88. package/src/type.js +589 -589
  89. package/src/types.js +196 -196
  90. package/src/typescript.jsdoc +15 -15
  91. package/src/util/longbits.js +200 -200
  92. package/src/util/minimal.js +414 -414
  93. package/src/util.js +178 -178
  94. package/src/verifier.js +176 -176
  95. package/src/wrappers.js +83 -83
  96. package/src/writer.js +459 -459
  97. package/src/writer_buffer.js +81 -81
  98. package/tsconfig.json +6 -6
  99. package/cli/node_modules/os-tmpdir/index.js +0 -25
  100. package/cli/node_modules/os-tmpdir/license +0 -21
  101. package/cli/node_modules/os-tmpdir/readme.md +0 -32
  102. package/cli/node_modules/tmp/LICENSE +0 -21
  103. package/cli/node_modules/tmp/README.md +0 -314
  104. package/cli/node_modules/tmp/lib/tmp.js +0 -611
package/src/writer.js CHANGED
@@ -1,459 +1,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
- /**
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
+ /**
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
+ };