API/AssetUtil.js

const { Out } = require("./Out");
const { Path } = require("./Path");
const { Uri } = require("./Uri");
const SHA256 = require("crypto-js/sha256");
const fs = require("fs");
/**.
 * Utility Class for working with Assets
 *
 * @class AssetUtil
 */
class AssetUtil {
	/**.
	 * Compute Version
	 *
	 * @readonly
	 * @static
	 * @memberof AssetUtil
	 * @returns {4}
	 */
	static get COMPUTE_VERSION() {
		return 4;
	}
	/**.
	 * Generate a SHA256 hash signature for a file
	 *
	 * @static
	 * @param {Buffer | string} file File Stream or Path to file
	 * @memberof AssetUtil
	 * @returns {string} Hash Signature
	 */
	static GenerateHashSignature(file) {
		if (file instanceof String) {
			let fileStream = fs.readFileSync(file);
			return AssetUtil.GenerateHashSignature(fileStream);
		} else {
			return SHA256(file.toString()).toString().replace("-", "").toLowerCase();
		}
	}
	/**.
	 * Generate a NeosDB Asset Url
	 *
	 * @static
	 * @param {string} signature File Signature
	 * @param {string} extension Asset Type
	 * @returns {Uri}
	 * @memberof AssetUtil
	 */
	static GenerateURL(signature, extension) {
		if (!extension.startsWith(".")) extension = "." + extension;
		return new Uri("neosdb:///" + signature + extension);
	}
	/**.
	 * Extract the signature [And Extension] from a URI
	 *
	 * @static
	 * @param {Uri} uri
	 * @param {Out<String>} [extension]
	 * @returns {string} Signature
	 * @memberof AssetUtil
	 */
	static ExtractSignature(uri, extension = new Out()) {
		if (uri.Scheme !== "neosdb") throw new Error("Not a NeosDB URI");
		let segment = uri.Segments[1];
		extension.Out = Path.GetExtension(segment);
		return Path.GetFileNameWithoutExtension(segment);
	}
	/**.
	 * Append a Variant Identifier to a signature
	 *
	 * @static
	 * @param {string} signature
	 * @param {string} variant
	 * @returns {string}
	 * @memberof AssetUtil
	 */
	static ComposeIdentifier(signature, variant) {
		if (String.IsNullOrWhiteSpace(variant)) return signature;
		return signature + "&" + variant;
	}
	/**.
	 * Split the Varient and Signature from a Variant Identifier
	 *
	 * @static
	 * @param {string} identifier
	 * @param {Out<String>} [signature]
	 * @param {Out<String>} [variant]
	 * @memberof AssetUtil
	 */
	static SplitIdentifier(identifier, signature, variant) {
		let length = identifier.indexOf("&");
		if (length >= 0) {
			variant.Out = identifier.substr(length + 1);
			signature.Out = identifier.substr(0, length);
		} else {
			variant.Out = null;
			signature.Out = identifier.toLowerCase();
		}
	}
}
module.exports = {
	AssetUtil,
};