From 376eb92581a1a113b07d55ffae1373fade4e104f Mon Sep 17 00:00:00 2001 From: LeonardSSH Date: Sat, 25 Dec 2021 21:19:36 +0000 Subject: [PATCH] publish: output for 446ca1655d32210353ccc7749179b5034c0c9f4b --- README.md | 5 +++++ dist/rage-rpc.esm.mjs | 2 +- dist/rage-rpc.js | 2 +- dist/rage-rpc.umd.js | 2 +- package.json | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cf9e068..fc450b5 100644 --- a/README.md +++ b/README.md @@ -533,6 +533,11 @@ 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.5 + +- FIX: Use Player & Browser instead of Mp version +- FIX: ProcedureListenerInfo player & browser types + #### 0.2.4 - IMPROVE: Type-safe & Type Definitions diff --git a/dist/rage-rpc.esm.mjs b/dist/rage-rpc.esm.mjs index 72bc1dd..61a6ede 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(),o=mp.console;(o?mp.console:console)[o?{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,o)=>n?r.type===e&&t.at(r.id)===r:r instanceof o;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=getEnvironment(),n="cef"===t?window:global;if(n["__rpc:processPartial"]||(n.__rpcPartialData={},n["__rpc:processPartial"]=(e,r,o,s,c)=>{"server"!==t&&(c=s,s=o,o=r,r=e),n.__rpcPartialData[r]||(n.__rpcPartialData[r]=new Array(s)),n.__rpcPartialData[r][o]=c,n.__rpcPartialData[r].includes(void 0)||("server"===t?n["__rpc:process"](e,n.__rpcPartialData[r].join("")):n["__rpc:process"](n.__rpcPartialData[r].join("")),delete n.__rpcPartialData[r])}),!n["__rpc:process"]){if(n.__rpcListeners={},n.__rpcPending={},n.__rpcEvListeners={},n["__rpc:process"]=(r,o)=>{"server"!==t&&(o=r);const s=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 o;switch(n.__t){case e.Blip:o=mp.blips;break;case e.Checkpoint:o=mp.checkpoints;break;case e.Colshape:o=mp.colshapes;break;case e.Label:o=mp.labels;break;case e.Marker:o=mp.markers;break;case e.Object:o=mp.objects;break;case e.Pickup:o=mp.pickups;break;case e.Player:o=mp.players;break;case e.Vehicle:o=mp.vehicles}if(o)return o["client"===t?"atRemoteId":"at"](r)}return n}))}(o);if(s.req){const e={id:s.id,environment:s.fenv||s.env};"server"===t&&(e.player=r);const o={ret:1,id:s.id,env:t};let c;switch(t){case"server":c=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===s.env)c=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===s.env){const r=s.b&&n.__rpcBrowsers[s.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(s.name,s.args,e);s.noRet||r.then((e=>c({...o,res:e}))).catch((e=>c({...o,err:e||null})))}}else if(s.ret){const e=n.__rpcPending[s.id];if("server"===t&&e.player!==r)return;e&&(e.resolve(s.hasOwnProperty("err")?Promise.reject(s.err):Promise.resolve(s.res)),delete n.__rpcPending[s.id])}},"cef"===t)void 0===n["__rpc:id"]&&(n["__rpc:id"]=new Promise((e=>{window.name?e(window.name):n["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",n["__rpc:process"]),mp.events.add("__rpc:processPartial",n["__rpc:processPartial"]),"client"===t){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}))),n.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(n.__rpcBrowsers).forEach((r=>{const t=n.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete n.__rpcBrowsers[r]})),n.__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),n.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]===r&&delete n.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],t)=>{Object.keys(n.__rpcBrowsers).forEach((o=>{const s=n.__rpcBrowsers[o];s&&isBrowserValid(s)?_callBrowser(s,"__rpc:triggerEvent",[e,r],{fenv:t.environment,noRet:1}):delete n.__rpcBrowsers[o]}))}))}register("__rpc:triggerEvent",(([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 o=n.__rpcListeners[e];return o?Promise.resolve(o(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,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]("__rpc:processPartial",e.id,s,r.length,o)}))}else t[n]("__rpc:process",o)}function register(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`register expects 2 arguments: "name" and "cb" - ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),n.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if("string"!=typeof e)throw new Error(`unregister expects 1 argument: "name" - ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),n.__rpcListeners[e]=void 0}function call(e,r,n={}){return"string"!=typeof e?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:t}),n.timeout)}function _callServer(e,r,o={}){switch(t){case"server":return call(e,r);case"client":{const s=generateId();return new Promise((c=>{o.noRet||(n.__rpcPending[s]={resolve:c});sendEventData({req:1,id:s,name:e,env:t,args:r,...o})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(o.noRet)])}}function callServer(e,r,t={}){if("string"!=typeof e)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,o,s={}){switch(t){case"client":return call(r,o);case"server":{const c=generateId();return new Promise((i=>{s.noRet||(n.__rpcPending[c]={resolve:i,player:e});sendEventData({req:1,id:c,name:r,env:t,args:o,...s},e)}))}case"cef":{const e=generateId();return n["__rpc:id"].then((c=>new Promise((i=>{s.noRet||(n.__rpcPending[e]={resolve:i});const a={b:c,req:1,id:e,name:r,env:t,args:o,...s};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,n,o={}){switch(t){case"client":if(o=n||{},n=r,r=e,e=null,"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("string"!=typeof r||"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(o=n||{},n=r,r=e,e=null,"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${r}")`)}const s={};return o.noRet&&(s.noRet=1),promiseTimeout(_callClient(e,r,n,s),o.timeout)}function _callBrowser(e,r,o,s={}){return new Promise((c=>{const i=generateId();s.noRet||(n.__rpcPending[i]={resolve:c}),passEventToBrowser(e,{req:1,id:i,name:r,env:t,args:o,...s},!1)}))}function _callBrowsers(e,r,o,s={}){switch(t){case"client":{const e=n.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const t=n.__rpcBrowsers[e];return t&&isBrowserValid(t)?_callBrowser(t,r,o,s):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,o,Number(s.noRet)],s);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,o,Number(s.noRet)],s)}}function callBrowsers(e,r,n,o={}){let s;const c={};switch(t){case"client":case"cef":if(o=n||{},n=r,"string"!=typeof(r=e))return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${r}")`);o.noRet&&(c.noRet=1),s=_callBrowsers(null,r,n,c);break;case"server":if("string"!=typeof r||"object"!=typeof e)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" - ("${r}")`);o.noRet&&(c.noRet=1),s=_callBrowsers(e,r,n,c)}if(s)return promiseTimeout(s,o.timeout)}function callBrowser(e,r,n,o={}){if("client"!==t)return Promise.reject(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" - ("${r}")`);const s={};return o.noRet&&(s.noRet=1),promiseTimeout(_callBrowser(e,r,n,s),o.timeout)}function callEvent(e,r,t){const o=n.__rpcEvListeners[e];o&&o.forEach((e=>e(r,t)))}function on(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`on expects 2 arguments: "name" and "cb" - ("${e}")`);log(`Registered procedure listener "${e}"`);const t=n.__rpcEvListeners[e]||new Set;return t.add(r),n.__rpcEvListeners[e]=t,()=>off(e,r)}function off(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`off expects 2 arguments: "name" and "cb" - ("${e}")`);const t=n.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}function trigger(e,r){if("string"!=typeof e)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);callEvent(e,r,{environment:t})}function triggerClient(e,r,n){switch(t){case"client":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"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(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEvent",[r,n],{noRet:1})}function triggerServer(e,r){if("string"!=typeof e)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);_callServer("__rpc:triggerEvent",[e,r],{noRet:1})}function triggerBrowsers(e,r,n){switch(t){case"client":case"cef":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"object"!=typeof e)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,n],{noRet:1})}function triggerBrowser(e,r,n){if("client"!==t)throw new Error(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" - ("${r}")`);_callBrowser(e,"__rpc:triggerEvent",[r,n],{noRet:1})}const o="0.2.4";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(),o=mp.console;(o?mp.console:console)[o?{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,o)=>n?r.type===e&&t.at(r.id)===r:r instanceof o;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=getEnvironment(),n="cef"===t?window:global;if(n["__rpc:processPartial"]||(n.__rpcPartialData={},n["__rpc:processPartial"]=(e,r,o,s,c)=>{"server"!==t&&(c=s,s=o,o=r,r=e),n.__rpcPartialData[r]||(n.__rpcPartialData[r]=new Array(s)),n.__rpcPartialData[r][o]=c,n.__rpcPartialData[r].includes(void 0)||("server"===t?n["__rpc:process"](e,n.__rpcPartialData[r].join("")):n["__rpc:process"](n.__rpcPartialData[r].join("")),delete n.__rpcPartialData[r])}),!n["__rpc:process"]){if(n.__rpcListeners={},n.__rpcPending={},n.__rpcEvListeners={},n["__rpc:process"]=(r,o)=>{"server"!==t&&(o=r);const s=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 o;switch(n.__t){case e.Blip:o=mp.blips;break;case e.Checkpoint:o=mp.checkpoints;break;case e.Colshape:o=mp.colshapes;break;case e.Label:o=mp.labels;break;case e.Marker:o=mp.markers;break;case e.Object:o=mp.objects;break;case e.Pickup:o=mp.pickups;break;case e.Player:o=mp.players;break;case e.Vehicle:o=mp.vehicles}if(o)return o["client"===t?"atRemoteId":"at"](r)}return n}))}(o);if(s.req){const e={id:s.id,environment:s.fenv||s.env};"server"===t&&(e.player=r);const o={ret:1,id:s.id,env:t};let c;switch(t){case"server":c=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===s.env)c=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===s.env){const r=s.b&&n.__rpcBrowsers[s.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(s.name,s.args,e);s.noRet||r.then((e=>c({...o,res:e}))).catch((e=>c({...o,err:e||null})))}}else if(s.ret){const e=n.__rpcPending[s.id];if("server"===t&&e.player!==r)return;e&&(e.resolve(s.hasOwnProperty("err")?Promise.reject(s.err):Promise.resolve(s.res)),delete n.__rpcPending[s.id])}},"cef"===t)void 0===n["__rpc:id"]&&(n["__rpc:id"]=new Promise((e=>{window.name?e(window.name):n["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",n["__rpc:process"]),mp.events.add("__rpc:processPartial",n["__rpc:processPartial"]),"client"===t){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}))),n.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(n.__rpcBrowsers).forEach((r=>{const t=n.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete n.__rpcBrowsers[r]})),n.__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),n.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]===r&&delete n.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],t)=>{Object.keys(n.__rpcBrowsers).forEach((o=>{const s=n.__rpcBrowsers[o];s&&isBrowserValid(s)?_callBrowser(s,"__rpc:triggerEvent",[e,r],{fenv:t.environment,noRet:1}):delete n.__rpcBrowsers[o]}))}))}register("__rpc:triggerEvent",(([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 o=n.__rpcListeners[e];return o?Promise.resolve(o(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,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]("__rpc:processPartial",e.id,s,r.length,o)}))}else t[n]("__rpc:process",o)}function register(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`register expects 2 arguments: "name" and "cb" - ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),n.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if("string"!=typeof e)throw new Error(`unregister expects 1 argument: "name" - ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),n.__rpcListeners[e]=void 0}function call(e,r,n={}){return"string"!=typeof e?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:t}),n.timeout)}function _callServer(e,r,o={}){switch(t){case"server":return call(e,r);case"client":{const s=generateId();return new Promise((c=>{o.noRet||(n.__rpcPending[s]={resolve:c});sendEventData({req:1,id:s,name:e,env:t,args:r,...o})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(o.noRet)])}}function callServer(e,r,t={}){if("string"!=typeof e)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,o,s={}){switch(t){case"client":return call(r,o);case"server":{const c=generateId();return new Promise((i=>{s.noRet||(n.__rpcPending[c]={resolve:i,player:e});sendEventData({req:1,id:c,name:r,env:t,args:o,...s},e)}))}case"cef":{const e=generateId();return n["__rpc:id"].then((c=>new Promise((i=>{s.noRet||(n.__rpcPending[e]={resolve:i});const a={b:c,req:1,id:e,name:r,env:t,args:o,...s};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,n,o={}){switch(t){case"client":if(o=n||{},n=r,r=e,e=null,"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("string"!=typeof r||"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(o=n||{},n=r,r=e,e=null,"string"!=typeof r)return Promise.reject(`callClient from the browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${r}")`)}const s={};return o.noRet&&(s.noRet=1),promiseTimeout(_callClient(e,r,n,s),o.timeout)}function _callBrowser(e,r,o,s={}){return new Promise((c=>{const i=generateId();s.noRet||(n.__rpcPending[i]={resolve:c}),passEventToBrowser(e,{req:1,id:i,name:r,env:t,args:o,...s},!1)}))}function _callBrowsers(e,r,o,s={}){switch(t){case"client":{const e=n.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const t=n.__rpcBrowsers[e];return t&&isBrowserValid(t)?_callBrowser(t,r,o,s):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,o,Number(s.noRet)],s);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,o,Number(s.noRet)],s)}}function callBrowsers(e,r,n,o={}){let s;const c={};switch(t){case"client":case"cef":if(o=n||{},n=r,"string"!=typeof(r=e))return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${r}")`);o.noRet&&(c.noRet=1),s=_callBrowsers(null,r,n,c);break;case"server":if("string"!=typeof r||"object"!=typeof e)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" - ("${r}")`);o.noRet&&(c.noRet=1),s=_callBrowsers(e,r,n,c)}if(s)return promiseTimeout(s,o.timeout)}function callBrowser(e,r,n,o={}){if("client"!==t)return Promise.reject(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)return Promise.reject(`callBrowser expects 2 to 4 arguments: "browser", "name", optional "args", and optional "options" - ("${r}")`);const s={};return o.noRet&&(s.noRet=1),promiseTimeout(_callBrowser(e,r,n,s),o.timeout)}function callEvent(e,r,t){const o=n.__rpcEvListeners[e];o&&o.forEach((e=>e(r,t)))}function on(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`on expects 2 arguments: "name" and "cb" - ("${e}")`);log(`Registered procedure listener "${e}"`);const t=n.__rpcEvListeners[e]||new Set;return t.add(r),n.__rpcEvListeners[e]=t,()=>off(e,r)}function off(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`off expects 2 arguments: "name" and "cb" - ("${e}")`);const t=n.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}function trigger(e,r){if("string"!=typeof e)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);callEvent(e,r,{environment:t})}function triggerClient(e,r,n){switch(t){case"client":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"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(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEvent",[r,n],{noRet:1})}function triggerServer(e,r){if("string"!=typeof e)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);_callServer("__rpc:triggerEvent",[e,r],{noRet:1})}function triggerBrowsers(e,r,n){switch(t){case"client":case"cef":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"object"!=typeof e)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,n],{noRet:1})}function triggerBrowser(e,r,n){if("client"!==t)throw new Error(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" - ("${r}")`);_callBrowser(e,"__rpc:triggerEvent",[r,n],{noRet:1})}const o="0.2.5";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 7117141..f6ce04e 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=getEnvironment(),n="cef"===t?window:global;if(n["__rpc:processPartial"]||(n.__rpcPartialData={},n["__rpc:processPartial"]=(e,r,s,o,i)=>{"server"!==t&&(i=o,o=s,s=r,r=e),n.__rpcPartialData[r]||(n.__rpcPartialData[r]=new Array(o)),n.__rpcPartialData[r][s]=i,n.__rpcPartialData[r].includes(void 0)||("server"===t?n["__rpc:process"](e,n.__rpcPartialData[r].join("")):n["__rpc:process"](n.__rpcPartialData[r].join("")),delete n.__rpcPartialData[r])}),!n["__rpc:process"]){if(n.__rpcListeners={},n.__rpcPending={},n.__rpcEvListeners={},n["__rpc:process"]=(r,s)=>{"server"!==t&&(s=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}))}(s);if(o.req){const e={id:o.id,environment:o.fenv||o.env};"server"===t&&(e.player=r);const s={ret:1,id:o.id,env:t};let i;switch(t){case"server":i=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===o.env)i=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===o.env){const r=o.b&&n.__rpcBrowsers[o.b];e.browser=r,i=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:i=e=>mp.trigger("__rpc:process",stringifyData(e))}if(i){const r=callProcedure(o.name,o.args,e);o.noRet||r.then((e=>i({...s,res:e}))).catch((e=>i({...s,err:e||null})))}}else if(o.ret){const e=n.__rpcPending[o.id];if("server"===t&&e.player!==r)return;e&&(e.resolve(o.hasOwnProperty("err")?Promise.reject(o.err):Promise.resolve(o.res)),delete n.__rpcPending[o.id])}},"cef"===t)void 0===n["__rpc:id"]&&(n["__rpc:id"]=new Promise((e=>{window.name?e(window.name):n["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",n["__rpc:process"]),mp.events.add("__rpc:processPartial",n["__rpc:processPartial"]),"client"===t){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}))),n.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(n.__rpcBrowsers).forEach((r=>{const t=n.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete n.__rpcBrowsers[r]})),n.__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),n.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]===r&&delete n.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],t)=>{Object.keys(n.__rpcBrowsers).forEach((s=>{const o=n.__rpcBrowsers[s];o&&isBrowserValid(o)?_callBrowser(o,"__rpc:triggerEvent",[e,r],{fenv:t.environment,noRet:1}):delete n.__rpcBrowsers[s]}))}))}register("__rpc:triggerEvent",(([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 s=n.__rpcListeners[e];return s?Promise.resolve(s(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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`register expects 2 arguments: "name" and "cb" - ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),n.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if("string"!=typeof e)throw new Error(`unregister expects 1 argument: "name" - ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),n.__rpcListeners[e]=void 0}function call(e,r,n={}){return"string"!=typeof e?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:t}),n.timeout)}function _callServer(e,r,s={}){switch(t){case"server":return call(e,r);case"client":{const o=generateId();return new Promise((i=>{s.noRet||(n.__rpcPending[o]={resolve:i});sendEventData({req:1,id:o,name:e,env:t,args:r,...s})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(s.noRet)])}}function _callClient(e,r,s,o={}){switch(t){case"client":return call(r,s);case"server":{const i=generateId();return new Promise((c=>{o.noRet||(n.__rpcPending[i]={resolve:c,player:e});sendEventData({req:1,id:i,name:r,env:t,args:s,...o},e)}))}case"cef":{const e=generateId();return n["__rpc:id"].then((i=>new Promise((c=>{o.noRet||(n.__rpcPending[e]={resolve:c});const a={b:i,req:1,id:e,name:r,env:t,args:s,...o};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,n,s={}){switch(t){case"client":if(s=n||{},n=r,r=e,e=null,"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("string"!=typeof r||"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=n||{},n=r,r=e,e=null,"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,n,o),s.timeout)}function _callBrowser(e,r,s,o={}){return new Promise((i=>{const c=generateId();o.noRet||(n.__rpcPending[c]={resolve:i}),passEventToBrowser(e,{req:1,id:c,name:r,env:t,args:s,...o},!1)}))}function _callBrowsers(e,r,s,o={}){switch(t){case"client":{const e=n.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const t=n.__rpcBrowsers[e];return t&&isBrowserValid(t)?_callBrowser(t,r,s,o):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,s,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,s,Number(o.noRet)],o)}}function callEvent(e,r,t){const s=n.__rpcEvListeners[e];s&&s.forEach((e=>e(r,t)))}function off(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`off expects 2 arguments: "name" and "cb" - ("${e}")`);const t=n.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}exports.call=call,exports.callBrowser=function callBrowser(e,r,n,s={}){if("client"!==t)return Promise.reject(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)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,n,o),s.timeout)},exports.callBrowsers=function callBrowsers(e,r,n,s={}){let o;const i={};switch(t){case"client":case"cef":if(s=n||{},n=r,"string"!=typeof(r=e))return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${r}")`);s.noRet&&(i.noRet=1),o=_callBrowsers(null,r,n,i);break;case"server":if("string"!=typeof r||"object"!=typeof e)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" - ("${r}")`);s.noRet&&(i.noRet=1),o=_callBrowsers(e,r,n,i)}if(o)return promiseTimeout(o,s.timeout)},exports.callClient=callClient,exports.callServer=function callServer(e,r,t={}){if("string"!=typeof e)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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`on expects 2 arguments: "name" and "cb" - ("${e}")`);log(`Registered procedure listener "${e}"`);const t=n.__rpcEvListeners[e]||new Set;return t.add(r),n.__rpcEvListeners[e]=t,()=>off(e,r)},exports.register=register,exports.setDebugMode=function setDebugMode(e){r=e},exports.trigger=function trigger(e,r){if("string"!=typeof e)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);callEvent(e,r,{environment:t})},exports.triggerBrowser=function triggerBrowser(e,r,n){if("client"!==t)throw new Error(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" - ("${r}")`);_callBrowser(e,"__rpc:triggerEvent",[r,n],{noRet:1})},exports.triggerBrowsers=function triggerBrowsers(e,r,n){switch(t){case"client":case"cef":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"object"!=typeof e)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,n],{noRet:1})},exports.triggerClient=function triggerClient(e,r,n){switch(t){case"client":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"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(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEvent",[r,n],{noRet:1})},exports.triggerServer=function triggerServer(e,r){if("string"!=typeof e)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);_callServer("__rpc:triggerEvent",[e,r],{noRet:1})},exports.unregister=unregister,exports.version="0.2.4"; +"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=getEnvironment(),n="cef"===t?window:global;if(n["__rpc:processPartial"]||(n.__rpcPartialData={},n["__rpc:processPartial"]=(e,r,s,o,i)=>{"server"!==t&&(i=o,o=s,s=r,r=e),n.__rpcPartialData[r]||(n.__rpcPartialData[r]=new Array(o)),n.__rpcPartialData[r][s]=i,n.__rpcPartialData[r].includes(void 0)||("server"===t?n["__rpc:process"](e,n.__rpcPartialData[r].join("")):n["__rpc:process"](n.__rpcPartialData[r].join("")),delete n.__rpcPartialData[r])}),!n["__rpc:process"]){if(n.__rpcListeners={},n.__rpcPending={},n.__rpcEvListeners={},n["__rpc:process"]=(r,s)=>{"server"!==t&&(s=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}))}(s);if(o.req){const e={id:o.id,environment:o.fenv||o.env};"server"===t&&(e.player=r);const s={ret:1,id:o.id,env:t};let i;switch(t){case"server":i=r=>e.player.call("__rpc:process",[stringifyData(r)]);break;case"client":if("server"===o.env)i=e=>mp.events.callRemote("__rpc:process",stringifyData(e));else if("cef"===o.env){const r=o.b&&n.__rpcBrowsers[o.b];e.browser=r,i=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:i=e=>mp.trigger("__rpc:process",stringifyData(e))}if(i){const r=callProcedure(o.name,o.args,e);o.noRet||r.then((e=>i({...s,res:e}))).catch((e=>i({...s,err:e||null})))}}else if(o.ret){const e=n.__rpcPending[o.id];if("server"===t&&e.player!==r)return;e&&(e.resolve(o.hasOwnProperty("err")?Promise.reject(o.err):Promise.resolve(o.res)),delete n.__rpcPending[o.id])}},"cef"===t)void 0===n["__rpc:id"]&&(n["__rpc:id"]=new Promise((e=>{window.name?e(window.name):n["__rpc:id:resolve"]=e})));else if(mp.events.add("__rpc:process",n["__rpc:process"]),mp.events.add("__rpc:processPartial",n["__rpc:processPartial"]),"client"===t){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}))),n.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(n.__rpcBrowsers).forEach((r=>{const t=n.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete n.__rpcBrowsers[r]})),n.__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),n.__rpcBrowserProcedures={},mp.events.add("__rpc:browserRegister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]=r})),mp.events.add("__rpc:browserUnregister",(e=>{const[r,t]=JSON.parse(e);n.__rpcBrowserProcedures[t]===r&&delete n.__rpcBrowserProcedures[t]})),register("__rpc:triggerEventBrowsers",(([e,r],t)=>{Object.keys(n.__rpcBrowsers).forEach((s=>{const o=n.__rpcBrowsers[s];o&&isBrowserValid(o)?_callBrowser(o,"__rpc:triggerEvent",[e,r],{fenv:t.environment,noRet:1}):delete n.__rpcBrowsers[s]}))}))}register("__rpc:triggerEvent",(([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 s=n.__rpcListeners[e];return s?Promise.resolve(s(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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`register expects 2 arguments: "name" and "cb" - ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserRegister",JSON.stringify([r,e])))),n.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if("string"!=typeof e)throw new Error(`unregister expects 1 argument: "name" - ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===t&&n["__rpc:id"].then((r=>mp.trigger("__rpc:browserUnregister",JSON.stringify([r,e])))),n.__rpcListeners[e]=void 0}function call(e,r,n={}){return"string"!=typeof e?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:t}),n.timeout)}function _callServer(e,r,s={}){switch(t){case"server":return call(e,r);case"client":{const o=generateId();return new Promise((i=>{s.noRet||(n.__rpcPending[o]={resolve:i});sendEventData({req:1,id:o,name:e,env:t,args:r,...s})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(s.noRet)])}}function _callClient(e,r,s,o={}){switch(t){case"client":return call(r,s);case"server":{const i=generateId();return new Promise((c=>{o.noRet||(n.__rpcPending[i]={resolve:c,player:e});sendEventData({req:1,id:i,name:r,env:t,args:s,...o},e)}))}case"cef":{const e=generateId();return n["__rpc:id"].then((i=>new Promise((c=>{o.noRet||(n.__rpcPending[e]={resolve:c});const a={b:i,req:1,id:e,name:r,env:t,args:s,...o};mp.trigger("__rpc:process",stringifyData(a))}))))}}}function callClient(e,r,n,s={}){switch(t){case"client":if(s=n||{},n=r,r=e,e=null,"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("string"!=typeof r||"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=n||{},n=r,r=e,e=null,"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,n,o),s.timeout)}function _callBrowser(e,r,s,o={}){return new Promise((i=>{const c=generateId();o.noRet||(n.__rpcPending[c]={resolve:i}),passEventToBrowser(e,{req:1,id:c,name:r,env:t,args:s,...o},!1)}))}function _callBrowsers(e,r,s,o={}){switch(t){case"client":{const e=n.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`PROCEDURE_NOT_FOUND (${r})`);const t=n.__rpcBrowsers[e];return t&&isBrowserValid(t)?_callBrowser(t,r,s,o):Promise.reject(`PROCEDURE_NOT_FOUND (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,s,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,s,Number(o.noRet)],o)}}function callEvent(e,r,t){const s=n.__rpcEvListeners[e];s&&s.forEach((e=>e(r,t)))}function off(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`off expects 2 arguments: "name" and "cb" - ("${e}")`);const t=n.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}exports.call=call,exports.callBrowser=function callBrowser(e,r,n,s={}){if("client"!==t)return Promise.reject(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)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,n,o),s.timeout)},exports.callBrowsers=function callBrowsers(e,r,n,s={}){let o;const i={};switch(t){case"client":case"cef":if(s=n||{},n=r,"string"!=typeof(r=e))return Promise.reject(`callBrowsers from the client or browser expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${r}")`);s.noRet&&(i.noRet=1),o=_callBrowsers(null,r,n,i);break;case"server":if("string"!=typeof r||"object"!=typeof e)return Promise.reject(`callBrowsers from the server expects 2 to 4 arguments: "player", "name", optional "args", and optional "options" - ("${r}")`);s.noRet&&(i.noRet=1),o=_callBrowsers(e,r,n,i)}if(o)return promiseTimeout(o,s.timeout)},exports.callClient=callClient,exports.callServer=function callServer(e,r,t={}){if("string"!=typeof e)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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`on expects 2 arguments: "name" and "cb" - ("${e}")`);log(`Registered procedure listener "${e}"`);const t=n.__rpcEvListeners[e]||new Set;return t.add(r),n.__rpcEvListeners[e]=t,()=>off(e,r)},exports.register=register,exports.setDebugMode=function setDebugMode(e){r=e},exports.trigger=function trigger(e,r){if("string"!=typeof e)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);callEvent(e,r,{environment:t})},exports.triggerBrowser=function triggerBrowser(e,r,n){if("client"!==t)throw new Error(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)throw new Error(`callBrowser expects 2 or 3 arguments: "browser", "name", and optional "args" - ("${r}")`);_callBrowser(e,"__rpc:triggerEvent",[r,n],{noRet:1})},exports.triggerBrowsers=function triggerBrowsers(e,r,n){switch(t){case"client":case"cef":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"object"!=typeof e)throw new Error(`triggerBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEventBrowsers",[r,n],{noRet:1})},exports.triggerClient=function triggerClient(e,r,n){switch(t){case"client":if(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"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(n=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`)}_callClient(e,"__rpc:triggerEvent",[r,n],{noRet:1})},exports.triggerServer=function triggerServer(e,r){if("string"!=typeof e)throw new Error(`triggerServer expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);_callServer("__rpc:triggerEvent",[e,r],{noRet:1})},exports.unregister=unregister,exports.version="0.2.5"; diff --git a/dist/rage-rpc.umd.js b/dist/rage-rpc.umd.js index b5048a4..d314127 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",f=getEnvironment(),g="cef"===f?window:global;if(g[i]||(g.__rpcPartialData={},g[i]=(e,r,t,n,o)=>{"server"!==f&&(o=n,n=t,t=r,r=e),g.__rpcPartialData[r]||(g.__rpcPartialData[r]=new Array(n)),g.__rpcPartialData[r][t]=o,g.__rpcPartialData[r].includes(void 0)||("server"===f?g[s](e,g.__rpcPartialData[r].join("")):g[s](g.__rpcPartialData[r].join("")),delete g.__rpcPartialData[r])}),!g[s]){if(g.__rpcListeners={},g.__rpcPending={},g.__rpcEvListeners={},g[s]=(e,t)=>{"server"!==f&&(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"===f&&(r.player=e);const t={ret:1,id:n.id,env:f};let o;switch(f){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&&g.__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=g.__rpcPending[n.id];if("server"===f&&r.player!==e)return;r&&(r.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete g.__rpcPending[n.id])}},"cef"===f)void 0===g[o]&&(g[o]=new Promise((e=>{window.name?e(window.name):g["__rpc:id:resolve"]=e})));else if(mp.events.add(s,g[s]),mp.events.add(i,g[i]),"client"===f){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}))),g.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(g.__rpcBrowsers).forEach((r=>{const t=g.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete g.__rpcBrowsers[r]})),g.__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),g.__rpcBrowserProcedures={},mp.events.add(c,(e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]=r})),mp.events.add(a,(e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]===r&&delete g.__rpcBrowserProcedures[t]})),register(p,(([e,r],t)=>{Object.keys(g.__rpcBrowsers).forEach((n=>{const o=g.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,l,[e,r],{fenv:t.environment,noRet:1}):delete g.__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=g.__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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`register expects 2 arguments: "name" and "cb" - ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===f&&g[o].then((r=>mp.trigger(c,JSON.stringify([r,e])))),g.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if("string"!=typeof e)throw new Error(`unregister expects 1 argument: "name" - ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===f&&g[o].then((r=>mp.trigger(a,JSON.stringify([r,e])))),g.__rpcListeners[e]=void 0}function call(e,r,t={}){return"string"!=typeof e?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:f}),t.timeout)}function _callServer(e,r,t={}){switch(f){case"server":return call(e,r);case"client":{const n=generateId();return new Promise((o=>{t.noRet||(g.__rpcPending[n]={resolve:o});sendEventData({req:1,id:n,name:e,env:f,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,n={}){switch(f){case"client":return call(r,t);case"server":{const o=generateId();return new Promise((s=>{n.noRet||(g.__rpcPending[o]={resolve:s,player:e});sendEventData({req:1,id:o,name:r,env:f,args:t,...n},e)}))}case"cef":{const e=generateId();return g[o].then((o=>new Promise((i=>{n.noRet||(g.__rpcPending[e]={resolve:i});const c={b:o,req:1,id:e,name:r,env:f,args:t,...n};mp.trigger(s,stringifyData(c))}))))}}}function callClient(e,r,t,n={}){switch(f){case"client":if(n=t||{},t=r,r=e,e=null,"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("string"!=typeof r||"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,"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||(g.__rpcPending[s]={resolve:o}),passEventToBrowser(e,{req:1,id:s,name:r,env:f,args:t,...n},!1)}))}function _callBrowsers(e,r,t,o={}){switch(f){case"client":{const e=g.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${n} (${r})`);const s=g.__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=g.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function off(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`off expects 2 arguments: "name" and "cb" - ("${e}")`);const t=g.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}e.call=call,e.callBrowser=function callBrowser(e,r,t,n={}){if("client"!==f)return Promise.reject(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)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(f){case"client":case"cef":if(n=t||{},t=r,"string"!=typeof(r=e))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("string"!=typeof r||"object"!=typeof e)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("string"!=typeof e)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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`on expects 2 arguments: "name" and "cb" - ("${e}")`);log(`Registered procedure listener "${e}"`);const t=g.__rpcEvListeners[e]||new Set;return t.add(r),g.__rpcEvListeners[e]=t,()=>off(e,r)},e.register=register,e.setDebugMode=function setDebugMode(e){t=e},e.trigger=function trigger(e,r){if("string"!=typeof e)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);callEvent(e,r,{environment:f})},e.triggerBrowser=function triggerBrowser(e,r,t){if("client"!==f)throw new Error(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)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(f){case"client":case"cef":if(t=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"object"!=typeof e)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(f){case"client":if(t=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"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,"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("string"!=typeof e)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.4",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",f=getEnvironment(),g="cef"===f?window:global;if(g[i]||(g.__rpcPartialData={},g[i]=(e,r,t,n,o)=>{"server"!==f&&(o=n,n=t,t=r,r=e),g.__rpcPartialData[r]||(g.__rpcPartialData[r]=new Array(n)),g.__rpcPartialData[r][t]=o,g.__rpcPartialData[r].includes(void 0)||("server"===f?g[s](e,g.__rpcPartialData[r].join("")):g[s](g.__rpcPartialData[r].join("")),delete g.__rpcPartialData[r])}),!g[s]){if(g.__rpcListeners={},g.__rpcPending={},g.__rpcEvListeners={},g[s]=(e,t)=>{"server"!==f&&(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"===f&&(r.player=e);const t={ret:1,id:n.id,env:f};let o;switch(f){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&&g.__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=g.__rpcPending[n.id];if("server"===f&&r.player!==e)return;r&&(r.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete g.__rpcPending[n.id])}},"cef"===f)void 0===g[o]&&(g[o]=new Promise((e=>{window.name?e(window.name):g["__rpc:id:resolve"]=e})));else if(mp.events.add(s,g[s]),mp.events.add(i,g[i]),"client"===f){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}))),g.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(g.__rpcBrowsers).forEach((r=>{const t=g.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete g.__rpcBrowsers[r]})),g.__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),g.__rpcBrowserProcedures={},mp.events.add(c,(e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]=r})),mp.events.add(a,(e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]===r&&delete g.__rpcBrowserProcedures[t]})),register(p,(([e,r],t)=>{Object.keys(g.__rpcBrowsers).forEach((n=>{const o=g.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,l,[e,r],{fenv:t.environment,noRet:1}):delete g.__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=g.__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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`register expects 2 arguments: "name" and "cb" - ("${e}")`);return log(`Registered procedure "${e}"`),"cef"===f&&g[o].then((r=>mp.trigger(c,JSON.stringify([r,e])))),g.__rpcListeners[e]=r,()=>unregister(e)}function unregister(e){if("string"!=typeof e)throw new Error(`unregister expects 1 argument: "name" - ("${e}")`);log(`Unregistered procedure "${e}"`),"cef"===f&&g[o].then((r=>mp.trigger(a,JSON.stringify([r,e])))),g.__rpcListeners[e]=void 0}function call(e,r,t={}){return"string"!=typeof e?Promise.reject(`call expects 1 to 3 arguments: "name", optional "args", and optional "options" - ("${e}")`):promiseTimeout(callProcedure(e,r,{environment:f}),t.timeout)}function _callServer(e,r,t={}){switch(f){case"server":return call(e,r);case"client":{const n=generateId();return new Promise((o=>{t.noRet||(g.__rpcPending[n]={resolve:o});sendEventData({req:1,id:n,name:e,env:f,args:r,...t})}))}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,n={}){switch(f){case"client":return call(r,t);case"server":{const o=generateId();return new Promise((s=>{n.noRet||(g.__rpcPending[o]={resolve:s,player:e});sendEventData({req:1,id:o,name:r,env:f,args:t,...n},e)}))}case"cef":{const e=generateId();return g[o].then((o=>new Promise((i=>{n.noRet||(g.__rpcPending[e]={resolve:i});const c={b:o,req:1,id:e,name:r,env:f,args:t,...n};mp.trigger(s,stringifyData(c))}))))}}}function callClient(e,r,t,n={}){switch(f){case"client":if(n=t||{},t=r,r=e,e=null,"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("string"!=typeof r||"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,"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||(g.__rpcPending[s]={resolve:o}),passEventToBrowser(e,{req:1,id:s,name:r,env:f,args:t,...n},!1)}))}function _callBrowsers(e,r,t,o={}){switch(f){case"client":{const e=g.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${n} (${r})`);const s=g.__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=g.__rpcEvListeners[e];n&&n.forEach((e=>e(r,t)))}function off(e,r){if("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`off expects 2 arguments: "name" and "cb" - ("${e}")`);const t=g.__rpcEvListeners[e];t&&(log(`Unregistered procedure listener "${e}"`),t.delete(r))}e.call=call,e.callBrowser=function callBrowser(e,r,t,n={}){if("client"!==f)return Promise.reject(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)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(f){case"client":case"cef":if(n=t||{},t=r,"string"!=typeof(r=e))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("string"!=typeof r||"object"!=typeof e)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("string"!=typeof e)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("string"!=typeof e||!r||"function"!=typeof r)throw new Error(`on expects 2 arguments: "name" and "cb" - ("${e}")`);log(`Registered procedure listener "${e}"`);const t=g.__rpcEvListeners[e]||new Set;return t.add(r),g.__rpcEvListeners[e]=t,()=>off(e,r)},e.register=register,e.setDebugMode=function setDebugMode(e){t=e},e.trigger=function trigger(e,r){if("string"!=typeof e)throw new Error(`trigger expects 1 or 2 arguments: "name", and optional "args" - ("${e}")`);callEvent(e,r,{environment:f})},e.triggerBrowser=function triggerBrowser(e,r,t){if("client"!==f)throw new Error(`callBrowser can only be used in the client environment - ("${r}")`);if(!isBrowserValid(e)||"string"!=typeof r)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(f){case"client":case"cef":if(t=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerBrowsers from the client or browser expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"object"!=typeof e)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(f){case"client":if(t=r,r=e,e=null,"string"!=typeof r)throw new Error(`triggerClient from the client expects 1 or 2 arguments: "name", and optional "args" - ("${r}")`);break;case"server":if("string"!=typeof r||"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,"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("string"!=typeof e)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.5",Object.defineProperty(e,"__esModule",{value:!0})})); diff --git a/package.json b/package.json index 206a305..8111dc9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rage-rpc", - "version": "0.2.4", + "version": "0.2.5", "description": "A universal, asynchronous RPC implementation for RAGE Multiplayer", "scripts": { "lint": "eslint src --ext mjs,js,ts,tsx --fix",