diff --git a/src/app/plugin/pluginManager.js b/src/app/plugin/pluginManager.js index 9b06e98804..88d68ebc69 100644 --- a/src/app/plugin/pluginManager.js +++ b/src/app/plugin/pluginManager.js @@ -1,6 +1,7 @@ 'use strict' /** * Register and Manage plugin: + * * Plugin registration is done in the settings tab, * using the following format: * { @@ -8,6 +9,39 @@ * "url": "" * } * + * structure of messages: + * + * - Notification sent by Remix: + *{ + * action: 'notification', + * key: , + * type: , + * value: + *} + * + * - Request sent by the plugin: + *{ + * id: , + * action: 'request', + * key: , + * type: , + * value: + *} + * + * - Response sent by Remix and receive by the plugin: + *{ + * id: , + * action: 'response', + * key: , + * type: , + * value: , + * error: (see below) + *} + * => The `error` property is `undefined` if no error happened. + * => In case of error (due to permission, system error, API error, etc...): + * error: { code, msg (optional), data (optional), stack (optional) + * => possible error code are still to be defined, but the generic one would be 500. + * * Plugin receive 4 types of message: * - focus (when he get focus) * - unfocus (when he loose focus - is hidden) @@ -19,16 +53,20 @@ * CONFIG: * - getConfig(filename). The data to send should be formatted like: * { - * type: 'getConfig', - * arguments: ['filename.ext'], - * id: + * id: , + * action: 'request', + * key: 'config', + * type: 'getConfig', + * value: ['filename.ext'] * } * the plugin will reveice a response like: * { + * id: , + * action: 'response', + * key: 'config', * type: 'getConfig', - * id: * error, - * result + * value: ['content of filename.ext'] * } * same apply for the other call * - setConfig(filename, content) @@ -47,12 +85,14 @@ class PluginManager { if (this.inFocus) { // trigger to the current focus this.post(this.inFocus, JSON.stringify({ + action: 'notification', + key: 'compiler', type: 'compilationFinished', - value: { - success: success, - data: data, - source: source - } + value: [ + success, + data, + source + ] })) } }) @@ -61,37 +101,47 @@ class PluginManager { if (this.inFocus && this.inFocus !== tabName) { // trigger unfocus this.post(this.inFocus, JSON.stringify({ - type: 'unfocus' + action: 'notification', + key: 'app', + type: 'unfocus', + value: [] })) } if (this.plugins[tabName]) { // trigger focus this.post(tabName, JSON.stringify({ - type: 'focus' + action: 'notification', + key: 'app', + type: 'focus', + value: [] })) this.inFocus = tabName this.post(tabName, JSON.stringify({ + action: 'notification', + key: 'compiler', type: 'compilationData', - value: api.compiler.getCompilationResult() + value: [api.compiler.getCompilationResult()] })) } }) window.addEventListener('message', (event) => { - function response (type, callid, error, result) { + function response (key, type, callid, error, result) { self.post(self.inFocus, JSON.stringify({ id: callid, + action: 'response', + key: key, type: type, error: error, - result: result + value: [ result ] })) } if (event.type === 'message' && this.inFocus && this.plugins[this.inFocus] && this.plugins[this.inFocus].origin === event.origin) { var data = JSON.parse(event.data) - data.arguments.unshift(this.inFocus) + data.value.unshift(this.inFocus) if (allowedapi[data.type]) { - data.arguments.push((error, result) => { - response(data.type, data.id, error, result) + data.value.push((error, result) => { + response(data.key, data.type, data.id, error, result) }) api[data.key][data.type].apply({}, data.arguments) }