@venizia/ignis-docs 0.0.7 → 0.0.8-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/dist/mcp-server/common/paths.d.ts +4 -2
- package/dist/mcp-server/common/paths.d.ts.map +1 -1
- package/dist/mcp-server/common/paths.js +8 -6
- package/dist/mcp-server/common/paths.js.map +1 -1
- package/dist/mcp-server/helpers/docs.helper.d.ts.map +1 -1
- package/dist/mcp-server/helpers/docs.helper.js +1 -1
- package/dist/mcp-server/helpers/docs.helper.js.map +1 -1
- package/dist/mcp-server/tools/base.tool.d.ts +1 -1
- package/dist/mcp-server/tools/docs/get-document-content.tool.d.ts +1 -1
- package/dist/mcp-server/tools/docs/get-document-content.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/docs/get-document-content.tool.js +7 -7
- package/dist/mcp-server/tools/docs/get-document-metadata.tool.js +3 -3
- package/dist/mcp-server/tools/docs/get-package-overview.tool.d.ts +1 -1
- package/dist/mcp-server/tools/docs/get-package-overview.tool.js +1 -1
- package/dist/mcp-server/tools/docs/search-documents.tool.d.ts +1 -1
- package/dist/mcp-server/tools/docs/search-documents.tool.js +1 -1
- package/dist/mcp-server/tools/docs/search-documents.tool.js.map +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.js +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.js.map +1 -1
- package/dist/mcp-server/tools/github/search-code.tool.d.ts +1 -1
- package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
- package/dist/mcp-server/tools/github/search-code.tool.js.map +1 -1
- package/package.json +9 -9
- package/wiki/best-practices/api-usage-examples.md +9 -9
- package/wiki/best-practices/architectural-patterns.md +19 -3
- package/wiki/best-practices/architecture-decisions.md +6 -6
- package/wiki/best-practices/code-style-standards/advanced-patterns.md +1 -1
- package/wiki/best-practices/code-style-standards/control-flow.md +1 -1
- package/wiki/best-practices/code-style-standards/function-patterns.md +2 -2
- package/wiki/best-practices/code-style-standards/index.md +2 -2
- package/wiki/best-practices/code-style-standards/naming-conventions.md +1 -1
- package/wiki/best-practices/code-style-standards/route-definitions.md +4 -4
- package/wiki/best-practices/data-modeling.md +1 -1
- package/wiki/best-practices/deployment-strategies.md +1 -1
- package/wiki/best-practices/error-handling.md +2 -2
- package/wiki/best-practices/performance-optimization.md +3 -3
- package/wiki/best-practices/security-guidelines.md +2 -2
- package/wiki/best-practices/troubleshooting-tips.md +1 -1
- package/wiki/{references → extensions}/components/authentication/api.md +12 -20
- package/wiki/{references → extensions}/components/authentication/errors.md +1 -1
- package/wiki/{references → extensions}/components/authentication/index.md +5 -8
- package/wiki/{references → extensions}/components/authentication/usage.md +20 -36
- package/wiki/{references → extensions}/components/authorization/api.md +62 -13
- package/wiki/{references → extensions}/components/authorization/errors.md +12 -7
- package/wiki/{references → extensions}/components/authorization/index.md +93 -6
- package/wiki/{references → extensions}/components/authorization/usage.md +42 -4
- package/wiki/{references → extensions}/components/health-check.md +5 -4
- package/wiki/{references → extensions}/components/index.md +2 -0
- package/wiki/{references → extensions}/components/mail/index.md +1 -1
- package/wiki/{references → extensions}/components/request-tracker.md +1 -1
- package/wiki/{references → extensions}/components/socket-io/api.md +2 -2
- package/wiki/{references → extensions}/components/socket-io/errors.md +2 -0
- package/wiki/{references → extensions}/components/socket-io/index.md +24 -20
- package/wiki/{references → extensions}/components/socket-io/usage.md +2 -2
- package/wiki/{references → extensions}/components/static-asset/api.md +14 -15
- package/wiki/{references → extensions}/components/static-asset/errors.md +3 -1
- package/wiki/{references → extensions}/components/static-asset/index.md +158 -89
- package/wiki/{references → extensions}/components/static-asset/usage.md +8 -5
- package/wiki/{references → extensions}/components/swagger.md +3 -3
- package/wiki/{references → extensions}/components/template/index.md +4 -4
- package/wiki/{references → extensions}/components/template/setup-page.md +1 -1
- package/wiki/{references → extensions}/components/template/single-page.md +1 -1
- package/wiki/{references → extensions}/components/websocket/api.md +7 -6
- package/wiki/{references → extensions}/components/websocket/errors.md +17 -3
- package/wiki/{references → extensions}/components/websocket/index.md +17 -11
- package/wiki/{references → extensions}/components/websocket/usage.md +2 -2
- package/wiki/{references → extensions}/helpers/crypto/index.md +1 -1
- package/wiki/{references → extensions}/helpers/env/index.md +9 -5
- package/wiki/{references → extensions}/helpers/error/index.md +2 -7
- package/wiki/{references → extensions}/helpers/index.md +18 -6
- package/wiki/{references → extensions}/helpers/kafka/admin.md +13 -1
- package/wiki/{references → extensions}/helpers/kafka/consumer.md +32 -31
- package/wiki/{references → extensions}/helpers/kafka/examples.md +20 -20
- package/wiki/{references → extensions}/helpers/kafka/index.md +61 -54
- package/wiki/{references → extensions}/helpers/kafka/producer.md +21 -20
- package/wiki/{references → extensions}/helpers/kafka/schema-registry.md +25 -25
- package/wiki/{references → extensions}/helpers/logger/index.md +2 -2
- package/wiki/{references → extensions}/helpers/queue/index.md +400 -4
- package/wiki/{references → extensions}/helpers/storage/api.md +170 -10
- package/wiki/{references → extensions}/helpers/storage/index.md +44 -8
- package/wiki/{references → extensions}/helpers/template/index.md +1 -1
- package/wiki/{references → extensions}/helpers/testing/index.md +4 -4
- package/wiki/{references → extensions}/helpers/types/index.md +63 -16
- package/wiki/{references → extensions}/helpers/websocket/index.md +1 -1
- package/wiki/extensions/index.md +48 -0
- package/wiki/guides/core-concepts/application/bootstrapping.md +55 -37
- package/wiki/guides/core-concepts/application/index.md +95 -35
- package/wiki/guides/core-concepts/components-guide.md +23 -19
- package/wiki/guides/core-concepts/components.md +34 -10
- package/wiki/guides/core-concepts/dependency-injection.md +99 -34
- package/wiki/guides/core-concepts/grpc-controllers.md +295 -0
- package/wiki/guides/core-concepts/persistent/datasources.md +37 -19
- package/wiki/guides/core-concepts/persistent/index.md +6 -6
- package/wiki/guides/core-concepts/persistent/models.md +50 -6
- package/wiki/guides/core-concepts/persistent/repositories.md +83 -8
- package/wiki/guides/core-concepts/persistent/transactions.md +39 -8
- package/wiki/guides/core-concepts/{controllers.md → rest-controllers.md} +32 -35
- package/wiki/guides/core-concepts/services.md +19 -6
- package/wiki/guides/get-started/5-minute-quickstart.md +17 -17
- package/wiki/guides/get-started/philosophy.md +1 -1
- package/wiki/guides/index.md +2 -2
- package/wiki/guides/reference/glossary.md +7 -7
- package/wiki/guides/reference/mcp-docs-server.md +1 -1
- package/wiki/guides/tutorials/building-a-crud-api.md +45 -39
- package/wiki/guides/tutorials/complete-installation.md +74 -51
- package/wiki/guides/tutorials/ecommerce-api.md +39 -30
- package/wiki/guides/tutorials/realtime-chat.md +12 -13
- package/wiki/guides/tutorials/testing.md +2 -2
- package/wiki/index.md +4 -3
- package/wiki/references/base/application.md +341 -21
- package/wiki/references/base/bootstrapping.md +43 -13
- package/wiki/references/base/components.md +259 -8
- package/wiki/references/base/controllers.md +556 -253
- package/wiki/references/base/datasources.md +159 -79
- package/wiki/references/base/dependency-injection.md +299 -48
- package/wiki/references/base/filter-system/application-usage.md +18 -2
- package/wiki/references/base/filter-system/array-operators.md +14 -6
- package/wiki/references/base/filter-system/comparison-operators.md +9 -3
- package/wiki/references/base/filter-system/default-filter.md +28 -3
- package/wiki/references/base/filter-system/fields-order-pagination.md +17 -13
- package/wiki/references/base/filter-system/index.md +169 -11
- package/wiki/references/base/filter-system/json-filtering.md +51 -18
- package/wiki/references/base/filter-system/list-operators.md +4 -3
- package/wiki/references/base/filter-system/logical-operators.md +7 -2
- package/wiki/references/base/filter-system/null-operators.md +50 -0
- package/wiki/references/base/filter-system/quick-reference.md +82 -243
- package/wiki/references/base/filter-system/range-operators.md +7 -1
- package/wiki/references/base/filter-system/tips.md +34 -7
- package/wiki/references/base/filter-system/use-cases.md +6 -5
- package/wiki/references/base/grpc-controllers.md +984 -0
- package/wiki/references/base/index.md +32 -24
- package/wiki/references/base/middleware.md +347 -0
- package/wiki/references/base/models.md +390 -46
- package/wiki/references/base/providers.md +14 -14
- package/wiki/references/base/repositories/advanced.md +195 -69
- package/wiki/references/base/repositories/index.md +447 -12
- package/wiki/references/base/repositories/mixins.md +103 -98
- package/wiki/references/base/repositories/relations.md +129 -45
- package/wiki/references/base/repositories/soft-deletable.md +104 -23
- package/wiki/references/base/services.md +94 -14
- package/wiki/references/index.md +12 -10
- package/wiki/references/quick-reference.md +98 -65
- package/wiki/references/utilities/crypto.md +21 -4
- package/wiki/references/utilities/date.md +25 -7
- package/wiki/references/utilities/index.md +26 -24
- package/wiki/references/utilities/jsx.md +54 -54
- package/wiki/references/utilities/module.md +8 -6
- package/wiki/references/utilities/parse.md +16 -9
- package/wiki/references/utilities/performance.md +22 -7
- package/wiki/references/utilities/promise.md +19 -16
- package/wiki/references/utilities/request.md +48 -26
- package/wiki/references/utilities/schema.md +69 -6
- package/wiki/references/utilities/statuses.md +131 -140
- /package/wiki/{references → extensions}/components/mail/api.md +0 -0
- /package/wiki/{references → extensions}/components/mail/errors.md +0 -0
- /package/wiki/{references → extensions}/components/mail/usage.md +0 -0
- /package/wiki/{references → extensions}/components/template/api-page.md +0 -0
- /package/wiki/{references → extensions}/components/template/errors-page.md +0 -0
- /package/wiki/{references → extensions}/components/template/usage-page.md +0 -0
- /package/wiki/{references → extensions}/helpers/cron/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/inversion/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/network/api.md +0 -0
- /package/wiki/{references → extensions}/helpers/network/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/redis/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/socket-io/api.md +0 -0
- /package/wiki/{references → extensions}/helpers/socket-io/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/template/single-page.md +0 -0
- /package/wiki/{references → extensions}/helpers/uid/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/websocket/api.md +0 -0
- /package/wiki/{references → extensions}/helpers/worker-thread/index.md +0 -0
- /package/wiki/{references → extensions}/src-details/mcp-server.md +0 -0
|
@@ -11,20 +11,24 @@
|
|
|
11
11
|
|------|-------|
|
|
12
12
|
| **Package** | `@venizia/ignis` (core component) + `@venizia/ignis-helpers` (helper classes) |
|
|
13
13
|
| **Component** | `WebSocketComponent` |
|
|
14
|
-
| **Server Helper** | [`WebSocketServerHelper`](/
|
|
14
|
+
| **Server Helper** | [`WebSocketServerHelper`](/extensions/helpers/websocket/) |
|
|
15
15
|
| **Emitter Helper** | `WebSocketEmitter` (standalone Redis publisher) |
|
|
16
16
|
| **Runtimes** | Bun only (throws on Node.js) |
|
|
17
17
|
| **Scaling** | Redis Pub/Sub (ioredis -- single or Cluster) |
|
|
18
18
|
|
|
19
19
|
#### Import Paths
|
|
20
|
+
|
|
21
|
+
> [!IMPORTANT]
|
|
22
|
+
> `WebSocketComponent` and `WebSocketBindingKeys` are **not** exported from the `@venizia/ignis` barrel. You must import from the `@venizia/ignis/websocket` subpath.
|
|
23
|
+
|
|
20
24
|
```typescript
|
|
21
|
-
// From core --
|
|
25
|
+
// From core -- subpath import (NOT from '@venizia/ignis')
|
|
22
26
|
import {
|
|
23
27
|
WebSocketComponent,
|
|
24
28
|
WebSocketBindingKeys,
|
|
25
|
-
} from '@venizia/ignis';
|
|
29
|
+
} from '@venizia/ignis/websocket';
|
|
26
30
|
|
|
27
|
-
// From helpers -- types, helpers, constants
|
|
31
|
+
// From helpers -- types, helpers, constants (exported from main entry)
|
|
28
32
|
import {
|
|
29
33
|
WebSocketServerHelper,
|
|
30
34
|
WebSocketEmitter,
|
|
@@ -53,7 +57,7 @@ import type {
|
|
|
53
57
|
```
|
|
54
58
|
|
|
55
59
|
> [!NOTE]
|
|
56
|
-
> `IServerOptions` (the core component's subset type) is **not** exported from `@venizia/ignis`. Only `WebSocketBindingKeys` and `WebSocketComponent` are exported from the core
|
|
60
|
+
> `IServerOptions` (the core component's subset type) is **not** exported from `@venizia/ignis` or `@venizia/ignis/websocket`. Only `WebSocketBindingKeys` and `WebSocketComponent` are exported from the core subpath. All helper types, constants, and classes are imported from `@venizia/ignis-helpers`.
|
|
57
61
|
|
|
58
62
|
### Use Cases
|
|
59
63
|
|
|
@@ -82,11 +86,11 @@ In your application's `preConfigure()` method, bind the required services and re
|
|
|
82
86
|
|
|
83
87
|
#### Full Setup Example
|
|
84
88
|
```typescript
|
|
89
|
+
import { BaseApplication } from '@venizia/ignis';
|
|
85
90
|
import {
|
|
86
|
-
BaseApplication,
|
|
87
91
|
WebSocketComponent,
|
|
88
92
|
WebSocketBindingKeys,
|
|
89
|
-
} from '@venizia/ignis';
|
|
93
|
+
} from '@venizia/ignis/websocket';
|
|
90
94
|
import {
|
|
91
95
|
RedisHelper,
|
|
92
96
|
} from '@venizia/ignis-helpers';
|
|
@@ -98,7 +102,6 @@ import type {
|
|
|
98
102
|
TWebSocketMessageHandler,
|
|
99
103
|
TWebSocketOutboundTransformer,
|
|
100
104
|
TWebSocketHandshakeFn,
|
|
101
|
-
IWebSocketServerOptions,
|
|
102
105
|
IBunWebSocketConfig,
|
|
103
106
|
ValueOrPromise,
|
|
104
107
|
} from '@venizia/ignis-helpers';
|
|
@@ -204,7 +207,7 @@ export class Application extends BaseApplication {
|
|
|
204
207
|
}).toValue(handshakeFn);
|
|
205
208
|
|
|
206
209
|
// 9. Server options (optional -- customize defaults)
|
|
207
|
-
this.bind
|
|
210
|
+
this.bind({
|
|
208
211
|
key: WebSocketBindingKeys.SERVER_OPTIONS,
|
|
209
212
|
}).toValue({
|
|
210
213
|
identifier: 'my-app-websocket',
|
|
@@ -240,11 +243,14 @@ The core component's `IServerOptions` interface controls the WebSocket server se
|
|
|
240
243
|
}
|
|
241
244
|
```
|
|
242
245
|
|
|
246
|
+
> [!NOTE]
|
|
247
|
+
> The `DEFAULT_SERVER_OPTIONS` in the core component only sets `identifier` and `path`. The remaining defaults (`defaultRooms`, `heartbeatInterval`, `heartbeatTimeout`, `serverOptions`) come from `WebSocketDefaults` applied by the helper constructor.
|
|
248
|
+
|
|
243
249
|
To customize options, bind a partial options object before registering the component:
|
|
244
250
|
|
|
245
251
|
#### Custom Server Options Example
|
|
246
252
|
```typescript
|
|
247
|
-
import { WebSocketBindingKeys } from '@venizia/ignis';
|
|
253
|
+
import { WebSocketBindingKeys } from '@venizia/ignis/websocket';
|
|
248
254
|
|
|
249
255
|
this.bind({
|
|
250
256
|
key: WebSocketBindingKeys.SERVER_OPTIONS,
|
|
@@ -448,6 +454,6 @@ Called during authentication when `requireEncryption` is `true`. Receives the sa
|
|
|
448
454
|
- [Usage & Examples](./usage) - Server-side usage, emitter, wire protocol, client tracking, and delivery strategy
|
|
449
455
|
- [API Reference](./api) - Architecture, WebSocketEmitter API, and internals
|
|
450
456
|
- [Error Reference](./errors) - Error conditions table and troubleshooting
|
|
451
|
-
- [WebSocketServerHelper](/
|
|
457
|
+
- [WebSocketServerHelper](/extensions/helpers/websocket/) - Helper API documentation
|
|
452
458
|
- [Socket.IO Component](../socket-io/) - Node.js-compatible alternative with Socket.IO
|
|
453
459
|
- [Bun WebSocket Documentation](https://bun.sh/docs/api/websockets) - Official Bun WebSocket API reference
|
|
@@ -10,10 +10,10 @@ Inject `WebSocketServerHelper` to interact with WebSocket:
|
|
|
10
10
|
import {
|
|
11
11
|
BaseService,
|
|
12
12
|
inject,
|
|
13
|
-
WebSocketBindingKeys,
|
|
14
13
|
CoreBindings,
|
|
15
14
|
BaseApplication,
|
|
16
15
|
} from '@venizia/ignis';
|
|
16
|
+
import { WebSocketBindingKeys } from '@venizia/ignis/websocket';
|
|
17
17
|
import { WebSocketServerHelper } from '@venizia/ignis-helpers';
|
|
18
18
|
|
|
19
19
|
export class NotificationService extends BaseService {
|
|
@@ -470,6 +470,6 @@ The helper uses a dual delivery strategy depending on whether encryption is acti
|
|
|
470
470
|
- [Setup & Configuration](./) - Quick reference, imports, setup steps, configuration, and binding keys
|
|
471
471
|
- [API Reference](./api) - Architecture, WebSocketEmitter API, and internals
|
|
472
472
|
- [Error Reference](./errors) - Error conditions table and troubleshooting
|
|
473
|
-
- [WebSocketServerHelper](/
|
|
473
|
+
- [WebSocketServerHelper](/extensions/helpers/websocket/) - Helper API documentation
|
|
474
474
|
- [Socket.IO Component](../socket-io/) - Node.js-compatible alternative with Socket.IO
|
|
475
475
|
- [Bun WebSocket Documentation](https://bun.sh/docs/api/websockets) - Official Bun WebSocket API reference
|
|
@@ -531,7 +531,7 @@ const hashed = hash('text', {
|
|
|
531
531
|
|
|
532
532
|
- **References:**
|
|
533
533
|
- [Crypto Utility](/references/utilities/crypto) -- Pure crypto utilities
|
|
534
|
-
- [Authentication Component](/
|
|
534
|
+
- [Authentication Component](/extensions/components/authentication/) -- JWT and password verification
|
|
535
535
|
|
|
536
536
|
- **Best Practices:**
|
|
537
537
|
- [Security Guidelines](/best-practices/security-guidelines) -- Cryptographic best practices
|
|
@@ -9,14 +9,14 @@ Structured access to application environment variables with prefix filtering, ty
|
|
|
9
9
|
| **Package** | `@venizia/ignis-helpers` |
|
|
10
10
|
| **Classes** | `ApplicationEnvironment`, `Environment` |
|
|
11
11
|
| **Extends** | `IApplicationEnvironment` (interface) |
|
|
12
|
-
| **Singleton** | `applicationEnvironment` -- auto-initialized at module load |
|
|
12
|
+
| **Singleton** | `applicationEnvironment` (alias `Envs`) -- auto-initialized at module load |
|
|
13
13
|
| **Runtimes** | Both |
|
|
14
14
|
|
|
15
15
|
#### Import Paths
|
|
16
16
|
|
|
17
17
|
```typescript
|
|
18
18
|
// Singleton instance (recommended)
|
|
19
|
-
import { applicationEnvironment } from '@venizia/ignis-helpers';
|
|
19
|
+
import { applicationEnvironment, Envs } from '@venizia/ignis-helpers';
|
|
20
20
|
|
|
21
21
|
// Classes
|
|
22
22
|
import { ApplicationEnvironment, Environment } from '@venizia/ignis-helpers';
|
|
@@ -29,12 +29,15 @@ import type { IApplicationEnvironment } from '@venizia/ignis-helpers';
|
|
|
29
29
|
|
|
30
30
|
### Singleton (Recommended)
|
|
31
31
|
|
|
32
|
-
A pre-configured `applicationEnvironment` singleton is auto-initialized at module load time. It reads `process.env` and filters keys matching the configured prefix (default: `APP_ENV`).
|
|
32
|
+
A pre-configured `applicationEnvironment` singleton is auto-initialized at module load time. It reads `process.env` and filters keys matching the configured prefix (default: `APP_ENV`). An alias `Envs` is also exported for convenience.
|
|
33
33
|
|
|
34
34
|
```typescript
|
|
35
35
|
import { applicationEnvironment } from '@venizia/ignis-helpers';
|
|
36
|
+
// or
|
|
37
|
+
import { Envs } from '@venizia/ignis-helpers';
|
|
36
38
|
|
|
37
39
|
const jwtSecret = applicationEnvironment.get<string>('APP_ENV_JWT_SECRET');
|
|
40
|
+
const jwtSecret2 = Envs.get<string>('APP_ENV_JWT_SECRET');
|
|
38
41
|
```
|
|
39
42
|
|
|
40
43
|
> [!TIP]
|
|
@@ -68,13 +71,14 @@ The default singleton uses `process.env.APPLICATION_ENV_PREFIX ?? 'APP_ENV'` as
|
|
|
68
71
|
|
|
69
72
|
### Reading Variables
|
|
70
73
|
|
|
71
|
-
Use `get<ReturnType>(key)` to retrieve a typed environment variable. Only keys matching the configured prefix are available.
|
|
74
|
+
Use `get<ReturnType>(key, defaultValue?)` to retrieve a typed environment variable. Only keys matching the configured prefix are available. An optional `defaultValue` is returned when the key is not found.
|
|
72
75
|
|
|
73
76
|
```typescript
|
|
74
77
|
import { applicationEnvironment } from '@venizia/ignis-helpers';
|
|
75
78
|
|
|
76
79
|
const jwtSecret = applicationEnvironment.get<string>('APP_ENV_JWT_SECRET');
|
|
77
80
|
const serverPort = applicationEnvironment.get<string>('APP_ENV_SERVER_PORT');
|
|
81
|
+
const timeout = applicationEnvironment.get<number>('APP_ENV_TIMEOUT', 5000);
|
|
78
82
|
```
|
|
79
83
|
|
|
80
84
|
> [!WARNING]
|
|
@@ -211,4 +215,4 @@ ALLOW_EMPTY_ENV_VALUE=true
|
|
|
211
215
|
|
|
212
216
|
- **Other Helpers:**
|
|
213
217
|
- [Helpers Index](../index) -- All available helpers
|
|
214
|
-
- [Logger](/
|
|
218
|
+
- [Logger](/extensions/helpers/logger/) -- Uses `Environment.COMMON_ENVS` for debug log filtering
|
|
@@ -19,9 +19,6 @@ import { ErrorSchema } from '@venizia/ignis-helpers';
|
|
|
19
19
|
import type { TError } from '@venizia/ignis-helpers';
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
> [!NOTE]
|
|
23
|
-
> `ApplicationError`, `getError`, `ErrorSchema`, and `TError` are also available from `@venizia/ignis-inversion`. Their types are re-exported through `@venizia/ignis` (via `export type *`), but for runtime usage, import directly from `@venizia/ignis-helpers` or `@venizia/ignis-inversion`.
|
|
24
|
-
|
|
25
22
|
## Creating an Instance
|
|
26
23
|
|
|
27
24
|
`ApplicationError` extends the native `Error` class with an HTTP `statusCode` and an optional `messageCode` for machine-readable error identification.
|
|
@@ -226,7 +223,5 @@ throw getError({
|
|
|
226
223
|
- [Controllers](/references/base/controllers) -- Throwing errors in route handlers
|
|
227
224
|
- [Services](/references/base/services) -- Error handling in business logic
|
|
228
225
|
- [Middlewares](/references/base/middlewares) -- The `appErrorHandler` middleware
|
|
229
|
-
- [Helpers Index](/
|
|
230
|
-
- [Logger Helper](/
|
|
231
|
-
- [Error Handling Best Practices](/best-practices/error-handling) -- Patterns and anti-patterns
|
|
232
|
-
- [Common Pitfalls](/best-practices/common-pitfalls) -- Frequent error handling mistakes
|
|
226
|
+
- [Helpers Index](/extensions/helpers/) -- All available helpers
|
|
227
|
+
- [Logger Helper](/extensions/helpers/logger/) -- Logging errors
|
|
@@ -14,7 +14,7 @@ Reusable classes and functions providing common functionality - designed for eas
|
|
|
14
14
|
| [Inversion](./inversion/) | Dependency injection | DI container implementation |
|
|
15
15
|
| [Logger](./logger/) | Logging | Winston-based, multiple transports, scopes |
|
|
16
16
|
| [Network](./network/) | Network requests | HTTP, TCP, UDP helpers |
|
|
17
|
-
| Kafka
|
|
17
|
+
| [Kafka](./kafka/) | Event streaming | Apache Kafka producer/consumer/admin/schema registry |
|
|
18
18
|
| [Queue](./queue/) | Message queues | BullMQ, MQTT support |
|
|
19
19
|
| [Redis](./redis/) | Redis operations | Single/cluster, key-value, hashes, JSON, pub/sub |
|
|
20
20
|
| [Socket.IO](./socket-io/) | Real-time communication | Socket.IO client/server helpers |
|
|
@@ -24,15 +24,27 @@ Reusable classes and functions providing common functionality - designed for eas
|
|
|
24
24
|
| [UID](./uid/) | Unique ID generation | Snowflake IDs, Base62 encoding |
|
|
25
25
|
| [Worker Thread](./worker-thread/) | Worker threads | Node.js worker management |
|
|
26
26
|
|
|
27
|
+
### Subpath Imports
|
|
28
|
+
|
|
29
|
+
Some helpers with optional peer dependencies are only available via subpath imports to ensure proper tree-shaking:
|
|
30
|
+
|
|
31
|
+
| Subpath | Peer Dependency | Description |
|
|
32
|
+
|---------|-----------------|-------------|
|
|
33
|
+
| `@venizia/ignis-helpers/kafka` | `@platformatic/kafka` | Kafka producer/consumer/admin/schema registry |
|
|
34
|
+
| `@venizia/ignis-helpers/bullmq` | `bullmq` | BullMQ job queue |
|
|
35
|
+
| `@venizia/ignis-helpers/mqtt` | `mqtt` | MQTT pub/sub client |
|
|
36
|
+
| `@venizia/ignis-helpers/socket-io` | `socket.io`, `socket.io-client` | Socket.IO server/client |
|
|
37
|
+
| `@venizia/ignis-helpers/minio` | `minio` | MinIO S3-compatible storage |
|
|
38
|
+
| `@venizia/ignis-helpers/bun-s3` | -- | Bun native S3 storage |
|
|
39
|
+
| `@venizia/ignis-helpers/cron` | `cron` | Cron job scheduling |
|
|
40
|
+
| `@venizia/ignis-helpers/axios` | `axios` | Axios HTTP client |
|
|
41
|
+
|
|
27
42
|
## See Also
|
|
28
43
|
|
|
29
44
|
- **Related Concepts:**
|
|
30
45
|
- [Services](/guides/core-concepts/services) - Using helpers in service layer
|
|
31
|
-
- [Controllers](/guides/core-concepts/controllers) - Using helpers in controllers
|
|
46
|
+
- [Controllers](/guides/core-concepts/rest-controllers) - Using helpers in controllers
|
|
32
47
|
|
|
33
48
|
- **References:**
|
|
34
49
|
- [Utilities](/references/utilities/) - Pure utility functions
|
|
35
|
-
- [Components](/
|
|
36
|
-
|
|
37
|
-
- **Best Practices:**
|
|
38
|
-
- [Code Style Standards](/best-practices/code-style-standards/) - Helper usage patterns
|
|
50
|
+
- [Components](/extensions/components/) - Framework components
|
|
@@ -7,7 +7,7 @@ class KafkaAdminHelper extends BaseKafkaHelper<Admin>
|
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
> [!NOTE]
|
|
10
|
-
> `KafkaAdminHelper` has **no generic type parameters**
|
|
10
|
+
> `KafkaAdminHelper` has **no generic type parameters** -- the Admin client does not deal with serialized messages.
|
|
11
11
|
|
|
12
12
|
## Helper API
|
|
13
13
|
|
|
@@ -63,6 +63,18 @@ await helper.close();
|
|
|
63
63
|
await helper.close({ isForce: true });
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
+
## Graceful Shutdown
|
|
67
|
+
|
|
68
|
+
`close()` uses the base `closeClient()` (which calls `this.client.close()`) with a graceful timeout. If the graceful close exceeds `shutdownTimeout` (default 30s), it automatically force-closes. After `close()`, `healthStatus` is set to `'disconnected'`.
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// Graceful (recommended)
|
|
72
|
+
await helper.close();
|
|
73
|
+
|
|
74
|
+
// Force
|
|
75
|
+
await helper.close({ isForce: true });
|
|
76
|
+
```
|
|
77
|
+
|
|
66
78
|
## API Reference (`@platformatic/kafka`)
|
|
67
79
|
|
|
68
80
|
After calling `helper.getAdmin()`, you have full access to the `Admin` class.
|
|
@@ -21,9 +21,10 @@ class KafkaConsumerHelper<
|
|
|
21
21
|
| `start(opts)` | `(opts: IKafkaConsumeStartOptions): Promise<void>` | Start consuming (creates stream, wires callbacks) |
|
|
22
22
|
| `startLagMonitoring(opts)` | `(opts: { topics: string[]; interval?: number }): void` | Start periodic lag monitoring |
|
|
23
23
|
| `stopLagMonitoring()` | `(): void` | Stop lag monitoring |
|
|
24
|
-
| `isHealthy()` | `(): boolean` | `true` when broker connected |
|
|
24
|
+
| `isHealthy()` | `(): boolean` | `true` when at least one broker connected |
|
|
25
25
|
| `isReady()` | `(): boolean` | `isHealthy()` **and** `consumer.isActive()` |
|
|
26
26
|
| `getHealthStatus()` | `(): TKafkaHealthStatus` | `'connected'` \| `'disconnected'` \| `'unknown'` |
|
|
27
|
+
| `getConnectedBrokerCount()` | `(): number` | Number of currently connected brokers |
|
|
27
28
|
| `close(opts?)` | `(opts?: { isForce?: boolean }): Promise<void>` | Stop lag, close stream, close consumer |
|
|
28
29
|
|
|
29
30
|
## IKafkaConsumerOptions
|
|
@@ -37,22 +38,22 @@ interface IKafkaConsumerOptions<KeyType, ValueType, HeaderKeyType, HeaderValueTy
|
|
|
37
38
|
|
|
38
39
|
| Option | Type | Default | Description |
|
|
39
40
|
|--------|------|---------|-------------|
|
|
40
|
-
| `groupId` | `string` |
|
|
41
|
+
| `groupId` | `string` | -- | Consumer group ID. **Required** |
|
|
41
42
|
| `identifier` | `string` | `'kafka-consumer'` | Scoped logging identifier |
|
|
42
|
-
| `deserializers` | `Partial<Deserializers<K,V,HK,HV>>` |
|
|
43
|
+
| `deserializers` | `Partial<Deserializers<K,V,HK,HV>>` | -- | Key/value/header deserializers |
|
|
43
44
|
| `autocommit` | `boolean \| number` | `false` | Auto-commit offsets. `true` = default interval, `number` = custom ms |
|
|
44
|
-
| `sessionTimeout` | `number` | `
|
|
45
|
-
| `heartbeatInterval` | `number` | `
|
|
46
|
-
| `rebalanceTimeout` | `number` | `sessionTimeout` | Max time for rebalance |
|
|
45
|
+
| `sessionTimeout` | `number` | `60000` | Session timeout -- consumer removed from group if no heartbeat |
|
|
46
|
+
| `heartbeatInterval` | `number` | `10000` | Heartbeat interval -- must be less than `sessionTimeout` |
|
|
47
|
+
| `rebalanceTimeout` | `number` | `sessionTimeout` | Max time for rebalance. Defaults to the value of `sessionTimeout` |
|
|
47
48
|
| `highWaterMark` | `number` | `1024` | Stream buffer size (messages) |
|
|
48
49
|
| `minBytes` | `number` | `1` | Min bytes per fetch response |
|
|
49
|
-
| `maxBytes` | `number` |
|
|
50
|
-
| `maxWaitTime` | `number` |
|
|
50
|
+
| `maxBytes` | `number` | -- | Max bytes per fetch response per partition |
|
|
51
|
+
| `maxWaitTime` | `number` | -- | Max time (ms) broker waits for `minBytes` |
|
|
51
52
|
| `metadataMaxAge` | `number` | `300000` | Metadata cache TTL (ms) |
|
|
52
53
|
| `groupProtocol` | `'classic' \| 'consumer'` | `'classic'` | Consumer group protocol. `'consumer'` = KIP-848 (Kafka 3.7+) |
|
|
53
|
-
| `groupInstanceId` | `string` |
|
|
54
|
+
| `groupInstanceId` | `string` | -- | Static group membership ID -- prevents rebalance on restart |
|
|
54
55
|
| `shutdownTimeout` | `number` | `30000` | Graceful shutdown timeout in ms |
|
|
55
|
-
| `registry` | `SchemaRegistry` |
|
|
56
|
+
| `registry` | `SchemaRegistry` | -- | Schema registry for auto deser |
|
|
56
57
|
|
|
57
58
|
### Lifecycle Callbacks
|
|
58
59
|
|
|
@@ -101,7 +102,7 @@ const helper = KafkaConsumerHelper.newInstance({
|
|
|
101
102
|
|
|
102
103
|
// Message lifecycle
|
|
103
104
|
onMessage: async ({ message }) => {
|
|
104
|
-
console.log(`${message.topic}[${message.partition}] @${message.offset}: ${message.key}
|
|
105
|
+
console.log(`${message.topic}[${message.partition}] @${message.offset}: ${message.key} -> ${message.value}`);
|
|
105
106
|
await message.commit();
|
|
106
107
|
},
|
|
107
108
|
onMessageDone: ({ message }) => {
|
|
@@ -141,8 +142,8 @@ await helper.start({ topics: ['orders'] });
|
|
|
141
142
|
helper.startLagMonitoring({ topics: ['orders'], interval: 10_000 });
|
|
142
143
|
|
|
143
144
|
// Health check
|
|
144
|
-
helper.isHealthy(); // true when broker connected
|
|
145
|
-
helper.isReady(); // true when broker connected AND consumer is active
|
|
145
|
+
helper.isHealthy(); // true when at least one broker connected
|
|
146
|
+
helper.isReady(); // true when at least one broker connected AND consumer is active
|
|
146
147
|
|
|
147
148
|
// Shutdown
|
|
148
149
|
await helper.close();
|
|
@@ -154,18 +155,18 @@ When `start()` is called, the helper creates a `MessagesStream` and wires the ca
|
|
|
154
155
|
|
|
155
156
|
```
|
|
156
157
|
Stream 'data' event
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
-> onMessage({ message })
|
|
159
|
+
+-- success -> onMessageDone({ message })
|
|
160
|
+
+-- error -> onMessageError({ error, message })
|
|
160
161
|
|
|
161
162
|
Stream 'error' event
|
|
162
|
-
|
|
163
|
+
-> onMessageError({ error }) (no message available)
|
|
163
164
|
```
|
|
164
165
|
|
|
165
|
-
- `onMessage` is the main processing callback
|
|
166
|
-
- `onMessageDone` fires only after `onMessage` resolves successfully
|
|
167
|
-
- `onMessageError` fires if `onMessage`
|
|
168
|
-
- The stream `'error'` event also calls `onMessageError` (without `message` since it's a stream-level error)
|
|
166
|
+
- `onMessage` is the main processing callback -- do your business logic here
|
|
167
|
+
- `onMessageDone` fires only after `onMessage` resolves successfully -- use for logging, metrics, etc.
|
|
168
|
+
- `onMessageError` fires if `onMessage` throws -- use for error tracking. Note that errors from `onMessageDone` also trigger `onMessageError`
|
|
169
|
+
- The stream `'error'` event also calls `onMessageError` (without `message` since it's a stream-level error), but only if `onMessageError` was provided
|
|
169
170
|
|
|
170
171
|
## start()
|
|
171
172
|
|
|
@@ -188,8 +189,8 @@ interface IKafkaConsumeStartOptions {
|
|
|
188
189
|
|
|
189
190
|
| Fallback | Description |
|
|
190
191
|
|----------|-------------|
|
|
191
|
-
| `'latest'` | Start from latest (default)
|
|
192
|
-
| `'earliest'` | Start from beginning
|
|
192
|
+
| `'latest'` | Start from latest (default) -- ignore historical messages |
|
|
193
|
+
| `'earliest'` | Start from beginning -- process all historical messages |
|
|
193
194
|
| `'fail'` | Throw an error |
|
|
194
195
|
|
|
195
196
|
```typescript
|
|
@@ -207,7 +208,7 @@ await helper.start({
|
|
|
207
208
|
});
|
|
208
209
|
```
|
|
209
210
|
|
|
210
|
-
Guards against duplicate starts
|
|
211
|
+
Guards against duplicate starts -- calling `start()` twice logs a warning and returns immediately.
|
|
211
212
|
|
|
212
213
|
## Lag Monitoring
|
|
213
214
|
|
|
@@ -221,7 +222,7 @@ helper.stopLagMonitoring();
|
|
|
221
222
|
|
|
222
223
|
Lag data is delivered via the `onLag` callback. Errors via `onLagError`.
|
|
223
224
|
|
|
224
|
-
Guards against duplicate starts
|
|
225
|
+
Guards against duplicate starts -- calling `startLagMonitoring()` twice logs a warning.
|
|
225
226
|
|
|
226
227
|
For one-time lag checks, use the underlying consumer directly:
|
|
227
228
|
|
|
@@ -234,8 +235,8 @@ const lag = await helper.getConsumer().getLag({ topics: ['orders'] });
|
|
|
234
235
|
`close()` implements an ordered shutdown:
|
|
235
236
|
|
|
236
237
|
1. Stop lag monitoring
|
|
237
|
-
2. Close the stream (
|
|
238
|
-
3. Close the consumer client (
|
|
238
|
+
2. Close the stream (calls `stream.close()` callback-style)
|
|
239
|
+
3. Close the consumer client (calls `client.close(true)` with graceful timeout, or force)
|
|
239
240
|
4. Set health status to `'disconnected'`
|
|
240
241
|
|
|
241
242
|
```typescript
|
|
@@ -356,7 +357,7 @@ consumer.generationId; // number
|
|
|
356
357
|
consumer.assignments; // GroupAssignment[] | null
|
|
357
358
|
consumer.isActive(); // boolean
|
|
358
359
|
|
|
359
|
-
// Static membership
|
|
360
|
+
// Static membership -- prevents rebalance on restart
|
|
360
361
|
const helper = KafkaConsumerHelper.newInstance({
|
|
361
362
|
...
|
|
362
363
|
groupInstanceId: 'worker-1',
|
|
@@ -370,9 +371,9 @@ When multiple consumers share the same `groupId`, Kafka distributes topic partit
|
|
|
370
371
|
|
|
371
372
|
```
|
|
372
373
|
Topic "orders" (3 partitions)
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
374
|
+
+-- Partition 0 -> Consumer A
|
|
375
|
+
+-- Partition 1 -> Consumer B
|
|
376
|
+
+-- Partition 2 -> Consumer C
|
|
376
377
|
```
|
|
377
378
|
|
|
378
379
|
- Each partition is assigned to **exactly one** consumer in the group
|
|
@@ -58,7 +58,7 @@ const helper = KafkaConsumerHelper.newInstance({
|
|
|
58
58
|
|
|
59
59
|
onMessage: async ({ message }) => {
|
|
60
60
|
const data = JSON.parse(message.value!);
|
|
61
|
-
console.log(`Processing: ${message.key}
|
|
61
|
+
console.log(`Processing: ${message.key} -> ${JSON.stringify(data)}`);
|
|
62
62
|
await message.commit();
|
|
63
63
|
},
|
|
64
64
|
onMessageDone: ({ message }) => {
|
|
@@ -119,7 +119,7 @@ const stream = await consumer.consume({
|
|
|
119
119
|
});
|
|
120
120
|
|
|
121
121
|
for await (const message of stream) {
|
|
122
|
-
console.log(`${message.topic}[${message.partition}] @${message.offset}: ${message.key}
|
|
122
|
+
console.log(`${message.topic}[${message.partition}] @${message.offset}: ${message.key} -> ${message.value}`);
|
|
123
123
|
await message.commit();
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -268,7 +268,7 @@ app.bind('kafka.producer').to(
|
|
|
268
268
|
bootstrapBrokers: ['localhost:9092'],
|
|
269
269
|
clientId: 'order-service-producer',
|
|
270
270
|
serializers: stringSerializers,
|
|
271
|
-
onBrokerConnect: ({ broker }) => console.log(`Producer
|
|
271
|
+
onBrokerConnect: ({ broker }) => console.log(`Producer -> ${broker.host}`),
|
|
272
272
|
}),
|
|
273
273
|
);
|
|
274
274
|
|
|
@@ -281,7 +281,7 @@ app.bind('kafka.consumer').to(
|
|
|
281
281
|
onMessage: async ({ message }) => {
|
|
282
282
|
// Handled by the service below
|
|
283
283
|
},
|
|
284
|
-
onBrokerConnect: ({ broker }) => console.log(`Consumer
|
|
284
|
+
onBrokerConnect: ({ broker }) => console.log(`Consumer -> ${broker.host}`),
|
|
285
285
|
}),
|
|
286
286
|
);
|
|
287
287
|
|
|
@@ -313,13 +313,13 @@ export class OrderEventService {
|
|
|
313
313
|
|-------|-------|-----|
|
|
314
314
|
| `ECONNREFUSED localhost:9092` | Broker `advertised.listeners` set to `localhost` but connecting remotely | Set `KAFKA_ADVERTISED_LISTENERS` with the correct external host IP |
|
|
315
315
|
| `Request timed out` | SASL handshake or broker unreachable | Add `connectTimeout: 30_000, requestTimeout: 30_000` |
|
|
316
|
-
| `Connection closed` | Connecting without SASL to a SASL-required listener | Check `KAFKA_LISTENER_SECURITY_PROTOCOL_MAP`
|
|
316
|
+
| `Connection closed` | Connecting without SASL to a SASL-required listener | Check `KAFKA_LISTENER_SECURITY_PROTOCOL_MAP` -- use `SASL_PLAINTEXT` |
|
|
317
317
|
| `Cannot find a suitable SASL mechanism` | Wrong mechanism (e.g., `PLAIN` when broker only supports `SCRAM-SHA-512`) | Check error message for supported mechanisms, match `mechanism` |
|
|
318
318
|
| `Failed to deserialize a message` | Mismatch between serializer and deserializer | Ensure matching serde. For old data, use a new consumer group or recreate topic |
|
|
319
319
|
| `JSON.stringify cannot serialize BigInt` | `message.offset` and `message.timestamp` are `bigint` | Use custom replacer: `(_k, v) => typeof v === 'bigint' ? v.toString() : v` |
|
|
320
320
|
| Consumer idle (no messages) | More consumers than partitions | Ensure `numPartitions >= numConsumers` |
|
|
321
|
-
| `isHealthy()` returns `false` |
|
|
322
|
-
| `isReady()` returns `false` (consumer) | Consumer not active
|
|
321
|
+
| `isHealthy()` returns `false` | All brokers disconnected (a single idle disconnect won't trigger this) | Check broker addresses, SASL config, network connectivity. Use `getConnectedBrokerCount()` for details |
|
|
322
|
+
| `isReady()` returns `false` (consumer) | Consumer not active -- `start()` not called or stream closed | Call `await helper.start({ topics })` before checking readiness |
|
|
323
323
|
| Graceful shutdown timeout | In-flight requests taking too long | Increase `shutdownTimeout` or use `close({ isForce: true })` |
|
|
324
324
|
|
|
325
325
|
### Docker Kafka Configuration
|
|
@@ -338,24 +338,24 @@ environment:
|
|
|
338
338
|
CONTROLLER:PLAINTEXT
|
|
339
339
|
```
|
|
340
340
|
|
|
341
|
-
- `INTERNAL`
|
|
342
|
-
- `EXTERNAL`
|
|
343
|
-
- `CONTROLLER`
|
|
341
|
+
- `INTERNAL` -- used for inter-broker communication
|
|
342
|
+
- `EXTERNAL` -- used for client connections from outside Docker
|
|
343
|
+
- `CONTROLLER` -- used for KRaft controller communication
|
|
344
344
|
|
|
345
345
|
## See Also
|
|
346
346
|
|
|
347
347
|
- **Kafka Pages:**
|
|
348
|
-
- [Overview & Fundamentals](./)
|
|
349
|
-
- [Producer](./producer)
|
|
350
|
-
- [Consumer](./consumer)
|
|
351
|
-
- [Admin](./admin)
|
|
352
|
-
- [Schema Registry](./schema-registry)
|
|
348
|
+
- [Overview & Fundamentals](./) -- Connection, serialization, constants, compression
|
|
349
|
+
- [Producer](./producer) -- Producer helper, transactions, API reference
|
|
350
|
+
- [Consumer](./consumer) -- Consumer helper, callbacks, lag monitoring, API reference
|
|
351
|
+
- [Admin](./admin) -- Admin helper & API reference
|
|
352
|
+
- [Schema Registry](./schema-registry) -- Schema registry helper
|
|
353
353
|
|
|
354
354
|
- **Other Helpers:**
|
|
355
|
-
- [Queue Helper](../queue/)
|
|
356
|
-
- [Redis Helper](../redis/)
|
|
355
|
+
- [Queue Helper](../queue/) -- BullMQ, MQTT, and in-memory queues
|
|
356
|
+
- [Redis Helper](../redis/) -- Redis connection management
|
|
357
357
|
|
|
358
358
|
- **External Resources:**
|
|
359
|
-
- [@platformatic/kafka](https://github.com/platformatic/kafka)
|
|
360
|
-
- [Apache Kafka Documentation](https://kafka.apache.org/documentation/)
|
|
361
|
-
- [KIP-848](https://cwiki.apache.org/confluence/display/KAFKA/KIP-848)
|
|
359
|
+
- [@platformatic/kafka](https://github.com/platformatic/kafka) -- Underlying Kafka client library
|
|
360
|
+
- [Apache Kafka Documentation](https://kafka.apache.org/documentation/) -- Official Kafka docs
|
|
361
|
+
- [KIP-848](https://cwiki.apache.org/confluence/display/KAFKA/KIP-848) -- New consumer group protocol
|