Browse Source

WIP: impl NchanDelegator

Yuki Takei 5 years ago
parent
commit
0d9737fca9

+ 2 - 0
config/env.dev.js

@@ -6,10 +6,12 @@ module.exports = {
   // NO_CDN: true,
   MONGO_URI: 'mongodb://mongo:27017/growi',
   // REDIS_URI: 'http://redis:6379',
+  // NCHAN_URI: 'http://nchan',
   ELASTICSEARCH_URI: 'http://elasticsearch:9200/growi',
   HACKMD_URI: 'http://localhost:3010',
   HACKMD_URI_FOR_SERVER: 'http://hackmd:3000',
   // DRAWIO_URI: 'http://localhost:8080/?offline=1&https=0',
+  // CONFIG_PUBSUB_SERVER_TYPE: 'nchan',
   PLUGIN_NAMES_TOBE_LOADED: [
     // 'growi-plugin-lsx',
     // 'growi-plugin-pukiwiki-like-linker',

+ 7 - 1
src/server/crowi/index.js

@@ -249,7 +249,13 @@ Crowi.prototype.setupSessionConfig = async function() {
 Crowi.prototype.setupConfigManager = async function() {
   const ConfigManager = require('../service/config-manager');
   this.configManager = new ConfigManager(this.model('Config'));
-  return this.configManager.loadConfigs();
+  await this.configManager.loadConfigs();
+
+  this.configPubsub = require('../service/config-pubsub')(this);
+  if (this.configPubsub != null) {
+    this.configPubsub.subscribe();
+    this.configManager.setPubsub(this.configPubsub);
+  }
 };
 
 Crowi.prototype.setupModels = async function() {

+ 9 - 1
src/server/service/config-manager.js

@@ -1,5 +1,5 @@
 const logger = require('@alias/logger')('growi:service:ConfigManager');
-const ConfigLoader = require('../service/config-loader');
+const ConfigLoader = require('./config-loader');
 
 const KEYS_FOR_LOCAL_STRATEGY_USE_ONLY_ENV_OPTION = [
   'security:passport-local:isEnabled',
@@ -40,6 +40,14 @@ class ConfigManager {
     this.reloadConfigKeys();
   }
 
+  /**
+   * Set ConfigPubsubDelegator instance
+   * @param {ConfigPubsubDelegator} configPubsub
+   */
+  async setPubsub(configPubsub) {
+    this.configPubsub = configPubsub;
+  }
+
   /**
    * get a config specified by namespace & key
    *

+ 5 - 1
src/server/service/config-pubsub/base.js

@@ -8,7 +8,11 @@ class ConfigPubsubDelegator {
     }
   }
 
-  connect() {
+  subscribe() {
+    throw new Error('implement this');
+  }
+
+  publish() {
     throw new Error('implement this');
   }
 

+ 2 - 2
src/server/service/config-pubsub/index.js

@@ -5,7 +5,7 @@ const envToModuleMappings = {
   nchan:   'nchan',
 };
 
-class ConfigPubsubDelegatorFactory {
+class ConfigPubsubFactory {
 
   initializeDelegator(crowi) {
     const type = crowi.configManager.getConfig('crowi', 'configPubsub:serverType');
@@ -36,7 +36,7 @@ class ConfigPubsubDelegatorFactory {
 
 }
 
-const factory = new ConfigPubsubDelegatorFactory();
+const factory = new ConfigPubsubFactory();
 
 module.exports = (crowi) => {
   return factory.getDelegator(crowi);

+ 60 - 2
src/server/service/config-pubsub/nchan.js

@@ -1,5 +1,8 @@
 const logger = require('@alias/logger')('growi:service:config-pubsub:nchan');
 
+// const io = require('socket.io-client');
+const WebSocketClient = require('websocket').client;
+
 const ConfigPubsubDelegator = require('./base');
 
 
@@ -10,13 +13,68 @@ class NchanDelegator extends ConfigPubsubDelegator {
 
     this.publishPath = publishPath;
     this.subscribePath = subscribePath;
+
+    this.socket = null;
+  }
+
+  /**
+   * @inheritdoc
+   */
+  subscribe() {
+    if (this.socket == null) {
+      const client = new WebSocketClient();
+
+      client.on('connectFailed', (error) => {
+        console.log(`Connect Error: ${error.toString()}`);
+      });
+
+      client.on('connect', (connection) => {
+        console.log('WebSocket Client Connected');
+        connection.on('error', (error) => {
+          console.log(`Connection Error: ${error.toString()}`);
+        });
+        connection.on('close', () => {
+          console.log('echo-protocol Connection Closed');
+        });
+        connection.on('message', (message) => {
+          if (message.type === 'utf8') {
+            console.log(`Received: '${message.utf8Data}'`);
+          }
+        });
+      });
+
+      const websocketUri = new URL(this.subscribePath, this.uri);
+      client.connect(websocketUri.toString());
+
+      this.client = client;
+
+
+      // this.socket = io(this.uri, { path: this.subscribePath, transports: ['websocket'] });
+
+      // this.socket.on('connect', (date) => {
+      //   console.log('connected', this.url, { path: this.subscribePath });
+      // });
+      // this.socket.on('connect_error', (error) => {
+      //   console.log('connect error', error);
+      // });
+      // this.socket.on('connect_timeout', (error) => {
+      //   console.log('connect timeout', error);
+      // });
+      // this.socket.on('update', (date) => {
+      //   console.log('received update event', date);
+      // });
+    }
+
+    // if (!this.socket.connected) {
+    //   this.socket.connect();
+    // }
   }
 
   /**
    * @inheritdoc
    */
-  connect() {
-    // TODO implement
+  publish() {
+    throw new Error('implement this');
   }
 
 }