1 | const pkgJson = require('../package.json')
|
2 | const { bugs } = pkgJson
|
3 |
|
4 | class KafkaJSError extends Error {
|
5 | constructor(e, { retriable = true, cause } = {}) {
|
6 | super(e, { cause })
|
7 | Error.captureStackTrace(this, this.constructor)
|
8 | this.message = e.message || e
|
9 | this.name = 'KafkaJSError'
|
10 | this.retriable = retriable
|
11 | this.helpUrl = e.helpUrl
|
12 | this.cause = cause
|
13 | }
|
14 | }
|
15 |
|
16 | class KafkaJSNonRetriableError extends KafkaJSError {
|
17 | constructor(e, { cause } = {}) {
|
18 | super(e, { retriable: false, cause })
|
19 | this.name = 'KafkaJSNonRetriableError'
|
20 | }
|
21 | }
|
22 |
|
23 | class KafkaJSProtocolError extends KafkaJSError {
|
24 | constructor(e, { retriable = e.retriable } = {}) {
|
25 | super(e, { retriable })
|
26 | this.type = e.type
|
27 | this.code = e.code
|
28 | this.name = 'KafkaJSProtocolError'
|
29 | }
|
30 | }
|
31 |
|
32 | class KafkaJSOffsetOutOfRange extends KafkaJSProtocolError {
|
33 | constructor(e, { topic, partition }) {
|
34 | super(e)
|
35 | this.topic = topic
|
36 | this.partition = partition
|
37 | this.name = 'KafkaJSOffsetOutOfRange'
|
38 | }
|
39 | }
|
40 |
|
41 | class KafkaJSMemberIdRequired extends KafkaJSProtocolError {
|
42 | constructor(e, { memberId }) {
|
43 | super(e)
|
44 | this.memberId = memberId
|
45 | this.name = 'KafkaJSMemberIdRequired'
|
46 | }
|
47 | }
|
48 |
|
49 | class KafkaJSNumberOfRetriesExceeded extends KafkaJSNonRetriableError {
|
50 | constructor(e, { retryCount, retryTime }) {
|
51 | super(e, { cause: e })
|
52 | this.stack = `${this.name}\n Caused by: ${e.stack}`
|
53 | this.retryCount = retryCount
|
54 | this.retryTime = retryTime
|
55 | this.name = 'KafkaJSNumberOfRetriesExceeded'
|
56 | }
|
57 | }
|
58 |
|
59 | class KafkaJSConnectionError extends KafkaJSError {
|
60 | |
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | constructor(e, { broker, code } = {}) {
|
67 | super(e)
|
68 | this.broker = broker
|
69 | this.code = code
|
70 | this.name = 'KafkaJSConnectionError'
|
71 | }
|
72 | }
|
73 |
|
74 | class KafkaJSConnectionClosedError extends KafkaJSConnectionError {
|
75 | constructor(e, { host, port } = {}) {
|
76 | super(e, { broker: `${host}:${port}` })
|
77 | this.host = host
|
78 | this.port = port
|
79 | this.name = 'KafkaJSConnectionClosedError'
|
80 | }
|
81 | }
|
82 |
|
83 | class KafkaJSRequestTimeoutError extends KafkaJSError {
|
84 | constructor(e, { broker, correlationId, createdAt, sentAt, pendingDuration } = {}) {
|
85 | super(e)
|
86 | this.broker = broker
|
87 | this.correlationId = correlationId
|
88 | this.createdAt = createdAt
|
89 | this.sentAt = sentAt
|
90 | this.pendingDuration = pendingDuration
|
91 | this.name = 'KafkaJSRequestTimeoutError'
|
92 | }
|
93 | }
|
94 |
|
95 | class KafkaJSMetadataNotLoaded extends KafkaJSError {
|
96 | constructor() {
|
97 | super(...arguments)
|
98 | this.name = 'KafkaJSMetadataNotLoaded'
|
99 | }
|
100 | }
|
101 | class KafkaJSTopicMetadataNotLoaded extends KafkaJSMetadataNotLoaded {
|
102 | constructor(e, { topic } = {}) {
|
103 | super(e)
|
104 | this.topic = topic
|
105 | this.name = 'KafkaJSTopicMetadataNotLoaded'
|
106 | }
|
107 | }
|
108 | class KafkaJSStaleTopicMetadataAssignment extends KafkaJSError {
|
109 | constructor(e, { topic, unknownPartitions } = {}) {
|
110 | super(e)
|
111 | this.topic = topic
|
112 | this.unknownPartitions = unknownPartitions
|
113 | this.name = 'KafkaJSStaleTopicMetadataAssignment'
|
114 | }
|
115 | }
|
116 |
|
117 | class KafkaJSDeleteGroupsError extends KafkaJSError {
|
118 | constructor(e, groups = []) {
|
119 | super(e)
|
120 | this.groups = groups
|
121 | this.name = 'KafkaJSDeleteGroupsError'
|
122 | }
|
123 | }
|
124 |
|
125 | class KafkaJSServerDoesNotSupportApiKey extends KafkaJSNonRetriableError {
|
126 | constructor(e, { apiKey, apiName } = {}) {
|
127 | super(e)
|
128 | this.apiKey = apiKey
|
129 | this.apiName = apiName
|
130 | this.name = 'KafkaJSServerDoesNotSupportApiKey'
|
131 | }
|
132 | }
|
133 |
|
134 | class KafkaJSBrokerNotFound extends KafkaJSError {
|
135 | constructor() {
|
136 | super(...arguments)
|
137 | this.name = 'KafkaJSBrokerNotFound'
|
138 | }
|
139 | }
|
140 |
|
141 | class KafkaJSPartialMessageError extends KafkaJSNonRetriableError {
|
142 | constructor() {
|
143 | super(...arguments)
|
144 | this.name = 'KafkaJSPartialMessageError'
|
145 | }
|
146 | }
|
147 |
|
148 | class KafkaJSSASLAuthenticationError extends KafkaJSNonRetriableError {
|
149 | constructor() {
|
150 | super(...arguments)
|
151 | this.name = 'KafkaJSSASLAuthenticationError'
|
152 | }
|
153 | }
|
154 |
|
155 | class KafkaJSGroupCoordinatorNotFound extends KafkaJSNonRetriableError {
|
156 | constructor() {
|
157 | super(...arguments)
|
158 | this.name = 'KafkaJSGroupCoordinatorNotFound'
|
159 | }
|
160 | }
|
161 |
|
162 | class KafkaJSNotImplemented extends KafkaJSNonRetriableError {
|
163 | constructor() {
|
164 | super(...arguments)
|
165 | this.name = 'KafkaJSNotImplemented'
|
166 | }
|
167 | }
|
168 |
|
169 | class KafkaJSTimeout extends KafkaJSNonRetriableError {
|
170 | constructor() {
|
171 | super(...arguments)
|
172 | this.name = 'KafkaJSTimeout'
|
173 | }
|
174 | }
|
175 |
|
176 | class KafkaJSLockTimeout extends KafkaJSTimeout {
|
177 | constructor() {
|
178 | super(...arguments)
|
179 | this.name = 'KafkaJSLockTimeout'
|
180 | }
|
181 | }
|
182 |
|
183 | class KafkaJSUnsupportedMagicByteInMessageSet extends KafkaJSNonRetriableError {
|
184 | constructor() {
|
185 | super(...arguments)
|
186 | this.name = 'KafkaJSUnsupportedMagicByteInMessageSet'
|
187 | }
|
188 | }
|
189 |
|
190 | class KafkaJSDeleteTopicRecordsError extends KafkaJSError {
|
191 | constructor({ partitions }) {
|
192 | |
193 |
|
194 |
|
195 | const retriable = partitions
|
196 | .filter(({ error }) => error != null)
|
197 | .every(({ error }) => error.retriable === true)
|
198 |
|
199 | super('Error while deleting records', { retriable })
|
200 | this.name = 'KafkaJSDeleteTopicRecordsError'
|
201 | this.partitions = partitions
|
202 | }
|
203 | }
|
204 |
|
205 | const issueUrl = bugs ? bugs.url : null
|
206 |
|
207 | class KafkaJSInvariantViolation extends KafkaJSNonRetriableError {
|
208 | constructor(e) {
|
209 | const message = e.message || e
|
210 | super(`Invariant violated: ${message}. This is likely a bug and should be reported.`)
|
211 | this.name = 'KafkaJSInvariantViolation'
|
212 |
|
213 | if (issueUrl !== null) {
|
214 | const issueTitle = encodeURIComponent(`Invariant violation: ${message}`)
|
215 | this.helpUrl = `${issueUrl}/new?assignees=&labels=bug&template=bug_report.md&title=${issueTitle}`
|
216 | }
|
217 | }
|
218 | }
|
219 |
|
220 | class KafkaJSInvalidVarIntError extends KafkaJSNonRetriableError {
|
221 | constructor() {
|
222 | super(...arguments)
|
223 | this.name = 'KafkaJSNonRetriableError'
|
224 | }
|
225 | }
|
226 |
|
227 | class KafkaJSInvalidLongError extends KafkaJSNonRetriableError {
|
228 | constructor() {
|
229 | super(...arguments)
|
230 | this.name = 'KafkaJSNonRetriableError'
|
231 | }
|
232 | }
|
233 |
|
234 | class KafkaJSCreateTopicError extends KafkaJSProtocolError {
|
235 | constructor(e, topicName) {
|
236 | super(e)
|
237 | this.topic = topicName
|
238 | this.name = 'KafkaJSCreateTopicError'
|
239 | }
|
240 | }
|
241 | class KafkaJSAggregateError extends Error {
|
242 | constructor(message, errors) {
|
243 | super(message)
|
244 | this.errors = errors
|
245 | this.name = 'KafkaJSAggregateError'
|
246 | }
|
247 | }
|
248 |
|
249 | class KafkaJSFetcherRebalanceError extends Error {}
|
250 |
|
251 | const isRebalancing = e =>
|
252 | e.type === 'REBALANCE_IN_PROGRESS' || e.type === 'NOT_COORDINATOR_FOR_GROUP'
|
253 |
|
254 | const isKafkaJSError = e => e instanceof KafkaJSError
|
255 |
|
256 | module.exports = {
|
257 | KafkaJSError,
|
258 | KafkaJSNonRetriableError,
|
259 | KafkaJSPartialMessageError,
|
260 | KafkaJSBrokerNotFound,
|
261 | KafkaJSProtocolError,
|
262 | KafkaJSConnectionError,
|
263 | KafkaJSConnectionClosedError,
|
264 | KafkaJSRequestTimeoutError,
|
265 | KafkaJSSASLAuthenticationError,
|
266 | KafkaJSNumberOfRetriesExceeded,
|
267 | KafkaJSOffsetOutOfRange,
|
268 | KafkaJSMemberIdRequired,
|
269 | KafkaJSGroupCoordinatorNotFound,
|
270 | KafkaJSNotImplemented,
|
271 | KafkaJSMetadataNotLoaded,
|
272 | KafkaJSTopicMetadataNotLoaded,
|
273 | KafkaJSStaleTopicMetadataAssignment,
|
274 | KafkaJSDeleteGroupsError,
|
275 | KafkaJSTimeout,
|
276 | KafkaJSLockTimeout,
|
277 | KafkaJSServerDoesNotSupportApiKey,
|
278 | KafkaJSUnsupportedMagicByteInMessageSet,
|
279 | KafkaJSDeleteTopicRecordsError,
|
280 | KafkaJSInvariantViolation,
|
281 | KafkaJSInvalidVarIntError,
|
282 | KafkaJSInvalidLongError,
|
283 | KafkaJSCreateTopicError,
|
284 | KafkaJSAggregateError,
|
285 | KafkaJSFetcherRebalanceError,
|
286 | isRebalancing,
|
287 | isKafkaJSError,
|
288 | }
|