hamok
Version:
Lightweight Distributed Object Storage on RAFT consensus algorithm
75 lines (57 loc) • 2.15 kB
text/typescript
import { Hamok, setHamokLogLevel } from 'hamok';
import * as pino from 'pino';
const logger = pino.pino({
name: 'record-update-if',
level: 'debug',
});
type MySharedConfig = {
foo: string;
bar: number;
}
export async function run() {
const server_1 = new Hamok();
const server_2 = new Hamok();
server_1.on('message', server_2.accept.bind(server_2));
server_2.on('message', server_1.accept.bind(server_1));
server_1.addRemotePeerId(server_2.localPeerId);
server_2.addRemotePeerId(server_1.localPeerId);
await Promise.all([
server_1.join(),
server_2.join(),
]);
const storage_1 = server_1.createRecord<MySharedConfig>({
recordId: 'my-replicated-record',
});
const storage_2 = server_2.createRecord<MySharedConfig>({
recordId: 'my-replicated-record',
});
logger.debug(`Inserting values into replicated record.`);
const [ insertedByServer2, insertedByServer1 ] = await Promise.all([
storage_1.insertInstance({
bar: 1,
foo: 'inserted-by-server-1',
}),
storage_2.insertInstance({
bar: 2,
foo: 'inserted-by-server-2',
}),
]);
logger.debug('Inserted values into replicated record. %o, %o', insertedByServer1, insertedByServer2);
if (insertedByServer1 && !insertedByServer2) logger.debug('Server 1 inserted %o', insertedByServer1);
else if (insertedByServer2 && !insertedByServer1) logger.debug('Server 2 inserted %o', insertedByServer2);
else throw new Error('Both servers inserted the record or neither of them');
const [ updatedByServer1, updatedByServer2 ] = await Promise.all([
storage_1.updateInstanceIf({bar: 5}, insertedByServer1 ?? insertedByServer2 ?? {}),
storage_2.updateInstanceIf({bar: 6}, insertedByServer1 ?? insertedByServer2 ?? {})
]);
updatedByServer1 && logger.debug('Server 1 updated %o. instance: %o', updatedByServer1, storage_1.instance);
updatedByServer2 && logger.debug('Server 2 updated %o. instance: %o', updatedByServer2, storage_2.instance);
await new Promise(resolve => setTimeout(resolve, 1000));
server_1.close();
server_2.close();
}
if (require.main === module) {
logger.info('Running from module file');
setHamokLogLevel('info');
run();
}