From faf4ca3c4735715e7ba5632a1438826bceac2134 Mon Sep 17 00:00:00 2001 From: Danya H Date: Sun, 15 Sep 2024 19:59:27 +0100 Subject: [PATCH] upd | callServer --- src/client.ts | 4 +++- src/index.ts | 46 +++++++++++++++++++++++++++++++++++++++++++--- src/server.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/server.ts diff --git a/src/client.ts b/src/client.ts index 4b26e39..1d937e0 100644 --- a/src/client.ts +++ b/src/client.ts @@ -13,7 +13,9 @@ export class Client { case utils.environment.CLIENT: return this.executeLocal(data) case utils.environment.CEF: - // transfer to cef + // todo transfer to cef + case utils.environment.SERVER: + // todo transfer to server } } diff --git a/src/index.ts b/src/index.ts index 07aac27..a808722 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ import { RPC_LISTENER } from './events.ts' import { utils } from './utils.ts' import { client } from './client.ts' +import { server } from './server.ts' import type { RPCData } from './types.ts' const environment = utils.getEnvironment() @@ -9,7 +10,7 @@ const environment = utils.getEnvironment() export const state = environment === utils.environment.CEF ? window.rpcEvents : global.rpcEvents -class frameworkRpc { +class FrameworkRpc { constructor() { mp.events.add(RPC_LISTENER, async (player: any, data: string) => { switch (environment) { @@ -21,6 +22,8 @@ class frameworkRpc { return client.listen(player) case utils.environment.SERVER: + return server.listen(player, data) + case utils.environment.CEF: } }) @@ -39,7 +42,7 @@ class frameworkRpc { eventName: string, ...args: Args ): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve, _reject) => { const uuid = utils.generateUUID() const data: RPCData = { @@ -51,8 +54,45 @@ class frameworkRpc { } player.call(RPC_LISTENER, [utils.stringifyData(data)]) + + const responseEventName = utils.generateResponseEventName(uuid) + + const handler = (_player: any, data: string) => { + resolve(utils.parseData(data).data) + mp.events.remove(responseEventName) + } + + mp.events.add(responseEventName, handler) + }) + } + + public callServer( + eventName: string, + ...args: Args + ): Promise { + return new Promise((resolve, _reject) => { + const uuid = utils.generateUUID() + + const data: RPCData = { + uuid, + eventName, + from: environment, + to: utils.environment.CLIENT, + data: args, + } + + mp.events.callRemote(RPC_LISTENER, utils.stringifyData(data)) + + const responseEventName = utils.generateResponseEventName(uuid) + + const handler = (_player: any, data: string) => { + resolve(utils.parseData(data).data) + mp.events.remove(responseEventName) + } + + mp.events.add(responseEventName, handler) }) } } -const test = new frameworkRpc() +const test = new FrameworkRpc() diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..10cbbb5 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,30 @@ +import { utils } from './utils.ts' +import { state } from './index.ts' +import type { RPCData } from './types.ts' + +export class Server { + public async listen(player: any, data: string) { + const parsedData = utils.parseData(data) + await this.executeLocal(player, parsedData) + } + + private async executeLocal(player: any, data: RPCData) { + const fnResponse = await state[data.eventName](...data.data) + + const response = { + data: fnResponse, + ...data, + } + + this.sendResponseToClient(player, response) + } + + private sendResponseToClient(player: any, data: RPCData) { + const eventName = utils.generateResponseEventName(data.uuid) + const prepareForTransfer = utils.stringifyData(data) + + player.call(eventName, prepareForTransfer) + } +} + +export const server = new Server()