buffer-writer.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. "use strict";
  2. //binary data writer tuned for encoding binary specific to the postgres binary protocol
  3. Object.defineProperty(exports, "__esModule", { value: true });
  4. exports.Writer = void 0;
  5. class Writer {
  6. constructor(size = 256) {
  7. this.size = size;
  8. this.offset = 5;
  9. this.headerPosition = 0;
  10. this.buffer = Buffer.allocUnsafe(size);
  11. }
  12. ensure(size) {
  13. var remaining = this.buffer.length - this.offset;
  14. if (remaining < size) {
  15. var oldBuffer = this.buffer;
  16. // exponential growth factor of around ~ 1.5
  17. // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
  18. var newSize = oldBuffer.length + (oldBuffer.length >> 1) + size;
  19. this.buffer = Buffer.allocUnsafe(newSize);
  20. oldBuffer.copy(this.buffer);
  21. }
  22. }
  23. addInt32(num) {
  24. this.ensure(4);
  25. this.buffer[this.offset++] = (num >>> 24) & 0xff;
  26. this.buffer[this.offset++] = (num >>> 16) & 0xff;
  27. this.buffer[this.offset++] = (num >>> 8) & 0xff;
  28. this.buffer[this.offset++] = (num >>> 0) & 0xff;
  29. return this;
  30. }
  31. addInt16(num) {
  32. this.ensure(2);
  33. this.buffer[this.offset++] = (num >>> 8) & 0xff;
  34. this.buffer[this.offset++] = (num >>> 0) & 0xff;
  35. return this;
  36. }
  37. addCString(string) {
  38. if (!string) {
  39. this.ensure(1);
  40. }
  41. else {
  42. var len = Buffer.byteLength(string);
  43. this.ensure(len + 1); // +1 for null terminator
  44. this.buffer.write(string, this.offset, 'utf-8');
  45. this.offset += len;
  46. }
  47. this.buffer[this.offset++] = 0; // null terminator
  48. return this;
  49. }
  50. addString(string = '') {
  51. var len = Buffer.byteLength(string);
  52. this.ensure(len);
  53. this.buffer.write(string, this.offset);
  54. this.offset += len;
  55. return this;
  56. }
  57. add(otherBuffer) {
  58. this.ensure(otherBuffer.length);
  59. otherBuffer.copy(this.buffer, this.offset);
  60. this.offset += otherBuffer.length;
  61. return this;
  62. }
  63. join(code) {
  64. if (code) {
  65. this.buffer[this.headerPosition] = code;
  66. //length is everything in this packet minus the code
  67. const length = this.offset - (this.headerPosition + 1);
  68. this.buffer.writeInt32BE(length, this.headerPosition + 1);
  69. }
  70. return this.buffer.slice(code ? 0 : 5, this.offset);
  71. }
  72. flush(code) {
  73. var result = this.join(code);
  74. this.offset = 5;
  75. this.headerPosition = 0;
  76. this.buffer = Buffer.allocUnsafe(this.size);
  77. return result;
  78. }
  79. }
  80. exports.Writer = Writer;
  81. //# sourceMappingURL=buffer-writer.js.map