mongodb-rag-core
Version:
Common elements used by MongoDB Chatbot Framework components.
66 lines • 2.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateTranformedContentForPage = exports.updateTransformedContent = void 0;
const crypto_1 = require("crypto");
const promise_pool_1 = require("@supercharge/promise-pool");
const logger_1 = require("../logger");
/**
(Re-)transform content for pages and persist the transformedContent in the TransformedContentStore.
*/
async function updateTransformedContent({ transformedContentStore, pages, transformPage, concurrencyOptions, }) {
await promise_pool_1.PromisePool.withConcurrency(concurrencyOptions?.processPages ?? 1)
.for(pages)
.process(async (page) => {
await updateTranformedContentForPage({
store: transformedContentStore,
page,
transformPage,
});
});
}
exports.updateTransformedContent = updateTransformedContent;
const chunkAlgoHashes = new Map();
const getHashForFunc = (f) => {
const data = f.toString();
const existingHash = chunkAlgoHashes.get(data);
if (existingHash) {
return existingHash;
}
const hash = (0, crypto_1.createHash)("sha256");
hash.update(data);
const digest = hash.digest("hex");
chunkAlgoHashes.set(data, digest);
return digest;
};
async function updateTranformedContentForPage({ page, store, transformPage, }) {
const contentChunks = await transformPage(page);
if (contentChunks.length === 0) {
// This could happen if source returned a page with no content
logger_1.logger.warn(`No content for page ${page.sourceName}:${page.url} - deleting any existing content and continuing`);
await store.deleteContent({ page });
return;
}
const existingContent = await store.loadContent({
page,
});
const transformAlgoHash = getHashForFunc(transformPage);
const hasContentChunks = contentChunks.length > 0;
const hasSameNumberOfChunks = contentChunks.length === existingContent.length;
const hasSameTransformAlgoHash = existingContent.at(0)?.transformAlgoHash === transformAlgoHash;
const doNotUpdate = hasContentChunks && hasSameNumberOfChunks && hasSameTransformAlgoHash;
if (doNotUpdate) {
logger_1.logger.info(`Transformed content for ${page.sourceName}:${page.url} already updated (${existingContent[0].updated}). Skipping transform.`);
return;
}
logger_1.logger.info(`Adding transformed content for: ${page.url}`);
const transformedContent = contentChunks.map((chunk) => ({
...chunk,
transformAlgoHash,
}));
await store.updateContent({
page,
transformedContent,
});
}
exports.updateTranformedContentForPage = updateTranformedContentForPage;
//# sourceMappingURL=updateTransformedContent.js.map