Yuki Takei 5 лет назад
Родитель
Сommit
7ca2a23d42

+ 1 - 0
config/logger/config.dev.js

@@ -16,6 +16,7 @@ module.exports = {
   'growi:routes:login-passport': 'debug',
   'growi:middleware:safe-redirect': 'debug',
   'growi:service:PassportService': 'debug',
+  'growi:service:config-pubsub:*': 'debug',
   // 'growi:service:ConfigManager': 'debug',
   'growi:lib:search': 'debug',
   // 'growi:service:GlobalNotification': 'debug',

+ 4 - 0
src/server/models/vo/config-pubsub-message.js

@@ -7,6 +7,10 @@ class ConfigPubsubMessage {
     }
   }
 
+  setPublisherUid(uid) {
+    this.publisherUid = uid;
+  }
+
   static parse(messageString) {
     const body = JSON.parse(messageString);
 

+ 11 - 2
src/server/service/config-pubsub/base.js

@@ -1,6 +1,11 @@
+const logger = require('@alias/logger')('growi:service:config-pubsub:base');
+
+const ConfigPubsubMessageHandlable = require('../config-pubsub/handlable');
+
 class ConfigPubsubDelegator {
 
   constructor(uri) {
+    this.uid = Math.floor(Math.random() * 100000);
     this.uri = uri;
 
     if (uri == null) {
@@ -21,7 +26,7 @@ class ConfigPubsubDelegator {
    * @param {ConfigPubsubMessage} configPubsubMessage
    */
   async publish(configPubsubMessage) {
-    throw new Error('implement this');
+    configPubsubMessage.setPublisherUid(this.uid);
   }
 
   /**
@@ -29,7 +34,11 @@ class ConfigPubsubDelegator {
    * @param {ConfigPubsubMessageHandlable} handlable
    */
   addMessageHandler(handlable) {
-    throw new Error('implement this');
+    if (!(handlable instanceof ConfigPubsubMessageHandlable)) {
+      logger.warn('Unsupported instance');
+      logger.debug('Unsupported instance: ', handlable);
+      return;
+    }
   }
 
 }

+ 13 - 8
src/server/service/config-pubsub/nchan.js

@@ -5,7 +5,6 @@ const axios = require('axios');
 const WebSocketClient = require('websocket').client;
 
 const ConfigPubsubMessage = require('../../models/vo/config-pubsub-message');
-const ConfigPubsubMessageHandlable = require('../config-pubsub/handlable');
 const ConfigPubsubDelegator = require('./base');
 
 
@@ -69,7 +68,10 @@ class NchanDelegator extends ConfigPubsubDelegator {
    * @inheritdoc
    */
   async publish(configPubsubMessage) {
+    await super.publish(configPubsubMessage);
+
     logger.debug('Publish message', configPubsubMessage);
+
     const url = this.constructUrl(this.publishPath).toString();
     return axios.post(url, JSON.stringify(configPubsubMessage));
   }
@@ -78,11 +80,7 @@ class NchanDelegator extends ConfigPubsubDelegator {
    * @inheritdoc
    */
   addMessageHandler(handlable) {
-    if (!(handlable instanceof ConfigPubsubMessageHandlable)) {
-      logger.warn('Unsupported instance');
-      logger.debug('Unsupported instance: ', handlable);
-      return;
-    }
+    super.addMessageHandler(handlable);
 
     this.handlableList.push(handlable);
 
@@ -146,10 +144,17 @@ class NchanDelegator extends ConfigPubsubDelegator {
     try {
       const configPubsubMessage = ConfigPubsubMessage.parse(message.utf8Data);
 
+      // check uid
+      if (configPubsubMessage.publisherUid === this.uid) {
+        logger.debug('This message will not be processed because this is sent by the publisher itself: ', this.uid);
+        return;
+      }
+
+      // check shouldHandleConfigPubsubMessage
       const shouldHandle = handlable.shouldHandleConfigPubsubMessage(configPubsubMessage);
-      logger.debug(`shouldHandle: ${shouldHandle}`, configPubsubMessage);
+      logger.debug(`${handlable.constructor.name}.shouldHandle(`, configPubsubMessage, `) => ${shouldHandle}`);
 
-      if (handlable.shouldHandleConfigPubsubMessage(configPubsubMessage)) {
+      if (shouldHandle) {
         handlable.handleConfigPubsubMessage(configPubsubMessage);
       }
     }