totoms 1.0.3 → 1.1.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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Nicolas Matteazzi
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nicolas Matteazzi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,413 +1,435 @@
1
- # Toto Microservice SDK - NodeJS
2
-
3
- The Toto Microservice SDK is a framework for building cloud-agnostic microservices. <br>
4
- This is the NodeJS SDK documentation.
5
-
6
- ## Table of Contents
7
-
8
- 1. [Installation](#1-installation)
9
- 2. [Overview](#2-overview)
10
- 3. [Usage](#3-usage)
11
- - [3.1. The Toto Microservice Configuration](#31-the-toto-microservice-configuration)
12
- - [3.2. Create and Register APIs](#32-create-and-register-apis)
13
- - [3.3. Use a Message Bus](#33-use-a-message-bus)
14
- - [3.4. Load Secrets](#34-load-secrets)
15
- - [3.5. Custom Configurations](#35-custom-configurations)
16
-
17
- Other:
18
- * [Build and Deploy on NPM](./docs/buildpublish.md)
19
-
20
- ## 1. Installation
21
-
22
- ```bash
23
- npm install totoms
24
- ```
25
-
26
- ### Cloud-Specific Dependencies
27
-
28
- Install the peer dependencies for your target cloud platform:
29
-
30
- **AWS:**
31
- ```bash
32
- npm install @aws-sdk/client-secrets-manager @aws-sdk/client-sns @aws-sdk/client-sqs
33
- ```
34
-
35
- **GCP:**
36
- ```bash
37
- npm install @google-cloud/pubsub @google-cloud/secret-manager
38
- ```
39
-
40
- ## 2. Overview
41
-
42
- Everything starts with `TotoMicroservice` and the `TotoMicroserviceConfiguration`.<br>
43
- `TotoMicroservice` is the main orchestrator that coordinates your entire microservice. It initializes and manages:
44
-
45
- - **API Controller & API Endpoints**: Express-based REST API setup with automatic endpoint registration
46
- - **Message Bus & Message Handlers**: Event-driven communication via Pub/Sub and Queues. Registration and routing of event handlers to appropriate topics.
47
- - **Secrets Management**: Automatic loading of secrets from your cloud provider
48
- - **Service Lifecycle**: Initialization, startup, and shutdown management
49
-
50
- The configuration is **declarative**. The goal is to make it very simple to configure a full microservice, with a syntax that will look like this:
51
-
52
- ```typescript
53
- import { TotoMicroservice, TotoMicroserviceConfiguration } from 'totoms';
54
-
55
- const config: TotoMicroserviceConfiguration = {
56
- serviceName: "my-service",
57
- basePath: '/myservice',
58
- environment: {
59
- hyperscaler: "aws", // or "gcp", "azure"
60
- aws: {
61
- region: "us-east-1"
62
- }
63
- },
64
- config: new MyControllerConfig()
65
- };
66
-
67
- await TotoMicroservice.init(config);
68
- ```
69
-
70
- The `TotoMicroserviceConfiguration` object specifies:
71
-
72
- - **Service Metadata**: Service name and base path for API endpoints
73
- - **Environment**: Cloud provider (AWS, GCP, Azure) information
74
- - **API Configuration**: REST endpoints with their handlers
75
- - **Message Bus Configuration**: Topics to subscribe to and message handlers
76
- - **Custom Configuration**: Your application-specific settings
77
-
78
- ## 3. Usage
79
-
80
- ### 3.1. The Toto Microservice Configuration
81
-
82
- The microservice is configured through the `TotoMicroserviceConfiguration` object and the `TotoControllerConfig` base class.
83
-
84
- ```typescript
85
- import { TotoControllerConfig } from 'totoms';
86
-
87
- export class MyControllerConfig extends TotoControllerConfig {
88
-
89
- mongoUser: string | undefined;
90
- mongoPwd: string | undefined;
91
-
92
- getMongoSecretNames() {
93
- return {
94
- userSecretName: 'my-mongo-user',
95
- pwdSecretName: 'my-mongo-pswd'
96
- };
97
- }
98
-
99
- getDBName() {
100
- return 'mydb'
101
- }
102
-
103
- getCollections() {
104
- return { users: 'users' }
105
- }
106
- }
107
- ```
108
-
109
- ### 3.2. Create and Register APIs
110
-
111
- Your microservice exposes REST API endpoints using Express. <br>
112
- Endpoints are defined when creating the API controller and are automatically set up.
113
-
114
- #### Create a Toto Delegate
115
-
116
- Every endpoint needs to be managed by a **Toto Delegate**. <br>
117
- Toto Delegates implement the `TotoDelegate` interface.
118
-
119
- This is how you define a Toto Delegate. <br>
120
- *The following example shows a delegate that processes user creation*.
121
-
122
- ```typescript
123
- import { TotoDelegate, UserContext } from 'totoms';
124
- import { Request } from 'express';
125
-
126
- class CreateUserDelegate implements TotoDelegate {
127
- async do(req: Request, userContext: UserContext, config: any) {
128
- // Extract data from the request
129
- const { name, email } = req.body;
130
-
131
- // Your business logic here
132
- const userId = await createUser(name, email);
133
-
134
- // Return the response
135
- return {
136
- userId,
137
- status: "success"
138
- };
139
- }
140
- }
141
- ```
142
-
143
- #### Register Your Delegate
144
-
145
- You can now register your endpoints with the API controller:
146
-
147
- ```typescript
148
- import { TotoAPIController } from 'totoms';
149
-
150
- const api = new TotoAPIController(config, { basePath: '/myservice' });
151
-
152
- // Register the endpoint
153
- api.path('POST', '/users', new CreateUserDelegate());
154
-
155
- // Start listening
156
- api.listen();
157
- ```
158
-
159
- The microservice will start an Express application with all registered endpoints available at the specified base path.
160
-
161
- ---
162
-
163
- ### 3.3. Use a Message Bus
164
-
165
- The Message Bus enables event-driven communication between microservices.<br>
166
- It supports both PUSH (webhook-based from cloud Pub/Sub) and PULL (polling) delivery models, depending on your cloud provider and configuration.
167
-
168
- #### 3.3.1. React to Messages
169
-
170
- Message handlers are the primary way to react to events.
171
-
172
- ##### Create a Message Handler
173
-
174
- Create a handler by **extending** `TotoMessageHandler` and implementing the required methods:
175
-
176
- ```typescript
177
- import { TotoMessageHandler, TotoMessage, ProcessingResponse } from 'totoms';
178
-
179
- class TopicRefreshedEventHandler extends TotoMessageHandler {
180
-
181
- getHandledMessageType(): string {
182
- // Return the message type this handler processes
183
- return "topicRefreshed";
184
- }
185
-
186
- async processMessage(message: TotoMessage): Promise<ProcessingResponse> {
187
- // Access message metadata
188
- const correlationId = message.correlationId;
189
- const messageId = message.id;
190
-
191
- // Extract event data
192
- const topicName = message.payload.name;
193
- const blogUrl = message.payload.blogURL;
194
- const user = message.payload.user;
195
-
196
- // Your handler has access to context
197
- this.logger.compute(correlationId, `Processing topic refresh for: ${topicName}`);
198
-
199
- // Perform your business logic
200
- await this.refreshTopic(topicName, blogUrl, user);
201
-
202
- // Return success or failure
203
- return { success: true };
204
- }
205
-
206
- private async refreshTopic(name: string, url: string, user: string) {
207
- // Implementation here
208
- }
209
- }
210
- ```
211
-
212
- ##### Register a Message Handler
213
-
214
- Register your message handlers with the message bus configuration.
215
-
216
- **IMPORTANT NOTE:** <br>
217
- * When using PubSub infrastructure, you need to register topics. <br>
218
- Topics are registered by giving them:
219
- * A `logical name` which is the name that will be used in the application to reference the topic.
220
- * A topic identifier (e.g., ARN on AWS or fully-qualified Topic Name on GCP)
221
-
222
- ```typescript
223
- import { TotoMessageBus, MessageHandlerRegistrationOptions } from 'totoms';
224
-
225
- const messageBus = new TotoMessageBus(config, environment);
226
-
227
- // Register topics
228
- messageBus.registerTopic({
229
- logicalName: "topic-events",
230
- topicName: process.env.TOPIC_EVENTS_TOPIC_NAME! // From environment or secrets
231
- });
232
-
233
- // Register message handlers
234
- const handlerOptions: MessageHandlerRegistrationOptions = {
235
- topic: { logicalName: "topic-events" }
236
- };
237
-
238
- messageBus.registerMessageHandler(
239
- new TopicRefreshedEventHandler(),
240
- handlerOptions
241
- );
242
- ```
243
-
244
- When the microservice starts, it automatically subscribes to the configured topics and routes incoming messages to the appropriate handlers based on their message type.
245
-
246
- #### 3.3.2. Publish Messages
247
-
248
- You can always publish messages to topics.
249
-
250
- **NOTE:**
251
- * In the Message Destination, the topic is the **logical name of the topic** (see above).
252
-
253
- ```typescript
254
- import { TotoMessage, MessageDestination } from 'totoms';
255
-
256
- async function publishTopicUpdate(messageBus: any, topicId: string, topicName: string) {
257
- // Create the message
258
- const message = new TotoMessage({
259
- type: "topicUpdated",
260
- correlationId: "correlation-id-123",
261
- id: topicId,
262
- payload: {
263
- name: topicName,
264
- timestamp: new Date().toISOString()
265
- }
266
- });
267
-
268
- const destination: MessageDestination = {
269
- topicName: "topic-events"
270
- };
271
-
272
- await messageBus.publishMessage(destination, message);
273
- }
274
- ```
275
-
276
- ##### Getting Access to the Message Bus
277
-
278
- There are different ways to get access to the Message Bus instance:
279
-
280
- * Through the `TotoMicroservice` singleton: <br>
281
- `TotoMicroservice.getInstance().messageBus`
282
-
283
- * Through an existing instance of `TotoMicroservice`
284
-
285
- * In a `TotoMessageHandler` you will have `messageBus` as an instance variable: <br>
286
- `this.messageBus`
287
-
288
- * In a `TotoDelegate`, you can access it through the config or by maintaining a reference in your application
289
-
290
- ---
291
-
292
- ### 3.4. Load Secrets
293
-
294
- The SDK handles secret loading from your cloud provider automatically. Access secrets through the configuration or use the `SecretsManager` directly:
295
-
296
- ```typescript
297
- import { SecretsManager } from 'totoms';
298
-
299
- const secrets = new SecretsManager({ hyperscaler: "aws" });
300
-
301
- // Load a secret by name
302
- const apiKey = await secrets.getSecret("api-key");
303
- const databaseUrl = await secrets.getSecret("database-url");
304
- ```
305
-
306
- Secrets are typically stored as environment variable names or secret manager references, depending on your deployment environment.
307
-
308
- ---
309
-
310
- ### 3.5. Custom Configurations
311
-
312
- You can define your own custom configurations by extending the `TotoControllerConfig` base class.
313
-
314
- An example:
315
-
316
- ```typescript
317
- import { TotoControllerConfig } from 'totoms';
318
-
319
- export class MyServiceConfig extends TotoControllerConfig {
320
-
321
- apiKey: string | undefined;
322
-
323
- async load(): Promise<void> {
324
- // Load secrets using the secrets manager
325
- this.apiKey = await this.secretsManager.getSecret("my-api-key");
326
- }
327
-
328
- getMongoSecretNames() {
329
- // Return null if your service doesn't use MongoDB
330
- return null;
331
- }
332
- }
333
- ```
334
-
335
- What you can do with a Custom Configuration:
336
-
337
- 1. **Load Secrets** <br>
338
- You can do that by overriding the `load()` async method and using `this.secretsManager.getSecret("your-secret-name")` to load secrets.
339
-
340
- 2. **Configure MongoDB** <br>
341
- Override `getMongoSecretNames()`, `getDBName()`, and `getCollections()` to configure MongoDB integration.
342
-
343
- 3. **Custom Authentication** <br>
344
- Override `getCustomAuthVerifier()` to provide custom authentication logic.
345
-
346
- ## Core Components
347
-
348
- ### TotoAPIController
349
- The main controller for building REST APIs with Express. Provides:
350
- - Automatic route registration
351
- - Built-in validation
352
- - CORS support
353
- - Health check endpoints
354
- - File upload support
355
- - API documentation generation
356
-
357
- ### TotoMicroservice
358
- High-level wrapper that initializes the entire microservice stack including API controller, message bus, and environment configuration.
359
-
360
- ### TotoMessageBus
361
- Unified interface for pub/sub messaging across cloud platforms:
362
- - **AWS**: SNS/SQS
363
- - **GCP**: Cloud Pub/Sub
364
- - **Azure**: Service Bus (in development)
365
-
366
- ### TotoControllerConfig
367
- Base configuration class for microservices with support for:
368
- - MongoDB connection management
369
- - Authentication settings
370
- - Secrets management
371
- - Custom validators
372
-
373
- ### Logger
374
- Structured logging with correlation ID support for request tracing.
375
-
376
- ### Validator
377
- Request validation framework with support for:
378
- - JWT token validation
379
- - Google OAuth
380
- - Custom validation logic
381
-
382
- ## Cloud Platform Support
383
-
384
- ### AWS
385
- - **Messaging**: SNS (topics), SQS (queues)
386
- - **Secrets**: AWS Secrets Manager
387
- - **Region Configuration**: Configurable per service
388
-
389
- ### GCP
390
- - **Messaging**: Cloud Pub/Sub
391
- - **Secrets**: Secret Manager
392
- - **Project Configuration**: Uses default project credentials
393
-
394
- ### Azure
395
- - **Messaging**: Service Bus (in development)
396
- - **Secrets**: Key Vault (in development)
397
-
398
- ## License
399
-
400
- MIT
401
-
402
- ## Author
403
-
404
- nicolasances
405
-
406
- ## Contributing
407
-
408
- Contributions are welcome! Please feel free to submit a Pull Request to the [toto-microservice-sdk repository](https://github.com/nicolasances/toto-microservice-sdk).
409
-
410
- ## Related Projects
411
-
412
- - [Toto Ecosystem](https://github.com/nicolasances/toto)
413
- - [Python Toto Microservice SDK](../python)
1
+ # Toto Microservice SDK - NodeJS
2
+
3
+ The Toto Microservice SDK is a framework for building cloud-agnostic microservices. <br>
4
+ This is the NodeJS SDK documentation.
5
+
6
+ ## Table of Contents
7
+
8
+ 1. [Installation](#1-installation)
9
+ 2. [Overview](#2-overview)
10
+ 3. [Usage](#3-usage)
11
+ - [3.1. The Toto Microservice Configuration](#31-the-toto-microservice-configuration)
12
+ - [3.2. Create and Register APIs](#32-create-and-register-apis)
13
+ * [Exposing the OpenAPI Spec through Swagger UI](#exposing-the-openapi-spec-through-swagger-ui)
14
+ - [3.3. Use a Message Bus](#33-use-a-message-bus)
15
+ - [3.4. Load Secrets](#34-load-secrets)
16
+ - [3.5. Custom Configurations](#35-custom-configurations)
17
+
18
+ Other:
19
+ * [Build and Deploy on NPM](./docs/buildpublish.md)
20
+
21
+ ## 1. Installation
22
+
23
+ ```bash
24
+ npm install totoms
25
+ ```
26
+
27
+ ### Cloud-Specific Dependencies
28
+
29
+ Install the peer dependencies for your target cloud platform:
30
+
31
+ **AWS:**
32
+ ```bash
33
+ npm install @aws-sdk/client-secrets-manager @aws-sdk/client-sns @aws-sdk/client-sqs
34
+ ```
35
+
36
+ **GCP:**
37
+ ```bash
38
+ npm install @google-cloud/pubsub @google-cloud/secret-manager
39
+ ```
40
+
41
+ ## 2. Overview
42
+
43
+ Everything starts with `TotoMicroservice` and the `TotoMicroserviceConfiguration`.<br>
44
+ `TotoMicroservice` is the main orchestrator that coordinates your entire microservice. It initializes and manages:
45
+
46
+ - **API Controller & API Endpoints**: Express-based REST API setup with automatic endpoint registration
47
+ - **Message Bus & Message Handlers**: Event-driven communication via Pub/Sub and Queues. Registration and routing of event handlers to appropriate topics.
48
+ - **Secrets Management**: Automatic loading of secrets from your cloud provider
49
+ - **Service Lifecycle**: Initialization, startup, and shutdown management
50
+
51
+ The configuration is **declarative**. The goal is to make it very simple to configure a full microservice, with a syntax that will look like this:
52
+
53
+ ```typescript
54
+ import { getHyperscalerConfiguration, SupportedHyperscalers, TotoMicroservice, TotoMicroserviceConfiguration } from 'totoms';
55
+ import { ControllerConfig } from "./Config";
56
+ import { SayHello } from './dlg/ExampleDelegate';
57
+
58
+
59
+ const config: TotoMicroserviceConfiguration = {
60
+ serviceName: "toto-ms-ex1",
61
+ basePath: '/ex1',
62
+ environment: {
63
+ hyperscaler: process.env.HYPERSCALER as SupportedHyperscalers || "aws",
64
+ hyperscalerConfiguration: getHyperscalerConfiguration()
65
+ },
66
+ customConfiguration: ControllerConfig,
67
+ apiConfiguration: {
68
+ apiEndpoints: [
69
+ { method: 'GET', path: '/hello', delegate: SayHello }
70
+ ],
71
+ apiOptions: { noCorrelationId: true }
72
+ },
73
+ };
74
+
75
+ TotoMicroservice.init(config).then(microservice => {
76
+ microservice.start();
77
+ });
78
+ ```
79
+
80
+ A **few things you should pay attention to**:
81
+ * `ControllerConfig` - that's your custom configuration class, that you can use to do any type of custom initialization and work (e.g. loading secrets). <br>
82
+ You can find [more details in this section](#31-the-toto-microservice-configuration)
83
+
84
+ The `TotoMicroserviceConfiguration` object specifies:
85
+
86
+ - **Service Metadata**: Service name and base path for API endpoints
87
+ - **Environment**: Cloud provider (AWS, GCP, Azure) information
88
+ - **API Configuration**: REST endpoints with their handlers
89
+ - **Message Bus Configuration**: Topics to subscribe to and message handlers
90
+ - **Custom Configuration**: Your application-specific settings
91
+
92
+ ## 3. Usage
93
+
94
+ ### 3.1. The Toto Microservice Configuration
95
+
96
+ The microservice is configured through the `TotoMicroserviceConfiguration` object and the `TotoControllerConfig` base class. <br>
97
+ As seen above, you need to define a **Custom Configuration Class** that extends the `TotoControllerConfig` base class as shown below here.
98
+
99
+ ```typescript
100
+ import { TotoControllerConfig } from 'totoms';
101
+
102
+ export class ControllerConfig extends TotoControllerConfig {
103
+
104
+ getMongoSecretNames(): { userSecretName: string; pwdSecretName: string; } | null {
105
+ return null;
106
+ }
107
+
108
+ getProps(): APIOptions {
109
+ return {}
110
+ }
111
+
112
+ }
113
+ ```
114
+
115
+ Some things to **note**:
116
+ * The `getMongoSecretNames()` method allows you to define the name of the Secrets containing user and pswd of your Mongo DB, if you choose to use it (stored in the Cloud Secrets Manager, depending on the cloud you're deploying to).
117
+ * The `getProps()` method allows you to do some overrides (e.g. no authentication for this service). You can explore the properties, they're well documented in the SDK.
118
+
119
+ ### 3.2. Create and Register APIs
120
+
121
+ Your microservice exposes REST API endpoints using Express. <br>
122
+ Endpoints are defined when creating the API controller and are automatically set up.
123
+
124
+ #### Create a Toto Delegate
125
+
126
+ Every endpoint needs to be managed by a **Toto Delegate**. <br>
127
+ Toto Delegates implement the `TotoDelegate` interface.
128
+
129
+ This is how you define a Toto Delegate. <br>
130
+ *The following example shows a delegate that processes user creation*.
131
+
132
+ ```typescript
133
+ import { TotoDelegate, UserContext } from 'totoms';
134
+ import { Request } from 'express';
135
+
136
+ class CreateUserDelegate extends TotoDelegate {
137
+
138
+ async do(req: Request, userContext?: UserContext): Promise<any> {
139
+
140
+ // Extract data from the request
141
+ const { name, email } = req.body;
142
+
143
+ // Your business logic here
144
+ ...
145
+
146
+ // Return the response (anything you'd like)
147
+ return {
148
+ ...,
149
+ };
150
+ }
151
+ }
152
+ ```
153
+
154
+ #### Register Your Delegate
155
+ You can now register your delegate with its endpoint (path, route) in the `TotoMicroserviceConfiguration` object that we saw earlier.
156
+
157
+ ```typescript
158
+ const config: TotoMicroserviceConfiguration = {
159
+ serviceName: "toto-ms-ex1",
160
+ basePath: '/ex1',
161
+ environment: ...,
162
+ ...
163
+ apiConfiguration: {
164
+ apiEndpoints: [
165
+ { method: 'POST', path: '/users', delegate: CreateUserDelegate }
166
+ ]
167
+ },
168
+ };
169
+ ```
170
+
171
+ #### Exposing the OpenAPI Spec through Swagger UI
172
+ **If you have** an OpenAPI Spec defined for your microservice, you can expose it through Swagger UI. <br>
173
+ To do that, you need to add the following to your `TotoMicroserviceConfiguration`, in the `apiConfiguration` section:
174
+
175
+ ```typescript
176
+ apiConfiguration: {
177
+ ...
178
+ openAPISpecification: { localSpecsFilePath: './openapi.yaml' }
179
+ },
180
+ ```
181
+
182
+
183
+ ---
184
+
185
+ ### 3.3. Use a Message Bus
186
+
187
+ The Message Bus enables event-driven communication between microservices.<br>
188
+ It supports both PUSH (webhook-based from cloud Pub/Sub) and PULL (polling) delivery models, depending on your cloud provider and configuration.
189
+
190
+ #### 3.3.1. React to Messages
191
+
192
+ Message handlers are the primary way to react to events.
193
+
194
+ ##### Create a Message Handler
195
+
196
+ Create a handler by **extending** `TotoMessageHandler` and implementing the required methods:
197
+
198
+ ```typescript
199
+ import { TotoMessageHandler, TotoMessage, ProcessingResponse } from 'totoms';
200
+
201
+ class TopicRefreshedEventHandler extends TotoMessageHandler {
202
+
203
+ getHandledMessageType(): string {
204
+ // Return the message type this handler processes
205
+ return "topicRefreshed";
206
+ }
207
+
208
+ async processMessage(message: TotoMessage): Promise<ProcessingResponse> {
209
+ // Access message metadata
210
+ const correlationId = message.correlationId;
211
+ const messageId = message.id;
212
+
213
+ // Extract event data
214
+ const topicName = message.payload.name;
215
+ const blogUrl = message.payload.blogURL;
216
+ const user = message.payload.user;
217
+
218
+ // Your handler has access to context
219
+ this.logger.compute(correlationId, `Processing topic refresh for: ${topicName}`);
220
+
221
+ // Perform your business logic
222
+ await this.refreshTopic(topicName, blogUrl, user);
223
+
224
+ // Return success or failure
225
+ return { success: true };
226
+ }
227
+
228
+ private async refreshTopic(name: string, url: string, user: string) {
229
+ // Implementation here
230
+ }
231
+ }
232
+ ```
233
+
234
+ ##### Register a Message Handler
235
+
236
+ Register your message handlers with the message bus configuration.
237
+
238
+ **IMPORTANT NOTE:** <br>
239
+ * When using PubSub infrastructure, you need to register topics. <br>
240
+ Topics are registered by giving them:
241
+ * A `logical name` which is the name that will be used in the application to reference the topic.
242
+ * A topic identifier (e.g., ARN on AWS or fully-qualified Topic Name on GCP)
243
+
244
+ ```typescript
245
+ import { TotoMessageBus, MessageHandlerRegistrationOptions } from 'totoms';
246
+
247
+ const messageBus = new TotoMessageBus(config, environment);
248
+
249
+ // Register topics
250
+ messageBus.registerTopic({
251
+ logicalName: "topic-events",
252
+ topicName: process.env.TOPIC_EVENTS_TOPIC_NAME! // From environment or secrets
253
+ });
254
+
255
+ // Register message handlers
256
+ const handlerOptions: MessageHandlerRegistrationOptions = {
257
+ topic: { logicalName: "topic-events" }
258
+ };
259
+
260
+ messageBus.registerMessageHandler(
261
+ new TopicRefreshedEventHandler(),
262
+ handlerOptions
263
+ );
264
+ ```
265
+
266
+ When the microservice starts, it automatically subscribes to the configured topics and routes incoming messages to the appropriate handlers based on their message type.
267
+
268
+ #### 3.3.2. Publish Messages
269
+
270
+ You can always publish messages to topics.
271
+
272
+ **NOTE:**
273
+ * In the Message Destination, the topic is the **logical name of the topic** (see above).
274
+
275
+ ```typescript
276
+ import { TotoMessage, MessageDestination } from 'totoms';
277
+
278
+ async function publishTopicUpdate(messageBus: any, topicId: string, topicName: string) {
279
+ // Create the message
280
+ const message = new TotoMessage({
281
+ type: "topicUpdated",
282
+ correlationId: "correlation-id-123",
283
+ id: topicId,
284
+ payload: {
285
+ name: topicName,
286
+ timestamp: new Date().toISOString()
287
+ }
288
+ });
289
+
290
+ const destination: MessageDestination = {
291
+ topicName: "topic-events"
292
+ };
293
+
294
+ await messageBus.publishMessage(destination, message);
295
+ }
296
+ ```
297
+
298
+ ##### Getting Access to the Message Bus
299
+
300
+ There are different ways to get access to the Message Bus instance:
301
+
302
+ * Through the `TotoMicroservice` singleton: <br>
303
+ `TotoMicroservice.getInstance().messageBus`
304
+
305
+ * Through an existing instance of `TotoMicroservice`
306
+
307
+ * In a `TotoMessageHandler` you will have `messageBus` as an instance variable: <br>
308
+ `this.messageBus`
309
+
310
+ * In a `TotoDelegate`, you can access it through the config or by maintaining a reference in your application
311
+
312
+ ---
313
+
314
+ ### 3.4. Load Secrets
315
+
316
+ The SDK handles secret loading from your cloud provider automatically. Access secrets through the configuration or use the `SecretsManager` directly:
317
+
318
+ ```typescript
319
+ import { SecretsManager } from 'totoms';
320
+
321
+ const secrets = new SecretsManager({ hyperscaler: "aws" });
322
+
323
+ // Load a secret by name
324
+ const apiKey = await secrets.getSecret("api-key");
325
+ const databaseUrl = await secrets.getSecret("database-url");
326
+ ```
327
+
328
+ Secrets are typically stored as environment variable names or secret manager references, depending on your deployment environment.
329
+
330
+ ---
331
+
332
+ ### 3.5. Custom Configurations
333
+
334
+ You can define your own custom configurations by extending the `TotoControllerConfig` base class.
335
+
336
+ An example:
337
+
338
+ ```typescript
339
+ import { TotoControllerConfig } from 'totoms';
340
+
341
+ export class MyServiceConfig extends TotoControllerConfig {
342
+
343
+ apiKey: string | undefined;
344
+
345
+ async load(): Promise<void> {
346
+ // Load secrets using the secrets manager
347
+ this.apiKey = await this.secretsManager.getSecret("my-api-key");
348
+ }
349
+
350
+ getMongoSecretNames() {
351
+ // Return null if your service doesn't use MongoDB
352
+ return null;
353
+ }
354
+ }
355
+ ```
356
+
357
+ What you can do with a Custom Configuration:
358
+
359
+ 1. **Load Secrets** <br>
360
+ You can do that by overriding the `load()` async method and using `this.secretsManager.getSecret("your-secret-name")` to load secrets.
361
+
362
+ 2. **Configure MongoDB** <br>
363
+ Override `getMongoSecretNames()`, `getDBName()`, and `getCollections()` to configure MongoDB integration.
364
+
365
+ 3. **Custom Authentication** <br>
366
+ Override `getCustomAuthVerifier()` to provide custom authentication logic.
367
+
368
+ ## Core Components
369
+
370
+ ### TotoAPIController
371
+ The main controller for building REST APIs with Express. Provides:
372
+ - Automatic route registration
373
+ - Built-in validation
374
+ - CORS support
375
+ - Health check endpoints
376
+ - File upload support
377
+ - API documentation generation
378
+
379
+ ### TotoMicroservice
380
+ High-level wrapper that initializes the entire microservice stack including API controller, message bus, and environment configuration.
381
+
382
+ ### TotoMessageBus
383
+ Unified interface for pub/sub messaging across cloud platforms:
384
+ - **AWS**: SNS/SQS
385
+ - **GCP**: Cloud Pub/Sub
386
+ - **Azure**: Service Bus (in development)
387
+
388
+ ### TotoControllerConfig
389
+ Base configuration class for microservices with support for:
390
+ - MongoDB connection management
391
+ - Authentication settings
392
+ - Secrets management
393
+ - Custom validators
394
+
395
+ ### Logger
396
+ Structured logging with correlation ID support for request tracing.
397
+
398
+ ### Validator
399
+ Request validation framework with support for:
400
+ - JWT token validation
401
+ - Google OAuth
402
+ - Custom validation logic
403
+
404
+ ## Cloud Platform Support
405
+
406
+ ### AWS
407
+ - **Messaging**: SNS (topics), SQS (queues)
408
+ - **Secrets**: AWS Secrets Manager
409
+ - **Region Configuration**: Configurable per service
410
+
411
+ ### GCP
412
+ - **Messaging**: Cloud Pub/Sub
413
+ - **Secrets**: Secret Manager
414
+ - **Project Configuration**: Uses default project credentials
415
+
416
+ ### Azure
417
+ - **Messaging**: Service Bus (in development)
418
+ - **Secrets**: Key Vault (in development)
419
+
420
+ ## License
421
+
422
+ MIT
423
+
424
+ ## Author
425
+
426
+ nicolasances
427
+
428
+ ## Contributing
429
+
430
+ Contributions are welcome! Please feel free to submit a Pull Request to the [toto-microservice-sdk repository](https://github.com/nicolasances/toto-microservice-sdk).
431
+
432
+ ## Related Projects
433
+
434
+ - [Toto Ecosystem](https://github.com/nicolasances/toto)
435
+ - [Python Toto Microservice SDK](../python)
@@ -3,10 +3,12 @@ import { TotoControllerConfig } from '../model/TotoControllerConfig';
3
3
  import { TotoDelegate } from '../model/TotoDelegate';
4
4
  import { TotoPathOptions } from '../model/TotoPathOptions';
5
5
  import { TotoEnvironment } from '..';
6
+ import { OpenAPISpecification } from '../model/APIConfiguration';
6
7
  export declare class TotoControllerOptions {
7
8
  debugMode?: boolean;
8
9
  basePath?: string;
9
10
  port?: number;
11
+ openAPISpecification?: OpenAPISpecification;
10
12
  }
11
13
  export interface TotoControllerProps {
12
14
  apiName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"TotoAPIController.d.ts","sourceRoot":"","sources":["../../src/api/TotoAPIController.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAE,OAAO,EAAE,OAAO,EAAY,MAAM,SAAS,CAAA;AAI7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAErC,qBAAa,qBAAqB;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAQ;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAY;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;CAChC;AASD,qBAAa,iBAAiB;IAE1B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,OAAO,EAAE,qBAAqB,CAAC;gBAQnB,KAAK,EAAE,mBAAmB,EAAE,OAAO,GAAE,qBAA0B;IA2CrE,IAAI;IAgBV,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe;IAiBrE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAgDzE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAqF9E,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe;IAuD9G,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAyDpF,MAAM;CAgBT"}
1
+ {"version":3,"file":"TotoAPIController.d.ts","sourceRoot":"","sources":["../../src/api/TotoAPIController.ts"],"names":[],"mappings":"AAGA,OAAgB,EAAE,OAAO,EAAE,OAAO,EAAY,MAAM,SAAS,CAAA;AAM7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,qBAAa,qBAAqB;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAQ;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAY;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oBAAoB,CAAC,EAAE,oBAAoB,CAAY;CAC1D;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;CAChC;AASD,qBAAa,iBAAiB;IAE1B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,OAAO,EAAE,qBAAqB,CAAC;gBAQnB,KAAK,EAAE,mBAAmB,EAAE,OAAO,GAAE,qBAA0B;IAqDrE,IAAI;IAgBV,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe;IAiBrE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAgDzE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAqF9E,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe;IAuD9G,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,eAAe;IAyDpF,MAAM;CAgBT"}
@@ -18,6 +18,8 @@ const connect_busboy_1 = __importDefault(require("connect-busboy"));
18
18
  const fs_extra_1 = __importDefault(require("fs-extra"));
19
19
  const express_1 = __importDefault(require("express"));
20
20
  const uuid_1 = require("uuid");
21
+ const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
22
+ const js_yaml_1 = __importDefault(require("js-yaml"));
21
23
  const TotoLogger_1 = require("../logger/TotoLogger");
22
24
  const Validator_1 = require("../validation/Validator");
23
25
  const SmokeDelegate_1 = require("../dlg/SmokeDelegate");
@@ -29,12 +31,13 @@ class TotoControllerOptions {
29
31
  constructor() {
30
32
  this.debugMode = false;
31
33
  this.basePath = undefined;
34
+ this.openAPISpecification = undefined;
32
35
  }
33
36
  }
34
37
  exports.TotoControllerOptions = TotoControllerOptions;
35
38
  class TotoAPIController {
36
39
  constructor(props, options = {}) {
37
- var _a, _b;
40
+ var _a, _b, _c;
38
41
  this.app = (0, express_1.default)();
39
42
  this.props = props;
40
43
  this.apiName = props.apiName;
@@ -60,6 +63,11 @@ class TotoAPIController {
60
63
  this.path('GET', '/', smokeEndpoint, { noAuth: true, contentType: 'application/json' });
61
64
  this.path('GET', '/', smokeEndpoint, { noAuth: true, contentType: 'application/json', ignoreBasePath: true });
62
65
  this.path('GET', '/health', smokeEndpoint, { noAuth: true, contentType: 'application/json', ignoreBasePath: true });
66
+ if ((_c = options === null || options === void 0 ? void 0 : options.openAPISpecification) === null || _c === void 0 ? void 0 : _c.localSpecsFilePath) {
67
+ const correctedPath = this.options.basePath ? this.options.basePath.replace(/\/$/, '').trim() + '/apidocs' : '/apidocs';
68
+ const swaggerDocument = js_yaml_1.default.load(fs_extra_1.default.readFileSync(options.openAPISpecification.localSpecsFilePath, 'utf8'));
69
+ this.app.use(correctedPath, swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swaggerDocument));
70
+ }
63
71
  this.staticContent = this.staticContent.bind(this);
64
72
  this.fileUploadPath = this.fileUploadPath.bind(this);
65
73
  this.path = this.path.bind(this);
@@ -1 +1 @@
1
- {"version":3,"file":"TotoAPIController.js","sourceRoot":"","sources":["../../src/api/TotoAPIController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TotoAPIController.js","sourceRoot":"","sources":["../../src/api/TotoAPIController.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ class TotoMicroservice {
36
36
  topicNames = yield Promise.all(topicNamesPromises);
37
37
  }
38
38
  TotoMicroservice.instancePromise = customConfig.load().then(() => {
39
- const apiController = new __1.TotoAPIController({ apiName: config.serviceName, config: customConfig, environment: config.environment }, { basePath: config.basePath });
39
+ const apiController = new __1.TotoAPIController({ apiName: config.serviceName, config: customConfig, environment: config.environment }, { basePath: config.basePath, openAPISpecification: config.apiConfiguration.openAPISpecification });
40
40
  const bus = new __1.TotoMessageBus({
41
41
  controller: apiController,
42
42
  customConfig: customConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"TotoMicroservice.js","sourceRoot":"","sources":["../../src/core/TotoMicroservice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TotoMicroservice.js","sourceRoot":"","sources":["../../src/core/TotoMicroservice.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  import { TotoControllerConfig, TotoDelegate, TotoMessageBus } from "..";
2
+ export interface OpenAPISpecification {
3
+ localSpecsFilePath?: string;
4
+ }
2
5
  export interface APIConfiguration {
3
6
  apiEndpoints: TotoAPIEndpoint[];
4
7
  apiOptions?: APIOptions;
8
+ openAPISpecification?: OpenAPISpecification;
5
9
  }
6
10
  export interface TotoAPIEndpoint {
7
11
  method: 'GET' | 'POST' | 'PUT' | 'DELETE';
@@ -1 +1 @@
1
- {"version":3,"file":"APIConfiguration.d.ts","sourceRoot":"","sources":["../../src/model/APIConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAK7B,YAAY,EAAE,eAAe,EAAE,CAAC;IAKhC,UAAU,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,KAAK,YAAY,CAAC;CAC5F;AAED,MAAM,WAAW,UAAU;IAMvB,MAAM,CAAC,EAAE,OAAO,CAAC;IAMjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAM1B,aAAa,CAAC,EAAE,MAAM,CAAC;IAMvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAG/B"}
1
+ {"version":3,"file":"APIConfiguration.d.ts","sourceRoot":"","sources":["../../src/model/APIConfiguration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAK7B,YAAY,EAAE,eAAe,EAAE,CAAC;IAKhC,UAAU,CAAC,EAAE,UAAU,CAAC;IAKxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,KAAK,YAAY,CAAC;CAC5F;AAED,MAAM,WAAW,UAAU;IAMvB,MAAM,CAAC,EAAE,OAAO,CAAC;IAMjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAM1B,aAAa,CAAC,EAAE,MAAM,CAAC;IAMvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAG/B"}
package/package.json CHANGED
@@ -1,89 +1,93 @@
1
- {
2
- "name": "totoms",
3
- "version": "1.0.3",
4
- "description": "Toto Microservice SDK for NodeJS - A fast, cloud-agnostic, opinionated framework for building microservices in the Toto Ecosystem",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "scripts": {
8
- "build": "tsc",
9
- "prepublishOnly": "npm run build",
10
- "clean": "rm -rf dist",
11
- "rebuild": "npm run clean && npm run build"
12
- },
13
- "keywords": [
14
- "toto",
15
- "microservice",
16
- "sdk",
17
- "api",
18
- "pubsub",
19
- "cloud-agnostic",
20
- "express",
21
- "typescript"
22
- ],
23
- "author": "nicolasances",
24
- "license": "MIT",
25
- "repository": {
26
- "type": "git",
27
- "url": "https://github.com/nicolasances/toto-microservice-sdk.git",
28
- "directory": "node"
29
- },
30
- "files": [
31
- "dist",
32
- "README.md",
33
- "LICENSE"
34
- ],
35
- "engines": {
36
- "node": ">=16.0.0"
37
- },
38
- "dependencies": {
39
- "body-parser": "^1.20.0",
40
- "connect-busboy": "^1.0.0",
41
- "express": "^4.18.0",
42
- "fs-extra": "^11.0.0",
43
- "jsonwebtoken": "^9.0.0",
44
- "moment-timezone": "^0.5.43",
45
- "mongodb": "^6.0.0",
46
- "request": "^2.88.2",
47
- "uuid": "^9.0.0"
48
- },
49
- "peerDependencies": {
50
- "@aws-sdk/client-secrets-manager": "^3.0.0",
51
- "@aws-sdk/client-sns": "^3.0.0",
52
- "@aws-sdk/client-sqs": "^3.0.0",
53
- "@google-cloud/pubsub": "^4.0.0",
54
- "@google-cloud/secret-manager": "^5.0.0"
55
- },
56
- "peerDependenciesMeta": {
57
- "@aws-sdk/client-secrets-manager": {
58
- "optional": true
59
- },
60
- "@aws-sdk/client-sns": {
61
- "optional": true
62
- },
63
- "@aws-sdk/client-sqs": {
64
- "optional": true
65
- },
66
- "@google-cloud/pubsub": {
67
- "optional": true
68
- },
69
- "@google-cloud/secret-manager": {
70
- "optional": true
71
- }
72
- },
73
- "devDependencies": {
74
- "@aws-sdk/client-secrets-manager": "^3.958.0",
75
- "@aws-sdk/client-sns": "^3.958.0",
76
- "@aws-sdk/client-sqs": "^3.960.0",
77
- "@google-cloud/pubsub": "^5.2.0",
78
- "@google-cloud/secret-manager": "^6.1.1",
79
- "@types/body-parser": "^1.19.0",
80
- "@types/connect-busboy": "^1.0.0",
81
- "@types/express": "^4.17.0",
82
- "@types/fs-extra": "^11.0.0",
83
- "@types/jsonwebtoken": "^9.0.0",
84
- "@types/node": "^20.0.0",
85
- "@types/request": "^2.48.0",
86
- "@types/uuid": "^9.0.0",
87
- "typescript": "^5.0.0"
88
- }
89
- }
1
+ {
2
+ "name": "totoms",
3
+ "version": "1.1.1",
4
+ "description": "Toto Microservice SDK for NodeJS - A fast, cloud-agnostic, opinionated framework for building microservices in the Toto Ecosystem",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepublishOnly": "npm run build",
10
+ "clean": "rm -rf dist",
11
+ "rebuild": "npm run clean && npm run build"
12
+ },
13
+ "keywords": [
14
+ "toto",
15
+ "microservice",
16
+ "sdk",
17
+ "api",
18
+ "pubsub",
19
+ "cloud-agnostic",
20
+ "express",
21
+ "typescript"
22
+ ],
23
+ "author": "nicolasances",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/nicolasances/toto-microservice-sdk.git",
28
+ "directory": "node"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "engines": {
36
+ "node": ">=16.0.0"
37
+ },
38
+ "dependencies": {
39
+ "body-parser": "^1.20.0",
40
+ "connect-busboy": "^1.0.0",
41
+ "express": "^4.18.0",
42
+ "fs-extra": "^11.0.0",
43
+ "js-yaml": "^4.1.1",
44
+ "jsonwebtoken": "^9.0.0",
45
+ "moment-timezone": "^0.5.43",
46
+ "mongodb": "^6.0.0",
47
+ "request": "^2.88.2",
48
+ "swagger-ui-express": "^5.0.1",
49
+ "uuid": "^9.0.0"
50
+ },
51
+ "peerDependencies": {
52
+ "@aws-sdk/client-secrets-manager": "^3.0.0",
53
+ "@aws-sdk/client-sns": "^3.0.0",
54
+ "@aws-sdk/client-sqs": "^3.0.0",
55
+ "@google-cloud/pubsub": "^4.0.0",
56
+ "@google-cloud/secret-manager": "^5.0.0"
57
+ },
58
+ "peerDependenciesMeta": {
59
+ "@aws-sdk/client-secrets-manager": {
60
+ "optional": true
61
+ },
62
+ "@aws-sdk/client-sns": {
63
+ "optional": true
64
+ },
65
+ "@aws-sdk/client-sqs": {
66
+ "optional": true
67
+ },
68
+ "@google-cloud/pubsub": {
69
+ "optional": true
70
+ },
71
+ "@google-cloud/secret-manager": {
72
+ "optional": true
73
+ }
74
+ },
75
+ "devDependencies": {
76
+ "@aws-sdk/client-secrets-manager": "^3.958.0",
77
+ "@aws-sdk/client-sns": "^3.958.0",
78
+ "@aws-sdk/client-sqs": "^3.960.0",
79
+ "@google-cloud/pubsub": "^5.2.0",
80
+ "@google-cloud/secret-manager": "^6.1.1",
81
+ "@types/body-parser": "^1.19.0",
82
+ "@types/connect-busboy": "^1.0.0",
83
+ "@types/express": "^4.17.0",
84
+ "@types/fs-extra": "^11.0.0",
85
+ "@types/js-yaml": "^4.0.9",
86
+ "@types/jsonwebtoken": "^9.0.0",
87
+ "@types/node": "^20.0.0",
88
+ "@types/request": "^2.48.0",
89
+ "@types/swagger-ui-express": "^4.1.8",
90
+ "@types/uuid": "^9.0.0",
91
+ "typescript": "^5.0.0"
92
+ }
93
+ }