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

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.
@@ -1,6 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/Plugin.ts
5
2
  import { ImageThumbnailDiviner } from "@xyo-network/diviner-image-thumbnail";
6
3
  import { ImageThumbnailSchema as ImageThumbnailSchema3 } from "@xyo-network/image-thumbnail-payload-plugin";
@@ -14,13 +11,13 @@ var ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config`
14
11
  // src/Witness/Witness.ts
15
12
  import { Buffer as Buffer2 } from "node:buffer";
16
13
  import { promises as dnsPromises } from "node:dns";
17
- import { axios as axios2 } from "@xylabs/axios";
18
14
  import { compact } from "@xylabs/lodash";
19
15
  import { AbstractWitness } from "@xyo-network/abstract-witness";
20
16
  import { PayloadHasher } from "@xyo-network/hash";
21
17
  import { ImageThumbnailSchema as ImageThumbnailSchema2 } from "@xyo-network/image-thumbnail-payload-plugin";
22
18
  import { UrlSchema } from "@xyo-network/url-payload-plugin";
23
19
  import { Semaphore } from "async-mutex";
20
+ import axios2 from "axios";
24
21
  import FileType from "file-type";
25
22
  import graphicsMagick from "gm";
26
23
  import hasbin from "hasbin";
@@ -34,10 +31,7 @@ import { tmpdir } from "node:os";
34
31
  import { Writable } from "node:stream";
35
32
  import ffmpeg from "fluent-ffmpeg";
36
33
  import { v4 as uuid } from "uuid";
37
- var FfmpegOutputStream = class FfmpegOutputStream2 extends Writable {
38
- static {
39
- __name(this, "FfmpegOutputStream");
40
- }
34
+ var FfmpegOutputStream = class extends Writable {
41
35
  chunks = [];
42
36
  constructor(options) {
43
37
  super(options);
@@ -47,18 +41,16 @@ var FfmpegOutputStream = class FfmpegOutputStream2 extends Writable {
47
41
  callback();
48
42
  }
49
43
  /**
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");
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);
55
49
  };
56
- var getVideoFrameAsImageFluent = /* @__PURE__ */ __name(async (videoBuffer) => {
50
+ var getVideoFrameAsImageFluent = async (videoBuffer) => {
57
51
  const tmpFile = `/${tmpdir()}/${uuid()}`;
58
52
  try {
59
- await writeFile(tmpFile, new Uint8Array(videoBuffer), {
60
- encoding: "binary"
61
- });
53
+ await writeFile(tmpFile, new Uint8Array(videoBuffer), { encoding: "binary" });
62
54
  const imageBuffer = await new Promise((resolve, reject) => {
63
55
  const ffmpegOutput = new FfmpegOutputStream();
64
56
  ffmpeg().on("error", (err) => reject(err.message)).on("end", () => resolve(ffmpegOutput.toBuffer())).input(tmpFile).takeFrames(1).withNoAudio().outputOptions("-f image2pipe").videoCodec("png").pipe(ffmpegOutput);
@@ -70,12 +62,12 @@ var getVideoFrameAsImageFluent = /* @__PURE__ */ __name(async (videoBuffer) => {
70
62
  } catch {
71
63
  }
72
64
  }
73
- }, "getVideoFrameAsImageFluent");
65
+ };
74
66
 
75
67
  // src/Witness/lib/checkIpfsUrl.ts
76
68
  import { assertEx } from "@xylabs/assert";
77
69
  var allowIpfsIoRepair = true;
78
- var checkIpfsUrl = /* @__PURE__ */ __name((urlToCheck, ipfsGateway) => {
70
+ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
79
71
  try {
80
72
  const url = new URL(urlToCheck);
81
73
  let protocol = url.protocol;
@@ -104,19 +96,19 @@ var checkIpfsUrl = /* @__PURE__ */ __name((urlToCheck, ipfsGateway) => {
104
96
  } catch {
105
97
  return urlToCheck;
106
98
  }
107
- }, "checkIpfsUrl");
99
+ };
108
100
 
109
101
  // src/Witness/lib/createDataUrl.ts
110
102
  import { fromByteArray } from "base64-js";
111
- var createDataUrl = /* @__PURE__ */ __name((data, contextType, encoding = "base64") => {
103
+ var createDataUrl = (data, contextType, encoding = "base64") => {
112
104
  return `data:${contextType};${encoding},${fromByteArray(new Uint8Array(data))}`;
113
- }, "createDataUrl");
105
+ };
114
106
 
115
107
  // src/Witness/lib/resolveDynamicSvg.ts
116
- import { axios } from "@xylabs/axios";
108
+ import axios from "axios";
117
109
  import { toByteArray } from "base64-js";
118
110
  import { Builder, parseStringPromise } from "xml2js";
119
- var resolveDynamicSvg = /* @__PURE__ */ __name(async (base64Bytes) => {
111
+ var resolveDynamicSvg = async (base64Bytes) => {
120
112
  const decoder = new TextDecoder();
121
113
  const bytes = toByteArray(base64Bytes);
122
114
  const svg = decoder.decode(bytes);
@@ -134,42 +126,20 @@ var resolveDynamicSvg = /* @__PURE__ */ __name(async (base64Bytes) => {
134
126
  const image = imageResults.map(([href, response]) => {
135
127
  if (response.data) {
136
128
  const sourceBuffer = Buffer.from(response.data, "binary");
137
- return {
138
- $: {
139
- href: `data:${response.headers["content-type"]?.toString()};base64,${sourceBuffer.toString("base64")}`
140
- }
141
- };
129
+ return { $: { href: `data:${response.headers["content-type"]?.toString()};base64,${sourceBuffer.toString("base64")}` } };
142
130
  } else {
143
- return {
144
- $: {
145
- href
146
- }
147
- };
131
+ return { $: { href } };
148
132
  }
149
133
  });
150
- const updatedSVG = {
151
- ...svgObj,
152
- svg: {
153
- ...svgNode,
154
- image
155
- }
156
- };
134
+ const updatedSVG = { ...svgObj, svg: { ...svgNode, image } };
157
135
  const builder = new Builder();
158
136
  return builder.buildObject(updatedSVG);
159
- }, "resolveDynamicSvg");
137
+ };
160
138
 
161
139
  // src/Witness/Witness.ts
162
- var gm = graphicsMagick.subClass({
163
- imageMagick: "7+"
164
- });
140
+ var gm = graphicsMagick.subClass({ imageMagick: "7+" });
165
141
  var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness {
166
- static {
167
- __name(this, "ImageThumbnailWitness");
168
- }
169
- static configSchemas = [
170
- ...super.configSchemas,
171
- ImageThumbnailWitnessConfigSchema
172
- ];
142
+ static configSchemas = [...super.configSchemas, ImageThumbnailWitnessConfigSchema];
173
143
  static defaultConfigSchema = ImageThumbnailWitnessConfigSchema;
174
144
  _semaphore = new Semaphore(this.maxAsyncProcesses);
175
145
  get encoding() {
@@ -222,42 +192,50 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
222
192
  throw new Error("ImageMagick is required for this witness");
223
193
  }
224
194
  const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema);
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;
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
+ );
247
229
  }
230
+ } else {
231
+ const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway);
232
+ result = await this.fromHttp(mutatedUrl, url);
248
233
  }
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");
234
+ return result;
235
+ })
236
+ )
237
+ );
238
+ };
261
239
  return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process();
262
240
  }
263
241
  async createThumbnailDataUrl(sourceBuffer, encoding) {
@@ -273,10 +251,10 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
273
251
  return createDataUrl(thumb, "image/png");
274
252
  }
275
253
  /**
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
- */
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
+ */
280
258
  async createThumbnailFromVideo(videoBuffer) {
281
259
  const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer);
282
260
  return this.createThumbnailDataUrl(imageBuffer);
@@ -341,10 +319,7 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
341
319
  return result;
342
320
  }
343
321
  async processMedia(sourceBuffer, imageThumbnail, contentType) {
344
- const [mediaType, fileType] = contentType?.split("/") ?? [
345
- "",
346
- ""
347
- ];
322
+ const [mediaType, fileType] = contentType?.split("/") ?? ["", ""];
348
323
  imageThumbnail.mime = imageThumbnail.mime ?? {};
349
324
  imageThumbnail.mime.returned = mediaType;
350
325
  try {
@@ -353,11 +328,11 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
353
328
  const error = ex;
354
329
  this.logger?.error(`FileType error: ${error.message}`);
355
330
  }
356
- const processImage = /* @__PURE__ */ __name(async (encoding2) => {
331
+ const processImage = async (encoding2) => {
357
332
  imageThumbnail.sourceHash = await _ImageThumbnailWitness.binaryToSha256(sourceBuffer);
358
333
  imageThumbnail.url = await this.createThumbnailDataUrl(sourceBuffer, encoding2);
359
- }, "processImage");
360
- const processVideo = /* @__PURE__ */ __name(async () => {
334
+ };
335
+ const processVideo = async () => {
361
336
  if (hasbin.sync("ffmpeg")) {
362
337
  imageThumbnail.sourceHash = await _ImageThumbnailWitness.binaryToSha256(sourceBuffer);
363
338
  imageThumbnail.url = await this.createThumbnailFromVideo(sourceBuffer);
@@ -365,7 +340,7 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
365
340
  imageThumbnail.mime = imageThumbnail.mime ?? {};
366
341
  imageThumbnail.mime.invalid = true;
367
342
  }
368
- }, "processVideo");
343
+ };
369
344
  let encoding = "PNG";
370
345
  switch (fileType.toUpperCase()) {
371
346
  case "GIF": {
@@ -390,10 +365,7 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
390
365
  break;
391
366
  }
392
367
  default: {
393
- const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split("/") ?? [
394
- "",
395
- ""
396
- ];
368
+ const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split("/") ?? ["", ""];
397
369
  switch (detectedMediaType) {
398
370
  case "image": {
399
371
  await processImage();
@@ -418,21 +390,19 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
418
390
  };
419
391
 
420
392
  // src/Plugin.ts
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");
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
+ );
436
406
 
437
407
  // src/index.ts
438
408
  export * from "@xyo-network/diviner-image-thumbnail";
@@ -1 +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
+ {"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 { 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 type { AxiosError, AxiosResponse } from 'axios'\nimport axios from 'axios'\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 '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":["ImageThumbnailSchema","Buffer","ImageThumbnailSchema","axios","ImageThumbnailSchema","Buffer","result","axios","encoding","ImageThumbnailSchema"]}
@@ -1,9 +1,9 @@
1
1
  import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail';
2
2
  import { ImageThumbnailWitness } from './Witness/index.ts';
3
- export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import("@xylabs/object").BaseParamsFields & {
4
- account?: import("@xyo-network/account-model").AccountInstance | "random";
3
+ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import(".store/@xylabs-object-npm-3.6.12-443b813787/package").BaseParamsFields & {
4
+ account?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance | "random";
5
5
  addToResolvers?: boolean;
6
- additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
6
+ additionalSigners?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance[];
7
7
  allowNameResolution?: boolean;
8
8
  config: import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & {
9
9
  schema: "network.xyo.image.thumbnail.witness.config";
@@ -1,9 +1,9 @@
1
1
  import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail';
2
2
  import { ImageThumbnailWitness } from './Witness/index.ts';
3
- export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import("@xylabs/object").BaseParamsFields & {
4
- account?: import("@xyo-network/account-model").AccountInstance | "random";
3
+ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import(".store/@xylabs-object-npm-3.6.12-443b813787/package").BaseParamsFields & {
4
+ account?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance | "random";
5
5
  addToResolvers?: boolean;
6
- additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
6
+ additionalSigners?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance[];
7
7
  allowNameResolution?: boolean;
8
8
  config: import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & {
9
9
  schema: "network.xyo.image.thumbnail.witness.config";
@@ -1,9 +1,9 @@
1
1
  import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail';
2
2
  import { ImageThumbnailWitness } from './Witness/index.ts';
3
- export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import("@xylabs/object").BaseParamsFields & {
4
- account?: import("@xyo-network/account-model").AccountInstance | "random";
3
+ export declare const ImageThumbnailPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDualPlugin<ImageThumbnailWitness<import(".store/@xylabs-object-npm-3.6.12-443b813787/package").BaseParamsFields & {
4
+ account?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance | "random";
5
5
  addToResolvers?: boolean;
6
- additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
6
+ additionalSigners?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance[];
7
7
  allowNameResolution?: boolean;
8
8
  config: import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & {
9
9
  schema: "network.xyo.image.thumbnail.witness.config";
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AASvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAQzD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA8D;IAC9G,gBAAyB,mBAAmB,EAAE,MAAM,CAAoC;IAExF,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAcnC,OAAO,CAAC,MAAM,CAAC,iBAAiB;cAgBP,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAwDjF,sBAAsB;YAsBtB,wBAAwB;YAMxB,QAAQ;YA+DR,YAAY;CA6E3B"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AAWvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAQzD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA8D;IAC9G,gBAAyB,mBAAmB,EAAE,MAAM,CAAoC;IAExF,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAcnC,OAAO,CAAC,MAAM,CAAC,iBAAiB;cAgBP,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAwDjF,sBAAsB;YAsBtB,wBAAwB;YAMxB,QAAQ;YA+DR,YAAY;CA6E3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AASvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAQzD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA8D;IAC9G,gBAAyB,mBAAmB,EAAE,MAAM,CAAoC;IAExF,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAcnC,OAAO,CAAC,MAAM,CAAC,iBAAiB;cAgBP,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAwDjF,sBAAsB;YAsBtB,wBAAwB;YAMxB,QAAQ;YA+DR,YAAY;CA6E3B"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AAWvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAQzD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA8D;IAC9G,gBAAyB,mBAAmB,EAAE,MAAM,CAAoC;IAExF,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAcnC,OAAO,CAAC,MAAM,CAAC,iBAAiB;cAgBP,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAwDjF,sBAAsB;YAsBtB,wBAAwB;YAMxB,QAAQ;YA+DR,YAAY;CA6E3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AASvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAQzD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA8D;IAC9G,gBAAyB,mBAAmB,EAAE,MAAM,CAAoC;IAExF,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAcnC,OAAO,CAAC,MAAM,CAAC,iBAAiB;cAgBP,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAwDjF,sBAAsB;YAsBtB,wBAAwB;YAMxB,QAAQ;YA+DR,YAAY;CA6E3B"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AAWvE,OAAO,EAAE,sBAAsB,EAAqC,MAAM,aAAa,CAAA;AAGvF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAQzD,MAAM,WAAW,0BAA2B,SAAQ,KAAK;IACvD,IAAI,EAAE,4BAA4B,CAAA;IAClC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,qBAAa,qBAAqB,CAAC,OAAO,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC5I,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAA8D;IAC9G,gBAAyB,mBAAmB,EAAE,MAAM,CAAoC;IAExF,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAcnC,OAAO,CAAC,MAAM,CAAC,iBAAiB;cAgBP,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAwDjF,sBAAsB;YAsBtB,wBAAwB;YAMxB,QAAQ;YA+DR,YAAY;CA6E3B"}