From 996ecc1aeaadfff10d96f6cde3eaca164c1aa6f6 Mon Sep 17 00:00:00 2001 From: LeonardSSH Date: Wed, 22 Dec 2021 23:23:02 +0000 Subject: [PATCH] publish: output for 14f3e547c4e2331d5f2df5fa3b0ed75dcd24a371 --- README.md | 78 +++++++++++++++++++++++-------------------- dist/rage-rpc.esm.mjs | 2 +- dist/rage-rpc.js | 2 +- dist/rage-rpc.umd.js | 2 +- package.json | 2 +- 5 files changed, 45 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 4437fe3..bd09116 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,38 @@ > fork of [micaww/rage-rpc](https://github.com/micaww/rage-rpc/) -* [Motivation](#motivation) -* [Installation](#installation) -* [Examples](#examples) - * [Server to Client](#server-to-client) - * [CEF to Server](#cef-to-server) - * [Client to Server](#client-to-server) -* [API](#api) - * [Universal](#universal) - * [setDebugMode(state)](#setdebugmodestate) - * [register(name, callback)](#registername-callback) - * [unregister(name)](#unregistername) - * [call(name, args)](#callname-args-options) - * [callServer(name, args)](#callservername-args-options) - * [on(name, callback)](#onname-callback) - * [off(name, callback)](#offname-callback) - * [trigger(name, args)](#triggername-args) - * triggerServer(name, args) - * [Server-side](#server-side-3) - * [callClient(player, name, args)](#callclientplayer-name-args) - * [callBrowsers(player, name, args)](#callbrowsersplayer-name-args-options) - * triggerClient(player, name, args) - * triggerBrowsers(player, name, args) - * [Client-side](#client-side-2) - * [callBrowser(browser, name, args)](#callbrowserbrowser-name-args-options) - * triggerBrowser(browser, name, args) - * [CEF or Client-side](#cef-or-client-side) - * [callBrowsers(name, args)](#callbrowsersplayer-name-args-options) - * [callClient(name, args)](#callclientname-args-options) - * [triggerBrowsers(name, args)](#triggerbrowsersname-args) - * [triggerClient(name, args)](#triggerclientname-args) -* [Options](#options) -* [Events](#events) -* [Changelog](#changelog) +- [Motivation](#motivation) +- [Installation](#installation) +- [Examples](#examples) + - [Server to Client](#server-to-client) + - [CEF to Server](#cef-to-server) + - [Client to Server](#client-to-server) +- [API](#api) + - [Universal](#universal) + - [setDebugMode(state)](#setdebugmodestate) + - [register(name, callback)](#registername-callback) + - [unregister(name)](#unregistername) + - [call(name, args)](#callname-args-options) + - [callServer(name, args)](#callservername-args-options) + - [on(name, callback)](#onname-callback) + - [off(name, callback)](#offname-callback) + - [trigger(name, args)](#triggername-args) + - triggerServer(name, args) + - [Server-side](#server-side-3) + - [callClient(player, name, args)](#callclientplayer-name-args) + - [callBrowsers(player, name, args)](#callbrowsersplayer-name-args-options) + - triggerClient(player, name, args) + - triggerBrowsers(player, name, args) + - [Client-side](#client-side-2) + - [callBrowser(browser, name, args)](#callbrowserbrowser-name-args-options) + - triggerBrowser(browser, name, args) + - [CEF or Client-side](#cef-or-client-side) + - [callBrowsers(name, args)](#callbrowsersplayer-name-args-options) + - [callClient(name, args)](#callclientname-args-options) + - [triggerBrowsers(name, args)](#triggerbrowsersname-args) + - [triggerClient(name, args)](#triggerclientname-args) +- [Options](#options) +- [Events](#events) +- [Changelog](#changelog) ## Motivation @@ -54,13 +54,13 @@ You can install via [github](https://github.com/LeonardSSH/rage-rpc) ```bash # With npm -npm i github:leonardssh/rage-rpc#v0.2.1 +npm i github:leonardssh/rage-rpc#v0.2.2 # With yarn -yarn add github:leonardssh/rage-rpc#v0.2.1 +yarn add github:leonardssh/rage-rpc#v0.2.2 # With pnpm -pnpm add github:leonardssh/rage-rpc#v0.2.1 +pnpm add github:leonardssh/rage-rpc#v0.2.2 ``` From here, you can simply require the package in any RAGE context: @@ -533,9 +533,13 @@ You can now use rage-rpc as a full on replacement for mp.events. API functions t Check the releases tab for an up-to-date changelog. +#### 0.2.2 + +- ADD: Terser to minify generated bundle + #### 0.2.1 -- ADD: Logs for `on` & `off` listeners +- ADD: Logs for `on` & `off` listeners #### 0.2.0 diff --git a/dist/rage-rpc.esm.mjs b/dist/rage-rpc.esm.mjs index caa3647..2d3d9a4 100644 --- a/dist/rage-rpc.esm.mjs +++ b/dist/rage-rpc.esm.mjs @@ -1 +1 @@ -var e;!function(e){e.Blip="b",e.Checkpoint="cp",e.Colshape="c",e.Label="l",e.Marker="m",e.Object="o",e.Pickup="p",e.Player="pl",e.Vehicle="v"}(e||(e={}));let r=!1;function setDebugMode(e){r=e}function getEnvironment(){if(mp.joaat)return"server";if(mp.game&&mp.game.joaat)return"client";if(mp.trigger)return"cef";throw new Error("Unknown RAGE environment")}function log(e,t="info"){if(!r)return;const n=getEnvironment(),s=mp.console;(s?mp.console:console)[s?{info:"logInfo",error:"logError",warn:"logWarn"}[t]:"info"===t?"log":t](`RPC (${n}): ${e}`)}function isObjectMpType(r,t){const n="client"===getEnvironment();if(r&&"object"==typeof r&&void 0!==r.id){const validate=(e,t,s)=>n?r.type===e&&t.at(r.id)===r:r instanceof s;switch(t){case e.Blip:return validate("blip",mp.blips,mp.Blip);case e.Checkpoint:return validate("checkpoint",mp.checkpoints,mp.Checkpoint);case e.Colshape:return validate("colshape",mp.colshapes,mp.Colshape);case e.Label:return validate("textlabel",mp.labels,mp.TextLabel);case e.Marker:return validate("marker",mp.markers,mp.Marker);case e.Object:return validate("object",mp.objects,mp.Object);case e.Pickup:return validate("pickup",mp.pickups,mp.Pickup);case e.Player:return validate("player",mp.players,mp.Player);case e.Vehicle:return validate("vehicle",mp.vehicles,mp.Vehicle)}}return!1}function generateId(){const e=46656*Math.random()|0,r=46656*Math.random()|0;return`000${e.toString(36)}`.slice(-3)+`000${r.toString(36)}`.slice(-3)}function stringifyData(r){const t=getEnvironment();return JSON.stringify(r,((r,n)=>{if("client"===t||"server"===t&&n&&"object"==typeof n){let r;if(isObjectMpType(n,e.Blip)?r=e.Blip:isObjectMpType(n,e.Checkpoint)?r=e.Checkpoint:isObjectMpType(n,e.Colshape)?r=e.Colshape:isObjectMpType(n,e.Marker)?r=e.Marker:isObjectMpType(n,e.Object)?r=e.Object:isObjectMpType(n,e.Pickup)?r=e.Pickup:isObjectMpType(n,e.Player)?r=e.Player:isObjectMpType(n,e.Vehicle)&&(r=e.Vehicle),r)return{__t:r,i:"number"==typeof n.remoteId?n.remoteId:n.id}}return n}))}function promiseTimeout(e,r){return"number"==typeof r?Promise.race([new Promise(((e,t)=>{setTimeout((()=>t("TIMEOUT")),r)})),e]):e}function isBrowserValid(e){try{e.url}catch(e){return!1}return!0}const t="__rpc:triggerEvent",n=getEnvironment(),s="cef"===n?window:global;if(s["__rpc:processPartial"]||(s.__rpcPartialData={},s["__rpc:processPartial"]=(e,r,t,o,c)=>{"server"!==n&&(c=o,o=t,t=r,r=e),s.__rpcPartialData[r]||(s.__rpcPartialData[r]=new Array(o)),s.__rpcPartialData[r][t]=c,s.__rpcPartialData[r].includes(void 0)||("server"===n?s["__rpc:process"](e,s.__rpcPartialData[r].join("")):s["__rpc:process"](s.__rpcPartialData[r].join("")),delete s.__rpcPartialData[r])}),!s["__rpc:process"]){if(s.__rpcListeners={},s.__rpcPending={},s.__rpcEvListeners={},s["__rpc:process"]=(r,t)=>{"server"!==n&&(t=r);const o=function parseData(r){const t=getEnvironment();return JSON.parse(r,((r,n)=>{if(("client"===t||"server"===t)&&n&&"object"==typeof n&&"string"==typeof n.__t&&"number"==typeof n.i&&2===Object.keys(n).length){const r=n.i;let s;switch(n.__t){case e.Blip:s=mp.blips;break;case e.Checkpoint:s=mp.checkpoints;break;case e.Colshape:s=mp.colshapes;break;case e.Label:s=mp.labels;break;case e.Marker:s=mp.markers;break;case e.Object:s=mp.objects;break;case e.Pickup:s=mp.pickups;break;case e.Player:s=mp.players;break;case e.Vehicle:s=mp.vehicles}if(s)return s["client"===t?"atRemoteId":"at"](r)}return n}))}(t);if(o.req){const e={id:o.id,environment:o.fenv||o.env};"server"===n&&(e.player=r);const t={ret:1,id:o.id,env:n};let c;switch(n){case"server":c=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===o.env)c=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===o.env){const r=o.b&&s.__rpcBrowsers[o.b];e.browser=r,c=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:c=e=>mp.trigger("__rpc:process",stringifyData(e))}if(c){const r=callProcedure(o.name,o.args,e);o.noRet||r.then((e=>c({...t,res:e}))).catch((e=>c({...t,err:e||null})))}}else if(o.ret){const e=s.__rpcPending[o.id];if("server"===n&&e.player!==r)return;e&&(e.resolve(o.hasOwnProperty("err")?Promise.reject(o.err):Promise.resolve(o.res)),delete s.__rpcPending[o.id])}},"cef"===n)void 0===s["__rpc:id"]&&(s["__rpc:id"]=new Promise((e=>{window.name?e(window.name):s["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",s["__rpc:process"]),mp.events.add("__rpc:processPartial",s["__rpc:processPartial"]),"client"===n){register("__rpc:callServer",(([e,r,t],n)=>_callServer(e,r,{fenv:n.environment,noRet:t}))),register("__rpc:callBrowsers",(([e,r,t],n)=>_callBrowsers(null,e,r,{fenv:n.environment,noRet:t}))),s.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(s.__rpcBrowsers).forEach((r=>{const t=s.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete s.__rpcBrowsers[r]})),s.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['__rpc:id'] === 'undefined'){\n window['__rpc:id'] = Promise.resolve(window.name);\n }else{\n window['__rpc:id:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),s.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]===r&&delete s.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],n)=>{Object.keys(s.__rpcBrowsers).forEach((o=>{const c=s.__rpcBrowsers[o];c&&isBrowserValid(c)?_callBrowser(c,t,[e,r],{fenv:n.environment,noRet:1}):delete s.__rpcBrowsers[o]}))}))}register(t,(([e,r],t)=>callEvent(e,r,t)))}function passEventToBrowser(e,r,t){const n=stringifyData(r);e.execute(`var process = window["__rpc:process"]; if(process){ process(${JSON.stringify(n)}); }else{ ${t?"":`mp.trigger("__rpc:process", '{"ret":1,"id":"${r.id}","err":"PROCEDURE_NOT_FOUND","env":"cef"}');`} }`)}function callProcedure(e,r,t){const n=s.__rpcListeners[e];return n?Promise.resolve(n(r,t)):Promise.reject(`PROCEDURE_NOT_FOUND (${e})`)}function sendEventData(e,r){const t={client:(e,...r)=>mp.events.callRemote(e,...r),server:(e,...t)=>r.call(e,[...t])},n=e.env,s=stringifyData(e);if(s.length>32e3){const r=function chunkSubstr(e,r){const t=Math.ceil(e.length/r),n=new Array(t);let s=0;for(let o=0;o{t[n]("__rpc:processPartial",e.id,o,r.length,s)}))}else t[n]("__rpc:process",s)}function register(e,r){if(2!==arguments.length)throw new Error(`register expects 2 arguments: "name" and "cb" ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),s.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if(1!==arguments.length)throw new Error(`unregister expects 1 argument: "name" ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),s.__rpcListeners[e]=void 0}function call(e,r,t={}){return arguments.length<1||arguments.length>3?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:n}),t.timeout)}function _callServer(e,r,t={}){switch(n){case"server":return call(e,r);case"client":{const o=generateId();return new Promise((c=>{t.noRet||(s.__rpcPending[o]={resolve:c});sendEventData({req:1,id:o,name:e,env:n,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function callServer(e,r,t={}){if(arguments.length<1||arguments.length>3)return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`);const n={};return t.noRet&&(n.noRet=1),promiseTimeout(_callServer(e,r,n),t.timeout)}function _callClient(e,r,t,o={}){switch(n){case"client":return call(r,t);case"server":{const c=generateId();return new Promise((i=>{o.noRet||(s.__rpcPending[c]={resolve:i,player:e});sendEventData({req:1,id:c,name:r,env:n,args:t,...o},e)}))}case"cef":{const e=generateId();return s["__rpc:id"].then((c=>new Promise((i=>{o.noRet||(s.__rpcPending[e]={resolve:i});const a={b:c,req:1,id:e,name:r,env:n,args:t,...o};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,t,s={}){switch(n){case"client":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>4||"object"!=typeof e)return Promise.reject(`callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);break;case"cef":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`)}const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callClient(e,r,t,o),s.timeout)}function _callBrowser(e,r,t,o={}){return new Promise((c=>{const i=generateId();o.noRet||(s.__rpcPending[i]={resolve:c}),passEventToBrowser(e,{req:1,id:i,name:r,env:n,args:t,...o},!1)}))}function _callBrowsers(e,r,t,o={}){switch(n){case"client":{const e=s.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const n=s.__rpcBrowsers[e];return n&&isBrowserValid(n)?_callBrowser(n,r,t,o):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o)}}function callBrowsers(e,r,t,s={}){let o;const c={};switch(n){case"client":case"cef":if(s=t||{},t=r,r=e,arguments.length<1||arguments.length>3)return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(null,r,t,c);break;case"server":if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(e,r,t,c)}if(o)return promiseTimeout(o,s.timeout)}function callBrowser(e,r,t,s={}){if("client"!==n)return Promise.reject(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${r}")`);const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callBrowser(e,r,t,o),s.timeout)}function callEvent(e,r,t){const n=s.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function on(e,r){if(2!==arguments.length)throw new Error(`on expects 2 arguments: "name" and "cb" ("${e}")`);log(`Registered procedure listener "${e}"`);const t=s.__rpcEvListeners[e]||new Set;return t.add(r),s.__rpcEvListeners[e]=t,()=>off(e,r)}function off(e,r){if(2!==arguments.length)throw new Error(`off expects 2 arguments: "name" and "cb" ("${e}")`);const t=s.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}function trigger(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);callEvent(e,r,{environment:n})}function triggerClient(e,r,s){switch(n){case"client":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3||"object"!=typeof e)throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`);break;case"cef":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`)}_callClient(e,t,[r,s],{noRet:1})}function triggerServer(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);_callServer(t,[e,r],{noRet:1})}function triggerBrowsers(e,r,t){switch(n){case"client":case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,t],{noRet:1})}function triggerBrowser(e,r,s){if("client"!==n)throw new Error(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${r}")`);_callBrowser(e,t,[r,s],{noRet:1})}const o="0.2.1";export{call,callBrowser,callBrowsers,callClient,callServer,off,on,register,setDebugMode,trigger,triggerBrowser,triggerBrowsers,triggerClient,triggerServer,unregister,o as version}; +var e;!function(e){e.Blip="b",e.Checkpoint="cp",e.Colshape="c",e.Label="l",e.Marker="m",e.Object="o",e.Pickup="p",e.Player="pl",e.Vehicle="v"}(e||(e={}));let r=!1;function setDebugMode(e){r=e}function getEnvironment(){if(mp.joaat)return"server";if(mp.game&&mp.game.joaat)return"client";if(mp.trigger)return"cef";throw new Error("Unknown RAGE environment")}function log(e,t="info"){if(!r)return;const n=getEnvironment(),s=mp.console;(s?mp.console:console)[s?{info:"logInfo",error:"logError",warn:"logWarn"}[t]:"info"===t?"log":t](`RPC (${n}): ${e}`)}function isObjectMpType(r,t){const n="client"===getEnvironment();if(r&&"object"==typeof r&&void 0!==r.id){const validate=(e,t,s)=>n?r.type===e&&t.at(r.id)===r:r instanceof s;switch(t){case e.Blip:return validate("blip",mp.blips,mp.Blip);case e.Checkpoint:return validate("checkpoint",mp.checkpoints,mp.Checkpoint);case e.Colshape:return validate("colshape",mp.colshapes,mp.Colshape);case e.Label:return validate("textlabel",mp.labels,mp.TextLabel);case e.Marker:return validate("marker",mp.markers,mp.Marker);case e.Object:return validate("object",mp.objects,mp.Object);case e.Pickup:return validate("pickup",mp.pickups,mp.Pickup);case e.Player:return validate("player",mp.players,mp.Player);case e.Vehicle:return validate("vehicle",mp.vehicles,mp.Vehicle)}}return!1}function generateId(){const e=46656*Math.random()|0,r=46656*Math.random()|0;return`000${e.toString(36)}`.slice(-3)+`000${r.toString(36)}`.slice(-3)}function stringifyData(r){const t=getEnvironment();return JSON.stringify(r,((r,n)=>{if("client"===t||"server"===t&&n&&"object"==typeof n){let r;if(isObjectMpType(n,e.Blip)?r=e.Blip:isObjectMpType(n,e.Checkpoint)?r=e.Checkpoint:isObjectMpType(n,e.Colshape)?r=e.Colshape:isObjectMpType(n,e.Marker)?r=e.Marker:isObjectMpType(n,e.Object)?r=e.Object:isObjectMpType(n,e.Pickup)?r=e.Pickup:isObjectMpType(n,e.Player)?r=e.Player:isObjectMpType(n,e.Vehicle)&&(r=e.Vehicle),r)return{__t:r,i:"number"==typeof n.remoteId?n.remoteId:n.id}}return n}))}function promiseTimeout(e,r){return"number"==typeof r?Promise.race([new Promise(((e,t)=>{setTimeout((()=>t("TIMEOUT")),r)})),e]):e}function isBrowserValid(e){try{e.url}catch(e){return!1}return!0}const t="__rpc:triggerEvent",n=getEnvironment(),s="cef"===n?window:global;if(s["__rpc:processPartial"]||(s.__rpcPartialData={},s["__rpc:processPartial"]=(e,r,t,o,c)=>{"server"!==n&&(c=o,o=t,t=r,r=e),s.__rpcPartialData[r]||(s.__rpcPartialData[r]=new Array(o)),s.__rpcPartialData[r][t]=c,s.__rpcPartialData[r].includes(void 0)||("server"===n?s["__rpc:process"](e,s.__rpcPartialData[r].join("")):s["__rpc:process"](s.__rpcPartialData[r].join("")),delete s.__rpcPartialData[r])}),!s["__rpc:process"]){if(s.__rpcListeners={},s.__rpcPending={},s.__rpcEvListeners={},s["__rpc:process"]=(r,t)=>{"server"!==n&&(t=r);const o=function parseData(r){const t=getEnvironment();return JSON.parse(r,((r,n)=>{if(("client"===t||"server"===t)&&n&&"object"==typeof n&&"string"==typeof n.__t&&"number"==typeof n.i&&2===Object.keys(n).length){const r=n.i;let s;switch(n.__t){case e.Blip:s=mp.blips;break;case e.Checkpoint:s=mp.checkpoints;break;case e.Colshape:s=mp.colshapes;break;case e.Label:s=mp.labels;break;case e.Marker:s=mp.markers;break;case e.Object:s=mp.objects;break;case e.Pickup:s=mp.pickups;break;case e.Player:s=mp.players;break;case e.Vehicle:s=mp.vehicles}if(s)return s["client"===t?"atRemoteId":"at"](r)}return n}))}(t);if(o.req){const e={id:o.id,environment:o.fenv||o.env};"server"===n&&(e.player=r);const t={ret:1,id:o.id,env:n};let c;switch(n){case"server":c=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===o.env)c=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===o.env){const r=o.b&&s.__rpcBrowsers[o.b];e.browser=r,c=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:c=e=>mp.trigger("__rpc:process",stringifyData(e))}if(c){const r=callProcedure(o.name,o.args,e);o.noRet||r.then((e=>c({...t,res:e}))).catch((e=>c({...t,err:e||null})))}}else if(o.ret){const e=s.__rpcPending[o.id];if("server"===n&&e.player!==r)return;e&&(e.resolve(o.hasOwnProperty("err")?Promise.reject(o.err):Promise.resolve(o.res)),delete s.__rpcPending[o.id])}},"cef"===n)void 0===s["__rpc:id"]&&(s["__rpc:id"]=new Promise((e=>{window.name?e(window.name):s["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",s["__rpc:process"]),mp.events.add("__rpc:processPartial",s["__rpc:processPartial"]),"client"===n){register("__rpc:callServer",(([e,r,t],n)=>_callServer(e,r,{fenv:n.environment,noRet:t}))),register("__rpc:callBrowsers",(([e,r,t],n)=>_callBrowsers(null,e,r,{fenv:n.environment,noRet:t}))),s.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(s.__rpcBrowsers).forEach((r=>{const t=s.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete s.__rpcBrowsers[r]})),s.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['__rpc:id'] === 'undefined'){\n window['__rpc:id'] = Promise.resolve(window.name);\n }else{\n window['__rpc:id:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),s.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]===r&&delete s.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],n)=>{Object.keys(s.__rpcBrowsers).forEach((o=>{const c=s.__rpcBrowsers[o];c&&isBrowserValid(c)?_callBrowser(c,t,[e,r],{fenv:n.environment,noRet:1}):delete s.__rpcBrowsers[o]}))}))}register(t,(([e,r],t)=>callEvent(e,r,t)))}function passEventToBrowser(e,r,t){const n=stringifyData(r);e.execute(`var process = window["__rpc:process"]; if(process){ process(${JSON.stringify(n)}); }else{ ${t?"":`mp.trigger("__rpc:process", '{"ret":1,"id":"${r.id}","err":"PROCEDURE_NOT_FOUND","env":"cef"}');`} }`)}function callProcedure(e,r,t){const n=s.__rpcListeners[e];return n?Promise.resolve(n(r,t)):Promise.reject(`PROCEDURE_NOT_FOUND (${e})`)}function sendEventData(e,r){const t={client:(e,...r)=>mp.events.callRemote(e,...r),server:(e,...t)=>r.call(e,[...t])},n=e.env,s=stringifyData(e);if(s.length>32e3){const r=function chunkSubstr(e,r){const t=Math.ceil(e.length/r),n=new Array(t);let s=0;for(let o=0;o{t[n]("__rpc:processPartial",e.id,o,r.length,s)}))}else t[n]("__rpc:process",s)}function register(e,r){if(2!==arguments.length)throw new Error(`register expects 2 arguments: "name" and "cb" ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),s.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if(1!==arguments.length)throw new Error(`unregister expects 1 argument: "name" ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),s.__rpcListeners[e]=void 0}function call(e,r,t={}){return arguments.length<1||arguments.length>3?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:n}),t.timeout)}function _callServer(e,r,t={}){switch(n){case"server":return call(e,r);case"client":{const o=generateId();return new Promise((c=>{t.noRet||(s.__rpcPending[o]={resolve:c});sendEventData({req:1,id:o,name:e,env:n,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function callServer(e,r,t={}){if(arguments.length<1||arguments.length>3)return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`);const n={};return t.noRet&&(n.noRet=1),promiseTimeout(_callServer(e,r,n),t.timeout)}function _callClient(e,r,t,o={}){switch(n){case"client":return call(r,t);case"server":{const c=generateId();return new Promise((i=>{o.noRet||(s.__rpcPending[c]={resolve:i,player:e});sendEventData({req:1,id:c,name:r,env:n,args:t,...o},e)}))}case"cef":{const e=generateId();return s["__rpc:id"].then((c=>new Promise((i=>{o.noRet||(s.__rpcPending[e]={resolve:i});const a={b:c,req:1,id:e,name:r,env:n,args:t,...o};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,t,s={}){switch(n){case"client":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>4||"object"!=typeof e)return Promise.reject(`callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);break;case"cef":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`)}const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callClient(e,r,t,o),s.timeout)}function _callBrowser(e,r,t,o={}){return new Promise((c=>{const i=generateId();o.noRet||(s.__rpcPending[i]={resolve:c}),passEventToBrowser(e,{req:1,id:i,name:r,env:n,args:t,...o},!1)}))}function _callBrowsers(e,r,t,o={}){switch(n){case"client":{const e=s.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const n=s.__rpcBrowsers[e];return n&&isBrowserValid(n)?_callBrowser(n,r,t,o):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o)}}function callBrowsers(e,r,t,s={}){let o;const c={};switch(n){case"client":case"cef":if(s=t||{},t=r,r=e,arguments.length<1||arguments.length>3)return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(null,r,t,c);break;case"server":if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(e,r,t,c)}if(o)return promiseTimeout(o,s.timeout)}function callBrowser(e,r,t,s={}){if("client"!==n)return Promise.reject(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${r}")`);const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callBrowser(e,r,t,o),s.timeout)}function callEvent(e,r,t){const n=s.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function on(e,r){if(2!==arguments.length)throw new Error(`on expects 2 arguments: "name" and "cb" ("${e}")`);log(`Registered procedure listener "${e}"`);const t=s.__rpcEvListeners[e]||new Set;return t.add(r),s.__rpcEvListeners[e]=t,()=>off(e,r)}function off(e,r){if(2!==arguments.length)throw new Error(`off expects 2 arguments: "name" and "cb" ("${e}")`);const t=s.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}function trigger(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);callEvent(e,r,{environment:n})}function triggerClient(e,r,s){switch(n){case"client":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3||"object"!=typeof e)throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`);break;case"cef":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`)}_callClient(e,t,[r,s],{noRet:1})}function triggerServer(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);_callServer(t,[e,r],{noRet:1})}function triggerBrowsers(e,r,t){switch(n){case"client":case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,t],{noRet:1})}function triggerBrowser(e,r,s){if("client"!==n)throw new Error(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${r}")`);_callBrowser(e,t,[r,s],{noRet:1})}const o="0.2.2";export{call,callBrowser,callBrowsers,callClient,callServer,off,on,register,setDebugMode,trigger,triggerBrowser,triggerBrowsers,triggerClient,triggerServer,unregister,o as version}; diff --git a/dist/rage-rpc.js b/dist/rage-rpc.js index c65cb31..9e0d9cb 100644 --- a/dist/rage-rpc.js +++ b/dist/rage-rpc.js @@ -1 +1 @@ -"use strict";var e;Object.defineProperty(exports,"__esModule",{value:!0}),function(e){e.Blip="b",e.Checkpoint="cp",e.Colshape="c",e.Label="l",e.Marker="m",e.Object="o",e.Pickup="p",e.Player="pl",e.Vehicle="v"}(e||(e={}));let r=!1;function getEnvironment(){if(mp.joaat)return"server";if(mp.game&&mp.game.joaat)return"client";if(mp.trigger)return"cef";throw new Error("Unknown RAGE environment")}function log(e,t="info"){if(!r)return;const n=getEnvironment(),s=mp.console;(s?mp.console:console)[s?{info:"logInfo",error:"logError",warn:"logWarn"}[t]:"info"===t?"log":t](`RPC (${n}): ${e}`)}function isObjectMpType(r,t){const n="client"===getEnvironment();if(r&&"object"==typeof r&&void 0!==r.id){const validate=(e,t,s)=>n?r.type===e&&t.at(r.id)===r:r instanceof s;switch(t){case e.Blip:return validate("blip",mp.blips,mp.Blip);case e.Checkpoint:return validate("checkpoint",mp.checkpoints,mp.Checkpoint);case e.Colshape:return validate("colshape",mp.colshapes,mp.Colshape);case e.Label:return validate("textlabel",mp.labels,mp.TextLabel);case e.Marker:return validate("marker",mp.markers,mp.Marker);case e.Object:return validate("object",mp.objects,mp.Object);case e.Pickup:return validate("pickup",mp.pickups,mp.Pickup);case e.Player:return validate("player",mp.players,mp.Player);case e.Vehicle:return validate("vehicle",mp.vehicles,mp.Vehicle)}}return!1}function generateId(){const e=46656*Math.random()|0,r=46656*Math.random()|0;return`000${e.toString(36)}`.slice(-3)+`000${r.toString(36)}`.slice(-3)}function stringifyData(r){const t=getEnvironment();return JSON.stringify(r,((r,n)=>{if("client"===t||"server"===t&&n&&"object"==typeof n){let r;if(isObjectMpType(n,e.Blip)?r=e.Blip:isObjectMpType(n,e.Checkpoint)?r=e.Checkpoint:isObjectMpType(n,e.Colshape)?r=e.Colshape:isObjectMpType(n,e.Marker)?r=e.Marker:isObjectMpType(n,e.Object)?r=e.Object:isObjectMpType(n,e.Pickup)?r=e.Pickup:isObjectMpType(n,e.Player)?r=e.Player:isObjectMpType(n,e.Vehicle)&&(r=e.Vehicle),r)return{__t:r,i:"number"==typeof n.remoteId?n.remoteId:n.id}}return n}))}function promiseTimeout(e,r){return"number"==typeof r?Promise.race([new Promise(((e,t)=>{setTimeout((()=>t("TIMEOUT")),r)})),e]):e}function isBrowserValid(e){try{e.url}catch(e){return!1}return!0}const t="__rpc:triggerEvent",n=getEnvironment(),s="cef"===n?window:global;if(s["__rpc:processPartial"]||(s.__rpcPartialData={},s["__rpc:processPartial"]=(e,r,t,o,c)=>{"server"!==n&&(c=o,o=t,t=r,r=e),s.__rpcPartialData[r]||(s.__rpcPartialData[r]=new Array(o)),s.__rpcPartialData[r][t]=c,s.__rpcPartialData[r].includes(void 0)||("server"===n?s["__rpc:process"](e,s.__rpcPartialData[r].join("")):s["__rpc:process"](s.__rpcPartialData[r].join("")),delete s.__rpcPartialData[r])}),!s["__rpc:process"]){if(s.__rpcListeners={},s.__rpcPending={},s.__rpcEvListeners={},s["__rpc:process"]=(r,t)=>{"server"!==n&&(t=r);const o=function parseData(r){const t=getEnvironment();return JSON.parse(r,((r,n)=>{if(("client"===t||"server"===t)&&n&&"object"==typeof n&&"string"==typeof n.__t&&"number"==typeof n.i&&2===Object.keys(n).length){const r=n.i;let s;switch(n.__t){case e.Blip:s=mp.blips;break;case e.Checkpoint:s=mp.checkpoints;break;case e.Colshape:s=mp.colshapes;break;case e.Label:s=mp.labels;break;case e.Marker:s=mp.markers;break;case e.Object:s=mp.objects;break;case e.Pickup:s=mp.pickups;break;case e.Player:s=mp.players;break;case e.Vehicle:s=mp.vehicles}if(s)return s["client"===t?"atRemoteId":"at"](r)}return n}))}(t);if(o.req){const e={id:o.id,environment:o.fenv||o.env};"server"===n&&(e.player=r);const t={ret:1,id:o.id,env:n};let c;switch(n){case"server":c=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===o.env)c=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===o.env){const r=o.b&&s.__rpcBrowsers[o.b];e.browser=r,c=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:c=e=>mp.trigger("__rpc:process",stringifyData(e))}if(c){const r=callProcedure(o.name,o.args,e);o.noRet||r.then((e=>c({...t,res:e}))).catch((e=>c({...t,err:e||null})))}}else if(o.ret){const e=s.__rpcPending[o.id];if("server"===n&&e.player!==r)return;e&&(e.resolve(o.hasOwnProperty("err")?Promise.reject(o.err):Promise.resolve(o.res)),delete s.__rpcPending[o.id])}},"cef"===n)void 0===s["__rpc:id"]&&(s["__rpc:id"]=new Promise((e=>{window.name?e(window.name):s["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",s["__rpc:process"]),mp.events.add("__rpc:processPartial",s["__rpc:processPartial"]),"client"===n){register("__rpc:callServer",(([e,r,t],n)=>_callServer(e,r,{fenv:n.environment,noRet:t}))),register("__rpc:callBrowsers",(([e,r,t],n)=>_callBrowsers(null,e,r,{fenv:n.environment,noRet:t}))),s.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(s.__rpcBrowsers).forEach((r=>{const t=s.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete s.__rpcBrowsers[r]})),s.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['__rpc:id'] === 'undefined'){\n window['__rpc:id'] = Promise.resolve(window.name);\n }else{\n window['__rpc:id:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),s.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]===r&&delete s.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],n)=>{Object.keys(s.__rpcBrowsers).forEach((o=>{const c=s.__rpcBrowsers[o];c&&isBrowserValid(c)?_callBrowser(c,t,[e,r],{fenv:n.environment,noRet:1}):delete s.__rpcBrowsers[o]}))}))}register(t,(([e,r],t)=>callEvent(e,r,t)))}function passEventToBrowser(e,r,t){const n=stringifyData(r);e.execute(`var process = window["__rpc:process"]; if(process){ process(${JSON.stringify(n)}); }else{ ${t?"":`mp.trigger("__rpc:process", '{"ret":1,"id":"${r.id}","err":"PROCEDURE_NOT_FOUND","env":"cef"}');`} }`)}function callProcedure(e,r,t){const n=s.__rpcListeners[e];return n?Promise.resolve(n(r,t)):Promise.reject(`PROCEDURE_NOT_FOUND (${e})`)}function sendEventData(e,r){const t={client:(e,...r)=>mp.events.callRemote(e,...r),server:(e,...t)=>r.call(e,[...t])},n=e.env,s=stringifyData(e);if(s.length>32e3){const r=function chunkSubstr(e,r){const t=Math.ceil(e.length/r),n=new Array(t);let s=0;for(let o=0;o{t[n]("__rpc:processPartial",e.id,o,r.length,s)}))}else t[n]("__rpc:process",s)}function register(e,r){if(2!==arguments.length)throw new Error(`register expects 2 arguments: "name" and "cb" ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),s.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if(1!==arguments.length)throw new Error(`unregister expects 1 argument: "name" ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),s.__rpcListeners[e]=void 0}function call(e,r,t={}){return arguments.length<1||arguments.length>3?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:n}),t.timeout)}function _callServer(e,r,t={}){switch(n){case"server":return call(e,r);case"client":{const o=generateId();return new Promise((c=>{t.noRet||(s.__rpcPending[o]={resolve:c});sendEventData({req:1,id:o,name:e,env:n,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,o={}){switch(n){case"client":return call(r,t);case"server":{const c=generateId();return new Promise((i=>{o.noRet||(s.__rpcPending[c]={resolve:i,player:e});sendEventData({req:1,id:c,name:r,env:n,args:t,...o},e)}))}case"cef":{const e=generateId();return s["__rpc:id"].then((c=>new Promise((i=>{o.noRet||(s.__rpcPending[e]={resolve:i});const a={b:c,req:1,id:e,name:r,env:n,args:t,...o};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,t,s={}){switch(n){case"client":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>4||"object"!=typeof e)return Promise.reject(`callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);break;case"cef":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`)}const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callClient(e,r,t,o),s.timeout)}function _callBrowser(e,r,t,o={}){return new Promise((c=>{const i=generateId();o.noRet||(s.__rpcPending[i]={resolve:c}),passEventToBrowser(e,{req:1,id:i,name:r,env:n,args:t,...o},!1)}))}function _callBrowsers(e,r,t,o={}){switch(n){case"client":{const e=s.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const n=s.__rpcBrowsers[e];return n&&isBrowserValid(n)?_callBrowser(n,r,t,o):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o)}}function callEvent(e,r,t){const n=s.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function off(e,r){if(2!==arguments.length)throw new Error(`off expects 2 arguments: "name" and "cb" ("${e}")`);const t=s.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}exports.call=call,exports.callBrowser=function callBrowser(e,r,t,s={}){if("client"!==n)return Promise.reject(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${r}")`);const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callBrowser(e,r,t,o),s.timeout)},exports.callBrowsers=function callBrowsers(e,r,t,s={}){let o;const c={};switch(n){case"client":case"cef":if(s=t||{},t=r,r=e,arguments.length<1||arguments.length>3)return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(null,r,t,c);break;case"server":if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(e,r,t,c)}if(o)return promiseTimeout(o,s.timeout)},exports.callClient=callClient,exports.callServer=function callServer(e,r,t={}){if(arguments.length<1||arguments.length>3)return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`);const n={};return t.noRet&&(n.noRet=1),promiseTimeout(_callServer(e,r,n),t.timeout)},exports.off=off,exports.on=function on(e,r){if(2!==arguments.length)throw new Error(`on expects 2 arguments: "name" and "cb" ("${e}")`);log(`Registered procedure listener "${e}"`);const t=s.__rpcEvListeners[e]||new Set;return t.add(r),s.__rpcEvListeners[e]=t,()=>off(e,r)},exports.register=register,exports.setDebugMode=function setDebugMode(e){r=e},exports.trigger=function trigger(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);callEvent(e,r,{environment:n})},exports.triggerBrowser=function triggerBrowser(e,r,s){if("client"!==n)throw new Error(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${r}")`);_callBrowser(e,t,[r,s],{noRet:1})},exports.triggerBrowsers=function triggerBrowsers(e,r,t){switch(n){case"client":case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,t],{noRet:1})},exports.triggerClient=function triggerClient(e,r,s){switch(n){case"client":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3||"object"!=typeof e)throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`);break;case"cef":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`)}_callClient(e,t,[r,s],{noRet:1})},exports.triggerServer=function triggerServer(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);_callServer(t,[e,r],{noRet:1})},exports.unregister=unregister,exports.version="0.2.1"; +"use strict";var e;Object.defineProperty(exports,"__esModule",{value:!0}),function(e){e.Blip="b",e.Checkpoint="cp",e.Colshape="c",e.Label="l",e.Marker="m",e.Object="o",e.Pickup="p",e.Player="pl",e.Vehicle="v"}(e||(e={}));let r=!1;function getEnvironment(){if(mp.joaat)return"server";if(mp.game&&mp.game.joaat)return"client";if(mp.trigger)return"cef";throw new Error("Unknown RAGE environment")}function log(e,t="info"){if(!r)return;const n=getEnvironment(),s=mp.console;(s?mp.console:console)[s?{info:"logInfo",error:"logError",warn:"logWarn"}[t]:"info"===t?"log":t](`RPC (${n}): ${e}`)}function isObjectMpType(r,t){const n="client"===getEnvironment();if(r&&"object"==typeof r&&void 0!==r.id){const validate=(e,t,s)=>n?r.type===e&&t.at(r.id)===r:r instanceof s;switch(t){case e.Blip:return validate("blip",mp.blips,mp.Blip);case e.Checkpoint:return validate("checkpoint",mp.checkpoints,mp.Checkpoint);case e.Colshape:return validate("colshape",mp.colshapes,mp.Colshape);case e.Label:return validate("textlabel",mp.labels,mp.TextLabel);case e.Marker:return validate("marker",mp.markers,mp.Marker);case e.Object:return validate("object",mp.objects,mp.Object);case e.Pickup:return validate("pickup",mp.pickups,mp.Pickup);case e.Player:return validate("player",mp.players,mp.Player);case e.Vehicle:return validate("vehicle",mp.vehicles,mp.Vehicle)}}return!1}function generateId(){const e=46656*Math.random()|0,r=46656*Math.random()|0;return`000${e.toString(36)}`.slice(-3)+`000${r.toString(36)}`.slice(-3)}function stringifyData(r){const t=getEnvironment();return JSON.stringify(r,((r,n)=>{if("client"===t||"server"===t&&n&&"object"==typeof n){let r;if(isObjectMpType(n,e.Blip)?r=e.Blip:isObjectMpType(n,e.Checkpoint)?r=e.Checkpoint:isObjectMpType(n,e.Colshape)?r=e.Colshape:isObjectMpType(n,e.Marker)?r=e.Marker:isObjectMpType(n,e.Object)?r=e.Object:isObjectMpType(n,e.Pickup)?r=e.Pickup:isObjectMpType(n,e.Player)?r=e.Player:isObjectMpType(n,e.Vehicle)&&(r=e.Vehicle),r)return{__t:r,i:"number"==typeof n.remoteId?n.remoteId:n.id}}return n}))}function promiseTimeout(e,r){return"number"==typeof r?Promise.race([new Promise(((e,t)=>{setTimeout((()=>t("TIMEOUT")),r)})),e]):e}function isBrowserValid(e){try{e.url}catch(e){return!1}return!0}const t="__rpc:triggerEvent",n=getEnvironment(),s="cef"===n?window:global;if(s["__rpc:processPartial"]||(s.__rpcPartialData={},s["__rpc:processPartial"]=(e,r,t,o,c)=>{"server"!==n&&(c=o,o=t,t=r,r=e),s.__rpcPartialData[r]||(s.__rpcPartialData[r]=new Array(o)),s.__rpcPartialData[r][t]=c,s.__rpcPartialData[r].includes(void 0)||("server"===n?s["__rpc:process"](e,s.__rpcPartialData[r].join("")):s["__rpc:process"](s.__rpcPartialData[r].join("")),delete s.__rpcPartialData[r])}),!s["__rpc:process"]){if(s.__rpcListeners={},s.__rpcPending={},s.__rpcEvListeners={},s["__rpc:process"]=(r,t)=>{"server"!==n&&(t=r);const o=function parseData(r){const t=getEnvironment();return JSON.parse(r,((r,n)=>{if(("client"===t||"server"===t)&&n&&"object"==typeof n&&"string"==typeof n.__t&&"number"==typeof n.i&&2===Object.keys(n).length){const r=n.i;let s;switch(n.__t){case e.Blip:s=mp.blips;break;case e.Checkpoint:s=mp.checkpoints;break;case e.Colshape:s=mp.colshapes;break;case e.Label:s=mp.labels;break;case e.Marker:s=mp.markers;break;case e.Object:s=mp.objects;break;case e.Pickup:s=mp.pickups;break;case e.Player:s=mp.players;break;case e.Vehicle:s=mp.vehicles}if(s)return s["client"===t?"atRemoteId":"at"](r)}return n}))}(t);if(o.req){const e={id:o.id,environment:o.fenv||o.env};"server"===n&&(e.player=r);const t={ret:1,id:o.id,env:n};let c;switch(n){case"server":c=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===o.env)c=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===o.env){const r=o.b&&s.__rpcBrowsers[o.b];e.browser=r,c=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:c=e=>mp.trigger("__rpc:process",stringifyData(e))}if(c){const r=callProcedure(o.name,o.args,e);o.noRet||r.then((e=>c({...t,res:e}))).catch((e=>c({...t,err:e||null})))}}else if(o.ret){const e=s.__rpcPending[o.id];if("server"===n&&e.player!==r)return;e&&(e.resolve(o.hasOwnProperty("err")?Promise.reject(o.err):Promise.resolve(o.res)),delete s.__rpcPending[o.id])}},"cef"===n)void 0===s["__rpc:id"]&&(s["__rpc:id"]=new Promise((e=>{window.name?e(window.name):s["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",s["__rpc:process"]),mp.events.add("__rpc:processPartial",s["__rpc:processPartial"]),"client"===n){register("__rpc:callServer",(([e,r,t],n)=>_callServer(e,r,{fenv:n.environment,noRet:t}))),register("__rpc:callBrowsers",(([e,r,t],n)=>_callBrowsers(null,e,r,{fenv:n.environment,noRet:t}))),s.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(s.__rpcBrowsers).forEach((r=>{const t=s.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete s.__rpcBrowsers[r]})),s.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['__rpc:id'] === 'undefined'){\n window['__rpc:id'] = Promise.resolve(window.name);\n }else{\n window['__rpc:id:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),s.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);s.__rpcBrowserProcedures[t]===r&&delete s.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],n)=>{Object.keys(s.__rpcBrowsers).forEach((o=>{const c=s.__rpcBrowsers[o];c&&isBrowserValid(c)?_callBrowser(c,t,[e,r],{fenv:n.environment,noRet:1}):delete s.__rpcBrowsers[o]}))}))}register(t,(([e,r],t)=>callEvent(e,r,t)))}function passEventToBrowser(e,r,t){const n=stringifyData(r);e.execute(`var process = window["__rpc:process"]; if(process){ process(${JSON.stringify(n)}); }else{ ${t?"":`mp.trigger("__rpc:process", '{"ret":1,"id":"${r.id}","err":"PROCEDURE_NOT_FOUND","env":"cef"}');`} }`)}function callProcedure(e,r,t){const n=s.__rpcListeners[e];return n?Promise.resolve(n(r,t)):Promise.reject(`PROCEDURE_NOT_FOUND (${e})`)}function sendEventData(e,r){const t={client:(e,...r)=>mp.events.callRemote(e,...r),server:(e,...t)=>r.call(e,[...t])},n=e.env,s=stringifyData(e);if(s.length>32e3){const r=function chunkSubstr(e,r){const t=Math.ceil(e.length/r),n=new Array(t);let s=0;for(let o=0;o{t[n]("__rpc:processPartial",e.id,o,r.length,s)}))}else t[n]("__rpc:process",s)}function register(e,r){if(2!==arguments.length)throw new Error(`register expects 2 arguments: "name" and "cb" ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),s.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if(1!==arguments.length)throw new Error(`unregister expects 1 argument: "name" ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===n&&s["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),s.__rpcListeners[e]=void 0}function call(e,r,t={}){return arguments.length<1||arguments.length>3?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:n}),t.timeout)}function _callServer(e,r,t={}){switch(n){case"server":return call(e,r);case"client":{const o=generateId();return new Promise((c=>{t.noRet||(s.__rpcPending[o]={resolve:c});sendEventData({req:1,id:o,name:e,env:n,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,o={}){switch(n){case"client":return call(r,t);case"server":{const c=generateId();return new Promise((i=>{o.noRet||(s.__rpcPending[c]={resolve:i,player:e});sendEventData({req:1,id:c,name:r,env:n,args:t,...o},e)}))}case"cef":{const e=generateId();return s["__rpc:id"].then((c=>new Promise((i=>{o.noRet||(s.__rpcPending[e]={resolve:i});const a={b:c,req:1,id:e,name:r,env:n,args:t,...o};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,t,s={}){switch(n){case"client":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>4||"object"!=typeof e)return Promise.reject(`callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);break;case"cef":if(s=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`)}const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callClient(e,r,t,o),s.timeout)}function _callBrowser(e,r,t,o={}){return new Promise((c=>{const i=generateId();o.noRet||(s.__rpcPending[i]={resolve:c}),passEventToBrowser(e,{req:1,id:i,name:r,env:n,args:t,...o},!1)}))}function _callBrowsers(e,r,t,o={}){switch(n){case"client":{const e=s.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const n=s.__rpcBrowsers[e];return n&&isBrowserValid(n)?_callBrowser(n,r,t,o):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o)}}function callEvent(e,r,t){const n=s.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function off(e,r){if(2!==arguments.length)throw new Error(`off expects 2 arguments: "name" and "cb" ("${e}")`);const t=s.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}exports.call=call,exports.callBrowser=function callBrowser(e,r,t,s={}){if("client"!==n)return Promise.reject(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${r}")`);const o={};return s.noRet&&(o.noRet=1),promiseTimeout(_callBrowser(e,r,t,o),s.timeout)},exports.callBrowsers=function callBrowsers(e,r,t,s={}){let o;const c={};switch(n){case"client":case"cef":if(s=t||{},t=r,r=e,arguments.length<1||arguments.length>3)return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(null,r,t,c);break;case"server":if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);s.noRet&&(c.noRet=1),o=_callBrowsers(e,r,t,c)}if(o)return promiseTimeout(o,s.timeout)},exports.callClient=callClient,exports.callServer=function callServer(e,r,t={}){if(arguments.length<1||arguments.length>3)return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`);const n={};return t.noRet&&(n.noRet=1),promiseTimeout(_callServer(e,r,n),t.timeout)},exports.off=off,exports.on=function on(e,r){if(2!==arguments.length)throw new Error(`on expects 2 arguments: "name" and "cb" ("${e}")`);log(`Registered procedure listener "${e}"`);const t=s.__rpcEvListeners[e]||new Set;return t.add(r),s.__rpcEvListeners[e]=t,()=>off(e,r)},exports.register=register,exports.setDebugMode=function setDebugMode(e){r=e},exports.trigger=function trigger(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);callEvent(e,r,{environment:n})},exports.triggerBrowser=function triggerBrowser(e,r,s){if("client"!==n)throw new Error(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${r}")`);_callBrowser(e,t,[r,s],{noRet:1})},exports.triggerBrowsers=function triggerBrowsers(e,r,t){switch(n){case"client":case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,t],{noRet:1})},exports.triggerClient=function triggerClient(e,r,s){switch(n){case"client":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3||"object"!=typeof e)throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`);break;case"cef":if(s=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`)}_callClient(e,t,[r,s],{noRet:1})},exports.triggerServer=function triggerServer(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);_callServer(t,[e,r],{noRet:1})},exports.unregister=unregister,exports.version="0.2.2"; diff --git a/dist/rage-rpc.umd.js b/dist/rage-rpc.umd.js index 8aea218..ae382bc 100644 --- a/dist/rage-rpc.umd.js +++ b/dist/rage-rpc.umd.js @@ -1 +1 @@ -!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).rpc={})}(this,(function(e){"use strict";var r;!function(e){e.Blip="b",e.Checkpoint="cp",e.Colshape="c",e.Label="l",e.Marker="m",e.Object="o",e.Pickup="p",e.Player="pl",e.Vehicle="v"}(r||(r={}));let t=!1;function getEnvironment(){if(mp.joaat)return"server";if(mp.game&&mp.game.joaat)return"client";if(mp.trigger)return"cef";throw new Error("Unknown RAGE environment")}function log(e,r="info"){if(!t)return;const n=getEnvironment(),o=mp.console;(o?mp.console:console)[o?{info:"logInfo",error:"logError",warn:"logWarn"}[r]:"info"===r?"log":r](`RPC (${n}): ${e}`)}function isObjectMpType(e,t){const n="client"===getEnvironment();if(e&&"object"==typeof e&&void 0!==e.id){const validate=(r,t,o)=>n?e.type===r&&t.at(e.id)===e:e instanceof o;switch(t){case r.Blip:return validate("blip",mp.blips,mp.Blip);case r.Checkpoint:return validate("checkpoint",mp.checkpoints,mp.Checkpoint);case r.Colshape:return validate("colshape",mp.colshapes,mp.Colshape);case r.Label:return validate("textlabel",mp.labels,mp.TextLabel);case r.Marker:return validate("marker",mp.markers,mp.Marker);case r.Object:return validate("object",mp.objects,mp.Object);case r.Pickup:return validate("pickup",mp.pickups,mp.Pickup);case r.Player:return validate("player",mp.players,mp.Player);case r.Vehicle:return validate("vehicle",mp.vehicles,mp.Vehicle)}}return!1}function generateId(){const e=46656*Math.random()|0,r=46656*Math.random()|0;return`000${e.toString(36)}`.slice(-3)+`000${r.toString(36)}`.slice(-3)}function stringifyData(e){const t=getEnvironment();return JSON.stringify(e,((e,n)=>{if("client"===t||"server"===t&&n&&"object"==typeof n){let e;if(isObjectMpType(n,r.Blip)?e=r.Blip:isObjectMpType(n,r.Checkpoint)?e=r.Checkpoint:isObjectMpType(n,r.Colshape)?e=r.Colshape:isObjectMpType(n,r.Marker)?e=r.Marker:isObjectMpType(n,r.Object)?e=r.Object:isObjectMpType(n,r.Pickup)?e=r.Pickup:isObjectMpType(n,r.Player)?e=r.Player:isObjectMpType(n,r.Vehicle)&&(e=r.Vehicle),e)return{__t:e,i:"number"==typeof n.remoteId?n.remoteId:n.id}}return n}))}function promiseTimeout(e,r){return"number"==typeof r?Promise.race([new Promise(((e,t)=>{setTimeout((()=>t("TIMEOUT")),r)})),e]):e}function isBrowserValid(e){try{e.url}catch(e){return!1}return!0}const n="PROCEDURE_NOT_FOUND",o="__rpc:id",s="__rpc:process",i="__rpc:processPartial",c="__rpc:browserRegister",a="__rpc:browserUnregister",l="__rpc:triggerEvent",p="__rpc:triggerEventBrowsers",g=getEnvironment(),m="cef"===g?window:global;if(m[i]||(m.__rpcPartialData={},m[i]=(e,r,t,n,o)=>{"server"!==g&&(o=n,n=t,t=r,r=e),m.__rpcPartialData[r]||(m.__rpcPartialData[r]=new Array(n)),m.__rpcPartialData[r][t]=o,m.__rpcPartialData[r].includes(void 0)||("server"===g?m[s](e,m.__rpcPartialData[r].join("")):m[s](m.__rpcPartialData[r].join("")),delete m.__rpcPartialData[r])}),!m[s]){if(m.__rpcListeners={},m.__rpcPending={},m.__rpcEvListeners={},m[s]=(e,t)=>{"server"!==g&&(t=e);const n=function parseData(e){const t=getEnvironment();return JSON.parse(e,((e,n)=>{if(("client"===t||"server"===t)&&n&&"object"==typeof n&&"string"==typeof n.__t&&"number"==typeof n.i&&2===Object.keys(n).length){const e=n.i;let o;switch(n.__t){case r.Blip:o=mp.blips;break;case r.Checkpoint:o=mp.checkpoints;break;case r.Colshape:o=mp.colshapes;break;case r.Label:o=mp.labels;break;case r.Marker:o=mp.markers;break;case r.Object:o=mp.objects;break;case r.Pickup:o=mp.pickups;break;case r.Player:o=mp.players;break;case r.Vehicle:o=mp.vehicles}if(o)return o["client"===t?"atRemoteId":"at"](e)}return n}))}(t);if(n.req){const r={id:n.id,environment:n.fenv||n.env};"server"===g&&(r.player=e);const t={ret:1,id:n.id,env:g};let o;switch(g){case"server":o=e=>r.player.call(s,[stringifyData(e)]);break;case"client":if("server"===n.env)o=e=>mp.events.callRemote(s,stringifyData(e));else if("cef"===n.env){const e=n.b&&m.__rpcBrowsers[n.b];r.browser=e,o=r=>e&&isBrowserValid(e)&&passEventToBrowser(e,r,!0)}break;default:o=e=>mp.trigger(s,stringifyData(e))}if(o){const e=callProcedure(n.name,n.args,r);n.noRet||e.then((e=>o({...t,res:e}))).catch((e=>o({...t,err:e||null})))}}else if(n.ret){const r=m.__rpcPending[n.id];if("server"===g&&r.player!==e)return;r&&(r.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete m.__rpcPending[n.id])}},"cef"===g)void 0===m[o]&&(m[o]=new Promise((e=>{window.name?e(window.name):m["__rpc:id:resolve"]=e})));else if(mp.events.add(s,m[s]),mp.events.add(i,m[i]),"client"===g){register("__rpc:callServer",(([e,r,t],n)=>_callServer(e,r,{fenv:n.environment,noRet:t}))),register("__rpc:callBrowsers",(([e,r,t],n)=>_callBrowsers(null,e,r,{fenv:n.environment,noRet:t}))),m.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(m.__rpcBrowsers).forEach((r=>{const t=m.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete m.__rpcBrowsers[r]})),m.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['__rpc:id'] === 'undefined'){\n window['__rpc:id'] = Promise.resolve(window.name);\n }else{\n window['__rpc:id:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),m.__rpcBrowserProcedures={},mp.events.add(c,(e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]=r})),mp.events.add(a,(e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]===r&&delete m.__rpcBrowserProcedures[t]})),register(p,(([e,r],t)=>{Object.keys(m.__rpcBrowsers).forEach((n=>{const o=m.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,l,[e,r],{fenv:t.environment,noRet:1}):delete m.__rpcBrowsers[n]}))}))}register(l,(([e,r],t)=>callEvent(e,r,t)))}function passEventToBrowser(e,r,t){const o=stringifyData(r);e.execute(`var process = window["__rpc:process"]; if(process){ process(${JSON.stringify(o)}); }else{ ${t?"":`mp.trigger("__rpc:process", '{"ret":1,"id":"${r.id}","err":"${n}","env":"cef"}');`} }`)}function callProcedure(e,r,t){const o=m.__rpcListeners[e];return o?Promise.resolve(o(r,t)):Promise.reject(`${n} (${e})`)}function sendEventData(e,r){const t={client:(e,...r)=>mp.events.callRemote(e,...r),server:(e,...t)=>r.call(e,[...t])},n=e.env,o=stringifyData(e);if(o.length>32e3){const r=function chunkSubstr(e,r){const t=Math.ceil(e.length/r),n=new Array(t);let o=0;for(let s=0;s{t[n](i,e.id,s,r.length,o)}))}else t[n](s,o)}function register(e,r){if(2!==arguments.length)throw new Error(`register expects 2 arguments: "name" and "cb" ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===g&&m[o].then((r=>mp.trigger(c,JSON.stringify([r,e])))),m.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if(1!==arguments.length)throw new Error(`unregister expects 1 argument: "name" ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===g&&m[o].then((r=>mp.trigger(a,JSON.stringify([r,e])))),m.__rpcListeners[e]=void 0}function call(e,r,t={}){return arguments.length<1||arguments.length>3?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:g}),t.timeout)}function _callServer(e,r,t={}){switch(g){case"server":return call(e,r);case"client":{const n=generateId();return new Promise((o=>{t.noRet||(m.__rpcPending[n]={resolve:o});sendEventData({req:1,id:n,name:e,env:g,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,n={}){switch(g){case"client":return call(r,t);case"server":{const o=generateId();return new Promise((s=>{n.noRet||(m.__rpcPending[o]={resolve:s,player:e});sendEventData({req:1,id:o,name:r,env:g,args:t,...n},e)}))}case"cef":{const e=generateId();return m[o].then((o=>new Promise((i=>{n.noRet||(m.__rpcPending[e]={resolve:i});const c={b:o,req:1,id:e,name:r,env:g,args:t,...n};mp.trigger(s,stringifyData(c))}))))}}}function callClient(e,r,t,n={}){switch(g){case"client":if(n=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>4||"object"!=typeof e)return Promise.reject(`callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);break;case"cef":if(n=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`)}const o={};return n.noRet&&(o.noRet=1),promiseTimeout(_callClient(e,r,t,o),n.timeout)}function _callBrowser(e,r,t,n={}){return new Promise((o=>{const s=generateId();n.noRet||(m.__rpcPending[s]={resolve:o}),passEventToBrowser(e,{req:1,id:s,name:r,env:g,args:t,...n},!1)}))}function _callBrowsers(e,r,t,o={}){switch(g){case"client":{const e=m.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${n} (${r})`);const s=m.__rpcBrowsers[e];return s&&isBrowserValid(s)?_callBrowser(s,r,t,o):Promise.reject(`${n} (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o)}}function callEvent(e,r,t){const n=m.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function off(e,r){if(2!==arguments.length)throw new Error(`off expects 2 arguments: "name" and "cb" ("${e}")`);const t=m.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}e.call=call,e.callBrowser=function callBrowser(e,r,t,n={}){if("client"!==g)return Promise.reject(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${r}")`);const o={};return n.noRet&&(o.noRet=1),promiseTimeout(_callBrowser(e,r,t,o),n.timeout)},e.callBrowsers=function callBrowsers(e,r,t,n={}){let o;const s={};switch(g){case"client":case"cef":if(n=t||{},t=r,r=e,arguments.length<1||arguments.length>3)return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);n.noRet&&(s.noRet=1),o=_callBrowsers(null,r,t,s);break;case"server":if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);n.noRet&&(s.noRet=1),o=_callBrowsers(e,r,t,s)}if(o)return promiseTimeout(o,n.timeout)},e.callClient=callClient,e.callServer=function callServer(e,r,t={}){if(arguments.length<1||arguments.length>3)return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`);const n={};return t.noRet&&(n.noRet=1),promiseTimeout(_callServer(e,r,n),t.timeout)},e.off=off,e.on=function on(e,r){if(2!==arguments.length)throw new Error(`on expects 2 arguments: "name" and "cb" ("${e}")`);log(`Registered procedure listener "${e}"`);const t=m.__rpcEvListeners[e]||new Set;return t.add(r),m.__rpcEvListeners[e]=t,()=>off(e,r)},e.register=register,e.setDebugMode=function setDebugMode(e){t=e},e.trigger=function trigger(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);callEvent(e,r,{environment:g})},e.triggerBrowser=function triggerBrowser(e,r,t){if("client"!==g)throw new Error(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${r}")`);_callBrowser(e,l,[r,t],{noRet:1})},e.triggerBrowsers=function triggerBrowsers(e,r,t){switch(g){case"client":case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`)}_callClient(e,p,[r,t],{noRet:1})},e.triggerClient=function triggerClient(e,r,t){switch(g){case"client":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3||"object"!=typeof e)throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`);break;case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`)}_callClient(e,l,[r,t],{noRet:1})},e.triggerServer=function triggerServer(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);_callServer(l,[e,r],{noRet:1})},e.unregister=unregister,e.version="0.2.1",Object.defineProperty(e,"__esModule",{value:!0})})); +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((e="undefined"!=typeof globalThis?globalThis:e||self).rpc={})}(this,(function(e){"use strict";var r;!function(e){e.Blip="b",e.Checkpoint="cp",e.Colshape="c",e.Label="l",e.Marker="m",e.Object="o",e.Pickup="p",e.Player="pl",e.Vehicle="v"}(r||(r={}));let t=!1;function getEnvironment(){if(mp.joaat)return"server";if(mp.game&&mp.game.joaat)return"client";if(mp.trigger)return"cef";throw new Error("Unknown RAGE environment")}function log(e,r="info"){if(!t)return;const n=getEnvironment(),o=mp.console;(o?mp.console:console)[o?{info:"logInfo",error:"logError",warn:"logWarn"}[r]:"info"===r?"log":r](`RPC (${n}): ${e}`)}function isObjectMpType(e,t){const n="client"===getEnvironment();if(e&&"object"==typeof e&&void 0!==e.id){const validate=(r,t,o)=>n?e.type===r&&t.at(e.id)===e:e instanceof o;switch(t){case r.Blip:return validate("blip",mp.blips,mp.Blip);case r.Checkpoint:return validate("checkpoint",mp.checkpoints,mp.Checkpoint);case r.Colshape:return validate("colshape",mp.colshapes,mp.Colshape);case r.Label:return validate("textlabel",mp.labels,mp.TextLabel);case r.Marker:return validate("marker",mp.markers,mp.Marker);case r.Object:return validate("object",mp.objects,mp.Object);case r.Pickup:return validate("pickup",mp.pickups,mp.Pickup);case r.Player:return validate("player",mp.players,mp.Player);case r.Vehicle:return validate("vehicle",mp.vehicles,mp.Vehicle)}}return!1}function generateId(){const e=46656*Math.random()|0,r=46656*Math.random()|0;return`000${e.toString(36)}`.slice(-3)+`000${r.toString(36)}`.slice(-3)}function stringifyData(e){const t=getEnvironment();return JSON.stringify(e,((e,n)=>{if("client"===t||"server"===t&&n&&"object"==typeof n){let e;if(isObjectMpType(n,r.Blip)?e=r.Blip:isObjectMpType(n,r.Checkpoint)?e=r.Checkpoint:isObjectMpType(n,r.Colshape)?e=r.Colshape:isObjectMpType(n,r.Marker)?e=r.Marker:isObjectMpType(n,r.Object)?e=r.Object:isObjectMpType(n,r.Pickup)?e=r.Pickup:isObjectMpType(n,r.Player)?e=r.Player:isObjectMpType(n,r.Vehicle)&&(e=r.Vehicle),e)return{__t:e,i:"number"==typeof n.remoteId?n.remoteId:n.id}}return n}))}function promiseTimeout(e,r){return"number"==typeof r?Promise.race([new Promise(((e,t)=>{setTimeout((()=>t("TIMEOUT")),r)})),e]):e}function isBrowserValid(e){try{e.url}catch(e){return!1}return!0}const n="PROCEDURE_NOT_FOUND",o="__rpc:id",s="__rpc:process",i="__rpc:processPartial",c="__rpc:browserRegister",a="__rpc:browserUnregister",l="__rpc:triggerEvent",p="__rpc:triggerEventBrowsers",g=getEnvironment(),m="cef"===g?window:global;if(m[i]||(m.__rpcPartialData={},m[i]=(e,r,t,n,o)=>{"server"!==g&&(o=n,n=t,t=r,r=e),m.__rpcPartialData[r]||(m.__rpcPartialData[r]=new Array(n)),m.__rpcPartialData[r][t]=o,m.__rpcPartialData[r].includes(void 0)||("server"===g?m[s](e,m.__rpcPartialData[r].join("")):m[s](m.__rpcPartialData[r].join("")),delete m.__rpcPartialData[r])}),!m[s]){if(m.__rpcListeners={},m.__rpcPending={},m.__rpcEvListeners={},m[s]=(e,t)=>{"server"!==g&&(t=e);const n=function parseData(e){const t=getEnvironment();return JSON.parse(e,((e,n)=>{if(("client"===t||"server"===t)&&n&&"object"==typeof n&&"string"==typeof n.__t&&"number"==typeof n.i&&2===Object.keys(n).length){const e=n.i;let o;switch(n.__t){case r.Blip:o=mp.blips;break;case r.Checkpoint:o=mp.checkpoints;break;case r.Colshape:o=mp.colshapes;break;case r.Label:o=mp.labels;break;case r.Marker:o=mp.markers;break;case r.Object:o=mp.objects;break;case r.Pickup:o=mp.pickups;break;case r.Player:o=mp.players;break;case r.Vehicle:o=mp.vehicles}if(o)return o["client"===t?"atRemoteId":"at"](e)}return n}))}(t);if(n.req){const r={id:n.id,environment:n.fenv||n.env};"server"===g&&(r.player=e);const t={ret:1,id:n.id,env:g};let o;switch(g){case"server":o=e=>r.player.call(s,[stringifyData(e)]);break;case"client":if("server"===n.env)o=e=>mp.events.callRemote(s,stringifyData(e));else if("cef"===n.env){const e=n.b&&m.__rpcBrowsers[n.b];r.browser=e,o=r=>e&&isBrowserValid(e)&&passEventToBrowser(e,r,!0)}break;default:o=e=>mp.trigger(s,stringifyData(e))}if(o){const e=callProcedure(n.name,n.args,r);n.noRet||e.then((e=>o({...t,res:e}))).catch((e=>o({...t,err:e||null})))}}else if(n.ret){const r=m.__rpcPending[n.id];if("server"===g&&r.player!==e)return;r&&(r.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete m.__rpcPending[n.id])}},"cef"===g)void 0===m[o]&&(m[o]=new Promise((e=>{window.name?e(window.name):m["__rpc:id:resolve"]=e})));else if(mp.events.add(s,m[s]),mp.events.add(i,m[i]),"client"===g){register("__rpc:callServer",(([e,r,t],n)=>_callServer(e,r,{fenv:n.environment,noRet:t}))),register("__rpc:callBrowsers",(([e,r,t],n)=>_callBrowsers(null,e,r,{fenv:n.environment,noRet:t}))),m.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(m.__rpcBrowsers).forEach((r=>{const t=m.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete m.__rpcBrowsers[r]})),m.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['__rpc:id'] === 'undefined'){\n window['__rpc:id'] = Promise.resolve(window.name);\n }else{\n window['__rpc:id:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),m.__rpcBrowserProcedures={},mp.events.add(c,(e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]=r})),mp.events.add(a,(e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]===r&&delete m.__rpcBrowserProcedures[t]})),register(p,(([e,r],t)=>{Object.keys(m.__rpcBrowsers).forEach((n=>{const o=m.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,l,[e,r],{fenv:t.environment,noRet:1}):delete m.__rpcBrowsers[n]}))}))}register(l,(([e,r],t)=>callEvent(e,r,t)))}function passEventToBrowser(e,r,t){const o=stringifyData(r);e.execute(`var process = window["__rpc:process"]; if(process){ process(${JSON.stringify(o)}); }else{ ${t?"":`mp.trigger("__rpc:process", '{"ret":1,"id":"${r.id}","err":"${n}","env":"cef"}');`} }`)}function callProcedure(e,r,t){const o=m.__rpcListeners[e];return o?Promise.resolve(o(r,t)):Promise.reject(`${n} (${e})`)}function sendEventData(e,r){const t={client:(e,...r)=>mp.events.callRemote(e,...r),server:(e,...t)=>r.call(e,[...t])},n=e.env,o=stringifyData(e);if(o.length>32e3){const r=function chunkSubstr(e,r){const t=Math.ceil(e.length/r),n=new Array(t);let o=0;for(let s=0;s{t[n](i,e.id,s,r.length,o)}))}else t[n](s,o)}function register(e,r){if(2!==arguments.length)throw new Error(`register expects 2 arguments: "name" and "cb" ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===g&&m[o].then((r=>mp.trigger(c,JSON.stringify([r,e])))),m.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if(1!==arguments.length)throw new Error(`unregister expects 1 argument: "name" ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===g&&m[o].then((r=>mp.trigger(a,JSON.stringify([r,e])))),m.__rpcListeners[e]=void 0}function call(e,r,t={}){return arguments.length<1||arguments.length>3?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:g}),t.timeout)}function _callServer(e,r,t={}){switch(g){case"server":return call(e,r);case"client":{const n=generateId();return new Promise((o=>{t.noRet||(m.__rpcPending[n]={resolve:o});sendEventData({req:1,id:n,name:e,env:g,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,n={}){switch(g){case"client":return call(r,t);case"server":{const o=generateId();return new Promise((s=>{n.noRet||(m.__rpcPending[o]={resolve:s,player:e});sendEventData({req:1,id:o,name:r,env:g,args:t,...n},e)}))}case"cef":{const e=generateId();return m[o].then((o=>new Promise((i=>{n.noRet||(m.__rpcPending[e]={resolve:i});const c={b:o,req:1,id:e,name:r,env:g,args:t,...n};mp.trigger(s,stringifyData(c))}))))}}}function callClient(e,r,t,n={}){switch(g){case"client":if(n=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the client expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>4||"object"!=typeof e)return Promise.reject(`callClient from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);break;case"cef":if(n=t||{},t=r,r=e,e=null,arguments.length<1||arguments.length>3||"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`)}const o={};return n.noRet&&(o.noRet=1),promiseTimeout(_callClient(e,r,t,o),n.timeout)}function _callBrowser(e,r,t,n={}){return new Promise((o=>{const s=generateId();n.noRet||(m.__rpcPending[s]={resolve:o}),passEventToBrowser(e,{req:1,id:s,name:r,env:g,args:t,...n},!1)}))}function _callBrowsers(e,r,t,o={}){switch(g){case"client":{const e=m.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${n} (${r})`);const s=m.__rpcBrowsers[e];return s&&isBrowserValid(s)?_callBrowser(s,r,t,o):Promise.reject(`${n} (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,t,Number(o.noRet)],o)}}function callEvent(e,r,t){const n=m.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function off(e,r){if(2!==arguments.length)throw new Error(`off expects 2 arguments: "name" and "cb" ("${e}")`);const t=m.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}e.call=call,e.callBrowser=function callBrowser(e,r,t,n={}){if("client"!==g)return Promise.reject(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" ("${r}")`);const o={};return n.noRet&&(o.noRet=1),promiseTimeout(_callBrowser(e,r,t,o),n.timeout)},e.callBrowsers=function callBrowsers(e,r,t,n={}){let o;const s={};switch(g){case"client":case"cef":if(n=t||{},t=r,r=e,arguments.length<1||arguments.length>3)return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${r}")`);n.noRet&&(s.noRet=1),o=_callBrowsers(null,r,t,s);break;case"server":if(arguments.length<2||arguments.length>4)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" ("${r}")`);n.noRet&&(s.noRet=1),o=_callBrowsers(e,r,t,s)}if(o)return promiseTimeout(o,n.timeout)},e.callClient=callClient,e.callServer=function callServer(e,r,t={}){if(arguments.length<1||arguments.length>3)return Promise.reject(`callServer expects 1 to 3 arguments: "name", optional "args", and optional "options" ("${e}")`);const n={};return t.noRet&&(n.noRet=1),promiseTimeout(_callServer(e,r,n),t.timeout)},e.off=off,e.on=function on(e,r){if(2!==arguments.length)throw new Error(`on expects 2 arguments: "name" and "cb" ("${e}")`);log(`Registered procedure listener "${e}"`);const t=m.__rpcEvListeners[e]||new Set;return t.add(r),m.__rpcEvListeners[e]=t,()=>off(e,r)},e.register=register,e.setDebugMode=function setDebugMode(e){t=e},e.trigger=function trigger(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);callEvent(e,r,{environment:g})},e.triggerBrowser=function triggerBrowser(e,r,t){if("client"!==g)throw new Error(`callBrowser can only be used in the client environment ("${r}")`);if(arguments.length<2||arguments.length>4)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" ("${r}")`);_callBrowser(e,l,[r,t],{noRet:1})},e.triggerBrowsers=function triggerBrowsers(e,r,t){switch(g){case"client":case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`)}_callClient(e,p,[r,t],{noRet:1})},e.triggerClient=function triggerClient(e,r,t){switch(g){case"client":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" ("${r}")`);break;case"server":if(arguments.length<2||arguments.length>3||"object"!=typeof e)throw new Error(`triggerClient from the server expects 2 or 3 arguments: "player", "name", and optional "args" ("${r}")`);break;case"cef":if(t=r,r=e,e=null,arguments.length<1||arguments.length>2||"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" ("${r}")`)}_callClient(e,l,[r,t],{noRet:1})},e.triggerServer=function triggerServer(e,r){if(arguments.length<1||arguments.length>2)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" ("${e}")`);_callServer(l,[e,r],{noRet:1})},e.unregister=unregister,e.version="0.2.2",Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/package.json b/package.json index 9c38971..d3a4ebc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rage-rpc", - "version": "0.2.1", + "version": "0.2.2", "description": "A universal, asynchronous RPC implementation for RAGE Multiplayer", "scripts": { "lint": "eslint src --ext mjs,js,ts,tsx --fix",