Последние два месяца я разрабатывал CLI (интерфейс командной строки).
Таймер Pomodoro и приложение Todo с Node.js. Он также будет иметь TUI (текстовый
Пользовательский интерфейс) для отображения статистики с различными графиками и диаграммами.

Основная идея такова: он должен иметь возможность создавать таймеры обратного отсчета и когда таймер
закончит, он подаст сигнал, чтобы напомнить мне сделать перерыв в работе. Рядом
что он будет вести журналы моих рабочих сессий, чтобы отображать различную статистику.

Он имеет следующую архитектуру:

+-----------+  +--------+  +---------+
|DB (Sqlite)|  | Timer  |  | Speaker |
+-----------+  +--------+  +---------+
             \     |      /
              \    |     /
             +-----------+
             |   Server  |
             +-----------+
              |^      |^
              ||      ||
              v|      v|
           +-----+  +-----+
           | CLI |  | TUI |
           +-----+  +-----+
Войти в полноэкранный режим

Выйти из полноэкранного режима

Сервер работает в фон как услуга. CLI и TUI
общается с сервером через МПК (TCP над Unix-домен
разъем
или же Именованный канал Windows) протокол. Сервер также должен иметь возможность
передавать данные своему клиенту.

Хотя я могу просто использовать необработанный сервер сокетов с net.createServer сделать это
общение, но через некоторое время это становится немного сложным. Так же, как вы
не использовал бы http.createServer вместо фреймворка типа Выражатья
не мог пойти дальше с этим подходом.

Итак, я решил создать свою собственную структуру сервера IPC (в качестве забавной задачи) с
две цели в виду:

  1. Функция обработки запросов, такая как Express
  2. Трансляция данных нескольким клиентам

Альхамдулиллах (хвала Богу) после двух недель работы сегодня я опубликовал
фреймворк на npm. я назвал это Экспресс-ИПЦ.

Смотрите это на Гитхаб а также НПМ.

Примеры использования:

сервер.js

const { Server } = require("express-ipc");

const socketPath = "./pipe";
const server = new Server();

const users = [
  { id: 1, name: "Alex" },
  { id: 2, name: "Alexa" },
];

server.get("/users/:id", ({ req, res }) => {
  const id = Number(req.params.id);
  const user = users.find((user) => user.id === id);

  if (user) res.send(user);
  else res.send({ message: `No user found with id: ${id}` }, { isError: true });
});

server.listen({
  path: socketPath,
  deleteSocketBeforeListening: true,
  callback() {
    console.log(`Server running on socket: ${server.socketPath}`);
  },
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

клиент.js

const { Client } = require("express-ipc");
const socketPath = "./pipe";

main();

async function main() {
  const client = new Client({ path: socketPath });

  try {
    const response = await client.get("/users/1");
    console.log(response);
  } catch (ex) {
    console.log(ex);
  }

  client.close();
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Самой сложной частью был алгоритм маршрутизации запросов.

Блок-схема маршрутизации запросов

Извините, он слишком большой, чтобы поместиться здесь и Dev.to не поддерживает SVG файлы. я
попытался вставить блок-схему здесь, но похоже, Dev.to ни один не поддерживает
Русалочка и не могу загрузить мою суть GitHub
о блок-схеме. Посмотреть полную диаграмму
здесь.

Alhamdulillah, я смог решить это после того, как составил блок-схему алгоритма.
Честно говоря, это было очень скучно, и мне потребовался почти день, чтобы решить.

Поскольку структура сервера завершена, теперь мне пора вернуться и
интегрировать его в мое приложение Pomodoro.

Я хотел бы услышать ваше мнение об этой структуре. Если у тебя есть
предложение или отзыв, пожалуйста, дайте мне знать в разделе комментариев 💝.

Кредиты: Фоновое изображение взято из Скрыть