active_job_channel 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -32
  3. data/Rakefile +4 -6
  4. data/lib/active_job_channel/broadcaster.rb +52 -8
  5. data/lib/active_job_channel/channel.rb +14 -1
  6. data/lib/active_job_channel/engine.rb +2 -0
  7. data/lib/active_job_channel/version.rb +1 -1
  8. data/spec/dummy/app/assets/javascripts/application.js +1 -1
  9. data/spec/dummy/app/channels/application_cable/connection.rb +9 -0
  10. data/spec/dummy/app/controllers/front_controller.rb +1 -1
  11. data/spec/dummy/app/jobs/application_job.rb +3 -2
  12. data/spec/dummy/app/views/front/index.html.erb +0 -0
  13. data/spec/dummy/log/development.log +2351 -0
  14. data/spec/dummy/log/test.log +489 -0
  15. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0t/0tejrFqWXI50Nk5h03pKrzRRTpSa9CD2-MmcGjC1dZI.cache +1 -0
  16. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1T/1TTJ3TY7wBXzhvS0Tnk62v2jrjPoVI7pSQGHJJVYyvs.cache +1 -0
  17. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1w/1Wuwk1dBK3NQDz_c55vIsHRazPSL0j3A9TsporFDnXc.cache +0 -0
  18. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2L/2LPxIl3YMznuR8K3qWClBN7cYkrPKOVMkT_RQktzDa0.cache +0 -0
  19. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2c/2cdVaBRkw1fktXRADGAFVl6IXiKE0zRrfq9E8BdpkoE.cache +0 -0
  20. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2j/2jsBEFjxpI9mgoh9KnIwUyIbc79e6KGAP7Eg_o917tY.cache +1 -0
  21. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3h/3He84eXCmvSIkgIN9Lwua6gBtl-IT-OInwD14ALNux4.cache +0 -0
  22. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3l/3lI7QHJYJ-cFmLwHYDucw9MU813-JaOBjoNRZ5tknjA.cache +0 -0
  23. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3v/3vCIBAd9ejRDHSdlE95q_OM_CIqmAO45TJHKnk_G-ps.cache +1 -0
  24. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4r/4r-50M4p_5L3R45mEoON7TLkD8HZdA66BheutvIEk_Q.cache +0 -0
  25. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/59/59gq16Ydq4pK_fqn2PQthAB7yPTLtlZYAB5F7vHki4g.cache +0 -0
  26. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/59/59vvsILoKoFeWiuplQOdlUk89oC_77WcQ0p5ledvTiE.cache +1 -0
  27. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5s/5sR7_TAwQKd_Jr6J0s5V74RGPIgbR-9S9y0bOjPIAfk.cache +1 -0
  28. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6E/6eW6n154upbD0wIld8-torTQfQQdHcpAQVPCmTkO-Ms.cache +1 -0
  29. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6K/6kejUHzcbzTmAW8AM3HXjgEd3DgvPpHRCAsJy8V8a8w.cache +0 -0
  30. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6P/6p9TzLwDjZbYc1kmw6l1JEIN-q6Ro9d7VJx7iY-UO40.cache +1 -0
  31. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6a/6ahukXUYrbt30MCkbkfla3JlrLkO5Cv5FmOFYvxZpTs.cache +1 -0
  32. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6t/6ty212kvMsWZsxC1nyjugItdSlbM3bP-L7EE-0oRcbg.cache +1 -0
  33. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7a/7aIyAED7jZHA_p7ZqToxx2O1F5sqcYIgFXLoZWEMWVE.cache +0 -0
  34. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8h/8hlDlNMesbnOsyljy8ciU1R45hAp7BOyebqCe_Dmy_Y.cache +1 -0
  35. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8j/8jAuYQzZIhRKZxHVubNbhlU1WQnD8fI60PqmG69Da7Q.cache +1 -0
  36. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8w9YqUUADUiny_kog6ZTLNlY5Ia8ywmVInNmI45-bLk.cache +0 -0
  37. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9B/9BlzJuWy7Qc5Qufw2B01zF_Cq71nkZfG-9rmgwCtKOM.cache +2 -0
  38. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9a/9aE7wF6_y4j98FycX155lKpJAQxPqysXQqBel9xXKdQ.cache +1 -0
  39. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/A4/A4N4KZTnvHrZo5cpyYUminUKO82ucW4G1HTPzXYCDnU.cache +1 -0
  40. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AH/AHOUi3TIgivdm9HG3l_6Ms9TDg2ZH8HhUN9DflFPT_Q.cache +1 -0
  41. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ar/ArkKH805v2j4YvEK_fJ20wzvt92hlEyLQt9l_MPyCYI.cache +1 -0
  42. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/B0/B0YM5EsqVpuXiSFZvaaWTLDm-KsL8L0WGMaFquRdGMA.cache +0 -0
  43. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BE/BEnAsncgltZzyd5iczHx5EI9-dS3dETH55TiSuiGGZY.cache +1 -0
  44. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BO/BOjcf8tuEvpDlQt2vpb7SjXoezM9fUc-pW76Iub5bD8.cache +1 -0
  45. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BS/BSY4TP5wBI4XcYCAes1TUcJQ20USCBrvjPVOHx1zvOY.cache +0 -0
  46. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/BY/BY_FLwd7Tbcf3ABQuWlJZOB87K0BVWtJaJwEf6TJBxw.cache +1 -0
  47. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C7/c7_j9vpOp9_1Sn7xKAHvWVImMLb1slk94ICEkURiZ04.cache +2 -0
  48. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Fm/fmsz2sflSkcF4bILqyaSU93RnxNYSU9JUKtO5lOM2_4.cache +1 -0
  49. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HH/HHkyK2aHiljUNkNNQSH6y3f7XX-5BeuCv0Kxfs27J2w.cache +0 -0
  50. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hd/HdRTrM_GRYHyBl9OMca3EB5UDvWbnmZJt3tPn4ltZ3Q.cache +1 -0
  51. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Km/KmyH84dp9P6zgt6Up2IGn1jBH7e2eoDAKlNqbB7ZI1w.cache +1 -0
  52. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LE/Le2izv3CUcPoFgzJNPKebBh4mx3tsAbqfziAcM--0Jc.cache +0 -0
  53. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MB/mBni0KSvr3gZ9hy31uEB8y-cxFVfMYletrPUbEevpBo.cache +0 -0
  54. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MX/MXoiOs93U88XCQkqYZKUjQRw6FMZblU5tSDPB7uLBpU.cache +1 -0
  55. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mp/Mpb9smslW1sntnjWAo0Jj8p48SaTZvrmaXtn0jhJuoY.cache +0 -0
  56. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QI/QI1z63uCSktHwJUcpH6NJVElFZuT_9pB_OlD5HodGj4.cache +3 -0
  57. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qd/QdoaSQXuW_lEPqzgbsM2vvL_OnxqiLolqXXavy0cbHU.cache +0 -0
  58. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qj/Qju3ME6idrmJvEDULzK9Ga-yB3vb3uit61o7d8U4pxY.cache +0 -0
  59. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qv/QvNzvJ0z2f0g6T68rMYY0mBHvDEY4b6y51ig7FBGnhc.cache +0 -0
  60. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RT/RToGI6FYOn83Ol7mQkO7rXU9junxziC8SD9blspQHvI.cache +0 -0
  61. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rh/Rh85ei2qt1M3nUMP4DSJ_ReSlWH-fKVvdM38WMexziE.cache +1 -0
  62. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S6/S6c4svFhyIwvn-E9psdhX9o3J6LrGO90i0yjhjVGLCc.cache +1 -0
  63. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SZ/sZ37jm0vG8qR7mVLa0ESUv_9aIj1htK75GY3SSH8lJE.cache +1 -0
  64. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T0/T0589roQFbIQ46mHgBS6Io8dkK0kB9V37_bd9qvz93E.cache +1 -0
  65. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TD/TDZKALyUNeJcvFiBwpqswmFh80HmV5_BOZwHEcqUEns.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UA/Uai8hEmMi8rbYvYI8JThbWEnHzGMBoG6H-BctClUimI.cache +0 -0
  67. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V6/V6FcA646DCNVnSE9Nu3fXKQo9Q2J2WRt8dT1_4maork.cache +1 -0
  68. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VJ/VJESfxh6YudYFQX7sMTuhouFREwsvuH26MK9VzGRbFk.cache +0 -0
  69. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X8/X88B6qT5FPk5lkChVEuX-NrygcrY6yEWrlkoQn3pydk.cache +0 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZL/ZLZ8FZv8d7C_dOlCVAymsTsXpgKcDOqSW4Buwznp-P0.cache +1 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aC/aCQFgafIBdW4sAbl3zP2eIXomYtcAjsxtP-axKLfjsI.cache +1 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aN/ANg46pcHZWfKw7-6-xO7KUf3pIVG4X-K8cxbNz3TA_U.cache +1 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aS/ASl4pPHP0cI1fbKThnKW7tHiljs9BPghL1cH5TRd1NM.cache +1 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/at/atJ-zc9WEL1sfZIPwn5VKyOE1Xj1Elcb_SfFCv6X-2g.cache +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cf/cfx8zJt2SKc6mq2Y7LWAfLksfWfvmj3n3y79lBivTOA.cache +2 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dC/DcYBsE96__IImw5qMnEw-gsUknWyL-5AXtAmEA9kJao.cache +1 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dJ/dJcI-obDHqGKKaoueMqxT2LHukjWmkZWAGrolNDZmtE.cache +1 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eo/eomwhFjYfscOWWCOx36ll25vcnbvDsGjSCi-lGxU5es.cache +0 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fS/fSint2O7kkrERf0lOcWnc3OfYEA0C_SNKUn-ePwzi7g.cache +0 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gg/ggCbDjYcMGY7XG7WjxWpXBxtQcHupXe5IvK-rd2ihzE.cache +1 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hU/hUioZNvWcr7KgF6nZq2TMjWJpGoe6f8t-yCJjpDYzWY.cache +0 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hX/hXp80was0drGYRYoN1t7BgDsGHc6gWBGnpcIiT-vp04.cache +1 -0
  83. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iI/IifRBP1kh7hYmQ-pKBYjgJlrCQPyF3SQzToIc7Ib7Bc.cache +0 -0
  84. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jONWUKSndBxDtySWgfbmWbz2a6PZv3NokqUwyuaYhV8.cache +0 -0
  85. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jQ/JQCL-XQumSUnU_FWWDnZMQhNft5eHNtpbwJwmr4NRx0.cache +1 -0
  86. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/j_/j_6qhjBV6XZ21Ec2MQr364UZFIqLFY1gOmvs1pg8oNE.cache +1 -0
  87. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jl/jlX-dbDS-3GwaRefW6WKQOpxuq3_AZ_0JYDdrVp_-CA.cache +1 -0
  88. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ka/kaaPoa_lbFCq3fCc-w1lZlOKNLoSxRmlg86adlemgOY.cache +0 -0
  89. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kh/KhlvIiIT2SwuhVL_8T_eMNwngN3cr6chsyVu_tcSYSo.cache +0 -0
  90. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/m1eqvANKO4Xm8wU5I2uzQ-wJJ2cl3V6gwSc_cgSomgs.cache +2 -2
  91. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mJ/mJOrgB3Dd9IMbnn9DBOF-HA25ZsEUNP9cRFP80n9pIc.cache +0 -0
  92. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +0 -0
  93. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +0 -0
  94. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/of/ofn6dcEb4U1pVYywTAYMKSY73DmtQHt4yvICGJybvNA.cache +0 -0
  95. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oy/OYSsdyEPkUTpuee4CHcJ3iI1ghXD_GnIKCOphpFl2Qc.cache +1 -0
  96. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pV/PvxGgTLpBrfhgIkEVinMbpHRoHZdZSmAWxHz11iW_Jw.cache +1 -0
  97. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qF/QfaMLhxgXWtXUVFrL2WY2_05lAXMj-AJB6SPkY7TonM.cache +1 -0
  98. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qP/qPmv5snMrDw830S6hSICDcnIy7kVEWoFKXhGKT38lG4.cache +0 -0
  99. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qo/QOrltHJWzwDAoiEmwirDLJoNrye18oZdXZlOO2jqRAA.cache +1 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sh/shOFa_chENx_8ZRXPbkq_ENgRJWo93wDCtBNf785Pf4.cache +1 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/t9/t9tHOHjkct3cOW0zvjpzyFwhtqbNCoCD7-1jlEOUAuE.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tM/tMQLE8jDSktbBK8uvyxHDupucBBJbOd1mgm7Krwjvr4.cache +0 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ta/taVz5vyapnXqxTrIk1HqFwqmlZpzBRAVoZ0YbQaKSYg.cache +0 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tj/tjR80-67cxOLvwYRkfETCNmP0_tEIpv8E2bA-3VNQJ0.cache +3 -0
  105. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ty/tyY1gR1OJrgsKgAAi71a-iULjg3sNO6w64GdrY5FwRY.cache +0 -0
  106. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vt/vtKkabQbVjJocImgz6J_pG6mykSy1Oavu3AVzeG4o4k.cache +0 -0
  107. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wC/WCVq1-ri3g7K1RPaGXIxmb5RtGRaOaOURAvqVG4zNdk.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y3/y3lnguc4mqfDo_4Yovado1gkGRML6dhGMmQUjiXoOZM.cache +1 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y9/y9m2TDwskcclVVOGMioQd1_gSx2n69HPQLxQI_OvrNQ.cache +1 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yC/yCekKqDJnr2rziXNXI99RG9RlU_7TV2PoH03KObhWtU.cache +0 -0
  111. data/spec/jobs/application_job_spec.rb +6 -6
  112. data/spec/spec_helper.rb +1 -1
  113. metadata +190 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 320dedafebbd7d4642c253ffe2e4293aa6d9ca20766000877e2fef2659751b6d
4
- data.tar.gz: 2b38d9bc1f43db7580565df60ebccee630144322f54d96177626178273cb028f
3
+ metadata.gz: '058d0b861b22420aa23b79986d3d73bb01cbe27d7279ef706382edb7a4d47ba5'
4
+ data.tar.gz: 79aaf5fbd4416e22a93c9a14353ef41c7d6965d58670d4815e3af6f86b88f726
5
5
  SHA512:
6
- metadata.gz: f77cd6a65e6b4573ff228ec71b7560f2fac1a29c73297a9e87add526bea6bb3015502b1b3ba139c44a84ded923723549ae4691d2d14fd0866a0e713df051a109
7
- data.tar.gz: 97098bdf643d30d8048672957eda0ea6dabaf15fbd7f12a60843d78d727c002e3af8611120abb6170e600c5efae93f31eb2bcd9fdd7e2c2e629419e823c6d3ff
6
+ metadata.gz: 5f12183f81a90854fb76a584d93b96ef6e656f41b4ff0926ef6a242b275b14fe3e6172abd830264ee425732016fafc4b448476b3b32ba15d76f4f7c900b8ea96
7
+ data.tar.gz: b5e178a2ed8ac074fd4350d9f884373e142aa0ea73712570e3e10d86efc196f70eb4b083d604e78d8a4aec277b844d91bdb8aa2217634ed8274ff49813416bd0
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- # `ActiveJobChannel`
2
- Uses `ActionCable` to alert front-end users of finished `ActiveJobs`
1
+ # ActiveJobChannel
2
+ Use ActionCable to alert front-end users of finished ActiveJobs
3
3
 
4
4
  ## Installation
5
5
  1. Install in your Gemfile
@@ -8,15 +8,60 @@ Uses `ActionCable` to alert front-end users of finished `ActiveJobs`
8
8
  gem 'active_job_channel'
9
9
  ```
10
10
 
11
- 2. Setup an [`ActionCable` subscription adapter](http://edgeguides.rubyonrails.org/action_cable_overview.html#subscription-adapter)
11
+ ## Setup
12
+ 1. [Create ActionCable Connection](#create-actioncable-connection-optional) (optional)
13
+ 2. [Enable ActiveJobChannel for a job](#enable-activejobchannel-for-a-job)
14
+ 3. [Handle ActiveJobChannel broadcasts](#handle-activejobchannel-broadcasts)
15
+
16
+ ### Create ActionCable Connection (optional)
17
+
18
+ You can skip this step if you're not concerned with authorizing or brodcasting
19
+ privately to ActionCable connections
20
+
21
+ 1. Setup an [ActionCable subscription adapter](http://edgeguides.rubyonrails.org/action_cable_overview.html#subscription-adapter)
12
22
  * Note: A persisted subscription adapter is required for handling notifications
13
- from background `ActiveJob` processes. Currently only PostgreSQL and Redis
23
+ from background ActiveJob processes. Currently only PostgreSQL and Redis
14
24
  are supported.
25
+ 2. Follow the [official guide for setting up an ActionCable Connection](http://guides.rubyonrails.org/action_cable_overview.html#server-side-components-connections)
26
+ 3. If you would like notifications broadcast privately to ActionCable
27
+ connections, set up a connection identifier for your connection using
28
+ `identified_by`. The identifier you use will also need to be passed to your
29
+ job.
30
+
31
+ ### Enable ActiveJobChannel for a job
32
+ 1. For each job you'd like to be notified about, call `active_job_channel` in
33
+ its class
34
+ 2. To broadcast notifications privately, set the identifier you configured in
35
+ your ActionCable Connection setup to either the instance variable
36
+ `@ajc_identifier` or the method `ajc_identifier`
37
+
38
+ ```ruby
39
+ class MyJob < ActiveJob::Base
40
+ active_job_channel
41
+
42
+ def perform(current_user)
43
+ @ajc_identifier = current_user
44
+ end
45
+
46
+ private
47
+
48
+ # def ajc_identifier
49
+ # User.find_by(key: value)
50
+ # end
51
+ end
52
+ ```
15
53
 
16
- 3. (Optional) If you need authorization for notifications, [set up your own
17
- `ApplicationCable::Connection`](http://guides.rubyonrails.org/action_cable_overview.html#server-side-components-connections)
54
+ #### Configuration
18
55
 
19
- 3. Include `active_job_channel.js` in your layouts
56
+ ##### global_broadcast
57
+
58
+ Notifications will be broadcast to `ajc_identifier` by default. To broadcast
59
+ all notifications for a job to all ActionCable connections, pass
60
+ `{ global_broadcast: true }` to `active_job_channel`.
61
+
62
+ ### Handle ActiveJobChannel broadcasts
63
+
64
+ 1. Include `active_job_channel.js` in your layouts
20
65
 
21
66
  ```ruby
22
67
  javascript_include_tag 'active_job_channel'
@@ -28,40 +73,28 @@ Uses `ActionCable` to alert front-end users of finished `ActiveJobs`
28
73
  //= require active_job_channel
29
74
  ```
30
75
 
31
- ## Usage
32
- For each job you'd like to be notified about, enable `active_job_channel`
76
+ 2. Customize the callbacks for broadcasted notifications:
33
77
 
34
- ```ruby
35
- class MyJob < ActiveJob::Base
36
- active_job_channel
37
- end
38
- ```
78
+ ```javascript
79
+ //= require notifyjs
39
80
 
40
- To customize the client-side notification, define `ActiveJobChannel.received`
41
- after including `active_job_channel.js`. The current default simply logs the
42
- job status to the javascript console.
81
+ ActiveJobChannel.onJobSuccess = function(job) { $.notify(job.name + ' succeeded!') };
82
+ ActiveJobChannel.onJobFailure = function(job) { $.notify(job.name + ' failed!') };
83
+ ```
43
84
 
44
- ```javascript
45
- //= require notifyjs
46
- //= require active_job_channel
85
+ `job` has the attributes `name` and `status`. A failed `job` includes an
86
+ `error` attribute. `status` is one of `success` or `failure`.
47
87
 
48
- ActiveJobChannel.received = function(data) {
49
- var status = data.status;
50
- var job_name = data.job_name;
51
- if (status === 'success') { $.notify(job_name + ' succeeded!') }
52
- else if (status === 'failure') { $.notify(job_name + ' failed!') }
53
- }
54
- ```
55
88
 
56
89
  ## Caveats
57
- `ActiveJobChannel` depends on `ActiveJob` and `ActionCable`, and, as such, is
90
+ ActiveJobChannel depends on ActiveJob and ActionCable, and, as such, is
58
91
  subject to their limitations:
59
92
 
60
93
  * A persisted [subscription adapter](http://guides.rubyonrails.org/action_cable_overview.html#subscription-adapter)
61
- is required for `ActionCable` to handle notifications from background
62
- `ActiveJob` processes
63
- * Because `ActiveJob` does not know when a job has permanently failed,
64
- `ActiveJobChannel` sends notfications for each failure, retried or final
94
+ is required for ActionCable to handle notifications from background
95
+ ActiveJob processes
96
+ * Because ActiveJob does not know when a job has permanently failed,
97
+ ActiveJobChannel sends notfications for each failure, retried or final
65
98
 
66
99
  ## Todo
67
100
  - Better default front-end notification behavior
data/Rakefile CHANGED
@@ -1,22 +1,20 @@
1
- #!/usr/bin/env rake
2
-
3
1
  begin
4
2
  require 'bundler/setup'
5
3
  rescue LoadError
6
4
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
5
  end
8
6
 
9
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
7
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
10
8
  load 'rails/tasks/engine.rake'
11
9
 
12
10
  Bundler::GemHelper.install_tasks
13
11
 
14
- Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
12
+ Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each { |f| load f }
15
13
 
16
14
  require 'rspec/core'
17
15
  require 'rspec/core/rake_task'
18
16
 
19
17
  desc 'Run all specs in spec directory (excluding plugin specs)'
20
- RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
18
+ RSpec::Core::RakeTask.new(:spec)
21
19
 
22
- task :default => :spec
20
+ task default: :spec
@@ -1,10 +1,30 @@
1
1
  module ActiveJobChannel
2
2
  module Broadcaster
3
+ class NoIdentifierError < NameError
4
+ MESSAGE = 'ActiveJobChannel expects an ActionCable Connection ' \
5
+ 'identifier to broadcast to. The identifier should be made available ' \
6
+ 'in your job via a method or an instance variable, either named ' \
7
+ '`ajc_identifier`. For details about setting up an identifier in ' \
8
+ 'your ActionCable Connection, visit http://guides.rubyonrails.org/' \
9
+ "action_cable_overview.html#connection-setup\n\nTo broadcast " \
10
+ 'globally without an identifier, pass in ' \
11
+ '`{ global_broadcast: true } ` to `active_job_channel` as part of an ' \
12
+ 'options hash.'.freeze
13
+
14
+ def initialize(msg = MESSAGE)
15
+ super
16
+ end
17
+ end
18
+
3
19
  module ClassMethods
4
- def active_job_channel
20
+ def active_job_channel(options = {})
21
+ class_attribute :ajc_config
22
+ self.ajc_config = { global_broadcast: false }
23
+ self.ajc_config.merge!(options)
24
+
5
25
  after_perform :broadcast_success
6
26
  rescue_from '::StandardError' do |exception|
7
- broadcast_failure
27
+ broadcast_failure(exception)
8
28
  raise exception
9
29
  end
10
30
 
@@ -13,17 +33,41 @@ module ActiveJobChannel
13
33
  end
14
34
 
15
35
  module InstanceMethods
16
- def broadcast_failure
17
- ActiveJobChannel::Channel.broadcast_to(
18
- 'active_job_channel',
36
+ private
37
+
38
+ attr_writer :ajc_identifier
39
+
40
+ def ajc_channel_name
41
+ if ajc_config[:global_broadcast]
42
+ ::ActiveJobChannel::Channel::CHANNEL_NAME
43
+ else
44
+ [::ActiveJobChannel::Channel::CHANNEL_NAME, ajc_identifier].
45
+ compact.
46
+ join('#')
47
+ end
48
+ end
49
+
50
+ def ajc_identifier
51
+ raise NoIdentifierError if ajc_identifier_missing?
52
+ @ajc_identifier
53
+ end
54
+
55
+ def ajc_identifier_missing?
56
+ !ajc_config[:global_broadcast] && @ajc_identifier.nil?
57
+ end
58
+
59
+ def broadcast_failure(exception)
60
+ ActionCable.server.broadcast(
61
+ ajc_channel_name,
19
62
  status: 'failure',
20
- job_name: self.class.to_s
63
+ job_name: self.class.to_s,
64
+ error: exception.inspect
21
65
  )
22
66
  end
23
67
 
24
68
  def broadcast_success
25
- ActiveJobChannel::Channel.broadcast_to(
26
- 'active_job_channel',
69
+ ActionCable.server.broadcast(
70
+ ajc_channel_name,
27
71
  status: 'success',
28
72
  job_name: self.class.to_s
29
73
  )
@@ -1,7 +1,20 @@
1
1
  module ActiveJobChannel
2
2
  class Channel < ::ActionCable::Channel::Base
3
+ CHANNEL_NAME = 'active_job_channel'.freeze
4
+
3
5
  def subscribed
4
- stream_from 'active_job_channel'
6
+ stream_from CHANNEL_NAME
7
+ stream_from private_stream if connection.connection_identifier.present?
8
+ end
9
+
10
+ private
11
+
12
+ def global_stream
13
+ stream_from CHANNEL_NAME
14
+ end
15
+
16
+ def private_stream
17
+ [CHANNEL_NAME, connection.connection_identifier].join('#')
5
18
  end
6
19
  end
7
20
  end
@@ -1,4 +1,6 @@
1
1
  module ActiveJobChannel
2
+ # An Engine ties us into a Rails app
3
+ # doc: http://guides.rubyonrails.org/engines.html
2
4
  class Engine < ::Rails::Engine
3
5
  ActiveSupport.on_load(:active_job) do
4
6
  require 'active_job_channel/broadcaster'
@@ -1,3 +1,3 @@
1
1
  module ActiveJobChannel
2
- VERSION = '0.0.2'.freeze
2
+ VERSION = '0.0.3'.freeze
3
3
  end
@@ -11,4 +11,4 @@
11
11
  // about supported directives.
12
12
  //
13
13
  //= require_tree .
14
- //= require 'active_job_channel/application'
14
+ //= require 'active_job_channel'
@@ -0,0 +1,9 @@
1
+ module ApplicationCable
2
+ class Connection < ::ActionCable::Connection::Base
3
+ identified_by :current_user
4
+
5
+ def connect
6
+ self.current_user = 'bloop'
7
+ end
8
+ end
9
+ end
@@ -1,6 +1,6 @@
1
1
  class FrontController < ::ApplicationController
2
2
  def index
3
- ::ApplicationJob.new.enqueue(wait: 5.seconds)
3
+ ::ApplicationJob.set(wait: 5.seconds).perform_later('bloop')
4
4
  render 'front/index'
5
5
  end
6
6
  end
@@ -1,7 +1,8 @@
1
1
  class ApplicationJob < ActiveJob::Base
2
- active_job_channel
2
+ active_job_channel global_broadcast: true
3
3
 
4
- def perform
4
+ def perform(identifier)
5
+ @ajc_identifier = identifier
5
6
  fake
6
7
  end
7
8
 
File without changes