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

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 (204) hide show
  1. package/dist/node/index.d.ts +91 -3
  2. package/dist/node/index.mjs +51 -56
  3. package/dist/node/index.mjs.map +1 -1
  4. package/package.json +25 -32
  5. package/src/Witness/Witness.ts +42 -44
  6. package/src/index.ts +1 -1
  7. package/xy.config.ts +2 -1
  8. package/dist/neutral/Plugin.d.cts +0 -32
  9. package/dist/neutral/Plugin.d.cts.map +0 -1
  10. package/dist/neutral/Plugin.d.mts +0 -32
  11. package/dist/neutral/Plugin.d.mts.map +0 -1
  12. package/dist/neutral/Plugin.d.ts +0 -32
  13. package/dist/neutral/Plugin.d.ts.map +0 -1
  14. package/dist/neutral/Witness/Config.d.cts +0 -18
  15. package/dist/neutral/Witness/Config.d.cts.map +0 -1
  16. package/dist/neutral/Witness/Config.d.mts +0 -18
  17. package/dist/neutral/Witness/Config.d.mts.map +0 -1
  18. package/dist/neutral/Witness/Config.d.ts +0 -18
  19. package/dist/neutral/Witness/Config.d.ts.map +0 -1
  20. package/dist/neutral/Witness/Params.d.cts +0 -7
  21. package/dist/neutral/Witness/Params.d.cts.map +0 -1
  22. package/dist/neutral/Witness/Params.d.mts +0 -7
  23. package/dist/neutral/Witness/Params.d.mts.map +0 -1
  24. package/dist/neutral/Witness/Params.d.ts +0 -7
  25. package/dist/neutral/Witness/Params.d.ts.map +0 -1
  26. package/dist/neutral/Witness/Witness.d.cts +0 -32
  27. package/dist/neutral/Witness/Witness.d.cts.map +0 -1
  28. package/dist/neutral/Witness/Witness.d.mts +0 -32
  29. package/dist/neutral/Witness/Witness.d.mts.map +0 -1
  30. package/dist/neutral/Witness/Witness.d.ts +0 -32
  31. package/dist/neutral/Witness/Witness.d.ts.map +0 -1
  32. package/dist/neutral/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.cts +0 -2
  33. package/dist/neutral/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.cts.map +0 -1
  34. package/dist/neutral/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts +0 -2
  35. package/dist/neutral/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts.map +0 -1
  36. package/dist/neutral/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts +0 -2
  37. package/dist/neutral/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +0 -1
  38. package/dist/neutral/Witness/ffmpeg/fluent/index.d.cts +0 -2
  39. package/dist/neutral/Witness/ffmpeg/fluent/index.d.cts.map +0 -1
  40. package/dist/neutral/Witness/ffmpeg/fluent/index.d.mts +0 -2
  41. package/dist/neutral/Witness/ffmpeg/fluent/index.d.mts.map +0 -1
  42. package/dist/neutral/Witness/ffmpeg/fluent/index.d.ts +0 -2
  43. package/dist/neutral/Witness/ffmpeg/fluent/index.d.ts.map +0 -1
  44. package/dist/neutral/Witness/ffmpeg/index.d.cts +0 -3
  45. package/dist/neutral/Witness/ffmpeg/index.d.cts.map +0 -1
  46. package/dist/neutral/Witness/ffmpeg/index.d.mts +0 -3
  47. package/dist/neutral/Witness/ffmpeg/index.d.mts.map +0 -1
  48. package/dist/neutral/Witness/ffmpeg/index.d.ts +0 -3
  49. package/dist/neutral/Witness/ffmpeg/index.d.ts.map +0 -1
  50. package/dist/neutral/Witness/ffmpeg/spawn/executeFfmpeg.d.cts +0 -2
  51. package/dist/neutral/Witness/ffmpeg/spawn/executeFfmpeg.d.cts.map +0 -1
  52. package/dist/neutral/Witness/ffmpeg/spawn/executeFfmpeg.d.mts +0 -2
  53. package/dist/neutral/Witness/ffmpeg/spawn/executeFfmpeg.d.mts.map +0 -1
  54. package/dist/neutral/Witness/ffmpeg/spawn/executeFfmpeg.d.ts +0 -2
  55. package/dist/neutral/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +0 -1
  56. package/dist/neutral/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.cts +0 -2
  57. package/dist/neutral/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.cts.map +0 -1
  58. package/dist/neutral/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts +0 -2
  59. package/dist/neutral/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts.map +0 -1
  60. package/dist/neutral/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts +0 -2
  61. package/dist/neutral/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +0 -1
  62. package/dist/neutral/Witness/ffmpeg/spawn/index.d.cts +0 -3
  63. package/dist/neutral/Witness/ffmpeg/spawn/index.d.cts.map +0 -1
  64. package/dist/neutral/Witness/ffmpeg/spawn/index.d.mts +0 -3
  65. package/dist/neutral/Witness/ffmpeg/spawn/index.d.mts.map +0 -1
  66. package/dist/neutral/Witness/ffmpeg/spawn/index.d.ts +0 -3
  67. package/dist/neutral/Witness/ffmpeg/spawn/index.d.ts.map +0 -1
  68. package/dist/neutral/Witness/index.d.cts +0 -4
  69. package/dist/neutral/Witness/index.d.cts.map +0 -1
  70. package/dist/neutral/Witness/index.d.mts +0 -4
  71. package/dist/neutral/Witness/index.d.mts.map +0 -1
  72. package/dist/neutral/Witness/index.d.ts +0 -4
  73. package/dist/neutral/Witness/index.d.ts.map +0 -1
  74. package/dist/neutral/Witness/lib/checkIpfsUrl.d.cts +0 -2
  75. package/dist/neutral/Witness/lib/checkIpfsUrl.d.cts.map +0 -1
  76. package/dist/neutral/Witness/lib/checkIpfsUrl.d.mts +0 -2
  77. package/dist/neutral/Witness/lib/checkIpfsUrl.d.mts.map +0 -1
  78. package/dist/neutral/Witness/lib/checkIpfsUrl.d.ts +0 -2
  79. package/dist/neutral/Witness/lib/checkIpfsUrl.d.ts.map +0 -1
  80. package/dist/neutral/Witness/lib/createDataUrl.d.cts +0 -2
  81. package/dist/neutral/Witness/lib/createDataUrl.d.cts.map +0 -1
  82. package/dist/neutral/Witness/lib/createDataUrl.d.mts +0 -2
  83. package/dist/neutral/Witness/lib/createDataUrl.d.mts.map +0 -1
  84. package/dist/neutral/Witness/lib/createDataUrl.d.ts +0 -2
  85. package/dist/neutral/Witness/lib/createDataUrl.d.ts.map +0 -1
  86. package/dist/neutral/Witness/lib/index.d.cts +0 -4
  87. package/dist/neutral/Witness/lib/index.d.cts.map +0 -1
  88. package/dist/neutral/Witness/lib/index.d.mts +0 -4
  89. package/dist/neutral/Witness/lib/index.d.mts.map +0 -1
  90. package/dist/neutral/Witness/lib/index.d.ts +0 -4
  91. package/dist/neutral/Witness/lib/index.d.ts.map +0 -1
  92. package/dist/neutral/Witness/lib/resolveDynamicSvg.d.cts +0 -2
  93. package/dist/neutral/Witness/lib/resolveDynamicSvg.d.cts.map +0 -1
  94. package/dist/neutral/Witness/lib/resolveDynamicSvg.d.mts +0 -2
  95. package/dist/neutral/Witness/lib/resolveDynamicSvg.d.mts.map +0 -1
  96. package/dist/neutral/Witness/lib/resolveDynamicSvg.d.ts +0 -2
  97. package/dist/neutral/Witness/lib/resolveDynamicSvg.d.ts.map +0 -1
  98. package/dist/neutral/index.cjs +0 -449
  99. package/dist/neutral/index.cjs.map +0 -1
  100. package/dist/neutral/index.d.cts +0 -4
  101. package/dist/neutral/index.d.cts.map +0 -1
  102. package/dist/neutral/index.d.mts +0 -4
  103. package/dist/neutral/index.d.mts.map +0 -1
  104. package/dist/neutral/index.d.ts +0 -4
  105. package/dist/neutral/index.d.ts.map +0 -1
  106. package/dist/neutral/index.mjs +0 -415
  107. package/dist/neutral/index.mjs.map +0 -1
  108. package/dist/node/Plugin.d.cts +0 -32
  109. package/dist/node/Plugin.d.cts.map +0 -1
  110. package/dist/node/Plugin.d.mts +0 -32
  111. package/dist/node/Plugin.d.mts.map +0 -1
  112. package/dist/node/Plugin.d.ts +0 -32
  113. package/dist/node/Plugin.d.ts.map +0 -1
  114. package/dist/node/Witness/Config.d.cts +0 -18
  115. package/dist/node/Witness/Config.d.cts.map +0 -1
  116. package/dist/node/Witness/Config.d.mts +0 -18
  117. package/dist/node/Witness/Config.d.mts.map +0 -1
  118. package/dist/node/Witness/Config.d.ts +0 -18
  119. package/dist/node/Witness/Config.d.ts.map +0 -1
  120. package/dist/node/Witness/Params.d.cts +0 -7
  121. package/dist/node/Witness/Params.d.cts.map +0 -1
  122. package/dist/node/Witness/Params.d.mts +0 -7
  123. package/dist/node/Witness/Params.d.mts.map +0 -1
  124. package/dist/node/Witness/Params.d.ts +0 -7
  125. package/dist/node/Witness/Params.d.ts.map +0 -1
  126. package/dist/node/Witness/Witness.d.cts +0 -32
  127. package/dist/node/Witness/Witness.d.cts.map +0 -1
  128. package/dist/node/Witness/Witness.d.mts +0 -32
  129. package/dist/node/Witness/Witness.d.mts.map +0 -1
  130. package/dist/node/Witness/Witness.d.ts +0 -32
  131. package/dist/node/Witness/Witness.d.ts.map +0 -1
  132. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.cts +0 -2
  133. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.cts.map +0 -1
  134. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts +0 -2
  135. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.mts.map +0 -1
  136. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts +0 -2
  137. package/dist/node/Witness/ffmpeg/fluent/getVideoFrameAsImageFluent.d.ts.map +0 -1
  138. package/dist/node/Witness/ffmpeg/fluent/index.d.cts +0 -2
  139. package/dist/node/Witness/ffmpeg/fluent/index.d.cts.map +0 -1
  140. package/dist/node/Witness/ffmpeg/fluent/index.d.mts +0 -2
  141. package/dist/node/Witness/ffmpeg/fluent/index.d.mts.map +0 -1
  142. package/dist/node/Witness/ffmpeg/fluent/index.d.ts +0 -2
  143. package/dist/node/Witness/ffmpeg/fluent/index.d.ts.map +0 -1
  144. package/dist/node/Witness/ffmpeg/index.d.cts +0 -3
  145. package/dist/node/Witness/ffmpeg/index.d.cts.map +0 -1
  146. package/dist/node/Witness/ffmpeg/index.d.mts +0 -3
  147. package/dist/node/Witness/ffmpeg/index.d.mts.map +0 -1
  148. package/dist/node/Witness/ffmpeg/index.d.ts +0 -3
  149. package/dist/node/Witness/ffmpeg/index.d.ts.map +0 -1
  150. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.cts +0 -2
  151. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.cts.map +0 -1
  152. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.mts +0 -2
  153. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.mts.map +0 -1
  154. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.ts +0 -2
  155. package/dist/node/Witness/ffmpeg/spawn/executeFfmpeg.d.ts.map +0 -1
  156. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.cts +0 -2
  157. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.cts.map +0 -1
  158. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts +0 -2
  159. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.mts.map +0 -1
  160. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts +0 -2
  161. package/dist/node/Witness/ffmpeg/spawn/getVideoFrameAsImage.d.ts.map +0 -1
  162. package/dist/node/Witness/ffmpeg/spawn/index.d.cts +0 -3
  163. package/dist/node/Witness/ffmpeg/spawn/index.d.cts.map +0 -1
  164. package/dist/node/Witness/ffmpeg/spawn/index.d.mts +0 -3
  165. package/dist/node/Witness/ffmpeg/spawn/index.d.mts.map +0 -1
  166. package/dist/node/Witness/ffmpeg/spawn/index.d.ts +0 -3
  167. package/dist/node/Witness/ffmpeg/spawn/index.d.ts.map +0 -1
  168. package/dist/node/Witness/index.d.cts +0 -4
  169. package/dist/node/Witness/index.d.cts.map +0 -1
  170. package/dist/node/Witness/index.d.mts +0 -4
  171. package/dist/node/Witness/index.d.mts.map +0 -1
  172. package/dist/node/Witness/index.d.ts +0 -4
  173. package/dist/node/Witness/index.d.ts.map +0 -1
  174. package/dist/node/Witness/lib/checkIpfsUrl.d.cts +0 -2
  175. package/dist/node/Witness/lib/checkIpfsUrl.d.cts.map +0 -1
  176. package/dist/node/Witness/lib/checkIpfsUrl.d.mts +0 -2
  177. package/dist/node/Witness/lib/checkIpfsUrl.d.mts.map +0 -1
  178. package/dist/node/Witness/lib/checkIpfsUrl.d.ts +0 -2
  179. package/dist/node/Witness/lib/checkIpfsUrl.d.ts.map +0 -1
  180. package/dist/node/Witness/lib/createDataUrl.d.cts +0 -2
  181. package/dist/node/Witness/lib/createDataUrl.d.cts.map +0 -1
  182. package/dist/node/Witness/lib/createDataUrl.d.mts +0 -2
  183. package/dist/node/Witness/lib/createDataUrl.d.mts.map +0 -1
  184. package/dist/node/Witness/lib/createDataUrl.d.ts +0 -2
  185. package/dist/node/Witness/lib/createDataUrl.d.ts.map +0 -1
  186. package/dist/node/Witness/lib/index.d.cts +0 -4
  187. package/dist/node/Witness/lib/index.d.cts.map +0 -1
  188. package/dist/node/Witness/lib/index.d.mts +0 -4
  189. package/dist/node/Witness/lib/index.d.mts.map +0 -1
  190. package/dist/node/Witness/lib/index.d.ts +0 -4
  191. package/dist/node/Witness/lib/index.d.ts.map +0 -1
  192. package/dist/node/Witness/lib/resolveDynamicSvg.d.cts +0 -2
  193. package/dist/node/Witness/lib/resolveDynamicSvg.d.cts.map +0 -1
  194. package/dist/node/Witness/lib/resolveDynamicSvg.d.mts +0 -2
  195. package/dist/node/Witness/lib/resolveDynamicSvg.d.mts.map +0 -1
  196. package/dist/node/Witness/lib/resolveDynamicSvg.d.ts +0 -2
  197. package/dist/node/Witness/lib/resolveDynamicSvg.d.ts.map +0 -1
  198. package/dist/node/index.cjs +0 -459
  199. package/dist/node/index.cjs.map +0 -1
  200. package/dist/node/index.d.cts +0 -4
  201. package/dist/node/index.d.cts.map +0 -1
  202. package/dist/node/index.d.mts +0 -4
  203. package/dist/node/index.d.mts.map +0 -1
  204. package/dist/node/index.d.ts.map +0 -1
@@ -1,4 +1,92 @@
1
- export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts';
2
- export * from './Witness/index.ts';
1
+ import * as _xyo_network_payloadset_plugin from '@xyo-network/payloadset-plugin';
2
+ import { WitnessConfig, WitnessParams } from '@xyo-network/witness-model';
3
+ import * as _xyo_network_module_model from '@xyo-network/module-model';
4
+ import { AnyConfigSchema } from '@xyo-network/module-model';
5
+ import * as _xyo_network_payload_model from '@xyo-network/payload-model';
6
+ import { Schema } from '@xyo-network/payload-model';
7
+ import * as _store__xyo_network_account_model_virtual_96c2d52d44_package from '.store/@xyo-network-account-model-virtual-96c2d52d44/package';
8
+ import * as _store__xylabs_object_npm_4_0_1_bb8d73c5f0_package from '.store/@xylabs-object-npm-4.0.1-bb8d73c5f0/package';
9
+ import { ImageThumbnailDiviner } from '@xyo-network/diviner-image-thumbnail';
3
10
  export * from '@xyo-network/diviner-image-thumbnail';
4
- //# sourceMappingURL=index.d.ts.map
11
+ import { AbstractWitness } from '@xyo-network/abstract-witness';
12
+ import { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin';
13
+ import { UrlPayload } from '@xyo-network/url-payload-plugin';
14
+
15
+ declare const ImageThumbnailWitnessConfigSchema: "network.xyo.image.thumbnail.witness.config";
16
+ type ImageThumbnailWitnessConfigSchema = typeof ImageThumbnailWitnessConfigSchema;
17
+ type ImageThumbnailEncoding = 'PNG' | 'JPG' | 'GIF';
18
+ type ImageThumbnailWitnessConfig = WitnessConfig<{
19
+ dataUrlPassthrough?: boolean;
20
+ encoding?: ImageThumbnailEncoding;
21
+ height?: number;
22
+ ipfsGateway?: string;
23
+ maxAsyncProcesses?: number;
24
+ maxCacheBytes?: number;
25
+ maxCacheEntries?: number;
26
+ quality?: number;
27
+ runExclusive?: boolean;
28
+ schema: ImageThumbnailWitnessConfigSchema;
29
+ width?: number;
30
+ }>;
31
+
32
+ type ImageThumbnailWitnessParams = WitnessParams<AnyConfigSchema<ImageThumbnailWitnessConfig>, {
33
+ loaders?: string[];
34
+ }>;
35
+
36
+ interface ImageThumbnailWitnessError extends Error {
37
+ name: 'ImageThumbnailWitnessError';
38
+ url: string;
39
+ }
40
+ interface DnsError extends Error {
41
+ code: string;
42
+ }
43
+ declare class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams = ImageThumbnailWitnessParams> extends AbstractWitness<TParams> {
44
+ static readonly configSchemas: Schema[];
45
+ static readonly defaultConfigSchema: Schema;
46
+ private _semaphore;
47
+ get encoding(): ImageThumbnailEncoding;
48
+ get height(): number;
49
+ get ipfsGateway(): string;
50
+ get maxAsyncProcesses(): number;
51
+ get quality(): number;
52
+ get width(): number;
53
+ private static binaryToSha256;
54
+ private static bufferFromDataUrl;
55
+ protected observeHandler(payloads?: UrlPayload[]): Promise<ImageThumbnail[]>;
56
+ private createThumbnailDataUrl;
57
+ private createThumbnailFromVideo;
58
+ private fromHttp;
59
+ private processMedia;
60
+ }
61
+
62
+ declare const ImageThumbnailPlugin: () => _xyo_network_payloadset_plugin.PayloadSetDualPlugin<ImageThumbnailWitness<_store__xylabs_object_npm_4_0_1_bb8d73c5f0_package.BaseParamsFields & {
63
+ account?: _store__xyo_network_account_model_virtual_96c2d52d44_package.AccountInstance | "random";
64
+ addToResolvers?: boolean;
65
+ additionalSigners?: _store__xyo_network_account_model_virtual_96c2d52d44_package.AccountInstance[];
66
+ allowNameResolution?: boolean;
67
+ config: _xyo_network_payload_model.SchemaFields & _xyo_network_payload_model.PayloadFields & Omit<_xyo_network_module_model.ArchivingModuleConfig & _xyo_network_module_model.ModuleConfigFields & _xyo_network_payload_model.SchemaFields & _xyo_network_payload_model.PayloadFields & Omit<_xyo_network_module_model.ArchivingModuleConfig & _xyo_network_module_model.ModuleConfigFields & {
68
+ schema: "network.xyo.image.thumbnail.witness.config";
69
+ } & {
70
+ dataUrlPassthrough?: boolean;
71
+ encoding?: ImageThumbnailEncoding;
72
+ height?: number;
73
+ ipfsGateway?: string;
74
+ maxAsyncProcesses?: number;
75
+ maxCacheBytes?: number;
76
+ maxCacheEntries?: number;
77
+ quality?: number;
78
+ runExclusive?: boolean;
79
+ schema: ImageThumbnailWitnessConfigSchema;
80
+ width?: number;
81
+ }, "schema"> & {
82
+ schema: "network.xyo.image.thumbnail.witness.config";
83
+ }, "schema"> & {
84
+ schema: string;
85
+ };
86
+ ephemeralQueryAccountEnabled?: boolean;
87
+ moduleIdentifierTransformers?: _xyo_network_module_model.ModuleIdentifierTransformer[];
88
+ } & {
89
+ loaders?: string[];
90
+ }>, ImageThumbnailDiviner>;
91
+
92
+ export { type DnsError, type ImageThumbnailEncoding, ImageThumbnailPlugin, ImageThumbnailWitness, type ImageThumbnailWitnessConfig, ImageThumbnailWitnessConfigSchema, type ImageThumbnailWitnessError, type ImageThumbnailWitnessParams, ImageThumbnailPlugin as default };
@@ -11,7 +11,7 @@ var ImageThumbnailWitnessConfigSchema = `${ImageThumbnailSchema}.witness.config`
11
11
  // src/Witness/Witness.ts
12
12
  import { Buffer as Buffer2 } from "node:buffer";
13
13
  import { promises as dnsPromises } from "node:dns";
14
- import { compact } from "@xylabs/lodash";
14
+ import { exists } from "@xylabs/exists";
15
15
  import { AbstractWitness } from "@xyo-network/abstract-witness";
16
16
  import { PayloadHasher } from "@xyo-network/hash";
17
17
  import { ImageThumbnailSchema as ImageThumbnailSchema2 } from "@xyo-network/image-thumbnail-payload-plugin";
@@ -79,7 +79,7 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
79
79
  host = assertEx(ipfsGateway, () => "No ipfsGateway provided");
80
80
  path = url.host === "ipfs" ? `ipfs${path}` : `ipfs/${url.host}${path}`;
81
81
  const root = `${protocol}//${host}/${path}`;
82
- return (query == null ? void 0 : query.length) > 0 ? `${root}?${query}` : root;
82
+ return query?.length > 0 ? `${root}?${query}` : root;
83
83
  } else if (allowIpfsIoRepair && protocol === "https" && host === "ipfs.io") {
84
84
  protocol = "https:";
85
85
  host = assertEx(ipfsGateway, () => "No ipfsGateway provided");
@@ -89,7 +89,7 @@ var checkIpfsUrl = (urlToCheck, ipfsGateway) => {
89
89
  }
90
90
  path = pathParts.join("/");
91
91
  const root = `${protocol}//${host}/${path}`;
92
- return (query == null ? void 0 : query.length) > 0 ? `${root}?${query}` : root;
92
+ return query?.length > 0 ? `${root}?${query}` : root;
93
93
  } else {
94
94
  return urlToCheck;
95
95
  }
@@ -124,10 +124,9 @@ var resolveDynamicSvg = async (base64Bytes) => {
124
124
  ])
125
125
  );
126
126
  const image = imageResults.map(([href, response]) => {
127
- var _a;
128
127
  if (response.data) {
129
128
  const sourceBuffer = Buffer.from(response.data, "binary");
130
- return { $: { href: `data:${(_a = response.headers["content-type"]) == null ? void 0 : _a.toString()};base64,${sourceBuffer.toString("base64")}` } };
129
+ return { $: { href: `data:${response.headers["content-type"]?.toString()};base64,${sourceBuffer.toString("base64")}` } };
131
130
  } else {
132
131
  return { $: { href } };
133
132
  }
@@ -194,48 +193,46 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
194
193
  }
195
194
  const urlPayloads = payloads.filter((payload) => payload.schema === UrlSchema);
196
195
  const process = async () => {
197
- return compact(
198
- await Promise.all(
199
- urlPayloads.map(async ({ url }) => {
200
- let result;
201
- const dataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(url);
202
- if (dataBuffer) {
203
- if (this.config.dataUrlPassthrough) {
204
- result = {
205
- schema: ImageThumbnailSchema2,
206
- sourceHash: await _ImageThumbnailWitness.binaryToSha256(dataBuffer),
207
- sourceUrl: url,
208
- url
209
- };
210
- } else {
211
- let cookedDataBuffer = dataBuffer;
212
- const urlParts = url.split(";");
213
- const [, contentType] = urlParts[0].split(":");
214
- if (contentType.startsWith("image/svg")) {
215
- const [encoding, byteString] = urlParts[1].split(",");
216
- if (encoding === "base64") {
217
- const newSvg = await resolveDynamicSvg(byteString);
218
- const newSvgDataUrl = createDataUrl(Buffer2.from(newSvg), contentType);
219
- cookedDataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer;
220
- }
196
+ return (await Promise.all(
197
+ urlPayloads.map(async ({ url }) => {
198
+ let result;
199
+ const dataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(url);
200
+ if (dataBuffer) {
201
+ if (this.config.dataUrlPassthrough) {
202
+ result = {
203
+ schema: ImageThumbnailSchema2,
204
+ sourceHash: await _ImageThumbnailWitness.binaryToSha256(dataBuffer),
205
+ sourceUrl: url,
206
+ url
207
+ };
208
+ } else {
209
+ let cookedDataBuffer = dataBuffer;
210
+ const urlParts = url.split(";");
211
+ const [, contentType] = urlParts[0].split(":");
212
+ if (contentType.startsWith("image/svg")) {
213
+ const [encoding, byteString] = urlParts[1].split(",");
214
+ if (encoding === "base64") {
215
+ const newSvg = await resolveDynamicSvg(byteString);
216
+ const newSvgDataUrl = createDataUrl(Buffer2.from(newSvg), contentType);
217
+ cookedDataBuffer = _ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer;
221
218
  }
222
- result = await this.processMedia(
223
- cookedDataBuffer,
224
- {
225
- schema: ImageThumbnailSchema2,
226
- sourceUrl: url
227
- },
228
- contentType
229
- );
230
219
  }
231
- } else {
232
- const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway);
233
- result = await this.fromHttp(mutatedUrl, url);
220
+ result = await this.processMedia(
221
+ cookedDataBuffer,
222
+ {
223
+ schema: ImageThumbnailSchema2,
224
+ sourceUrl: url
225
+ },
226
+ contentType
227
+ );
234
228
  }
235
- return result;
236
- })
237
- )
238
- );
229
+ } else {
230
+ const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway);
231
+ result = await this.fromHttp(mutatedUrl, url);
232
+ }
233
+ return result;
234
+ })
235
+ )).filter(exists);
239
236
  };
240
237
  return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process();
241
238
  }
@@ -262,7 +259,6 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
262
259
  }
263
260
  // eslint-disable-next-line complexity
264
261
  async fromHttp(url, sourceUrl) {
265
- var _a, _b, _c;
266
262
  let response;
267
263
  let dnsResult;
268
264
  try {
@@ -293,13 +289,13 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
293
289
  schema: ImageThumbnailSchema2,
294
290
  sourceUrl: sourceUrl ?? url
295
291
  };
296
- if (((_a = axiosError == null ? void 0 : axiosError.response) == null ? void 0 : _a.status) !== void 0) {
292
+ if (axiosError?.response?.status !== void 0) {
297
293
  result2.http = result2.http ?? {};
298
- result2.http.status = (_b = axiosError == null ? void 0 : axiosError.response) == null ? void 0 : _b.status;
294
+ result2.http.status = axiosError?.response?.status;
299
295
  }
300
- if ((axiosError == null ? void 0 : axiosError.code) !== void 0) {
296
+ if (axiosError?.code !== void 0) {
301
297
  result2.http = result2.http ?? {};
302
- result2.http.code = axiosError == null ? void 0 : axiosError.code;
298
+ result2.http.code = axiosError?.code;
303
299
  }
304
300
  return result2;
305
301
  } else {
@@ -314,22 +310,21 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
314
310
  sourceUrl: sourceUrl ?? url
315
311
  };
316
312
  if (response.status >= 200 && response.status < 300) {
317
- const contentType = (_c = response.headers["content-type"]) == null ? void 0 : _c.toString();
313
+ const contentType = response.headers["content-type"]?.toString();
318
314
  const sourceBuffer = Buffer2.from(response.data, "binary");
319
315
  return this.processMedia(sourceBuffer, result, contentType);
320
316
  }
321
317
  return result;
322
318
  }
323
319
  async processMedia(sourceBuffer, imageThumbnail, contentType) {
324
- var _a, _b, _c, _d, _e;
325
- const [mediaType, fileType] = (contentType == null ? void 0 : contentType.split("/")) ?? ["", ""];
320
+ const [mediaType, fileType] = contentType?.split("/") ?? ["", ""];
326
321
  imageThumbnail.mime = imageThumbnail.mime ?? {};
327
322
  imageThumbnail.mime.returned = mediaType;
328
323
  try {
329
324
  imageThumbnail.mime.detected = await FileType.fromBuffer(sourceBuffer);
330
325
  } catch (ex) {
331
326
  const error = ex;
332
- (_a = this.logger) == null ? void 0 : _a.error(`FileType error: ${error.message}`);
327
+ this.logger?.error(`FileType error: ${error.message}`);
333
328
  }
334
329
  const processImage = async (encoding2) => {
335
330
  imageThumbnail.sourceHash = await _ImageThumbnailWitness.binaryToSha256(sourceBuffer);
@@ -368,16 +363,16 @@ var ImageThumbnailWitness = class _ImageThumbnailWitness extends AbstractWitness
368
363
  break;
369
364
  }
370
365
  default: {
371
- const [detectedMediaType] = ((_c = (_b = imageThumbnail.mime.detected) == null ? void 0 : _b.mime) == null ? void 0 : _c.split("/")) ?? ["", ""];
366
+ const [detectedMediaType] = imageThumbnail.mime.detected?.mime?.split("/") ?? ["", ""];
372
367
  switch (detectedMediaType) {
373
368
  case "image": {
374
369
  await processImage();
375
- imageThumbnail.mime.type = (_d = imageThumbnail.mime.detected) == null ? void 0 : _d.mime;
370
+ imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime;
376
371
  break;
377
372
  }
378
373
  case "video": {
379
374
  await processVideo();
380
- imageThumbnail.mime.type = (_e = imageThumbnail.mime.detected) == null ? void 0 : _e.mime;
375
+ imageThumbnail.mime.type = imageThumbnail.mime.detected?.mime;
381
376
  break;
382
377
  }
383
378
  default: {
@@ -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 { 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
+ {"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 { exists } from '@xylabs/exists'\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 (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 )).filter(exists)\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-x/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"]}
package/package.json CHANGED
@@ -10,19 +10,19 @@
10
10
  "url": "https://github.com/XYOracleNetwork/plugins/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xylabs/assert": "^3.6.12",
14
- "@xylabs/lodash": "^3.6.12",
15
- "@xyo-network/abstract-witness": "^2.111.3",
16
- "@xyo-network/diviner-image-thumbnail": "^2.99.6",
17
- "@xyo-network/hash": "^2.111.3",
18
- "@xyo-network/image-thumbnail-payload-plugin": "^2.99.6",
19
- "@xyo-network/module-model": "^2.111.3",
20
- "@xyo-network/payload-model": "^2.111.3",
21
- "@xyo-network/payloadset-plugin": "^2.111.3",
22
- "@xyo-network/url-payload-plugin": "^2.99.6",
23
- "@xyo-network/witness-model": "^2.111.3",
13
+ "@xylabs/assert": "^4.0.1",
14
+ "@xylabs/exists": "^4.0.1",
15
+ "@xyo-network/abstract-witness": "^3.0.2",
16
+ "@xyo-network/diviner-image-thumbnail": "^3.0.1",
17
+ "@xyo-network/hash": "^3.0.2",
18
+ "@xyo-network/image-thumbnail-payload-plugin": "^3.0.1",
19
+ "@xyo-network/module-model": "^3.0.2",
20
+ "@xyo-network/payload-model": "^3.0.2",
21
+ "@xyo-network/payloadset-plugin": "^3.0.2",
22
+ "@xyo-network/url-payload-plugin": "^3.0.1",
23
+ "@xyo-network/witness-model": "^3.0.2",
24
24
  "async-mutex": "^0.5.0",
25
- "axios": "^1.7.3",
25
+ "axios": "^1.7.4",
26
26
  "base64-js": "^1.5.1",
27
27
  "file-type": "^16.5.4",
28
28
  "fluent-ffmpeg": "^2.1.3",
@@ -42,16 +42,16 @@
42
42
  "@types/url-parse": "^1.4.11",
43
43
  "@types/uuid": "^10.0.0",
44
44
  "@types/xml2js": "^0.4.14",
45
- "@xylabs/delay": "^3.6.12",
46
- "@xylabs/ts-scripts-yarn3": "^3.15.14",
47
- "@xylabs/tsconfig": "^3.15.14",
48
- "@xyo-network/account": "^2.111.3",
49
- "@xyo-network/archivist-memory": "^2.111.3",
50
- "@xyo-network/node-memory": "^2.111.3",
51
- "@xyo-network/payload-builder": "^2.111.3",
52
- "@xyo-network/sentinel-memory": "^2.111.3",
53
- "@xyo-network/sentinel-wrapper": "^2.111.3",
54
- "@xyo-network/witness-timestamp": "^2.111.3",
45
+ "@xylabs/delay": "^4.0.1",
46
+ "@xylabs/ts-scripts-yarn3": "^4.0.0-rc.15",
47
+ "@xylabs/tsconfig": "^4.0.0-rc.15",
48
+ "@xyo-network/account": "^3.0.2",
49
+ "@xyo-network/archivist-memory": "^3.0.2",
50
+ "@xyo-network/node-memory": "^3.0.2",
51
+ "@xyo-network/payload-builder": "^3.0.2",
52
+ "@xyo-network/sentinel-memory": "^3.0.2",
53
+ "@xyo-network/sentinel-wrapper": "^3.0.2",
54
+ "@xyo-network/witness-timestamp": "^3.0.2",
55
55
  "jest": "^29.7.0",
56
56
  "jest-mock-extended": "^3.0.7",
57
57
  "typescript": "^5.5.4"
@@ -60,19 +60,12 @@
60
60
  "exports": {
61
61
  ".": {
62
62
  "node": {
63
- "require": {
64
- "types": "./dist/node/index.d.cts",
65
- "default": "./dist/node/index.cjs"
66
- },
67
- "import": {
68
- "types": "./dist/node/index.d.mts",
69
- "default": "./dist/node/index.mjs"
70
- }
63
+ "types": "./dist/node/index.d.ts",
64
+ "default": "./dist/node/index.mjs"
71
65
  }
72
66
  },
73
67
  "./package.json": "./package.json"
74
68
  },
75
- "main": "dist/node/index.cjs",
76
69
  "module": "dist/node/index.mjs",
77
70
  "types": "./dist/node/index.d.ts",
78
71
  "homepage": "https://xyo.network",
@@ -85,6 +78,6 @@
85
78
  "url": "https://github.com/XYOracleNetwork/plugins.git"
86
79
  },
87
80
  "sideEffects": false,
88
- "version": "2.99.6",
81
+ "version": "3.0.1",
89
82
  "type": "module"
90
83
  }
@@ -2,7 +2,7 @@
2
2
  import { Buffer } from 'node:buffer'
3
3
  import { promises as dnsPromises } from 'node:dns'
4
4
 
5
- import { compact } from '@xylabs/lodash'
5
+ import { exists } from '@xylabs/exists'
6
6
  import { AbstractWitness } from '@xyo-network/abstract-witness'
7
7
  import { PayloadHasher } from '@xyo-network/hash'
8
8
  import { ImageThumbnail, ImageThumbnailSchema } from '@xyo-network/image-thumbnail-payload-plugin'
@@ -104,52 +104,50 @@ export class ImageThumbnailWitness<TParams extends ImageThumbnailWitnessParams =
104
104
  }
105
105
  const urlPayloads = payloads.filter(payload => payload.schema === UrlSchema)
106
106
  const process = async () => {
107
- return compact(
108
- await Promise.all(
109
- urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {
110
- let result: ImageThumbnail
111
-
112
- // if it is a data URL, return a Buffer
113
- const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)
114
-
115
- if (dataBuffer) {
116
- if (this.config.dataUrlPassthrough) {
117
- result = {
118
- schema: ImageThumbnailSchema,
119
- sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),
120
- sourceUrl: url,
121
- url,
122
- }
123
- } else {
124
- let cookedDataBuffer = dataBuffer
125
- const urlParts = url.split(';')
126
- const [, contentType] = urlParts[0].split(':')
127
- if (contentType.startsWith('image/svg')) {
128
- const [encoding, byteString] = urlParts[1].split(',')
129
- if (encoding === 'base64') {
130
- const newSvg = await resolveDynamicSvg(byteString)
131
- const newSvgDataUrl = createDataUrl(Buffer.from(newSvg), contentType)
132
- cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer
133
- }
134
- }
135
- result = await this.processMedia(
136
- cookedDataBuffer,
137
- {
138
- schema: ImageThumbnailSchema,
139
- sourceUrl: url,
140
- },
141
- contentType,
142
- )
107
+ return (await Promise.all(
108
+ urlPayloads.map<Promise<ImageThumbnail>>(async ({ url }) => {
109
+ let result: ImageThumbnail
110
+
111
+ // if it is a data URL, return a Buffer
112
+ const dataBuffer = ImageThumbnailWitness.bufferFromDataUrl(url)
113
+
114
+ if (dataBuffer) {
115
+ if (this.config.dataUrlPassthrough) {
116
+ result = {
117
+ schema: ImageThumbnailSchema,
118
+ sourceHash: await ImageThumbnailWitness.binaryToSha256(dataBuffer),
119
+ sourceUrl: url,
120
+ url,
143
121
  }
144
122
  } else {
145
- // if it is ipfs, go through cloud flair
146
- const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)
147
- result = await this.fromHttp(mutatedUrl, url)
123
+ let cookedDataBuffer = dataBuffer
124
+ const urlParts = url.split(';')
125
+ const [, contentType] = urlParts[0].split(':')
126
+ if (contentType.startsWith('image/svg')) {
127
+ const [encoding, byteString] = urlParts[1].split(',')
128
+ if (encoding === 'base64') {
129
+ const newSvg = await resolveDynamicSvg(byteString)
130
+ const newSvgDataUrl = createDataUrl(Buffer.from(newSvg), contentType)
131
+ cookedDataBuffer = ImageThumbnailWitness.bufferFromDataUrl(newSvgDataUrl) ?? dataBuffer
132
+ }
133
+ }
134
+ result = await this.processMedia(
135
+ cookedDataBuffer,
136
+ {
137
+ schema: ImageThumbnailSchema,
138
+ sourceUrl: url,
139
+ },
140
+ contentType,
141
+ )
148
142
  }
149
- return result
150
- }),
151
- ),
152
- )
143
+ } else {
144
+ // if it is ipfs, go through cloud flair
145
+ const mutatedUrl = checkIpfsUrl(url, this.ipfsGateway)
146
+ result = await this.fromHttp(mutatedUrl, url)
147
+ }
148
+ return result
149
+ }),
150
+ )).filter(exists)
153
151
  }
154
152
  return this.config.runExclusive ? await this._semaphore.runExclusive(() => process()) : process()
155
153
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- // eslint-disable-next-line import/no-default-export
1
+ // eslint-disable-next-line import-x/no-default-export
2
2
  export { ImageThumbnailPlugin as default, ImageThumbnailPlugin } from './Plugin.ts'
3
3
  export * from './Witness/index.ts'
4
4
  export * from '@xyo-network/diviner-image-thumbnail'