From 5e8761dd0526654114e588844c3853a8b4d9608d Mon Sep 17 00:00:00 2001 From: Oleksandr Honcharov <0976053529@ukr.net> Date: Sun, 15 Sep 2024 21:32:27 +0300 Subject: [PATCH] lol --- rpc/src/events.ts | 3 + rpc/src/index.ts | 21 +++- rpc/src/modules/cef.ts | 68 ++++++++++++ rpc/src/modules/client.ts | 226 ++++++++++++++++++++++++-------------- rpc/src/modules/server.ts | 3 +- rpc/src/utils.ts | 1 + 6 files changed, 236 insertions(+), 86 deletions(-) create mode 100644 rpc/src/modules/cef.ts diff --git a/rpc/src/events.ts b/rpc/src/events.ts index be9bc5f..b3df93f 100644 --- a/rpc/src/events.ts +++ b/rpc/src/events.ts @@ -1,2 +1,5 @@ export const EVENT_LISTENER = '__rpc:listener' export const EVENT_RESPONSE = '__rpc:response' +export const CEF_EVENT_LISTENER = '__rpc:cef_listener' + +export const CLIENT_ROUTER_LISTENER = '__rpc:clientRouter' diff --git a/rpc/src/index.ts b/rpc/src/index.ts index 9bd2376..8941b79 100644 --- a/rpc/src/index.ts +++ b/rpc/src/index.ts @@ -3,6 +3,7 @@ import { EVENT_LISTENER } from './events' import { client } from './modules/client' import { server } from './modules/server' +import { cef } from './modules/cef' const environment = utils.getEnvironment() @@ -23,6 +24,11 @@ class rpc { await client.listenEvent(request) break + + case Environment.CEF: + request = player + + await cef } }) } @@ -50,9 +56,18 @@ class rpc { eventName: string, ...args: Args ): Promise { - if (environment === Environment.UNKNOWN) return - if (environment === Environment.CLIENT) { - return server.executeServer(eventName, args) + switch (environment) { + case Environment.UNKNOWN: + return + + case Environment.SERVER: + return + + case Environment.CEF: + return client + + case Environment.CLIENT: + return server.executeServer(eventName, args) } } } diff --git a/rpc/src/modules/cef.ts b/rpc/src/modules/cef.ts new file mode 100644 index 0000000..c7071f7 --- /dev/null +++ b/rpc/src/modules/cef.ts @@ -0,0 +1,68 @@ +import { Wrapper } from './wrapper' +import { Environment, RPCState } from '../utils' +import { CEF_EVENT_LISTENER } from '../events' + +class Cef extends Wrapper { + public async callClient( + eventName: string, + ...args: Args + ): Promise { + return new Promise((resolve, reject) => { + const uuid = this._utils.generateUUID() + + const data: RPCState = { + uuid, + eventName, + calledFrom: Environment.CEF, + calledTo: Environment.CLIENT, + data: args, + } + + mp.trigger(CEF_EVENT_LISTENER, this._utils.prepareForTransfer(data)) + + this.handleReturn(uuid, resolve, reject) + }) + } + + public async callServer( + eventName: string, + ...args: Args + ): Promise {} + + private async handleReturn( + uuid: string, + resolve: (value: unknown) => void, + reject: (reason?: unknown) => void, + ) { + const responseEvent = this._utils.generateResponseEventName(uuid) + const timeoutDuration = 1000 * 10 + + const timeoutID = setTimeout(() => { + reject(new Error('Timeout ended')) + mp.events.remove(responseEvent) + }, timeoutDuration) + + const handler = (response: string) => { + const { knownError, data } = this._utils.prepareForExecute(response) + + if (knownError) { + try { + clearTimeout(timeoutID) + reject(knownError) + return + } catch (e) {} + } + + resolve(data) + mp.events.remove(responseEvent) + + try { + clearTimeout(timeoutID) + } catch (e) {} + } + + mp.events.add(responseEvent, handler) + } +} + +export const cef = new Cef() diff --git a/rpc/src/modules/client.ts b/rpc/src/modules/client.ts index ae7489e..9d09411 100644 --- a/rpc/src/modules/client.ts +++ b/rpc/src/modules/client.ts @@ -1,94 +1,156 @@ -import { EVENT_LISTENER } from '../events' +import { CLIENT_ROUTER_LISTENER, EVENT_LISTENER } from '../events' import { Wrapper } from './wrapper' -import { RPCState } from '../utils' +import { Environment, RPCState } from '../utils' class Client extends Wrapper { - private sendResponseToServer(data: RPCState) { - const eventName = this._utils.generateResponseEventName(data.uuid) - const preparedData = this._utils.prepareForTransfer(data) - mp.events.callRemote(eventName, preparedData) - } + constructor() { + super() - public async listenEvent(data: string) { - const rpcData = this._verifyEvent(data) + mp.events.add(CLIENT_ROUTER_LISTENER, (data: string) => { + const parsedData = this._utils.prepareForExecute(data) + const environment = this._environment - if (rpcData.knownError) { - this._triggerError(rpcData) - return - } + if (environment === Environment.CLIENT) { + switch (parsedData.calledTo) { + case Environment.SERVER: + // route to server listener + break - try { - const fnResponse = await this._state[rpcData.eventName]( - ...rpcData.data, - ) - const response = { - ...rpcData, - data: fnResponse, + case Environment.CEF: + // route to cef listener + break + } } - - this.sendResponseToServer(response) - } catch (e) { - this._triggerError(rpcData, e) - } - } - - private handleClientServerReturn( - uuid: string, - resolve: (value: unknown) => void, - reject: (reason?: any) => void, - ) { - const responseEvent = this._utils.generateResponseEventName(uuid) - const timeoutDuration = 1000 * 10 - - const timeoutID = setTimeout(() => { - reject(new Error('Timeout ended')) - mp.events.remove(responseEvent) - }, timeoutDuration) - - const handler = (_: any, response: string) => { - const { knownError, data } = this._utils.prepareForExecute(response) - - if (knownError) - try { - clearTimeout(timeoutID) - reject(knownError) - return - } catch (e) {} - - resolve(data) - mp.events.remove(responseEvent) - - try { - clearTimeout(timeoutID) - } catch (e) {} - } - - mp.events.add(responseEvent, handler) - } - - public async executeClient< - Args extends any[] = unknown[], - Return = unknown, - >( - player: any, - eventName: string, - ...args: Args - ): Promise { - return new Promise((resolve, reject) => { - const uuid = this._utils.generateUUID() - - const data: RPCState = { - uuid, - eventName, - calledFrom: this._environment, - data: args, - } - - player.call(EVENT_LISTENER, [this._utils.prepareForTransfer(data)]) - - this.handleClientServerReturn(uuid, resolve, reject) }) } + + private async createCallbackListener(uuid: string) { + const eventName = this._utils.generateResponseEventName(uuid) + + const handler = async (data: string) => { + mp.events.remove(eventName) + } + + mp.events.add(eventName, handler) + + return eventName + } + + private async requestToServer(data: string) { + const { uuid } = this._utils.prepareForExecute(data) + const callbackEventName = await this.createCallbackListener(uuid) + + mp.events.callRemote(callbackEventName, data) + } + + private async requestToBrowser(data: string) { + const { uuid } = this._utils.prepareForExecute(data) + const callbackEventName = await this.createCallbackListener(uuid) + + mp.browsers.at(0).call() + } + + // private sendResponseToServer(data: RPCState) { + // const eventName = this._utils.generateResponseEventName(data.uuid) + // const preparedData = this._utils.prepareForTransfer(data) + // mp.events.callRemote(eventName, preparedData) + // } + // + // private sendEventToServer(data: RPCState) { + // const eventName = this._utils.generateResponseEventName(data.uuid) + // const preparedData = this._utils.prepareForTransfer(data) + // } + // + // public async listenEvent(data: string) { + // const rpcData = this._verifyEvent(data) + // + // if (rpcData.knownError) { + // this._triggerError(rpcData) + // return + // } + // + // await this.navigateTo(rpcData.calledTo, rpcData) + // + // // try { + // // const fnResponse = await this._state[rpcData.eventName]( + // // ...rpcData.data, + // // ) + // // const response = { + // // ...rpcData, + // // data: fnResponse, + // // } + // // + // // this.sendResponseToServer(response) + // // } catch (e) { + // // this._triggerError(rpcData, e) + // // } + // } + // + // private async navigateTo(toEnvironment: Environment, data: RPCState) { + // switch (toEnvironment) { + // case Environment.SERVER: + // this.sendEventToServer() + // } + // } + // + // private handleClientServerReturn( + // uuid: string, + // resolve: (value: unknown) => void, + // reject: (reason?: any) => void, + // ) { + // const responseEvent = this._utils.generateResponseEventName(uuid) + // const timeoutDuration = 1000 * 10 + // + // const timeoutID = setTimeout(() => { + // reject(new Error('Timeout ended')) + // mp.events.remove(responseEvent) + // }, timeoutDuration) + // + // const handler = (_: any, response: string) => { + // const { knownError, data } = this._utils.prepareForExecute(response) + // + // if (knownError) + // try { + // clearTimeout(timeoutID) + // reject(knownError) + // return + // } catch (e) {} + // + // resolve(data) + // mp.events.remove(responseEvent) + // + // try { + // clearTimeout(timeoutID) + // } catch (e) {} + // } + // + // mp.events.add(responseEvent, handler) + // } + // + // public async executeClient< + // Args extends any[] = unknown[], + // Return = unknown, + // >( + // player: any, + // eventName: string, + // ...args: Args + // ): Promise { + // return new Promise((resolve, reject) => { + // const uuid = this._utils.generateUUID() + // + // const data: RPCState = { + // uuid, + // eventName, + // calledFrom: this._environment, + // calledTo: Environment.CLIENT, + // data: args, + // } + // + // player.call(EVENT_LISTENER, [this._utils.prepareForTransfer(data)]) + // + // this.handleClientServerReturn(uuid, resolve, reject) + // }) + // } } export const client = new Client() diff --git a/rpc/src/modules/server.ts b/rpc/src/modules/server.ts index cda4a55..02558bc 100644 --- a/rpc/src/modules/server.ts +++ b/rpc/src/modules/server.ts @@ -1,5 +1,5 @@ import { Wrapper } from './wrapper' -import { RPCState, utils } from '../utils' +import { Environment, RPCState } from '../utils' import { EVENT_LISTENER } from '../events' class Server extends Wrapper { @@ -79,6 +79,7 @@ class Server extends Wrapper { uuid, eventName, calledFrom: this._environment, + calledTo: Environment.SERVER, data: args, } diff --git a/rpc/src/utils.ts b/rpc/src/utils.ts index f9f4c58..94ec71c 100644 --- a/rpc/src/utils.ts +++ b/rpc/src/utils.ts @@ -17,6 +17,7 @@ export type RPCState = { knownError?: string data?: any calledFrom: Environment + calledTo: Environment } class Utils {