-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathpoolingClient.js
More file actions
60 lines (53 loc) · 1.25 KB
/
Copy pathpoolingClient.js
File metadata and controls
60 lines (53 loc) · 1.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
const PassKitClient = require("./client");
const services = [
"userClient",
"templateClient",
"membersClient",
"imageClient",
"couponsClient",
"ticketsClient",
"flightsClient",
"analyticsClient",
"rawClient",
"certificatesClient",
"distributionClient",
"integrationsClient",
];
class GrpcConnectionPool {
constructor(config) {
this.connections = Array.from(
{ length: config.poolSize },
() => new PassKitClient(config),
);
this.currentIndex = 0;
this.client = Object.fromEntries(
services.map((service) => [service, this.createServiceProxy(service)]),
);
}
next() {
const connection = this.connections[this.currentIndex];
this.currentIndex = (this.currentIndex + 1) % this.connections.length;
return connection;
}
createServiceProxy(service) {
return new Proxy(
{},
{
get:
(_target, method) =>
(...args) => {
const serviceClient = this.next()[service];
return serviceClient[method](...args);
},
},
);
}
getConnection() {
return this.client;
}
close() {
this.connections.forEach((connection) => connection.close());
this.connections = [];
}
}
module.exports = GrpcConnectionPool;