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.
128 lines
3.9 KiB
128 lines
3.9 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 */ |
|
|
|
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[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; |
|
}, |
|
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) { |
|
context.writeLazy = value => { |
|
context.write( |
|
SerializerMiddleware.createLazy(value, binaryMiddleware) |
|
); |
|
}; |
|
} |
|
}, "md4"), |
|
binaryMiddleware |
|
])); |
|
}, |
|
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) { |
|
context.writeLazy = value => { |
|
context.write( |
|
SerializerMiddleware.createLazy(value, binaryMiddleware) |
|
); |
|
}; |
|
context.writeSeparate = (value, options) => { |
|
const lazy = SerializerMiddleware.createLazy( |
|
value, |
|
fileMiddleware, |
|
options |
|
); |
|
context.write(lazy); |
|
return lazy; |
|
}; |
|
} |
|
}, hashFunction), |
|
binaryMiddleware, |
|
fileMiddleware |
|
]); |
|
} |
|
};
|
|
|