@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.
Files changed (172) hide show
  1. package/dist/mcp-server/common/paths.d.ts +4 -2
  2. package/dist/mcp-server/common/paths.d.ts.map +1 -1
  3. package/dist/mcp-server/common/paths.js +8 -6
  4. package/dist/mcp-server/common/paths.js.map +1 -1
  5. package/dist/mcp-server/helpers/docs.helper.d.ts.map +1 -1
  6. package/dist/mcp-server/helpers/docs.helper.js +1 -1
  7. package/dist/mcp-server/helpers/docs.helper.js.map +1 -1
  8. package/dist/mcp-server/tools/base.tool.d.ts +1 -1
  9. package/dist/mcp-server/tools/docs/get-document-content.tool.d.ts +1 -1
  10. package/dist/mcp-server/tools/docs/get-document-content.tool.d.ts.map +1 -1
  11. package/dist/mcp-server/tools/docs/get-document-content.tool.js +7 -7
  12. package/dist/mcp-server/tools/docs/get-document-metadata.tool.js +3 -3
  13. package/dist/mcp-server/tools/docs/get-package-overview.tool.d.ts +1 -1
  14. package/dist/mcp-server/tools/docs/get-package-overview.tool.js +1 -1
  15. package/dist/mcp-server/tools/docs/search-documents.tool.d.ts +1 -1
  16. package/dist/mcp-server/tools/docs/search-documents.tool.js +1 -1
  17. package/dist/mcp-server/tools/docs/search-documents.tool.js.map +1 -1
  18. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  19. package/dist/mcp-server/tools/github/list-project-files.tool.js +1 -1
  20. package/dist/mcp-server/tools/github/list-project-files.tool.js.map +1 -1
  21. package/dist/mcp-server/tools/github/search-code.tool.d.ts +1 -1
  22. package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
  23. package/dist/mcp-server/tools/github/search-code.tool.js.map +1 -1
  24. package/package.json +9 -9
  25. package/wiki/best-practices/api-usage-examples.md +9 -9
  26. package/wiki/best-practices/architectural-patterns.md +19 -3
  27. package/wiki/best-practices/architecture-decisions.md +6 -6
  28. package/wiki/best-practices/code-style-standards/advanced-patterns.md +1 -1
  29. package/wiki/best-practices/code-style-standards/control-flow.md +1 -1
  30. package/wiki/best-practices/code-style-standards/function-patterns.md +2 -2
  31. package/wiki/best-practices/code-style-standards/index.md +2 -2
  32. package/wiki/best-practices/code-style-standards/naming-conventions.md +1 -1
  33. package/wiki/best-practices/code-style-standards/route-definitions.md +4 -4
  34. package/wiki/best-practices/data-modeling.md +1 -1
  35. package/wiki/best-practices/deployment-strategies.md +1 -1
  36. package/wiki/best-practices/error-handling.md +2 -2
  37. package/wiki/best-practices/performance-optimization.md +3 -3
  38. package/wiki/best-practices/security-guidelines.md +2 -2
  39. package/wiki/best-practices/troubleshooting-tips.md +1 -1
  40. package/wiki/{references → extensions}/components/authentication/api.md +12 -20
  41. package/wiki/{references → extensions}/components/authentication/errors.md +1 -1
  42. package/wiki/{references → extensions}/components/authentication/index.md +5 -8
  43. package/wiki/{references → extensions}/components/authentication/usage.md +20 -36
  44. package/wiki/{references → extensions}/components/authorization/api.md +62 -13
  45. package/wiki/{references → extensions}/components/authorization/errors.md +12 -7
  46. package/wiki/{references → extensions}/components/authorization/index.md +93 -6
  47. package/wiki/{references → extensions}/components/authorization/usage.md +42 -4
  48. package/wiki/{references → extensions}/components/health-check.md +5 -4
  49. package/wiki/{references → extensions}/components/index.md +2 -0
  50. package/wiki/{references → extensions}/components/mail/index.md +1 -1
  51. package/wiki/{references → extensions}/components/request-tracker.md +1 -1
  52. package/wiki/{references → extensions}/components/socket-io/api.md +2 -2
  53. package/wiki/{references → extensions}/components/socket-io/errors.md +2 -0
  54. package/wiki/{references → extensions}/components/socket-io/index.md +24 -20
  55. package/wiki/{references → extensions}/components/socket-io/usage.md +2 -2
  56. package/wiki/{references → extensions}/components/static-asset/api.md +14 -15
  57. package/wiki/{references → extensions}/components/static-asset/errors.md +3 -1
  58. package/wiki/{references → extensions}/components/static-asset/index.md +158 -89
  59. package/wiki/{references → extensions}/components/static-asset/usage.md +8 -5
  60. package/wiki/{references → extensions}/components/swagger.md +3 -3
  61. package/wiki/{references → extensions}/components/template/index.md +4 -4
  62. package/wiki/{references → extensions}/components/template/setup-page.md +1 -1
  63. package/wiki/{references → extensions}/components/template/single-page.md +1 -1
  64. package/wiki/{references → extensions}/components/websocket/api.md +7 -6
  65. package/wiki/{references → extensions}/components/websocket/errors.md +17 -3
  66. package/wiki/{references → extensions}/components/websocket/index.md +17 -11
  67. package/wiki/{references → extensions}/components/websocket/usage.md +2 -2
  68. package/wiki/{references → extensions}/helpers/crypto/index.md +1 -1
  69. package/wiki/{references → extensions}/helpers/env/index.md +9 -5
  70. package/wiki/{references → extensions}/helpers/error/index.md +2 -7
  71. package/wiki/{references → extensions}/helpers/index.md +18 -6
  72. package/wiki/{references → extensions}/helpers/kafka/admin.md +13 -1
  73. package/wiki/{references → extensions}/helpers/kafka/consumer.md +32 -31
  74. package/wiki/{references → extensions}/helpers/kafka/examples.md +20 -20
  75. package/wiki/{references → extensions}/helpers/kafka/index.md +61 -54
  76. package/wiki/{references → extensions}/helpers/kafka/producer.md +21 -20
  77. package/wiki/{references → extensions}/helpers/kafka/schema-registry.md +25 -25
  78. package/wiki/{references → extensions}/helpers/logger/index.md +2 -2
  79. package/wiki/{references → extensions}/helpers/queue/index.md +400 -4
  80. package/wiki/{references → extensions}/helpers/storage/api.md +170 -10
  81. package/wiki/{references → extensions}/helpers/storage/index.md +44 -8
  82. package/wiki/{references → extensions}/helpers/template/index.md +1 -1
  83. package/wiki/{references → extensions}/helpers/testing/index.md +4 -4
  84. package/wiki/{references → extensions}/helpers/types/index.md +63 -16
  85. package/wiki/{references → extensions}/helpers/websocket/index.md +1 -1
  86. package/wiki/extensions/index.md +48 -0
  87. package/wiki/guides/core-concepts/application/bootstrapping.md +55 -37
  88. package/wiki/guides/core-concepts/application/index.md +95 -35
  89. package/wiki/guides/core-concepts/components-guide.md +23 -19
  90. package/wiki/guides/core-concepts/components.md +34 -10
  91. package/wiki/guides/core-concepts/dependency-injection.md +99 -34
  92. package/wiki/guides/core-concepts/grpc-controllers.md +295 -0
  93. package/wiki/guides/core-concepts/persistent/datasources.md +37 -19
  94. package/wiki/guides/core-concepts/persistent/index.md +6 -6
  95. package/wiki/guides/core-concepts/persistent/models.md +50 -6
  96. package/wiki/guides/core-concepts/persistent/repositories.md +83 -8
  97. package/wiki/guides/core-concepts/persistent/transactions.md +39 -8
  98. package/wiki/guides/core-concepts/{controllers.md → rest-controllers.md} +32 -35
  99. package/wiki/guides/core-concepts/services.md +19 -6
  100. package/wiki/guides/get-started/5-minute-quickstart.md +17 -17
  101. package/wiki/guides/get-started/philosophy.md +1 -1
  102. package/wiki/guides/index.md +2 -2
  103. package/wiki/guides/reference/glossary.md +7 -7
  104. package/wiki/guides/reference/mcp-docs-server.md +1 -1
  105. package/wiki/guides/tutorials/building-a-crud-api.md +45 -39
  106. package/wiki/guides/tutorials/complete-installation.md +74 -51
  107. package/wiki/guides/tutorials/ecommerce-api.md +39 -30
  108. package/wiki/guides/tutorials/realtime-chat.md +12 -13
  109. package/wiki/guides/tutorials/testing.md +2 -2
  110. package/wiki/index.md +4 -3
  111. package/wiki/references/base/application.md +341 -21
  112. package/wiki/references/base/bootstrapping.md +43 -13
  113. package/wiki/references/base/components.md +259 -8
  114. package/wiki/references/base/controllers.md +556 -253
  115. package/wiki/references/base/datasources.md +159 -79
  116. package/wiki/references/base/dependency-injection.md +299 -48
  117. package/wiki/references/base/filter-system/application-usage.md +18 -2
  118. package/wiki/references/base/filter-system/array-operators.md +14 -6
  119. package/wiki/references/base/filter-system/comparison-operators.md +9 -3
  120. package/wiki/references/base/filter-system/default-filter.md +28 -3
  121. package/wiki/references/base/filter-system/fields-order-pagination.md +17 -13
  122. package/wiki/references/base/filter-system/index.md +169 -11
  123. package/wiki/references/base/filter-system/json-filtering.md +51 -18
  124. package/wiki/references/base/filter-system/list-operators.md +4 -3
  125. package/wiki/references/base/filter-system/logical-operators.md +7 -2
  126. package/wiki/references/base/filter-system/null-operators.md +50 -0
  127. package/wiki/references/base/filter-system/quick-reference.md +82 -243
  128. package/wiki/references/base/filter-system/range-operators.md +7 -1
  129. package/wiki/references/base/filter-system/tips.md +34 -7
  130. package/wiki/references/base/filter-system/use-cases.md +6 -5
  131. package/wiki/references/base/grpc-controllers.md +984 -0
  132. package/wiki/references/base/index.md +32 -24
  133. package/wiki/references/base/middleware.md +347 -0
  134. package/wiki/references/base/models.md +390 -46
  135. package/wiki/references/base/providers.md +14 -14
  136. package/wiki/references/base/repositories/advanced.md +195 -69
  137. package/wiki/references/base/repositories/index.md +447 -12
  138. package/wiki/references/base/repositories/mixins.md +103 -98
  139. package/wiki/references/base/repositories/relations.md +129 -45
  140. package/wiki/references/base/repositories/soft-deletable.md +104 -23
  141. package/wiki/references/base/services.md +94 -14
  142. package/wiki/references/index.md +12 -10
  143. package/wiki/references/quick-reference.md +98 -65
  144. package/wiki/references/utilities/crypto.md +21 -4
  145. package/wiki/references/utilities/date.md +25 -7
  146. package/wiki/references/utilities/index.md +26 -24
  147. package/wiki/references/utilities/jsx.md +54 -54
  148. package/wiki/references/utilities/module.md +8 -6
  149. package/wiki/references/utilities/parse.md +16 -9
  150. package/wiki/references/utilities/performance.md +22 -7
  151. package/wiki/references/utilities/promise.md +19 -16
  152. package/wiki/references/utilities/request.md +48 -26
  153. package/wiki/references/utilities/schema.md +69 -6
  154. package/wiki/references/utilities/statuses.md +131 -140
  155. /package/wiki/{references → extensions}/components/mail/api.md +0 -0
  156. /package/wiki/{references → extensions}/components/mail/errors.md +0 -0
  157. /package/wiki/{references → extensions}/components/mail/usage.md +0 -0
  158. /package/wiki/{references → extensions}/components/template/api-page.md +0 -0
  159. /package/wiki/{references → extensions}/components/template/errors-page.md +0 -0
  160. /package/wiki/{references → extensions}/components/template/usage-page.md +0 -0
  161. /package/wiki/{references → extensions}/helpers/cron/index.md +0 -0
  162. /package/wiki/{references → extensions}/helpers/inversion/index.md +0 -0
  163. /package/wiki/{references → extensions}/helpers/network/api.md +0 -0
  164. /package/wiki/{references → extensions}/helpers/network/index.md +0 -0
  165. /package/wiki/{references → extensions}/helpers/redis/index.md +0 -0
  166. /package/wiki/{references → extensions}/helpers/socket-io/api.md +0 -0
  167. /package/wiki/{references → extensions}/helpers/socket-io/index.md +0 -0
  168. /package/wiki/{references → extensions}/helpers/template/single-page.md +0 -0
  169. /package/wiki/{references → extensions}/helpers/uid/index.md +0 -0
  170. /package/wiki/{references → extensions}/helpers/websocket/api.md +0 -0
  171. /package/wiki/{references → extensions}/helpers/worker-thread/index.md +0 -0
  172. /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`](/references/helpers/websocket/) |
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 -- component + binding keys only
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 package. All helper types, constants, and classes are imported from `@venizia/ignis-helpers`.
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<Partial<IWebSocketServerOptions>>({
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](/references/helpers/websocket/) - Helper API documentation
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](/references/helpers/websocket/) - Helper API documentation
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](/references/components/authentication/) -- JWT and password verification
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](/references/helpers/logger/) -- Uses `Environment.COMMON_ENVS` for debug log filtering
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](/references/helpers/) -- All available helpers
230
- - [Logger Helper](/references/helpers/logger/) -- Logging errors
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 <Badge type="warning" text="Experimental" /> | Event streaming | Apache Kafka producer/consumer |
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](/references/components/) - Framework 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** the Admin client does not deal with serialized messages.
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` | | Consumer group ID. **Required** |
41
+ | `groupId` | `string` | -- | Consumer group ID. **Required** |
41
42
  | `identifier` | `string` | `'kafka-consumer'` | Scoped logging identifier |
42
- | `deserializers` | `Partial<Deserializers<K,V,HK,HV>>` | | Key/value/header deserializers |
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` | `30000` | Session timeout consumer removed from group if no heartbeat |
45
- | `heartbeatInterval` | `number` | `3000` | Heartbeat interval must be less than `sessionTimeout` |
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` | | Max bytes per fetch response per partition |
50
- | `maxWaitTime` | `number` | | Max time (ms) broker waits for `minBytes` |
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` | | Static group membership ID prevents rebalance on restart |
54
+ | `groupInstanceId` | `string` | -- | Static group membership ID -- prevents rebalance on restart |
54
55
  | `shutdownTimeout` | `number` | `30000` | Graceful shutdown timeout in ms |
55
- | `registry` | `SchemaRegistry` | | Schema registry for auto deser |
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} ${message.value}`);
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
- onMessage({ message })
158
- ├── success onMessageDone({ message })
159
- └── error onMessageError({ error, message })
158
+ -> onMessage({ message })
159
+ +-- success -> onMessageDone({ message })
160
+ +-- error -> onMessageError({ error, message })
160
161
 
161
162
  Stream 'error' event
162
- onMessageError({ error }) (no message available)
163
+ -> onMessageError({ error }) (no message available)
163
164
  ```
164
165
 
165
- - `onMessage` is the main processing callback do your business logic here
166
- - `onMessageDone` fires only after `onMessage` resolves successfully use for logging, metrics, etc.
167
- - `onMessageError` fires if `onMessage` OR `onMessageDone` throws use for error tracking
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) ignore historical messages |
192
- | `'earliest'` | Start from beginning process all historical messages |
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 calling `start()` twice logs a warning and returns immediately.
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 calling `startLagMonitoring()` twice logs a warning.
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 (leave consumer group)
238
- 3. Close the consumer client (graceful with timeout, or force)
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 prevents rebalance on restart
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
- ├── Partition 0 Consumer A
374
- ├── Partition 1 Consumer B
375
- └── Partition 2 Consumer C
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} ${JSON.stringify(data)}`);
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} ${message.value}`);
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 ${broker.host}`),
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 ${broker.host}`),
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` use `SASL_PLAINTEXT` |
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` | No broker connected yet, or connection lost | Check broker addresses, SASL config, network connectivity |
322
- | `isReady()` returns `false` (consumer) | Consumer not active `start()` not called or stream closed | Call `await helper.start({ topics })` before checking readiness |
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` used for inter-broker communication
342
- - `EXTERNAL` used for client connections from outside Docker
343
- - `CONTROLLER` used for KRaft controller communication
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](./) 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
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/) BullMQ, MQTT, and in-memory queues
356
- - [Redis Helper](../redis/) Redis connection management
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) 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
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