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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/dist/api/TotoAPIController.d.ts +30 -0
  4. package/dist/api/TotoAPIController.d.ts.map +1 -0
  5. package/dist/api/TotoAPIController.js +226 -0
  6. package/dist/api/TotoAPIController.js.map +1 -0
  7. package/dist/auth/TotoToken.d.ts +3 -0
  8. package/dist/auth/TotoToken.d.ts.map +1 -0
  9. package/dist/auth/TotoToken.js +8 -0
  10. package/dist/auth/TotoToken.js.map +1 -0
  11. package/dist/core/TotoMicroservice.d.ts +27 -0
  12. package/dist/core/TotoMicroservice.d.ts.map +1 -0
  13. package/dist/core/TotoMicroservice.js +52 -0
  14. package/dist/core/TotoMicroservice.js.map +1 -0
  15. package/dist/dlg/SmokeDelegate.d.ts +12 -0
  16. package/dist/dlg/SmokeDelegate.d.ts.map +1 -0
  17. package/dist/dlg/SmokeDelegate.js +10 -0
  18. package/dist/dlg/SmokeDelegate.js.map +1 -0
  19. package/dist/evt/IMessageBus.d.ts +35 -0
  20. package/dist/evt/IMessageBus.d.ts.map +1 -0
  21. package/dist/evt/IMessageBus.js +21 -0
  22. package/dist/evt/IMessageBus.js.map +1 -0
  23. package/dist/evt/MessageBus.d.ts +37 -0
  24. package/dist/evt/MessageBus.d.ts.map +1 -0
  25. package/dist/evt/MessageBus.js +81 -0
  26. package/dist/evt/MessageBus.js.map +1 -0
  27. package/dist/evt/TotoMessage.d.ts +9 -0
  28. package/dist/evt/TotoMessage.d.ts.map +1 -0
  29. package/dist/evt/TotoMessage.js +2 -0
  30. package/dist/evt/TotoMessage.js.map +1 -0
  31. package/dist/evt/TotoMessageHandler.d.ts +16 -0
  32. package/dist/evt/TotoMessageHandler.d.ts.map +1 -0
  33. package/dist/evt/TotoMessageHandler.js +14 -0
  34. package/dist/evt/TotoMessageHandler.js.map +1 -0
  35. package/dist/evt/impl/aws/SNSImpl.d.ts +24 -0
  36. package/dist/evt/impl/aws/SNSImpl.d.ts.map +1 -0
  37. package/dist/evt/impl/aws/SNSImpl.js +201 -0
  38. package/dist/evt/impl/aws/SNSImpl.js.map +1 -0
  39. package/dist/evt/impl/aws/SQSImpl.d.ts +19 -0
  40. package/dist/evt/impl/aws/SQSImpl.d.ts.map +1 -0
  41. package/dist/evt/impl/aws/SQSImpl.js +96 -0
  42. package/dist/evt/impl/aws/SQSImpl.js.map +1 -0
  43. package/dist/evt/impl/gcp/GCPPubSubImpl.d.ts +22 -0
  44. package/dist/evt/impl/gcp/GCPPubSubImpl.d.ts.map +1 -0
  45. package/dist/evt/impl/gcp/GCPPubSubImpl.js +93 -0
  46. package/dist/evt/impl/gcp/GCPPubSubImpl.js.map +1 -0
  47. package/dist/index.d.ts +25 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +20 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/integration/RegistryCache.d.ts +24 -0
  52. package/dist/integration/RegistryCache.d.ts.map +1 -0
  53. package/dist/integration/RegistryCache.js +74 -0
  54. package/dist/integration/RegistryCache.js.map +1 -0
  55. package/dist/integration/TotoAPI.d.ts +22 -0
  56. package/dist/integration/TotoAPI.d.ts.map +1 -0
  57. package/dist/integration/TotoAPI.js +84 -0
  58. package/dist/integration/TotoAPI.js.map +1 -0
  59. package/dist/integration/TotoRegistryAPI.d.ts +26 -0
  60. package/dist/integration/TotoRegistryAPI.d.ts.map +1 -0
  61. package/dist/integration/TotoRegistryAPI.js +67 -0
  62. package/dist/integration/TotoRegistryAPI.js.map +1 -0
  63. package/dist/logger/TotoLogger.d.ts +13 -0
  64. package/dist/logger/TotoLogger.d.ts.map +1 -0
  65. package/dist/logger/TotoLogger.js +48 -0
  66. package/dist/logger/TotoLogger.js.map +1 -0
  67. package/dist/model/APIConfiguration.d.ts +17 -0
  68. package/dist/model/APIConfiguration.d.ts.map +1 -0
  69. package/dist/model/APIConfiguration.js +2 -0
  70. package/dist/model/APIConfiguration.js.map +1 -0
  71. package/dist/model/AuthProviders.d.ts +5 -0
  72. package/dist/model/AuthProviders.d.ts.map +1 -0
  73. package/dist/model/AuthProviders.js +5 -0
  74. package/dist/model/AuthProviders.js.map +1 -0
  75. package/dist/model/TotoControllerConfig.d.ts +29 -0
  76. package/dist/model/TotoControllerConfig.d.ts.map +1 -0
  77. package/dist/model/TotoControllerConfig.js +77 -0
  78. package/dist/model/TotoControllerConfig.js.map +1 -0
  79. package/dist/model/TotoDelegate.d.ts +19 -0
  80. package/dist/model/TotoDelegate.d.ts.map +1 -0
  81. package/dist/model/TotoDelegate.js +12 -0
  82. package/dist/model/TotoDelegate.js.map +1 -0
  83. package/dist/model/TotoEnvironment.d.ts +16 -0
  84. package/dist/model/TotoEnvironment.d.ts.map +1 -0
  85. package/dist/model/TotoEnvironment.js +2 -0
  86. package/dist/model/TotoEnvironment.js.map +1 -0
  87. package/dist/model/TotoPathOptions.d.ts +6 -0
  88. package/dist/model/TotoPathOptions.d.ts.map +1 -0
  89. package/dist/model/TotoPathOptions.js +2 -0
  90. package/dist/model/TotoPathOptions.js.map +1 -0
  91. package/dist/model/TotoRuntimeError.d.ts +7 -0
  92. package/dist/model/TotoRuntimeError.d.ts.map +1 -0
  93. package/dist/model/TotoRuntimeError.js +9 -0
  94. package/dist/model/TotoRuntimeError.js.map +1 -0
  95. package/dist/model/UserContext.d.ts +6 -0
  96. package/dist/model/UserContext.d.ts.map +1 -0
  97. package/dist/model/UserContext.js +2 -0
  98. package/dist/model/UserContext.js.map +1 -0
  99. package/dist/util/CorrelationId.d.ts +2 -0
  100. package/dist/util/CorrelationId.d.ts.map +1 -0
  101. package/dist/util/CorrelationId.js +7 -0
  102. package/dist/util/CorrelationId.js.map +1 -0
  103. package/dist/util/CrossCloudSecret.d.ts +10 -0
  104. package/dist/util/CrossCloudSecret.d.ts.map +1 -0
  105. package/dist/util/CrossCloudSecret.js +45 -0
  106. package/dist/util/CrossCloudSecret.js.map +1 -0
  107. package/dist/util/ErrorUtil.d.ts +3 -0
  108. package/dist/util/ErrorUtil.d.ts.map +1 -0
  109. package/dist/util/ErrorUtil.js +11 -0
  110. package/dist/util/ErrorUtil.js.map +1 -0
  111. package/dist/util/TokenUtil.d.ts +4 -0
  112. package/dist/util/TokenUtil.d.ts.map +1 -0
  113. package/dist/util/TokenUtil.js +21 -0
  114. package/dist/util/TokenUtil.js.map +1 -0
  115. package/dist/validation/GoogleAuthCheck.d.ts +7 -0
  116. package/dist/validation/GoogleAuthCheck.d.ts.map +1 -0
  117. package/dist/validation/GoogleAuthCheck.js +24 -0
  118. package/dist/validation/GoogleAuthCheck.js.map +1 -0
  119. package/dist/validation/Validator.d.ts +33 -0
  120. package/dist/validation/Validator.d.ts.map +1 -0
  121. package/dist/validation/Validator.js +111 -0
  122. package/dist/validation/Validator.js.map +1 -0
  123. 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":"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"}
@@ -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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"}