hamok
Version:
Lightweight Distributed Object Storage on RAFT consensus algorithm
67 lines (51 loc) • 2.07 kB
text/typescript
import { Hamok, setHamokLogLevel } from 'hamok';
import * as pino from 'pino';
import { HamokMessageHub } from './utils/HamokMessageHub';
const logger = pino.pino({
name: 'map-update-if-example',
level: 'debug',
});
type Job = {
id: string;
state: 'pending' | 'running' | 'completed';
executedBy?: string;
};
export async function run() {
const server_1 = new Hamok();
const server_2 = new Hamok();
const messageHub = new HamokMessageHub();
messageHub.add(server_1, server_2);
const jobId = 'myJob';
const storage_1 = server_1.createMap<string, Job>({
mapId: 'my-replicated-storage',
// equalValues: (a, b) => a.id === b.id && a.state === b.state,
});
const storage_2 = server_2.createMap<string, Job>({
mapId: 'my-replicated-storage',
// equalValues: (a, b) => a.id === b.id && a.state === b.state,
});
await Promise.all([
server_1.join(),
server_2.join(),
]);
logger.debug('Setting value in storage for key to 0');
await storage_1.set(jobId, { id: jobId, state: 'pending' });
// await storage_1.set('key', 2);
logger.info('Getting value from replicated storage: %o', storage_1.get(jobId));
logger.debug('Updating value in storage for key to 1 if previous value is 0, or to 3 if previous value is 2');
const [changedByServer_1, changedByServer_2] = await Promise.all([
storage_1.updateIf(jobId, { id: jobId, state: 'running', executedBy: server_1.localPeerId }, { id: jobId, state: 'pending' }),
storage_2.updateIf(jobId, { id: jobId, state: 'running', executedBy: server_2.localPeerId }, { id: jobId, state: 'pending' }),
])
await storage_1.set('not-important-key', { id: 'another-job', state: 'pending' });
logger.debug('%s job entry is updated by server_1: %o', jobId, changedByServer_1);
logger.debug('%s job entry is updated by server_2: %o', jobId, changedByServer_2);
logger.debug('Getting value for %s from storage: %o', jobId, storage_1.get(jobId));
server_1.close();
server_2.close();
}
if (require.main === module) {
logger.info('Running from a module file');
setHamokLogLevel('info');
run();
}