serialization.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. */
  4. "use strict";
  5. const { DEFAULTS } = require("../config/defaults");
  6. const memoize = require("./memoize");
  7. /** @typedef {import("../serialization/BinaryMiddleware").MEASURE_END_OPERATION_TYPE} MEASURE_END_OPERATION */
  8. /** @typedef {import("../serialization/BinaryMiddleware").MEASURE_START_OPERATION_TYPE} MEASURE_START_OPERATION */
  9. /** @typedef {import("../serialization/Serializer")} Serializer */
  10. /** @typedef {typeof import("../util/Hash")} Hash */
  11. /** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
  12. const getBinaryMiddleware = memoize(() =>
  13. require("../serialization/BinaryMiddleware")
  14. );
  15. const getObjectMiddleware = memoize(() =>
  16. require("../serialization/ObjectMiddleware")
  17. );
  18. const getSingleItemMiddleware = memoize(() =>
  19. require("../serialization/SingleItemMiddleware")
  20. );
  21. const getSerializer = memoize(() => require("../serialization/Serializer"));
  22. const getSerializerMiddleware = memoize(() =>
  23. require("../serialization/SerializerMiddleware")
  24. );
  25. const getBinaryMiddlewareInstance = memoize(
  26. () => new (getBinaryMiddleware())()
  27. );
  28. const registerSerializers = memoize(() => {
  29. require("./registerExternalSerializer");
  30. // Load internal paths with a relative require
  31. // This allows bundling all internal serializers
  32. const internalSerializables = require("./internalSerializables");
  33. getObjectMiddleware().registerLoader(/^webpack\/lib\//, req => {
  34. const loader =
  35. internalSerializables[
  36. /** @type {keyof import("./internalSerializables")} */
  37. (req.slice("webpack/lib/".length))
  38. ];
  39. if (loader) {
  40. loader();
  41. } else {
  42. // eslint-disable-next-line no-console
  43. console.warn(`${req} not found in internalSerializables`);
  44. }
  45. return true;
  46. });
  47. });
  48. /** @type {Serializer} */
  49. let buffersSerializer;
  50. // Expose serialization API
  51. module.exports = {
  52. get register() {
  53. return getObjectMiddleware().register;
  54. },
  55. get registerLoader() {
  56. return getObjectMiddleware().registerLoader;
  57. },
  58. get registerNotSerializable() {
  59. return getObjectMiddleware().registerNotSerializable;
  60. },
  61. get NOT_SERIALIZABLE() {
  62. return getObjectMiddleware().NOT_SERIALIZABLE;
  63. },
  64. /** @type {MEASURE_START_OPERATION} */
  65. get MEASURE_START_OPERATION() {
  66. return getBinaryMiddleware().MEASURE_START_OPERATION;
  67. },
  68. /** @type {MEASURE_END_OPERATION} */
  69. get MEASURE_END_OPERATION() {
  70. return getBinaryMiddleware().MEASURE_END_OPERATION;
  71. },
  72. /**
  73. * @returns {Serializer} buffer serializer
  74. */
  75. get buffersSerializer() {
  76. if (buffersSerializer !== undefined) return buffersSerializer;
  77. registerSerializers();
  78. const Serializer = getSerializer();
  79. const binaryMiddleware = getBinaryMiddlewareInstance();
  80. const SerializerMiddleware = getSerializerMiddleware();
  81. const SingleItemMiddleware = getSingleItemMiddleware();
  82. return (buffersSerializer = new Serializer([
  83. new SingleItemMiddleware(),
  84. new (getObjectMiddleware())(context => {
  85. if ("write" in context) {
  86. context.writeLazy = value => {
  87. context.write(
  88. SerializerMiddleware.createLazy(value, binaryMiddleware)
  89. );
  90. };
  91. }
  92. }, DEFAULTS.HASH_FUNCTION),
  93. binaryMiddleware
  94. ]));
  95. },
  96. /**
  97. * @param {IntermediateFileSystem} fs filesystem
  98. * @param {string | Hash} hashFunction hash function to use
  99. * @returns {Serializer} file serializer
  100. */
  101. createFileSerializer: (fs, hashFunction) => {
  102. registerSerializers();
  103. const Serializer = getSerializer();
  104. const FileMiddleware = require("../serialization/FileMiddleware");
  105. const fileMiddleware = new FileMiddleware(fs, hashFunction);
  106. const binaryMiddleware = getBinaryMiddlewareInstance();
  107. const SerializerMiddleware = getSerializerMiddleware();
  108. const SingleItemMiddleware = getSingleItemMiddleware();
  109. return new Serializer([
  110. new SingleItemMiddleware(),
  111. new (getObjectMiddleware())(context => {
  112. if ("write" in context) {
  113. context.writeLazy = value => {
  114. context.write(
  115. SerializerMiddleware.createLazy(value, binaryMiddleware)
  116. );
  117. };
  118. context.writeSeparate = (value, options) => {
  119. const lazy = SerializerMiddleware.createLazy(
  120. value,
  121. fileMiddleware,
  122. options
  123. );
  124. context.write(lazy);
  125. return lazy;
  126. };
  127. }
  128. }, hashFunction),
  129. binaryMiddleware,
  130. fileMiddleware
  131. ]);
  132. }
  133. };