@@ -8,6 +8,7 @@ const DS = require('interface-datastore')
88const collect = require ( 'pull-stream/sinks/collect' )
99const pull = require ( 'pull-stream/pull' )
1010const CMS = require ( './cms' )
11+ const errcode = require ( 'err-code' )
1112
1213const keyPrefix = '/pkcs8/'
1314const infoPrefix = '/info/'
@@ -50,7 +51,7 @@ function _error (callback, err) {
5051 const min = 200
5152 const max = 1000
5253 const delay = Math . random ( ) * ( max - min ) + min
53- if ( typeof err === 'string' ) err = new Error ( err )
54+
5455 setTimeout ( callback , delay , err , null )
5556}
5657
@@ -181,26 +182,26 @@ class Keychain {
181182 const self = this
182183
183184 if ( ! validateKeyName ( name ) || name === 'self' ) {
184- return _error ( callback , `Invalid key name '${ name } '` )
185+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
185186 }
186187
187188 if ( typeof type !== 'string' ) {
188- return _error ( callback , `Invalid key type '${ type } '` )
189+ return _error ( callback , errcode ( new Error ( `Invalid key type '${ type } '` ) , 'ERR_INVALID_KEY_TYPE' ) )
189190 }
190191
191192 if ( ! Number . isSafeInteger ( size ) ) {
192- return _error ( callback , `Invalid key size '${ size } '` )
193+ return _error ( callback , errcode ( new Error ( `Invalid key size '${ size } '` ) , 'ERR_INVALID_KEY_SIZE' ) )
193194 }
194195
195196 const dsname = DsName ( name )
196197 self . store . has ( dsname , ( err , exists ) => {
197198 if ( err ) return _error ( callback , err )
198- if ( exists ) return _error ( callback , `Key '${ name } ' already exists` )
199+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ name } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
199200
200201 switch ( type . toLowerCase ( ) ) {
201202 case 'rsa' :
202203 if ( size < 2048 ) {
203- return _error ( callback , `Invalid RSA key size ${ size } ` )
204+ return _error ( callback , errcode ( new Error ( `Invalid RSA key size ${ size } ` ) , 'ERR_INVALID_KEY_SIZE' ) )
204205 }
205206 break
206207 default :
@@ -278,13 +279,13 @@ class Keychain {
278279 */
279280 findKeyByName ( name , callback ) {
280281 if ( ! validateKeyName ( name ) ) {
281- return _error ( callback , `Invalid key name '${ name } '` )
282+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
282283 }
283284
284285 const dsname = DsInfoName ( name )
285286 this . store . get ( dsname , ( err , res ) => {
286287 if ( err ) {
287- return _error ( callback , `Key '${ name } ' does not exist. ${ err . message } ` )
288+ return _error ( callback , errcode ( new Error ( `Key '${ name } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
288289 }
289290
290291 callback ( null , JSON . parse ( res . toString ( ) ) )
@@ -301,7 +302,7 @@ class Keychain {
301302 removeKey ( name , callback ) {
302303 const self = this
303304 if ( ! validateKeyName ( name ) || name === 'self' ) {
304- return _error ( callback , `Invalid key name '${ name } '` )
305+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
305306 }
306307 const dsname = DsName ( name )
307308 self . findKeyByName ( name , ( err , keyinfo ) => {
@@ -327,23 +328,23 @@ class Keychain {
327328 renameKey ( oldName , newName , callback ) {
328329 const self = this
329330 if ( ! validateKeyName ( oldName ) || oldName === 'self' ) {
330- return _error ( callback , `Invalid old key name '${ oldName } '` )
331+ return _error ( callback , errcode ( new Error ( `Invalid old key name '${ oldName } '` ) , 'ERR_OLD_KEY_NAME_INVALID' ) )
331332 }
332333 if ( ! validateKeyName ( newName ) || newName === 'self' ) {
333- return _error ( callback , `Invalid new key name '${ newName } '` )
334+ return _error ( callback , errcode ( new Error ( `Invalid new key name '${ newName } '` ) , 'ERR_NEW_KEY_NAME_INVALID' ) )
334335 }
335336 const oldDsname = DsName ( oldName )
336337 const newDsname = DsName ( newName )
337338 const oldInfoName = DsInfoName ( oldName )
338339 const newInfoName = DsInfoName ( newName )
339340 this . store . get ( oldDsname , ( err , res ) => {
340341 if ( err ) {
341- return _error ( callback , `Key '${ oldName } ' does not exist. ${ err . message } ` )
342+ return _error ( callback , errcode ( new Error ( `Key '${ oldName } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
342343 }
343344 const pem = res . toString ( )
344345 self . store . has ( newDsname , ( err , exists ) => {
345346 if ( err ) return _error ( callback , err )
346- if ( exists ) return _error ( callback , `Key '${ newName } ' already exists` )
347+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ newName } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
347348
348349 self . store . get ( oldInfoName , ( err , res ) => {
349350 if ( err ) return _error ( callback , err )
@@ -374,16 +375,16 @@ class Keychain {
374375 */
375376 exportKey ( name , password , callback ) {
376377 if ( ! validateKeyName ( name ) ) {
377- return _error ( callback , `Invalid key name '${ name } '` )
378+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
378379 }
379380 if ( ! password ) {
380- return _error ( callback , 'Password is required' )
381+ return _error ( callback , errcode ( new Error ( 'Password is required' ) , 'ERR_PASSWORD_REQUIRED' ) )
381382 }
382383
383384 const dsname = DsName ( name )
384385 this . store . get ( dsname , ( err , res ) => {
385386 if ( err ) {
386- return _error ( callback , `Key '${ name } ' does not exist. ${ err . message } ` )
387+ return _error ( callback , errcode ( new Error ( `Key '${ name } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
387388 }
388389 const pem = res . toString ( )
389390 crypto . keys . import ( pem , this . _ ( ) , ( err , privateKey ) => {
@@ -405,17 +406,17 @@ class Keychain {
405406 importKey ( name , pem , password , callback ) {
406407 const self = this
407408 if ( ! validateKeyName ( name ) || name === 'self' ) {
408- return _error ( callback , `Invalid key name '${ name } '` )
409+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
409410 }
410411 if ( ! pem ) {
411412 return _error ( callback , 'PEM encoded key is required' )
412413 }
413414 const dsname = DsName ( name )
414415 self . store . has ( dsname , ( err , exists ) => {
415416 if ( err ) return _error ( callback , err )
416- if ( exists ) return _error ( callback , `Key '${ name } ' already exists` )
417+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ name } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
417418 crypto . keys . import ( pem , password , ( err , privateKey ) => {
418- if ( err ) return _error ( callback , 'Cannot read the key, most likely the password is wrong' )
419+ if ( err ) return _error ( callback , errcode ( new Error ( 'Cannot read the key, most likely the password is wrong' ) , 'ERR_CANNOT_READ_KEY' ) )
419420 privateKey . id ( ( err , kid ) => {
420421 if ( err ) return _error ( callback , err )
421422 privateKey . export ( this . _ ( ) , ( err , pem ) => {
@@ -441,17 +442,17 @@ class Keychain {
441442 importPeer ( name , peer , callback ) {
442443 const self = this
443444 if ( ! validateKeyName ( name ) ) {
444- return _error ( callback , `Invalid key name '${ name } '` )
445+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
445446 }
446447 if ( ! peer || ! peer . privKey ) {
447- return _error ( callback , 'Peer.privKey is required' )
448+ return _error ( callback , errcode ( new Error ( 'Peer.privKey is required' ) , 'ERR_MISSING_PRIVATE_KEY' ) )
448449 }
449450
450451 const privateKey = peer . privKey
451452 const dsname = DsName ( name )
452453 self . store . has ( dsname , ( err , exists ) => {
453454 if ( err ) return _error ( callback , err )
454- if ( exists ) return _error ( callback , `Key '${ name } ' already exists` )
455+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ name } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
455456
456457 privateKey . id ( ( err , kid ) => {
457458 if ( err ) return _error ( callback , err )
@@ -484,11 +485,11 @@ class Keychain {
484485 */
485486 _getPrivateKey ( name , callback ) {
486487 if ( ! validateKeyName ( name ) ) {
487- return _error ( callback , `Invalid key name '${ name } '` )
488+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
488489 }
489490 this . store . get ( DsName ( name ) , ( err , res ) => {
490491 if ( err ) {
491- return _error ( callback , `Key '${ name } ' does not exist. ${ err . message } ` )
492+ return _error ( callback , errcode ( new Error ( `Key '${ name } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
492493 }
493494 callback ( null , res . toString ( ) )
494495 } )
0 commit comments