kuboon
kuboon3w ago

Can I use deno KV in worker?

It looks work, but does not persist at all. See my sample code below. Q1. why "key1" is not listed in my worker? Q2. why "key2" always 1?
deno -v
deno 2.4.4
deno run --allow-read=. kvTest.ts
I am NOT in a web worker { key: [ "key1" ], value: 8, versionstamp: "00000000000000e00000" } I am in a web worker { key: [ "key2" ], value: 1, versionstamp: "00000000000000090000" }
kvTest.ts
const kv = await Deno.openKv();
if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
console.log('I am in a web worker');
await increment("key2")
await listAll();
} else {
console.log('I am NOT in a web worker');
await increment("key1")
await listAll();
new Worker(import.meta.url, { type: "module" });
}

async function increment(key: string) {
const current = await kv.get([key]);
await kv.atomic().check(current).set([key], (current.value as number ?? 0) + 1).commit();
}
async function listAll(){
for await (const entry of kv.list({ prefix: [] })) {
console.log(entry);
}
}
kvTest.ts
const kv = await Deno.openKv();
if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
console.log('I am in a web worker');
await increment("key2")
await listAll();
} else {
console.log('I am NOT in a web worker');
await increment("key1")
await listAll();
new Worker(import.meta.url, { type: "module" });
}

async function increment(key: string) {
const current = await kv.get([key]);
await kv.atomic().check(current).set([key], (current.value as number ?? 0) + 1).commit();
}
async function listAll(){
for await (const entry of kv.list({ prefix: [] })) {
console.log(entry);
}
}
1 Reply
Leokuma
Leokuma3w ago
If your idea is to "share" a DB with a worker, you should always specify the DB file path, like await Deno.openKv("mydb.db") If you call Deno.openKv() without arguments, a new DB will be created for each worker instance because they are isolated from each another

Did you find this page helpful?