UNPKG

@megaads/wm

Version:

To install the library, use npm:

205 lines (179 loc) 6.33 kB
import { ImageOptions } from "./types"; class Images { readonly baseCdnUrl: string; readonly cdnIgnoreUrl: string[]; readonly cdnAllowUrl: string[]; constructor(options: ImageOptions) { this.baseCdnUrl = options.baseCdnUrl; this.cdnIgnoreUrl = [ 'localhost', '.test', '.vn', '.local', 'liveview.printerval.com', 'amazon.com', 'printerval.com/unsafe', 'printerval.megaads.vn', 'image.spreadshirtmedia.com', 'd1q9av5b648rmv.cloudfront.net', 'cdn.shopify.com', '.jfif', '.avif', '.jfif', '.pjpeg', '.pjp', '.tif', '.tiff', '.ico', '.cur', '.bmp', '.gif', 'ai-designer.printerval.com', 'rlv.zcache.com' ].map((url) => { return this.crypt('megaads', url); }); this.cdnAllowUrl = [ 'printerval.com', 'assets.printerval.com', 'seller.printerval.com', 'storage.googleapis.com', 'asset.prtvstatic.com', 'i.etsystatic.com', 'redbubble.net', 'cdn.customily.com', 'cdn.teeinblue.com', 'res.cloudinary.com' ].map((url) => { return this.crypt('megaads', url); }); } getImageCdn($url: string, $width = 0, $height = 0, $fitIn = false, $webp = false, filters: any): string { $fitIn = false; if ($url && !$url.match(/\.(jpg|jpeg|png|gif)$/i)) { return $url; } let zoomIn = ''; if (!$url) { return $url; } if ($url.indexOf('http') != 0) { if ($url.indexOf('//') != 0) { if ($url.indexOf('/') != 0) { $url = 'https://' + $url; } else { $url = window.location.origin + $url; } } else { $url = 'http:' + $url; } } const sizePattern = new RegExp(/(image|blank|sticker|unsafe)\/\d+x\d+/); if (sizePattern.test($url)) { return $url; } const regex = /^https?:\/\/[^/]+(\/[^?#]*)/; const match = regex.exec($url); const path = match && match[1]; if (path && (path.startsWith("/image/") || path.startsWith("/blank/") || path.startsWith("/sticker/"))) { if (!$width) $width = $height; $url = $url.replace('/blank/', '/blank/' + $width + 'x' + $width + '/'); $url = $url.replace('/image/', '/image/' + $width + 'x' + $width + '/'); $url = $url.replace('/sticker/', '/sticker/' + $width + 'x' + $width + '/'); $url = this.replaceImageUrl($url); return $url; } $url = this.replaceImageUrl($url); if (($width == 1260 && $height == 0) || ($width == 0 && $height == 0)) { return $url; } let tempCdnIgnoreUrl = this.cdnIgnoreUrl.map((url) => { return this.decrypt('megaads', url); }) let tempCdnAllowUrl = this.cdnAllowUrl.map((url) => { return this.decrypt('megaads', url); }) if (typeof tempCdnIgnoreUrl !== 'undefined') { for (let item of tempCdnIgnoreUrl) { if ($url.includes(item)) { return $url; } } } if (typeof tempCdnAllowUrl !== 'undefined') { let check = false; for (let item of tempCdnAllowUrl) { if ($url.includes(item)) { check = true; break; } } if (!check) { return $url; } } if (typeof filters !== 'undefined' && typeof filters.zoomIn !== 'undefined') { zoomIn = filters.zoomIn; } if ($url.substr(0, 4) == 'http') { $url = $url.replace('https://', ''); $url = $url.replace('http://', ''); } if ($url.includes('redbubble.net')) { $url = 'asset/' + this.crypt('megaads', $url); } if ($url.includes('i.etsystatic.com') || $url.includes('res.cloudinary.com')) { $url = 'asset/' + this.crypt('megaads', $url); } if ($url.includes('?')) { $url = encodeURIComponent($url); } let $baseCdnUrl = this.baseCdnUrl + "/"; if (zoomIn !== '') { $baseCdnUrl = this.baseCdnUrl + "" + zoomIn + "/"; } $fitIn = ($fitIn && $width && $height); if ($fitIn) { $baseCdnUrl += "fit-in/"; } if ($width || $height) { $baseCdnUrl += $width + "x" + $height + "/"; } $baseCdnUrl += $url; return $baseCdnUrl; } private replaceImageUrl = (url: string): string => { const cdnReplaceUrl: Record<string, string> = { // Add your URL replacement mappings here }; // @ts-ignore for (const [key, value] of Object.entries(cdnReplaceUrl)) { url = url.replace(key, value); } return url; } private crypt = (salt: string, text: string) => { const textToChars = (text: string) => text.split("").map((c) => c.charCodeAt(0)); const byteHex = (n: number) => ("0" + Number(n).toString(16)).substr(-2); const applySaltToChar = (code: any) => textToChars(salt).reduce((a, b) => a ^ b, code); return text .split("") .map(textToChars) .map(applySaltToChar) .map(byteHex) .join(""); }; private decrypt = (salt: string, encoded: any) => { const textToChars = (text: string) => text.split("").map((c) => c.charCodeAt(0)); const applySaltToChar = (code: any) => textToChars(salt).reduce((a, b) => a ^ b, code); return encoded .match(/.{1,2}/g) .map((hex: any) => parseInt(hex, 16)) .map(applySaltToChar) .map((charCode: any) => String.fromCharCode(charCode)) .join(""); }; } export default Images;