UNPKG

@pinecone-database/pinecone

Version:

This is the official Node.js SDK for [Pinecone](https://www.pinecone.io), written in TypeScript.

163 lines • 6.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.retryDeletes = exports.getRecordIds = exports.assertWithRetries = exports.waitUntilRecordsReady = exports.waitUntilReady = exports.sleep = exports.generateMetadata = exports.generateSparseValues = exports.generateValues = exports.generateRecords = exports.randomIndexName = exports.randomString = exports.globalNamespaceOne = exports.diffPrefix = exports.prefix = void 0; const index_1 = require("../index"); const metadataMap = { genre: ['action', 'comedy', 'drama', 'horror', 'romance', 'thriller'], year: [2010, 2011, 2012, 2013, 2014, 2015], }; const metadataKeys = Object.keys(metadataMap); exports.prefix = 'preTest'; exports.diffPrefix = 'diff-prefix'; exports.globalNamespaceOne = 'global-ns-one'; const randomString = (length) => { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < length; i++) { const randomIndex = Math.floor(Math.random() * characters.length); result += characters.charAt(randomIndex); } return result; }; exports.randomString = randomString; const randomIndexName = (testName) => { return `${testName}-${(0, exports.randomString)(8)}`.toLowerCase().slice(0, 45); }; exports.randomIndexName = randomIndexName; const generateRecords = ({ dimension = 5, quantity = 3, prefix = null, withValues = true, withSparseValues = false, withMetadata = false, }) => { const records = []; for (let i = 0; i < quantity; i++) { const id = prefix === null ? i.toString() : `${prefix}-${i}`; const values = withValues ? (0, exports.generateValues)(dimension) : undefined; const sparseValues = withSparseValues ? (0, exports.generateSparseValues)(dimension) : undefined; let vector = { id, values, sparseValues, }; if (withMetadata) { vector = { ...vector, metadata: (0, exports.generateMetadata)(), }; } records.push(vector); } return records; }; exports.generateRecords = generateRecords; const generateValues = (dimension) => { const values = []; for (let i = 0; i < dimension; i++) { values.push(parseFloat(Math.random().toFixed(5))); } return values; }; exports.generateValues = generateValues; const generateSparseValues = (dimension) => { const values = []; const indices = []; for (let j = 0; j < dimension; j++) { values.push(Math.random()); indices.push(j); } return { indices, values }; }; exports.generateSparseValues = generateSparseValues; const generateMetadata = () => { const metaKey = metadataKeys[Math.floor(Math.random() * metadataKeys.length)]; const metaValue = metadataMap[metaKey][Math.floor(Math.random() * metadataMap[metaKey].length)]; return { [metaKey]: metaValue }; }; exports.generateMetadata = generateMetadata; const sleep = async (ms) => { return new Promise((resolve) => setTimeout(resolve, ms)); }; exports.sleep = sleep; const waitUntilReady = async (indexName) => { const p = new index_1.Pinecone(); const sleepIntervalMs = 1000; let isReady = false; while (!isReady) { try { const description = await p.describeIndex(indexName); if (description.status?.ready === true && description.status?.state === 'Ready') { isReady = true; } else { await (0, exports.sleep)(sleepIntervalMs); } } catch (error) { throw new Error(`Error while waiting for index to be ready: ${error}`); } } }; exports.waitUntilReady = waitUntilReady; const waitUntilRecordsReady = async (index, namespace, recordIds) => { const sleepIntervalMs = 3000; let indexStats = await index.describeIndexStats(); // if namespace is empty or the record count is not equal to the number of records we expect while ((indexStats.namespaces && !indexStats.namespaces[namespace]) || (indexStats.namespaces && indexStats.namespaces[namespace]?.recordCount !== recordIds.length)) { await (0, exports.sleep)(sleepIntervalMs); indexStats = await index.describeIndexStats(); } // Sleeping one final time before returning for a bit more breathing room for freshness await (0, exports.sleep)(sleepIntervalMs); return indexStats; }; exports.waitUntilRecordsReady = waitUntilRecordsReady; const assertWithRetries = async (asyncFn, assertionsFn, totalMsWait = 180000, delay = 3000) => { let lastError = null; for (let msElapsed = 0; msElapsed < totalMsWait; msElapsed += delay) { try { const result = await asyncFn(); assertionsFn(result); return; } catch (error) { lastError = error; await (0, exports.sleep)(delay); } } throw lastError; }; exports.assertWithRetries = assertWithRetries; const getRecordIds = async (index) => { const pag = await index.listPaginated(); const ids = []; if (pag.vectors) { for (const vector of pag.vectors) { if (vector.id) { ids.push(vector.id); } else { console.log('No record ID found for vector:', vector); } } } if (ids.length > 0) { return ids; } else { console.log('No record IDs found in the serverless index'); } }; exports.getRecordIds = getRecordIds; const retryDeletes = async (pc, indexName) => { try { await pc.deleteIndex(indexName); } catch (e) { console.log(`Encountered error when trying to delete index: ${e}`, '\n\nSleeping for 1s and retrying...\n\n'); await (0, exports.sleep)(1000); await (0, exports.retryDeletes)(pc, indexName); } }; exports.retryDeletes = retryDeletes; //# sourceMappingURL=test-helpers.js.map