@haku-sci/utils 1.4.8 → 1.4.10
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/README.md
CHANGED
|
@@ -18,7 +18,7 @@ if consul is used, and env variabe CONSUL_URI is defined, then the lib allows as
|
|
|
18
18
|
|
|
19
19
|
## Docker
|
|
20
20
|
|
|
21
|
-
the
|
|
21
|
+
the start_services.bat method allows to run all required services from docker:
|
|
22
22
|
|
|
23
23
|
* Consul
|
|
24
24
|
* Neo4j
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { INestMicroservice } from '@nestjs/common';
|
|
2
2
|
export declare class MicroserviceService {
|
|
3
3
|
private static serviceAddress;
|
|
4
4
|
private static msName;
|
|
5
|
-
static projectName(): Promise<string>;
|
|
6
5
|
private static getServiceURI;
|
|
7
|
-
static sendTCPMessage(service: any, messagePattern: any, payload?: any): Promise<any>;
|
|
8
|
-
static emitTCPEvent(messagePattern: any, queue?: any, payload?: any): Promise<void>;
|
|
9
6
|
private static registerService;
|
|
10
|
-
private static
|
|
11
|
-
static
|
|
7
|
+
private static getServerAddress;
|
|
8
|
+
private static startMainMicroService;
|
|
9
|
+
private static startRabbitMQMicroService;
|
|
10
|
+
static bootstrapMicroservice(appModule: any, routingKeys?: ("post" | "delete" | "patch" | "put")[]): Promise<INestMicroservice>;
|
|
11
|
+
static sendTCPMessage(service: any, messagePattern: any, payload?: any): Promise<any>;
|
|
12
|
+
static emitTCPEvent(messagePattern: ("post" | "delete" | "patch" | "put")[], userId: string, entityId: string, queue?: string, payload?: any): Promise<void>;
|
|
13
|
+
static projectName(): Promise<string>;
|
|
12
14
|
}
|
|
@@ -16,16 +16,9 @@ const microservices_1 = require("@nestjs/microservices");
|
|
|
16
16
|
const net = require("net");
|
|
17
17
|
const axios_1 = require("axios");
|
|
18
18
|
const rxjs_1 = require("rxjs");
|
|
19
|
+
const amqp = require("amqplib");
|
|
19
20
|
const HAKU_SCI_EXCHANGE = 'Haku-SciExchange';
|
|
20
21
|
let MicroserviceService = MicroserviceService_1 = class MicroserviceService {
|
|
21
|
-
static async projectName() {
|
|
22
|
-
if (!this.msName) {
|
|
23
|
-
var data = await (0, promises_1.readFile)(path.join(process.cwd(), 'package.json'));
|
|
24
|
-
const { name } = JSON.parse(data.toString());
|
|
25
|
-
this.msName = name;
|
|
26
|
-
}
|
|
27
|
-
return this.msName;
|
|
28
|
-
}
|
|
29
22
|
static async getServiceURI(serviceName) {
|
|
30
23
|
const response = await axios_1.default.get(`${process.env["CONSUL_URL"]}/v1/catalog/service/${serviceName}`);
|
|
31
24
|
const serviceInfo = response.data;
|
|
@@ -42,37 +35,6 @@ let MicroserviceService = MicroserviceService_1 = class MicroserviceService {
|
|
|
42
35
|
throw new common_1.NotFoundException(`Service ${serviceName} not found in Consul catalog`);
|
|
43
36
|
}
|
|
44
37
|
}
|
|
45
|
-
static async sendTCPMessage(service, messagePattern, payload) {
|
|
46
|
-
const client = microservices_1.ClientProxyFactory.create({
|
|
47
|
-
transport: microservices_1.Transport.TCP,
|
|
48
|
-
options: await MicroserviceService_1.getServiceURI(service),
|
|
49
|
-
});
|
|
50
|
-
try {
|
|
51
|
-
const result = await (0, rxjs_1.lastValueFrom)(await client.send(messagePattern, payload));
|
|
52
|
-
return result;
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
client.close();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
static async emitTCPEvent(messagePattern, queue, payload) {
|
|
59
|
-
const client = microservices_1.ClientProxyFactory.create({
|
|
60
|
-
options: {
|
|
61
|
-
urls: [`${process.env["RABBITMQ_URL"]}`],
|
|
62
|
-
queue: queue,
|
|
63
|
-
queueOptions: {
|
|
64
|
-
durable: false,
|
|
65
|
-
},
|
|
66
|
-
exchange: HAKU_SCI_EXCHANGE,
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
try {
|
|
70
|
-
await client.emit(messagePattern, payload);
|
|
71
|
-
}
|
|
72
|
-
finally {
|
|
73
|
-
client.close();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
38
|
static async registerService() {
|
|
77
39
|
const projectName = await this.projectName();
|
|
78
40
|
const serviceData = {
|
|
@@ -90,51 +52,122 @@ let MicroserviceService = MicroserviceService_1 = class MicroserviceService {
|
|
|
90
52
|
await axios_1.default.put(`${process.env["CONSUL_URL"]}/v1/agent/service/register`, serviceData);
|
|
91
53
|
console.log(`Service registered with Consul on ${this.serviceAddress.address}:${this.serviceAddress.port}`);
|
|
92
54
|
}
|
|
93
|
-
static async
|
|
55
|
+
static async getServerAddress() {
|
|
56
|
+
if (process.env.AWS_REGION)
|
|
57
|
+
return {
|
|
58
|
+
address: `haku-sci-${await this.projectName()}-${process.env.BRANCH}.${process.env.AWS_REGION}.elasticbeanstalk.com`,
|
|
59
|
+
port: 3000
|
|
60
|
+
};
|
|
94
61
|
const server = net.createServer();
|
|
95
62
|
server.listen(0);
|
|
96
63
|
await new Promise((resolve) => server.once('listening', resolve));
|
|
97
64
|
const address = server.address();
|
|
98
|
-
address.address = "localhost";
|
|
99
65
|
server.close();
|
|
100
66
|
return address;
|
|
101
67
|
}
|
|
102
|
-
static async
|
|
103
|
-
|
|
104
|
-
await this.getLocalServerAddress() :
|
|
105
|
-
{
|
|
106
|
-
address: `haku-sci-${process.env["AWS_APPLICATION"]}-${process.env["AWS_BRANCH"]}.${process.env["AWS_REGION"]}.elasticbeanstalk.com`,
|
|
107
|
-
port: 3000
|
|
108
|
-
};
|
|
109
|
-
if (process.env["RDS_DBNAME"]) {
|
|
110
|
-
const postGresService = require('./postgres.service');
|
|
111
|
-
postGresService.createDatabaseIfNotExists();
|
|
112
|
-
}
|
|
113
|
-
const app = await core_1.NestFactory.create(appModule);
|
|
114
|
-
app.connectMicroservice({
|
|
68
|
+
static async startMainMicroService(appModule) {
|
|
69
|
+
const app = await core_1.NestFactory.createMicroservice(appModule, {
|
|
115
70
|
transport: microservices_1.Transport.TCP,
|
|
116
71
|
options: {
|
|
117
72
|
port: this.serviceAddress.port
|
|
118
73
|
}
|
|
119
74
|
});
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
75
|
+
await app.listen();
|
|
76
|
+
const tcpServer = app.server.server;
|
|
77
|
+
this.serviceAddress = tcpServer.address();
|
|
78
|
+
return app;
|
|
79
|
+
}
|
|
80
|
+
static async startRabbitMQMicroService(appModule, routingKeys) {
|
|
81
|
+
const queue = await this.projectName();
|
|
82
|
+
const app = await core_1.NestFactory.createMicroservice(appModule, {
|
|
83
|
+
transport: microservices_1.Transport.RMQ,
|
|
84
|
+
options: {
|
|
85
|
+
urls: [process.env.RABBITMQ_URL],
|
|
86
|
+
queue: queue,
|
|
87
|
+
queueOptions: {
|
|
88
|
+
durable: false,
|
|
129
89
|
},
|
|
130
|
-
|
|
90
|
+
noAck: false,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
await app.listen();
|
|
94
|
+
if (!routingKeys)
|
|
95
|
+
return app;
|
|
96
|
+
const connection = await amqp.connect(process.env.RABBITMQ_URL);
|
|
97
|
+
const channel = await connection.createChannel();
|
|
98
|
+
await channel.assertExchange(HAKU_SCI_EXCHANGE, 'direct', { durable: true });
|
|
99
|
+
await channel.assertQueue(queue, { durable: false });
|
|
100
|
+
const bindingPromises = routingKeys.map(async (routingKey) => {
|
|
101
|
+
await channel.bindQueue(queue, HAKU_SCI_EXCHANGE, routingKey);
|
|
102
|
+
});
|
|
103
|
+
await Promise.all([
|
|
104
|
+
channel.assertQueue(queue, { durable: false }),
|
|
105
|
+
...bindingPromises,
|
|
106
|
+
]);
|
|
107
|
+
await channel.close();
|
|
108
|
+
await connection.close();
|
|
109
|
+
return app;
|
|
110
|
+
}
|
|
111
|
+
static async bootstrapMicroservice(appModule, routingKeys) {
|
|
112
|
+
this.serviceAddress = await this.getServerAddress();
|
|
113
|
+
if (process.env["RDS_DBNAME"]) {
|
|
114
|
+
const postGresService = require('./postgres.service');
|
|
115
|
+
postGresService.createDatabaseIfNotExists();
|
|
131
116
|
}
|
|
132
|
-
await
|
|
133
|
-
|
|
117
|
+
const app = await this.startMainMicroService(appModule);
|
|
118
|
+
if (process.env.RABBITMQ_URL)
|
|
119
|
+
await this.startRabbitMQMicroService(appModule, routingKeys);
|
|
134
120
|
if (process.env["CONSUL_URL"])
|
|
135
121
|
this.registerService();
|
|
136
122
|
return app;
|
|
137
123
|
}
|
|
124
|
+
static async sendTCPMessage(service, messagePattern, payload) {
|
|
125
|
+
const client = microservices_1.ClientProxyFactory.create({
|
|
126
|
+
transport: microservices_1.Transport.TCP,
|
|
127
|
+
options: await MicroserviceService_1.getServiceURI(service),
|
|
128
|
+
});
|
|
129
|
+
try {
|
|
130
|
+
const result = await (0, rxjs_1.lastValueFrom)(await client.send(messagePattern, payload));
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
client.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
static async emitTCPEvent(messagePattern, userId, entityId, queue, payload) {
|
|
138
|
+
const client = microservices_1.ClientProxyFactory.create({
|
|
139
|
+
options: {
|
|
140
|
+
urls: [process.env.RABBITMQ_URL],
|
|
141
|
+
queue: queue,
|
|
142
|
+
queueOptions: {
|
|
143
|
+
durable: false,
|
|
144
|
+
},
|
|
145
|
+
headers: {
|
|
146
|
+
entityId: entityId
|
|
147
|
+
},
|
|
148
|
+
properties: {
|
|
149
|
+
headers: {
|
|
150
|
+
userId: userId
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
exchange: HAKU_SCI_EXCHANGE,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
try {
|
|
157
|
+
await client.emit(messagePattern, payload);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
client.close();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
static async projectName() {
|
|
164
|
+
if (!this.msName) {
|
|
165
|
+
var data = await (0, promises_1.readFile)(path.join(process.cwd(), 'package.json'));
|
|
166
|
+
const { name } = JSON.parse(data.toString());
|
|
167
|
+
this.msName = name;
|
|
168
|
+
}
|
|
169
|
+
return this.msName;
|
|
170
|
+
}
|
|
138
171
|
};
|
|
139
172
|
exports.MicroserviceService = MicroserviceService;
|
|
140
173
|
exports.MicroserviceService = MicroserviceService = MicroserviceService_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microservice.service.js","sourceRoot":"","sources":["../../src/microservice/microservice.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"microservice.service.js","sourceRoot":"","sources":["../../src/microservice/microservice.service.ts"],"names":[],"mappings":"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"}
|