@platformatic/kafka 1.0.0 → 1.2.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/README.md +1 -0
- package/dist/apis/admin/index.d.ts +38 -37
- package/dist/apis/admin/index.js +38 -37
- package/dist/apis/admin/list-groups-v4.d.ts +17 -0
- package/dist/apis/admin/list-groups-v4.js +40 -0
- package/dist/apis/consumer/fetch-v16.js +121 -0
- package/dist/apis/consumer/fetch-v17.d.ts +46 -0
- package/dist/apis/consumer/index.d.ts +11 -9
- package/dist/apis/consumer/index.js +11 -9
- package/dist/apis/consumer/list-offsets-v8.js +68 -0
- package/dist/apis/consumer/list-offsets-v9.d.ts +30 -0
- package/dist/apis/definitions.js +0 -1
- package/dist/apis/metadata/api-versions-v3.js +41 -0
- package/dist/apis/metadata/api-versions-v4.d.ts +17 -0
- package/dist/apis/metadata/find-coordinator-v4.js +50 -0
- package/dist/apis/metadata/find-coordinator-v5.d.ts +19 -0
- package/dist/apis/metadata/find-coordinator-v5.js +50 -0
- package/dist/apis/metadata/find-coordinator-v6.d.ts +19 -0
- package/dist/apis/metadata/index.d.ts +6 -3
- package/dist/apis/metadata/index.js +6 -3
- package/dist/apis/producer/index.d.ts +8 -6
- package/dist/apis/producer/index.js +8 -6
- package/dist/apis/producer/init-producer-id-v4.js +38 -0
- package/dist/apis/producer/init-producer-id-v5.d.ts +21 -0
- package/dist/apis/producer/produce-v10.js +104 -0
- package/dist/apis/producer/produce-v11.d.ts +29 -0
- package/dist/apis/security/index.d.ts +2 -2
- package/dist/apis/security/index.js +2 -2
- package/dist/apis/telemetry/index.d.ts +3 -3
- package/dist/apis/telemetry/index.js +3 -3
- package/dist/clients/admin/admin.js +58 -22
- package/dist/clients/base/base.d.ts +19 -3
- package/dist/clients/base/base.js +93 -13
- package/dist/clients/base/options.d.ts +2 -0
- package/dist/clients/base/options.js +5 -0
- package/dist/clients/callbacks.d.ts +1 -0
- package/dist/clients/callbacks.js +3 -2
- package/dist/clients/consumer/consumer.d.ts +1 -1
- package/dist/clients/consumer/consumer.js +166 -105
- package/dist/clients/consumer/messages-stream.d.ts +1 -0
- package/dist/clients/consumer/messages-stream.js +81 -47
- package/dist/clients/consumer/options.d.ts +3 -0
- package/dist/clients/consumer/options.js +1 -0
- package/dist/clients/consumer/types.d.ts +8 -3
- package/dist/clients/producer/producer.js +49 -28
- package/dist/diagnostic.d.ts +47 -0
- package/dist/diagnostic.js +38 -0
- package/dist/errors.d.ts +5 -1
- package/dist/errors.js +12 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/network/connection-pool.d.ts +2 -1
- package/dist/network/connection-pool.js +36 -25
- package/dist/network/connection.d.ts +2 -2
- package/dist/network/connection.js +135 -81
- package/dist/protocol/compression.js +8 -8
- package/dist/protocol/reader.js +0 -1
- package/dist/protocol/records.js +0 -3
- package/dist/protocol/sasl/plain.d.ts +1 -1
- package/dist/protocol/sasl/scram-sha.d.ts +11 -4
- package/dist/protocol/sasl/scram-sha.js +8 -2
- package/dist/symbols.d.ts +1 -0
- package/dist/symbols.js +2 -0
- package/package.json +3 -3
- /package/dist/apis/admin/{alter-client-quotas.d.ts → alter-client-quotas-v1.d.ts} +0 -0
- /package/dist/apis/admin/{alter-client-quotas.js → alter-client-quotas-v1.js} +0 -0
- /package/dist/apis/admin/{alter-configs.d.ts → alter-configs-v2.d.ts} +0 -0
- /package/dist/apis/admin/{alter-configs.js → alter-configs-v2.js} +0 -0
- /package/dist/apis/admin/{alter-partition-reassignments.d.ts → alter-partition-reassignments-v0.d.ts} +0 -0
- /package/dist/apis/admin/{alter-partition-reassignments.js → alter-partition-reassignments-v0.js} +0 -0
- /package/dist/apis/admin/{alter-partition.d.ts → alter-partition-v3.d.ts} +0 -0
- /package/dist/apis/admin/{alter-partition.js → alter-partition-v3.js} +0 -0
- /package/dist/apis/admin/{alter-replica-log-dirs.d.ts → alter-replica-log-dirs-v2.d.ts} +0 -0
- /package/dist/apis/admin/{alter-replica-log-dirs.js → alter-replica-log-dirs-v2.js} +0 -0
- /package/dist/apis/admin/{alter-user-scram-credentials.d.ts → alter-user-scram-credentials-v0.d.ts} +0 -0
- /package/dist/apis/admin/{alter-user-scram-credentials.js → alter-user-scram-credentials-v0.js} +0 -0
- /package/dist/apis/admin/{consumer-group-describe.d.ts → consumer-group-describe-v0.d.ts} +0 -0
- /package/dist/apis/admin/{consumer-group-describe.js → consumer-group-describe-v0.js} +0 -0
- /package/dist/apis/admin/{create-acls.d.ts → create-acls-v3.d.ts} +0 -0
- /package/dist/apis/admin/{create-acls.js → create-acls-v3.js} +0 -0
- /package/dist/apis/admin/{create-delegation-token.d.ts → create-delegation-token-v3.d.ts} +0 -0
- /package/dist/apis/admin/{create-delegation-token.js → create-delegation-token-v3.js} +0 -0
- /package/dist/apis/admin/{create-partitions.d.ts → create-partitions-v3.d.ts} +0 -0
- /package/dist/apis/admin/{create-partitions.js → create-partitions-v3.js} +0 -0
- /package/dist/apis/admin/{create-topics.d.ts → create-topics-v7.d.ts} +0 -0
- /package/dist/apis/admin/{create-topics.js → create-topics-v7.js} +0 -0
- /package/dist/apis/admin/{delete-acls.d.ts → delete-acls-v3.d.ts} +0 -0
- /package/dist/apis/admin/{delete-acls.js → delete-acls-v3.js} +0 -0
- /package/dist/apis/admin/{delete-groups.d.ts → delete-groups-v2.d.ts} +0 -0
- /package/dist/apis/admin/{delete-groups.js → delete-groups-v2.js} +0 -0
- /package/dist/apis/admin/{delete-records.d.ts → delete-records-v2.d.ts} +0 -0
- /package/dist/apis/admin/{delete-records.js → delete-records-v2.js} +0 -0
- /package/dist/apis/admin/{delete-topics.d.ts → delete-topics-v6.d.ts} +0 -0
- /package/dist/apis/admin/{delete-topics.js → delete-topics-v6.js} +0 -0
- /package/dist/apis/admin/{describe-acls.d.ts → describe-acls-v3.d.ts} +0 -0
- /package/dist/apis/admin/{describe-acls.js → describe-acls-v3.js} +0 -0
- /package/dist/apis/admin/{describe-client-quotas.d.ts → describe-client-quotas-v0.d.ts} +0 -0
- /package/dist/apis/admin/{describe-client-quotas.js → describe-client-quotas-v0.js} +0 -0
- /package/dist/apis/admin/{describe-cluster.d.ts → describe-cluster-v1.d.ts} +0 -0
- /package/dist/apis/admin/{describe-cluster.js → describe-cluster-v1.js} +0 -0
- /package/dist/apis/admin/{describe-configs.d.ts → describe-configs-v4.d.ts} +0 -0
- /package/dist/apis/admin/{describe-configs.js → describe-configs-v4.js} +0 -0
- /package/dist/apis/admin/{describe-delegation-token.d.ts → describe-delegation-token-v3.d.ts} +0 -0
- /package/dist/apis/admin/{describe-delegation-token.js → describe-delegation-token-v3.js} +0 -0
- /package/dist/apis/admin/{describe-groups.d.ts → describe-groups-v5.d.ts} +0 -0
- /package/dist/apis/admin/{describe-groups.js → describe-groups-v5.js} +0 -0
- /package/dist/apis/admin/{describe-log-dirs.d.ts → describe-log-dirs-v4.d.ts} +0 -0
- /package/dist/apis/admin/{describe-log-dirs.js → describe-log-dirs-v4.js} +0 -0
- /package/dist/apis/admin/{describe-producers.d.ts → describe-producers-v0.d.ts} +0 -0
- /package/dist/apis/admin/{describe-producers.js → describe-producers-v0.js} +0 -0
- /package/dist/apis/admin/{describe-quorum.d.ts → describe-quorum-v2.d.ts} +0 -0
- /package/dist/apis/admin/{describe-quorum.js → describe-quorum-v2.js} +0 -0
- /package/dist/apis/admin/{describe-topic-partitions.d.ts → describe-topic-partitions-v0.d.ts} +0 -0
- /package/dist/apis/admin/{describe-topic-partitions.js → describe-topic-partitions-v0.js} +0 -0
- /package/dist/apis/admin/{describe-transactions.d.ts → describe-transactions-v0.d.ts} +0 -0
- /package/dist/apis/admin/{describe-transactions.js → describe-transactions-v0.js} +0 -0
- /package/dist/apis/admin/{describe-user-scram-credentials.d.ts → describe-user-scram-credentials-v0.d.ts} +0 -0
- /package/dist/apis/admin/{describe-user-scram-credentials.js → describe-user-scram-credentials-v0.js} +0 -0
- /package/dist/apis/admin/{envelope.d.ts → envelope-v0.d.ts} +0 -0
- /package/dist/apis/admin/{envelope.js → envelope-v0.js} +0 -0
- /package/dist/apis/admin/{expire-delegation-token.d.ts → expire-delegation-token-v2.d.ts} +0 -0
- /package/dist/apis/admin/{expire-delegation-token.js → expire-delegation-token-v2.js} +0 -0
- /package/dist/apis/admin/{incremental-alter-configs.d.ts → incremental-alter-configs-v1.d.ts} +0 -0
- /package/dist/apis/admin/{incremental-alter-configs.js → incremental-alter-configs-v1.js} +0 -0
- /package/dist/apis/admin/{list-groups.d.ts → list-groups-v5.d.ts} +0 -0
- /package/dist/apis/admin/{list-groups.js → list-groups-v5.js} +0 -0
- /package/dist/apis/admin/{list-partition-reassignments.d.ts → list-partition-reassignments-v0.d.ts} +0 -0
- /package/dist/apis/admin/{list-partition-reassignments.js → list-partition-reassignments-v0.js} +0 -0
- /package/dist/apis/admin/{list-transactions.d.ts → list-transactions-v1.d.ts} +0 -0
- /package/dist/apis/admin/{list-transactions.js → list-transactions-v1.js} +0 -0
- /package/dist/apis/admin/{offset-delete.d.ts → offset-delete-v0.d.ts} +0 -0
- /package/dist/apis/admin/{offset-delete.js → offset-delete-v0.js} +0 -0
- /package/dist/apis/admin/{renew-delegation-token.d.ts → renew-delegation-token-v2.d.ts} +0 -0
- /package/dist/apis/admin/{renew-delegation-token.js → renew-delegation-token-v2.js} +0 -0
- /package/dist/apis/admin/{unregister-broker.d.ts → unregister-broker-v0.d.ts} +0 -0
- /package/dist/apis/admin/{unregister-broker.js → unregister-broker-v0.js} +0 -0
- /package/dist/apis/admin/{update-features.d.ts → update-features-v1.d.ts} +0 -0
- /package/dist/apis/admin/{update-features.js → update-features-v1.js} +0 -0
- /package/dist/apis/consumer/{consumer-group-heartbeat.d.ts → consumer-group-heartbeat-v0.d.ts} +0 -0
- /package/dist/apis/consumer/{consumer-group-heartbeat.js → consumer-group-heartbeat-v0.js} +0 -0
- /package/dist/apis/consumer/{fetch.d.ts → fetch-v16.d.ts} +0 -0
- /package/dist/apis/consumer/{fetch.js → fetch-v17.js} +0 -0
- /package/dist/apis/consumer/{heartbeat.d.ts → heartbeat-v4.d.ts} +0 -0
- /package/dist/apis/consumer/{heartbeat.js → heartbeat-v4.js} +0 -0
- /package/dist/apis/consumer/{join-group.d.ts → join-group-v9.d.ts} +0 -0
- /package/dist/apis/consumer/{join-group.js → join-group-v9.js} +0 -0
- /package/dist/apis/consumer/{leave-group.d.ts → leave-group-v5.d.ts} +0 -0
- /package/dist/apis/consumer/{leave-group.js → leave-group-v5.js} +0 -0
- /package/dist/apis/consumer/{list-offsets.d.ts → list-offsets-v8.d.ts} +0 -0
- /package/dist/apis/consumer/{list-offsets.js → list-offsets-v9.js} +0 -0
- /package/dist/apis/consumer/{offset-commit.d.ts → offset-commit-v9.d.ts} +0 -0
- /package/dist/apis/consumer/{offset-commit.js → offset-commit-v9.js} +0 -0
- /package/dist/apis/consumer/{offset-fetch.d.ts → offset-fetch-v9.d.ts} +0 -0
- /package/dist/apis/consumer/{offset-fetch.js → offset-fetch-v9.js} +0 -0
- /package/dist/apis/consumer/{sync-group.d.ts → sync-group-v5.d.ts} +0 -0
- /package/dist/apis/consumer/{sync-group.js → sync-group-v5.js} +0 -0
- /package/dist/apis/metadata/{api-versions.d.ts → api-versions-v3.d.ts} +0 -0
- /package/dist/apis/metadata/{api-versions.js → api-versions-v4.js} +0 -0
- /package/dist/apis/metadata/{find-coordinator.d.ts → find-coordinator-v4.d.ts} +0 -0
- /package/dist/apis/metadata/{find-coordinator.js → find-coordinator-v6.js} +0 -0
- /package/dist/apis/metadata/{metadata.d.ts → metadata-v12.d.ts} +0 -0
- /package/dist/apis/metadata/{metadata.js → metadata-v12.js} +0 -0
- /package/dist/apis/producer/{add-offsets-to-txn.d.ts → add-offsets-to-txn-v4.d.ts} +0 -0
- /package/dist/apis/producer/{add-offsets-to-txn.js → add-offsets-to-txn-v4.js} +0 -0
- /package/dist/apis/producer/{add-partitions-to-txn.d.ts → add-partitions-to-txn-v5.d.ts} +0 -0
- /package/dist/apis/producer/{add-partitions-to-txn.js → add-partitions-to-txn-v5.js} +0 -0
- /package/dist/apis/producer/{end-txn.d.ts → end-txn-v4.d.ts} +0 -0
- /package/dist/apis/producer/{end-txn.js → end-txn-v4.js} +0 -0
- /package/dist/apis/producer/{init-producer-id.d.ts → init-producer-id-v4.d.ts} +0 -0
- /package/dist/apis/producer/{init-producer-id.js → init-producer-id-v5.js} +0 -0
- /package/dist/apis/producer/{produce.d.ts → produce-v10.d.ts} +0 -0
- /package/dist/apis/producer/{produce.js → produce-v11.js} +0 -0
- /package/dist/apis/producer/{txn-offset-commit.d.ts → txn-offset-commit-v4.d.ts} +0 -0
- /package/dist/apis/producer/{txn-offset-commit.js → txn-offset-commit-v4.js} +0 -0
- /package/dist/apis/security/{sasl-authenticate.d.ts → sasl-authenticate-v2.d.ts} +0 -0
- /package/dist/apis/security/{sasl-authenticate.js → sasl-authenticate-v2.js} +0 -0
- /package/dist/apis/security/{sasl-handshake.d.ts → sasl-handshake-v1.d.ts} +0 -0
- /package/dist/apis/security/{sasl-handshake.js → sasl-handshake-v1.js} +0 -0
- /package/dist/apis/telemetry/{get-telemetry-subscriptions.d.ts → get-telemetry-subscriptions-v0.d.ts} +0 -0
- /package/dist/apis/telemetry/{get-telemetry-subscriptions.js → get-telemetry-subscriptions-v0.js} +0 -0
- /package/dist/apis/telemetry/{list-client-metrics-resources.d.ts → list-client-metrics-resources-v0.d.ts} +0 -0
- /package/dist/apis/telemetry/{list-client-metrics-resources.js → list-client-metrics-resources-v0.js} +0 -0
- /package/dist/apis/telemetry/{push-telemetry.d.ts → push-telemetry-v0.d.ts} +0 -0
- /package/dist/apis/telemetry/{push-telemetry.js → push-telemetry-v0.js} +0 -0
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import { type ValidateFunction } from 'ajv';
|
|
2
2
|
import { EventEmitter } from 'node:events';
|
|
3
|
-
import { type Callback } from '../../apis/definitions.ts';
|
|
3
|
+
import { type API, type Callback } from '../../apis/definitions.ts';
|
|
4
|
+
import { type ApiVersionsResponseApi } from '../../apis/metadata/api-versions-v3.ts';
|
|
5
|
+
import { type ClientType } from '../../diagnostic.ts';
|
|
4
6
|
import { ConnectionPool } from '../../network/connection-pool.ts';
|
|
5
7
|
import { type Broker } from '../../network/connection.ts';
|
|
8
|
+
import { kInstance } from '../../symbols.ts';
|
|
6
9
|
import { type CallbackWithPromise } from '../callbacks.ts';
|
|
7
10
|
import { type Metrics } from '../metrics.ts';
|
|
8
11
|
import { type BaseOptions, type ClusterMetadata, type MetadataOptions } from './types.ts';
|
|
9
12
|
export declare const kClientId: unique symbol;
|
|
10
13
|
export declare const kBootstrapBrokers: unique symbol;
|
|
14
|
+
export declare const kApis: unique symbol;
|
|
15
|
+
export declare const kGetApi: unique symbol;
|
|
11
16
|
export declare const kOptions: unique symbol;
|
|
12
17
|
export declare const kConnections: unique symbol;
|
|
13
18
|
export declare const kFetchConnections: unique symbol;
|
|
14
19
|
export declare const kCreateConnectionPool: unique symbol;
|
|
15
20
|
export declare const kClosed: unique symbol;
|
|
21
|
+
export declare const kListApis: unique symbol;
|
|
16
22
|
export declare const kMetadata: unique symbol;
|
|
17
23
|
export declare const kCheckNotClosed: unique symbol;
|
|
18
24
|
export declare const kClearMetadata: unique symbol;
|
|
@@ -22,33 +28,43 @@ export declare const kPerformDeduplicated: unique symbol;
|
|
|
22
28
|
export declare const kValidateOptions: unique symbol;
|
|
23
29
|
export declare const kInspect: unique symbol;
|
|
24
30
|
export declare const kFormatValidationErrors: unique symbol;
|
|
25
|
-
export declare const kInstance: unique symbol;
|
|
26
31
|
export declare const kPrometheus: unique symbol;
|
|
27
|
-
export declare
|
|
32
|
+
export declare const kClientType: unique symbol;
|
|
33
|
+
export declare const kAfterCreate: unique symbol;
|
|
34
|
+
export declare class Base<OptionsType extends BaseOptions = BaseOptions> extends EventEmitter {
|
|
28
35
|
#private;
|
|
29
36
|
[kInstance]: number;
|
|
30
37
|
[kClientId]: string;
|
|
38
|
+
[kClientType]: ClientType;
|
|
31
39
|
[kBootstrapBrokers]: Broker[];
|
|
40
|
+
[kApis]: ApiVersionsResponseApi[];
|
|
32
41
|
[kOptions]: OptionsType;
|
|
33
42
|
[kConnections]: ConnectionPool;
|
|
34
43
|
[kClosed]: boolean;
|
|
35
44
|
[kPrometheus]: Metrics | undefined;
|
|
36
45
|
constructor(options: OptionsType);
|
|
46
|
+
get instanceId(): number;
|
|
37
47
|
get clientId(): string;
|
|
38
48
|
get closed(): boolean;
|
|
49
|
+
get type(): ClientType;
|
|
39
50
|
emitWithDebug(section: string | null, name: string, ...args: any[]): boolean;
|
|
40
51
|
close(callback: CallbackWithPromise<void>): void;
|
|
41
52
|
close(): Promise<void>;
|
|
53
|
+
listApis(callback: CallbackWithPromise<ApiVersionsResponseApi[]>): void;
|
|
54
|
+
listApis(): Promise<ApiVersionsResponseApi[]>;
|
|
42
55
|
metadata(options: MetadataOptions, callback: CallbackWithPromise<ClusterMetadata>): void;
|
|
43
56
|
metadata(options: MetadataOptions): Promise<ClusterMetadata>;
|
|
44
57
|
[kCreateConnectionPool](): ConnectionPool;
|
|
58
|
+
[kListApis](callback: CallbackWithPromise<ApiVersionsResponseApi[]>): void;
|
|
45
59
|
[kMetadata](options: MetadataOptions, callback: CallbackWithPromise<ClusterMetadata>): void;
|
|
46
60
|
[kCheckNotClosed](callback: CallbackWithPromise<any>): boolean;
|
|
47
61
|
[kClearMetadata](): void;
|
|
48
62
|
[kParseBroker](broker: Broker | string): Broker;
|
|
49
63
|
[kPerformWithRetry]<ReturnType>(operationId: string, operation: (callback: Callback<ReturnType>) => void, callback: CallbackWithPromise<ReturnType>, attempt?: number, errors?: Error[], shouldSkipRetry?: (e: Error) => boolean): void | Promise<ReturnType>;
|
|
50
64
|
[kPerformDeduplicated]<ReturnType>(operationId: string, operation: (callback: CallbackWithPromise<ReturnType>) => void, callback: CallbackWithPromise<ReturnType>): void | Promise<ReturnType>;
|
|
65
|
+
[kGetApi]<RequestArguments extends Array<unknown>, ResponseType>(name: string, callback: Callback<API<RequestArguments, ResponseType>>): void;
|
|
51
66
|
[kValidateOptions](target: unknown, validator: ValidateFunction<unknown>, targetName: string, throwOnErrors?: boolean): Error | null;
|
|
52
67
|
[kInspect](...args: unknown[]): void;
|
|
53
68
|
[kFormatValidationErrors](validator: ValidateFunction<unknown>, targetName: string): string;
|
|
69
|
+
[kAfterCreate](type: ClientType): void;
|
|
54
70
|
}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
2
|
+
import * as apis from "../../apis/index.js";
|
|
3
|
+
import { api as apiVersionsV3 } from "../../apis/metadata/api-versions-v3.js";
|
|
4
|
+
import { baseApisChannel, baseMetadataChannel, createDiagnosticContext, notifyCreation } from "../../diagnostic.js";
|
|
5
|
+
import { MultipleErrors, NetworkError, UnsupportedApiError, UserError } from "../../errors.js";
|
|
4
6
|
import { ConnectionPool } from "../../network/connection-pool.js";
|
|
7
|
+
import { kInstance } from "../../symbols.js";
|
|
5
8
|
import { ajv, debugDump, loggers } from "../../utils.js";
|
|
6
9
|
import { createPromisifiedCallback, kCallbackPromise } from "../callbacks.js";
|
|
7
|
-
import { baseOptionsValidator, defaultBaseOptions, defaultPort, metadataOptionsValidator } from "./options.js";
|
|
10
|
+
import { baseOptionsValidator, clientSoftwareName, clientSoftwareVersion, defaultBaseOptions, defaultPort, metadataOptionsValidator } from "./options.js";
|
|
8
11
|
export const kClientId = Symbol('plt.kafka.base.clientId');
|
|
9
12
|
export const kBootstrapBrokers = Symbol('plt.kafka.base.bootstrapBrokers');
|
|
13
|
+
export const kApis = Symbol('plt.kafka.base.apis');
|
|
14
|
+
export const kGetApi = Symbol('plt.kafka.base.getApi');
|
|
10
15
|
export const kOptions = Symbol('plt.kafka.base.options');
|
|
11
16
|
export const kConnections = Symbol('plt.kafka.base.connections');
|
|
12
17
|
export const kFetchConnections = Symbol('plt.kafka.base.fetchCnnections');
|
|
13
18
|
export const kCreateConnectionPool = Symbol('plt.kafka.base.createConnectionPool');
|
|
14
19
|
export const kClosed = Symbol('plt.kafka.base.closed');
|
|
20
|
+
export const kListApis = Symbol('plt.kafka.base.listApis');
|
|
15
21
|
export const kMetadata = Symbol('plt.kafka.base.metadata');
|
|
16
22
|
export const kCheckNotClosed = Symbol('plt.kafka.base.checkNotClosed');
|
|
17
23
|
export const kClearMetadata = Symbol('plt.kafka.base.clearMetadata');
|
|
@@ -21,15 +27,18 @@ export const kPerformDeduplicated = Symbol('plt.kafka.base.performDeduplicated')
|
|
|
21
27
|
export const kValidateOptions = Symbol('plt.kafka.base.validateOptions');
|
|
22
28
|
export const kInspect = Symbol('plt.kafka.base.inspect');
|
|
23
29
|
export const kFormatValidationErrors = Symbol('plt.kafka.base.formatValidationErrors');
|
|
24
|
-
export const kInstance = Symbol('plt.kafka.base.instance');
|
|
25
30
|
export const kPrometheus = Symbol('plt.kafka.base.prometheus');
|
|
31
|
+
export const kClientType = Symbol('plt.kafka.base.clientType');
|
|
32
|
+
export const kAfterCreate = Symbol('plt.kafka.base.afterCreate');
|
|
26
33
|
let currentInstance = 0;
|
|
27
34
|
export class Base extends EventEmitter {
|
|
28
|
-
// This is
|
|
35
|
+
// This is declared using a symbol (a.k.a protected/friend) to make it available in ConnectionPool and MessagesStream
|
|
29
36
|
[kInstance];
|
|
30
37
|
// General status - Use symbols rather than JS private property to make them "protected" as in C++
|
|
31
38
|
[kClientId];
|
|
39
|
+
[kClientType];
|
|
32
40
|
[kBootstrapBrokers];
|
|
41
|
+
[kApis];
|
|
33
42
|
[kOptions];
|
|
34
43
|
[kConnections];
|
|
35
44
|
[kClosed];
|
|
@@ -38,7 +47,9 @@ export class Base extends EventEmitter {
|
|
|
38
47
|
#inflightDeduplications;
|
|
39
48
|
constructor(options) {
|
|
40
49
|
super();
|
|
50
|
+
this[kClientType] = 'base';
|
|
41
51
|
this[kInstance] = currentInstance++;
|
|
52
|
+
this[kApis] = [];
|
|
42
53
|
// Validate options
|
|
43
54
|
this[kOptions] = Object.assign({}, defaultBaseOptions, options);
|
|
44
55
|
this[kValidateOptions](this[kOptions], baseOptionsValidator, '/options');
|
|
@@ -57,19 +68,22 @@ export class Base extends EventEmitter {
|
|
|
57
68
|
this[kPrometheus] = options.metrics;
|
|
58
69
|
}
|
|
59
70
|
}
|
|
60
|
-
|
|
71
|
+
get instanceId() {
|
|
72
|
+
return this[kInstance];
|
|
73
|
+
}
|
|
61
74
|
get clientId() {
|
|
62
75
|
return this[kClientId];
|
|
63
76
|
}
|
|
64
|
-
/* c8 ignore next 3 */
|
|
65
77
|
get closed() {
|
|
66
78
|
return this[kClosed] === true;
|
|
67
79
|
}
|
|
80
|
+
get type() {
|
|
81
|
+
return this[kClientType];
|
|
82
|
+
}
|
|
68
83
|
emitWithDebug(section, name, ...args) {
|
|
69
84
|
if (!section) {
|
|
70
85
|
return this.emit(name, ...args);
|
|
71
86
|
}
|
|
72
|
-
/* c8 ignore next */
|
|
73
87
|
loggers[section]?.({ event: name, payload: args });
|
|
74
88
|
return this.emit(`${section}:${name}`, ...args);
|
|
75
89
|
}
|
|
@@ -81,6 +95,13 @@ export class Base extends EventEmitter {
|
|
|
81
95
|
this[kConnections].close(callback);
|
|
82
96
|
return callback[kCallbackPromise];
|
|
83
97
|
}
|
|
98
|
+
listApis(callback) {
|
|
99
|
+
if (!callback) {
|
|
100
|
+
callback = createPromisifiedCallback();
|
|
101
|
+
}
|
|
102
|
+
baseApisChannel.traceCallback(this[kListApis], 0, createDiagnosticContext({ client: this, operation: 'listApis' }), this, callback);
|
|
103
|
+
return callback[kCallbackPromise];
|
|
104
|
+
}
|
|
84
105
|
metadata(options, callback) {
|
|
85
106
|
if (!callback) {
|
|
86
107
|
callback = createPromisifiedCallback();
|
|
@@ -90,7 +111,7 @@ export class Base extends EventEmitter {
|
|
|
90
111
|
callback(validationError, undefined);
|
|
91
112
|
return callback[kCallbackPromise];
|
|
92
113
|
}
|
|
93
|
-
this[kMetadata](options, callback);
|
|
114
|
+
baseMetadataChannel.traceCallback(this[kMetadata], 1, createDiagnosticContext({ client: this, operation: 'metadata' }), this, options, callback);
|
|
94
115
|
return callback[kCallbackPromise];
|
|
95
116
|
}
|
|
96
117
|
[kCreateConnectionPool]() {
|
|
@@ -103,6 +124,26 @@ export class Base extends EventEmitter {
|
|
|
103
124
|
}
|
|
104
125
|
return pool;
|
|
105
126
|
}
|
|
127
|
+
[kListApis](callback) {
|
|
128
|
+
this[kPerformDeduplicated]('listApis', deduplicateCallback => {
|
|
129
|
+
this[kPerformWithRetry]('listApis', retryCallback => {
|
|
130
|
+
this[kConnections].getFirstAvailable(this[kBootstrapBrokers], (error, connection) => {
|
|
131
|
+
if (error) {
|
|
132
|
+
retryCallback(error, undefined);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// We use V3 to be able to get APIS from Kafka 2.4.0+
|
|
136
|
+
apiVersionsV3(connection, clientSoftwareName, clientSoftwareVersion, retryCallback);
|
|
137
|
+
});
|
|
138
|
+
}, (error, metadata) => {
|
|
139
|
+
if (error) {
|
|
140
|
+
deduplicateCallback(error, undefined);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
deduplicateCallback(null, metadata.apiKeys);
|
|
144
|
+
}, 0);
|
|
145
|
+
}, callback);
|
|
146
|
+
}
|
|
106
147
|
[kMetadata](options, callback) {
|
|
107
148
|
const metadataMaxAge = options.metadataMaxAge ?? this[kOptions].metadataMaxAge;
|
|
108
149
|
const isStale = options.forceUpdate ||
|
|
@@ -121,7 +162,13 @@ export class Base extends EventEmitter {
|
|
|
121
162
|
retryCallback(error, undefined);
|
|
122
163
|
return;
|
|
123
164
|
}
|
|
124
|
-
|
|
165
|
+
this[kGetApi]('Metadata', (error, api) => {
|
|
166
|
+
if (error) {
|
|
167
|
+
retryCallback(error, undefined);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
api(connection, options.topics, autocreateTopics, true, retryCallback);
|
|
171
|
+
});
|
|
125
172
|
});
|
|
126
173
|
}, (error, metadata) => {
|
|
127
174
|
if (error) {
|
|
@@ -135,7 +182,7 @@ export class Base extends EventEmitter {
|
|
|
135
182
|
brokers.set(broker.nodeId, { host, port });
|
|
136
183
|
}
|
|
137
184
|
for (const { name, topicId: id, partitions: rawPartitions, isInternal } of metadata.topics) {
|
|
138
|
-
/* c8 ignore next 3 */
|
|
185
|
+
/* c8 ignore next 3 - Sometimes internal topics might be returned by Kafka */
|
|
139
186
|
if (isInternal) {
|
|
140
187
|
continue;
|
|
141
188
|
}
|
|
@@ -228,6 +275,36 @@ export class Base extends EventEmitter {
|
|
|
228
275
|
}
|
|
229
276
|
return callback[kCallbackPromise];
|
|
230
277
|
}
|
|
278
|
+
[kGetApi](name, callback) {
|
|
279
|
+
// Make sure we have APIs informations
|
|
280
|
+
if (!this[kApis].length) {
|
|
281
|
+
this[kListApis]((error, apis) => {
|
|
282
|
+
if (error) {
|
|
283
|
+
callback(error, undefined);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
this[kApis] = apis;
|
|
287
|
+
this[kGetApi](name, callback);
|
|
288
|
+
});
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const api = this[kApis].find(api => api.name === name);
|
|
292
|
+
if (!api) {
|
|
293
|
+
callback(new UnsupportedApiError(`Unsupported API ${name}.`), undefined);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const { minVersion, maxVersion } = api;
|
|
297
|
+
// Starting from the highest version, we need to find the first one that is supported
|
|
298
|
+
for (let i = maxVersion; i >= minVersion; i--) {
|
|
299
|
+
const apiName = (name.slice(0, 1).toLowerCase() + name.slice(1) + 'V' + i);
|
|
300
|
+
const candidate = apis[apiName];
|
|
301
|
+
if (candidate) {
|
|
302
|
+
callback(null, candidate.api);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
callback(new UnsupportedApiError(`No usable implementation found for API ${name}.`, { minVersion, maxVersion }), undefined);
|
|
307
|
+
}
|
|
231
308
|
[kValidateOptions](target, validator, targetName, throwOnErrors = true) {
|
|
232
309
|
if (!this[kOptions].strict) {
|
|
233
310
|
return null;
|
|
@@ -242,12 +319,15 @@ export class Base extends EventEmitter {
|
|
|
242
319
|
}
|
|
243
320
|
return null;
|
|
244
321
|
}
|
|
245
|
-
|
|
246
|
-
/* c8 ignore next 3 */
|
|
322
|
+
/* c8 ignore next 3 -- This is a private API used to debug during development */
|
|
247
323
|
[kInspect](...args) {
|
|
248
324
|
debugDump(`client:${this[kInstance]}`, ...args);
|
|
249
325
|
}
|
|
250
326
|
[kFormatValidationErrors](validator, targetName) {
|
|
251
327
|
return ajv.errorsText(validator.errors, { dataVar: '$dataVar$' }).replaceAll('$dataVar$', targetName) + '.';
|
|
252
328
|
}
|
|
329
|
+
[kAfterCreate](type) {
|
|
330
|
+
this[kClientType] = type;
|
|
331
|
+
notifyCreation(type, this);
|
|
332
|
+
}
|
|
253
333
|
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
1
2
|
import { ajv } from "../../utils.js";
|
|
3
|
+
const packageJson = JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf-8'));
|
|
4
|
+
// Note: clientSoftwareName can only contain alphanumeric characters, hyphens and dots
|
|
5
|
+
export const clientSoftwareName = 'platformatic-kafka';
|
|
6
|
+
export const clientSoftwareVersion = packageJson.version;
|
|
2
7
|
export const idProperty = { type: 'string', pattern: '^\\S+$' };
|
|
3
8
|
export const topicWithPartitionAndOffsetProperties = {
|
|
4
9
|
topic: idProperty,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Callback } from '../apis/definitions.ts';
|
|
2
2
|
export declare const kCallbackPromise: unique symbol;
|
|
3
|
+
export declare const kNoopCallbackReturnValue: unique symbol;
|
|
3
4
|
export declare const noopCallback: CallbackWithPromise<any>;
|
|
4
5
|
export type CallbackWithPromise<ReturnType> = Callback<ReturnType> & {
|
|
5
6
|
[kCallbackPromise]?: Promise<ReturnType>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { MultipleErrors } from "../errors.js";
|
|
2
2
|
export const kCallbackPromise = Symbol('plt.kafka.callbackPromise');
|
|
3
|
-
|
|
3
|
+
// This is only meaningful for testing
|
|
4
|
+
export const kNoopCallbackReturnValue = Symbol('plt.kafka.noopCallbackReturnValue');
|
|
4
5
|
export const noopCallback = () => {
|
|
5
|
-
return Promise.resolve();
|
|
6
|
+
return Promise.resolve(kNoopCallbackReturnValue);
|
|
6
7
|
};
|
|
7
8
|
export function createPromisifiedCallback() {
|
|
8
9
|
const { promise, resolve, reject } = Promise.withResolvers();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type FetchResponse } from '../../apis/consumer/fetch.ts';
|
|
1
|
+
import { type FetchResponse } from '../../apis/consumer/fetch-v17.ts';
|
|
2
2
|
import { type ConnectionPool } from '../../network/connection-pool.ts';
|
|
3
3
|
import { Base, kFetchConnections } from '../base/base.ts';
|
|
4
4
|
import { type CallbackWithPromise } from '../callbacks.ts';
|