keystore_wdc
Version:
``` npm i keystore_wdc; const KeyStore = require('keystore_wdc'); const ks = new KeyStore(); ``` #### 生成keystore ``` async function create(){ const keystore = await ks.Create("your password"); } ``` * 返回keystore,密码格式不正确返回-1。
122 lines (94 loc) • 3.18 kB
text/typescript
import { Util, RLP } from '.'
enum Type {
SET, GET, REMOVE, HAS, NEXT, CURRENT_KEY, CURRENT_VALUE, HAS_NEXT, RESET
}
// @ts-ignore
@external("env", "_db")
declare function _db(type: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64): u64;
export class Entry {
constructor(readonly key: ArrayBuffer, readonly value: ArrayBuffer) {
}
}
export class Store<K, V>{
static from<U, R>(str: string): Store<U, R>{
return new Store(Util.str2bin(str));
}
constructor(readonly prefix: ArrayBuffer) {
}
private _key(key: K): ArrayBuffer{
return Util.concatBytes(this.prefix, RLP.encode<K>(key));
}
set(key: K, value: V): void {
DB.set(this._key(key), RLP.encode<V>(value));
}
remove(key: K): void {
DB.remove(this._key(key));
}
has(key: K): bool {
return DB.has(this._key(key));
}
getOrDefault(key: K, def: V): V {
return this.has(key) ? this.get(key) : def;
}
get(key: K): V {
return RLP.decode<V>(DB.get(this._key(key)));
}
}
export class Globals{
static set<V>(str: string, value: V): void {
DB.set(Util.str2bin(str), RLP.encode<V>(value));
}
static get<V>(str: string): V {
return RLP.decode<V>(DB.get(Util.str2bin(str)));
}
static getOrDefault<V>(str: string, value: V): V {
return DB.has(Util.str2bin(str)) ? RLP.decode<V>(DB.get(Util.str2bin(str))) : value;
}
static has(str: string): bool {
return DB.has(Util.str2bin(str));
}
static remove(str: string): void{
DB.remove(Util.str2bin(str));
}
}
export class DB {
static set(key: ArrayBuffer, value: ArrayBuffer): void {
_db(
Type.SET,
changetype<usize>(key), key.byteLength,
changetype<usize>(value), value.byteLength,
);
}
static remove(key: ArrayBuffer): void {
_db(
Type.REMOVE,
changetype<usize>(key), key.byteLength,
0, 0,
);
}
static has(key: ArrayBuffer): bool {
return _db(Type.HAS, changetype<usize>(key), key.byteLength, 0, 0) != 0;
}
static get(key: ArrayBuffer): ArrayBuffer {
const len = _db(Type.GET, changetype<usize>(key), key.byteLength, 0, 0);
const buf = new ArrayBuffer(i32(len));
_db(Type.GET, changetype<usize>(key), key.byteLength, changetype<usize>(buf), 1);
return buf;
}
}
export class DBIterator {
static next(): Entry {
_db(Type.NEXT, 0, 0, 0, 0);
const keyBuf = new ArrayBuffer(i32(_db(Type.CURRENT_KEY, 0, 0, 0, 0)));
_db(Type.CURRENT_KEY, changetype<usize>(keyBuf), 1, 0, 0);
const valueBuf = new ArrayBuffer(i32(_db(Type.CURRENT_VALUE, 0, 0, 0, 0)));
_db(Type.CURRENT_KEY, changetype<usize>(valueBuf), 1, 0, 0);
return new Entry(keyBuf, valueBuf);
}
static hasNext(): bool {
return _db(Type.HAS_NEXT, 0, 0, 0, 0) != 0;
}
static reset(): void {
_db(Type.RESET, 0, 0, 0, 0);
}
}