It's the ragemp server middlewares for events

Overview

RageMP Server Middlewares

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

Документация:

App

App - это приложение, которое регистрирует события. В идеале регистрировать её прямо в точке входа при запуске сервера. Проще говоря, прям в самом начала index.js в Вашем проекте.

Пример

const RageApp = require("./middlewares/app.js");

const app = new RageApp({alertAllNoAppEvents: true});

app.addEvent(eventWithoutMiddlewares, (source, ...args) => {
	console.log(`Этот всегда был и будет выполнен без проверок!`);
});

app.use((source, args, next, eventName) => {
	console.log(`Теперь все следующие ивенты будут залогированы! Например, ${eventName}`);
	next();
});

app.addEvent(eventWithMiddleware, (source, ...args) => {
	console.log(`Этот ивент уже будет с логированием и все следующие тоже!`);
});

new RageApp(flags)

  • flags - объект, пока что с единственным полем alertAllNoAppEvents. Данный флаг отвечает за вывод ВСЕХ СОБЫТИЙ, который зарегистрированы не через RageApp.

function middleware(source, args, next, eventName)

  • source - это источник, который вызвал событие. Например, игрок или автомобиль (всегда идет первым аргументом в ивенте).
  • args - это аргументы, которые идут после источника события.
  • next - это функция, которая не принимает в себя НИЧЕГО. После неё так же можно использовать другие методы, это не return. Данная функция просто говорит о том, что можно идти к следующему middleware и все условия выполнены.
  • eventName - это имя ивента, который был вызван и обрабатывается с помощью этой middleware-функции.

Пример

const medicMiddlware = (source, args, next) => {
	if(!source.isMedic) {
		console.log(`"${source.name}" попытался сделать действие, доступное для медиков, но он не медик и ничего не получилось!`);
		return;
	}
	console.log(`"${source.name}" прошел через промежуточную функцию медиков!`);
	next();
	console.log("Хаха я могу продолжить код после вызова next()");
}

Методы RageApp

  • use(...middleware) - принимает в себя множество функций middleware.
  • addEvent(name, callback, ...middlewares) return RageEvent - принимает в себя название события, обработчик события и список промежуточных функций, который будет обработан в порядке очереди (после приложения/группы) с начала до конца.
  • addGroup(name) return RageGroup - создать группу событий с именем. В данном случае, приложение будет родительской группой над созданной.

Методы RageGroup

  • use(...middleware) - принимает в себя множество функций middleware.
  • addEvent(name, callback, ...middlewares) return RageEvent - принимает в себя название события, обработчик события и список промежуточных функций, который будет обработан в порядке очереди (после приложения/группы) с начала до конца.
  • addGroup(name) return RageGroup - создать группу событий с именем. В данном случае, текущий Group будет родительским над созданной.

Методы RageEvent

  • use(...middleware) - принимает в себя множество функций middleware.

Вопросы и ответы:

Почему?

Скажу честно - я поработал уже не в одном проекте GTA 5 за 3 года, и сейчас не связан ни с одним.
Моя цель - помочь, чтобы люди меньше говнокодили и могли делать больше прикольных вещей.
Мне было скучно, и я решил привнести что-то современное в RageMP разработку.

Что такое Middleware?

Middleware (промежуточное или связующее программное обеспечение) — это фрагмент кода 
в конвейере приложения, используемый для обработки запросов и ответов. (с)

А по-человечески?

Проще говоря, в представлении данного примера, 
Middleware - это промежуточная функция/группа функций/целое приложение, 
которое позволит корректно обрабатывать запросы, не дублируя код..

Продолжай...

Чтобы не тянуть кота за шевелюру, объясню на примере.
Если сравнить medic/index.js и medic/index_with_shit.js мы можем увидеть разницу между использование 
промежуточных функций и их отсутствием.

Количество бессмысленных повторяющихся строк примерно НА 30% МЕНЬШЕ при мельчайшем примере!

Если у нас будет проверка на админку, авторизацию, организацию, позицию - цифра будет ЕЩЁ БОЛЬШЕ!

Так в чем смысл-то? Я не посмотрел файлы/тупой

Проще говоря, с помощью промежуточных функций можно единожды задать условие и не проверять 
в каждом событии, выполнено ли условие.
Таким образом, если у вас много-много систем, промежуточные функции можно объявить в группе
и каждый раз не проверять, например, авторизован ли игрок.

Единожды в приложении прописав app.use(loginMiddleware), все следующие ивенты, 
где просто будет проверяться, авторизован ли игрок, 
Вам не придется писать это в каждом событии, а лишь перед регистрацией ивента.

А как это работает?

Объясню на пальцах. У нас есть приложение - RageApp.
Мы создаем через new RageApp это приложение и уже к нему или к группам событий привязываем 
ивенты и промежуточные функции.

Что за группы?

Тут была диллема, я её решил максимальной гибкостью.

Группы ивентов - это группы, у которых могут быть общие промежуточные функции.
Группа является либо частью приложения, либо другой группы.

Таким образом, Вы можете создать группу событий для игроков, объектов и автомобилей, 
задав им разные Middleware.

Так, а в каком порядке это работает вообще? Вот я написал app.use, значит что?

Это значит то, что ВСЕ следующие ивенты будут проверяться с помощью твоей промежуточной функции.
Тебе нужно смотреть от точки входа, где ты инициализируешь это и дальше. 

На предудыщие ивенты, которые ранее зарегистрированы (до использования app.use) промежуточные
функции распространяться не будут. 

Могу ли я привязать middleware к конкретному событию, группе или всему приложению?

Да, можешь, но есть пара нюансов:

- Если ты привяжешь middleware к конкретному событию - все будет тип-топ и работать сразу.

- Если ты привяжешь middleware к группе событий, у которой, есть ещё другие группы, то это применится
для ВСЕХ ДОЧЕРНИХ групп.
Для старых ивентов в этих группах это применяться не будет. 
Это будет применяться ТОЛЬКО при следующем СОЗДАНИИ события в дочерней группе.

- Если ты привяжешь middleware к приложению, то это применится ко всему приложению и группам. Сам же
этот Middleware начнет действовать ТОЛЬКО В НОВЫХ событиях, 

которые будут регистрироваться app.use.

Если ещё не взорвалась голова

Данная штука при хорошем подходе довольно мощная. 
В неё можно запихать как логирование событий, так и правильно устанавливать права доступа для событий.
Что только в голову взбредет!
You might also like...

A cross-platform AutoHotKey-like thing with TypeScript as its scripting language

suchibot A cross-platform AutoHotKey-like thing with JavaScript/TypeScript as its scripting language. Built on top of uiohook-napi and nut.js. Install

Sep 21, 2022

I forgot about el.outerHTML so I made this, it takes a DOM element and returns its html as string

I forgot about el.outerHTML so I made this, it takes a DOM element and returns its html as string

htmlToString Convert html/DOM element to string Works with rendered and virtual DOM Installation npm install htmltostring Or using CDN script src="ht

Jul 22, 2022

A nuxt 2 wrapper around derrickreimer/fathom-client to be able to use usefathom.com in all its glory

A nuxt 2 wrapper around derrickreimer/fathom-client to be able to use usefathom.com in all its glory

This package is a nuxt 2 wrapper around derrickreimer/fathom-client to be able to use usefathom.com in all its glory. Thanks to @derrickreimer for this framework agnostic library ❤️‍🔥.

Aug 18, 2022

📜 Sharable eslint configuration rimac technology uses in all of its projects.

Eslint Config Usage Install the library as a dev dependency alongside required dependencies using yarn add -D @rimac-technology/eslint-config

Nov 23, 2022

Transmute one JavaScript string into another by way of mutating its AST. Powered by babel and recast.

equivalent-exchange Transmute one JavaScript string into another by way of mutating its AST. Powered by babel and recast. Features Can parse code usin

Jul 9, 2022

↕️ A little Alpine.js plugin to automatically resize a textarea to fit its content.

↕️ Alpine Autosize ↕️ A little Alpine.js plugin to automatically resize a textarea to fit its content. 🚀 Installation CDN Include the following scri

Nov 5, 2022

Extract a JS/TS module and its dependencies into a new package

module-extractor Extract a module and its dependencies into a new package Usage import { extractModules } from 'module-extractor' const extraction =

Aug 9, 2022

This is a Microverse (@microverseinc) project in which I created a To-do list using Webpack. User can add a task, delete it, edit its description, and clear the completed tasks.

Microverse To-Do list This is a Microverse (@microverseinc) project in which I created a To-do list using webpack. Requirements Build a Todo list usin

Aug 3, 2022
Owner
null
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
It's a repository to studies. Its idea is to learn about Nx and its plugins.

StudyingNx This project was generated using Nx. ?? Smart, Fast and Extensible Build System Adding capabilities to your workspace Nx supports many plug

Open-ish 4 May 13, 2022
Can see everything, beware of its omniscience, kneel before its greatness.

Can see everything, beware of its omniscience, kneel before its greatness. Summary Presentation Installation Removing Credits Presentation Main goal T

Duc Justin 3 Sep 30, 2022
A project for experimenting with Server Sent Events (SSE), a way of communication going from server to client.

A project for experimenting with Server Sent Events (SSE), a way of communication going from server to client.

Italo Menezes 4 May 16, 2022
A bot to propose events for a discord server.

Project Name Project Description Live Version This page is not yet deployed. Feedback and Bugs If you have feedback or a bug report, please feel free

NHCarrigan 5 Dec 17, 2022
Server Sent Events (SSE) and WebSockets for the remix framework

remix-sse Server Side Events (SSE) and WebSockets made easy with Remix. Introduction This monorepo contains several packages for working with SSE and

Baggers 23 Dec 26, 2022
Monolithic repo for api server, image server, web server

Onsecondary Market Deployed at https://market.onsecondary.com Monolithic repo for api server, image server, web server TODO -use a script to cull expi

Admazzola 2 Jan 11, 2022
P.S Its easy is a website to cater to all your PS allotment needs

P.S. It's Easy All-in-one Web App for all your Practice School Allotment needs! Note: Developers trying to fork and test. Please wait, we'll set up a

Tanya Prasad 33 Sep 26, 2022
The app helps you to add todo items to your list, mark completed ones and also delete finished items. Its a handy tool for your day today activies. Check out the live demo.

Todo List App The app helps you to add todo items to your list, mark completed ones and also delete finished items. Its a handy tool for your day toda

Atugonza ( Billions ) Joel 14 Apr 22, 2022