presidium-db-client-server 0.6.11 → 0.7.1

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.
@@ -10,7 +10,7 @@ const notFoundHandler = require("./notFoundHandler")
10
10
  const errorHandler = require("./errorHandler")
11
11
 
12
12
  /**
13
- * @name DatabaseLoadbalancer
13
+ * @name DatabaseLoadBalancer
14
14
  *
15
15
  * @docs
16
16
  * ```specscript
@@ -18,16 +18,16 @@ const errorHandler = require("./errorHandler")
18
18
  *
19
19
  * HTTP.Handler(HTTP.Request, HTTP.Response) -> ()
20
20
  *
21
- * new DatabaseLoadbalancer(
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
  * )
28
28
  * ```
29
29
  */
30
- class DatabaseLoadbalancer {
30
+ class DatabaseLoadBalancer {
31
31
  constructor(hash, options, ...handlers) {
32
32
  this.hash = hash
33
33
  this.serverIps = options.serverIps
@@ -94,4 +94,4 @@ class DatabaseLoadbalancer {
94
94
 
95
95
  }
96
96
 
97
- module.exports = DatabaseLoadbalancer
97
+ module.exports = DatabaseLoadBalancer
@@ -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.11",
3
+ "version": "0.7.1",
4
4
  "description": "Presidium DB client and server library",
5
5
  "author": "Richard Tong",
6
6
  "license": "CFOSS",