cyclone_lariat 0.4.0 → 1.0.0.rc2
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.
- checksums.yaml +5 -5
 - data/.github/workflows/gem-push.yml +4 -4
 - data/.rubocop.yml +9 -5
 - data/CHANGELOG.md +7 -1
 - data/Gemfile.lock +123 -21
 - data/Guardfile +42 -0
 - data/README.md +420 -223
 - data/bin/cyclone_lariat +75 -43
 - data/cyclone_lariat.gemspec +10 -3
 - data/lib/cyclone_lariat/clients/abstract.rb +40 -0
 - data/lib/cyclone_lariat/clients/sns.rb +163 -0
 - data/lib/cyclone_lariat/clients/sqs.rb +114 -0
 - data/lib/cyclone_lariat/core.rb +21 -0
 - data/lib/cyclone_lariat/errors.rb +16 -0
 - data/lib/cyclone_lariat/fake.rb +19 -0
 - data/lib/cyclone_lariat/generators/command.rb +53 -0
 - data/lib/cyclone_lariat/generators/event.rb +52 -0
 - data/lib/cyclone_lariat/generators/queue.rb +30 -0
 - data/lib/cyclone_lariat/generators/topic.rb +29 -0
 - data/lib/cyclone_lariat/messages/v1/abstract.rb +139 -0
 - data/lib/cyclone_lariat/messages/v1/command.rb +20 -0
 - data/lib/cyclone_lariat/messages/v1/event.rb +20 -0
 - data/lib/cyclone_lariat/messages/v1/validator.rb +31 -0
 - data/lib/cyclone_lariat/messages/v2/abstract.rb +149 -0
 - data/lib/cyclone_lariat/messages/v2/command.rb +20 -0
 - data/lib/cyclone_lariat/messages/v2/event.rb +20 -0
 - data/lib/cyclone_lariat/messages/v2/validator.rb +39 -0
 - data/lib/cyclone_lariat/middleware.rb +9 -6
 - data/lib/cyclone_lariat/migration.rb +54 -117
 - data/lib/cyclone_lariat/options.rb +52 -0
 - data/lib/cyclone_lariat/presenters/graph.rb +54 -0
 - data/lib/cyclone_lariat/presenters/queues.rb +41 -0
 - data/lib/cyclone_lariat/presenters/subscriptions.rb +34 -0
 - data/lib/cyclone_lariat/presenters/topics.rb +40 -0
 - data/lib/cyclone_lariat/publisher.rb +25 -0
 - data/lib/cyclone_lariat/repo/active_record/messages.rb +92 -0
 - data/lib/cyclone_lariat/repo/active_record/versions.rb +28 -0
 - data/lib/cyclone_lariat/repo/messages.rb +43 -0
 - data/lib/cyclone_lariat/repo/messages_mapper.rb +49 -0
 - data/lib/cyclone_lariat/repo/sequel/messages.rb +73 -0
 - data/lib/cyclone_lariat/repo/sequel/versions.rb +28 -0
 - data/lib/cyclone_lariat/repo/versions.rb +42 -0
 - data/lib/cyclone_lariat/resources/queue.rb +167 -0
 - data/lib/cyclone_lariat/resources/topic.rb +132 -0
 - data/lib/cyclone_lariat/services/migrate.rb +51 -0
 - data/lib/cyclone_lariat/services/rollback.rb +51 -0
 - data/lib/cyclone_lariat/version.rb +1 -1
 - data/lib/cyclone_lariat.rb +5 -11
 - data/lib/tasks/console.rake +1 -1
 - data/lib/tasks/cyclone_lariat.rake +10 -12
 - data/lib/tasks/db.rake +0 -15
 - metadata +127 -27
 - data/config/db.example.rb +0 -9
 - data/config/initializers/sequel.rb +0 -7
 - data/db/migrate/01_add_uuid_extensions.rb +0 -15
 - data/db/migrate/02_add_events.rb +0 -19
 - data/db/migrate/03_add_versions.rb +0 -9
 - data/docs/_imgs/graphviz_01.png +0 -0
 - data/docs/_imgs/graphviz_02.png +0 -0
 - data/docs/_imgs/graphviz_03.png +0 -0
 - data/docs/_imgs/lariat.jpg +0 -0
 - data/docs/_imgs/logic.png +0 -0
 - data/docs/_imgs/sqs_sns_diagram.png +0 -0
 - data/lib/cyclone_lariat/abstract/client.rb +0 -112
 - data/lib/cyclone_lariat/abstract/message.rb +0 -98
 - data/lib/cyclone_lariat/command.rb +0 -13
 - data/lib/cyclone_lariat/configure.rb +0 -15
 - data/lib/cyclone_lariat/event.rb +0 -13
 - data/lib/cyclone_lariat/messages_mapper.rb +0 -46
 - data/lib/cyclone_lariat/messages_repo.rb +0 -60
 - data/lib/cyclone_lariat/queue.rb +0 -147
 - data/lib/cyclone_lariat/sns_client.rb +0 -149
 - data/lib/cyclone_lariat/sqs_client.rb +0 -93
 - data/lib/cyclone_lariat/topic.rb +0 -113
 
    
        data/lib/cyclone_lariat/queue.rb
    DELETED
    
    | 
         @@ -1,147 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'uri'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            module CycloneLariat
         
     | 
| 
       6 
     | 
    
         
            -
              class Queue
         
     | 
| 
       7 
     | 
    
         
            -
                SNS_SUFFIX = :queue
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                attr_reader :instance, :kind, :region, :dest, :account_id, :publisher, :type, :fifo, :tags
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                def initialize(instance:, kind:, region:, dest:, account_id:, publisher:, type:, fifo:, tags: nil, name: nil)
         
     | 
| 
       12 
     | 
    
         
            -
                  @instance  = instance
         
     | 
| 
       13 
     | 
    
         
            -
                  @kind      = kind
         
     | 
| 
       14 
     | 
    
         
            -
                  @region    = region
         
     | 
| 
       15 
     | 
    
         
            -
                  @dest      = dest
         
     | 
| 
       16 
     | 
    
         
            -
                  @account_id = account_id
         
     | 
| 
       17 
     | 
    
         
            -
                  @publisher = publisher
         
     | 
| 
       18 
     | 
    
         
            -
                  @type      = type
         
     | 
| 
       19 
     | 
    
         
            -
                  @fifo      = fifo
         
     | 
| 
       20 
     | 
    
         
            -
                  @tags      = tags || default_tags(instance, kind, publisher, type, dest, fifo)
         
     | 
| 
       21 
     | 
    
         
            -
                  @name      = name
         
     | 
| 
       22 
     | 
    
         
            -
                end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                def arn
         
     | 
| 
       25 
     | 
    
         
            -
                  ['arn', 'aws', 'sqs', region, account_id, name].join ':'
         
     | 
| 
       26 
     | 
    
         
            -
                end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                ##
         
     | 
| 
       29 
     | 
    
         
            -
                # Url example:
         
     | 
| 
       30 
     | 
    
         
            -
                #  https://sqs.eu-west-1.amazonaws.com/247606935658/stage-event-queue
         
     | 
| 
       31 
     | 
    
         
            -
                def url
         
     | 
| 
       32 
     | 
    
         
            -
                  "https://sqs.#{region}.amazonaws.com/#{account_id}/#{name}"
         
     | 
| 
       33 
     | 
    
         
            -
                end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                def custom?
         
     | 
| 
       36 
     | 
    
         
            -
                  !standard?
         
     | 
| 
       37 
     | 
    
         
            -
                end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                def standard?
         
     | 
| 
       40 
     | 
    
         
            -
                  instance && kind && publisher && type && true
         
     | 
| 
       41 
     | 
    
         
            -
                end
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                def name
         
     | 
| 
       44 
     | 
    
         
            -
                  @name ||= begin
         
     | 
| 
       45 
     | 
    
         
            -
                    name = [instance, kind, SNS_SUFFIX, publisher, type, dest].compact.join '-'
         
     | 
| 
       46 
     | 
    
         
            -
                    name += '.fifo' if fifo
         
     | 
| 
       47 
     | 
    
         
            -
                    name
         
     | 
| 
       48 
     | 
    
         
            -
                  end
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
                alias to_s name
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                def topic?
         
     | 
| 
       55 
     | 
    
         
            -
                  false
         
     | 
| 
       56 
     | 
    
         
            -
                end
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                def queue?
         
     | 
| 
       59 
     | 
    
         
            -
                  true
         
     | 
| 
       60 
     | 
    
         
            -
                end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                def protocol
         
     | 
| 
       63 
     | 
    
         
            -
                  'sqs'
         
     | 
| 
       64 
     | 
    
         
            -
                end
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                class << self
         
     | 
| 
       67 
     | 
    
         
            -
                  ##
         
     | 
| 
       68 
     | 
    
         
            -
                  # Name example: test-event-queue-cyclone_lariat-note_added.fifo
         
     | 
| 
       69 
     | 
    
         
            -
                  # instance: teste
         
     | 
| 
       70 
     | 
    
         
            -
                  # kind: event
         
     | 
| 
       71 
     | 
    
         
            -
                  # publisher: cyclone_lariat
         
     | 
| 
       72 
     | 
    
         
            -
                  # type: note_added
         
     | 
| 
       73 
     | 
    
         
            -
                  # dest: nil
         
     | 
| 
       74 
     | 
    
         
            -
                  # fifo: true
         
     | 
| 
       75 
     | 
    
         
            -
                  def from_name(name, region:, account_id:)
         
     | 
| 
       76 
     | 
    
         
            -
                    is_fifo_array  = name.split('.')
         
     | 
| 
       77 
     | 
    
         
            -
                    full_name      = is_fifo_array[0]
         
     | 
| 
       78 
     | 
    
         
            -
                    fifo_suffix    = is_fifo_array[-1]
         
     | 
| 
       79 
     | 
    
         
            -
                    suffix_exists  = fifo_suffix != full_name
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                    if suffix_exists && fifo_suffix != 'fifo'
         
     | 
| 
       82 
     | 
    
         
            -
                      raise ArgumentError, "Queue name #{name} consists unexpected suffix #{fifo_suffix}"
         
     | 
| 
       83 
     | 
    
         
            -
                    end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                    fifo        = suffix_exists
         
     | 
| 
       86 
     | 
    
         
            -
                    queue_array = full_name.split('-')
         
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
                    raise ArgumentError, "Topic name should consists `#{SNS_SUFFIX}`" unless queue_array[2] != SNS_SUFFIX
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                    new(
         
     | 
| 
       91 
     | 
    
         
            -
                      instance: queue_array[0], kind: queue_array[1], region: region, dest: queue_array[5],
         
     | 
| 
       92 
     | 
    
         
            -
                      account_id: account_id, publisher: queue_array[3], type: queue_array[4], fifo: fifo, name: name
         
     | 
| 
       93 
     | 
    
         
            -
                    )
         
     | 
| 
       94 
     | 
    
         
            -
                  end
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                  ##
         
     | 
| 
       97 
     | 
    
         
            -
                  # URL example: https://sqs.eu-west-1.amazonaws.com/247606935658/test-event-queue-cyclone_lariat-note_added.fifo
         
     | 
| 
       98 
     | 
    
         
            -
                  # url_array[0]  => https
         
     | 
| 
       99 
     | 
    
         
            -
                  # host_array[0] => sqs
         
     | 
| 
       100 
     | 
    
         
            -
                  # host_array[1] => eu-west-1
         
     | 
| 
       101 
     | 
    
         
            -
                  # url_array[3]  => 247606935658 # account_id
         
     | 
| 
       102 
     | 
    
         
            -
                  # url_array[4]  => test-event-queue-cyclone_lariat-note_added.fifo # name
         
     | 
| 
       103 
     | 
    
         
            -
                  def from_url(url)
         
     | 
| 
       104 
     | 
    
         
            -
                    raise ArgumentError, 'Url is not http format' unless url =~ URI::DEFAULT_PARSER.make_regexp
         
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
                    url_array = url.split('/')
         
     | 
| 
       107 
     | 
    
         
            -
                    raise ArgumentError, 'Url should start from https' unless url_array[0] == 'https:'
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
                    host_array = url_array[2].split('.')
         
     | 
| 
       110 
     | 
    
         
            -
                    raise ArgumentError, 'It is not queue url' unless host_array[0] == 'sqs'
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                    from_name(url_array[4], region: host_array[1], account_id: url_array[3])
         
     | 
| 
       113 
     | 
    
         
            -
                  end
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                  ##
         
     | 
| 
       116 
     | 
    
         
            -
                  # Arn example: "arn:aws:sqs:eu-west-1:247606935658:custom_queue"
         
     | 
| 
       117 
     | 
    
         
            -
                  # arn_array[0] => 'arn'
         
     | 
| 
       118 
     | 
    
         
            -
                  # arn_array[1] => 'aws'
         
     | 
| 
       119 
     | 
    
         
            -
                  # arn_array[2] => 'sqs'
         
     | 
| 
       120 
     | 
    
         
            -
                  # arn_array[3] => 'eu-west-1'     # region
         
     | 
| 
       121 
     | 
    
         
            -
                  # arn_array[4] => '247606935658'  # account_id
         
     | 
| 
       122 
     | 
    
         
            -
                  # arn_array[5] => 'alexey_test2'  # name
         
     | 
| 
       123 
     | 
    
         
            -
                  def from_arn(arn)
         
     | 
| 
       124 
     | 
    
         
            -
                    arn_array = arn.split(':')
         
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
                    raise ArgumentError, "Arn `#{arn}` should consists `arn`" unless arn_array[0] == 'arn'
         
     | 
| 
       127 
     | 
    
         
            -
                    raise ArgumentError, "Arn `#{arn}` should consists `aws`" unless arn_array[1] == 'aws'
         
     | 
| 
       128 
     | 
    
         
            -
                    raise ArgumentError, "Arn `#{arn}` should consists `sqs`" unless arn_array[2] == 'sqs'
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
                    from_name(arn_array[5], region: arn_array[3], account_id: arn_array[4])
         
     | 
| 
       131 
     | 
    
         
            -
                  end
         
     | 
| 
       132 
     | 
    
         
            -
                end
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
                private
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                def default_tags(instance, kind, publisher, type, dest, fifo)
         
     | 
| 
       137 
     | 
    
         
            -
                  {
         
     | 
| 
       138 
     | 
    
         
            -
                    instance: String(instance),
         
     | 
| 
       139 
     | 
    
         
            -
                    kind: String(kind),
         
     | 
| 
       140 
     | 
    
         
            -
                    publisher: String(publisher),
         
     | 
| 
       141 
     | 
    
         
            -
                    type: String(type),
         
     | 
| 
       142 
     | 
    
         
            -
                    dest: dest ? String(dest) : 'undefined',
         
     | 
| 
       143 
     | 
    
         
            -
                    fifo: fifo ? 'true' : 'false'
         
     | 
| 
       144 
     | 
    
         
            -
                  }
         
     | 
| 
       145 
     | 
    
         
            -
                end
         
     | 
| 
       146 
     | 
    
         
            -
              end
         
     | 
| 
       147 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,149 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'aws-sdk-sns'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative 'abstract/client'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative 'topic'
         
     | 
| 
       6 
     | 
    
         
            -
            require_relative 'queue'
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            module CycloneLariat
         
     | 
| 
       9 
     | 
    
         
            -
              class SnsClient < Abstract::Client
         
     | 
| 
       10 
     | 
    
         
            -
                include LunaPark::Extensions::Injector
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                dependency(:aws_client_class) { Aws::SNS::Client }
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                def custom_topic(name)
         
     | 
| 
       15 
     | 
    
         
            -
                  Topic.from_name(name, account_id: account_id, region: region)
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                def topic(type, fifo:, publisher: nil, kind: :event)
         
     | 
| 
       19 
     | 
    
         
            -
                  publisher ||= self.publisher
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                  Topic.new(
         
     | 
| 
       22 
     | 
    
         
            -
                    instance: instance,
         
     | 
| 
       23 
     | 
    
         
            -
                    publisher: publisher,
         
     | 
| 
       24 
     | 
    
         
            -
                    region: region,
         
     | 
| 
       25 
     | 
    
         
            -
                    account_id: account_id,
         
     | 
| 
       26 
     | 
    
         
            -
                    kind: kind,
         
     | 
| 
       27 
     | 
    
         
            -
                    type: type, fifo: fifo
         
     | 
| 
       28 
     | 
    
         
            -
                  )
         
     | 
| 
       29 
     | 
    
         
            -
                end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                def publish(msg, fifo:, topic: nil)
         
     | 
| 
       32 
     | 
    
         
            -
                  topic = topic ? custom_topic(topic) : topic(msg.type, kind: msg.kind, fifo: fifo)
         
     | 
| 
       33 
     | 
    
         
            -
                  aws_client.publish(topic_arn: topic.arn, message: msg.to_json)
         
     | 
| 
       34 
     | 
    
         
            -
                end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                def exists?(topic)
         
     | 
| 
       37 
     | 
    
         
            -
                  raise ArgumentError, 'Should be Topic' unless topic.is_a? Topic
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                  aws_client.get_topic_attributes({ topic_arn: topic.arn }) && true
         
     | 
| 
       40 
     | 
    
         
            -
                rescue Aws::SNS::Errors::NotFound
         
     | 
| 
       41 
     | 
    
         
            -
                  false
         
     | 
| 
       42 
     | 
    
         
            -
                end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                def publish_event(type, fifo:, data: {}, version: self.version, uuid: SecureRandom.uuid, request_id: nil, topic: nil)
         
     | 
| 
       45 
     | 
    
         
            -
                  publish event(type, data: data, version: version, uuid: uuid, request_id: request_id), topic: topic, fifo: fifo
         
     | 
| 
       46 
     | 
    
         
            -
                end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                def publish_command(type, fifo:, data: {}, version: self.version, uuid: SecureRandom.uuid, request_id: nil, topic: nil)
         
     | 
| 
       49 
     | 
    
         
            -
                  publish command(type, data: data, version: version, uuid: uuid, request_id: request_id), topic: topic, fifo: fifo
         
     | 
| 
       50 
     | 
    
         
            -
                end
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                def create(topic)
         
     | 
| 
       53 
     | 
    
         
            -
                  raise ArgumentError, 'Should be Topic' unless topic.is_a? Topic
         
     | 
| 
       54 
     | 
    
         
            -
                  raise Errors::TopicAlreadyExists.new(expected_topic: topic.name) if exists?(topic)
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                  aws_client.create_topic(name: topic.name, attributes: topic.attributes, tags: topic.tags)
         
     | 
| 
       57 
     | 
    
         
            -
                  topic
         
     | 
| 
       58 
     | 
    
         
            -
                end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                def delete(topic)
         
     | 
| 
       61 
     | 
    
         
            -
                  raise ArgumentError, 'Should be Topic' unless topic.is_a? Topic
         
     | 
| 
       62 
     | 
    
         
            -
                  raise Errors::TopicDoesNotExists.new(expected_topic: topic.name) unless exists?(topic)
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                  aws_client.delete_topic topic_arn: topic.arn
         
     | 
| 
       65 
     | 
    
         
            -
                  topic
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                def subscribe(topic:, endpoint:)
         
     | 
| 
       69 
     | 
    
         
            -
                  subscription_arn = find_subscription_arn(topic: topic, endpoint: endpoint)
         
     | 
| 
       70 
     | 
    
         
            -
                  raise Errors::SubscriptionAlreadyExists.new(topic: topic, endpoint: endpoint) if subscription_arn
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                  aws_client.subscribe(
         
     | 
| 
       73 
     | 
    
         
            -
                    {
         
     | 
| 
       74 
     | 
    
         
            -
                      topic_arn: topic.arn,
         
     | 
| 
       75 
     | 
    
         
            -
                      protocol: endpoint.protocol,
         
     | 
| 
       76 
     | 
    
         
            -
                      endpoint: endpoint.arn
         
     | 
| 
       77 
     | 
    
         
            -
                    }
         
     | 
| 
       78 
     | 
    
         
            -
                  )
         
     | 
| 
       79 
     | 
    
         
            -
                end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                def unsubscribe(topic:, endpoint:)
         
     | 
| 
       82 
     | 
    
         
            -
                  subscription_arn = find_subscription_arn(topic: topic, endpoint: endpoint)
         
     | 
| 
       83 
     | 
    
         
            -
                  raise Errors::SubscriptionDoesNotExists.new(topic: topic, endpoint: endpoint) unless subscription_arn
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                  aws_client.unsubscribe(subscription_arn: subscription_arn)
         
     | 
| 
       86 
     | 
    
         
            -
                end
         
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
                def list_all
         
     | 
| 
       89 
     | 
    
         
            -
                  topics = []
         
     | 
| 
       90 
     | 
    
         
            -
                  resp = aws_client.list_topics
         
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
                  loop do
         
     | 
| 
       93 
     | 
    
         
            -
                    resp[:topics].map do |t|
         
     | 
| 
       94 
     | 
    
         
            -
                      topics << Topic.from_arn(t[:topic_arn])
         
     | 
| 
       95 
     | 
    
         
            -
                    end
         
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
                    break if resp[:next_token].nil?
         
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
                    resp = aws_client.list_topics(next_token: resp[:next_token])
         
     | 
| 
       100 
     | 
    
         
            -
                  end
         
     | 
| 
       101 
     | 
    
         
            -
                  topics
         
     | 
| 
       102 
     | 
    
         
            -
                end
         
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
                def list_subscriptions
         
     | 
| 
       105 
     | 
    
         
            -
                  subscriptions = []
         
     | 
| 
       106 
     | 
    
         
            -
                  resp = aws_client.list_subscriptions
         
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
                  loop do
         
     | 
| 
       109 
     | 
    
         
            -
                    resp[:subscriptions].each do |s|
         
     | 
| 
       110 
     | 
    
         
            -
                      endpoint = s.endpoint.split(':')[2] == 'sqs' ? Queue.from_arn(s.endpoint) : Topic.from_arn(s.endpoint)
         
     | 
| 
       111 
     | 
    
         
            -
                      subscriptions << { topic: Topic.from_arn(s.topic_arn), endpoint: endpoint, arn: s.subscription_arn }
         
     | 
| 
       112 
     | 
    
         
            -
                    end
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
                    break if resp[:next_token].nil?
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
                    resp = aws_client.list_subscriptions(next_token: resp[:next_token])
         
     | 
| 
       117 
     | 
    
         
            -
                  end
         
     | 
| 
       118 
     | 
    
         
            -
                  subscriptions
         
     | 
| 
       119 
     | 
    
         
            -
                end
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
                def topic_subscriptions(topic)
         
     | 
| 
       122 
     | 
    
         
            -
                  raise ArgumentError, 'Should be Topic' unless topic.is_a? Topic
         
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
       124 
     | 
    
         
            -
                  subscriptions = []
         
     | 
| 
       125 
     | 
    
         
            -
                  resp = aws_client.list_subscriptions_by_topic(topic_arn: topic.arn)
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                  loop do
         
     | 
| 
       128 
     | 
    
         
            -
                    next_token = resp[:next_token]
         
     | 
| 
       129 
     | 
    
         
            -
                    subscriptions += resp[:subscriptions]
         
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
       131 
     | 
    
         
            -
                    break if next_token.nil?
         
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
                    resp = aws_client.list_subscriptions_by_topic(topic_arn: topic.arn, next_token: next_token)
         
     | 
| 
       134 
     | 
    
         
            -
                  end
         
     | 
| 
       135 
     | 
    
         
            -
                  subscriptions
         
     | 
| 
       136 
     | 
    
         
            -
                end
         
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
                def find_subscription_arn(topic:, endpoint:)
         
     | 
| 
       139 
     | 
    
         
            -
                  raise ArgumentError, 'Should be Topic' unless topic.is_a? Topic
         
     | 
| 
       140 
     | 
    
         
            -
                  raise ArgumentError, 'Endpoint should be Topic or Queue' unless [Topic, Queue].include? endpoint.class
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
                  found_subscription = topic_subscriptions(topic).select do |subscription|
         
     | 
| 
       143 
     | 
    
         
            -
                    subscription.endpoint == endpoint.arn
         
     | 
| 
       144 
     | 
    
         
            -
                  end.first
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
                  found_subscription ? found_subscription.subscription_arn : nil
         
     | 
| 
       147 
     | 
    
         
            -
                end
         
     | 
| 
       148 
     | 
    
         
            -
              end
         
     | 
| 
       149 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,93 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require 'aws-sdk-sqs'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative 'abstract/client'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative 'queue'
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            module CycloneLariat
         
     | 
| 
       8 
     | 
    
         
            -
              class SqsClient < Abstract::Client
         
     | 
| 
       9 
     | 
    
         
            -
                include LunaPark::Extensions::Injector
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                dependency(:aws_client_class) { Aws::SQS::Client }
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                def custom_queue(name)
         
     | 
| 
       14 
     | 
    
         
            -
                  Queue.from_name(name, account_id: account_id, region: region)
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                def queue(type = :all, fifo:, dest: nil, publisher: nil, kind: :event)
         
     | 
| 
       18 
     | 
    
         
            -
                  publisher ||= self.publisher
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                  Queue.new(
         
     | 
| 
       21 
     | 
    
         
            -
                    instance: instance, publisher: publisher, region: region,
         
     | 
| 
       22 
     | 
    
         
            -
                    account_id: account_id, kind: kind, type: type, fifo: fifo, dest: dest
         
     | 
| 
       23 
     | 
    
         
            -
                  )
         
     | 
| 
       24 
     | 
    
         
            -
                end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                def get_url(queue)
         
     | 
| 
       27 
     | 
    
         
            -
                  raise ArgumentError, 'Should be queue' unless queue.is_a? Queue
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                  aws_client.get_queue_url(queue_name: queue.to_s).queue_url
         
     | 
| 
       30 
     | 
    
         
            -
                end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                def exists?(queue)
         
     | 
| 
       33 
     | 
    
         
            -
                  raise ArgumentError, 'Should be queue' unless queue.is_a? Queue
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                  get_url(queue) && true
         
     | 
| 
       36 
     | 
    
         
            -
                rescue Aws::SQS::Errors::NonExistentQueue
         
     | 
| 
       37 
     | 
    
         
            -
                  false
         
     | 
| 
       38 
     | 
    
         
            -
                end
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                def publish(msg, fifo:, dest: nil, queue: nil)
         
     | 
| 
       41 
     | 
    
         
            -
                  queue = queue ? custom_queue(queue) : queue(msg.type, kind: msg.kind, fifo: fifo, dest: dest)
         
     | 
| 
       42 
     | 
    
         
            -
                  aws_client.send_message(queue_url: get_url(queue), message_body: msg.to_json)
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                def publish_event(type, fifo:, dest: nil, data: {}, version: self.version, uuid: SecureRandom.uuid, request_id: nil, queue: nil)
         
     | 
| 
       46 
     | 
    
         
            -
                  publish event(type, data: data, version: version, uuid: uuid, request_id: request_id),
         
     | 
| 
       47 
     | 
    
         
            -
                          fifo: fifo, dest: dest, queue: queue
         
     | 
| 
       48 
     | 
    
         
            -
                end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
                def publish_command(type, fifo:, dest: nil, data: {}, version: self.version, uuid: SecureRandom.uuid, request_id: nil, queue: nil)
         
     | 
| 
       51 
     | 
    
         
            -
                  publish command(type, data: data, version: version, uuid: uuid, request_id: request_id),
         
     | 
| 
       52 
     | 
    
         
            -
                          fifo: fifo, dest: dest, queue: queue
         
     | 
| 
       53 
     | 
    
         
            -
                end
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                def create(queue)
         
     | 
| 
       56 
     | 
    
         
            -
                  raise ArgumentError, 'Should be queue' unless queue.is_a? Queue
         
     | 
| 
       57 
     | 
    
         
            -
                  raise Errors::QueueAlreadyExists.new(expected_queue: queue.name) if exists?(queue)
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                  attrs = {}
         
     | 
| 
       60 
     | 
    
         
            -
                  attrs['FifoQueue'] = 'true' if queue.fifo
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
                  aws_client.create_queue(queue_name: queue.name, attributes: attrs, tags: queue.tags)
         
     | 
| 
       63 
     | 
    
         
            -
                  queue
         
     | 
| 
       64 
     | 
    
         
            -
                end
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                def delete(queue)
         
     | 
| 
       67 
     | 
    
         
            -
                  raise ArgumentError, 'Should be queue' unless queue.is_a? Queue
         
     | 
| 
       68 
     | 
    
         
            -
                  raise Errors::QueueDoesNotExists.new(expected_queue: queue.name) unless exists?(queue)
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                  aws_client.delete_queue queue_url: queue.url
         
     | 
| 
       71 
     | 
    
         
            -
                  queue
         
     | 
| 
       72 
     | 
    
         
            -
                end
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                def list_all
         
     | 
| 
       75 
     | 
    
         
            -
                  queues = []
         
     | 
| 
       76 
     | 
    
         
            -
                  resp = aws_client.list_queues
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                  loop do
         
     | 
| 
       79 
     | 
    
         
            -
                    next_token = resp[:next_token]
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                    resp[:queue_urls].map do |url|
         
     | 
| 
       82 
     | 
    
         
            -
                      queues << Queue.from_url(url)
         
     | 
| 
       83 
     | 
    
         
            -
                    end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                    break if next_token.nil?
         
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
                    resp = aws_client.list_queues(next_token: next_token)
         
     | 
| 
       88 
     | 
    
         
            -
                  end
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                  queues
         
     | 
| 
       91 
     | 
    
         
            -
                end
         
     | 
| 
       92 
     | 
    
         
            -
              end
         
     | 
| 
       93 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/cyclone_lariat/topic.rb
    DELETED
    
    | 
         @@ -1,113 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # frozen_string_literal: true
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module CycloneLariat
         
     | 
| 
       4 
     | 
    
         
            -
              class Topic
         
     | 
| 
       5 
     | 
    
         
            -
                SNS_SUFFIX = :fanout
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                attr_reader :instance, :kind, :region, :account_id, :publisher, :type, :fifo, :tags
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                def initialize(instance:, kind:, region:, account_id:, publisher:, type:, fifo:, tags: nil, name: nil)
         
     | 
| 
       10 
     | 
    
         
            -
                  @instance  = instance
         
     | 
| 
       11 
     | 
    
         
            -
                  @kind      = kind
         
     | 
| 
       12 
     | 
    
         
            -
                  @region    = region
         
     | 
| 
       13 
     | 
    
         
            -
                  @account_id = account_id
         
     | 
| 
       14 
     | 
    
         
            -
                  @publisher = publisher
         
     | 
| 
       15 
     | 
    
         
            -
                  @type      = type
         
     | 
| 
       16 
     | 
    
         
            -
                  @fifo      = fifo
         
     | 
| 
       17 
     | 
    
         
            -
                  @tags      = tags || default_tags(instance, kind, publisher, type, fifo)
         
     | 
| 
       18 
     | 
    
         
            -
                  @name      = name
         
     | 
| 
       19 
     | 
    
         
            -
                end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                def arn
         
     | 
| 
       22 
     | 
    
         
            -
                  ['arn', 'aws', 'sns', region, account_id, to_s].join ':'
         
     | 
| 
       23 
     | 
    
         
            -
                end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                def custom?
         
     | 
| 
       26 
     | 
    
         
            -
                  !standard?
         
     | 
| 
       27 
     | 
    
         
            -
                end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                def standard?
         
     | 
| 
       30 
     | 
    
         
            -
                  instance && kind && publisher && type && true
         
     | 
| 
       31 
     | 
    
         
            -
                end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                def name
         
     | 
| 
       34 
     | 
    
         
            -
                  @name ||= begin
         
     | 
| 
       35 
     | 
    
         
            -
                    name = [instance, kind, SNS_SUFFIX, publisher, type].join '-'
         
     | 
| 
       36 
     | 
    
         
            -
                    name += '.fifo' if fifo
         
     | 
| 
       37 
     | 
    
         
            -
                    name
         
     | 
| 
       38 
     | 
    
         
            -
                  end
         
     | 
| 
       39 
     | 
    
         
            -
                end
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                def attributes
         
     | 
| 
       42 
     | 
    
         
            -
                  fifo ? { 'FifoTopic' => 'true' } : {}
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                def topic?
         
     | 
| 
       46 
     | 
    
         
            -
                  true
         
     | 
| 
       47 
     | 
    
         
            -
                end
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                def queue?
         
     | 
| 
       50 
     | 
    
         
            -
                  false
         
     | 
| 
       51 
     | 
    
         
            -
                end
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                def protocol
         
     | 
| 
       54 
     | 
    
         
            -
                  'sns'
         
     | 
| 
       55 
     | 
    
         
            -
                end
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                alias to_s name
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                def ==(other)
         
     | 
| 
       60 
     | 
    
         
            -
                  arn == other.arn
         
     | 
| 
       61 
     | 
    
         
            -
                end
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
                class << self
         
     | 
| 
       64 
     | 
    
         
            -
                  def from_name(name, region:, account_id:)
         
     | 
| 
       65 
     | 
    
         
            -
                    is_fifo_array  = name.split('.')
         
     | 
| 
       66 
     | 
    
         
            -
                    full_name      = is_fifo_array[0]
         
     | 
| 
       67 
     | 
    
         
            -
                    fifo_suffix    = is_fifo_array[-1]
         
     | 
| 
       68 
     | 
    
         
            -
                    suffix_exists  = fifo_suffix != full_name
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                    if suffix_exists && fifo_suffix != 'fifo'
         
     | 
| 
       71 
     | 
    
         
            -
                      raise ArgumentError, "Topic name #{name} consists unexpected suffix #{fifo_suffix}"
         
     | 
| 
       72 
     | 
    
         
            -
                    end
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                    fifo = suffix_exists
         
     | 
| 
       75 
     | 
    
         
            -
                    topic_array = full_name.split('-')
         
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                    raise ArgumentError, "Topic name should consists `#{SNS_SUFFIX}`" unless topic_array[2] != SNS_SUFFIX
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                    new(
         
     | 
| 
       80 
     | 
    
         
            -
                      instance: topic_array[0],
         
     | 
| 
       81 
     | 
    
         
            -
                      kind: topic_array[1],
         
     | 
| 
       82 
     | 
    
         
            -
                      publisher: topic_array[3],
         
     | 
| 
       83 
     | 
    
         
            -
                      type: topic_array[4],
         
     | 
| 
       84 
     | 
    
         
            -
                      region: region,
         
     | 
| 
       85 
     | 
    
         
            -
                      account_id: account_id,
         
     | 
| 
       86 
     | 
    
         
            -
                      fifo: fifo,
         
     | 
| 
       87 
     | 
    
         
            -
                      name: name
         
     | 
| 
       88 
     | 
    
         
            -
                    )
         
     | 
| 
       89 
     | 
    
         
            -
                  end
         
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
                  def from_arn(arn)
         
     | 
| 
       92 
     | 
    
         
            -
                    arn_array = arn.split(':')
         
     | 
| 
       93 
     | 
    
         
            -
                    raise ArgumentError, 'Arn should consists `arn`' unless arn_array[0] == 'arn'
         
     | 
| 
       94 
     | 
    
         
            -
                    raise ArgumentError, 'Arn should consists `aws`' unless arn_array[1] == 'aws'
         
     | 
| 
       95 
     | 
    
         
            -
                    raise ArgumentError, 'Arn should consists `sns`' unless arn_array[2] == 'sns'
         
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
                    from_name(arn_array[5], region: arn_array[3], account_id: arn_array[4])
         
     | 
| 
       98 
     | 
    
         
            -
                  end
         
     | 
| 
       99 
     | 
    
         
            -
                end
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
     | 
    
         
            -
                private
         
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
                def default_tags(instance, kind, publisher, type, fifo)
         
     | 
| 
       104 
     | 
    
         
            -
                  [
         
     | 
| 
       105 
     | 
    
         
            -
                    { key: 'instance',  value: String(instance) },
         
     | 
| 
       106 
     | 
    
         
            -
                    { key: 'kind',      value: String(kind) },
         
     | 
| 
       107 
     | 
    
         
            -
                    { key: 'publisher', value: String(publisher) },
         
     | 
| 
       108 
     | 
    
         
            -
                    { key: 'type',      value: String(type) },
         
     | 
| 
       109 
     | 
    
         
            -
                    { key: 'fifo',      value: fifo ? 'true' : 'false' }
         
     | 
| 
       110 
     | 
    
         
            -
                  ]
         
     | 
| 
       111 
     | 
    
         
            -
                end
         
     | 
| 
       112 
     | 
    
         
            -
              end
         
     | 
| 
       113 
     | 
    
         
            -
            end
         
     |