Browse Source

Add rpc_ts base

ghorsington 3 years ago
parent
commit
b792ea7fa8
11 changed files with 84 additions and 17 deletions
  1. 3 0
      bot/package.json
  2. 2 0
      bot/src/main.ts
  3. 24 0
      bot/src/rpc.ts
  4. 3 4
      docker-compose.yml
  5. 6 11
      shared/src/rpc/backend.ts
  6. 9 1
      web/.eslintrc.json
  7. 3 0
      web/package.json
  8. 15 0
      web/src/environment.ts
  9. 8 0
      web/src/rpc.ts
  10. 1 0
      web/src/server.ts
  11. 10 1
      web/tsconfig.json

+ 3 - 0
bot/package.json

@@ -41,6 +41,7 @@
       "discord.js": "^12.2.0",
       "dotenv": "^8.2.0",
       "emoji-regex": "^9.0.0",
+      "express": "^4.17.1",
       "form-data": "^3.0.0",
       "got": "^11.2.0",
       "html2bbcode": "^1.2.6",
@@ -57,10 +58,12 @@
       "pg": "^8.2.1",
       "reflect-metadata": "^0.1.13",
       "rimraf": "^3.0.2",
+      "rpc_ts": "^2.1.0",
       "rss-parser": "^3.8.0",
       "sha1": "^1.1.1",
       "tsconfig-paths": "^3.9.0",
       "turndown": "^6.0.0",
+      "type-zoo": "^3.4.1",
       "typeorm": "^0.2.25",
       "typescript": "^3.9.3",
       "typescript-rest-rpc": "^1.0.10",

+ 2 - 0
bot/src/main.ts

@@ -9,6 +9,7 @@ import { assertOk } from "./util";
 import { DB_ENTITIES } from "@shared/db/entities";
 import { logger } from "./logging";
 import { PluginManager } from "./plugin_manager";
+import { startRpcServer } from "./rpc";
 
 export const plgMgr: PluginManager = new PluginManager(path.resolve(path.dirname(module.filename), "plugins"));
 export const COMMAND_PREFIX = "/";
@@ -65,6 +66,7 @@ async function main() {
         entities: DB_ENTITIES
     });
 
+    startRpcServer();
     client.bot.login(process.env.BOT_TOKEN);
 }
 

+ 24 - 0
bot/src/rpc.ts

@@ -0,0 +1,24 @@
+import express from "express";
+import { createServer } from "http";
+import { ModuleRpcServer } from "rpc_ts/lib/server";
+import { ModuleRpcProtocolServer } from "rpc_ts/lib/protocol/server";
+import { NoctBotService } from "@shared/rpc/backend";
+import { logger } from "./logging";
+
+const PORT = +(process.env.WEB_PORT ?? "8181");
+
+
+const app = express();
+
+const handler: ModuleRpcServer.ServiceHandlerFor<typeof NoctBotService> = {
+    async getPing({ ping }): Promise<{ text: string }> {
+        return { text: `pong: ${ping}` };
+    }
+};
+
+app.use(ModuleRpcProtocolServer.registerRpcRoutes(NoctBotService, handler));
+
+export function startRpcServer(): void {
+    logger.info(`Starting RPC at *:${PORT}`);
+    createServer(app).listen(PORT);
+}

+ 3 - 4
docker-compose.yml

@@ -10,8 +10,7 @@ services:
     depends_on:
       - db
       - facedetect
-    env_file: 
-      - .env
+    env_file:
       - db.env
     volumes: 
       - ./bot/stickers:/app/bot/stickers
@@ -42,8 +41,8 @@ services:
     restart: unless-stopped
     depends_on:
       - db
+      - noctbot
     env_file:
-      - .env
       - db.env
     environment:
       NODE_ENV: production
@@ -57,7 +56,7 @@ services:
     image: postgres
     restart: unless-stopped
     env_file:
-      - ./db.env
+      - db.env
     environment: 
       POSTGRES_PASSWORD: ${DB_PASSWORD}
       POSTGRES_USER: ${DB_USERNAME}

+ 6 - 11
shared/src/rpc/backend.ts

@@ -1,11 +1,6 @@
-export interface Backend {
-    getModeratorUserInfo({ id }: { id: string }): Promise<UserInfo>;
-}
-
-export interface UserInfo {
-    username: string;
-    avatarURL: string;
-    userId: string;
-    guildId: string;
-    timestamp: Date;
-}
+export const NoctBotService = {
+    getPing: {
+        request: {} as { ping: string },
+        response: {} as { text: string },
+    }
+};

+ 9 - 1
web/.eslintrc.json

@@ -1,7 +1,8 @@
 {
 	"extends": [
 		"eslint:recommended",
-		"airbnb-base"
+		"airbnb-base",
+		"plugin:import/typescript"
 	],
 	"parserOptions": {
 		"ecmaVersion": 11,
@@ -13,6 +14,13 @@
 		"browser": true,
 		"es2020": true
 	},
+	"settings": {
+		"import/resolver": {
+		  "typescript": {
+			  "project": "./web"
+		  }
+		}
+	},
 	"rules": {
 		"class-methods-use-this": "off",
 		"import/extensions": [

+ 3 - 0
web/package.json

@@ -27,9 +27,12 @@
 		"start": "node __sapper__/build"
 	},
 	"dependencies": {
+		"@improbable-eng/grpc-web-node-http-transport": "^0.13.0",
 		"compression": "^1.7.4",
+		"dotenv": "^8.2.0",
 		"express": "^4.17.1",
 		"node-fetch": "^2.6.0",
+		"rpc_ts": "^2.1.0",
 		"sirv": "^1.0.5"
 	},
 	"devDependencies": {

+ 15 - 0
web/src/environment.ts

@@ -0,0 +1,15 @@
+import dotenv from "dotenv";
+
+if (process.env.NODE_ENV === "development") {
+    dotenv.config({
+        path: "../.env",
+    });
+    dotenv.config({
+        path: "../db.env",
+    });
+
+    process.env.TYPEORM_HOST = "localhost";
+    process.env.TYPEORM_USERNAME = process.env.DB_USERNAME;
+    process.env.TYPEORM_PASSWORD = process.env.DB_PASSWORD;
+    process.env.TYPEORM_DATABASE = process.env.DB_NAME;
+}

+ 8 - 0
web/src/rpc.ts

@@ -0,0 +1,8 @@
+import { ModuleRpcProtocolClient } from "rpc_ts/lib/protocol/client";
+import { NoctBotService } from "@shared/rpc/backend";
+import { NodeHttpTransport } from "@improbable-eng/grpc-web-node-http-transport";
+
+export const rpcClient = ModuleRpcProtocolClient.getRpcClient(NoctBotService, {
+    remoteAddress: `http://noctbot:${process.env.WEB_PORT}`,
+    getGrpcWebTransport: NodeHttpTransport(),
+});

+ 1 - 0
web/src/server.ts

@@ -1,4 +1,5 @@
 // @ts-ignore -- generated package
+import "./environment";
 import * as sapper from "@sapper/server"; // eslint-disable-line import/no-unresolved
 import compression from "compression";
 import express, { Express } from "express";

+ 10 - 1
web/tsconfig.json

@@ -11,12 +11,21 @@
         "emitDecoratorMetadata": true,
         "moduleResolution": "node",
         "skipLibCheck": true,
-        "strict": true
+        "strict": true,
+        "paths": {
+            "@shared/*": ["../shared/src/*"]
+        },
+        "baseUrl": "."
     },
     "include": [
         "src/**/*"
     ],
     "exclude": [
         "node_modules"
+    ],
+    "references": [
+        {
+            "path": "../shared"
+        }
     ]
 }