presidium-db-client-server 0.6.10 → 0.7.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.
@@ -21,7 +21,7 @@ const errorHandler = require("./errorHandler")
21
21
  * new DatabaseLoadbalancer(
22
22
  * hash(tableName string, key string, length number) -> Promise|number,
23
23
  * options {
24
- * serverIps: Array<string>,
24
+ * serverIps: Array<string>|Array<Array<string>>,
25
25
  * },
26
26
  * ...handlers Arguments<HTTP.Handler>
27
27
  * )
@@ -1,4 +1,27 @@
1
1
  const HTTP = require("presidium/HTTP")
2
+ const Readable = require("presidium/Readable")
3
+ const stream = require("stream")
4
+
5
+ /**
6
+ * @name getClient
7
+ *
8
+ * @docs
9
+ * ```specscript
10
+ * module HTTP "https://presidium.services/docs/HTTP"
11
+ *
12
+ * getClient(serverIp string) -> client HTTP
13
+ * ```
14
+ */
15
+ function getClient(serverIp) {
16
+ let client
17
+ if (this.clients.has(serverIp)) {
18
+ client = this.clients.get(serverIp)
19
+ } else {
20
+ client = new HTTP(serverIp)
21
+ this.clients.set(serverIp, client)
22
+ }
23
+ return client
24
+ }
2
25
 
3
26
  /**
4
27
  * @name loadBalancerHandler
@@ -19,22 +42,54 @@ async function loadBalancerHandler(request, response) {
19
42
  index = await index
20
43
  }
21
44
 
22
- const serverIp = this.serverIps[index]
23
- let client
24
- if (this.clients.has(serverIp)) {
25
- client = this.clients.get(serverIp)
45
+ const serverIpOrIps = this.serverIps[index]
46
+
47
+ if (Array.isArray(serverIpOrIps)) {
48
+ const passthroughStreams = []
49
+ for (let i = 0; i < serverIpOrIps.length; i++) {
50
+ passthroughStreams.push(new stream.PassThrough())
51
+ }
52
+
53
+ serverIpOrIps.forEach(async (serverIp, index) => {
54
+ const client = getClient.call(this, serverIp)
55
+
56
+ const serverResponse = await client[request.method](request.url, {
57
+ headers: request.headers,
58
+ body: passthroughStreams[index],
59
+ })
60
+
61
+ if (index == 0) {
62
+ response.writeHead(serverResponse.status, serverResponse.headers)
63
+ serverResponse.pipe(response)
64
+ } else {
65
+ await Readable.Text(serverResponse)
66
+ }
67
+ })
68
+
69
+ request.on("data", chunk => {
70
+ passthroughStreams.forEach(stream => {
71
+ stream.write(chunk)
72
+ })
73
+ })
74
+
75
+ request.on("end", () => {
76
+ passthroughStreams.forEach(stream => {
77
+ stream.end()
78
+ })
79
+ })
80
+
26
81
  } else {
27
- client = new HTTP(serverIp)
28
- this.clients.set(serverIp, client)
29
- }
82
+ const client = getClient.call(this, serverIpOrIps)
30
83
 
31
- const serverResponse = await client[request.method](request.url, {
32
- headers: request.headers,
33
- body: request,
34
- })
84
+ const serverResponse = await client[request.method](request.url, {
85
+ headers: request.headers,
86
+ body: request,
87
+ })
88
+
89
+ response.writeHead(serverResponse.status, serverResponse.headers)
90
+ serverResponse.pipe(response)
91
+ }
35
92
 
36
- response.writeHead(serverResponse.status, serverResponse.headers)
37
- serverResponse.pipe(response)
38
93
  }
39
94
 
40
95
  module.exports = loadBalancerHandler
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "presidium-db-client-server",
3
- "version": "0.6.10",
3
+ "version": "0.7.0",
4
4
  "description": "Presidium DB client and server library",
5
5
  "author": "Richard Tong",
6
6
  "license": "CFOSS",
@@ -44,7 +44,7 @@
44
44
  "test": "node test.js"
45
45
  },
46
46
  "dependencies": {
47
- "presidium": "^4.5.0",
47
+ "presidium": ">=4.9.1",
48
48
  "rubico": "^2.21.0"
49
49
  },
50
50
  "devDependencies": {