event-mutex

Processing synchronous style of async events (ex : Socket.io, Express.js ...)

Usage no npm install needed!

<script type="module">
  import eventMutex from 'https://cdn.skypack.dev/event-mutex';
</script>

README

Event-Mutex

npm npm type definitions npm

Processing synchronous style of async events (ex : Socket.io, Express.js ...)

Super simple to use

import EventMutex from 'event-mutex';

const eventMutex = new EventMutex();
eventMutex.enqueue({
    execution: async () => {
        console.log('this log will showing synchronous.');
    },
    timeout: 1000,
});

Table of contents

  • Installation
  • Async / Await
  • Try / Catch (Exception)
  • Example of Express & Socket.io

Installation

Inside your project folder do:

npm i event-mutex

Async / Await

import EventMutex from 'event-mutex';

const eventMutex = new EventMutex();

async function main() {
    await eventMutex.enqueue({
        execution: async () => {
            console.log('Hello, Async World!');
        },
    });
    console.log('this log will showing after exception');
}

main();

Try / Catch (Exception)

import EventMutex from 'event-mutex';

const eventMutex = new EventMutex();

async function delay(ms: number) {
    return new Promise((resolve, _reject) => {
        setTimeout(() => {
            resolve(true);
        }, ms);
    });
}

async function main() {
    try {
        await eventMutex.enqueue({
            execution: async () => {
                console.log('This event will use 2000ms');
                await delay(2000);
            },
            timeout: 1000, // timeout
        });
    } catch (err) {
        console.log(err.message);
    }
    console.log('this log will showing after exception');
}

main();

Example of Express & Socket.io

import EventMutex from 'event-mutex';
import socketIo from 'socket.io';
import http from 'http';

const app = require('express')();
const server = http.createServer(app);
const io = socketIo(server);

async function delay(ms: number) {
    return new Promise((resolve, _reject) => {
        setTimeout(() => resolve(), ms);
    });
}

const eventMutex = new EventMutex();

io.on('connection', (socket) => {
    console.log(socket.id, 'connect');

    socket.on('event', () => {
        eventMutex.enqueue({
            execution: async () => {
                await delay(5000);
                console.log(socket.id);
            },
            timeout: 1000,
        });
    });

    socket.on('tableJoin', () => {
        eventMutex.enqueue({
            execution: async () => {
                console.log(socket.id);
            },
            timeout: 1000,
        });
    });

    socket.on('disconnect', () => {
        eventMutex.enqueue({
            execution: async () => {
                console.log(socket.id, 'disconnect');
            },
            timeout: 1000,
        });
    });
});

app.get('/', (_req, res) => {
    eventMutex.enqueue({
        execution: async () => {
            console.log('Get Web Request');
            res.send('Hi!');
        },
        timeout: 1000,
    });
});

server.listen(3000);
console.log('server start!');