Skip to content

Commit 7e0dba1

Browse files
committed
docs: add examples [skip ci]
1 parent 2e2d63b commit 7e0dba1

File tree

8 files changed

+123
-34
lines changed

8 files changed

+123
-34
lines changed

packages/amqp-transport/README.md

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
# AMQP-Transport
1+
# AMQP Transport
22

33
[![npm][npm-image]][npm-url]
44

55
[npm-image]: https://img.shields.io/npm/v/@getlarge/nestjs-tools-amqp-transport.svg?style=flat
66
[npm-url]: https://npmjs.org/package/@getlarge/nestjs-tools-amqp-transport
77

8-
Custom AMQP strategies for Nest microservice transport.
9-
Supports :
8+
A custom AMQP strategy for Nest microservice transport, which extends NestJS AMQP [producer](https://github.com/nestjs/nest/blob/master/packages/microservices/client/client-rmq.ts) and [consumer](https://github.com/nestjs/nest/blob/master/packages/microservices/server/server-rmq.ts) by adding support for:
109

1110
- exchanges
12-
- assert reply queue
11+
- reply queue assertion
12+
13+
By enabling exchanges you can broadcast messages to multiple queues, and by asserting reply queue you can ensure that reply queue with static name exists.
14+
15+
## Example
16+
17+
The integration tests contain an [example consumer](./test/dummy-consumer.controller.mock.ts) and [example producer](./test/dummy-producer.service.mock.ts) that demonstrate how to use this library.

packages/amqp-transport/test/amqp.integration.spec.ts

+19-19
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { setTimeout } from 'node:timers/promises';
1010

1111
import { AmqpClient, AmqpOptions, AmqpServer } from '../src';
1212
import { DUMMY_CLIENT, DUMMY_QUEUE, RMQ_URL } from './dummy.constants';
13-
import { DummyConsumerController } from './dummy-consumer.controller.mock.';
13+
import { DummyConsumerController } from './dummy-consumer.controller.mock';
1414
import { DummyProducerService } from './dummy-producer.service.mock';
1515

1616
interface Closeable {
@@ -170,7 +170,7 @@ describe('AMQP tests', () => {
170170
producers: [moduleProducer],
171171
} = await setupAll();
172172
const msg = { message };
173-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
173+
const service = moduleProducer.get(DummyProducerService);
174174

175175
// Then
176176
const result = await service.test(msg);
@@ -186,7 +186,7 @@ describe('AMQP tests', () => {
186186
producers: [moduleProducer],
187187
} = await setupAll();
188188
const msg = { message };
189-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
189+
const service = moduleProducer.get(DummyProducerService);
190190
// Then
191191
const results = await makeMultipleRequests(() => service.test(msg), 5);
192192
// Expect
@@ -206,7 +206,7 @@ describe('AMQP tests', () => {
206206
producers: [moduleProducer],
207207
} = await setupAll({ testConfiguration: { noAck } });
208208
const msg = { message };
209-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
209+
const service = moduleProducer.get(DummyProducerService);
210210
// Then
211211
const result = await service.test(msg, noAck);
212212
expect(result).toBeDefined();
@@ -222,7 +222,7 @@ describe('AMQP tests', () => {
222222
producers: [moduleProducer],
223223
} = await setupAll({ testConfiguration: { noAck } });
224224
const msg = { message };
225-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
225+
const service = moduleProducer.get(DummyProducerService);
226226
// Then
227227
const results = await makeMultipleRequests(() => service.test({ message }, noAck), 5);
228228
// Expect
@@ -242,7 +242,7 @@ describe('AMQP tests', () => {
242242
const {
243243
producers: [moduleProducer],
244244
} = await setupAll({ testConfiguration: { noAck } });
245-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
245+
const service = moduleProducer.get(DummyProducerService);
246246
// Then
247247
const result = await service.test(msg, noAck);
248248
expect(result).toBeDefined();
@@ -258,7 +258,7 @@ describe('AMQP tests', () => {
258258
const {
259259
producers: [moduleProducer],
260260
} = await setupAll({ testConfiguration: { noAck } });
261-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
261+
const service = moduleProducer.get(DummyProducerService);
262262
// Then
263263
const results = await makeMultipleRequests(() => service.test(msg, noAck), 5);
264264
// Expect
@@ -280,7 +280,7 @@ describe('AMQP tests', () => {
280280
} = await setupAll({
281281
testConfiguration: { noAck, prefetchCount: 5 },
282282
});
283-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
283+
const service = moduleProducer.get(DummyProducerService);
284284
// Then
285285
const results = await makeMultipleRequests(() => service.test(msg, noAck), 10);
286286
// Expect
@@ -302,7 +302,7 @@ describe('AMQP tests', () => {
302302
} = await setupAll({
303303
testConfiguration: { noAck, prefetchCount: 5 },
304304
});
305-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
305+
const service = moduleProducer.get(DummyProducerService);
306306
// Then
307307
const result = await service.test(msg, noAck);
308308
expect(result).toBeDefined();
@@ -318,7 +318,7 @@ describe('AMQP tests', () => {
318318
} = await setupAll({
319319
testConfiguration: { noAck, prefetchCount: 5, isGlobalPrefetchCount: true },
320320
});
321-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
321+
const service = moduleProducer.get(DummyProducerService);
322322
// Then
323323
const results = await makeMultipleRequests(() => service.test(msg, noAck), 5);
324324
// Expect
@@ -338,7 +338,7 @@ describe('AMQP tests', () => {
338338
} = await setupAll({
339339
testConfiguration: { noAck, prefetchCount: 5, isGlobalPrefetchCount: true },
340340
});
341-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
341+
const service = moduleProducer.get(DummyProducerService);
342342
// Then
343343
const results = await makeMultipleRequests(() => service.test(msg, noAck), 5);
344344
// Expect
@@ -357,7 +357,7 @@ describe('AMQP tests', () => {
357357
testConfiguration: { noAck, prefetchCount: 1 },
358358
consumersCount: 2,
359359
});
360-
const service = moduleProducer.get<DummyProducerService>(DummyProducerService);
360+
const service = moduleProducer.get(DummyProducerService);
361361
// Then
362362
const results = await makeMultipleRequests(() => service.getConsumerWorkerId(noAck), 20);
363363
// Expect
@@ -376,8 +376,8 @@ describe('AMQP tests', () => {
376376
testConfiguration: { noAck, prefetchCount: 1 },
377377
producersCount: 2,
378378
});
379-
const service1 = moduleProducer1.get<DummyProducerService>(DummyProducerService);
380-
const service2 = moduleProducer2.get<DummyProducerService>(DummyProducerService);
379+
const service1 = moduleProducer1.get(DummyProducerService);
380+
const service2 = moduleProducer2.get(DummyProducerService);
381381
// Then
382382
const resultsMatrix = await Promise.all([
383383
makeMultipleRequests(() => service1.test(msg, noAck), 10),
@@ -411,8 +411,8 @@ describe('AMQP tests', () => {
411411
},
412412
producersCount: 2,
413413
});
414-
const service1 = moduleProducer1.get<DummyProducerService>(DummyProducerService);
415-
const service2 = moduleProducer2.get<DummyProducerService>(DummyProducerService);
414+
const service1 = moduleProducer1.get(DummyProducerService);
415+
const service2 = moduleProducer2.get(DummyProducerService);
416416
// Then
417417
const resultsMatrix = await Promise.all([
418418
makeMultipleRequests(() => service1.test(msg, noAck), 10),
@@ -446,7 +446,7 @@ describe('AMQP tests', () => {
446446
},
447447
producersCount: 1,
448448
});
449-
const service1 = moduleProducer1.get<DummyProducerService>(DummyProducerService);
449+
const service1 = moduleProducer1.get(DummyProducerService);
450450
// Then
451451
const resultsMatrix = await Promise.all([makeMultipleRequests(() => service1.test(msg, noAck), 10)]);
452452
// Expect
@@ -473,8 +473,8 @@ describe('AMQP tests', () => {
473473
},
474474
producersCount: 2,
475475
});
476-
const service1 = moduleProducer1.get<DummyProducerService>(DummyProducerService);
477-
const service2 = moduleProducer2.get<DummyProducerService>(DummyProducerService);
476+
const service1 = moduleProducer1.get(DummyProducerService);
477+
const service2 = moduleProducer2.get(DummyProducerService);
478478
// Then
479479
await Promise.all([
480480
makeMultipleRequests(() => service1.test(msg, noAck), 5),

packages/async-local-storage/README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Async Local Storage`
1+
# Async Local Storage
22

33
[![npm][npm-image]][npm-url]
44

@@ -54,3 +54,5 @@ assert(typeof requestContext.type === 'string');
5454

5555
service.delete('username');
5656
```
57+
58+
<!-- TODO: add app usage example -->

packages/cluster/README.md

+82-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,86 @@
1-
# nestjs-tools-cluster
1+
# Cluster
22

3-
This library was generated with [Nx](https://nx.dev).
3+
[![npm][npm-image]][npm-url]
4+
5+
[npm-image]: https://img.shields.io/npm/v/@getlarge/nestjs-tools-cluster.svg?style=flat
6+
[npm-url]: https://npmjs.org/package/@getlarge/nestjs-tools-cluster
7+
8+
This package provides a simple way to clusterize a NestJS application.
9+
The `ClusterService` class is a wrapper around the native `cluster` module and provides a simple API to manage the workers' lifecycle.
10+
11+
## Installation
12+
13+
```bash
14+
$ npm install --save @getlarge/nestjs-tools-cluster
15+
```
16+
17+
## Example
18+
19+
```ts
20+
import { Logger } from '@nestjs/common';
21+
import { ConfigService } from '@nestjs/config';
22+
import { NestFactory } from '@nestjs/core';
23+
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
24+
import { ClusterService, ClusterServiceConfig } from '@getlarge/cluster-service';
25+
import { cpus } from 'node:os';
26+
27+
import { AppModule } from './app/app.module';
28+
29+
const GLOBAL_API_PREFIX = 'api';
30+
const DEFAULT_PORT = 3000;
31+
const CLUSTER_MODE = process.env.CLUSTER_MODE === 'true';
32+
const MAX_WORKERS = +process.env.MAX_WORKERS || cpus().length;
33+
34+
async function bootstrap(
35+
opts: { workerId?: number } = {},
36+
disconnect: () => void = () => process.exit(1),
37+
): Promise<void> {
38+
/**
39+
* This is a global variable that will be used to identify the worker id
40+
* in the application. This is useful for debugging purposes.
41+
*/
42+
globalThis.__WORKER_ID__ = opts.workerId;
43+
44+
try {
45+
const app = await NestFactory.create<NestFastifyApplication>(
46+
AppModule,
47+
new FastifyAdapter({
48+
trustProxy: true,
49+
bodyLimit: +process.env.MAX_PAYLOAD_SIZE || 1048576,
50+
}),
51+
{ bufferLogs: true, abortOnError: false },
52+
);
53+
app.setGlobalPrefix(GLOBAL_API_PREFIX);
54+
const configService = app.get(ConfigService);
55+
const port = configService.get('PORT', { infer: true }) ?? DEFAULT_PORT;
56+
57+
await app.listen(port, '0.0.0.0', () => {
58+
Logger.log(`Listening at http://localhost:${port}/${GLOBAL_API_PREFIX}`);
59+
});
60+
} catch (error) {
61+
Logger.error(error);
62+
disconnect();
63+
}
64+
}
65+
66+
if (CLUSTER_MODE) {
67+
const clusterConfig: ClusterServiceConfig = {
68+
workers: MAX_WORKERS,
69+
delay: 2000,
70+
grace: 1000,
71+
};
72+
73+
const clusterService = new ClusterService(clusterConfig);
74+
clusterService.clusterize(bootstrap).catch((e) => {
75+
clusterService.logger.error(e);
76+
process.exit(1);
77+
});
78+
} else {
79+
void bootstrap({}, () => {
80+
process.exit(1);
81+
});
82+
}
83+
```
484

585
## Building
686

packages/fastify-upload/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
[npm-image]: https://img.shields.io/npm/v/@getlarge/nestjs-tools-fastify-upload.svg?style=flat
66
[npm-url]: https://npmjs.org/package/@getlarge/nestjs-tools-fastify-upload
77

8-
The Fastify Upload Service provides file upload support for NestJS applications using the Fastify adapter.
8+
This library provides file upload support for NestJS applications using the Fastify adapter.
99
It uses the [@fastify/multipart](https://www.npmjs.com/package/@fastify/multipart) module.
1010

11-
The [nestjs-tools-file-storage](../file-storage/README.md) library can store the uploaded files in various storage backends.
11+
It can be used in combintation of the [nestjs-tools-file-storage](../file-storage/README.md) library to store the uploaded files in various storage backends.
1212

1313
Read [this issue](https://github.com/getlarge/nestjs-tools/issues/71) to understand why this library was created.
1414

packages/file-storage/README.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
[npm-image]: https://img.shields.io/npm/v/@getlarge/nestjs-tools-file-storage.svg?style=flat
66
[npm-url]: https://npmjs.org/package/@getlarge/nestjs-tools-file-storage
77

8-
File storage classes for :
8+
This module provide a unified API to store files in different storage providers.
99

10-
- Node FileSystem
11-
- Amazon S3
12-
- Google Cloud Storage
10+
Supoorted backends:
11+
12+
- [Node FileSystem](./src/lib/file-storage-fs.class.ts)
13+
- [AWS S3](./src/lib/file-storage-s3.class.ts)
14+
- [Google Cloud Storage](./src/lib/file-storage-google.class.ts)
1315

1416
## Installation
1517

packages/lock/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ $ npm install --save @getlarge/nestjs-tools-lock
2020

2121
```ts
2222
import { LockService } from '@getlarge/nestjs-tools-lock';
23-
import { Inject, Injectable } from '@nestjs/common';
23+
import { Injectable } from '@nestjs/common';
2424
import { Cron } from '@nestjs/schedule';
2525

2626
@Injectable()
2727
export class TasksService implements OnModuleDestroy {
28-
constructor(@Inject(LockService) private lockService: LockService) {}
28+
constructor(private lockService: LockService) {}
2929

3030
onModuleDestroy() {
3131
this.lockService.close();

0 commit comments

Comments
 (0)