pubnub 5.3.5 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86c7cc7a030addfbffc036f0aad24012009e7299a2dd7b64dcf6555db3967516
4
- data.tar.gz: 527ccc89a82801ab418c32907fc4df3333f3605794b3124445aafa647864275a
3
+ metadata.gz: 29d9b1bf2b58050bd99d049ea2416ff1cfe3cd92ee813e335a54b3ca2e9ee7ac
4
+ data.tar.gz: 274b127f964ad0059b3edbf152397e761c4437206b08f98a8b61b95081e96a16
5
5
  SHA512:
6
- metadata.gz: fca94c169ea327386f48164e7806bac20233da3b8f51d5ff3fcad61acb34dde0c5bec7f074ea0bf9ed72cc33d38b4170e0ad48607d4954ab71981f70365e440a
7
- data.tar.gz: f87ff02c1bca1d1b9cb82be21f159a0af5540237acebef2b36bf034e96f8f083568e262d81964cca5012c5b84f3c4d50aedabc18e997f0f42ebb5672fb5f1990
6
+ metadata.gz: 043f1102de6fa623327a91ba08a4d69a794b5e192970ee8607651f17c20cd0526d6e3dec0aa6cf299c3c6742c3af576e3e89e2664ca0461e8c60cb8d0e79f0cb
7
+ data.tar.gz: d8ad79fedee8ff7dc4bdeac2a044dafa91f8d5c6e67d35827e0e8657b1082cb4996c271feb4e4663497c8b408ade109674034956c522c7ac6663d8837f58ab29
@@ -12,7 +12,7 @@ jobs:
12
12
  name: Process command
13
13
  if: github.event.issue.pull_request && endsWith(github.repository, '-private') != true
14
14
  runs-on:
15
- group: Default
15
+ group: organization/Default
16
16
  steps:
17
17
  - name: Check referred user
18
18
  id: user-check
@@ -10,7 +10,7 @@ jobs:
10
10
  name: Check release required
11
11
  if: ${{ github.event.pull_request.merged && endsWith(github.repository, '-private') != true }}
12
12
  runs-on:
13
- group: Default
13
+ group: organization/Default
14
14
  outputs:
15
15
  release: ${{ steps.check.outputs.ready }}
16
16
  steps:
@@ -31,7 +31,7 @@ jobs:
31
31
  needs: check-release
32
32
  if: ${{ needs.check-release.outputs.release == 'true' }}
33
33
  runs-on:
34
- group: Default
34
+ group: organization/Default
35
35
  steps:
36
36
  - name: Checkout repository
37
37
  uses: actions/checkout@v4
@@ -20,13 +20,13 @@ jobs:
20
20
  tests:
21
21
  name: Integration and Unit tests
22
22
  runs-on:
23
- group: Default
23
+ group: organization/Default
24
24
  env:
25
25
  NO_COVERAGE: true
26
26
  strategy:
27
27
  fail-fast: true
28
28
  matrix:
29
- ruby: [3.0.6, 3.1.4, 3.2.3]
29
+ ruby: [ 3.0.6, 3.1.4, 3.2.3 ]
30
30
  steps:
31
31
  - name: Checkout repository
32
32
  uses: actions/checkout@v4
@@ -52,7 +52,7 @@ jobs:
52
52
  acceptance-tests:
53
53
  name: Acceptance tests
54
54
  runs-on:
55
- group: Default
55
+ group: organization/Default
56
56
  steps:
57
57
  - name: Checkout project
58
58
  uses: actions/checkout@v4
@@ -67,11 +67,15 @@ jobs:
67
67
  uses: ./.github/.release/actions/actions/mock-server
68
68
  with:
69
69
  token: ${{ secrets.GH_TOKEN }}
70
- - name: Setup Ruby 3.0
70
+ - name: Setup Ruby 3.2.2
71
71
  uses: ruby/setup-ruby@v1
72
72
  with:
73
- ruby-version: 3.0
73
+ ruby-version: 3.2.2
74
74
  bundler-cache: true
75
+ - name: Verify Ruby Version
76
+ run: ruby -v
77
+ - name: Check Ruby Version for Bundler
78
+ run: bundle exec ruby -v
75
79
  - name: Run acceptance tests (optional)
76
80
  run: bundle exec cucumber sdk-specifications/features/ -p mock -p run_beta -p report_beta -f pretty
77
81
  continue-on-error: true
@@ -84,7 +88,7 @@ jobs:
84
88
  jrm ./main.xml "./main/**/*.xml" &&
85
89
  jrm ./beta.xml "./beta/**/*.xml"
86
90
  - name: Expose acceptance tests reports
87
- uses: actions/upload-artifact@v3
91
+ uses: actions/upload-artifact@v4
88
92
  if: always()
89
93
  with:
90
94
  name: acceptance-test-reports
@@ -97,9 +101,9 @@ jobs:
97
101
  uses: ./.github/.release/actions/actions/utils/fast-jobs-failure
98
102
  all-tests:
99
103
  name: Tests
100
- needs: [tests, acceptance-tests]
104
+ needs: [ tests, acceptance-tests ]
101
105
  runs-on:
102
- group: Default
106
+ group: organization/Default
103
107
  steps:
104
108
  - name: Tests summary
105
109
  run: echo -e "\033[38;2;95;215;0m\033[1mAll tests successfully passed"
@@ -6,7 +6,7 @@ jobs:
6
6
  pubnub-yml:
7
7
  name: "Validate .pubnub.yml"
8
8
  runs-on:
9
- group: Default
9
+ group: organization/Default
10
10
  steps:
11
11
  - name: Checkout project
12
12
  uses: actions/checkout@v4
@@ -28,7 +28,7 @@ jobs:
28
28
  name: Validations
29
29
  needs: [pubnub-yml]
30
30
  runs-on:
31
- group: Default
31
+ group: organization/Default
32
32
  steps:
33
33
  - name: Validations summary
34
34
  run: echo -e "\033[38;2;95;215;0m\033[1mAll validations passed"
data/.pubnub.yml CHANGED
@@ -1,6 +1,21 @@
1
1
  ---
2
- version: "5.3.5"
2
+ version: "5.4.0"
3
3
  changelog:
4
+ - date: 2025-01-07
5
+ version: v5.4.0
6
+ changes:
7
+ - type: feature
8
+ text: "Add batch history support."
9
+ - type: feature
10
+ text: "Add fetch messages with message reactions."
11
+ - type: feature
12
+ text: "Add fetch messages (batch history) endpoint support to fetch history for multiple channels."
13
+ - type: feature
14
+ text: "Add fetch messages with reactions support."
15
+ - type: feature
16
+ text: "Add `include_custom_message_type` support for fetch messages endpoint."
17
+ - type: feature
18
+ text: "Add `custom_message_type` support for `publish` / `signal` and `subscribe` endpoints."
4
19
  - date: 2024-10-09
5
20
  version: v5.3.5
6
21
  changes:
@@ -581,7 +596,7 @@ sdks:
581
596
  - x86-64
582
597
  - distribution-type: package
583
598
  distribution-repository: RubyGems
584
- package-name: pubnub-5.3.5.gem
599
+ package-name: pubnub-5.4.0.gem
585
600
  location: https://rubygems.org/gems/pubnub
586
601
  requires:
587
602
  - name: addressable
@@ -686,8 +701,8 @@ sdks:
686
701
  - x86-64
687
702
  - distribution-type: library
688
703
  distribution-repository: GitHub release
689
- package-name: pubnub-5.3.5.gem
690
- location: https://github.com/pubnub/ruby/releases/download/v5.3.5/pubnub-5.3.5.gem
704
+ package-name: pubnub-5.4.0.gem
705
+ location: https://github.com/pubnub/ruby/releases/download/v5.4.0/pubnub-5.4.0.gem
691
706
  requires:
692
707
  - name: addressable
693
708
  min-version: 2.0.0
data/CHANGELOG.md CHANGED
@@ -1,88 +1,99 @@
1
- ## v5.3.5
2
- October 09 2024
3
-
4
- #### Modified
5
- - Updated direct and transient dependency versions. Fixed the following issues reported by [@pboling](https://github.com/pboling): [#158](https://github.com/pubnub/ruby/issues/158).
6
-
7
- ## v5.3.4
8
- April 29 2024
9
-
10
- #### Fixed
11
- - Fix issue because of which client didn't encode App Context get all event `filter` query value.
12
-
13
- ## v5.3.3
14
- January 29 2024
15
-
16
- #### Modified
17
- - Bump required version to the minimum officially supported Ruby version.
18
-
19
- ## v5.3.2
20
- November 23 2023
21
-
22
- #### Modified
23
- - Return source event data when a client configured with crypto is unable to decrypt it (can be not encrypted data or encrypted with different options).
24
-
25
- ## v5.3.1
26
- November 03 2023
27
-
28
- #### Modified
29
- - Update license information.
30
-
31
- ## v5.3.0
32
- October 16 2023
33
-
34
- #### Added
35
- - Add crypto module that allows to configure SDK to encrypt and decrypt messages.
36
-
37
- #### Fixed
38
- - Improved security of crypto implementation by adding enhanced AES-CBC cryptor.
39
-
40
- ## v5.2.2
41
- March 14 2023
42
-
43
- #### Fixed
44
- - Fix issue which raised an exception when PubNub client has been configured with a secret key.
45
-
46
- ## v5.2.1
47
- December 13 2022
48
-
49
- #### Fixed
50
- - Fix format which is used to return server data from `get_message_actions` method call.
51
-
52
- ## v5.2.0
53
- December 12 2022
54
-
55
- #### Added
56
- - Add api which allow to work with message actions endpoints.
57
-
58
- #### Modified
59
- - Migrate test suite run from Travis to GitHub Actions.
60
-
61
- ## v5.1.2
62
- November 23 2022
63
-
64
- #### Fixed
65
- - Fix issue because of which channel hasn't been encoded properly with endpoint call.
66
-
67
- ## v5.1.1
68
- October 26 2022
69
-
70
- #### Fixed
71
- - Fix issue because of which `callback` and `http_sync` provided during client configuration not used when missing in method call.
72
-
73
- ## v5.1.0
74
- July 26 2022
75
-
76
- #### Added
77
- - Add support for spaces and users permissions in grant_token.
78
- - Add user_id and deprecate uuid when creating new pubnub instance.
79
-
80
- ## v5.0.0
81
- January 13 2022
82
-
83
- #### Modified
84
- - BREAKING CHANGES: uuid is required parameter to create PubNub instance.
85
-
1
+ ## v5.4.0
2
+ January 07 2025
3
+
4
+ #### Added
5
+ - Add batch history support.
6
+ - Add fetch messages with message reactions.
7
+ - Add fetch messages (batch history) endpoint support to fetch history for multiple channels.
8
+ - Add fetch messages with reactions support.
9
+ - Add `include_custom_message_type` support for fetch messages endpoint.
10
+ - Add `custom_message_type` support for `publish` / `signal` and `subscribe` endpoints.
11
+
12
+ ## v5.3.5
13
+ October 09 2024
14
+
15
+ #### Modified
16
+ - Updated direct and transient dependency versions. Fixed the following issues reported by [@pboling](https://github.com/pboling): [#158](https://github.com/pubnub/ruby/issues/158).
17
+
18
+ ## v5.3.4
19
+ April 29 2024
20
+
21
+ #### Fixed
22
+ - Fix issue because of which client didn't encode App Context get all event `filter` query value.
23
+
24
+ ## v5.3.3
25
+ January 29 2024
26
+
27
+ #### Modified
28
+ - Bump required version to the minimum officially supported Ruby version.
29
+
30
+ ## v5.3.2
31
+ November 23 2023
32
+
33
+ #### Modified
34
+ - Return source event data when a client configured with crypto is unable to decrypt it (can be not encrypted data or encrypted with different options).
35
+
36
+ ## v5.3.1
37
+ November 03 2023
38
+
39
+ #### Modified
40
+ - Update license information.
41
+
42
+ ## v5.3.0
43
+ October 16 2023
44
+
45
+ #### Added
46
+ - Add crypto module that allows to configure SDK to encrypt and decrypt messages.
47
+
48
+ #### Fixed
49
+ - Improved security of crypto implementation by adding enhanced AES-CBC cryptor.
50
+
51
+ ## v5.2.2
52
+ March 14 2023
53
+
54
+ #### Fixed
55
+ - Fix issue which raised an exception when PubNub client has been configured with a secret key.
56
+
57
+ ## v5.2.1
58
+ December 13 2022
59
+
60
+ #### Fixed
61
+ - Fix format which is used to return server data from `get_message_actions` method call.
62
+
63
+ ## v5.2.0
64
+ December 12 2022
65
+
66
+ #### Added
67
+ - Add api which allow to work with message actions endpoints.
68
+
69
+ #### Modified
70
+ - Migrate test suite run from Travis to GitHub Actions.
71
+
72
+ ## v5.1.2
73
+ November 23 2022
74
+
75
+ #### Fixed
76
+ - Fix issue because of which channel hasn't been encoded properly with endpoint call.
77
+
78
+ ## v5.1.1
79
+ October 26 2022
80
+
81
+ #### Fixed
82
+ - Fix issue because of which `callback` and `http_sync` provided during client configuration not used when missing in method call.
83
+
84
+ ## v5.1.0
85
+ July 26 2022
86
+
87
+ #### Added
88
+ - Add support for spaces and users permissions in grant_token.
89
+ - Add user_id and deprecate uuid when creating new pubnub instance.
90
+
91
+ ## v5.0.0
92
+ January 13 2022
93
+
94
+ #### Modified
95
+ - BREAKING CHANGES: uuid is required parameter to create PubNub instance.
96
+
86
97
  ## v4.8.0
87
98
  December 16 2021
88
99
 
data/Gemfile CHANGED
@@ -9,6 +9,7 @@ group :test do
9
9
  gem 'rspec-retry'
10
10
  gem 'rspec-expectations'
11
11
  gem 'rubocop'
12
+ gem 'standard'
12
13
  gem 'simplecov', '>= 0.21.2', require: false
13
14
  gem 'vcr'
14
15
  gem 'webmock'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pubnub (5.3.5)
4
+ pubnub (5.4.0)
5
5
  addressable (>= 2.0.0)
6
6
  concurrent-ruby (~> 1.3.4)
7
7
  concurrent-ruby-edge (~> 0.7.1)
@@ -98,6 +98,7 @@ GEM
98
98
  interception (0.5)
99
99
  json (2.7.2)
100
100
  language_server-protocol (3.17.0.3)
101
+ lint_roller (1.1.0)
101
102
  method_source (1.1.0)
102
103
  mini_mime (1.1.5)
103
104
  multi_test (1.1.0)
@@ -147,6 +148,9 @@ GEM
147
148
  unicode-display_width (>= 2.4.0, < 3.0)
148
149
  rubocop-ast (1.32.3)
149
150
  parser (>= 3.3.1.0)
151
+ rubocop-performance (1.23.0)
152
+ rubocop (>= 1.48.1, < 2.0)
153
+ rubocop-ast (>= 1.31.1, < 2.0)
150
154
  ruby-progressbar (1.13.0)
151
155
  simplecov (0.22.0)
152
156
  docile (~> 1.1)
@@ -154,6 +158,18 @@ GEM
154
158
  simplecov_json_formatter (~> 0.1)
155
159
  simplecov-html (0.13.1)
156
160
  simplecov_json_formatter (0.1.4)
161
+ standard (1.41.1)
162
+ language_server-protocol (~> 3.17.0.2)
163
+ lint_roller (~> 1.0)
164
+ rubocop (~> 1.66.0)
165
+ standard-custom (~> 1.0.0)
166
+ standard-performance (~> 1.5)
167
+ standard-custom (1.0.2)
168
+ lint_roller (~> 1.0)
169
+ rubocop (~> 1.50)
170
+ standard-performance (1.6.0)
171
+ lint_roller (~> 1.1)
172
+ rubocop-performance (~> 1.23.0)
157
173
  sys-uname (1.3.0)
158
174
  ffi (~> 1.1)
159
175
  timers (4.3.5)
@@ -183,6 +199,7 @@ DEPENDENCIES
183
199
  rspec-retry
184
200
  rubocop
185
201
  simplecov (>= 0.21.2)
202
+ standard
186
203
  vcr
187
204
  webmock
188
205
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.3.5
1
+ 5.4.0
@@ -4,14 +4,16 @@ module Pubnub
4
4
  class Client
5
5
  # Module that holds generator for all events
6
6
  module Events
7
- EVENTS = %w[publish subscribe presence leave history here_now audit grant grant_token revoke_token delete_messages
8
- revoke time heartbeat where_now set_state state channel_registration message_counts signal
9
- add_message_action get_message_actions remove_message_action
10
- add_channels_to_push list_push_provisions remove_channels_from_push remove_device_from_push
11
- set_uuid_metadata set_channel_metadata remove_uuid_metadata remove_channel_metadata
12
- get_uuid_metadata get_all_uuid_metadata get_channel_metadata get_all_channels_metadata
13
- get_channel_members get_memberships set_channel_members set_memberships
14
- remove_memberships remove_channel_members].freeze
7
+ EVENTS = %w[publish subscribe presence leave history fetch_messages here_now audit grant
8
+ grant_token revoke_token delete_messages revoke time heartbeat where_now
9
+ set_state state channel_registration message_counts signal add_message_action
10
+ get_message_actions remove_message_action add_channels_to_push
11
+ list_push_provisions remove_channels_from_push remove_device_from_push
12
+ set_uuid_metadata set_channel_metadata remove_uuid_metadata
13
+ remove_channel_metadata get_uuid_metadata get_all_uuid_metadata
14
+ get_channel_metadata get_all_channels_metadata get_channel_members
15
+ get_memberships set_channel_members set_memberships remove_memberships
16
+ remove_channel_members].freeze
15
17
 
16
18
  EVENTS.each do |event_name|
17
19
  define_method event_name do |options = {}, &block|
data/lib/pubnub/client.rb CHANGED
@@ -1,85 +1,86 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
-
5
- require 'pubnub/error'
6
- require 'pubnub/uuid'
7
- require 'pubnub/formatter'
8
- require 'pubnub/constants'
9
- require 'pubnub/configuration'
10
- require 'pubnub/subscribe_callback'
11
-
12
- require 'pubnub/modules/crypto/module'
13
-
14
- require 'pubnub/schemas/envelope_schema'
15
-
16
- require 'pubnub/event'
17
- require 'pubnub/single_event'
18
- require 'pubnub/subscribe_event/callbacks'
19
- require 'pubnub/subscribe_event/formatter'
20
- require 'pubnub/subscribe_event/heartbeat'
21
- require 'pubnub/subscribe_event/adding'
22
- require 'pubnub/subscribe_event/removing'
23
- require 'pubnub/subscribe_event'
24
- require 'pubnub/pam'
25
- require 'pubnub/heart'
26
- require 'pubnub/subscriber'
27
- require 'pubnub/telemetry'
28
-
29
- require 'pubnub/envelope'
30
- require 'pubnub/error_envelope'
31
-
32
- require 'pubnub/client/events'
33
- require 'pubnub/client/paged_history'
34
- require 'pubnub/client/helpers'
35
- require 'pubnub/client/getters_setters'
36
-
37
- require 'pubnub/validators/get_message_actions'
38
- require 'pubnub/validators/add_message_action'
39
- require 'pubnub/validators/remove_message_action'
40
- require 'pubnub/validators/common_validator'
41
- require 'pubnub/validators/client'
42
- require 'pubnub/validators/audit'
43
- require 'pubnub/validators/channel_registration'
44
- require 'pubnub/validators/grant'
45
- require 'pubnub/validators/grant_token'
46
- require 'pubnub/validators/revoke_token'
47
- require 'pubnub/validators/heartbeat'
48
- require 'pubnub/validators/here_now'
49
- require 'pubnub/validators/history'
50
- require 'pubnub/validators/leave'
51
- require 'pubnub/validators/presence'
52
- require 'pubnub/validators/publish'
53
- require 'pubnub/validators/revoke'
54
- require 'pubnub/validators/set_state'
55
- require 'pubnub/validators/state'
56
- require 'pubnub/validators/subscribe'
57
- require 'pubnub/validators/time'
58
- require 'pubnub/validators/where_now'
59
- require 'pubnub/validators/delete'
60
- require 'pubnub/validators/message_counts'
61
- require 'pubnub/validators/add_channels_to_push'
62
- require 'pubnub/validators/list_push_provisions'
63
- require 'pubnub/validators/remove_channels_from_push'
64
- require 'pubnub/validators/remove_device_from_push'
65
- require 'pubnub/validators/signal'
66
- require 'pubnub/validators/set_uuid_metadata'
67
- require 'pubnub/validators/set_channel_metadata'
68
- require 'pubnub/validators/remove_uuid_metadata'
69
- require 'pubnub/validators/remove_channel_metadata'
70
- require 'pubnub/validators/get_uuid_metadata'
71
- require 'pubnub/validators/get_all_uuid_metadata'
72
- require 'pubnub/validators/get_channel_metadata'
73
- require 'pubnub/validators/get_all_channels_metadata'
74
- require 'pubnub/validators/get_channel_members'
75
- require 'pubnub/validators/get_memberships'
76
- require 'pubnub/validators/set_channel_members'
77
- require 'pubnub/validators/set_memberships'
78
- require 'pubnub/validators/remove_channel_members'
79
- require 'pubnub/validators/remove_memberships'
80
- require 'pubnub/cbor'
81
-
82
- Dir[File.join(File.dirname(__dir__), 'pubnub', 'events', '*.rb')].each do |file|
3
+ require "base64"
4
+
5
+ require "pubnub/error"
6
+ require "pubnub/uuid"
7
+ require "pubnub/formatter"
8
+ require "pubnub/constants"
9
+ require "pubnub/configuration"
10
+ require "pubnub/subscribe_callback"
11
+
12
+ require "pubnub/modules/crypto/module"
13
+
14
+ require "pubnub/schemas/envelope_schema"
15
+
16
+ require "pubnub/event"
17
+ require "pubnub/single_event"
18
+ require "pubnub/subscribe_event/callbacks"
19
+ require "pubnub/subscribe_event/formatter"
20
+ require "pubnub/subscribe_event/heartbeat"
21
+ require "pubnub/subscribe_event/adding"
22
+ require "pubnub/subscribe_event/removing"
23
+ require "pubnub/subscribe_event"
24
+ require "pubnub/pam"
25
+ require "pubnub/heart"
26
+ require "pubnub/subscriber"
27
+ require "pubnub/telemetry"
28
+
29
+ require "pubnub/envelope"
30
+ require "pubnub/error_envelope"
31
+
32
+ require "pubnub/client/events"
33
+ require "pubnub/client/paged_history"
34
+ require "pubnub/client/helpers"
35
+ require "pubnub/client/getters_setters"
36
+
37
+ require "pubnub/validators/get_message_actions"
38
+ require "pubnub/validators/add_message_action"
39
+ require "pubnub/validators/remove_message_action"
40
+ require "pubnub/validators/common_validator"
41
+ require "pubnub/validators/client"
42
+ require "pubnub/validators/audit"
43
+ require "pubnub/validators/channel_registration"
44
+ require "pubnub/validators/grant"
45
+ require "pubnub/validators/grant_token"
46
+ require "pubnub/validators/revoke_token"
47
+ require "pubnub/validators/heartbeat"
48
+ require "pubnub/validators/here_now"
49
+ require "pubnub/validators/history"
50
+ require "pubnub/validators/fetch_messages"
51
+ require "pubnub/validators/leave"
52
+ require "pubnub/validators/presence"
53
+ require "pubnub/validators/publish"
54
+ require "pubnub/validators/revoke"
55
+ require "pubnub/validators/set_state"
56
+ require "pubnub/validators/state"
57
+ require "pubnub/validators/subscribe"
58
+ require "pubnub/validators/time"
59
+ require "pubnub/validators/where_now"
60
+ require "pubnub/validators/delete"
61
+ require "pubnub/validators/message_counts"
62
+ require "pubnub/validators/add_channels_to_push"
63
+ require "pubnub/validators/list_push_provisions"
64
+ require "pubnub/validators/remove_channels_from_push"
65
+ require "pubnub/validators/remove_device_from_push"
66
+ require "pubnub/validators/signal"
67
+ require "pubnub/validators/set_uuid_metadata"
68
+ require "pubnub/validators/set_channel_metadata"
69
+ require "pubnub/validators/remove_uuid_metadata"
70
+ require "pubnub/validators/remove_channel_metadata"
71
+ require "pubnub/validators/get_uuid_metadata"
72
+ require "pubnub/validators/get_all_uuid_metadata"
73
+ require "pubnub/validators/get_channel_metadata"
74
+ require "pubnub/validators/get_all_channels_metadata"
75
+ require "pubnub/validators/get_channel_members"
76
+ require "pubnub/validators/get_memberships"
77
+ require "pubnub/validators/set_channel_members"
78
+ require "pubnub/validators/set_memberships"
79
+ require "pubnub/validators/remove_channel_members"
80
+ require "pubnub/validators/remove_memberships"
81
+ require "pubnub/cbor"
82
+
83
+ Dir[File.join(File.dirname(__dir__), "pubnub", "events", "*.rb")].each do |file|
83
84
  require file
84
85
  end
85
86
 
@@ -188,7 +189,7 @@ module Pubnub
188
189
  validate! @env
189
190
  setup_crypto_module
190
191
  @telemetry = Telemetry.new
191
- Pubnub.logger.debug('Pubnub::Client') do
192
+ Pubnub.logger.debug("Pubnub::Client") do
192
193
  "Created new Pubnub::Client instance. Version: #{Pubnub::VERSION}"
193
194
  end
194
195
  end
@@ -260,8 +261,8 @@ module Pubnub
260
261
  # created and returns it if created, otherwise creates it, assigns
261
262
  # it in @env and returns newly created dispatcher.
262
263
  def request_dispatcher(origin, event_type, sync)
263
- Pubnub.logger.debug('Pubnub::Client') do
264
- "Looking for requester for #{sync ? 'sync' : 'async'} #{event_type}"
264
+ Pubnub.logger.debug("Pubnub::Client") do
265
+ "Looking for requester for #{sync ? "sync" : "async"} #{event_type}"
265
266
  end
266
267
 
267
268
  if sync
@@ -289,21 +290,21 @@ module Pubnub
289
290
  # ==============
290
291
  # Terminates request dispatcher for given origin and event type. Usable while restarting subscription.
291
292
  def kill_request_dispatcher(origin, event_type)
292
- Pubnub.logger.debug('Pubnub::Client') { 'Killing requester' }
293
+ Pubnub.logger.debug("Pubnub::Client") { "Killing requester" }
293
294
  # @env[:req_dispatchers_pool][origin][event_type].async.terminate
294
295
  @env[:req_dispatchers_pool][:async][origin][event_type].reset_all
295
296
  @env[:req_dispatchers_pool][:async][origin][event_type] = nil
296
- rescue StandardError
297
- Pubnub.logger.debug('Pubnub::Client') { 'There\'s no requester' }
297
+ rescue
298
+ Pubnub.logger.debug("Pubnub::Client") { "There's no requester" }
298
299
  end
299
300
 
300
301
  def sequence_number_for_publish!
301
302
  @env[:sequence_number_for_publish] += 1
302
- @env[:sequence_number_for_publish] % 2 ** 32
303
+ @env[:sequence_number_for_publish] % 2**32
303
304
  end
304
305
 
305
306
  def apply_state(event)
306
- Pubnub.logger.debug('Pubnub::Client') { 'Apply state' }
307
+ Pubnub.logger.debug("Pubnub::Client") { "Apply state" }
307
308
  create_state_pools(event)
308
309
 
309
310
  return unless event.state
@@ -361,11 +362,11 @@ module Pubnub
361
362
  end
362
363
 
363
364
  def setup_httpclient(event_type)
364
- hc = if ENV['HTTP_PROXY']
365
- HTTPClient.new(ENV['HTTP_PROXY'])
366
- else
367
- HTTPClient.new
368
- end
365
+ hc = if ENV["HTTP_PROXY"]
366
+ HTTPClient.new(ENV["HTTP_PROXY"])
367
+ else
368
+ HTTPClient.new
369
+ end
369
370
 
370
371
  case event_type
371
372
  when :subscribe_event
@@ -394,14 +395,14 @@ module Pubnub
394
395
  end
395
396
 
396
397
  def setup_app(options)
397
- Pubnub.logger = options[:logger] || Logger.new('pubnub.log')
398
+ Pubnub.logger = options[:logger] || Logger.new("pubnub.log")
398
399
  Concurrent.global_logger = Pubnub.logger
399
400
  @subscriber = Subscriber.new(self)
400
401
  options[:user_id] = options[:uuid] if options[:user_id].nil?
401
402
 
402
403
  if options[:cipher_key] && options[:crypto_module]
403
- puts 'It is expected that only cipherKey or cryptoModule will be configured ' \
404
- 'at once. PubNub client will use the configured cryptoModule.'
404
+ puts "It is expected that only cipherKey or cryptoModule will be configured " \
405
+ "at once. PubNub client will use the configured cryptoModule."
405
406
  end
406
407
 
407
408
  @env = options
@@ -48,6 +48,8 @@ module Pubnub
48
48
  OPERATION_PRESENCE_LEAVE = :leave
49
49
  OPERATION_TIME = :time
50
50
  OPERATION_HISTORY = :history
51
+ OPERATION_FETCH_MESSAGES = :fetch_messages
52
+ OPERATION_FETCH_MESSAGES_WITH_ACTIONS = :fetch_messages_with_actions
51
53
  OPERATION_HERE_NOW = :here_now
52
54
  OPERATION_WHERE_NOW = :where_now
53
55
  OPERATION_GLOBAL_HERE_NOW = :global_here_now
@@ -89,7 +91,8 @@ module Pubnub
89
91
 
90
92
  OPERATIONS = [
91
93
  OPERATION_SUBSCRIBE, OPERATION_HEARTBEAT, OPERATION_PRESENCE, OPERATION_TIME, OPERATION_HISTORY,
92
- OPERATION_HERE_NOW, OPERATION_GLOBAL_HERE_NOW, OPERATION_GET_STATE, OPERATION_ADD_MESSAGE_ACTION,
94
+ OPERATION_FETCH_MESSAGES, OPERATION_FETCH_MESSAGES_WITH_ACTIONS, OPERATION_HERE_NOW,
95
+ OPERATION_GLOBAL_HERE_NOW, OPERATION_GET_STATE, OPERATION_ADD_MESSAGE_ACTION,
93
96
  OPERATION_REMOVE_MESSAGE_ACTION, OPERATION_GET_MESSAGE_ACTIONS, OPERATION_LIST_ALL_CHANNEL_GROUPS,
94
97
  OPERATION_LIST_ALL_CHANNELS_IN_CHANNEL_GROUP, OPERATION_CHANNEL_GROUP_ADD, OPERATION_CHANNEL_GROUP_REMOVE,
95
98
  OPERATION_AUDIT, OPERATION_GRANT, OPERATION_GRANT_TOKEN, OPERATION_REVOKE, OPERATION_WHERE_NOW,
data/lib/pubnub/event.rb CHANGED
@@ -65,14 +65,14 @@ module Pubnub
65
65
 
66
66
  begin
67
67
  @app.record_telemetry(@telemetry_name, telemetry_time_start, ::Time.now.to_f)
68
- rescue StandardError => error
69
- Pubnub.logger.warn('Pubnub::Event') { "Couldn't record telemetry because of #{error}\n#{error.backtrace.join("\n")}" }
68
+ rescue StandardError => e
69
+ Pubnub.logger.warn('Pubnub::Event') { "Couldn't record telemetry because of #{e}\n#{e.backtrace.join("\n")}" }
70
70
  end
71
71
 
72
72
  response
73
- rescue StandardError => error
74
- Pubnub.logger.error('Pubnub::Event') { error }
75
- error
73
+ rescue StandardError => e
74
+ Pubnub.logger.error('Pubnub::Event') { e }
75
+ e
76
76
  end
77
77
 
78
78
  def uri(memo = true)
@@ -133,8 +133,8 @@ module Pubnub
133
133
 
134
134
  def secure_call(cb, arg)
135
135
  cb.call arg
136
- rescue StandardError => error
137
- Pubnub.logger.error('Pubnub::Event') { "Error while calling callback #{error.inspect}" }
136
+ rescue StandardError => e
137
+ Pubnub.logger.error('Pubnub::Event') { "Error while calling callback #{e.inspect}" }
138
138
  end
139
139
 
140
140
  def fire_callbacks(envelope)
@@ -150,7 +150,7 @@ module Pubnub
150
150
 
151
151
  token = @app.env[:token]
152
152
  empty_if_blank = {
153
- auth: token ? token : @auth_key,
153
+ auth: token || @auth_key,
154
154
  uuid: @app.user_id,
155
155
  @telemetry_name => @current_telemetry
156
156
  }
@@ -169,21 +169,26 @@ module Pubnub
169
169
  end
170
170
 
171
171
  def create_variables_from_options(options)
172
- variables = %w[channel channels message http_sync callback
173
- ssl cipher_key random_iv crypto_module secret_key auth_key
174
- publish_key subscribe_key timetoken action_timetoken message_timetoken
175
- open_timeout read_timeout idle_timeout heartbeat
176
- group action read write delete manage ttl presence start
177
- end count limit reverse presence_callback store skip_validate
178
- state channel_group channel_groups compressed meta customs include_token
179
- replicate with_presence cipher_key_selector include_meta join update get
180
- add remove push_token push_gateway environment topic authorized_uuid
181
- authorized_user_id token type value
182
- ]
172
+ variables = %w[channel channels message http_sync callback ssl cipher_key random_iv
173
+ crypto_module secret_key auth_key publish_key subscribe_key timetoken
174
+ action_timetoken message_timetoken open_timeout read_timeout idle_timeout
175
+ heartbeat group action read write delete manage ttl presence start end count
176
+ limit max reverse presence_callback store skip_validate state channel_group
177
+ channel_groups compressed meta customs custom_message_type include_token
178
+ include_custom_message_type include_message_actions include_message_type
179
+ replicate with_presence cipher_key_selector include_meta include_uuid join
180
+ update get add remove push_token push_gateway environment topic
181
+ authorized_uuid authorized_user_id token type value]
183
182
 
184
183
  options = options.each_with_object({}) { |option, obj| obj[option.first.to_sym] = option.last }
185
184
 
186
- variables.each { |variable| instance_variable_set('@' + variable, options[variable.to_sym]) unless variable.nil? }
185
+ # variables.each { |variable| instance_variable_set('@' + variable, options[variable.to_sym]) unless variable.nil? }
186
+ variables.each do |variable|
187
+ next if variable.nil?
188
+
189
+ ivar = "@#{variable}"
190
+ instance_variable_set(ivar, options[variable.to_sym]) unless instance_variable_defined?(ivar) && !instance_variable_get(ivar).nil?
191
+ end
187
192
 
188
193
  return if @event != :subscribe && @event != :presence
189
194
 
@@ -208,12 +213,14 @@ module Pubnub
208
213
  def compute_cipher_key(data)
209
214
  ck = @compute_cipher_key || @cipher_key || @app.env[:cipher_key_selector] || @app.env[:cipher_key].to_s
210
215
  return ck unless ck.respond_to?(:call)
216
+
211
217
  ck.call(data)
212
218
  end
213
219
 
214
220
  def compute_random_iv(data)
215
221
  ck = @compute_random_iv || @random_iv || @app.env[:random_iv_selector] || @app.env[:random_iv].to_s
216
222
  return ck unless ck.respond_to?(:call)
223
+
217
224
  ck.call(data)
218
225
  end
219
226
 
@@ -221,9 +228,7 @@ module Pubnub
221
228
  #
222
229
  # @return [Pubnub::Crypto::CryptoProvider, nil] Crypto module for data encryption and
223
230
  # decryption.
224
- def crypto_module
225
- @crypto_module
226
- end
231
+ attr_reader :crypto_module
227
232
 
228
233
  def error_message(parsed_response)
229
234
  parsed_response['message']
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubnub
4
+ # Holds functionality to fetch:
5
+ # - batch messages (for multiple channels)
6
+ # - messages with message actions.
7
+ class FetchMessages < SingleEvent
8
+ include Concurrent::Async
9
+ include Pubnub::Validator::FetchMessages
10
+
11
+ def initialize(options, app)
12
+ @telemetry_name = :l_hist
13
+ @include_custom_message_type = options.fetch(:include_custom_message_type, false)
14
+ @include_message_actions = options.fetch(:include_message_actions, false)
15
+ @include_message_type = options.fetch(:include_message_type, true)
16
+ @include_uuid = options.fetch(:include_uuid, true)
17
+ @include_meta = options.fetch(:include_meta, false)
18
+ @start = options[:start] if options.key?(:start)
19
+ @end = options[:end] if options.key?(:end)
20
+
21
+ channel = options[:channel] if options.key?(:channel) && !options[:channel].empty?
22
+ @channels = options[:channels] if options.key?(:channels) && !options[:channels].empty?
23
+ if @include_message_actions
24
+ @channel = channel
25
+ elsif @channels.nil? && !channel.nil?
26
+ @channels = [channel]
27
+ @channel = nil
28
+ options.delete :channel
29
+ end
30
+
31
+ maximum = @include_message_actions || @channels&.size == 1 ? 100 : 25
32
+ @max = [options[:max], maximum].min unless options[:max].nil?
33
+
34
+ @event = current_operation
35
+
36
+ # Override crypto module if custom cipher key has been used.
37
+ random_iv = options.key?(:random_iv) ? options[:random_iv] : true
38
+ options[:crypto_module] = Crypto::CryptoModule.new_legacy(options[:cipher_key], random_iv) if options[:cipher_key]
39
+
40
+ super
41
+ end
42
+
43
+ private
44
+
45
+ def current_operation
46
+ @include_message_actions ? Pubnub::Constants::OPERATION_FETCH_MESSAGES_WITH_ACTIONS : Pubnub::Constants::OPERATION_FETCH_MESSAGES
47
+ end
48
+
49
+ def parameters(signature: false)
50
+ parameters = super(signature)
51
+ parameters[:include_meta] = 'true' if @include_meta
52
+ parameters[:include_uuid] = 'true' if @include_uuid
53
+ parameters[:include_custom_message_type] = 'true' if @include_custom_message_type
54
+ parameters[:include_message_type] = 'true' if @include_message_type
55
+ parameters[:start] = @start unless @start.nil?
56
+ parameters[:end] = @end unless @end.nil?
57
+ parameters[:max] = @max unless @max.nil?
58
+
59
+ parameters
60
+ end
61
+
62
+ def path
63
+ storage_endpoint = @include_message_actions ? 'history-with-actions' : 'history'
64
+ "/v3/#{storage_endpoint}/sub-key/#{@subscribe_key}/channel/#{Pubnub::Formatter.channels_for_url((
65
+ unless @channel.nil?
66
+ [@channel]
67
+ end) || @channels)}"
68
+ end
69
+
70
+ def enable_format_channels?
71
+ false
72
+ end
73
+
74
+ def decrypt_history(crypto, message)
75
+ encrypted_message = Base64.strict_decode64(message['message'])
76
+ message['message'] = JSON.parse(crypto.decrypt(encrypted_message), quirks_mode: true)
77
+ message
78
+ rescue StandardError => e
79
+ puts "Pubnub :: DECRYPTION ERROR: #{e}"
80
+ message['decrypt_error'] = true
81
+ message
82
+ end
83
+
84
+ def valid_envelope(parsed_response, req_res_objects)
85
+ channels = parsed_response['channels'] unless parsed_response['error']
86
+ more = parsed_response['more'].transform_keys(&:to_sym) if parsed_response.key?('more')
87
+ more&.delete :url
88
+
89
+ if crypto_module && channels
90
+ crypto = crypto_module
91
+ channels.transform_values! do |channel_messages|
92
+ channel_messages.map(&method(:decrypt_history).curry[crypto])
93
+ end
94
+ end
95
+
96
+ Pubnub::Envelope.new(
97
+ event: @event,
98
+ event_options: @given_options,
99
+ timetoken: nil,
100
+ status: {
101
+ code: req_res_objects[:response].code,
102
+ client_request: req_res_objects[:request],
103
+ server_response: req_res_objects[:response],
104
+
105
+ category: Pubnub::Constants::STATUS_ACK,
106
+ error: false,
107
+ auto_retried: false,
108
+
109
+ data: nil,
110
+ current_timetoken: nil,
111
+ last_timetoken: nil,
112
+ subscribed_channels: nil,
113
+ subscribed_channel_groups: nil,
114
+
115
+ config: get_config
116
+ },
117
+ result: {
118
+ code: req_res_objects[:response].code,
119
+ operation: @event,
120
+ client_request: req_res_objects[:request],
121
+ server_response: req_res_objects[:response],
122
+
123
+ data: { channels: channels }.merge!(more.nil? ? {} : { more: more })
124
+ }
125
+ )
126
+ end
127
+ end
128
+ end
@@ -52,6 +52,7 @@ module Pubnub
52
52
  params = super
53
53
 
54
54
  empty_if_blank = {
55
+ custom_message_type: @custom_message_type,
55
56
  store: @store,
56
57
  meta: @meta,
57
58
  ttl: @ttl
@@ -26,6 +26,10 @@ module Pubnub
26
26
  def parameters(*_args)
27
27
  params = super
28
28
 
29
+ empty_if_blank = { custom_message_type: @custom_message_type }
30
+ empty_if_blank.delete_if { |_k, v| v.blank? }
31
+
32
+ params = params.merge(empty_if_blank)
29
33
  params = params.merge(seqn: @sequence_number,
30
34
  ortt: { t: @origination_time_token })
31
35
  params
@@ -60,6 +60,7 @@ module Pubnub
60
60
  end
61
61
 
62
62
  def plain_envelope(req_res_objects, timetoken)
63
+ operation = get_operation
63
64
  Pubnub::Envelope.new(
64
65
  event: @event,
65
66
  event_options: @given_options,
@@ -82,7 +83,7 @@ module Pubnub
82
83
  },
83
84
  result: {
84
85
  code: req_res_objects[:response].code,
85
- operation: get_operation,
86
+ operation: operation,
86
87
  client_request: req_res_objects[:request],
87
88
  server_response: req_res_objects[:response],
88
89
 
@@ -92,6 +93,20 @@ module Pubnub
92
93
  end
93
94
 
94
95
  def encrypted_envelope(req_res_objects, message, timetoken)
96
+ operation = get_operation(message)
97
+ data = {
98
+ message: decipher_payload(message),
99
+ subscribed_channel: message[:subscription_match] || message[:channel],
100
+ actual_channel: message[:channel],
101
+ publish_time_object: message[:publish_timetoken],
102
+ message_meta_data: message[:user_meta_data],
103
+ presence_event: get_presence_event(message),
104
+ presence: get_presence_data(message)
105
+ }
106
+ if !data[:actual_channel].end_with?('-pnpres') && (message[:type].nil? || [1, 4].include?(message[:type]))
107
+ data[:custom_message_type] = message[:custom_message_type]
108
+ end
109
+
95
110
  Pubnub::Envelope.new(
96
111
  event: @event,
97
112
  event_options: @given_options,
@@ -114,19 +129,11 @@ module Pubnub
114
129
  },
115
130
  result: {
116
131
  code: req_res_objects[:response].code,
117
- operation: get_operation(message),
132
+ operation: operation,
118
133
  client_request: req_res_objects[:request],
119
134
  server_response: req_res_objects[:response],
120
135
 
121
- data: {
122
- message: decipher_payload(message),
123
- subscribed_channel: message[:subscription_match] || message[:channel],
124
- actual_channel: message[:channel],
125
- publish_time_object: message[:publish_timetoken],
126
- message_meta_data: message[:user_meta_data],
127
- presence_event: get_presence_event(message),
128
- presence: get_presence_data(message)
129
- }
136
+ data: data
130
137
  }
131
138
  )
132
139
  end
@@ -142,10 +149,10 @@ module Pubnub
142
149
  Pubnub::Schemas::Envelope::StatusSchema.new.call status
143
150
  end
144
151
 
145
- if (results_validation + statuses_validation).map(&:failure?).index(true)
146
- Pubnub.logger.error('Pubnub::SubscribeEvent::Formatter') { 'Invalid formatted envelope.' }
147
- raise Exception, 'Invalid formatted envelope.'
148
- end
152
+ return unless (results_validation + statuses_validation).map(&:failure?).index(true)
153
+
154
+ Pubnub.logger.error('Pubnub::SubscribeEvent::Formatter') { 'Invalid formatted envelope.' }
155
+ raise Exception, 'Invalid formatted envelope.'
149
156
  end
150
157
 
151
158
  def format_envelopes(response, request)
@@ -216,6 +223,7 @@ module Pubnub
216
223
 
217
224
  def get_presence_data(message)
218
225
  return nil unless get_operation(message) == Pubnub::Constants::OPERATION_PRESENCE
226
+
219
227
  {
220
228
  uuid: message[:payload]['uuid'],
221
229
  timestamp: message[:payload]['timestamp'],
@@ -226,6 +234,7 @@ module Pubnub
226
234
 
227
235
  def get_presence_event(message)
228
236
  return nil unless get_operation(message) == Pubnub::Constants::OPERATION_PRESENCE
237
+
229
238
  message[:payload]['action']
230
239
  rescue StandardError
231
240
  nil
@@ -233,7 +242,7 @@ module Pubnub
233
242
 
234
243
  def expand_messages_keys(messages)
235
244
  messages.map do |m|
236
- {
245
+ envelope = {
237
246
  shard: m['a'],
238
247
  channel: m['c'],
239
248
  subscription_match: m['b'],
@@ -250,11 +259,15 @@ module Pubnub
250
259
  origination_time_token: expand_timetoken(m['o']),
251
260
  publish_timetoken: expand_timetoken(m['p'])
252
261
  }
262
+ envelope[:custom_message_type] = m['cmt'] if !m['c'].end_with?('-pnpres') && (envelope[:type].nil? || [1, 4].include?(envelope[:type]))
263
+
264
+ envelope
253
265
  end
254
266
  end
255
267
 
256
268
  def expand_timetoken(timetoken)
257
269
  return nil unless timetoken
270
+
258
271
  {
259
272
  timetoken: timetoken['t'],
260
273
  region_code: timetoken['r']
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pubnub
4
+ # Validator module that holds all validators modules.
5
+ module Validator
6
+ # Validator for FetchMessages event.
7
+ module FetchMessages
8
+ include CommonValidator
9
+
10
+ def validate!
11
+ return if @skip_validate
12
+
13
+ validate_subscribe_key!
14
+ validate_channel_or_channels!
15
+ end
16
+
17
+ private
18
+
19
+ def validate_subscribe_key!
20
+ return unless @subscribe_key.nil?
21
+
22
+ raise(
23
+ ArgumentError.new(object: self, message: ':subscribe_key is required for fetch messages event'),
24
+ ':subscribe_key is required for fetch messages event'
25
+ )
26
+ end
27
+
28
+ def validate_channel_or_channels!
29
+ error_message = nil
30
+ if @include_message_actions
31
+ error_message = ":channels can't be used with :include_custom_message_type set to 'true'" unless @channels.nil?
32
+ error_message = ":channel is required with :include_custom_message_type set to 'true'" if @channel.nil?
33
+ elsif @channels.nil? || @channels.empty?
34
+ error_message = ':channels is required for fetch message event'
35
+ end
36
+
37
+ raise(ArgumentError.new(object: self, message: error_message), error_message) unless error_message.nil?
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,4 +1,4 @@
1
1
  # Toplevel Pubnub module.
2
2
  module Pubnub
3
- VERSION = '5.3.5'.freeze
3
+ VERSION = '5.4.0'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubnub
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.5
4
+ version: 5.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - PubNub
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-09 00:00:00.000000000 Z
11
+ date: 2025-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -184,6 +184,7 @@ files:
184
184
  - lib/pubnub/events/audit.rb
185
185
  - lib/pubnub/events/channel_registration.rb
186
186
  - lib/pubnub/events/delete_messages.rb
187
+ - lib/pubnub/events/fetch_messages.rb
187
188
  - lib/pubnub/events/get_all_channels_metadata.rb
188
189
  - lib/pubnub/events/get_all_uuid_metadata.rb
189
190
  - lib/pubnub/events/get_channel_members.rb
@@ -251,6 +252,7 @@ files:
251
252
  - lib/pubnub/validators/client.rb
252
253
  - lib/pubnub/validators/common_validator.rb
253
254
  - lib/pubnub/validators/delete.rb
255
+ - lib/pubnub/validators/fetch_messages.rb
254
256
  - lib/pubnub/validators/get_all_channels_metadata.rb
255
257
  - lib/pubnub/validators/get_all_uuid_metadata.rb
256
258
  - lib/pubnub/validators/get_channel_members.rb