BatchedHash.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const Hash = require("../Hash");
  7. const { digest, update } = require("./hash-digest");
  8. const MAX_SHORT_STRING = require("./wasm-hash").MAX_SHORT_STRING;
  9. /** @typedef {import("../../../declarations/WebpackOptions").HashDigest} Encoding */
  10. class BatchedHash extends Hash {
  11. /**
  12. * @param {Hash} hash hash
  13. */
  14. constructor(hash) {
  15. super();
  16. this.string = undefined;
  17. this.encoding = undefined;
  18. this.hash = hash;
  19. }
  20. /**
  21. * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding}
  22. * @overload
  23. * @param {string | Buffer} data data
  24. * @returns {Hash} updated hash
  25. */
  26. /**
  27. * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding}
  28. * @overload
  29. * @param {string} data data
  30. * @param {Encoding} inputEncoding data encoding
  31. * @returns {Hash} updated hash
  32. */
  33. /**
  34. * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding}
  35. * @param {string | Buffer} data data
  36. * @param {Encoding=} inputEncoding data encoding
  37. * @returns {Hash} updated hash
  38. */
  39. update(data, inputEncoding) {
  40. if (this.string !== undefined) {
  41. if (
  42. typeof data === "string" &&
  43. inputEncoding === this.encoding &&
  44. this.string.length + data.length < MAX_SHORT_STRING
  45. ) {
  46. this.string += data;
  47. return this;
  48. }
  49. if (this.encoding) {
  50. update(this.hash, this.string, this.encoding);
  51. } else {
  52. update(this.hash, this.string);
  53. }
  54. this.string = undefined;
  55. }
  56. if (typeof data === "string") {
  57. if (
  58. data.length < MAX_SHORT_STRING &&
  59. // base64 encoding is not valid since it may contain padding chars
  60. (!inputEncoding || !inputEncoding.startsWith("ba"))
  61. ) {
  62. this.string = data;
  63. this.encoding = inputEncoding;
  64. } else if (inputEncoding) {
  65. update(this.hash, data, inputEncoding);
  66. } else {
  67. update(this.hash, data);
  68. }
  69. } else {
  70. update(this.hash, data);
  71. }
  72. return this;
  73. }
  74. /**
  75. * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding}
  76. * @overload
  77. * @returns {Buffer} digest
  78. */
  79. /**
  80. * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding}
  81. * @overload
  82. * @param {Encoding} encoding encoding of the return value
  83. * @returns {string} digest
  84. */
  85. /**
  86. * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding}
  87. * @param {Encoding=} encoding encoding of the return value
  88. * @returns {string | Buffer} digest
  89. */
  90. digest(encoding) {
  91. if (this.string !== undefined) {
  92. if (this.encoding) {
  93. update(this.hash, this.string, this.encoding);
  94. } else {
  95. update(this.hash, this.string);
  96. }
  97. }
  98. if (!encoding) {
  99. return digest(this.hash);
  100. }
  101. return digest(this.hash, encoding);
  102. }
  103. }
  104. module.exports = BatchedHash;