Rpc integration + type fixes #3
150
rpc/src/index.ts
150
rpc/src/index.ts
@ -72,6 +72,23 @@ class Rpc extends Wrapper {
|
|||||||
this._client.browser = browser
|
this._client.browser = browser
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a callback function for a specified event
|
||||||
|
*
|
||||||
|
* @template CallbackArguments - An array of argument types that the callback function accepts
|
||||||
|
* @template CallbackReturn - The type of the value returned by the callback function
|
||||||
|
* @template EventName - A string representing the event name or union of names
|
||||||
|
*
|
||||||
|
* @param {EventName} eventName - The name of the event to register the callback for
|
||||||
|
* @param {(...args: CallbackArguments) => CallbackReturn} cb - The callback function that is called when the event is triggered
|
||||||
|
*
|
||||||
|
* @returns {void}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* register<[PlayerMp]>('playerJoin', (player) => {
|
||||||
|
* console.log(`Connected: ${player.socialClub}`)
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public register<
|
public register<
|
||||||
CallbackArguments extends unknown[] = unknown[],
|
CallbackArguments extends unknown[] = unknown[],
|
||||||
CallbackReturn extends unknown = unknown,
|
CallbackReturn extends unknown = unknown,
|
||||||
@ -96,6 +113,18 @@ class Rpc extends Wrapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters callback function for a specified event
|
||||||
|
*
|
||||||
|
* @template EventName - A string representing the event name or union of names
|
||||||
|
*
|
||||||
|
* @param {EventName} eventName - The name of the event to register the callback for
|
||||||
|
*
|
||||||
|
* @returns {void}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* unregister('playerJoin')
|
||||||
|
*/
|
||||||
public unregister<EventName extends string = string>(
|
public unregister<EventName extends string = string>(
|
||||||
eventName: EventName,
|
eventName: EventName,
|
||||||
): void {
|
): void {
|
||||||
@ -106,11 +135,46 @@ class Rpc extends Wrapper {
|
|||||||
delete this.state_[eventName]
|
delete this.state_[eventName]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls a client-side event from server or browser
|
||||||
|
*
|
||||||
|
* @template Arguments - An array of argument types to be passed to the client event
|
||||||
|
* @template EventName - A string representing the client event name or union of names
|
||||||
|
* @template Return - The type of the value returned by the client event
|
||||||
|
*
|
||||||
|
* @param {EventName} eventName - The name of the client event to be called
|
||||||
|
* @param {Arguments} [args] - Optional arguments to pass to the client event
|
||||||
|
* @returns {Promise<Return>} A promise resolving to the return value of the client event
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Calls an event on client without specifying a player
|
||||||
|
* callClient<[], string, object>('onDataRequest').then(response => {
|
||||||
|
* console.log(`Received: ${response}`) // ^ object
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public async callClient<
|
public async callClient<
|
||||||
Arguments extends unknown[] = unknown[],
|
Arguments extends unknown[] = unknown[],
|
||||||
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>
|
||||||
|
/**
|
||||||
|
* Calls a client-side event from server or browser
|
||||||
|
*
|
||||||
|
* @template Arguments - An array of argument types to be passed to the client event
|
||||||
|
* @template EventName - A string representing the client event name or union of names
|
||||||
|
* @template Return - The type of the value returned by the client event
|
||||||
|
*
|
||||||
|
* @param {PlayerMp} player - The player for whom the client event is called
|
||||||
|
* @param {EventName} eventName - The name of the client event to be called
|
||||||
|
* @param {Arguments} [args] - Optional arguments to pass to the client event
|
||||||
|
* @returns {Promise<Return>} A promise resolving to the return value of the client event
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Calls an event on client for a specific player
|
||||||
|
* callClient<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2]).then(result => {
|
||||||
|
* console.log(`Action success: ${result}`) // ^ boolean
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public async callClient<
|
public async callClient<
|
||||||
Arguments extends unknown[] = unknown[],
|
Arguments extends unknown[] = unknown[],
|
||||||
EventName extends string = string,
|
EventName extends string = string,
|
||||||
@ -140,6 +204,7 @@ class Rpc extends Wrapper {
|
|||||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||||
return typeof x === 'object'
|
return typeof x === 'object'
|
||||||
}
|
}
|
||||||
|
|
||||||
function _is2NdParamEventName(x: unknown): x is string {
|
function _is2NdParamEventName(x: unknown): x is string {
|
||||||
return typeof x === 'string'
|
return typeof x === 'string'
|
||||||
}
|
}
|
||||||
@ -197,6 +262,23 @@ class Rpc extends Wrapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls a server-side event from server or client
|
||||||
|
*
|
||||||
|
* @template Arguments - An array of argument types to be passed to the server event
|
||||||
|
* @template EventName - A string representing the server event name or union of names
|
||||||
|
* @template Return - The type of the value returned by the server event
|
||||||
|
*
|
||||||
|
* @param {EventName} eventName - The name of the server event to be called
|
||||||
|
* @param {Arguments} [args] - Optional arguments to pass to the server event
|
||||||
|
* @returns {Promise<Return>} A promise resolving to the return value of the server event
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Calls an event on server
|
||||||
|
* callServer<[], string, object>('onDataRequest').then(response => {
|
||||||
|
* console.log(`Received: ${response}`) // ^ object
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public async callServer<
|
public async callServer<
|
||||||
Arguments extends unknown[] = unknown[],
|
Arguments extends unknown[] = unknown[],
|
||||||
EventName extends string = string,
|
EventName extends string = string,
|
||||||
@ -235,11 +317,46 @@ class Rpc extends Wrapper {
|
|||||||
return (await this.responseHandler(state.uuid)).data
|
return (await this.responseHandler(state.uuid)).data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls a browser-side event from server or client
|
||||||
|
*
|
||||||
|
* @template Arguments - An array of argument types to be passed to the browser event
|
||||||
|
* @template EventName - A string representing the browser event name or union of names
|
||||||
|
* @template Return - The type of the value returned by the browser event
|
||||||
|
*
|
||||||
|
* @param {EventName} eventName - The name of the browser event to be called
|
||||||
|
* @param {Arguments} [args] - Optional arguments to pass to the browser event
|
||||||
|
* @returns {Promise<Return>} A promise resolving to the return value of the browser event
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Calls an event on browser without specifying a player
|
||||||
|
* callBrowser<[], string, object>('onDataRequest').then(response => {
|
||||||
|
* console.log(`Received: ${response}`) // ^ object
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public async callBrowser<
|
public async callBrowser<
|
||||||
Arguments extends unknown[] = unknown[],
|
Arguments extends unknown[] = unknown[],
|
||||||
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>
|
||||||
|
/**
|
||||||
|
* Calls a browser-side event from server or client
|
||||||
|
*
|
||||||
|
* @template Arguments - An array of argument types to be passed to the browser event
|
||||||
|
* @template EventName - A string representing the browser event name or union of names
|
||||||
|
* @template Return - The type of the value returned by the browser event
|
||||||
|
*
|
||||||
|
* @param {PlayerMp} player - The player for whom the browser event is called
|
||||||
|
* @param {EventName} eventName - The name of the browser event to be called
|
||||||
|
* @param {Arguments} [args] - Optional arguments to pass to the browser event
|
||||||
|
* @returns {Promise<Return>} A promise resolving to the return value of the browser event
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Calls an event on a browser for a specific player
|
||||||
|
* callBrowser<[string, number], string, boolean>(player, 'onPlayerAction', ['jump', 2]).then(result => {
|
||||||
|
* console.log(`Action success: ${result}`) // ^ boolean
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public async callBrowser<
|
public async callBrowser<
|
||||||
Arguments extends unknown[] = unknown[],
|
Arguments extends unknown[] = unknown[],
|
||||||
EventName extends string = string,
|
EventName extends string = string,
|
||||||
@ -269,6 +386,7 @@ class Rpc extends Wrapper {
|
|||||||
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
function _is1StParamPlayer(x: unknown): x is PlayerMp {
|
||||||
return typeof x === 'object'
|
return typeof x === 'object'
|
||||||
}
|
}
|
||||||
|
|
||||||
function _is2NdParamEventName(x: unknown): x is string {
|
function _is2NdParamEventName(x: unknown): x is string {
|
||||||
return typeof x === 'string'
|
return typeof x === 'string'
|
||||||
}
|
}
|
||||||
@ -308,6 +426,23 @@ class Rpc extends Wrapper {
|
|||||||
return (await this.responseHandler(state.uuid)).data
|
return (await this.responseHandler(state.uuid)).data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls an event in current environment
|
||||||
|
*
|
||||||
|
* @template Arguments - An array of argument types to be passed to the event
|
||||||
|
* @template EventName - A string representing the event name or union of names
|
||||||
|
* @template Return - The type of the value returned by the event
|
||||||
|
*
|
||||||
|
* @param {EventName} eventName - The name of the event to be called
|
||||||
|
* @param {Arguments} [args] - Optional arguments to pass to the event
|
||||||
|
* @returns {Promise<Return>} A promise resolving to the return value of the event
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Calls an event on browser without specifying a player
|
||||||
|
* callBrowser<[], string, number>('getSomething').then(response => {
|
||||||
|
* console.log(`Received: ${response}`) // ^ number
|
||||||
|
* })
|
||||||
|
*/
|
||||||
public async call<
|
public async call<
|
||||||
Arguments extends unknown[] = unknown[],
|
Arguments extends unknown[] = unknown[],
|
||||||
EventName extends string = string,
|
EventName extends string = string,
|
||||||
@ -328,20 +463,26 @@ class Rpc extends Wrapper {
|
|||||||
type: RPCEventType.EVENT,
|
type: RPCEventType.EVENT,
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.callSelf<Return>(state)
|
return await this.callSelf<Return>(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
private callSelf<Return extends unknown = unknown>(
|
/**
|
||||||
|
* redirects an event in cases of it calling its own environment
|
||||||
|
*/
|
||||||
|
private async callSelf<Return extends unknown = unknown>(
|
||||||
state: RPCState,
|
state: RPCState,
|
||||||
): Return {
|
): Promise<Return> {
|
||||||
state = this.verifyEvent_(state)
|
state = this.verifyEvent_(state)
|
||||||
if (state.knownError) {
|
if (state.knownError) {
|
||||||
this.triggerError_(state, state.knownError)
|
this.triggerError_(state, state.knownError)
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.state_[state.eventName](...state.data)
|
return await this.state_[state.eventName](...state.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns cross-environment response
|
||||||
|
*/
|
||||||
private async responseHandler(uuid: string): Promise<RPCState> {
|
private async responseHandler(uuid: string): Promise<RPCState> {
|
||||||
const responseEventName = Utils.generateResponseEventName(uuid)
|
const responseEventName = Utils.generateResponseEventName(uuid)
|
||||||
|
|
||||||
@ -391,4 +532,5 @@ class Rpc extends Wrapper {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Rpc }
|
export { Rpc }
|
||||||
|
@ -41,6 +41,7 @@ export interface RpcConfig extends RpcWrapperConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class Utils {
|
export class Utils {
|
||||||
|
// todo type for dev browser
|
||||||
public static getEnvironment(): Environment {
|
public static getEnvironment(): Environment {
|
||||||
if ('joaat' in mp) return Environment.SERVER
|
if ('joaat' in mp) return Environment.SERVER
|
||||||
if (
|
if (
|
||||||
|
@ -27,6 +27,7 @@ export class Wrapper {
|
|||||||
this.forceBrowserDevMode_ = !!options.forceBrowserDevMode
|
this.forceBrowserDevMode_ = !!options.forceBrowserDevMode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// checks if event is available (registered) in current environment
|
||||||
protected verifyEvent_(data: string | RPCState): RPCState {
|
protected verifyEvent_(data: string | RPCState): RPCState {
|
||||||
let rpcData =
|
let rpcData =
|
||||||
typeof data === 'string' ? Utils.prepareExecution(data) : data
|
typeof data === 'string' ? Utils.prepareExecution(data) : data
|
||||||
|
Loading…
Reference in New Issue
Block a user