UNPKG

atomicals-js

Version:
162 lines (161 loc) 7.23 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CreateDmintItemManifestsCommand = void 0; const atomical_format_helpers_1 = require("../utils/atomical-format-helpers"); const file_utils_1 = require("../utils/file-utils"); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const path_1 = require("path"); const crypto_1 = require("bitcoinjs-lib/src/crypto"); const merkletreejs_1 = require("merkletreejs"); const SHA256 = require('crypto-js/sha256'); function isInvalidImageExtension(extName) { return extName !== '.jpg' && extName !== '.gif' && extName !== '.jpeg' && extName !== '.png' && extName !== '.svg' && extName !== '.webp' && extName !== '.mp3' && extName !== '.mp4' && extName !== '.mov' && extName !== '.webm' && extName !== '.avi' && extName !== '.mpg'; } // Skip folders and invalid files under this folder function isInvalidFile(file, folder) { const filePath = path.join(folder, file); const stats = fs.statSync(filePath); // Skip any folder if (stats.isDirectory()) { console.log(`Skipping ${file}...`); return true; } // Skip any file whose name starts with . if (file.startsWith('.')) { console.log(`Skipping ${file}...`); return true; } return false; } class CreateDmintItemManifestsCommand { constructor(folder, outputName) { this.folder = folder; this.outputName = outputName; } run() { return __awaiter(this, void 0, void 0, function* () { // Read the folder for any images let counter = 0; const files = fs.readdirSync(this.folder); const filemap = {}; const leafItems = []; for (const file of files) { if (isInvalidFile(file, this.folder)) { continue; } const basePath = (0, path_1.basename)(file); const extName = (0, path_1.extname)(file); const splitBase = basePath.split('.'); if (splitBase.length !== 2) { throw new Error('Image file must have exactly with dot extension: ' + basePath); } const rawName = splitBase[0]; if (isInvalidImageExtension(extName)) { continue; } (0, atomical_format_helpers_1.isValidDmitemName)(rawName); filemap[rawName] = filemap[rawName] || {}; const fileBuf = fs.readFileSync(this.folder + '/' + file); const hashed = (0, crypto_1.hash256)(fileBuf); const hashedStr = hashed.toString('hex'); console.log(`Generating hashes for filename ${basePath} with hash ${hashedStr}`); const filename = 'image' + extName; filemap[rawName][filename] = { '$b': fileBuf.toString('hex') }; counter++; const leafVector = rawName + ':' + filename + ':' + hashedStr; leafItems.push({ id: rawName, filename, hashedStr, leafVector, fileBuf: fileBuf.toString('hex') }); } ; const leaves = leafItems.map(x => SHA256(x.leafVector)); const tree = new merkletreejs_1.MerkleTree(leaves, SHA256); const root = tree.getRoot().toString('hex'); for (const leafItem of leafItems) { const leaf = SHA256(leafItem.leafVector); const proof = tree.getProof(leaf); tree.verify(proof, leaf, root); filemap[leafItem.id]['args'] = { request_dmitem: leafItem.id, main: leafItem.filename, i: true // Default everything to immutable }; filemap[leafItem.id]['leafVector'] = leafItem.leafVector; filemap[leafItem.id]['hash'] = leafItem.hashedStr; filemap[leafItem.id]['fileBuf'] = leafItem.fileBuf; } const timestamp = (new Date()).getTime(); const dirName = this.outputName + '-' + timestamp; if (!fs.existsSync(dirName)) { fs.mkdirSync(dirName); } for (const itemProp in filemap) { if (!filemap.hasOwnProperty(itemProp)) { continue; } yield (0, file_utils_1.jsonFileWriter)(`${dirName}/item-${itemProp}.json`, { "mainHash": filemap[itemProp].hash, "data": { args: { request_dmitem: itemProp, main: filemap[itemProp].args.main, i: filemap[itemProp].args.i, proof: filemap[itemProp].args.proof }, [filemap[itemProp].args.main]: { '$b': filemap[itemProp].fileBuf }, } }); } return { success: true, data: { folder: this.folder, totalItems: counter, } }; }); } } exports.CreateDmintItemManifestsCommand = CreateDmintItemManifestsCommand;