From fcefbc077433a763ce0fd8af5af101433358e17f Mon Sep 17 00:00:00 2001 From: graywolf336 Date: Wed, 21 Feb 2018 16:38:46 -0600 Subject: [PATCH] Work on getting Rocket.Chat Apps to work on multi-instance rocket.chat instances --- .../client/communication/websockets.js | 2 ++ packages/rocketchat-apps/package.js | 2 +- .../server/bridges/activation.js | 30 +++++++--------- .../server/communication/index.js | 5 +-- .../server/communication/rest.js | 2 +- .../server/communication/websockets.js | 36 +++++++++++++++++-- .../rocketchat-apps/server/orchestrator.js | 2 +- .../client/lib/RestApiClient.js | 2 +- 8 files changed, 55 insertions(+), 26 deletions(-) diff --git a/packages/rocketchat-apps/client/communication/websockets.js b/packages/rocketchat-apps/client/communication/websockets.js index 290e23ef74c..1dd694ae89c 100644 --- a/packages/rocketchat-apps/client/communication/websockets.js +++ b/packages/rocketchat-apps/client/communication/websockets.js @@ -8,9 +8,11 @@ export class AppWebsocketReceiver { this.streamer.on('command/disabled', this.onCommandDisabled.bind(this)); this.streamer.on('command/updated', this.onCommandUpdated.bind(this)); this.streamer.on('command/removed', this.onCommandDisabled.bind(this)); + console.log('apps websocket listener'); } onAppAdded(appId) { + console.log('app added'); RocketChat.API.get(`apps/${ appId }/languages`).then((result) => { this.orch.parseAndLoadLanguages(result.languages); }); diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js index 0619a74e435..a145ff3c86e 100644 --- a/packages/rocketchat-apps/package.js +++ b/packages/rocketchat-apps/package.js @@ -87,6 +87,6 @@ Package.onUse(function(api) { Npm.depends({ 'busboy': '0.2.13', - '@rocket.chat/apps-engine': '0.3.5', + '@rocket.chat/apps-engine': '0.3.7', '@rocket.chat/apps-ts-definition': '0.7.6' }); diff --git a/packages/rocketchat-apps/server/bridges/activation.js b/packages/rocketchat-apps/server/bridges/activation.js index a67165bf465..821eaaa6731 100644 --- a/packages/rocketchat-apps/server/bridges/activation.js +++ b/packages/rocketchat-apps/server/bridges/activation.js @@ -3,33 +3,27 @@ export class AppActivationBridge { this.orch = orch; } - appEnabled(app) { - console.log(`The App ${ app.getName() } (${ app.getID() }) has been enabled.`); - } + appAdded(app) { + console.log(`The ${ app.getName() } App (${ app.getID() }) has been added.`); - appDisabled(app) { - console.log(`The App ${ app.getName() } (${ app.getID() }) has been disabled.`); + this.orch.getNotifier().appAdded(app.getID()); } - appLoaded(app, enabled) { - console.log(`The App ${ app.getName() } (${ app.getID() }) has been loaded and enabled? ${ enabled }`); + appUpdated(app) { + console.log(`The ${ app.getName() } App (${ app.getID() }) has been updated.`); - if (enabled) { - this.orch.getNotifier().appAdded(app.getID()); - } + this.orch.getNotifier().appUpdated(app.getID()); } - appUpdated(app, enabled) { - console.log(`The App ${ app.getName() } (${ app.getID() }) has been updated and enabled? ${ enabled }`); + appRemoved(app) { + console.log(`The ${ app.getName() } App (${ app.getID() }) has been removed.`); - if (enabled) { - this.orch.getNotifier().appUpdated(app.getID()); - } + this.orch.getNotifier().appRemoved(app.getID()); } - appRemoved(app) { - console.log(`The App ${ app.getName() } (${ app.getID() }) has been removed.`); + appStatusChanged(app, status) { + console.log(`The ${ app.getName() } App (${ app.getID() }) status has changed: ${ status }`); - this.orch.getNotifier().appRemoved(app.getID()); + this.orch.getNotifier().appStatusUpdated(app.getID(), status); } } diff --git a/packages/rocketchat-apps/server/communication/index.js b/packages/rocketchat-apps/server/communication/index.js index 0e3c11484f0..d62c3a27feb 100644 --- a/packages/rocketchat-apps/server/communication/index.js +++ b/packages/rocketchat-apps/server/communication/index.js @@ -1,9 +1,10 @@ import { AppMethods} from './methods'; import { AppsRestApi } from './rest'; -import { AppWebsocketNotifier } from './websockets'; +import { AppWebsocketNotifier, AppWebsocketListener } from './websockets'; export { AppMethods, AppsRestApi, - AppWebsocketNotifier + AppWebsocketNotifier, + AppWebsocketListener }; diff --git a/packages/rocketchat-apps/server/communication/rest.js b/packages/rocketchat-apps/server/communication/rest.js index a10df7c1084..972466d32a4 100644 --- a/packages/rocketchat-apps/server/communication/rest.js +++ b/packages/rocketchat-apps/server/communication/rest.js @@ -158,7 +158,7 @@ export class AppsRestApi { } }); - this.api.addRoute(':id/languages', { authRequired: true }, { + this.api.addRoute(':id/languages', { authRequired: false }, { get() { console.log(`Getting ${ this.urlParams.id }'s languages..`); const prl = manager.getOneById(this.urlParams.id); diff --git a/packages/rocketchat-apps/server/communication/websockets.js b/packages/rocketchat-apps/server/communication/websockets.js index 80d17e02872..a43eb923803 100644 --- a/packages/rocketchat-apps/server/communication/websockets.js +++ b/packages/rocketchat-apps/server/communication/websockets.js @@ -1,13 +1,41 @@ +export class AppWebsocketListener { + constructor(orch, streamer) { + this.orch = orch; + this.streamer = streamer; + + this.streamer.on('app/added', this.onAppAdded.bind(this)); + this.streamer.on('app/statusUpdate', this.onAppStatusUpdated.bind(this)); + this.streamer.on('app/removed', this.onAppRemoved.bind(this)); + console.log('hello from the app websocket listener'); + } + + onAppAdded(appId) { + console.log('On App Added!', appId); + this.orch.getManager().loadOne(appId).then(() => console.log('yay')); + } + + onAppStatusUpdated({ appId, status }) { + console.log('App Status Update:', appId, status); + } + + onAppRemoved(appId) { + console.log('On App Removed!', appId); + } +} + export class AppWebsocketNotifier { - constructor() { - this.streamer = new Meteor.Streamer('apps', { retransmit: false }); + constructor(orch) { + this.streamer = new Meteor.Streamer('apps', { retransmit: true, retransmitToSelf: true }); this.streamer.allowRead('all'); this.streamer.allowEmit('all'); this.streamer.allowWrite('none'); + + this.listener = new AppWebsocketListener(orch, this.streamer); } appAdded(appId) { this.streamer.emit('app/added', appId); + console.log('emitting: "app/added"', appId); } appRemoved(appId) { @@ -18,6 +46,10 @@ export class AppWebsocketNotifier { this.streamer.emit('app/updated', appId); } + appStatusUpdated(appId, status) { + this.streamer.emit('app/statusUpdate', { appId, status }); + } + commandAdded(command) { this.streamer.emit('command/added', command); } diff --git a/packages/rocketchat-apps/server/orchestrator.js b/packages/rocketchat-apps/server/orchestrator.js index a5178ee07e0..bccd0a9dfd8 100644 --- a/packages/rocketchat-apps/server/orchestrator.js +++ b/packages/rocketchat-apps/server/orchestrator.js @@ -29,7 +29,7 @@ class AppServerOrchestrator { this._communicators = new Map(); this._communicators.set('methods', new AppMethods(this._manager)); - this._communicators.set('notifier', new AppWebsocketNotifier()); + this._communicators.set('notifier', new AppWebsocketNotifier(this)); this._communicators.set('restapi', new AppsRestApi(this, this._manager)); } diff --git a/packages/rocketchat-lib/client/lib/RestApiClient.js b/packages/rocketchat-lib/client/lib/RestApiClient.js index 273652a5cfb..cadcbaed02e 100644 --- a/packages/rocketchat-lib/client/lib/RestApiClient.js +++ b/packages/rocketchat-lib/client/lib/RestApiClient.js @@ -44,7 +44,7 @@ RocketChat.API = { return new Promise(function _rlRestApiGet(resolve, reject) { jQuery.ajax({ method, - url: `${ Meteor.absoluteUrl() }api/${ endpoint }${ query }`, + url: `${ window.location.origin }/api/${ endpoint }${ query }`, headers: { 'Content-Type': 'application/json', 'X-User-Id': localStorage['Meteor.userId'],