@gta5urban/rage-rpc 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rage-rpc.esm.mjs +1 -1
- package/dist/rage-rpc.js +1 -1
- package/dist/rage-rpc.umd.js +1 -1
- package/package.json +1 -1
package/dist/rage-rpc.esm.mjs
CHANGED
|
@@ -1 +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="PROCEDURE_NOT_FOUND",n="__rpc:id",o="__rpc:process",s="__rpc:processPartial",i="__rpc:browserRegister",c="__rpc:browserUnregister",a="__rpc:triggerEvent",l="__rpc:triggerEventBrowsers",p=getEnvironment(),m="cef"===p?window:global;if(m[s]||(m.__rpcPartialData={},m[s]=(e,r,t,n,s)=>{"server"!==p&&(s=n,n=t,t=r,r=e),m.__rpcPartialData[r]||(m.__rpcPartialData[r]=new Array(n)),m.__rpcPartialData[r][t]=s,m.__rpcPartialData[r].includes(void 0)||("server"===p?m[o](e,m.__rpcPartialData[r].join("")):m[o](m.__rpcPartialData[r].join("")),delete m.__rpcPartialData[r])}),!m[o]){if(m.__rpcListeners={},m.__rpcPending={},m.__rpcEvListeners={},m[o]=(r,t)=>{"server"!==p&&(t=r);const n=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})}(t);if(n.req){const e={id:n.id,environment:n.fenv||n.env};"server"===p&&(e.player=r);const t={ret:1,id:n.id,env:p};let s;switch(p){case"server":s=r=>sendEventData(r,e.player);break;case"client":if("server"===n.env)s=e=>sendEventData(e);else if("cef"===n.env){const r=n.b&&m.__rpcBrowsers[n.b];e.browser=r,s=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:s=e=>mp.trigger(o,stringifyData(e))}if(s){const r=callProcedure(n.name,n.args,e);n.noRet||r.then(e=>s({...t,res:e})).catch(e=>s({...t,err:e||null}))}}else if(n.ret){const e=m.__rpcPending[n.id];if("server"===p&&e.player!==r)return;e&&(e.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete m.__rpcPending[n.id])}},"cef"===p)void 0===m[n]&&(m[n]=new Promise(e=>{window.name?e(window.name):m[`${n}:resolve`]=e}));else if(mp.events.add(o,m[o]),mp.events.add(s,m[s]),"client"===p){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['${n}'] === 'undefined'){\n window['${n}'] = Promise.resolve(window.name);\n }else{\n window['${n}:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),m.__rpcBrowserProcedures={},mp.events.add(i,e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]=r}),mp.events.add(c,e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]===r&&delete m.__rpcBrowserProcedures[t]}),register(l,([e,r],t)=>{Object.keys(m.__rpcBrowsers).forEach(n=>{const o=m.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,a,[e,r],{fenv:t.environment,noRet:1}):delete m.__rpcBrowsers[n]})})}register(a,([e,r],t)=>callEvent(e,r,t))}function passEventToBrowser(e,r,n){const s=stringifyData(r);e.execute(`var process = window["${o}"]; if(process){ process(${JSON.stringify(s)}); }else{ ${n?"":`mp.trigger("${o}", '{"ret":1,"id":"${r.id}","err":"${t}","env":"cef"}');`} }`)}function callProcedure(e,r,n){const o=m.__rpcListeners[e];return o?Promise.resolve(o(r,n)):Promise.reject(`${t} (${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,i=stringifyData(e);if(i.length>3e4){const r=function chunkSubstr(e,r){const t=[];for(let n=0;n<=e.length-1;n+=r)t.push(e.substr(n,Math.min(r,e.length-n)));return t}(i,3e4);r.forEach((o,i)=>{t[n](s,e.id,i,r.length,o)})}else t[n](o,i)}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"===p&&m[n].then(r=>mp.trigger(i,JSON.stringify([r,e]))),m.__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"===p&&m[n].then(r=>mp.trigger(c,JSON.stringify([r,e]))),m.__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:p}),t.timeout)}function _callServer(e,r,t={}){switch(p){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:p,args:r,...t})})}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.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,t,s={}){switch(p){case"client":return call(r,t);case"server":{const n=generateId();return new Promise(o=>{s.noRet||(m.__rpcPending[n]={resolve:o,player:e});sendEventData({req:1,id:n,name:r,env:p,args:t,...s},e)})}case"cef":{const e=generateId();return m[n].then(n=>new Promise(i=>{s.noRet||(m.__rpcPending[e]={resolve:i});const c={b:n,req:1,id:e,name:r,env:p,args:t,...s};mp.trigger(o,stringifyData(c))}))}}}function callClient(e,r,t,n={}){switch(p){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||(m.__rpcPending[s]={resolve:o}),passEventToBrowser(e,{req:1,id:s,name:r,env:p,args:t,...n},!1)})}function _callBrowsers(e,r,n,o={}){switch(p){case"client":{const e=m.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${t} (${r})`);const s=m.__rpcBrowsers[e];return s&&isBrowserValid(s)?_callBrowser(s,r,n,o):Promise.reject(`${t} (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,n,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,n,Number(o.noRet)],o)}}function callBrowsers(e,r,t,n={}){let o;const s={};switch(p){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)}function callBrowser(e,r,t,n={}){if("client"!==p)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)}function callEvent(e,r,t){const n=m.__rpcEvListeners[e];n&&n.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=m.__rpcEvListeners[e]||new Set;return t.add(r),m.__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=m.__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:p})}function triggerClient(e,r,t){switch(p){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,a,[r,t],{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(a,[e,r],{noRet:1})}function triggerBrowsers(e,r,t){switch(p){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,l,[r,t],{noRet:1})}function triggerBrowser(e,r,t){if("client"!==p)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,a,[r,t],{noRet:1})}const g="0.3.2";export{call,callBrowser,callBrowsers,callClient,callServer,off,on,register,setDebugMode,trigger,triggerBrowser,triggerBrowsers,triggerClient,triggerServer,unregister,g as version};
|
|
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="PROCEDURE_NOT_FOUND",n="__rpc:id",o="__rpc:process",s="__rpc:processPartial",i="__rpc:browserRegister",c="__rpc:browserUnregister",a="__rpc:triggerEvent",l="__rpc:triggerEventBrowsers",p=getEnvironment(),m="cef"===p?window:global;if(m[s]||(m.__rpcPartialData={},m[s]=(e,r,t,n,s)=>{"server"!==p&&(s=n,n=t,t=r,r=e),m.__rpcPartialData[r]||(m.__rpcPartialData[r]=new Array(n)),m.__rpcPartialData[r][t]=s,m.__rpcPartialData[r].includes(void 0)||("server"===p?m[o](e,m.__rpcPartialData[r].join("")):m[o](m.__rpcPartialData[r].join("")),delete m.__rpcPartialData[r])}),!m[o]){if(m.__rpcListeners={},m.__rpcPending={},m.__rpcEvListeners={},m[o]=(r,t)=>{"server"!==p&&(t=r);const n=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})}(t);if(n.req){const e={id:n.id,environment:n.fenv||n.env};"server"===p&&(e.player=r);const t={ret:1,id:n.id,env:p};let s;switch(p){case"server":s=r=>sendEventData(r,e.player);break;case"client":if("server"===n.env)s=e=>sendEventData(e);else if("cef"===n.env){const r=n.b&&m.__rpcBrowsers[n.b];e.browser=r,s=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:s=e=>mp.trigger(o,stringifyData(e))}if(s){const r=callProcedure(n.name,n.args,e);n.noRet||r.then(e=>s({...t,res:e})).catch(e=>s({...t,err:e||null}))}}else if(n.ret){const e=m.__rpcPending[n.id];if("server"===p&&e.player!==r)return;e&&(e.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete m.__rpcPending[n.id])}},"cef"===p)void 0===m[n]&&(m[n]=new Promise(e=>{window.name?e(window.name):m[`${n}:resolve`]=e}));else if(mp.events.add(o,m[o]),mp.events.add(s,m[s]),"client"===p){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['${n}'] === 'undefined'){\n window['${n}'] = Promise.resolve(window.name);\n }else{\n window['${n}:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),m.__rpcBrowserProcedures={},mp.events.add(i,e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]=r}),mp.events.add(c,e=>{const[r,t]=JSON.parse(e);m.__rpcBrowserProcedures[t]===r&&delete m.__rpcBrowserProcedures[t]}),register(l,([e,r],t)=>{Object.keys(m.__rpcBrowsers).forEach(n=>{const o=m.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,a,[e,r],{fenv:t.environment,noRet:1}):delete m.__rpcBrowsers[n]})})}register(a,([e,r],t)=>callEvent(e,r,t))}function passEventToBrowser(e,r,n){const s=stringifyData(r);e.execute(`var process = window["${o}"]; if(process){ process(${JSON.stringify(s)}); }else{ ${n?"":`mp.trigger("${o}", '{"ret":1,"id":"${r.id}","err":"${t}","env":"cef"}');`} }`)}function callProcedure(e,r,n){const o=m.__rpcListeners[e];return o?Promise.resolve(o(r,n)):Promise.reject(`${t} (${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,i=stringifyData(e);if(i.length>3e4){const r=function chunkSubstr(e,r){const t=[];for(let n=0;n<=e.length-1;n+=r)t.push(e.substr(n,Math.min(r,e.length-n)));return t}(i,3e4);r.forEach((o,i)=>{t[n](s,e.id,i,r.length,o)})}else t[n](o,i)}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"===p&&m[n].then(r=>mp.trigger(i,JSON.stringify([r,e]))),m.__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"===p&&m[n].then(r=>mp.trigger(c,JSON.stringify([r,e]))),m.__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:p}),t.timeout)}function _callServer(e,r,t={}){switch(p){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:p,args:r,...t})})}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.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,t,s={}){switch(p){case"client":return call(r,t);case"server":{const n=generateId();return new Promise(o=>{s.noRet||(m.__rpcPending[n]={resolve:o,player:e});sendEventData({req:1,id:n,name:r,env:p,args:t,...s},e)})}case"cef":{const e=generateId();return m[n].then(n=>new Promise(i=>{s.noRet||(m.__rpcPending[e]={resolve:i});const c={b:n,req:1,id:e,name:r,env:p,args:t,...s};mp.trigger(o,stringifyData(c))}))}}}function callClient(e,r,t,n={}){switch(p){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||(m.__rpcPending[s]={resolve:o}),passEventToBrowser(e,{req:1,id:s,name:r,env:p,args:t,...n},!1)})}function _callBrowsers(e,r,n,o={}){switch(p){case"client":{const e=m.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${t} (${r})`);const s=m.__rpcBrowsers[e];return s&&isBrowserValid(s)?_callBrowser(s,r,n,o):Promise.reject(`${t} (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,n,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,n,Number(o.noRet)],o)}}function callBrowsers(e,r,t,n={}){let o;const s={};switch(p){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)}function callBrowser(e,r,t,n={}){if("client"!==p)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)}function callEvent(e,r,t){const n=m.__rpcEvListeners[e];n&&n.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=m.__rpcEvListeners[e]||new Set;return t.add(r),m.__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=m.__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:p})}function triggerClient(e,r,t){switch(p){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,a,[r,t],{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(a,[e,r],{noRet:1})}function triggerBrowsers(e,r,t){switch(p){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,l,[r,t],{noRet:1})}function triggerBrowser(e,r,t){if("client"!==p)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,a,[r,t],{noRet:1})}const g="0.3.4";export{call,callBrowser,callBrowsers,callClient,callServer,off,on,register,setDebugMode,trigger,triggerBrowser,triggerBrowsers,triggerClient,triggerServer,unregister,g as version};
|
package/dist/rage-rpc.js
CHANGED
|
@@ -1 +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(),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="PROCEDURE_NOT_FOUND",n="__rpc:id",o="__rpc:process",s="__rpc:processPartial",i="__rpc:browserRegister",c="__rpc:browserUnregister",a="__rpc:triggerEvent",l="__rpc:triggerEventBrowsers",p=getEnvironment(),g="cef"===p?window:global;if(g[s]||(g.__rpcPartialData={},g[s]=(e,r,t,n,s)=>{"server"!==p&&(s=n,n=t,t=r,r=e),g.__rpcPartialData[r]||(g.__rpcPartialData[r]=new Array(n)),g.__rpcPartialData[r][t]=s,g.__rpcPartialData[r].includes(void 0)||("server"===p?g[o](e,g.__rpcPartialData[r].join("")):g[o](g.__rpcPartialData[r].join("")),delete g.__rpcPartialData[r])}),!g[o]){if(g.__rpcListeners={},g.__rpcPending={},g.__rpcEvListeners={},g[o]=(r,t)=>{"server"!==p&&(t=r);const n=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})}(t);if(n.req){const e={id:n.id,environment:n.fenv||n.env};"server"===p&&(e.player=r);const t={ret:1,id:n.id,env:p};let s;switch(p){case"server":s=r=>sendEventData(r,e.player);break;case"client":if("server"===n.env)s=e=>sendEventData(e);else if("cef"===n.env){const r=n.b&&g.__rpcBrowsers[n.b];e.browser=r,s=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:s=e=>mp.trigger(o,stringifyData(e))}if(s){const r=callProcedure(n.name,n.args,e);n.noRet||r.then(e=>s({...t,res:e})).catch(e=>s({...t,err:e||null}))}}else if(n.ret){const e=g.__rpcPending[n.id];if("server"===p&&e.player!==r)return;e&&(e.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete g.__rpcPending[n.id])}},"cef"===p)void 0===g[n]&&(g[n]=new Promise(e=>{window.name?e(window.name):g[`${n}:resolve`]=e}));else if(mp.events.add(o,g[o]),mp.events.add(s,g[s]),"client"===p){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['${n}'] === 'undefined'){\n window['${n}'] = Promise.resolve(window.name);\n }else{\n window['${n}:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),g.__rpcBrowserProcedures={},mp.events.add(i,e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]=r}),mp.events.add(c,e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]===r&&delete g.__rpcBrowserProcedures[t]}),register(l,([e,r],t)=>{Object.keys(g.__rpcBrowsers).forEach(n=>{const o=g.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,a,[e,r],{fenv:t.environment,noRet:1}):delete g.__rpcBrowsers[n]})})}register(a,([e,r],t)=>callEvent(e,r,t))}function passEventToBrowser(e,r,n){const s=stringifyData(r);e.execute(`var process = window["${o}"]; if(process){ process(${JSON.stringify(s)}); }else{ ${n?"":`mp.trigger("${o}", '{"ret":1,"id":"${r.id}","err":"${t}","env":"cef"}');`} }`)}function callProcedure(e,r,n){const o=g.__rpcListeners[e];return o?Promise.resolve(o(r,n)):Promise.reject(`${t} (${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,i=stringifyData(e);if(i.length>3e4){const r=function chunkSubstr(e,r){const t=[];for(let n=0;n<=e.length-1;n+=r)t.push(e.substr(n,Math.min(r,e.length-n)));return t}(i,3e4);r.forEach((o,i)=>{t[n](s,e.id,i,r.length,o)})}else t[n](o,i)}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"===p&&g[n].then(r=>mp.trigger(i,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"===p&&g[n].then(r=>mp.trigger(c,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:p}),t.timeout)}function _callServer(e,r,t={}){switch(p){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:p,args:r,...t})})}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,s={}){switch(p){case"client":return call(r,t);case"server":{const n=generateId();return new Promise(o=>{s.noRet||(g.__rpcPending[n]={resolve:o,player:e});sendEventData({req:1,id:n,name:r,env:p,args:t,...s},e)})}case"cef":{const e=generateId();return g[n].then(n=>new Promise(i=>{s.noRet||(g.__rpcPending[e]={resolve:i});const c={b:n,req:1,id:e,name:r,env:p,args:t,...s};mp.trigger(o,stringifyData(c))}))}}}function callClient(e,r,t,n={}){switch(p){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:p,args:t,...n},!1)})}function _callBrowsers(e,r,n,o={}){switch(p){case"client":{const e=g.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${t} (${r})`);const s=g.__rpcBrowsers[e];return s&&isBrowserValid(s)?_callBrowser(s,r,n,o):Promise.reject(`${t} (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,n,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,n,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))}exports.call=call,exports.callBrowser=function callBrowser(e,r,t,n={}){if("client"!==p)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)},exports.callBrowsers=function callBrowsers(e,r,t,n={}){let o;const s={};switch(p){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)},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=g.__rpcEvListeners[e]||new Set;return t.add(r),g.__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:p})},exports.triggerBrowser=function triggerBrowser(e,r,t){if("client"!==p)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,a,[r,t],{noRet:1})},exports.triggerBrowsers=function triggerBrowsers(e,r,t){switch(p){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,l,[r,t],{noRet:1})},exports.triggerClient=function triggerClient(e,r,t){switch(p){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,a,[r,t],{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(a,[e,r],{noRet:1})},exports.unregister=unregister,exports.version="0.3.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(),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="PROCEDURE_NOT_FOUND",n="__rpc:id",o="__rpc:process",s="__rpc:processPartial",i="__rpc:browserRegister",c="__rpc:browserUnregister",a="__rpc:triggerEvent",l="__rpc:triggerEventBrowsers",p=getEnvironment(),g="cef"===p?window:global;if(g[s]||(g.__rpcPartialData={},g[s]=(e,r,t,n,s)=>{"server"!==p&&(s=n,n=t,t=r,r=e),g.__rpcPartialData[r]||(g.__rpcPartialData[r]=new Array(n)),g.__rpcPartialData[r][t]=s,g.__rpcPartialData[r].includes(void 0)||("server"===p?g[o](e,g.__rpcPartialData[r].join("")):g[o](g.__rpcPartialData[r].join("")),delete g.__rpcPartialData[r])}),!g[o]){if(g.__rpcListeners={},g.__rpcPending={},g.__rpcEvListeners={},g[o]=(r,t)=>{"server"!==p&&(t=r);const n=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})}(t);if(n.req){const e={id:n.id,environment:n.fenv||n.env};"server"===p&&(e.player=r);const t={ret:1,id:n.id,env:p};let s;switch(p){case"server":s=r=>sendEventData(r,e.player);break;case"client":if("server"===n.env)s=e=>sendEventData(e);else if("cef"===n.env){const r=n.b&&g.__rpcBrowsers[n.b];e.browser=r,s=e=>r&&isBrowserValid(r)&&passEventToBrowser(r,e,!0)}break;default:s=e=>mp.trigger(o,stringifyData(e))}if(s){const r=callProcedure(n.name,n.args,e);n.noRet||r.then(e=>s({...t,res:e})).catch(e=>s({...t,err:e||null}))}}else if(n.ret){const e=g.__rpcPending[n.id];if("server"===p&&e.player!==r)return;e&&(e.resolve(n.hasOwnProperty("err")?Promise.reject(n.err):Promise.resolve(n.res)),delete g.__rpcPending[n.id])}},"cef"===p)void 0===g[n]&&(g[n]=new Promise(e=>{window.name?e(window.name):g[`${n}:resolve`]=e}));else if(mp.events.add(o,g[o]),mp.events.add(s,g[s]),"client"===p){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['${n}'] === 'undefined'){\n window['${n}'] = Promise.resolve(window.name);\n }else{\n window['${n}:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),g.__rpcBrowserProcedures={},mp.events.add(i,e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]=r}),mp.events.add(c,e=>{const[r,t]=JSON.parse(e);g.__rpcBrowserProcedures[t]===r&&delete g.__rpcBrowserProcedures[t]}),register(l,([e,r],t)=>{Object.keys(g.__rpcBrowsers).forEach(n=>{const o=g.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,a,[e,r],{fenv:t.environment,noRet:1}):delete g.__rpcBrowsers[n]})})}register(a,([e,r],t)=>callEvent(e,r,t))}function passEventToBrowser(e,r,n){const s=stringifyData(r);e.execute(`var process = window["${o}"]; if(process){ process(${JSON.stringify(s)}); }else{ ${n?"":`mp.trigger("${o}", '{"ret":1,"id":"${r.id}","err":"${t}","env":"cef"}');`} }`)}function callProcedure(e,r,n){const o=g.__rpcListeners[e];return o?Promise.resolve(o(r,n)):Promise.reject(`${t} (${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,i=stringifyData(e);if(i.length>3e4){const r=function chunkSubstr(e,r){const t=[];for(let n=0;n<=e.length-1;n+=r)t.push(e.substr(n,Math.min(r,e.length-n)));return t}(i,3e4);r.forEach((o,i)=>{t[n](s,e.id,i,r.length,o)})}else t[n](o,i)}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"===p&&g[n].then(r=>mp.trigger(i,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"===p&&g[n].then(r=>mp.trigger(c,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:p}),t.timeout)}function _callServer(e,r,t={}){switch(p){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:p,args:r,...t})})}case"cef":return callClient("__rpc:callServer",[e,r,Number(t.noRet)])}}function _callClient(e,r,t,s={}){switch(p){case"client":return call(r,t);case"server":{const n=generateId();return new Promise(o=>{s.noRet||(g.__rpcPending[n]={resolve:o,player:e});sendEventData({req:1,id:n,name:r,env:p,args:t,...s},e)})}case"cef":{const e=generateId();return g[n].then(n=>new Promise(i=>{s.noRet||(g.__rpcPending[e]={resolve:i});const c={b:n,req:1,id:e,name:r,env:p,args:t,...s};mp.trigger(o,stringifyData(c))}))}}}function callClient(e,r,t,n={}){switch(p){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:p,args:t,...n},!1)})}function _callBrowsers(e,r,n,o={}){switch(p){case"client":{const e=g.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${t} (${r})`);const s=g.__rpcBrowsers[e];return s&&isBrowserValid(s)?_callBrowser(s,r,n,o):Promise.reject(`${t} (${r})`)}case"server":return _callClient(e,"__rpc:callBrowsers",[r,n,Number(o.noRet)],o);case"cef":return _callClient(null,"__rpc:callBrowsers",[r,n,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))}exports.call=call,exports.callBrowser=function callBrowser(e,r,t,n={}){if("client"!==p)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)},exports.callBrowsers=function callBrowsers(e,r,t,n={}){let o;const s={};switch(p){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)},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=g.__rpcEvListeners[e]||new Set;return t.add(r),g.__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:p})},exports.triggerBrowser=function triggerBrowser(e,r,t){if("client"!==p)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,a,[r,t],{noRet:1})},exports.triggerBrowsers=function triggerBrowsers(e,r,t){switch(p){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,l,[r,t],{noRet:1})},exports.triggerClient=function triggerClient(e,r,t){switch(p){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,a,[r,t],{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(a,[e,r],{noRet:1})},exports.unregister=unregister,exports.version="0.3.4";
|
package/dist/rage-rpc.umd.js
CHANGED
|
@@ -1 +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(),u="cef"===f?window:global;if(u[i]||(u.__rpcPartialData={},u[i]=(e,r,t,n,o)=>{"server"!==f&&(o=n,n=t,t=r,r=e),u.__rpcPartialData[r]||(u.__rpcPartialData[r]=new Array(n)),u.__rpcPartialData[r][t]=o,u.__rpcPartialData[r].includes(void 0)||("server"===f?u[s](e,u.__rpcPartialData[r].join("")):u[s](u.__rpcPartialData[r].join("")),delete u.__rpcPartialData[r])}),!u[s]){if(u.__rpcListeners={},u.__rpcPending={},u.__rpcEvListeners={},u[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=>sendEventData(e,r.player);break;case"client":if("server"===n.env)o=e=>sendEventData(e);else if("cef"===n.env){const e=n.b&&u.__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=u.__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 u.__rpcPending[n.id])}},"cef"===f)void 0===u[o]&&(u[o]=new Promise(e=>{window.name?e(window.name):u[`${o}:resolve`]=e}));else if(mp.events.add(s,u[s]),mp.events.add(i,u[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})),u.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(u.__rpcBrowsers).forEach(r=>{const t=u.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete u.__rpcBrowsers[r]}),u.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['${o}'] === 'undefined'){\n window['${o}'] = Promise.resolve(window.name);\n }else{\n window['${o}:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),u.__rpcBrowserProcedures={},mp.events.add(c,e=>{const[r,t]=JSON.parse(e);u.__rpcBrowserProcedures[t]=r}),mp.events.add(a,e=>{const[r,t]=JSON.parse(e);u.__rpcBrowserProcedures[t]===r&&delete u.__rpcBrowserProcedures[t]}),register(p,([e,r],t)=>{Object.keys(u.__rpcBrowsers).forEach(n=>{const o=u.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,l,[e,r],{fenv:t.environment,noRet:1}):delete u.__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["${s}"]; if(process){ process(${JSON.stringify(o)}); }else{ ${t?"":`mp.trigger("${s}", '{"ret":1,"id":"${r.id}","err":"${n}","env":"cef"}');`} }`)}function callProcedure(e,r,t){const o=u.__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>3e4){const r=function chunkSubstr(e,r){const t=[];for(let n=0;n<=e.length-1;n+=r)t.push(e.substr(n,Math.min(r,e.length-n)));return t}(o,3e4);r.forEach((o,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&&u[o].then(r=>mp.trigger(c,JSON.stringify([r,e]))),u.__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&&u[o].then(r=>mp.trigger(a,JSON.stringify([r,e]))),u.__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||(u.__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||(u.__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 u[o].then(o=>new Promise(i=>{n.noRet||(u.__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||(u.__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=u.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${n} (${r})`);const s=u.__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=u.__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=u.__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=u.__rpcEvListeners[e]||new Set;return t.add(r),u.__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.3.2",Object.defineProperty(e,"__esModule",{value:!0})});
|
|
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(),u="cef"===f?window:global;if(u[i]||(u.__rpcPartialData={},u[i]=(e,r,t,n,o)=>{"server"!==f&&(o=n,n=t,t=r,r=e),u.__rpcPartialData[r]||(u.__rpcPartialData[r]=new Array(n)),u.__rpcPartialData[r][t]=o,u.__rpcPartialData[r].includes(void 0)||("server"===f?u[s](e,u.__rpcPartialData[r].join("")):u[s](u.__rpcPartialData[r].join("")),delete u.__rpcPartialData[r])}),!u[s]){if(u.__rpcListeners={},u.__rpcPending={},u.__rpcEvListeners={},u[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=>sendEventData(e,r.player);break;case"client":if("server"===n.env)o=e=>sendEventData(e);else if("cef"===n.env){const e=n.b&&u.__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=u.__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 u.__rpcPending[n.id])}},"cef"===f)void 0===u[o]&&(u[o]=new Promise(e=>{window.name?e(window.name):u[`${o}:resolve`]=e}));else if(mp.events.add(s,u[s]),mp.events.add(i,u[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})),u.__rpcBrowsers={};const initBrowser=e=>{const r=generateId();Object.keys(u.__rpcBrowsers).forEach(r=>{const t=u.__rpcBrowsers[r];t&&isBrowserValid(t)&&t!==e||delete u.__rpcBrowsers[r]}),u.__rpcBrowsers[r]=e,e.execute(`\n window.name = '${r}';\n if(typeof window['${o}'] === 'undefined'){\n window['${o}'] = Promise.resolve(window.name);\n }else{\n window['${o}:resolve'](window.name);\n }\n `)};mp.browsers.forEach(initBrowser),mp.events.add("browserCreated",initBrowser),u.__rpcBrowserProcedures={},mp.events.add(c,e=>{const[r,t]=JSON.parse(e);u.__rpcBrowserProcedures[t]=r}),mp.events.add(a,e=>{const[r,t]=JSON.parse(e);u.__rpcBrowserProcedures[t]===r&&delete u.__rpcBrowserProcedures[t]}),register(p,([e,r],t)=>{Object.keys(u.__rpcBrowsers).forEach(n=>{const o=u.__rpcBrowsers[n];o&&isBrowserValid(o)?_callBrowser(o,l,[e,r],{fenv:t.environment,noRet:1}):delete u.__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["${s}"]; if(process){ process(${JSON.stringify(o)}); }else{ ${t?"":`mp.trigger("${s}", '{"ret":1,"id":"${r.id}","err":"${n}","env":"cef"}');`} }`)}function callProcedure(e,r,t){const o=u.__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>3e4){const r=function chunkSubstr(e,r){const t=[];for(let n=0;n<=e.length-1;n+=r)t.push(e.substr(n,Math.min(r,e.length-n)));return t}(o,3e4);r.forEach((o,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&&u[o].then(r=>mp.trigger(c,JSON.stringify([r,e]))),u.__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&&u[o].then(r=>mp.trigger(a,JSON.stringify([r,e]))),u.__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||(u.__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||(u.__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 u[o].then(o=>new Promise(i=>{n.noRet||(u.__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||(u.__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=u.__rpcBrowserProcedures[r];if(!e)return Promise.reject(`${n} (${r})`);const s=u.__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=u.__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=u.__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=u.__rpcEvListeners[e]||new Set;return t.add(r),u.__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.3.4",Object.defineProperty(e,"__esModule",{value:!0})});
|