From 585d672742a8f5b2e7dd563b67cec9398d25d44f Mon Sep 17 00:00:00 2001 From: Ben Halpern Date: Tue, 3 Dec 2019 08:50:56 -0500 Subject: [PATCH] Replace serviceworker-rails gem with custome implementation (#4987) [deploy] * Customize UserContext in Timber logs * Replace serviceworker-rails gem with custome implementation --- Gemfile | 1 - Gemfile.lock | 3 -- app/controllers/service_worker_controller.rb | 14 +++++++ .../service_worker/index.js.erb} | 2 +- .../service_worker}/manifest.json.erb | 0 config/initializers/assets.rb | 3 +- config/initializers/serviceworker.rb | 29 --------------- config/routes.rb | 4 ++ spec/requests/service_worker_spec.rb | 37 +++++++++++++++++++ 9 files changed, 57 insertions(+), 36 deletions(-) create mode 100644 app/controllers/service_worker_controller.rb rename app/{assets/javascripts/serviceworker.js.erb => views/service_worker/index.js.erb} (98%) rename app/{assets/javascripts => views/service_worker}/manifest.json.erb (100%) delete mode 100644 config/initializers/serviceworker.rb create mode 100644 spec/requests/service_worker_spec.rb diff --git a/Gemfile b/Gemfile index ea1a709a1..11f42ed8f 100644 --- a/Gemfile +++ b/Gemfile @@ -84,7 +84,6 @@ gem "rouge", "~> 3.13" # A pure-ruby code highlighter gem "rubyzip", "~> 2.0" # Rubyzip is a ruby library for reading and writing zip files gem "s3_direct_upload", "~> 0.1" # Direct Upload to Amazon S3 gem "sass-rails", "~> 6.0" # Sass adapter for the Rails asset pipeline -gem "serviceworker-rails", "~> 0.6" # Integrates ServiceWorker into the Rails asset pipeline gem "sitemap_generator", "~> 6.0" # SitemapGenerator is a framework-agnostic XML Sitemap generator gem "skylight", "~> 4.2" # Skylight is a smart profiler for Rails, Sinatra, and other Ruby apps gem "slack-notifier", "~> 2.3" # A slim ruby wrapper for posting to slack webhooks diff --git a/Gemfile.lock b/Gemfile.lock index f0d166be8..1f73a4706 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -725,8 +725,6 @@ GEM selenium-webdriver (3.142.6) childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) - serviceworker-rails (0.6.0) - railties (>= 3.1) shellany (0.0.1) shoulda-matchers (4.1.2) activesupport (>= 4.2.0) @@ -973,7 +971,6 @@ DEPENDENCIES s3_direct_upload (~> 0.1) sass-rails (~> 6.0) sdoc (~> 1.0) - serviceworker-rails (~> 0.6) shoulda-matchers (= 4.1.2) simplecov (~> 0.17) sitemap_generator (~> 6.0) diff --git a/app/controllers/service_worker_controller.rb b/app/controllers/service_worker_controller.rb new file mode 100644 index 000000000..d7a6c6bbd --- /dev/null +++ b/app/controllers/service_worker_controller.rb @@ -0,0 +1,14 @@ +class ServiceWorkerController < ApplicationController + skip_before_action :verify_authenticity_token + before_action :set_cache_control_headers, only: %i[index manifest] + + def index + set_surrogate_key_header "serviceworker-js" + render formats: [:js] + end + + def manifest + set_surrogate_key_header "manifest-json" + render formats: [:json] + end +end diff --git a/app/assets/javascripts/serviceworker.js.erb b/app/views/service_worker/index.js.erb similarity index 98% rename from app/assets/javascripts/serviceworker.js.erb rename to app/views/service_worker/index.js.erb index 62c28d73a..b4eddeac2 100644 --- a/app/assets/javascripts/serviceworker.js.erb +++ b/app/views/service_worker/index.js.erb @@ -141,4 +141,4 @@ self.addEventListener('install', onInstall); self.addEventListener('activate', onActivate); self.addEventListener('fetch', onFetch); self.addEventListener('push', onPush); -self.addEventListener('notificationclick', onNotificationClick) +self.addEventListener('notificationclick', onNotificationClick) \ No newline at end of file diff --git a/app/assets/javascripts/manifest.json.erb b/app/views/service_worker/manifest.json.erb similarity index 100% rename from app/assets/javascripts/manifest.json.erb rename to app/views/service_worker/manifest.json.erb diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index a073ce035..279195764 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -30,5 +30,4 @@ Rails.application.config.assets.precompile += %w[s3_direct_upload.js] Rails.application.config.assets.precompile += %w[classified_listings.css] Rails.application.config.assets.precompile += %w[lib/xss.js] Rails.application.config.assets.precompile += %w[lib/pulltorefresh.js] -Rails.application.config.assets.precompile += %w[internal.js] -Rails.application.config.assets.precompile += %w[serviceworker.js manifest.json] +Rails.application.config.assets.precompile += %w[internal.js] \ No newline at end of file diff --git a/config/initializers/serviceworker.rb b/config/initializers/serviceworker.rb deleted file mode 100644 index f80a7b12c..000000000 --- a/config/initializers/serviceworker.rb +++ /dev/null @@ -1,29 +0,0 @@ -Rails.application.configure do - config.serviceworker.routes.draw do - # map to assets implicitly - match "/serviceworker.js", - headers: { "Cache-Control" => "public, max-age=8000, s-max-age=20000, no-cache" } - match "/manifest.json", - headers: { "Cache-Control" => "public, max-age=8000, s-max-age=20000, no-cache" } - # Examples - # - # map to a named asset explicitly - # match "/proxied-serviceworker.js" => "nested/asset/serviceworker.js" - # match "/nested/serviceworker.js" => "another/serviceworker.js" - # - # capture named path segments and interpolate to asset name - # match "/captures/*segments/serviceworker.js" => "%{segments}/serviceworker.js" - # - # capture named parameter and interpolate to asset name - # match "/parameter/:id/serviceworker.js" => "project/%{id}/serviceworker.js" - # - # insert custom headers - # match "/header-serviceworker.js" => "another/serviceworker.js", - # headers: { "X-Resource-Header" => "A resource" } - # - # anonymous glob exposes `paths` variable for interpolation - # match "/*/serviceworker.js" => "%{paths}/serviceworker.js" - end - config.serviceworker.headers["Surrogate-Control"] = "max-age=20000" - config.serviceworker.headers["Cache-Control"] = "public, s-maxage=20000, max-age=0, no-cache" -end diff --git a/config/routes.rb b/config/routes.rb index 3844ad6cf..66e29b531 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -329,6 +329,10 @@ Rails.application.routes.draw do get "/embed/:embeddable" => "liquid_embeds#show" + # serviceworkers + get "/serviceworker" => "service_worker#index" + get "/manifest" => "service_worker#manifest" + get "/new" => "articles#new" get "/new/:template" => "articles#new" diff --git a/spec/requests/service_worker_spec.rb b/spec/requests/service_worker_spec.rb new file mode 100644 index 000000000..c319bac0f --- /dev/null +++ b/spec/requests/service_worker_spec.rb @@ -0,0 +1,37 @@ +require "rails_helper" + +RSpec.describe "ServiceWorker", type: :request do + describe "GET /serviceworker.js" do + it "renders file with proper text" do + get "/serviceworker.js" + expect(response.body).to include("var CACHE_VERSION") + end + + it "renders javascript file" do + get "/serviceworker.js" + expect(response.header["Content-Type"]).to include("text/javascript") + end + + it "sends a surrogate key (for Fastly's user)" do + get "/serviceworker.js" + expect(response.header["Surrogate-Key"]).to include("serviceworker-js") + end + end + + describe "GET /manifest.json" do + it "renders file with proper text" do + get "/manifest.json" + expect(response.body).to include("\"name\": \"#{ApplicationConfig['COMMUNITY_NAME']} Community\"") + end + + it "renders json file" do + get "/manifest.json" + expect(response.header["Content-Type"]).to include("application/json") + end + + it "sends a surrogate key (for Fastly's user)" do + get "/manifest.json" + expect(response.header["Surrogate-Key"]).to include("manifest-json") + end + end +end