@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.
- package/README.md +14 -14
- package/content/best-practices/api-usage-examples.md +39 -19
- package/content/best-practices/architectural-patterns.md +24 -13
- package/content/best-practices/architecture-decisions.md +29 -16
- package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
- package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
- package/content/best-practices/code-style-standards/control-flow.md +33 -1
- package/content/best-practices/code-style-standards/documentation.md +28 -8
- package/content/best-practices/code-style-standards/function-patterns.md +15 -4
- package/content/best-practices/code-style-standards/index.md +7 -2
- package/content/best-practices/code-style-standards/naming-conventions.md +27 -3
- package/content/best-practices/code-style-standards/route-definitions.md +9 -5
- package/content/best-practices/code-style-standards/tooling.md +14 -1
- package/content/best-practices/code-style-standards/type-safety.md +39 -6
- package/content/best-practices/common-pitfalls.md +59 -35
- package/content/best-practices/contribution-workflow.md +8 -4
- package/content/best-practices/data-modeling.md +78 -62
- package/content/best-practices/deployment-strategies.md +56 -19
- package/content/best-practices/error-handling.md +247 -153
- package/content/best-practices/index.md +6 -0
- package/content/best-practices/performance-optimization.md +26 -13
- package/content/best-practices/security-guidelines.md +35 -9
- package/content/best-practices/testing-strategies.md +7 -2
- package/content/best-practices/troubleshooting-tips.md +27 -17
- package/content/extensions/components/api-reference.md +109 -323
- package/content/extensions/components/authentication/api.md +489 -602
- package/content/extensions/components/authentication/errors.md +135 -498
- package/content/extensions/components/authentication/index.md +89 -801
- package/content/extensions/components/authentication/usage.md +231 -955
- package/content/extensions/components/authorization/api.md +991 -644
- package/content/extensions/components/authorization/errors.md +204 -208
- package/content/extensions/components/authorization/getting-started.md +227 -0
- package/content/extensions/components/authorization/index.md +88 -795
- package/content/extensions/components/authorization/usage.md +219 -528
- package/content/extensions/components/health-check.md +77 -243
- package/content/extensions/components/index.md +24 -90
- package/content/extensions/components/mail/api.md +553 -285
- package/content/extensions/components/mail/errors.md +76 -62
- package/content/extensions/components/mail/index.md +111 -463
- package/content/extensions/components/mail/usage.md +139 -173
- package/content/extensions/components/request-tracker.md +70 -173
- package/content/extensions/components/socket-io/api.md +462 -785
- package/content/extensions/components/socket-io/errors.md +49 -51
- package/content/extensions/components/socket-io/index.md +69 -372
- package/content/extensions/components/socket-io/usage.md +212 -105
- package/content/extensions/components/static-asset/api.md +461 -141
- package/content/extensions/components/static-asset/errors.md +121 -53
- package/content/extensions/components/static-asset/index.md +84 -606
- package/content/extensions/components/static-asset/usage.md +184 -299
- package/content/extensions/components/template/index.md +3 -3
- package/content/extensions/components/websocket/api.md +311 -404
- package/content/extensions/components/websocket/errors.md +47 -56
- package/content/extensions/components/websocket/index.md +75 -407
- package/content/extensions/components/websocket/usage.md +120 -338
- package/content/extensions/helpers/cron/index.md +52 -160
- package/content/extensions/helpers/crypto/index.md +67 -480
- package/content/extensions/helpers/crypto/reference.md +528 -0
- package/content/extensions/helpers/env/index.md +64 -178
- package/content/extensions/helpers/error/index.md +286 -196
- package/content/extensions/helpers/index.md +61 -47
- package/content/extensions/helpers/inversion/index.md +76 -550
- package/content/extensions/helpers/inversion/reference.md +530 -0
- package/content/extensions/helpers/kafka/admin.md +23 -3
- package/content/extensions/helpers/kafka/compile-binary.md +83 -52
- package/content/extensions/helpers/kafka/consumer.md +65 -28
- package/content/extensions/helpers/kafka/examples.md +46 -253
- package/content/extensions/helpers/kafka/index.md +55 -617
- package/content/extensions/helpers/kafka/producer.md +156 -22
- package/content/extensions/helpers/kafka/schema-registry.md +59 -79
- package/content/extensions/helpers/logger/hf-logger.md +220 -0
- package/content/extensions/helpers/logger/index.md +78 -552
- package/content/extensions/helpers/logger/pino.md +105 -0
- package/content/extensions/helpers/logger/reference.md +937 -0
- package/content/extensions/helpers/network/api.md +276 -195
- package/content/extensions/helpers/network/index.md +87 -524
- package/content/extensions/helpers/queue/index.md +80 -897
- package/content/extensions/helpers/queue/reference.md +494 -0
- package/content/extensions/helpers/redis/index.md +86 -640
- package/content/extensions/helpers/redis/reference.md +784 -0
- package/content/extensions/helpers/secrets/index.md +136 -0
- package/content/extensions/helpers/socket-io/api.md +325 -204
- package/content/extensions/helpers/socket-io/index.md +79 -429
- package/content/extensions/helpers/storage/api.md +584 -464
- package/content/extensions/helpers/storage/index.md +80 -573
- package/content/extensions/helpers/types/index.md +75 -495
- package/content/extensions/helpers/types/reference.md +689 -0
- package/content/extensions/helpers/uid/index.md +176 -189
- package/content/extensions/helpers/websocket/api.md +366 -214
- package/content/extensions/helpers/websocket/index.md +68 -503
- package/content/extensions/helpers/worker-thread/index.md +62 -396
- package/content/extensions/helpers/worker-thread/reference.md +428 -0
- package/content/extensions/index.md +38 -39
- package/content/extensions/src-details/mcp-server.md +96 -548
- package/content/guides/core-concepts/persistent/datasources.md +2 -2
- package/content/guides/core-concepts/persistent/index.md +5 -1
- package/content/guides/core-concepts/persistent/models.md +1 -1
- package/content/guides/core-concepts/persistent/pglite.md +218 -0
- package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
- package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
- package/content/guides/core-concepts/persistent/search-typesense.md +28 -16
- package/content/guides/core-concepts/persistent/sqlite.md +296 -0
- package/content/guides/core-concepts/persistent/transactions.md +12 -11
- package/content/guides/core-concepts/secrets-vault.md +177 -0
- package/content/guides/core-concepts/services.md +1 -1
- package/content/guides/get-started/5-minute-quickstart.md +59 -206
- package/content/guides/get-started/philosophy.md +135 -670
- package/content/guides/get-started/setup.md +53 -74
- package/content/guides/migrations/redis-helpers-migration.md +5 -4
- package/content/guides/migrations/scoped-rbac-migration.md +5 -5
- package/content/guides/migrations/unified-connectors-migration.md +8 -7
- package/content/guides/tutorials/ecommerce-api.md +3 -8
- package/content/guides/tutorials/realtime-chat.md +1 -1
- package/content/references/base/application.md +64 -22
- package/content/references/base/components.md +3 -3
- package/content/references/base/connectors.md +79 -136
- package/content/references/base/controllers.md +12 -12
- package/content/references/base/datasources-reference.md +600 -0
- package/content/references/base/datasources.md +84 -444
- package/content/references/base/dependency-injection.md +25 -46
- package/content/references/base/filter-system/application-usage.md +95 -123
- package/content/references/base/filter-system/array-operators.md +33 -43
- package/content/references/base/filter-system/comparison-operators.md +55 -63
- package/content/references/base/filter-system/default-filter.md +144 -350
- package/content/references/base/filter-system/fields-order-pagination.md +116 -148
- package/content/references/base/filter-system/index.md +114 -253
- package/content/references/base/filter-system/json-filtering.md +52 -181
- package/content/references/base/filter-system/list-operators.md +28 -44
- package/content/references/base/filter-system/logical-operators.md +69 -114
- package/content/references/base/filter-system/null-operators.md +41 -98
- package/content/references/base/filter-system/pattern-matching.md +48 -51
- package/content/references/base/filter-system/quick-reference.md +93 -196
- package/content/references/base/filter-system/range-operators.md +22 -38
- package/content/references/base/filter-system/tips.md +70 -133
- package/content/references/base/filter-system/use-cases.md +173 -232
- package/content/references/base/grpc-controllers.md +53 -17
- package/content/references/base/index.md +5 -3
- package/content/references/base/middlewares.md +43 -28
- package/content/references/base/models-reference.md +886 -0
- package/content/references/base/models.md +81 -1452
- package/content/references/base/providers.md +8 -8
- package/content/references/base/repositories/advanced.md +281 -419
- package/content/references/base/repositories/index.md +84 -644
- package/content/references/base/repositories/mixins.md +25 -21
- package/content/references/base/repositories/relations.md +194 -375
- package/content/references/base/repositories/soft-deletable.md +67 -55
- package/content/references/base/secrets.md +267 -0
- package/content/references/base/services.md +8 -6
- package/content/references/configuration/environment-variables.md +73 -21
- package/content/references/configuration/index.md +51 -31
- package/content/references/index.md +1 -1
- package/content/references/quick-reference.md +3 -16
- package/content/references/utilities/crypto.md +35 -76
- package/content/references/utilities/date.md +33 -73
- package/content/references/utilities/duration.md +85 -0
- package/content/references/utilities/index.md +6 -2
- package/content/references/utilities/jsx-reference.md +298 -0
- package/content/references/utilities/jsx.md +82 -525
- package/content/references/utilities/module.md +81 -61
- package/content/references/utilities/parse.md +34 -64
- package/content/references/utilities/performance.md +33 -58
- package/content/references/utilities/promise.md +28 -62
- package/content/references/utilities/request.md +58 -218
- package/content/references/utilities/retry.md +139 -0
- package/content/references/utilities/schema.md +43 -137
- package/content/references/utilities/statuses-reference.md +361 -0
- package/content/references/utilities/statuses.md +63 -667
- package/dist/mcp-server/index.js +0 -0
- package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
- package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
- package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
- package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
- package/package.json +24 -23
|
@@ -1,646 +1,84 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Apache Kafka
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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: '
|
|
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
|
-
|
|
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
|
-
|
|
32
|
+
`getProducer()` returns the full `@platformatic/kafka` `Producer`. Every helper follows the same three-step pattern:
|
|
331
33
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
40
|
+
## Which helper do I need
|
|
357
41
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
49
|
+
A few facts hold across all four:
|
|
613
50
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
-
|
|
622
|
-
await addConsumer(consumer.getConsumer());
|
|
623
|
-
await addOffset(message);
|
|
57
|
+
## Find what you need
|
|
624
58
|
|
|
625
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
640
|
-
- [Queue Helper](../queue/) -- BullMQ, MQTT, and in-memory queues
|
|
641
|
-
- [Redis Helper](../redis/) -- Redis connection management
|
|
79
|
+
**Files:**
|
|
642
80
|
|
|
643
|
-
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
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
|