@venizia/ignis-docs 0.0.7-2 → 0.0.8-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mcp-server/common/paths.d.ts +4 -2
- package/dist/mcp-server/common/paths.d.ts.map +1 -1
- package/dist/mcp-server/common/paths.js +8 -6
- package/dist/mcp-server/common/paths.js.map +1 -1
- package/dist/mcp-server/tools/docs/get-document-content.tool.d.ts +1 -1
- package/dist/mcp-server/tools/docs/get-document-content.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/docs/get-document-content.tool.js +7 -7
- package/dist/mcp-server/tools/docs/get-document-metadata.tool.js +3 -3
- package/dist/mcp-server/tools/docs/get-package-overview.tool.d.ts +1 -1
- package/dist/mcp-server/tools/docs/get-package-overview.tool.js +1 -1
- package/package.json +1 -1
- package/wiki/best-practices/api-usage-examples.md +9 -9
- package/wiki/best-practices/architectural-patterns.md +19 -3
- package/wiki/best-practices/architecture-decisions.md +6 -6
- package/wiki/best-practices/code-style-standards/advanced-patterns.md +1 -1
- package/wiki/best-practices/code-style-standards/control-flow.md +1 -1
- package/wiki/best-practices/code-style-standards/function-patterns.md +2 -2
- package/wiki/best-practices/code-style-standards/index.md +2 -2
- package/wiki/best-practices/code-style-standards/naming-conventions.md +1 -1
- package/wiki/best-practices/code-style-standards/route-definitions.md +4 -4
- package/wiki/best-practices/data-modeling.md +1 -1
- package/wiki/best-practices/deployment-strategies.md +1 -1
- package/wiki/best-practices/error-handling.md +2 -2
- package/wiki/best-practices/performance-optimization.md +3 -3
- package/wiki/best-practices/security-guidelines.md +2 -2
- package/wiki/best-practices/troubleshooting-tips.md +1 -1
- package/wiki/{references → extensions}/components/authentication/api.md +12 -20
- package/wiki/{references → extensions}/components/authentication/errors.md +1 -1
- package/wiki/{references → extensions}/components/authentication/index.md +5 -8
- package/wiki/{references → extensions}/components/authentication/usage.md +20 -36
- package/wiki/{references → extensions}/components/authorization/api.md +62 -13
- package/wiki/{references → extensions}/components/authorization/errors.md +12 -7
- package/wiki/{references → extensions}/components/authorization/index.md +93 -6
- package/wiki/{references → extensions}/components/authorization/usage.md +42 -4
- package/wiki/{references → extensions}/components/health-check.md +5 -4
- package/wiki/{references → extensions}/components/index.md +2 -0
- package/wiki/{references → extensions}/components/mail/index.md +1 -1
- package/wiki/{references → extensions}/components/request-tracker.md +1 -1
- package/wiki/{references → extensions}/components/socket-io/api.md +2 -2
- package/wiki/{references → extensions}/components/socket-io/errors.md +2 -0
- package/wiki/{references → extensions}/components/socket-io/index.md +24 -20
- package/wiki/{references → extensions}/components/socket-io/usage.md +2 -2
- package/wiki/{references → extensions}/components/static-asset/api.md +14 -15
- package/wiki/{references → extensions}/components/static-asset/errors.md +3 -1
- package/wiki/{references → extensions}/components/static-asset/index.md +158 -89
- package/wiki/{references → extensions}/components/static-asset/usage.md +8 -5
- package/wiki/{references → extensions}/components/swagger.md +3 -3
- package/wiki/{references → extensions}/components/template/index.md +4 -4
- package/wiki/{references → extensions}/components/template/setup-page.md +1 -1
- package/wiki/{references → extensions}/components/template/single-page.md +1 -1
- package/wiki/{references → extensions}/components/websocket/api.md +7 -6
- package/wiki/{references → extensions}/components/websocket/errors.md +17 -3
- package/wiki/{references → extensions}/components/websocket/index.md +17 -11
- package/wiki/{references → extensions}/components/websocket/usage.md +2 -2
- package/wiki/{references → extensions}/helpers/crypto/index.md +1 -1
- package/wiki/{references → extensions}/helpers/env/index.md +9 -5
- package/wiki/{references → extensions}/helpers/error/index.md +2 -7
- package/wiki/{references → extensions}/helpers/index.md +18 -6
- package/wiki/{references → extensions}/helpers/kafka/admin.md +33 -16
- package/wiki/extensions/helpers/kafka/consumer.md +384 -0
- package/wiki/extensions/helpers/kafka/examples.md +361 -0
- package/wiki/extensions/helpers/kafka/index.md +639 -0
- package/wiki/{references → extensions}/helpers/kafka/producer.md +100 -96
- package/wiki/extensions/helpers/kafka/schema-registry.md +214 -0
- package/wiki/{references → extensions}/helpers/logger/index.md +2 -2
- package/wiki/{references → extensions}/helpers/queue/index.md +400 -4
- package/wiki/{references → extensions}/helpers/storage/api.md +170 -10
- package/wiki/{references → extensions}/helpers/storage/index.md +44 -8
- package/wiki/{references → extensions}/helpers/template/index.md +1 -1
- package/wiki/{references → extensions}/helpers/testing/index.md +4 -4
- package/wiki/{references → extensions}/helpers/types/index.md +63 -16
- package/wiki/{references → extensions}/helpers/websocket/index.md +1 -1
- package/wiki/extensions/index.md +48 -0
- package/wiki/guides/core-concepts/application/bootstrapping.md +55 -37
- package/wiki/guides/core-concepts/application/index.md +95 -35
- package/wiki/guides/core-concepts/components-guide.md +23 -19
- package/wiki/guides/core-concepts/components.md +34 -10
- package/wiki/guides/core-concepts/dependency-injection.md +99 -34
- package/wiki/guides/core-concepts/grpc-controllers.md +295 -0
- package/wiki/guides/core-concepts/persistent/datasources.md +27 -8
- package/wiki/guides/core-concepts/persistent/models.md +43 -1
- package/wiki/guides/core-concepts/persistent/repositories.md +75 -8
- package/wiki/guides/core-concepts/persistent/transactions.md +38 -8
- package/wiki/guides/core-concepts/{controllers.md → rest-controllers.md} +30 -33
- package/wiki/guides/core-concepts/services.md +19 -5
- package/wiki/guides/get-started/5-minute-quickstart.md +6 -7
- package/wiki/guides/get-started/philosophy.md +1 -1
- package/wiki/guides/index.md +2 -2
- package/wiki/guides/reference/glossary.md +7 -7
- package/wiki/guides/reference/mcp-docs-server.md +1 -1
- package/wiki/guides/tutorials/building-a-crud-api.md +2 -2
- package/wiki/guides/tutorials/complete-installation.md +17 -14
- package/wiki/guides/tutorials/ecommerce-api.md +18 -18
- package/wiki/guides/tutorials/realtime-chat.md +8 -8
- package/wiki/guides/tutorials/testing.md +2 -2
- package/wiki/index.md +4 -3
- package/wiki/references/base/application.md +341 -21
- package/wiki/references/base/bootstrapping.md +43 -13
- package/wiki/references/base/components.md +259 -8
- package/wiki/references/base/controllers.md +556 -253
- package/wiki/references/base/datasources.md +159 -79
- package/wiki/references/base/dependency-injection.md +299 -48
- package/wiki/references/base/filter-system/application-usage.md +18 -2
- package/wiki/references/base/filter-system/array-operators.md +14 -6
- package/wiki/references/base/filter-system/comparison-operators.md +9 -3
- package/wiki/references/base/filter-system/default-filter.md +28 -3
- package/wiki/references/base/filter-system/fields-order-pagination.md +17 -13
- package/wiki/references/base/filter-system/index.md +169 -11
- package/wiki/references/base/filter-system/json-filtering.md +51 -18
- package/wiki/references/base/filter-system/list-operators.md +4 -3
- package/wiki/references/base/filter-system/logical-operators.md +7 -2
- package/wiki/references/base/filter-system/null-operators.md +50 -0
- package/wiki/references/base/filter-system/quick-reference.md +82 -243
- package/wiki/references/base/filter-system/range-operators.md +7 -1
- package/wiki/references/base/filter-system/tips.md +34 -7
- package/wiki/references/base/filter-system/use-cases.md +6 -5
- package/wiki/references/base/grpc-controllers.md +984 -0
- package/wiki/references/base/index.md +32 -24
- package/wiki/references/base/middleware.md +347 -0
- package/wiki/references/base/models.md +390 -46
- package/wiki/references/base/providers.md +14 -14
- package/wiki/references/base/repositories/advanced.md +84 -69
- package/wiki/references/base/repositories/index.md +447 -12
- package/wiki/references/base/repositories/mixins.md +103 -98
- package/wiki/references/base/repositories/relations.md +129 -45
- package/wiki/references/base/repositories/soft-deletable.md +104 -23
- package/wiki/references/base/services.md +94 -14
- package/wiki/references/index.md +12 -10
- package/wiki/references/quick-reference.md +98 -65
- package/wiki/references/utilities/crypto.md +21 -4
- package/wiki/references/utilities/date.md +25 -7
- package/wiki/references/utilities/index.md +26 -24
- package/wiki/references/utilities/jsx.md +54 -54
- package/wiki/references/utilities/module.md +8 -6
- package/wiki/references/utilities/parse.md +16 -9
- package/wiki/references/utilities/performance.md +22 -7
- package/wiki/references/utilities/promise.md +19 -16
- package/wiki/references/utilities/request.md +48 -26
- package/wiki/references/utilities/schema.md +69 -6
- package/wiki/references/utilities/statuses.md +131 -140
- package/wiki/references/helpers/kafka/consumer.md +0 -473
- package/wiki/references/helpers/kafka/examples.md +0 -234
- package/wiki/references/helpers/kafka/index.md +0 -482
- /package/wiki/{references → extensions}/components/mail/api.md +0 -0
- /package/wiki/{references → extensions}/components/mail/errors.md +0 -0
- /package/wiki/{references → extensions}/components/mail/usage.md +0 -0
- /package/wiki/{references → extensions}/components/template/api-page.md +0 -0
- /package/wiki/{references → extensions}/components/template/errors-page.md +0 -0
- /package/wiki/{references → extensions}/components/template/usage-page.md +0 -0
- /package/wiki/{references → extensions}/helpers/cron/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/inversion/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/network/api.md +0 -0
- /package/wiki/{references → extensions}/helpers/network/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/redis/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/socket-io/api.md +0 -0
- /package/wiki/{references → extensions}/helpers/socket-io/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/template/single-page.md +0 -0
- /package/wiki/{references → extensions}/helpers/uid/index.md +0 -0
- /package/wiki/{references → extensions}/helpers/websocket/api.md +0 -0
- /package/wiki/{references → extensions}/helpers/worker-thread/index.md +0 -0
- /package/wiki/{references → extensions}/src-details/mcp-server.md +0 -0
|
@@ -1,482 +0,0 @@
|
|
|
1
|
-
# Kafka
|
|
2
|
-
|
|
3
|
-
Apache Kafka event streaming with producer, consumer, and admin 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 three **thin wrapper** classes around `@platformatic/kafka`:
|
|
8
|
-
|
|
9
|
-
| Class | Wraps | Use Case |
|
|
10
|
-
|-------|-------|----------|
|
|
11
|
-
| `KafkaProducerHelper` | `Producer` | Publish messages to Kafka topics |
|
|
12
|
-
| `KafkaConsumerHelper` | `Consumer` | Consume messages with consumer groups |
|
|
13
|
-
| `KafkaAdminHelper` | `Admin` | Manage topics, partitions, groups, ACLs, configs |
|
|
14
|
-
|
|
15
|
-
Each helper provides:
|
|
16
|
-
- **Scoped logging** via `BaseHelper` (Winston with daily rotation)
|
|
17
|
-
- **Sensible defaults** via `KafkaDefaults` constants
|
|
18
|
-
- **Factory pattern** via `newInstance()` static method
|
|
19
|
-
- **Lifecycle management** via `close()` method
|
|
20
|
-
|
|
21
|
-
They do **not** re-implement or passthrough `@platformatic/kafka` methods. Use `getProducer()`, `getConsumer()`, or `getAdmin()` to access the full underlying API directly.
|
|
22
|
-
|
|
23
|
-
### Import Path
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
// Helpers & constants
|
|
27
|
-
import {
|
|
28
|
-
KafkaProducerHelper,
|
|
29
|
-
KafkaConsumerHelper,
|
|
30
|
-
KafkaAdminHelper,
|
|
31
|
-
KafkaDefaults,
|
|
32
|
-
KafkaAcks,
|
|
33
|
-
KafkaGroupProtocol,
|
|
34
|
-
} from '@venizia/ignis-helpers/kafka';
|
|
35
|
-
|
|
36
|
-
// Types
|
|
37
|
-
import type {
|
|
38
|
-
IKafkaConnectionOptions,
|
|
39
|
-
IKafkaProducerOpts,
|
|
40
|
-
IKafkaConsumerOpts,
|
|
41
|
-
IKafkaAdminOpts,
|
|
42
|
-
TKafkaAcks,
|
|
43
|
-
TKafkaGroupProtocol,
|
|
44
|
-
} from '@venizia/ignis-helpers/kafka';
|
|
45
|
-
|
|
46
|
-
// @platformatic/kafka (direct usage)
|
|
47
|
-
import {
|
|
48
|
-
Producer, Consumer, Admin, MessagesStream,
|
|
49
|
-
stringSerializers, stringDeserializers,
|
|
50
|
-
stringSerializer, stringDeserializer,
|
|
51
|
-
jsonSerializer, jsonDeserializer,
|
|
52
|
-
serializersFrom, deserializersFrom,
|
|
53
|
-
} from '@platformatic/kafka';
|
|
54
|
-
|
|
55
|
-
import type {
|
|
56
|
-
Message, MessageToProduce,
|
|
57
|
-
SendOptions, ConsumeOptions,
|
|
58
|
-
Serializers, Deserializers,
|
|
59
|
-
SASLOptions, ConnectionOptions,
|
|
60
|
-
} from '@platformatic/kafka';
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Installation
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
bun add @platformatic/kafka
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## Connection Options
|
|
72
|
-
|
|
73
|
-
All three helpers share a common base interface `IKafkaConnectionOptions` which extends `@platformatic/kafka`'s `ConnectionOptions`.
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
interface IKafkaConnectionOptions extends ConnectionOptions {
|
|
77
|
-
bootstrapBrokers: string[];
|
|
78
|
-
clientId: string;
|
|
79
|
-
retries?: number; // Default: 3
|
|
80
|
-
retryDelay?: number; // Default: 1000ms
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### Full Options Table
|
|
85
|
-
|
|
86
|
-
| Option | Type | Default | Description |
|
|
87
|
-
|--------|------|---------|-------------|
|
|
88
|
-
| `bootstrapBrokers` | `string[]` | — | Kafka broker addresses (`host:port`). **Required** |
|
|
89
|
-
| `clientId` | `string` | — | Unique client identifier. **Required** |
|
|
90
|
-
| `retries` | `number` | `3` | Number of connection retries before failing |
|
|
91
|
-
| `retryDelay` | `number` | `1000` | Delay between retries in milliseconds |
|
|
92
|
-
| `sasl` | `SASLOptions` | — | SASL authentication configuration |
|
|
93
|
-
| `tls` | `TLSConnectionOptions` | — | TLS/SSL connection options |
|
|
94
|
-
| `ssl` | `TLSConnectionOptions` | — | Alias for `tls` |
|
|
95
|
-
| `connectTimeout` | `number` | — | TCP connection timeout in milliseconds |
|
|
96
|
-
| `requestTimeout` | `number` | — | Kafka request timeout in milliseconds |
|
|
97
|
-
|
|
98
|
-
### SASL Authentication
|
|
99
|
-
|
|
100
|
-
`@platformatic/kafka` supports five SASL mechanisms:
|
|
101
|
-
|
|
102
|
-
| Mechanism | Use Case |
|
|
103
|
-
|-----------|----------|
|
|
104
|
-
| `PLAIN` | Simple username/password (use with TLS in production) |
|
|
105
|
-
| `SCRAM-SHA-256` | Challenge-response, password never sent in plaintext |
|
|
106
|
-
| `SCRAM-SHA-512` | Same as SHA-256 with stronger hash |
|
|
107
|
-
| `OAUTHBEARER` | Token-based (Azure Event Hubs, Confluent Cloud) |
|
|
108
|
-
| `GSSAPI` | Kerberos authentication |
|
|
109
|
-
|
|
110
|
-
```typescript
|
|
111
|
-
interface SASLOptions {
|
|
112
|
-
mechanism: 'PLAIN' | 'SCRAM-SHA-256' | 'SCRAM-SHA-512' | 'OAUTHBEARER' | 'GSSAPI';
|
|
113
|
-
username?: string | CredentialProvider;
|
|
114
|
-
password?: string | CredentialProvider;
|
|
115
|
-
token?: string | CredentialProvider;
|
|
116
|
-
oauthBearerExtensions?: Record<string, string> | CredentialProvider<Record<string, string>>;
|
|
117
|
-
authenticate?: SASLCustomAuthenticator;
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
#### SCRAM-SHA-512 Example
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
const helper = KafkaConsumerHelper.newInstance({
|
|
125
|
-
bootstrapBrokers: ['broker1:9092', 'broker2:9092', 'broker3:9092'],
|
|
126
|
-
clientId: 'my-consumer',
|
|
127
|
-
groupId: 'my-group',
|
|
128
|
-
sasl: {
|
|
129
|
-
mechanism: 'SCRAM-SHA-512',
|
|
130
|
-
username: 'kafka-user',
|
|
131
|
-
password: 'kafka-password',
|
|
132
|
-
},
|
|
133
|
-
connectTimeout: 30_000,
|
|
134
|
-
requestTimeout: 30_000,
|
|
135
|
-
});
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
#### OAUTHBEARER Example
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
const helper = KafkaProducerHelper.newInstance({
|
|
142
|
-
bootstrapBrokers: ['pkc-xxxxx.us-west-2.aws.confluent.cloud:9092'],
|
|
143
|
-
clientId: 'my-producer',
|
|
144
|
-
sasl: {
|
|
145
|
-
mechanism: 'OAUTHBEARER',
|
|
146
|
-
token: async () => {
|
|
147
|
-
const response = await fetch('https://auth.example.com/token', { method: 'POST' });
|
|
148
|
-
const { access_token } = await response.json();
|
|
149
|
-
return access_token;
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
tls: true,
|
|
153
|
-
});
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
#### TLS Without SASL
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
const helper = KafkaProducerHelper.newInstance({
|
|
160
|
-
bootstrapBrokers: ['broker:9093'],
|
|
161
|
-
clientId: 'my-producer',
|
|
162
|
-
tls: {
|
|
163
|
-
ca: fs.readFileSync('/path/to/ca.pem'),
|
|
164
|
-
cert: fs.readFileSync('/path/to/client-cert.pem'),
|
|
165
|
-
key: fs.readFileSync('/path/to/client-key.pem'),
|
|
166
|
-
},
|
|
167
|
-
});
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## Serialization & Deserialization
|
|
173
|
-
|
|
174
|
-
`@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.
|
|
175
|
-
|
|
176
|
-
### Built-in Serializers
|
|
177
|
-
|
|
178
|
-
| Export | Type | Description |
|
|
179
|
-
|--------|------|-------------|
|
|
180
|
-
| `stringSerializer` | `Serializer<string>` | `string → Buffer` (UTF-8) |
|
|
181
|
-
| `stringDeserializer` | `Deserializer<string>` | `Buffer → string` (UTF-8) |
|
|
182
|
-
| `jsonSerializer` | `Serializer<T>` | `object → Buffer` (JSON.stringify + UTF-8) |
|
|
183
|
-
| `jsonDeserializer` | `Deserializer<T>` | `Buffer → object` (UTF-8 + JSON.parse) |
|
|
184
|
-
| `stringSerializers` | `Serializers<string, string, string, string>` | All four positions as string |
|
|
185
|
-
| `stringDeserializers` | `Deserializers<string, string, string, string>` | All four positions as string |
|
|
186
|
-
|
|
187
|
-
### Helper Functions
|
|
188
|
-
|
|
189
|
-
| Export | Signature | Description |
|
|
190
|
-
|--------|-----------|-------------|
|
|
191
|
-
| `serializersFrom(s)` | `<T>(s: Serializer<T>) => Serializers<T, T, T, T>` | Create full serializers from a single serializer |
|
|
192
|
-
| `deserializersFrom(d)` | `<T>(d: Deserializer<T>) => Deserializers<T, T, T, T>` | Create full deserializers from a single deserializer |
|
|
193
|
-
|
|
194
|
-
### Serializers/Deserializers Interface
|
|
195
|
-
|
|
196
|
-
```typescript
|
|
197
|
-
interface Serializers<Key, Value, HeaderKey, HeaderValue> {
|
|
198
|
-
key: SerializerWithHeaders<Key, HeaderKey, HeaderValue>;
|
|
199
|
-
value: SerializerWithHeaders<Value, HeaderKey, HeaderValue>;
|
|
200
|
-
headerKey: Serializer<HeaderKey>;
|
|
201
|
-
headerValue: Serializer<HeaderValue>;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
interface Deserializers<Key, Value, HeaderKey, HeaderValue> {
|
|
205
|
-
key: DeserializerWithHeaders<Key, HeaderKey, HeaderValue>;
|
|
206
|
-
value: DeserializerWithHeaders<Value, HeaderKey, HeaderValue>;
|
|
207
|
-
headerKey: Deserializer<HeaderKey>;
|
|
208
|
-
headerValue: Deserializer<HeaderValue>;
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### String Serialization
|
|
213
|
-
|
|
214
|
-
The simplest approach — all keys, values, and headers are strings:
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
import { stringSerializers, stringDeserializers } from '@platformatic/kafka';
|
|
218
|
-
|
|
219
|
-
// Producer
|
|
220
|
-
const producer = KafkaProducerHelper.newInstance({
|
|
221
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
222
|
-
clientId: 'my-producer',
|
|
223
|
-
serializers: stringSerializers,
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// Consumer
|
|
227
|
-
const consumer = KafkaConsumerHelper.newInstance({
|
|
228
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
229
|
-
clientId: 'my-consumer',
|
|
230
|
-
groupId: 'my-group',
|
|
231
|
-
deserializers: stringDeserializers,
|
|
232
|
-
});
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### JSON Serialization
|
|
236
|
-
|
|
237
|
-
For structured data — serialize objects as JSON:
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
import {
|
|
241
|
-
jsonSerializer, jsonDeserializer,
|
|
242
|
-
stringSerializer, stringDeserializer,
|
|
243
|
-
serializersFrom, deserializersFrom,
|
|
244
|
-
} from '@platformatic/kafka';
|
|
245
|
-
|
|
246
|
-
// JSON values with string keys
|
|
247
|
-
const producer = KafkaProducerHelper.newInstance({
|
|
248
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
249
|
-
clientId: 'my-producer',
|
|
250
|
-
serializers: { ...serializersFrom(jsonSerializer), key: stringSerializer },
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
const p = producer.getProducer();
|
|
254
|
-
await p.send({
|
|
255
|
-
messages: [{
|
|
256
|
-
topic: 'orders',
|
|
257
|
-
key: 'order-123', // string key
|
|
258
|
-
value: { id: '123', status: 'created', amount: 99 }, // object value → auto-serialized to JSON
|
|
259
|
-
}],
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
// Consumer with matching deserializers
|
|
263
|
-
const consumer = KafkaConsumerHelper.newInstance({
|
|
264
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
265
|
-
clientId: 'my-consumer',
|
|
266
|
-
groupId: 'my-group',
|
|
267
|
-
deserializers: { ...deserializersFrom(jsonDeserializer), key: stringDeserializer },
|
|
268
|
-
});
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
### Custom Serialization
|
|
272
|
-
|
|
273
|
-
For advanced use cases (Avro, Protobuf, MessagePack):
|
|
274
|
-
|
|
275
|
-
```typescript
|
|
276
|
-
import type { Serializer, Deserializer } from '@platformatic/kafka';
|
|
277
|
-
import * as msgpack from '@msgpack/msgpack';
|
|
278
|
-
|
|
279
|
-
const msgpackSerializer: Serializer<unknown> = (data) => {
|
|
280
|
-
if (data === undefined) return undefined;
|
|
281
|
-
return Buffer.from(msgpack.encode(data));
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
const msgpackDeserializer: Deserializer<unknown> = (data) => {
|
|
285
|
-
if (!data) return undefined;
|
|
286
|
-
return msgpack.decode(data);
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
const producer = KafkaProducerHelper.newInstance<string, unknown, string, string>({
|
|
290
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
291
|
-
clientId: 'msgpack-producer',
|
|
292
|
-
serializers: {
|
|
293
|
-
key: stringSerializer,
|
|
294
|
-
value: msgpackSerializer,
|
|
295
|
-
headerKey: stringSerializer,
|
|
296
|
-
headerValue: stringSerializer,
|
|
297
|
-
},
|
|
298
|
-
});
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
---
|
|
302
|
-
|
|
303
|
-
## Generic Type Parameters
|
|
304
|
-
|
|
305
|
-
All three helpers (and their option interfaces) support generic type parameters controlling the serialization types:
|
|
306
|
-
|
|
307
|
-
```typescript
|
|
308
|
-
class KafkaProducerHelper<
|
|
309
|
-
KeyType = string,
|
|
310
|
-
ValueType = string,
|
|
311
|
-
HeaderKeyType = string,
|
|
312
|
-
HeaderValueType = string,
|
|
313
|
-
>
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
| Parameter | Default | Description |
|
|
317
|
-
|-----------|---------|-------------|
|
|
318
|
-
| `KeyType` | `string` | Message key type after serialization/deserialization |
|
|
319
|
-
| `ValueType` | `string` | Message value type after serialization/deserialization |
|
|
320
|
-
| `HeaderKeyType` | `string` | Header key type |
|
|
321
|
-
| `HeaderValueType` | `string` | Header value type |
|
|
322
|
-
|
|
323
|
-
> [!NOTE]
|
|
324
|
-
> `@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`.
|
|
325
|
-
|
|
326
|
-
```typescript
|
|
327
|
-
// Default: string types (most common)
|
|
328
|
-
const helper = KafkaProducerHelper.newInstance({ ... });
|
|
329
|
-
|
|
330
|
-
// Custom: string keys, JSON object values
|
|
331
|
-
const helper = KafkaProducerHelper.newInstance<string, MyEvent, string, string>({
|
|
332
|
-
serializers: { ...serializersFrom(jsonSerializer), key: stringSerializer },
|
|
333
|
-
...
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
// Custom: Buffer keys, Buffer values (raw wire format)
|
|
337
|
-
const helper = KafkaProducerHelper.newInstance<Buffer, Buffer, Buffer, Buffer>({
|
|
338
|
-
// No serializers needed — @platformatic/kafka defaults to Buffer
|
|
339
|
-
...
|
|
340
|
-
});
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
## Constants
|
|
346
|
-
|
|
347
|
-
### KafkaDefaults
|
|
348
|
-
|
|
349
|
-
Centralized default values used by all three helpers.
|
|
350
|
-
|
|
351
|
-
```typescript
|
|
352
|
-
import { KafkaDefaults } from '@venizia/ignis-helpers/kafka';
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
| Constant | Value | Scope | Used By | Description |
|
|
356
|
-
|----------|-------|-------|---------|-------------|
|
|
357
|
-
| `RETRIES` | `3` | Shared | All helpers | Connection retry count |
|
|
358
|
-
| `RETRY_DELAY` | `1000` | Shared | All helpers | Retry delay in ms |
|
|
359
|
-
| `STRICT` | `true` | Producer | `KafkaProducerHelper` | Fail on unknown topics |
|
|
360
|
-
| `AUTOCREATE_TOPICS` | `false` | Producer | `KafkaProducerHelper` | Auto-create topics on produce |
|
|
361
|
-
| `AUTOCOMMIT` | `false` | Consumer | `KafkaConsumerHelper` | Auto-commit offsets |
|
|
362
|
-
| `SESSION_TIMEOUT` | `30000` | Consumer | `KafkaConsumerHelper` | Session timeout in ms |
|
|
363
|
-
| `HEARTBEAT_INTERVAL` | `3000` | Consumer | `KafkaConsumerHelper` | Heartbeat interval in ms |
|
|
364
|
-
| `HIGH_WATER_MARK` | `1024` | Consumer | `KafkaConsumerHelper` | Stream buffer size (messages) |
|
|
365
|
-
| `MIN_BYTES` | `1` | Consumer | `KafkaConsumerHelper` | Min bytes per fetch |
|
|
366
|
-
| `METADATA_MAX_AGE` | `300000` | Consumer | `KafkaConsumerHelper` | Metadata cache TTL in ms |
|
|
367
|
-
| `GROUP_PROTOCOL` | `'classic'` | Consumer | `KafkaConsumerHelper` | Default group protocol |
|
|
368
|
-
|
|
369
|
-
### KafkaAcks
|
|
370
|
-
|
|
371
|
-
Producer acknowledgment levels.
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
import { KafkaAcks } from '@venizia/ignis-helpers/kafka';
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
| Constant | Value | Description | Trade-off |
|
|
378
|
-
|----------|-------|-------------|-----------|
|
|
379
|
-
| `NONE` | `0` | No acknowledgment — fire-and-forget | Fastest, no durability guarantee |
|
|
380
|
-
| `LEADER` | `1` | Leader broker acknowledges | Fast, leader-durable |
|
|
381
|
-
| `ALL` | `-1` | All in-sync replicas acknowledge | Slowest, fully durable |
|
|
382
|
-
|
|
383
|
-
**Static methods:**
|
|
384
|
-
|
|
385
|
-
| Method | Signature | Description |
|
|
386
|
-
|--------|-----------|-------------|
|
|
387
|
-
| `isValid(ack)` | `(ack: number): boolean` | Check if value is a valid ack level |
|
|
388
|
-
| `SCHEME_SET` | `Set<number>` | Set of valid values: `{0, 1, -1}` |
|
|
389
|
-
|
|
390
|
-
```typescript
|
|
391
|
-
KafkaAcks.ALL; // -1
|
|
392
|
-
KafkaAcks.isValid(-1); // true
|
|
393
|
-
KafkaAcks.isValid(2); // false
|
|
394
|
-
KafkaAcks.SCHEME_SET; // Set { 0, 1, -1 }
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
### KafkaGroupProtocol
|
|
398
|
-
|
|
399
|
-
Consumer group protocol versions.
|
|
400
|
-
|
|
401
|
-
```typescript
|
|
402
|
-
import { KafkaGroupProtocol } from '@venizia/ignis-helpers/kafka';
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
| Constant | Value | Description |
|
|
406
|
-
|----------|-------|-------------|
|
|
407
|
-
| `CLASSIC` | `'classic'` | Classic consumer group protocol (default, all Kafka versions) |
|
|
408
|
-
| `CONSUMER` | `'consumer'` | New consumer group protocol — KIP-848 (Kafka 3.7+) |
|
|
409
|
-
|
|
410
|
-
**Static methods:**
|
|
411
|
-
|
|
412
|
-
| Method | Signature | Description |
|
|
413
|
-
|--------|-----------|-------------|
|
|
414
|
-
| `isValid(mode)` | `(mode: string): boolean` | Check if value is a valid protocol |
|
|
415
|
-
| `SCHEME_SET` | `Set<string>` | Set of valid values: `{'classic', 'consumer'}` |
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
KafkaGroupProtocol.CLASSIC; // 'classic'
|
|
419
|
-
KafkaGroupProtocol.isValid('classic'); // true
|
|
420
|
-
KafkaGroupProtocol.isValid('foo'); // false
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
### Derived Types
|
|
424
|
-
|
|
425
|
-
```typescript
|
|
426
|
-
import type { TKafkaAcks, TKafkaGroupProtocol } from '@venizia/ignis-helpers/kafka';
|
|
427
|
-
|
|
428
|
-
// TKafkaAcks = 0 | 1 | -1
|
|
429
|
-
// TKafkaGroupProtocol = 'classic' | 'consumer'
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
These union types are derived using `TConstValue<T>` from the constant classes.
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
## Compression
|
|
437
|
-
|
|
438
|
-
`@platformatic/kafka` supports five compression algorithms:
|
|
439
|
-
|
|
440
|
-
| Algorithm | Value | Description |
|
|
441
|
-
|-----------|-------|-------------|
|
|
442
|
-
| None | `'none'` | No compression (default) |
|
|
443
|
-
| GZIP | `'gzip'` | Good compression ratio, moderate CPU |
|
|
444
|
-
| Snappy | `'snappy'` | Fast compression, moderate ratio |
|
|
445
|
-
| LZ4 | `'lz4'` | Very fast, good for high-throughput |
|
|
446
|
-
| Zstandard | `'zstd'` | Best ratio, moderate CPU |
|
|
447
|
-
|
|
448
|
-
```typescript
|
|
449
|
-
const helper = KafkaProducerHelper.newInstance({
|
|
450
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
451
|
-
clientId: 'my-producer',
|
|
452
|
-
serializers: stringSerializers,
|
|
453
|
-
compression: 'zstd', // Applied to all messages by default
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
// Override per-send
|
|
457
|
-
const producer = helper.getProducer();
|
|
458
|
-
await producer.send({
|
|
459
|
-
messages: [{ topic: 'logs', key: 'l1', value: largePayload }],
|
|
460
|
-
compression: 'lz4',
|
|
461
|
-
});
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
---
|
|
465
|
-
|
|
466
|
-
## Pages
|
|
467
|
-
|
|
468
|
-
- **[Producer](./producer)** — Producer helper setup, usage, and full `@platformatic/kafka` Producer API reference
|
|
469
|
-
- **[Consumer](./consumer)** — Consumer helper setup, usage, and full `@platformatic/kafka` Consumer API reference
|
|
470
|
-
- **[Admin](./admin)** — Admin helper setup, usage, and full `@platformatic/kafka` Admin API reference
|
|
471
|
-
- **[Examples & Troubleshooting](./examples)** — Complete examples, IoC integration, and troubleshooting guide
|
|
472
|
-
|
|
473
|
-
## See Also
|
|
474
|
-
|
|
475
|
-
- **Other Helpers:**
|
|
476
|
-
- [Queue Helper](../queue/) — BullMQ, MQTT, and in-memory queues
|
|
477
|
-
- [Redis Helper](../redis/) — Redis connection management
|
|
478
|
-
|
|
479
|
-
- **External Resources:**
|
|
480
|
-
- [@platformatic/kafka](https://github.com/platformatic/kafka) — Underlying Kafka client library
|
|
481
|
-
- [Apache Kafka Documentation](https://kafka.apache.org/documentation/) — Official Kafka docs
|
|
482
|
-
- [KIP-848](https://cwiki.apache.org/confluence/display/KAFKA/KIP-848) — New consumer group protocol
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|