( db: IDBDatabase, clock: Clock.Clock, storeId: string, keys: Arr.NonEmptyArray<string> )
| 150 | ) |
| 151 | |
| 152 | const getMany = ( |
| 153 | db: IDBDatabase, |
| 154 | clock: Clock.Clock, |
| 155 | storeId: string, |
| 156 | keys: Arr.NonEmptyArray<string> |
| 157 | ): Effect.Effect<Arr.NonEmptyArray<object | undefined>, Persistence.PersistenceError> => |
| 158 | withEntriesTransaction( |
| 159 | db, |
| 160 | "readwrite", |
| 161 | "Failed to getMany from backing store", |
| 162 | (entries, setResult, fail) => { |
| 163 | const now = clock.currentTimeMillisUnsafe() |
| 164 | const results = new Array<object | undefined>(keys.length) |
| 165 | setResult(results as any) |
| 166 | |
| 167 | for (let i = 0; i < keys.length; i++) { |
| 168 | const key = keys[i] |
| 169 | const keyPath = [storeId, key] |
| 170 | const request = entries.get(keyPath) |
| 171 | request.onerror = () => fail(request.error) |
| 172 | request.onsuccess = () => { |
| 173 | const row = request.result as EntryRow | undefined |
| 174 | if (!row) return |
| 175 | else if (!isExpired(row, now)) { |
| 176 | results[i] = row.value |
| 177 | return |
| 178 | } |
| 179 | const deleteRequest = entries.delete(keyPath) |
| 180 | deleteRequest.onerror = () => fail(deleteRequest.error) |
| 181 | } |
| 182 | } |
| 183 | } |
| 184 | ) |
| 185 | |
| 186 | const set = ( |
| 187 | db: IDBDatabase, |
no test coverage detected