agsamantha/node_modules/@langchain/community/dist/storage/convex.cjs
2024-10-02 15:15:21 -05:00

145 lines
5.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConvexKVStore = void 0;
// eslint-disable-next-line import/no-extraneous-dependencies
const server_1 = require("convex/server");
const stores_1 = require("@langchain/core/stores");
/**
* Class that extends the BaseStore class to interact with a Convex
* database. It provides methods for getting, setting, and deleting key value pairs,
* as well as yielding keys from the database.
*/
class ConvexKVStore extends stores_1.BaseStore {
constructor(config) {
super(config);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain", "storage", "convex"]
});
Object.defineProperty(this, "ctx", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "table", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "index", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "keyField", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "valueField", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "upsert", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "lookup", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "deleteMany", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.ctx = config.ctx;
this.table = config.table ?? "cache";
this.index = config.index ?? "byKey";
this.keyField = config.keyField ?? "key";
this.valueField = config.valueField ?? "value";
this.upsert =
// eslint-disable-next-line @typescript-eslint/no-explicit-any
config.upsert ?? (0, server_1.makeFunctionReference)("langchain/db:upsert");
this.lookup =
// eslint-disable-next-line @typescript-eslint/no-explicit-any
config.lookup ?? (0, server_1.makeFunctionReference)("langchain/db:lookup");
this.deleteMany =
config.deleteMany ??
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(0, server_1.makeFunctionReference)("langchain/db:deleteMany");
}
/**
* Gets multiple keys from the Convex database.
* @param keys Array of keys to be retrieved.
* @returns An array of retrieved values.
*/
async mget(keys) {
return (await Promise.all(keys.map(async (key) => {
const found = (await this.ctx.runQuery(this.lookup, {
table: this.table,
index: this.index,
keyField: this.keyField,
key,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}));
return found.length > 0 ? found[0][this.valueField] : undefined;
})));
}
/**
* Sets multiple keys in the Convex database.
* @param keyValuePairs Array of key-value pairs to be set.
* @returns Promise that resolves when all keys have been set.
*/
async mset(keyValuePairs) {
// TODO: Remove chunking when Convex handles the concurrent requests correctly
const PAGE_SIZE = 16;
for (let i = 0; i < keyValuePairs.length; i += PAGE_SIZE) {
await Promise.all(keyValuePairs.slice(i, i + PAGE_SIZE).map(([key, value]) => this.ctx.runMutation(this.upsert, {
table: this.table,
index: this.index,
keyField: this.keyField,
key,
document: { [this.keyField]: key, [this.valueField]: value },
// eslint-disable-next-line @typescript-eslint/no-explicit-any
})));
}
}
/**
* Deletes multiple keys from the Convex database.
* @param keys Array of keys to be deleted.
* @returns Promise that resolves when all keys have been deleted.
*/
async mdelete(keys) {
await Promise.all(keys.map((key) => this.ctx.runMutation(this.deleteMany, {
table: this.table,
index: this.index,
keyField: this.keyField,
key,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
})));
}
/**
* Yields keys from the Convex database.
* @param prefix Optional prefix to filter the keys.
* @returns An AsyncGenerator that yields keys from the Convex database.
*/
// eslint-disable-next-line require-yield
async *yieldKeys(_prefix) {
throw new Error("yieldKeys not implemented yet for ConvexKVStore");
}
}
exports.ConvexKVStore = ConvexKVStore;