feat rpc
- architecture tweaks for scalability - added option for global debug logs - added option for cef debug mode to run in browser only
This commit is contained in:
		
							parent
							
								
									640adae8a5
								
							
						
					
					
						commit
						e2e58e100a
					
				| @ -1,9 +1,20 @@ | |||||||
| import { Wrapper } from './wrapper' | import { Wrapper } from './wrapper' | ||||||
| import { Environment, Events, RPCEventType, RPCState, Utils } from './utils' | import { | ||||||
|  |     Environment, | ||||||
|  |     Events, | ||||||
|  |     RPCEventType, | ||||||
|  |     RPCState, | ||||||
|  |     RpcWrapperConfig, | ||||||
|  |     Utils, | ||||||
|  | } from './utils' | ||||||
| 
 | 
 | ||||||
| class Browser extends Wrapper { | export class Browser extends Wrapper { | ||||||
|     constructor() { |     constructor( | ||||||
|         super() |         options: RpcWrapperConfig = { | ||||||
|  |             forceBrowserDevMode: false, | ||||||
|  |         }, | ||||||
|  |     ) { | ||||||
|  |         super(options) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public _resolveEmitDestination(dataRaw: string) { |     public _resolveEmitDestination(dataRaw: string) { | ||||||
| @ -65,6 +76,3 @@ class Browser extends Wrapper { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| const browser = new Browser() |  | ||||||
| export { browser } |  | ||||||
|  | |||||||
| @ -5,14 +5,19 @@ import { | |||||||
|     Events, |     Events, | ||||||
|     RPCEventType, |     RPCEventType, | ||||||
|     RPCState, |     RPCState, | ||||||
|  |     RpcWrapperConfig, | ||||||
|     Utils, |     Utils, | ||||||
| } from './utils' | } from './utils' | ||||||
| 
 | 
 | ||||||
| class Client extends Wrapper { | export class Client extends Wrapper { | ||||||
|     private _browser: any = null |     private _browser: any = null | ||||||
| 
 | 
 | ||||||
|     constructor() { |     constructor( | ||||||
|         super() |         options: RpcWrapperConfig = { | ||||||
|  |             forceBrowserDevMode: false, | ||||||
|  |         }, | ||||||
|  |     ) { | ||||||
|  |         super(options) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     set browser(browser: any) { |     set browser(browser: any) { | ||||||
| @ -154,6 +159,3 @@ class Client extends Wrapper { | |||||||
|         if (!this._browser) throw new Error(Errors.NO_BROWSER) |         if (!this._browser) throw new Error(Errors.NO_BROWSER) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| const client = new Client() |  | ||||||
| export { client } |  | ||||||
|  | |||||||
| @ -5,19 +5,36 @@ import { | |||||||
|     Events, |     Events, | ||||||
|     nativeClientEvents, |     nativeClientEvents, | ||||||
|     nativeServerEvents, |     nativeServerEvents, | ||||||
|  |     type PlayerMp, | ||||||
|  |     RpcConfig, | ||||||
|     RPCEventType, |     RPCEventType, | ||||||
|     RPCState, |     RPCState, | ||||||
|     Utils, |     Utils, | ||||||
|     type PlayerMp, |  | ||||||
| } from './utils' | } from './utils' | ||||||
| 
 | 
 | ||||||
| import { server } from './server' | import { Server } from './server' | ||||||
| import { client } from './client' | import { Client } from './client' | ||||||
| import { browser } from './browser' | import { Browser } from './browser' | ||||||
| 
 | 
 | ||||||
| class Rpc extends Wrapper { | class Rpc extends Wrapper { | ||||||
|     constructor() { |     private _server: Server | ||||||
|         super() |     private _client: Client | ||||||
|  |     private _browser: Browser | ||||||
|  | 
 | ||||||
|  |     constructor( | ||||||
|  |         options: RpcConfig = { | ||||||
|  |             forceBrowserDevMode: false, | ||||||
|  |             debugLogs: false, | ||||||
|  |         }, | ||||||
|  |     ) { | ||||||
|  |         super(options) | ||||||
|  | 
 | ||||||
|  |         this._server = new Server(options) | ||||||
|  |         this._client = new Client(options) | ||||||
|  |         this._browser = new Browser(options) | ||||||
|  |         this.debug_ = !!options.debugLogs | ||||||
|  | 
 | ||||||
|  |         if (options.forceBrowserDevMode) return | ||||||
| 
 | 
 | ||||||
|         if (this.environment_ === Environment.UNKNOWN) |         if (this.environment_ === Environment.UNKNOWN) | ||||||
|             throw new Error(Errors.UNKNOWN_ENVIRONMENT) |             throw new Error(Errors.UNKNOWN_ENVIRONMENT) | ||||||
| @ -27,7 +44,7 @@ class Rpc extends Wrapper { | |||||||
|             async (player: PlayerMp | string, dataRaw: string) => { |             async (player: PlayerMp | string, dataRaw: string) => { | ||||||
|                 switch (this.environment_) { |                 switch (this.environment_) { | ||||||
|                     case Environment.SERVER: |                     case Environment.SERVER: | ||||||
|                         server._resolveEmitDestination( |                         this._server._resolveEmitDestination( | ||||||
|                             player as PlayerMp, |                             player as PlayerMp, | ||||||
|                             dataRaw, |                             dataRaw, | ||||||
|                         ) |                         ) | ||||||
| @ -35,12 +52,12 @@ class Rpc extends Wrapper { | |||||||
| 
 | 
 | ||||||
|                     case Environment.CLIENT: |                     case Environment.CLIENT: | ||||||
|                         dataRaw = player as string |                         dataRaw = player as string | ||||||
|                         client._resolveEmitDestination(dataRaw) |                         this._client._resolveEmitDestination(dataRaw) | ||||||
|                         break |                         break | ||||||
| 
 | 
 | ||||||
|                     case Environment.BROWSER: |                     case Environment.BROWSER: | ||||||
|                         dataRaw = player as string |                         dataRaw = player as string | ||||||
|                         browser._resolveEmitDestination(dataRaw) |                         this._browser._resolveEmitDestination(dataRaw) | ||||||
|                         break |                         break | ||||||
| 
 | 
 | ||||||
|                     default: |                     default: | ||||||
| @ -51,6 +68,10 @@ class Rpc extends Wrapper { | |||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     set browser(browser: any) { | ||||||
|  |         this._client.browser = browser | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public register< |     public register< | ||||||
|         CallbackArguments extends unknown[] = unknown[], |         CallbackArguments extends unknown[] = unknown[], | ||||||
|         CallbackReturn extends unknown = unknown, |         CallbackReturn extends unknown = unknown, | ||||||
| @ -59,6 +80,8 @@ class Rpc extends Wrapper { | |||||||
|         eventName: EventName, |         eventName: EventName, | ||||||
|         cb: (...args: CallbackArguments) => CallbackReturn, |         cb: (...args: CallbackArguments) => CallbackReturn, | ||||||
|     ): void { |     ): void { | ||||||
|  |         this.log('register', eventName, cb) | ||||||
|  |         if (this.forceBrowserDevMode_) return | ||||||
|         Utils.errorUnknownEnvironment(this.environment_) |         Utils.errorUnknownEnvironment(this.environment_) | ||||||
| 
 | 
 | ||||||
|         if ( |         if ( | ||||||
| @ -76,6 +99,8 @@ class Rpc extends Wrapper { | |||||||
|     public unregister<EventName extends string = string>( |     public unregister<EventName extends string = string>( | ||||||
|         eventName: EventName, |         eventName: EventName, | ||||||
|     ): void { |     ): void { | ||||||
|  |         this.log('unregister', eventName) | ||||||
|  |         if (this.forceBrowserDevMode_) return | ||||||
|         Utils.errorUnknownEnvironment(this.environment_) |         Utils.errorUnknownEnvironment(this.environment_) | ||||||
| 
 | 
 | ||||||
|         delete this.state_[eventName] |         delete this.state_[eventName] | ||||||
| @ -96,6 +121,20 @@ class Rpc extends Wrapper { | |||||||
|         eventNameOrArgs?: string | unknown[], |         eventNameOrArgs?: string | unknown[], | ||||||
|         args?: unknown[], |         args?: unknown[], | ||||||
|     ) { |     ) { | ||||||
|  |         _is1StParamPlayer(playerOrEventName) | ||||||
|  |             ? this.log( | ||||||
|  |                   'callClient', | ||||||
|  |                   eventNameOrArgs as string, | ||||||
|  |                   playerOrEventName, | ||||||
|  |                   eventNameOrArgs, | ||||||
|  |                   args, | ||||||
|  |               ) | ||||||
|  |             : this.log( | ||||||
|  |                   'callClient', | ||||||
|  |                   playerOrEventName as string, | ||||||
|  |                   eventNameOrArgs, | ||||||
|  |               ) | ||||||
|  |         if (this.forceBrowserDevMode_) return | ||||||
|         Utils.errorUnknownEnvironment(this.environment_) |         Utils.errorUnknownEnvironment(this.environment_) | ||||||
| 
 | 
 | ||||||
|         function _is1StParamPlayer(x: unknown): x is PlayerMp { |         function _is1StParamPlayer(x: unknown): x is PlayerMp { | ||||||
| @ -105,8 +144,8 @@ class Rpc extends Wrapper { | |||||||
|             return typeof x === 'string' |             return typeof x === 'string' | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // client
 |  | ||||||
|         if (this.environment_ === Environment.CLIENT) { |         if (this.environment_ === Environment.CLIENT) { | ||||||
|  |             // client
 | ||||||
|             return await this.call( |             return await this.call( | ||||||
|                 playerOrEventName as string, |                 playerOrEventName as string, | ||||||
|                 args as unknown[], |                 args as unknown[], | ||||||
| @ -163,6 +202,9 @@ class Rpc extends Wrapper { | |||||||
|         EventName extends string = string, |         EventName extends string = string, | ||||||
|         Return extends unknown = unknown, |         Return extends unknown = unknown, | ||||||
|     >(eventName: EventName, args?: Arguments): Promise<Return> { |     >(eventName: EventName, args?: Arguments): Promise<Return> { | ||||||
|  |         this.log('callServer', eventName, args) | ||||||
|  |         if (this.forceBrowserDevMode_) | ||||||
|  |             return undefined as unknown as Promise<Return> | ||||||
|         Utils.errorUnknownEnvironment(this.environment_) |         Utils.errorUnknownEnvironment(this.environment_) | ||||||
| 
 | 
 | ||||||
|         const state: RPCState = { |         const state: RPCState = { | ||||||
| @ -208,6 +250,20 @@ class Rpc extends Wrapper { | |||||||
|         eventNameOrArgs?: string | unknown[], |         eventNameOrArgs?: string | unknown[], | ||||||
|         args?: unknown[], |         args?: unknown[], | ||||||
|     ) { |     ) { | ||||||
|  |         _is1StParamPlayer(playerOrEventName) | ||||||
|  |             ? this.log( | ||||||
|  |                   'DEV callClient', | ||||||
|  |                   eventNameOrArgs as string, | ||||||
|  |                   playerOrEventName, | ||||||
|  |                   eventNameOrArgs, | ||||||
|  |                   args, | ||||||
|  |               ) | ||||||
|  |             : this.log( | ||||||
|  |                   'DEV callClient', | ||||||
|  |                   playerOrEventName as string, | ||||||
|  |                   eventNameOrArgs, | ||||||
|  |               ) | ||||||
|  |         if (this.forceBrowserDevMode_) return | ||||||
|         Utils.errorUnknownEnvironment(this.environment_) |         Utils.errorUnknownEnvironment(this.environment_) | ||||||
| 
 | 
 | ||||||
|         function _is1StParamPlayer(x: unknown): x is PlayerMp { |         function _is1StParamPlayer(x: unknown): x is PlayerMp { | ||||||
| @ -257,6 +313,9 @@ class Rpc extends Wrapper { | |||||||
|         EventName extends string = string, |         EventName extends string = string, | ||||||
|         Return extends unknown = unknown, |         Return extends unknown = unknown, | ||||||
|     >(eventName: EventName, args?: Arguments): Promise<Return> { |     >(eventName: EventName, args?: Arguments): Promise<Return> { | ||||||
|  |         this.log('call', eventName, args) | ||||||
|  |         if (this.forceBrowserDevMode_) | ||||||
|  |             return undefined as unknown as Promise<Return> | ||||||
|         Utils.errorUnknownEnvironment(this.environment_) |         Utils.errorUnknownEnvironment(this.environment_) | ||||||
| 
 | 
 | ||||||
|         let state: RPCState = { |         let state: RPCState = { | ||||||
| @ -332,6 +391,4 @@ class Rpc extends Wrapper { | |||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | export { Rpc } | ||||||
| const rpc = new Rpc() |  | ||||||
| export { rpc, client } |  | ||||||
|  | |||||||
| @ -5,12 +5,19 @@ import { | |||||||
|     type PlayerMp, |     type PlayerMp, | ||||||
|     RPCEventType, |     RPCEventType, | ||||||
|     RPCState, |     RPCState, | ||||||
|  |     RpcWrapperConfig, | ||||||
|     Utils, |     Utils, | ||||||
| } from './utils' | } from './utils' | ||||||
| 
 | 
 | ||||||
| class Server extends Wrapper { | export class Server extends Wrapper { | ||||||
|     constructor() { |     constructor( | ||||||
|         super() |         options: RpcWrapperConfig = { | ||||||
|  |             forceBrowserDevMode: false, | ||||||
|  |         }, | ||||||
|  |     ) { | ||||||
|  |         super(options) | ||||||
|  | 
 | ||||||
|  |         if (!!options.forceBrowserDevMode) return | ||||||
| 
 | 
 | ||||||
|         mp.events.add( |         mp.events.add( | ||||||
|             Events.SERVER_EVENT_LISTENER, |             Events.SERVER_EVENT_LISTENER, | ||||||
| @ -84,6 +91,3 @@ class Server extends Wrapper { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| const server = new Server() |  | ||||||
| export { server } |  | ||||||
|  | |||||||
| @ -18,6 +18,28 @@ export enum Errors { | |||||||
|     EVENT_RESPONSE_TIMEOUT = 'Response was timed out after 10s of inactivity', |     EVENT_RESPONSE_TIMEOUT = 'Response was timed out after 10s of inactivity', | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | export type RPCState = { | ||||||
|  |     eventName: string | ||||||
|  |     uuid: string | ||||||
|  |     calledFrom: Environment | ||||||
|  |     calledTo: Environment | ||||||
|  |     knownError?: string | ||||||
|  |     data?: any | ||||||
|  |     type: RPCEventType | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export type PlayerMp = { | ||||||
|  |     call: (event: string, args?: unknown[]) => void | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface RpcWrapperConfig { | ||||||
|  |     forceBrowserDevMode?: boolean | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface RpcConfig extends RpcWrapperConfig { | ||||||
|  |     debugLogs?: boolean | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export class Utils { | export class Utils { | ||||||
|     public static getEnvironment(): Environment { |     public static getEnvironment(): Environment { | ||||||
|         if ('joaat' in mp) return Environment.SERVER |         if ('joaat' in mp) return Environment.SERVER | ||||||
| @ -67,25 +89,11 @@ export class Utils { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export type RPCState = { |  | ||||||
|     eventName: string |  | ||||||
|     uuid: string |  | ||||||
|     calledFrom: Environment |  | ||||||
|     calledTo: Environment |  | ||||||
|     knownError?: string |  | ||||||
|     data?: any |  | ||||||
|     type: RPCEventType |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export enum RPCEventType { | export enum RPCEventType { | ||||||
|     EVENT = 'event', |     EVENT = 'event', | ||||||
|     RESPONSE = 'response', |     RESPONSE = 'response', | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export type PlayerMp = { |  | ||||||
|     call: (event: string, args?: unknown[]) => void |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export const nativeClientEvents = new Set([ | export const nativeClientEvents = new Set([ | ||||||
|     'browserCreated', |     'browserCreated', | ||||||
|     'browserDomReady', |     'browserDomReady', | ||||||
|  | |||||||
| @ -1,9 +1,31 @@ | |||||||
| import { Environment, Errors, RPCState, Utils } from './utils' | import { Environment, Errors, RPCState, RpcWrapperConfig, Utils } from './utils' | ||||||
| 
 | 
 | ||||||
| export class Wrapper { | export class Wrapper { | ||||||
|     protected environment_ = Utils.getEnvironment() |     protected environment_ = Environment.UNKNOWN | ||||||
|     protected state_ = |     protected state_: any | ||||||
|         this.environment_ === Environment.BROWSER ? window : global |     protected console_ = | ||||||
|  |         this.environment_ === Environment.CLIENT | ||||||
|  |             ? mp.console.logInfo | ||||||
|  |             : console.log | ||||||
|  |     protected debug_ = false | ||||||
|  |     protected forceBrowserDevMode_ = false | ||||||
|  | 
 | ||||||
|  |     constructor( | ||||||
|  |         options: RpcWrapperConfig = { | ||||||
|  |             forceBrowserDevMode: false, | ||||||
|  |         }, | ||||||
|  |     ) { | ||||||
|  |         if (options.forceBrowserDevMode) { | ||||||
|  |             this.environment_ = Environment.UNKNOWN | ||||||
|  |             this.state_ = window | ||||||
|  |         } else { | ||||||
|  |             this.environment_ = Utils.getEnvironment() | ||||||
|  |             this.state_ = | ||||||
|  |                 this.environment_ === Environment.BROWSER ? window : global | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.forceBrowserDevMode_ = !!options.forceBrowserDevMode | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     protected verifyEvent_(data: string | RPCState): RPCState { |     protected verifyEvent_(data: string | RPCState): RPCState { | ||||||
|         let rpcData = |         let rpcData = | ||||||
| @ -30,4 +52,9 @@ export class Wrapper { | |||||||
| 
 | 
 | ||||||
|         throw new Error(errorMessage.join('\n | ')) |         throw new Error(errorMessage.join('\n | ')) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     protected log(method: string, eventName: string, ...args: unknown[]): void { | ||||||
|  |         if (this.debug_) | ||||||
|  |             this.console_('RPC | [' + method + '] ' + eventName + ':', ...args) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user