UNPKG

@recraft-ai/mcp-recraft-server

Version:
75 lines (74 loc) 3.62 kB
"use strict"; 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.downloadImagesAndMakePreviews = void 0; const download_1 = require("./download"); const render_1 = require("./render"); const upload_1 = require("./upload"); const MESSAGE_LIMIT = Math.round(1048576 * 0.95); const MIN_SIDE_LENGTH = 128; const downloadImagesAndMakePreviews = (imageStorageDirectory, images) => __awaiter(void 0, void 0, void 0, function* () { const imagePromises = images.map((imageData) => __awaiter(void 0, void 0, void 0, function* () { if (!(imageData === null || imageData === void 0 ? void 0 : imageData.url)) { return null; } const imageUrl = imageData.url; const id = imageData.imageId; const image = yield (0, download_1.downloadImage)(imageUrl); let pathOrUrl; if (imageStorageDirectory) { const path = yield (0, upload_1.uploadImage)(imageStorageDirectory, id, image); pathOrUrl = `file://${path}`; } else { pathOrUrl = imageUrl; } let previewData; if (image.mimeType === 'image/svg+xml') { previewData = yield (0, render_1.rasterizeSvg)(image.data); } else { previewData = yield (0, render_1.compressImage)(image); } const imageSize = yield (0, render_1.getImageSize)(previewData); return Object.assign(Object.assign(Object.assign({}, image), { url: imageUrl, id, pathOrUrl, previewData }), imageSize); })); const downloadedImages = (yield Promise.all(imagePromises)).filter((image) => image !== null); const minSideSize = Math.min(...downloadedImages.map(image => Math.min(image.width, image.height))); const calculateTotalLength = (images) => images.map(image => image.previewData.data.length).reduce((a, b) => a + b, 0); let scale = 1.0; while (calculateTotalLength(downloadedImages) > MESSAGE_LIMIT && scale * 0.5 * minSideSize >= MIN_SIDE_LENGTH - 1e-6) { scale *= 0.5; const scalePromises = downloadedImages.map((image) => __awaiter(void 0, void 0, void 0, function* () { if (image.mimeType === 'image/svg+xml') { image.previewData = yield (0, render_1.rasterizeSvg)(image.data, scale); } else { image.previewData = yield (0, render_1.compressImage)(image, scale); } })); yield Promise.all(scalePromises); } let totalLength = 0; let previews = []; for (const { previewData } of downloadedImages) { if (totalLength + previewData.data.length > MESSAGE_LIMIT) { break; } totalLength += previewData.data.length; previews.push(Object.assign({ type: 'image' }, previewData)); } return { downloadedImages, previews, }; }); exports.downloadImagesAndMakePreviews = downloadImagesAndMakePreviews;