@xyo-network/image-thumbnail-plugin 2.74.5 → 2.75.0

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 (166) hide show
  1. package/dist/node/Diviner/Config.d.mts.map +1 -0
  2. package/dist/node/Diviner/Config.d.ts.map +1 -0
  3. package/dist/node/Diviner/Config.js +30 -0
  4. package/dist/node/Diviner/Config.js.map +1 -0
  5. package/dist/node/Diviner/Config.mjs +6 -0
  6. package/dist/node/Diviner/Config.mjs.map +1 -0
  7. package/dist/node/Diviner/Diviner.d.mts.map +1 -0
  8. package/dist/node/Diviner/Diviner.d.ts.map +1 -0
  9. package/dist/node/Diviner/Diviner.js +199 -0
  10. package/dist/node/Diviner/Diviner.js.map +1 -0
  11. package/dist/node/Diviner/Diviner.mjs +175 -0
  12. package/dist/node/Diviner/Diviner.mjs.map +1 -0
  13. package/dist/node/Diviner/Params.d.mts.map +1 -0
  14. package/dist/node/Diviner/Params.d.ts.map +1 -0
  15. package/dist/node/Diviner/Params.js +17 -0
  16. package/dist/node/Diviner/Params.js.map +1 -0
  17. package/dist/node/Diviner/Params.mjs +1 -0
  18. package/dist/node/Diviner/Params.mjs.map +1 -0
  19. package/dist/node/Diviner/index.d.mts.map +1 -0
  20. package/dist/node/Diviner/index.d.ts.map +1 -0
  21. package/dist/node/Diviner/index.js +27 -0
  22. package/dist/node/Diviner/index.js.map +1 -0
  23. package/dist/node/Diviner/index.mjs +4 -0
  24. package/dist/node/Diviner/index.mjs.map +1 -0
  25. package/dist/node/Plugin.d.mts.map +1 -0
  26. package/dist/node/Plugin.d.ts.map +1 -0
  27. package/dist/node/Plugin.js +46 -0
  28. package/dist/node/Plugin.js.map +1 -0
  29. package/dist/node/Plugin.mjs +22 -0
  30. package/dist/node/Plugin.mjs.map +1 -0
  31. package/dist/node/Witness/Config.d.mts.map +1 -0
  32. package/dist/node/Witness/Config.d.ts.map +1 -0
  33. package/dist/node/Witness/Config.js +30 -0
  34. package/dist/node/Witness/Config.js.map +1 -0
  35. package/dist/node/Witness/Config.mjs +6 -0
  36. package/dist/node/Witness/Config.mjs.map +1 -0
  37. package/dist/node/Witness/Params.d.mts.map +1 -0
  38. package/dist/node/Witness/Params.d.ts.map +1 -0
  39. package/dist/node/Witness/Params.js +17 -0
  40. package/dist/node/Witness/Params.js.map +1 -0
  41. package/dist/node/Witness/Params.mjs +1 -0
  42. package/dist/node/Witness/Params.mjs.map +1 -0
  43. package/dist/node/Witness/Witness.d.mts.map +1 -0
  44. package/dist/node/Witness/Witness.d.ts.map +1 -0
  45. package/dist/node/Witness/Witness.js +310 -0
  46. package/dist/node/Witness/Witness.js.map +1 -0
  47. package/dist/node/Witness/Witness.mjs +276 -0
  48. package/dist/node/Witness/Witness.mjs.map +1 -0
  49. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts.map +1 -0
  50. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +1 -0
  51. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js +75 -0
  52. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.js.map +1 -0
  53. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.mjs +41 -0
  54. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.mjs.map +1 -0
  55. package/dist/node/Witness/ffmpeg/fluent/index.d.mts.map +1 -0
  56. package/dist/node/Witness/ffmpeg/fluent/index.d.ts.map +1 -0
  57. package/dist/node/Witness/ffmpeg/fluent/index.js +23 -0
  58. package/dist/node/Witness/ffmpeg/fluent/index.js.map +1 -0
  59. package/dist/node/Witness/ffmpeg/fluent/index.mjs +2 -0
  60. package/dist/node/Witness/ffmpeg/fluent/index.mjs.map +1 -0
  61. package/dist/node/Witness/ffmpeg/index.d.mts.map +1 -0
  62. package/dist/node/Witness/ffmpeg/index.d.ts.map +1 -0
  63. package/dist/node/Witness/ffmpeg/index.js +25 -0
  64. package/dist/node/Witness/ffmpeg/index.js.map +1 -0
  65. package/dist/node/Witness/ffmpeg/index.mjs +3 -0
  66. package/dist/node/Witness/ffmpeg/index.mjs.map +1 -0
  67. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.mts.map +1 -0
  68. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +1 -0
  69. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.js +46 -0
  70. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.js.map +1 -0
  71. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.mjs +22 -0
  72. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.mjs.map +1 -0
  73. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts.map +1 -0
  74. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +1 -0
  75. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.js +33 -0
  76. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.js.map +1 -0
  77. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.mjs +9 -0
  78. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.mjs.map +1 -0
  79. package/dist/node/Witness/ffmpeg/spawn/index.d.mts.map +1 -0
  80. package/dist/node/Witness/ffmpeg/spawn/index.d.ts.map +1 -0
  81. package/dist/node/Witness/ffmpeg/spawn/index.js +25 -0
  82. package/dist/node/Witness/ffmpeg/spawn/index.js.map +1 -0
  83. package/dist/node/Witness/ffmpeg/spawn/index.mjs +3 -0
  84. package/dist/node/Witness/ffmpeg/spawn/index.mjs.map +1 -0
  85. package/dist/node/Witness/index.d.mts.map +1 -0
  86. package/dist/node/Witness/index.d.ts.map +1 -0
  87. package/dist/node/Witness/index.js +27 -0
  88. package/dist/node/Witness/index.js.map +1 -0
  89. package/dist/node/Witness/index.mjs +4 -0
  90. package/dist/node/Witness/index.mjs.map +1 -0
  91. package/dist/node/index.d.mts.map +1 -0
  92. package/dist/node/index.d.ts.map +1 -0
  93. package/dist/node/index.js +36 -0
  94. package/dist/node/index.js.map +1 -0
  95. package/dist/node/index.mjs +9 -0
  96. package/dist/node/index.mjs.map +1 -0
  97. package/package.json +39 -38
  98. package/dist/Diviner/Config.d.mts.map +0 -1
  99. package/dist/Diviner/Config.d.ts.map +0 -1
  100. package/dist/Diviner/Diviner.d.mts.map +0 -1
  101. package/dist/Diviner/Diviner.d.ts.map +0 -1
  102. package/dist/Diviner/Params.d.mts.map +0 -1
  103. package/dist/Diviner/Params.d.ts.map +0 -1
  104. package/dist/Diviner/index.d.mts.map +0 -1
  105. package/dist/Diviner/index.d.ts.map +0 -1
  106. package/dist/Plugin.d.mts.map +0 -1
  107. package/dist/Plugin.d.ts.map +0 -1
  108. package/dist/Witness/Config.d.mts.map +0 -1
  109. package/dist/Witness/Config.d.ts.map +0 -1
  110. package/dist/Witness/Params.d.mts.map +0 -1
  111. package/dist/Witness/Params.d.ts.map +0 -1
  112. package/dist/Witness/Witness.d.mts.map +0 -1
  113. package/dist/Witness/Witness.d.ts.map +0 -1
  114. package/dist/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts.map +0 -1
  115. package/dist/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +0 -1
  116. package/dist/Witness/ffmpeg/fluent/index.d.mts.map +0 -1
  117. package/dist/Witness/ffmpeg/fluent/index.d.ts.map +0 -1
  118. package/dist/Witness/ffmpeg/index.d.mts.map +0 -1
  119. package/dist/Witness/ffmpeg/index.d.ts.map +0 -1
  120. package/dist/Witness/ffmpeg/spawn/executeFfmpeg.d.mts.map +0 -1
  121. package/dist/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +0 -1
  122. package/dist/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts.map +0 -1
  123. package/dist/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +0 -1
  124. package/dist/Witness/ffmpeg/spawn/index.d.mts.map +0 -1
  125. package/dist/Witness/ffmpeg/spawn/index.d.ts.map +0 -1
  126. package/dist/Witness/index.d.mts.map +0 -1
  127. package/dist/Witness/index.d.ts.map +0 -1
  128. package/dist/docs.json +0 -50260
  129. package/dist/index.d.mts.map +0 -1
  130. package/dist/index.d.ts.map +0 -1
  131. package/dist/index.js +0 -565
  132. package/dist/index.js.map +0 -1
  133. package/dist/index.mjs +0 -524
  134. package/dist/index.mjs.map +0 -1
  135. /package/dist/{Diviner → node/Diviner}/Config.d.mts +0 -0
  136. /package/dist/{Diviner → node/Diviner}/Config.d.ts +0 -0
  137. /package/dist/{Diviner → node/Diviner}/Diviner.d.mts +0 -0
  138. /package/dist/{Diviner → node/Diviner}/Diviner.d.ts +0 -0
  139. /package/dist/{Diviner → node/Diviner}/Params.d.mts +0 -0
  140. /package/dist/{Diviner → node/Diviner}/Params.d.ts +0 -0
  141. /package/dist/{Diviner → node/Diviner}/index.d.mts +0 -0
  142. /package/dist/{Diviner → node/Diviner}/index.d.ts +0 -0
  143. /package/dist/{Plugin.d.mts → node/Plugin.d.mts} +0 -0
  144. /package/dist/{Plugin.d.ts → node/Plugin.d.ts} +0 -0
  145. /package/dist/{Witness → node/Witness}/Config.d.mts +0 -0
  146. /package/dist/{Witness → node/Witness}/Config.d.ts +0 -0
  147. /package/dist/{Witness → node/Witness}/Params.d.mts +0 -0
  148. /package/dist/{Witness → node/Witness}/Params.d.ts +0 -0
  149. /package/dist/{Witness → node/Witness}/Witness.d.mts +0 -0
  150. /package/dist/{Witness → node/Witness}/Witness.d.ts +0 -0
  151. /package/dist/{Witness → node/Witness}/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts +0 -0
  152. /package/dist/{Witness → node/Witness}/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts +0 -0
  153. /package/dist/{Witness → node/Witness}/ffmpeg/fluent/index.d.mts +0 -0
  154. /package/dist/{Witness → node/Witness}/ffmpeg/fluent/index.d.ts +0 -0
  155. /package/dist/{Witness → node/Witness}/ffmpeg/index.d.mts +0 -0
  156. /package/dist/{Witness → node/Witness}/ffmpeg/index.d.ts +0 -0
  157. /package/dist/{Witness → node/Witness}/ffmpeg/spawn/executeFfmpeg.d.mts +0 -0
  158. /package/dist/{Witness → node/Witness}/ffmpeg/spawn/executeFfmpeg.d.ts +0 -0
  159. /package/dist/{Witness → node/Witness}/ffmpeg/spawn/getVideoFrameAsImage.d.mts +0 -0
  160. /package/dist/{Witness → node/Witness}/ffmpeg/spawn/getVideoFrameAsImage.d.ts +0 -0
  161. /package/dist/{Witness → node/Witness}/ffmpeg/spawn/index.d.mts +0 -0
  162. /package/dist/{Witness → node/Witness}/ffmpeg/spawn/index.d.ts +0 -0
  163. /package/dist/{Witness → node/Witness}/index.d.mts +0 -0
  164. /package/dist/{Witness → node/Witness}/index.d.ts +0 -0
  165. /package/dist/{index.d.mts → node/index.d.mts} +0 -0
  166. /package/dist/{index.d.ts → node/index.d.ts} +0 -0
@@ -0,0 +1,22 @@
1
+ import { ImageThumbnailSchema } from "@xyo-network/image-thumbnail-payload-plugin";
2
+ import { PayloadSetSchema } from "@xyo-network/payload-model";
3
+ import { createPayloadSetDualPlugin } from "@xyo-network/payloadset-plugin";
4
+ import { ImageThumbnailDiviner } from "./Diviner";
5
+ import { ImageThumbnailWitness } from "./Witness";
6
+ const ImageThumbnailPlugin = () => createPayloadSetDualPlugin(
7
+ { required: { [ImageThumbnailSchema]: 1 }, schema: PayloadSetSchema },
8
+ {
9
+ diviner: async (params) => {
10
+ const result = await ImageThumbnailDiviner.create(params);
11
+ return result;
12
+ },
13
+ witness: async (params) => {
14
+ const result = await ImageThumbnailWitness.create(params);
15
+ return result;
16
+ }
17
+ }
18
+ );
19
+ export {
20
+ ImageThumbnailPlugin
21
+ };
22
+ //# sourceMappingURL=Plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Plugin.ts"],"sourcesContent":["import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDualPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { ImageThumbnailDiviner } from './Diviner'\nimport { ImageThumbnailWitness } from './Witness'\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"],"mappings":"AAAA,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AACjC,SAAS,kCAAkC;AAE3C,SAAS,6BAA6B;AACtC,SAAS,6BAA6B;AAE/B,MAAM,uBAAuB,MAClC;AAAA,EACE,EAAE,UAAU,EAAE,CAAC,oBAAoB,GAAG,EAAE,GAAG,QAAQ,iBAAiB;AAAA,EACpE;AAAA,IACE,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,sBAAsB,OAAO,MAAM;AACxD,aAAO;AAAA,IACT;AAAA,IACA,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,sBAAsB,OAAO,MAAM;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../src/Witness/Config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,eAAO,MAAM,iCAAiC,8CAAoD,CAAA;AAClG,MAAM,MAAM,iCAAiC,GAAG,OAAO,iCAAiC,CAAA;AAExF,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAE1D,MAAM,MAAM,2BAA2B,GAAG,aAAa,CAAC;IACtD,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iCAAiC,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../src/Witness/Config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,eAAO,MAAM,iCAAiC,8CAAoD,CAAA;AAClG,MAAM,MAAM,iCAAiC,GAAG,OAAO,iCAAiC,CAAA;AAExF,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAE1D,MAAM,MAAM,2BAA2B,GAAG,aAAa,CAAC;IACtD,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iCAAiC,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAAA"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var Config_exports = {};
20
+ __export(Config_exports, {
21
+ ImageThumbnailWitnessConfigSchema: () => ImageThumbnailWitnessConfigSchema
22
+ });
23
+ module.exports = __toCommonJS(Config_exports);
24
+ var import_image_thumbnail_payload_plugin = require("@xyo-network/image-thumbnail-payload-plugin");
25
+ const ImageThumbnailWitnessConfigSchema = `${import_image_thumbnail_payload_plugin.ImageThumbnailSchema}.witness.config`;
26
+ // Annotate the CommonJS export names for ESM import in node:
27
+ 0 && (module.exports = {
28
+ ImageThumbnailWitnessConfigSchema
29
+ });
30
+ //# sourceMappingURL=Config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/Witness/Config.ts"],"sourcesContent":["import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { WitnessConfig } from '@xyo-network/witness'\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 encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAqC;AAG9B,MAAM,oCAAoC,GAAG,0DAAoB;","names":[]}
@@ -0,0 +1,6 @@
1
+ import { ImageThumbnailSchema } from "@xyo-network/image-thumbnail-payload-plugin";
2
+ const ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config`;
3
+ export {
4
+ ImageThumbnailWitnessConfigSchema
5
+ };
6
+ //# sourceMappingURL=Config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/Witness/Config.ts"],"sourcesContent":["import { ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { WitnessConfig } from '@xyo-network/witness'\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 encoding?: ImageThumbnailEncoding\n height?: number\n ipfsGateway?: string\n maxAsyncProcesses?: number\n maxCacheBytes?: number\n maxCacheEntries?: number\n quality?: number\n schema: ImageThumbnailWitnessConfigSchema\n width?: number\n}>\n"],"mappings":"AAAA,SAAS,4BAA4B;AAG9B,MAAM,oCAAoC,GAAG,oBAAoB;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../../src/Witness/Params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAEtD,MAAM,MAAM,2BAA2B,GAAG,aAAa,CACrD,eAAe,CAAC,2BAA2B,CAAC,EAC5C;IACE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CACF,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../../src/Witness/Params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAEtD,MAAM,MAAM,2BAA2B,GAAG,aAAa,CACrD,eAAe,CAAC,2BAA2B,CAAC,EAC5C;IACE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CACF,CAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var Params_exports = {};
16
+ module.exports = __toCommonJS(Params_exports);
17
+ //# sourceMappingURL=Params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/Witness/Params.ts"],"sourcesContent":["import { AnyConfigSchema } from '@xyo-network/module'\nimport { WitnessParams } from '@xyo-network/witness'\n\nimport { ImageThumbnailWitnessConfig } from './Config'\n\nexport type ImageThumbnailWitnessParams = WitnessParams<\n AnyConfigSchema<ImageThumbnailWitnessConfig>,\n {\n loaders?: string[]\n }\n>\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=Params.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAMtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAA;AAEpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAStD,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,OAAgB,aAAa,iDAAsC;IAEnE,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;gBAUR;IAED,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,UAAU,WAEb;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,eAAe,WAElB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAanC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgBhC;;;;;OAKG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM;cAiBN,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAuCjF,sBAAsB;IAiBpC;;;;OAIG;YACW,wBAAwB;YAKxB,QAAQ;CA6HvB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAwB,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,UAAU,EAAa,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAMtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAIpC,OAAO,EAAE,sBAAsB,EAAqC,MAAM,UAAU,CAAA;AAEpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAStD,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,OAAgB,aAAa,iDAAsC;IAEnE,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,UAAU,CAAwC;IAE1D,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;gBAUR;IAED,IAAI,QAAQ,2BAEX;IAED,IAAI,MAAM,WAET;IAED,IAAI,UAAU,WAEb;IAED,IAAI,iBAAiB,WAEpB;IAED,IAAI,aAAa,WAEhB;IAED,IAAI,eAAe,WAElB;IAED,IAAI,OAAO,WAEV;IAED,IAAI,KAAK,WAER;mBAEoB,cAAc;IAanC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgBhC;;;;;OAKG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM;cAiBN,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAuCjF,sBAAsB;IAiBpC;;;;OAIG;YACW,wBAAwB;YAKxB,QAAQ;CA6HvB"}
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var Witness_exports = {};
30
+ __export(Witness_exports, {
31
+ ImageThumbnailWitness: () => ImageThumbnailWitness
32
+ });
33
+ module.exports = __toCommonJS(Witness_exports);
34
+ var import_node_dns = require("node:dns");
35
+ var import_lodash = require("@xylabs/lodash");
36
+ var import_url = require("@xylabs/url");
37
+ var import_axios = require("@xyo-network/axios");
38
+ var import_core = require("@xyo-network/core");
39
+ var import_image_thumbnail_payload_plugin = require("@xyo-network/image-thumbnail-payload-plugin");
40
+ var import_url_payload_plugin = require("@xyo-network/url-payload-plugin");
41
+ var import_witness = require("@xyo-network/witness");
42
+ var import_async_mutex = require("async-mutex");
43
+ var import_file_type = __toESM(require("file-type"));
44
+ var import_gm = __toESM(require("gm"));
45
+ var import_hasbin = __toESM(require("hasbin"));
46
+ var import_hash_wasm = require("hash-wasm");
47
+ var import_lru_cache = require("lru-cache");
48
+ var import_sha = __toESM(require("sha.js"));
49
+ var import_url_parse = __toESM(require("url-parse"));
50
+ var import_Config = require("./Config");
51
+ var import_ffmpeg = require("./ffmpeg");
52
+ const gm = import_gm.default.subClass({ imageMagick: "7+" });
53
+ class ImageThumbnailWitness extends import_witness.AbstractWitness {
54
+ static configSchemas = [import_Config.ImageThumbnailWitnessConfigSchema];
55
+ _cache;
56
+ _semaphore = new import_async_mutex.Semaphore(this.maxAsyncProcesses);
57
+ get cache() {
58
+ this._cache = this._cache ?? new import_lru_cache.LRUCache({
59
+ max: this.maxCacheEntries,
60
+ maxSize: this.maxCacheBytes,
61
+ //just returning the size of the data
62
+ sizeCalculation: (value) => value.url?.length ?? 1
63
+ });
64
+ return this._cache;
65
+ }
66
+ get encoding() {
67
+ return this.config.encoding ?? "PNG";
68
+ }
69
+ get height() {
70
+ return this.config.height ?? 128;
71
+ }
72
+ get ipfGateway() {
73
+ return this.config.ipfsGateway ?? "5d7b6582.beta.decentralnetworkservices.com";
74
+ }
75
+ get maxAsyncProcesses() {
76
+ return this.config.maxAsyncProcesses ?? 2;
77
+ }
78
+ get maxCacheBytes() {
79
+ return this.config.maxCacheBytes ?? 1024 * 1024 * 16;
80
+ }
81
+ get maxCacheEntries() {
82
+ return this.config.maxCacheEntries ?? 500;
83
+ }
84
+ get quality() {
85
+ return this.config.quality ?? 50;
86
+ }
87
+ get width() {
88
+ return this.config.width ?? 128;
89
+ }
90
+ static async binaryToSha256(data) {
91
+ await import_core.PayloadHasher.wasmInitialized;
92
+ if (import_core.PayloadHasher.wasmSupport.canUseWasm) {
93
+ try {
94
+ return await (0, import_hash_wasm.sha256)(data);
95
+ } catch (ex) {
96
+ import_core.PayloadHasher.wasmSupport.allowWasm = false;
97
+ }
98
+ }
99
+ return (0, import_sha.default)("sha256").update(data).digest().toString();
100
+ }
101
+ static bufferFromDataUrl(url) {
102
+ if (url.startsWith("data:image")) {
103
+ const data = url.split(",")[1];
104
+ if (data) {
105
+ return Buffer.from(Uint8Array.from(atob(data), (c) => c.charCodeAt(0)));
106
+ } else {
107
+ const error = {
108
+ message: "Invalid data Url",
109
+ name: "ImageThumbnailWitnessError",
110
+ url
111
+ };
112
+ throw error;
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Returns the equivalent IPFS gateway URL for the supplied URL.
118
+ * @param urlToCheck The URL to check
119
+ * @returns If the supplied URL is an IPFS URL, it converts the URL to the
120
+ * equivalent IPFS gateway URL. Otherwise, returns the original URL.
121
+ */
122
+ checkIpfsUrl(urlToCheck) {
123
+ const url = new import_url.URL(urlToCheck);
124
+ let protocol = url.protocol;
125
+ let host = url.host;
126
+ let path = url.pathname;
127
+ const query = url.search;
128
+ if (protocol === "ipfs:") {
129
+ protocol = "https:";
130
+ host = this.ipfGateway;
131
+ path = url.host === "ipfs" ? `ipfs${path}` : `ipfs/${url.host}${path}`;
132
+ const root = `${protocol}//${host}/${path}`;
133
+ return query?.length > 0 ? `${root}?${query}` : root;
134
+ } else {
135
+ return urlToCheck;
136
+ }
137
+ }
138
+ async observeHandler(payloads = []) {
139
+ if (!import_hasbin.default.sync("magick")) {
140
+ throw Error("ImageMagick is required for this witness");
141
+ }
142
+ const urlPayloads = payloads.filter((payload) => payload.schema === import_url_payload_plugin.UrlSchema);
143
+ return await this._semaphore.runExclusive(
144
+ async () => (0, import_lodash.compact)(
145
+ await Promise.all(
146
+ urlPayloads.map(async ({ url }) => {
147
+ const cachedResult = this.cache.get(url);
148
+ if (cachedResult) {
149
+ return cachedResult;
150
+ }
151
+ let result;
152
+ const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url);
153
+ if (dataBuffer) {
154
+ result = {
155
+ schema: import_image_thumbnail_payload_plugin.ImageThumbnailSchema,
156
+ sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),
157
+ sourceUrl: url,
158
+ url
159
+ };
160
+ } else {
161
+ const mutatedUrl = this.checkIpfsUrl(url);
162
+ result = await this.fromHttp(mutatedUrl, url);
163
+ }
164
+ this.cache.set(url, result);
165
+ return result;
166
+ })
167
+ )
168
+ )
169
+ );
170
+ }
171
+ async createThumbnailDataUrl(sourceBuffer, encoding) {
172
+ const thumb = await new Promise((resolve, reject) => {
173
+ gm(sourceBuffer).quality(this.quality).resize(this.width, this.height).flatten().toBuffer(encoding ?? this.encoding, (error, buffer) => {
174
+ if (error) {
175
+ reject(error);
176
+ } else {
177
+ resolve(buffer);
178
+ }
179
+ });
180
+ });
181
+ return `data:image/png;base64,${thumb.toString("base64")}`;
182
+ }
183
+ /**
184
+ * Creates an image thumbnail from a video.
185
+ * @param videoBuffer The input video buffer.
186
+ * @returns An buffer containing an image thumbnail for the video.
187
+ */
188
+ async createThumbnailFromVideo(videoBuffer) {
189
+ const imageBuffer = await (0, import_ffmpeg.getVideoFrameAsImageFluent)(videoBuffer);
190
+ return this.createThumbnailDataUrl(imageBuffer);
191
+ }
192
+ async fromHttp(url, sourceUrl) {
193
+ let response;
194
+ let dnsResult;
195
+ try {
196
+ const urlObj = new import_url_parse.default(url);
197
+ dnsResult = await import_node_dns.promises.resolve(urlObj.host);
198
+ } catch (ex) {
199
+ const error = ex;
200
+ const result2 = {
201
+ http: {
202
+ dnsError: error.code
203
+ },
204
+ schema: import_image_thumbnail_payload_plugin.ImageThumbnailSchema,
205
+ sourceUrl: sourceUrl ?? url
206
+ };
207
+ return result2;
208
+ }
209
+ try {
210
+ response = await import_axios.axios.get(url, {
211
+ responseType: "arraybuffer"
212
+ });
213
+ } catch (ex) {
214
+ const axiosError = ex;
215
+ if (axiosError.isAxiosError) {
216
+ const result2 = {
217
+ http: {
218
+ ipAddress: dnsResult[0],
219
+ status: axiosError?.response?.status
220
+ },
221
+ schema: import_image_thumbnail_payload_plugin.ImageThumbnailSchema,
222
+ sourceUrl: sourceUrl ?? url
223
+ };
224
+ return result2;
225
+ } else {
226
+ throw ex;
227
+ }
228
+ }
229
+ const result = {
230
+ http: {
231
+ status: response.status
232
+ },
233
+ schema: import_image_thumbnail_payload_plugin.ImageThumbnailSchema,
234
+ sourceUrl: sourceUrl ?? url
235
+ };
236
+ if (response.status >= 200 && response.status < 300) {
237
+ const contentType = response.headers["content-type"]?.toString();
238
+ const [mediaType, fileType] = contentType.split("/");
239
+ result.mime = result.mime ?? {};
240
+ result.mime.returned = mediaType;
241
+ const sourceBuffer = Buffer.from(response.data, "binary");
242
+ try {
243
+ result.mime.detected = await import_file_type.default.fromBuffer(sourceBuffer);
244
+ } catch (ex) {
245
+ const error = ex;
246
+ this.logger?.error(`FileType error: ${error.message}`);
247
+ }
248
+ const processImage = async (encoding2) => {
249
+ result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer);
250
+ result.url = await this.createThumbnailDataUrl(sourceBuffer, encoding2);
251
+ };
252
+ const processVideo = async () => {
253
+ if (import_hasbin.default.sync("ffmpeg")) {
254
+ result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer);
255
+ result.url = await this.createThumbnailFromVideo(sourceBuffer);
256
+ } else {
257
+ result.mime = result.mime ?? {};
258
+ result.mime.invalid = true;
259
+ }
260
+ };
261
+ let encoding = "PNG";
262
+ switch (fileType.toUpperCase()) {
263
+ case "GIF":
264
+ encoding = "GIF";
265
+ break;
266
+ case "JPG":
267
+ case "JPEG":
268
+ encoding = "JPG";
269
+ break;
270
+ }
271
+ switch (mediaType) {
272
+ case "image": {
273
+ await processImage(encoding);
274
+ result.mime.type = mediaType;
275
+ break;
276
+ }
277
+ case "video": {
278
+ await processVideo();
279
+ result.mime.type = mediaType;
280
+ break;
281
+ }
282
+ default: {
283
+ switch (result.mime.detected?.mime) {
284
+ case "image": {
285
+ await processImage();
286
+ result.mime.type = result.mime.detected?.mime;
287
+ break;
288
+ }
289
+ case "video": {
290
+ await processVideo();
291
+ result.mime.type = result.mime.detected?.mime;
292
+ break;
293
+ }
294
+ default: {
295
+ result.mime.invalid = true;
296
+ break;
297
+ }
298
+ }
299
+ break;
300
+ }
301
+ }
302
+ }
303
+ return result;
304
+ }
305
+ }
306
+ // Annotate the CommonJS export names for ESM import in node:
307
+ 0 && (module.exports = {
308
+ ImageThumbnailWitness
309
+ });
310
+ //# sourceMappingURL=Witness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/Witness/Witness.ts"],"sourcesContent":["/* eslint-disable max-statements */\nimport { promises as dnsPromises } from 'node:dns'\n\nimport { compact } from '@xylabs/lodash'\nimport { URL } from '@xylabs/url'\nimport { axios, AxiosError, AxiosResponse } from '@xyo-network/axios'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { ImageThumbnail, ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { UrlPayload, UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { AbstractWitness } from '@xyo-network/witness'\nimport { Semaphore } from 'async-mutex'\nimport FileType from 'file-type'\nimport graphicsMagick from 'gm'\nimport hasbin from 'hasbin'\nimport { sha256 } from 'hash-wasm'\nimport { LRUCache } from 'lru-cache'\nimport shajs from 'sha.js'\nimport Url from 'url-parse'\n\nimport { ImageThumbnailEncoding, ImageThumbnailWitnessConfigSchema } from './Config'\nimport { getVideoFrameAsImageFluent } from './ffmpeg'\nimport { ImageThumbnailWitnessParams } from './Params'\n\n//TODO: Break this into two Witnesses?\n\n// setFfmpegPath(ffmpegPath)\n\n// eslint-disable-next-line import/no-named-as-default-member\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 configSchemas = [ImageThumbnailWitnessConfigSchema]\n\n private _cache?: LRUCache<string, ImageThumbnail>\n private _semaphore = new Semaphore(this.maxAsyncProcesses)\n\n get cache() {\n this._cache =\n this._cache ??\n new LRUCache<string, ImageThumbnail>({\n max: this.maxCacheEntries,\n maxSize: this.maxCacheBytes,\n //just returning the size of the data\n sizeCalculation: (value) => value.url?.length ?? 1,\n })\n return this._cache\n }\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 ipfGateway() {\n return this.config.ipfsGateway ?? '5d7b6582.beta.decentralnetworkservices.com'\n }\n\n get maxAsyncProcesses() {\n return this.config.maxAsyncProcesses ?? 2\n }\n\n get maxCacheBytes() {\n return this.config.maxCacheBytes ?? 1024 * 1024 * 16 //64MB max size\n }\n\n get maxCacheEntries() {\n return this.config.maxCacheEntries ?? 500\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: Uint8Array) {\n await PayloadHasher.wasmInitialized\n if (PayloadHasher.wasmSupport.canUseWasm) {\n try {\n return await sha256(data)\n } catch (ex) {\n PayloadHasher.wasmSupport.allowWasm = false\n }\n }\n\n return shajs('sha256').update(data).digest().toString()\n }\n\n private static bufferFromDataUrl(url: string): Buffer | undefined {\n if (url.startsWith('data:image')) {\n const data = url.split(',')[1]\n if (data) {\n return Buffer.from(Uint8Array.from(atob(data), (c) => c.charCodeAt(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 /**\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 */\n checkIpfsUrl(urlToCheck: string) {\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 = this.ipfGateway\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 {\n return urlToCheck\n }\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<ImageThumbnail[]> {\n // eslint-disable-next-line import/no-named-as-default-member\n if (!hasbin.sync('magick')) {\n throw Error('ImageMagick is required for this witness')\n }\n const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema)\n return await this._semaphore.runExclusive(async () =>\n compact(\n await Promise.all(\n urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {\n const cachedResult = this.cache.get(url)\n if (cachedResult) {\n return cachedResult\n }\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 result = {\n schema: ImageThumbnailSchema,\n sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),\n sourceUrl: url,\n url,\n }\n } else {\n //if it is ipfs, go through cloud flair\n const mutatedUrl = this.checkIpfsUrl(url)\n result = await this.fromHttp(mutatedUrl, url)\n }\n this.cache.set(url, result)\n return result\n }),\n ),\n ),\n )\n }\n\n private async createThumbnailDataUrl(sourceBuffer: Buffer, encoding?: ImageThumbnailEncoding) {\n const thumb = await new Promise<Buffer>((resolve, reject) => {\n gm(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 `data:image/png;base64,${thumb.toString('base64')}`\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: Buffer) {\n const imageBuffer = await getVideoFrameAsImageFluent(videoBuffer)\n return this.createThumbnailDataUrl(imageBuffer)\n }\n\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 // console.log(`dnsResult: ${JSON.stringify(dnsResult, null, 2)}`)\n } catch (ex) {\n const error = ex as DnsError\n const result: ImageThumbnail = {\n http: {\n dnsError: 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 status: axiosError?.response?.status,\n },\n schema: ImageThumbnailSchema,\n sourceUrl: sourceUrl ?? url,\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 = response.headers['content-type']?.toString()\n const [mediaType, fileType] = contentType.split('/')\n result.mime = result.mime ?? {}\n result.mime.returned = mediaType\n const sourceBuffer = Buffer.from(response.data, 'binary')\n\n try {\n result.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 result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n result.url = await this.createThumbnailDataUrl(sourceBuffer, encoding)\n }\n\n const processVideo = async () => {\n // Gracefully handle the case where ffmpeg is not installed.\n // eslint-disable-next-line import/no-named-as-default-member\n if (hasbin.sync('ffmpeg')) {\n result.sourceHash = await ImageThumbnailWitness.binaryToSha256(sourceBuffer)\n result.url = await this.createThumbnailFromVideo(sourceBuffer)\n } else {\n result.mime = result.mime ?? {}\n result.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 case 'JPG':\n case 'JPEG':\n encoding = 'JPG'\n break\n }\n\n switch (mediaType) {\n case 'image': {\n await processImage(encoding)\n result.mime.type = mediaType\n break\n }\n case 'video': {\n await processVideo()\n result.mime.type = mediaType\n break\n }\n default: {\n switch (result.mime.detected?.mime) {\n case 'image': {\n await processImage()\n result.mime.type = result.mime.detected?.mime\n break\n }\n case 'video': {\n await processVideo()\n result.mime.type = result.mime.detected?.mime\n break\n }\n default: {\n result.mime.invalid = true\n break\n }\n }\n break\n }\n }\n }\n return result\n }\n}\n"],"mappings":"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","names":["graphicsMagick","shajs","hasbin","Url","dnsPromises","result","FileType","encoding"]}