MCPcopy
hub / github.com/Effect-TS/effect / make

Function make

packages/experimental/src/Persistence/Lmdb.ts:16–81  ·  view source on GitHub ↗
(options: Lmdb.RootDatabaseOptionsWithPath)

Source from the content-addressed store, hash-verified

14 * @category constructors
15 */
16export const make = (options: Lmdb.RootDatabaseOptionsWithPath) =>
17 Effect.gen(function*() {
18 const lmdb = yield* Effect.acquireRelease(
19 Effect.sync(() => Lmdb.open(options)),
20 (lmdb) => Effect.promise(() => lmdb.close())
21 )
22
23 return Persistence.BackingPersistence.of({
24 [Persistence.BackingPersistenceTypeId]: Persistence.BackingPersistenceTypeId,
25 make: (storeId) =>
26 Effect.gen(function*() {
27 const clock = yield* Effect.clock
28 const store = yield* Effect.acquireRelease(
29 Effect.sync(() => lmdb.openDB({ name: storeId })),
30 (store) => Effect.promise(() => store.close())
31 )
32 const valueToOption = (key: string, _: any) => {
33 if (!Arr.isArray(_)) return Option.none()
34 const [value, expires] = _ as [unknown, number | null]
35 if (expires !== null && expires <= clock.unsafeCurrentTimeMillis()) {
36 store.remove(key)
37 return Option.none()
38 }
39 return Option.some(value)
40 }
41 return identity<Persistence.BackingPersistenceStore>({
42 get: (key) =>
43 Effect.try({
44 try: () => valueToOption(key, store.get(key)),
45 catch: (error) => Persistence.PersistenceBackingError.make("get", error)
46 }),
47 getMany: (keys) =>
48 Effect.map(
49 Effect.tryPromise({
50 try: () => store.getMany(keys),
51 catch: (error) => Persistence.PersistenceBackingError.make("getMany", error)
52 }),
53 Arr.map((value, i) => valueToOption(keys[i], value))
54 ),
55 set: (key, value, ttl) =>
56 Effect.tryPromise({
57 try: () => store.put(key, [value, Persistence.unsafeTtlToExpires(clock, ttl)]),
58 catch: (error) => Persistence.PersistenceBackingError.make("set", error)
59 }),
60 setMany: (entries) =>
61 Effect.tryPromise({
62 try: () =>
63 Promise.all(entries.map(([key, value, ttl]) =>
64 store.put(key, [value, Persistence.unsafeTtlToExpires(clock, ttl)])
65 )),
66 catch: (error) =>
67 Persistence.PersistenceBackingError.make("setMany", error)
68 }),
69 remove: (key) =>
70 Effect.tryPromise({
71 try: () => store.remove(key),
72 catch: (error) => Persistence.PersistenceBackingError.make("remove", error)
73 }),

Callers 4

layerFunction · 0.70
layerFunction · 0.70
layerStoreFunction · 0.50
layerStoreFunction · 0.50

Calls 11

identityFunction · 0.85
valueToOptionFunction · 0.85
syncMethod · 0.80
openMethod · 0.80
putMethod · 0.80
closeMethod · 0.65
ofMethod · 0.65
getMethod · 0.65
makeMethod · 0.65
mapMethod · 0.65
removeMethod · 0.65

Tested by

no test coverage detected