@bajetech/digitalbits-wallet-sdk
Version:
A library to make it easier to write wallets that interact with the DigitalBits blockchain
119 lines (102 loc) • 3.63 kB
text/typescript
import { getKeyMetadata } from "../helpers/getKeyMetadata";
import { EncryptedKey, KeyMetadata, KeyStore } from "../types";
import {
LocalStorageConfigParams,
LocalStorageFacade,
} from "./LocalStorageFacade";
/**
* KeyStore for the Web Storage API :
* https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API.
* Once instantiated and configured, pass it to the `KeyManager` contructor to
* handle the storage of encrypted keys.
* ```js
* const localKeyStore = new KeyManagerPlugins.LocalStorageKeyStore();
* localKeyStore.configure({ storage: localStorage });
* const keyManager = new KeyManager({
* keyStore: localKeyStore
* });
* ```
*/
export class LocalStorageKeyStore implements KeyStore {
public name: string;
private keyStore: LocalStorageFacade;
constructor() {
this.name = "LocalStorageKeyStore";
this.keyStore = new LocalStorageFacade();
}
/**
* The configuration is where the storage engine is set up and configured.
* It must follow the Storage interface :
* https://developer.mozilla.org/en-US/docs/Web/API/Storage).
* In the DOM environment it can be `localStorage` or `sessionStorage`.
* In a Node environment, there are some substitution libraries available,
* *node-localstorage* for instance.
* If not set, the calls to the other methods will fail.
* @param {LocalStorageConfigParams} params A configuration object.
* @param {Storage} params.storage The Storage instance. Required.
* @param {string} [params.prefix] The prefix for the names in the storage.
* @return {Promise}
*/
public configure(params: LocalStorageConfigParams): Promise<void> {
try {
this.keyStore.configure(params);
return Promise.resolve();
} catch (e) {
return Promise.reject(e);
}
}
public storeKeys(keys: EncryptedKey[]) {
// We can't store keys if they're already there
const invalidKeys: EncryptedKey[] = keys.filter(
(encryptedKey: EncryptedKey) => this.keyStore.hasKey(encryptedKey.id)
);
if (invalidKeys.length) {
return Promise.reject(
`Some keys were already stored in the keystore: ${invalidKeys
.map(k => k.id)
.join(", ")}`
);
}
const keysMetadata = keys.map((encryptedKey: EncryptedKey) => {
this.keyStore.setKey(encryptedKey.id, encryptedKey);
return getKeyMetadata(encryptedKey);
});
return Promise.resolve(keysMetadata);
}
public updateKeys(keys: EncryptedKey[]) {
// we can't update keys if they're not already stored
const invalidKeys: EncryptedKey[] = keys.filter(
(encryptedKey: EncryptedKey) => !this.keyStore.hasKey(encryptedKey.id)
);
if (invalidKeys.length) {
return Promise.reject(
`Some keys couldn't be found in the keystore: ${invalidKeys
.map(k => k.id)
.join(", ")}`
);
}
const keysMetadata = keys.map((encryptedKey: EncryptedKey) => {
this.keyStore.setKey(encryptedKey.id, encryptedKey);
return getKeyMetadata(encryptedKey);
});
return Promise.resolve(keysMetadata);
}
public loadKey(id: string) {
const key = this.keyStore.getKey(id);
if (!key) {
return Promise.reject(id);
}
return Promise.resolve(key);
}
public removeKey(id: string) {
if (!this.keyStore.hasKey(id)) {
return Promise.reject(id);
}
const metadata: KeyMetadata = getKeyMetadata(this.keyStore.getKey(id));
this.keyStore.removeKey(id);
return Promise.resolve(metadata);
}
public loadAllKeys() {
return Promise.resolve(this.keyStore.getAllKeys());
}
}