aws-sdk-sqs 1.63.0 → 1.70.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.
@@ -32,8 +32,8 @@ module Aws::SQS
32
32
  raise ArgumentError, "FIPS and DualStack are enabled, but this partition does not support one or both"
33
33
  end
34
34
  if Aws::Endpoints::Matchers.boolean_equals?(use_fips, true)
35
- if Aws::Endpoints::Matchers.boolean_equals?(true, Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS"))
36
- if Aws::Endpoints::Matchers.string_equals?("aws-us-gov", Aws::Endpoints::Matchers.attr(partition_result, "name"))
35
+ if Aws::Endpoints::Matchers.boolean_equals?(Aws::Endpoints::Matchers.attr(partition_result, "supportsFIPS"), true)
36
+ if Aws::Endpoints::Matchers.string_equals?(Aws::Endpoints::Matchers.attr(partition_result, "name"), "aws-us-gov")
37
37
  return Aws::Endpoints::Endpoint.new(url: "https://sqs.#{region}.amazonaws.com", headers: {}, properties: {})
38
38
  end
39
39
  return Aws::Endpoints::Endpoint.new(url: "https://sqs-fips.#{region}.#{partition_result['dnsSuffix']}", headers: {}, properties: {})
@@ -30,10 +30,20 @@ module Aws::SQS
30
30
  # * {BatchEntryIdsNotDistinct}
31
31
  # * {BatchRequestTooLong}
32
32
  # * {EmptyBatchRequest}
33
+ # * {InvalidAddress}
33
34
  # * {InvalidAttributeName}
35
+ # * {InvalidAttributeValue}
34
36
  # * {InvalidBatchEntryId}
35
37
  # * {InvalidIdFormat}
36
38
  # * {InvalidMessageContents}
39
+ # * {InvalidSecurity}
40
+ # * {KmsAccessDenied}
41
+ # * {KmsDisabled}
42
+ # * {KmsInvalidKeyUsage}
43
+ # * {KmsInvalidState}
44
+ # * {KmsNotFound}
45
+ # * {KmsOptInRequired}
46
+ # * {KmsThrottled}
37
47
  # * {MessageNotInflight}
38
48
  # * {OverLimit}
39
49
  # * {PurgeQueueInProgress}
@@ -41,6 +51,7 @@ module Aws::SQS
41
51
  # * {QueueDoesNotExist}
42
52
  # * {QueueNameExists}
43
53
  # * {ReceiptHandleIsInvalid}
54
+ # * {RequestThrottled}
44
55
  # * {ResourceNotFoundException}
45
56
  # * {TooManyEntriesInBatchRequest}
46
57
  # * {UnsupportedOperation}
@@ -59,6 +70,11 @@ module Aws::SQS
59
70
  def initialize(context, message, data = Aws::EmptyStructure.new)
60
71
  super(context, message, data)
61
72
  end
73
+
74
+ # @return [String]
75
+ def message
76
+ @message || @data[:message]
77
+ end
62
78
  end
63
79
 
64
80
  class BatchRequestTooLong < ServiceError
@@ -69,6 +85,11 @@ module Aws::SQS
69
85
  def initialize(context, message, data = Aws::EmptyStructure.new)
70
86
  super(context, message, data)
71
87
  end
88
+
89
+ # @return [String]
90
+ def message
91
+ @message || @data[:message]
92
+ end
72
93
  end
73
94
 
74
95
  class EmptyBatchRequest < ServiceError
@@ -79,6 +100,26 @@ module Aws::SQS
79
100
  def initialize(context, message, data = Aws::EmptyStructure.new)
80
101
  super(context, message, data)
81
102
  end
103
+
104
+ # @return [String]
105
+ def message
106
+ @message || @data[:message]
107
+ end
108
+ end
109
+
110
+ class InvalidAddress < ServiceError
111
+
112
+ # @param [Seahorse::Client::RequestContext] context
113
+ # @param [String] message
114
+ # @param [Aws::SQS::Types::InvalidAddress] data
115
+ def initialize(context, message, data = Aws::EmptyStructure.new)
116
+ super(context, message, data)
117
+ end
118
+
119
+ # @return [String]
120
+ def message
121
+ @message || @data[:message]
122
+ end
82
123
  end
83
124
 
84
125
  class InvalidAttributeName < ServiceError
@@ -89,6 +130,26 @@ module Aws::SQS
89
130
  def initialize(context, message, data = Aws::EmptyStructure.new)
90
131
  super(context, message, data)
91
132
  end
133
+
134
+ # @return [String]
135
+ def message
136
+ @message || @data[:message]
137
+ end
138
+ end
139
+
140
+ class InvalidAttributeValue < ServiceError
141
+
142
+ # @param [Seahorse::Client::RequestContext] context
143
+ # @param [String] message
144
+ # @param [Aws::SQS::Types::InvalidAttributeValue] data
145
+ def initialize(context, message, data = Aws::EmptyStructure.new)
146
+ super(context, message, data)
147
+ end
148
+
149
+ # @return [String]
150
+ def message
151
+ @message || @data[:message]
152
+ end
92
153
  end
93
154
 
94
155
  class InvalidBatchEntryId < ServiceError
@@ -99,6 +160,11 @@ module Aws::SQS
99
160
  def initialize(context, message, data = Aws::EmptyStructure.new)
100
161
  super(context, message, data)
101
162
  end
163
+
164
+ # @return [String]
165
+ def message
166
+ @message || @data[:message]
167
+ end
102
168
  end
103
169
 
104
170
  class InvalidIdFormat < ServiceError
@@ -119,6 +185,131 @@ module Aws::SQS
119
185
  def initialize(context, message, data = Aws::EmptyStructure.new)
120
186
  super(context, message, data)
121
187
  end
188
+
189
+ # @return [String]
190
+ def message
191
+ @message || @data[:message]
192
+ end
193
+ end
194
+
195
+ class InvalidSecurity < ServiceError
196
+
197
+ # @param [Seahorse::Client::RequestContext] context
198
+ # @param [String] message
199
+ # @param [Aws::SQS::Types::InvalidSecurity] data
200
+ def initialize(context, message, data = Aws::EmptyStructure.new)
201
+ super(context, message, data)
202
+ end
203
+
204
+ # @return [String]
205
+ def message
206
+ @message || @data[:message]
207
+ end
208
+ end
209
+
210
+ class KmsAccessDenied < ServiceError
211
+
212
+ # @param [Seahorse::Client::RequestContext] context
213
+ # @param [String] message
214
+ # @param [Aws::SQS::Types::KmsAccessDenied] data
215
+ def initialize(context, message, data = Aws::EmptyStructure.new)
216
+ super(context, message, data)
217
+ end
218
+
219
+ # @return [String]
220
+ def message
221
+ @message || @data[:message]
222
+ end
223
+ end
224
+
225
+ class KmsDisabled < ServiceError
226
+
227
+ # @param [Seahorse::Client::RequestContext] context
228
+ # @param [String] message
229
+ # @param [Aws::SQS::Types::KmsDisabled] data
230
+ def initialize(context, message, data = Aws::EmptyStructure.new)
231
+ super(context, message, data)
232
+ end
233
+
234
+ # @return [String]
235
+ def message
236
+ @message || @data[:message]
237
+ end
238
+ end
239
+
240
+ class KmsInvalidKeyUsage < ServiceError
241
+
242
+ # @param [Seahorse::Client::RequestContext] context
243
+ # @param [String] message
244
+ # @param [Aws::SQS::Types::KmsInvalidKeyUsage] data
245
+ def initialize(context, message, data = Aws::EmptyStructure.new)
246
+ super(context, message, data)
247
+ end
248
+
249
+ # @return [String]
250
+ def message
251
+ @message || @data[:message]
252
+ end
253
+ end
254
+
255
+ class KmsInvalidState < ServiceError
256
+
257
+ # @param [Seahorse::Client::RequestContext] context
258
+ # @param [String] message
259
+ # @param [Aws::SQS::Types::KmsInvalidState] data
260
+ def initialize(context, message, data = Aws::EmptyStructure.new)
261
+ super(context, message, data)
262
+ end
263
+
264
+ # @return [String]
265
+ def message
266
+ @message || @data[:message]
267
+ end
268
+ end
269
+
270
+ class KmsNotFound < ServiceError
271
+
272
+ # @param [Seahorse::Client::RequestContext] context
273
+ # @param [String] message
274
+ # @param [Aws::SQS::Types::KmsNotFound] data
275
+ def initialize(context, message, data = Aws::EmptyStructure.new)
276
+ super(context, message, data)
277
+ end
278
+
279
+ # @return [String]
280
+ def message
281
+ @message || @data[:message]
282
+ end
283
+ end
284
+
285
+ class KmsOptInRequired < ServiceError
286
+
287
+ # @param [Seahorse::Client::RequestContext] context
288
+ # @param [String] message
289
+ # @param [Aws::SQS::Types::KmsOptInRequired] data
290
+ def initialize(context, message, data = Aws::EmptyStructure.new)
291
+ super(context, message, data)
292
+ end
293
+
294
+ # @return [String]
295
+ def message
296
+ @message || @data[:message]
297
+ end
298
+ end
299
+
300
+ class KmsThrottled < ServiceError
301
+
302
+ # @param [Seahorse::Client::RequestContext] context
303
+ # @param [String] message
304
+ # @param [Aws::SQS::Types::KmsThrottled] data
305
+ def initialize(context, message, data = Aws::EmptyStructure.new)
306
+ super(context, message, data)
307
+ end
308
+
309
+ # @return [String]
310
+ def message
311
+ @message || @data[:message]
312
+ end
122
313
  end
123
314
 
124
315
  class MessageNotInflight < ServiceError
@@ -139,6 +330,11 @@ module Aws::SQS
139
330
  def initialize(context, message, data = Aws::EmptyStructure.new)
140
331
  super(context, message, data)
141
332
  end
333
+
334
+ # @return [String]
335
+ def message
336
+ @message || @data[:message]
337
+ end
142
338
  end
143
339
 
144
340
  class PurgeQueueInProgress < ServiceError
@@ -149,6 +345,11 @@ module Aws::SQS
149
345
  def initialize(context, message, data = Aws::EmptyStructure.new)
150
346
  super(context, message, data)
151
347
  end
348
+
349
+ # @return [String]
350
+ def message
351
+ @message || @data[:message]
352
+ end
152
353
  end
153
354
 
154
355
  class QueueDeletedRecently < ServiceError
@@ -159,6 +360,11 @@ module Aws::SQS
159
360
  def initialize(context, message, data = Aws::EmptyStructure.new)
160
361
  super(context, message, data)
161
362
  end
363
+
364
+ # @return [String]
365
+ def message
366
+ @message || @data[:message]
367
+ end
162
368
  end
163
369
 
164
370
  class QueueDoesNotExist < ServiceError
@@ -169,6 +375,11 @@ module Aws::SQS
169
375
  def initialize(context, message, data = Aws::EmptyStructure.new)
170
376
  super(context, message, data)
171
377
  end
378
+
379
+ # @return [String]
380
+ def message
381
+ @message || @data[:message]
382
+ end
172
383
  end
173
384
 
174
385
  class QueueNameExists < ServiceError
@@ -179,6 +390,11 @@ module Aws::SQS
179
390
  def initialize(context, message, data = Aws::EmptyStructure.new)
180
391
  super(context, message, data)
181
392
  end
393
+
394
+ # @return [String]
395
+ def message
396
+ @message || @data[:message]
397
+ end
182
398
  end
183
399
 
184
400
  class ReceiptHandleIsInvalid < ServiceError
@@ -189,6 +405,26 @@ module Aws::SQS
189
405
  def initialize(context, message, data = Aws::EmptyStructure.new)
190
406
  super(context, message, data)
191
407
  end
408
+
409
+ # @return [String]
410
+ def message
411
+ @message || @data[:message]
412
+ end
413
+ end
414
+
415
+ class RequestThrottled < ServiceError
416
+
417
+ # @param [Seahorse::Client::RequestContext] context
418
+ # @param [String] message
419
+ # @param [Aws::SQS::Types::RequestThrottled] data
420
+ def initialize(context, message, data = Aws::EmptyStructure.new)
421
+ super(context, message, data)
422
+ end
423
+
424
+ # @return [String]
425
+ def message
426
+ @message || @data[:message]
427
+ end
192
428
  end
193
429
 
194
430
  class ResourceNotFoundException < ServiceError
@@ -199,6 +435,11 @@ module Aws::SQS
199
435
  def initialize(context, message, data = Aws::EmptyStructure.new)
200
436
  super(context, message, data)
201
437
  end
438
+
439
+ # @return [String]
440
+ def message
441
+ @message || @data[:message]
442
+ end
202
443
  end
203
444
 
204
445
  class TooManyEntriesInBatchRequest < ServiceError
@@ -209,6 +450,11 @@ module Aws::SQS
209
450
  def initialize(context, message, data = Aws::EmptyStructure.new)
210
451
  super(context, message, data)
211
452
  end
453
+
454
+ # @return [String]
455
+ def message
456
+ @message || @data[:message]
457
+ end
212
458
  end
213
459
 
214
460
  class UnsupportedOperation < ServiceError
@@ -219,6 +465,11 @@ module Aws::SQS
219
465
  def initialize(context, message, data = Aws::EmptyStructure.new)
220
466
  super(context, message, data)
221
467
  end
468
+
469
+ # @return [String]
470
+ def message
471
+ @message || @data[:message]
472
+ end
222
473
  end
223
474
 
224
475
  end
@@ -14,6 +14,7 @@ module Aws::SQS
14
14
  option(
15
15
  :endpoint_provider,
16
16
  doc_type: 'Aws::SQS::EndpointProvider',
17
+ rbs_type: 'untyped',
17
18
  docstring: 'The endpoint provider used to resolve endpoints. Any '\
18
19
  'object that responds to `#resolve_endpoint(parameters)` '\
19
20
  'where `parameters` is a Struct similar to '\
@@ -25,16 +26,17 @@ module Aws::SQS
25
26
  # @api private
26
27
  class Handler < Seahorse::Client::Handler
27
28
  def call(context)
28
- # If endpoint was discovered, do not resolve or apply the endpoint.
29
29
  unless context[:discovered_endpoint]
30
30
  params = parameters_for_operation(context)
31
31
  endpoint = context.config.endpoint_provider.resolve_endpoint(params)
32
32
 
33
33
  context.http_request.endpoint = endpoint.url
34
34
  apply_endpoint_headers(context, endpoint.headers)
35
+
36
+ context[:endpoint_params] = params
37
+ context[:endpoint_properties] = endpoint.properties
35
38
  end
36
39
 
37
- context[:endpoint_params] = params
38
40
  context[:auth_scheme] =
39
41
  Aws::Endpoints.resolve_auth_scheme(context, endpoint)
40
42
 
@@ -4,7 +4,6 @@ require 'set'
4
4
 
5
5
  module Aws
6
6
  module SQS
7
-
8
7
  # A utility class for long polling messages in a loop. **Messages are
9
8
  # automatically deleted from the queue at the end of the given block.**
10
9
  #
@@ -181,6 +180,16 @@ module Aws
181
180
  # end
182
181
  # ```
183
182
  #
183
+ # * Configure an {#after_empty_receive} callback.
184
+ #
185
+ # ```
186
+ # poller.after_empty_receive do |stats|
187
+ # logger.info("requests: #{stats.request_count}")
188
+ # logger.info("messages: #{stats.received_message_count}")
189
+ # logger.info("last-timestamp: #{stats.last_message_received_at}")
190
+ # end
191
+ # ```
192
+ #
184
193
  # * Accept a 2nd argument in the poll block, for example:
185
194
  #
186
195
  # ```
@@ -203,7 +212,6 @@ module Aws
203
212
  # ```
204
213
  #
205
214
  class QueuePoller
206
-
207
215
  # @param [String] queue_url
208
216
  # @option options [Client] :client
209
217
  # @option (see #poll)
@@ -258,6 +266,21 @@ module Aws
258
266
  @default_config = @default_config.with(before_request: block) if block_given?
259
267
  end
260
268
 
269
+ # Registers a callback that is invoked when the poll requests returns with no messages.
270
+ # This callback is invoked after the idle timeout is checked.
271
+ #
272
+ # poller.after_empty_receive do |stats|
273
+ # # Handle empty receive
274
+ # end
275
+ #
276
+ # @yieldparam [PollerStats] stats An object that tracks a few
277
+ # client-side statistics about the queue polling.
278
+ #
279
+ # @return [void]
280
+ def after_empty_receive(&block)
281
+ @default_config = @default_config.with(after_empty_receive: block) if block_given?
282
+ end
283
+
261
284
  # Polls the queue, yielded a message, or an array of messages.
262
285
  # Messages are automatically deleted from the queue at the
263
286
  # end of the given block. See the class documentation on
@@ -333,7 +356,8 @@ module Aws
333
356
  loop do
334
357
  messages = get_messages(config, stats)
335
358
  if messages.empty?
336
- check_idle_timeout(config, stats, messages)
359
+ check_idle_timeout(config, stats)
360
+ config.after_empty_receive&.call(stats)
337
361
  else
338
362
  process_messages(config, stats, messages, &block)
339
363
  end
@@ -348,21 +372,21 @@ module Aws
348
372
  # `#receipt_handle`.
349
373
  # @param [Integer] seconds
350
374
  def change_message_visibility_timeout(message, seconds)
351
- @client.change_message_visibility({
375
+ @client.change_message_visibility(
352
376
  queue_url: @queue_url,
353
377
  receipt_handle: message.receipt_handle,
354
- visibility_timeout: seconds,
355
- })
378
+ visibility_timeout: seconds
379
+ )
356
380
  end
357
381
 
358
382
  # @note This method should be called from inside a {#poll} block.
359
383
  # @param [#receipt_handle] message An object that responds to
360
384
  # `#receipt_handle`.
361
385
  def delete_message(message)
362
- @client.delete_message({
386
+ @client.delete_message(
363
387
  queue_url: @queue_url,
364
- receipt_handle: message.receipt_handle,
365
- })
388
+ receipt_handle: message.receipt_handle
389
+ )
366
390
  end
367
391
 
368
392
  # @note This method should be called from inside a {#poll} block.
@@ -372,16 +396,16 @@ module Aws
372
396
  def delete_messages(messages)
373
397
  @client.delete_message_batch(
374
398
  queue_url: @queue_url,
375
- entries: messages.map { |msg|
399
+ entries: messages.map do |msg|
376
400
  { id: msg.message_id, receipt_handle: msg.receipt_handle }
377
- }
401
+ end
378
402
  )
379
403
  end
380
404
 
381
405
  private
382
406
 
383
407
  def get_messages(config, stats)
384
- config.before_request.call(stats) if config.before_request
408
+ config.before_request&.call(stats)
385
409
  messages = send_request(config).messages
386
410
  stats.request_count += 1
387
411
  messages
@@ -392,17 +416,22 @@ module Aws
392
416
  @client.receive_message(params)
393
417
  end
394
418
 
395
- def check_idle_timeout(config, stats, messages)
396
- if config.idle_timeout
397
- since = stats.last_message_received_at || stats.polling_started_at
398
- idle_time = Time.now - since
399
- throw :stop_polling if idle_time > config.idle_timeout
400
- end
419
+ def check_idle_timeout(config, stats)
420
+ return unless config.idle_timeout
421
+
422
+ since = stats.last_message_received_at || stats.polling_started_at
423
+ idle_time = Time.now - since
424
+ throw :stop_polling if idle_time > config.idle_timeout
401
425
  end
402
426
 
403
427
  def process_messages(config, stats, messages, &block)
404
428
  stats.received_message_count += messages.count
405
429
  stats.last_message_received_at = Time.now
430
+
431
+ # duplicated messages will have a different receipt handle
432
+ # so we need to provide the most recent receipt to
433
+ # delete a batch - thus, filtering below by message_id
434
+ messages = messages.reverse.uniq(&:message_id).reverse!
406
435
  catch(:skip_delete) do
407
436
  yield_messages(config, messages, stats, &block)
408
437
  delete_messages(messages) unless config.skip_delete
@@ -421,7 +450,6 @@ module Aws
421
450
 
422
451
  # Statistics tracked client-side by the {QueuePoller}.
423
452
  class PollerStats
424
-
425
453
  def initialize
426
454
  @request_count = 0
427
455
  @received_message_count = 0
@@ -444,27 +472,26 @@ module Aws
444
472
 
445
473
  # @return [Time,nil]
446
474
  attr_accessor :polling_stopped_at
447
-
448
475
  end
449
476
 
450
477
  # A read-only set of configuration used by the QueuePoller.
451
478
  class PollerConfig
452
-
453
479
  # @api private
454
- CONFIG_OPTIONS = Set.new([
455
- :idle_timeout,
456
- :skip_delete,
457
- :before_request,
458
- ])
480
+ CONFIG_OPTIONS = Set.new %i[
481
+ idle_timeout
482
+ skip_delete
483
+ before_request
484
+ after_empty_receive
485
+ ]
459
486
 
460
487
  # @api private
461
- PARAM_OPTIONS = Set.new([
462
- :wait_time_seconds,
463
- :max_number_of_messages,
464
- :visibility_timeout,
465
- :attribute_names,
466
- :message_attribute_names,
467
- ])
488
+ PARAM_OPTIONS = Set.new %i[
489
+ wait_time_seconds
490
+ max_number_of_messages
491
+ visibility_timeout
492
+ attribute_names
493
+ message_attribute_names
494
+ ]
468
495
 
469
496
  # @return [Integer,nil]
470
497
  attr_reader :idle_timeout
@@ -475,6 +502,9 @@ module Aws
475
502
  # @return [Proc,nil]
476
503
  attr_reader :before_request
477
504
 
505
+ # @return [Proc,nil]
506
+ attr_reader :after_empty_receive
507
+
478
508
  # @return [Hash]
479
509
  attr_reader :request_params
480
510
 
@@ -482,12 +512,13 @@ module Aws
482
512
  @idle_timeout = nil
483
513
  @skip_delete = false
484
514
  @before_request = nil
515
+ @after_empty_receive = nil
485
516
  @request_params = {
486
517
  wait_time_seconds: 20,
487
518
  max_number_of_messages: 1,
488
519
  visibility_timeout: nil,
489
520
  attribute_names: ['All'],
490
- message_attribute_names: ['All'],
521
+ message_attribute_names: ['All']
491
522
  }
492
523
  options.each do |opt_name, value|
493
524
  if CONFIG_OPTIONS.include?(opt_name)
@@ -522,7 +553,6 @@ module Aws
522
553
  PARAM_OPTIONS.each { |key| hash[key] = @request_params[key] }
523
554
  hash
524
555
  end
525
-
526
556
  end
527
557
  end
528
558
  end