From 0802d5e6a849c822b7225423c8b20a38763ff45f Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 13 Aug 2021 12:58:18 +0200 Subject: [PATCH] :sparkles: server bundle --- {api/.github => .github}/FUNDING.yml | 0 .../.github => .github}/workflows/release.yml | 39 +++++---- .gitignore | 4 + .vscode/launch.json | 17 ---- api/.github/ISSUE_TEMPLATE/-feature--.md | 20 ----- api/.github/workflows/codeql-analysis.yml | 71 ----------------- api/.github/workflows/docker-publish.yml | 47 ----------- bundle/package-lock.json | Bin 0 -> 92755 bytes bundle/package.json | 42 ++++++++++ bundle/src/Server.ts | 33 ++++++++ bundle/src/start.ts | 74 ++++++++++++++++++ bundle/tsconfig.json | 68 ++++++++++++++++ gateway/.github/workflows/docker-publish.yml | 47 ----------- util/package.json | 4 +- 14 files changed, 247 insertions(+), 219 deletions(-) rename {api/.github => .github}/FUNDING.yml (100%) rename {api/.github => .github}/workflows/release.yml (64%) create mode 100644 .gitignore delete mode 100644 .vscode/launch.json delete mode 100644 api/.github/ISSUE_TEMPLATE/-feature--.md delete mode 100644 api/.github/workflows/codeql-analysis.yml delete mode 100644 api/.github/workflows/docker-publish.yml create mode 100644 bundle/package-lock.json create mode 100644 bundle/package.json create mode 100644 bundle/src/Server.ts create mode 100644 bundle/src/start.ts create mode 100644 bundle/tsconfig.json delete mode 100644 gateway/.github/workflows/docker-publish.yml diff --git a/api/.github/FUNDING.yml b/.github/FUNDING.yml similarity index 100% rename from api/.github/FUNDING.yml rename to .github/FUNDING.yml diff --git a/api/.github/workflows/release.yml b/.github/workflows/release.yml similarity index 64% rename from api/.github/workflows/release.yml rename to .github/workflows/release.yml index 3ef40aeb..b0a31780 100644 --- a/api/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,13 +15,13 @@ jobs: include: - os: windows build: npm run bundle:windows - artifact: fosscord-api-windows.exe + artifact: fosscord-server-windows.exe - os: macos build: npm run bundle:macos - artifact: fosscord-api-macos.app.tgz + artifact: fosscord-server-macos.app.tgz - os: ubuntu build: npm run bundle:linux - artifact: fosscord-api-linux.tgz + artifact: fosscord-server-linux.tgz runs-on: ${{ matrix.os }}-latest steps: - uses: actions/checkout@v2 @@ -29,6 +29,8 @@ jobs: with: node-version: 14 - run: npm install + env: + MONGOMS_VERSION: 4.4.3 - run: npm run build - run: ${{ matrix.build }} - uses: actions/upload-artifact@v2 @@ -46,43 +48,52 @@ jobs: uses: Saionaro/extract-package-version@v1.0.6 - uses: actions/download-artifact@v2 with: - name: fosscord-api-windows-${{ github.sha }}.exe + name: fosscord-server-windows.exe - uses: actions/download-artifact@v2 with: - name: fosscord-api-macos-${{ github.sha }}.app.tgz + name: fosscord-server-macos.app.tgz - uses: actions/download-artifact@v2 with: - name: fosscord-api-linux-${{ github.sha }}.tgz + name: fosscord-server-linux.tgz - uses: actions/create-release@v1 id: create-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: v${{ steps.extract_version.outputs.version }} - release_name: Release ${{ steps.extract_version.outputs.version }} + release_name: Server v${{ steps.extract_version.outputs.version }} draft: false prerelease: true # TODO: change this to false + body: > + ## Download + + - [Windows](https://github.com/fosscord/fosscord-server/releases/download/v${{ steps.extract_version.outputs.version }}/fosscord-server-windows.exe) + + - [MacOS](https://github.com/fosscord/fosscord-server/releases/download/v${{ steps.extract_version.outputs.version }}/fosscord-server-macos.app.tgz) + + - [Linux](https://github.com/fosscord/fosscord-server/releases/download/v${{ steps.extract_version.outputs.version }}/fosscord-server-linux.tgz) + - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: fosscord-api-windows-${{ github.sha }}.exe - asset_name: fosscord-api-windows.exe + asset_path: fosscord-server-windows.exe + asset_name: fosscord-server-windows.exe asset_content_type: application/vnd.microsoft.portable-executable - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: fosscord-api-macos-${{ github.sha }}.app.tgz - asset_name: fosscord-api-macos.app.tgz + asset_path: fosscord-server-macos.app.tgz + asset_name: fosscord-server-macos.app.tgz asset_content_type: application/gzip - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: fosscord-api-linux-${{ github.sha }}.tgz - asset_name: fosscord-api-linux.tgz - asset_content_type: application/gzip + asset_path: fosscord-server-linux.tgz + asset_name: fosscord-server-linux.tgz + asset_content_type: application/gzip \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..32ef9beb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_STORE +db/ +dist/ +node_modules \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 07fd32ac..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "sourceMaps": true, - "type": "node", - "request": "launch", - "name": "Launch Server", - "program": "${workspaceFolder}/dist/index.js", - "preLaunchTask": "tsc: build - tsconfig.json", - "outFiles": ["${workspaceFolder}/dist/**/*.js"] - } - ] -} diff --git a/api/.github/ISSUE_TEMPLATE/-feature--.md b/api/.github/ISSUE_TEMPLATE/-feature--.md deleted file mode 100644 index cefcf6b6..00000000 --- a/api/.github/ISSUE_TEMPLATE/-feature--.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: "[Feature] " -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/api/.github/workflows/codeql-analysis.yml b/api/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 3a3a8e92..00000000 --- a/api/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ master ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ master ] - schedule: - - cron: '25 10 * * 5' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 diff --git a/api/.github/workflows/docker-publish.yml b/api/.github/workflows/docker-publish.yml deleted file mode 100644 index 46d9d04d..00000000 --- a/api/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: docker-publish - -on: - push: - branches: - - 'master' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ secrets.DOCKERHUB_TAGS }} - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache-new - - - # Hackfix to cleanup cache; replace after buildx 0.6 and BuildKit 0.9 are released - # https://github.com/docker/build-push-action/pull/406#issuecomment-879184394 - name: Move cache fix - run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/bundle/package-lock.json b/bundle/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..8f012973359fb0f03e883c924d150f28ae08a667 GIT binary patch literal 92755 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 C^W~uc literal 0 HcmV?d00001 diff --git a/bundle/package.json b/bundle/package.json new file mode 100644 index 00000000..f4188565 --- /dev/null +++ b/bundle/package.json @@ -0,0 +1,42 @@ +{ + "name": "@fosscord/server", + "version": "1.0.0", + "description": "", + "main": "src/start.js", + "scripts": { + "linkInstall": "npm run --prefix ../util/ link && npm run --prefix ../api/ link && npm run --prefix ../cdn/ link && npm run --prefix ../gateway/ link", + "postinstall": "npm run linkInstall && npm link @fosscord/util && npm link @fosscord/api && npm link @fosscord/gateway && npm link @fosscord/cdn", + "build": "tsc -b .", + "start": "npm run build && node dist/start.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fosscord/fosscord-api.git" + }, + "keywords": [], + "author": "Fosscord", + "license": "AGPLV3", + "bugs": { + "url": "https://github.com/fosscord/fosscord-api/issues" + }, + "homepage": "https://github.com/fosscord/fosscord-api#readme", + "devDependencies": { + "@types/async-exit-hook": "^2.0.0", + "@types/express": "^4.17.13", + "@types/node": "^16.6.1", + "@types/node-os-utils": "^1.2.0", + "typescript": "^4.3.5" + }, + "dependencies": { + "@fosscord/api": "file:../api", + "@fosscord/cdn": "file:../cdn", + "@fosscord/gateway": "file:../gateway", + "@fosscord/util": "file:../util", + "async-exit-hook": "^2.0.1", + "express": "^4.17.1", + "link": "^0.1.5", + "mongodb-memory-server-global-4.4": "^7.3.6", + "node-os-utils": "^1.3.5" + } +} diff --git a/bundle/src/Server.ts b/bundle/src/Server.ts new file mode 100644 index 00000000..14abc128 --- /dev/null +++ b/bundle/src/Server.ts @@ -0,0 +1,33 @@ +process.on("unhandledRejection", console.error); +process.on("uncaughtException", console.error); + +import http from "http"; +import { FosscordServer as APIServer } from "@fosscord/api"; +import { Server as GatewayServer } from "@fosscord/gateway"; +import { CDNServer } from "@fosscord/cdn/"; +import express from "express"; +import { Config } from "../../util/dist"; + +const app = express(); +const server = http.createServer(); +const port = Number(process.env.PORT) || 8080; +const production = true; +server.on("request", app); + +// @ts-ignore +const api = new APIServer({ server, port, production, app }); +// @ts-ignore +const cdn = new CDNServer({ server, port, production, app }); +// @ts-ignore +const gateway = new GatewayServer({ server, port, production }); + +async function main() { + await api.start(); + await cdn.start(); + await gateway.start(); + + if (!Config.get().gateway.endpoint) await Config.set({ gateway: { endpoint: `ws://localhost:${port}` } }); + if (!Config.get().cdn.endpoint) await Config.set({ cdn: { endpoint: `http://localhost:${port}` } }); +} + +main().catch(console.error); diff --git a/bundle/src/start.ts b/bundle/src/start.ts new file mode 100644 index 00000000..2ae2ce87 --- /dev/null +++ b/bundle/src/start.ts @@ -0,0 +1,74 @@ +import fs from "fs"; +import { MongoMemoryServer } from "mongodb-memory-server-global-4.4"; +import path from "path"; +import cluster from "cluster"; +import os from "os"; +import osu from "node-os-utils"; +import exitHook from "async-exit-hook"; + +const cores = Number(process.env.threads) || 1 || os.cpus().length; + +if (cluster.isMaster && !process.env.masterStarted) { + const dbPath = path.join(__dirname, "..", "..", "db"); + const dbName = "fosscord"; + const storageEngine = "wiredTiger"; + const port = 27020; + const ip = "127.0.0.1"; + var mongod: MongoMemoryServer; + fs.mkdirSync(dbPath, { recursive: true }); + + exitHook((callback: any) => { + (async () => { + console.log(`Stopping MongoDB ...`); + await mongod.stop(); + console.log(`Stopped MongoDB`); + callback(); + })(); + }); + + process.env.masterStarted = "true"; + + setInterval(async () => { + const [cpuUsed, memory, network] = await Promise.all([osu.cpu.usage(), osu.mem.info(), osu.netstat.inOut()]); + if (typeof network === "object") { + console.log(`Network: in ${network.total.inputMb}mb | out ${network.total.outputMb}mb`); + } + + console.log( + `[CPU] ${cpuUsed.toFixed(2)}% | [Memory] ${memory.usedMemMb.toFixed(0)}mb/${memory.totalMemMb.toFixed(0)}mb` + ); + }, 1000 * 60); + + (async () => { + console.log(`[Database] starting ...`); + mongod = new MongoMemoryServer({ + instance: { + port, + ip, + dbName, + dbPath, + storageEngine, + auth: false, // by default `mongod` is started with '--noauth', start `mongod` with '--auth' + }, + }); + await mongod.start(); + process.env.MONGO_URL = mongod.getUri(dbName); + + console.log(`[CPU] ${osu.cpu.model()} Cores x${osu.cpu.count()}`); + console.log(`[System] ${await osu.os.oos()} ${os.arch()}`); + console.log(`[Database] started`); + console.log(`[Process] running with pid: ${process.pid}`); + + // Fork workers. + for (let i = 0; i < cores; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker: any, code: any, signal: any) => { + console.log(`[Worker] died with pid: ${worker.process.pid} , restarting ...`); + cluster.fork(); + }); + })(); +} else { + require("./Server.js"); +} diff --git a/bundle/tsconfig.json b/bundle/tsconfig.json new file mode 100644 index 00000000..6bf2e6b7 --- /dev/null +++ b/bundle/tsconfig.json @@ -0,0 +1,68 @@ +{ + "include": ["src/**/*.ts"], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "lib": ["ES2020"] /* Specify library files to be included in the compilation. */, + "allowJs": true /* Allow javascript files to be compiled. */, + "checkJs": true /* Report errors in .js files. */, + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": false /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./dist/" /* Redirect output structure to the directory. */, + "rootDir": "./src/" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* Enable strict null checks. */, + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + "strictPropertyInitialization": false /* Enable strict checking of property initialization in classes. */, + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + "types": ["node"] /* Type declaration files to be included in compilation. */, + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true /* Skip type checking of declaration files. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/gateway/.github/workflows/docker-publish.yml b/gateway/.github/workflows/docker-publish.yml deleted file mode 100644 index 46d9d04d..00000000 --- a/gateway/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: docker-publish - -on: - push: - branches: - - 'master' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - push: true - tags: ${{ secrets.DOCKERHUB_TAGS }} - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache-new - - - # Hackfix to cleanup cache; replace after buildx 0.6 and BuildKit 0.9 are released - # https://github.com/docker/build-push-action/pull/406#issuecomment-879184394 - name: Move cache fix - run: | - rm -rf /tmp/.buildx-cache - mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/util/package.json b/util/package.json index 0478fe69..69af0f26 100644 --- a/util/package.json +++ b/util/package.json @@ -5,9 +5,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsc -b .", - "prepublish": "npm run build" + "build": "tsc -b ." }, "repository": { "type": "git",