@rpcbase/server 0.34.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ /* @flow */
2
+ const os = require("os")
3
+
4
+ const get_runtime = () => {
5
+ console.warn("warning: native mode is tmp disabled")
6
+ return "docker"
7
+
8
+ if (os.platform() === "darwin") {
9
+ return "native"
10
+ } else {
11
+ return "docker"
12
+ }
13
+ }
14
+
15
+ module.exports = get_runtime
@@ -0,0 +1,3 @@
1
+ // hardcoded infrastructure members ?
2
+ // server + worker + 2 redis + 3 mongodb??
3
+ // run the remaining services in docker ?
@@ -0,0 +1,31 @@
1
+ /* @flow */
2
+ const {execSync} = require("child_process")
3
+ const path = require("path")
4
+
5
+ const is_production = "yes" === process.env.INFRASTRUCTURE_IS_PRODUCTION
6
+
7
+
8
+ const run_docker = async(infrastructure_dir, proj_prefix) => {
9
+ // env
10
+ const env_path = path.relative(infrastructure_dir, path.join(process.cwd(), "./.env"))
11
+
12
+ // compose files
13
+ const compose_files = ["-f common.yml"]
14
+ if (is_production) compose_files.push("-f prod.yml")
15
+ else compose_files.push("-f dev.yml")
16
+
17
+ const opts = ["--build", "--remove-orphans"]
18
+ if (!is_production) opts.push("--abort-on-container-exit")
19
+
20
+ const cmd = `docker-compose --env-file ${env_path} -p ${proj_prefix} ${compose_files.join(" ")} up ${opts.join(" ")}`
21
+
22
+ console.log(cmd)
23
+ try {
24
+ execSync(cmd, {stdio: "inherit", cwd: infrastructure_dir})
25
+ } catch (err) {
26
+ console.log("start_server::error\n", err)
27
+ process.exit(1)
28
+ }
29
+ }
30
+
31
+ module.exports = run_docker
@@ -0,0 +1,46 @@
1
+ /* @flow */
2
+ const {spawn} = require("child_process")
3
+ const dotenv = require("dotenv")
4
+ const path = require("path")
5
+ const fs = require("fs")
6
+
7
+
8
+ const run_processes = [
9
+ ["mongod", [
10
+ "--quiet",
11
+ "--port", "$DATABASE_PORT_0",
12
+ "--replSet", "rs0",
13
+ "--logpath", "/var/log/logs.txt",
14
+ ]],
15
+ ["mongod", [
16
+ "--quiet",
17
+ "--port", "$DATABASE_PORT_2",
18
+ "--replSet", "rs0",
19
+ "--logpath", "/var/log/logs.txt",
20
+ ]],
21
+ ]
22
+
23
+
24
+
25
+ const get_env = () => {
26
+ const env_path = path.join(process.cwd(), ".env")
27
+ const env_buf = fs.readFileSync(env_path)
28
+ const env = dotenv.parse(env_buf)
29
+
30
+ return env
31
+ }
32
+
33
+
34
+
35
+ const run_native = (infrastructure_dir, proj_prefix) => {
36
+ console.log("native mode")
37
+ const env = get_env()
38
+
39
+ const ps = spawn("ls", ["-la"])
40
+ ps.stdout.on("data", (data) => {
41
+ console.log("stdout", data.toString())
42
+ })
43
+
44
+ }
45
+
46
+ module.exports = run_native
@@ -1,36 +1,31 @@
1
1
  /* @flow */
2
- const {execSync} = require("child_process")
3
2
  const path = require("path")
4
3
  const fs = require("fs")
5
4
 
6
- const is_production = "yes" === process.env.INFRASTRUCTURE_IS_PRODUCTION
5
+ const get_runtime = require("./get_runtime")
6
+ const run_docker = require("./run_docker")
7
+ const run_native = require("./run_native")
8
+
7
9
 
8
10
  // TODO: auto create network if necessary
9
11
  // docker network create local-network
10
12
 
11
13
  const start_server = async() => {
12
- if (is_production) {
13
- console.log("server will run in production")
14
- }
15
14
 
16
15
  const infrastructure_dir = path.join(process.cwd(), "../infrastructure")
17
16
 
18
- // env
19
- const env_path = path.relative(infrastructure_dir, path.join(process.cwd(), "./.env"))
20
-
21
17
  // prefix
22
18
  const proj_parent_dir = path.join(infrastructure_dir, "../../")
23
19
  const proj_prefix = path.basename(proj_parent_dir)
24
20
 
25
- // compose files
26
- const compose_files = ["-f common.yml"]
27
- if (is_production) compose_files.push("-f prod.yml")
28
- else compose_files.push("-f dev.yml")
21
+ const runtime = get_runtime()
29
22
 
30
- const cmd = `docker-compose --env-file ${env_path} -p ${proj_prefix} ${compose_files.join(" ")} up --build --remove-orphans`
31
-
32
- console.log("RUN", cmd)
33
- execSync(cmd, {stdio: "inherit", cwd: infrastructure_dir})
23
+ console.log("RUN", runtime)
24
+ if (runtime === "native") {
25
+ run_native(infrastructure_dir, proj_prefix)
26
+ } else {
27
+ run_docker(infrastructure_dir, proj_prefix)
28
+ }
34
29
 
35
30
  }
36
31
 
package/database.js CHANGED
@@ -23,6 +23,6 @@ const mongo_url = `mongodb://${replicaset_str}/${DATABASE_NAME}?`
23
23
  module.exports = async() => {
24
24
  console.log("mongo_url", mongo_url)
25
25
  const ret = await mongoose.connect(mongo_url)
26
- console.log("waiting after return", ret)
26
+ // console.log("waiting after return", ret)
27
27
  // TODO: handle connection retry and pools
28
28
  }
@@ -1,9 +1,13 @@
1
1
  /* @flow */
2
2
  const session = require("express-session")
3
- const redis = require("redis")
4
3
  const validator = require("validator")
4
+ const {createClient} = require("redis")
5
5
  const redis_store = require("connect-redis")(session)
6
6
 
7
+ // WARNING:
8
+ // https://stackoverflow.com/questions/70867229/error-connection-timeout-when-connecting-to-redis-docker-instance
9
+ // https://github.com/redis/node-redis/issues/1656/
10
+
7
11
 
8
12
  const {SESSION_STORE_PORT} = process.env
9
13
 
@@ -11,17 +15,44 @@ if (typeof SESSION_STORE_PORT === "string" && !validator.isPort(SESSION_STORE_PO
11
15
  throw new Error("expected SESSION_STORE_PORT to be a valid port number")
12
16
  }
13
17
 
14
- const session_store_url = `redis://session-store:${SESSION_STORE_PORT}`
18
+ // console.log("ICIII", execSync("redis-cli -p 7979 -h session-store ping", {stdio: "inherit"}))
19
+
20
+ const reconnectStrategy = (retries) => {
21
+ console.log("reconnectStrategy::retrying with arg", retries)
22
+ if (retries < 5) {
23
+ console.log("retry count:", retries, "retrying in 1s")
24
+ return 1000
25
+ } else {
26
+ return new Error("max retries expiered")
27
+ }
28
+ }
29
+
30
+
31
+ const redis_client = createClient({
32
+ socket: {
33
+ host: "session-store",
34
+ port: SESSION_STORE_PORT,
35
+ reconnectStrategy
36
+ },
37
+ // legacyMode: true,
38
+ })
15
39
 
16
- const redis_client = redis.createClient({
17
- url: session_store_url
40
+ // extreme warning: when there is blocking io redis client won't connect
41
+ process.nextTick(() => {
42
+ redis_client.connect()
43
+ .catch((err) => {
44
+ console.log("session store error ohh", err)
45
+ })
46
+ .then(() => {
47
+ console.log("redis session-store connected port:", SESSION_STORE_PORT)
48
+ })
18
49
  })
19
50
 
20
51
  const session_middleware = session({
21
52
  store: new redis_store({client: redis_client}),
22
53
  proxy: true,
23
54
  saveUninitialized: false,
24
- // TODO: fix session secret
55
+ // TODO: use session secret from env
25
56
  secret: "session secret wowow",
26
57
  resave: false,
27
58
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/server",
3
- "version": "0.34.0",
3
+ "version": "0.37.0",
4
4
  "license": "SSPL-1.0",
5
5
  "main": "./index.js",
6
6
  "bin": {
@@ -10,15 +10,15 @@
10
10
  "test": "echo \"Error: no test specified\" && exit 0"
11
11
  },
12
12
  "dependencies": {
13
- "body-parser": "1.19.1",
14
- "connect-redis": "6.0.0",
13
+ "body-parser": "1.19.2",
14
+ "connect-redis": "6.1.1",
15
15
  "cors": "2.8.5",
16
- "dotenv": "10.0.0",
17
- "express": "4.17.2",
16
+ "dotenv": "16.0.0",
17
+ "express": "4.17.3",
18
18
  "express-session": "1.17.2",
19
19
  "glob": "7.2.0",
20
- "mongoose": "6.1.5",
21
- "redis": "3.1.2",
20
+ "mongoose": "6.2.4",
21
+ "redis": "4.0.4",
22
22
  "validator": "13.7.0",
23
23
  "yargs": "17.3.1"
24
24
  }