sidekiq 4.2.9 → 4.2.10

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

Potentially problematic release.


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

Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/issue_template.md +6 -1
  3. data/.travis.yml +10 -5
  4. data/Changes.md +9 -0
  5. data/Ent-Changes.md +9 -0
  6. data/Pro-Changes.md +29 -0
  7. data/bin/sidekiqload +11 -11
  8. data/lib/sidekiq.rb +1 -1
  9. data/lib/sidekiq/api.rb +20 -12
  10. data/lib/sidekiq/middleware/server/logging.rb +8 -17
  11. data/lib/sidekiq/processor.rb +16 -7
  12. data/lib/sidekiq/testing.rb +6 -0
  13. data/lib/sidekiq/version.rb +1 -1
  14. data/lib/sidekiq/web/application.rb +2 -2
  15. data/lib/sidekiq/web/helpers.rb +2 -1
  16. data/sidekiq.gemspec +8 -2
  17. data/web/assets/javascripts/dashboard.js +1 -1
  18. data/web/locales/fa.yml +79 -0
  19. data/web/views/_job_info.erb +1 -1
  20. data/web/views/dashboard.erb +2 -2
  21. data/web/views/morgue.erb +2 -0
  22. data/web/views/queue.erb +2 -2
  23. data/web/views/queues.erb +2 -2
  24. data/web/views/retry.erb +1 -1
  25. metadata +74 -63
  26. data/test/config.yml +0 -9
  27. data/test/env_based_config.yml +0 -11
  28. data/test/fake_env.rb +0 -1
  29. data/test/fixtures/en.yml +0 -2
  30. data/test/helper.rb +0 -75
  31. data/test/test_actors.rb +0 -138
  32. data/test/test_api.rb +0 -528
  33. data/test/test_cli.rb +0 -418
  34. data/test/test_client.rb +0 -266
  35. data/test/test_exception_handler.rb +0 -56
  36. data/test/test_extensions.rb +0 -129
  37. data/test/test_fetch.rb +0 -50
  38. data/test/test_launcher.rb +0 -92
  39. data/test/test_logging.rb +0 -35
  40. data/test/test_manager.rb +0 -50
  41. data/test/test_middleware.rb +0 -158
  42. data/test/test_processor.rb +0 -249
  43. data/test/test_rails.rb +0 -22
  44. data/test/test_redis_connection.rb +0 -132
  45. data/test/test_retry.rb +0 -326
  46. data/test/test_retry_exhausted.rb +0 -149
  47. data/test/test_scheduled.rb +0 -115
  48. data/test/test_scheduling.rb +0 -58
  49. data/test/test_sidekiq.rb +0 -107
  50. data/test/test_testing.rb +0 -143
  51. data/test/test_testing_fake.rb +0 -359
  52. data/test/test_testing_inline.rb +0 -94
  53. data/test/test_util.rb +0 -13
  54. data/test/test_web.rb +0 -679
  55. data/test/test_web_helpers.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1bfbae2d6e06595febe27592cf45c3a5f188f7e9
4
- data.tar.gz: cae512a4610cd6670d51559e71a3156a00d43eab
3
+ metadata.gz: 595500a3810c25e8e04e86c644f966ff01cb035f
4
+ data.tar.gz: 3f92a9f61e61848bc2c0639469ce3588f3848fc0
5
5
  SHA512:
6
- metadata.gz: 42b2738772c88ba2d22dee47dc8e8bb5755d8d8f769a033be6e0e503f6e15ddc02092db6b745365db93448d110231721838c9bec8c0ced7537c451dfecc940d0
7
- data.tar.gz: 8e6861e5b2cec345eeeb10fd2f031431dae82db2af3fa60e58a30c78d874f39a92a7638e0d291c5885a78eaa36dd50010dfb973225ee0dd6cd345059c17598e9
6
+ metadata.gz: c4e97c3665d1e902f47cfb579fda437dc834ac4b584606f1ca3b8fd9225e8502cacf5fb687673b4735b359de6af179589759a34369f1c74e904b37f8fe70a4ee
7
+ data.tar.gz: a4e6d41067bf6b88c77577def0c1f9ecc3f5d46f0bdfb0821952c26867e91a71c64231aab09a25096d22c3272dea2dcc37547bc6096dd7622a192fa00e0a4e50
@@ -1,4 +1,9 @@
1
1
  Ruby version:
2
2
  Sidekiq / Pro / Enterprise version(s):
3
3
 
4
- If relevant, please include your initializer and any error message with the full backtrace.
4
+ Please include your initializer and any error message with the full backtrace.
5
+
6
+ Are you using an old version?
7
+ Have you checked the changelog to see if your issue has been fixed in a later version?
8
+
9
+ https://github.com/mperham/sidekiq/blob/master/Changes.md
@@ -6,8 +6,13 @@ services:
6
6
  before_install:
7
7
  - gem install bundler
8
8
  - gem update bundler
9
- rvm:
10
- - 2.2.4
11
- - 2.3.0
12
- - 2.4.0
13
- - jruby-9.1.6.0
9
+ matrix:
10
+ include:
11
+ - rvm: 2.2.4
12
+ env: "PERCY_ENABLE=0"
13
+ - rvm: 2.3.0
14
+ env: "PERCY_ENABLE=0"
15
+ - rvm: 2.4.0
16
+ env: "PERCY_ENABLE=1"
17
+ - rvm: jruby-9.1.6.0
18
+ env: "PERCY_ENABLE=0"
data/Changes.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Sidekiq Changes
2
2
 
3
+ HEAD
4
+ -----------
5
+
6
+ - Scheduled jobs can now be moved directly to the Dead queue via API [#3390]
7
+ - Fix edge case leading to job duplication when using Sidekiq Pro's
8
+ reliability feature [#3388]
9
+ - Fix error class name display on retry page [#3348]
10
+ - More robust latency calculation [#3340]
11
+
3
12
  4.2.9
4
13
  -----------
5
14
 
@@ -3,6 +3,15 @@ Sidekiq Enterprise Changelog
3
3
 
4
4
  Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how to buy.
5
5
 
6
+ 1.5.2
7
+ -------------
8
+
9
+ - Fix encrypted arguments double-encrypted by retry or rate limiting [#3368]
10
+ - Fix leak in concurrent rate limiter, run this in Rails console to clean up existing data [#3323]
11
+ ```ruby
12
+ expiry = 1.month.to_i; Sidekiq::Limiter.redis { |c| c.scan_each(match: "lmtr-cfree-*") { |key| c.expire(key, expiry) } }
13
+ ```
14
+
6
15
  1.5.1
7
16
  -------------
8
17
 
@@ -3,6 +3,35 @@ Sidekiq Pro Changelog
3
3
 
4
4
  Please see [http://sidekiq.org/](http://sidekiq.org/) for more details and how to buy.
5
5
 
6
+ HEAD
7
+ ---------
8
+
9
+ - Make Batch UI progress bar more friendly to the colorblind [#3387]
10
+
11
+ 3.4.5
12
+ ---------
13
+
14
+ - Fix potential job loss with reliable scheduler when lots of jobs are scheduled
15
+ at precisely the same time. Thanks to raivil for his hard work in
16
+ reproducing the bug. [#3371]
17
+
18
+ 3.4.4
19
+ ---------
20
+
21
+ - Optimize super\_fetch shutdown to restart jobs quicker [#3249]
22
+
23
+ 3.4.3
24
+ ---------
25
+
26
+ - Limit reliable scheduler to enqueue up to 100 jobs per call, minimizing Redis latency [#3332]
27
+ - Fix bug in super\_fetch logic for queues with `_` in the name [#3339]
28
+
29
+ 3.4.2
30
+ ---------
31
+
32
+ - Add `Batch::Status#invalidated?` API which returns true if any/all
33
+ JIDs were invalidated within the batch. [#3326]
34
+
6
35
  3.4.1
7
36
  ---------
8
37
 
@@ -14,7 +14,7 @@ include Sidekiq::Util
14
14
 
15
15
  Sidekiq.configure_server do |config|
16
16
  #config.options[:concurrency] = 1
17
- config.redis = { driver: :hiredis, db: 13, port: 6380 }
17
+ config.redis = { db: 13 }
18
18
  config.options[:queues] << 'default'
19
19
  config.logger.level = Logger::ERROR
20
20
  config.average_scheduled_poll_interval = 2
@@ -36,14 +36,14 @@ end
36
36
  # brew tap shopify/shopify
37
37
  # brew install toxiproxy
38
38
  # gem install toxiproxy
39
- require 'toxiproxy'
39
+ #require 'toxiproxy'
40
40
  # simulate a non-localhost network for realer-world conditions.
41
41
  # adding 1ms of network latency has an ENORMOUS impact on benchmarks
42
- Toxiproxy.populate([{
43
- "name": "redis",
44
- "listen": "127.0.0.1:6380",
45
- "upstream": "127.0.0.1:6379"
46
- }])
42
+ #Toxiproxy.populate([{
43
+ #"name": "redis",
44
+ #"listen": "127.0.0.1:6380",
45
+ #"upstream": "127.0.0.1:6379"
46
+ #}])
47
47
 
48
48
  self_read, self_write = IO.pipe
49
49
  %w(INT TERM USR1 USR2 TTIN).each do |sig|
@@ -108,7 +108,7 @@ Sidekiq.logger.error "Created #{count*iter} jobs"
108
108
  Monitoring = Thread.new do
109
109
  watchdog("monitor thread") do
110
110
  while true
111
- sleep 2
111
+ sleep 1
112
112
  qsize, retries = Sidekiq.redis do |conn|
113
113
  conn.pipelined do
114
114
  conn.llen "queue:default"
@@ -130,8 +130,8 @@ begin
130
130
  #RubyProf::exclude_threads = [ Monitoring ]
131
131
  #RubyProf.start
132
132
  fire_event(:startup)
133
- Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
134
- Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
133
+ #Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
134
+ #Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
135
135
  launcher = Sidekiq::Launcher.new(Sidekiq.options)
136
136
  launcher.run
137
137
 
@@ -139,7 +139,7 @@ begin
139
139
  signal = readable_io.first[0].gets.strip
140
140
  handle_signal(launcher, signal)
141
141
  end
142
- end
142
+ #end
143
143
  rescue SystemExit => e
144
144
  #Sidekiq.logger.error("Profiling...")
145
145
  #result = RubyProf.stop
@@ -149,8 +149,8 @@ module Sidekiq
149
149
  require 'sidekiq/middleware/server/logging'
150
150
 
151
151
  Middleware::Chain.new do |m|
152
- m.add Middleware::Server::Logging
153
152
  m.add Middleware::Server::RetryJobs
153
+ m.add Middleware::Server::Logging
154
154
  end
155
155
  end
156
156
 
@@ -75,7 +75,10 @@ module Sidekiq
75
75
  enqueued = pipe2_res[s..-1].map(&:to_i).inject(0, &:+)
76
76
 
77
77
  default_queue_latency = if (entry = pipe1_res[6].first)
78
- Time.now.to_f - Sidekiq.load_json(entry)['enqueued_at'.freeze]
78
+ job = Sidekiq.load_json(entry)
79
+ now = Time.now.to_f
80
+ thence = job['enqueued_at'.freeze] || now
81
+ now - thence
79
82
  else
80
83
  0
81
84
  end
@@ -225,7 +228,10 @@ module Sidekiq
225
228
  conn.lrange(@rname, -1, -1)
226
229
  end.first
227
230
  return 0 unless entry
228
- Time.now.to_f - Sidekiq.load_json(entry)['enqueued_at']
231
+ job = Sidekiq.load_json(entry)
232
+ now = Time.now.to_f
233
+ thence = job['enqueued_at'] || now
234
+ now - thence
229
235
  end
230
236
 
231
237
  def each
@@ -351,7 +357,8 @@ module Sidekiq
351
357
  end
352
358
 
353
359
  def latency
354
- Time.now.to_f - (@item['enqueued_at'] || @item['created_at'])
360
+ now = Time.now.to_f
361
+ now - (@item['enqueued_at'] || @item['created_at'] || now)
355
362
  end
356
363
 
357
364
  ##
@@ -416,10 +423,9 @@ module Sidekiq
416
423
  end
417
424
 
418
425
  def retry
419
- raise "Retry not available on jobs which have not failed" unless item["failed_at"]
420
426
  remove_job do |message|
421
427
  msg = Sidekiq.load_json(message)
422
- msg['retry_count'] -= 1
428
+ msg['retry_count'] -= 1 if msg['retry_count']
423
429
  Sidekiq::Client.push(msg)
424
430
  end
425
431
  end
@@ -427,9 +433,7 @@ module Sidekiq
427
433
  ##
428
434
  # Place job in the dead set
429
435
  def kill
430
- raise 'Kill not available on jobs which have not failed' unless item['failed_at']
431
436
  remove_job do |message|
432
- Sidekiq.logger.info { "Killing job #{message['jid']}" }
433
437
  now = Time.now.to_f
434
438
  Sidekiq.redis do |conn|
435
439
  conn.multi do
@@ -441,6 +445,10 @@ module Sidekiq
441
445
  end
442
446
  end
443
447
 
448
+ def error?
449
+ !!item['error_class']
450
+ end
451
+
444
452
  private
445
453
 
446
454
  def remove_job
@@ -585,13 +593,13 @@ module Sidekiq
585
593
  # Allows enumeration of scheduled jobs within Sidekiq.
586
594
  # Based on this, you can search/filter for jobs. Here's an
587
595
  # example where I'm selecting all jobs of a certain type
588
- # and deleting them from the retry queue.
596
+ # and deleting them from the schedule queue.
589
597
  #
590
598
  # r = Sidekiq::ScheduledSet.new
591
- # r.select do |retri|
592
- # retri.klass == 'Sidekiq::Extensions::DelayedClass' &&
593
- # retri.args[0] == 'User' &&
594
- # retri.args[1] == 'setup_new_subscriber'
599
+ # r.select do |scheduled|
600
+ # scheduled.klass == 'Sidekiq::Extensions::DelayedClass' &&
601
+ # scheduled.args[0] == 'User' &&
602
+ # scheduled.args[1] == 'setup_new_subscriber'
595
603
  # end.map(&:delete)
596
604
  class ScheduledSet < JobSet
597
605
  def initialize
@@ -4,28 +4,19 @@ module Sidekiq
4
4
  class Logging
5
5
 
6
6
  def call(worker, item, queue)
7
- Sidekiq::Logging.with_context(log_context(worker, item)) do
8
- begin
9
- start = Time.now
10
- logger.info("start".freeze)
11
- yield
12
- logger.info("done: #{elapsed(start)} sec")
13
- rescue Exception
14
- logger.info("fail: #{elapsed(start)} sec")
15
- raise
16
- end
7
+ begin
8
+ start = Time.now
9
+ logger.info("start".freeze)
10
+ yield
11
+ logger.info("done: #{elapsed(start)} sec")
12
+ rescue Exception
13
+ logger.info("fail: #{elapsed(start)} sec")
14
+ raise
17
15
  end
18
16
  end
19
17
 
20
18
  private
21
19
 
22
- # If we're using a wrapper class, like ActiveJob, use the "wrapped"
23
- # attribute to expose the underlying thing.
24
- def log_context(worker, item)
25
- klass = item['wrapped'.freeze] || worker.class.to_s
26
- "#{klass} JID-#{item['jid'.freeze]}#{" BID-#{item['bid'.freeze]}" if item['bid'.freeze]}"
27
- end
28
-
29
20
  def elapsed(start)
30
21
  (Time.now - start).round(3)
31
22
  end
@@ -129,13 +129,15 @@ module Sidekiq
129
129
  worker.jid = job_hash['jid'.freeze]
130
130
 
131
131
  stats(worker, job_hash, queue) do
132
- Sidekiq.server_middleware.invoke(worker, job_hash, queue) do
133
- @executor.call do
134
- # Only ack if we either attempted to start this job or
135
- # successfully completed it. This prevents us from
136
- # losing jobs if a middleware raises an exception before yielding
137
- ack = true
138
- execute_job(worker, cloned(job_hash['args'.freeze]))
132
+ Sidekiq::Logging.with_context(log_context(job_hash)) do
133
+ ack = true
134
+ Sidekiq.server_middleware.invoke(worker, job_hash, queue) do
135
+ @executor.call do
136
+ # Only ack if we either attempted to start this job or
137
+ # successfully completed it. This prevents us from
138
+ # losing jobs if a middleware raises an exception before yielding
139
+ execute_job(worker, cloned(job_hash['args'.freeze]))
140
+ end
139
141
  end
140
142
  end
141
143
  end
@@ -154,6 +156,13 @@ module Sidekiq
154
156
  end
155
157
  end
156
158
 
159
+ # If we're using a wrapper class, like ActiveJob, use the "wrapped"
160
+ # attribute to expose the underlying thing.
161
+ def log_context(item)
162
+ klass = item['wrapped'.freeze] || item['class'.freeze]
163
+ "#{klass} JID-#{item['jid'.freeze]}#{" BID-#{item['bid'.freeze]}" if item['bid'.freeze]}"
164
+ end
165
+
157
166
  def execute_job(worker, cloned_args)
158
167
  worker.perform(*cloned_args)
159
168
  end
@@ -316,3 +316,9 @@ module Sidekiq
316
316
  end
317
317
  end
318
318
  end
319
+
320
+ if defined?(::Rails) && !Rails.env.test?
321
+ puts("**************************************************")
322
+ puts("⛔️ WARNING: Sidekiq testing API enabled, but this is not the test environment. Your jobs will not go to Redis.")
323
+ puts("**************************************************")
324
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Sidekiq
3
- VERSION = "4.2.9"
3
+ VERSION = "4.2.10"
4
4
  end
@@ -85,7 +85,7 @@ module Sidekiq
85
85
  name = route_params[:name]
86
86
  Sidekiq::Job.new(params['key_val'], name).delete
87
87
 
88
- redirect_with_query("#{root_path}queues/#{name}")
88
+ redirect_with_query("#{root_path}queues/#{CGI.escape(name)}")
89
89
  end
90
90
 
91
91
  get '/morgue' do
@@ -281,7 +281,7 @@ module Sidekiq
281
281
  when :json
282
282
  { "Content-Type" => "application/json", "Cache-Control" => "no-cache" }
283
283
  when String
284
- { "Content-Type" => action.type, "Cache-Control" => "no-cache" }
284
+ { "Content-Type" => (action.type || "text/html"), "Cache-Control" => "no-cache" }
285
285
  else
286
286
  { "Content-Type" => "text/html", "Cache-Control" => "no-cache" }
287
287
  end
@@ -2,6 +2,7 @@
2
2
  require 'uri'
3
3
  require 'set'
4
4
  require 'yaml'
5
+ require 'cgi'
5
6
 
6
7
  module Sidekiq
7
8
  # This is not a public API
@@ -161,7 +162,7 @@ module Sidekiq
161
162
  def qparams(options)
162
163
  options = options.stringify_keys
163
164
  params.merge(options).map do |key, value|
164
- SAFE_QPARAMS.include?(key) ? "#{key}=#{value}" : next
165
+ SAFE_QPARAMS.include?(key) ? "#{key}=#{CGI.escape(value.to_s)}" : next
165
166
  end.compact.join("&")
166
167
  end
167
168
 
@@ -10,8 +10,8 @@ Gem::Specification.new do |gem|
10
10
  gem.license = "LGPL-3.0"
11
11
 
12
12
  gem.executables = ['sidekiq', 'sidekiqctl']
13
- gem.files = `git ls-files | grep -Ev '^(myapp|examples)'`.split("\n")
14
- gem.test_files = `git ls-files -- test/*`.split("\n")
13
+ gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
14
+ gem.test_files = []
15
15
  gem.name = "sidekiq"
16
16
  gem.require_paths = ["lib"]
17
17
  gem.version = Sidekiq::VERSION
@@ -23,4 +23,10 @@ Gem::Specification.new do |gem|
23
23
  gem.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.1'
24
24
  gem.add_development_dependency 'rake', '~> 10.0'
25
25
  gem.add_development_dependency 'rails', '>= 3.2.0'
26
+
27
+ gem.add_development_dependency 'capybara', '~> 2.11'
28
+ gem.add_development_dependency 'poltergeist', '~> 1.12'
29
+ gem.add_development_dependency 'percy-capybara', '~> 2.3'
30
+ gem.add_development_dependency 'timecop', '~> 0.8'
31
+ gem.add_development_dependency 'mocha', '~> 1.1'
26
32
  end
@@ -20,7 +20,7 @@ factory.defined&&factory.defined(function(d){return d.y!==null});return factory}
20
20
  var poller;
21
21
 
22
22
  var realtimeGraph = function(updatePath) {
23
- var timeInterval = parseInt(localStorage.timeInterval || '2000');
23
+ var timeInterval = parseInt(localStorage.timeInterval || '5000');
24
24
 
25
25
  var graphElement = document.getElementById("realtime");
26
26
 
@@ -0,0 +1,79 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ fa: # <---- change this to your locale code
3
+ Dashboard: داشبورد
4
+ Status: اعلان
5
+ Time: رمان
6
+ Namespace: فضای نام
7
+ Realtime: زنده
8
+ History: تاریخچه
9
+ Busy: مشغول
10
+ Processed: پردازش شده
11
+ Failed: ناموفق
12
+ Scheduled: زمان بندی
13
+ Retries: تکرار
14
+ Enqueued: صف بندی نشدند
15
+ Worker: کارگزار
16
+ LivePoll: Live Poll
17
+ StopPolling: Stop Polling
18
+ Queue: صف
19
+ Class: کلاس
20
+ Job: کار
21
+ Arguments: آرگومنت
22
+ Extras: اضافی
23
+ Started: شروع شده
24
+ ShowAll: نمایش همه
25
+ CurrentMessagesInQueue: کار فعلی در <span class='title'>%{queue}</span>
26
+ Delete: حذف
27
+ AddToQueue: افزودن به صف
28
+ AreYouSureDeleteJob: آیا شما مطمعن هستید از حذف این کار ؟
29
+ AreYouSureDeleteQueue: ایا شما مطمعنید از حذف %{queue} ?
30
+ Queues: صف ها
31
+ Size: سایز
32
+ Actions: اعمال
33
+ NextRetry: بار دیگر تلاش کنید
34
+ RetryCount: تعداد تلاش ها
35
+ RetryNow: تلاش مجدد
36
+ Kill: کشتن
37
+ LastRetry: آخرین تلاش
38
+ OriginallyFailed: Originally Failed
39
+ AreYouSure: آیا مطمعن هستید?
40
+ DeleteAll: حذف همه
41
+ RetryAll: تلاش مجدد برای همه
42
+ NoRetriesFound: هیچ تلاش پیدا نشد
43
+ Error: خطا
44
+ ErrorClass: خطا کلاس
45
+ ErrorMessage: پیغام خطا
46
+ ErrorBacktrace: خطای معکوس
47
+ GoBack: ← برگشت
48
+ NoScheduledFound: هیچ کار برنامه ریزی شده ای یافت نشد
49
+ When: وقتی که
50
+ ScheduledJobs: کار برنامه ریزی شده
51
+ idle: بیهودی
52
+ active: فعال
53
+ Version: ورژن
54
+ Connections: ارتباطات
55
+ MemoryUsage: حافظه استفاده شده
56
+ PeakMemoryUsage: اوج حافظه استفاده شده
57
+ Uptime: آپ تایم (روز)
58
+ OneWeek: ۱ هفته
59
+ OneMonth: ۱ ماه
60
+ ThreeMonths: ۳ ماه
61
+ SixMonths: ۶ ماه
62
+ Failures: شکست ها
63
+ DeadJobs: کار مرده
64
+ NoDeadJobsFound: کار مرده ای یافت نشد
65
+ Dead: مرده
66
+ Processes: پردازش ها
67
+ Thread: رشته
68
+ Threads: رشته ها
69
+ Jobs: کار ها
70
+ Paused: مکث
71
+ Stop: توقف
72
+ Quiet: خروج
73
+ StopAll: توقف همه
74
+ QuietAll: خروج همه
75
+ PollingInterval: Polling interval
76
+ Plugins: پلاگین ها
77
+ NotYetEnqueued: بدون صف بندی
78
+ CreatedAt: ساخته شده در
79
+ BackToApp: برگشت به برنامه