Skip to content

Commit a1d89a8

Browse files
committed
refactor(deno/idb): do not replace self.indexedDB
1 parent 8cc8754 commit a1d89a8

File tree

6 files changed

+108
-147
lines changed

6 files changed

+108
-147
lines changed

app/common/nostr.ts

+4-22
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { EventFilter, EventKind, NostrEvent } from "@lophus/nips";
44

55
export class Relay extends WithPool(_Relay) implements RelayLike {}
66

7-
interface EventSource extends Pick<RelayLike, "config"> {
7+
export interface EventSource extends Pick<RelayLike, "config"> {
88
list<K extends EventKind>(
99
filter: EventFilter<K>,
1010
): AsyncIterable<NostrEvent<K>>;
@@ -13,7 +13,7 @@ interface EventSource extends Pick<RelayLike, "config"> {
1313
): Promise<NostrEvent<K> | undefined>;
1414
}
1515

16-
interface EventStore extends EventSource {
16+
export interface EventStore extends EventSource {
1717
put<K extends EventKind>(event: NostrEvent<K>): Promise<void>;
1818
}
1919

@@ -26,32 +26,14 @@ const knowns = new RelayGroup([
2626
*/
2727
export const nostr: EventSource = {
2828
config: { name: "nostr" },
29-
async get(filter) {
30-
return await cache.get(filter) ?? _get(knowns, filter);
29+
get(filter) {
30+
return _get(knowns, filter);
3131
},
3232
list(filter) {
3333
return knowns.subscribe(filter);
3434
},
3535
};
3636

37-
export const cache: EventStore = {
38-
config: { name: "cache" },
39-
async get<K extends EventKind>(filter: EventFilter<K>) {
40-
const kv = await Deno.openKv();
41-
if (filter.ids?.length) {
42-
return Promise.any(
43-
filter.ids.map((id) =>
44-
new Promise<NostrEvent<K>>((resolve, reject) =>
45-
kv.get<NostrEvent<K>>(["events", id]).then(({ value }) =>
46-
value ? resolve(value) : reject()
47-
)
48-
)
49-
),
50-
).catch(() => undefined);
51-
}
52-
},
53-
};
54-
5537
async function _get<K extends EventKind>(
5638
source: RelayLike,
5739
filter: EventFilter<K>,

deno.lock

+4-28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

deno/idb/mod.ts

+53-57
Original file line numberDiff line numberDiff line change
@@ -24,65 +24,61 @@ export interface IDBFactory {
2424
deleteDatabase(name: string): IDBOpenDBRequest<undefined, null>;
2525
}
2626

27-
const kv = await Deno.openKv();
28-
29-
export const indexedDB: IDBFactory = {
30-
open(
31-
name: string,
32-
version: number = 1,
33-
): IDBOpenDBRequest<IDBDatabase, null> {
34-
return new _IDBOpenDBRequest(async function () {
35-
// Check if the database already exists and is up to date.
36-
const existed = await kv.get<IDBDatabaseInfo>($.database(name));
37-
if (existed.value?.version && existed.value.version >= version) {
38-
const stores = new Map<string, IDBObjectStoreParameters>();
39-
const iter = kv.list<IDBObjectStoreParameters>({
40-
prefix: $.store.prefix,
41-
});
42-
for await (const { key, value } of iter) {
43-
const name = key.toReversed()[0] as string;
44-
stores.set(name, value);
27+
export function createIDBFactory(
28+
kv: Deno.Kv,
29+
): IDBFactory {
30+
return {
31+
open(
32+
name: string,
33+
version: number = 1,
34+
): IDBOpenDBRequest<IDBDatabase, null> {
35+
return new _IDBOpenDBRequest(async function () {
36+
// Check if the database already exists and is up to date.
37+
const existed = await kv.get<IDBDatabaseInfo>($.database(name));
38+
if (existed.value?.version && existed.value.version >= version) {
39+
const stores = new Map<string, IDBObjectStoreParameters>();
40+
const iter = kv.list<IDBObjectStoreParameters>({
41+
prefix: $.store.prefix,
42+
});
43+
for await (const { key, value } of iter) {
44+
const name = key.toReversed()[0] as string;
45+
stores.set(name, value);
46+
}
47+
return new _IDBDatabase(name, version, kv, stores);
4548
}
46-
return new _IDBDatabase(name, version, kv, stores);
47-
}
48-
// Create the new database.
49-
await kv.set($.database(name), { name, version });
50-
const db = new _IDBDatabase(name, version, kv, new Map());
51-
const transaction = new _IDBTransaction(db, "versionchange");
52-
this.transaction = transaction as IDBTransaction<"versionchange">;
53-
db._transaction = transaction;
54-
this.result = db;
55-
this.dispatchEvent(
56-
new _IDBVersionChangeEvent(existed.value?.version ?? 0, version),
57-
);
58-
await new Promise((resolve) => {
59-
transaction.addEventListener("complete", resolve);
60-
});
61-
db._transaction = null;
62-
return db;
63-
}) as IDBOpenDBRequest<IDBDatabase, null>;
64-
},
65-
66-
cmp(_a: unknown, _b: unknown): -1 | 0 | 1 {
67-
console.warn("indexedDB.cmp is not implemented");
68-
return 0;
69-
},
49+
// Create the new database.
50+
await kv.set($.database(name), { name, version });
51+
const db = new _IDBDatabase(name, version, kv, new Map());
52+
const transaction = new _IDBTransaction(db, "versionchange");
53+
this.transaction = transaction as IDBTransaction<"versionchange">;
54+
db._transaction = transaction;
55+
this.result = db;
56+
this.dispatchEvent(
57+
new _IDBVersionChangeEvent(existed.value?.version ?? 0, version),
58+
);
59+
await new Promise((resolve) => {
60+
transaction.addEventListener("complete", resolve);
61+
});
62+
db._transaction = null;
63+
return db;
64+
}) as IDBOpenDBRequest<IDBDatabase, null>;
65+
},
7066

71-
async databases(): Promise<IDBDatabaseInfo[]> {
72-
const iter = kv.list<IDBDatabaseInfo>({ prefix: $.database.prefix });
73-
return (await Array.fromAsync(iter)).map((it) => it.value);
74-
},
67+
cmp(_a: unknown, _b: unknown): -1 | 0 | 1 {
68+
console.warn("indexedDB.cmp is not implemented");
69+
return 0;
70+
},
7571

76-
deleteDatabase(name: string): IDBOpenDBRequest<undefined, null> {
77-
return new _IDBOpenDBRequest(async () => {
78-
await kv.delete($.database(name));
79-
return undefined;
80-
}) as IDBOpenDBRequest<undefined, null>;
81-
},
82-
};
72+
async databases(): Promise<IDBDatabaseInfo[]> {
73+
const iter = kv.list<IDBDatabaseInfo>({ prefix: $.database.prefix });
74+
return (await Array.fromAsync(iter)).map((it) => it.value);
75+
},
8376

84-
if (self.indexedDB === undefined && self.Deno.Kv) {
85-
console.warn("Using an experimental IndexedDB polyfill with Deno KV");
86-
// @ts-ignore We type IDBFactory better
87-
self.indexedDB = indexedDB;
77+
deleteDatabase(name: string): IDBOpenDBRequest<undefined, null> {
78+
return new _IDBOpenDBRequest(async () => {
79+
await kv.delete($.database(name));
80+
return undefined;
81+
}) as IDBOpenDBRequest<undefined, null>;
82+
},
83+
};
8884
}

0 commit comments

Comments
 (0)