@xyo-network/image-thumbnail-plugin 2.99.4 → 2.99.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/neutral/Plugin.d.cts +3 -3
  2. package/dist/neutral/Plugin.d.mts +3 -3
  3. package/dist/neutral/Plugin.d.ts +3 -3
  4. package/dist/neutral/Witness/Params.d.cts +1 -1
  5. package/dist/neutral/Witness/Params.d.mts +1 -1
  6. package/dist/neutral/Witness/Params.d.ts +1 -1
  7. package/dist/neutral/Witness/Witness.d.cts +2 -2
  8. package/dist/neutral/Witness/Witness.d.mts +2 -2
  9. package/dist/neutral/Witness/Witness.d.ts +2 -2
  10. package/dist/neutral/Witness/ffmpeg/fluent/index.d.cts +1 -1
  11. package/dist/neutral/Witness/ffmpeg/fluent/index.d.mts +1 -1
  12. package/dist/neutral/Witness/ffmpeg/fluent/index.d.ts +1 -1
  13. package/dist/neutral/Witness/ffmpeg/index.d.cts +2 -2
  14. package/dist/neutral/Witness/ffmpeg/index.d.mts +2 -2
  15. package/dist/neutral/Witness/ffmpeg/index.d.ts +2 -2
  16. package/dist/neutral/Witness/ffmpeg/spawn/index.d.cts +2 -2
  17. package/dist/neutral/Witness/ffmpeg/spawn/index.d.mts +2 -2
  18. package/dist/neutral/Witness/ffmpeg/spawn/index.d.ts +2 -2
  19. package/dist/neutral/Witness/index.d.cts +3 -3
  20. package/dist/neutral/Witness/index.d.mts +3 -3
  21. package/dist/neutral/Witness/index.d.ts +3 -3
  22. package/dist/neutral/Witness/lib/index.d.cts +3 -3
  23. package/dist/neutral/Witness/lib/index.d.mts +3 -3
  24. package/dist/neutral/Witness/lib/index.d.ts +3 -3
  25. package/dist/neutral/index.cjs +113 -85
  26. package/dist/neutral/index.cjs.map +1 -1
  27. package/dist/neutral/index.d.cts +2 -2
  28. package/dist/neutral/index.d.mts +2 -2
  29. package/dist/neutral/index.d.ts +2 -2
  30. package/dist/neutral/{index.js → index.mjs} +116 -86
  31. package/dist/neutral/index.mjs.map +1 -0
  32. package/dist/node/Plugin.d.cts +3 -3
  33. package/dist/node/Plugin.d.mts +3 -3
  34. package/dist/node/Plugin.d.ts +3 -3
  35. package/dist/node/Witness/Params.d.cts +1 -1
  36. package/dist/node/Witness/Params.d.mts +1 -1
  37. package/dist/node/Witness/Params.d.ts +1 -1
  38. package/dist/node/Witness/Witness.d.cts +2 -2
  39. package/dist/node/Witness/Witness.d.mts +2 -2
  40. package/dist/node/Witness/Witness.d.ts +2 -2
  41. package/dist/node/Witness/ffmpeg/fluent/index.d.cts +1 -1
  42. package/dist/node/Witness/ffmpeg/fluent/index.d.mts +1 -1
  43. package/dist/node/Witness/ffmpeg/fluent/index.d.ts +1 -1
  44. package/dist/node/Witness/ffmpeg/index.d.cts +2 -2
  45. package/dist/node/Witness/ffmpeg/index.d.mts +2 -2
  46. package/dist/node/Witness/ffmpeg/index.d.ts +2 -2
  47. package/dist/node/Witness/ffmpeg/spawn/index.d.cts +2 -2
  48. package/dist/node/Witness/ffmpeg/spawn/index.d.mts +2 -2
  49. package/dist/node/Witness/ffmpeg/spawn/index.d.ts +2 -2
  50. package/dist/node/Witness/index.d.cts +3 -3
  51. package/dist/node/Witness/index.d.mts +3 -3
  52. package/dist/node/Witness/index.d.ts +3 -3
  53. package/dist/node/Witness/lib/index.d.cts +3 -3
  54. package/dist/node/Witness/lib/index.d.mts +3 -3
  55. package/dist/node/Witness/lib/index.d.ts +3 -3
  56. package/dist/node/index.cjs +122 -93
  57. package/dist/node/index.cjs.map +1 -1
  58. package/dist/node/index.d.cts +2 -2
  59. package/dist/node/index.d.mts +2 -2
  60. package/dist/node/index.d.ts +2 -2
  61. package/dist/node/{index.js → index.mjs} +126 -94
  62. package/dist/node/index.mjs.map +1 -0
  63. package/package.json +27 -27
  64. package/src/Plugin.ts +1 -1
  65. package/src/Witness/Params.ts +1 -1
  66. package/src/Witness/Witness.ts +10 -10
  67. package/src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts +1 -1
  68. package/src/Witness/ffmpeg/fluent/index.ts +1 -1
  69. package/src/Witness/ffmpeg/index.ts +2 -2
  70. package/src/Witness/ffmpeg/spawn/getVideoFrameAsImage.ts +1 -1
  71. package/src/Witness/ffmpeg/spawn/index.ts +2 -2
  72. package/src/Witness/index.ts +3 -3
  73. package/src/Witness/lib/checkIpfsUrl.ts +3 -3
  74. package/src/Witness/lib/index.ts +3 -3
  75. package/src/index.ts +2 -2
  76. package/dist/neutral/index.js.map +0 -1
  77. package/dist/node/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness/Config.ts","../../src/Witness/Witness.ts","../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../src/Witness/lib/checkIpfsUrl.ts","../../src/Witness/lib/createDataUrl.ts","../../src/Witness/lib/resolveDynamicSvg.ts"],"sourcesContent":["// eslint-disable-next-line import/no-default-export\nexport { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.js'\nexport * from './Witness/index.js'\nexport * from '@xyo-network/diviner-image-thumbnail'\n","import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { ImageThumbnailWitness } from './Witness/index.js'\n\nexport const ImageThumbnailPlugin = () =>\n createPayloadSetDualPlugin<ImageThumbnailWitness, ImageThumbnailDiviner>(\n { required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await ImageThumbnailDiviner.create(params)\n return result\n },\n witness: async (params) => {\n const result = await ImageThumbnailWitness.create(params)\n return result\n },\n },\n )\n","import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { WitnessConfig } from '@xyo-network/witness-model'\n\nexport const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config` as const\nexport type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema\n\nexport type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF'\n\nexport type ImageThumbnailWitnessConfig = WitnessConfig<{\n dataUrlPassthrough?: boolean\n encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n runExclusive?: boolean\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n","/* eslint-disable max-statements */\nimport { Buffer } from 'node:buffer'\nimport { promises as dnsPromises } from 'node:dns'\n\nimport { axios, AxiosError, AxiosResponse } from '@xylabs/axios'\nimport { compact } from '@xylabs/lodash'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { ImageThumbnail, ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { Schema } from '@xyo-network/payload-model'\nimport { UrlPayload, UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { Semaphore } from 'async-mutex'\nimport FileType from 'file-type'\nimport graphicsMagick from 'gm'\nimport hasbin from 'hasbin'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport Url from 'url-parse'\n\nimport { ImageThumbnailEncoding, ImageThumbnailWitnessConfigSchema } from './Config.js'\nimport { getVideoFrameAsImageFluent } from './ffmpeg/index.js'\nimport { checkIpfsUrl, createDataUrl, resolveDynamicSvg } from './lib/index.js'\nimport { ImageThumbnailWitnessParams } from './Params.js'\n\n//TODO: Break this into two Witnesses?\n\n// setFfmpegPath(ffmpegPath)\n\nconst gm = graphicsMagick.subClass({ imageMagick: '7+' })\n\nexport interface ImageThumbnailWitnessError extends Error {\n name: 'ImageThumbnailWitnessError'\n url: string\n}\n\nexport interface DnsError extends Error {\n code: string\n}\n\nexport class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams = ImageThumbnailWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailWitnessConfigSchema\n\n private _semaphore = new Semaphore(this.maxAsyncProcesses)\n\n get encoding() {\n return this.config.encoding ?? 'PNG'\n }\n\n get height() {\n return this.config.height ?? 128\n }\n\n get ipfsGateway() {\n return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'\n }\n\n get maxAsyncProcesses() {\n return this.config.maxAsyncProcesses ?? 4\n }\n\n get quality() {\n return this.config.quality ?? 50\n }\n\n get width() {\n return this.config.width ?? 128\n }\n\n private static async binaryToSha256(data: ArrayBuffer) {\n const viewData = new Uint8Array(data)\n await PayloadHasher.wasmInitialized\n if (PayloadHasher.wasmSupport.canUseWasm) {\n try {\n return await sha256(viewData)\n } catch {\n PayloadHasher.wasmSupport.allowWasm = false\n }\n }\n\n return shajs('sha256').update(viewData).digest().toString()\n }\n\n private static bufferFromDataUrl(url: string): ArrayBuffer | undefined {\n if (url.startsWith('data:image')) {\n const data = url.split(',')[1]\n if (data) {\n return Uint8Array.from(atob(data), (c) => c.codePointAt(0) ?? 0)\n } else {\n const error: ImageThumbnailWitnessError = {\n message: 'Invalid data Url',\n name: 'ImageThumbnailWitnessError',\n url,\n }\n throw error\n }\n }\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<ImageThumbnail[]> {\n if (!hasbin.sync('magick')) {\n throw new Error('ImageMagick is required for this witness')\n }\n const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema)\n const process = async () => {\n return compact(\n await Promise.all(\n urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {\n let result: ImageThumbnail\n\n //if it is a data URL, return a Buffer\n const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)\n\n if (dataBuffer) {\n if (this.config.dataUrlPassthrough) {\n result = {\n schema: ImageThumbnailSchema,\n sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),\n sourceUrl: url,\n url,\n }\n } else {\n let cookedDataBuffer = dataBuffer\n const urlParts = url.split(';')\n const [, contentType] = urlParts[0].split(':')\n if (contentType.startsWith('image/svg')) {\n const [encoding, byteString] = urlParts[1].split(',')\n if (encoding === 'base64') {\n const newSvg = await resolveDynamicSvg(byteString)\n const newSvgDataUrl = createDataUrl(Buffer.from(newSvg), contentType)\n cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer\n }\n }\n result = await this.processMedia(\n cookedDataBuffer,\n {\n schema: ImageThumbnailSchema,\n sourceUrl: url,\n },\n contentType,\n )\n }\n } else {\n //if it is ipfs, go through cloud flair\n const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)\n result = await this.fromHttp(mutatedUrl, url)\n }\n return result\n }),\n ),\n )\n }\n return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process()\n }\n\n private async createThumbnailDataUrl(sourceBuffer: ArrayBuffer, encoding?: ImageThumbnailEncoding) {\n const thumb = await new Promise<Buffer>((resolve, reject) => {\n gm(Buffer.from(sourceBuffer))\n .quality(this.quality)\n .resize(this.width, this.height)\n .flatten()\n .toBuffer(encoding ?? this.encoding, (error, buffer) => {\n if (error) {\n reject(error)\n } else {\n resolve(buffer)\n }\n })\n })\n return createDataUrl(thumb, 'image/png')\n }\n\n /**\n * Creates an image thumbnail from a video.\n * @param videoBuffer The input video buffer.\n * @returns An buffer containing an image thumbnail for the video.\n */\n private async createThumbnailFromVideo(videoBuffer: ArrayBuffer) {\n const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer)\n return this.createThumbnailDataUrl(imageBuffer)\n }\n\n // eslint-disable-next-line complexity\n private async fromHttp(url: string, sourceUrl?: string): Promise<ImageThumbnail> {\n let response: AxiosResponse\n let dnsResult: string[]\n try {\n const urlObj = new Url(url)\n dnsResult = await dnsPromises.resolve(urlObj.host)\n } catch (ex) {\n const error = ex as DnsError\n const result: ImageThumbnail = {\n http: {\n code: error.code,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n return result\n }\n try {\n response = await axios.get(url, {\n responseType: 'arraybuffer',\n })\n } catch (ex) {\n const axiosError = ex as AxiosError\n if (axiosError.isAxiosError) {\n //selectively pick fields from AxiosError\n const result: ImageThumbnail = {\n http: {\n ipAddress: dnsResult[0],\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n if (axiosError?.response?.status !== undefined) {\n result.http = result.http ?? {}\n result.http.status = axiosError?.response?.status\n }\n if (axiosError?.code !== undefined) {\n result.http = result.http ?? {}\n result.http.code = axiosError?.code\n }\n return result\n } else {\n throw ex\n }\n }\n\n const result: ImageThumbnail = {\n http: {\n status: response.status,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n\n if (response.status >= 200 && response.status < 300) {\n const contentType: string | undefined = response.headers['content-type']?.toString()\n const sourceBuffer = Buffer.from(response.data, 'binary')\n\n return this.processMedia(sourceBuffer, result, contentType)\n }\n return result\n }\n\n private async processMedia(sourceBuffer: ArrayBuffer, imageThumbnail: ImageThumbnail, contentType?: string): Promise<ImageThumbnail> {\n const [mediaType, fileType] = contentType?.split('/') ?? ['', '']\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.returned = mediaType\n\n try {\n imageThumbnail.mime.detected = await FileType.fromBuffer(sourceBuffer)\n } catch (ex) {\n const error = ex as Error\n this.logger?.error(`FileType error: ${error.message}`)\n }\n\n const processImage = async (encoding?: ImageThumbnailEncoding) => {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)\n }\n\n const processVideo = async () => {\n // Gracefully handle the case where ffmpeg is not installed.\n\n if (hasbin.sync('ffmpeg')) {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer)\n } else {\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.invalid = true\n }\n }\n\n let encoding: ImageThumbnailEncoding = 'PNG'\n\n switch (fileType.toUpperCase()) {\n case 'GIF': {\n encoding = 'GIF'\n break\n }\n case 'JPG':\n case 'JPEG': {\n encoding = 'JPG'\n break\n }\n }\n\n switch (mediaType) {\n case 'image': {\n await processImage(encoding)\n imageThumbnail.mime.type = mediaType\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = mediaType\n break\n }\n default: {\n const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split('/') ?? ['', '']\n switch (detectedMediaType) {\n case 'image': {\n await processImage()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n default: {\n imageThumbnail.mime.invalid = true\n break\n }\n }\n break\n }\n }\n return imageThumbnail\n }\n}\n","import { unlink, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { Writable, WritableOptions } from 'node:stream'\n\nimport ffmpeg from 'fluent-ffmpeg'\nimport { v4 as uuid } from 'uuid'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: ArrayBuffer) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', (err) => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nconst allowIpfsIoRepair = true\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway?: string): string => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else if (allowIpfsIoRepair && protocol === 'https' && host === 'ipfs.io') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n const pathParts = path.split('/')\n if (pathParts[0] === 'ipfs') {\n pathParts.shift()\n }\n path = pathParts.join('/')\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch {\n //const error = ex as Error\n //console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n //console.log(error.stack)\n return urlToCheck\n }\n}\n","import { fromByteArray } from 'base64-js'\n\nexport const createDataUrl = (data: ArrayBuffer, contextType: string, encoding: 'base64' = 'base64') => {\n return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`\n}\n","import { axios, AxiosResponse } from '@xylabs/axios'\nimport { toByteArray } from 'base64-js'\nimport { Builder, parseStringPromise } from 'xml2js'\n\nexport const resolveDynamicSvg = async (base64Bytes: string) => {\n const decoder = new TextDecoder()\n const bytes = toByteArray(base64Bytes)\n const svg = decoder.decode(bytes)\n const svgObj = await parseStringPromise(svg)\n const svgNode = svgObj['svg']\n const imageResults = (await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svgNode['image'].map(async (img: any) => [\n img.$,\n await axios.get(img.$.href, {\n responseType: 'arraybuffer',\n }),\n ]),\n )) as [string, AxiosResponse][]\n const image = imageResults.map(([href, response]) => {\n if (response.data) {\n const sourceBuffer = Buffer.from(response.data, 'binary')\n return { $: { href: `data:${response.headers['content-type']?.toString()};base64,${sourceBuffer.toString('base64')}` } }\n } else {\n return { $: { href } }\n }\n })\n const updatedSVG = { ...svgObj, svg: { ...svgNode, image } }\n const builder = new Builder()\n return builder.buildObject(updatedSVG)\n}\n"],"mappings":"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","names":["import_image_thumbnail_payload_plugin","import_axios","import_image_thumbnail_payload_plugin","uuid","ffmpeg","import_base64_js","graphicsMagick","shajs","hasbin","Url","dnsPromises","result","FileType","encoding"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness/Config.ts","../../src/Witness/Witness.ts","../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../src/Witness/lib/checkIpfsUrl.ts","../../src/Witness/lib/createDataUrl.ts","../../src/Witness/lib/resolveDynamicSvg.ts"],"sourcesContent":["// eslint-disable-next-line import/no-default-export\nexport { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts'\nexport * from './Witness/index.ts'\nexport * from '@xyo-network/diviner-image-thumbnail'\n","import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { ImageThumbnailWitness } from './Witness/index.ts'\n\nexport const ImageThumbnailPlugin = () =>\n createPayloadSetDualPlugin<ImageThumbnailWitness, ImageThumbnailDiviner>(\n { required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await ImageThumbnailDiviner.create(params)\n return result\n },\n witness: async (params) => {\n const result = await ImageThumbnailWitness.create(params)\n return result\n },\n },\n )\n","import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { WitnessConfig } from '@xyo-network/witness-model'\n\nexport const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config` as const\nexport type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema\n\nexport type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF'\n\nexport type ImageThumbnailWitnessConfig = WitnessConfig<{\n dataUrlPassthrough?: boolean\n encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n runExclusive?: boolean\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n","/* eslint-disable max-statements */\nimport { Buffer } from 'node:buffer'\nimport { promises as dnsPromises } from 'node:dns'\n\nimport { axios, AxiosError, AxiosResponse } from '@xylabs/axios'\nimport { compact } from '@xylabs/lodash'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { ImageThumbnail, ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { Schema } from '@xyo-network/payload-model'\nimport { UrlPayload, UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { Semaphore } from 'async-mutex'\nimport FileType from 'file-type'\nimport graphicsMagick from 'gm'\nimport hasbin from 'hasbin'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport Url from 'url-parse'\n\nimport { ImageThumbnailEncoding, ImageThumbnailWitnessConfigSchema } from './Config.ts'\nimport { getVideoFrameAsImageFluent } from './ffmpeg/index.ts'\nimport { checkIpfsUrl, createDataUrl, resolveDynamicSvg } from './lib/index.ts'\nimport { ImageThumbnailWitnessParams } from './Params.ts'\n\n// TODO: Break this into two Witnesses?\n\n// setFfmpegPath(ffmpegPath)\n\nconst gm = graphicsMagick.subClass({ imageMagick: '7+' })\n\nexport interface ImageThumbnailWitnessError extends Error {\n name: 'ImageThumbnailWitnessError'\n url: string\n}\n\nexport interface DnsError extends Error {\n code: string\n}\n\nexport class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams = ImageThumbnailWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailWitnessConfigSchema\n\n private _semaphore = new Semaphore(this.maxAsyncProcesses)\n\n get encoding() {\n return this.config.encoding ?? 'PNG'\n }\n\n get height() {\n return this.config.height ?? 128\n }\n\n get ipfsGateway() {\n return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'\n }\n\n get maxAsyncProcesses() {\n return this.config.maxAsyncProcesses ?? 4\n }\n\n get quality() {\n return this.config.quality ?? 50\n }\n\n get width() {\n return this.config.width ?? 128\n }\n\n private static async binaryToSha256(data: ArrayBuffer) {\n const viewData = new Uint8Array(data)\n await PayloadHasher.wasmInitialized\n if (PayloadHasher.wasmSupport.canUseWasm) {\n try {\n return await sha256(viewData)\n } catch {\n PayloadHasher.wasmSupport.allowWasm = false\n }\n }\n\n return shajs('sha256').update(viewData).digest().toString()\n }\n\n private static bufferFromDataUrl(url: string): ArrayBuffer | undefined {\n if (url.startsWith('data:image')) {\n const data = url.split(',')[1]\n if (data) {\n return Uint8Array.from(atob(data), c => c.codePointAt(0) ?? 0)\n } else {\n const error: ImageThumbnailWitnessError = {\n message: 'Invalid data Url',\n name: 'ImageThumbnailWitnessError',\n url,\n }\n throw error\n }\n }\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<ImageThumbnail[]> {\n if (!hasbin.sync('magick')) {\n throw new Error('ImageMagick is required for this witness')\n }\n const urlPayloads = payloads.filter(payload => payload.schema === UrlSchema)\n const process = async () => {\n return compact(\n await Promise.all(\n urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {\n let result: ImageThumbnail\n\n // if it is a data URL, return a Buffer\n const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)\n\n if (dataBuffer) {\n if (this.config.dataUrlPassthrough) {\n result = {\n schema: ImageThumbnailSchema,\n sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),\n sourceUrl: url,\n url,\n }\n } else {\n let cookedDataBuffer = dataBuffer\n const urlParts = url.split(';')\n const [, contentType] = urlParts[0].split(':')\n if (contentType.startsWith('image/svg')) {\n const [encoding, byteString] = urlParts[1].split(',')\n if (encoding === 'base64') {\n const newSvg = await resolveDynamicSvg(byteString)\n const newSvgDataUrl = createDataUrl(Buffer.from(newSvg), contentType)\n cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer\n }\n }\n result = await this.processMedia(\n cookedDataBuffer,\n {\n schema: ImageThumbnailSchema,\n sourceUrl: url,\n },\n contentType,\n )\n }\n } else {\n // if it is ipfs, go through cloud flair\n const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)\n result = await this.fromHttp(mutatedUrl, url)\n }\n return result\n }),\n ),\n )\n }\n return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process()\n }\n\n private async createThumbnailDataUrl(sourceBuffer: ArrayBuffer, encoding?: ImageThumbnailEncoding) {\n const thumb = await new Promise<Buffer>((resolve, reject) => {\n gm(Buffer.from(sourceBuffer))\n .quality(this.quality)\n .resize(this.width, this.height)\n .flatten()\n .toBuffer(encoding ?? this.encoding, (error, buffer) => {\n if (error) {\n reject(error)\n } else {\n resolve(buffer)\n }\n })\n })\n return createDataUrl(thumb, 'image/png')\n }\n\n /**\n * Creates an image thumbnail from a video.\n * @param videoBuffer The input video buffer.\n * @returns An buffer containing an image thumbnail for the video.\n */\n private async createThumbnailFromVideo(videoBuffer: ArrayBuffer) {\n const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer)\n return this.createThumbnailDataUrl(imageBuffer)\n }\n\n // eslint-disable-next-line complexity\n private async fromHttp(url: string, sourceUrl?: string): Promise<ImageThumbnail> {\n let response: AxiosResponse\n let dnsResult: string[]\n try {\n const urlObj = new Url(url)\n dnsResult = await dnsPromises.resolve(urlObj.host)\n } catch (ex) {\n const error = ex as DnsError\n const result: ImageThumbnail = {\n http: {\n code: error.code,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n return result\n }\n try {\n response = await axios.get(url, {\n responseType: 'arraybuffer',\n })\n } catch (ex) {\n const axiosError = ex as AxiosError\n if (axiosError.isAxiosError) {\n // selectively pick fields from AxiosError\n const result: ImageThumbnail = {\n http: {\n ipAddress: dnsResult[0],\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n if (axiosError?.response?.status !== undefined) {\n result.http = result.http ?? {}\n result.http.status = axiosError?.response?.status\n }\n if (axiosError?.code !== undefined) {\n result.http = result.http ?? {}\n result.http.code = axiosError?.code\n }\n return result\n } else {\n throw ex\n }\n }\n\n const result: ImageThumbnail = {\n http: {\n status: response.status,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n\n if (response.status >= 200 && response.status < 300) {\n const contentType: string | undefined = response.headers['content-type']?.toString()\n const sourceBuffer = Buffer.from(response.data, 'binary')\n\n return this.processMedia(sourceBuffer, result, contentType)\n }\n return result\n }\n\n private async processMedia(sourceBuffer: ArrayBuffer, imageThumbnail: ImageThumbnail, contentType?: string): Promise<ImageThumbnail> {\n const [mediaType, fileType] = contentType?.split('/') ?? ['', '']\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.returned = mediaType\n\n try {\n imageThumbnail.mime.detected = await FileType.fromBuffer(sourceBuffer)\n } catch (ex) {\n const error = ex as Error\n this.logger?.error(`FileType error: ${error.message}`)\n }\n\n const processImage = async (encoding?: ImageThumbnailEncoding) => {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)\n }\n\n const processVideo = async () => {\n // Gracefully handle the case where ffmpeg is not installed.\n\n if (hasbin.sync('ffmpeg')) {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer)\n } else {\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.invalid = true\n }\n }\n\n let encoding: ImageThumbnailEncoding = 'PNG'\n\n switch (fileType.toUpperCase()) {\n case 'GIF': {\n encoding = 'GIF'\n break\n }\n case 'JPG':\n case 'JPEG': {\n encoding = 'JPG'\n break\n }\n }\n\n switch (mediaType) {\n case 'image': {\n await processImage(encoding)\n imageThumbnail.mime.type = mediaType\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = mediaType\n break\n }\n default: {\n const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split('/') ?? ['', '']\n switch (detectedMediaType) {\n case 'image': {\n await processImage()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n default: {\n imageThumbnail.mime.invalid = true\n break\n }\n }\n break\n }\n }\n return imageThumbnail\n }\n}\n","import { unlink, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { Writable, WritableOptions } from 'node:stream'\n\nimport ffmpeg from 'fluent-ffmpeg'\nimport { v4 as uuid } from 'uuid'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: ArrayBuffer) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', err => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nconst allowIpfsIoRepair = true\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway?: string): string => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else if (allowIpfsIoRepair && protocol === 'https' && host === 'ipfs.io') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n const pathParts = path.split('/')\n if (pathParts[0] === 'ipfs') {\n pathParts.shift()\n }\n path = pathParts.join('/')\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch {\n // const error = ex as Error\n // console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n // console.log(error.stack)\n return urlToCheck\n }\n}\n","import { fromByteArray } from 'base64-js'\n\nexport const createDataUrl = (data: ArrayBuffer, contextType: string, encoding: 'base64' = 'base64') => {\n return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`\n}\n","import { axios, AxiosResponse } from '@xylabs/axios'\nimport { toByteArray } from 'base64-js'\nimport { Builder, parseStringPromise } from 'xml2js'\n\nexport const resolveDynamicSvg = async (base64Bytes: string) => {\n const decoder = new TextDecoder()\n const bytes = toByteArray(base64Bytes)\n const svg = decoder.decode(bytes)\n const svgObj = await parseStringPromise(svg)\n const svgNode = svgObj['svg']\n const imageResults = (await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svgNode['image'].map(async (img: any) => [\n img.$,\n await axios.get(img.$.href, {\n responseType: 'arraybuffer',\n }),\n ]),\n )) as [string, AxiosResponse][]\n const image = imageResults.map(([href, response]) => {\n if (response.data) {\n const sourceBuffer = Buffer.from(response.data, 'binary')\n return { $: { href: `data:${response.headers['content-type']?.toString()};base64,${sourceBuffer.toString('base64')}` } }\n } else {\n return { $: { href } }\n }\n })\n const updatedSVG = { ...svgObj, svg: { ...svgNode, image } }\n const builder = new Builder()\n return builder.buildObject(updatedSVG)\n}\n"],"mappings":"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","names":["import_image_thumbnail_payload_plugin","ImageThumbnailWitnessConfigSchema","ImageThumbnailSchema","import_axios","import_image_thumbnail_payload_plugin","FfmpegOutputStream","Writable","chunks","constructor","options","_write","chunk","_encoding","callback","push","toBuffer","Buffer","concat","getVideoFrameAsImageFluent","videoBuffer","tmpFile","tmpdir","uuid","writeFile","Uint8Array","encoding","imageBuffer","Promise","resolve","reject","ffmpegOutput","ffmpeg","on","err","message","input","takeFrames","withNoAudio","outputOptions","videoCodec","pipe","unlink","allowIpfsIoRepair","checkIpfsUrl","urlToCheck","ipfsGateway","url","URL","protocol","host","path","pathname","query","search","assertEx","root","length","pathParts","split","shift","join","createDataUrl","data","contextType","encoding","fromByteArray","Uint8Array","import_base64_js","resolveDynamicSvg","base64Bytes","decoder","TextDecoder","bytes","toByteArray","svg","decode","svgObj","parseStringPromise","svgNode","imageResults","Promise","all","map","img","$","axios","get","href","responseType","image","response","data","sourceBuffer","Buffer","from","headers","toString","updatedSVG","builder","Builder","buildObject","gm","graphicsMagick","subClass","imageMagick","ImageThumbnailWitness","AbstractWitness","configSchemas","ImageThumbnailWitnessConfigSchema","defaultConfigSchema","_semaphore","Semaphore","maxAsyncProcesses","encoding","config","height","ipfsGateway","quality","width","binaryToSha256","data","viewData","Uint8Array","PayloadHasher","wasmInitialized","wasmSupport","canUseWasm","sha256","allowWasm","shajs","update","digest","toString","bufferFromDataUrl","url","startsWith","split","from","atob","c","codePointAt","error","message","name","observeHandler","payloads","hasbin","sync","Error","urlPayloads","filter","payload","schema","UrlSchema","process","compact","Promise","all","map","result","dataBuffer","dataUrlPassthrough","ImageThumbnailSchema","sourceHash","sourceUrl","cookedDataBuffer","urlParts","contentType","byteString","newSvg","resolveDynamicSvg","newSvgDataUrl","createDataUrl","Buffer","processMedia","mutatedUrl","checkIpfsUrl","fromHttp","runExclusive","createThumbnailDataUrl","sourceBuffer","thumb","resolve","reject","resize","flatten","toBuffer","buffer","createThumbnailFromVideo","videoBuffer","imageBuffer","getVideoFrameAsImageFluent","response","dnsResult","urlObj","Url","dnsPromises","host","ex","http","code","axios","get","responseType","axiosError","isAxiosError","ipAddress","status","undefined","headers","imageThumbnail","mediaType","fileType","mime","returned","detected","FileType","fromBuffer","logger","processImage","processVideo","invalid","toUpperCase","type","detectedMediaType","ImageThumbnailPlugin","createPayloadSetDualPlugin","required","ImageThumbnailSchema","schema","PayloadSetSchema","diviner","params","result","ImageThumbnailDiviner","create","witness","ImageThumbnailWitness"]}
@@ -1,4 +1,4 @@
1
- export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.js';
2
- export * from './Witness/index.js';
1
+ export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts';
2
+ export * from './Witness/index.ts';
3
3
  export * from '@xyo-network/diviner-image-thumbnail';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.js';
2
- export * from './Witness/index.js';
1
+ export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts';
2
+ export * from './Witness/index.ts';
3
3
  export * from '@xyo-network/diviner-image-thumbnail';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.js';
2
- export * from './Witness/index.js';
1
+ export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts';
2
+ export * from './Witness/index.ts';
3
3
  export * from '@xyo-network/diviner-image-thumbnail';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,6 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
1
4
  // src/Plugin.ts
2
5
  import { ImageThumbnailDiviner } from "@xyo-network/diviner-image-thumbnail";
3
6
  import { ImageThumbnailSchema as ImageThumbnailSchema3 } from "@xyo-network/image-thumbnail-payload-plugin";
@@ -31,7 +34,10 @@ import { tmpdir } from "node:os";
31
34
  import { Writable } from "node:stream";
32
35
  import ffmpeg from "fluent-ffmpeg";
33
36
  import { v4 as uuid } from "uuid";
34
- var FfmpegOutputStream = class extends Writable {
37
+ var FfmpegOutputStream = class FfmpegOutputStream2 extends Writable {
38
+ static {
39
+ __name(this, "FfmpegOutputStream");
40
+ }
35
41
  chunks = [];
36
42
  constructor(options) {
37
43
  super(options);
@@ -41,16 +47,18 @@ var FfmpegOutputStream = class extends Writable {
41
47
  callback();
42
48
  }
43
49
  /**
44
- * Collects the output from ffmpeg into a buffer.
45
- * @returns A buffer containing the concatenated
46
- * output from ffmpeg.
47
- */
48
- toBuffer = () => Buffer.concat(this.chunks);
50
+ * Collects the output from ffmpeg into a buffer.
51
+ * @returns A buffer containing the concatenated
52
+ * output from ffmpeg.
53
+ */
54
+ toBuffer = /* @__PURE__ */ __name(() => Buffer.concat(this.chunks), "toBuffer");
49
55
  };
50
- var getVideoFrameAsImageFluent = async (videoBuffer) => {
56
+ var getVideoFrameAsImageFluent = /* @__PURE__ */ __name(async (videoBuffer) => {
51
57
  const tmpFile = `/${tmpdir()}/${uuid()}`;
52
58
  try {
53
- await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: "binary" });
59
+ await writeFile(tmpFile, new Uint8Array(videoBuffer), {
60
+ encoding: "binary"
61
+ });
54
62
  const imageBuffer = await new Promise((resolve, reject) => {
55
63
  const ffmpegOutput = new FfmpegOutputStream();
56
64
  ffmpeg().on("error", (err) => reject(err.message)).on("end", () => resolve(ffmpegOutput.toBuffer())).input(tmpFile).takeFrames(1).withNoAudio().outputOptions("-f image2pipe").videoCodec("png").pipe(ffmpegOutput);
@@ -62,12 +70,12 @@ var getVideoFrameAsImageFluent = async (videoBuffer) => {
62
70
  } catch {
63
71
  }
64
72
  }
65
- };
73
+ }, "getVideoFrameAsImageFluent");
66
74
 
67
75
  // src/Witness/lib/checkIpfsUrl.ts
68
76
  import { assertEx } from "@xylabs/assert";
69
77
  var allowIpfsIoRepair = true;
70
- var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
78
+ var checkIpfsUrl = /* @__PURE__ */ __name((urlToCheck, ipfsGateway) => {
71
79
  try {
72
80
  const url = new URL(urlToCheck);
73
81
  let protocol = url.protocol;
@@ -96,19 +104,19 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
96
104
  } catch {
97
105
  return urlToCheck;
98
106
  }
99
- };
107
+ }, "checkIpfsUrl");
100
108
 
101
109
  // src/Witness/lib/createDataUrl.ts
102
110
  import { fromByteArray } from "base64-js";
103
- var createDataUrl = (data, contextType, encoding = "base64") => {
111
+ var createDataUrl = /* @__PURE__ */ __name((data, contextType, encoding = "base64") => {
104
112
  return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`;
105
- };
113
+ }, "createDataUrl");
106
114
 
107
115
  // src/Witness/lib/resolveDynamicSvg.ts
108
116
  import { axios } from "@xylabs/axios";
109
117
  import { toByteArray } from "base64-js";
110
118
  import { Builder, parseStringPromise } from "xml2js";
111
- var resolveDynamicSvg = async (base64Bytes) => {
119
+ var resolveDynamicSvg = /* @__PURE__ */ __name(async (base64Bytes) => {
112
120
  const decoder = new TextDecoder();
113
121
  const bytes = toByteArray(base64Bytes);
114
122
  const svg = decoder.decode(bytes);
@@ -126,20 +134,42 @@ var resolveDynamicSvg = async (base64Bytes) => {
126
134
  const image = imageResults.map(([href, response]) => {
127
135
  if (response.data) {
128
136
  const sourceBuffer = Buffer.from(response.data, "binary");
129
- return { $: { href: `data:${response.headers["content-type"]?.toString()};base64,${sourceBuffer.toString("base64")}` } };
137
+ return {
138
+ $: {
139
+ href: `data:${response.headers["content-type"]?.toString()};base64,${sourceBuffer.toString("base64")}`
140
+ }
141
+ };
130
142
  } else {
131
- return { $: { href } };
143
+ return {
144
+ $: {
145
+ href
146
+ }
147
+ };
132
148
  }
133
149
  });
134
- const updatedSVG = { ...svgObj, svg: { ...svgNode, image } };
150
+ const updatedSVG = {
151
+ ...svgObj,
152
+ svg: {
153
+ ...svgNode,
154
+ image
155
+ }
156
+ };
135
157
  const builder = new Builder();
136
158
  return builder.buildObject(updatedSVG);
137
- };
159
+ }, "resolveDynamicSvg");
138
160
 
139
161
  // src/Witness/Witness.ts
140
- var gm = graphicsMagick.subClass({ imageMagick: "7+" });
162
+ var gm = graphicsMagick.subClass({
163
+ imageMagick: "7+"
164
+ });
141
165
  var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness {
142
- static configSchemas = [...super.configSchemas, ImageThumbnailWitnessConfigSchema];
166
+ static {
167
+ __name(this, "ImageThumbnailWitness");
168
+ }
169
+ static configSchemas = [
170
+ ...super.configSchemas,
171
+ ImageThumbnailWitnessConfigSchema
172
+ ];
143
173
  static defaultConfigSchema = ImageThumbnailWitnessConfigSchema;
144
174
  _semaphore = new Semaphore(this.maxAsyncProcesses);
145
175
  get encoding() {
@@ -192,50 +222,42 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
192
222
  throw new Error("ImageMagick is required for this witness");
193
223
  }
194
224
  const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema);
195
- const process = async () => {
196
- return compact(
197
- await Promise.all(
198
- urlPayloads.map(async ({ url }) => {
199
- let result;
200
- const dataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(url);
201
- if (dataBuffer) {
202
- if (this.config.dataUrlPassthrough) {
203
- result = {
204
- schema: ImageThumbnailSchema2,
205
- sourceHash: await _ImageThumbnailWitness.binaryToSha256(dataBuffer),
206
- sourceUrl: url,
207
- url
208
- };
209
- } else {
210
- let cookedDataBuffer = dataBuffer;
211
- const urlParts = url.split(";");
212
- const [, contentType] = urlParts[0].split(":");
213
- if (contentType.startsWith("image/svg")) {
214
- const [encoding, byteString] = urlParts[1].split(",");
215
- if (encoding === "base64") {
216
- const newSvg = await resolveDynamicSvg(byteString);
217
- const newSvgDataUrl = createDataUrl(Buffer2.from(newSvg), contentType);
218
- cookedDataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer;
219
- }
220
- }
221
- result = await this.processMedia(
222
- cookedDataBuffer,
223
- {
224
- schema: ImageThumbnailSchema2,
225
- sourceUrl: url
226
- },
227
- contentType
228
- );
225
+ const process = /* @__PURE__ */ __name(async () => {
226
+ return compact(await Promise.all(urlPayloads.map(async ({ url }) => {
227
+ let result;
228
+ const dataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(url);
229
+ if (dataBuffer) {
230
+ if (this.config.dataUrlPassthrough) {
231
+ result = {
232
+ schema: ImageThumbnailSchema2,
233
+ sourceHash: await _ImageThumbnailWitness.binaryToSha256(dataBuffer),
234
+ sourceUrl: url,
235
+ url
236
+ };
237
+ } else {
238
+ let cookedDataBuffer = dataBuffer;
239
+ const urlParts = url.split(";");
240
+ const [, contentType] = urlParts[0].split(":");
241
+ if (contentType.startsWith("image/svg")) {
242
+ const [encoding, byteString] = urlParts[1].split(",");
243
+ if (encoding === "base64") {
244
+ const newSvg = await resolveDynamicSvg(byteString);
245
+ const newSvgDataUrl = createDataUrl(Buffer2.from(newSvg), contentType);
246
+ cookedDataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer;
229
247
  }
230
- } else {
231
- const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway);
232
- result = await this.fromHttp(mutatedUrl, url);
233
248
  }
234
- return result;
235
- })
236
- )
237
- );
238
- };
249
+ result = await this.processMedia(cookedDataBuffer, {
250
+ schema: ImageThumbnailSchema2,
251
+ sourceUrl: url
252
+ }, contentType);
253
+ }
254
+ } else {
255
+ const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway);
256
+ result = await this.fromHttp(mutatedUrl, url);
257
+ }
258
+ return result;
259
+ })));
260
+ }, "process");
239
261
  return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process();
240
262
  }
241
263
  async createThumbnailDataUrl(sourceBuffer, encoding) {
@@ -251,10 +273,10 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
251
273
  return createDataUrl(thumb, "image/png");
252
274
  }
253
275
  /**
254
- * Creates an image thumbnail from a video.
255
- * @param videoBuffer The input video buffer.
256
- * @returns An buffer containing an image thumbnail for the video.
257
- */
276
+ * Creates an image thumbnail from a video.
277
+ * @param videoBuffer The input video buffer.
278
+ * @returns An buffer containing an image thumbnail for the video.
279
+ */
258
280
  async createThumbnailFromVideo(videoBuffer) {
259
281
  const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer);
260
282
  return this.createThumbnailDataUrl(imageBuffer);
@@ -319,7 +341,10 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
319
341
  return result;
320
342
  }
321
343
  async processMedia(sourceBuffer, imageThumbnail, contentType) {
322
- const [mediaType, fileType] = contentType?.split("/") ?? ["", ""];
344
+ const [mediaType, fileType] = contentType?.split("/") ?? [
345
+ "",
346
+ ""
347
+ ];
323
348
  imageThumbnail.mime = imageThumbnail.mime ?? {};
324
349
  imageThumbnail.mime.returned = mediaType;
325
350
  try {
@@ -328,11 +353,11 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
328
353
  const error = ex;
329
354
  this.logger?.error(`FileType error: ${error.message}`);
330
355
  }
331
- const processImage = async (encoding2) => {
356
+ const processImage = /* @__PURE__ */ __name(async (encoding2) => {
332
357
  imageThumbnail.sourceHash = await _ImageThumbnailWitness.binaryToSha256(sourceBuffer);
333
358
  imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding2);
334
- };
335
- const processVideo = async () => {
359
+ }, "processImage");
360
+ const processVideo = /* @__PURE__ */ __name(async () => {
336
361
  if (hasbin.sync("ffmpeg")) {
337
362
  imageThumbnail.sourceHash = await _ImageThumbnailWitness.binaryToSha256(sourceBuffer);
338
363
  imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer);
@@ -340,7 +365,7 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
340
365
  imageThumbnail.mime = imageThumbnail.mime ?? {};
341
366
  imageThumbnail.mime.invalid = true;
342
367
  }
343
- };
368
+ }, "processVideo");
344
369
  let encoding = "PNG";
345
370
  switch (fileType.toUpperCase()) {
346
371
  case "GIF": {
@@ -365,7 +390,10 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
365
390
  break;
366
391
  }
367
392
  default: {
368
- const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split("/") ?? ["", ""];
393
+ const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split("/") ?? [
394
+ "",
395
+ ""
396
+ ];
369
397
  switch (detectedMediaType) {
370
398
  case "image": {
371
399
  await processImage();
@@ -390,19 +418,21 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
390
418
  };
391
419
 
392
420
  // src/Plugin.ts
393
- var ImageThumbnailPlugin = () => createPayloadSetDualPlugin(
394
- { required: { [ImageThumbnailSchema3]: 1 }, schema: PayloadSetSchema },
395
- {
396
- diviner: async (params) => {
397
- const result = await ImageThumbnailDiviner.create(params);
398
- return result;
399
- },
400
- witness: async (params) => {
401
- const result = await ImageThumbnailWitness.create(params);
402
- return result;
403
- }
404
- }
405
- );
421
+ var ImageThumbnailPlugin = /* @__PURE__ */ __name(() => createPayloadSetDualPlugin({
422
+ required: {
423
+ [ImageThumbnailSchema3]: 1
424
+ },
425
+ schema: PayloadSetSchema
426
+ }, {
427
+ diviner: /* @__PURE__ */ __name(async (params) => {
428
+ const result = await ImageThumbnailDiviner.create(params);
429
+ return result;
430
+ }, "diviner"),
431
+ witness: /* @__PURE__ */ __name(async (params) => {
432
+ const result = await ImageThumbnailWitness.create(params);
433
+ return result;
434
+ }, "witness")
435
+ }), "ImageThumbnailPlugin");
406
436
 
407
437
  // src/index.ts
408
438
  export * from "@xyo-network/diviner-image-thumbnail";
@@ -412,4 +442,4 @@ export {
412
442
  ImageThumbnailWitnessConfigSchema,
413
443
  ImageThumbnailPlugin as default
414
444
  };
415
- //# sourceMappingURL=index.js.map
445
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Plugin.ts","../../src/Witness/Config.ts","../../src/Witness/Witness.ts","../../src/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.ts","../../src/Witness/lib/checkIpfsUrl.ts","../../src/Witness/lib/createDataUrl.ts","../../src/Witness/lib/resolveDynamicSvg.ts","../../src/index.ts"],"sourcesContent":["import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail'\nimport { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { ImageThumbnailWitness } from './Witness/index.ts'\n\nexport const ImageThumbnailPlugin = () =>\n createPayloadSetDualPlugin<ImageThumbnailWitness, ImageThumbnailDiviner>(\n { required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n const result = await ImageThumbnailDiviner.create(params)\n return result\n },\n witness: async (params) => {\n const result = await ImageThumbnailWitness.create(params)\n return result\n },\n },\n )\n","import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { WitnessConfig } from '@xyo-network/witness-model'\n\nexport const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config` as const\nexport type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema\n\nexport type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF'\n\nexport type ImageThumbnailWitnessConfig = WitnessConfig<{\n dataUrlPassthrough?: boolean\n encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n runExclusive?: boolean\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n","/* eslint-disable max-statements */\nimport { Buffer } from 'node:buffer'\nimport { promises as dnsPromises } from 'node:dns'\n\nimport { axios, AxiosError, AxiosResponse } from '@xylabs/axios'\nimport { compact } from '@xylabs/lodash'\nimport { AbstractWitness } from '@xyo-network/abstract-witness'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { ImageThumbnail, ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { Schema } from '@xyo-network/payload-model'\nimport { UrlPayload, UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { Semaphore } from 'async-mutex'\nimport FileType from 'file-type'\nimport graphicsMagick from 'gm'\nimport hasbin from 'hasbin'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport Url from 'url-parse'\n\nimport { ImageThumbnailEncoding, ImageThumbnailWitnessConfigSchema } from './Config.ts'\nimport { getVideoFrameAsImageFluent } from './ffmpeg/index.ts'\nimport { checkIpfsUrl, createDataUrl, resolveDynamicSvg } from './lib/index.ts'\nimport { ImageThumbnailWitnessParams } from './Params.ts'\n\n// TODO: Break this into two Witnesses?\n\n// setFfmpegPath(ffmpegPath)\n\nconst gm = graphicsMagick.subClass({ imageMagick: '7+' })\n\nexport interface ImageThumbnailWitnessError extends Error {\n name: 'ImageThumbnailWitnessError'\n url: string\n}\n\nexport interface DnsError extends Error {\n code: string\n}\n\nexport class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams = ImageThumbnailWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailWitnessConfigSchema\n\n private _semaphore = new Semaphore(this.maxAsyncProcesses)\n\n get encoding() {\n return this.config.encoding ?? 'PNG'\n }\n\n get height() {\n return this.config.height ?? 128\n }\n\n get ipfsGateway() {\n return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'\n }\n\n get maxAsyncProcesses() {\n return this.config.maxAsyncProcesses ?? 4\n }\n\n get quality() {\n return this.config.quality ?? 50\n }\n\n get width() {\n return this.config.width ?? 128\n }\n\n private static async binaryToSha256(data: ArrayBuffer) {\n const viewData = new Uint8Array(data)\n await PayloadHasher.wasmInitialized\n if (PayloadHasher.wasmSupport.canUseWasm) {\n try {\n return await sha256(viewData)\n } catch {\n PayloadHasher.wasmSupport.allowWasm = false\n }\n }\n\n return shajs('sha256').update(viewData).digest().toString()\n }\n\n private static bufferFromDataUrl(url: string): ArrayBuffer | undefined {\n if (url.startsWith('data:image')) {\n const data = url.split(',')[1]\n if (data) {\n return Uint8Array.from(atob(data), c => c.codePointAt(0) ?? 0)\n } else {\n const error: ImageThumbnailWitnessError = {\n message: 'Invalid data Url',\n name: 'ImageThumbnailWitnessError',\n url,\n }\n throw error\n }\n }\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<ImageThumbnail[]> {\n if (!hasbin.sync('magick')) {\n throw new Error('ImageMagick is required for this witness')\n }\n const urlPayloads = payloads.filter(payload => payload.schema === UrlSchema)\n const process = async () => {\n return compact(\n await Promise.all(\n urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {\n let result: ImageThumbnail\n\n // if it is a data URL, return a Buffer\n const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)\n\n if (dataBuffer) {\n if (this.config.dataUrlPassthrough) {\n result = {\n schema: ImageThumbnailSchema,\n sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),\n sourceUrl: url,\n url,\n }\n } else {\n let cookedDataBuffer = dataBuffer\n const urlParts = url.split(';')\n const [, contentType] = urlParts[0].split(':')\n if (contentType.startsWith('image/svg')) {\n const [encoding, byteString] = urlParts[1].split(',')\n if (encoding === 'base64') {\n const newSvg = await resolveDynamicSvg(byteString)\n const newSvgDataUrl = createDataUrl(Buffer.from(newSvg), contentType)\n cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer\n }\n }\n result = await this.processMedia(\n cookedDataBuffer,\n {\n schema: ImageThumbnailSchema,\n sourceUrl: url,\n },\n contentType,\n )\n }\n } else {\n // if it is ipfs, go through cloud flair\n const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)\n result = await this.fromHttp(mutatedUrl, url)\n }\n return result\n }),\n ),\n )\n }\n return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process()\n }\n\n private async createThumbnailDataUrl(sourceBuffer: ArrayBuffer, encoding?: ImageThumbnailEncoding) {\n const thumb = await new Promise<Buffer>((resolve, reject) => {\n gm(Buffer.from(sourceBuffer))\n .quality(this.quality)\n .resize(this.width, this.height)\n .flatten()\n .toBuffer(encoding ?? this.encoding, (error, buffer) => {\n if (error) {\n reject(error)\n } else {\n resolve(buffer)\n }\n })\n })\n return createDataUrl(thumb, 'image/png')\n }\n\n /**\n * Creates an image thumbnail from a video.\n * @param videoBuffer The input video buffer.\n * @returns An buffer containing an image thumbnail for the video.\n */\n private async createThumbnailFromVideo(videoBuffer: ArrayBuffer) {\n const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer)\n return this.createThumbnailDataUrl(imageBuffer)\n }\n\n // eslint-disable-next-line complexity\n private async fromHttp(url: string, sourceUrl?: string): Promise<ImageThumbnail> {\n let response: AxiosResponse\n let dnsResult: string[]\n try {\n const urlObj = new Url(url)\n dnsResult = await dnsPromises.resolve(urlObj.host)\n } catch (ex) {\n const error = ex as DnsError\n const result: ImageThumbnail = {\n http: {\n code: error.code,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n return result\n }\n try {\n response = await axios.get(url, {\n responseType: 'arraybuffer',\n })\n } catch (ex) {\n const axiosError = ex as AxiosError\n if (axiosError.isAxiosError) {\n // selectively pick fields from AxiosError\n const result: ImageThumbnail = {\n http: {\n ipAddress: dnsResult[0],\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n if (axiosError?.response?.status !== undefined) {\n result.http = result.http ?? {}\n result.http.status = axiosError?.response?.status\n }\n if (axiosError?.code !== undefined) {\n result.http = result.http ?? {}\n result.http.code = axiosError?.code\n }\n return result\n } else {\n throw ex\n }\n }\n\n const result: ImageThumbnail = {\n http: {\n status: response.status,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\n }\n\n if (response.status >= 200 && response.status < 300) {\n const contentType: string | undefined = response.headers['content-type']?.toString()\n const sourceBuffer = Buffer.from(response.data, 'binary')\n\n return this.processMedia(sourceBuffer, result, contentType)\n }\n return result\n }\n\n private async processMedia(sourceBuffer: ArrayBuffer, imageThumbnail: ImageThumbnail, contentType?: string): Promise<ImageThumbnail> {\n const [mediaType, fileType] = contentType?.split('/') ?? ['', '']\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.returned = mediaType\n\n try {\n imageThumbnail.mime.detected = await FileType.fromBuffer(sourceBuffer)\n } catch (ex) {\n const error = ex as Error\n this.logger?.error(`FileType error: ${error.message}`)\n }\n\n const processImage = async (encoding?: ImageThumbnailEncoding) => {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)\n }\n\n const processVideo = async () => {\n // Gracefully handle the case where ffmpeg is not installed.\n\n if (hasbin.sync('ffmpeg')) {\n imageThumbnail.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer)\n } else {\n imageThumbnail.mime = imageThumbnail.mime ?? {}\n imageThumbnail.mime.invalid = true\n }\n }\n\n let encoding: ImageThumbnailEncoding = 'PNG'\n\n switch (fileType.toUpperCase()) {\n case 'GIF': {\n encoding = 'GIF'\n break\n }\n case 'JPG':\n case 'JPEG': {\n encoding = 'JPG'\n break\n }\n }\n\n switch (mediaType) {\n case 'image': {\n await processImage(encoding)\n imageThumbnail.mime.type = mediaType\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = mediaType\n break\n }\n default: {\n const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split('/') ?? ['', '']\n switch (detectedMediaType) {\n case 'image': {\n await processImage()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n case 'video': {\n await processVideo()\n imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime\n break\n }\n default: {\n imageThumbnail.mime.invalid = true\n break\n }\n }\n break\n }\n }\n return imageThumbnail\n }\n}\n","import { unlink, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { Writable, WritableOptions } from 'node:stream'\n\nimport ffmpeg from 'fluent-ffmpeg'\nimport { v4 as uuid } from 'uuid'\n\n/**\n * A Writable stream that collects output from ffmpeg.\n */\nclass FfmpegOutputStream extends Writable {\n private readonly chunks: Uint8Array[] = []\n\n constructor(options?: WritableOptions) {\n super(options)\n }\n\n override _write(chunk: never, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n this.chunks.push(chunk)\n callback()\n }\n\n /**\n * Collects the output from ffmpeg into a buffer.\n * @returns A buffer containing the concatenated\n * output from ffmpeg.\n */\n toBuffer = () => Buffer.concat(this.chunks)\n}\n\n/**\n * Execute FFmpeg using fluent API with provided input buffer and video thumbnail image.\n * @param videoBuffer Input video buffer.\n * @returns Output buffer containing the video thumbnail image.\n */\nexport const getVideoFrameAsImageFluent = async (videoBuffer: ArrayBuffer) => {\n // Get a temp file name\n const tmpFile = `/${tmpdir()}/${uuid()}`\n try {\n // Write videoBuffer to temp file for use as input to ffmpeg to\n // avoid issues with ffmpeg inferring premature EOF from buffer\n // passed via stdin (happens when ffmpeg is trying to infer\n // input video format)\n await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: 'binary' })\n const imageBuffer = await new Promise<Buffer>((resolve, reject) => {\n // Create a Writable stream to collect PNG output from ffmpeg\n const ffmpegOutput = new FfmpegOutputStream()\n // Execute ffmpeg using fluent API\n ffmpeg()\n // NOTE: Uncomment to debug CLI args to ffmpeg\n // .on('start', (commandLine) => console.log('Spawned Ffmpeg with command: ' + commandLine))\n .on('error', err => reject(err.message))\n // Listen for the 'end' event to combine the output into a buffer holding the PNG image\n .on('end', () => resolve(ffmpegOutput.toBuffer()))\n .input(tmpFile) // Use temp file as input\n .takeFrames(1) // Only take 1st video frame\n .withNoAudio() // Don't include audio\n .outputOptions('-f image2pipe') // Write output to stdout\n .videoCodec('png') // Force PNG output\n // Start processing and direct ffmpeg stdout to writable stream\n .pipe(ffmpegOutput)\n })\n return imageBuffer\n } finally {\n // Cleanup temp file\n try {\n await unlink(tmpFile)\n } catch {\n // No error here since file doesn't exist\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nconst allowIpfsIoRepair = true\n\n/**\n * Returns the equivalent IPFS gateway URL for the supplied URL.\n * @param urlToCheck The URL to check\n * @returns If the supplied URL is an IPFS URL, it converts the URL to the\n * equivalent IPFS gateway URL. Otherwise, returns the original URL.\n */\nexport const checkIpfsUrl = (urlToCheck: string, ipfsGateway?: string): string => {\n try {\n const url = new URL(urlToCheck)\n let protocol = url.protocol\n let host = url.host\n let path = url.pathname\n const query = url.search\n if (protocol === 'ipfs:') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n path = url.host === 'ipfs' ? `ipfs${path}` : `ipfs/${url.host}${path}`\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else if (allowIpfsIoRepair && protocol === 'https' && host === 'ipfs.io') {\n protocol = 'https:'\n host = assertEx(ipfsGateway, () => 'No ipfsGateway provided')\n const pathParts = path.split('/')\n if (pathParts[0] === 'ipfs') {\n pathParts.shift()\n }\n path = pathParts.join('/')\n const root = `${protocol}//${host}/${path}`\n return query?.length > 0 ? `${root}?${query}` : root\n } else {\n return urlToCheck\n }\n } catch {\n // const error = ex as Error\n // console.error(`${error.name}:${error.message} [${urlToCheck}]`)\n // console.log(error.stack)\n return urlToCheck\n }\n}\n","import { fromByteArray } from 'base64-js'\n\nexport const createDataUrl = (data: ArrayBuffer, contextType: string, encoding: 'base64' = 'base64') => {\n return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`\n}\n","import { axios, AxiosResponse } from '@xylabs/axios'\nimport { toByteArray } from 'base64-js'\nimport { Builder, parseStringPromise } from 'xml2js'\n\nexport const resolveDynamicSvg = async (base64Bytes: string) => {\n const decoder = new TextDecoder()\n const bytes = toByteArray(base64Bytes)\n const svg = decoder.decode(bytes)\n const svgObj = await parseStringPromise(svg)\n const svgNode = svgObj['svg']\n const imageResults = (await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n svgNode['image'].map(async (img: any) => [\n img.$,\n await axios.get(img.$.href, {\n responseType: 'arraybuffer',\n }),\n ]),\n )) as [string, AxiosResponse][]\n const image = imageResults.map(([href, response]) => {\n if (response.data) {\n const sourceBuffer = Buffer.from(response.data, 'binary')\n return { $: { href: `data:${response.headers['content-type']?.toString()};base64,${sourceBuffer.toString('base64')}` } }\n } else {\n return { $: { href } }\n }\n })\n const updatedSVG = { ...svgObj, svg: { ...svgNode, image } }\n const builder = new Builder()\n return builder.buildObject(updatedSVG)\n}\n","// eslint-disable-next-line import/no-default-export\nexport { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts'\nexport * from './Witness/index.ts'\nexport * from '@xyo-network/diviner-image-thumbnail'\n"],"mappings":"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","names":["ImageThumbnailDiviner","ImageThumbnailSchema","PayloadSetSchema","createPayloadSetDualPlugin","ImageThumbnailSchema","ImageThumbnailWitnessConfigSchema","Buffer","promises","dnsPromises","axios","compact","AbstractWitness","PayloadHasher","ImageThumbnailSchema","UrlSchema","Semaphore","FileType","graphicsMagick","hasbin","sha256","shajs","Url","unlink","writeFile","tmpdir","Writable","ffmpeg","v4","uuid","FfmpegOutputStream","Writable","chunks","constructor","options","_write","chunk","_encoding","callback","push","toBuffer","Buffer","concat","getVideoFrameAsImageFluent","videoBuffer","tmpFile","tmpdir","uuid","writeFile","Uint8Array","encoding","imageBuffer","Promise","resolve","reject","ffmpegOutput","ffmpeg","on","err","message","input","takeFrames","withNoAudio","outputOptions","videoCodec","pipe","unlink","assertEx","allowIpfsIoRepair","checkIpfsUrl","urlToCheck","ipfsGateway","url","URL","protocol","host","path","pathname","query","search","assertEx","root","length","pathParts","split","shift","join","fromByteArray","createDataUrl","data","contextType","encoding","fromByteArray","Uint8Array","axios","toByteArray","Builder","parseStringPromise","resolveDynamicSvg","base64Bytes","decoder","TextDecoder","bytes","toByteArray","svg","decode","svgObj","parseStringPromise","svgNode","imageResults","Promise","all","map","img","$","axios","get","href","responseType","image","response","data","sourceBuffer","Buffer","from","headers","toString","updatedSVG","builder","Builder","buildObject","gm","graphicsMagick","subClass","imageMagick","ImageThumbnailWitness","AbstractWitness","configSchemas","ImageThumbnailWitnessConfigSchema","defaultConfigSchema","_semaphore","Semaphore","maxAsyncProcesses","encoding","config","height","ipfsGateway","quality","width","binaryToSha256","data","viewData","Uint8Array","PayloadHasher","wasmInitialized","wasmSupport","canUseWasm","sha256","allowWasm","shajs","update","digest","toString","bufferFromDataUrl","url","startsWith","split","from","atob","c","codePointAt","error","message","name","observeHandler","payloads","hasbin","sync","Error","urlPayloads","filter","payload","schema","UrlSchema","process","compact","Promise","all","map","result","dataBuffer","dataUrlPassthrough","ImageThumbnailSchema","sourceHash","sourceUrl","cookedDataBuffer","urlParts","contentType","byteString","newSvg","resolveDynamicSvg","newSvgDataUrl","createDataUrl","Buffer","processMedia","mutatedUrl","checkIpfsUrl","fromHttp","runExclusive","createThumbnailDataUrl","sourceBuffer","thumb","resolve","reject","resize","flatten","toBuffer","buffer","createThumbnailFromVideo","videoBuffer","imageBuffer","getVideoFrameAsImageFluent","response","dnsResult","urlObj","Url","dnsPromises","host","ex","http","code","axios","get","responseType","axiosError","isAxiosError","ipAddress","status","undefined","headers","imageThumbnail","mediaType","fileType","mime","returned","detected","FileType","fromBuffer","logger","processImage","processVideo","invalid","toUpperCase","type","detectedMediaType","ImageThumbnailPlugin","createPayloadSetDualPlugin","required","ImageThumbnailSchema","schema","PayloadSetSchema","diviner","params","result","ImageThumbnailDiviner","create","witness","ImageThumbnailWitness"]}
@@ -1,5 +1,5 @@
1
1
  import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail';
2
- import { ImageThumbnailWitness } from './Witness/index.js';
2
+ import { ImageThumbnailWitness } from './Witness/index.ts';
3
3
  export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import("@xylabs/object").BaseParamsFields & {
4
4
  account?: import("@xyo-network/account-model").AccountInstance | "random";
5
5
  addToResolvers?: boolean;
@@ -9,7 +9,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
9
9
  schema: "network.xyo.image.thumbnail.witness.config";
10
10
  } & {
11
11
  dataUrlPassthrough?: boolean;
12
- encoding?: import("./Witness/Config.js").ImageThumbnailEncoding;
12
+ encoding?: import("./Witness/Config.ts").ImageThumbnailEncoding;
13
13
  height?: number;
14
14
  ipfsGateway?: string;
15
15
  maxAsyncProcesses?: number;
@@ -17,7 +17,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
17
17
  maxCacheEntries?: number;
18
18
  quality?: number;
19
19
  runExclusive?: boolean;
20
- schema: import("./Witness/Config.js").ImageThumbnailWitnessConfigSchema;
20
+ schema: import("./Witness/Config.ts").ImageThumbnailWitnessConfigSchema;
21
21
  width?: number;
22
22
  }, "schema"> & {
23
23
  schema: "network.xyo.image.thumbnail.witness.config";
@@ -1,5 +1,5 @@
1
1
  import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail';
2
- import { ImageThumbnailWitness } from './Witness/index.js';
2
+ import { ImageThumbnailWitness } from './Witness/index.ts';
3
3
  export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import("@xylabs/object").BaseParamsFields & {
4
4
  account?: import("@xyo-network/account-model").AccountInstance | "random";
5
5
  addToResolvers?: boolean;
@@ -9,7 +9,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
9
9
  schema: "network.xyo.image.thumbnail.witness.config";
10
10
  } & {
11
11
  dataUrlPassthrough?: boolean;
12
- encoding?: import("./Witness/Config.js").ImageThumbnailEncoding;
12
+ encoding?: import("./Witness/Config.ts").ImageThumbnailEncoding;
13
13
  height?: number;
14
14
  ipfsGateway?: string;
15
15
  maxAsyncProcesses?: number;
@@ -17,7 +17,7 @@ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset
17
17
  maxCacheEntries?: number;
18
18
  quality?: number;
19
19
  runExclusive?: boolean;
20
- schema: import("./Witness/Config.js").ImageThumbnailWitnessConfigSchema;
20
+ schema: import("./Witness/Config.ts").ImageThumbnailWitnessConfigSchema;
21
21
  width?: number;
22
22
  }, "schema"> & {
23
23
  schema: "network.xyo.image.thumbnail.witness.config";