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.
- package/DatabaseLoadBalancer.js +5 -5
- package/loadBalancerHandler.js +68 -13
- package/package.json +1 -1
package/DatabaseLoadBalancer.js
CHANGED
|
@@ -10,7 +10,7 @@ const notFoundHandler = require("./notFoundHandler")
|
|
|
10
10
|
const errorHandler = require("./errorHandler")
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
* @name
|
|
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
|
|
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
|
|
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 =
|
|
97
|
+
module.exports = DatabaseLoadBalancer
|
package/loadBalancerHandler.js
CHANGED
|
@@ -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
|
|
23
|
-
|
|
24
|
-
if (
|
|
25
|
-
|
|
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 =
|
|
28
|
-
this.clients.set(serverIp, client)
|
|
29
|
-
}
|
|
82
|
+
const client = getClient.call(this, serverIpOrIps)
|
|
30
83
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|