11'use strict'
22
33const fs = require ( 'fs' )
4- const glob = require ( 'glob' )
4+ const glob = require ( 'it- glob' )
55const mkdirp = require ( 'mkdirp' )
66const promisify = require ( 'util' ) . promisify
77const writeAtomic = promisify ( require ( 'fast-write-atomic' ) )
@@ -117,7 +117,7 @@ class FsDatastore extends Adapter {
117117 * Write to the file system without extension.
118118 *
119119 * @param {Key } key
120- * @param {Buffer } val
120+ * @param {Uint8Array } val
121121 * @returns {Promise<void> }
122122 */
123123 async putRaw ( key , val ) {
@@ -131,11 +131,12 @@ class FsDatastore extends Adapter {
131131 * Store the given value under the key
132132 *
133133 * @param {Key } key
134- * @param {Buffer } val
134+ * @param {Uint8Array } val
135135 * @returns {Promise<void> }
136136 */
137137 async put ( key , val ) {
138138 const parts = this . _encode ( key )
139+
139140 try {
140141 await mkdirp ( parts . dir , { fs : fs } )
141142 await writeFile ( parts . file , val )
@@ -148,7 +149,7 @@ class FsDatastore extends Adapter {
148149 * Read from the file system without extension.
149150 *
150151 * @param {Key } key
151- * @returns {Promise<Buffer > }
152+ * @returns {Promise<Uint8Array > }
152153 */
153154 async getRaw ( key ) {
154155 const parts = this . _encode ( key )
@@ -167,7 +168,7 @@ class FsDatastore extends Adapter {
167168 * Read from the file system.
168169 *
169170 * @param {Key } key
170- * @returns {Promise<Buffer > }
171+ * @returns {Promise<Uint8Array > }
171172 */
172173 async get ( key ) {
173174 const parts = this . _encode ( key )
@@ -216,22 +217,35 @@ class FsDatastore extends Adapter {
216217 }
217218
218219 async * _all ( q ) { // eslint-disable-line require-await
219- // glob expects a POSIX path
220- const prefix = q . prefix || '**'
221- const pattern = path
222- . join ( this . path , prefix , '*' + this . opts . extension )
220+ let prefix = q . prefix || '**'
221+
222+ // strip leading slashes
223+ prefix = prefix . replace ( / ^ \/ + / , '' )
224+
225+ const pattern = `${ prefix } /*${ this . opts . extension } `
223226 . split ( path . sep )
224227 . join ( '/' )
225- const files = glob . sync ( pattern )
228+ const files = glob ( this . path , pattern , {
229+ absolute : true
230+ } )
226231
227232 if ( ! q . keysOnly ) {
228- yield * map ( files , async ( f ) => {
229- const buf = await fsReadFile ( f )
230- return {
231- key : this . _decode ( f ) ,
232- value : buf
233+ for await ( const file of files ) {
234+ try {
235+ const buf = await fsReadFile ( file )
236+
237+ yield {
238+ key : this . _decode ( file ) ,
239+ value : buf
240+ }
241+ } catch ( err ) {
242+ // if keys are removed from the datastore while the query is
243+ // running, we may encounter missing files.
244+ if ( err . code !== 'ENOENT' ) {
245+ throw err
246+ }
233247 }
234- } )
248+ }
235249 } else {
236250 yield * map ( files , f => ( { key : this . _decode ( f ) } ) )
237251 }
0 commit comments