pubnub 3.4.1 → 3.5.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pubnub might be problematic. Click here for more details.

Files changed (467) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG +5 -3
  4. data/README.md +267 -41
  5. data/VERSION +1 -1
  6. data/examples/demo_console.rb +191 -32
  7. data/examples/demo_console.rb~ +307 -0
  8. data/examples/pubnub_livestream/Gemfile +1 -1
  9. data/examples/pubnub_livestream/Gemfile.lock +43 -74
  10. data/examples/serial_publish.rb +2 -6
  11. data/fixtures/vcr_cassettes/audit-nonssl-block-invalid-200-async.yml +44 -0
  12. data/fixtures/vcr_cassettes/audit-nonssl-block-invalid-200-sync.yml +44 -0
  13. data/fixtures/vcr_cassettes/audit-nonssl-block-invalid-non-200-async.yml +44 -0
  14. data/fixtures/vcr_cassettes/audit-nonssl-block-invalid-non-200-sync.yml +44 -0
  15. data/fixtures/vcr_cassettes/audit-nonssl-block-valid-200-async.yml +45 -0
  16. data/fixtures/vcr_cassettes/audit-nonssl-block-valid-200-sync.yml +45 -0
  17. data/fixtures/vcr_cassettes/audit-nonssl-block-valid-non-200-async.yml +45 -0
  18. data/fixtures/vcr_cassettes/audit-nonssl-block-valid-non-200-sync.yml +45 -0
  19. data/fixtures/vcr_cassettes/audit-nonssl-parameter-invalid-200-async.yml +44 -0
  20. data/fixtures/vcr_cassettes/audit-nonssl-parameter-invalid-200-sync.yml +44 -0
  21. data/fixtures/vcr_cassettes/audit-nonssl-parameter-invalid-non-200-async.yml +44 -0
  22. data/fixtures/vcr_cassettes/audit-nonssl-parameter-invalid-non-200-sync.yml +44 -0
  23. data/fixtures/vcr_cassettes/audit-nonssl-parameter-valid-200-async.yml +45 -0
  24. data/fixtures/vcr_cassettes/audit-nonssl-parameter-valid-200-sync.yml +45 -0
  25. data/fixtures/vcr_cassettes/audit-nonssl-parameter-valid-non-200-async.yml +45 -0
  26. data/fixtures/vcr_cassettes/audit-nonssl-parameter-valid-non-200-sync.yml +45 -0
  27. data/fixtures/vcr_cassettes/audit-ssl-block-invalid-200-async.yml +44 -0
  28. data/fixtures/vcr_cassettes/audit-ssl-block-invalid-200-sync.yml +44 -0
  29. data/fixtures/vcr_cassettes/audit-ssl-block-invalid-non-200-async.yml +44 -0
  30. data/fixtures/vcr_cassettes/audit-ssl-block-invalid-non-200-sync.yml +44 -0
  31. data/fixtures/vcr_cassettes/audit-ssl-block-valid-200-async.yml +45 -0
  32. data/fixtures/vcr_cassettes/audit-ssl-block-valid-200-sync.yml +45 -0
  33. data/fixtures/vcr_cassettes/audit-ssl-block-valid-non-200-async.yml +45 -0
  34. data/fixtures/vcr_cassettes/audit-ssl-block-valid-non-200-sync.yml +45 -0
  35. data/fixtures/vcr_cassettes/audit-ssl-parameter-invalid-200-async.yml +44 -0
  36. data/fixtures/vcr_cassettes/audit-ssl-parameter-invalid-200-sync.yml +44 -0
  37. data/fixtures/vcr_cassettes/audit-ssl-parameter-invalid-non-200-async.yml +44 -0
  38. data/fixtures/vcr_cassettes/audit-ssl-parameter-invalid-non-200-sync.yml +44 -0
  39. data/fixtures/vcr_cassettes/audit-ssl-parameter-valid-200-async.yml +45 -0
  40. data/fixtures/vcr_cassettes/audit-ssl-parameter-valid-200-sync.yml +45 -0
  41. data/fixtures/vcr_cassettes/audit-ssl-parameter-valid-non-200-async.yml +45 -0
  42. data/fixtures/vcr_cassettes/audit-ssl-parameter-valid-non-200-sync.yml +45 -0
  43. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-many-channels-array.yml +89 -0
  44. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-many-channels-hash.yml +89 -0
  45. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-many-channels-integer.yml +89 -0
  46. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-many-channels-mix.yml +89 -0
  47. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-many-channels-multi-mix.yml +89 -0
  48. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-many-channels-string.yml +89 -0
  49. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-one-channel-array.yml +89 -0
  50. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-one-channel-hash.yml +89 -0
  51. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-one-channel-integer.yml +89 -0
  52. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-one-channel-mix.yml +89 -0
  53. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-cipherkey-one-channel-string.yml +89 -0
  54. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-many-channels-array.yml +89 -0
  55. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-many-channels-hash.yml +89 -0
  56. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-many-channels-integer.yml +89 -0
  57. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-many-channels-mix.yml +89 -0
  58. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-many-channels-multi-mix.yml +89 -0
  59. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-many-channels-string.yml +89 -0
  60. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-one-channel-array.yml +89 -0
  61. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-one-channel-hash.yml +89 -0
  62. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-one-channel-integer.yml +89 -0
  63. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-one-channel-mix.yml +89 -0
  64. data/fixtures/vcr_cassettes/formatting-envelope-subscribe-without-cipherkey-one-channel-string.yml +89 -0
  65. data/fixtures/vcr_cassettes/grant-nonssl-block-invalid-200-async.yml +44 -0
  66. data/fixtures/vcr_cassettes/grant-nonssl-block-invalid-200-sync.yml +44 -0
  67. data/fixtures/vcr_cassettes/grant-nonssl-block-invalid-non-200-async.yml +44 -0
  68. data/fixtures/vcr_cassettes/grant-nonssl-block-invalid-non-200-sync.yml +44 -0
  69. data/fixtures/vcr_cassettes/grant-nonssl-block-valid-200-async.yml +45 -0
  70. data/fixtures/vcr_cassettes/grant-nonssl-block-valid-200-sync.yml +45 -0
  71. data/fixtures/vcr_cassettes/grant-nonssl-block-valid-non-200-async.yml +45 -0
  72. data/fixtures/vcr_cassettes/grant-nonssl-block-valid-non-200-sync.yml +45 -0
  73. data/fixtures/vcr_cassettes/grant-nonssl-parameter-invalid-200-async.yml +44 -0
  74. data/fixtures/vcr_cassettes/grant-nonssl-parameter-invalid-200-sync.yml +44 -0
  75. data/fixtures/vcr_cassettes/grant-nonssl-parameter-invalid-non-200-async.yml +44 -0
  76. data/fixtures/vcr_cassettes/grant-nonssl-parameter-invalid-non-200-sync.yml +44 -0
  77. data/fixtures/vcr_cassettes/grant-nonssl-parameter-valid-200-async.yml +45 -0
  78. data/fixtures/vcr_cassettes/grant-nonssl-parameter-valid-200-sync.yml +45 -0
  79. data/fixtures/vcr_cassettes/grant-nonssl-parameter-valid-non-200-async.yml +45 -0
  80. data/fixtures/vcr_cassettes/grant-nonssl-parameter-valid-non-200-sync.yml +45 -0
  81. data/fixtures/vcr_cassettes/grant-ssl-block-invalid-200-async.yml +44 -0
  82. data/fixtures/vcr_cassettes/grant-ssl-block-invalid-200-sync.yml +44 -0
  83. data/fixtures/vcr_cassettes/grant-ssl-block-invalid-non-200-async.yml +44 -0
  84. data/fixtures/vcr_cassettes/grant-ssl-block-invalid-non-200-sync.yml +44 -0
  85. data/fixtures/vcr_cassettes/grant-ssl-block-valid-200-async.yml +45 -0
  86. data/fixtures/vcr_cassettes/grant-ssl-block-valid-200-sync.yml +45 -0
  87. data/fixtures/vcr_cassettes/grant-ssl-block-valid-non-200-async.yml +45 -0
  88. data/fixtures/vcr_cassettes/grant-ssl-block-valid-non-200-sync.yml +45 -0
  89. data/fixtures/vcr_cassettes/grant-ssl-parameter-invalid-200-async.yml +44 -0
  90. data/fixtures/vcr_cassettes/grant-ssl-parameter-invalid-200-sync.yml +44 -0
  91. data/fixtures/vcr_cassettes/grant-ssl-parameter-invalid-non-200-async.yml +44 -0
  92. data/fixtures/vcr_cassettes/grant-ssl-parameter-invalid-non-200-sync.yml +44 -0
  93. data/fixtures/vcr_cassettes/grant-ssl-parameter-valid-200-async.yml +45 -0
  94. data/fixtures/vcr_cassettes/grant-ssl-parameter-valid-200-sync.yml +45 -0
  95. data/fixtures/vcr_cassettes/grant-ssl-parameter-valid-non-200-async.yml +45 -0
  96. data/fixtures/vcr_cassettes/grant-ssl-parameter-valid-non-200-sync.yml +45 -0
  97. data/fixtures/vcr_cassettes/here_now-nonssl-block-invalid-200-async.yml +48 -0
  98. data/fixtures/vcr_cassettes/here_now-nonssl-block-invalid-200-sync.yml +48 -0
  99. data/fixtures/vcr_cassettes/here_now-nonssl-block-invalid-non-200-async.yml +48 -0
  100. data/fixtures/vcr_cassettes/here_now-nonssl-block-invalid-non-200-sync.yml +48 -0
  101. data/fixtures/vcr_cassettes/here_now-nonssl-block-valid-200-async.yml +48 -0
  102. data/fixtures/vcr_cassettes/here_now-nonssl-block-valid-200-sync.yml +48 -0
  103. data/fixtures/vcr_cassettes/here_now-nonssl-block-valid-non-200-async.yml +48 -0
  104. data/fixtures/vcr_cassettes/here_now-nonssl-block-valid-non-200-sync.yml +48 -0
  105. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-invalid-200-async.yml +48 -0
  106. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-invalid-200-sync.yml +48 -0
  107. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-invalid-non-200-async.yml +48 -0
  108. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-invalid-non-200-sync.yml +48 -0
  109. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-valid-200-async.yml +48 -0
  110. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-valid-200-sync.yml +48 -0
  111. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-valid-non-200-async.yml +48 -0
  112. data/fixtures/vcr_cassettes/here_now-nonssl-parameter-valid-non-200-sync.yml +48 -0
  113. data/fixtures/vcr_cassettes/here_now-ssl-block-invalid-200-async.yml +48 -0
  114. data/fixtures/vcr_cassettes/here_now-ssl-block-invalid-200-sync.yml +48 -0
  115. data/fixtures/vcr_cassettes/here_now-ssl-block-invalid-non-200-async.yml +48 -0
  116. data/fixtures/vcr_cassettes/here_now-ssl-block-invalid-non-200-sync.yml +48 -0
  117. data/fixtures/vcr_cassettes/here_now-ssl-block-valid-200-async.yml +48 -0
  118. data/fixtures/vcr_cassettes/here_now-ssl-block-valid-200-sync.yml +48 -0
  119. data/fixtures/vcr_cassettes/here_now-ssl-block-valid-non-200-async.yml +48 -0
  120. data/fixtures/vcr_cassettes/here_now-ssl-block-valid-non-200-sync.yml +48 -0
  121. data/fixtures/vcr_cassettes/here_now-ssl-parameter-invalid-200-async.yml +48 -0
  122. data/fixtures/vcr_cassettes/here_now-ssl-parameter-invalid-200-sync.yml +48 -0
  123. data/fixtures/vcr_cassettes/here_now-ssl-parameter-invalid-non-200-async.yml +48 -0
  124. data/fixtures/vcr_cassettes/here_now-ssl-parameter-invalid-non-200-sync.yml +48 -0
  125. data/fixtures/vcr_cassettes/here_now-ssl-parameter-valid-200-async.yml +48 -0
  126. data/fixtures/vcr_cassettes/here_now-ssl-parameter-valid-200-sync.yml +48 -0
  127. data/fixtures/vcr_cassettes/here_now-ssl-parameter-valid-non-200-async.yml +48 -0
  128. data/fixtures/vcr_cassettes/here_now-ssl-parameter-valid-non-200-sync.yml +48 -0
  129. data/fixtures/vcr_cassettes/history-nonssl-block-invalid-200-async.yml +48 -0
  130. data/fixtures/vcr_cassettes/history-nonssl-block-invalid-200-sync.yml +48 -0
  131. data/fixtures/vcr_cassettes/history-nonssl-block-invalid-non-200-async.yml +48 -0
  132. data/fixtures/vcr_cassettes/history-nonssl-block-invalid-non-200-sync.yml +48 -0
  133. data/fixtures/vcr_cassettes/history-nonssl-block-valid-200-async.yml +48 -0
  134. data/fixtures/vcr_cassettes/history-nonssl-block-valid-200-sync.yml +48 -0
  135. data/fixtures/vcr_cassettes/history-nonssl-block-valid-non-200-async.yml +48 -0
  136. data/fixtures/vcr_cassettes/history-nonssl-block-valid-non-200-sync.yml +48 -0
  137. data/fixtures/vcr_cassettes/history-nonssl-parameter-invalid-200-async.yml +48 -0
  138. data/fixtures/vcr_cassettes/history-nonssl-parameter-invalid-200-sync.yml +48 -0
  139. data/fixtures/vcr_cassettes/history-nonssl-parameter-invalid-non-200-async.yml +48 -0
  140. data/fixtures/vcr_cassettes/history-nonssl-parameter-invalid-non-200-sync.yml +48 -0
  141. data/fixtures/vcr_cassettes/history-nonssl-parameter-valid-200-async.yml +48 -0
  142. data/fixtures/vcr_cassettes/history-nonssl-parameter-valid-200-sync.yml +48 -0
  143. data/fixtures/vcr_cassettes/history-nonssl-parameter-valid-non-200-async.yml +48 -0
  144. data/fixtures/vcr_cassettes/history-nonssl-parameter-valid-non-200-sync.yml +48 -0
  145. data/fixtures/vcr_cassettes/history-ssl-block-invalid-200-async.yml +48 -0
  146. data/fixtures/vcr_cassettes/history-ssl-block-invalid-200-sync.yml +48 -0
  147. data/fixtures/vcr_cassettes/history-ssl-block-invalid-non-200-async.yml +48 -0
  148. data/fixtures/vcr_cassettes/history-ssl-block-invalid-non-200-sync.yml +48 -0
  149. data/fixtures/vcr_cassettes/history-ssl-block-valid-200-async.yml +48 -0
  150. data/fixtures/vcr_cassettes/history-ssl-block-valid-200-sync.yml +48 -0
  151. data/fixtures/vcr_cassettes/history-ssl-block-valid-non-200-async.yml +48 -0
  152. data/fixtures/vcr_cassettes/history-ssl-block-valid-non-200-sync.yml +48 -0
  153. data/fixtures/vcr_cassettes/history-ssl-parameter-invalid-200-async.yml +48 -0
  154. data/fixtures/vcr_cassettes/history-ssl-parameter-invalid-200-sync.yml +48 -0
  155. data/fixtures/vcr_cassettes/history-ssl-parameter-invalid-non-200-async.yml +48 -0
  156. data/fixtures/vcr_cassettes/history-ssl-parameter-invalid-non-200-sync.yml +48 -0
  157. data/fixtures/vcr_cassettes/history-ssl-parameter-valid-200-async.yml +48 -0
  158. data/fixtures/vcr_cassettes/history-ssl-parameter-valid-200-sync.yml +48 -0
  159. data/fixtures/vcr_cassettes/history-ssl-parameter-valid-non-200-async.yml +48 -0
  160. data/fixtures/vcr_cassettes/history-ssl-parameter-valid-non-200-sync.yml +48 -0
  161. data/fixtures/vcr_cassettes/leave-nonssl-block-invalid-200-async.yml +48 -0
  162. data/fixtures/vcr_cassettes/leave-nonssl-block-invalid-200-sync.yml +48 -0
  163. data/fixtures/vcr_cassettes/leave-nonssl-block-invalid-non-200-async.yml +48 -0
  164. data/fixtures/vcr_cassettes/leave-nonssl-block-invalid-non-200-sync.yml +48 -0
  165. data/fixtures/vcr_cassettes/leave-nonssl-block-valid-200-async.yml +48 -0
  166. data/fixtures/vcr_cassettes/leave-nonssl-block-valid-200-sync.yml +48 -0
  167. data/fixtures/vcr_cassettes/leave-nonssl-block-valid-non-200-async.yml +48 -0
  168. data/fixtures/vcr_cassettes/leave-nonssl-block-valid-non-200-sync.yml +48 -0
  169. data/fixtures/vcr_cassettes/leave-nonssl-parameter-invalid-200-async.yml +48 -0
  170. data/fixtures/vcr_cassettes/leave-nonssl-parameter-invalid-200-sync.yml +48 -0
  171. data/fixtures/vcr_cassettes/leave-nonssl-parameter-invalid-non-200-async.yml +48 -0
  172. data/fixtures/vcr_cassettes/leave-nonssl-parameter-invalid-non-200-sync.yml +48 -0
  173. data/fixtures/vcr_cassettes/leave-nonssl-parameter-valid-200-async.yml +48 -0
  174. data/fixtures/vcr_cassettes/leave-nonssl-parameter-valid-200-sync.yml +48 -0
  175. data/fixtures/vcr_cassettes/leave-nonssl-parameter-valid-non-200-async.yml +48 -0
  176. data/fixtures/vcr_cassettes/leave-nonssl-parameter-valid-non-200-sync.yml +48 -0
  177. data/fixtures/vcr_cassettes/leave-ssl-block-invalid-200-async.yml +48 -0
  178. data/fixtures/vcr_cassettes/leave-ssl-block-invalid-200-sync.yml +48 -0
  179. data/fixtures/vcr_cassettes/leave-ssl-block-invalid-non-200-async.yml +48 -0
  180. data/fixtures/vcr_cassettes/leave-ssl-block-invalid-non-200-sync.yml +48 -0
  181. data/fixtures/vcr_cassettes/leave-ssl-block-valid-200-async.yml +48 -0
  182. data/fixtures/vcr_cassettes/leave-ssl-block-valid-200-sync.yml +48 -0
  183. data/fixtures/vcr_cassettes/leave-ssl-block-valid-non-200-async.yml +48 -0
  184. data/fixtures/vcr_cassettes/leave-ssl-block-valid-non-200-sync.yml +48 -0
  185. data/fixtures/vcr_cassettes/leave-ssl-parameter-invalid-200-async.yml +48 -0
  186. data/fixtures/vcr_cassettes/leave-ssl-parameter-invalid-200-sync.yml +48 -0
  187. data/fixtures/vcr_cassettes/leave-ssl-parameter-invalid-non-200-async.yml +48 -0
  188. data/fixtures/vcr_cassettes/leave-ssl-parameter-invalid-non-200-sync.yml +48 -0
  189. data/fixtures/vcr_cassettes/leave-ssl-parameter-valid-200-async.yml +48 -0
  190. data/fixtures/vcr_cassettes/leave-ssl-parameter-valid-200-sync.yml +48 -0
  191. data/fixtures/vcr_cassettes/leave-ssl-parameter-valid-non-200-async.yml +48 -0
  192. data/fixtures/vcr_cassettes/leave-ssl-parameter-valid-non-200-sync.yml +48 -0
  193. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-array-of-hashes.yml +42 -0
  194. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-200-invalid.yml +42 -0
  195. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-200-valid.yml +42 -0
  196. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-auth_key-200-invalid.yml +42 -0
  197. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-auth_key-200-valid.yml +42 -0
  198. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-auth_key-non200-invalid.yml +42 -0
  199. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-auth_key-non200-valid.yml +42 -0
  200. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-non200-invalid.yml +42 -0
  201. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-http-non200-valid.yml +42 -0
  202. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-200-invalid.yml +42 -0
  203. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-200-valid.yml +42 -0
  204. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-auth_key-200-invalid.yml +42 -0
  205. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-auth_key-200-valid.yml +42 -0
  206. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-auth_key-non200-invalid.yml +42 -0
  207. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-auth_key-non200-valid.yml +42 -0
  208. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-non200-invalid.yml +42 -0
  209. data/fixtures/vcr_cassettes/new_ones/publish/publish-encrypted-https-non200-valid.yml +42 -0
  210. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-200-invalid.yml +42 -0
  211. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-200-valid.yml +42 -0
  212. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-auth_key-200-invalid.yml +42 -0
  213. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-auth_key-200-valid.yml +42 -0
  214. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-auth_key-non200-invalid.yml +42 -0
  215. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-auth_key-non200-valid.yml +42 -0
  216. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-non200-invalid.yml +42 -0
  217. data/fixtures/vcr_cassettes/new_ones/publish/publish-http-non200-valid.yml +42 -0
  218. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-200-invalid.yml +42 -0
  219. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-200-valid.yml +42 -0
  220. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-auth_key-200-invalid.yml +42 -0
  221. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-auth_key-200-valid.yml +42 -0
  222. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-auth_key-non200-invalid.yml +42 -0
  223. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-auth_key-non200-valid.yml +42 -0
  224. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-non200-invalid.yml +42 -0
  225. data/fixtures/vcr_cassettes/new_ones/publish/publish-https-non200-valid.yml +42 -0
  226. data/fixtures/vcr_cassettes/new_ones/publish/publish-plain-array-of-hashes.yml +42 -0
  227. data/fixtures/vcr_cassettes/pam1.yml +35 -0
  228. data/fixtures/vcr_cassettes/pam10.yml +35 -0
  229. data/fixtures/vcr_cassettes/pam11.yml +35 -0
  230. data/fixtures/vcr_cassettes/pam12.yml +35 -0
  231. data/fixtures/vcr_cassettes/pam13.yml +35 -0
  232. data/fixtures/vcr_cassettes/pam14.yml +35 -0
  233. data/fixtures/vcr_cassettes/pam15.yml +35 -0
  234. data/fixtures/vcr_cassettes/pam17.yml +35 -0
  235. data/fixtures/vcr_cassettes/pam2.yml +35 -0
  236. data/fixtures/vcr_cassettes/pam20.yml +35 -0
  237. data/fixtures/vcr_cassettes/pam21.yml +35 -0
  238. data/fixtures/vcr_cassettes/pam22.yml +97 -0
  239. data/fixtures/vcr_cassettes/pam4.yml +35 -0
  240. data/fixtures/vcr_cassettes/pam5.yml +66 -0
  241. data/fixtures/vcr_cassettes/pam6.yml +96 -0
  242. data/fixtures/vcr_cassettes/presence-nonssl-block-invalid-200-async.yml +85 -0
  243. data/fixtures/vcr_cassettes/presence-nonssl-block-invalid-200-sync.yml +85 -0
  244. data/fixtures/vcr_cassettes/presence-nonssl-block-invalid-non-200-async.yml +85 -0
  245. data/fixtures/vcr_cassettes/presence-nonssl-block-invalid-non-200-sync.yml +85 -0
  246. data/fixtures/vcr_cassettes/presence-nonssl-block-valid-200-async.yml +87 -0
  247. data/fixtures/vcr_cassettes/presence-nonssl-block-valid-200-sync.yml +87 -0
  248. data/fixtures/vcr_cassettes/presence-nonssl-block-valid-non-200-async.yml +87 -0
  249. data/fixtures/vcr_cassettes/presence-nonssl-block-valid-non-200-sync.yml +87 -0
  250. data/fixtures/vcr_cassettes/presence-nonssl-parameter-invalid-200-async.yml +85 -0
  251. data/fixtures/vcr_cassettes/presence-nonssl-parameter-invalid-200-sync.yml +85 -0
  252. data/fixtures/vcr_cassettes/presence-nonssl-parameter-invalid-non-200-async.yml +85 -0
  253. data/fixtures/vcr_cassettes/presence-nonssl-parameter-invalid-non-200-sync.yml +85 -0
  254. data/fixtures/vcr_cassettes/presence-nonssl-parameter-valid-200-async.yml +87 -0
  255. data/fixtures/vcr_cassettes/presence-nonssl-parameter-valid-200-sync.yml +87 -0
  256. data/fixtures/vcr_cassettes/presence-nonssl-parameter-valid-non-200-async.yml +87 -0
  257. data/fixtures/vcr_cassettes/presence-nonssl-parameter-valid-non-200-sync.yml +87 -0
  258. data/fixtures/vcr_cassettes/presence-ssl-block-invalid-200-async.yml +85 -0
  259. data/fixtures/vcr_cassettes/presence-ssl-block-invalid-200-sync.yml +85 -0
  260. data/fixtures/vcr_cassettes/presence-ssl-block-invalid-non-200-async.yml +85 -0
  261. data/fixtures/vcr_cassettes/presence-ssl-block-invalid-non-200-sync.yml +85 -0
  262. data/fixtures/vcr_cassettes/presence-ssl-block-valid-200-async.yml +87 -0
  263. data/fixtures/vcr_cassettes/presence-ssl-block-valid-200-sync-new.yml +81 -0
  264. data/fixtures/vcr_cassettes/presence-ssl-block-valid-200-sync.yml +85 -0
  265. data/fixtures/vcr_cassettes/presence-ssl-block-valid-non-200-async.yml +87 -0
  266. data/fixtures/vcr_cassettes/presence-ssl-block-valid-non-200-sync.yml +87 -0
  267. data/fixtures/vcr_cassettes/presence-ssl-parameter-invalid-200-async.yml +85 -0
  268. data/fixtures/vcr_cassettes/presence-ssl-parameter-invalid-200-sync.yml +85 -0
  269. data/fixtures/vcr_cassettes/presence-ssl-parameter-invalid-non-200-async.yml +85 -0
  270. data/fixtures/vcr_cassettes/presence-ssl-parameter-invalid-non-200-sync.yml +85 -0
  271. data/fixtures/vcr_cassettes/presence-ssl-parameter-valid-200-async.yml +87 -0
  272. data/fixtures/vcr_cassettes/presence-ssl-parameter-valid-200-sync.yml +87 -0
  273. data/fixtures/vcr_cassettes/presence-ssl-parameter-valid-non-200-async.yml +87 -0
  274. data/fixtures/vcr_cassettes/presence-ssl-parameter-valid-non-200-sync.yml +87 -0
  275. data/fixtures/vcr_cassettes/publish-nonssl-block-invalid-200-async.yml +44 -0
  276. data/fixtures/vcr_cassettes/publish-nonssl-block-invalid-200-sync.yml +44 -0
  277. data/fixtures/vcr_cassettes/publish-nonssl-block-invalid-non-200-async.yml +44 -0
  278. data/fixtures/vcr_cassettes/publish-nonssl-block-invalid-non-200-sync.yml +44 -0
  279. data/fixtures/vcr_cassettes/publish-nonssl-block-valid-200-async.yml +44 -0
  280. data/fixtures/vcr_cassettes/publish-nonssl-block-valid-200-sync.yml +44 -0
  281. data/fixtures/vcr_cassettes/publish-nonssl-block-valid-non-200-async.yml +44 -0
  282. data/fixtures/vcr_cassettes/publish-nonssl-block-valid-non-200-sync.yml +44 -0
  283. data/fixtures/vcr_cassettes/publish-nonssl-parameter-invalid-200-async.yml +44 -0
  284. data/fixtures/vcr_cassettes/publish-nonssl-parameter-invalid-200-sync.yml +44 -0
  285. data/fixtures/vcr_cassettes/publish-nonssl-parameter-invalid-non-200-async.yml +44 -0
  286. data/fixtures/vcr_cassettes/publish-nonssl-parameter-invalid-non-200-sync.yml +44 -0
  287. data/fixtures/vcr_cassettes/publish-nonssl-parameter-valid-200-async.yml +44 -0
  288. data/fixtures/vcr_cassettes/publish-nonssl-parameter-valid-200-sync.yml +44 -0
  289. data/fixtures/vcr_cassettes/publish-nonssl-parameter-valid-non-200-async.yml +44 -0
  290. data/fixtures/vcr_cassettes/publish-nonssl-parameter-valid-non-200-sync.yml +44 -0
  291. data/fixtures/vcr_cassettes/publish-ssl-block-invalid-200-async.yml +44 -0
  292. data/fixtures/vcr_cassettes/publish-ssl-block-invalid-200-sync.yml +44 -0
  293. data/fixtures/vcr_cassettes/publish-ssl-block-invalid-non-200-async.yml +44 -0
  294. data/fixtures/vcr_cassettes/publish-ssl-block-invalid-non-200-sync.yml +44 -0
  295. data/fixtures/vcr_cassettes/publish-ssl-block-valid-200-async.yml +44 -0
  296. data/fixtures/vcr_cassettes/publish-ssl-block-valid-200-sync.yml +44 -0
  297. data/fixtures/vcr_cassettes/publish-ssl-block-valid-non-200-async.yml +44 -0
  298. data/fixtures/vcr_cassettes/publish-ssl-block-valid-non-200-sync.yml +44 -0
  299. data/fixtures/vcr_cassettes/publish-ssl-parameter-invalid-200-async.yml +44 -0
  300. data/fixtures/vcr_cassettes/publish-ssl-parameter-invalid-200-sync.yml +44 -0
  301. data/fixtures/vcr_cassettes/publish-ssl-parameter-invalid-non-200-async.yml +44 -0
  302. data/fixtures/vcr_cassettes/publish-ssl-parameter-invalid-non-200-sync.yml +44 -0
  303. data/fixtures/vcr_cassettes/publish-ssl-parameter-valid-200-async.yml +44 -0
  304. data/fixtures/vcr_cassettes/publish-ssl-parameter-valid-200-sync.yml +44 -0
  305. data/fixtures/vcr_cassettes/publish-ssl-parameter-valid-non-200-async.yml +44 -0
  306. data/fixtures/vcr_cassettes/publish-ssl-parameter-valid-non-200-sync.yml +44 -0
  307. data/fixtures/vcr_cassettes/revoke-nonssl-block-invalid-200-async.yml +44 -0
  308. data/fixtures/vcr_cassettes/revoke-nonssl-block-invalid-200-sync.yml +44 -0
  309. data/fixtures/vcr_cassettes/revoke-nonssl-block-invalid-non-200-async.yml +44 -0
  310. data/fixtures/vcr_cassettes/revoke-nonssl-block-invalid-non-200-sync.yml +44 -0
  311. data/fixtures/vcr_cassettes/revoke-nonssl-block-valid-200-async.yml +45 -0
  312. data/fixtures/vcr_cassettes/revoke-nonssl-block-valid-200-sync.yml +45 -0
  313. data/fixtures/vcr_cassettes/revoke-nonssl-block-valid-non-200-async.yml +45 -0
  314. data/fixtures/vcr_cassettes/revoke-nonssl-block-valid-non-200-sync.yml +45 -0
  315. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-invalid-200-async.yml +44 -0
  316. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-invalid-200-sync.yml +44 -0
  317. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-invalid-non-200-async.yml +44 -0
  318. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-invalid-non-200-sync.yml +44 -0
  319. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-valid-200-async.yml +45 -0
  320. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-valid-200-sync.yml +45 -0
  321. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-valid-non-200-async.yml +45 -0
  322. data/fixtures/vcr_cassettes/revoke-nonssl-parameter-valid-non-200-sync.yml +45 -0
  323. data/fixtures/vcr_cassettes/revoke-ssl-block-invalid-200-async.yml +44 -0
  324. data/fixtures/vcr_cassettes/revoke-ssl-block-invalid-200-sync.yml +44 -0
  325. data/fixtures/vcr_cassettes/revoke-ssl-block-invalid-non-200-async.yml +44 -0
  326. data/fixtures/vcr_cassettes/revoke-ssl-block-invalid-non-200-sync.yml +44 -0
  327. data/fixtures/vcr_cassettes/revoke-ssl-block-valid-200-async.yml +45 -0
  328. data/fixtures/vcr_cassettes/revoke-ssl-block-valid-200-sync.yml +45 -0
  329. data/fixtures/vcr_cassettes/revoke-ssl-block-valid-non-200-async.yml +45 -0
  330. data/fixtures/vcr_cassettes/revoke-ssl-block-valid-non-200-sync.yml +45 -0
  331. data/fixtures/vcr_cassettes/revoke-ssl-parameter-invalid-200-async.yml +44 -0
  332. data/fixtures/vcr_cassettes/revoke-ssl-parameter-invalid-200-sync.yml +44 -0
  333. data/fixtures/vcr_cassettes/revoke-ssl-parameter-invalid-non-200-async.yml +44 -0
  334. data/fixtures/vcr_cassettes/revoke-ssl-parameter-invalid-non-200-sync.yml +44 -0
  335. data/fixtures/vcr_cassettes/revoke-ssl-parameter-valid-200-async.yml +45 -0
  336. data/fixtures/vcr_cassettes/revoke-ssl-parameter-valid-200-sync.yml +45 -0
  337. data/fixtures/vcr_cassettes/revoke-ssl-parameter-valid-non-200-async.yml +45 -0
  338. data/fixtures/vcr_cassettes/revoke-ssl-parameter-valid-non-200-sync.yml +45 -0
  339. data/fixtures/vcr_cassettes/single-event-invalid-json.yml +208 -0
  340. data/fixtures/vcr_cassettes/single-event-non200.yml +44 -0
  341. data/fixtures/vcr_cassettes/subscribe-nonssl-block-invalid-200-async.yml +85 -0
  342. data/fixtures/vcr_cassettes/subscribe-nonssl-block-invalid-200-sync.yml +85 -0
  343. data/fixtures/vcr_cassettes/subscribe-nonssl-block-invalid-non-200-async.yml +85 -0
  344. data/fixtures/vcr_cassettes/subscribe-nonssl-block-invalid-non-200-sync.yml +85 -0
  345. data/fixtures/vcr_cassettes/subscribe-nonssl-block-valid-200-async.yml +85 -0
  346. data/fixtures/vcr_cassettes/subscribe-nonssl-block-valid-200-sync.yml +85 -0
  347. data/fixtures/vcr_cassettes/subscribe-nonssl-block-valid-non-200-async.yml +85 -0
  348. data/fixtures/vcr_cassettes/subscribe-nonssl-block-valid-non-200-sync.yml +85 -0
  349. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-invalid-200-async.yml +85 -0
  350. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-invalid-200-sync.yml +85 -0
  351. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-invalid-non-200-async.yml +85 -0
  352. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-invalid-non-200-sync.yml +85 -0
  353. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-valid-200-async.yml +85 -0
  354. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-valid-200-sync.yml +85 -0
  355. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-valid-non-200-async.yml +85 -0
  356. data/fixtures/vcr_cassettes/subscribe-nonssl-parameter-valid-non-200-sync.yml +85 -0
  357. data/fixtures/vcr_cassettes/subscribe-ssl-block-invalid-200-async.yml +85 -0
  358. data/fixtures/vcr_cassettes/subscribe-ssl-block-invalid-200-sync.yml +85 -0
  359. data/fixtures/vcr_cassettes/subscribe-ssl-block-invalid-non-200-async.yml +85 -0
  360. data/fixtures/vcr_cassettes/subscribe-ssl-block-invalid-non-200-sync.yml +85 -0
  361. data/fixtures/vcr_cassettes/subscribe-ssl-block-valid-200-async.yml +85 -0
  362. data/fixtures/vcr_cassettes/subscribe-ssl-block-valid-200-sync.yml +85 -0
  363. data/fixtures/vcr_cassettes/subscribe-ssl-block-valid-non-200-async.yml +85 -0
  364. data/fixtures/vcr_cassettes/subscribe-ssl-block-valid-non-200-sync.yml +85 -0
  365. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-invalid-200-async.yml +85 -0
  366. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-invalid-200-sync.yml +85 -0
  367. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-invalid-non-200-async.yml +85 -0
  368. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-invalid-non-200-sync.yml +85 -0
  369. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-valid-200-async.yml +85 -0
  370. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-valid-200-sync.yml +85 -0
  371. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-valid-non-200-async.yml +85 -0
  372. data/fixtures/vcr_cassettes/subscribe-ssl-parameter-valid-non-200-sync.yml +85 -0
  373. data/fixtures/vcr_cassettes/subscription-event-invalid-json.yml +454 -0
  374. data/fixtures/vcr_cassettes/subscription-event-non200.yml +208 -0
  375. data/fixtures/vcr_cassettes/time-nonssl-block-invalid-200-async.yml +44 -0
  376. data/fixtures/vcr_cassettes/time-nonssl-block-invalid-200-sync.yml +44 -0
  377. data/fixtures/vcr_cassettes/time-nonssl-block-invalid-non-200-async.yml +44 -0
  378. data/fixtures/vcr_cassettes/time-nonssl-block-invalid-non-200-sync.yml +44 -0
  379. data/fixtures/vcr_cassettes/time-nonssl-block-valid-200-async.yml +44 -0
  380. data/fixtures/vcr_cassettes/time-nonssl-block-valid-200-sync.yml +44 -0
  381. data/fixtures/vcr_cassettes/time-nonssl-block-valid-non-200-async.yml +44 -0
  382. data/fixtures/vcr_cassettes/time-nonssl-block-valid-non-200-sync.yml +44 -0
  383. data/fixtures/vcr_cassettes/time-nonssl-parameter-invalid-200-async.yml +44 -0
  384. data/fixtures/vcr_cassettes/time-nonssl-parameter-invalid-200-sync.yml +44 -0
  385. data/fixtures/vcr_cassettes/time-nonssl-parameter-invalid-non-200-async.yml +44 -0
  386. data/fixtures/vcr_cassettes/time-nonssl-parameter-invalid-non-200-sync.yml +44 -0
  387. data/fixtures/vcr_cassettes/time-nonssl-parameter-valid-200-async.yml +44 -0
  388. data/fixtures/vcr_cassettes/time-nonssl-parameter-valid-200-sync.yml +44 -0
  389. data/fixtures/vcr_cassettes/time-nonssl-parameter-valid-non-200-async.yml +44 -0
  390. data/fixtures/vcr_cassettes/time-nonssl-parameter-valid-non-200-sync.yml +44 -0
  391. data/fixtures/vcr_cassettes/time-ssl-block-invalid-200-async.yml +44 -0
  392. data/fixtures/vcr_cassettes/time-ssl-block-invalid-200-sync.yml +44 -0
  393. data/fixtures/vcr_cassettes/time-ssl-block-invalid-non-200-async.yml +44 -0
  394. data/fixtures/vcr_cassettes/time-ssl-block-invalid-non-200-sync.yml +44 -0
  395. data/fixtures/vcr_cassettes/time-ssl-block-valid-200-async.yml +44 -0
  396. data/fixtures/vcr_cassettes/time-ssl-block-valid-200-sync.yml +44 -0
  397. data/fixtures/vcr_cassettes/time-ssl-block-valid-non-200-async.yml +44 -0
  398. data/fixtures/vcr_cassettes/time-ssl-block-valid-non-200-sync.yml +44 -0
  399. data/fixtures/vcr_cassettes/time-ssl-parameter-invalid-200-async.yml +44 -0
  400. data/fixtures/vcr_cassettes/time-ssl-parameter-invalid-200-sync.yml +44 -0
  401. data/fixtures/vcr_cassettes/time-ssl-parameter-invalid-non-200-async.yml +44 -0
  402. data/fixtures/vcr_cassettes/time-ssl-parameter-invalid-non-200-sync.yml +44 -0
  403. data/fixtures/vcr_cassettes/time-ssl-parameter-valid-200-async.yml +44 -0
  404. data/fixtures/vcr_cassettes/time-ssl-parameter-valid-200-sync.yml +44 -0
  405. data/fixtures/vcr_cassettes/time-ssl-parameter-valid-non-200-async.yml +44 -0
  406. data/fixtures/vcr_cassettes/time-ssl-parameter-valid-non-200-sync.yml +44 -0
  407. data/lib/pubnub.rb +7 -15
  408. data/lib/pubnub/client.rb +189 -468
  409. data/lib/pubnub/configuration.rb +27 -20
  410. data/lib/pubnub/crypto.rb +11 -4
  411. data/lib/pubnub/envelope.rb +45 -0
  412. data/lib/pubnub/event.rb +470 -0
  413. data/lib/pubnub/events/audit.rb +38 -0
  414. data/lib/pubnub/events/grant.rb +59 -0
  415. data/lib/pubnub/events/here_now.rb +55 -0
  416. data/lib/pubnub/events/history.rb +110 -0
  417. data/lib/pubnub/events/leave.rb +73 -0
  418. data/lib/pubnub/events/presence.rb +35 -0
  419. data/lib/pubnub/events/publish.rb +71 -0
  420. data/lib/pubnub/events/revoke.rb +56 -0
  421. data/lib/pubnub/events/subscribe.rb +34 -0
  422. data/lib/pubnub/events/time.rb +52 -0
  423. data/lib/pubnub/exceptions.rb +50 -0
  424. data/lib/pubnub/formatter.rb +45 -0
  425. data/lib/pubnub/pam.rb +59 -0
  426. data/lib/pubnub/parser.rb +21 -0
  427. data/lib/pubnub/validator.rb +29 -0
  428. data/lib/version.rb +3 -0
  429. data/pubnub.gemspec +3 -5
  430. data/spec/lib/client_spec.rb +27 -325
  431. data/spec/lib/encoder_spec.rb +51 -0
  432. data/spec/lib/formatting_envelope_spec.rb +304 -0
  433. data/spec/lib/integration/audit_spec.rb +544 -0
  434. data/spec/lib/integration/grant_spec.rb +544 -0
  435. data/spec/lib/integration/here_now_spec.rb +543 -0
  436. data/spec/lib/integration/history_spec.rb +541 -0
  437. data/spec/lib/integration/leave_spec.rb +540 -0
  438. data/spec/lib/integration/presence_spec.rb +557 -0
  439. data/spec/lib/integration/publish_spec.rb +541 -0
  440. data/spec/lib/integration/revoke_spec.rb +544 -0
  441. data/spec/lib/integration/subscribe_spec.rb +564 -0
  442. data/spec/lib/integration/time_spec.rb +541 -0
  443. data/spec/lib/new_integration/publish_spec.rb +1867 -0
  444. data/spec/lib/retry_logic_spec.rb +53 -0
  445. data/spec/spec_helper.rb +28 -2
  446. data/spec/tools/pam-test-generator.rb +367 -0
  447. data/spec/tools/test-generator.rb +310 -0
  448. metadata +434 -50
  449. data/.yardoc/checksums +0 -13
  450. data/.yardoc/object_types +0 -0
  451. data/.yardoc/objects/root.dat +0 -0
  452. data/.yardoc/proxy_types +0 -0
  453. data/lib/pubnub/error.rb +0 -23
  454. data/lib/pubnub/request.rb +0 -288
  455. data/lib/pubnub/response.rb +0 -126
  456. data/lib/pubnub/subscription.rb +0 -24
  457. data/lib/pubnub/version.rb +0 -3
  458. data/lib/tasks/examples.rake +0 -39
  459. data/spec/lib/crypto_spec.rb +0 -89
  460. data/spec/lib/history_integration_spec.rb +0 -0
  461. data/spec/lib/presence_integration_spec.rb +0 -16
  462. data/spec/lib/publish_integration_spec.rb +0 -994
  463. data/spec/lib/pubnub_spec.rb +0 -12
  464. data/spec/lib/request_spec.rb +0 -151
  465. data/spec/lib/subscribe_integration_spec.rb +0 -944
  466. data/spec/lib/subscribe_timeout_spec.rb +0 -65
  467. data/spec/lib/time_integration_spec.rb +0 -0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/time/0?auth=demoish_authkey&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 500 # INTERNAL SERVER ERROR
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 22 Jan 2014 22:36:28 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '19'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[13904301869920523'
42
+ http_version:
43
+ recorded_at: Wed, 22 Jan 2014 22:36:28 GMT
44
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/time/0?auth=demoish_authkey&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 500 # INTERNAL SERVER ERROR
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 22 Jan 2014 22:36:26 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '19'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[13904301869920523'
42
+ http_version:
43
+ recorded_at: Wed, 22 Jan 2014 22:36:26 GMT
44
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/time/0?auth=demoish_authkey&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 22 Jan 2014 22:36:22 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '19'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[13904301930718907]'
42
+ http_version:
43
+ recorded_at: Wed, 22 Jan 2014 22:36:22 GMT
44
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/time/0?auth=demoish_authkey&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 22 Jan 2014 22:36:21 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '19'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[13904301930718907]'
42
+ http_version:
43
+ recorded_at: Wed, 22 Jan 2014 22:36:21 GMT
44
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/time/0?auth=demoish_authkey&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 500 # INTERNAL SERVER ERROR
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 22 Jan 2014 22:36:24 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '19'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[13904301930718907]'
42
+ http_version:
43
+ recorded_at: Wed, 22 Jan 2014 22:36:24 GMT
44
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://pubsub.pubnub.com/time/0?auth=demoish_authkey&uuid=rubytests
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.0
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - '*/*'
16
+ Connection:
17
+ - keep-alive
18
+ Keep-Alive:
19
+ - 30
20
+ response:
21
+ status:
22
+ code: 500 # INTERNAL SERVER ERROR
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Wed, 22 Jan 2014 22:36:22 GMT
27
+ Content-Type:
28
+ - text/javascript; charset="UTF-8"
29
+ Content-Length:
30
+ - '19'
31
+ Connection:
32
+ - keep-alive
33
+ Cache-Control:
34
+ - no-cache
35
+ Access-Control-Allow-Origin:
36
+ - '*'
37
+ Access-Control-Allow-Methods:
38
+ - GET
39
+ body:
40
+ encoding: UTF-8
41
+ string: '[13904301930718907]'
42
+ http_version:
43
+ recorded_at: Wed, 22 Jan 2014 22:36:22 GMT
44
+ recorded_with: VCR 2.8.0
data/lib/pubnub.rb CHANGED
@@ -2,28 +2,25 @@
2
2
  ## http://www.pubnub.com/blog/ruby-push-api - Ruby Push API Blog
3
3
 
4
4
  ## PubNub Real Time Push APIs and Notifications Framework
5
- ## Copyright (c) 2013 PubNub
5
+ ## Copyright (c) 2014 PubNub
6
6
  ## http://www.pubnub.com/
7
7
 
8
8
  ## -----------------------------------
9
- ## PubNub 3.4 Real-time Push Cloud API
9
+ ## PubNub 3.5.1 Real-time Push Cloud API
10
10
  ## -----------------------------------
11
11
 
12
12
  require 'json'
13
13
  require 'base64'
14
14
  require 'open-uri'
15
- require 'uri'
16
15
  require 'openssl'
17
16
  require 'eventmachine'
18
- require 'em-http-request'
17
+ require 'net/http/persistent'
18
+ require 'logger'
19
19
 
20
- require 'pubnub/version.rb'
20
+ require 'version'
21
+
22
+ require 'pubnub/client'
21
23
 
22
- require 'pubnub/client.rb'
23
- require 'pubnub/request.rb'
24
- require 'pubnub/configuration.rb'
25
- require 'pubnub/error.rb'
26
- require 'pubnub/crypto.rb'
27
24
 
28
25
  class Object
29
26
  def blank?
@@ -46,13 +43,8 @@ class Proc
46
43
  end
47
44
 
48
45
  module Pubnub
49
- extend Configuration
50
- include Error
51
-
52
46
  class << self
53
47
  def new(options = {})
54
- #raise(Pubnub::Error::InitError, 'Initialize with either a hash of options, or exactly 5 named parameters.') unless args.size == 5 or (args.size == 1 and args[0].class == Hash)
55
-
56
48
  Pubnub::Client.new(options)
57
49
  end
58
50
  end
data/lib/pubnub/client.rb CHANGED
@@ -1,535 +1,256 @@
1
- require 'pubnub/configuration.rb'
2
- require 'pubnub/subscription.rb'
3
- require 'em-http-request'
4
- require 'httparty'
5
- require 'persistent_httparty'
6
- require 'timeout'
1
+ require 'pubnub/configuration'
2
+ require 'pubnub/parser'
3
+ require 'pubnub/envelope'
4
+ require 'pubnub/crypto'
7
5
  require 'pubnub/uuid'
6
+ require 'pubnub/exceptions'
7
+ require 'pubnub/event'
8
+ require 'pubnub/formatter'
9
+ require 'pubnub/validator'
10
+ require 'pubnub/pam'
8
11
 
9
12
  module Pubnub
10
- class PubNubHTTParty
11
- include HTTParty
12
- default_timeout 310
13
-
14
- def first_run?
15
- @first_run ? true : false
16
- end
17
-
18
- def send_request(path, options={}, &block)
19
- if @first_run.nil?
20
- @first_run = true
21
- else
22
- @first_run = false
23
- end
24
- self.class.get path, options
25
-
26
- end
27
- end
28
-
29
13
  class Client
30
14
  include Configuration
31
15
 
32
- attr_accessor :uuid, :cipher_key, :host, :query, :response, :timetoken, :url, :operation, :callback, :publish_key, :subscribe_key, :secret_key, :channel, :jsonp, :message, :ssl, :port
33
- attr_accessor :close_connection, :history_limit, :history_count, :history_start, :history_end, :history_reverse, :session_uuid, :last_timetoken, :origin, :error
34
-
35
-
36
- DEFAULT_CONNECT_CALLBACK = lambda { |msg| $log.info "CONNECTED: #{msg}" }
37
- DEFAULT_ERROR_CALLBACK = lambda { |msg| $log.error "AN ERROR OCCURRED: #{msg}" }
38
-
39
- def initialize(options = {})
40
- $log = options[:logger]
41
- $log = Logger.new('pubnub.log', 0, 100 * 1024 * 1024) unless $log
42
-
43
- @subscriptions = Array.new
16
+ attr_reader :env
17
+ attr_accessor :single_event_connections_pool, :subscribe_event_connections_pool, :uuid, :async_events
44
18
 
45
- @subscription_request = nil
46
- @retry = true
47
- @retry_count = 0
48
- @callback = options[:callback]
49
- @error_callback = options[:error_callback]
50
- @error_callback = DEFAULT_ERROR_CALLBACK unless @error_callback
51
- @connect_callback = options[:connect_callback]
52
- @connect_callback = DEFAULT_CONNECT_CALLBACK unless @connect_callback
53
- @cipher_key = options[:cipher_key]
54
- @publish_key = options[:publish_key] || DEFAULT_PUBLISH_KEY
55
- @subscribe_key = options[:subscribe_key] || DEFAULT_SUBSCRIBE_KEY
56
- @channel = options[:channel] || DEFAULT_CHANNEL
57
- @message = options[:message]
58
- @ssl = options[:ssl]
59
- @secret_key = options[:secret_key]
60
- @timetoken = options[:timetoken]
61
- @session_uuid = options[:uuid] || options[:session_uuid] || UUID.new.generate
19
+ EVENTS = %w(publish subscribe presence leave history here_now audit grant revoke time)
20
+ VERSION = Pubnub::VERSION
62
21
 
63
- @history_count = options[:count]
64
- @history_start = options[:start]
65
- @history_end = options[:end]
66
- @history_reverse = options[:reverse]
67
-
68
- @port = options[:port]
69
- @url = options[:url]
70
- @origin = options[:origin]
71
- @origin = DEFAULT_ORIGIN unless @origin
72
- @query = options[:query]
73
-
74
- @http_sync = options[:http_sync]
75
-
76
- @max_retries = options[:max_retries]
77
- @max_retries = MAX_RETRIES unless @max_retries
78
-
79
- @non_subscribe_timeout = options[:non_subscribe_timeout]
80
- @non_subscribe_timeout = 5 unless @non_subscribe_timeout
81
-
82
- @reconnect_max_attempts = options[:reconnect_max_attempts]
83
- @reconnect_max_attempts = 60 unless @reconnect_max_attempts
22
+ EVENTS.each do |event_name|
23
+ require File.join('pubnub', 'events', event_name)
24
+ end
84
25
 
85
- @reconnect_retry_interval = options[:reconnect_retry_interval]
86
- @reconnect_retry_interval = 5 unless @reconnect_retry_interval
26
+ EVENTS.each do |event_name|
27
+ define_method event_name do |params, &block|
28
+ params[:callback] = block if params[:callback].nil?
29
+ event = Pubnub.const_get(classify_method(event_name)).new(params, self)
30
+ $logger.debug('Created event ' + event.class.to_s)
31
+ #if params[:http_sync]
32
+ event.fire(self)
33
+ #else
34
+ # EM.defer {
35
+ # begin
36
+ # event.fire(self)
37
+ # rescue => e
38
+ # puts e
39
+ # end
40
+ # }
41
+ #end
42
+ end
43
+ end
44
+ alias_method :unsubscribe, :leave
87
45
 
88
- @reconnect_response_timeout = options[:reconnect_response_timeout]
89
- @reconnect_response_timeout = 5 unless @reconnect_response_timeout
46
+ def initialize(options)
47
+ validate!(options)
48
+ setup_app(options)
49
+ # From this moment we have to use @env in that method instead of options
50
+ create_connections_pools(@env)
51
+ create_subscriptions_pools(@env)
52
+ start_event_machine(@env)
53
+ end
90
54
 
91
- @sync_connection_sub = Pubnub::PubNubHTTParty.new
92
- @sync_connection = Pubnub::PubNubHTTParty.new
55
+ def shutdown(stop_em = false)
56
+ @single_event_connections_pool.each do |origin, conn|
57
+ conn.shutdown_in_all_threads
58
+ conn = nil
59
+ end
60
+ @single_event_connections_pool = Hash.new
93
61
 
94
- @pause_subscribe = false
95
- end
62
+ @subscribe_event_connections_pool.each do |origin, conn|
63
+ conn.shutdown_in_all_threads
64
+ conn = nil
65
+ end
66
+ @subscribe_event_connections_pool = Hash.new
96
67
 
97
- def publish(options = {}, &block)
98
- options[:callback] = block if block_given?
99
- options = merge_options(options, 'publish')
100
- verify_operation('publish', options)
101
- start_request options
68
+ @env[:callback_pool] = Hash.new
69
+ @env[:subscriptions] = Hash.new
102
70
 
103
- end
71
+ EM.stop if stop_em
104
72
 
105
- def subscribe(options = {}, &block)
106
- options[:callback] = block if block_given?
107
- options = merge_options(options, 'subscribe')
108
- verify_operation('subscribe', options)
109
- @error_callback.call 'YOU ARE ALREADY SUBSCRIBED TO THAT CHANNEL' if get_channels_for_subscription.include? options[:channel]
110
- $log.error 'YOU ARE ALREADY SUBSCRIBED TO THAT CHANNEL' if get_channels_for_subscription.include? options[:channel]
111
- start_request options
73
+ $logger.info('Bye!')
112
74
  end
113
75
 
114
- def presence(options = {}, &block)
115
- options[:callback] = block if block_given?
116
- options = merge_options(options, 'presence')
117
- verify_operation('presence', options)
118
- start_request options
119
- end
76
+ def start_subscribe(override = false)
120
77
 
121
- def history(options = {}, &block)
122
- options[:callback] = block if block_given?
123
- options = merge_options(options, 'history')
124
- verify_operation('history', options)
125
- options[:params].merge!({:count => options[:count]})
126
- options[:params].merge!({:start => options[:start]}) unless options[:start].nil?
127
- options[:params].merge!({:end => options[:end]}) unless options[:end].nil?
128
- options[:params].merge!({:reverse => 'true'}) if options[:reverse]
129
- start_request options
130
- end
78
+ start_event_machine
131
79
 
132
- def leave(options = {}, &block)
133
- options[:callback] = block if block_given?
134
- options = merge_options(options, 'leave')
135
- verify_operation('leave', options)
136
- return false unless get_channels_for_subscription.include? options[:channel]
137
- remove_from_subscription options[:channel]
138
- if @subscriptions.empty?
139
- @timetoken = 0
140
- @subscription_request.timetoken = 0
141
- @subscribe_connection.close
142
- @wait_for_response = false
80
+ if override
81
+ $logger.debug('Pubnub::Client#start_subscribe | Override')
82
+ @env[:subscribe_railgun].cancel
83
+ @env[:subscribe_railgun] = nil
84
+ @env[:wait_for_response].each do |k,v|
85
+ @env[:wait_for_response][k] = false
86
+ end
143
87
  end
144
- start_request options
145
88
 
146
- end
89
+ @env[:wait_for_response] = Hash.new unless @wait_for_response
90
+ @env[:subscribe_railgun] = EM.add_periodic_timer(PERIODIC_TIMER_INTERVAL) do
91
+ begin
92
+ @env[:subscriptions].each do |origin, subscribe|
93
+ unless @env[:wait_for_response][origin]
94
+ @env[:wait_for_response][origin] = true
147
95
 
148
- alias_method :unsubscribe, :leave
96
+ $logger.debug('Async subscription running')
97
+ $logger.debug("origin: #{origin}")
98
+ $logger.debug("timetoken: #{@env[:timetoken]}")
149
99
 
150
- def here_now(options = {}, &block)
151
- options[:callback] = block if block_given?
152
- options = merge_options(options, 'here_now')
153
- verify_operation('here_now', options)
154
- start_request options
155
- end
100
+ EM.defer do
101
+ subscribe.start_event(self) if subscribe
102
+ # @env[:wait_for_response][origin] = false # moved to Event
103
+ end
156
104
 
157
- def time(options = {}, &block)
158
- options[:callback] = block if block_given?
159
- options = merge_options(options, 'time')
160
- verify_operation('time', options)
161
- start_request options
105
+ end
106
+ end
107
+ rescue => e
108
+ $logger.error(e)
109
+ $logger.error(e.backtrace)
110
+ end
111
+ end unless @env[:subscribe_railgun]
162
112
  end
163
113
 
164
114
  def subscription_running?
165
- @subscription_running
115
+ @env[:subscribe_railgun] && !@env[:subscriptions].empty? ? true : false
166
116
  end
167
117
 
168
- def active_subscriptions
169
- @subscription_request
118
+ def create_subscriptions_pools(env)
119
+ @env[:subscriptions] = Hash.new
120
+ @env[:callbacks_pool] = Hash.new
121
+ @env[:error_callbacks_pool] = Hash.new
170
122
  end
171
123
 
172
- private
173
-
174
- def remove_from_subscription(channel)
175
- @subscriptions.delete_if { |s| s.channel.to_s == channel.to_s }
176
- end
177
-
178
- def merge_options(options = {}, operation = '')
179
- options[:channel] = compile_channel_parameter(options[:channel],options[:channels]) if options[:channel] || options[:channels]
180
- return {
181
- :ssl => @ssl,
182
- :cipher_key => @cipher_key,
183
- :publish_key => @publish_key,
184
- :subscribe_key => @subscribe_key,
185
- :secret_key => @secret_key,
186
- :origin => @origin,
187
- :operation => operation,
188
- :params => { :uuid => @session_uuid },
189
- :timetoken => @timetoken,
190
- :error_callback=> @error_callback
191
- }.merge(options)
124
+ def update_timetoken(timetoken)
125
+ @env[:timetoken] = timetoken.to_i
126
+ $logger.debug("Pubnub::Client#update_timetoken | Current timetoken is eq #{@env[:timetoken]}")
192
127
  end
193
128
 
194
- def start_em_if_not_running
195
- Thread.new do
196
- EM.run
197
- end unless EM.reactor_running?
198
-
199
- until EM.reactor_running? do end
129
+ def set_uuid(uuid)
130
+ leave_all unless @env[:subscriptions].empty?
131
+ @env[:uuid] = uuid
132
+ start_subscribe(true) unless @env[:subscriptions].empty?
200
133
  end
134
+ alias_method :session_uuid=, :set_uuid
135
+ alias_method :uuid=, :set_uuid
201
136
 
202
- def get_channels_for_subscription
203
- @subscriptions.map do |sub|
204
- sub.channel
205
- end
137
+ def set_auth_key(auth_key)
138
+ leave_all unless @env[:subscriptions].empty?
139
+ @env[:auth_key] = auth_key
140
+ start_subscribe(true) unless @env[:subscriptions].empty?
206
141
  end
142
+ alias_method :auth_key=, :set_auth_key
207
143
 
208
- def fire_subscriptions_callback_for(envelope)
209
- @subscriptions.each do |subscription|
210
- subscription.fire_callback_for envelope
211
- end
144
+ def set_cipher_key(cipher_key)
145
+ @env[:cipher_key] = cipher_key
212
146
  end
147
+ alias_method :cipher_key=, :set_cipher_key
213
148
 
214
- def start_request(options)
215
- request = Pubnub::Request.new(options)
216
- unless options[:http_sync]
217
- start_em_if_not_running
218
-
219
- if %w(subscribe presence).include? request.operation
220
- options[:channel].split(',').each do |channel|
221
- @subscriptions << Subscription.new(:channel => channel, :callback => options[:callback], :error_callback => options[:error_callback]) unless get_channels_for_subscription.include? channel
222
- end
223
-
224
- @subscription_request = request unless @subscription_request
225
-
226
- if @subscription_request.channel != get_channels_for_subscription.join(',') && @subscription_running
227
- @subscribe_connection.close
228
- @timetoken = 0
229
- @subscription_request.timetoken = 0
230
- @wait_for_response = false
231
- end
232
-
233
- @subscription_request.channel = get_channels_for_subscription.join(',')
234
-
235
- @subscription_running = EM.add_periodic_timer(PERIODIC_TIMER) do
236
- unless @wait_for_response || get_channels_for_subscription.empty?
237
- @wait_for_response = true
238
- $log.debug 'SETTING CHANNELS'
239
- @subscription_request.channel = get_channels_for_subscription.join(',')
240
- $log.debug 'SENDING SUBSCRIBE REQUEST'
241
- http = send_request(@subscription_request)
242
-
243
- http.callback do
244
- $log.debug 'GOT SUBSCRIBE RESPONSE'
245
- if http.response_header.status.to_i == 200
246
- $log.debug 'STATUS 200'
247
- if is_valid_json?(http.response)
248
- $log.debug 'GOT VALID JSON'
249
- @subscription_request.handle_response(http)
250
- $log.debug 'HANDLED RESPONSE'
251
- if is_update?(@subscription_request.timetoken)
252
- $log.debug 'TIMETOKEN UPDATED'
253
- @subscription_request.envelopes.each do |envelope|
254
- fire_subscriptions_callback_for envelope
255
- end
256
- else
257
- $log.debug 'TIMETOKEN NOT UPDATED'
258
- end
259
- end
260
- else
261
- if request.error_callback
262
- request.error_callback.call Pubnub::Response.new(
263
- :error_init => true,
264
- :message => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json,
265
- :response => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json
266
- )
267
- else
268
- fire_subscriptions_callback_for Pubnub::Response.new(
269
- :error_init => true,
270
- :message => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json,
271
- :response => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json
272
- )
273
- end
274
-
275
- end
276
-
277
- @wait_for_response = false
278
- end
279
-
280
- http.errback do
281
- $log.error 'GOT SUBSCRIBE ERROR'
282
- @error_callback.call Pubnub::Response.new(
283
- :error_init => true,
284
- :message => [0, http.error].to_json,
285
- :response => [0, http.error].to_json
286
- )
287
- $log.error 'CALLED ERROR CALLBACK'
288
-
289
- @wait_for_response = false
290
- end
291
- end
292
- end unless @subscription_running
293
- else
294
- EM.next_tick do
295
- $log.debug 'SENDING OTHER REQUEST'
296
-
297
- http = send_request(request)
298
-
299
- http.errback do
300
- @error_callback.call [0, http.error]
301
- end
302
-
303
- http.callback do
304
- $log.debug 'GOT OTHER RESPONSE'
305
- #byebug
306
- if http.response_header.status.to_i == 200
307
- if is_valid_json?(http.response)
308
- request.handle_response(http)
309
- request.envelopes.each do |envelope|
310
- $log.debug 'CALLING PARAMETER CALLBACK'
311
- request.callback.call envelope
312
- end
313
- end
314
- else
315
- begin
316
- request.handle_response(http)
317
- request.envelopes.each do |envelope|
318
- if request.error_callback
319
- request.error_callback.call envelope
320
- else
321
- @error_callback.call envelope
322
- end
323
- end
324
-
325
- rescue
326
- if request.error_callback
327
- request.error_callback.call Pubnub::Response.new(
328
- :error_init => true,
329
- :message => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json,
330
- :response => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json
331
- )
332
- else
333
- @error_callback.call Pubnub::Response.new(
334
- :error_init => true,
335
- :message => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json,
336
- :response => [0, "Bad server response: #{http.response_header.status.to_i}"].to_json
337
- )
338
- end
339
- end
340
- end
341
- end
342
- end
343
- end
149
+ def start_railgun
150
+ if @env[:railgun]
151
+ $logger.debug('Pubnub::Client#start_railgun | Railgun already initialized')
344
152
  else
345
- begin
346
- if @timetoken.to_i == 0 && request.operation == 'subscribe'
347
- time(:http_sync => true){|envelope| @timetoken = envelope.message.to_i }
348
- end
349
- begin
350
- if request.query.to_s.empty?
351
- if %w(subscribe presence).include? request.operation
352
- response = @sync_connection_sub.send_request(request.origin + request.path, :timeout => 370)
353
- else
354
- response = @sync_connection.send_request(request.origin + request.path, :timeout => @non_subscribe_timeout)
355
- end
356
- else
357
- if %w(subscribe presence).include? request.operation
358
- response = @sync_connection_sub.send_request(request.origin + request.path, :query => request.query, :timeout => 370)
359
- else
360
- response = @sync_connection.send_request(request.origin + request.path, :query => request.query, :timeout => @non_subscribe_timeout)
361
- end
362
- end
363
- rescue
364
- msg = 'ERROR SENDING REQUEST'
365
- @error_callback.call Pubnub::Response.new(
366
- :error_init => true,
367
- :message => [0, msg].to_s,
368
- :response => [0, msg].to_s
369
- )
370
- @retries = 0 unless @retries
371
- @retries += 1
372
- if @retries <= @max_retries
373
- return start_request options
374
- else
375
- msg = "ERROR SENDING REQUEST AFTER #{@retries} RETRIES"
376
- @retries = 0
377
- return Pubnub::Response.new(
378
- :error_init => true,
379
- :message => [0, msg].to_s,
380
- :response => [0, msg].to_s
381
- )
382
- end
383
- end
384
-
385
- if @sync_connection_sub.first_run?
386
- @connect_callback.call 'SYNC CONNECTION ESTABLISHED'
387
- end
388
- if response.response.code.to_i == 200
389
- if is_valid_json?(response.body)
390
- request.handle_response(response)
391
- @timetoken = request.timetoken
392
-
393
- if request.operation == 'leave'
394
- Subscription.remove_from_subscription request.channel
395
- end
396
-
397
- if !request.callback.nil?
398
- request.envelopes.each do |envelope|
399
- request.callback.call envelope
400
- end
401
- else
402
- if %w(publish leave here_now time).include? request.operation
403
- return request.envelopes[0]
404
- else
405
- return request.envelopes
406
- end
407
- end
408
- end
409
- else
410
- begin
411
- request.handle_response(response)
412
- if !request.callback.nil?
413
- request.envelopes.each do |envelope|
414
- request.callback.call envelope
415
- end
416
- else
417
- if %w(publish leave here_now time).include? request.operation
418
- return request.envelopes[0]
419
- else
420
- return request.envelopes
421
- end
422
- end
423
- rescue
424
- if request.error_callback
425
- request.error_callback.call Pubnub::Response.new(
426
- :error_init => true,
427
- :message => [0, "Bad server response: #{response.response.code.to_i}"].to_json,
428
- :response => [0, "Bad server response: #{response.response.code.to_i}"].to_json
429
- )
430
- else
431
- @error_callback.call Pubnub::Response.new(
432
- :error_init => true,
433
- :message => [0, "Bad server response: #{response.response.code.to_i}"].to_json,
434
- :response => [0, "Bad server response: #{response.response.code.to_i}"].to_json
435
- )
436
- end
437
- end
438
-
439
- if @sync_retries
440
- @sync_retries += 1
441
- else
442
- @sync_retries = 1
153
+ $logger.debug('Pubnub::Client#start_railgun | Initializing railgun')
154
+ @env[:railgun] = EM.add_periodic_timer(0.01) do
155
+ @async_events.each do |event|
156
+ EM.defer do
157
+ event.fire(self) unless event.fired
443
158
  end
444
-
445
- if @sync_retries < @max_retries
446
- start_request options
447
- end
448
- end
449
- rescue Timeout::Error
450
- if request.error_callback
451
- request.error_callback.call [0, 'TIMEOUT']
452
- else
453
- @error_callback.call [0, 'TIMEOUT']
454
159
  end
160
+ @async_events.delete_if {|event| event.finished }
455
161
  end
456
162
  end
457
163
  end
458
164
 
459
- def send_request(request)
460
- if %w(subscribe presence).include? request.operation
461
- unless @subscribe_connection
462
- @subscribe_connection = EM::HttpRequest.new(request.origin, :connect_timeout => 370, :inactivity_timeout => 370)
463
- connection = @subscribe_connection.get :path => '/time/0', :keepalive => true, :query => request.query
464
- connection.callback do
465
- @connect_callback.call 'ASYNC SUBSCRIBE CONNECTION'
466
- end
467
- end
165
+ private
468
166
 
469
- @subscribe_connection.get :path => request.path, :query => request.query, :keepalive => true
470
- else
471
- unless @connection
472
- @connection = EM::HttpRequest.new request.origin
473
- end
474
- @connection.get :path => request.path, :query => request.query, :keepalive => true
167
+ def leave_all
168
+ @env[:subscriptions].each do |origin, subscribe|
169
+ leave(
170
+ :origin => origin,
171
+ :channel => subscribe.get_channels.map{|c| c.to_s}.join(','),
172
+ :http_sync => true,
173
+ :skip_remove => true
174
+ )
175
+
176
+ subscribe.set_timetoken(0)
475
177
  end
476
178
  end
477
179
 
478
- def is_update?(timetoken)
479
- if @timetoken.to_i < timetoken.to_i
480
- @timetoken = timetoken
180
+ def start_event_machine(options = nil)
181
+ $logger.debug 'Pubnub::Client#start_event_machine | starting EM in new thread'
182
+ if defined?(Thin)
183
+ $logger.debug('Pubnub::Client#start_event_machine | We\'re running on thin')
481
184
  else
482
- false
185
+ $logger.debug('Pubnub::Client#start_event_machine | We aren\'t running on thin')
483
186
  end
187
+ if EM.reactor_running?
188
+ $logger.debug 'Pubnub::Client#start_event_machine | EM already running'
189
+ else
190
+ Thread.new { EM.run {} }
191
+ $logger.debug 'Pubnub::Client#start_event_machine | EM started in new thread'
192
+ end
193
+ end
484
194
 
195
+ def setup_app(options)
196
+ $logger = options[:logger] || Logger.new('pubnub.log')
197
+ @env = symbolize_options_keys(options)
198
+ @env = set_default_values(@env)
199
+ @async_events = Array.new
200
+ $logger.debug("\n\nCreated new Pubnub::Client instance")
485
201
  end
486
202
 
487
- def is_valid_json?(response)
488
- begin
489
- JSON.parse(response)
490
- valid = true
491
- rescue
492
- valid = false
493
- end
494
- valid
203
+ def create_connections_pools(options)
204
+ @subscribe_event_connections_pool = Hash.new
205
+ @single_event_connections_pool = Hash.new
495
206
  end
496
207
 
497
- def verify_operation(operation, options)
498
- case operation
499
- when 'publish'
500
- raise(ArgumentError, 'publish() requires :channel, :message parameters and, if async, callback parameter or block given.') unless (options[:channel] || options[:channels]) && (options[:callback] || options[:block_given] || options[:http_sync]) && options[:message]
501
- when 'subscribe'
502
- raise(ArgumentError, 'subscribe() requires :channel parameters and, if async, callback parameter or block given.') unless (options[:channel] || options[:channels]) && (options[:callback] || options[:block_given] || options[:http_sync])
503
- when 'presence'
504
- raise(ArgumentError, 'presence() requires :channel parameters and, if async, callback parameter or block given.') unless (options[:channel] || options[:channels]) && (options[:callback] || options[:block_given] || options[:http_sync])
505
- when 'time'
506
- raise(ArgumentError, 'time() require, if async, callback parameter or block given.') unless (options[:callback] || options[:block_given] || options[:http_sync])
507
- when 'history'
508
- raise(ArgumentError, 'history() requires :channel, :count parameters and, if async, callback parameter or block given.') unless (options[:channel] || options[:channels]) && (options[:callback] || options[:block_given] || options[:http_sync]) && options[:count]
509
- when 'here_now'
510
- raise(ArgumentError, 'here_now() requires :channel parameters and, if async, callback parameter or block given.') unless (options[:channel] || options[:channels]) && (options[:callback] || options[:block_given] || options[:http_sync])
511
- when 'leave'
512
- raise(ArgumentError, 'leave() requires :channel parameters and, if async, callback parameter or block given.') unless (options[:channel] || options[:channels]) && (options[:callback] || options[:block_given] || options[:http_sync])
208
+ def set_default_values(env)
209
+ defaults = {
210
+ :error_callback => DEFAULT_ERROR_CALLBACK,
211
+ :connect_callback => DEFAULT_CONNECT_CALLBACK,
212
+ :ssl => DEFAULT_SSL,
213
+ :timetoken => DEFAULT_TIMETOKEN,
214
+ :uuid => UUID.new.generate,
215
+ :port => DEFAULT_CONNECTION_PORT,
216
+ :origin => DEFAULT_ORIGIN,
217
+ :subscribe_timeout => DEFAULT_SUBSCRIBE_TIMEOUT,
218
+ :timeout => DEFAULT_NON_SUBSCRIBE_TIMEOUT,
219
+ :max_retries => MAX_RETRIES,
220
+ :non_subscribe_timeout => DEFAULT_NON_SUBSCRIBE_TIMEOUT,
221
+ :reconnect_max_attempts => DEFAULT_RECONNECT_ATTEMPTS,
222
+ :reconnect_retry_interval => DEFAULT_RECONNECT_INTERVAL,
223
+ :reconnect_response_timeout => DEFAULT_RECONNECT_RESPONSE_TIMEOUT,
224
+ :ttl => DEFAULT_TTL,
225
+ :secret_key => 0
226
+ }
227
+
228
+ # Let's fill missing keys with default values
229
+ $logger.debug('Setting default values')
230
+ defaults.each do |key,default_value|
231
+ env[key] = default_value if @env[key].nil?
513
232
  end
514
233
 
515
- unless options[:callback].nil?
516
- raise('callback is invalid.') unless options[:callback].respond_to? 'call'
517
- end
234
+ env
235
+ end
518
236
 
519
- unless options[:error_callback].nil?
520
- raise('error_callback is invalid.') unless options[:error_callback].respond_to? 'call'
521
- end
237
+ def symbolize_options_keys(options)
238
+ $logger.debug('Symbolizing options keys')
239
+ symbolized_options = {}
240
+ options.each_key { |k| symbolized_options.merge!({ k.to_sym => options[k] }) }
241
+ symbolized_options
242
+ end
522
243
 
244
+ def classify_method(method)
245
+ method.split('_').map{ |w| w.capitalize }.join
523
246
  end
524
247
 
525
- def compile_channel_parameter(channel, channels)
526
- raise(ArgumentError, 'Can\'t handle both :channel and :channels parameters given.') if channel && channels
527
- channel = channels if channels
528
- channel = channel.to_s if channel.class == Symbol
529
- channel = channel.map! {|c| c.to_s}.join(',') if channel.class == Array
530
- return channel
248
+ def validate!(parameters)
249
+ raise InitializationError.new(:object => self, :message => 'Origin parameter is not valid. Should be type of String') unless parameters[:origin].is_a?(String) || parameters[:origin].blank?
250
+ raise InitializationError.new(:object => self, :message => 'Missing required :subscribe_key parameter') unless parameters[:subscribe_key]
251
+ raise InitializationError.new(:object => self, :message => 'Subscribe key parameter is not valid. Should be type of String or Symbol') unless [String, Symbol].include?(parameters[:subscribe_key].class)
252
+ raise InitializationError.new(:object => self, :message => 'Publish key parameter is not valid. Should be type of String or Symbol') unless [String, Symbol].include?(parameters[:publish_key].class) || parameters[:publish_key].blank?
531
253
  end
532
254
 
533
255
  end
534
256
  end
535
-