Direct callBrowsers call to single browser instance

This commit is contained in:
Micah Allen committed 2019-01-12 13:06:59 -05:00
1 parent 92250e1f29
commit 85e435ea1d
2 files changed
+56 -59

No files matched your search

+1 -1
View File
@@ -1 +1 @@
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.rpc=r():e.rpc=r()}("undefined"!=typeof self?self:this,function(){return function(e){var r={};function n(t){if(r[t])return r[t].exports;var o=r[t]={i:t,l:!1,exports:{}};return e[t].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=r,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,r){if(1&r&&(e=n(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)n.d(t,o,function(r){return e[r]}.bind(null,o));return t},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},n.p="",n(n.s=1)}([function(e,r,n){"use strict";function t(){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 o(){return mp.joaat?"server":mp.game&&mp.game.joaat?"client":mp.trigger?"cef":void 0}function c(e){return JSON.stringify(e)}function s(e){return JSON.parse(e)}function i(e){try{e.url}catch(e){return!1}return!0}n.d(r,"e",function(){return t}),n.d(r,"a",function(){return o}),n.d(r,"d",function(){return c}),n.d(r,"c",function(){return s}),n.d(r,"b",function(){return i})},function(e,r,n){"use strict";n.r(r),function(e){n.d(r,"register",function(){return p}),n.d(r,"unregister",function(){return d}),n.d(r,"call",function(){return m}),n.d(r,"callServer",function(){return v}),n.d(r,"callClient",function(){return _}),n.d(r,"callBrowsers",function(){return b}),n.d(r,"callBrowser",function(){return y});var t=n(0);const o=t.a();if(!o)throw"Unknown RAGE environment";const c="PROCEDURE_NOT_FOUND",s="__rpc:id",i="__rpc:process",a="__rpc:exists",l="cef"===o?window:e;if(!l[i])if(l.__rpcListeners={},l.__rpcPending={},l[i]=((e,r)=>{"server"!==o&&(r=e);const n=t.c(r);if(n.req){const c={id:n.id,environment:n.fenv||n.env};"server"===o&&(c.player=e);const s=f(n.name,n.args,c),a={ret:1,id:n.id,env:o};let p;switch(o){case"server":p=(e=>c.player.call(i,[t.d(e)]));break;case"client":if("server"===n.env)p=(e=>mp.events.callRemote(i,t.d(e)));else if("cef"===n.env){const e=n.b&&l.__rpcBrowsers[n.b];v("log",`RECV EVENT FROM BROWSER ${n.b} (EXISTS ${!!e} AND ${!!e&&t.b(e)}) ON CLIENT: ${r}`),p=(r=>e&&t.b(e)&&u(e,r,!0))}break;case"cef":p=(e=>mp.trigger(i,t.d(e)))}p&&s.then(e=>p({...a,res:e})).catch(e=>p({...a,err:e}))}else if(n.ret){const r=l.__rpcPending[n.id];if("server"===o&&r.player!==e)return;r&&(n.err?r.reject(n.err):r.resolve(n.res),l.__rpcPending[n.id]=void 0)}}),"cef"===o)window[a]=(e=>!!l.__rpcListeners[e]);else if(mp.events.add(i,l[i]),"client"===o){p("__rpc:callServer",([e,r],n)=>g(e,r,{fenv:n.environment})),p("__rpc:callBrowsers",([e,r],n)=>h(e,r,null,{fenv:n.environment})),l.__rpcBrowsers={};const e=e=>{const r=t.e();Object.keys(l.__rpcBrowsers).forEach(r=>{l.__rpcBrowsers[r]===e&&delete l.__rpcBrowsers[r]}),l.__rpcBrowsers[r]=e,e.execute(`window['${s}'] = '${r}';`)};mp.browsers.forEach(e),mp.events.add("browserCreated",e)}function u(e,r,n){const o=t.d(r);v("log",`PASSING EVENT TO BROWSER ${o}`),e.execute(`var process = window["${i}"]; if(process){ process('${o}'); }else{ ${n?"":`mp.trigger("${i}", '{"ret":1,"id":"${r.id}","err":"${c}","env":"cef"}');`} }`)}async function f(e,r,n){const t=l.__rpcListeners[e];if(!t)throw c;return t(r,n)}function p(e,r){if(2!==arguments.length)throw'register expects 2 arguments: "name" and "cb"';l.__rpcListeners[e]=r}function d(e){if(1!==arguments.length)throw'unregister expects 1 argument: "name"';l.__rpcListeners[e]=void 0}function m(e,r){return 1!==arguments.length&&2!==arguments.length?Promise.reject('call expects 1 or 2 arguments: "name" and optional "args"'):f(e,r,{environment:o})}function g(e,r,n={}){switch(o){case"server":return m(e,r);case"client":{const c=t.e();return new Promise((s,a)=>{l.__rpcPending[c]={resolve:s,reject:a};const u={req:1,id:c,name:e,env:o,args:r,...n};mp.events.callRemote(i,t.d(u))})}case"cef":return _("__rpc:callServer",[e,r])}}function v(e,r){return 1!==arguments.length&&2!==arguments.length?Promise.reject('callServer expects 1 or 2 arguments: "name" and optional "args"'):g(e,r,{})}function _(e,r,n){switch(o){case"client":return n=r,r=e,1!==arguments.length&&2!==arguments.length||"string"!=typeof r?Promise.reject('callClient from the client expects 1 or 2 arguments: "name" and optional "args"'):m(r,n);case"server":{if(2!==arguments.length&&3!==arguments.length||"object"!=typeof e)return Promise.reject('callClient from the server expects 2 or 3 argumentsLine truncated
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.rpc=r():e.rpc=r()}("undefined"!=typeof self?self:this,function(){return function(e){var r={};function n(t){if(r[t])return r[t].exports;var o=r[t]={i:t,l:!1,exports:{}};return e[t].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=r,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,r){if(1&r&&(e=n(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)n.d(t,o,function(r){return e[r]}.bind(null,o));return t},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},n.p="",n(n.s=1)}([function(e,r,n){"use strict";function t(){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 o(){return mp.joaat?"server":mp.game&&mp.game.joaat?"client":mp.trigger?"cef":void 0}function c(e){return JSON.stringify(e)}function s(e){return JSON.parse(e)}function i(e){try{e.url}catch(e){return!1}return!0}n.d(r,"e",function(){return t}),n.d(r,"a",function(){return o}),n.d(r,"d",function(){return c}),n.d(r,"c",function(){return s}),n.d(r,"b",function(){return i})},function(e,r,n){"use strict";n.r(r),function(e){n.d(r,"register",function(){return d}),n.d(r,"unregister",function(){return m}),n.d(r,"call",function(){return g}),n.d(r,"callServer",function(){return v}),n.d(r,"callClient",function(){return w}),n.d(r,"callBrowsers",function(){return y}),n.d(r,"callBrowser",function(){return P});var t=n(0);const o=t.a();if(!o)throw"Unknown RAGE environment";const c="PROCEDURE_NOT_FOUND",s="__rpc:id",i="__rpc:process",a="__rpc:browserRegister",l="__rpc:browserUnregister",u="cef"===o?window:e;if(!u[i])if(u.__rpcListeners={},u.__rpcPending={},u[i]=((e,r)=>{"server"!==o&&(r=e);const n=t.c(r);if(n.req){const r={id:n.id,environment:n.fenv||n.env};"server"===o&&(r.player=e);const c=p(n.name,n.args,r),s={ret:1,id:n.id,env:o};let a;switch(o){case"server":a=(e=>r.player.call(i,[t.d(e)]));break;case"client":if("server"===n.env)a=(e=>mp.events.callRemote(i,t.d(e)));else if("cef"===n.env){const e=n.b&&u.__rpcBrowsers[n.b];a=(r=>e&&t.b(e)&&f(e,r,!0))}break;case"cef":a=(e=>mp.trigger(i,t.d(e)))}a&&c.then(e=>a({...s,res:e})).catch(e=>a({...s,err:e}))}else if(n.ret){const r=u.__rpcPending[n.id];if("server"===o&&r.player!==e)return;r&&(n.err?r.reject(n.err):r.resolve(n.res),delete u.__rpcPending[n.id])}}),"cef"!==o){if(mp.events.add(i,u[i]),"client"===o){d("__rpc:callServer",([e,r],n)=>_(e,r,{fenv:n.environment})),d("__rpc:callBrowsers",([e,r],n)=>b(null,e,r,{fenv:n.environment})),u.__rpcBrowsers={};const e=e=>{const r=t.e();Object.keys(u.__rpcBrowsers).forEach(r=>{const n=u.__rpcBrowsers[r];n&&t.b(n)&&n!==e||delete u.__rpcBrowsers[r]}),u.__rpcBrowsers[r]=e,e.execute(`if(typeof window['${s}'] === 'undefined'){ window['${s}'] = Promise.resolve('${r}'); }else{ window['${s}:resolve']('${r}'); }`)};mp.browsers.forEach(e),mp.events.add("browserCreated",e),u.__rpcBrowserProcedures={},mp.events.add(a,e=>{const[r,n]=JSON.parse(e);u.__rpcBrowserProcedures[n]=r}),mp.events.add(l,e=>{const[r,n]=JSON.parse(e);u.__rpcBrowserProcedures[n]===r&&delete u.__rpcBrowserProcedures[n]})}}else void 0===u[s]&&(u[s]=new Promise(e=>{u[s+":resolve"]=e}));function f(e,r,n){const o=t.d(r);e.execute(`var process = window["${i}"]; if(process){ process('${o}'); }else{ ${n?"":`mp.trigger("${i}", '{"ret":1,"id":"${r.id}","err":"${c}","env":"cef"}');`} }`)}async function p(e,r,n){const t=u.__rpcListeners[e];if(!t)throw c;return t(r,n)}function d(e,r){if(2!==arguments.length)throw'register expects 2 arguments: "name" and "cb"';"cef"===o&&u[s].then(r=>mp.trigger(a,JSON.stringify([r,e]))),u.__rpcListeners[e]=r}function m(e){if(1!==arguments.length)throw'unregister expects 1 argument: "name"';"cef"===o&&u[s].then(r=>mp.trigger(l,JSON.stringify([r,e]))),u.__rpcListeners[e]=void 0}function g(e,r){return 1!==arguments.length&&2!==arguments.length?Promise.reject('call expects 1 or 2 arguments: "name" and optional "args"'):p(e,r,{environment:o})}function _(e,r,n={}){switch(o){case"server":return g(e,r);case"client":{const c=t.e();return new Promise((s,a)=>{u.__rpcPending[c]={resolve:s,reject:a};const l={req:1,id:c,name:e,env:o,args:r,...n};mp.events.callRemote(i,t.d(l))})}case"cef":return w("__rpc:callServer",[e,r])}}function v(e,r){return 1!==arguments.length&&2!==arguments.length?Promise.reject('callServer expects 1 or 2 arguments: "name" and optional "args"'Line truncated
+55 -58
View File
@@ -7,7 +7,8 @@ const ERR_NOT_FOUND = 'PROCEDURE_NOT_FOUND';
const IDENTIFIER = '__rpc:id';
const PROCESS_EVENT = '__rpc:process';
const PROCEDURE_EXISTS = '__rpc:exists';
const BROWSER_REGISTER = '__rpc:browserRegister';
const BROWSER_UNREGISTER = '__rpc:browserUnregister';
const glob = environment === "cef" ? window : global;
@@ -56,14 +57,12 @@ if(!glob[PROCESS_EVENT]){
if(info){
if(data.err) info.reject(data.err);
else info.resolve(data.res);
glob.__rpcPending[data.id] = undefined;
delete glob.__rpcPending[data.id];
}
}
};
if(environment === "cef"){
window[PROCEDURE_EXISTS] = (name: string) => !!glob.__rpcListeners[name];
}else{
if(environment !== "cef"){
mp.events.add(PROCESS_EVENT, glob[PROCESS_EVENT]);
if(environment === "client"){
@@ -74,34 +73,48 @@ if(!glob[PROCESS_EVENT]){
});
});
register('__rpc:callBrowsers', ([name, args], info) => {
return _callBrowsers(name, args, null, {
return _callBrowsers(null, name, args, {
fenv: info.environment
});
});
// set up browser identifiers
glob.__rpcBrowsers = {};
const initBrowser = (browser: Browser): void => {
const id = util.uid();
Object.keys(glob.__rpcBrowsers).forEach(key => {
if(glob.__rpcBrowsers[key] === browser) delete glob.__rpcBrowsers[key];
const b = glob.__rpcBrowsers[key];
if(!b || !util.isBrowserValid(b) || b === browser) delete glob.__rpcBrowsers[key];
});
glob.__rpcBrowsers[id] = browser;
browser.execute(`window['${IDENTIFIER}'] = '${id}';`);
browser.execute(`if(typeof window['${IDENTIFIER}'] === 'undefined'){ window['${IDENTIFIER}'] = Promise.resolve('${id}'); }else{ window['${IDENTIFIER}:resolve']('${id}'); }`);
};
mp.browsers.forEach(initBrowser);
mp.events.add('browserCreated', initBrowser);
// set up browser registration map
glob.__rpcBrowserProcedures = {};
mp.events.add(BROWSER_REGISTER, (data: string) => {
const [browserId, name] = JSON.parse(data);
glob.__rpcBrowserProcedures[name] = browserId;
});
mp.events.add(BROWSER_UNREGISTER, (data: string) => {
const [browserId, name] = JSON.parse(data);
if(glob.__rpcBrowserProcedures[name] === browserId) delete glob.__rpcBrowserProcedures[name];
});
}
}else{
if(typeof glob[IDENTIFIER] === 'undefined'){
glob[IDENTIFIER] = new Promise(resolve => {
glob[IDENTIFIER+':resolve'] = resolve;
});
}
}
}
function passEventToBrowser(browser: Browser, data: Event, ignore: boolean): void {
function passEventToBrowser(browser: Browser, data: Event, ignoreNotFound: boolean): void {
const raw = util.stringifyData(data);
browser.execute(`var process = window["${PROCESS_EVENT}"]; if(process){ process('${raw}'); }else{ ${ignore ? '' : `mp.trigger("${PROCESS_EVENT}", '{"ret":1,"id":"${data.id}","err":"${ERR_NOT_FOUND}","env":"cef"}');`} }`);
}
function passEventToBrowsers(data: Event, ignore: boolean): void {
mp.browsers.forEach((browser: Browser) => passEventToBrowser(browser, data, ignore));
browser.execute(`var process = window["${PROCESS_EVENT}"]; if(process){ process('${raw}'); }else{ ${ignoreNotFound ? '' : `mp.trigger("${PROCESS_EVENT}", '{"ret":1,"id":"${data.id}","err":"${ERR_NOT_FOUND}","env":"cef"}');`} }`);
}
async function callProcedure(name: string, args: any, info: ProcedureListenerInfo){
@@ -117,6 +130,7 @@ async function callProcedure(name: string, args: any, info: ProcedureListenerInf
*/
export function register(name: string, cb: ProcedureListener): void {
if(arguments.length !== 2) throw 'register expects 2 arguments: "name" and "cb"';
if(environment === "cef") glob[IDENTIFIER].then((id: string) => mp.trigger(BROWSER_REGISTER, JSON.stringify([id, name])));
glob.__rpcListeners[name] = cb;
}
@@ -126,6 +140,7 @@ export function register(name: string, cb: ProcedureListener): void {
*/
export function unregister(name: string): void {
if(arguments.length !== 1) throw 'unregister expects 1 argument: "name"';
if(environment === "cef") glob[IDENTIFIER].then((id: string) => mp.trigger(BROWSER_UNREGISTER, JSON.stringify([id, name])));
glob.__rpcListeners[name] = undefined;
}
@@ -228,20 +243,22 @@ export function callClient(player: Player | string, name?: string | any, args?:
name = player;
if((arguments.length !== 1 && arguments.length !== 2) || typeof name !== "string") return Promise.reject('callClient from the browser expects 1 or 2 arguments: "name" and optional "args"');
const id = util.uid();
return new Promise((resolve, reject) => {
glob.__rpcPending[id] = {
resolve,
reject
};
const event: Event = {
b: glob[IDENTIFIER],
req: 1,
id,
name,
env: environment,
args
};
mp.trigger(PROCESS_EVENT, util.stringifyData(event));
return glob[IDENTIFIER].then((browserId: string) => {
return new Promise((resolve, reject) => {
glob.__rpcPending[id] = {
resolve,
reject
};
const event: Event = {
b: browserId,
req: 1,
id,
name,
env: environment,
args
};
mp.trigger(PROCESS_EVENT, util.stringifyData(event));
});
});
}
}
@@ -266,37 +283,17 @@ function _callBrowser(id: string, browser: Browser, name: string, args?: any, ex
async function _callBrowsers(player: Player, name: string, args?: any, extraData = {}): Promise<any> {
switch(environment){
case "client": {
case "client":
const id = util.uid();
const numBrowsers = mp.browsers.length;
let browser;
for(let i = 0; i < numBrowsers; i++){
const b = mp.browsers.at(i);
await new Promise(resolve => {
const existsHandler = (str: string) => {
const parts = str.split(':');
if(parts[0] === id){
if(+parts[1]){
browser = b;
}
}
mp.events.remove(PROCEDURE_EXISTS, existsHandler);
resolve();
};
mp.events.add(PROCEDURE_EXISTS, existsHandler);
b.execute(`var f = window["${PROCEDURE_EXISTS}"]; mp.trigger("${PROCEDURE_EXISTS}", "${id}:"+((f && f("${name}")) ? 1 : 0));`);
});
if(browser) break;
}
if(browser) return _callBrowser(id, browser, name, args, extraData);
throw ERR_NOT_FOUND;
}
case "server": {
const browserId = glob.__rpcBrowserProcedures[name];
if(!browserId) throw ERR_NOT_FOUND;
const browser = glob.__rpcBrowsers[browserId];
if(!browser || !util.isBrowserValid(browser)) throw ERR_NOT_FOUND;
return _callBrowser(id, browser, name, args, extraData);
case "server":
return callClient(player, '__rpc:callBrowsers', [name, args]);
}
case "cef": {
case "cef":
return callClient('__rpc:callBrowsers', [name, args]);
}
}
}
@@ -315,7 +312,7 @@ export function callBrowsers(player: Player | string, name?: string | any, args?
case "client":
case "cef":
if(arguments.length !== 1 && arguments.length !== 2) return Promise.reject('callBrowsers from the client or browser expects 1 or 2 arguments: "name" and optional "args"');
return _callBrowsers(undefined, player as string, name, {});
return _callBrowsers(null, player as string, name, {});
case "server":
if(arguments.length !== 2 && arguments.length !== 3) return Promise.reject('callBrowsers from the server expects 2 or 3 arguments: "player", "name", and optional "args"');
return _callBrowsers(player as Player, name, args, {});