Files
warp/tools/leveldb.ts
2023-01-20 12:00:00 +01:00

78 lines
1.9 KiB
TypeScript

/* eslint-disable */
import {Level} from "level";
import {DEFAULT_LEVEL_DB_LOCATION, sleep, timeout} from "../src";
class SwGlobalMock {
db: Level;
}
async function test() {
const {handle: handleFn2, swGlobal} = await prepareHandle();
// simulates the code of the JsHandlerAPI.handle
await doHandle(swGlobal, handleFn2);
await doHandle(swGlobal, handleFn2);
await doHandle(swGlobal, handleFn2);
await doHandle(swGlobal, handleFn2);
}
async function prepareHandle() {
await sleep(10);
// simulates contract handle function
const swGlobal = new SwGlobalMock();
const handle = new Function(`
const [swGlobal] = arguments;
async function handle(state, input) {
await sleep(1000);
console.log('from handle:', await swGlobal.db.get('foo'));
}
const sleep = (ms) => {
return new Promise((resolve) => setTimeout(resolve, ms));
}
return handle;
`)(swGlobal);
return {handle, swGlobal};
}
async function doHandle(swGlobal: SwGlobalMock, handleFn: Function) {
const {timeoutId, timeoutPromise} = timeout(10);
let now = new Date();
// the kv storage
const db = new Level(`${DEFAULT_LEVEL_DB_LOCATION}/kv/the_test_${now}`);
swGlobal.db = db;
try {
console.log('======== Connecting to LMDB KV');
await db.open();
} catch (err) {
console.error(err.code) // 'LEVEL_DATABASE_NOT_OPEN'
if (err.cause && err.cause.code === 'LEVEL_LOCKED') {
console.error('LEVEL_LOCKED');
}
throw err;
}
await db.put('foo', 'bar');
try {
// simulates calling single contract interaction
await Promise.race([timeoutPromise, handleFn()]);
// simulates 'commit'
console.log('======== Committing');
await swGlobal.db.batch([]);
} finally {
console.log('======== Disconnecting from LMDB KV');
await db.close()
clearTimeout(timeoutId);
}
}
test().finally(() => {console.log('done')});