56 lines
2.2 KiB
JavaScript
56 lines
2.2 KiB
JavaScript
import assert from "node:assert/strict"
|
|
import test from "node:test"
|
|
import { createMemoryStore } from "../dist/memory.js"
|
|
|
|
function createStorage() {
|
|
const values = new Map()
|
|
return {
|
|
values,
|
|
get: async (key) => values.get(key),
|
|
set: async (key, value) => { values.set(key, value) },
|
|
remove: async (key) => { values.delete(key) },
|
|
scan: async ({ prefix, after, limit }) => {
|
|
const keys = [...values.keys()].filter((key) => key.startsWith(prefix)).sort().filter((key) => after === undefined || key > after)
|
|
const selected = keys.slice(0, limit)
|
|
return {
|
|
entries: selected.map((key) => ({ key, value: values.get(key) })),
|
|
...(keys.length > selected.length && selected.length > 0 ? { next: selected.at(-1) } : {}),
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
test("memory records expire and are removed when accessed", async () => {
|
|
const storage = createStorage()
|
|
let clock = new Date("2026-10-08T12:00:00.000Z")
|
|
const store = createMemoryStore({
|
|
storage,
|
|
projectID: "project-1",
|
|
projectCanonical: "/workspace/demo",
|
|
projectMemoryEnabled: false,
|
|
retentionDays: 1,
|
|
getSession: async (sessionID) => ({ projectID: "project-1", location: { directory: `/workspace/demo/${sessionID}` } }),
|
|
now: () => clock,
|
|
createID: () => "12345678-1234-4234-8234-123456789abc",
|
|
})
|
|
|
|
const record = await store.save({ sessionID: "session-1", scope: "session", content: "Keep this briefly" })
|
|
assert.equal(record.expiresAt, "2026-10-09T12:00:00.000Z")
|
|
clock = new Date("2026-10-09T12:00:00.000Z")
|
|
assert.equal(await store.get({ sessionID: "session-1", scope: "session", id: record.id }), undefined)
|
|
assert.equal(storage.values.size, 0)
|
|
})
|
|
|
|
test("memory writes reject sessions belonging to another project", async () => {
|
|
const store = createMemoryStore({
|
|
storage: createStorage(),
|
|
projectID: "project-1",
|
|
projectCanonical: "/workspace/demo",
|
|
projectMemoryEnabled: false,
|
|
retentionDays: 30,
|
|
getSession: async () => ({ projectID: "project-2", location: { directory: "/workspace/other" } }),
|
|
})
|
|
|
|
await assert.rejects(store.save({ sessionID: "foreign", scope: "session", content: "remember" }), /current project/)
|
|
})
|