sqs-consumer 7.1.0 → 7.2.0-canary.2

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.
@@ -8,6 +8,6 @@ body:
8
8
  - type: input
9
9
  attributes:
10
10
  label: Example
11
- description: A link to a minimal reproduction is helpful for debugging!
11
+ description: A link to a minimal reproduction is helpful for debugging! You can fork [this stackblitz setup](https://stackblitz.com/edit/sqs-consumer-starter) to get a reproduction setup quickly.
12
12
  validations:
13
- required: false
13
+ required: false
@@ -1,4 +1,5 @@
1
- import { ConsumerOptions, TypedEventEmitter, StopOptions, UpdatableOptions } from './types';
1
+ import { ConsumerOptions, StopOptions, UpdatableOptions } from './types';
2
+ import { TypedEventEmitter } from './emitter';
2
3
  /**
3
4
  * [Usage](https://bbc.github.io/sqs-consumer/index.html#usage)
4
5
  */
package/dist/consumer.js CHANGED
@@ -2,17 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Consumer = void 0;
4
4
  const client_sqs_1 = require("@aws-sdk/client-sqs");
5
- const debug_1 = require("debug");
6
- const types_1 = require("./types");
5
+ const emitter_1 = require("./emitter");
7
6
  const bind_1 = require("./bind");
8
7
  const errors_1 = require("./errors");
9
8
  const validation_1 = require("./validation");
10
9
  const controllers_1 = require("./controllers");
11
- const debug = (0, debug_1.default)('sqs-consumer');
10
+ const logger_1 = require("./logger");
12
11
  /**
13
12
  * [Usage](https://bbc.github.io/sqs-consumer/index.html#usage)
14
13
  */
15
- class Consumer extends types_1.TypedEventEmitter {
14
+ class Consumer extends emitter_1.TypedEventEmitter {
16
15
  constructor(options) {
17
16
  var _a, _b, _c, _d;
18
17
  super();
@@ -59,7 +58,7 @@ class Consumer extends types_1.TypedEventEmitter {
59
58
  */
60
59
  start() {
61
60
  if (this.stopped) {
62
- debug('Starting consumer');
61
+ logger_1.logger.debug('starting');
63
62
  this.stopped = false;
64
63
  this.emit('started');
65
64
  this.poll();
@@ -70,17 +69,17 @@ class Consumer extends types_1.TypedEventEmitter {
70
69
  */
71
70
  stop(options) {
72
71
  if (this.stopped) {
73
- debug('Consumer was already stopped');
72
+ logger_1.logger.debug('already_stopped');
74
73
  return;
75
74
  }
76
- debug('Stopping consumer');
75
+ logger_1.logger.debug('stopping');
77
76
  this.stopped = true;
78
77
  if (this.pollingTimeoutId) {
79
78
  clearTimeout(this.pollingTimeoutId);
80
79
  this.pollingTimeoutId = undefined;
81
80
  }
82
81
  if (options === null || options === void 0 ? void 0 : options.abort) {
83
- debug('Aborting SQS requests');
82
+ logger_1.logger.debug('aborting');
84
83
  controllers_1.abortController.abort();
85
84
  this.emit('aborted');
86
85
  }
@@ -99,7 +98,6 @@ class Consumer extends types_1.TypedEventEmitter {
99
98
  */
100
99
  updateOption(option, value) {
101
100
  (0, validation_1.validateOption)(option, value, this, true);
102
- debug(`Updating the ${option} option to the value ${value}`);
103
101
  this[option] = value;
104
102
  this.emit('option_updated', option, value);
105
103
  }
@@ -127,10 +125,12 @@ class Consumer extends types_1.TypedEventEmitter {
127
125
  */
128
126
  poll() {
129
127
  if (this.stopped) {
130
- debug('Poll was called while consumer was stopped, cancelling poll...');
128
+ logger_1.logger.debug('cancelling_poll', {
129
+ detail: 'Poll was called while consumer was stopped, cancelling poll...'
130
+ });
131
131
  return;
132
132
  }
133
- debug('Polling for messages');
133
+ logger_1.logger.debug('polling');
134
134
  let currentPollingTimeout = this.pollingWaitTimeMs;
135
135
  this.receiveMessage({
136
136
  QueueUrl: this.queueUrl,
@@ -144,7 +144,9 @@ class Consumer extends types_1.TypedEventEmitter {
144
144
  .catch((err) => {
145
145
  this.emitError(err);
146
146
  if ((0, errors_1.isConnectionError)(err)) {
147
- debug('There was an authentication error. Pausing before retrying.');
147
+ logger_1.logger.debug('authentication_error', {
148
+ detail: 'There was an authentication error. Pausing before retrying.'
149
+ });
148
150
  currentPollingTimeout = this.authenticationErrorTimeout;
149
151
  }
150
152
  return;
@@ -178,12 +180,18 @@ class Consumer extends types_1.TypedEventEmitter {
178
180
  */
179
181
  async handleSqsResponse(response) {
180
182
  if ((0, validation_1.hasMessages)(response)) {
183
+ const handlerProcessingDebugger = setInterval(() => {
184
+ logger_1.logger.debug('handler_processing', {
185
+ detail: 'The handler is still processing the message(s)...'
186
+ });
187
+ }, 1000);
181
188
  if (this.handleMessageBatch) {
182
189
  await this.processMessageBatch(response.Messages);
183
190
  }
184
191
  else {
185
192
  await Promise.all(response.Messages.map(this.processMessage));
186
193
  }
194
+ clearInterval(handlerProcessingDebugger);
187
195
  this.emit('response_processed');
188
196
  }
189
197
  else if (response) {
@@ -215,7 +223,9 @@ class Consumer extends types_1.TypedEventEmitter {
215
223
  }
216
224
  }
217
225
  finally {
218
- clearInterval(heartbeatTimeoutId);
226
+ if (this.heartbeatInterval) {
227
+ clearInterval(heartbeatTimeoutId);
228
+ }
219
229
  }
220
230
  }
221
231
  /**
@@ -356,10 +366,12 @@ class Consumer extends types_1.TypedEventEmitter {
356
366
  */
357
367
  async deleteMessage(message) {
358
368
  if (!this.shouldDeleteMessages) {
359
- debug('Skipping message delete since shouldDeleteMessages is set to false');
369
+ logger_1.logger.debug('skipping_delete', {
370
+ detail: 'Skipping message delete since shouldDeleteMessages is set to false'
371
+ });
360
372
  return;
361
373
  }
362
- debug('Deleting message %s', message.MessageId);
374
+ logger_1.logger.debug('deleting_message', { messageId: message.MessageId });
363
375
  const deleteParams = {
364
376
  QueueUrl: this.queueUrl,
365
377
  ReceiptHandle: message.ReceiptHandle
@@ -377,10 +389,14 @@ class Consumer extends types_1.TypedEventEmitter {
377
389
  */
378
390
  async deleteMessageBatch(messages) {
379
391
  if (!this.shouldDeleteMessages) {
380
- debug('Skipping message delete since shouldDeleteMessages is set to false');
392
+ logger_1.logger.debug('skipping_delete', {
393
+ detail: 'Skipping message delete since shouldDeleteMessages is set to false'
394
+ });
381
395
  return;
382
396
  }
383
- debug('Deleting messages %s', messages.map((msg) => msg.MessageId).join(' ,'));
397
+ logger_1.logger.debug('deleting_messages', {
398
+ messageIds: messages.map((msg) => msg.MessageId)
399
+ });
384
400
  const deleteParams = {
385
401
  QueueUrl: this.queueUrl,
386
402
  Entries: messages.map((message) => ({
@@ -0,0 +1,22 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import { Events } from './types';
4
+ export declare class TypedEventEmitter extends EventEmitter {
5
+ /**
6
+ * Trigger a listener on all emitted events
7
+ * @param event The name of the event to listen to
8
+ * @param listener A function to trigger when the event is emitted
9
+ */
10
+ on<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
11
+ /**
12
+ * Trigger a listener only once for an emitted event
13
+ * @param event The name of the event to listen to
14
+ * @param listener A function to trigger when the event is emitted
15
+ */
16
+ once<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
17
+ /**
18
+ * Emits an event with the provided arguments
19
+ * @param event The name of the event to emit
20
+ */
21
+ emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean;
22
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypedEventEmitter = void 0;
4
+ const events_1 = require("events");
5
+ const logger_1 = require("./logger");
6
+ class TypedEventEmitter extends events_1.EventEmitter {
7
+ /**
8
+ * Trigger a listener on all emitted events
9
+ * @param event The name of the event to listen to
10
+ * @param listener A function to trigger when the event is emitted
11
+ */
12
+ on(event, listener) {
13
+ return super.on(event, listener);
14
+ }
15
+ /**
16
+ * Trigger a listener only once for an emitted event
17
+ * @param event The name of the event to listen to
18
+ * @param listener A function to trigger when the event is emitted
19
+ */
20
+ once(event, listener) {
21
+ return super.once(event, listener);
22
+ }
23
+ /**
24
+ * Emits an event with the provided arguments
25
+ * @param event The name of the event to emit
26
+ */
27
+ emit(event, ...args) {
28
+ logger_1.logger.debug(event, ...args);
29
+ return super.emit(event, ...args);
30
+ }
31
+ }
32
+ exports.TypedEventEmitter = TypedEventEmitter;
@@ -0,0 +1,3 @@
1
+ export declare const logger: {
2
+ debug: any;
3
+ };
package/dist/logger.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logger = void 0;
4
+ const debug = require('debug')('sqs-consumer');
5
+ exports.logger = {
6
+ debug
7
+ };
package/dist/types.d.ts CHANGED
@@ -1,6 +1,4 @@
1
- /// <reference types="node" />
2
1
  import { SQSClient, Message } from '@aws-sdk/client-sqs';
3
- import { EventEmitter } from 'events';
4
2
  export interface ConsumerOptions {
5
3
  /**
6
4
  * The SQS queue URL.
@@ -163,25 +161,6 @@ export interface Events {
163
161
  */
164
162
  option_updated: [UpdatableOptions, ConsumerOptions[UpdatableOptions]];
165
163
  }
166
- export declare class TypedEventEmitter extends EventEmitter {
167
- /**
168
- * Trigger a listener on all emitted events
169
- * @param event The name of the event to listen to
170
- * @param listener A function to trigger when the event is emitted
171
- */
172
- on<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
173
- /**
174
- * Trigger a listener only once for an emitted event
175
- * @param event The name of the event to listen to
176
- * @param listener A function to trigger when the event is emitted
177
- */
178
- once<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void): this;
179
- /**
180
- * Emits an event with the provided arguments
181
- * @param event The name of the event to emit
182
- */
183
- emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean;
184
- }
185
164
  export type AWSError = {
186
165
  /**
187
166
  * Name, eg. ConditionalCheckFailedException
package/dist/types.js CHANGED
@@ -1,30 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TypedEventEmitter = void 0;
4
- const events_1 = require("events");
5
- class TypedEventEmitter extends events_1.EventEmitter {
6
- /**
7
- * Trigger a listener on all emitted events
8
- * @param event The name of the event to listen to
9
- * @param listener A function to trigger when the event is emitted
10
- */
11
- on(event, listener) {
12
- return super.on(event, listener);
13
- }
14
- /**
15
- * Trigger a listener only once for an emitted event
16
- * @param event The name of the event to listen to
17
- * @param listener A function to trigger when the event is emitted
18
- */
19
- once(event, listener) {
20
- return super.once(event, listener);
21
- }
22
- /**
23
- * Emits an event with the provided arguments
24
- * @param event The name of the event to emit
25
- */
26
- emit(event, ...args) {
27
- return super.emit(event, ...args);
28
- }
29
- }
30
- exports.TypedEventEmitter = TypedEventEmitter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sqs-consumer",
3
- "version": "7.1.0",
3
+ "version": "7.2.0-canary.2",
4
4
  "description": "Build SQS-based Node applications without the boilerplate",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -41,32 +41,31 @@
41
41
  ],
42
42
  "license": "Apache-2.0",
43
43
  "devDependencies": {
44
- "@cucumber/cucumber": "^8.10.0",
45
- "@types/chai": "^4.3.4",
46
- "@types/debug": "^4.1.7",
44
+ "@cucumber/cucumber": "^9.1.2",
45
+ "@types/chai": "^4.3.5",
47
46
  "@types/mocha": "^10.0.1",
48
47
  "@types/node": "^18.11.18",
49
- "@types/sinon": "^10.0.13",
48
+ "@types/sinon": "^10.0.15",
50
49
  "chai": "^4.3.7",
51
- "eslint": "^8.32.0",
52
- "eslint-config-iplayer-ts": "^4.1.0",
53
- "eslint-config-prettier": "^8.6.0",
50
+ "eslint": "^8.42.0",
51
+ "eslint-config-iplayer-ts": "^4.1.1",
52
+ "eslint-config-prettier": "^8.8.0",
54
53
  "mocha": "^10.2.0",
55
54
  "nyc": "^15.1.0",
56
55
  "p-event": "^4.2.0",
57
- "prettier": "^2.8.3",
58
- "sinon": "^15.0.1",
59
- "sqs-producer": "^3.1.1",
56
+ "prettier": "^2.8.8",
57
+ "sinon": "^15.1.0",
58
+ "sqs-producer": "^3.1.2",
60
59
  "ts-node": "^10.9.1",
61
- "typedoc": "^0.23.24",
60
+ "typedoc": "^0.24.8",
62
61
  "typescript": "^4.9.4"
63
62
  },
64
63
  "dependencies": {
65
- "@aws-sdk/client-sqs": "^3.258.0",
64
+ "@aws-sdk/client-sqs": "^3.348.0",
66
65
  "debug": "^4.3.4"
67
66
  },
68
67
  "peerDependencies": {
69
- "@aws-sdk/client-sqs": "^3.258.0"
68
+ "@aws-sdk/client-sqs": "^3.348.0"
70
69
  },
71
70
  "mocha": {
72
71
  "spec": "test/tests/**/**/*.test.ts",
package/src/consumer.ts CHANGED
@@ -15,14 +15,9 @@ import {
15
15
  ReceiveMessageCommandInput,
16
16
  ReceiveMessageCommandOutput
17
17
  } from '@aws-sdk/client-sqs';
18
- import Debug from 'debug';
19
18
 
20
- import {
21
- ConsumerOptions,
22
- TypedEventEmitter,
23
- StopOptions,
24
- UpdatableOptions
25
- } from './types';
19
+ import { ConsumerOptions, StopOptions, UpdatableOptions } from './types';
20
+ import { TypedEventEmitter } from './emitter';
26
21
  import { autoBind } from './bind';
27
22
  import {
28
23
  SQSError,
@@ -32,8 +27,7 @@ import {
32
27
  } from './errors';
33
28
  import { validateOption, assertOptions, hasMessages } from './validation';
34
29
  import { abortController } from './controllers';
35
-
36
- const debug = Debug('sqs-consumer');
30
+ import { logger } from './logger';
37
31
 
38
32
  /**
39
33
  * [Usage](https://bbc.github.io/sqs-consumer/index.html#usage)
@@ -96,7 +90,7 @@ export class Consumer extends TypedEventEmitter {
96
90
  */
97
91
  public start(): void {
98
92
  if (this.stopped) {
99
- debug('Starting consumer');
93
+ logger.debug('starting');
100
94
  this.stopped = false;
101
95
  this.emit('started');
102
96
  this.poll();
@@ -108,11 +102,11 @@ export class Consumer extends TypedEventEmitter {
108
102
  */
109
103
  public stop(options?: StopOptions): void {
110
104
  if (this.stopped) {
111
- debug('Consumer was already stopped');
105
+ logger.debug('already_stopped');
112
106
  return;
113
107
  }
114
108
 
115
- debug('Stopping consumer');
109
+ logger.debug('stopping');
116
110
  this.stopped = true;
117
111
 
118
112
  if (this.pollingTimeoutId) {
@@ -121,10 +115,8 @@ export class Consumer extends TypedEventEmitter {
121
115
  }
122
116
 
123
117
  if (options?.abort) {
124
- debug('Aborting SQS requests');
125
-
118
+ logger.debug('aborting');
126
119
  abortController.abort();
127
-
128
120
  this.emit('aborted');
129
121
  }
130
122
 
@@ -149,8 +141,6 @@ export class Consumer extends TypedEventEmitter {
149
141
  ) {
150
142
  validateOption(option, value, this, true);
151
143
 
152
- debug(`Updating the ${option} option to the value ${value}`);
153
-
154
144
  this[option] = value;
155
145
 
156
146
  this.emit('option_updated', option, value);
@@ -185,11 +175,13 @@ export class Consumer extends TypedEventEmitter {
185
175
  */
186
176
  private poll(): void {
187
177
  if (this.stopped) {
188
- debug('Poll was called while consumer was stopped, cancelling poll...');
178
+ logger.debug('cancelling_poll', {
179
+ detail: 'Poll was called while consumer was stopped, cancelling poll...'
180
+ });
189
181
  return;
190
182
  }
191
183
 
192
- debug('Polling for messages');
184
+ logger.debug('polling');
193
185
 
194
186
  let currentPollingTimeout = this.pollingWaitTimeMs;
195
187
  this.receiveMessage({
@@ -204,7 +196,10 @@ export class Consumer extends TypedEventEmitter {
204
196
  .catch((err) => {
205
197
  this.emitError(err);
206
198
  if (isConnectionError(err)) {
207
- debug('There was an authentication error. Pausing before retrying.');
199
+ logger.debug('authentication_error', {
200
+ detail:
201
+ 'There was an authentication error. Pausing before retrying.'
202
+ });
208
203
  currentPollingTimeout = this.authenticationErrorTimeout;
209
204
  }
210
205
  return;
@@ -246,12 +241,20 @@ export class Consumer extends TypedEventEmitter {
246
241
  response: ReceiveMessageCommandOutput
247
242
  ): Promise<void> {
248
243
  if (hasMessages(response)) {
244
+ const handlerProcessingDebugger = setInterval(() => {
245
+ logger.debug('handler_processing', {
246
+ detail: 'The handler is still processing the message(s)...'
247
+ });
248
+ }, 1000);
249
+
249
250
  if (this.handleMessageBatch) {
250
251
  await this.processMessageBatch(response.Messages);
251
252
  } else {
252
253
  await Promise.all(response.Messages.map(this.processMessage));
253
254
  }
254
255
 
256
+ clearInterval(handlerProcessingDebugger);
257
+
255
258
  this.emit('response_processed');
256
259
  } else if (response) {
257
260
  this.emit('empty');
@@ -287,7 +290,9 @@ export class Consumer extends TypedEventEmitter {
287
290
  await this.changeVisibilityTimeout(message, 0);
288
291
  }
289
292
  } finally {
290
- clearInterval(heartbeatTimeoutId);
293
+ if (this.heartbeatInterval) {
294
+ clearInterval(heartbeatTimeoutId);
295
+ }
291
296
  }
292
297
  }
293
298
 
@@ -462,12 +467,13 @@ export class Consumer extends TypedEventEmitter {
462
467
  */
463
468
  private async deleteMessage(message: Message): Promise<void> {
464
469
  if (!this.shouldDeleteMessages) {
465
- debug(
466
- 'Skipping message delete since shouldDeleteMessages is set to false'
467
- );
470
+ logger.debug('skipping_delete', {
471
+ detail:
472
+ 'Skipping message delete since shouldDeleteMessages is set to false'
473
+ });
468
474
  return;
469
475
  }
470
- debug('Deleting message %s', message.MessageId);
476
+ logger.debug('deleting_message', { messageId: message.MessageId });
471
477
 
472
478
  const deleteParams: DeleteMessageCommandInput = {
473
479
  QueueUrl: this.queueUrl,
@@ -490,15 +496,15 @@ export class Consumer extends TypedEventEmitter {
490
496
  */
491
497
  private async deleteMessageBatch(messages: Message[]): Promise<void> {
492
498
  if (!this.shouldDeleteMessages) {
493
- debug(
494
- 'Skipping message delete since shouldDeleteMessages is set to false'
495
- );
499
+ logger.debug('skipping_delete', {
500
+ detail:
501
+ 'Skipping message delete since shouldDeleteMessages is set to false'
502
+ });
496
503
  return;
497
504
  }
498
- debug(
499
- 'Deleting messages %s',
500
- messages.map((msg) => msg.MessageId).join(' ,')
501
- );
505
+ logger.debug('deleting_messages', {
506
+ messageIds: messages.map((msg) => msg.MessageId)
507
+ });
502
508
 
503
509
  const deleteParams: DeleteMessageBatchCommandInput = {
504
510
  QueueUrl: this.queueUrl,
package/src/emitter.ts ADDED
@@ -0,0 +1,37 @@
1
+ import { EventEmitter } from 'events';
2
+
3
+ import { logger } from './logger';
4
+ import { Events } from './types';
5
+
6
+ export class TypedEventEmitter extends EventEmitter {
7
+ /**
8
+ * Trigger a listener on all emitted events
9
+ * @param event The name of the event to listen to
10
+ * @param listener A function to trigger when the event is emitted
11
+ */
12
+ on<E extends keyof Events>(
13
+ event: E,
14
+ listener: (...args: Events[E]) => void
15
+ ): this {
16
+ return super.on(event, listener);
17
+ }
18
+ /**
19
+ * Trigger a listener only once for an emitted event
20
+ * @param event The name of the event to listen to
21
+ * @param listener A function to trigger when the event is emitted
22
+ */
23
+ once<E extends keyof Events>(
24
+ event: E,
25
+ listener: (...args: Events[E]) => void
26
+ ): this {
27
+ return super.once(event, listener);
28
+ }
29
+ /**
30
+ * Emits an event with the provided arguments
31
+ * @param event The name of the event to emit
32
+ */
33
+ emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean {
34
+ logger.debug(event, ...args);
35
+ return super.emit(event, ...args);
36
+ }
37
+ }
package/src/logger.ts ADDED
@@ -0,0 +1,5 @@
1
+ const debug = require('debug')('sqs-consumer');
2
+
3
+ export const logger = {
4
+ debug
5
+ };
package/src/types.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { SQSClient, Message } from '@aws-sdk/client-sqs';
2
- import { EventEmitter } from 'events';
3
2
 
4
3
  export interface ConsumerOptions {
5
4
  /**
@@ -170,38 +169,6 @@ export interface Events {
170
169
  option_updated: [UpdatableOptions, ConsumerOptions[UpdatableOptions]];
171
170
  }
172
171
 
173
- export class TypedEventEmitter extends EventEmitter {
174
- /**
175
- * Trigger a listener on all emitted events
176
- * @param event The name of the event to listen to
177
- * @param listener A function to trigger when the event is emitted
178
- */
179
- on<E extends keyof Events>(
180
- event: E,
181
- listener: (...args: Events[E]) => void
182
- ): this {
183
- return super.on(event, listener);
184
- }
185
- /**
186
- * Trigger a listener only once for an emitted event
187
- * @param event The name of the event to listen to
188
- * @param listener A function to trigger when the event is emitted
189
- */
190
- once<E extends keyof Events>(
191
- event: E,
192
- listener: (...args: Events[E]) => void
193
- ): this {
194
- return super.once(event, listener);
195
- }
196
- /**
197
- * Emits an event with the provided arguments
198
- * @param event The name of the event to emit
199
- */
200
- emit<E extends keyof Events>(event: E, ...args: Events[E]): boolean {
201
- return super.emit(event, ...args);
202
- }
203
- }
204
-
205
172
  export type AWSError = {
206
173
  /**
207
174
  * Name, eg. ConditionalCheckFailedException