totoms 1.0.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.
- package/LICENSE +21 -0
- package/README.md +413 -0
- package/dist/api/TotoAPIController.d.ts +30 -0
- package/dist/api/TotoAPIController.d.ts.map +1 -0
- package/dist/api/TotoAPIController.js +226 -0
- package/dist/api/TotoAPIController.js.map +1 -0
- package/dist/auth/TotoToken.d.ts +3 -0
- package/dist/auth/TotoToken.d.ts.map +1 -0
- package/dist/auth/TotoToken.js +8 -0
- package/dist/auth/TotoToken.js.map +1 -0
- package/dist/core/TotoMicroservice.d.ts +27 -0
- package/dist/core/TotoMicroservice.d.ts.map +1 -0
- package/dist/core/TotoMicroservice.js +52 -0
- package/dist/core/TotoMicroservice.js.map +1 -0
- package/dist/dlg/SmokeDelegate.d.ts +12 -0
- package/dist/dlg/SmokeDelegate.d.ts.map +1 -0
- package/dist/dlg/SmokeDelegate.js +10 -0
- package/dist/dlg/SmokeDelegate.js.map +1 -0
- package/dist/evt/IMessageBus.d.ts +35 -0
- package/dist/evt/IMessageBus.d.ts.map +1 -0
- package/dist/evt/IMessageBus.js +21 -0
- package/dist/evt/IMessageBus.js.map +1 -0
- package/dist/evt/MessageBus.d.ts +37 -0
- package/dist/evt/MessageBus.d.ts.map +1 -0
- package/dist/evt/MessageBus.js +81 -0
- package/dist/evt/MessageBus.js.map +1 -0
- package/dist/evt/TotoMessage.d.ts +9 -0
- package/dist/evt/TotoMessage.d.ts.map +1 -0
- package/dist/evt/TotoMessage.js +2 -0
- package/dist/evt/TotoMessage.js.map +1 -0
- package/dist/evt/TotoMessageHandler.d.ts +16 -0
- package/dist/evt/TotoMessageHandler.d.ts.map +1 -0
- package/dist/evt/TotoMessageHandler.js +14 -0
- package/dist/evt/TotoMessageHandler.js.map +1 -0
- package/dist/evt/impl/aws/SNSImpl.d.ts +24 -0
- package/dist/evt/impl/aws/SNSImpl.d.ts.map +1 -0
- package/dist/evt/impl/aws/SNSImpl.js +201 -0
- package/dist/evt/impl/aws/SNSImpl.js.map +1 -0
- package/dist/evt/impl/aws/SQSImpl.d.ts +19 -0
- package/dist/evt/impl/aws/SQSImpl.d.ts.map +1 -0
- package/dist/evt/impl/aws/SQSImpl.js +96 -0
- package/dist/evt/impl/aws/SQSImpl.js.map +1 -0
- package/dist/evt/impl/gcp/GCPPubSubImpl.d.ts +22 -0
- package/dist/evt/impl/gcp/GCPPubSubImpl.d.ts.map +1 -0
- package/dist/evt/impl/gcp/GCPPubSubImpl.js +93 -0
- package/dist/evt/impl/gcp/GCPPubSubImpl.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/RegistryCache.d.ts +24 -0
- package/dist/integration/RegistryCache.d.ts.map +1 -0
- package/dist/integration/RegistryCache.js +74 -0
- package/dist/integration/RegistryCache.js.map +1 -0
- package/dist/integration/TotoAPI.d.ts +22 -0
- package/dist/integration/TotoAPI.d.ts.map +1 -0
- package/dist/integration/TotoAPI.js +84 -0
- package/dist/integration/TotoAPI.js.map +1 -0
- package/dist/integration/TotoRegistryAPI.d.ts +26 -0
- package/dist/integration/TotoRegistryAPI.d.ts.map +1 -0
- package/dist/integration/TotoRegistryAPI.js +67 -0
- package/dist/integration/TotoRegistryAPI.js.map +1 -0
- package/dist/logger/TotoLogger.d.ts +13 -0
- package/dist/logger/TotoLogger.d.ts.map +1 -0
- package/dist/logger/TotoLogger.js +48 -0
- package/dist/logger/TotoLogger.js.map +1 -0
- package/dist/model/APIConfiguration.d.ts +17 -0
- package/dist/model/APIConfiguration.d.ts.map +1 -0
- package/dist/model/APIConfiguration.js +2 -0
- package/dist/model/APIConfiguration.js.map +1 -0
- package/dist/model/AuthProviders.d.ts +5 -0
- package/dist/model/AuthProviders.d.ts.map +1 -0
- package/dist/model/AuthProviders.js +5 -0
- package/dist/model/AuthProviders.js.map +1 -0
- package/dist/model/TotoControllerConfig.d.ts +29 -0
- package/dist/model/TotoControllerConfig.d.ts.map +1 -0
- package/dist/model/TotoControllerConfig.js +77 -0
- package/dist/model/TotoControllerConfig.js.map +1 -0
- package/dist/model/TotoDelegate.d.ts +19 -0
- package/dist/model/TotoDelegate.d.ts.map +1 -0
- package/dist/model/TotoDelegate.js +12 -0
- package/dist/model/TotoDelegate.js.map +1 -0
- package/dist/model/TotoEnvironment.d.ts +16 -0
- package/dist/model/TotoEnvironment.d.ts.map +1 -0
- package/dist/model/TotoEnvironment.js +2 -0
- package/dist/model/TotoEnvironment.js.map +1 -0
- package/dist/model/TotoPathOptions.d.ts +6 -0
- package/dist/model/TotoPathOptions.d.ts.map +1 -0
- package/dist/model/TotoPathOptions.js +2 -0
- package/dist/model/TotoPathOptions.js.map +1 -0
- package/dist/model/TotoRuntimeError.d.ts +7 -0
- package/dist/model/TotoRuntimeError.d.ts.map +1 -0
- package/dist/model/TotoRuntimeError.js +9 -0
- package/dist/model/TotoRuntimeError.js.map +1 -0
- package/dist/model/UserContext.d.ts +6 -0
- package/dist/model/UserContext.d.ts.map +1 -0
- package/dist/model/UserContext.js +2 -0
- package/dist/model/UserContext.js.map +1 -0
- package/dist/util/CorrelationId.d.ts +2 -0
- package/dist/util/CorrelationId.d.ts.map +1 -0
- package/dist/util/CorrelationId.js +7 -0
- package/dist/util/CorrelationId.js.map +1 -0
- package/dist/util/CrossCloudSecret.d.ts +10 -0
- package/dist/util/CrossCloudSecret.d.ts.map +1 -0
- package/dist/util/CrossCloudSecret.js +45 -0
- package/dist/util/CrossCloudSecret.js.map +1 -0
- package/dist/util/ErrorUtil.d.ts +3 -0
- package/dist/util/ErrorUtil.d.ts.map +1 -0
- package/dist/util/ErrorUtil.js +11 -0
- package/dist/util/ErrorUtil.js.map +1 -0
- package/dist/util/TokenUtil.d.ts +4 -0
- package/dist/util/TokenUtil.d.ts.map +1 -0
- package/dist/util/TokenUtil.js +21 -0
- package/dist/util/TokenUtil.js.map +1 -0
- package/dist/validation/GoogleAuthCheck.d.ts +7 -0
- package/dist/validation/GoogleAuthCheck.d.ts.map +1 -0
- package/dist/validation/GoogleAuthCheck.js +24 -0
- package/dist/validation/GoogleAuthCheck.js.map +1 -0
- package/dist/validation/Validator.d.ts +33 -0
- package/dist/validation/Validator.d.ts.map +1 -0
- package/dist/validation/Validator.js +111 -0
- package/dist/validation/Validator.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import https from "https";
|
|
2
|
+
import moment from "moment-timezone";
|
|
3
|
+
import * as crypto from 'crypto';
|
|
4
|
+
import { SNSClient, PublishCommand } from "@aws-sdk/client-sns";
|
|
5
|
+
import { ValidationError } from "../../../validation/Validator";
|
|
6
|
+
import { Logger } from "../../../logger/TotoLogger";
|
|
7
|
+
import { APubSubRequestValidator, IPubSub } from "../../IMessageBus";
|
|
8
|
+
export class SNSImpl extends IPubSub {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
super();
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.snsClient = new SNSClient({ region: this.config.awsRegion || "eu-north-1" });
|
|
13
|
+
}
|
|
14
|
+
getRequestValidator() {
|
|
15
|
+
return new SNSRequestValidator();
|
|
16
|
+
}
|
|
17
|
+
async publishMessage(destination, message) {
|
|
18
|
+
const logger = Logger.getInstance();
|
|
19
|
+
if (!destination.topic) {
|
|
20
|
+
throw new ValidationError(400, "Topic name is required for SNS publishing");
|
|
21
|
+
}
|
|
22
|
+
if (!destination.topic.startsWith("arn:aws:sns:")) {
|
|
23
|
+
throw new ValidationError(400, `Invalid SNS topic ARN: ${destination.topic}. It must start with 'arn:aws:sns:'`);
|
|
24
|
+
}
|
|
25
|
+
const topicArn = destination.topic;
|
|
26
|
+
if (!topicArn) {
|
|
27
|
+
throw new ValidationError(400, `Topic ARN not found for topic name: ${destination.topic}. Make sure the topic ARN is loaded.`);
|
|
28
|
+
}
|
|
29
|
+
logger.eventOut(message.cid, `Publishing message ${message.type} to SNS topic ${destination.topic}`);
|
|
30
|
+
try {
|
|
31
|
+
const command = new PublishCommand({
|
|
32
|
+
TopicArn: topicArn,
|
|
33
|
+
Message: JSON.stringify(message),
|
|
34
|
+
});
|
|
35
|
+
const response = await this.snsClient.send(command);
|
|
36
|
+
logger.eventOut(message.cid, `Message ${message.type} published to SNS topic ${destination.topic}. MessageId: ${response.MessageId}`);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
logger.compute(message.cid, `Failed to publish message ${message.type} to SNS Topic ${destination.topic}: ${error}`, "error");
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
filter(req) {
|
|
44
|
+
if (req.get('x-amz-sns-message-type') == 'SubscriptionConfirmation')
|
|
45
|
+
return new SNSSubscriptionConfirmationFilter();
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
convert(envelope) {
|
|
49
|
+
const logger = Logger.getInstance();
|
|
50
|
+
const req = envelope;
|
|
51
|
+
if (req.get('x-amz-sns-message-type') == 'SubscriptionConfirmation' || req.get('x-amz-sns-message-type') == 'UnsubscribeConfirmation') {
|
|
52
|
+
logger.compute('', `Confirming SNS subscription/unsubscription message.`);
|
|
53
|
+
return {
|
|
54
|
+
timestamp: moment().tz('Europe/Rome').format("YYYY.MM.DD HH:mm:ss"),
|
|
55
|
+
cid: '',
|
|
56
|
+
id: '',
|
|
57
|
+
type: req.get('x-amz-sns-message-type'),
|
|
58
|
+
msg: '',
|
|
59
|
+
data: req.body
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const message = req.body;
|
|
63
|
+
if (message.Type == 'SubscriptionConfirmation' || message.Type == 'UnsubscribeConfirmation')
|
|
64
|
+
return {
|
|
65
|
+
timestamp: moment().tz('Europe/Rome').format("YYYY.MM.DD HH:mm:ss"),
|
|
66
|
+
cid: '',
|
|
67
|
+
id: '',
|
|
68
|
+
type: message.Type,
|
|
69
|
+
msg: '',
|
|
70
|
+
data: message
|
|
71
|
+
};
|
|
72
|
+
if (message.Type == 'Notification') {
|
|
73
|
+
try {
|
|
74
|
+
const payload = JSON.parse(message.Message);
|
|
75
|
+
return {
|
|
76
|
+
timestamp: payload.timestamp,
|
|
77
|
+
cid: payload.cid,
|
|
78
|
+
id: payload.id,
|
|
79
|
+
type: payload.type,
|
|
80
|
+
msg: payload.msg,
|
|
81
|
+
data: payload.data
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error instanceof SyntaxError) {
|
|
86
|
+
logger.compute('', `SNS message is not a valid JSON: ${message.Message}`);
|
|
87
|
+
console.log(error);
|
|
88
|
+
throw new ValidationError(400, 'SNS message is not a valid JSON');
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
throw new ValidationError(400, `Unsupported SNS message type: ${message.Type}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
class SNSSubscriptionConfirmationFilter {
|
|
97
|
+
async handle(req) {
|
|
98
|
+
const logger = Logger.getInstance();
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const message = req.body;
|
|
101
|
+
const subscribeUrl = message.SubscribeURL;
|
|
102
|
+
logger.compute('', `Confirming SNS subscription: ${subscribeUrl}`);
|
|
103
|
+
https.get(subscribeUrl, {}, (response) => {
|
|
104
|
+
if (response.statusCode === 200) {
|
|
105
|
+
logger.compute('', `SNS subscription confirmed successfully.`);
|
|
106
|
+
resolve({ status: "processed", responsePayload: "SNS subscription confirmed successfully" });
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
logger.compute('', `Failed to confirm SNS subscription. Status: ${response.statusCode}`);
|
|
110
|
+
resolve({ status: "failed", responsePayload: `Error confirming SNS subscription: ${response.statusCode}` });
|
|
111
|
+
}
|
|
112
|
+
}).on('error', (err) => {
|
|
113
|
+
logger.compute('', `Error confirming SNS subscription: ${err.message}`);
|
|
114
|
+
resolve({ status: "failed", responsePayload: `Error confirming SNS subscription: ${err.message}` });
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export class SNSRequestValidator extends APubSubRequestValidator {
|
|
120
|
+
isRequestRecognized(req) {
|
|
121
|
+
const logger = Logger.getInstance();
|
|
122
|
+
if (req.get('x-amz-sns-message-type')) {
|
|
123
|
+
logger.compute('', `Received SNS request with header x-amz-sns-message-type: ${req.get("x-amz-sns-message-type")}`);
|
|
124
|
+
if (req.get('x-amz-sns-message-type') == 'SubscriptionConfirmation' || req.get('x-amz-sns-message-type') == 'UnsubscribeConfirmation' || req.get('x-amz-sns-message-type') == 'Notification')
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
async isRequestAuthorized(req) {
|
|
130
|
+
const logger = Logger.getInstance();
|
|
131
|
+
try {
|
|
132
|
+
if (req.get('x-amz-sns-message-type')) {
|
|
133
|
+
if (req.get('x-amz-sns-message-type') == 'SubscriptionConfirmation' || req.get('x-amz-sns-message-type') == 'UnsubscribeConfirmation' || req.get('x-amz-sns-message-type') == 'Notification')
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
const message = req.body;
|
|
137
|
+
if (!message || !message.Type || !message.Signature || !message.SigningCertURL) {
|
|
138
|
+
logger.compute('', 'SNS message missing required fields');
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
logger.compute('', `SNS message validated successfully. Type: ${message.Type}`);
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('SNS request validation error:', error);
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
isValidCertUrl(certUrl) {
|
|
150
|
+
try {
|
|
151
|
+
const url = new URL(certUrl);
|
|
152
|
+
return url.protocol === 'https:' && (url.hostname.endsWith('.amazonaws.com') || url.hostname === 'sns.amazonaws.com');
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async downloadCertificate(certUrl) {
|
|
159
|
+
return new Promise((resolve) => {
|
|
160
|
+
https.get(certUrl, (res) => {
|
|
161
|
+
let data = '';
|
|
162
|
+
res.on('data', (chunk) => data += chunk);
|
|
163
|
+
res.on('end', () => resolve(data));
|
|
164
|
+
}).on('error', (err) => {
|
|
165
|
+
console.error('Certificate download error:', err);
|
|
166
|
+
resolve(null);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
buildStringToSign(message) {
|
|
171
|
+
const fields = {
|
|
172
|
+
'Notification': ['Message', 'MessageId', 'Subject', 'Timestamp', 'TopicArn', 'Type'],
|
|
173
|
+
'SubscriptionConfirmation': ['Message', 'MessageId', 'SubscribeURL', 'Timestamp', 'Token', 'TopicArn', 'Type'],
|
|
174
|
+
'UnsubscribeConfirmation': ['Message', 'MessageId', 'SubscribeURL', 'Timestamp', 'Token', 'TopicArn', 'Type']
|
|
175
|
+
};
|
|
176
|
+
const messageType = message.Type;
|
|
177
|
+
const fieldList = fields[messageType];
|
|
178
|
+
if (!fieldList) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
let stringToSign = '';
|
|
182
|
+
for (const field of fieldList) {
|
|
183
|
+
if (message[field] !== undefined) {
|
|
184
|
+
stringToSign += `${field}\n${message[field]}\n`;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return stringToSign;
|
|
188
|
+
}
|
|
189
|
+
verifySignature(certificate, stringToSign, signature) {
|
|
190
|
+
try {
|
|
191
|
+
const verifier = crypto.createVerify('SHA1');
|
|
192
|
+
verifier.update(stringToSign, 'utf8');
|
|
193
|
+
return verifier.verify(certificate, signature, 'base64');
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.error('Signature verification error:', error);
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=SNSImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SNSImpl.js","sourceRoot":"","sources":["../../../../src/evt/impl/aws/SNSImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { APubSubRequestValidator, IQueue, MessageDestination } from '../../IMessageBus';
|
|
2
|
+
import { TotoMessage } from '../../TotoMessage';
|
|
3
|
+
export declare class SQSMessageBus extends IQueue {
|
|
4
|
+
private readonly queueName;
|
|
5
|
+
private readonly region;
|
|
6
|
+
private client;
|
|
7
|
+
private queueUrl;
|
|
8
|
+
private isPolling;
|
|
9
|
+
constructor(queueName: string, region: string);
|
|
10
|
+
getRequestValidator(): APubSubRequestValidator;
|
|
11
|
+
convert(envelope: any): TotoMessage;
|
|
12
|
+
initialize(): Promise<void>;
|
|
13
|
+
publishMessage(destination: MessageDestination, message: TotoMessage): Promise<void>;
|
|
14
|
+
pollQueue(): Promise<any[]>;
|
|
15
|
+
startPolling(): Promise<void>;
|
|
16
|
+
stopPolling(): void;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=SQSImpl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQSImpl.d.ts","sourceRoot":"","sources":["../../../../src/evt/impl/aws/SQSImpl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,qBAAa,aAAc,SAAQ,MAAM;IAMzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJvE,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAkB;gBAEN,SAAS,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAQ/E,mBAAmB,IAAI,uBAAuB;IAa9C,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,WAAW;IAQ7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,cAAc,CAAC,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpF,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAgB3B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAqDnC,WAAW,IAAI,IAAI;IASb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { SQSClient, SendMessageCommand, ReceiveMessageCommand, DeleteMessageCommand, GetQueueUrlCommand } from '@aws-sdk/client-sqs';
|
|
2
|
+
import { IQueue } from '../../IMessageBus';
|
|
3
|
+
import { Logger } from '../../../logger/TotoLogger';
|
|
4
|
+
export class SQSMessageBus extends IQueue {
|
|
5
|
+
constructor(queueName, region) {
|
|
6
|
+
super();
|
|
7
|
+
this.queueName = queueName;
|
|
8
|
+
this.region = region;
|
|
9
|
+
this.isPolling = false;
|
|
10
|
+
this.client = new SQSClient({ region: this.region });
|
|
11
|
+
this.startPolling();
|
|
12
|
+
}
|
|
13
|
+
getRequestValidator() {
|
|
14
|
+
return new SQSRequestValidator();
|
|
15
|
+
}
|
|
16
|
+
convert(envelope) {
|
|
17
|
+
const body = JSON.parse(envelope.Body || '{}');
|
|
18
|
+
return body;
|
|
19
|
+
}
|
|
20
|
+
async initialize() {
|
|
21
|
+
const command = new GetQueueUrlCommand({ QueueName: this.queueName });
|
|
22
|
+
const response = await this.client.send(command);
|
|
23
|
+
this.queueUrl = response.QueueUrl;
|
|
24
|
+
}
|
|
25
|
+
async publishMessage(destination, message) {
|
|
26
|
+
if (!this.queueUrl) {
|
|
27
|
+
await this.initialize();
|
|
28
|
+
}
|
|
29
|
+
const command = new SendMessageCommand({
|
|
30
|
+
QueueUrl: this.queueUrl,
|
|
31
|
+
MessageBody: JSON.stringify(message),
|
|
32
|
+
});
|
|
33
|
+
await this.client.send(command);
|
|
34
|
+
}
|
|
35
|
+
async pollQueue() {
|
|
36
|
+
const command = new ReceiveMessageCommand({
|
|
37
|
+
QueueUrl: this.queueUrl,
|
|
38
|
+
MaxNumberOfMessages: 10,
|
|
39
|
+
WaitTimeSeconds: 20,
|
|
40
|
+
});
|
|
41
|
+
const response = await this.client.send(command);
|
|
42
|
+
return response.Messages || [];
|
|
43
|
+
}
|
|
44
|
+
async startPolling() {
|
|
45
|
+
const logger = Logger.getInstance();
|
|
46
|
+
if (!this.queueUrl) {
|
|
47
|
+
await this.initialize();
|
|
48
|
+
}
|
|
49
|
+
if (this.isPolling) {
|
|
50
|
+
logger.compute("", 'Polling already started');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.isPolling = true;
|
|
54
|
+
logger.compute("", `Started polling SQS queue: ${this.queueName}`);
|
|
55
|
+
while (this.isPolling) {
|
|
56
|
+
try {
|
|
57
|
+
const messages = await this.pollQueue();
|
|
58
|
+
if (messages.length > 0) {
|
|
59
|
+
logger.compute("", `Received ${messages.length} message(s)`);
|
|
60
|
+
for (const msg of messages) {
|
|
61
|
+
await this.messageHandler(msg);
|
|
62
|
+
if (msg.ReceiptHandle) {
|
|
63
|
+
await this.client.send(new DeleteMessageCommand({
|
|
64
|
+
QueueUrl: this.queueUrl,
|
|
65
|
+
ReceiptHandle: msg.ReceiptHandle,
|
|
66
|
+
}));
|
|
67
|
+
logger.compute("", 'Message deleted from queue');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.compute("", `Error polling SQS: ${error}`);
|
|
74
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
stopPolling() {
|
|
79
|
+
const logger = Logger.getInstance();
|
|
80
|
+
logger.compute("", 'Stopping SQS polling');
|
|
81
|
+
this.isPolling = false;
|
|
82
|
+
}
|
|
83
|
+
async close() {
|
|
84
|
+
this.stopPolling();
|
|
85
|
+
this.client.destroy();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
class SQSRequestValidator {
|
|
89
|
+
isRequestAuthorized(req) {
|
|
90
|
+
return Promise.resolve(true);
|
|
91
|
+
}
|
|
92
|
+
isRequestRecognized(req) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=SQSImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQSImpl.js","sourceRoot":"","sources":["../../../../src/evt/impl/aws/SQSImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Request } from "express";
|
|
2
|
+
import { TotoMessage } from "../../TotoMessage";
|
|
3
|
+
import { APubSubRequestFilter, APubSubRequestValidator, IPubSub, MessageDestination } from "../../IMessageBus";
|
|
4
|
+
import { PubSub } from "@google-cloud/pubsub";
|
|
5
|
+
export declare class GCPPubSubImpl extends IPubSub {
|
|
6
|
+
expectedAudience: string;
|
|
7
|
+
pubsub: PubSub;
|
|
8
|
+
constructor({ expectedAudience }: {
|
|
9
|
+
expectedAudience: string;
|
|
10
|
+
});
|
|
11
|
+
filter(req: Request): APubSubRequestFilter | null;
|
|
12
|
+
getRequestValidator(): APubSubRequestValidator;
|
|
13
|
+
publishMessage(destination: MessageDestination, message: TotoMessage): Promise<void>;
|
|
14
|
+
convert(envelope: Request): TotoMessage;
|
|
15
|
+
}
|
|
16
|
+
export declare class GCPPubSubRequestValidator extends APubSubRequestValidator {
|
|
17
|
+
private readonly expectedAudience;
|
|
18
|
+
constructor(expectedAudience: string);
|
|
19
|
+
isRequestRecognized(req: Request): boolean;
|
|
20
|
+
isRequestAuthorized(req: Request): Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=GCPPubSubImpl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GCPPubSubImpl.d.ts","sourceRoot":"","sources":["../../../../src/evt/impl/gcp/GCPPubSubImpl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG/G,OAAO,EAAE,MAAM,EAAS,MAAM,sBAAsB,CAAC;AAIrD,qBAAa,aAAc,SAAQ,OAAO;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,gBAAgB,EAAE,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAO9D,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI;IAIjD,mBAAmB,IAAI,uBAAuB;IAIxC,cAAc,CAAC,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC1F,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW;CAc1C;AAOD,qBAAa,yBAA0B,SAAQ,uBAAuB;IAEtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,MAAM;IAIrD,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAqBpC,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAmB5D"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { ValidationError } from "../../../validation/Validator";
|
|
2
|
+
import { APubSubRequestValidator, IPubSub } from "../../IMessageBus";
|
|
3
|
+
import { googleAuthCheck } from "../../../validation/GoogleAuthCheck";
|
|
4
|
+
import { Logger } from "../../../logger/TotoLogger";
|
|
5
|
+
import { PubSub } from "@google-cloud/pubsub";
|
|
6
|
+
const topics = new Array();
|
|
7
|
+
export class GCPPubSubImpl extends IPubSub {
|
|
8
|
+
constructor({ expectedAudience }) {
|
|
9
|
+
super();
|
|
10
|
+
this.pubsub = new PubSub({ projectId: process.env.GCP_PID });
|
|
11
|
+
this.expectedAudience = expectedAudience;
|
|
12
|
+
}
|
|
13
|
+
filter(req) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
getRequestValidator() {
|
|
17
|
+
return new GCPPubSubRequestValidator(this.expectedAudience);
|
|
18
|
+
}
|
|
19
|
+
async publishMessage(destination, message) {
|
|
20
|
+
const logger = Logger.getInstance();
|
|
21
|
+
logger.eventOut(message.cid, "Publishing the event [ " + message.type + " ] for object with id [ " + message.id + " ]. The following message is to be published: [ " + message.msg + " ]", "info");
|
|
22
|
+
let topic = findTopicInCache(destination.topic);
|
|
23
|
+
if (!topic) {
|
|
24
|
+
logger.eventOut(message.cid, `Instantiating PubSub Topic for topic [${destination.topic}]`, "info");
|
|
25
|
+
topic = new TopicWrapper(destination.topic, this.pubsub.topic(destination.topic));
|
|
26
|
+
topics.push(topic);
|
|
27
|
+
logger.eventOut(message.cid, `PubSub Topic [${destination.topic}] instantiated!`, "info");
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
await topic.topic.publishMessage({ data: Buffer.from(message) });
|
|
31
|
+
logger.eventOut(message.cid, "Successfully published the event [ " + message.type + " ]", "info");
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
logger.eventOut(message.cid, "Publishing the event [ " + message.type + " ] failed. The following message had to be published: [ " + message.msg + " ]", "error");
|
|
35
|
+
logger.eventOut(message.cid, e, 'error');
|
|
36
|
+
console.error(e);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
convert(envelope) {
|
|
40
|
+
let msg = JSON.parse(String(Buffer.from(envelope.body.message.data, 'base64')));
|
|
41
|
+
return {
|
|
42
|
+
timestamp: msg.timestamp,
|
|
43
|
+
cid: msg.cid,
|
|
44
|
+
id: msg.id,
|
|
45
|
+
type: msg.type,
|
|
46
|
+
msg: msg.msg,
|
|
47
|
+
data: msg.data
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class GCPPubSubRequestValidator extends APubSubRequestValidator {
|
|
52
|
+
constructor(expectedAudience) {
|
|
53
|
+
super();
|
|
54
|
+
this.expectedAudience = expectedAudience;
|
|
55
|
+
}
|
|
56
|
+
isRequestRecognized(req) {
|
|
57
|
+
if (!req.body || typeof req.body !== 'object') {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const hasMessage = 'message' in req.body && typeof req.body.message === 'object';
|
|
61
|
+
if (!hasMessage) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const message = req.body.message;
|
|
65
|
+
const hasData = 'data' in message;
|
|
66
|
+
return hasData;
|
|
67
|
+
}
|
|
68
|
+
async isRequestAuthorized(req) {
|
|
69
|
+
const logger = Logger.getInstance();
|
|
70
|
+
const authorizationHeader = req.get('authorization');
|
|
71
|
+
if (!authorizationHeader)
|
|
72
|
+
throw new ValidationError(401, "No Authorization Header provided");
|
|
73
|
+
const expectedAudience = this.expectedAudience;
|
|
74
|
+
const googleAuthCheckResult = await googleAuthCheck("", authorizationHeader, expectedAudience, logger, false);
|
|
75
|
+
if (googleAuthCheckResult.email)
|
|
76
|
+
return true;
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
class TopicWrapper {
|
|
81
|
+
constructor(topicName, topic) {
|
|
82
|
+
this.topicName = topicName;
|
|
83
|
+
this.topic = topic;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const findTopicInCache = (topicName) => {
|
|
87
|
+
for (let topic of topics) {
|
|
88
|
+
if (topic.topicName == topicName)
|
|
89
|
+
return topic;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=GCPPubSubImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GCPPubSubImpl.js","sourceRoot":"","sources":["../../../../src/evt/impl/gcp/GCPPubSubImpl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAwB,uBAAuB,EAAE,OAAO,EAAsB,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAS,MAAM,sBAAsB,CAAC;AAErD,MAAM,MAAM,GAAG,IAAI,KAAK,EAAgB,CAAA;AAExC,MAAM,OAAO,aAAc,SAAQ,OAAO;IAItC,YAAY,EAAE,gBAAgB,EAAgC;QAC1D,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAY;QACf,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,mBAAmB;QACf,OAAO,IAAI,yBAAyB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAA+B,EAAE,OAAoB;QAEtE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEpC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,GAAG,0BAA0B,GAAG,OAAO,CAAC,EAAE,GAAG,kDAAkD,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnM,IAAI,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,KAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;YAET,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,yCAAyC,WAAW,CAAC,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;YAEpG,KAAK,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,KAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAM,CAAC,CAAC,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,WAAW,CAAC,KAAK,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC;YAED,MAAM,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAc,CAAQ,EAAE,CAAC,CAAC;YAE/E,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,qCAAqC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAEtG,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAEd,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,GAAG,0DAA0D,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YAClK,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAErB,CAAC;IACL,CAAC;IAED,OAAO,CAAC,QAAiB;QAErB,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;QAE/E,OAAO;YACH,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,IAAI,EAAE,GAAG,CAAC,IAAI;SACjB,CAAA;IACL,CAAC;CAEJ;AAOD,MAAM,OAAO,yBAA0B,SAAQ,uBAAuB;IAElE,YAA6B,gBAAwB;QACjD,KAAK,EAAE,CAAC;QADiB,qBAAgB,GAAhB,gBAAgB,CAAQ;IAErD,CAAC;IAED,mBAAmB,CAAC,GAAY;QAG5B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACjB,CAAC;QAGD,MAAM,UAAU,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;QAEjF,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QAGD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC;QAElC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,GAAY;QAElC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAGpC,MAAM,mBAAmB,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,CAAC,mBAAmB;YAAE,MAAM,IAAI,eAAe,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAA;QAE5F,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAE/C,MAAM,qBAAqB,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAE9G,IAAI,qBAAqB,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAE7C,OAAO,KAAK,CAAC;IAEjB,CAAC;CAEJ;AAED,MAAM,YAAY;IAKd,YAAY,SAAiB,EAAE,KAAY;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;CACJ;AAED,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,EAAE;IAE3C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS;YAAE,OAAO,KAAK,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { TotoAPIController, TotoControllerOptions } from './api/TotoAPIController';
|
|
2
|
+
export { newTotoServiceToken } from './auth/TotoToken';
|
|
3
|
+
export { TotoMessage } from './evt/TotoMessage';
|
|
4
|
+
export { Logger } from './logger/TotoLogger';
|
|
5
|
+
export { AUTH_PROVIDERS } from './model/AuthProviders';
|
|
6
|
+
export { TotoControllerConfig } from './model/TotoControllerConfig';
|
|
7
|
+
export { FakeRequest, TotoDelegate } from './model/TotoDelegate';
|
|
8
|
+
export { TotoPathOptions } from './model/TotoPathOptions';
|
|
9
|
+
export { TotoRuntimeError } from './model/TotoRuntimeError';
|
|
10
|
+
export { UserContext } from './model/UserContext';
|
|
11
|
+
export { APIOptions, APIConfiguration, TotoAPIEndpoint } from './model/APIConfiguration';
|
|
12
|
+
export { correlationId } from './util/CorrelationId';
|
|
13
|
+
export { SecretsManager } from './util/CrossCloudSecret';
|
|
14
|
+
export { basicallyHandleError } from './util/ErrorUtil';
|
|
15
|
+
export { googleAuthCheck } from './validation/GoogleAuthCheck';
|
|
16
|
+
export { ConfigMock, LazyValidator, ValidationError, Validator } from './validation/Validator';
|
|
17
|
+
export { RegistryCache } from './integration/RegistryCache';
|
|
18
|
+
export { TotoRegistryAPI } from './integration/TotoRegistryAPI';
|
|
19
|
+
export { TotoAPI, TotoAPIRequest, TotoAPIResponseConstructor } from './integration/TotoAPI';
|
|
20
|
+
export { TotoMicroservice, TotoMicroserviceConfiguration } from './core/TotoMicroservice';
|
|
21
|
+
export { TotoEnvironment, SupportedHyperscalers, AWSConfiguration, AzureConfiguration, GCPConfiguration } from './model/TotoEnvironment';
|
|
22
|
+
export { TotoMessageBus, MessageHandlerRegistrationOptions, TopicIdentifier, TotoMessageBusConfiguration } from './evt/MessageBus';
|
|
23
|
+
export { IPubSub, IMessageBus, IQueue, APubSubRequestFilter, APubSubRequestValidator, MessageDestination } from './evt/IMessageBus';
|
|
24
|
+
export { TotoMessageHandler, ProcessingResponse } from './evt/TotoMessageHandler';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AAC3F,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAA;AACzF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACxI,OAAO,EAAE,cAAc,EAAE,iCAAiC,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACnI,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACpI,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { TotoAPIController, TotoControllerOptions } from './api/TotoAPIController';
|
|
2
|
+
export { newTotoServiceToken } from './auth/TotoToken';
|
|
3
|
+
export { Logger } from './logger/TotoLogger';
|
|
4
|
+
export { AUTH_PROVIDERS } from './model/AuthProviders';
|
|
5
|
+
export { TotoControllerConfig } from './model/TotoControllerConfig';
|
|
6
|
+
export { TotoDelegate } from './model/TotoDelegate';
|
|
7
|
+
export { TotoRuntimeError } from './model/TotoRuntimeError';
|
|
8
|
+
export { correlationId } from './util/CorrelationId';
|
|
9
|
+
export { SecretsManager } from './util/CrossCloudSecret';
|
|
10
|
+
export { basicallyHandleError } from './util/ErrorUtil';
|
|
11
|
+
export { googleAuthCheck } from './validation/GoogleAuthCheck';
|
|
12
|
+
export { ConfigMock, LazyValidator, ValidationError, Validator } from './validation/Validator';
|
|
13
|
+
export { RegistryCache } from './integration/RegistryCache';
|
|
14
|
+
export { TotoRegistryAPI } from './integration/TotoRegistryAPI';
|
|
15
|
+
export { TotoAPI, TotoAPIRequest } from './integration/TotoAPI';
|
|
16
|
+
export { TotoMicroservice } from './core/TotoMicroservice';
|
|
17
|
+
export { TotoMessageBus } from './evt/MessageBus';
|
|
18
|
+
export { IPubSub, IMessageBus, IQueue, APubSubRequestValidator, MessageDestination } from './evt/IMessageBus';
|
|
19
|
+
export { TotoMessageHandler } from './evt/TotoMessageHandler';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAe,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,cAAc,EAA8B,MAAM,uBAAuB,CAAA;AAC3F,OAAO,EAAE,gBAAgB,EAAiC,MAAM,yBAAyB,CAAA;AAEzF,OAAO,EAAE,cAAc,EAAmF,MAAM,kBAAkB,CAAC;AACnI,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAwB,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACpI,OAAO,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { APIEndpoint } from "./TotoRegistryAPI";
|
|
2
|
+
import { TotoControllerConfig } from "..";
|
|
3
|
+
export interface RegistryCacheOptions {
|
|
4
|
+
ttlMinutes?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class RegistryCache {
|
|
7
|
+
private static instance;
|
|
8
|
+
private cache;
|
|
9
|
+
private lastRefreshTime;
|
|
10
|
+
private ttlMilliseconds;
|
|
11
|
+
private registryAPI;
|
|
12
|
+
private constructor();
|
|
13
|
+
static getInstance(config?: TotoControllerConfig, options?: RegistryCacheOptions): RegistryCache;
|
|
14
|
+
static resetInstance(): void;
|
|
15
|
+
getEndpoint(apiName: string): Promise<APIEndpoint | undefined>;
|
|
16
|
+
getAllEndpoints(): Promise<APIEndpoint[]>;
|
|
17
|
+
private refreshIfNeeded;
|
|
18
|
+
refresh(): Promise<void>;
|
|
19
|
+
invalidate(): void;
|
|
20
|
+
clear(): void;
|
|
21
|
+
size(): number;
|
|
22
|
+
isValid(): boolean;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=RegistryCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegistryCache.d.ts","sourceRoot":"","sources":["../../src/integration/RegistryCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAU,oBAAoB,EAAoB,MAAM,IAAI,CAAC;AAOpE,MAAM,WAAW,oBAAoB;IAKjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD,qBAAa,aAAa;IAEtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IAErD,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAkB;IAErC,OAAO;IAYP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa;IAahG,MAAM,CAAC,aAAa,IAAI,IAAI;IAWtB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAW9D,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAWjC,eAAe;IAcvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B9B,UAAU,IAAI,IAAI;IAUlB,KAAK,IAAI,IAAI;IAab,IAAI,IAAI,MAAM;IASd,OAAO,IAAI,OAAO;CAIrB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { TotoRegistryAPI } from "./TotoRegistryAPI";
|
|
2
|
+
import { Logger, TotoRuntimeError } from "..";
|
|
3
|
+
const DEFAULT_TTL_MINUTES = 30;
|
|
4
|
+
export class RegistryCache {
|
|
5
|
+
constructor(config, options) {
|
|
6
|
+
this.cache = new Map();
|
|
7
|
+
this.lastRefreshTime = 0;
|
|
8
|
+
this.registryAPI = new TotoRegistryAPI(config);
|
|
9
|
+
this.ttlMilliseconds = (options?.ttlMinutes ?? DEFAULT_TTL_MINUTES) * 60 * 1000;
|
|
10
|
+
}
|
|
11
|
+
static getInstance(config, options) {
|
|
12
|
+
if (!RegistryCache.instance) {
|
|
13
|
+
if (!config)
|
|
14
|
+
throw new TotoRuntimeError(500, "RegistryCache not initialized. Config is required on first call to getInstance(). This is a configuration error in your application.");
|
|
15
|
+
RegistryCache.instance = new RegistryCache(config, options);
|
|
16
|
+
}
|
|
17
|
+
return RegistryCache.instance;
|
|
18
|
+
}
|
|
19
|
+
static resetInstance() {
|
|
20
|
+
RegistryCache.instance = null;
|
|
21
|
+
}
|
|
22
|
+
async getEndpoint(apiName) {
|
|
23
|
+
await this.refreshIfNeeded();
|
|
24
|
+
return this.cache.get(apiName);
|
|
25
|
+
}
|
|
26
|
+
async getAllEndpoints() {
|
|
27
|
+
await this.refreshIfNeeded();
|
|
28
|
+
return Array.from(this.cache.values());
|
|
29
|
+
}
|
|
30
|
+
async refreshIfNeeded() {
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const isExpired = (now - this.lastRefreshTime) > this.ttlMilliseconds;
|
|
33
|
+
const isEmpty = this.cache.size === 0;
|
|
34
|
+
if (isEmpty || isExpired) {
|
|
35
|
+
await this.refresh();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async refresh() {
|
|
39
|
+
const logger = Logger.getInstance();
|
|
40
|
+
try {
|
|
41
|
+
const response = await this.registryAPI.getAPIs();
|
|
42
|
+
this.cache.clear();
|
|
43
|
+
response.apis.forEach(api => {
|
|
44
|
+
this.cache.set(api.apiName, api);
|
|
45
|
+
});
|
|
46
|
+
this.lastRefreshTime = Date.now();
|
|
47
|
+
logger?.compute("REFRESH", `Registry cache refreshed with ${this.cache.size} API endpoints`);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger?.compute("REFRESH", `Failed to refresh registry cache: ${error}`);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
invalidate() {
|
|
55
|
+
const logger = Logger.getInstance();
|
|
56
|
+
this.lastRefreshTime = 0;
|
|
57
|
+
logger?.compute("", 'Registry cache invalidated');
|
|
58
|
+
}
|
|
59
|
+
clear() {
|
|
60
|
+
const logger = Logger.getInstance();
|
|
61
|
+
this.cache.clear();
|
|
62
|
+
this.lastRefreshTime = 0;
|
|
63
|
+
logger?.compute("", 'Registry cache cleared');
|
|
64
|
+
}
|
|
65
|
+
size() {
|
|
66
|
+
return this.cache.size;
|
|
67
|
+
}
|
|
68
|
+
isValid() {
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
return this.cache.size > 0 && (now - this.lastRefreshTime) <= this.ttlMilliseconds;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
RegistryCache.instance = null;
|
|
74
|
+
//# sourceMappingURL=RegistryCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegistryCache.js","sourceRoot":"","sources":["../../src/integration/RegistryCache.ts"],"names":[],"mappings":"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"}
|