@xyo-network/diviner-image-thumbnail 2.83.0 → 2.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.cts.map +1 -1
- package/dist/browser/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.mts.map +1 -1
- package/dist/browser/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts.map +1 -1
- package/dist/browser/index.cjs +14 -12
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +14 -12
- package/dist/browser/index.js.map +1 -1
- package/dist/node/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.cts.map +1 -1
- package/dist/node/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.mts.map +1 -1
- package/dist/node/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts.map +1 -1
- package/dist/node/index.js +14 -12
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +14 -12
- package/dist/node/index.mjs.map +1 -1
- package/package.json +24 -24
- package/src/Diviner/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts +1 -1
- package/src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts +14 -12
- package/src/Diviner/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts +1 -1
- package/src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Diviner.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAmClG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAmClG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAmClG"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -92,7 +92,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends imp
|
|
|
92
92
|
const fields = { key, sources, success, timestamp };
|
|
93
93
|
if (status)
|
|
94
94
|
fields.status = status;
|
|
95
|
-
const result = new import_payload_builder.PayloadBuilder({ schema: import_image_thumbnail_payload_plugin.ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
95
|
+
const result = await new import_payload_builder.PayloadBuilder({ schema: import_image_thumbnail_payload_plugin.ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
96
96
|
return [result];
|
|
97
97
|
})
|
|
98
98
|
);
|
|
@@ -124,20 +124,22 @@ var ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner = class
|
|
|
124
124
|
await Promise.all(
|
|
125
125
|
imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {
|
|
126
126
|
const { url } = imageThumbnailDivinerQuery;
|
|
127
|
-
const urlPayload = new import_payload_builder2.PayloadBuilder({ schema: import_url_payload_plugin2.UrlSchema }).fields({ url }).build();
|
|
127
|
+
const urlPayload = await new import_payload_builder2.PayloadBuilder({ schema: import_url_payload_plugin2.UrlSchema }).fields({ url }).build();
|
|
128
128
|
const key = await import_core2.PayloadHasher.hashAsync(urlPayload);
|
|
129
129
|
return [key, url];
|
|
130
130
|
})
|
|
131
131
|
)
|
|
132
132
|
);
|
|
133
|
-
return
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
133
|
+
return (await Promise.all(
|
|
134
|
+
imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {
|
|
135
|
+
const { key, schema, ...commonFields } = imageThumbnailResultIndex;
|
|
136
|
+
const url = keyToUrlDictionary?.[key];
|
|
137
|
+
if (url) {
|
|
138
|
+
const fields = { ...commonFields, url };
|
|
139
|
+
return await new import_payload_builder2.PayloadBuilder({ schema: import_image_thumbnail_payload_plugin2.ImageThumbnailResultSchema }).fields(fields).build();
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
)).filter(import_exists.exists);
|
|
141
143
|
}
|
|
142
144
|
return [];
|
|
143
145
|
}
|
|
@@ -173,7 +175,7 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends import_
|
|
|
173
175
|
fields.success = payloadSuccess;
|
|
174
176
|
if (payloadStatus !== void 0)
|
|
175
177
|
fields.status = payloadStatus;
|
|
176
|
-
return new import_payload_builder3.PayloadBuilder({ schema: import_diviner_payload_model.PayloadDivinerQuerySchema }).fields(fields).build();
|
|
178
|
+
return await new import_payload_builder3.PayloadBuilder({ schema: import_diviner_payload_model.PayloadDivinerQuerySchema }).fields(fields).build();
|
|
177
179
|
})
|
|
178
180
|
);
|
|
179
181
|
return results;
|
|
@@ -236,7 +238,7 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
236
238
|
return [{ schema: import_module_model.ModuleStateSchema, state: { offset: 0 } }];
|
|
237
239
|
const { offset } = lastState.state;
|
|
238
240
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
239
|
-
const query = new import_payload_builder4.PayloadBuilder({ schema: import_diviner_boundwitness_model.BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
241
|
+
const query = await new import_payload_builder4.PayloadBuilder({ schema: import_diviner_boundwitness_model.BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
240
242
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
241
243
|
if (batch.length === 0)
|
|
242
244
|
return [lastState];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../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":["export * from './Diviner'\n","import { IndexingDiviner } from '@xyo-network/diviner-indexing'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return imageThumbnailResultIndexes\n .map((imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n })\n .filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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":["import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","order","import_diviner_payload_model","import_image_thumbnail_payload_plugin","import_exists","import_abstract_diviner","import_boundwitness_model","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_witness_timestamp"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../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":["export * from './Diviner'\n","import { IndexingDiviner } from '@xyo-network/diviner-indexing'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = await new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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 = await new PayloadBuilder<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\n await Promise.all(\n imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return await new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n }),\n )\n ).filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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":["import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","order","import_diviner_payload_model","import_image_thumbnail_payload_plugin","import_exists","import_abstract_diviner","import_boundwitness_model","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_witness_timestamp"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -62,7 +62,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends Abs
|
|
|
62
62
|
const fields = { key, sources, success, timestamp };
|
|
63
63
|
if (status)
|
|
64
64
|
fields.status = status;
|
|
65
|
-
const result = new PayloadBuilder({ schema: ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
65
|
+
const result = await new PayloadBuilder({ schema: ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
66
66
|
return [result];
|
|
67
67
|
})
|
|
68
68
|
);
|
|
@@ -98,20 +98,22 @@ var ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner = class
|
|
|
98
98
|
await Promise.all(
|
|
99
99
|
imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {
|
|
100
100
|
const { url } = imageThumbnailDivinerQuery;
|
|
101
|
-
const urlPayload = new PayloadBuilder2({ schema: UrlSchema2 }).fields({ url }).build();
|
|
101
|
+
const urlPayload = await new PayloadBuilder2({ schema: UrlSchema2 }).fields({ url }).build();
|
|
102
102
|
const key = await PayloadHasher2.hashAsync(urlPayload);
|
|
103
103
|
return [key, url];
|
|
104
104
|
})
|
|
105
105
|
)
|
|
106
106
|
);
|
|
107
|
-
return
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
107
|
+
return (await Promise.all(
|
|
108
|
+
imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {
|
|
109
|
+
const { key, schema, ...commonFields } = imageThumbnailResultIndex;
|
|
110
|
+
const url = keyToUrlDictionary?.[key];
|
|
111
|
+
if (url) {
|
|
112
|
+
const fields = { ...commonFields, url };
|
|
113
|
+
return await new PayloadBuilder2({ schema: ImageThumbnailResultSchema }).fields(fields).build();
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
)).filter(exists);
|
|
115
117
|
}
|
|
116
118
|
return [];
|
|
117
119
|
}
|
|
@@ -147,7 +149,7 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends Abstrac
|
|
|
147
149
|
fields.success = payloadSuccess;
|
|
148
150
|
if (payloadStatus !== void 0)
|
|
149
151
|
fields.status = payloadStatus;
|
|
150
|
-
return new PayloadBuilder3({ schema: PayloadDivinerQuerySchema }).fields(fields).build();
|
|
152
|
+
return await new PayloadBuilder3({ schema: PayloadDivinerQuerySchema }).fields(fields).build();
|
|
151
153
|
})
|
|
152
154
|
);
|
|
153
155
|
return results;
|
|
@@ -210,7 +212,7 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
210
212
|
return [{ schema: ModuleStateSchema, state: { offset: 0 } }];
|
|
211
213
|
const { offset } = lastState.state;
|
|
212
214
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
213
|
-
const query = new PayloadBuilder4({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
215
|
+
const query = await new PayloadBuilder4({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
214
216
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
215
217
|
if (batch.length === 0)
|
|
216
218
|
return [lastState];
|
|
@@ -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'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return imageThumbnailResultIndexes\n .map((imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n })\n .filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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":";AAAA,SAAS,uBAAuB;;;ACazB,IAAM,8BAA2D;AAAA,EACtE,+BAA+B;AACjC;;;ADXO,IAAM,wBAAN,cAAoC,gBAAgB;AAAA,EACzD,OAAO,SAAsC;AAC/C;;;AENA,SAAS,uBAAuB;AAChC,SAAuB,sBAAsB;AAC7C,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AACpC;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAE/B,SAAS,iBAAiB;AAC1B,SAAS,aAAwB,uBAAuB;AAOjD,IAAM,2DAAN,cAAuE,gBAAgB;AAAA,EAC5F,OAAgB,gBAAgB,CAAC,mBAAmB;AAAA,EACpD,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAyC;AACrG,UAAM,MAAsB,SAAS,OAAO,cAAc;AAC1D,UAAM,yBAA2C,SAAS,OAAO,gBAAgB;AACjF,UAAM,oBAAiC,SAAS,OAAO,WAAW;AAClE,QAAI,IAAI,UAAU,uBAAuB,UAAU,kBAAkB,QAAQ;AAC3E,YAAM,oBAAoB,MAAM,cAAc,MAAM,QAAQ;AAC5D,YAAM,SAAsD,IAAI;AAAA,QAC9D,CAAC,KAAK,SAAS;AACb,gBAAM,sBAAsB,KAAK,iBAAiB,UAAU,CAAC,WAAW,WAAW,oBAAoB;AACvG,gBAAM,iBAAiB,KAAK,iBAAiB,UAAU,CAAC,WAAW,WAAW,eAAe;AAC7F,gBAAM,qBAAqB,KAAK,iBAAiB,mBAAmB;AACpE,gBAAM,gBAAgB,KAAK,iBAAiB,cAAc;AAC1D,gBAAM,wBAAwB,CAAC,kBAAkB,kBAAkB,CAAC,EAAE,KAAK,gBAAgB;AAC3F,gBAAM,mBAAmB,CAAC,kBAAkB,aAAa,CAAC,EAAE,KAAK,WAAW;AAC5E,cAAI,yBAAyB;AAAkB,gBAAI,KAAK,CAAC,MAAM,uBAAuB,gBAAgB,CAAC;AACvG,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,uBAAuB,gBAAgB,MAAM;AAClE,gBAAM,EAAE,WAAW,IAAI,IAAI;AAC3B,gBAAM,EAAE,UAAU,IAAI;AACtB,gBAAM,SAAS,sBAAsB,MAAM;AAC3C,gBAAM,UAAU,CAAC,CAAC,sBAAsB;AACxC,gBAAM,WAAW,MAAM,cAAc,UAAU,CAAC,IAAI,uBAAuB,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI;AACrH,gBAAM,aAAa,EAAE,QAAQ,WAAW,IAAI;AAC5C,gBAAM,MAAM,MAAM,cAAc,UAAU,UAAU;AACpD,gBAAM,SAA0C,EAAE,KAAK,SAAS,SAAS,UAAU;AACnF,cAAI;AAAQ,mBAAO,SAAS;AAC5B,gBAAM,SAAoC,IAAI,eAA0C,EAAE,QAAQ,gCAAgC,CAAC,EAChI,OAAO,MAAM,EACb,MAAM;AACT,iBAAO,CAAC,MAAM;AAAA,QAChB,CAAC;AAAA,MACH;AACA,aAAO,QAAQ,KAAK;AAAA,IACtB;AACA,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AACF;;;ACrEA,SAAS,cAAc;AACvB,SAAS,mBAAAA,wBAAuB;AAChC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,uBAAAC,4BAA2B;AACpC;AAAA,EAGE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAAC,uBAAsB;AAE/B,SAAS,aAAAC,kBAAiB;AAOnB,IAAM,uEAAN,cAAmFC,iBAAgB;AAAA,EACxG,OAAgB,gBAAgB,CAACC,oBAAmB;AAAA,EACpD,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAoC;AAEhG,UAAM,+BAA+B,SAAS,OAAO,4BAA4B;AACjF,UAAM,8BAA8B,SAAS,OAAO,2BAA2B;AAG/E,QAAI,6BAA6B,UAAU,4BAA4B,QAAQ;AAE7E,YAAM,qBAAqB,OAAO;AAAA,QAChC,MAAM,QAAQ;AAAA,UACZ,6BAA6B,IAAI,OAAO,+BAA+B;AACrE,kBAAM,EAAE,IAAI,IAAI;AAChB,kBAAM,aAAa,IAAIC,gBAAqC,EAAE,QAAQC,WAAU,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;AACzG,kBAAM,MAAM,MAAMC,eAAc,UAAU,UAAU;AACpD,mBAAO,CAAC,KAAK,GAAG;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,4BACJ,IAAI,CAAC,8BAA8B;AAElC,cAAM,EAAE,KAAK,QAAQ,GAAG,aAAa,IAAI;AACzC,cAAM,MAAM,qBAAqB,GAAG;AACpC,YAAI,KAAK;AACP,gBAAM,SAAqC,EAAE,GAAG,cAAc,IAAI;AAClE,iBAAO,IAAIF,gBAAqC,EAAE,QAAQ,2BAA2B,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM;AAAA,QAC/G;AAAA,MACF,CAAC,EACA,OAAO,MAAM;AAAA,IAClB;AACA,WAAO,CAAC;AAAA,EACV;AACF;;;AC5DA,SAAS,mBAAAG,wBAAuB;AAChC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,uBAAAC,4BAA2B;AACpC,SAAS,iCAAiC;AAC1C,SAAS,gCAAAC,qCAAoC;AAC7C,SAAS,kBAAAC,uBAAsB;AAE/B,SAAS,aAAAC,kBAAiB;AAQnB,IAAM,uDAAN,cAAmEC,iBAAgB;AAAA,EACxF,OAAgB,gBAAgB,CAACC,oBAAmB;AAAA,EACpD,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EACA,MAAyB,cAAc,WAAsB,CAAC,GAAyC;AACrG,UAAM,UAAU,SAAS,OAAOC,6BAA4B;AAC5D,QAAI,QAAQ,QAAQ;AAClB,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,QAAQ,IAAI,OAAO,UAAU;AAC3B,gBAAM,EAAE,OAAO,cAAc,QAAQ,eAAe,OAAO,cAAc,QAAQ,eAAe,SAAS,gBAAgB,IAAI,IAAI;AACjI,gBAAM,QAAQ,gBAAgB;AAC9B,gBAAMC,SAAQ,gBAAgB;AAC9B,gBAAM,SAAS,iBAAiB;AAChC,gBAAM,aAAa,EAAE,QAAQC,YAAW,IAAI;AAC5C,gBAAM,MAAM,MAAMC,eAAc,UAAU,UAAU;AACpD,gBAAM,SAA6C,EAAE,KAAK,OAAO,QAAQ,OAAAF,OAAM;AAC/E,cAAI,mBAAmB;AAAW,mBAAO,UAAU;AACnD,cAAI,kBAAkB;AAAW,mBAAO,SAAS;AACjD,iBAAO,IAAIG,gBAA0C,EAAE,QAAQ,0BAA0B,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM;AAAA,QACnH,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AACF;;;AC1CA,SAAqC,6BAAAC,kCAAiC;AAEtE,SAAS,6BAA6B;AAgB/B,IAAM,8BAA8B,sBAAiDA,0BAAyB;;;AClBrH,SAAS,mCAAmC;AAGrC,IAAM,mDAAqG,GAAG,2BAA2B;;;ACGzI,IAAM,yDAAiH,GAAG,gDAAgD;;;ACNjL,SAAS,gBAAgB;AACzB,SAAS,UAAAC,eAAc;AACvB,SAAS,mBAAAC,wBAAuB;AAEhC,SAAS,wBAAwB;AACjC,SAAuB,kBAAAC,uBAAsB;AAC7C,SAA0C,sCAAsC;AAChF,SAAS,uBAAAC,4BAA2B;AACpC,SAAS,sBAAsB;AAC/B,SAAyB,wBAAAC,uBAAsB,oBAAAC,yBAAwB;AACvE,SAAS,eAA4B,yBAAyB;AAC9D,SAAS,kBAAAC,uBAAsB;AAE/B,SAAS,eAAAC,cAAwB,mBAAAC,wBAAuB;AA6BxD,IAAM,kBAAkB,CAACC,uBAAsBC,gBAAe;AAK9D,IAAM,kCAAkC,CAACC,mBAAkBC,YAAW;AAKtE,IAAM,QAAQ;AAKd,IAAM,aAAa;AAKZ,IAAM,6CAAN,MAAM,oDAEHC,iBAAyB;AAAA,EACjC,OAAgB,gBAAgB,CAACC,sBAAqB,sDAAsD;AAAA,EAC5G,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,OAAO,uBAAuB;AAAA,EAC5C;AAAA,EAEA,aAAuB,0BAA0B,IAAkB,WAAqE;AACtI,UAAM,UAAU,gBAAgB,IAAI,CAAC,WAAW,GAAG,iBAAiB,UAAU,CAAC,MAAM,MAAM,MAAM,CAAC;AAClG,UAAM,SAAS,QAAQ,IAAI,CAAC,UAAU,GAAG,iBAAiB,KAAK,CAAC;AAChE,UAAM,UAAU,MAAM,UAAU,IAAI,MAAM;AAC1C,UAAM,kBAAkB,gCAAgC,IAAI,CAAC,OAAO,QAAQ,KAAK,EAAE,CAAC;AACpF,QAAI,gBAAgB,KAAK,CAAC,MAAM,MAAM,MAAS;AAAG,aAAO;AACzD,UAAM,kBAAoC,gBAAgB,OAAOC,OAAM;AACvE,WAAO,CAAC,IAAI,GAAG,eAAe;AAAA,EAChC;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAgE;AAE5H,UAAM,YAAY,SAAS,KAAK,aAAyC;AAEzE,QAAI,CAAC;AAAW,aAAO,CAAC,EAAE,QAAQ,mBAAmB,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;AAE3E,UAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,UAAM,sBAAsB,MAAM,KAAK,+BAA+B;AACtE,UAAM,QAAQ,IAAIC,gBAAgD,EAAE,QAAQ,+BAA+B,CAAC,EACzG,OAAO,EAAE,OAAO,KAAK,qBAAqB,QAAQ,OAAO,gBAAgB,CAAC,EAC1E,MAAM;AACT,UAAM,QAAQ,MAAM,oBAAoB,OAAO,CAAC,KAAK,CAAC;AACtD,QAAI,MAAM,WAAW;AAAG,aAAO,CAAC,SAAS;AAEzC,UAAM,kBAAkB,MAAM,KAAK,qBAAqB;AACxD,UAAM,mBACJ,MAAM,QAAQ;AAAA,MACZ,MAAM,OAAOC,eAAc,EAAE,IAAI,CAAC,OAAO,4CAA2C,0BAA0B,IAAI,eAAe,CAAC;AAAA,IACpI,GAEC,OAAOF,OAAM,EACb,KAAK;AACR,UAAM,YAAY,EAAE,QAAQ,mBAAmB,OAAO,EAAE,GAAG,UAAU,OAAO,QAAQ,SAAS,MAAM,OAAO,EAAE;AAC5G,WAAO,CAAC,WAAW,GAAG,eAAe;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,uBAAuB;AACrC,UAAM,OAAO,SAAS,KAAK,QAAQ,cAAc,WAAW,MAAM,GAAG,UAAU,mDAAmD;AAClI,UAAM,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,UAAU,4CAA4C;AAC9G,WAAO,iBAAiB,KAAK,KAAK,KAAK,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,iCAAiC;AAC/C,UAAM,OAAO;AAAA,MACX,KAAK,QAAQ,cAAc;AAAA,MAC3B,MAAM,GAAG,UAAU;AAAA,IACrB;AACA,UAAM,MAAM,SAAS,MAAM,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,UAAU,sDAAsD;AACxH,WAAO,eAAe,KAAK,KAAK,KAAK,OAAO;AAAA,EAC9C;AACF;","names":["AbstractDiviner","PayloadHasher","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","PayloadHasher","AbstractDiviner","PayloadHasher","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadHasher","PayloadBuilder","PayloadDivinerQuerySchema","exists","AbstractDiviner","isBoundWitness","DivinerConfigSchema","ImageThumbnailSchema","isImageThumbnail","PayloadBuilder","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","DivinerConfigSchema","exists","PayloadBuilder","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'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = await new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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 = await new PayloadBuilder<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\n await Promise.all(\n imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return await new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n }),\n )\n ).filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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","PayloadHasher","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","PayloadHasher","AbstractDiviner","PayloadHasher","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadHasher","PayloadBuilder","PayloadDivinerQuerySchema","exists","AbstractDiviner","isBoundWitness","DivinerConfigSchema","ImageThumbnailSchema","isImageThumbnail","PayloadBuilder","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","DivinerConfigSchema","exists","PayloadBuilder","isBoundWitness"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAmClG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAmClG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.d.ts","sourceRoot":"","sources":["../../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG/D,OAAO,EACL,oBAAoB,EAKrB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGpD,OAAO,EAA+B,gCAAgC,EAAE,MAAM,+BAA+B,CAAA;AAE7G;;GAEG;AACH,qBAAa,oEAAqE,SAAQ,eAAe;IACvG,OAAgB,aAAa,iCAAwB;IACrD,MAAM,CAAC,MAAM,EAAE,gCAAgC,CAG9C;cAEwB,aAAa,CAAC,QAAQ,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;CAmClG"}
|
package/dist/node/index.js
CHANGED
|
@@ -94,7 +94,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends imp
|
|
|
94
94
|
const fields = { key, sources, success, timestamp };
|
|
95
95
|
if (status)
|
|
96
96
|
fields.status = status;
|
|
97
|
-
const result = new import_payload_builder.PayloadBuilder({ schema: import_image_thumbnail_payload_plugin.ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
97
|
+
const result = await new import_payload_builder.PayloadBuilder({ schema: import_image_thumbnail_payload_plugin.ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
98
98
|
return [result];
|
|
99
99
|
})
|
|
100
100
|
);
|
|
@@ -126,20 +126,22 @@ var ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner = class
|
|
|
126
126
|
await Promise.all(
|
|
127
127
|
imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {
|
|
128
128
|
const { url } = imageThumbnailDivinerQuery;
|
|
129
|
-
const urlPayload = new import_payload_builder2.PayloadBuilder({ schema: import_url_payload_plugin2.UrlSchema }).fields({ url }).build();
|
|
129
|
+
const urlPayload = await new import_payload_builder2.PayloadBuilder({ schema: import_url_payload_plugin2.UrlSchema }).fields({ url }).build();
|
|
130
130
|
const key = await import_core2.PayloadHasher.hashAsync(urlPayload);
|
|
131
131
|
return [key, url];
|
|
132
132
|
})
|
|
133
133
|
)
|
|
134
134
|
);
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
135
|
+
return (await Promise.all(
|
|
136
|
+
imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {
|
|
137
|
+
const { key, schema, ...commonFields } = imageThumbnailResultIndex;
|
|
138
|
+
const url = keyToUrlDictionary == null ? void 0 : keyToUrlDictionary[key];
|
|
139
|
+
if (url) {
|
|
140
|
+
const fields = { ...commonFields, url };
|
|
141
|
+
return await new import_payload_builder2.PayloadBuilder({ schema: import_image_thumbnail_payload_plugin2.ImageThumbnailResultSchema }).fields(fields).build();
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
)).filter(import_exists.exists);
|
|
143
145
|
}
|
|
144
146
|
return [];
|
|
145
147
|
}
|
|
@@ -175,7 +177,7 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends import_
|
|
|
175
177
|
fields.success = payloadSuccess;
|
|
176
178
|
if (payloadStatus !== void 0)
|
|
177
179
|
fields.status = payloadStatus;
|
|
178
|
-
return new import_payload_builder3.PayloadBuilder({ schema: import_diviner_payload_model.PayloadDivinerQuerySchema }).fields(fields).build();
|
|
180
|
+
return await new import_payload_builder3.PayloadBuilder({ schema: import_diviner_payload_model.PayloadDivinerQuerySchema }).fields(fields).build();
|
|
179
181
|
})
|
|
180
182
|
);
|
|
181
183
|
return results;
|
|
@@ -244,7 +246,7 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
244
246
|
return [{ schema: import_module_model.ModuleStateSchema, state: { offset: 0 } }];
|
|
245
247
|
const { offset } = lastState.state;
|
|
246
248
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
247
|
-
const query = new import_payload_builder4.PayloadBuilder({ schema: import_diviner_boundwitness_model.BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
249
|
+
const query = await new import_payload_builder4.PayloadBuilder({ schema: import_diviner_boundwitness_model.BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
248
250
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
249
251
|
if (batch.length === 0)
|
|
250
252
|
return [lastState];
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../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":["export * from './Diviner'\n","import { IndexingDiviner } from '@xyo-network/diviner-indexing'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return imageThumbnailResultIndexes\n .map((imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n })\n .filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,8BAAgC;;;ACazB,IAAM,8BAA2D;AAAA,EACtE,+BAA+B;AACjC;;;ADXO,IAAM,wBAAN,cAAoC,wCAAgB;AAAA,EACzD,OAAO,SAAsC;AAC/C;;;AENA,8BAAgC;AAChC,gCAA6C;AAC7C,kBAA8B;AAC9B,2BAAoC;AACpC,4CAOO;AACP,6BAA+B;AAE/B,gCAA0B;AAC1B,+BAAwD;AAOjD,IAAM,2DAAN,cAAuE,wCAAgB;AAAA,EAC5F,OAAgB,gBAAgB,CAAC,wCAAmB;AAAA,EACpD,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAyC;AACrG,UAAM,MAAsB,SAAS,OAAO,wCAAc;AAC1D,UAAM,yBAA2C,SAAS,OAAO,sDAAgB;AACjF,UAAM,oBAAiC,SAAS,OAAO,oCAAW;AAClE,QAAI,IAAI,UAAU,uBAAuB,UAAU,kBAAkB,QAAQ;AAC3E,YAAM,oBAAoB,MAAM,0BAAc,MAAM,QAAQ;AAC5D,YAAM,SAAsD,IAAI;AAAA,QAC9D,CAAC,KAAK,SAAS;AApCvB;AAqCU,gBAAM,uBAAsB,UAAK,oBAAL,mBAAsB,UAAU,CAAC,WAAW,WAAW;AACnF,gBAAM,kBAAiB,UAAK,oBAAL,mBAAsB,UAAU,CAAC,WAAW,WAAW;AAC9E,gBAAM,sBAAqB,UAAK,mBAAL,mBAAsB;AACjD,gBAAM,iBAAgB,UAAK,mBAAL,mBAAsB;AAC5C,gBAAM,wBAAwB,CAAC,kBAAkB,kBAAkB,CAAC,EAAE,KAAK,sDAAgB;AAC3F,gBAAM,mBAAmB,CAAC,kBAAkB,aAAa,CAAC,EAAE,KAAK,oCAAW;AAC5E,cAAI,yBAAyB;AAAkB,gBAAI,KAAK,CAAC,MAAM,uBAAuB,gBAAgB,CAAC;AACvG,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,uBAAuB,gBAAgB,MAAM;AAjD5E;AAkDU,gBAAM,EAAE,WAAW,IAAI,IAAI;AAC3B,gBAAM,EAAE,UAAU,IAAI;AACtB,gBAAM,UAAS,2BAAsB,SAAtB,mBAA4B;AAC3C,gBAAM,UAAU,CAAC,CAAC,sBAAsB;AACxC,gBAAM,WAAW,MAAM,0BAAc,UAAU,CAAC,IAAI,uBAAuB,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI;AACrH,gBAAM,aAAa,EAAE,QAAQ,qCAAW,IAAI;AAC5C,gBAAM,MAAM,MAAM,0BAAc,UAAU,UAAU;AACpD,gBAAM,SAA0C,EAAE,KAAK,SAAS,SAAS,UAAU;AACnF,cAAI;AAAQ,mBAAO,SAAS;AAC5B,gBAAM,SAAoC,IAAI,sCAA0C,EAAE,QAAQ,sEAAgC,CAAC,EAChI,OAAO,MAAM,EACb,MAAM;AACT,iBAAO,CAAC,MAAM;AAAA,QAChB,CAAC;AAAA,MACH;AACA,aAAO,QAAQ,KAAK;AAAA,IACtB;AACA,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AACF;;;ACrEA,oBAAuB;AACvB,IAAAA,2BAAgC;AAChC,IAAAC,eAA8B;AAC9B,IAAAC,wBAAoC;AACpC,IAAAC,yCAMO;AACP,IAAAC,0BAA+B;AAE/B,IAAAC,6BAA0B;AAOnB,IAAM,uEAAN,cAAmF,yCAAgB;AAAA,EACxG,OAAgB,gBAAgB,CAAC,yCAAmB;AAAA,EACpD,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAoC;AAEhG,UAAM,+BAA+B,SAAS,OAAO,mEAA4B;AACjF,UAAM,8BAA8B,SAAS,OAAO,kEAA2B;AAG/E,QAAI,6BAA6B,UAAU,4BAA4B,QAAQ;AAE7E,YAAM,qBAAqB,OAAO;AAAA,QAChC,MAAM,QAAQ;AAAA,UACZ,6BAA6B,IAAI,OAAO,+BAA+B;AACrE,kBAAM,EAAE,IAAI,IAAI;AAChB,kBAAM,aAAa,IAAI,uCAAqC,EAAE,QAAQ,qCAAU,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM;AACzG,kBAAM,MAAM,MAAM,2BAAc,UAAU,UAAU;AACpD,mBAAO,CAAC,KAAK,GAAG;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,4BACJ,IAAI,CAAC,8BAA8B;AAElC,cAAM,EAAE,KAAK,QAAQ,GAAG,aAAa,IAAI;AACzC,cAAM,MAAM,yDAAqB;AACjC,YAAI,KAAK;AACP,gBAAM,SAAqC,EAAE,GAAG,cAAc,IAAI;AAClE,iBAAO,IAAI,uCAAqC,EAAE,QAAQ,kEAA2B,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM;AAAA,QAC/G;AAAA,MACF,CAAC,EACA,OAAO,oBAAM;AAAA,IAClB;AACA,WAAO,CAAC;AAAA,EACV;AACF;;;AC5DA,IAAAC,2BAAgC;AAChC,IAAAC,eAA8B;AAC9B,IAAAC,wBAAoC;AACpC,mCAA0C;AAC1C,IAAAC,yCAA6C;AAC7C,IAAAC,0BAA+B;AAE/B,IAAAC,6BAA0B;AAQnB,IAAM,uDAAN,cAAmE,yCAAgB;AAAA,EACxF,OAAgB,gBAAgB,CAAC,yCAAmB;AAAA,EACpD,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EACA,MAAyB,cAAc,WAAsB,CAAC,GAAyC;AACrG,UAAM,UAAU,SAAS,OAAO,mEAA4B;AAC5D,QAAI,QAAQ,QAAQ;AAClB,YAAM,UAAU,MAAM,QAAQ;AAAA,QAC5B,QAAQ,IAAI,OAAO,UAAU;AAC3B,gBAAM,EAAE,OAAO,cAAc,QAAQ,eAAe,OAAO,cAAc,QAAQ,eAAe,SAAS,gBAAgB,IAAI,IAAI;AACjI,gBAAM,QAAQ,gBAAgB;AAC9B,gBAAMC,SAAQ,gBAAgB;AAC9B,gBAAM,SAAS,iBAAiB;AAChC,gBAAM,aAAa,EAAE,QAAQ,sCAAW,IAAI;AAC5C,gBAAM,MAAM,MAAM,2BAAc,UAAU,UAAU;AACpD,gBAAM,SAA6C,EAAE,KAAK,OAAO,QAAQ,OAAAA,OAAM;AAC/E,cAAI,mBAAmB;AAAW,mBAAO,UAAU;AACnD,cAAI,kBAAkB;AAAW,mBAAO,SAAS;AACjD,iBAAO,IAAI,uCAA0C,EAAE,QAAQ,uDAA0B,CAAC,EAAE,OAAO,MAAM,EAAE,MAAM;AAAA,QACnH,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AACF;;;AC1CA,IAAAC,gCAAsE;AAEtE,2BAAsC;AAgB/B,IAAM,kCAA8B,4CAAiD,uDAAyB;;;AClBrH,IAAAC,yCAA4C;AAGrC,IAAM,mDAAqG,GAAG,kEAA2B;;;ACGzI,IAAM,yDAAiH,GAAG,gDAAgD;;;ACNjL,oBAAyB;AACzB,IAAAC,iBAAuB;AACvB,IAAAC,2BAAgC;AAEhC,+BAAiC;AACjC,IAAAC,6BAA6C;AAC7C,wCAAgF;AAChF,IAAAC,wBAAoC;AACpC,6BAA+B;AAC/B,IAAAC,yCAAuE;AACvE,0BAA8D;AAC9D,IAAAC,0BAA+B;AAE/B,IAAAC,4BAAwD;AA6BxD,IAAM,kBAAkB,CAAC,6DAAsB,yCAAe;AAK9D,IAAM,kCAAkC,CAAC,yDAAkB,qCAAW;AAKtE,IAAM,QAAQ;AAKd,IAAM,aAAa;AAKZ,IAAM,6CAAN,MAAM,oDAEH,yCAAyB;AAAA,EACjC,OAAgB,gBAAgB,CAAC,2CAAqB,sDAAsD;AAAA,EAC5G,OAAO,SAA2C;AAAA,IAChD,GAAG;AAAA,IACH,6BAA6B;AAAA,EAC/B;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,OAAO,uBAAuB;AAAA,EAC5C;AAAA,EAEA,aAAuB,0BAA0B,IAAkB,WAAqE;AACtI,UAAM,UAAU,gBAAgB,IAAI,CAAC,WAAQ;AA5EjD;AA4EoD,sBAAG,oBAAH,mBAAoB,UAAU,CAAC,MAAM,MAAM;AAAA,KAAO;AAClG,UAAM,SAAS,QAAQ,IAAI,CAAC,UAAO;AA7EvC;AA6E0C,sBAAG,mBAAH,mBAAoB;AAAA,KAAM;AAChE,UAAM,UAAU,MAAM,UAAU,IAAI,MAAM;AAC1C,UAAM,kBAAkB,gCAAgC,IAAI,CAAC,OAAO,QAAQ,KAAK,EAAE,CAAC;AACpF,QAAI,gBAAgB,KAAK,CAAC,MAAM,MAAM,MAAS;AAAG,aAAO;AACzD,UAAM,kBAAoC,gBAAgB,OAAO,qBAAM;AACvE,WAAO,CAAC,IAAI,GAAG,eAAe;AAAA,EAChC;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAgE;AAE5H,UAAM,YAAY,SAAS,KAAK,iCAAyC;AAEzE,QAAI,CAAC;AAAW,aAAO,CAAC,EAAE,QAAQ,uCAAmB,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;AAE3E,UAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,UAAM,sBAAsB,MAAM,KAAK,+BAA+B;AACtE,UAAM,QAAQ,IAAI,uCAAgD,EAAE,QAAQ,iEAA+B,CAAC,EACzG,OAAO,EAAE,OAAO,KAAK,qBAAqB,QAAQ,OAAO,gBAAgB,CAAC,EAC1E,MAAM;AACT,UAAM,QAAQ,MAAM,oBAAoB,OAAO,CAAC,KAAK,CAAC;AACtD,QAAI,MAAM,WAAW;AAAG,aAAO,CAAC,SAAS;AAEzC,UAAM,kBAAkB,MAAM,KAAK,qBAAqB;AACxD,UAAM,mBACJ,MAAM,QAAQ;AAAA,MACZ,MAAM,OAAO,yCAAc,EAAE,IAAI,CAAC,OAAO,4CAA2C,0BAA0B,IAAI,eAAe,CAAC;AAAA,IACpI,GAEC,OAAO,qBAAM,EACb,KAAK;AACR,UAAM,YAAY,EAAE,QAAQ,uCAAmB,OAAO,EAAE,GAAG,UAAU,OAAO,QAAQ,SAAS,MAAM,OAAO,EAAE;AAC5G,WAAO,CAAC,WAAW,GAAG,eAAe;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,uBAAuB;AAnHzC;AAoHI,UAAM,WAAO,yBAAS,gBAAK,WAAL,mBAAa,iBAAb,mBAA2B,WAAW,MAAM,GAAG,UAAU,mDAAmD;AAClI,UAAM,UAAM,wBAAS,MAAM,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,UAAU,4CAA4C;AAC9G,WAAO,0CAAiB,KAAK,KAAK,KAAK,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,iCAAiC;AA7HnD;AA8HI,UAAM,WAAO;AAAA,OACX,gBAAK,WAAL,mBAAa,iBAAb,mBAA2B;AAAA,MAC3B,MAAM,GAAG,UAAU;AAAA,IACrB;AACA,UAAM,UAAM,wBAAS,MAAM,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,UAAU,sDAAsD;AACxH,WAAO,sCAAe,KAAK,KAAK,KAAK,OAAO;AAAA,EAC9C;AACF;","names":["import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","order","import_diviner_payload_model","import_image_thumbnail_payload_plugin","import_exists","import_abstract_diviner","import_boundwitness_model","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_witness_timestamp"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../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":["export * from './Diviner'\n","import { IndexingDiviner } from '@xyo-network/diviner-indexing'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = await new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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 = await new PayloadBuilder<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\n await Promise.all(\n imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return await new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n }),\n )\n ).filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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":["import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_abstract_diviner","import_core","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","order","import_diviner_payload_model","import_image_thumbnail_payload_plugin","import_exists","import_abstract_diviner","import_boundwitness_model","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_witness_timestamp"]}
|
package/dist/node/index.mjs
CHANGED
|
@@ -64,7 +64,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends Abs
|
|
|
64
64
|
const fields = { key, sources, success, timestamp };
|
|
65
65
|
if (status)
|
|
66
66
|
fields.status = status;
|
|
67
|
-
const result = new PayloadBuilder({ schema: ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
67
|
+
const result = await new PayloadBuilder({ schema: ImageThumbnailResultIndexSchema }).fields(fields).build();
|
|
68
68
|
return [result];
|
|
69
69
|
})
|
|
70
70
|
);
|
|
@@ -100,20 +100,22 @@ var ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner = class
|
|
|
100
100
|
await Promise.all(
|
|
101
101
|
imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {
|
|
102
102
|
const { url } = imageThumbnailDivinerQuery;
|
|
103
|
-
const urlPayload = new PayloadBuilder2({ schema: UrlSchema2 }).fields({ url }).build();
|
|
103
|
+
const urlPayload = await new PayloadBuilder2({ schema: UrlSchema2 }).fields({ url }).build();
|
|
104
104
|
const key = await PayloadHasher2.hashAsync(urlPayload);
|
|
105
105
|
return [key, url];
|
|
106
106
|
})
|
|
107
107
|
)
|
|
108
108
|
);
|
|
109
|
-
return
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
109
|
+
return (await Promise.all(
|
|
110
|
+
imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {
|
|
111
|
+
const { key, schema, ...commonFields } = imageThumbnailResultIndex;
|
|
112
|
+
const url = keyToUrlDictionary == null ? void 0 : keyToUrlDictionary[key];
|
|
113
|
+
if (url) {
|
|
114
|
+
const fields = { ...commonFields, url };
|
|
115
|
+
return await new PayloadBuilder2({ schema: ImageThumbnailResultSchema }).fields(fields).build();
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
)).filter(exists);
|
|
117
119
|
}
|
|
118
120
|
return [];
|
|
119
121
|
}
|
|
@@ -149,7 +151,7 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends Abstrac
|
|
|
149
151
|
fields.success = payloadSuccess;
|
|
150
152
|
if (payloadStatus !== void 0)
|
|
151
153
|
fields.status = payloadStatus;
|
|
152
|
-
return new PayloadBuilder3({ schema: PayloadDivinerQuerySchema }).fields(fields).build();
|
|
154
|
+
return await new PayloadBuilder3({ schema: PayloadDivinerQuerySchema }).fields(fields).build();
|
|
153
155
|
})
|
|
154
156
|
);
|
|
155
157
|
return results;
|
|
@@ -218,7 +220,7 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
218
220
|
return [{ schema: ModuleStateSchema, state: { offset: 0 } }];
|
|
219
221
|
const { offset } = lastState.state;
|
|
220
222
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
221
|
-
const query = new PayloadBuilder4({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
223
|
+
const query = await new PayloadBuilder4({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
222
224
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
223
225
|
if (batch.length === 0)
|
|
224
226
|
return [lastState];
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -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'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return imageThumbnailResultIndexes\n .map((imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n })\n .filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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","PayloadHasher","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","PayloadHasher","AbstractDiviner","PayloadHasher","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadHasher","PayloadBuilder","PayloadDivinerQuerySchema","exists","AbstractDiviner","isBoundWitness","DivinerConfigSchema","ImageThumbnailSchema","isImageThumbnail","PayloadBuilder","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","DivinerConfigSchema","exists","PayloadBuilder","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'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner {\n static labels: ImageThumbnailDivinerLabels = ImageThumbnailDivinerLabels\n}\n","import { DivinerStageSchema, IndexingDivinerStage } from '@xyo-network/diviner-indexing'\nimport { 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 = {\n 'network.xyo.image.thumbnail': 'diviner',\n}\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 { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnail,\n ImageThumbnailResultIndex,\n ImageThumbnailResultIndexFields,\n ImageThumbnailResultIndexSchema,\n ImageThumbnailSchema,\n isImageThumbnail,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms candidates for image thumbnail indexing into their indexed representation\n */\nexport class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<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 && imageThumbnailPayloads.length && timestampPayloads.length) {\n const payloadDictionary = await PayloadHasher.toMap(payloads)\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)\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp)\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 } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const status = imageThumbnailPayload.http?.status\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources = (await PayloadHasher.hashPairs([bw, imageThumbnailPayload, timestampPayload])).map(([, hash]) => hash)\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result: ImageThumbnailResultIndex = await new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return Promise.resolve([])\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\n ImageThumbnailResult,\n ImageThumbnailResultFields,\n ImageThumbnailResultSchema,\n isImageThumbnailDivinerQuery,\n isImageThumbnailResultIndex,\n} from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\n\n/**\n * Transforms an ImageThumbnailIndex response into an ImageThumbnailResponse response\n */\nexport class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\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(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length && imageThumbnailResultIndexes.length) {\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 = await new PayloadBuilder<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()\n const key = await PayloadHasher.hashAsync(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\n await Promise.all(\n imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { key, schema, ...commonFields } = imageThumbnailResultIndex\n const url = keyToUrlDictionary?.[key]\n if (url) {\n const fields: ImageThumbnailResultFields = { ...commonFields, url }\n return await new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()\n }\n }),\n )\n ).filter(exists)\n }\n return []\n }\n}\n","import { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { PayloadHasher } from '@xyo-network/core'\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 { Payload } from '@xyo-network/payload-model'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from './ImageThumbnailDivinerLabels'\nimport { ImageThumbnailResultQuery } from './ImageThumbnailResultQuery'\n\n/**\n * A diviner that converts ImageThumbnailDivinerQuery to ImageThumbnailResultQuery\n */\nexport class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends AbstractDiviner {\n static override configSchemas = [DivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResultQuery[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { limit: payloadLimit, offset: payloadOffset, order: payloadOrder, status: payloadStatus, success: payloadSuccess, url } = query\n const limit = payloadLimit ?? 1\n const order = payloadOrder ?? 'desc'\n const offset = payloadOffset ?? 0\n const urlPayload = { schema: UrlSchema, url }\n const key = await PayloadHasher.hashAsync(urlPayload)\n const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()\n }),\n )\n return results\n }\n return Promise.resolve([])\n }\n}\n","import { PayloadDivinerQueryPayload, PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { 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 = `${ImageThumbnailDivinerSchema}.stage.stateToIndexCandidateDiviner`\n","import { DivinerConfig } from '@xyo-network/diviner-model'\nimport { SearchableStorage } from '@xyo-network/image-thumbnail-payload-plugin'\n\nimport { ImageThumbnailStateToIndexCandidateDivinerSchema } from './Schema'\n\nexport type ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${ImageThumbnailStateToIndexCandidateDivinerSchema}.config`\nexport const ImageThumbnailStateToIndexCandidateDivinerConfigSchema: ImageThumbnailStateToIndexCandidateDivinerConfigSchema = `${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 { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/abstract-diviner'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-model'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { DivinerWrapper } from '@xyo-network/diviner-wrapper'\nimport { ImageThumbnail, ImageThumbnailSchema, isImageThumbnail } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { isModuleState, ModuleState, ModuleStateSchema } from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { isTimestamp, TimeStamp, TimestampSchema } from '@xyo-network/witness-timestamp'\n\nimport { ImageThumbnailDivinerLabels, ImageThumbnailDivinerStageLabels } from '../ImageThumbnailDivinerLabels'\nimport { ImageThumbnailDivinerState } from '../ImageThumbnailDivinerState'\nimport { ImageThumbnailStateToIndexCandidateDivinerConfigSchema } from './Config'\nimport { ImageThumbnailStateToIndexCandidateDivinerParams } from './Params'\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\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 configSchemas = [DivinerConfigSchema, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static labels: ImageThumbnailDivinerStageLabels = {\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1_000\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.some((f) => f === undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as IndexCandidate[]\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 if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }]\n // Otherwise, get the last offset\n const { offset } = lastState.state\n // Get next batch of results starting from the offset\n const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()\n const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })\n .fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })\n .build()\n const batch = await boundWitnessDiviner.divine([query])\n if (batch.length === 0) return [lastState]\n // Get source data\n const sourceArchivist = await this.getArchivistForStore()\n const indexCandidates: IndexCandidate[] = (\n await Promise.all(\n batch.filter(isBoundWitness).map((bw) => ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist)),\n )\n )\n .filter(exists)\n .flat()\n const nextState = { schema: ModuleStateSchema, state: { ...lastState.state, offset: offset + batch.length } }\n return [nextState, ...indexCandidates]\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","PayloadHasher","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","PayloadHasher","AbstractDiviner","PayloadHasher","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadHasher","PayloadBuilder","PayloadDivinerQuerySchema","exists","AbstractDiviner","isBoundWitness","DivinerConfigSchema","ImageThumbnailSchema","isImageThumbnail","PayloadBuilder","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","DivinerConfigSchema","exists","PayloadBuilder","isBoundWitness"]}
|
package/package.json
CHANGED
|
@@ -12,34 +12,34 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@xylabs/assert": "^2.13.20",
|
|
14
14
|
"@xylabs/exists": "^2.13.20",
|
|
15
|
-
"@xyo-network/abstract-diviner": "^2.
|
|
16
|
-
"@xyo-network/archivist-model": "^2.
|
|
17
|
-
"@xyo-network/archivist-wrapper": "^2.
|
|
18
|
-
"@xyo-network/boundwitness-model": "^2.
|
|
19
|
-
"@xyo-network/core": "^2.
|
|
20
|
-
"@xyo-network/diviner-boundwitness-model": "^2.
|
|
21
|
-
"@xyo-network/diviner-indexing": "^2.
|
|
22
|
-
"@xyo-network/diviner-model": "^2.
|
|
23
|
-
"@xyo-network/diviner-payload-model": "^2.
|
|
24
|
-
"@xyo-network/diviner-wrapper": "^2.
|
|
25
|
-
"@xyo-network/image-thumbnail-payload-plugin": "~2.
|
|
26
|
-
"@xyo-network/module-model": "^2.
|
|
27
|
-
"@xyo-network/payload-builder": "^2.
|
|
28
|
-
"@xyo-network/payload-model": "^2.
|
|
29
|
-
"@xyo-network/url-payload-plugin": "~2.
|
|
30
|
-
"@xyo-network/witness-timestamp": "^2.
|
|
15
|
+
"@xyo-network/abstract-diviner": "^2.84.0",
|
|
16
|
+
"@xyo-network/archivist-model": "^2.84.0",
|
|
17
|
+
"@xyo-network/archivist-wrapper": "^2.84.0",
|
|
18
|
+
"@xyo-network/boundwitness-model": "^2.84.0",
|
|
19
|
+
"@xyo-network/core": "^2.84.0",
|
|
20
|
+
"@xyo-network/diviner-boundwitness-model": "^2.84.0",
|
|
21
|
+
"@xyo-network/diviner-indexing": "^2.84.0",
|
|
22
|
+
"@xyo-network/diviner-model": "^2.84.0",
|
|
23
|
+
"@xyo-network/diviner-payload-model": "^2.84.0",
|
|
24
|
+
"@xyo-network/diviner-wrapper": "^2.84.0",
|
|
25
|
+
"@xyo-network/image-thumbnail-payload-plugin": "~2.84.0",
|
|
26
|
+
"@xyo-network/module-model": "^2.84.0",
|
|
27
|
+
"@xyo-network/payload-builder": "^2.84.0",
|
|
28
|
+
"@xyo-network/payload-model": "^2.84.0",
|
|
29
|
+
"@xyo-network/url-payload-plugin": "~2.84.0",
|
|
30
|
+
"@xyo-network/witness-timestamp": "^2.84.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@xylabs/delay": "^2.13.20",
|
|
34
34
|
"@xylabs/ts-scripts-yarn3": "^3.2.10",
|
|
35
35
|
"@xylabs/tsconfig": "^3.2.10",
|
|
36
|
-
"@xyo-network/account": "^2.
|
|
37
|
-
"@xyo-network/boundwitness-builder": "^2.
|
|
38
|
-
"@xyo-network/diviner-boundwitness-memory": "^2.
|
|
39
|
-
"@xyo-network/diviner-payload-memory": "^2.
|
|
40
|
-
"@xyo-network/manifest": "^2.
|
|
41
|
-
"@xyo-network/memory-archivist": "^2.
|
|
42
|
-
"@xyo-network/node-memory": "^2.
|
|
36
|
+
"@xyo-network/account": "^2.84.0",
|
|
37
|
+
"@xyo-network/boundwitness-builder": "^2.84.0",
|
|
38
|
+
"@xyo-network/diviner-boundwitness-memory": "^2.84.0",
|
|
39
|
+
"@xyo-network/diviner-payload-memory": "^2.84.0",
|
|
40
|
+
"@xyo-network/manifest": "^2.84.0",
|
|
41
|
+
"@xyo-network/memory-archivist": "^2.84.0",
|
|
42
|
+
"@xyo-network/node-memory": "^2.84.0",
|
|
43
43
|
"typescript": "^5.3.3"
|
|
44
44
|
},
|
|
45
45
|
"description": "Typescript/Javascript Plugins for XYO Platform",
|
|
@@ -82,5 +82,5 @@
|
|
|
82
82
|
"url": "https://github.com/XYOracleNetwork/plugins.git"
|
|
83
83
|
},
|
|
84
84
|
"sideEffects": false,
|
|
85
|
-
"version": "2.
|
|
85
|
+
"version": "2.84.0"
|
|
86
86
|
}
|
|
@@ -57,7 +57,7 @@ export class ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner extends Ab
|
|
|
57
57
|
const key = await PayloadHasher.hashAsync(urlPayload)
|
|
58
58
|
const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }
|
|
59
59
|
if (status) fields.status = status
|
|
60
|
-
const result: ImageThumbnailResultIndex = new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })
|
|
60
|
+
const result: ImageThumbnailResultIndex = await new PayloadBuilder<ImageThumbnailResultIndex>({ schema: ImageThumbnailResultIndexSchema })
|
|
61
61
|
.fields(fields)
|
|
62
62
|
.build()
|
|
63
63
|
return [result]
|
|
@@ -37,24 +37,26 @@ export class ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDivine
|
|
|
37
37
|
await Promise.all(
|
|
38
38
|
imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {
|
|
39
39
|
const { url } = imageThumbnailDivinerQuery
|
|
40
|
-
const urlPayload = new PayloadBuilder<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()
|
|
40
|
+
const urlPayload = await new PayloadBuilder<ImageThumbnailResult>({ schema: UrlSchema }).fields({ url }).build()
|
|
41
41
|
const key = await PayloadHasher.hashAsync(urlPayload)
|
|
42
42
|
return [key, url] as const
|
|
43
43
|
}),
|
|
44
44
|
),
|
|
45
45
|
)
|
|
46
46
|
// Map the indexes to responses using the dictionary
|
|
47
|
-
return
|
|
48
|
-
.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
return (
|
|
48
|
+
await Promise.all(
|
|
49
|
+
imageThumbnailResultIndexes.map(async (imageThumbnailResultIndex) => {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
51
|
+
const { key, schema, ...commonFields } = imageThumbnailResultIndex
|
|
52
|
+
const url = keyToUrlDictionary?.[key]
|
|
53
|
+
if (url) {
|
|
54
|
+
const fields: ImageThumbnailResultFields = { ...commonFields, url }
|
|
55
|
+
return await new PayloadBuilder<ImageThumbnailResult>({ schema: ImageThumbnailResultSchema }).fields(fields).build()
|
|
56
|
+
}
|
|
57
|
+
}),
|
|
58
|
+
)
|
|
59
|
+
).filter(exists)
|
|
58
60
|
}
|
|
59
61
|
return []
|
|
60
62
|
}
|
|
@@ -33,7 +33,7 @@ export class ImageThumbnailQueryToImageThumbnailIndexQueryDiviner extends Abstra
|
|
|
33
33
|
const fields: Partial<ImageThumbnailResultQuery> = { key, limit, offset, order }
|
|
34
34
|
if (payloadSuccess !== undefined) fields.success = payloadSuccess
|
|
35
35
|
if (payloadStatus !== undefined) fields.status = payloadStatus
|
|
36
|
-
return new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()
|
|
36
|
+
return await new PayloadBuilder<ImageThumbnailResultQuery>({ schema: PayloadDivinerQuerySchema }).fields(fields).build()
|
|
37
37
|
}),
|
|
38
38
|
)
|
|
39
39
|
return results
|
|
@@ -92,7 +92,7 @@ export class ImageThumbnailStateToIndexCandidateDiviner<
|
|
|
92
92
|
const { offset } = lastState.state
|
|
93
93
|
// Get next batch of results starting from the offset
|
|
94
94
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore()
|
|
95
|
-
const query = new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })
|
|
95
|
+
const query = await new PayloadBuilder<BoundWitnessDivinerQueryPayload>({ schema: BoundWitnessDivinerQuerySchema })
|
|
96
96
|
.fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas })
|
|
97
97
|
.build()
|
|
98
98
|
const batch = await boundWitnessDiviner.divine([query])
|