Add client-->CEF RPC
This commit is contained in:
		
							parent
							
								
									5f26602327
								
							
						
					
					
						commit
						ac3ba8d1eb
					
				
							
								
								
									
										85
									
								
								src/index.js
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								src/index.js
									
									
									
									
									
								
							@ -4,26 +4,29 @@ const environment = util.getEnvironment();
 | 
				
			|||||||
if(!environment) throw 'Unknown RAGE environment';
 | 
					if(!environment) throw 'Unknown RAGE environment';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const PROCESS_EVENT = '__rpc:process';
 | 
					const PROCESS_EVENT = '__rpc:process';
 | 
				
			||||||
 | 
					const PROCEDURE_EXISTS = '__rpc:exists';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const rpc = {};
 | 
					const rpc = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const listeners = {};
 | 
					const listeners = {};
 | 
				
			||||||
const pending = {};
 | 
					const pending = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let passEventToBrowser, passEventToBrowsers;
 | 
				
			||||||
 | 
					if(environment === "client"){
 | 
				
			||||||
 | 
					    passEventToBrowser = (browser, raw) => {
 | 
				
			||||||
 | 
					        browser.execute(`var process = window["${PROCESS_EVENT}"] || function(){}; process('${raw}');`);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    passEventToBrowsers = (raw) => {
 | 
				
			||||||
 | 
					        mp.browsers.forEach(browser => passEventToBrowser(browser, raw));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function callProcedure(name, args, info){
 | 
					async function callProcedure(name, args, info){
 | 
				
			||||||
    if(!listeners[name]) throw 'PROCEDURE_NOT_FOUND';
 | 
					    if(!listeners[name]) throw 'PROCEDURE_NOT_FOUND';
 | 
				
			||||||
    return listeners[name](args, info);
 | 
					    return listeners[name](args, info);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let passEventToBrowsers;
 | 
					 | 
				
			||||||
if(environment === "client"){
 | 
					 | 
				
			||||||
    passEventToBrowsers = (raw) => {
 | 
					 | 
				
			||||||
        mp.browsers.forEach(browser => {
 | 
					 | 
				
			||||||
            browser.execute(`var process = window["${PROCESS_EVENT}"] || function(){}; process('${raw}');`);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const processEvent = (...args) => {
 | 
					const processEvent = (...args) => {
 | 
				
			||||||
    let rawData = args[0];
 | 
					    let rawData = args[0];
 | 
				
			||||||
    if(environment === "server") rawData = args[1];
 | 
					    if(environment === "server") rawData = args[1];
 | 
				
			||||||
@ -45,12 +48,12 @@ const processEvent = (...args) => {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
        if(environment === "server") info.player = args[0];
 | 
					        if(environment === "server") info.player = args[0];
 | 
				
			||||||
        const promise = callProcedure(data.name, data.args, info);
 | 
					        const promise = callProcedure(data.name, data.args, info);
 | 
				
			||||||
        switch(environment){
 | 
					 | 
				
			||||||
            case "server": {
 | 
					 | 
				
			||||||
        const part = {
 | 
					        const part = {
 | 
				
			||||||
            ret: 1,
 | 
					            ret: 1,
 | 
				
			||||||
            id: data.id
 | 
					            id: data.id
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					        switch(environment){
 | 
				
			||||||
 | 
					            case "server": {
 | 
				
			||||||
                if(data.thru) part.thru = 1;
 | 
					                if(data.thru) part.thru = 1;
 | 
				
			||||||
                promise.then(res => {
 | 
					                promise.then(res => {
 | 
				
			||||||
                    info.player.call(PROCESS_EVENT, [util.stringifyData({
 | 
					                    info.player.call(PROCESS_EVENT, [util.stringifyData({
 | 
				
			||||||
@ -66,10 +69,6 @@ const processEvent = (...args) => {
 | 
				
			|||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case "client": {
 | 
					            case "client": {
 | 
				
			||||||
                const part = {
 | 
					 | 
				
			||||||
                    ret: 1,
 | 
					 | 
				
			||||||
                    id: data.id
 | 
					 | 
				
			||||||
                };
 | 
					 | 
				
			||||||
                if(data.env === "server"){
 | 
					                if(data.env === "server"){
 | 
				
			||||||
                    promise.then(res => {
 | 
					                    promise.then(res => {
 | 
				
			||||||
                        mp.events.callRemote(PROCESS_EVENT, util.stringifyData({
 | 
					                        mp.events.callRemote(PROCESS_EVENT, util.stringifyData({
 | 
				
			||||||
@ -97,6 +96,19 @@ const processEvent = (...args) => {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            case "cef": {
 | 
				
			||||||
 | 
					                promise.then(res => {
 | 
				
			||||||
 | 
					                    mp.trigger(PROCESS_EVENT, util.stringifyData({
 | 
				
			||||||
 | 
					                        ...part,
 | 
				
			||||||
 | 
					                        res
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
 | 
					                }).catch(err => {
 | 
				
			||||||
 | 
					                    mp.trigger(PROCESS_EVENT, util.stringifyData({
 | 
				
			||||||
 | 
					                        ...part,
 | 
				
			||||||
 | 
					                        err
 | 
				
			||||||
 | 
					                    }));
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }else if(data.ret){ // a previously called remote procedure has returned
 | 
					    }else if(data.ret){ // a previously called remote procedure has returned
 | 
				
			||||||
        const info = pending[data.id];
 | 
					        const info = pending[data.id];
 | 
				
			||||||
@ -110,6 +122,7 @@ const processEvent = (...args) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if(environment === "cef"){
 | 
					if(environment === "cef"){
 | 
				
			||||||
    window[PROCESS_EVENT] = processEvent;
 | 
					    window[PROCESS_EVENT] = processEvent;
 | 
				
			||||||
 | 
					    window[PROCEDURE_EXISTS] = name => !!listeners[name];
 | 
				
			||||||
}else{
 | 
					}else{
 | 
				
			||||||
    mp.events.add(PROCESS_EVENT, processEvent);
 | 
					    mp.events.add(PROCESS_EVENT, processEvent);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -193,6 +206,8 @@ rpc.callServer = (name, args) => {
 | 
				
			|||||||
 * @param args - Any parameters for the procedure.
 | 
					 * @param args - Any parameters for the procedure.
 | 
				
			||||||
 * @returns {Promise} - The result from the procedure.
 | 
					 * @returns {Promise} - The result from the procedure.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					//callClient(player, name, args)
 | 
				
			||||||
 | 
					//callClient(name, args)
 | 
				
			||||||
rpc.callClient = (player, name, args) => {
 | 
					rpc.callClient = (player, name, args) => {
 | 
				
			||||||
    if(typeof player === "string"){
 | 
					    if(typeof player === "string"){
 | 
				
			||||||
        if(environment === "server") return Promise.reject('This syntax can only be used in browser and client environments.');
 | 
					        if(environment === "server") return Promise.reject('This syntax can only be used in browser and client environments.');
 | 
				
			||||||
@ -239,4 +254,44 @@ rpc.callClient = (player, name, args) => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rpc.callBrowser = async (name, args) => {
 | 
				
			||||||
 | 
					    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 => {
 | 
				
			||||||
 | 
					                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 new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					            pending[id] = {
 | 
				
			||||||
 | 
					                resolve,
 | 
				
			||||||
 | 
					                reject
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            passEventToBrowser(browser, util.stringifyData({
 | 
				
			||||||
 | 
					                req: 1,
 | 
				
			||||||
 | 
					                id,
 | 
				
			||||||
 | 
					                name,
 | 
				
			||||||
 | 
					                env: environment,
 | 
				
			||||||
 | 
					                args
 | 
				
			||||||
 | 
					            }));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return Promise.reject('PROCEDURE_NOT_FOUND');
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = rpc;
 | 
					module.exports = rpc;
 | 
				
			||||||
		Reference in New Issue
	
	Block a user