@venizia/ignis-docs 0.2.0 → 0.2.1-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +14 -14
  2. package/content/best-practices/api-usage-examples.md +39 -19
  3. package/content/best-practices/architectural-patterns.md +24 -13
  4. package/content/best-practices/architecture-decisions.md +29 -16
  5. package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
  6. package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
  7. package/content/best-practices/code-style-standards/control-flow.md +33 -1
  8. package/content/best-practices/code-style-standards/documentation.md +28 -8
  9. package/content/best-practices/code-style-standards/function-patterns.md +15 -4
  10. package/content/best-practices/code-style-standards/index.md +7 -2
  11. package/content/best-practices/code-style-standards/naming-conventions.md +27 -3
  12. package/content/best-practices/code-style-standards/route-definitions.md +9 -5
  13. package/content/best-practices/code-style-standards/tooling.md +14 -1
  14. package/content/best-practices/code-style-standards/type-safety.md +39 -6
  15. package/content/best-practices/common-pitfalls.md +59 -35
  16. package/content/best-practices/contribution-workflow.md +8 -4
  17. package/content/best-practices/data-modeling.md +78 -62
  18. package/content/best-practices/deployment-strategies.md +56 -19
  19. package/content/best-practices/error-handling.md +247 -153
  20. package/content/best-practices/index.md +6 -0
  21. package/content/best-practices/performance-optimization.md +26 -13
  22. package/content/best-practices/security-guidelines.md +35 -9
  23. package/content/best-practices/testing-strategies.md +7 -2
  24. package/content/best-practices/troubleshooting-tips.md +27 -17
  25. package/content/extensions/components/api-reference.md +109 -323
  26. package/content/extensions/components/authentication/api.md +489 -602
  27. package/content/extensions/components/authentication/errors.md +135 -498
  28. package/content/extensions/components/authentication/index.md +89 -801
  29. package/content/extensions/components/authentication/usage.md +231 -955
  30. package/content/extensions/components/authorization/api.md +991 -644
  31. package/content/extensions/components/authorization/errors.md +204 -208
  32. package/content/extensions/components/authorization/getting-started.md +227 -0
  33. package/content/extensions/components/authorization/index.md +88 -795
  34. package/content/extensions/components/authorization/usage.md +219 -528
  35. package/content/extensions/components/health-check.md +77 -243
  36. package/content/extensions/components/index.md +24 -90
  37. package/content/extensions/components/mail/api.md +553 -285
  38. package/content/extensions/components/mail/errors.md +76 -62
  39. package/content/extensions/components/mail/index.md +111 -463
  40. package/content/extensions/components/mail/usage.md +139 -173
  41. package/content/extensions/components/request-tracker.md +70 -173
  42. package/content/extensions/components/socket-io/api.md +462 -785
  43. package/content/extensions/components/socket-io/errors.md +49 -51
  44. package/content/extensions/components/socket-io/index.md +69 -372
  45. package/content/extensions/components/socket-io/usage.md +212 -105
  46. package/content/extensions/components/static-asset/api.md +461 -141
  47. package/content/extensions/components/static-asset/errors.md +121 -53
  48. package/content/extensions/components/static-asset/index.md +84 -606
  49. package/content/extensions/components/static-asset/usage.md +184 -299
  50. package/content/extensions/components/template/index.md +3 -3
  51. package/content/extensions/components/websocket/api.md +311 -404
  52. package/content/extensions/components/websocket/errors.md +47 -56
  53. package/content/extensions/components/websocket/index.md +75 -407
  54. package/content/extensions/components/websocket/usage.md +120 -338
  55. package/content/extensions/helpers/cron/index.md +52 -160
  56. package/content/extensions/helpers/crypto/index.md +67 -480
  57. package/content/extensions/helpers/crypto/reference.md +528 -0
  58. package/content/extensions/helpers/env/index.md +64 -178
  59. package/content/extensions/helpers/error/index.md +286 -196
  60. package/content/extensions/helpers/index.md +61 -47
  61. package/content/extensions/helpers/inversion/index.md +76 -550
  62. package/content/extensions/helpers/inversion/reference.md +530 -0
  63. package/content/extensions/helpers/kafka/admin.md +23 -3
  64. package/content/extensions/helpers/kafka/compile-binary.md +83 -52
  65. package/content/extensions/helpers/kafka/consumer.md +65 -28
  66. package/content/extensions/helpers/kafka/examples.md +46 -253
  67. package/content/extensions/helpers/kafka/index.md +55 -617
  68. package/content/extensions/helpers/kafka/producer.md +156 -22
  69. package/content/extensions/helpers/kafka/schema-registry.md +59 -79
  70. package/content/extensions/helpers/logger/hf-logger.md +220 -0
  71. package/content/extensions/helpers/logger/index.md +78 -552
  72. package/content/extensions/helpers/logger/pino.md +105 -0
  73. package/content/extensions/helpers/logger/reference.md +937 -0
  74. package/content/extensions/helpers/network/api.md +276 -195
  75. package/content/extensions/helpers/network/index.md +87 -524
  76. package/content/extensions/helpers/queue/index.md +80 -897
  77. package/content/extensions/helpers/queue/reference.md +494 -0
  78. package/content/extensions/helpers/redis/index.md +86 -640
  79. package/content/extensions/helpers/redis/reference.md +784 -0
  80. package/content/extensions/helpers/secrets/index.md +136 -0
  81. package/content/extensions/helpers/socket-io/api.md +325 -204
  82. package/content/extensions/helpers/socket-io/index.md +79 -429
  83. package/content/extensions/helpers/storage/api.md +584 -464
  84. package/content/extensions/helpers/storage/index.md +80 -573
  85. package/content/extensions/helpers/types/index.md +75 -495
  86. package/content/extensions/helpers/types/reference.md +689 -0
  87. package/content/extensions/helpers/uid/index.md +176 -189
  88. package/content/extensions/helpers/websocket/api.md +366 -214
  89. package/content/extensions/helpers/websocket/index.md +68 -503
  90. package/content/extensions/helpers/worker-thread/index.md +62 -396
  91. package/content/extensions/helpers/worker-thread/reference.md +428 -0
  92. package/content/extensions/index.md +38 -39
  93. package/content/extensions/src-details/mcp-server.md +96 -548
  94. package/content/guides/core-concepts/persistent/datasources.md +2 -2
  95. package/content/guides/core-concepts/persistent/index.md +5 -1
  96. package/content/guides/core-concepts/persistent/models.md +1 -1
  97. package/content/guides/core-concepts/persistent/pglite.md +218 -0
  98. package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
  99. package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
  100. package/content/guides/core-concepts/persistent/search-typesense.md +28 -16
  101. package/content/guides/core-concepts/persistent/sqlite.md +296 -0
  102. package/content/guides/core-concepts/persistent/transactions.md +12 -11
  103. package/content/guides/core-concepts/secrets-vault.md +177 -0
  104. package/content/guides/core-concepts/services.md +1 -1
  105. package/content/guides/get-started/5-minute-quickstart.md +59 -206
  106. package/content/guides/get-started/philosophy.md +135 -670
  107. package/content/guides/get-started/setup.md +53 -74
  108. package/content/guides/migrations/redis-helpers-migration.md +5 -4
  109. package/content/guides/migrations/scoped-rbac-migration.md +5 -5
  110. package/content/guides/migrations/unified-connectors-migration.md +8 -7
  111. package/content/guides/tutorials/ecommerce-api.md +3 -8
  112. package/content/guides/tutorials/realtime-chat.md +1 -1
  113. package/content/references/base/application.md +64 -22
  114. package/content/references/base/components.md +3 -3
  115. package/content/references/base/connectors.md +79 -136
  116. package/content/references/base/controllers.md +12 -12
  117. package/content/references/base/datasources-reference.md +600 -0
  118. package/content/references/base/datasources.md +84 -444
  119. package/content/references/base/dependency-injection.md +25 -46
  120. package/content/references/base/filter-system/application-usage.md +95 -123
  121. package/content/references/base/filter-system/array-operators.md +33 -43
  122. package/content/references/base/filter-system/comparison-operators.md +55 -63
  123. package/content/references/base/filter-system/default-filter.md +144 -350
  124. package/content/references/base/filter-system/fields-order-pagination.md +116 -148
  125. package/content/references/base/filter-system/index.md +114 -253
  126. package/content/references/base/filter-system/json-filtering.md +52 -181
  127. package/content/references/base/filter-system/list-operators.md +28 -44
  128. package/content/references/base/filter-system/logical-operators.md +69 -114
  129. package/content/references/base/filter-system/null-operators.md +41 -98
  130. package/content/references/base/filter-system/pattern-matching.md +48 -51
  131. package/content/references/base/filter-system/quick-reference.md +93 -196
  132. package/content/references/base/filter-system/range-operators.md +22 -38
  133. package/content/references/base/filter-system/tips.md +70 -133
  134. package/content/references/base/filter-system/use-cases.md +173 -232
  135. package/content/references/base/grpc-controllers.md +53 -17
  136. package/content/references/base/index.md +5 -3
  137. package/content/references/base/middlewares.md +43 -28
  138. package/content/references/base/models-reference.md +886 -0
  139. package/content/references/base/models.md +81 -1452
  140. package/content/references/base/providers.md +8 -8
  141. package/content/references/base/repositories/advanced.md +281 -419
  142. package/content/references/base/repositories/index.md +84 -644
  143. package/content/references/base/repositories/mixins.md +25 -21
  144. package/content/references/base/repositories/relations.md +194 -375
  145. package/content/references/base/repositories/soft-deletable.md +67 -55
  146. package/content/references/base/secrets.md +267 -0
  147. package/content/references/base/services.md +8 -6
  148. package/content/references/configuration/environment-variables.md +73 -21
  149. package/content/references/configuration/index.md +51 -31
  150. package/content/references/index.md +1 -1
  151. package/content/references/quick-reference.md +3 -16
  152. package/content/references/utilities/crypto.md +35 -76
  153. package/content/references/utilities/date.md +33 -73
  154. package/content/references/utilities/duration.md +85 -0
  155. package/content/references/utilities/index.md +6 -2
  156. package/content/references/utilities/jsx-reference.md +298 -0
  157. package/content/references/utilities/jsx.md +82 -525
  158. package/content/references/utilities/module.md +81 -61
  159. package/content/references/utilities/parse.md +34 -64
  160. package/content/references/utilities/performance.md +33 -58
  161. package/content/references/utilities/promise.md +28 -62
  162. package/content/references/utilities/request.md +58 -218
  163. package/content/references/utilities/retry.md +139 -0
  164. package/content/references/utilities/schema.md +43 -137
  165. package/content/references/utilities/statuses-reference.md +361 -0
  166. package/content/references/utilities/statuses.md +63 -667
  167. package/dist/mcp-server/index.js +0 -0
  168. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  169. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
  170. package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
  171. package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
  172. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
  173. package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
  174. package/package.json +24 -23
@@ -1,646 +1,84 @@
1
- # Kafka
2
-
3
- Apache Kafka event streaming with producer, consumer, admin, and schema registry helpers. Built on [`@platformatic/kafka`](https://github.com/platformatic/kafka) v1.30.0 -- a pure TypeScript Kafka client with zero native dependencies.
4
-
5
- ## Overview
6
-
7
- The Kafka module provides four helper classes built on a shared `BaseKafkaHelper` base:
8
-
9
- | Class | Wraps | Use Case |
10
- |-------|-------|----------|
11
- | `KafkaProducerHelper` | `Producer` | Publish messages, transactions |
12
- | `KafkaConsumerHelper` | `Consumer` | Consume messages with consumer groups, lag monitoring |
13
- | `KafkaAdminHelper` | `Admin` | Manage topics, partitions, groups, ACLs, configs |
14
- | `KafkaSchemaRegistryHelper` | `ConfluentSchemaRegistry` | Schema validation and auto ser/deser |
15
-
16
- All helpers (except schema registry) extend `BaseKafkaHelper` which provides:
17
-
18
- - **Scoped logging** via `BaseHelper` (Winston with daily rotation)
19
- - **Health tracking** -- per-broker connection tracking via `isHealthy()`, `isReady()`, `getHealthStatus()`, `getConnectedBrokerCount()`
20
- - **Broker event callbacks** -- `onBrokerConnect`, `onBrokerDisconnect`
21
- - **Broker failure tracking** -- automatic `configureBrokerFailed()` sets status to `'disconnected'` only when all brokers are gone
22
- - **Graceful shutdown** -- timeout-based with force fallback
23
- - **Sensible defaults** via `KafkaDefaults` constants
24
- - **Factory pattern** via `newInstance()` static method
25
-
26
- Use `getProducer()`, `getConsumer()`, or `getAdmin()` to access the full underlying `@platformatic/kafka` API directly.
27
-
28
- ### Import Path
29
-
30
- ```typescript
31
- // Helpers & constants (via subpath export)
32
- import {
33
- KafkaProducerHelper,
34
- KafkaConsumerHelper,
35
- KafkaAdminHelper,
36
- KafkaSchemaRegistryHelper,
37
- BaseKafkaHelper,
38
- KafkaDefaults,
39
- KafkaAcks,
40
- KafkaGroupProtocol,
41
- KafkaHealthStatuses,
42
- KafkaClientEvents,
43
- } from '@venizia/ignis-helpers/kafka';
44
-
45
- // Types
46
- import type {
47
- IKafkaConnectionOptions,
48
- IKafkaProducerOptions,
49
- IKafkaConsumerOptions,
50
- IKafkaAdminOptions,
51
- IKafkaConsumeStartOptions,
52
- IKafkaSchemaRegistryOptions,
53
- IKafkaTransactionContext,
54
- IKafkaBaseOptions,
55
- TKafkaAcks,
56
- TKafkaGroupProtocol,
57
- TKafkaHealthStatus,
58
- TKafkaBrokerEventCallback,
59
- TKafkaMessageCallback,
60
- TKafkaMessageDoneCallback,
61
- TKafkaMessageErrorCallback,
62
- TKafkaGroupJoinCallback,
63
- TKafkaGroupLeaveCallback,
64
- TKafkaGroupRebalanceCallback,
65
- TKafkaHeartbeatErrorCallback,
66
- TKafkaLagCallback,
67
- TKafkaLagErrorCallback,
68
- TKafkaTransactionCallback,
69
- } from '@venizia/ignis-helpers/kafka';
70
-
71
- // @platformatic/kafka (direct usage)
72
- import {
73
- Producer, Consumer, Admin, MessagesStream,
74
- stringSerializers, stringDeserializers,
75
- stringSerializer, stringDeserializer,
76
- jsonSerializer, jsonDeserializer,
77
- serializersFrom, deserializersFrom,
78
- } from '@platformatic/kafka';
79
-
80
- import type {
81
- Message, MessageToProduce,
82
- SendOptions, ConsumeOptions,
83
- Serializers, Deserializers,
84
- SASLOptions, ConnectionOptions,
85
- } from '@platformatic/kafka';
86
- ```
87
-
88
- > [!NOTE]
89
- > Kafka helpers are **not** re-exported from the main `@venizia/ignis-helpers` entry point. You must use the `@venizia/ignis-helpers/kafka` subpath import. This keeps the optional `@platformatic/kafka` peer dependency isolated for tree-shaking.
90
-
91
- > [!WARNING]
92
- > Compiling an application that uses these helpers with `bun build --compile` produces a binary that dies on startup with `ENOENT: /$bunfs/dist/native.wasm`. The build must register `platformaticWasmPlugin` from `@venizia/ignis-helpers/kafka` -- see [Compiling to a Single Binary](./compile-binary.md).
93
-
94
- ### Installation
95
-
96
- ```bash
97
- bun add @platformatic/kafka
98
- ```
99
-
100
- ## Architecture
101
-
102
- ### Class Hierarchy
103
-
104
- ```
105
- BaseHelper (scoped logging, identifier)
106
- +-- BaseKafkaHelper<TClient> (health tracking, broker events, graceful shutdown)
107
- | +-- KafkaProducerHelper<K,V,HK,HV>
108
- | +-- KafkaConsumerHelper<K,V,HK,HV>
109
- | +-- KafkaAdminHelper
110
- |
111
- +-- KafkaSchemaRegistryHelper<K,V,HK,HV> (no broker connection)
112
- ```
113
-
114
- ### BaseKafkaHelper
115
-
116
- All Kafka helpers (except schema registry) extend `BaseKafkaHelper<TClient>`, which provides:
117
-
118
- ```typescript
119
- abstract class BaseKafkaHelper<TClient extends Base<BaseOptions>> extends BaseHelper {
120
- // Health
121
- isHealthy(): boolean; // true when at least one broker is connected
122
- isReady(): boolean; // healthStatus === 'connected' (consumer overrides: + isActive())
123
- getHealthStatus(): TKafkaHealthStatus; // 'connected' | 'disconnected' | 'unknown'
124
- getConnectedBrokerCount(): number; // number of currently connected brokers
125
-
126
- // Shutdown (used by subclasses)
127
- protected closeClient(): Promise<void>;
128
- protected gracefulCloseClient(): Promise<void>; // races closeClient vs shutdownTimeout
129
- protected resetHealthState(): void; // clears broker tracking + sets 'disconnected'
130
- }
131
- ```
132
-
133
- Health tracking uses a **per-broker connection set** (`host:port` keys). A single idle broker disconnect does not make the client unhealthy -- only when **all** brokers are disconnected does `isHealthy()` return `false`.
134
-
135
- Health status transitions automatically via broker events:
136
- - `client:broker:connect` -> adds broker, sets `healthStatus` to `'connected'`
137
- - `client:broker:disconnect` -> removes broker, sets `healthStatus` to `'disconnected'` only when all brokers are gone
138
- - `client:broker:failed` -> removes broker, sets `healthStatus` to `'disconnected'` only when all brokers are gone
139
- - `close()` -> clears all brokers, sets `healthStatus` to `'disconnected'`
140
-
141
- ## Connection Options
142
-
143
- All three helpers share a common base interface `IKafkaConnectionOptions` which extends `@platformatic/kafka`'s `ConnectionOptions`.
144
-
145
- ```typescript
146
- interface IKafkaConnectionOptions extends ConnectionOptions {
147
- bootstrapBrokers: string[];
148
- clientId: string;
149
- retries?: number; // Default: 3
150
- retryDelay?: number; // Default: 1000ms
151
- }
152
- ```
153
-
154
- ### Full Options Table
155
-
156
- | Option | Type | Default | Description |
157
- |--------|------|---------|-------------|
158
- | `bootstrapBrokers` | `string[]` | -- | Kafka broker addresses (`host:port`). **Required** |
159
- | `clientId` | `string` | -- | Unique client identifier. **Required** |
160
- | `retries` | `number` | `3` | Number of connection retries before failing |
161
- | `retryDelay` | `number` | `1000` | Delay between retries in milliseconds |
162
- | `sasl` | `SASLOptions` | -- | SASL authentication configuration |
163
- | `tls` | `TLSConnectionOptions` | -- | TLS/SSL connection options |
164
- | `ssl` | `TLSConnectionOptions` | -- | Alias for `tls` |
165
- | `connectTimeout` | `number` | -- | TCP connection timeout in milliseconds |
166
- | `requestTimeout` | `number` | -- | Kafka request timeout in milliseconds |
167
-
168
- ### Shared Helper Options
169
-
170
- These options are available on all three helpers (`IKafkaProducerOptions`, `IKafkaConsumerOptions`, `IKafkaAdminOptions`):
171
-
172
- | Option | Type | Default | Description |
173
- |--------|------|---------|-------------|
174
- | `identifier` | `string` | `'kafka-{type}'` | Scoped logging identifier |
175
- | `shutdownTimeout` | `number` | `30000` | Graceful shutdown timeout in ms |
176
- | `onBrokerConnect` | `TKafkaBrokerEventCallback` | -- | Called when broker connects |
177
- | `onBrokerDisconnect` | `TKafkaBrokerEventCallback` | -- | Called when broker disconnects |
178
-
179
- ### SASL Authentication
180
-
181
- `@platformatic/kafka` supports five SASL mechanisms:
182
-
183
- | Mechanism | Use Case |
184
- |-----------|----------|
185
- | `PLAIN` | Simple username/password (use with TLS in production) |
186
- | `SCRAM-SHA-256` | Challenge-response, password never sent in plaintext |
187
- | `SCRAM-SHA-512` | Same as SHA-256 with stronger hash |
188
- | `OAUTHBEARER` | Token-based (Azure Event Hubs, Confluent Cloud) |
189
- | `GSSAPI` | Kerberos authentication |
1
+ ---
2
+ title: Kafka
3
+ description: Apache Kafka producer, consumer, admin, and schema registry helpers built on a pure TypeScript client
4
+ difficulty: intermediate
5
+ ---
190
6
 
191
- ```typescript
192
- interface SASLOptions {
193
- mechanism: 'PLAIN' | 'SCRAM-SHA-256' | 'SCRAM-SHA-512' | 'OAUTHBEARER' | 'GSSAPI';
194
- username?: string | CredentialProvider;
195
- password?: string | CredentialProvider;
196
- token?: string | CredentialProvider;
197
- oauthBearerExtensions?: Record<string, string> | CredentialProvider<Record<string, string>>;
198
- authenticate?: SASLCustomAuthenticator;
199
- }
200
- ```
201
-
202
- #### SCRAM-SHA-512 Example
203
-
204
- ```typescript
205
- const helper = KafkaConsumerHelper.newInstance({
206
- bootstrapBrokers: ['broker1:9092', 'broker2:9092', 'broker3:9092'],
207
- clientId: 'my-consumer',
208
- groupId: 'my-group',
209
- sasl: {
210
- mechanism: 'SCRAM-SHA-512',
211
- username: 'kafka-user',
212
- password: 'kafka-password',
213
- },
214
- connectTimeout: 30_000,
215
- requestTimeout: 30_000,
216
- onBrokerConnect: ({ broker }) => console.log(`Connected to ${broker.host}:${broker.port}`),
217
- });
218
- ```
219
-
220
- #### OAUTHBEARER Example
221
-
222
- ```typescript
223
- const helper = KafkaProducerHelper.newInstance({
224
- bootstrapBrokers: ['pkc-xxxxx.us-west-2.aws.confluent.cloud:9092'],
225
- clientId: 'my-producer',
226
- sasl: {
227
- mechanism: 'OAUTHBEARER',
228
- token: async () => {
229
- const response = await fetch('https://auth.example.com/token', { method: 'POST' });
230
- const { access_token } = await response.json();
231
- return access_token;
232
- },
233
- },
234
- tls: true,
235
- });
236
- ```
237
-
238
- #### TLS Without SASL
239
-
240
- ```typescript
241
- const helper = KafkaProducerHelper.newInstance({
242
- bootstrapBrokers: ['broker:9093'],
243
- clientId: 'my-producer',
244
- tls: {
245
- ca: fs.readFileSync('/path/to/ca.pem'),
246
- cert: fs.readFileSync('/path/to/client-cert.pem'),
247
- key: fs.readFileSync('/path/to/client-key.pem'),
248
- },
249
- });
250
- ```
251
-
252
- ## Serialization & Deserialization
253
-
254
- `@platformatic/kafka`'s default wire format is `Buffer`. The helpers default generic types to `string` (matching common usage), but you must provide serializers/deserializers explicitly.
255
-
256
- ### Built-in Serializers
257
-
258
- | Export | Type | Description |
259
- |--------|------|-------------|
260
- | `stringSerializer` | `Serializer<string>` | `string -> Buffer` (UTF-8) |
261
- | `stringDeserializer` | `Deserializer<string>` | `Buffer -> string` (UTF-8) |
262
- | `jsonSerializer` | `Serializer<T>` | `object -> Buffer` (JSON.stringify + UTF-8) |
263
- | `jsonDeserializer` | `Deserializer<T>` | `Buffer -> object` (UTF-8 + JSON.parse) |
264
- | `stringSerializers` | `Serializers<string, string, string, string>` | All four positions as string |
265
- | `stringDeserializers` | `Deserializers<string, string, string, string>` | All four positions as string |
7
+ # Kafka
266
8
 
267
- ### Helper Functions
9
+ IGNIS wraps `@platformatic/kafka` in four scoped helpers: producer, consumer, admin, and schema registry. Each adds health tracking, graceful shutdown, and IGNIS-style scoped logging over the raw client.
268
10
 
269
- | Export | Signature | Description |
270
- |--------|-----------|-------------|
271
- | `serializersFrom(s)` | `<T>(s: Serializer<T>) => Serializers<T, T, T, T>` | Create full serializers from a single serializer |
272
- | `deserializersFrom(d)` | `<T>(d: Deserializer<T>) => Deserializers<T, T, T, T>` | Create full deserializers from a single deserializer |
11
+ ## In one example
273
12
 
274
- ### String Serialization
13
+ The smallest real use: create a producer, send a message through the underlying client, and close it.
275
14
 
276
15
  ```typescript
277
- import { stringSerializers, stringDeserializers } from '@platformatic/kafka';
16
+ import { KafkaProducerHelper } from '@venizia/ignis-helpers/kafka';
17
+ import { stringSerializers } from '@platformatic/kafka';
278
18
 
279
19
  const producer = KafkaProducerHelper.newInstance({
280
20
  bootstrapBrokers: ['localhost:9092'],
281
- clientId: 'my-producer',
21
+ clientId: 'order-producer',
282
22
  serializers: stringSerializers,
283
23
  });
284
24
 
285
- const consumer = KafkaConsumerHelper.newInstance({
286
- bootstrapBrokers: ['localhost:9092'],
287
- clientId: 'my-consumer',
288
- groupId: 'my-group',
289
- deserializers: stringDeserializers,
290
- onMessage: async ({ message }) => {
291
- console.log(message.key, message.value); // both strings
292
- },
293
- });
294
- ```
295
-
296
- ### JSON Serialization
297
-
298
- ```typescript
299
- import {
300
- jsonSerializer, jsonDeserializer,
301
- stringSerializer, stringDeserializer,
302
- serializersFrom, deserializersFrom,
303
- } from '@platformatic/kafka';
304
-
305
- const producer = KafkaProducerHelper.newInstance({
306
- bootstrapBrokers: ['localhost:9092'],
307
- clientId: 'my-producer',
308
- serializers: { ...serializersFrom(jsonSerializer), key: stringSerializer },
309
- });
310
-
311
25
  await producer.getProducer().send({
312
- messages: [{
313
- topic: 'orders',
314
- key: 'order-123',
315
- value: { id: '123', status: 'created', amount: 99 },
316
- }],
26
+ messages: [{ topic: 'orders', key: 'order-1', value: JSON.stringify({ status: 'created' }) }],
317
27
  });
318
28
 
319
- const consumer = KafkaConsumerHelper.newInstance({
320
- bootstrapBrokers: ['localhost:9092'],
321
- clientId: 'my-consumer',
322
- groupId: 'my-group',
323
- deserializers: { ...deserializersFrom(jsonDeserializer), key: stringDeserializer },
324
- onMessage: async ({ message }) => {
325
- console.log(message.value.id, message.value.status); // typed object
326
- },
327
- });
29
+ await producer.close();
328
30
  ```
329
31
 
330
- ### Schema Registry Serialization
32
+ `getProducer()` returns the full `@platformatic/kafka` `Producer`. Every helper follows the same three-step pattern:
331
33
 
332
- For schema-validated serialization (Avro, Protobuf, JSON Schema), use the schema registry helper:
333
-
334
- ```typescript
335
- const registry = KafkaSchemaRegistryHelper.newInstance({
336
- url: 'http://localhost:8081',
337
- });
338
-
339
- const producer = KafkaProducerHelper.newInstance({
340
- bootstrapBrokers: ['localhost:9092'],
341
- clientId: 'my-producer',
342
- registry: registry.getRegistry(),
343
- });
344
-
345
- const consumer = KafkaConsumerHelper.newInstance({
346
- bootstrapBrokers: ['localhost:9092'],
347
- clientId: 'my-consumer',
348
- groupId: 'my-group',
349
- registry: registry.getRegistry(),
350
- onMessage: async ({ message }) => {
351
- // message.value is auto-deserialized using registered schema
352
- },
353
- });
354
- ```
34
+ | Step | Call |
35
+ |---|---|
36
+ | Construct | `newInstance()` |
37
+ | Reach the native client | `getProducer()` / `getConsumer()` / `getAdmin()` |
38
+ | Close | through the helper, not the native client |
355
39
 
356
- See **[Schema Registry](./schema-registry)** for full documentation.
40
+ ## Which helper do I need
357
41
 
358
- ## Generic Type Parameters
359
-
360
- All helpers (and their option interfaces) support generic type parameters controlling the serialization types:
361
-
362
- ```typescript
363
- class KafkaProducerHelper<
364
- KeyType = string,
365
- ValueType = string,
366
- HeaderKeyType = string,
367
- HeaderValueType = string,
368
- >
369
- ```
370
-
371
- | Parameter | Default | Description |
372
- |-----------|---------|-------------|
373
- | `KeyType` | `string` | Message key type after serialization/deserialization |
374
- | `ValueType` | `string` | Message value type after serialization/deserialization |
375
- | `HeaderKeyType` | `string` | Header key type |
376
- | `HeaderValueType` | `string` | Header value type |
377
-
378
- > [!NOTE]
379
- > `@platformatic/kafka` defaults to `Buffer` for all four positions. The helpers default to `string` which is more common for application code. If you don't pass serializers, your messages will be sent/received as `Buffer`.
380
-
381
- ```typescript
382
- // Default: string types (most common)
383
- const helper = KafkaProducerHelper.newInstance({ ... });
384
-
385
- // Custom: string keys, JSON object values
386
- const helper = KafkaProducerHelper.newInstance<string, MyEvent, string, string>({
387
- serializers: { ...serializersFrom(jsonSerializer), key: stringSerializer },
388
- ...
389
- });
390
- ```
391
-
392
- ## Constants
393
-
394
- ### KafkaDefaults
395
-
396
- Centralized default values used by all helpers.
397
-
398
- ```typescript
399
- import { KafkaDefaults } from '@venizia/ignis-helpers/kafka';
400
- ```
401
-
402
- | Constant | Value | Scope | Description |
403
- |----------|-------|-------|-------------|
404
- | `RETRIES` | `3` | Shared | Connection retry count |
405
- | `RETRY_DELAY` | `1000` | Shared | Retry delay in ms |
406
- | `SHUTDOWN_TIMEOUT` | `30000` | Shared | Graceful shutdown timeout in ms |
407
- | `STRICT` | `true` | Producer | Fail on unknown topics |
408
- | `AUTOCREATE_TOPICS` | `false` | Producer | Auto-create topics on produce |
409
- | `AUTOCOMMIT` | `false` | Consumer | Auto-commit offsets |
410
- | `SESSION_TIMEOUT` | `60000` | Consumer | Session timeout in ms |
411
- | `HEARTBEAT_INTERVAL` | `10000` | Consumer | Heartbeat interval in ms |
412
- | `HIGH_WATER_MARK` | `1024` | Consumer | Stream buffer size (messages) |
413
- | `MIN_BYTES` | `1` | Consumer | Min bytes per fetch |
414
- | `METADATA_MAX_AGE` | `300000` | Consumer | Metadata cache TTL in ms |
415
- | `GROUP_PROTOCOL` | `'classic'` | Consumer | Default group protocol |
416
- | `CONSUME_MODE` | `'committed'` | Consumer | Default consume mode |
417
- | `CONSUME_FALLBACK_MODE` | `'latest'` | Consumer | Default consume fallback mode |
418
- | `LAG_MONITOR_INTERVAL` | `30000` | Consumer | Lag monitoring poll interval in ms |
419
-
420
- ### KafkaHealthStatuses
421
-
422
- Health status values used by all Kafka helpers.
423
-
424
- ```typescript
425
- import { KafkaHealthStatuses } from '@venizia/ignis-helpers/kafka';
426
- ```
427
-
428
- | Constant | Value | Description |
429
- |----------|-------|-------------|
430
- | `CONNECTED` | `'connected'` | Broker connection established |
431
- | `DISCONNECTED` | `'disconnected'` | Broker connection lost or closed |
432
- | `UNKNOWN` | `'unknown'` | Initial state before first broker event |
433
-
434
- ### KafkaClientEvents
435
-
436
- Event name constants for `@platformatic/kafka` event emitters.
437
-
438
- ```typescript
439
- import { KafkaClientEvents } from '@venizia/ignis-helpers/kafka';
440
- ```
441
-
442
- | Constant | Value | Scope |
443
- |----------|-------|-------|
444
- | `BROKER_CONNECT` | `'client:broker:connect'` | All clients |
445
- | `BROKER_DISCONNECT` | `'client:broker:disconnect'` | All clients |
446
- | `BROKER_FAILED` | `'client:broker:failed'` | All clients |
447
- | `CONSUMER_GROUP_JOIN` | `'consumer:group:join'` | Consumer |
448
- | `CONSUMER_GROUP_LEAVE` | `'consumer:group:leave'` | Consumer |
449
- | `CONSUMER_GROUP_REBALANCE` | `'consumer:group:rebalance'` | Consumer |
450
- | `CONSUMER_HEARTBEAT_ERROR` | `'consumer:heartbeat:error'` | Consumer |
451
- | `CONSUMER_LAG` | `'consumer:lag'` | Consumer |
452
- | `CONSUMER_LAG_ERROR` | `'consumer:lag:error'` | Consumer |
453
- | `STREAM_DATA` | `'data'` | Stream |
454
- | `STREAM_ERROR` | `'error'` | Stream |
455
-
456
- ### KafkaAcks
457
-
458
- Producer acknowledgment levels.
459
-
460
- ```typescript
461
- import { KafkaAcks } from '@venizia/ignis-helpers/kafka';
462
- ```
463
-
464
- | Constant | Value | Description | Trade-off |
465
- |----------|-------|-------------|-----------|
466
- | `NONE` | `0` | No acknowledgment -- fire-and-forget | Fastest, no durability guarantee |
467
- | `LEADER` | `1` | Leader broker acknowledges | Fast, leader-durable |
468
- | `ALL` | `-1` | All in-sync replicas acknowledge | Slowest, fully durable |
469
-
470
- ### KafkaGroupProtocol
471
-
472
- Consumer group protocol versions.
473
-
474
- ```typescript
475
- import { KafkaGroupProtocol } from '@venizia/ignis-helpers/kafka';
476
- ```
477
-
478
- | Constant | Value | Description |
479
- |----------|-------|-------------|
480
- | `CLASSIC` | `'classic'` | Classic consumer group protocol (default, all Kafka versions) |
481
- | `CONSUMER` | `'consumer'` | New consumer group protocol -- KIP-848 (Kafka 3.7+) |
482
-
483
- ### Derived Types
484
-
485
- ```typescript
486
- import type { TKafkaAcks, TKafkaGroupProtocol, TKafkaHealthStatus } from '@venizia/ignis-helpers/kafka';
487
-
488
- // TKafkaAcks = 0 | 1 | -1
489
- // TKafkaGroupProtocol = 'classic' | 'consumer'
490
- // TKafkaHealthStatus = 'connected' | 'disconnected' | 'unknown'
491
- ```
492
-
493
- ## Compression
494
-
495
- `@platformatic/kafka` supports five compression algorithms:
496
-
497
- | Algorithm | Value | Description |
498
- |-----------|-------|-------------|
499
- | None | `'none'` | No compression (default) |
500
- | GZIP | `'gzip'` | Good compression ratio, moderate CPU |
501
- | Snappy | `'snappy'` | Fast compression, moderate ratio |
502
- | LZ4 | `'lz4'` | Very fast, good for high-throughput |
503
- | Zstandard | `'zstd'` | Best ratio, moderate CPU |
504
-
505
- ```typescript
506
- const helper = KafkaProducerHelper.newInstance({
507
- bootstrapBrokers: ['localhost:9092'],
508
- clientId: 'my-producer',
509
- serializers: stringSerializers,
510
- compression: 'zstd',
511
- });
512
-
513
- // Override per-send
514
- await helper.getProducer().send({
515
- messages: [{ topic: 'logs', key: 'l1', value: largePayload }],
516
- compression: 'lz4',
517
- });
518
- ```
519
-
520
- ## Quick Usage Comparison
521
-
522
- ### Construction
523
-
524
- ```typescript
525
- // Admin
526
- const admin = KafkaAdminHelper.newInstance({
527
- bootstrapBrokers: ['127.0.0.1:29092'],
528
- clientId: 'my-admin',
529
- onBrokerConnect: ({ broker }) => console.log(`Connected to ${broker.host}`),
530
- onBrokerDisconnect: ({ broker }) => console.log(`Disconnected from ${broker.host}`),
531
- });
532
-
533
- // Producer
534
- const producer = KafkaProducerHelper.newInstance({
535
- bootstrapBrokers: ['127.0.0.1:29092'],
536
- clientId: 'my-producer',
537
- acks: -1,
538
- idempotent: true,
539
- transactionalId: 'my-tx',
540
- onBrokerConnect: ({ broker }) => console.log(`Connected to ${broker.host}`),
541
- onBrokerDisconnect: ({ broker }) => console.log(`Disconnected from ${broker.host}`),
542
- });
543
-
544
- // Consumer
545
- const consumer = KafkaConsumerHelper.newInstance({
546
- bootstrapBrokers: ['127.0.0.1:29092'],
547
- clientId: 'my-consumer',
548
- groupId: 'my-group',
549
- onBrokerConnect: ({ broker }) => console.log(`Connected to ${broker.host}`),
550
- onBrokerDisconnect: ({ broker }) => console.log(`Disconnected from ${broker.host}`),
551
- onMessage: async ({ message }) => {
552
- console.log('Received:', message.value);
553
- await message.commit();
554
- },
555
- onMessageDone: ({ message }) => console.log('Done:', message.key),
556
- onMessageError: ({ error, message }) => console.error('Error:', error),
557
- onGroupJoin: ({ groupId, memberId }) => console.log(`Joined ${groupId}`),
558
- onGroupLeave: ({ groupId }) => console.log(`Left ${groupId}`),
559
- onGroupRebalance: ({ groupId }) => console.log(`Rebalance ${groupId}`),
560
- onHeartbeatError: ({ error }) => console.error('Heartbeat:', error),
561
- onLag: ({ lag }) => console.log('Lag:', lag),
562
- onLagError: ({ error }) => console.error('Lag error:', error),
563
- });
564
- ```
565
-
566
- ### Core Operations
567
-
568
- | Admin | Producer | Consumer |
569
- |-------|----------|----------|
570
- | `admin.getAdmin()` | `producer.getProducer()` | `consumer.getConsumer()` |
571
- | -- | `producer.getProducer().send(...)` | `await consumer.start({ topics: ['t1'] })` |
572
- | -- | `await producer.runInTransaction(async ({ send, addConsumer, addOffset }) => { ... })` | `consumer.startLagMonitoring({ topics: ['t1'], interval: 10_000 })` |
573
- | -- | -- | `consumer.stopLagMonitoring()` |
574
- | -- | -- | `consumer.getStream()` |
575
-
576
- ### Health Checks
577
-
578
- ```typescript
579
- // All three -- identical API
580
- helper.isHealthy(); // true when at least one broker connected
581
- helper.isReady(); // Admin/Producer: same as isHealthy()
582
- // Consumer: isHealthy() + consumer.isActive()
583
- helper.getHealthStatus(); // 'connected' | 'disconnected' | 'unknown'
584
- ```
585
-
586
- ### Shutdown
587
-
588
- ```typescript
589
- // All three -- identical API
590
- await helper.close(); // graceful (timeout -> force fallback)
591
- await helper.close({ isForce: true }); // immediate force close
592
- ```
593
-
594
- ### With Schema Registry
595
-
596
- ```typescript
597
- const registry = KafkaSchemaRegistryHelper.newInstance({ url: 'http://localhost:8081' });
598
-
599
- const producer = KafkaProducerHelper.newInstance({
600
- ...,
601
- registry: registry.getRegistry(),
602
- // or use registry.getSerializers() for manual serializer config
603
- });
604
-
605
- const consumer = KafkaConsumerHelper.newInstance({
606
- ...,
607
- registry: registry.getRegistry(),
608
- // or use registry.getDeserializers() for manual deserializer config
609
- });
610
- ```
42
+ | Class | Wraps | Use it to |
43
+ |---|---|---|
44
+ | `KafkaProducerHelper` | `Producer` | Publish messages, run transactions |
45
+ | `KafkaConsumerHelper` | `Consumer` | Consume via consumer groups, monitor lag |
46
+ | `KafkaAdminHelper` | `Admin` | Manage topics, partitions, groups, ACLs, configs |
47
+ | `KafkaSchemaRegistryHelper` | `ConfluentSchemaRegistry` | Schema-validated serialization (Avro/Protobuf/JSON Schema) |
611
48
 
612
- ### Transaction (Producer Only)
49
+ A few facts hold across all four:
613
50
 
614
- ```typescript
615
- const result = await producer.runInTransaction(async ({ send, addConsumer, addOffset }) => {
616
- // Send messages within transaction
617
- const result = await send({
618
- messages: [{ topic: 'orders', key: 'o1', value: '{"status":"created"}' }],
619
- });
51
+ - **Producer, consumer, and admin share one health and close API.** `isHealthy()`, `isReady()`, `getHealthStatus()`, and `close({ isForce })` mean the same thing on every class. Each page documents the exact return values.
52
+ - **Schema registry opens no broker connection.** It extends `BaseHelper` directly, not the shared connected-helper base. It has no health tracking - it's a configuration wrapper you hand to a producer or consumer via `registry`.
53
+ - **Everything lives under `/kafka`, never the root barrel.** Install the optional peer yourself: `bun add @platformatic/kafka` (`^2.6.1`). An app that never touches Kafka tree-shakes it away entirely.
54
+ - **Compiling to a single binary needs one extra build step.** Skip it, and the compiled app crashes at startup with `ENOENT: native.wasm` or `Cannot find package 'ajv-draft-04'` - see [Compiling to a Single Binary](./compile-binary).
55
+ - **Defaults and enum-like values ship as exported constants**, not magic numbers - `KafkaDefaults`, `KafkaAcks`, `KafkaGroupProtocol`, `KafkaHealthStatuses`. Each page's options table names the constant it uses.
620
56
 
621
- // Optionally add consumer for exactly-once semantics
622
- await addConsumer(consumer.getConsumer());
623
- await addOffset(message);
57
+ ## Find what you need
624
58
 
625
- return result;
626
- });
627
- ```
59
+ | You want to | Go to |
60
+ |---|---|
61
+ | Publish messages, set up SASL/TLS, run transactions | [Producer](./producer) |
62
+ | Consume messages, monitor lag, handle reconnects | [Consumer](./consumer) |
63
+ | Create or delete topics, inspect consumer groups, manage ACLs | [Admin](./admin) |
64
+ | Validate message shape with Avro, Protobuf, or JSON Schema | [Schema Registry](./schema-registry) |
65
+ | See end-to-end examples or fix a connection error | [Examples & Troubleshooting](./examples) |
66
+ | Ship an app that imports a Kafka helper as a single binary | [Compiling to a Single Binary](./compile-binary) |
628
67
 
629
- ## Pages
68
+ Start with [Producer](./producer) or [Consumer](./consumer) if you're wiring up your first topic. Start with [Compiling to a Single Binary](./compile-binary) if an existing app started crashing at startup after a `bun build --compile`.
630
69
 
631
- - **[Producer](./producer)** -- Producer helper, transactions, and full `@platformatic/kafka` Producer API reference
632
- - **[Consumer](./consumer)** -- Consumer helper, message callbacks, lag monitoring, and full Consumer API reference
633
- - **[Admin](./admin)** -- Admin helper and full Admin API reference
634
- - **[Schema Registry](./schema-registry)** -- Schema registry helper for Avro/Protobuf/JSON Schema validation
635
- - **[Examples & Troubleshooting](./examples)** -- Complete examples, IoC integration, and troubleshooting guide
70
+ ## See also
636
71
 
637
- ## See Also
72
+ - [Queue Helpers](../queue/) - BullMQ, MQTT, and the in-memory queue: the other three queueing backends
73
+ - [Redis Helper](../redis/) - connection management used elsewhere in the helpers package
74
+ - [Kafka Helpers Enhancement](/changelogs/2026-03-12-kafka-helpers-enhancement) / [Kafka Helpers Refactor](/changelogs/2026-03-10-kafka-helpers-refactor) - changelog history for this module
75
+ - [@platformatic/kafka](https://github.com/platformatic/kafka) - the underlying Kafka client library
76
+ - [Apache Kafka Documentation](https://kafka.apache.org/documentation/) - official Kafka docs
77
+ - [KIP-848](https://cwiki.apache.org/confluence/display/KAFKA/KIP-848) - the new consumer group protocol
638
78
 
639
- - **Other Helpers:**
640
- - [Queue Helper](../queue/) -- BullMQ, MQTT, and in-memory queues
641
- - [Redis Helper](../redis/) -- Redis connection management
79
+ **Files:**
642
80
 
643
- - **External Resources:**
644
- - [@platformatic/kafka](https://github.com/platformatic/kafka) -- Underlying Kafka client library
645
- - [Apache Kafka Documentation](https://kafka.apache.org/documentation/) -- Official Kafka docs
646
- - [KIP-848](https://cwiki.apache.org/confluence/display/KAFKA/KIP-848) -- New consumer group protocol
81
+ - [`packages/helpers/src/modules/queue/kafka/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/base.ts) - `BaseKafkaHelper`, health tracking, broker events
82
+ - [`packages/helpers/src/modules/queue/kafka/index.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/index.ts) - the `/kafka` sub-path barrel
83
+ - [`packages/helpers/src/modules/queue/kafka/common/constants.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/common/constants.ts) - `KafkaDefaults`, `KafkaAcks`, `KafkaGroupProtocol`, `KafkaHealthStatuses`, `KafkaClientEvents`
84
+ - [`packages/helpers/src/modules/queue/kafka/common/types.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/common/types.ts) - every `IKafka*` / `TKafka*` type