hamok
Version:
Lightweight Distributed Object Storage on RAFT consensus algorithm
69 lines (56 loc) • 1.8 kB
text/typescript
import { Hamok, setHamokLogLevel } from 'hamok';
import * as pino from 'pino';
import { HamokMessageHub } from './utils/HamokMessageHub';
const logger = pino.pino({
name: 'queue-events-example',
level: 'debug',
});
export async function run() {
const server_1 = new Hamok();
const server_2 = new Hamok();
const messageHub = new HamokMessageHub();
const producer = server_1.createQueue<number>({
queueId: 'my-distributed-queue',
});
const consumer = server_2.createQueue<number>({
queueId: 'my-distributed-queue',
});
consumer.on('empty', () => logger.info('Queue is empty'));
consumer.on('not-empty', () => logger.info('Queue is not empty'));
messageHub.add(server_1, server_2);
await Promise.all([
server_1.join(),
server_2.join(),
]);
let value = 0;
const producingTimer = setInterval(async () => {
const value_1 = ++value;
const value_2 = ++value;
await Promise.all([
producer.push(value_1),
producer.push(value_2),
]);
logger.debug(`Pushed value into distributed queue ${value_1} and ${value_2}`);
}, 1000);
const consumingTimer_1 = setInterval(async () => {
const value = await consumer.pop();
logger.debug('Popped value from distributed queue on server_2 by consuming timer 1: %s', value ?? 'empty');
}, 1000);
const consumingTimer_2 = setInterval(async () => {
const value = await consumer.pop();
logger.debug('Popped value from distributed queue by on server_2 consuming timer 2: %s', value ?? 'empty');
}, 1000);
await new Promise(resolve => setTimeout(resolve, 10000));
server_1.close();
server_2.close();
[
producingTimer,
consumingTimer_1,
consumingTimer_2,
].forEach(timer => clearInterval(timer));
}
if (require.main === module) {
logger.info('Running from module file');
setHamokLogLevel('info');
run();
}