@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.
Files changed (184) hide show
  1. package/README.md +1 -0
  2. package/dist/apis/admin/index.d.ts +38 -37
  3. package/dist/apis/admin/index.js +38 -37
  4. package/dist/apis/admin/list-groups-v4.d.ts +17 -0
  5. package/dist/apis/admin/list-groups-v4.js +40 -0
  6. package/dist/apis/consumer/fetch-v16.js +121 -0
  7. package/dist/apis/consumer/fetch-v17.d.ts +46 -0
  8. package/dist/apis/consumer/index.d.ts +11 -9
  9. package/dist/apis/consumer/index.js +11 -9
  10. package/dist/apis/consumer/list-offsets-v8.js +68 -0
  11. package/dist/apis/consumer/list-offsets-v9.d.ts +30 -0
  12. package/dist/apis/definitions.js +0 -1
  13. package/dist/apis/metadata/api-versions-v3.js +41 -0
  14. package/dist/apis/metadata/api-versions-v4.d.ts +17 -0
  15. package/dist/apis/metadata/find-coordinator-v4.js +50 -0
  16. package/dist/apis/metadata/find-coordinator-v5.d.ts +19 -0
  17. package/dist/apis/metadata/find-coordinator-v5.js +50 -0
  18. package/dist/apis/metadata/find-coordinator-v6.d.ts +19 -0
  19. package/dist/apis/metadata/index.d.ts +6 -3
  20. package/dist/apis/metadata/index.js +6 -3
  21. package/dist/apis/producer/index.d.ts +8 -6
  22. package/dist/apis/producer/index.js +8 -6
  23. package/dist/apis/producer/init-producer-id-v4.js +38 -0
  24. package/dist/apis/producer/init-producer-id-v5.d.ts +21 -0
  25. package/dist/apis/producer/produce-v10.js +104 -0
  26. package/dist/apis/producer/produce-v11.d.ts +29 -0
  27. package/dist/apis/security/index.d.ts +2 -2
  28. package/dist/apis/security/index.js +2 -2
  29. package/dist/apis/telemetry/index.d.ts +3 -3
  30. package/dist/apis/telemetry/index.js +3 -3
  31. package/dist/clients/admin/admin.js +58 -22
  32. package/dist/clients/base/base.d.ts +19 -3
  33. package/dist/clients/base/base.js +93 -13
  34. package/dist/clients/base/options.d.ts +2 -0
  35. package/dist/clients/base/options.js +5 -0
  36. package/dist/clients/callbacks.d.ts +1 -0
  37. package/dist/clients/callbacks.js +3 -2
  38. package/dist/clients/consumer/consumer.d.ts +1 -1
  39. package/dist/clients/consumer/consumer.js +166 -105
  40. package/dist/clients/consumer/messages-stream.d.ts +1 -0
  41. package/dist/clients/consumer/messages-stream.js +81 -47
  42. package/dist/clients/consumer/options.d.ts +3 -0
  43. package/dist/clients/consumer/options.js +1 -0
  44. package/dist/clients/consumer/types.d.ts +8 -3
  45. package/dist/clients/producer/producer.js +49 -28
  46. package/dist/diagnostic.d.ts +47 -0
  47. package/dist/diagnostic.js +38 -0
  48. package/dist/errors.d.ts +5 -1
  49. package/dist/errors.js +12 -6
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +1 -0
  52. package/dist/network/connection-pool.d.ts +2 -1
  53. package/dist/network/connection-pool.js +36 -25
  54. package/dist/network/connection.d.ts +2 -2
  55. package/dist/network/connection.js +135 -81
  56. package/dist/protocol/compression.js +8 -8
  57. package/dist/protocol/reader.js +0 -1
  58. package/dist/protocol/records.js +0 -3
  59. package/dist/protocol/sasl/plain.d.ts +1 -1
  60. package/dist/protocol/sasl/scram-sha.d.ts +11 -4
  61. package/dist/protocol/sasl/scram-sha.js +8 -2
  62. package/dist/symbols.d.ts +1 -0
  63. package/dist/symbols.js +2 -0
  64. package/package.json +3 -3
  65. /package/dist/apis/admin/{alter-client-quotas.d.ts → alter-client-quotas-v1.d.ts} +0 -0
  66. /package/dist/apis/admin/{alter-client-quotas.js → alter-client-quotas-v1.js} +0 -0
  67. /package/dist/apis/admin/{alter-configs.d.ts → alter-configs-v2.d.ts} +0 -0
  68. /package/dist/apis/admin/{alter-configs.js → alter-configs-v2.js} +0 -0
  69. /package/dist/apis/admin/{alter-partition-reassignments.d.ts → alter-partition-reassignments-v0.d.ts} +0 -0
  70. /package/dist/apis/admin/{alter-partition-reassignments.js → alter-partition-reassignments-v0.js} +0 -0
  71. /package/dist/apis/admin/{alter-partition.d.ts → alter-partition-v3.d.ts} +0 -0
  72. /package/dist/apis/admin/{alter-partition.js → alter-partition-v3.js} +0 -0
  73. /package/dist/apis/admin/{alter-replica-log-dirs.d.ts → alter-replica-log-dirs-v2.d.ts} +0 -0
  74. /package/dist/apis/admin/{alter-replica-log-dirs.js → alter-replica-log-dirs-v2.js} +0 -0
  75. /package/dist/apis/admin/{alter-user-scram-credentials.d.ts → alter-user-scram-credentials-v0.d.ts} +0 -0
  76. /package/dist/apis/admin/{alter-user-scram-credentials.js → alter-user-scram-credentials-v0.js} +0 -0
  77. /package/dist/apis/admin/{consumer-group-describe.d.ts → consumer-group-describe-v0.d.ts} +0 -0
  78. /package/dist/apis/admin/{consumer-group-describe.js → consumer-group-describe-v0.js} +0 -0
  79. /package/dist/apis/admin/{create-acls.d.ts → create-acls-v3.d.ts} +0 -0
  80. /package/dist/apis/admin/{create-acls.js → create-acls-v3.js} +0 -0
  81. /package/dist/apis/admin/{create-delegation-token.d.ts → create-delegation-token-v3.d.ts} +0 -0
  82. /package/dist/apis/admin/{create-delegation-token.js → create-delegation-token-v3.js} +0 -0
  83. /package/dist/apis/admin/{create-partitions.d.ts → create-partitions-v3.d.ts} +0 -0
  84. /package/dist/apis/admin/{create-partitions.js → create-partitions-v3.js} +0 -0
  85. /package/dist/apis/admin/{create-topics.d.ts → create-topics-v7.d.ts} +0 -0
  86. /package/dist/apis/admin/{create-topics.js → create-topics-v7.js} +0 -0
  87. /package/dist/apis/admin/{delete-acls.d.ts → delete-acls-v3.d.ts} +0 -0
  88. /package/dist/apis/admin/{delete-acls.js → delete-acls-v3.js} +0 -0
  89. /package/dist/apis/admin/{delete-groups.d.ts → delete-groups-v2.d.ts} +0 -0
  90. /package/dist/apis/admin/{delete-groups.js → delete-groups-v2.js} +0 -0
  91. /package/dist/apis/admin/{delete-records.d.ts → delete-records-v2.d.ts} +0 -0
  92. /package/dist/apis/admin/{delete-records.js → delete-records-v2.js} +0 -0
  93. /package/dist/apis/admin/{delete-topics.d.ts → delete-topics-v6.d.ts} +0 -0
  94. /package/dist/apis/admin/{delete-topics.js → delete-topics-v6.js} +0 -0
  95. /package/dist/apis/admin/{describe-acls.d.ts → describe-acls-v3.d.ts} +0 -0
  96. /package/dist/apis/admin/{describe-acls.js → describe-acls-v3.js} +0 -0
  97. /package/dist/apis/admin/{describe-client-quotas.d.ts → describe-client-quotas-v0.d.ts} +0 -0
  98. /package/dist/apis/admin/{describe-client-quotas.js → describe-client-quotas-v0.js} +0 -0
  99. /package/dist/apis/admin/{describe-cluster.d.ts → describe-cluster-v1.d.ts} +0 -0
  100. /package/dist/apis/admin/{describe-cluster.js → describe-cluster-v1.js} +0 -0
  101. /package/dist/apis/admin/{describe-configs.d.ts → describe-configs-v4.d.ts} +0 -0
  102. /package/dist/apis/admin/{describe-configs.js → describe-configs-v4.js} +0 -0
  103. /package/dist/apis/admin/{describe-delegation-token.d.ts → describe-delegation-token-v3.d.ts} +0 -0
  104. /package/dist/apis/admin/{describe-delegation-token.js → describe-delegation-token-v3.js} +0 -0
  105. /package/dist/apis/admin/{describe-groups.d.ts → describe-groups-v5.d.ts} +0 -0
  106. /package/dist/apis/admin/{describe-groups.js → describe-groups-v5.js} +0 -0
  107. /package/dist/apis/admin/{describe-log-dirs.d.ts → describe-log-dirs-v4.d.ts} +0 -0
  108. /package/dist/apis/admin/{describe-log-dirs.js → describe-log-dirs-v4.js} +0 -0
  109. /package/dist/apis/admin/{describe-producers.d.ts → describe-producers-v0.d.ts} +0 -0
  110. /package/dist/apis/admin/{describe-producers.js → describe-producers-v0.js} +0 -0
  111. /package/dist/apis/admin/{describe-quorum.d.ts → describe-quorum-v2.d.ts} +0 -0
  112. /package/dist/apis/admin/{describe-quorum.js → describe-quorum-v2.js} +0 -0
  113. /package/dist/apis/admin/{describe-topic-partitions.d.ts → describe-topic-partitions-v0.d.ts} +0 -0
  114. /package/dist/apis/admin/{describe-topic-partitions.js → describe-topic-partitions-v0.js} +0 -0
  115. /package/dist/apis/admin/{describe-transactions.d.ts → describe-transactions-v0.d.ts} +0 -0
  116. /package/dist/apis/admin/{describe-transactions.js → describe-transactions-v0.js} +0 -0
  117. /package/dist/apis/admin/{describe-user-scram-credentials.d.ts → describe-user-scram-credentials-v0.d.ts} +0 -0
  118. /package/dist/apis/admin/{describe-user-scram-credentials.js → describe-user-scram-credentials-v0.js} +0 -0
  119. /package/dist/apis/admin/{envelope.d.ts → envelope-v0.d.ts} +0 -0
  120. /package/dist/apis/admin/{envelope.js → envelope-v0.js} +0 -0
  121. /package/dist/apis/admin/{expire-delegation-token.d.ts → expire-delegation-token-v2.d.ts} +0 -0
  122. /package/dist/apis/admin/{expire-delegation-token.js → expire-delegation-token-v2.js} +0 -0
  123. /package/dist/apis/admin/{incremental-alter-configs.d.ts → incremental-alter-configs-v1.d.ts} +0 -0
  124. /package/dist/apis/admin/{incremental-alter-configs.js → incremental-alter-configs-v1.js} +0 -0
  125. /package/dist/apis/admin/{list-groups.d.ts → list-groups-v5.d.ts} +0 -0
  126. /package/dist/apis/admin/{list-groups.js → list-groups-v5.js} +0 -0
  127. /package/dist/apis/admin/{list-partition-reassignments.d.ts → list-partition-reassignments-v0.d.ts} +0 -0
  128. /package/dist/apis/admin/{list-partition-reassignments.js → list-partition-reassignments-v0.js} +0 -0
  129. /package/dist/apis/admin/{list-transactions.d.ts → list-transactions-v1.d.ts} +0 -0
  130. /package/dist/apis/admin/{list-transactions.js → list-transactions-v1.js} +0 -0
  131. /package/dist/apis/admin/{offset-delete.d.ts → offset-delete-v0.d.ts} +0 -0
  132. /package/dist/apis/admin/{offset-delete.js → offset-delete-v0.js} +0 -0
  133. /package/dist/apis/admin/{renew-delegation-token.d.ts → renew-delegation-token-v2.d.ts} +0 -0
  134. /package/dist/apis/admin/{renew-delegation-token.js → renew-delegation-token-v2.js} +0 -0
  135. /package/dist/apis/admin/{unregister-broker.d.ts → unregister-broker-v0.d.ts} +0 -0
  136. /package/dist/apis/admin/{unregister-broker.js → unregister-broker-v0.js} +0 -0
  137. /package/dist/apis/admin/{update-features.d.ts → update-features-v1.d.ts} +0 -0
  138. /package/dist/apis/admin/{update-features.js → update-features-v1.js} +0 -0
  139. /package/dist/apis/consumer/{consumer-group-heartbeat.d.ts → consumer-group-heartbeat-v0.d.ts} +0 -0
  140. /package/dist/apis/consumer/{consumer-group-heartbeat.js → consumer-group-heartbeat-v0.js} +0 -0
  141. /package/dist/apis/consumer/{fetch.d.ts → fetch-v16.d.ts} +0 -0
  142. /package/dist/apis/consumer/{fetch.js → fetch-v17.js} +0 -0
  143. /package/dist/apis/consumer/{heartbeat.d.ts → heartbeat-v4.d.ts} +0 -0
  144. /package/dist/apis/consumer/{heartbeat.js → heartbeat-v4.js} +0 -0
  145. /package/dist/apis/consumer/{join-group.d.ts → join-group-v9.d.ts} +0 -0
  146. /package/dist/apis/consumer/{join-group.js → join-group-v9.js} +0 -0
  147. /package/dist/apis/consumer/{leave-group.d.ts → leave-group-v5.d.ts} +0 -0
  148. /package/dist/apis/consumer/{leave-group.js → leave-group-v5.js} +0 -0
  149. /package/dist/apis/consumer/{list-offsets.d.ts → list-offsets-v8.d.ts} +0 -0
  150. /package/dist/apis/consumer/{list-offsets.js → list-offsets-v9.js} +0 -0
  151. /package/dist/apis/consumer/{offset-commit.d.ts → offset-commit-v9.d.ts} +0 -0
  152. /package/dist/apis/consumer/{offset-commit.js → offset-commit-v9.js} +0 -0
  153. /package/dist/apis/consumer/{offset-fetch.d.ts → offset-fetch-v9.d.ts} +0 -0
  154. /package/dist/apis/consumer/{offset-fetch.js → offset-fetch-v9.js} +0 -0
  155. /package/dist/apis/consumer/{sync-group.d.ts → sync-group-v5.d.ts} +0 -0
  156. /package/dist/apis/consumer/{sync-group.js → sync-group-v5.js} +0 -0
  157. /package/dist/apis/metadata/{api-versions.d.ts → api-versions-v3.d.ts} +0 -0
  158. /package/dist/apis/metadata/{api-versions.js → api-versions-v4.js} +0 -0
  159. /package/dist/apis/metadata/{find-coordinator.d.ts → find-coordinator-v4.d.ts} +0 -0
  160. /package/dist/apis/metadata/{find-coordinator.js → find-coordinator-v6.js} +0 -0
  161. /package/dist/apis/metadata/{metadata.d.ts → metadata-v12.d.ts} +0 -0
  162. /package/dist/apis/metadata/{metadata.js → metadata-v12.js} +0 -0
  163. /package/dist/apis/producer/{add-offsets-to-txn.d.ts → add-offsets-to-txn-v4.d.ts} +0 -0
  164. /package/dist/apis/producer/{add-offsets-to-txn.js → add-offsets-to-txn-v4.js} +0 -0
  165. /package/dist/apis/producer/{add-partitions-to-txn.d.ts → add-partitions-to-txn-v5.d.ts} +0 -0
  166. /package/dist/apis/producer/{add-partitions-to-txn.js → add-partitions-to-txn-v5.js} +0 -0
  167. /package/dist/apis/producer/{end-txn.d.ts → end-txn-v4.d.ts} +0 -0
  168. /package/dist/apis/producer/{end-txn.js → end-txn-v4.js} +0 -0
  169. /package/dist/apis/producer/{init-producer-id.d.ts → init-producer-id-v4.d.ts} +0 -0
  170. /package/dist/apis/producer/{init-producer-id.js → init-producer-id-v5.js} +0 -0
  171. /package/dist/apis/producer/{produce.d.ts → produce-v10.d.ts} +0 -0
  172. /package/dist/apis/producer/{produce.js → produce-v11.js} +0 -0
  173. /package/dist/apis/producer/{txn-offset-commit.d.ts → txn-offset-commit-v4.d.ts} +0 -0
  174. /package/dist/apis/producer/{txn-offset-commit.js → txn-offset-commit-v4.js} +0 -0
  175. /package/dist/apis/security/{sasl-authenticate.d.ts → sasl-authenticate-v2.d.ts} +0 -0
  176. /package/dist/apis/security/{sasl-authenticate.js → sasl-authenticate-v2.js} +0 -0
  177. /package/dist/apis/security/{sasl-handshake.d.ts → sasl-handshake-v1.d.ts} +0 -0
  178. /package/dist/apis/security/{sasl-handshake.js → sasl-handshake-v1.js} +0 -0
  179. /package/dist/apis/telemetry/{get-telemetry-subscriptions.d.ts → get-telemetry-subscriptions-v0.d.ts} +0 -0
  180. /package/dist/apis/telemetry/{get-telemetry-subscriptions.js → get-telemetry-subscriptions-v0.js} +0 -0
  181. /package/dist/apis/telemetry/{list-client-metrics-resources.d.ts → list-client-metrics-resources-v0.d.ts} +0 -0
  182. /package/dist/apis/telemetry/{list-client-metrics-resources.js → list-client-metrics-resources-v0.js} +0 -0
  183. /package/dist/apis/telemetry/{push-telemetry.d.ts → push-telemetry-v0.d.ts} +0 -0
  184. /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 class Base<OptionsType extends BaseOptions> extends EventEmitter {
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 { api as metadataV12 } from "../../apis/metadata/metadata.js";
3
- import { MultipleErrors, NetworkError, UserError } from "../../errors.js";
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 just used for debugging
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
- /* c8 ignore next 3 */
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
- metadataV12(connection, options.topics, autocreateTopics, true, retryCallback);
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
- // This is a private API used to debug during development
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,6 @@
1
1
  import { type BaseOptions } from './types.ts';
2
+ export declare const clientSoftwareName = "platformatic-kafka";
3
+ export declare const clientSoftwareVersion: any;
2
4
  export declare const idProperty: {
3
5
  type: string;
4
6
  pattern: string;
@@ -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
- /* c8 ignore next 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';