| 
									
										
										
										
											2018-12-28 20:18:02 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | const memoize = require("./memoize"); | 
					
						
							| 
									
										
										
										
											2018-12-28 20:18:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | /** @typedef {import("../serialization/BinaryMiddleware").MEASURE_END_OPERATION_TYPE} MEASURE_END_OPERATION */ | 
					
						
							|  |  |  | /** @typedef {import("../serialization/BinaryMiddleware").MEASURE_START_OPERATION_TYPE} MEASURE_START_OPERATION */ | 
					
						
							| 
									
										
										
										
											2018-12-28 21:48:18 +08:00
										 |  |  | /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */ | 
					
						
							|  |  |  | /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */ | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | /** @typedef {import("../serialization/Serializer")} Serializer */ | 
					
						
							| 
									
										
										
										
											2023-05-23 02:32:23 +08:00
										 |  |  | /** @typedef {typeof import("../util/Hash")} Hash */ | 
					
						
							|  |  |  | /** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */ | 
					
						
							| 
									
										
										
										
											2018-12-28 21:48:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 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") | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											2018-12-28 20:18:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | const getBinaryMiddlewareInstance = memoize( | 
					
						
							|  |  |  | 	() => new (getBinaryMiddleware())() | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											2020-01-24 06:51:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 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`); | 
					
						
							| 
									
										
										
										
											2020-01-24 06:51:49 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2018-12-28 20:54:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | /** @type {Serializer} */ | 
					
						
							|  |  |  | let buffersSerializer; | 
					
						
							| 
									
										
										
										
											2018-12-28 20:54:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | // 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; | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2023-05-23 02:32:23 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {Serializer} buffer serializer | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 	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) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-09-22 18:12:46 +08:00
										 |  |  | 			}, "md4"), | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 			binaryMiddleware | 
					
						
							|  |  |  | 		])); | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2023-05-23 02:32:23 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {IntermediateFileSystem} fs filesystem | 
					
						
							|  |  |  | 	 * @param {string | Hash} hashFunction hash function to use | 
					
						
							|  |  |  | 	 * @returns {Serializer} file serializer | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-09-22 18:12:46 +08:00
										 |  |  | 	createFileSerializer: (fs, hashFunction) => { | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 		registerSerializers(); | 
					
						
							|  |  |  | 		const Serializer = getSerializer(); | 
					
						
							|  |  |  | 		const FileMiddleware = require("../serialization/FileMiddleware"); | 
					
						
							| 
									
										
										
										
											2021-09-22 18:12:46 +08:00
										 |  |  | 		const fileMiddleware = new FileMiddleware(fs, hashFunction); | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 		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) => { | 
					
						
							| 
									
										
										
										
											2021-09-08 19:45:27 +08:00
										 |  |  | 						const lazy = SerializerMiddleware.createLazy( | 
					
						
							|  |  |  | 							value, | 
					
						
							|  |  |  | 							fileMiddleware, | 
					
						
							|  |  |  | 							options | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 						); | 
					
						
							| 
									
										
										
										
											2021-09-08 19:45:27 +08:00
										 |  |  | 						context.write(lazy); | 
					
						
							|  |  |  | 						return lazy; | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 					}; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-09-22 18:12:46 +08:00
										 |  |  | 			}, hashFunction), | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | 			binaryMiddleware, | 
					
						
							|  |  |  | 			fileMiddleware | 
					
						
							|  |  |  | 		]); | 
					
						
							| 
									
										
										
										
											2019-10-11 16:01:08 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-05-26 21:53:23 +08:00
										 |  |  | }; |