You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.6 KiB
154 lines
4.6 KiB
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
const memoize = require("./memoize");
|
|
|
|
/** @typedef {import("../serialization/BinaryMiddleware").MEASURE_END_OPERATION_TYPE} MEASURE_END_OPERATION */
|
|
/** @typedef {import("../serialization/BinaryMiddleware").MEASURE_START_OPERATION_TYPE} MEASURE_START_OPERATION */
|
|
/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
|
|
/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
|
|
/** @typedef {import("../serialization/Serializer")} Serializer */
|
|
/** @typedef {typeof import("../util/Hash")} Hash */
|
|
/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
|
|
|
|
const getBinaryMiddleware = memoize(() =>
|
|
require("../serialization/BinaryMiddleware")
|
|
);
|
|
const getObjectMiddleware = memoize(() =>
|
|
require("../serialization/ObjectMiddleware")
|
|
);
|
|
const getSingleItemMiddleware = memoize(() =>
|
|
require("../serialization/SingleItemMiddleware")
|
|
);
|
|
const getSerializer = memoize(() => require("../serialization/Serializer"));
|
|
const getSerializerMiddleware = memoize(() =>
|
|
require("../serialization/SerializerMiddleware")
|
|
);
|
|
|
|
const getBinaryMiddlewareInstance = memoize(
|
|
() => new (getBinaryMiddleware())()
|
|
);
|
|
|
|
const registerSerializers = memoize(() => {
|
|
require("./registerExternalSerializer");
|
|
|
|
// Load internal paths with a relative require
|
|
// This allows bundling all internal serializers
|
|
const internalSerializables = require("./internalSerializables");
|
|
getObjectMiddleware().registerLoader(/^webpack\/lib\//, req => {
|
|
const loader =
|
|
internalSerializables[
|
|
/** @type {keyof import("./internalSerializables")} */
|
|
(req.slice("webpack/lib/".length))
|
|
];
|
|
if (loader) {
|
|
loader();
|
|
} else {
|
|
console.warn(`${req} not found in internalSerializables`);
|
|
}
|
|
return true;
|
|
});
|
|
});
|
|
|
|
/** @type {Serializer} */
|
|
let buffersSerializer;
|
|
|
|
// Expose serialization API
|
|
module.exports = {
|
|
get register() {
|
|
return getObjectMiddleware().register;
|
|
},
|
|
get registerLoader() {
|
|
return getObjectMiddleware().registerLoader;
|
|
},
|
|
get registerNotSerializable() {
|
|
return getObjectMiddleware().registerNotSerializable;
|
|
},
|
|
get NOT_SERIALIZABLE() {
|
|
return getObjectMiddleware().NOT_SERIALIZABLE;
|
|
},
|
|
/** @type {MEASURE_START_OPERATION} */
|
|
get MEASURE_START_OPERATION() {
|
|
return getBinaryMiddleware().MEASURE_START_OPERATION;
|
|
},
|
|
/** @type {MEASURE_END_OPERATION} */
|
|
get MEASURE_END_OPERATION() {
|
|
return getBinaryMiddleware().MEASURE_END_OPERATION;
|
|
},
|
|
/**
|
|
* @returns {Serializer} buffer serializer
|
|
*/
|
|
get buffersSerializer() {
|
|
if (buffersSerializer !== undefined) return buffersSerializer;
|
|
registerSerializers();
|
|
const Serializer = getSerializer();
|
|
const binaryMiddleware = getBinaryMiddlewareInstance();
|
|
const SerializerMiddleware = getSerializerMiddleware();
|
|
const SingleItemMiddleware = getSingleItemMiddleware();
|
|
return (buffersSerializer = new Serializer([
|
|
new SingleItemMiddleware(),
|
|
new (getObjectMiddleware())(context => {
|
|
if (context.write) {
|
|
/**
|
|
* @param {any} value value
|
|
*/
|
|
context.writeLazy = value => {
|
|
context.write(
|
|
SerializerMiddleware.createLazy(value, binaryMiddleware)
|
|
);
|
|
};
|
|
}
|
|
}, "md4"),
|
|
binaryMiddleware
|
|
]));
|
|
},
|
|
/**
|
|
* @param {IntermediateFileSystem} fs filesystem
|
|
* @param {string | Hash} hashFunction hash function to use
|
|
* @returns {Serializer} file serializer
|
|
*/
|
|
createFileSerializer: (fs, hashFunction) => {
|
|
registerSerializers();
|
|
const Serializer = getSerializer();
|
|
const FileMiddleware = require("../serialization/FileMiddleware");
|
|
const fileMiddleware = new FileMiddleware(fs, hashFunction);
|
|
const binaryMiddleware = getBinaryMiddlewareInstance();
|
|
const SerializerMiddleware = getSerializerMiddleware();
|
|
const SingleItemMiddleware = getSingleItemMiddleware();
|
|
return new Serializer([
|
|
new SingleItemMiddleware(),
|
|
new (getObjectMiddleware())(context => {
|
|
if (context.write) {
|
|
/**
|
|
* @param {any} value value
|
|
*/
|
|
context.writeLazy = value => {
|
|
context.write(
|
|
SerializerMiddleware.createLazy(value, binaryMiddleware)
|
|
);
|
|
};
|
|
/**
|
|
* @param {any} value value
|
|
* @param {object=} options lazy options
|
|
* @returns {function(): Promise<any> | any} lazy function
|
|
*/
|
|
context.writeSeparate = (value, options) => {
|
|
const lazy = SerializerMiddleware.createLazy(
|
|
value,
|
|
fileMiddleware,
|
|
options
|
|
);
|
|
context.write(lazy);
|
|
return lazy;
|
|
};
|
|
}
|
|
}, hashFunction),
|
|
binaryMiddleware,
|
|
fileMiddleware
|
|
]);
|
|
}
|
|
};
|