@tevm/utils
Version:
A custom implementation of ethereumjs blockchain
56 lines (52 loc) • 1.31 kB
JavaScript
import { UnreachableCodeError } from '@tevm/errors'
import { bytesToHex } from './viem.js'
/**
* Converts key to type that maps can use as keys
* @param {unknown} bytes
*/
const encodeKey = (bytes) => {
if (bytes instanceof Uint8Array) {
return bytesToHex(bytes)
}
return bytes
}
/**
* @internal
* A simple ethereumjs DB instance that uses an in memory Map as it's backend
* Pass in an initial DB optionally to prepoulate the DB.
* @type {import('./CreateMemoryDbFn.js').CreateMemoryDbFn}
* @throws {never}
*/
export const createMemoryDb = (initialDb) => {
const db = initialDb ?? new Map()
return {
get: (key) => {
return Promise.resolve(db.get(encodeKey(key)))
},
put: (key, value) => {
db.set(encodeKey(key), value)
return Promise.resolve()
},
del: (key) => {
db.delete(encodeKey(key))
return Promise.resolve()
},
shallowCopy: () => {
return createMemoryDb(new Map(db))
},
// For compatability
open: () => Promise.resolve(),
batch: (stack) => {
for (const item of stack) {
if (item.type === 'del') {
db.delete(encodeKey(item.key))
} else if (item.type === 'put') {
db.set(encodeKey(item.key), item.value)
} else {
return Promise.reject(new UnreachableCodeError(item))
}
}
return Promise.resolve()
},
}
}