From 0a11a24460174613bedc4e2b73638bb0fb364f0e Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Wed, 26 Mar 2025 10:55:51 +0000 Subject: [PATCH] slit server source & client source --- client/package.json | 21 +++ client/src/index.js | 1 + client/src/rtengine/index.js | 149 ++++++++++++++++++ client/src/rtengine/topics.js | 31 ++++ .experimental => server/.experimental | 0 {bin => server/bin}/boot.js | 0 package.json => server/package.json | 0 {src => server/src}/baseEndpoints/main.js | 0 {src => server/src}/baseEndpoints/map.js | 0 .../src}/classes/IPCClient/index.js | 0 .../src}/classes/IPCRouter/index.js | 0 {src => server/src}/classes/endpoint/index.js | 0 {src => server/src}/classes/index.js | 0 .../src}/classes/operation_error/index.js | 0 {src => server/src}/classes/rtengine/index.js | 0 .../src}/classes/rtengineng/client.js | 4 +- server/src/classes/rtengineng/events.js | 20 +++ .../src}/classes/rtengineng/index.js | 5 + {src => server/src}/defaults.js | 0 .../src}/engines/hyper-express-ng/index.js | 0 .../src}/engines/hyper-express/index.js | 0 {src => server/src}/engines/index.js | 0 {src => server/src}/engines/worker/index.js | 0 {src => server/src}/index.js | 0 .../registerBaseEndpoints/index.js | 0 .../registerHttpRoutes/index.js | 0 .../registerWebsocketsEvents/index.js | 0 .../src}/lib/generateController/index.js | 0 .../lib/generateEndpointsFromDir/index.js | 0 .../src}/lib/loadEndpointsFromDir/index.js | 0 .../src}/lib/recursiveRegister/index.js | 0 {src => server/src}/lib/redis_map/index.js | 0 {src => server/src}/middlewares/cors/index.js | 0 .../src}/middlewares/logger/index.js | 0 {src => server/src}/patches.js | 0 {src => server/src}/registerAliases.js | 0 {src => server/src}/server.js | 0 .../src}/utils/flatRouteredFunctions.js | 0 .../src}/utils/getRouteredFunctions.js | 0 {src => server/src}/utils/index.js | 0 {src => server/src}/utils/linebridge_ascii.js | 0 {src => server/src}/utils/nanoid/index.js | 0 .../src}/utils/schematized/index.js | 0 src/.DS_Store | Bin 6148 -> 0 bytes src/classes/rtengineng/events.js | 8 - 45 files changed, 230 insertions(+), 9 deletions(-) create mode 100644 client/package.json create mode 100644 client/src/index.js create mode 100644 client/src/rtengine/index.js create mode 100644 client/src/rtengine/topics.js rename .experimental => server/.experimental (100%) rename {bin => server/bin}/boot.js (100%) rename package.json => server/package.json (100%) rename {src => server/src}/baseEndpoints/main.js (100%) rename {src => server/src}/baseEndpoints/map.js (100%) rename {src => server/src}/classes/IPCClient/index.js (100%) rename {src => server/src}/classes/IPCRouter/index.js (100%) rename {src => server/src}/classes/endpoint/index.js (100%) rename {src => server/src}/classes/index.js (100%) rename {src => server/src}/classes/operation_error/index.js (100%) rename {src => server/src}/classes/rtengine/index.js (100%) rename {src => server/src}/classes/rtengineng/client.js (85%) create mode 100644 server/src/classes/rtengineng/events.js rename {src => server/src}/classes/rtengineng/index.js (97%) rename {src => server/src}/defaults.js (100%) rename {src => server/src}/engines/hyper-express-ng/index.js (100%) rename {src => server/src}/engines/hyper-express/index.js (100%) rename {src => server/src}/engines/index.js (100%) rename {src => server/src}/engines/worker/index.js (100%) rename {src => server/src}/index.js (100%) rename {src => server/src}/initializators/registerBaseEndpoints/index.js (100%) rename {src => server/src}/initializators/registerHttpRoutes/index.js (100%) rename {src => server/src}/initializators/registerWebsocketsEvents/index.js (100%) rename {src => server/src}/lib/generateController/index.js (100%) rename {src => server/src}/lib/generateEndpointsFromDir/index.js (100%) rename {src => server/src}/lib/loadEndpointsFromDir/index.js (100%) rename {src => server/src}/lib/recursiveRegister/index.js (100%) rename {src => server/src}/lib/redis_map/index.js (100%) rename {src => server/src}/middlewares/cors/index.js (100%) rename {src => server/src}/middlewares/logger/index.js (100%) rename {src => server/src}/patches.js (100%) rename {src => server/src}/registerAliases.js (100%) rename {src => server/src}/server.js (100%) rename {src => server/src}/utils/flatRouteredFunctions.js (100%) rename {src => server/src}/utils/getRouteredFunctions.js (100%) rename {src => server/src}/utils/index.js (100%) rename {src => server/src}/utils/linebridge_ascii.js (100%) rename {src => server/src}/utils/nanoid/index.js (100%) rename {src => server/src}/utils/schematized/index.js (100%) delete mode 100755 src/.DS_Store delete mode 100644 src/classes/rtengineng/events.js diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..5ded079 --- /dev/null +++ b/client/package.json @@ -0,0 +1,21 @@ +{ + "name": "linebridge-client", + "version": "0.2.0", + "main": "./dist/index.js", + "author": "RageStudio ", + "license": "MIT", + "files": [ + "src/**/**", + "dist/**/**", + "./package.json" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "hermes build --parallel --clean" + }, + "devDependencies": { + "@ragestudio/hermes": "^1.0.0" + } +} diff --git a/client/src/index.js b/client/src/index.js new file mode 100644 index 0000000..7765a90 --- /dev/null +++ b/client/src/index.js @@ -0,0 +1 @@ +export { default as RTEngineClient } from "./rtengine" diff --git a/client/src/rtengine/index.js b/client/src/rtengine/index.js new file mode 100644 index 0000000..21bbfc7 --- /dev/null +++ b/client/src/rtengine/index.js @@ -0,0 +1,149 @@ +import TopicsController from "./topics" + +export class RTEngineClient { + constructor(params = {}) { + this.params = { + maxConnectRetries: 3, + ...params, + } + } + + state = { + id: null, + connected: false, + } + + socket = null + + handlers = new Set() + + topics = new TopicsController(this) + + async connect() { + if (this.socket) { + await this.disconnect() + } + + let url = `${this.params.url}` + + if (this.params.token) { + url += `?token=${this.params.token}` + } + + this.socket = new WebSocket(url) + + this.socket.onopen = (e) => this.#handleOpen(e) + this.socket.onclose = (e) => this.#handleClose(e) + this.socket.onerror = (e) => this.#handleError(e) + this.socket.onmessage = (e) => this.#handleMessage(e) + + return new Promise((resolve, reject) => { + this.once("connected", resolve) + }) + } + + async disconnect() { + if (!this.socket) { + return false + } + + this.topics.unsubscribeAll() + this.socket.close() + this.socket = null + } + + on = (event, handler) => { + this.handlers.add({ + event, + handler, + }) + } + + off = (event, handler) => { + this.handlers.delete({ + event, + handler, + }) + } + + once = (event, handler) => { + this.handlers.add({ + event, + handler, + once: true, + }) + } + + emit = async (event, data) => { + if (!this.socket) { + throw new Error("Failed to send, socket not connected") + } + + return await this.socket.send(JSON.stringify({ event, data })) + } + + #_decode(payload) { + return JSON.parse(payload) + } + + //* HANDLERS + #handleMessage(event) { + try { + const payload = this.#_decode(event.data) + + if (typeof payload.event !== "string") { + throw new Error("Invalid event or payload") + } + + return this.#dispatchToHandlers(payload.event, payload.data) + } catch (error) { + console.error("Error handling message:", error) + } + } + + #handleClose() { + this.state.connected = false + this.#dispatchToHandlers("disconnect") + } + + #handleOpen() { + this.state.connected = true + this.#dispatchToHandlers("connect") + } + + #handleError(error) { + console.error("WebSocket connection error:", error) + this.#dispatchToHandlers("error") + } + + baseHandlers = { + connected: (data) => { + this.state.connected = true + + if (data.id) { + this.state.id = data.id + } + }, + error: (error) => { + console.error(error) + }, + } + + async #dispatchToHandlers(event, data) { + if (this.baseHandlers[event]) { + await this.baseHandlers[event](data) + } + + for (const handler of this.handlers) { + if (handler.event === event) { + handler.handler(data) + + if (handler.once === true) { + this.handlers.delete(handler) + } + } + } + } +} + +export default RTEngineClient diff --git a/client/src/rtengine/topics.js b/client/src/rtengine/topics.js new file mode 100644 index 0000000..3e95ae4 --- /dev/null +++ b/client/src/rtengine/topics.js @@ -0,0 +1,31 @@ +class TopicsController { + constructor(client) { + this.client = client + } + + subscribed = new Set() + + subscribe = async (topic) => { + await this.client.emit("topic:subscribe", topic) + this.subscribed.add(topic) + + return true + } + + unsubscribe = async (topic) => { + await this.client.emit("topic:unsubscribe", topic) + this.subscribed.delete(topic) + + return true + } + + unsubscribeAll = async () => { + for (const topic of this.subscribed) { + await this.leave(topic) + } + + return true + } +} + +export default TopicsController diff --git a/.experimental b/server/.experimental similarity index 100% rename from .experimental rename to server/.experimental diff --git a/bin/boot.js b/server/bin/boot.js similarity index 100% rename from bin/boot.js rename to server/bin/boot.js diff --git a/package.json b/server/package.json similarity index 100% rename from package.json rename to server/package.json diff --git a/src/baseEndpoints/main.js b/server/src/baseEndpoints/main.js similarity index 100% rename from src/baseEndpoints/main.js rename to server/src/baseEndpoints/main.js diff --git a/src/baseEndpoints/map.js b/server/src/baseEndpoints/map.js similarity index 100% rename from src/baseEndpoints/map.js rename to server/src/baseEndpoints/map.js diff --git a/src/classes/IPCClient/index.js b/server/src/classes/IPCClient/index.js similarity index 100% rename from src/classes/IPCClient/index.js rename to server/src/classes/IPCClient/index.js diff --git a/src/classes/IPCRouter/index.js b/server/src/classes/IPCRouter/index.js similarity index 100% rename from src/classes/IPCRouter/index.js rename to server/src/classes/IPCRouter/index.js diff --git a/src/classes/endpoint/index.js b/server/src/classes/endpoint/index.js similarity index 100% rename from src/classes/endpoint/index.js rename to server/src/classes/endpoint/index.js diff --git a/src/classes/index.js b/server/src/classes/index.js similarity index 100% rename from src/classes/index.js rename to server/src/classes/index.js diff --git a/src/classes/operation_error/index.js b/server/src/classes/operation_error/index.js similarity index 100% rename from src/classes/operation_error/index.js rename to server/src/classes/operation_error/index.js diff --git a/src/classes/rtengine/index.js b/server/src/classes/rtengine/index.js similarity index 100% rename from src/classes/rtengine/index.js rename to server/src/classes/rtengine/index.js diff --git a/src/classes/rtengineng/client.js b/server/src/classes/rtengineng/client.js similarity index 85% rename from src/classes/rtengineng/client.js rename to server/src/classes/rtengineng/client.js index 3bb6cd2..2433c86 100644 --- a/src/classes/rtengineng/client.js +++ b/server/src/classes/rtengineng/client.js @@ -4,7 +4,7 @@ class Client { this.id = socket.context.id this.userId = socket.context.user?._id || null - this.authed = !!socket.context.session + this.autheticated = !!socket.context.session } emit(event, data) { @@ -36,10 +36,12 @@ class Client { } subscribe(topic) { + this.emit("topic:subscribed", topic) return this.socket.subscribe(topic) } unsubscribe(topic) { + this.emit("topic:unsubscribed", topic) return this.socket.unsubscribe(topic) } } diff --git a/server/src/classes/rtengineng/events.js b/server/src/classes/rtengineng/events.js new file mode 100644 index 0000000..b6faab1 --- /dev/null +++ b/server/src/classes/rtengineng/events.js @@ -0,0 +1,20 @@ +import { performance } from "node:perf_hooks" + +export default { + "server:ping": async (client, data) => { + const pongTime = performance.now() + + return { + ping: data.ping ?? 0, + pong: pongTime, + latency: Number(pongTime - data.ping), + latencyMs: Number(pongTime - data.ping).toFixed(2), + } + }, + "topic:subscribe": async (client, topic) => { + client.subscribe(topic) + }, + "topic:unsubscribe": async (client, topic) => { + client.unsubscribe(topic) + }, +} diff --git a/src/classes/rtengineng/index.js b/server/src/classes/rtengineng/index.js similarity index 97% rename from src/classes/rtengineng/index.js rename to server/src/classes/rtengineng/index.js index 46b06a4..aedabf0 100644 --- a/src/classes/rtengineng/index.js +++ b/server/src/classes/rtengineng/index.js @@ -104,6 +104,11 @@ class RTEngineNG { const client = new Client(socket) + await client.emit("connected", { + id: client.id, + autheticated: client.autheticated, + }) + this.clients.set(socket.context.id, client) } diff --git a/src/defaults.js b/server/src/defaults.js similarity index 100% rename from src/defaults.js rename to server/src/defaults.js diff --git a/src/engines/hyper-express-ng/index.js b/server/src/engines/hyper-express-ng/index.js similarity index 100% rename from src/engines/hyper-express-ng/index.js rename to server/src/engines/hyper-express-ng/index.js diff --git a/src/engines/hyper-express/index.js b/server/src/engines/hyper-express/index.js similarity index 100% rename from src/engines/hyper-express/index.js rename to server/src/engines/hyper-express/index.js diff --git a/src/engines/index.js b/server/src/engines/index.js similarity index 100% rename from src/engines/index.js rename to server/src/engines/index.js diff --git a/src/engines/worker/index.js b/server/src/engines/worker/index.js similarity index 100% rename from src/engines/worker/index.js rename to server/src/engines/worker/index.js diff --git a/src/index.js b/server/src/index.js similarity index 100% rename from src/index.js rename to server/src/index.js diff --git a/src/initializators/registerBaseEndpoints/index.js b/server/src/initializators/registerBaseEndpoints/index.js similarity index 100% rename from src/initializators/registerBaseEndpoints/index.js rename to server/src/initializators/registerBaseEndpoints/index.js diff --git a/src/initializators/registerHttpRoutes/index.js b/server/src/initializators/registerHttpRoutes/index.js similarity index 100% rename from src/initializators/registerHttpRoutes/index.js rename to server/src/initializators/registerHttpRoutes/index.js diff --git a/src/initializators/registerWebsocketsEvents/index.js b/server/src/initializators/registerWebsocketsEvents/index.js similarity index 100% rename from src/initializators/registerWebsocketsEvents/index.js rename to server/src/initializators/registerWebsocketsEvents/index.js diff --git a/src/lib/generateController/index.js b/server/src/lib/generateController/index.js similarity index 100% rename from src/lib/generateController/index.js rename to server/src/lib/generateController/index.js diff --git a/src/lib/generateEndpointsFromDir/index.js b/server/src/lib/generateEndpointsFromDir/index.js similarity index 100% rename from src/lib/generateEndpointsFromDir/index.js rename to server/src/lib/generateEndpointsFromDir/index.js diff --git a/src/lib/loadEndpointsFromDir/index.js b/server/src/lib/loadEndpointsFromDir/index.js similarity index 100% rename from src/lib/loadEndpointsFromDir/index.js rename to server/src/lib/loadEndpointsFromDir/index.js diff --git a/src/lib/recursiveRegister/index.js b/server/src/lib/recursiveRegister/index.js similarity index 100% rename from src/lib/recursiveRegister/index.js rename to server/src/lib/recursiveRegister/index.js diff --git a/src/lib/redis_map/index.js b/server/src/lib/redis_map/index.js similarity index 100% rename from src/lib/redis_map/index.js rename to server/src/lib/redis_map/index.js diff --git a/src/middlewares/cors/index.js b/server/src/middlewares/cors/index.js similarity index 100% rename from src/middlewares/cors/index.js rename to server/src/middlewares/cors/index.js diff --git a/src/middlewares/logger/index.js b/server/src/middlewares/logger/index.js similarity index 100% rename from src/middlewares/logger/index.js rename to server/src/middlewares/logger/index.js diff --git a/src/patches.js b/server/src/patches.js similarity index 100% rename from src/patches.js rename to server/src/patches.js diff --git a/src/registerAliases.js b/server/src/registerAliases.js similarity index 100% rename from src/registerAliases.js rename to server/src/registerAliases.js diff --git a/src/server.js b/server/src/server.js similarity index 100% rename from src/server.js rename to server/src/server.js diff --git a/src/utils/flatRouteredFunctions.js b/server/src/utils/flatRouteredFunctions.js similarity index 100% rename from src/utils/flatRouteredFunctions.js rename to server/src/utils/flatRouteredFunctions.js diff --git a/src/utils/getRouteredFunctions.js b/server/src/utils/getRouteredFunctions.js similarity index 100% rename from src/utils/getRouteredFunctions.js rename to server/src/utils/getRouteredFunctions.js diff --git a/src/utils/index.js b/server/src/utils/index.js similarity index 100% rename from src/utils/index.js rename to server/src/utils/index.js diff --git a/src/utils/linebridge_ascii.js b/server/src/utils/linebridge_ascii.js similarity index 100% rename from src/utils/linebridge_ascii.js rename to server/src/utils/linebridge_ascii.js diff --git a/src/utils/nanoid/index.js b/server/src/utils/nanoid/index.js similarity index 100% rename from src/utils/nanoid/index.js rename to server/src/utils/nanoid/index.js diff --git a/src/utils/schematized/index.js b/server/src/utils/schematized/index.js similarity index 100% rename from src/utils/schematized/index.js rename to server/src/utils/schematized/index.js diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100755 index 4f9d219a999b1ed7ef52f6e39e1334681b1f2b13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-ve05I#3i6$C;Z8QqnMGO!_qD(pxdSx_1TNC~O<>71RFN8nA6Sa=8?1-|o{ zHg2fcDunK&^XHuJeD)VB7ZZ^gKNcgR0TCro#@-g1AB4wQJJR!(9iVY@+|omNHJVK8 zYS!^q!(U{8-(8=kRMHJyQs@0e#p-xfXIWm>Iqb=2d3c^2zn*k`ieG(Z*X?t{=Z_+{ ziab0)yC2JucJ8jYO4$=1IoaH0scN%C}Zle5pL2{rzTVI&-O>-|!Xji7{+ahWlX&ush+#klOSTjx$D71UN4 zPzFKpF diff --git a/src/classes/rtengineng/events.js b/src/classes/rtengineng/events.js deleted file mode 100644 index 6dd94ad..0000000 --- a/src/classes/rtengineng/events.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - "topic:join": async (client, topic) => { - client.subscribe(topic) - }, - "topic:leave": async (client, topic) => { - client.unsubscribe(topic) - }, -}