You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vizality/renderer/src/builtins/rpc/index.js

119 lines
3.7 KiB

import { patch, unpatch } from '@vizality/patcher';
import { getModule } from '@vizality/webpack';
import { Builtin } from '@vizality/entities';
import { HTTP } from '@vizality/constants';
export default class RPC extends Builtin {
start () {
return;
this.handlers = getModule('events', 'commands');
this._patchWebSocketServer();
this._boundAddEvent = this._addEvent.bind(this);
this._boundAddCommand = this._addCommand.bind(this);
this._boundRemoveEvent = this._removeEvent.bind(this);
this._boundRemoveCommand = this._removeCommand.bind(this);
vizality.api.rpc.registerScope('VIZALITY_PRIVATE', w => w === HTTP.WEBSITE);
vizality.api.rpc.on('eventAdd', this._boundAddEvent);
vizality.api.rpc.on('commandAdd', this._boundAddCommand);
vizality.api.rpc.on('eventRemove', this._boundRemoveEvent);
vizality.api.rpc.on('commandRemove', this._boundRemoveCommand);
vizality.api.rpc.registerCommand({
id: 'IS_VIZALITY',
scope: 'VIZALITY_PRIVATE',
handler: () => {
return 'true';
}
});
vizality.api.rpc.registerCommand({
id: 'VIZALITY_GET_INFO',
scope: 'VIZALITY_PRIVATE',
handler: () => {
return {
git: vizality.git,
plugins: vizality.manager.plugins.keys.map(k => ({
manifest: vizality.manager.plugins.get(k).manifest,
addonId: k,
enabled: vizality.manager.plugins.isEnabled(k)
})),
themes: vizality.manager.themes.keys.map(k => ({
manifest: vizality.manager.themes.get(k).manifest,
addonId: k,
enabled: vizality.manager.themes.isEnabled(k)
})),
builtins: vizality.manager.builtins.keys.map(k => ({
addonId: k,
enabled: vizality.manager.builtins.isEnabled(k)
}))
};
}
});
vizality.api.rpc.registerCommand({
id: 'VIZALITY_NAVIGATE',
scope: 'VIZALITY_PRIVATE',
handler: evt => {
return vizality.api.routes.navigateTo(evt.args);
}
});
}
stop () {
unpatch('vz-rpc-webSocket');
unpatch('vz-rpc-webSocket-promise');
vizality.api.rpc.unregisterCommand('IS_VIZALITY');
vizality.api.rpc.unregisterCommand('VIZALITY_GET_INFO');
vizality.api.rpc.unregisterCommand('VIZALITY_NAVIGATE');
vizality.api.rpc.unregisterScope('VIZALITY_PRIVATE');
vizality.api.rpc.off('eventAdd', this._boundAddEvent);
vizality.api.rpc.off('commandAdd', this._boundAddCommand);
vizality.api.rpc.off('eventRemove', this._boundRemoveEvent);
vizality.api.rpc.off('commandRemove', this._boundRemoveCommand);
}
async _patchWebSocketServer () {
const websocketHandler = getModule('validateSocketClient');
patch('vz-rpc-webSocket', websocketHandler, 'validateSocketClient', args => {
if (args[2] === 'vizality') {
args[2] = void 0;
args[3] = 'vizality';
}
return args;
}, true);
patch('vz-rpc-webSocket-promise', websocketHandler, 'validateSocketClient', (args, res) => {
if (args[3] === 'vizality') {
res.catch(() => void 0);
args[0].authorization.scopes = [
'VIZALITY',
...Object.keys(vizality.api.rpc.scopes).filter(s => vizality.api.rpc.scopes[s].grant(args[1]))
];
return Promise.resolve(null);
}
return res;
});
}
_addEvent (event) {
this.handlers.events[event] = vizality.api.rpc.events[event];
}
_addCommand (command) {
this.handlers.commands[command] = vizality.api.rpc.commands[command];
}
_removeEvent (event) {
delete this.handlers.events[event];
}
_removeCommand (command) {
delete this.handlers.commands[command];
}
}