Skip to content
This repository was archived by the owner on Mar 23, 2023. It is now read-only.

Commit 78e4911

Browse files
authored
fix: restore open options and support old level iterators (#132)
1 parent 9a92038 commit 78e4911

File tree

1 file changed

+59
-3
lines changed

1 file changed

+59
-3
lines changed

src/index.js

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { Level } from 'level'
2222
export class LevelDatastore extends BaseDatastore {
2323
/**
2424
* @param {string | LevelDb} path
25-
* @param {import('level').DatabaseOptions<string, Uint8Array>} [opts]
25+
* @param {import('level').DatabaseOptions<string, Uint8Array> & import('level').OpenOptions} [opts]
2626
*/
2727
constructor (path, opts = {}) {
2828
super()
@@ -35,11 +35,18 @@ export class LevelDatastore extends BaseDatastore {
3535
valueEncoding: 'view'
3636
})
3737
: path
38+
39+
/** @type {import('level').OpenOptions} */
40+
this.opts = {
41+
createIfMissing: true,
42+
compression: false, // same default as go
43+
...opts
44+
}
3845
}
3946

4047
async open () {
4148
try {
42-
await this.db.open()
49+
await this.db.open(this.opts)
4350
} catch (/** @type {any} */ err) {
4451
throw Errors.dbOpenFailedError(err)
4552
}
@@ -211,7 +218,19 @@ export class LevelDatastore extends BaseDatastore {
211218
iteratorOpts.lt = prefix + '\xFF'
212219
}
213220

214-
return levelIteratorToIterator(this.db.iterator(iteratorOpts))
221+
const iterator = this.db.iterator(iteratorOpts)
222+
223+
if (iterator[Symbol.asyncIterator]) {
224+
return levelIteratorToIterator(iterator)
225+
}
226+
227+
// @ts-expect-error support older level
228+
if (iterator.next != null && iterator.end != null) {
229+
// @ts-expect-error support older level
230+
return oldLevelIteratorToIterator(iterator)
231+
}
232+
233+
throw new Error('Level returned incompatible iterator')
215234
}
216235
}
217236

@@ -226,3 +245,40 @@ async function * levelIteratorToIterator (li) {
226245

227246
await li.close()
228247
}
248+
249+
/**
250+
* @typedef {object} LevelIterator
251+
* @property {(cb: (err: Error, key: string | Uint8Array | null, value: any)=> void)=>void} next
252+
* @property {(cb: (err: Error) => void) => void } end
253+
*/
254+
255+
/**
256+
* @param {LevelIterator} li - Level iterator
257+
* @returns {AsyncIterable<Pair>}
258+
*/
259+
function oldLevelIteratorToIterator (li) {
260+
return {
261+
[Symbol.asyncIterator] () {
262+
return {
263+
next: () => new Promise((resolve, reject) => {
264+
li.next((err, key, value) => {
265+
if (err) return reject(err)
266+
if (key == null) {
267+
return li.end(err => {
268+
if (err) return reject(err)
269+
resolve({ done: true, value: undefined })
270+
})
271+
}
272+
resolve({ done: false, value: { key: new Key(key, false), value } })
273+
})
274+
}),
275+
return: () => new Promise((resolve, reject) => {
276+
li.end(err => {
277+
if (err) return reject(err)
278+
resolve({ done: true, value: undefined })
279+
})
280+
})
281+
}
282+
}
283+
}
284+
}

0 commit comments

Comments
 (0)