@@ -5,10 +5,7 @@ const ShardingStore = core.ShardingDatastore
5
5
const Key = require ( 'interface-datastore' ) . Key
6
6
const base32 = require ( 'base32.js' )
7
7
const Block = require ( 'ipfs-block' )
8
- const setImmediate = require ( 'async/setImmediate' )
9
- const reject = require ( 'async/reject' )
10
8
const CID = require ( 'cids' )
11
- const pull = require ( 'pull-stream' )
12
9
13
10
/**
14
11
* Transform a raw buffer to a base32 encoded key.
@@ -31,21 +28,17 @@ const cidToDsKey = (cid) => {
31
28
return keyFromBuffer ( cid . buffer )
32
29
}
33
30
34
- module . exports = ( filestore , options , callback ) => {
35
- maybeWithSharding ( filestore , options , ( err , store ) => {
36
- if ( err ) { return callback ( err ) }
37
-
38
- callback ( null , createBaseStore ( store ) )
39
- } )
31
+ module . exports = async ( filestore , options ) => {
32
+ const store = await maybeWithSharding ( filestore , options )
33
+ return createBaseStore ( store )
40
34
}
41
35
42
- function maybeWithSharding ( filestore , options , callback ) {
36
+ function maybeWithSharding ( filestore , options ) {
43
37
if ( options . sharding ) {
44
38
const shard = new core . shard . NextToLast ( 2 )
45
- ShardingStore . createOrOpen ( filestore , shard , callback )
46
- } else {
47
- setImmediate ( ( ) => callback ( null , filestore ) )
39
+ return ShardingStore . createOrOpen ( filestore , shard )
48
40
}
41
+ return filestore
49
42
}
50
43
51
44
function createBaseStore ( store ) {
@@ -54,142 +47,113 @@ function createBaseStore (store) {
54
47
* Query the store.
55
48
*
56
49
* @param {object } query
57
- * @param {function(Error, Array) } callback
58
- * @return {void }
50
+ * @return {Iterable }
59
51
*/
60
- query ( query , callback ) {
61
- pull (
62
- store . query ( query ) ,
63
- pull . collect ( callback )
64
- )
52
+ query ( query ) {
53
+ return store . query ( query )
65
54
} ,
66
55
/**
67
56
* Get a single block by CID.
68
57
*
69
58
* @param {CID } cid
70
- * @param {function(Error, Block) } callback
71
- * @returns {void }
59
+ * @returns {Promise<Block> }
72
60
*/
73
- get ( cid , callback ) {
61
+ async get ( cid ) {
74
62
if ( ! CID . isCID ( cid ) ) {
75
- return setImmediate ( ( ) => {
76
- callback ( new Error ( 'Not a valid cid' ) )
77
- } )
63
+ throw new Error ( 'Not a valid cid' )
78
64
}
79
-
80
65
const key = cidToDsKey ( cid )
81
- store . get ( key , ( err , blockData ) => {
82
- if ( err ) {
83
- // If not found, we try with the other CID version.
84
- // If exists, then store that block under the CID that was requested.
85
- // Some duplication occurs.
86
- if ( err . code === 'ERR_NOT_FOUND' ) {
87
- const otherCid = cidToOtherVersion ( cid )
88
- if ( ! otherCid ) return callback ( err )
89
-
90
- const otherKey = cidToDsKey ( otherCid )
91
- return store . get ( otherKey , ( err , blockData ) => {
92
- if ( err ) return callback ( err )
93
-
94
- store . put ( key , blockData , ( err ) => {
95
- if ( err ) return callback ( err )
96
- callback ( null , new Block ( blockData , cid ) )
97
- } )
98
- } )
99
- }
100
-
101
- return callback ( err )
66
+ let blockData
67
+ try {
68
+ blockData = await store . get ( key )
69
+ return new Block ( blockData , cid )
70
+ } catch ( err ) {
71
+ if ( err . code === 'ERR_NOT_FOUND' ) {
72
+ const otherCid = cidToOtherVersion ( cid )
73
+ if ( ! otherCid ) throw err
74
+
75
+ const otherKey = cidToDsKey ( otherCid )
76
+ const blockData = await store . get ( otherKey )
77
+ await store . put ( key , blockData )
78
+ return new Block ( blockData , cid )
102
79
}
103
-
104
- callback ( null , new Block ( blockData , cid ) )
105
- } )
80
+ }
106
81
} ,
107
- put ( block , callback ) {
82
+ /**
83
+ * Write a single block to the store.
84
+ *
85
+ * @param {Block } block
86
+ * @returns {Promise<void> }
87
+ */
88
+ put ( block ) {
108
89
if ( ! Block . isBlock ( block ) ) {
109
- return setImmediate ( ( ) => {
110
- callback ( new Error ( 'invalid block' ) )
111
- } )
90
+ throw new Error ( 'invalid block' )
112
91
}
113
92
114
93
const k = cidToDsKey ( block . cid )
115
-
116
- store . has ( k , ( err , exists ) => {
117
- if ( err ) { return callback ( err ) }
118
- if ( exists ) { return callback ( ) }
119
-
120
- store . put ( k , block . data , callback )
94
+ return store . has ( k ) . then ( ( exists ) => {
95
+ if ( exists ) { return }
96
+ return store . put ( k , block . data )
121
97
} )
122
98
} ,
99
+
123
100
/**
124
101
* Like put, but for more.
125
102
*
126
103
* @param {Array<Block> } blocks
127
- * @param {function(Error) } callback
128
- * @returns {void }
104
+ * @returns {Promise<void> }
129
105
*/
130
- putMany ( blocks , callback ) {
106
+ async putMany ( blocks ) {
131
107
const keys = blocks . map ( ( b ) => ( {
132
108
key : cidToDsKey ( b . cid ) ,
133
109
block : b
134
110
} ) )
135
111
136
- const batch = store . batch ( )
137
- reject ( keys , ( k , cb ) => store . has ( k . key , cb ) , ( err , newKeys ) => {
138
- if ( err ) {
139
- return callback ( err )
140
- }
141
-
142
- newKeys . forEach ( ( k ) => {
143
- batch . put ( k . key , k . block . data )
144
- } )
145
-
146
- batch . commit ( callback )
112
+ const batch = await store . batch ( )
113
+ const newKeys = await Promise . all ( keys . filter ( ( k ) => { store . has ( k . key ) } ) )
114
+ newKeys . forEach ( ( k ) => {
115
+ batch . put ( k . key , k . block . data )
147
116
} )
117
+ return batch . commit ( )
148
118
} ,
149
119
/**
150
120
* Does the store contain block with this cid?
151
121
*
152
122
* @param {CID } cid
153
- * @param {function(Error, bool) } callback
154
- * @returns {void }
123
+ * @returns {Promise<bool> }
155
124
*/
156
- has ( cid , callback ) {
125
+ has ( cid ) {
157
126
if ( ! CID . isCID ( cid ) ) {
158
- return setImmediate ( ( ) => {
159
- callback ( new Error ( 'Not a valid cid' ) )
160
- } )
127
+ throw new Error ( 'Not a valid cid' )
161
128
}
162
129
163
- store . has ( cidToDsKey ( cid ) , ( err , exists ) => {
164
- if ( err ) return callback ( err )
165
- if ( exists ) return callback ( null , true )
166
-
167
- // If not found, we try with the other CID version.
168
- const otherCid = cidToOtherVersion ( cid )
169
- if ( ! otherCid ) return callback ( null , false )
170
-
171
- store . has ( cidToDsKey ( otherCid ) , callback )
172
- } )
130
+ return store . has ( cidToDsKey ( cid ) )
131
+ . then ( ( exists ) => {
132
+ if ( exists ) return exists
133
+ const otherCid = cidToOtherVersion ( cid )
134
+ if ( ! otherCid ) return false
135
+ return store . has ( cidToDsKey ( otherCid ) )
136
+ } )
173
137
} ,
174
138
/**
175
139
* Delete a block from the store
176
140
*
177
141
* @param {CID } cid
178
- * @param {function(Error) } callback
179
- * @returns {void }
142
+ * @returns {Promise<void> }
180
143
*/
181
- delete ( cid , callback ) {
144
+ delete ( cid ) {
182
145
if ( ! CID . isCID ( cid ) ) {
183
- return setImmediate ( ( ) => {
184
- callback ( new Error ( 'Not a valid cid' ) )
185
- } )
146
+ throw new Error ( 'Not a valid cid' )
186
147
}
187
-
188
- store . delete ( cidToDsKey ( cid ) , callback )
148
+ return store . delete ( cidToDsKey ( cid ) )
189
149
} ,
190
-
191
- close ( callback ) {
192
- store . close ( callback )
150
+ /**
151
+ * Close the store
152
+ *
153
+ * @returns {Promise<void> }
154
+ */
155
+ close ( ) {
156
+ return store . close ( )
193
157
}
194
158
}
195
159
}
0 commit comments