@xyo-network/diviner-image-thumbnail 5.1.2 → 5.1.4

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 (24) hide show
  1. package/dist/neutral/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.d.ts.map +1 -1
  2. package/dist/neutral/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.d.ts.map +1 -1
  3. package/dist/neutral/index.mjs +3 -3
  4. package/dist/neutral/index.mjs.map +1 -1
  5. package/package.json +37 -34
  6. package/src/Diviner/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts +2 -2
  7. package/src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts +1 -1
  8. package/src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Diviner.ts +1 -1
  9. package/src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts +1 -1
  10. package/dist/neutral/Diviner/ImageThumbnailStateToIndexCandidateDiviner/spec/Diviner.spec.d.ts +0 -2
  11. package/dist/neutral/Diviner/ImageThumbnailStateToIndexCandidateDiviner/spec/Diviner.spec.d.ts.map +0 -1
  12. package/dist/neutral/Diviner/spec/Diviner.spec.d.ts +0 -2
  13. package/dist/neutral/Diviner/spec/Diviner.spec.d.ts.map +0 -1
  14. package/dist/neutral/Diviner/spec/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.spec.d.ts +0 -2
  15. package/dist/neutral/Diviner/spec/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.spec.d.ts.map +0 -1
  16. package/dist/neutral/Diviner/spec/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.spec.d.ts +0 -2
  17. package/dist/neutral/Diviner/spec/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.spec.d.ts.map +0 -1
  18. package/dist/neutral/Diviner/spec/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.spec.d.ts +0 -2
  19. package/dist/neutral/Diviner/spec/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.spec.d.ts.map +0 -1
  20. package/src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/spec/Diviner.spec.ts +0 -175
  21. package/src/Diviner/spec/Diviner.spec.ts +0 -261
  22. package/src/Diviner/spec/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.spec.ts +0 -98
  23. package/src/Diviner/spec/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.spec.ts +0 -120
  24. package/src/Diviner/spec/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.spec.ts +0 -145
@@ -1 +1 @@
1
- {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAEpF,OAAO,EAAE,gDAAgD,EAAE,MAAM,aAAa,CAAA;AAE9E,MAAM,MAAM,sDAAsD,GAAG,GAAG,gDAAgD,SAAS,CAAA;AACjI,eAAO,MAAM,sDAAsD,EAAE,sDACP,CAAA;AAE9D,MAAM,MAAM,gDAAgD,GAAG,aAAa,CAAC;IAC3E,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;OAEG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,MAAM,EAAE,sDAAsD,CAAA;CAC/D,CAAC,CAAA"}
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAEpF,OAAO,EAAE,gDAAgD,EAAE,MAAM,aAAa,CAAA;AAE9E,MAAM,MAAM,sDAAsD,GAAG,GAAG,gDAAgD,SAAS,CAAA;AACjI,eAAO,MAAM,sDAAsD,EAAE,sDACL,CAAA;AAEhE,MAAM,MAAM,gDAAgD,GAAG,aAAa,CAAC;IAC3E,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;OAEG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,MAAM,EAAE,sDAAsD,CAAA;CAC/D,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAA;AAEzF,MAAM,MAAM,gDAAgD,GAAG,GAAG,2BAA2B,qCAAqC,CAAA;AAClI,eAAO,MAAM,gDAAgD,EAAE,gDACM,CAAA"}
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAA;AAEzF,MAAM,MAAM,gDAAgD,GAAG,GAAG,2BAA2B,qCAAqC,CAAA;AAClI,eAAO,MAAM,gDAAgD,EAAE,gDACQ,CAAA"}
@@ -37,8 +37,8 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends Abs
37
37
  const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads);
38
38
  const tuples = bws.reduce(
39
39
  (acc, curr) => {
40
- const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema);
41
- const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema);
40
+ const imageThumbnailIndex = curr.payload_schemas?.indexOf(ImageThumbnailSchema);
41
+ const timestampIndex = curr.payload_schemas?.indexOf(TimestampSchema);
42
42
  const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex];
43
43
  const timestampHash = curr.payload_hashes?.[timestampIndex];
44
44
  const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail);
@@ -217,7 +217,7 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
217
217
  return this.config.payloadDivinerLimit ?? 1e3;
218
218
  }
219
219
  static async getPayloadsInBoundWitness(bw, archivist) {
220
- const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema));
220
+ const indexes = payload_schemas.map((schema) => bw.payload_schemas?.indexOf(schema));
221
221
  const hashes = indexes.map((index) => bw.payload_hashes?.[index]);
222
222
  const results = await archivist.get(hashes);
223
223
  const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Diviner/Diviner.ts","../../src/Diviner/ImageThumbnailDivinerLabels.ts","../../src/Diviner/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts","../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts","../../src/Diviner/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts","../../src/Diviner/ImageThumbnailResultQuery.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Diviner.ts"],"sourcesContent":["import { IndexingDiviner } from '@xyo-network/diviner-indexing'\nimport type { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override readonly labels: ImageThumbnailDivinerLabels = { ...super.labels, ...ImageThumbnailDivinerLabels }\n}\n","import type { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport type { Labels } from '@xyo-network/module-model'\n\n/**\n * Labels for Image Thumbnail Diviner components\n */\nexport interface ImageThumbnailDivinerLabels extends Labels {\n 'network.xyo.image.thumbnail': 'diviner'\n}\n\n/**\n * Labels for Image Thumbnail Diviner components\n */\nexport const ImageThumbnailDivinerLabels: ImageThumbnailDivinerLabels = { 'network.xyo.image.thumbnail': 'diviner' }\n\n/**\n * Labels for Image Thumbnail Diviner Stage Diviners\n */\nexport type ImageThumbnailDivinerStageLabels = ImageThumbnailDivinerLabels & {\n /**\n * Labels for the stage of the Image Thumbnail Diviner Stage Diviner\n */\n [key in DivinerStageSchema]: IndexingDivinerStage\n}\n","import type { Hash } from '@xylabs/hex'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport {\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithSources,\n} from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport type { TimeStamp } from '@xyo-network/witness-timestamp'\nimport { isTimestamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport type { ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex(schema => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex(schema => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as ImageThumbnail | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as TimeStamp\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const $sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = {\n key, success, timestamp,\n }\n if (status) fields.status = status\n const result = new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({ schema: ImageThumbnailResultIndexSchema })\n .fields({ ...fields }).meta({ $sources })\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport {\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndexWithSources,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport type { ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndexWithSources)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return imageThumbnailResultIndexes.map((imageThumbnailResultIndex) => {\n const {\n\n key, schema, $sources, ...commonFields\n } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).meta({ $sources }).build()\n }\n }).filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport type { ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\nimport type { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery.ts'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const {\n limit: payloadLimit, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url,\n } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import type { PayloadDivinerQueryPayload } from '@xyo-network/diviner-payload-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport type { ImageThumbnailResultIndex } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\n/**\n * The fields that will need to be indexed on in the underlying store\n */\nexport type QueryableImageThumbnailResultProperties = Extract<keyof ImageThumbnailResultIndex, 'status' | 'success' | 'timestamp' | 'key'>\n\n/**\n * The query that will be used to retrieve the results from the underlying store\n */\nexport type ImageThumbnailResultQuery = PayloadDivinerQueryPayload & Pick<ImageThumbnailResultIndex, QueryableImageThumbnailResultProperties>\n\n/**\n * A type guard for ImageThumbnailResultQuery\n */\n// TODO: Use a more derived schema than PayloadDivinerQuerySchema\nexport const isImageThumbnailResultQuery = isPayloadOfSchemaType<ImageThumbnailResultQuery>(PayloadDivinerQuerySchema)\n","import { ImageThumbnailDivinerSchema } from '@xyo-network/image-thumbnail-payload-plugin'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerSchema = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\nexport const ImageThumbnailStateToIndexCandidateDivinerSchema: ImageThumbnailStateToIndexCandidateDivinerSchema\n= `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import type { DivinerConfig } from '@xyo-network/diviner-model'\nimport type { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema.ts'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n= `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfig = DivinerConfig<{\n payloadDivinerLimit?: number\n /**\n * Where the diviner should look for stored thumbnails\n */\n payloadStore?: SearchableStorage\n schema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n}>\n","import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AsObjectFactory } from '@xylabs/object'\nimport type { ArchivistInstance, ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { asBoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { payloadSchemasContainsAll } from '@xyo-network/boundwitness-validator'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport type { ModuleState } from '@xyo-network/module-model'\nimport { isModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { SequenceConstants } from '@xyo-network/payload-model'\nimport type { TimeStamp } from '@xyo-network/witness-timestamp'\nimport { isTimestamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport type { ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from '../ImageThumbnailDivinerLabels.ts'\nimport type { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState.ts'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config.ts'\nimport type { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params.ts'\n\n/**\n * All Payload types involved in index candidates for indexing\n */\nexport type IndexCandidate = BoundWitness | ImageThumbnail | TimeStamp\n\n/**\n * The response from the ImageThumbnailStateToIndexCandidateDiviner\n */\nexport type ImageThumbnailStateToIndexCandidateDivinerResponse = [\n /**\n * The next state of the diviner\n */\n nextState: ModuleState<ImageThumbnailDivinerState>,\n /**\n * The index candidates\n */\n ...IndexCandidate[],\n]\n\n/**\n * The required payload_schemas within BoundWitnesses to identify index candidates\n */\nconst payload_schemas = [ImageThumbnailSchema, TimestampSchema]\n\n/**\n * Index candidate identity functions\n */\nconst indexCandidateIdentityFunctions = [isImageThumbnail, isTimestamp] as const\nconst isIndexCandidate = (x?: unknown | null): x is IndexCandidate => {\n return indexCandidateIdentityFunctions.map(is => is(x)).some(Boolean)\n}\nconst asIndexCandidate = AsObjectFactory.create(isIndexCandidate)\n\n/**\n * The default order to search Bound Witnesses to identify index candidates\n */\nconst order = 'asc'\n\n/**\n * The name of the module (for logging purposes)\n */\nconst moduleName = 'ImageThumbnailStateToIndexCandidateDiviner'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailStateToIndexCandidateDiviner<\n TParams extends ImageThumbnailStateToIndexCandidateDivinerParams = ImageThumbnailStateToIndexCandidateDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map(schema => bw.payload_schemas?.findIndex(s => s === schema))\n const hashes = indexes.map(index => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map(is => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filterAs(filteredResults, asIndexCandidate)\n return [bw, ...indexCandidates]\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailStateToIndexCandidateDivinerResponse> {\n // Retrieve the last state from what was passed in\n const lastState = payloads.find(isModuleState<ImageThumbnailDivinerState>)\n // If there is no last state, start from the beginning\n ?? { schema: ModuleStateSchema, state: { cursor: SequenceConstants.minLocalSequence } }\n\n // Get the last cursor\n const cursor = lastState?.state?.cursor\n // Get the archivist for the store\n const sourceArchivist = await this.getArchivistForStore()\n if (!sourceArchivist) return [lastState]\n\n // Get the next batch of results\n const nextOffset: ArchivistNextOptions = { limit: this.payloadDivinerLimit, order }\n // Only use the cursor if it's a valid offset\n if (cursor !== SequenceConstants.minLocalSequence) nextOffset.cursor = cursor\n // Get next batch of results starting from the offset\n const next = await sourceArchivist.next(nextOffset)\n if (next.length === 0) return [lastState]\n\n const batch = filterAs(next, asBoundWitness)\n .filter(exists)\n .filter(bw => payloadSchemasContainsAll(bw, payload_schemas))\n // Get source data\n const indexCandidates: IndexCandidate[] = (await Promise.all(\n batch\n .filter(isBoundWitness)\n .map(bw => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n ))\n .filter(exists)\n .flat()\n const nextCursor = assertEx(next.at(-1)?._sequence, () => `${moduleName}: Expected next to have a sequence`)\n const nextState: ModuleState<ImageThumbnailDivinerState> = { schema: ModuleStateSchema, state: { ...lastState.state, cursor: nextCursor } }\n return [nextState, ...indexCandidates]\n }\n\n /**\n * Retrieves the archivist for the payloadStore\n * @returns The archivist for the payloadStore\n */\n protected async getArchivistForStore() {\n const name = assertEx(this.config?.payloadStore?.archivist, () => `${moduleName}: Config for payloadStore.archivist not specified`)\n const mod = assertEx(await this.resolve(name), () => `${moduleName}: Failed to resolve payloadStore.archivist`)\n return ArchivistWrapper.wrap(mod, this.account)\n }\n\n /**\n * Retrieves the BoundWitness Diviner for the payloadStore\n * @returns The BoundWitness Diviner for the payloadStore\n */\n protected async getBoundWitnessDivinerForStore() {\n const name = assertEx(\n this.config?.payloadStore?.boundWitnessDiviner,\n () => `${moduleName}: Config for payloadStore.boundWitnessDiviner not specified`,\n )\n const mod = assertEx(await this.resolve(name), () => `${moduleName}: Failed to resolve payloadStore.boundWitnessDiviner`)\n return DivinerWrapper.wrap(mod, this.account)\n }\n}\n"],"mappings":"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","names":["AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadBuilder","PayloadDivinerQuerySchema","exists","isBoundWitness","AbstractDiviner","ImageThumbnailSchema","isImageThumbnail","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","exists","isBoundWitness"]}
1
+ {"version":3,"sources":["../../src/Diviner/Diviner.ts","../../src/Diviner/ImageThumbnailDivinerLabels.ts","../../src/Diviner/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts","../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts","../../src/Diviner/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts","../../src/Diviner/ImageThumbnailResultQuery.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Diviner.ts"],"sourcesContent":["import { IndexingDiviner } from '@xyo-network/diviner-indexing'\nimport type { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override readonly labels: ImageThumbnailDivinerLabels = { ...super.labels, ...ImageThumbnailDivinerLabels }\n}\n","import type { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport type { Labels } from '@xyo-network/module-model'\n\n/**\n * Labels for Image Thumbnail Diviner components\n */\nexport interface ImageThumbnailDivinerLabels extends Labels {\n 'network.xyo.image.thumbnail': 'diviner'\n}\n\n/**\n * Labels for Image Thumbnail Diviner components\n */\nexport const ImageThumbnailDivinerLabels: ImageThumbnailDivinerLabels = { 'network.xyo.image.thumbnail': 'diviner' }\n\n/**\n * Labels for Image Thumbnail Diviner Stage Diviners\n */\nexport type ImageThumbnailDivinerStageLabels = ImageThumbnailDivinerLabels & {\n /**\n * Labels for the stage of the Image Thumbnail Diviner Stage Diviner\n */\n [key in DivinerStageSchema]: IndexingDivinerStage\n}\n","import type { Hash } from '@xylabs/hex'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport {\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithSources,\n} from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport type { TimeStamp } from '@xyo-network/witness-timestamp'\nimport { isTimestamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport type { ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.indexOf(ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.indexOf(TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as ImageThumbnail | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as TimeStamp\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const $sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = {\n key, success, timestamp,\n }\n if (status) fields.status = status\n const result = new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({ schema: ImageThumbnailResultIndexSchema })\n .fields({ ...fields }).meta({ $sources })\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport {\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndexWithSources,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport type { ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndexWithSources)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return imageThumbnailResultIndexes.map((imageThumbnailResultIndex) => {\n const {\n\n key, schema, $sources, ...commonFields\n } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).meta({ $sources }).build()\n }\n }).filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport type { ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels.ts'\nimport type { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery.ts'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const {\n limit: payloadLimit, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url,\n } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import type { PayloadDivinerQueryPayload } from '@xyo-network/diviner-payload-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport type { ImageThumbnailResultIndex } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\n/**\n * The fields that will need to be indexed on in the underlying store\n */\nexport type QueryableImageThumbnailResultProperties = Extract<keyof ImageThumbnailResultIndex, 'status' | 'success' | 'timestamp' | 'key'>\n\n/**\n * The query that will be used to retrieve the results from the underlying store\n */\nexport type ImageThumbnailResultQuery = PayloadDivinerQueryPayload & Pick<ImageThumbnailResultIndex, QueryableImageThumbnailResultProperties>\n\n/**\n * A type guard for ImageThumbnailResultQuery\n */\n// TODO: Use a more derived schema than PayloadDivinerQuerySchema\nexport const isImageThumbnailResultQuery = isPayloadOfSchemaType<ImageThumbnailResultQuery>(PayloadDivinerQuerySchema)\n","import { ImageThumbnailDivinerSchema } from '@xyo-network/image-thumbnail-payload-plugin'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerSchema = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\nexport const ImageThumbnailStateToIndexCandidateDivinerSchema: ImageThumbnailStateToIndexCandidateDivinerSchema\n = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import type { DivinerConfig } from '@xyo-network/diviner-model'\nimport type { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema.ts'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfig = DivinerConfig<{\n payloadDivinerLimit?: number\n /**\n * Where the diviner should look for stored thumbnails\n */\n payloadStore?: SearchableStorage\n schema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n}>\n","import { filterAs } from '@xylabs/array'\nimport { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AsObjectFactory } from '@xylabs/object'\nimport type { ArchivistInstance, ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { asBoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { payloadSchemasContainsAll } from '@xyo-network/boundwitness-validator'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport type { ModuleState } from '@xyo-network/module-model'\nimport { isModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { SequenceConstants } from '@xyo-network/payload-model'\nimport type { TimeStamp } from '@xyo-network/witness-timestamp'\nimport { isTimestamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport type { ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels.ts'\nimport { ImageThumbnailDivinerLabels } from '../ImageThumbnailDivinerLabels.ts'\nimport type { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState.ts'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config.ts'\nimport type { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params.ts'\n\n/**\n * All Payload types involved in index candidates for indexing\n */\nexport type IndexCandidate = BoundWitness | ImageThumbnail | TimeStamp\n\n/**\n * The response from the ImageThumbnailStateToIndexCandidateDiviner\n */\nexport type ImageThumbnailStateToIndexCandidateDivinerResponse = [\n /**\n * The next state of the diviner\n */\n nextState: ModuleState<ImageThumbnailDivinerState>,\n /**\n * The index candidates\n */\n ...IndexCandidate[],\n]\n\n/**\n * The required payload_schemas within BoundWitnesses to identify index candidates\n */\nconst payload_schemas = [ImageThumbnailSchema, TimestampSchema]\n\n/**\n * Index candidate identity functions\n */\nconst indexCandidateIdentityFunctions = [isImageThumbnail, isTimestamp] as const\nconst isIndexCandidate = (x?: unknown | null): x is IndexCandidate => {\n return indexCandidateIdentityFunctions.map(is => is(x)).some(Boolean)\n}\nconst asIndexCandidate = AsObjectFactory.create(isIndexCandidate)\n\n/**\n * The default order to search Bound Witnesses to identify index candidates\n */\nconst order = 'asc'\n\n/**\n * The name of the module (for logging purposes)\n */\nconst moduleName = 'ImageThumbnailStateToIndexCandidateDiviner'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailStateToIndexCandidateDiviner<\n TParams extends ImageThumbnailStateToIndexCandidateDivinerParams = ImageThumbnailStateToIndexCandidateDivinerParams,\n> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override readonly labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map(schema => bw.payload_schemas?.indexOf(schema))\n const hashes = indexes.map(index => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map(is => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filterAs(filteredResults, asIndexCandidate)\n return [bw, ...indexCandidates]\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailStateToIndexCandidateDivinerResponse> {\n // Retrieve the last state from what was passed in\n const lastState = payloads.find(isModuleState<ImageThumbnailDivinerState>)\n // If there is no last state, start from the beginning\n ?? { schema: ModuleStateSchema, state: { cursor: SequenceConstants.minLocalSequence } }\n\n // Get the last cursor\n const cursor = lastState?.state?.cursor\n // Get the archivist for the store\n const sourceArchivist = await this.getArchivistForStore()\n if (!sourceArchivist) return [lastState]\n\n // Get the next batch of results\n const nextOffset: ArchivistNextOptions = { limit: this.payloadDivinerLimit, order }\n // Only use the cursor if it's a valid offset\n if (cursor !== SequenceConstants.minLocalSequence) nextOffset.cursor = cursor\n // Get next batch of results starting from the offset\n const next = await sourceArchivist.next(nextOffset)\n if (next.length === 0) return [lastState]\n\n const batch = filterAs(next, asBoundWitness)\n .filter(exists)\n .filter(bw => payloadSchemasContainsAll(bw, payload_schemas))\n // Get source data\n const indexCandidates: IndexCandidate[] = (await Promise.all(\n batch\n .filter(isBoundWitness)\n .map(bw => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n ))\n .filter(exists)\n .flat()\n const nextCursor = assertEx(next.at(-1)?._sequence, () => `${moduleName}: Expected next to have a sequence`)\n const nextState: ModuleState<ImageThumbnailDivinerState> = { schema: ModuleStateSchema, state: { ...lastState.state, cursor: nextCursor } }\n return [nextState, ...indexCandidates]\n }\n\n /**\n * Retrieves the archivist for the payloadStore\n * @returns The archivist for the payloadStore\n */\n protected async getArchivistForStore() {\n const name = assertEx(this.config?.payloadStore?.archivist, () => `${moduleName}: Config for payloadStore.archivist not specified`)\n const mod = assertEx(await this.resolve(name), () => `${moduleName}: Failed to resolve payloadStore.archivist`)\n return ArchivistWrapper.wrap(mod, this.account)\n }\n\n /**\n * Retrieves the BoundWitness Diviner for the payloadStore\n * @returns The BoundWitness Diviner for the payloadStore\n */\n protected async getBoundWitnessDivinerForStore() {\n const name = assertEx(\n this.config?.payloadStore?.boundWitnessDiviner,\n () => `${moduleName}: Config for payloadStore.boundWitnessDiviner not specified`,\n )\n const mod = assertEx(await this.resolve(name), () => `${moduleName}: Failed to resolve payloadStore.boundWitnessDiviner`)\n return DivinerWrapper.wrap(mod, this.account)\n }\n}\n"],"mappings":"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","names":["AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadBuilder","PayloadDivinerQuerySchema","exists","isBoundWitness","AbstractDiviner","ImageThumbnailSchema","isImageThumbnail","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","exists","isBoundWitness"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/diviner-image-thumbnail",
3
- "version": "5.1.2",
3
+ "version": "5.1.4",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -30,43 +30,46 @@
30
30
  "types": "dist/neutral/index.d.ts",
31
31
  "files": [
32
32
  "dist",
33
- "src"
33
+ "src",
34
+ "!**/*.bench.*",
35
+ "!**/*.spec.*",
36
+ "!**/*.test.*"
34
37
  ],
35
38
  "dependencies": {
36
- "@xylabs/array": "~5.0.11",
37
- "@xylabs/assert": "~5.0.11",
38
- "@xylabs/exists": "~5.0.11",
39
- "@xylabs/object": "~5.0.11",
40
- "@xyo-network/archivist-model": "~5.1.2",
41
- "@xyo-network/archivist-wrapper": "~5.1.2",
42
- "@xyo-network/boundwitness-model": "~5.1.2",
43
- "@xyo-network/boundwitness-validator": "~5.1.2",
44
- "@xyo-network/diviner-abstract": "~5.1.2",
45
- "@xyo-network/diviner-indexing": "~5.1.2",
46
- "@xyo-network/diviner-model": "~5.1.2",
47
- "@xyo-network/diviner-payload-model": "~5.1.2",
48
- "@xyo-network/diviner-wrapper": "~5.1.2",
49
- "@xyo-network/image-thumbnail-payload-plugin": "~5.1.2",
50
- "@xyo-network/module-model": "~5.1.2",
51
- "@xyo-network/payload-builder": "~5.1.2",
52
- "@xyo-network/payload-model": "~5.1.2",
53
- "@xyo-network/url-payload-plugin": "~5.1.2",
54
- "@xyo-network/witness-timestamp": "~5.1.2"
39
+ "@xylabs/array": "~5.0.33",
40
+ "@xylabs/assert": "~5.0.33",
41
+ "@xylabs/exists": "~5.0.33",
42
+ "@xylabs/object": "~5.0.33",
43
+ "@xyo-network/archivist-model": "~5.1.23",
44
+ "@xyo-network/archivist-wrapper": "~5.1.23",
45
+ "@xyo-network/boundwitness-model": "~5.1.23",
46
+ "@xyo-network/boundwitness-validator": "~5.1.23",
47
+ "@xyo-network/diviner-abstract": "~5.1.23",
48
+ "@xyo-network/diviner-indexing": "~5.1.23",
49
+ "@xyo-network/diviner-model": "~5.1.23",
50
+ "@xyo-network/diviner-payload-model": "~5.1.23",
51
+ "@xyo-network/diviner-wrapper": "~5.1.23",
52
+ "@xyo-network/image-thumbnail-payload-plugin": "~5.1.4",
53
+ "@xyo-network/module-model": "~5.1.23",
54
+ "@xyo-network/payload-builder": "~5.1.23",
55
+ "@xyo-network/payload-model": "~5.1.23",
56
+ "@xyo-network/url-payload-plugin": "~5.1.4",
57
+ "@xyo-network/witness-timestamp": "~5.1.23"
55
58
  },
56
59
  "devDependencies": {
57
- "@xylabs/delay": "~5.0.11",
58
- "@xylabs/hex": "~5.0.11",
59
- "@xylabs/ts-scripts-yarn3": "~7.1.7",
60
- "@xylabs/tsconfig": "~7.1.7",
61
- "@xylabs/vitest-extended": "~5.0.11",
62
- "@xyo-network/archivist-memory": "~5.1.2",
63
- "@xyo-network/boundwitness-builder": "~5.1.2",
64
- "@xyo-network/diviner-boundwitness-memory": "~5.1.2",
65
- "@xyo-network/diviner-payload-generic": "~5.1.2",
66
- "@xyo-network/manifest": "~5.1.2",
67
- "@xyo-network/module-factory-locator": "~5.1.2",
68
- "@xyo-network/node-memory": "~5.1.2",
69
- "@xyo-network/wallet": "~5.1.2",
60
+ "@xylabs/delay": "~5.0.33",
61
+ "@xylabs/hex": "~5.0.33",
62
+ "@xylabs/ts-scripts-yarn3": "~7.2.8",
63
+ "@xylabs/tsconfig": "~7.2.8",
64
+ "@xylabs/vitest-extended": "~5.0.33",
65
+ "@xyo-network/archivist-memory": "~5.1.23",
66
+ "@xyo-network/boundwitness-builder": "~5.1.23",
67
+ "@xyo-network/diviner-boundwitness-memory": "~5.1.23",
68
+ "@xyo-network/diviner-payload-generic": "~5.1.23",
69
+ "@xyo-network/manifest": "~5.1.23",
70
+ "@xyo-network/module-factory-locator": "~5.1.23",
71
+ "@xyo-network/node-memory": "~5.1.23",
72
+ "@xyo-network/wallet": "~5.1.23",
70
73
  "typescript": "~5.9.2",
71
74
  "vitest": "~3.2.4"
72
75
  },
@@ -45,8 +45,8 @@ export class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends Ab
45
45
  // eslint-disable-next-line unicorn/no-array-reduce
46
46
  const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(
47
47
  (acc, curr) => {
48
- const imageThumbnailIndex = curr.payload_schemas?.findIndex(schema => schema === ImageThumbnailSchema)
49
- const timestampIndex = curr.payload_schemas?.findIndex(schema => schema === TimestampSchema)
48
+ const imageThumbnailIndex = curr.payload_schemas?.indexOf(ImageThumbnailSchema)
49
+ const timestampIndex = curr.payload_schemas?.indexOf(TimestampSchema)
50
50
  const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]
51
51
  const timestampHash = curr.payload_hashes?.[timestampIndex]
52
52
  const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as ImageThumbnail | undefined
@@ -5,7 +5,7 @@ import { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema.ts'
5
5
 
6
6
  export type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`
7
7
  export const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema
8
- = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`
8
+ = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`
9
9
 
10
10
  export type ImageThumbnailStateToIndexCandidateDivinerConfig = DivinerConfig<{
11
11
  payloadDivinerLimit?: number
@@ -86,7 +86,7 @@ export class ImageThumbnailStateToIndexCandidateDiviner<
86
86
  }
87
87
 
88
88
  protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {
89
- const indexes = payload_schemas.map(schema => bw.payload_schemas?.findIndex(s => s === schema))
89
+ const indexes = payload_schemas.map(schema => bw.payload_schemas?.indexOf(schema))
90
90
  const hashes = indexes.map(index => bw.payload_hashes?.[index])
91
91
  const results = await archivist.get(hashes)
92
92
  const filteredResults = indexCandidateIdentityFunctions.map(is => results.find(is))
@@ -2,4 +2,4 @@ import { ImageThumbnailDivinerSchema } from '@xyo-network/image-thumbnail-payloa
2
2
 
3
3
  export type ImageThumbnailStateToIndexCandidateDivinerSchema = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`
4
4
  export const ImageThumbnailStateToIndexCandidateDivinerSchema: ImageThumbnailStateToIndexCandidateDivinerSchema
5
- = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`
5
+ = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Diviner.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Diviner.spec.d.ts","sourceRoot":"","sources":["../../../../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/spec/Diviner.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=Diviner.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Diviner.spec.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/spec/Diviner.spec.ts"],"names":[],"mappings":"AACA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.spec.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/spec/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.spec.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/spec/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,2 +0,0 @@
1
- import '@xylabs/vitest-extended';
2
- //# sourceMappingURL=ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.spec.d.ts","sourceRoot":"","sources":["../../../../src/Diviner/spec/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.spec.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAA"}
@@ -1,175 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import { filterAs } from '@xylabs/array'
4
- import { assertEx } from '@xylabs/assert'
5
- import { delay } from '@xylabs/delay'
6
- import { MemoryArchivist } from '@xyo-network/archivist-memory'
7
- import { asArchivistInstance } from '@xyo-network/archivist-model'
8
- import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
9
- import { isBoundWitness } from '@xyo-network/boundwitness-model'
10
- import { MemoryBoundWitnessDiviner } from '@xyo-network/diviner-boundwitness-memory'
11
- import { asDivinerInstance } from '@xyo-network/diviner-model'
12
- import { GenericPayloadDiviner } from '@xyo-network/diviner-payload-generic'
13
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
14
- import { isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
15
- import type { PackageManifestPayload } from '@xyo-network/manifest'
16
- import { ManifestWrapper } from '@xyo-network/manifest'
17
- import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
18
- import type { ModuleState } from '@xyo-network/module-model'
19
- import { isModuleState, ModuleStateSchema } from '@xyo-network/module-model'
20
- import { PayloadBuilder } from '@xyo-network/payload-builder'
21
- import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
22
- import { asOptionalStorageMeta } from '@xyo-network/payload-model'
23
- import { HDWallet } from '@xyo-network/wallet'
24
- import type { TimeStamp } from '@xyo-network/witness-timestamp'
25
- import { isTimestamp, TimestampSchema } from '@xyo-network/witness-timestamp'
26
- import {
27
- beforeAll,
28
- describe, expect,
29
- it,
30
- } from 'vitest'
31
-
32
- import type { ImageThumbnailDivinerState } from '../../ImageThumbnailDivinerState.ts'
33
- import { ImageThumbnailStateToIndexCandidateDiviner } from '../Diviner.ts'
34
- import ImageThumbnailStateToIndexCandidateDivinerManifest from './ImageThumbnailStateToIndexCandidateDiviner.json' with { type: 'json' }
35
-
36
- /**
37
- * @group slow
38
- */
39
- describe('ImageThumbnailStateToIndexCandidateDiviner', () => {
40
- const sourceUrl = 'https://placekitten.com/200/300'
41
- const thumbnailHttpSuccess: ImageThumbnail = {
42
- http: { status: 200 },
43
- schema: 'network.xyo.image.thumbnail',
44
- sourceHash: '7f39363514d9d9b958a5a993edeba35cb44f912c7072ed9ddd628728ac0fd681',
45
- sourceUrl,
46
- url: 'data:image/png;base64,===',
47
- }
48
-
49
- const thumbnailHttpFail: ImageThumbnail = {
50
- http: {
51
- ipAddress: '104.17.96.13',
52
- status: 429,
53
- },
54
- schema: 'network.xyo.image.thumbnail',
55
- sourceUrl,
56
- }
57
-
58
- const thumbnailCodeFail: ImageThumbnail = {
59
- http: { code: 'FAILED' },
60
- schema: 'network.xyo.image.thumbnail',
61
- sourceUrl,
62
- }
63
-
64
- const thumbnailWitnessFail: ImageThumbnail = {
65
- http: { ipAddress: '104.17.96.13' },
66
- schema: 'network.xyo.image.thumbnail',
67
- sourceUrl,
68
- }
69
-
70
- let testCases: WithStorageMeta<Payload>[][] = []
71
- let archivist: MemoryArchivist
72
- let sut: ImageThumbnailStateToIndexCandidateDiviner
73
-
74
- beforeAll(async () => {
75
- const wallet = await HDWallet.random()
76
- const locator = new ModuleFactoryLocator()
77
- locator.register(MemoryArchivist.factory())
78
- locator.register(MemoryBoundWitnessDiviner.factory())
79
- locator.register(GenericPayloadDiviner.factory())
80
- locator.register(ImageThumbnailStateToIndexCandidateDiviner.factory())
81
- const manifest = ImageThumbnailStateToIndexCandidateDivinerManifest as PackageManifestPayload
82
- const manifestWrapper = new ManifestWrapper(manifest, wallet, locator)
83
- const node = await manifestWrapper.loadNodeFromIndex(0)
84
- await node.start()
85
-
86
- const privateModules = manifest.nodes[0].modules?.private ?? []
87
- const publicModules = manifest.nodes[0].modules?.public ?? []
88
- const mods = await node.resolve('*')
89
- expect(mods.length).toBe(privateModules.length + publicModules.length + 1)
90
-
91
- // Insert previously witnessed payloads into thumbnail archivist
92
- const httpSuccessTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 1 }
93
- const [httpSuccessBoundWitness, httpSuccessPayloads] = await new BoundWitnessBuilder()
94
- .payloads([thumbnailHttpSuccess, httpSuccessTimestamp])
95
- .build()
96
-
97
- const httpFailTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 2 }
98
- const [httpFailBoundWitness, httpFailPayloads] = await new BoundWitnessBuilder().payloads([thumbnailHttpFail, httpFailTimestamp]).build()
99
-
100
- const witnessFailTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 3 }
101
- const [witnessFailBoundWitness, witnessFailPayloads] = await new BoundWitnessBuilder()
102
- .payloads([thumbnailWitnessFail, witnessFailTimestamp])
103
- .build()
104
-
105
- const codeFailTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 4 }
106
- const [codeFailBoundWitness, codeFailPayloads] = await new BoundWitnessBuilder().payloads([thumbnailCodeFail, codeFailTimestamp]).build()
107
-
108
- archivist = assertEx(asArchivistInstance<MemoryArchivist>(await node.resolve('ImageThumbnailArchivist')))
109
- const testCasesToCreate = [
110
- [httpSuccessBoundWitness, ...httpSuccessPayloads],
111
- [httpFailBoundWitness, ...httpFailPayloads],
112
- [witnessFailBoundWitness, ...witnessFailPayloads],
113
- [codeFailBoundWitness, ...codeFailPayloads],
114
- ]
115
-
116
- for (const [bw, ...payloads] of testCasesToCreate) {
117
- const createdTestCase = []
118
- for (const payload of [bw, ...payloads]) {
119
- await delay(2)
120
- const [signedPayload] = await archivist.insert([payload])
121
- createdTestCase.push(signedPayload)
122
- }
123
- testCases.push(createdTestCase)
124
- }
125
-
126
- sut = assertEx(asDivinerInstance(await node.resolve('ImageThumbnailStateToIndexCandidateDiviner'))) as ImageThumbnailStateToIndexCandidateDiviner
127
- })
128
-
129
- describe('divine', () => {
130
- describe('with no previous state', () => {
131
- it('returns next state and batch results', async () => {
132
- const results = await sut.divine()
133
- expect(results.length).toBe(testCases.flat().length + 1)
134
- const state = results.find(isModuleState<ImageThumbnailDivinerState>) as WithStorageMeta<ModuleState<ImageThumbnailDivinerState>>
135
- expect(state).toBeDefined()
136
- const last = filterAs(results, asOptionalStorageMeta)
137
- .map(p => p as WithStorageMeta<Payload>)
138
- .sort(PayloadBuilder.compareStorageMeta)
139
- .at(-1)
140
- expect(last).toBeDefined()
141
- expect(state?.state.cursor).toBe(last?._sequence)
142
- })
143
- })
144
- describe('with previous state', () => {
145
- it.each([1, 2, 3])('returns next state and batch results', async (batch) => {
146
- const all = (await archivist.all()).sort(PayloadBuilder.compareStorageMeta)
147
- const batchOffset = all.at((3 * batch) - 1)
148
- expect(batchOffset).toBeDefined()
149
- // Test across all offsets
150
- const cursor = assertEx(batchOffset)._sequence
151
- const lastState: ModuleState<ImageThumbnailDivinerState> = { schema: ModuleStateSchema, state: { cursor } }
152
- const results = await sut.divine([lastState])
153
-
154
- // Validate expected results length
155
- // [BW, ImageThumbnail, TimeStamp] + 1 [ModuleState]
156
- const expectedResults = testCases.slice(batch).flat().length + 1
157
- expect(results.length).toBe(expectedResults)
158
-
159
- // Validate expected state
160
- const nextState = results.find(isModuleState<ImageThumbnailDivinerState>)
161
- expect(nextState).toBeDefined()
162
- expect(nextState?.state?.cursor).toBeDefined()
163
- expect(nextState?.state.cursor).toBe(testCases?.at(-1)?.at(-1)?._sequence)
164
-
165
- // Validate expected individual results
166
- const bws = results.filter(isBoundWitness)
167
- expect(bws.length).toBeGreaterThan(0)
168
- const images = results.filter(isImageThumbnail)
169
- expect(images.length).toBeGreaterThan(0)
170
- const timestamps = results.filter(isTimestamp)
171
- expect(timestamps.length).toBeGreaterThan(0)
172
- })
173
- })
174
- })
175
- })
@@ -1,261 +0,0 @@
1
- /* eslint-disable max-statements */
2
- import '@xylabs/vitest-extended'
3
-
4
- import { assertEx } from '@xylabs/assert'
5
- import { delay } from '@xylabs/delay'
6
- import { MemoryArchivist } from '@xyo-network/archivist-memory'
7
- import { asArchivistInstance } from '@xyo-network/archivist-model'
8
- import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
9
- import { isBoundWitnessWithStorageMeta } from '@xyo-network/boundwitness-model'
10
- import { MemoryBoundWitnessDiviner } from '@xyo-network/diviner-boundwitness-memory'
11
- import { asDivinerInstance } from '@xyo-network/diviner-model'
12
- import { GenericPayloadDiviner } from '@xyo-network/diviner-payload-generic'
13
- import type {
14
- ImageThumbnail,
15
- ImageThumbnailDivinerQuery,
16
- } from '@xyo-network/image-thumbnail-payload-plugin'
17
- import {
18
- ImageThumbnailDivinerQuerySchema,
19
- isImageThumbnailResultIndex,
20
- isImageThumbnailResultWithSources,
21
- } from '@xyo-network/image-thumbnail-payload-plugin'
22
- import type { PackageManifestPayload } from '@xyo-network/manifest'
23
- import { ManifestWrapper } from '@xyo-network/manifest'
24
- import { ModuleFactoryLocator } from '@xyo-network/module-factory-locator'
25
- import type { ModuleState } from '@xyo-network/module-model'
26
- import { isModuleState } from '@xyo-network/module-model'
27
- import type { MemoryNode } from '@xyo-network/node-memory'
28
- import { PayloadBuilder } from '@xyo-network/payload-builder'
29
- import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
30
- import { HDWallet } from '@xyo-network/wallet'
31
- import type { TimeStamp } from '@xyo-network/witness-timestamp'
32
- import { TimestampSchema } from '@xyo-network/witness-timestamp'
33
- import {
34
- beforeAll,
35
- describe, expect,
36
- it,
37
- } from 'vitest'
38
-
39
- import { ImageThumbnailDiviner } from '../Diviner.ts'
40
- import { ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner } from '../ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts'
41
- import { ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner }
42
- from '../ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts'
43
- import { ImageThumbnailQueryToImageThumbnailIndexQueryDiviner } from '../ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts'
44
- import { ImageThumbnailStateToIndexCandidateDiviner } from '../ImageThumbnailStateToIndexCandidateDiviner/index.ts'
45
- import imageThumbnailDivinerManifest from './ImageThumbnailDivinerManifest.json' with { type: 'json' }
46
-
47
- /**
48
- * @group slow
49
- */
50
- describe('ImageThumbnailDiviner', () => {
51
- const sourceUrl = 'https://placekitten.com/200/300'
52
- const thumbnailHttpSuccess: ImageThumbnail = {
53
- http: { status: 200 },
54
- schema: 'network.xyo.image.thumbnail',
55
- sourceHash: '7f39363514d9d9b958a5a993edeba35cb44f912c7072ed9ddd628728ac0fd681',
56
- sourceUrl,
57
- url: 'data:image/png;base64,===',
58
- }
59
-
60
- const thumbnailHttpFail: ImageThumbnail = {
61
- http: {
62
- ipAddress: '104.17.96.13',
63
- status: 429,
64
- },
65
- schema: 'network.xyo.image.thumbnail',
66
- sourceUrl,
67
- }
68
-
69
- const thumbnailCodeFail: ImageThumbnail = {
70
- http: { code: 'FAILED' },
71
- schema: 'network.xyo.image.thumbnail',
72
- sourceUrl,
73
- }
74
-
75
- const thumbnailWitnessFail: ImageThumbnail = {
76
- http: { ipAddress: '104.17.96.13' },
77
- schema: 'network.xyo.image.thumbnail',
78
- sourceUrl,
79
- }
80
-
81
- let testCases: WithStorageMeta<Payload>[][] = []
82
- let archivist: MemoryArchivist
83
- let node: MemoryNode
84
- let sut: ImageThumbnailDiviner
85
-
86
- beforeAll(async () => {
87
- const wallet = await HDWallet.random()
88
- const locator = new ModuleFactoryLocator()
89
- locator.register(MemoryArchivist.factory())
90
- locator.register(MemoryBoundWitnessDiviner.factory())
91
- locator.register(GenericPayloadDiviner.factory())
92
- locator.register(ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.factory())
93
- locator.register(ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.factory())
94
- locator.register(ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.factory())
95
- locator.register(ImageThumbnailStateToIndexCandidateDiviner.factory())
96
- locator.register(ImageThumbnailDiviner.factory())
97
- const manifest = imageThumbnailDivinerManifest as PackageManifestPayload
98
- const manifestWrapper = new ManifestWrapper(manifest, wallet, locator)
99
- node = await manifestWrapper.loadNodeFromIndex(0)
100
- await node.start()
101
-
102
- const privateModules = manifest.nodes[0].modules?.private ?? []
103
- const publicModules = manifest.nodes[0].modules?.public ?? []
104
- const mods = await node.resolve('*')
105
- expect(mods.length).toBe(privateModules.length + publicModules.length + 1)
106
-
107
- // Insert previously witnessed payloads into thumbnail archivist
108
- const httpSuccessTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 1 }
109
- const [httpSuccessBoundWitness, httpSuccessPayloads] = await (new BoundWitnessBuilder().payloads([thumbnailHttpSuccess, httpSuccessTimestamp])).build()
110
-
111
- const httpFailTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 2 }
112
- const [httpFailBoundWitness, httpFailPayloads] = await (new BoundWitnessBuilder().payloads([thumbnailHttpFail, httpFailTimestamp])).build()
113
-
114
- const witnessFailTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 3 }
115
- const [witnessFailBoundWitness, witnessFailPayloads] = await (new BoundWitnessBuilder().payloads([thumbnailWitnessFail, witnessFailTimestamp])).build()
116
-
117
- const codeFailTimestamp: TimeStamp = { schema: TimestampSchema, timestamp: 4 }
118
- const [codeFailBoundWitness, codeFailPayloads] = await (new BoundWitnessBuilder().payloads([thumbnailCodeFail, codeFailTimestamp])).build()
119
-
120
- archivist = assertEx(asArchivistInstance<MemoryArchivist>(await node.resolve('ImageThumbnailArchivist')))
121
- const testCasesToCreate = [
122
- [httpSuccessBoundWitness, ...httpSuccessPayloads],
123
- [httpFailBoundWitness, ...httpFailPayloads],
124
- [witnessFailBoundWitness, ...witnessFailPayloads],
125
- [codeFailBoundWitness, ...codeFailPayloads],
126
- ]
127
-
128
- for (const [bw, ...payloads] of testCasesToCreate) {
129
- const createdTestCase = []
130
- for (const payload of [bw, ...payloads]) {
131
- await delay(2)
132
- const [signedPayload] = await archivist.insert([payload])
133
- createdTestCase.push(signedPayload)
134
- }
135
- testCases.push(createdTestCase)
136
- }
137
-
138
- sut = assertEx(asDivinerInstance<ImageThumbnailDiviner>(await node.resolve('ImageThumbnailDiviner')))
139
-
140
- // Allow enough time for diviner to divine
141
- await delay(5000)
142
- }, 40_000)
143
- describe('diviner state', () => {
144
- let stateArchivist: MemoryArchivist
145
- beforeAll(async () => {
146
- const mod = await node.resolve('AddressStateArchivist')
147
- stateArchivist = assertEx(asArchivistInstance<MemoryArchivist>(mod))
148
- })
149
- it('has expected bound witnesses', async () => {
150
- const payloads = await stateArchivist.all()
151
- const stateBoundWitnesses = payloads.filter(isBoundWitnessWithStorageMeta)
152
- expect(stateBoundWitnesses).toBeArrayOfSize(1)
153
- for (const stateBoundWitness of stateBoundWitnesses) {
154
- expect(stateBoundWitness).toBeObject()
155
- expect(stateBoundWitness.addresses).toBeArrayOfSize(1)
156
- expect(stateBoundWitness.addresses).toContain(sut.address)
157
- }
158
- })
159
- it('has expected state', async () => {
160
- const payloads = await stateArchivist.all()
161
- const statePayloads = payloads.filter(isModuleState) as WithStorageMeta<ModuleState>[]
162
- expect(statePayloads).toBeArrayOfSize(1)
163
- expect(statePayloads.at(-1)).toBeObject()
164
- const statePayload = assertEx(statePayloads.at(-1))
165
- expect(statePayload.state).toBeObject()
166
- const lastCursor = PayloadBuilder.sortByStorageMeta(testCases.flat()).at(-1)?._sequence
167
- expect(statePayload.state?.cursor).toBe(lastCursor)
168
- })
169
- })
170
- describe('diviner index', () => {
171
- let indexArchivist: MemoryArchivist
172
- beforeAll(async () => {
173
- const mod = await node.resolve('ImageThumbnailDivinerIndexArchivist')
174
- indexArchivist = assertEx(asArchivistInstance<MemoryArchivist>(mod))
175
- })
176
- // NOTE: We're not signing indexes for performance reasons
177
- it.skip('has expected bound witnesses', async () => {
178
- const payloads = await indexArchivist.all()
179
- const indexBoundWitnesses = payloads.filter(isBoundWitnessWithStorageMeta)
180
- expect(indexBoundWitnesses).toBeArrayOfSize(1)
181
- const indexBoundWitness = indexBoundWitnesses[0]
182
- expect(indexBoundWitness).toBeObject()
183
- expect(indexBoundWitness.addresses).toBeArrayOfSize(1)
184
- expect(indexBoundWitness.addresses).toContain(sut.address)
185
- })
186
- it('has expected index', async () => {
187
- const payloads = await indexArchivist.all()
188
- const indexPayloads = payloads.filter(isImageThumbnailResultIndex)
189
- expect(indexPayloads).toBeArrayOfSize(testCases.length)
190
- })
191
- })
192
- describe('with no thumbnail for the provided URL', () => {
193
- const url = 'https://does.not.exist.io'
194
- const schema = ImageThumbnailDivinerQuerySchema
195
- it('returns nothing', async () => {
196
- const query: ImageThumbnailDivinerQuery = { schema, url }
197
- const result = await sut.divine([query])
198
- expect(result).toBeArrayOfSize(0)
199
- })
200
- })
201
- describe('with thumbnails for the provided URL', () => {
202
- const url = sourceUrl
203
- const schema = ImageThumbnailDivinerQuerySchema
204
- describe('with no filter criteria', () => {
205
- it('returns the most recent success', async () => {
206
- const query: ImageThumbnailDivinerQuery = {
207
- schema, success: true, url,
208
- }
209
- const results = await sut.divine([query])
210
- const result = results.find(isImageThumbnailResultWithSources)
211
- expect(result).toBeDefined()
212
- const expected = await PayloadBuilder.dataHash(thumbnailHttpSuccess)
213
- expect(result?.$sources).toContain(expected)
214
- })
215
- })
216
- describe('with filter criteria', () => {
217
- describe('for status code', () => {
218
- const cases: ImageThumbnail[] = [thumbnailHttpSuccess, thumbnailHttpFail]
219
- it.each(cases)('returns the most recent instance of that status code', async (payload) => {
220
- const { status } = payload.http ?? {}
221
- const query: ImageThumbnailDivinerQuery = {
222
- schema, status, url,
223
- }
224
- const results = await sut.divine([query])
225
- const result = results.find(isImageThumbnailResultWithSources)
226
- expect(result).toBeDefined()
227
- const expected = await PayloadBuilder.dataHash(payload)
228
- expect(result?.$sources).toContain(expected)
229
- })
230
- })
231
- describe('for success (most recent)', () => {
232
- const cases: ImageThumbnail[] = [thumbnailHttpSuccess]
233
- it.each(cases)('returns the most recent instance of that success state', async (payload) => {
234
- const success = !!(payload.url ?? false)
235
- const query: ImageThumbnailDivinerQuery = {
236
- schema, success, url,
237
- }
238
- const results = await sut.divine([query])
239
- const result = results.find(isImageThumbnailResultWithSources)
240
- expect(result).toBeDefined()
241
- const expected = await PayloadBuilder.dataHash(payload)
242
- expect(result?.$sources).toContain(expected)
243
- })
244
- })
245
- describe('for failure (most recent)', () => {
246
- const cases: ImageThumbnail[] = [thumbnailCodeFail]
247
- it.each(cases)('returns the most recent instance of that success state', async (payload) => {
248
- const success = !!(payload.url ?? false)
249
- const query: ImageThumbnailDivinerQuery = {
250
- schema, success, url,
251
- }
252
- const results = await sut.divine([query])
253
- const result = results.find(isImageThumbnailResultWithSources)
254
- expect(result).toBeDefined()
255
- const expected = await PayloadBuilder.dataHash(payload)
256
- expect(result?.$sources).toContain(expected)
257
- })
258
- })
259
- })
260
- })
261
- })
@@ -1,98 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
4
- import type { BoundWitness } from '@xyo-network/boundwitness-model'
5
- import type { ImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'
6
- import { ImageThumbnailSchema, isImageThumbnailResultIndexWithSources } from '@xyo-network/image-thumbnail-payload-plugin'
7
- import { PayloadBuilder } from '@xyo-network/payload-builder'
8
- import type { Payload } from '@xyo-network/payload-model'
9
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
10
- import type { TimeStamp } from '@xyo-network/witness-timestamp'
11
- import { TimestampSchema } from '@xyo-network/witness-timestamp'
12
- import {
13
- beforeAll,
14
- describe, expect, it,
15
- } from 'vitest'
16
-
17
- import { ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner } from '../ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts'
18
-
19
- describe('ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner', () => {
20
- let diviner: ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner
21
- const timestampA = 1_234_567_890
22
- const timestampPayloadA: TimeStamp = { schema: TimestampSchema, timestamp: timestampA }
23
- const imageThumbnailPayloadA: ImageThumbnail = {
24
- http: { status: 200 },
25
- schema: ImageThumbnailSchema,
26
- sourceUrl: 'https://xyo.network',
27
- url: 'data',
28
- }
29
- const timestampB = 1_234_567_891
30
- const timestampPayloadB: TimeStamp = { schema: TimestampSchema, timestamp: timestampB }
31
- const imageThumbnailPayloadB: ImageThumbnail = {
32
- http: { status: 500 },
33
- schema: ImageThumbnailSchema,
34
- sourceUrl: 'https://xyo.network',
35
- }
36
- const validateResult = async (input: [boundWitness: BoundWitness, thumbnail: ImageThumbnail, timestamp: TimeStamp], result: Payload[]) => {
37
- const [boundWitness, thumbnail, timestamp] = input
38
- const payloadDictionary = await PayloadBuilder.toDataHashMap([boundWitness, thumbnail, timestamp])
39
- expect(result).toBeArrayOfSize(1)
40
- expect(result.filter(isImageThumbnailResultIndexWithSources)).toBeArrayOfSize(1)
41
- const index = result.find(isImageThumbnailResultIndexWithSources)
42
- const key = await PayloadBuilder.dataHash({ schema: UrlSchema, url: thumbnail.sourceUrl })
43
- expect(index).toBeDefined()
44
- if (index !== undefined) {
45
- expect(index.key).toBe(key)
46
- expect(index.$sources.toSorted()).toEqual(Object.keys(payloadDictionary).toSorted())
47
- expect(index.success).toBe(thumbnail.http?.status === 200)
48
- expect(index.timestamp).toBe(timestamp.timestamp)
49
- expect(index.status).toBe(thumbnail.http?.status)
50
- }
51
- }
52
- beforeAll(async () => {
53
- diviner = await ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.create({ account: 'random' })
54
- })
55
- describe('divine', () => {
56
- const cases: [ImageThumbnail, TimeStamp][] = [
57
- [imageThumbnailPayloadA, timestampPayloadA],
58
- [imageThumbnailPayloadB, timestampPayloadB],
59
- ]
60
- describe('with single result', () => {
61
- it.each(cases)('transforms single result', async (thumbnail, timestamp) => {
62
- const [boundWitness] = await (new BoundWitnessBuilder().payloads([thumbnail, timestamp])).build()
63
- const result = await diviner.divine([boundWitness, thumbnail, timestamp])
64
- await validateResult([boundWitness, thumbnail, timestamp], result)
65
- })
66
- it.each(cases)('handles sparse inputs', async (thumbnail, timestamp) => {
67
- const [boundWitness] = await (new BoundWitnessBuilder().payloads([thumbnail, timestamp])).build()
68
- expect(await diviner.divine([thumbnail, timestamp])).toBeArrayOfSize(0)
69
- expect(await diviner.divine([boundWitness, timestamp])).toBeArrayOfSize(0)
70
- expect(await diviner.divine([boundWitness, thumbnail])).toBeArrayOfSize(0)
71
- })
72
- })
73
- describe('with multiple results', () => {
74
- it('transforms multiple results', async () => {
75
- const data: [BoundWitness, ImageThumbnail, TimeStamp][] = await Promise.all(
76
- cases.map(async (payloads) => {
77
- const [bw] = await (new BoundWitnessBuilder().payloads(payloads)).build()
78
- return [bw, ...payloads]
79
- }),
80
- )
81
- const results = await diviner.divine(data.flat())
82
- expect(results).toBeArrayOfSize(2)
83
- await Promise.all(
84
- data.map(async (input, i) => {
85
- const result = results[i]
86
- await validateResult(input, [result])
87
- }),
88
- )
89
- })
90
- it('handles sparse inputs', async () => {
91
- const [bw] = await (new BoundWitnessBuilder().payloads(cases[0])).build()
92
- const results = await diviner.divine([bw, ...cases.flat()])
93
- expect(results).toBeArrayOfSize(1)
94
- await validateResult([bw, ...cases[0]], results)
95
- })
96
- })
97
- })
98
- })
@@ -1,120 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import type { Hash } from '@xylabs/hex'
4
- import type {
5
- ImageThumbnailDivinerQuery,
6
- ImageThumbnailResult,
7
- ImageThumbnailResultIndex,
8
- } from '@xyo-network/image-thumbnail-payload-plugin'
9
- import {
10
- ImageThumbnailDivinerQuerySchema,
11
- ImageThumbnailResultIndexSchema,
12
- ImageThumbnailResultSchema,
13
- isImageThumbnailResult,
14
- } from '@xyo-network/image-thumbnail-payload-plugin'
15
- import { PayloadBuilder } from '@xyo-network/payload-builder'
16
- import type { WithSources } from '@xyo-network/payload-model'
17
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
18
- import {
19
- beforeAll,
20
- describe, expect, it,
21
- } from 'vitest'
22
-
23
- import { ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner }
24
- from '../ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts'
25
-
26
- describe('ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner', () => {
27
- const queries: ImageThumbnailDivinerQuery[] = [
28
- {
29
- schema: ImageThumbnailDivinerQuerySchema,
30
- url: 'https://xyo.network',
31
- },
32
- {
33
- schema: ImageThumbnailDivinerQuerySchema,
34
- url: 'https://explore.xyo.network',
35
- },
36
- ]
37
- const indexes: WithSources<ImageThumbnailResultIndex>[][] = [
38
- [
39
- {
40
- key: 'setInBeforeAll' as Hash,
41
- schema: ImageThumbnailResultIndexSchema,
42
- $sources: [],
43
- status: 200,
44
- success: true,
45
- timestamp: 1_234_567_890,
46
- },
47
- ],
48
- [
49
- {
50
- key: 'setInBeforeAll' as Hash,
51
- schema: ImageThumbnailResultIndexSchema,
52
- $sources: [],
53
- status: 200,
54
- success: true,
55
- timestamp: 1_234_567_891,
56
- },
57
- {
58
- key: 'setInBeforeAll' as Hash,
59
- schema: ImageThumbnailResultIndexSchema,
60
- $sources: [],
61
- status: 500,
62
- success: false,
63
- timestamp: 1_234_567_892,
64
- },
65
- ],
66
- ]
67
- let diviner: ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner
68
- beforeAll(async () => {
69
- diviner = await ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.create({ account: 'random' })
70
- await Promise.all(
71
- queries.map(async (query, i) => {
72
- await Promise.all(
73
- indexes[i].map(async (index) => {
74
- index.key = await PayloadBuilder.dataHash({ schema: UrlSchema, url: query.url })
75
- }),
76
- )
77
- }),
78
- )
79
- })
80
- const cases: [ImageThumbnailDivinerQuery, ImageThumbnailResultIndex[]][] = queries.map((query, i) => [query, indexes[i]])
81
- describe('divine', () => {
82
- describe('with single url in index result', () => {
83
- it.each(cases)('transforms single url index results', async (imageThumbnailDivinerQuery, imageThumbnailResultIndex) => {
84
- const results = await diviner.divine([imageThumbnailDivinerQuery, ...imageThumbnailResultIndex])
85
- expect(results).toBeArrayOfSize(imageThumbnailResultIndex.length)
86
- expect(results.filter(isImageThumbnailResult)).toBeArrayOfSize(imageThumbnailResultIndex.length)
87
- for (const [i, result] of (results.filter(isImageThumbnailResult) as ImageThumbnailResult[]).entries()) {
88
- const index = imageThumbnailResultIndex[i]
89
- expect(result.url).toBe(imageThumbnailDivinerQuery.url)
90
- expect(result.success).toBe(index.success)
91
- expect(result.timestamp).toBe(index.timestamp)
92
- expect(result.status).toBe(index.status)
93
- expect(result.schema).toBe(ImageThumbnailResultSchema)
94
- }
95
- })
96
- })
97
- describe('with multiple urls in index result', () => {
98
- it('transforms multiple url index results', async () => {
99
- const indexesLength = indexes.flat().length
100
- const results = await diviner.divine([...queries, ...indexes.flat()])
101
- expect(results).toBeArrayOfSize(indexesLength)
102
- const resultsIndexes = results.filter(isImageThumbnailResult) as ImageThumbnailResult[]
103
- expect(resultsIndexes).toBeArrayOfSize(indexesLength)
104
- let resultsIterator = 0
105
- for (const [i, { url }] of queries.entries()) {
106
- const indexSet = indexes[i]
107
- for (const index of indexSet) {
108
- const result = resultsIndexes[resultsIterator]
109
- expect(result.url).toBe(url)
110
- expect(result.success).toBe(index.success)
111
- expect(result.timestamp).toBe(index.timestamp)
112
- expect(result.status).toBe(index.status)
113
- expect(result.schema).toBe(ImageThumbnailResultSchema)
114
- resultsIterator = ++resultsIterator
115
- }
116
- }
117
- })
118
- })
119
- })
120
- })
@@ -1,145 +0,0 @@
1
- import '@xylabs/vitest-extended'
2
-
3
- import type { ImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'
4
- import { ImageThumbnailDivinerQuerySchema } from '@xyo-network/image-thumbnail-payload-plugin'
5
- import { PayloadBuilder } from '@xyo-network/payload-builder'
6
- import { UrlSchema } from '@xyo-network/url-payload-plugin'
7
- import {
8
- beforeAll,
9
- describe, expect, it,
10
- } from 'vitest'
11
-
12
- import { ImageThumbnailQueryToImageThumbnailIndexQueryDiviner } from '../ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts'
13
- import type { ImageThumbnailResultQuery } from '../ImageThumbnailResultQuery.ts'
14
- import { isImageThumbnailResultQuery } from '../ImageThumbnailResultQuery.ts'
15
-
16
- describe('ImageThumbnailQueryToImageThumbnailIndexQueryDiviner', () => {
17
- let diviner: ImageThumbnailQueryToImageThumbnailIndexQueryDiviner
18
- const queries: ImageThumbnailDivinerQuery[] = [
19
- {
20
- schema: ImageThumbnailDivinerQuerySchema,
21
- url: 'https://xyo.network',
22
- },
23
- {
24
- limit: 10,
25
- order: 'asc',
26
- schema: ImageThumbnailDivinerQuerySchema,
27
- status: 200,
28
- success: true,
29
- url: 'https://xyo.network',
30
- },
31
- {
32
- limit: 10,
33
- schema: ImageThumbnailDivinerQuerySchema,
34
- url: 'https://explore.xyo.network',
35
- },
36
- {
37
- schema: ImageThumbnailDivinerQuerySchema,
38
- url: 'https://explore.xyo.network',
39
- },
40
- {
41
- order: 'asc',
42
- schema: ImageThumbnailDivinerQuerySchema,
43
- url: 'https://explore.xyo.network',
44
- },
45
- {
46
- schema: ImageThumbnailDivinerQuerySchema,
47
- status: 200,
48
- url: 'https://explore.xyo.network',
49
- },
50
- {
51
- schema: ImageThumbnailDivinerQuerySchema,
52
- success: true,
53
- url: 'https://explore.xyo.network',
54
- },
55
- {
56
- schema: ImageThumbnailDivinerQuerySchema,
57
- success: false,
58
- url: 'https://explore.xyo.network',
59
- },
60
- ]
61
- const expected: ImageThumbnailResultQuery[] = [
62
- {
63
- key: 'setInBeforeAll',
64
- limit: 1,
65
- order: 'desc',
66
- schema: 'network.xyo.diviner.payload.query',
67
- } as unknown as ImageThumbnailResultQuery,
68
- {
69
- key: 'setInBeforeAll',
70
- limit: 10,
71
- order: 'asc',
72
- schema: 'network.xyo.diviner.payload.query',
73
- status: 200,
74
- success: true,
75
- } as unknown as ImageThumbnailResultQuery,
76
- {
77
- key: 'setInBeforeAll',
78
- limit: 10,
79
- order: 'desc',
80
- schema: 'network.xyo.diviner.payload.query',
81
- } as unknown as ImageThumbnailResultQuery,
82
- {
83
- key: 'setInBeforeAll',
84
- limit: 1,
85
- order: 'desc',
86
- schema: 'network.xyo.diviner.payload.query',
87
- } as unknown as ImageThumbnailResultQuery,
88
- {
89
- key: 'setInBeforeAll',
90
- limit: 1,
91
- order: 'asc',
92
- schema: 'network.xyo.diviner.payload.query',
93
- } as unknown as ImageThumbnailResultQuery,
94
- {
95
- key: 'setInBeforeAll',
96
- limit: 1,
97
- order: 'desc',
98
- schema: 'network.xyo.diviner.payload.query',
99
- status: 200,
100
- } as unknown as ImageThumbnailResultQuery,
101
- {
102
- key: 'setInBeforeAll',
103
- limit: 1,
104
- order: 'desc',
105
- schema: 'network.xyo.diviner.payload.query',
106
- success: true,
107
- } as unknown as ImageThumbnailResultQuery,
108
- {
109
- key: 'setInBeforeAll',
110
- limit: 1,
111
- order: 'desc',
112
- schema: 'network.xyo.diviner.payload.query',
113
- success: false,
114
- } as unknown as ImageThumbnailResultQuery,
115
- ]
116
- const cases: [ImageThumbnailDivinerQuery, ImageThumbnailResultQuery][] = queries.map((query, i) => [query, expected[i]])
117
- beforeAll(async () => {
118
- diviner = await ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.create({ account: 'random' })
119
-
120
- await Promise.all(
121
- queries.map(async (query, i) => {
122
- const key = await PayloadBuilder.dataHash({ schema: UrlSchema, url: query.url })
123
- expected[i].key = key
124
- }),
125
- )
126
- })
127
- describe('divine', () => {
128
- describe('with single query', () => {
129
- it.each(cases)('transforms query', async (query, expected) => {
130
- const results = await diviner.divine([query])
131
- const actual = results.filter(isImageThumbnailResultQuery)
132
- expect(actual).toBeArrayOfSize(1)
133
- expect(await PayloadBuilder.dataHash(actual?.[0])).toEqual(await PayloadBuilder.dataHash(expected))
134
- })
135
- })
136
- describe('with multiple queries', () => {
137
- it('transforms queries', async () => {
138
- const results = await diviner.divine(queries)
139
- const actual = results.filter(isImageThumbnailResultQuery)
140
- expect(actual).toBeArrayOfSize(expected.length)
141
- expect(await PayloadBuilder.dataHashes(actual)).toEqual(await PayloadBuilder.dataHashes(expected))
142
- })
143
- })
144
- })
145
- })