@xyo-network/diviner-image-thumbnail 2.95.4 → 2.96.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +7 -14
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +7 -14
- package/dist/browser/index.js.map +1 -1
- package/dist/neutral/index.cjs +7 -14
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.js +7 -14
- package/dist/neutral/index.js.map +1 -1
- package/dist/node/index.cjs +7 -14
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +7 -14
- package/dist/node/index.js.map +1 -1
- package/package.json +26 -25
package/dist/browser/index.cjs
CHANGED
|
@@ -75,8 +75,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends imp
|
|
|
75
75
|
const timestampHash = curr.payload_hashes?.[timestampIndex];
|
|
76
76
|
const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(import_image_thumbnail_payload_plugin.isImageThumbnail);
|
|
77
77
|
const timestampPayload = [payloadDictionary[timestampHash]].find(import_witness_timestamp.isTimestamp);
|
|
78
|
-
if (imageThumbnailPayload && timestampPayload)
|
|
79
|
-
acc.push([curr, imageThumbnailPayload, timestampPayload]);
|
|
78
|
+
if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload]);
|
|
80
79
|
return acc;
|
|
81
80
|
},
|
|
82
81
|
[]
|
|
@@ -91,8 +90,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends imp
|
|
|
91
90
|
const urlPayload = { schema: import_url_payload_plugin.UrlSchema, url };
|
|
92
91
|
const key = await import_payload_builder.PayloadBuilder.dataHash(urlPayload);
|
|
93
92
|
const fields = { key, sources, success, timestamp };
|
|
94
|
-
if (status)
|
|
95
|
-
fields.status = status;
|
|
93
|
+
if (status) fields.status = status;
|
|
96
94
|
const result = await new import_payload_builder.PayloadBuilder({
|
|
97
95
|
schema: import_image_thumbnail_payload_plugin.ImageThumbnailResultIndexSchema
|
|
98
96
|
}).fields(fields).build();
|
|
@@ -181,10 +179,8 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends import_
|
|
|
181
179
|
offset,
|
|
182
180
|
order: order2
|
|
183
181
|
};
|
|
184
|
-
if (payloadSuccess !== void 0)
|
|
185
|
-
|
|
186
|
-
if (payloadStatus !== void 0)
|
|
187
|
-
fields.status = payloadStatus;
|
|
182
|
+
if (payloadSuccess !== void 0) fields.success = payloadSuccess;
|
|
183
|
+
if (payloadStatus !== void 0) fields.status = payloadStatus;
|
|
188
184
|
return await new import_payload_builder3.PayloadBuilder({ schema: import_diviner_payload_model.PayloadDivinerQuerySchema }).fields(fields).build();
|
|
189
185
|
})
|
|
190
186
|
);
|
|
@@ -238,21 +234,18 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
238
234
|
const hashes = indexes.map((index) => bw.payload_hashes?.[index]);
|
|
239
235
|
const results = await archivist.get(hashes);
|
|
240
236
|
const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is));
|
|
241
|
-
if (filteredResults.includes(void 0))
|
|
242
|
-
return void 0;
|
|
237
|
+
if (filteredResults.includes(void 0)) return void 0;
|
|
243
238
|
const indexCandidates = filteredResults.filter(import_exists2.exists);
|
|
244
239
|
return [bw, ...indexCandidates];
|
|
245
240
|
}
|
|
246
241
|
async divineHandler(payloads = []) {
|
|
247
242
|
const lastState = payloads.find(import_module_model.isModuleState);
|
|
248
|
-
if (!lastState)
|
|
249
|
-
return [{ schema: import_module_model.ModuleStateSchema, state: { offset: 0 } }];
|
|
243
|
+
if (!lastState) return [{ schema: import_module_model.ModuleStateSchema, state: { offset: 0 } }];
|
|
250
244
|
const { offset } = lastState.state;
|
|
251
245
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
252
246
|
const query = await new import_payload_builder4.PayloadBuilder({ schema: import_diviner_boundwitness_model.BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
253
247
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
254
|
-
if (batch.length === 0)
|
|
255
|
-
return [lastState];
|
|
248
|
+
if (batch.length === 0) return [lastState];
|
|
256
249
|
const sourceArchivist = await this.getArchivistForStore();
|
|
257
250
|
const indexCandidates = (await Promise.all(
|
|
258
251
|
batch.filter(import_boundwitness_model2.isBoundWitnessWithMeta).map((bw) => _ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist))
|
|
@@ -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'\nimport { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override labels: ImageThumbnailDivinerLabels = { ...super.labels, ...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 { Hash } from '@xylabs/hex'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as WithMeta<ImageThumbnail> | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as WithMeta<TimeStamp>\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result = await new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({\n schema: ImageThumbnailResultIndexSchema,\n })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\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, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = await new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\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/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { 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 PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n offset,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { 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 { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitnessWithMeta } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as WithMeta<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])) as WithSources<WithMeta<BoundWitness>>[]\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(isBoundWitnessWithMeta).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_diviner_abstract","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_diviner_abstract","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_boundwitness_model","import_diviner_abstract","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'\nimport { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override labels: ImageThumbnailDivinerLabels = { ...super.labels, ...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 { Hash } from '@xylabs/hex'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as WithMeta<ImageThumbnail> | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as WithMeta<TimeStamp>\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result = await new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({\n schema: ImageThumbnailResultIndexSchema,\n })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\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, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = await new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\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/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { 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 PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n offset,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { 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 { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitnessWithMeta } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as WithMeta<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])) as WithSources<WithMeta<BoundWitness>>[]\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(isBoundWitnessWithMeta).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_diviner_abstract","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_diviner_abstract","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_boundwitness_model","import_diviner_abstract","import_image_thumbnail_payload_plugin","import_payload_builder","import_witness_timestamp"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -45,8 +45,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends Abs
|
|
|
45
45
|
const timestampHash = curr.payload_hashes?.[timestampIndex];
|
|
46
46
|
const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail);
|
|
47
47
|
const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp);
|
|
48
|
-
if (imageThumbnailPayload && timestampPayload)
|
|
49
|
-
acc.push([curr, imageThumbnailPayload, timestampPayload]);
|
|
48
|
+
if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload]);
|
|
50
49
|
return acc;
|
|
51
50
|
},
|
|
52
51
|
[]
|
|
@@ -61,8 +60,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends Abs
|
|
|
61
60
|
const urlPayload = { schema: UrlSchema, url };
|
|
62
61
|
const key = await PayloadBuilder.dataHash(urlPayload);
|
|
63
62
|
const fields = { key, sources, success, timestamp };
|
|
64
|
-
if (status)
|
|
65
|
-
fields.status = status;
|
|
63
|
+
if (status) fields.status = status;
|
|
66
64
|
const result = await new PayloadBuilder({
|
|
67
65
|
schema: ImageThumbnailResultIndexSchema
|
|
68
66
|
}).fields(fields).build();
|
|
@@ -155,10 +153,8 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends Abstrac
|
|
|
155
153
|
offset,
|
|
156
154
|
order: order2
|
|
157
155
|
};
|
|
158
|
-
if (payloadSuccess !== void 0)
|
|
159
|
-
|
|
160
|
-
if (payloadStatus !== void 0)
|
|
161
|
-
fields.status = payloadStatus;
|
|
156
|
+
if (payloadSuccess !== void 0) fields.success = payloadSuccess;
|
|
157
|
+
if (payloadStatus !== void 0) fields.status = payloadStatus;
|
|
162
158
|
return await new PayloadBuilder3({ schema: PayloadDivinerQuerySchema }).fields(fields).build();
|
|
163
159
|
})
|
|
164
160
|
);
|
|
@@ -212,21 +208,18 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
212
208
|
const hashes = indexes.map((index) => bw.payload_hashes?.[index]);
|
|
213
209
|
const results = await archivist.get(hashes);
|
|
214
210
|
const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is));
|
|
215
|
-
if (filteredResults.includes(void 0))
|
|
216
|
-
return void 0;
|
|
211
|
+
if (filteredResults.includes(void 0)) return void 0;
|
|
217
212
|
const indexCandidates = filteredResults.filter(exists2);
|
|
218
213
|
return [bw, ...indexCandidates];
|
|
219
214
|
}
|
|
220
215
|
async divineHandler(payloads = []) {
|
|
221
216
|
const lastState = payloads.find(isModuleState);
|
|
222
|
-
if (!lastState)
|
|
223
|
-
return [{ schema: ModuleStateSchema, state: { offset: 0 } }];
|
|
217
|
+
if (!lastState) return [{ schema: ModuleStateSchema, state: { offset: 0 } }];
|
|
224
218
|
const { offset } = lastState.state;
|
|
225
219
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
226
220
|
const query = await new PayloadBuilder4({ schema: BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
227
221
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
228
|
-
if (batch.length === 0)
|
|
229
|
-
return [lastState];
|
|
222
|
+
if (batch.length === 0) return [lastState];
|
|
230
223
|
const sourceArchivist = await this.getArchivistForStore();
|
|
231
224
|
const indexCandidates = (await Promise.all(
|
|
232
225
|
batch.filter(isBoundWitnessWithMeta).map((bw) => _ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Diviner/Diviner.ts","../../src/Diviner/ImageThumbnailDivinerLabels.ts","../../src/Diviner/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts","../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts","../../src/Diviner/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts","../../src/Diviner/ImageThumbnailResultQuery.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Diviner.ts"],"sourcesContent":["import { IndexingDiviner } from '@xyo-network/diviner-indexing'\nimport { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override labels: ImageThumbnailDivinerLabels = { ...super.labels, ...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 { Hash } from '@xylabs/hex'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as WithMeta<ImageThumbnail> | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as WithMeta<TimeStamp>\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result = await new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({\n schema: ImageThumbnailResultIndexSchema,\n })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\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, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = await new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\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/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { 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 PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n offset,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { 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 { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitnessWithMeta } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as WithMeta<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])) as WithSources<WithMeta<BoundWitness>>[]\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(isBoundWitnessWithMeta).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","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadBuilder","PayloadDivinerQuerySchema","exists","AbstractDiviner","ImageThumbnailSchema","isImageThumbnail","PayloadBuilder","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","exists","PayloadBuilder"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Diviner/Diviner.ts","../../src/Diviner/ImageThumbnailDivinerLabels.ts","../../src/Diviner/ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner.ts","../../src/Diviner/ImageThumbnailIndexQueryResponseToImageThumbnailQueryResponseDiviner.ts","../../src/Diviner/ImageThumbnailQueryToImageThumbnailIndexQueryDiviner.ts","../../src/Diviner/ImageThumbnailResultQuery.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Schema.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Config.ts","../../src/Diviner/ImageThumbnailStateToIndexCandidateDiviner/Diviner.ts"],"sourcesContent":["import { IndexingDiviner } from '@xyo-network/diviner-indexing'\nimport { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override labels: ImageThumbnailDivinerLabels = { ...super.labels, ...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 { Hash } from '@xylabs/hex'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as WithMeta<ImageThumbnail> | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as WithMeta<TimeStamp>\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result = await new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({\n schema: ImageThumbnailResultIndexSchema,\n })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\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, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = await new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\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/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { 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 PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n offset,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { 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 { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitnessWithMeta } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as WithMeta<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])) as WithSources<WithMeta<BoundWitness>>[]\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(isBoundWitnessWithMeta).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","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","PayloadBuilder","UrlSchema","AbstractDiviner","DivinerConfigSchema","isImageThumbnailDivinerQuery","order","UrlSchema","PayloadBuilder","PayloadDivinerQuerySchema","exists","AbstractDiviner","ImageThumbnailSchema","isImageThumbnail","PayloadBuilder","isTimestamp","TimestampSchema","ImageThumbnailSchema","TimestampSchema","isImageThumbnail","isTimestamp","AbstractDiviner","exists","PayloadBuilder"]}
|
package/dist/neutral/index.cjs
CHANGED
|
@@ -75,8 +75,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends imp
|
|
|
75
75
|
const timestampHash = curr.payload_hashes?.[timestampIndex];
|
|
76
76
|
const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(import_image_thumbnail_payload_plugin.isImageThumbnail);
|
|
77
77
|
const timestampPayload = [payloadDictionary[timestampHash]].find(import_witness_timestamp.isTimestamp);
|
|
78
|
-
if (imageThumbnailPayload && timestampPayload)
|
|
79
|
-
acc.push([curr, imageThumbnailPayload, timestampPayload]);
|
|
78
|
+
if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload]);
|
|
80
79
|
return acc;
|
|
81
80
|
},
|
|
82
81
|
[]
|
|
@@ -91,8 +90,7 @@ var ImageThumbnailIndexCandidateToImageThumbnailIndexDiviner = class extends imp
|
|
|
91
90
|
const urlPayload = { schema: import_url_payload_plugin.UrlSchema, url };
|
|
92
91
|
const key = await import_payload_builder.PayloadBuilder.dataHash(urlPayload);
|
|
93
92
|
const fields = { key, sources, success, timestamp };
|
|
94
|
-
if (status)
|
|
95
|
-
fields.status = status;
|
|
93
|
+
if (status) fields.status = status;
|
|
96
94
|
const result = await new import_payload_builder.PayloadBuilder({
|
|
97
95
|
schema: import_image_thumbnail_payload_plugin.ImageThumbnailResultIndexSchema
|
|
98
96
|
}).fields(fields).build();
|
|
@@ -181,10 +179,8 @@ var ImageThumbnailQueryToImageThumbnailIndexQueryDiviner = class extends import_
|
|
|
181
179
|
offset,
|
|
182
180
|
order: order2
|
|
183
181
|
};
|
|
184
|
-
if (payloadSuccess !== void 0)
|
|
185
|
-
|
|
186
|
-
if (payloadStatus !== void 0)
|
|
187
|
-
fields.status = payloadStatus;
|
|
182
|
+
if (payloadSuccess !== void 0) fields.success = payloadSuccess;
|
|
183
|
+
if (payloadStatus !== void 0) fields.status = payloadStatus;
|
|
188
184
|
return await new import_payload_builder3.PayloadBuilder({ schema: import_diviner_payload_model.PayloadDivinerQuerySchema }).fields(fields).build();
|
|
189
185
|
})
|
|
190
186
|
);
|
|
@@ -238,21 +234,18 @@ var ImageThumbnailStateToIndexCandidateDiviner = class _ImageThumbnailStateToInd
|
|
|
238
234
|
const hashes = indexes.map((index) => bw.payload_hashes?.[index]);
|
|
239
235
|
const results = await archivist.get(hashes);
|
|
240
236
|
const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is));
|
|
241
|
-
if (filteredResults.includes(void 0))
|
|
242
|
-
return void 0;
|
|
237
|
+
if (filteredResults.includes(void 0)) return void 0;
|
|
243
238
|
const indexCandidates = filteredResults.filter(import_exists2.exists);
|
|
244
239
|
return [bw, ...indexCandidates];
|
|
245
240
|
}
|
|
246
241
|
async divineHandler(payloads = []) {
|
|
247
242
|
const lastState = payloads.find(import_module_model.isModuleState);
|
|
248
|
-
if (!lastState)
|
|
249
|
-
return [{ schema: import_module_model.ModuleStateSchema, state: { offset: 0 } }];
|
|
243
|
+
if (!lastState) return [{ schema: import_module_model.ModuleStateSchema, state: { offset: 0 } }];
|
|
250
244
|
const { offset } = lastState.state;
|
|
251
245
|
const boundWitnessDiviner = await this.getBoundWitnessDivinerForStore();
|
|
252
246
|
const query = await new import_payload_builder4.PayloadBuilder({ schema: import_diviner_boundwitness_model.BoundWitnessDivinerQuerySchema }).fields({ limit: this.payloadDivinerLimit, offset, order, payload_schemas }).build();
|
|
253
247
|
const batch = await boundWitnessDiviner.divine([query]);
|
|
254
|
-
if (batch.length === 0)
|
|
255
|
-
return [lastState];
|
|
248
|
+
if (batch.length === 0) return [lastState];
|
|
256
249
|
const sourceArchivist = await this.getArchivistForStore();
|
|
257
250
|
const indexCandidates = (await Promise.all(
|
|
258
251
|
batch.filter(import_boundwitness_model2.isBoundWitnessWithMeta).map((bw) => _ImageThumbnailStateToIndexCandidateDiviner.getPayloadsInBoundWitness(bw, sourceArchivist))
|
|
@@ -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'\nimport { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override labels: ImageThumbnailDivinerLabels = { ...super.labels, ...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 { Hash } from '@xylabs/hex'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as WithMeta<ImageThumbnail> | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as WithMeta<TimeStamp>\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result = await new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({\n schema: ImageThumbnailResultIndexSchema,\n })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\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, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = await new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\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/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { 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 PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n offset,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { 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 { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitnessWithMeta } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as WithMeta<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])) as WithSources<WithMeta<BoundWitness>>[]\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(isBoundWitnessWithMeta).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_diviner_abstract","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_diviner_abstract","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_boundwitness_model","import_diviner_abstract","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'\nimport { AttachableDivinerInstance } from '@xyo-network/diviner-model'\n\nimport { ImageThumbnailDivinerLabels } from './ImageThumbnailDivinerLabels'\n\nexport class ImageThumbnailDiviner extends IndexingDiviner implements AttachableDivinerInstance {\n static override labels: ImageThumbnailDivinerLabels = { ...super.labels, ...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 { Hash } from '@xylabs/hex'\nimport { BoundWitness, isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexCandidateToIndexDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<WithSources<ImageThumbnailResultIndex>[]> {\n const bws: BoundWitness[] = payloads.filter(isBoundWitness)\n const imageThumbnailPayloads: ImageThumbnail[] = payloads.filter(isImageThumbnail)\n const timestampPayloads: TimeStamp[] = payloads.filter(isTimestamp)\n if (bws.length > 0 && imageThumbnailPayloads.length > 0 && timestampPayloads.length > 0) {\n const payloadDictionary = await PayloadBuilder.toDataHashMap(payloads)\n // eslint-disable-next-line unicorn/no-array-reduce\n const tuples: [BoundWitness, ImageThumbnail, TimeStamp][] = bws.reduce<[BoundWitness, ImageThumbnail, TimeStamp][]>(\n (acc, curr) => {\n const imageThumbnailIndex = curr.payload_schemas?.findIndex((schema) => schema === ImageThumbnailSchema)\n const timestampIndex = curr.payload_schemas?.findIndex((schema) => schema === TimestampSchema)\n const imageThumbnailHash = curr.payload_hashes?.[imageThumbnailIndex]\n const timestampHash = curr.payload_hashes?.[timestampIndex]\n const imageThumbnailPayload = [payloadDictionary[imageThumbnailHash]].find(isImageThumbnail) as WithMeta<ImageThumbnail> | undefined\n const timestampPayload = [payloadDictionary[timestampHash]].find(isTimestamp) as WithMeta<TimeStamp>\n if (imageThumbnailPayload && timestampPayload) acc.push([curr, imageThumbnailPayload, timestampPayload])\n return acc\n },\n [] as [BoundWitness, ImageThumbnail, TimeStamp][],\n )\n const indexes = await Promise.all(\n tuples.map(async ([bw, imageThumbnailPayload, timestampPayload]) => {\n const { sourceUrl: url, http } = imageThumbnailPayload\n const { timestamp } = timestampPayload\n const { status } = http ?? {}\n const success = !!imageThumbnailPayload.url // Call anything with a thumbnail url a success\n const sources: Hash[] = await PayloadBuilder.dataHashes([bw, imageThumbnailPayload, timestampPayload])\n const urlPayload = { schema: UrlSchema, url }\n const key: Hash = await PayloadBuilder.dataHash(urlPayload)\n const fields: ImageThumbnailResultIndexFields = { key, sources, success, timestamp }\n if (status) fields.status = status\n const result = await new PayloadBuilder<WithSources<ImageThumbnailResultIndex>>({\n schema: ImageThumbnailResultIndexSchema,\n })\n .fields(fields)\n .build()\n return [result]\n }),\n )\n return indexes.flat()\n }\n return []\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport {\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, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'indexQueryResponseToDivinerQueryResponseDiviner',\n }\n\n protected override async divineHandler(payloads: Payload[] = []): Promise<ImageThumbnailResult[]> {\n // Filter out the two operands\n const imageThumbnailDivinerQueries = payloads.filter(isImageThumbnailDivinerQuery)\n const imageThumbnailResultIndexes = payloads.filter(isImageThumbnailResultIndex)\n\n // If we have operands\n if (imageThumbnailDivinerQueries.length > 0 && imageThumbnailResultIndexes.length > 0) {\n // Create a dictionary to translate index keys to the urls that represent them\n const keyToUrlDictionary = Object.fromEntries(\n await Promise.all(\n imageThumbnailDivinerQueries.map(async (imageThumbnailDivinerQuery) => {\n const { url } = imageThumbnailDivinerQuery\n const urlPayload = await new PayloadBuilder<Omit<ImageThumbnailResult, 'timestamp' | 'success' | 'sources'>>({ schema: UrlSchema })\n .fields({ url })\n .build()\n const key = await PayloadBuilder.dataHash(urlPayload)\n return [key, url] as const\n }),\n ),\n )\n // Map the indexes to responses using the dictionary\n return (\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/diviner-abstract'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport { PayloadDivinerQuerySchema } from '@xyo-network/diviner-payload-model'\nimport { isImageThumbnailDivinerQuery } from '@xyo-network/image-thumbnail-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, Schema } 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 readonly configSchemas: Schema[] = [...super.configSchemas, DivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = DivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'divinerQueryToIndexQueryDiviner',\n }\n protected override async divineHandler(\n payloads: Payload[] = [],\n ): Promise<Omit<Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>, 'timestamp'>[]> {\n const queries = payloads.filter(isImageThumbnailDivinerQuery)\n if (queries.length > 0) {\n const results = await Promise.all(\n queries.map(async (query) => {\n const { 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 PayloadBuilder.dataHash(urlPayload)\n const fields: Omit<ImageThumbnailResultQuery, 'schema' | 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>> = {\n key,\n limit,\n offset,\n order,\n }\n if (payloadSuccess !== undefined) fields.success = payloadSuccess\n if (payloadStatus !== undefined) fields.status = payloadStatus\n return await new PayloadBuilder<\n Omit<ImageThumbnailResultQuery, 'timestamp' | 'success'> & Partial<Pick<ImageThumbnailResultQuery, 'success'>>\n >({ schema: PayloadDivinerQuerySchema })\n .fields(fields)\n .build()\n }),\n )\n return results\n }\n return []\n }\n}\n","import { 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 { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistWrapper } from '@xyo-network/archivist-wrapper'\nimport { BoundWitness, isBoundWitnessWithMeta } from '@xyo-network/boundwitness-model'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { BoundWitnessDivinerQueryPayload, BoundWitnessDivinerQuerySchema } from '@xyo-network/diviner-boundwitness-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, Schema, WithMeta, WithSources } 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 readonly configSchemas: Schema[] = [...super.configSchemas, ImageThumbnailStateToIndexCandidateDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = ImageThumbnailStateToIndexCandidateDivinerConfigSchema\n static override labels: ImageThumbnailDivinerStageLabels = {\n ...super.labels,\n ...ImageThumbnailDivinerLabels,\n 'network.xyo.diviner.stage': 'stateToIndexCandidateDiviner',\n }\n\n get payloadDivinerLimit() {\n return this.config.payloadDivinerLimit ?? 1000\n }\n\n protected static async getPayloadsInBoundWitness(bw: BoundWitness, archivist: ArchivistInstance): Promise<IndexCandidate[] | undefined> {\n const indexes = payload_schemas.map((schema) => bw.payload_schemas?.findIndex((s) => s === schema))\n const hashes = indexes.map((index) => bw.payload_hashes?.[index])\n const results = await archivist.get(hashes)\n const filteredResults = indexCandidateIdentityFunctions.map((is) => results.find(is))\n if (filteredResults.includes(undefined)) return undefined\n const indexCandidates: IndexCandidate[] = filteredResults.filter(exists) as WithMeta<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])) as WithSources<WithMeta<BoundWitness>>[]\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(isBoundWitnessWithMeta).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_diviner_abstract","import_diviner_model","import_image_thumbnail_payload_plugin","import_payload_builder","import_url_payload_plugin","import_diviner_abstract","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_boundwitness_model","import_diviner_abstract","import_image_thumbnail_payload_plugin","import_payload_builder","import_witness_timestamp"]}
|