| 14 | * @category constructors |
| 15 | */ |
| 16 | export 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 | }), |