74 lines
2.9 KiB
JavaScript
74 lines
2.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.InMemoryRecordManager = void 0;
|
|
const base_js_1 = require("./base.cjs");
|
|
class InMemoryRecordManager extends base_js_1.RecordManager {
|
|
constructor() {
|
|
super();
|
|
Object.defineProperty(this, "lc_namespace", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: ["langchain", "recordmanagers", "memory"]
|
|
});
|
|
Object.defineProperty(this, "records", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
this.records = new Map();
|
|
}
|
|
async createSchema() {
|
|
// nothing to do here
|
|
// compatibility with other record managers
|
|
return Promise.resolve();
|
|
}
|
|
async getTime() {
|
|
return Promise.resolve(Date.now());
|
|
}
|
|
async update(keys, updateOptions) {
|
|
const updatedAt = await this.getTime();
|
|
const { timeAtLeast, groupIds: _groupIds } = updateOptions ?? {};
|
|
if (timeAtLeast && updatedAt < timeAtLeast) {
|
|
throw new Error(`Time sync issue with database ${updatedAt} < ${timeAtLeast}`);
|
|
}
|
|
const groupIds = _groupIds ?? keys.map(() => null);
|
|
if (groupIds.length !== keys.length) {
|
|
throw new Error(`Number of keys (${keys.length}) does not match number of group_ids ${groupIds.length})`);
|
|
}
|
|
keys.forEach((key, i) => {
|
|
const old = this.records.get(key);
|
|
if (old) {
|
|
old.updatedAt = updatedAt;
|
|
}
|
|
else {
|
|
this.records.set(key, { updatedAt, groupId: groupIds[i] });
|
|
}
|
|
});
|
|
}
|
|
async exists(keys) {
|
|
return Promise.resolve(keys.map((key) => this.records.has(key)));
|
|
}
|
|
async listKeys(options) {
|
|
const { before, after, limit, groupIds } = options ?? {};
|
|
const filteredRecords = Array.from(this.records).filter(([_key, doc]) => {
|
|
// Inclusive bounds for before and after (i.e. <= and >=).
|
|
// This is technically incorrect, but because there is no
|
|
// latency, it is not garanteed that after an update the
|
|
// timestamp on subsequent listKeys calls will be different.
|
|
const isBefore = !before || doc.updatedAt <= before;
|
|
const isAfter = !after || doc.updatedAt >= after;
|
|
const belongsToGroup = !groupIds || groupIds.includes(doc.groupId);
|
|
return isBefore && isAfter && belongsToGroup;
|
|
});
|
|
return Promise.resolve(filteredRecords
|
|
.map(([key]) => key)
|
|
.slice(0, limit ?? filteredRecords.length));
|
|
}
|
|
async deleteKeys(keys) {
|
|
keys.forEach((key) => this.records.delete(key));
|
|
return Promise.resolve();
|
|
}
|
|
}
|
|
exports.InMemoryRecordManager = InMemoryRecordManager;
|