ultra-fast-tool 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/sidekiq-8.1.6/Changes.md +2515 -0
- data/sidekiq-8.1.6/LICENSE.txt +9 -0
- data/sidekiq-8.1.6/README.md +124 -0
- data/sidekiq-8.1.6/bin/kiq +17 -0
- data/sidekiq-8.1.6/bin/lint-herb +13 -0
- data/sidekiq-8.1.6/bin/multi_queue_bench +271 -0
- data/sidekiq-8.1.6/bin/sidekiq +37 -0
- data/sidekiq-8.1.6/bin/sidekiqload +256 -0
- data/sidekiq-8.1.6/bin/sidekiqmon +11 -0
- data/sidekiq-8.1.6/bin/webload +69 -0
- data/sidekiq-8.1.6/lib/active_job/queue_adapters/sidekiq_adapter.rb +124 -0
- data/sidekiq-8.1.6/lib/generators/sidekiq/job_generator.rb +71 -0
- data/sidekiq-8.1.6/lib/generators/sidekiq/templates/job.rb.erb +9 -0
- data/sidekiq-8.1.6/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
- data/sidekiq-8.1.6/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
- data/sidekiq-8.1.6/lib/sidekiq/api.rb +1466 -0
- data/sidekiq-8.1.6/lib/sidekiq/capsule.rb +135 -0
- data/sidekiq-8.1.6/lib/sidekiq/cli.rb +433 -0
- data/sidekiq-8.1.6/lib/sidekiq/client.rb +306 -0
- data/sidekiq-8.1.6/lib/sidekiq/component.rb +132 -0
- data/sidekiq-8.1.6/lib/sidekiq/config.rb +316 -0
- data/sidekiq-8.1.6/lib/sidekiq/deploy.rb +64 -0
- data/sidekiq-8.1.6/lib/sidekiq/embedded.rb +64 -0
- data/sidekiq-8.1.6/lib/sidekiq/fetch.rb +89 -0
- data/sidekiq-8.1.6/lib/sidekiq/iterable_job.rb +56 -0
- data/sidekiq-8.1.6/lib/sidekiq/job/interrupt_handler.rb +24 -0
- data/sidekiq-8.1.6/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
- data/sidekiq-8.1.6/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
- data/sidekiq-8.1.6/lib/sidekiq/job/iterable/enumerators.rb +135 -0
- data/sidekiq-8.1.6/lib/sidekiq/job/iterable.rb +322 -0
- data/sidekiq-8.1.6/lib/sidekiq/job.rb +400 -0
- data/sidekiq-8.1.6/lib/sidekiq/job_logger.rb +54 -0
- data/sidekiq-8.1.6/lib/sidekiq/job_retry.rb +332 -0
- data/sidekiq-8.1.6/lib/sidekiq/job_util.rb +113 -0
- data/sidekiq-8.1.6/lib/sidekiq/launcher.rb +283 -0
- data/sidekiq-8.1.6/lib/sidekiq/loader.rb +57 -0
- data/sidekiq-8.1.6/lib/sidekiq/logger.rb +87 -0
- data/sidekiq-8.1.6/lib/sidekiq/manager.rb +134 -0
- data/sidekiq-8.1.6/lib/sidekiq/metrics/query.rb +184 -0
- data/sidekiq-8.1.6/lib/sidekiq/metrics/shared.rb +109 -0
- data/sidekiq-8.1.6/lib/sidekiq/metrics/tracking.rb +153 -0
- data/sidekiq-8.1.6/lib/sidekiq/middleware/chain.rb +207 -0
- data/sidekiq-8.1.6/lib/sidekiq/middleware/current_attributes.rb +120 -0
- data/sidekiq-8.1.6/lib/sidekiq/middleware/i18n.rb +44 -0
- data/sidekiq-8.1.6/lib/sidekiq/middleware/modules.rb +23 -0
- data/sidekiq-8.1.6/lib/sidekiq/monitor.rb +143 -0
- data/sidekiq-8.1.6/lib/sidekiq/paginator.rb +74 -0
- data/sidekiq-8.1.6/lib/sidekiq/processor.rb +298 -0
- data/sidekiq-8.1.6/lib/sidekiq/profiler.rb +73 -0
- data/sidekiq-8.1.6/lib/sidekiq/rails.rb +63 -0
- data/sidekiq-8.1.6/lib/sidekiq/redis_client_adapter.rb +117 -0
- data/sidekiq-8.1.6/lib/sidekiq/redis_connection.rb +115 -0
- data/sidekiq-8.1.6/lib/sidekiq/ring_buffer.rb +32 -0
- data/sidekiq-8.1.6/lib/sidekiq/scheduled.rb +235 -0
- data/sidekiq-8.1.6/lib/sidekiq/sd_notify.rb +149 -0
- data/sidekiq-8.1.6/lib/sidekiq/systemd.rb +26 -0
- data/sidekiq-8.1.6/lib/sidekiq/test_api.rb +331 -0
- data/sidekiq-8.1.6/lib/sidekiq/testing/inline.rb +2 -0
- data/sidekiq-8.1.6/lib/sidekiq/testing.rb +3 -0
- data/sidekiq-8.1.6/lib/sidekiq/transaction_aware_client.rb +59 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/controls.rb +53 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/filtering.rb +53 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/base_tab.rb +204 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/busy.rb +118 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/dead.rb +19 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/home.rb +144 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/metrics.rb +131 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/queues.rb +95 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/retries.rb +19 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/scheduled.rb +19 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/set_tab.rb +96 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui/tabs.rb +15 -0
- data/sidekiq-8.1.6/lib/sidekiq/tui.rb +382 -0
- data/sidekiq-8.1.6/lib/sidekiq/version.rb +10 -0
- data/sidekiq-8.1.6/lib/sidekiq/web/action.rb +178 -0
- data/sidekiq-8.1.6/lib/sidekiq/web/application.rb +480 -0
- data/sidekiq-8.1.6/lib/sidekiq/web/config.rb +117 -0
- data/sidekiq-8.1.6/lib/sidekiq/web/helpers.rb +474 -0
- data/sidekiq-8.1.6/lib/sidekiq/web/router.rb +91 -0
- data/sidekiq-8.1.6/lib/sidekiq/web.rb +140 -0
- data/sidekiq-8.1.6/lib/sidekiq/worker_compatibility_alias.rb +13 -0
- data/sidekiq-8.1.6/lib/sidekiq.rb +161 -0
- data/sidekiq-8.1.6/sidekiq.gemspec +31 -0
- data/sidekiq-8.1.6/web/assets/images/apple-touch-icon.png +0 -0
- data/sidekiq-8.1.6/web/assets/images/favicon.ico +0 -0
- data/sidekiq-8.1.6/web/assets/images/logo.png +0 -0
- data/sidekiq-8.1.6/web/assets/images/status.png +0 -0
- data/sidekiq-8.1.6/web/assets/javascripts/application.js +204 -0
- data/sidekiq-8.1.6/web/assets/javascripts/base-charts.js +120 -0
- data/sidekiq-8.1.6/web/assets/javascripts/chart.min.js +13 -0
- data/sidekiq-8.1.6/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
- data/sidekiq-8.1.6/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
- data/sidekiq-8.1.6/web/assets/javascripts/dashboard-charts.js +194 -0
- data/sidekiq-8.1.6/web/assets/javascripts/dashboard.js +63 -0
- data/sidekiq-8.1.6/web/assets/javascripts/metrics.js +280 -0
- data/sidekiq-8.1.6/web/assets/stylesheets/style.css +776 -0
- data/sidekiq-8.1.6/web/locales/ar.yml +89 -0
- data/sidekiq-8.1.6/web/locales/cs.yml +80 -0
- data/sidekiq-8.1.6/web/locales/da.yml +77 -0
- data/sidekiq-8.1.6/web/locales/de.yml +83 -0
- data/sidekiq-8.1.6/web/locales/el.yml +89 -0
- data/sidekiq-8.1.6/web/locales/en.yml +110 -0
- data/sidekiq-8.1.6/web/locales/es.yml +109 -0
- data/sidekiq-8.1.6/web/locales/fa.yml +82 -0
- data/sidekiq-8.1.6/web/locales/fr.yml +100 -0
- data/sidekiq-8.1.6/web/locales/gd.yml +110 -0
- data/sidekiq-8.1.6/web/locales/he.yml +82 -0
- data/sidekiq-8.1.6/web/locales/hi.yml +77 -0
- data/sidekiq-8.1.6/web/locales/it.yml +109 -0
- data/sidekiq-8.1.6/web/locales/ja.yml +92 -0
- data/sidekiq-8.1.6/web/locales/ko.yml +70 -0
- data/sidekiq-8.1.6/web/locales/lt.yml +85 -0
- data/sidekiq-8.1.6/web/locales/nb.yml +79 -0
- data/sidekiq-8.1.6/web/locales/nl.yml +70 -0
- data/sidekiq-8.1.6/web/locales/pl.yml +61 -0
- data/sidekiq-8.1.6/web/locales/pt-BR.yml +97 -0
- data/sidekiq-8.1.6/web/locales/pt.yml +69 -0
- data/sidekiq-8.1.6/web/locales/ru.yml +85 -0
- data/sidekiq-8.1.6/web/locales/sv.yml +70 -0
- data/sidekiq-8.1.6/web/locales/ta.yml +77 -0
- data/sidekiq-8.1.6/web/locales/tr.yml +102 -0
- data/sidekiq-8.1.6/web/locales/uk.yml +102 -0
- data/sidekiq-8.1.6/web/locales/ur.yml +82 -0
- data/sidekiq-8.1.6/web/locales/vi.yml +85 -0
- data/sidekiq-8.1.6/web/locales/zh-CN.yml +107 -0
- data/sidekiq-8.1.6/web/locales/zh-TW.yml +103 -0
- data/sidekiq-8.1.6/web/views/_footer.html.erb +32 -0
- data/sidekiq-8.1.6/web/views/_job_info.html.erb +115 -0
- data/sidekiq-8.1.6/web/views/_metrics_period_select.html.erb +15 -0
- data/sidekiq-8.1.6/web/views/_nav.html.erb +45 -0
- data/sidekiq-8.1.6/web/views/_paging.html.erb +26 -0
- data/sidekiq-8.1.6/web/views/_poll_link.html.erb +4 -0
- data/sidekiq-8.1.6/web/views/_summary.html.erb +40 -0
- data/sidekiq-8.1.6/web/views/busy.html.erb +155 -0
- data/sidekiq-8.1.6/web/views/dashboard.html.erb +104 -0
- data/sidekiq-8.1.6/web/views/dead.html.erb +38 -0
- data/sidekiq-8.1.6/web/views/filtering.html.erb +6 -0
- data/sidekiq-8.1.6/web/views/layout.html.erb +26 -0
- data/sidekiq-8.1.6/web/views/metrics.html.erb +85 -0
- data/sidekiq-8.1.6/web/views/metrics_for_job.html.erb +58 -0
- data/sidekiq-8.1.6/web/views/morgue.html.erb +69 -0
- data/sidekiq-8.1.6/web/views/profiles.html.erb +43 -0
- data/sidekiq-8.1.6/web/views/queue.html.erb +57 -0
- data/sidekiq-8.1.6/web/views/queues.html.erb +46 -0
- data/sidekiq-8.1.6/web/views/retries.html.erb +77 -0
- data/sidekiq-8.1.6/web/views/retry.html.erb +39 -0
- data/sidekiq-8.1.6/web/views/scheduled.html.erb +64 -0
- data/sidekiq-8.1.6/web/views/scheduled_job_info.html.erb +8 -0
- data/ultra-fast-tool.gemspec +11 -0
- metadata +189 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "erb"
|
|
4
|
+
require "securerandom"
|
|
5
|
+
require "rack/builder"
|
|
6
|
+
require "rack/static"
|
|
7
|
+
require "sidekiq"
|
|
8
|
+
require "sidekiq/api"
|
|
9
|
+
require "sidekiq/web/config"
|
|
10
|
+
|
|
11
|
+
module Sidekiq
|
|
12
|
+
class Web
|
|
13
|
+
ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../web")
|
|
14
|
+
VIEWS = "#{ROOT}/views"
|
|
15
|
+
LOCALES = ["#{ROOT}/locales"]
|
|
16
|
+
LAYOUT = "#{VIEWS}/layout.html.erb"
|
|
17
|
+
ASSETS = "#{ROOT}/assets"
|
|
18
|
+
|
|
19
|
+
DEFAULT_TABS = {
|
|
20
|
+
"Dashboard" => "",
|
|
21
|
+
"Busy" => "busy",
|
|
22
|
+
"Queues" => "queues",
|
|
23
|
+
"Retries" => "retries",
|
|
24
|
+
"Scheduled" => "scheduled",
|
|
25
|
+
"Dead" => "morgue",
|
|
26
|
+
"Metrics" => "metrics",
|
|
27
|
+
"Profiles" => "profiles"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@@config = Sidekiq::Web::Config.new
|
|
31
|
+
|
|
32
|
+
class << self
|
|
33
|
+
def configure
|
|
34
|
+
if block_given?
|
|
35
|
+
yield @@config
|
|
36
|
+
else
|
|
37
|
+
@@config
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def app_url=(url)
|
|
42
|
+
@@config.app_url = url
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def assets_path=(path)
|
|
46
|
+
@@config.assets_path = path
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def assets_path = @@config.assets_path
|
|
50
|
+
|
|
51
|
+
def tabs = @@config.tabs
|
|
52
|
+
|
|
53
|
+
def locales = @@config.locales
|
|
54
|
+
|
|
55
|
+
def views = @@config.views
|
|
56
|
+
|
|
57
|
+
def custom_job_info_rows = @@config.custom_job_info_rows
|
|
58
|
+
|
|
59
|
+
def redis_pool
|
|
60
|
+
@pool || Sidekiq.default_configuration.redis_pool
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def redis_pool=(pool)
|
|
64
|
+
@pool = pool
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def middlewares = @@config.middlewares
|
|
68
|
+
|
|
69
|
+
def use(*args, &block) = @@config.middlewares << [args, block]
|
|
70
|
+
|
|
71
|
+
def register(*args, **kw, &block)
|
|
72
|
+
Sidekiq.logger.warn { "`Sidekiq::Web.register` is deprecated, use `Sidekiq::Web.configure {|cfg| cfg.register(...) }`" }
|
|
73
|
+
@@config.register(*args, **kw, &block)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Allow user to say
|
|
78
|
+
# run Sidekiq::Web
|
|
79
|
+
# rather than:
|
|
80
|
+
# run Sidekiq::Web.new
|
|
81
|
+
def self.call(env)
|
|
82
|
+
@inst ||= new
|
|
83
|
+
@inst.call(env)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# testing, internal use only
|
|
87
|
+
def self.reset!
|
|
88
|
+
@@config.reset!
|
|
89
|
+
@inst = nil
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def call(env)
|
|
93
|
+
env[:web_config] = Sidekiq::Web.configure
|
|
94
|
+
env[:csp_nonce] = SecureRandom.hex(8)
|
|
95
|
+
env[:redis_pool] = self.class.redis_pool
|
|
96
|
+
safe_request?(env) ? app.call(env) : deny(env)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def app
|
|
100
|
+
@app ||= build(@@config)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def safe_methods?(env)
|
|
104
|
+
%w[GET HEAD OPTIONS TRACE].include? env["REQUEST_METHOD"]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def safe_request?(env)
|
|
108
|
+
return true if safe_methods?(env)
|
|
109
|
+
env["HTTP_SEC_FETCH_SITE"] == "same-origin"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def deny(env)
|
|
113
|
+
Sidekiq.logger.warn "attack prevented by #{self.class}"
|
|
114
|
+
[403, {Rack::CONTENT_TYPE => "text/plain"}, ["Forbidden"]]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
def build(cfg)
|
|
120
|
+
cfg.freeze
|
|
121
|
+
m = cfg.middlewares
|
|
122
|
+
|
|
123
|
+
rules = []
|
|
124
|
+
rules = [[:all, {"cache-control" => "private, max-age=86400"}]] unless ENV["SIDEKIQ_WEB_TESTING"]
|
|
125
|
+
|
|
126
|
+
::Rack::Builder.new do
|
|
127
|
+
use Rack::Static, urls: ["/stylesheets", "/images", "/javascripts"],
|
|
128
|
+
root: cfg.assets_path,
|
|
129
|
+
cascade: true,
|
|
130
|
+
header_rules: rules
|
|
131
|
+
m.each { |middleware, block| use(*middleware, &block) }
|
|
132
|
+
run Sidekiq::Web::Application.new(self.class)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
require "sidekiq/web/router"
|
|
139
|
+
require "sidekiq/web/action"
|
|
140
|
+
require "sidekiq/web/application"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Sidekiq
|
|
4
|
+
# Sidekiq::Job is a new alias for Sidekiq::Worker as of Sidekiq 6.3.0.
|
|
5
|
+
# Use `include Sidekiq::Job` rather than `include Sidekiq::Worker`.
|
|
6
|
+
#
|
|
7
|
+
# The term "worker" is too generic and overly confusing, used in several
|
|
8
|
+
# different contexts meaning different things. Many people call a Sidekiq
|
|
9
|
+
# process a "worker". Some people call the thread that executes jobs a
|
|
10
|
+
# "worker". This change brings Sidekiq closer to ActiveJob where your job
|
|
11
|
+
# classes extend ApplicationJob.
|
|
12
|
+
Worker = Job
|
|
13
|
+
end
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "sidekiq/version"
|
|
4
|
+
fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 3.2.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.2.0")
|
|
5
|
+
|
|
6
|
+
begin
|
|
7
|
+
require "sidekiq-ent/version"
|
|
8
|
+
fail <<~EOM if Gem::Version.new(Sidekiq::Enterprise::VERSION).segments[0] != Sidekiq::MAJOR
|
|
9
|
+
|
|
10
|
+
Sidekiq Enterprise #{Sidekiq::Enterprise::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
|
|
11
|
+
Starting with Sidekiq 7, major versions are synchronized so Sidekiq Enterprise 7 works with Sidekiq 7.
|
|
12
|
+
Use `bundle up sidekiq-ent` to upgrade.
|
|
13
|
+
|
|
14
|
+
EOM
|
|
15
|
+
rescue LoadError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
require "sidekiq/pro/version"
|
|
20
|
+
fail <<~EOM if Gem::Version.new(Sidekiq::Pro::VERSION).segments[0] != Sidekiq::MAJOR
|
|
21
|
+
|
|
22
|
+
Sidekiq Pro #{Sidekiq::Pro::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
|
|
23
|
+
Starting with Sidekiq 7, major versions are synchronized so Sidekiq Pro 7 works with Sidekiq 7.
|
|
24
|
+
Use `bundle up sidekiq-pro` to upgrade.
|
|
25
|
+
|
|
26
|
+
EOM
|
|
27
|
+
rescue LoadError
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
require "sidekiq/config"
|
|
31
|
+
require "sidekiq/logger"
|
|
32
|
+
require "sidekiq/loader"
|
|
33
|
+
require "sidekiq/client"
|
|
34
|
+
require "sidekiq/transaction_aware_client"
|
|
35
|
+
require "sidekiq/job"
|
|
36
|
+
require "sidekiq/iterable_job"
|
|
37
|
+
require "sidekiq/worker_compatibility_alias"
|
|
38
|
+
require "sidekiq/redis_client_adapter"
|
|
39
|
+
|
|
40
|
+
require "json"
|
|
41
|
+
|
|
42
|
+
module Sidekiq
|
|
43
|
+
NAME = "Sidekiq"
|
|
44
|
+
LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
|
|
45
|
+
|
|
46
|
+
def self.❨╯°□°❩╯︵┻━┻
|
|
47
|
+
puts "Take a deep breath and count to ten..."
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def self.testing!(mode = :fake, &block)
|
|
51
|
+
raise "Unknown testing mode: #{mode}" unless %i[fake disable inline].include?(mode)
|
|
52
|
+
|
|
53
|
+
require "sidekiq/test_api"
|
|
54
|
+
Sidekiq::Testing.__set_test_mode(mode, &block)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.server?
|
|
58
|
+
defined?(Sidekiq::CLI)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.load_json(string)
|
|
62
|
+
JSON.parse(string)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def self.dump_json(object)
|
|
66
|
+
JSON.generate(object)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.pro?
|
|
70
|
+
defined?(Sidekiq::Pro)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def self.ent?
|
|
74
|
+
defined?(Sidekiq::Enterprise)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.redis_pool
|
|
78
|
+
(Thread.current[:sidekiq_capsule] || default_configuration).redis_pool
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.redis(&block)
|
|
82
|
+
(Thread.current[:sidekiq_capsule] || default_configuration).redis(&block)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.strict_args!(mode = :raise)
|
|
86
|
+
Sidekiq::Config::DEFAULTS[:on_complex_arguments] = mode
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.default_job_options=(hash)
|
|
90
|
+
@default_job_options = default_job_options.merge(hash.transform_keys(&:to_s))
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.default_job_options
|
|
94
|
+
@default_job_options ||= {"retry" => true, "queue" => "default"}
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def self.default_configuration
|
|
98
|
+
@config ||= Sidekiq::Config.new
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.logger
|
|
102
|
+
default_configuration.logger
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.loader
|
|
106
|
+
@loader ||= Loader.new
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def self.configure_server(&block)
|
|
110
|
+
(@config_blocks ||= []) << block
|
|
111
|
+
yield default_configuration if server?
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def self.freeze!
|
|
115
|
+
@frozen = true
|
|
116
|
+
@config_blocks = nil
|
|
117
|
+
default_configuration.freeze!
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Creates a Sidekiq::Config instance that is more tuned for embedding
|
|
121
|
+
# within an arbitrary Ruby process. Notably it reduces concurrency by
|
|
122
|
+
# default so there is less contention for CPU time with other threads.
|
|
123
|
+
#
|
|
124
|
+
# instance = Sidekiq.configure_embed do |config|
|
|
125
|
+
# config.queues = %w[critical default low]
|
|
126
|
+
# end
|
|
127
|
+
# instance.run
|
|
128
|
+
# sleep 10
|
|
129
|
+
# instance.stop
|
|
130
|
+
#
|
|
131
|
+
# NB: it is really easy to overload a Ruby process with threads due to the GIL.
|
|
132
|
+
# I do not recommend setting concurrency higher than 2-3.
|
|
133
|
+
#
|
|
134
|
+
# NB: Sidekiq only supports one instance in memory. You will get undefined behavior
|
|
135
|
+
# if you try to embed Sidekiq twice in the same process.
|
|
136
|
+
def self.configure_embed(&block)
|
|
137
|
+
raise "Sidekiq global configuration is frozen, you must create all embedded instances BEFORE calling `run`" if @frozen
|
|
138
|
+
|
|
139
|
+
require "sidekiq/embedded"
|
|
140
|
+
cfg = default_configuration
|
|
141
|
+
cfg.concurrency = 2
|
|
142
|
+
@config_blocks&.each { |block| block.call(cfg) }
|
|
143
|
+
yield cfg
|
|
144
|
+
|
|
145
|
+
Sidekiq::Embedded.new(cfg)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def self.configure_client
|
|
149
|
+
yield default_configuration unless server?
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# We are shutting down Sidekiq but what about threads that
|
|
153
|
+
# are working on some long job? This error is
|
|
154
|
+
# raised in jobs that have not finished within the hard
|
|
155
|
+
# timeout limit. This is needed to rollback db transactions,
|
|
156
|
+
# otherwise Ruby's Thread#kill will commit. See #377.
|
|
157
|
+
# DO NOT RESCUE THIS ERROR IN YOUR JOBS
|
|
158
|
+
class Shutdown < Interrupt; end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
require "sidekiq/rails" if defined?(::Rails::Engine)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require_relative "lib/sidekiq/version"
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |gem|
|
|
4
|
+
gem.authors = ["Mike Perham"]
|
|
5
|
+
gem.email = ["info@contribsys.com"]
|
|
6
|
+
gem.summary = "Simple, efficient background processing for Ruby"
|
|
7
|
+
gem.description = "Simple, efficient background processing for Ruby."
|
|
8
|
+
gem.homepage = "https://sidekiq.org"
|
|
9
|
+
gem.license = "LGPL-3.0"
|
|
10
|
+
|
|
11
|
+
gem.executables = ["sidekiq", "sidekiqmon", "kiq"]
|
|
12
|
+
gem.files = %w[sidekiq.gemspec README.md Changes.md LICENSE.txt] + `git ls-files | grep -E '^(bin|lib|web)'`.split("\n")
|
|
13
|
+
gem.name = "sidekiq"
|
|
14
|
+
gem.version = Sidekiq::VERSION
|
|
15
|
+
gem.required_ruby_version = ">= 3.2.0"
|
|
16
|
+
|
|
17
|
+
gem.metadata = {
|
|
18
|
+
"homepage_uri" => "https://sidekiq.org",
|
|
19
|
+
"bug_tracker_uri" => "https://github.com/sidekiq/sidekiq/issues",
|
|
20
|
+
"documentation_uri" => "https://github.com/sidekiq/sidekiq/wiki",
|
|
21
|
+
"changelog_uri" => "https://github.com/sidekiq/sidekiq/blob/main/Changes.md",
|
|
22
|
+
"source_code_uri" => "https://github.com/sidekiq/sidekiq",
|
|
23
|
+
"rubygems_mfa_required" => "true"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
gem.add_dependency "redis-client", ">= 0.29.0"
|
|
27
|
+
gem.add_dependency "connection_pool", ">= 3.0.0"
|
|
28
|
+
gem.add_dependency "rack", ">= 3.2.0"
|
|
29
|
+
gem.add_dependency "json", ">= 2.16.0"
|
|
30
|
+
gem.add_dependency "logger", ">= 1.7.0"
|
|
31
|
+
end
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/* timeago.js - https://github.com/hustcc/timeago.js */
|
|
2
|
+
!function(e,t){"object"==typeof module&&module.exports?module.exports=t(e):e.timeago=t(e)}("undefined"!=typeof window?window:this,function(){function e(e){return e instanceof Date?e:isNaN(e)?/^\d+$/.test(e)?new Date(t(e,10)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/T/," ").replace(/Z/," UTC").replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"),new Date(e)):new Date(t(e))}function t(e){return parseInt(e)}function n(e,n,r){n=d[n]?n:d[r]?r:"en";var i=0;for(agoin=e<0?1:0,e=Math.abs(e);e>=l[i]&&i<p;i++)e/=l[i];return e=t(e),i*=2,e>(0===i?9:1)&&(i+=1),d[n](e,i)[agoin].replace("%s",e)}function r(t,n){return n=n?e(n):new Date,(n-e(t))/1e3}function i(e){for(var t=1,n=0,r=e;e>=l[n]&&n<p;n++)e/=l[n],t*=l[n];return r%=t,r=r?t-r:t,Math.ceil(r)}function o(e){return e.getAttribute?e.getAttribute(_):e.attr?e.attr(_):void 0}function u(e,t){function u(o,c,f,s){var d=r(c,e);o.innerHTML=n(d,f,t),a["k"+s]=setTimeout(function(){u(o,c,f,s)},1e3*i(d))}var a={};return t||(t="en"),this.format=function(i,o){return n(r(i,e),o,t)},this.render=function(e,t){void 0===e.length&&(e=[e]);for(var n=0;n<e.length;n++)u(e[n],o(e[n]),t,++c)},this.cancel=function(){for(var e in a)clearTimeout(a[e]);a={}},this.setLocale=function(e){t=e},this}function a(e,t){return new u(e,t)}var c=0,f="second_minute_hour_day_week_month_year".split("_"),s="秒_分钟_小时_天_周_月_年".split("_"),d={en:function(e,t){if(0===t)return["just now","right now"];var n=f[parseInt(t/2)];return e>1&&(n+="s"),[e+" "+n+" ago","in "+e+" "+n]},zh_CN:function(e,t){if(0===t)return["刚刚","片刻后"];var n=s[parseInt(t/2)];return[e+n+"前",e+n+"后"]}},l=[60,60,24,7,365/7/12,12],p=6,_="datetime";return a.register=function(e,t){d[e]=t},a});
|
|
3
|
+
!function(s){function n(a){if(e[a])return e[a].exports;var r=e[a]={exports:{},id:a,loaded:!1};return s[a].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}var e={};return n.m=s,n.c=e,n.p="",n(0)}([function(s,n,e){for(var a=e(1),r=null,t=a.length-1;t>=0;t--)r=a[t],"en"!=r&&"zh_CN"!=r&&timeago.register(r,e(2)("./"+r))},function(s,n){s.exports=["ar","be","bg","ca","da","de","el","en","en_short","es","eu","fr","hu","in_BG","in_HI","in_ID","it","ja","ko","ml","nb_NO","nl","nn_NO","pl","pt_BR","ru","sv","ta","th","uk","vi","zh_CN","zh_TW"]},function(s,n,e){function a(s){return e(r(s))}function r(s){return t[s]||function(){throw new Error("Cannot find module '"+s+"'.")}()}var t={"./ar":3,"./ar.js":3,"./be":4,"./be.js":4,"./bg":5,"./bg.js":5,"./ca":6,"./ca.js":6,"./da":7,"./da.js":7,"./de":8,"./de.js":8,"./el":9,"./el.js":9,"./en":10,"./en.js":10,"./en_short":11,"./en_short.js":11,"./es":12,"./es.js":12,"./eu":13,"./eu.js":13,"./fr":14,"./fr.js":14,"./hu":15,"./hu.js":15,"./in_BG":16,"./in_BG.js":16,"./in_HI":17,"./in_HI.js":17,"./in_ID":18,"./in_ID.js":18,"./it":19,"./it.js":19,"./ja":20,"./ja.js":20,"./ko":21,"./ko.js":21,"./locales":1,"./locales.js":1,"./ml":22,"./ml.js":22,"./nb_NO":23,"./nb_NO.js":23,"./nl":24,"./nl.js":24,"./nn_NO":25,"./nn_NO.js":25,"./pl":26,"./pl.js":26,"./pt_BR":27,"./pt_BR.js":27,"./ru":28,"./ru.js":28,"./sv":29,"./sv.js":29,"./ta":30,"./ta.js":30,"./th":31,"./th.js":31,"./uk":32,"./uk.js":32,"./vi":33,"./vi.js":33,"./zh_CN":34,"./zh_CN.js":34,"./zh_TW":35,"./zh_TW.js":35};a.keys=function(){return Object.keys(t)},a.resolve=r,s.exports=a,a.id=2},function(s,n){function e(s,n){return 1===n?a[s][0]:2==n?a[s][1]:n>=3&&n<=10?a[s][2]:a[s][3]}s.exports=function(s,n){if(0===n)return["منذ لحظات","بعد لحظات"];var a;switch(n){case 1:a=0;break;case 2:case 3:a=1;break;case 4:case 5:a=2;break;case 6:case 7:a=3;break;case 8:case 9:a=4;break;case 10:case 11:a=5;break;case 12:case 13:a=6}var r=e(a,s);return["منذ "+r,"بعد "+r]};var a=[["ثانية","ثانيتين","%s ثوان","%s ثانية"],["دقيقة","دقيقتين","%s دقائق","%s دقيقة"],["ساعة","ساعتين","%s ساعات","%s ساعة"],["يوم","يومين","%s أيام","%s يوماً"],["أسبوع","أسبوعين","%s أسابيع","%s أسبوعاً"],["شهر","شهرين","%s أشهر","%s شهراً"],["عام","عامين","%s أعوام","%s عاماً"]]},function(s,n){function e(s,n,e,a,r){var t=r%10,u=a;return 1===r?u=s:1===t&&r>20?u=n:t>1&&t<5&&(r>20||r<10)&&(u=e),u}var a=e.bind(null,"секунду","%s секунду","%s секунды","%s секунд"),r=e.bind(null,"хвіліну","%s хвіліну","%s хвіліны","%s хвілін"),t=e.bind(null,"гадзіну","%s гадзіну","%s гадзіны","%s гадзін"),u=e.bind(null,"дзень","%s дзень","%s дні","%s дзён"),i=e.bind(null,"тыдзень","%s тыдзень","%s тыдні","%s тыдняў"),o=e.bind(null,"месяц","%s месяц","%s месяцы","%s месяцаў"),d=e.bind(null,"год","%s год","%s гады","%s гадоў");s.exports=function(s,n){switch(n){case 0:return["толькі што","праз некалькі секунд"];case 1:return[a(s)+" таму","праз "+a(s)];case 2:case 3:return[r(s)+" таму","праз "+r(s)];case 4:case 5:return[t(s)+" таму","праз "+t(s)];case 6:case 7:return[u(s)+" таму","праз "+u(s)];case 8:case 9:return[i(s)+" таму","праз "+i(s)];case 10:case 11:return[o(s)+" таму","праз "+o(s)];case 12:case 13:return[d(s)+" таму","праз "+d(s)];default:return["",""]}}},function(s,n){s.exports=function(s,n){return[["току що","съвсем скоро"],["преди %s секунди","след %s секунди"],["преди 1 минута","след 1 минута"],["преди %s минути","след %s минути"],["преди 1 час","след 1 час"],["преди %s часа","след %s часа"],["преди 1 ден","след 1 ден"],["преди %s дни","след %s дни"],["преди 1 седмица","след 1 седмица"],["преди %s седмици","след %s седмици"],["преди 1 месец","след 1 месец"],["преди %s месеца","след %s месеца"],["преди 1 година","след 1 година"],["преди %s години","след %s години"]][n]}},function(s,n){s.exports=function(s,n){return[["fa un moment","d'aquí un moment"],["fa %s segons","d'aquí %s segons"],["fa 1 minut","d'aquí 1 minut"],["fa %s minuts","d'aquí %s minuts"],["fa 1 hora","d'aquí 1 hora"],["fa %s hores","d'aquí %s hores"],["fa 1 dia","d'aquí 1 dia"],["fa %s dies","d'aquí %s dies"],["fa 1 setmana","d'aquí 1 setmana"],["fa %s setmanes","d'aquí %s setmanes"],["fa 1 mes","d'aquí 1 mes"],["fa %s mesos","d'aquí %s mesos"],["fa 1 any","d'aquí 1 any"],["fa %s anys","d'aquí %s anys"]][n]}},function(s,n){s.exports=function(s,n){return[["for et øjeblik siden","om et øjeblik"],["for %s sekunder siden","om %s sekunder"],["for 1 minut siden","om 1 minut"],["for %s minutter siden","om %s minutter"],["for 1 time siden","om 1 time"],["for %s timer siden","om %s timer"],["for 1 dag siden","om 1 dag"],["for %s dage siden","om %s dage"],["for 1 uge siden","om 1 uge"],["for %s uger siden","om %s uger"],["for 1 måned siden","om 1 måned"],["for %s måneder siden","om %s måneder"],["for 1 år siden","om 1 år"],["for %s år siden","om %s år"]][n]}},function(s,n){s.exports=function(s,n){return[["gerade eben","vor einer Weile"],["vor %s Sekunden","in %s Sekunden"],["vor 1 Minute","in 1 Minute"],["vor %s Minuten","in %s Minuten"],["vor 1 Stunde","in 1 Stunde"],["vor %s Stunden","in %s Stunden"],["vor 1 Tag","in 1 Tag"],["vor %s Tagen","in %s Tagen"],["vor 1 Woche","in 1 Woche"],["vor %s Wochen","in %s Wochen"],["vor 1 Monat","in 1 Monat"],["vor %s Monaten","in %s Monaten"],["vor 1 Jahr","in 1 Jahr"],["vor %s Jahren","in %s Jahren"]][n]}},function(s,n){s.exports=function(s,n){return[["μόλις τώρα","σε λίγο"],["%s δευτερόλεπτα πριν","σε %s δευτερόλεπτα"],["1 λεπτό πριν","σε 1 λεπτό"],["%s λεπτά πριν","σε %s λεπτά"],["1 ώρα πριν","σε 1 ώρα"],["%s ώρες πριν","σε %s ώρες"],["1 μέρα πριν","σε 1 μέρα"],["%s μέρες πριν","σε %s μέρες"],["1 εβδομάδα πριν","σε 1 εβδομάδα"],["%s εβδομάδες πριν","σε %s εβδομάδες"],["1 μήνα πριν","σε 1 μήνα"],["%s μήνες πριν","σε %s μήνες"],["1 χρόνο πριν","σε 1 χρόνο"],["%s χρόνια πριν","σε %s χρόνια"]][n]}},function(s,n){s.exports=function(s,n){return[["just now","a while"],["%s seconds ago","in %s seconds"],["1 minute ago","in 1 minute"],["%s minutes ago","in %s minutes"],["1 hour ago","in 1 hour"],["%s hours ago","in %s hours"],["1 day ago","in 1 day"],["%s days ago","in %s days"],["1 week ago","in 1 week"],["%s weeks ago","in %s weeks"],["1 month ago","in 1 month"],["%s months ago","in %s months"],["1 year ago","in 1 year"],["%s years ago","in %s years"]][n]}},function(s,n){s.exports=function(s,n){return[["just now","a while"],["%ss ago","in %ss"],["1m ago","in 1m"],["%sm ago","in %sm"],["1h ago","in 1h"],["%sh ago","in %sh"],["1d ago","in 1d"],["%sd ago","in %sd"],["1w ago","in 1w"],["%sw ago","in %sw"],["1mo ago","in 1mo"],["%smo ago","in %smo"],["1yr ago","in 1yr"],["%syr ago","in %syr"]][n]}},function(s,n){s.exports=function(s,n){return[["justo ahora","en un rato"],["hace %s segundos","en %s segundos"],["hace 1 minuto","en 1 minuto"],["hace %s minutos","en %s minutos"],["hace 1 hora","en 1 hora"],["hace %s horas","en %s horas"],["hace 1 día","en 1 día"],["hace %s días","en %s días"],["hace 1 semana","en 1 semana"],["hace %s semanas","en %s semanas"],["hace 1 mes","en 1 mes"],["hace %s meses","en %s meses"],["hace 1 año","en 1 año"],["hace %s años","en %s años"]][n]}},function(s,n){s.exports=function(s,n){return[["orain","denbora bat barru"],["duela %s segundu","%s segundu barru"],["duela minutu 1","minutu 1 barru"],["duela %s minutu","%s minutu barru"],["duela ordu 1","ordu 1 barru"],["duela %s ordu","%s ordu barru"],["duela egun 1","egun 1 barru"],["duela %s egun","%s egun barru"],["duela aste 1","aste 1 barru"],["duela %s aste","%s aste barru"],["duela hillabete 1","hillabete 1 barru"],["duela %s hillabete","%s hillabete barru"],["duela urte 1","urte 1 barru"],["duela %s urte","%s urte barru"]][n]}},function(s,n){s.exports=function(s,n){return[["à l'instant","dans un instant"],["il y a %s secondes","dans %s secondes"],["il y a 1 minute","dans 1 minute"],["il y a %s minutes","dans %s minutes"],["il y a 1 heure","dans 1 heure"],["il y a %s heures","dans %s heures"],["il y a 1 jour","dans 1 jour"],["il y a %s jours","dans %s jours"],["il y a 1 semaine","dans 1 semaine"],["il y a %s semaines","dans %s semaines"],["il y a 1 mois","dans 1 mois"],["il y a %s mois","dans %s mois"],["il y a 1 an","dans 1 an"],["il y a %s ans","dans %s ans"]][n]}},function(s,n){s.exports=function(s,n){return[["éppen most","éppen most"],["%s másodperce","%s másodpercen belül"],["1 perce","1 percen belül"],["%s perce","%s percen belül"],["1 órája","1 órán belül"],["%s órája","%s órán belül"],["1 napja","1 napon belül"],["%s napja","%s napon belül"],["1 hete","1 héten belül"],["%s hete","%s héten belül"],["1 hónapja","1 hónapon belül"],["%s hónapja","%s hónapon belül"],["1 éve","1 éven belül"],["%s éve","%s éven belül"]][n]}},function(s,n){s.exports=function(s,n){return[["এইমাত্র","একটা সময়"],["%s সেকেন্ড আগে","%s এর সেকেন্ডের মধ্যে"],["1 মিনিট আগে","1 মিনিটে"],["%s এর মিনিট আগে","%s এর মিনিটের মধ্যে"],["1 ঘন্টা আগে","1 ঘন্টা"],["%s ঘণ্টা আগে","%s এর ঘন্টার মধ্যে"],["1 দিন আগে","1 দিনের মধ্যে"],["%s এর দিন আগে","%s এর দিন"],["1 সপ্তাহ আগে","1 সপ্তাহের মধ্যে"],["%s এর সপ্তাহ আগে","%s সপ্তাহের মধ্যে"],["1 মাস আগে","1 মাসে"],["%s মাস আগে","%s মাসে"],["1 বছর আগে","1 বছরের মধ্যে"],["%s বছর আগে","%s বছরে"]][n]}},function(s,n){s.exports=function(s,n){return[["अभी","कुछ समय"],["%s सेकंड पहले","%s सेकंड में"],["1 मिनट पहले","1 मिनट में"],["%s मिनट पहले","%s मिनट में"],["1 घंटे पहले","1 घंटे में"],["%s घंटे पहले","%s घंटे में"],["1 दिन पहले","1 दिन में"],["%s दिन पहले","%s दिनों में"],["1 सप्ताह पहले","1 सप्ताह में"],["%s हफ्ते पहले","%s हफ्तों में"],["1 महीने पहले","1 महीने में"],["%s महीने पहले","%s महीनों में"],["1 साल पहले","1 साल में"],["%s साल पहले","%s साल में"]][n]}},function(s,n){s.exports=function(s,n){return[["baru saja","sebentar"],["%s detik yang lalu","dalam %s detik"],["1 menit yang lalu","dalam 1 menit"],["%s menit yang lalu","dalam %s menit"],["1 jam yang lalu","dalam 1 jam"],["%s jam yang lalu","dalam %s jam"],["1 hari yang lalu","dalam 1 hari"],["%s hari yang lalu","dalam %s hari"],["1 minggu yang lalu","dalam 1 minggu"],["%s minggu yang lalu","dalam %s minggu"],["1 bulan yang lalu","dalam 1 bulan"],["%s bulan yang lalu","dalam %s bulan"],["1 tahun yang lalu","dalam 1 tahun"],["%s tahun yang lalu","dalam %s tahun"]][n]}},function(s,n){s.exports=function(s,n){return[["poco fa","tra poco"],["%s secondi fa","%s secondi da ora"],["un minuto fa","un minuto da ora"],["%s minuti fa","%s minuti da ora"],["un'ora fa","un'ora da ora"],["%s ore fa","%s ore da ora"],["un giorno fa","un giorno da ora"],["%s giorni fa","%s giorni da ora"],["una settimana fa","una settimana da ora"],["%s settimane fa","%s settimane da ora"],["un mese fa","un mese da ora"],["%s mesi fa","%s mesi da ora"],["un anno fa","un anno da ora"],["%s anni fa","%s anni da ora"]][n]}},function(s,n){s.exports=function(s,n){return[["すこし前","すぐに"],["%s秒前","%s秒以内"],["1分前","1分以内"],["%s分前","%s分以内"],["1時間前","1時間以内"],["%s時間前","%s時間以内"],["1日前","1日以内"],["%s日前","%s日以内"],["1週間前","1週間以内"],["%s週間前","%s週間以内"],["1ヶ月前","1ヶ月以内"],["%sヶ月前","%sヶ月以内"],["1年前","1年以内"],["%s年前","%s年以内"]][n]}},function(s,n){s.exports=function(s,n){return[["방금","곧"],["%s초 전","%s초 후"],["1분 전","1분 후"],["%s분 전","%s분 후"],["1시간 전","1시간 후"],["%s시간 전","%s시간 후"],["1일 전","1일 후"],["%s일 전","%s일 후"],["1주일 전","1주일 후"],["%s주일 전","%s주일 후"],["1개월 전","1개월 후"],["%s개월 전","%s개월 후"],["1년 전","1년 후"],["%s년 전","%s년 후"]][n]}},function(s,n){s.exports=function(s,n){return[["ഇപ്പോള്","കുറച്ചു മുന്പ്"],["%s സെക്കന്റ്കള്ക്ക് മുന്പ്","%s സെക്കന്റില്"],["1 മിനിറ്റിനു മുന്പ്","1 മിനിറ്റില്"],["%s മിനിറ്റുകള്ക്ക് മുന്പ","%s മിനിറ്റില്"],["1 മണിക്കൂറിനു മുന്പ്","1 മണിക്കൂറില്"],["%s മണിക്കൂറുകള്ക്കു മുന്പ്","%s മണിക്കൂറില്"],["1 ഒരു ദിവസം മുന്പ്","1 ദിവസത്തില്"],["%s ദിവസങ്ങള്ക് മുന്പ്","%s ദിവസങ്ങള്ക്കുള്ളില്"],["1 ആഴ്ച മുന്പ്","1 ആഴ്ചയില്"],["%s ആഴ്ചകള്ക്ക് മുന്പ്","%s ആഴ്ചകള്ക്കുള്ളില്"],["1 മാസത്തിനു മുന്പ്","1 മാസത്തിനുള്ളില്"],["%s മാസങ്ങള്ക്ക് മുന്പ്","%s മാസങ്ങള്ക്കുള്ളില്"],["1 വര്ഷത്തിനു മുന്പ്","1 വര്ഷത്തിനുള്ളില്"],["%s വര്ഷങ്ങള്ക്കു മുന്പ്","%s വര്ഷങ്ങള്ക്കുല്ല്ളില്"]][n]}},function(s,n){s.exports=function(s,n){return[["akkurat nå","om litt"],["%s sekunder siden","om %s sekunder"],["1 minutt siden","om 1 minutt"],["%s minutter siden","om %s minutter"],["1 time siden","om 1 time"],["%s timer siden","om %s timer"],["1 dag siden","om 1 dag"],["%s dager siden","om %s dager"],["1 uke siden","om 1 uke"],["%s uker siden","om %s uker"],["1 måned siden","om 1 måned"],["%s måneder siden","om %s måneder"],["1 år siden","om 1 år"],["%s år siden","om %s år"]][n]}},function(s,n){s.exports=function(s,n){return[["recent","binnenkort"],["%s seconden geleden","binnen %s seconden"],["1 minuut geleden","binnen 1 minuut"],["%s minuten geleden","binnen %s minuten"],["1 uur geleden","binnen 1 uur"],["%s uren geleden","binnen %s uren"],["1 dag geleden","binnen 1 dag"],["%s dagen geleden","binnen %s dagen"],["1 week geleden","binnen 1 week"],["%s weken geleden","binnen %s weken"],["1 maand geleden","binnen 1 maand"],["%s maanden geleden","binnen %s maanden"],["1 jaar geleden","binnen 1 jaar"],["%s jaren geleden","binnen %s jaren"]][n]}},function(s,n){s.exports=function(s,n){return[["nett no","om litt"],["%s sekund sidan","om %s sekund"],["1 minutt sidan","om 1 minutt"],["%s minutt sidan","om %s minutt"],["1 time sidan","om 1 time"],["%s timar sidan","om %s timar"],["1 dag sidan","om 1 dag"],["%s dagar sidan","om %s dagar"],["1 veke sidan","om 1 veke"],["%s veker sidan","om %s veker"],["1 månad sidan","om 1 månad"],["%s månadar sidan","om %s månadar"],["1 år sidan","om 1 år"],["%s år sidan","om %s år"]][n]}},function(s,n){s.exports=function(s,n){var e=[["w tej chwili","za chwilę"],["%s sekund temu","za %s sekund"],["1 minutę temu","za 1 minutę"],["%s minut temu","za %s minut"],["1 godzina temu","za 1 godzinę"],["%s godzin temu","za %s godzin"],["1 dzień temu","za 1 dzień"],["%s dni temu","za %s dni"],["1 tydzień temu","za 1 tydzień"],["%s tygodni temu","za %s tygodni"],["1 miesiąc temu","za 1 miesiąc"],["%s miesiące temu","za %s miesiące"],["1 rok temu","za 1 rok"],["%s lata temu","za %s lata"]],a=s.toString();return 1==n&&(2==a.length&&"1"==a[0]&&"0"!=a[1]||[2,3,4].indexOf(s%10)!=-1||[2,3,4].indexOf(s)!=-1)?["%s sekundy temu","za %s sekundy"]:3!=n||[2,3,4].indexOf(s%10)==-1&&[2,3,4].indexOf(s)==-1?5!=n||[2,3,4].indexOf(s%10)==-1&&[2,3,4].indexOf(s)==-1?9==n&&[2,3,4].indexOf(s)!=-1?["%s tygodnie temu","za %s tygodnie"]:11==n&&(s%10==0||2==a.length&&"1"==a[0]||[1,5,6,7,8,9].indexOf(s%10)!=-1)?["%s miesięcy temu","za %s miesięcy"]:13==n&&(s%10==0||2==a.length&&"1"==a[0]||[1,5,6,7,8,9].indexOf(s%10)!=-1)?["%s lat temu","za %s lat"]:e[n]:["%s godziny temu","za %s godziny"]:["%s minuty temu","za %s minuty"]}},function(s,n){s.exports=function(s,n){return[["agora mesmo","daqui um pouco"],["há %s segundos","em %s segundos"],["há um minuto","em um minuto"],["há %s minutos","em %s minutos"],["há uma hora","em uma hora"],["há %s horas","em %s horas"],["há um dia","em um dia"],["há %s dias","em %s dias"],["há uma semana","em uma semana"],["há %s semanas","em %s semanas"],["há um mês","em um mês"],["há %s meses","em %s meses"],["há um ano","em um ano"],["há %s anos","em %s anos"]][n]}},function(s,n){function e(s,n,e,a,r){var t=r%10,u=a;return 1===r?u=s:1===t&&r>20?u=n:t>1&&t<5&&(r>20||r<10)&&(u=e),u}var a=e.bind(null,"секунду","%s секунду","%s секунды","%s секунд"),r=e.bind(null,"минуту","%s минуту","%s минуты","%s минут"),t=e.bind(null,"час","%s час","%s часа","%s часов"),u=e.bind(null,"день","%s день","%s дня","%s дней"),i=e.bind(null,"неделю","%s неделю","%s недели","%s недель"),o=e.bind(null,"месяц","%s месяц","%s месяца","%s месяцев"),d=e.bind(null,"год","%s год","%s года","%s лет");s.exports=function(s,n){switch(n){case 0:return["только что","через несколько секунд"];case 1:return[a(s)+" назад","через "+a(s)];case 2:case 3:return[r(s)+" назад","через "+r(s)];case 4:case 5:return[t(s)+" назад","через "+t(s)];case 6:return["вчера","завтра"];case 7:return[u(s)+" назад","через "+u(s)];case 8:case 9:return[i(s)+" назад","через "+i(s)];case 10:case 11:return[o(s)+" назад","через "+o(s)];case 12:case 13:return[d(s)+" назад","через "+d(s)];default:return["",""]}}},function(s,n){s.exports=function(s,n){return[["just nu","om en stund"],["%s sekunder sedan","om %s seconder"],["1 minut sedan","om 1 minut"],["%s minuter sedan","om %s minuter"],["1 timme sedan","om 1 timme"],["%s timmar sedan","om %s timmar"],["1 dag sedan","om 1 day"],["%s dagar sedan","om %s days"],["1 vecka sedan","om 1 vecka"],["%s veckor sedan","om %s veckor"],["1 månad sedan","om 1 månad"],["%s månader sedan","om %s månader"],["1 år sedan","om 1 år"],["%s år sedan","om %s år"]][n]}},function(s,n){s.exports=function(s,n){return[["இப்போது","சற்று நேரம் முன்பு"],["%s நொடிக்கு முன்","%s நொடிகளில்"],["1 நிமிடத்திற்க்கு முன்","1 நிமிடத்தில்"],["%s நிமிடத்திற்க்கு முன்","%s நிமிடங்களில்"],["1 மணி நேரத்திற்கு முன்","1 மணி நேரத்திற்குள்"],["%s மணி நேரத்திற்கு முன்","%s மணி நேரத்திற்குள்"],["1 நாளுக்கு முன்","1 நாளில்"],["%s நாட்களுக்கு முன்","%s நாட்களில்"],["1 வாரத்திற்கு முன்","1 வாரத்தில்"],["%s வாரங்களுக்கு முன்","%s வாரங்களில்"],["1 மாதத்திற்கு முன்","1 மாதத்தில்"],["%s மாதங்களுக்கு முன்","%s மாதங்களில்"],["1 வருடத்திற்கு முன்","1 வருடத்தில்"],["%s வருடங்களுக்கு முன்","%s வருடங்களில்"]][n]}},function(s,n){s.exports=function(s,n){return[["เมื่อสักครู่นี้","อีกสักครู่"],["%s วินาทีที่แล้ว","ใน %s วินาที"],["1 นาทีที่แล้ว","ใน 1 นาที"],["%s นาทีที่แล้ว","ใน %s นาที"],["1 ชั่วโมงที่แล้ว","ใน 1 ชั่วโมง"],["%s ชั่วโมงที่แล้ว","ใน %s ชั่วโมง"],["1 วันที่แล้ว","ใน 1 วัน"],["%s วันที่แล้ว","ใน %s วัน"],["1 อาทิตย์ที่แล้ว","ใน 1 อาทิตย์"],["%s อาทิตย์ที่แล้ว","ใน %s อาทิตย์"],["1 เดือนที่แล้ว","ใน 1 เดือน"],["%s เดือนที่แล้ว","ใน %s เดือน"],["1 ปีที่แล้ว","ใน 1 ปี"],["%s ปีที่แล้ว","ใน %s ปี"]][n]}},function(s,n){function e(s,n,e,a,r){var t=r%10,u=a;return 1===r?u=s:1===t&&r>20?u=n:t>1&&t<5&&(r>20||r<10)&&(u=e),u}var a=e.bind(null,"секунду","%s секунду","%s секунди","%s секунд"),r=e.bind(null,"хвилину","%s хвилину","%s хвилини","%s хвилин"),t=e.bind(null,"годину","%s годину","%s години","%s годин"),u=e.bind(null,"день","%s день","%s дні","%s днів"),i=e.bind(null,"тиждень","%s тиждень","%s тиждні","%s тижднів"),o=e.bind(null,"місяць","%s місяць","%s місяці","%s місяців"),d=e.bind(null,"рік","%s рік","%s роки","%s років");s.exports=function(s,n){switch(n){case 0:return["щойно","через декілька секунд"];case 1:return[a(s)+" тому","через "+a(s)];case 2:case 3:return[r(s)+" тому","через "+r(s)];case 4:case 5:return[t(s)+" тому","через "+t(s)];case 6:case 7:return[u(s)+" тому","через "+u(s)];case 8:case 9:return[i(s)+" тому","через "+i(s)];case 10:case 11:return[o(s)+" тому","через "+o(s)];case 12:case 13:return[d(s)+" тому","через "+d(s)];default:return["",""]}}},function(s,n){s.exports=function(s,n){return[["vừa xong","một lúc"],["%s giây trước","trong %s giây"],["1 phút trước","trong 1 phút"],["%s phút trước","trong %s phút"],["1 giờ trước","trong 1 giờ"],["%s giờ trước","trong %s giờ"],["1 ngày trước","trong 1 ngày"],["%s ngày trước","trong %s ngày"],["1 tuần trước","trong 1 tuần"],["%s tuần trước","trong %s tuần"],["1 tháng trước","trong 1 tháng"],["%s tháng trước","trong %s tháng"],["1 năm trước","trong 1 năm"],["%s năm trước","trong %s năm"]][n]}},function(s,n){s.exports=function(s,n){return[["刚刚","片刻后"],["%s秒前","%s秒后"],["1分钟前","1分钟后"],["%s分钟前","%s分钟后"],["1小时前","1小时后"],["%s小时前","%s小时后"],["1天前","1天后"],["%s天前","%s天后"],["1周前","1周后"],["%s周前","%s周后"],["1月前","1月后"],["%s月前","%s月后"],["1年前","1年后"],["%s年前","%s年后"]][n]}},function(s,n){s.exports=function(s,n){return[["剛剛","片刻後"],["%s秒前","%s秒後"],["1分鐘前","1分鐘後"],["%s分鐘前","%s分鐘後"],["1小時前","1小時後"],["%s小時前","%s小時後"],["1天前","1天後"],["%s天前","%s天後"],["1周前","1周後"],["%s周前","%s周後"],["1月前","1月後"],["%s月前","%s月後"],["1年前","1年後"],["%s年前","%s年後"]][n]}}]);
|
|
4
|
+
|
|
5
|
+
var livePollTimer = null;
|
|
6
|
+
|
|
7
|
+
var ready = (callback) => {
|
|
8
|
+
if (document.readyState != "loading") callback();
|
|
9
|
+
else document.addEventListener("DOMContentLoaded", callback);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
ready(addListeners)
|
|
13
|
+
|
|
14
|
+
function addListeners() {
|
|
15
|
+
document.querySelectorAll(".check_all").forEach(node => {
|
|
16
|
+
node.addEventListener("click", event => {
|
|
17
|
+
node.closest('table').querySelectorAll('input[type=checkbox]').forEach(inp => { inp.checked = !!node.checked; });
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
document.querySelectorAll("[data-toggle]").forEach(node => {
|
|
22
|
+
node.addEventListener("click", addDataToggleListeners)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
initializeBulkToggle();
|
|
26
|
+
addShiftClickListeners();
|
|
27
|
+
updateFuzzyTimes();
|
|
28
|
+
updateNumbers();
|
|
29
|
+
updateProgressBars();
|
|
30
|
+
setLivePollFromUrl();
|
|
31
|
+
|
|
32
|
+
var buttons = document.querySelectorAll(".live-poll");
|
|
33
|
+
if (buttons.length > 0) {
|
|
34
|
+
buttons.forEach(node => {
|
|
35
|
+
node.addEventListener("click", addPollingListeners)
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
updateLivePollButton();
|
|
39
|
+
if (localStorage.sidekiqLivePoll == "enabled" && !livePollTimer) {
|
|
40
|
+
scheduleLivePoll();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
document.getElementById("locale-select").addEventListener("change", updateLocale);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function addPollingListeners(_event) {
|
|
48
|
+
if (localStorage.sidekiqLivePoll == "enabled") {
|
|
49
|
+
localStorage.sidekiqLivePoll = "disabled";
|
|
50
|
+
clearTimeout(livePollTimer);
|
|
51
|
+
livePollTimer = null;
|
|
52
|
+
} else {
|
|
53
|
+
localStorage.sidekiqLivePoll = "enabled";
|
|
54
|
+
livePollCallback();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
updateLivePollButton();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function addDataToggleListeners(event) {
|
|
61
|
+
var source = event.target || event.srcElement;
|
|
62
|
+
var targName = source.dataset.toggle;
|
|
63
|
+
var full = document.getElementById(targName);
|
|
64
|
+
full.classList.toggle("is-open");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function toggleBulkButtons() {
|
|
68
|
+
const checkboxes = document.querySelectorAll('.select-item-checkbox, .check-all-items');
|
|
69
|
+
const anyChecked = Array.from(checkboxes).some(cb => cb.checked);
|
|
70
|
+
const buttons = document.querySelectorAll('.bulk-action-buttons');
|
|
71
|
+
buttons.forEach(btn => {
|
|
72
|
+
btn.style.display = anyChecked ? 'none' : 'block';
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function initializeBulkToggle(){
|
|
77
|
+
document.querySelectorAll('.check-all-items, .select-item-checkbox').forEach(cb => {
|
|
78
|
+
cb.addEventListener('change', toggleBulkButtons);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function addShiftClickListeners() {
|
|
83
|
+
let checkboxes = Array.from(document.querySelectorAll(".shift_clickable"));
|
|
84
|
+
let lastChecked = null;
|
|
85
|
+
checkboxes.forEach(checkbox => {
|
|
86
|
+
checkbox.addEventListener("click", (e) => {
|
|
87
|
+
if (e.shiftKey && lastChecked) {
|
|
88
|
+
let myIndex = checkboxes.indexOf(checkbox);
|
|
89
|
+
let lastIndex = checkboxes.indexOf(lastChecked);
|
|
90
|
+
let [min, max] = [myIndex, lastIndex].sort();
|
|
91
|
+
let newState = checkbox.checked;
|
|
92
|
+
checkboxes.slice(min, max).forEach(c => c.checked = newState);
|
|
93
|
+
}
|
|
94
|
+
lastChecked = checkbox;
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function updateFuzzyTimes() {
|
|
100
|
+
var locale = document.body.dataset.locale;
|
|
101
|
+
var parts = locale.split('-');
|
|
102
|
+
if (typeof parts[1] !== 'undefined') {
|
|
103
|
+
parts[1] = parts[1].toUpperCase();
|
|
104
|
+
locale = parts.join('_');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
var t = timeago()
|
|
108
|
+
t.render(document.querySelectorAll('time'), locale);
|
|
109
|
+
t.cancel();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function updateNumbers() {
|
|
113
|
+
document.querySelectorAll("[data-nwp]").forEach(node => {
|
|
114
|
+
let number = parseFloat(node.textContent);
|
|
115
|
+
let precision = parseInt(node.dataset.nwp || 0);
|
|
116
|
+
if (typeof number === "number") {
|
|
117
|
+
let formatted = number.toLocaleString(undefined, {
|
|
118
|
+
minimumFractionDigits: precision,
|
|
119
|
+
maximumFractionDigits: precision,
|
|
120
|
+
});
|
|
121
|
+
node.textContent = formatted;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function setLivePollFromUrl() {
|
|
127
|
+
var url_params = new URL(window.location.href).searchParams
|
|
128
|
+
|
|
129
|
+
if (url_params.get("poll") == "true") {
|
|
130
|
+
localStorage.sidekiqLivePoll = "enabled";
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function updateLivePollButton() {
|
|
135
|
+
if (localStorage.sidekiqLivePoll == "enabled") {
|
|
136
|
+
document.querySelectorAll('.live-poll-stop').forEach(box => { box.classList.add("active") })
|
|
137
|
+
document.querySelectorAll('.live-poll-start').forEach(box => { box.classList.remove("active") })
|
|
138
|
+
} else {
|
|
139
|
+
document.querySelectorAll('.live-poll-start').forEach(box => { box.classList.add("active") })
|
|
140
|
+
document.querySelectorAll('.live-poll-stop').forEach(box => { box.classList.remove("active") })
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function livePollCallback() {
|
|
145
|
+
clearTimeout(livePollTimer);
|
|
146
|
+
|
|
147
|
+
fetch(window.location.href)
|
|
148
|
+
.then(checkResponse)
|
|
149
|
+
.then(resp => resp.text())
|
|
150
|
+
.then(replacePage)
|
|
151
|
+
.catch(showError)
|
|
152
|
+
.finally(scheduleLivePoll)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function checkResponse(resp) {
|
|
156
|
+
if (!resp.ok) {
|
|
157
|
+
throw resp.error();
|
|
158
|
+
}
|
|
159
|
+
return resp
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function scheduleLivePoll() {
|
|
163
|
+
let ti = parseInt(localStorage.sidekiqTimeInterval) || 5000;
|
|
164
|
+
if (ti < 2000) { ti = 2000 }
|
|
165
|
+
livePollTimer = setTimeout(livePollCallback, ti);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function replacePage(text) {
|
|
169
|
+
var parser = new DOMParser();
|
|
170
|
+
var doc = parser.parseFromString(text, "text/html");
|
|
171
|
+
|
|
172
|
+
var page = doc.querySelector('#page')
|
|
173
|
+
document.querySelector("#page").replaceWith(page)
|
|
174
|
+
|
|
175
|
+
addListeners();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function showError(error) {
|
|
179
|
+
console.error(error)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function updateLocale(event) {
|
|
183
|
+
event.target.form.submit();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function updateProgressBars() {
|
|
187
|
+
document.querySelectorAll('.progress-bar').forEach(bar => { bar.style.width = bar.dataset.width + "%"})
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function handleConfirmDialog (event) {
|
|
191
|
+
const target = event.target
|
|
192
|
+
|
|
193
|
+
if (target.localName !== "input" && target.localName !== "button" ) { return }
|
|
194
|
+
const confirmMessage = target.dataset.confirm
|
|
195
|
+
|
|
196
|
+
if (confirmMessage === undefined) { return }
|
|
197
|
+
|
|
198
|
+
if (!window.confirm(confirmMessage)) {
|
|
199
|
+
event.preventDefault()
|
|
200
|
+
event.stopPropagation()
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
document.addEventListener("click", handleConfirmDialog)
|