@recraft-ai/mcp-recraft-server
Version:
MCP Server implementation for recraft.ai API
75 lines (74 loc) • 3.62 kB
JavaScript
;
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;