wurk 1.4.0 → 1.5.0
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 +4 -4
- data/README.md +3 -1
- data/app/controllers/concerns/wurk/stream_concurrency_guard.rb +22 -5
- data/lib/wurk/capsule.rb +40 -12
- data/lib/wurk/client/buffered.rb +7 -0
- data/lib/wurk/client.rb +102 -32
- data/lib/wurk/component.rb +34 -2
- data/lib/wurk/configuration.rb +45 -6
- data/lib/wurk/context.rb +1 -1
- data/lib/wurk/engine.rb +41 -1
- data/lib/wurk/errors.rb +15 -0
- data/lib/wurk/fetcher/reaper.rb +12 -2
- data/lib/wurk/fetcher/reliable.rb +322 -60
- data/lib/wurk/fetcher.rb +6 -0
- data/lib/wurk/heartbeat.rb +2 -2
- data/lib/wurk/job_logger.rb +16 -7
- data/lib/wurk/job_set.rb +3 -2
- data/lib/wurk/job_util.rb +44 -24
- data/lib/wurk/launcher.rb +116 -72
- data/lib/wurk/leader.rb +36 -6
- data/lib/wurk/logger.rb +1 -1
- data/lib/wurk/lua/loader.rb +9 -3
- data/lib/wurk/metrics/accumulator.rb +95 -0
- data/lib/wurk/metrics/flusher.rb +70 -0
- data/lib/wurk/metrics/history.rb +98 -29
- data/lib/wurk/metrics/statsd.rb +32 -18
- data/lib/wurk/middleware/chain.rb +31 -14
- data/lib/wurk/middleware/poison_pill.rb +23 -2
- data/lib/wurk/pool_checkout.rb +10 -0
- data/lib/wurk/processor.rb +79 -11
- data/lib/wurk/profiler.rb +6 -2
- data/lib/wurk/queue.rb +8 -0
- data/lib/wurk/redis_client_adapter.rb +1 -1
- data/lib/wurk/redis_pool.rb +2 -1
- data/lib/wurk/shutdown_gate.rb +79 -0
- data/lib/wurk/stats.rb +5 -1
- data/lib/wurk/swarm/child_boot.rb +24 -4
- data/lib/wurk/swarm.rb +88 -14
- data/lib/wurk/version.rb +1 -1
- data/lib/wurk/web/config.rb +11 -7
- data/lib/wurk.rb +2 -8
- data/vendor/assets/dashboard/assets/{ArgsValue-D74zX0MI.js → ArgsValue-CcR2ya6e.js} +1 -1
- data/vendor/assets/dashboard/assets/{BatchDetail-OmC5NPgw.js → BatchDetail-CUXJUQ3Q.js} +1 -1
- data/vendor/assets/dashboard/assets/{Batches-CIpai7St.js → Batches-Cxan6Ngw.js} +1 -1
- data/vendor/assets/dashboard/assets/{Busy-A_kwSR6Q.js → Busy-DC5EGM0g.js} +1 -1
- data/vendor/assets/dashboard/assets/{Cron-BG7HTqlp.js → Cron-Dlt8tXJA.js} +1 -1
- data/vendor/assets/dashboard/assets/Dashboard-DNLu_WCg.js +1 -0
- data/vendor/assets/dashboard/assets/{Dead-8J21jMyK.js → Dead-dZ7VGlKS.js} +1 -1
- data/vendor/assets/dashboard/assets/{Extension-B4Q9FIQu.js → Extension-DaFpEIJf.js} +1 -1
- data/vendor/assets/dashboard/assets/{FilterBox-Fh_Ae7UW.js → FilterBox-CO3aYWIq.js} +1 -1
- data/vendor/assets/dashboard/assets/{JobDetailModal-Ceng0PMB.js → JobDetailModal-DSWbT6G0.js} +1 -1
- data/vendor/assets/dashboard/assets/{Limiters-CruDWvNZ.js → Limiters-Cb4PKXNR.js} +1 -1
- data/vendor/assets/dashboard/assets/Metrics-CCGzgCsT.js +1 -0
- data/vendor/assets/dashboard/assets/{Modal-CN3rdKA_.js → Modal-B86q6ruL.js} +1 -1
- data/vendor/assets/dashboard/assets/{PageHeader-C44KNMGm.js → PageHeader-fPrCcp_-.js} +1 -1
- data/vendor/assets/dashboard/assets/{Profiles-xEVTyS2N.js → Profiles-BnS82nR_.js} +1 -1
- data/vendor/assets/dashboard/assets/{Queues-D86FYohJ.js → Queues-CIyPevOy.js} +1 -1
- data/vendor/assets/dashboard/assets/{Retries-Bz1O1D-i.js → Retries-DopwXkXl.js} +1 -1
- data/vendor/assets/dashboard/assets/{Scheduled-B6h2akTu.js → Scheduled-1-Z7i1zE.js} +1 -1
- data/vendor/assets/dashboard/assets/{Search-OOu22e5s.js → Search-ByA6eTma.js} +1 -1
- data/vendor/assets/dashboard/assets/{Skeleton-DzR7XNxz.js → Skeleton-bC7HfQ9r.js} +1 -1
- data/vendor/assets/dashboard/assets/{charts-BVHHGof7.js → charts-CLLzJ7vK.js} +1 -1
- data/vendor/assets/dashboard/assets/index-B1N8hQUh.js +141 -0
- data/vendor/assets/dashboard/assets/{useResetPageOnEmpty-dVPGEWzn.js → useResetPageOnEmpty-DpBjkf6_.js} +1 -1
- data/vendor/assets/dashboard/assets/{useSort-BeYbztkN.js → useSort-DvpwuNQE.js} +1 -1
- data/vendor/assets/dashboard/index.html +2 -2
- data/vendor/assets/dashboard/wurk-manifest.json +2 -2
- metadata +30 -26
- data/vendor/assets/dashboard/assets/Dashboard-A_ToqHoo.js +0 -1
- data/vendor/assets/dashboard/assets/Metrics-CIT7VCoN.js +0 -1
- data/vendor/assets/dashboard/assets/index-D_lSDwKw.js +0 -141
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wurk
|
|
4
|
+
# The two rules a process teardown obeys: it runs exactly once, and it never
|
|
5
|
+
# waits on a thread without a bound. Same reason TimerLoop exists — the
|
|
6
|
+
# mutex/clock dance was going to be hand-rolled in the caller, so it lives in
|
|
7
|
+
# one place with a name instead.
|
|
8
|
+
#
|
|
9
|
+
# A worker process can have several shutdown requests in flight at once — a
|
|
10
|
+
# dashboard-queued TERM, an embedded host calling `stop`, a Manager that can
|
|
11
|
+
# no longer hold its concurrency — and running the teardown twice double-fires
|
|
12
|
+
# the `:exit` hooks and tears the Redis pool down under the thread still using
|
|
13
|
+
# it.
|
|
14
|
+
#
|
|
15
|
+
# @gate = Wurk::ShutdownGate.new
|
|
16
|
+
# def stop = @gate.run { ...teardown... }
|
|
17
|
+
#
|
|
18
|
+
# The first caller runs the block; the rest block until it returns and then get
|
|
19
|
+
# nil. `Queue#close` releases every waiter at once and makes every later call
|
|
20
|
+
# return immediately, so a `stop` landing after the teardown finished is a
|
|
21
|
+
# no-op rather than a second one.
|
|
22
|
+
#
|
|
23
|
+
# The lock is only ever held for the bookkeeping, never across the teardown —
|
|
24
|
+
# a caller that must not block (a dying Processor thread, the heartbeat the
|
|
25
|
+
# teardown is about to join) has to be able to ask for a shutdown that is
|
|
26
|
+
# already under way without deadlocking against it.
|
|
27
|
+
class ShutdownGate
|
|
28
|
+
def initialize
|
|
29
|
+
@mutex = ::Mutex.new
|
|
30
|
+
@owner = nil
|
|
31
|
+
@runner = nil
|
|
32
|
+
@done = ::Queue.new
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def run
|
|
36
|
+
return await unless claim
|
|
37
|
+
|
|
38
|
+
begin
|
|
39
|
+
yield
|
|
40
|
+
ensure
|
|
41
|
+
@done.close
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Memoizes the one background thread a caller uses to reach #run from
|
|
46
|
+
# somewhere it cannot block. Spawned once: a second request rides the first
|
|
47
|
+
# teardown instead of leaving another unreferenced one running behind it.
|
|
48
|
+
def runner
|
|
49
|
+
@mutex.synchronize { @runner ||= yield }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Join every thread inside one shared monotonic `budget` (an absolute
|
|
53
|
+
# CLOCK_MONOTONIC instant), so N wedged threads cost the budget once rather
|
|
54
|
+
# than N times. A non-positive remainder polls without waiting, which is the
|
|
55
|
+
# right answer once the budget is spent: the straggler is left to the process
|
|
56
|
+
# exit rather than holding the whole teardown open behind it.
|
|
57
|
+
def join_within(threads, budget)
|
|
58
|
+
threads.each { |t| t.join([budget - ::Process.clock_gettime(::Process::CLOCK_MONOTONIC), 0].max) }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def claim
|
|
64
|
+
@mutex.synchronize do
|
|
65
|
+
return false if @owner
|
|
66
|
+
|
|
67
|
+
@owner = Thread.current
|
|
68
|
+
true
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# The owner re-entering (a `:shutdown` hook that calls `stop`) cannot wait on
|
|
73
|
+
# a teardown it is inside of, so it returns instead of deadlocking.
|
|
74
|
+
def await
|
|
75
|
+
@done.pop unless @mutex.synchronize { @owner } == Thread.current
|
|
76
|
+
nil
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
data/lib/wurk/stats.rb
CHANGED
|
@@ -172,7 +172,11 @@ module Wurk
|
|
|
172
172
|
raise ArgumentError, "days_previous must be in 1..#{MAX_DAYS}" unless (1..MAX_DAYS).cover?(days_previous)
|
|
173
173
|
|
|
174
174
|
@days_previous = days_previous
|
|
175
|
-
|
|
175
|
+
# UTC, not `Date.today`: the writer (Launcher#write_stats) keys these
|
|
176
|
+
# buckets off `Time.now.utc`, so a local civil date reads a day the
|
|
177
|
+
# writer never wrote for whatever slice of each day the host's offset
|
|
178
|
+
# spans — the newest bucket comes back 0 and the window is shifted.
|
|
179
|
+
@start_date = start_date || ::Time.now.utc.to_date
|
|
176
180
|
@pool = pool
|
|
177
181
|
end
|
|
178
182
|
|
|
@@ -128,18 +128,38 @@ module Wurk
|
|
|
128
128
|
# boot rides out instead of racing straight into a dead pool. A PING that
|
|
129
129
|
# still fails past the wrapper's retries propagates and crashes the child
|
|
130
130
|
# (the swarm respawns it) rather than booting a worker that can't reach
|
|
131
|
-
# Redis.
|
|
132
|
-
#
|
|
131
|
+
# Redis.
|
|
132
|
+
#
|
|
133
|
+
# The PING rides in the same pipeline as the eager Lua upload, so the whole
|
|
134
|
+
# check is one round trip and the child's first EVALSHA hits a warm cache.
|
|
135
|
+
#
|
|
136
|
+
# #101 boot-audit: hoisting the upload into the parent (one server-global
|
|
137
|
+
# `SCRIPT LOAD` for the whole fleet, children PING only) was measured and
|
|
138
|
+
# REJECTED — see Swarm#boot. Children reconnect in parallel, so the upload
|
|
139
|
+
# they pay here overlaps; the parent's would have been serial, ahead of
|
|
140
|
+
# every fork.
|
|
133
141
|
def validate_redis!
|
|
134
142
|
@config.redis_pool.with do |conn|
|
|
135
|
-
conn.
|
|
136
|
-
|
|
143
|
+
conn.pipelined do |pipe|
|
|
144
|
+
pipe.call('PING')
|
|
145
|
+
Wurk::Lua::Loader.queue_script_loads(pipe)
|
|
146
|
+
end
|
|
137
147
|
end
|
|
138
148
|
end
|
|
139
149
|
|
|
140
150
|
# AR reconnect is best-effort — a Redis-only worker with no database still
|
|
141
151
|
# runs — but the silent `rescue nil` here hid a real misconfiguration
|
|
142
152
|
# during the #101 audit, so warn loudly instead of swallowing.
|
|
153
|
+
#
|
|
154
|
+
# #101 boot-audit: measured, not assumed. `establish_connection` only
|
|
155
|
+
# records the connection spec on the pool manager (~0.3ms warm, on top
|
|
156
|
+
# of a one-time adapter-load cost already paid pre-fork in the parent);
|
|
157
|
+
# it does not itself open a socket. `ConnectionPool#stat[:connections]`
|
|
158
|
+
# stays 0 immediately after — AR opens the real handshake lazily, on
|
|
159
|
+
# the job thread's first `ActiveRecord::Base.connection` checkout, same
|
|
160
|
+
# as it always has. So `:startup` (fired right after this in `#run`)
|
|
161
|
+
# never waits on a DB round trip. Pinned by
|
|
162
|
+
# `test_reconnect_active_record_does_not_eagerly_open_a_connection`.
|
|
143
163
|
def reconnect_active_record
|
|
144
164
|
return unless defined?(::ActiveRecord::Base)
|
|
145
165
|
|
data/lib/wurk/swarm.rb
CHANGED
|
@@ -54,6 +54,12 @@ module Wurk
|
|
|
54
54
|
SUPERVISOR_POOL_SIZE = 1
|
|
55
55
|
SUPERVISOR_POOL_NAME = 'swarm-supervisor'
|
|
56
56
|
|
|
57
|
+
# Poll budget for the post-SIGKILL reap sweep (250ms). Deliberately far
|
|
58
|
+
# shorter than any drain deadline — it runs after the fleet is already dead
|
|
59
|
+
# and races a kernel teardown measured in microseconds.
|
|
60
|
+
HARD_KILL_REAP_ATTEMPTS = 25
|
|
61
|
+
HARD_KILL_REAP_INTERVAL = 0.01
|
|
62
|
+
|
|
57
63
|
# Children each hard_shutdown after their own drain deadline (bulk_requeue
|
|
58
64
|
# + a 3s ensure window + heartbeat cleanup); the parent must not SIGKILL
|
|
59
65
|
# them mid-tail, so its own wait always extends past theirs by this much.
|
|
@@ -101,6 +107,21 @@ module Wurk
|
|
|
101
107
|
# its default disposition — it died instantly and orphaned live, fetching
|
|
102
108
|
# children. Installed first, the trap queues the TERM and the supervise
|
|
103
109
|
# loop drains it (relaying to children) even if it arrives mid-boot.
|
|
110
|
+
#
|
|
111
|
+
# `prepare_for_fork!` is the last thing before the fork and stays after
|
|
112
|
+
# `close_parent_sockets`: it materializes the slot-independent config so
|
|
113
|
+
# every child inherits it copy-on-write, and none of what it touches opens
|
|
114
|
+
# a socket — anything that did would land back on the wrong side of step 3.
|
|
115
|
+
#
|
|
116
|
+
# Nothing else belongs between steps 3 and 4. #101 boot-audit: a pre-fork
|
|
117
|
+
# `SCRIPT LOAD` was tried here (the cache is server-global, so one upload
|
|
118
|
+
# could serve the whole fleet and children would only PING) and MEASURED
|
|
119
|
+
# SLOWER — `bench:swarm_boot` 152 -> 95 i/s, a 36.7% regression. Step 3 has
|
|
120
|
+
# just closed every parent socket, so the upload has to open its own
|
|
121
|
+
# connection, and it lands serially ahead of the first fork: ~2ms of a
|
|
122
|
+
# ~10ms boot, on every child's path. The per-child upload it replaced cost
|
|
123
|
+
# far less — the children reconnect in parallel, and it rides in the
|
|
124
|
+
# pipeline of a PING each one already sends (ChildBoot#validate_redis!).
|
|
104
125
|
def boot(install_signals: true)
|
|
105
126
|
raise 'Wurk::Swarm already booted' unless @assignments.empty?
|
|
106
127
|
raise ArgumentError, 'Topology has no slots' if @topology.empty?
|
|
@@ -109,6 +130,7 @@ module Wurk
|
|
|
109
130
|
@owner_pid = ::Process.pid
|
|
110
131
|
install_signal_handlers if install_signals
|
|
111
132
|
close_parent_sockets
|
|
133
|
+
@config.prepare_for_fork!
|
|
112
134
|
fork_children
|
|
113
135
|
child_pids
|
|
114
136
|
end
|
|
@@ -243,6 +265,16 @@ module Wurk
|
|
|
243
265
|
end
|
|
244
266
|
|
|
245
267
|
# Step 4.
|
|
268
|
+
#
|
|
269
|
+
# #101 boot-audit: measured, not assumed. Instrumented an 8-child boot
|
|
270
|
+
# against real Redis — `close_supervisor_pool` costs ~0.01-0.07ms per
|
|
271
|
+
# call (a nil-checked ivar write plus, at most, a disconnect on an
|
|
272
|
+
# already-torn-down pool); `Process.fork` itself is ~1-2ms/child and
|
|
273
|
+
# dominates the loop entirely. Hoisting the close out of the loop would
|
|
274
|
+
# save microseconds against a multi-millisecond fork syscall — not worth
|
|
275
|
+
# losing the "must run before the first fork" invariant's current
|
|
276
|
+
# per-fork enforcement. Left sequential; re-measure with
|
|
277
|
+
# `bin/rake bench:swarm_boot` before revisiting.
|
|
246
278
|
def fork_children
|
|
247
279
|
@assignments.each_index { |idx| spawn_child(@assignments[idx], idx) }
|
|
248
280
|
end
|
|
@@ -349,18 +381,29 @@ module Wurk
|
|
|
349
381
|
end
|
|
350
382
|
|
|
351
383
|
# Reap every exited child this tick (not one), so a fleet-wide death
|
|
352
|
-
# recovers in parallel rather than one child per SUPERVISE_TICK.
|
|
353
|
-
#
|
|
354
|
-
#
|
|
384
|
+
# recovers in parallel rather than one child per SUPERVISE_TICK.
|
|
385
|
+
#
|
|
386
|
+
# Waits on the KNOWN pids, one by one — never `wait2(-1)`. Embedded
|
|
387
|
+
# (`RailsBoot.boot_swarm`) the supervisor shares a process with the host
|
|
388
|
+
# app, and a wildcard wait consumes the exit status of ANY child: a Puma
|
|
389
|
+
# worker, a `system`/`Open3`/`spawn` subprocess. The host's own
|
|
390
|
+
# `Process.wait` then fails with ECHILD and its subprocess bookkeeping
|
|
391
|
+
# breaks. A pid the swarm did not fork is never its business.
|
|
355
392
|
def reap_children
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
393
|
+
child_pids.each { |pid| reap_child(pid) }
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
# ECHILD on a pid the swarm forked means someone else already reaped it —
|
|
397
|
+
# an embedded host with its own wildcard reaper is exactly the mirror of the
|
|
398
|
+
# bug above. Retire the slot with an unknown status rather than skip it: the
|
|
399
|
+
# child is gone either way, and leaving the entry in the table wedges the
|
|
400
|
+
# slot forever (never respawned because it still looks alive, never reaped
|
|
401
|
+
# because there is nothing left to reap).
|
|
402
|
+
def reap_child(pid)
|
|
403
|
+
reaped, status = ::Process.wait2(pid, ::Process::WNOHANG)
|
|
404
|
+
on_child_exit(pid, status) if reaped
|
|
362
405
|
rescue Errno::ECHILD
|
|
363
|
-
nil
|
|
406
|
+
on_child_exit(pid, nil)
|
|
364
407
|
end
|
|
365
408
|
|
|
366
409
|
def on_child_exit(pid, status)
|
|
@@ -370,7 +413,7 @@ module Wurk
|
|
|
370
413
|
return if @restart.claim_exit(pid)
|
|
371
414
|
|
|
372
415
|
if @stopping
|
|
373
|
-
logger.info { "swarm: child #{pid} exited (status=#{status
|
|
416
|
+
logger.info { "swarm: child #{pid} exited (status=#{status&.exitstatus})" }
|
|
374
417
|
else
|
|
375
418
|
schedule_respawn(pid, status, meta)
|
|
376
419
|
end
|
|
@@ -385,7 +428,7 @@ module Wurk
|
|
|
385
428
|
idx = meta[:index]
|
|
386
429
|
delay = @respawn_backoff.fail(idx, lifetime: monotonic - meta[:spawned_at])
|
|
387
430
|
logger.warn do
|
|
388
|
-
"swarm: child #{pid} died (status=#{status
|
|
431
|
+
"swarm: child #{pid} died (status=#{status&.exitstatus}); respawning slot #{idx} in #{delay}s"
|
|
389
432
|
end
|
|
390
433
|
end
|
|
391
434
|
|
|
@@ -469,13 +512,44 @@ module Wurk
|
|
|
469
512
|
# Kill and forget atomically: a child landing in the table between the walk
|
|
470
513
|
# and the clear would be dropped from it without ever being signalled —
|
|
471
514
|
# untracked and still alive.
|
|
515
|
+
#
|
|
516
|
+
# SIGKILL only schedules the teardown; the pid stays a zombie until someone
|
|
517
|
+
# waits on it, and this is the swarm's last reap — `shutdown` has already
|
|
518
|
+
# left the supervise loop behind. Standalone the exiting process hands its
|
|
519
|
+
# zombies to init, but embedded (`RailsBoot.boot_swarm`) the host lives on
|
|
520
|
+
# and carries one zombie per straggler for the rest of its life. The sweep
|
|
521
|
+
# runs on the pids taken under the lock but outside it: it sleeps, and the
|
|
522
|
+
# child table is never held across a sleep.
|
|
472
523
|
def hard_kill_stragglers
|
|
473
|
-
@lock.synchronize do
|
|
474
|
-
@children.
|
|
524
|
+
killed = @lock.synchronize do
|
|
525
|
+
pids = @children.keys
|
|
526
|
+
pids.each { |pid| safe_kill(pid, 'KILL') }
|
|
475
527
|
@children.clear
|
|
528
|
+
pids
|
|
529
|
+
end
|
|
530
|
+
reap_killed(killed)
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
# Bounded and best-effort: SIGKILL is asynchronous, so poll rather than
|
|
534
|
+
# block on a pid that may be wedged in uninterruptible sleep. A straggler
|
|
535
|
+
# still unreaped when the budget runs out is dropped exactly as before —
|
|
536
|
+
# the drain must not stall on it.
|
|
537
|
+
def reap_killed(pids)
|
|
538
|
+
pending = pids
|
|
539
|
+
HARD_KILL_REAP_ATTEMPTS.times do
|
|
540
|
+
pending = pending.reject { |pid| reaped?(pid) }
|
|
541
|
+
break if pending.empty?
|
|
542
|
+
|
|
543
|
+
sleep HARD_KILL_REAP_INTERVAL
|
|
476
544
|
end
|
|
477
545
|
end
|
|
478
546
|
|
|
547
|
+
def reaped?(pid)
|
|
548
|
+
!::Process.wait2(pid, ::Process::WNOHANG).nil?
|
|
549
|
+
rescue Errno::ECHILD
|
|
550
|
+
true
|
|
551
|
+
end
|
|
552
|
+
|
|
479
553
|
# Has the child written its first heartbeat yet? One non-blocking SISMEMBER,
|
|
480
554
|
# polled by the restart state machine each tick. Identity is
|
|
481
555
|
# `<hostname>:<pid>:<nonce>`; PROCESS_NONCE is set when Component loads in
|
data/lib/wurk/version.rb
CHANGED
data/lib/wurk/web/config.rb
CHANGED
|
@@ -196,15 +196,19 @@ module Wurk
|
|
|
196
196
|
end
|
|
197
197
|
|
|
198
198
|
# Builds the host-middleware chain wrapping `inner`, memoized against
|
|
199
|
-
#
|
|
200
|
-
#
|
|
201
|
-
#
|
|
202
|
-
#
|
|
203
|
-
#
|
|
199
|
+
# `[inner, middlewares]` — `middlewares` is the live array (upstream
|
|
200
|
+
# surface), so direct mutation after the first request triggers a
|
|
201
|
+
# rebuild instead of silently serving the stale chain. Keying on
|
|
202
|
+
# `inner` too matters for the same reason: memoizing on the
|
|
203
|
+
# middleware list alone pins whichever `inner` app the *first* caller
|
|
204
|
+
# passed, forever — a second mount (e.g. per-test Rack app, or a
|
|
205
|
+
# second engine mount) would silently get served the first one's app.
|
|
206
|
+
# Production builds exactly once at boot; the per-request comparison
|
|
207
|
+
# is an == over a handful of entries plus one object identity check.
|
|
204
208
|
def rack_app(inner)
|
|
205
|
-
return @rack_app if @rack_app && @
|
|
209
|
+
return @rack_app if @rack_app && @rack_app_key == [inner, @middlewares]
|
|
206
210
|
|
|
207
|
-
@
|
|
211
|
+
@rack_app_key = [inner, @middlewares.dup]
|
|
208
212
|
stack = @middlewares
|
|
209
213
|
@rack_app = ::Rack::Builder.new do
|
|
210
214
|
stack.each { |middleware, args, block| use(middleware, *args, &block) }
|
data/lib/wurk.rb
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
# end of this file when Rails is present (drop-in parity, #246), and stay
|
|
6
6
|
# unloaded otherwise so a no-Rails boot pulls in zero Rails code.
|
|
7
7
|
|
|
8
|
+
require_relative 'wurk/errors'
|
|
8
9
|
require_relative 'wurk/version'
|
|
9
10
|
require_relative 'wurk/keys'
|
|
10
11
|
require_relative 'wurk/redis_pool'
|
|
@@ -73,7 +74,7 @@ require_relative 'wurk/deploy'
|
|
|
73
74
|
|
|
74
75
|
require 'json'
|
|
75
76
|
|
|
76
|
-
# Wurk — a 100% API-compatible, free
|
|
77
|
+
# Wurk — a 100% API-compatible, free drop-in for Sidekiq + Sidekiq Pro
|
|
77
78
|
# + Sidekiq Enterprise. Same Redis key schema, same job JSON, same Ruby DSL;
|
|
78
79
|
# real parallelism via a fork-based swarm. Every public class is also exposed
|
|
79
80
|
# under its `Sidekiq::*` name (see {Sidekiq}).
|
|
@@ -86,13 +87,6 @@ require 'json'
|
|
|
86
87
|
#
|
|
87
88
|
# @see https://github.com/developerz-ai/wurk/blob/main/docs/migrate-from-sidekiq.md Migration guide
|
|
88
89
|
module Wurk
|
|
89
|
-
class Error < StandardError; end
|
|
90
|
-
|
|
91
|
-
# Raised inside a worker process to abort the run loop. User code must not
|
|
92
|
-
# rescue this — the swarm uses it to signal teardown across thread boundaries.
|
|
93
|
-
# Spec: docs/target/sidekiq-free.md §3.
|
|
94
|
-
class Shutdown < Interrupt; end
|
|
95
|
-
|
|
96
90
|
# Process-wide job option defaults. Per-class options from `sidekiq_options`
|
|
97
91
|
# take precedence; this hash is the floor.
|
|
98
92
|
DEFAULT_JOB_OPTIONS = { 'retry' => true, 'queue' => 'default' }.freeze
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,_ as n,b as r,v as i,w as a,z as o}from"./Skeleton-
|
|
1
|
+
import{A as e,F as t,_ as n,b as r,v as i,w as a,z as o}from"./Skeleton-bC7HfQ9r.js";import{o as s}from"./utils-DDJC7tJV.js";var c=a(`<span>`),l=a(`<span style=color:var(--text-muted)>—`);function u(a){return t(e,{get when(){return i(()=>a.str!==`[]`)()&&a.str!==``},get fallback(){return l()},get children(){var e=c();return n(e,()=>s(a.str,a.max)),o(()=>r(e,`title`,a.str)),e}})}export{u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,J as n,M as r,O as i,_ as a,c as o,f as s,k as c,r as l,s as u,v as d,w as f}from"./Skeleton-
|
|
1
|
+
import{A as e,F as t,J as n,M as r,O as i,_ as a,c as o,f as s,k as c,r as l,s as u,v as d,w as f}from"./Skeleton-bC7HfQ9r.js";import{o as p,s as m}from"./index-B1N8hQUh.js";import{a as h}from"./utils-DDJC7tJV.js";var g=f(`<div style=display:flex;flex-direction:column;gap:2px><span style=font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.04em></span><span style=font-variant-numeric:tabular-nums>`),_=f(`<div style=margin-top:1.5rem><h2 style="font-size:14px;margin:0 0 0.5rem"> <span class="badge badge-muted"></span></h2><div class=table-wrapper><table><tbody>`),v=f(`<tr><td style=font-family:monospace;font-size:12px>`),y=f(`<div><div class=section-header style=gap:0.75rem></div><div style=margin-top:1rem>`),b=f(`<div class=empty-state style=color:var(--danger)>`),x=f(`<span class="badge badge-success">`),S=f(`<span class="badge badge-danger">`),C=f(`<p style=color:var(--text-muted);margin-top:0>`),w=f(`<div><div class=section-header style=gap:0.75rem><h1 class=page-title style=margin:0;font-family:monospace;font-size:16px></h1></div><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(140px, 1fr));gap:1rem;margin-top:1rem">`),T=f(`<span class="badge badge-accent">%`);function E(e){return(()=>{var t=g(),n=t.firstChild,r=n.nextSibling;return a(n,()=>e.label),a(r,()=>e.children),t})()}function D(n){return t(e,{get when(){return n.jids.length>0},get children(){var e=_(),r=e.firstChild,o=r.firstChild,s=o.nextSibling,c=r.nextSibling.firstChild.firstChild;return a(r,()=>n.label,o),a(s,()=>n.jids.length),a(c,t(i,{get each(){return n.jids},children:e=>(()=>{var t=v(),n=t.firstChild;return a(n,e),t})()})),e}})}function O(){let i=m(),f=()=>i.bid??``;n(()=>{document.title=`${u(`nav.batches`)} — Wurk`});let g=s(()=>({queryKey:[`batch`,f()],queryFn:()=>fetch(`${o()}/api/batches/${encodeURIComponent(f())}`).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()})}));return t(r,{get children(){return[t(c,{get when(){return g.isPending},get children(){var e=y(),n=e.firstChild,r=n.nextSibling;return a(n,t(p,{href:`/batches`,class:`btn btn-sm`,get children(){return[`← `,d(()=>u(`nav.batches`))]}})),a(r,t(l,{count:8})),e}}),t(c,{get when(){return g.isError||!g.data},get children(){var e=b();return a(e,()=>u(`common.error`)),e}}),t(c,{get when(){return g.data},children:n=>{let r=()=>n().total-n().pending,i=()=>n().total>0?Math.round(r()/n().total*100):0;return(()=>{var r=w(),o=r.firstChild,s=o.firstChild,c=o.nextSibling;return a(o,t(p,{href:`/batches`,class:`btn btn-sm`,get children(){return[`← `,d(()=>u(`nav.batches`))]}}),s),a(s,()=>n().bid),a(o,t(e,{get when(){return n().complete},get fallback(){return(()=>{var e=T(),t=e.firstChild;return a(e,i,t),e})()},get children(){var e=x();return a(e,()=>u(`batches.complete`)),e}}),null),a(o,t(e,{get when(){return n().invalidated},get children(){var e=S();return a(e,()=>u(`batches.invalidated`)),e}}),null),a(r,t(e,{get when(){return n().description},get children(){var e=C();return a(e,()=>n().description),e}}),c),a(c,t(E,{get label(){return u(`table.total`)},get children(){return n().total.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`table.pending`)},get children(){return n().pending.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`table.failures`)},get children(){return n().failures.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`batches.children`)},get children(){return n().child_count.toLocaleString()}}),null),a(c,t(E,{get label(){return u(`table.created`)},get children(){return d(()=>!!n().created_at)()?h(n().created_at):`—`}}),null),a(c,t(E,{get label(){return u(`batches.completed`)},get children(){return d(()=>!!n().complete_at)()?h(n().complete_at):`—`}}),null),a(c,t(e,{get when(){return n().parent_bid},get children(){return t(E,{get label(){return u(`batches.parent`)},get children(){return n().parent_bid}})}}),null),a(c,t(e,{get when(){return n().tags.length>0},get children(){return t(E,{get label(){return u(`batches.tags`)},get children(){return n().tags.join(`, `)}})}}),null),a(r,t(D,{get label(){return u(`batches.failed_jobs`)},get jids(){return n().failed_jids}}),null),a(r,t(D,{get label(){return u(`batches.dead_jobs`)},get jids(){return n().dead_jids}}),null),r})()}})]}})}export{O as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,J as n,M as r,O as i,_ as a,b as o,c as s,f as c,i as l,k as u,s as d,v as f,w as p,x as m,z as h}from"./Skeleton-
|
|
1
|
+
import{A as e,F as t,J as n,M as r,O as i,_ as a,b as o,c as s,f as c,i as l,k as u,s as d,v as f,w as p,x as m,z as h}from"./Skeleton-bC7HfQ9r.js";import{n as g,o as _}from"./index-B1N8hQUh.js";import{a as v,o as y}from"./utils-DDJC7tJV.js";import{n as b,r as x,t as S}from"./useResetPageOnEmpty-DpBjkf6_.js";import{n as C,t as w}from"./useSort-DvpwuNQE.js";import{t as T}from"./PageHeader-fPrCcp_-.js";var E=p(`<div>`),D=p(`<div class=empty-state style=color:var(--danger)>`),O=p(`<span class="badge badge-accent">`),k=p(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),A=p(`<div class=empty-state>`),j=p(`<tr><td style=font-family:monospace;font-size:12px></td><td></td><td></td><td></td><td></td><td style=width:100px><div style=display:flex;align-items:center;gap:0.5rem><div class=progress-bar-track style=flex:1><div class=progress-bar-fill></div></div><span style=font-size:11px;color:var(--text-muted);min-width:32px>%</span></div></td><td>`),M=25,N={bid:e=>e.bid,description:e=>e.description??``,total:e=>e.total,pending:e=>e.pending,failures:e=>e.failures,progress:e=>e.total>0?(e.total-e.pending)/e.total:0,created:e=>e.created_at??null};function P(){let[p,P]=b();n(()=>{document.title=`${d(`nav.batches`)} — Wurk`});let F=c(()=>({queryKey:[`batches`,p()],queryFn:()=>g(`${s()}/api/batches?page=${p()-1}&count=${M}`)}));S(p,P,()=>!F.isPending&&!!F.data,()=>(F.data?.batches.length??0)===0);let{sorted:I,sort:L,toggle:R}=w(()=>F.data?.batches??[],N);return t(r,{get children(){return[t(u,{get when(){return F.isPending},get children(){var e=E();return a(e,t(T,{icon:`fa-table-cells-large`,get title(){return d(`nav.batches`)},get summary(){return d(`summaries.batches`)}}),null),a(e,t(l,{rows:8,cols:7}),null),e}}),t(u,{get when(){return F.isError||!F.data},get children(){var e=D();return a(e,()=>d(`common.error`)),e}}),t(u,{get when(){return F.data},children:n=>(()=>{var r=E();return a(r,t(T,{icon:`fa-table-cells-large`,get title(){return d(`nav.batches`)},get summary(){return d(`summaries.batches`)},get children(){var e=O();return a(e,()=>n().total.toLocaleString()),e}}),null),a(r,t(e,{get when(){return I().length>0},get fallback(){return(()=>{var e=A();return a(e,()=>d(`common.empty`)),e})()},get children(){return[(()=>{var e=k(),n=e.firstChild.firstChild,r=n.firstChild,s=n.nextSibling;return a(r,t(C,{get label(){return d(`table.bid`)},sortKey:`bid`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.description`)},sortKey:`description`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.total`)},sortKey:`total`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.pending`)},sortKey:`pending`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.failures`)},sortKey:`failures`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.progress`)},sortKey:`progress`,get sort(){return L()},onSort:R}),null),a(r,t(C,{get label(){return d(`table.created`)},sortKey:`created`,get sort(){return L()},onSort:R}),null),a(s,t(i,{get each(){return I()},children:e=>{let n=e.total-e.pending,r=e.total>0?n/e.total*100:0;return(()=>{var n=j(),i=n.firstChild,s=i.nextSibling,c=s.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,p=d.firstChild.firstChild,g=p.firstChild,b=p.nextSibling,x=b.firstChild,S=d.nextSibling;return a(i,t(_,{get href(){return`/batches/${e.bid}`},get title(){return e.bid},get children(){return y(e.bid,14)}})),a(s,()=>y(e.description??`—`,40)),a(c,()=>e.total.toLocaleString()),a(l,()=>e.pending.toLocaleString()),a(u,()=>e.failures.toLocaleString()),m(g,`width`,`${r}%`),a(b,()=>Math.round(r),x),a(S,(()=>{var t=f(()=>!!e.created_at);return()=>t()?v(e.created_at):`—`})()),h(t=>{var n=e.description??``,r=e.pending>0?`var(--warning)`:`var(--success)`,i=e.failures>0?`var(--danger)`:void 0,a=e.failures>0?`var(--danger)`:`var(--success)`;return n!==t.e&&o(s,`title`,t.e=n),r!==t.t&&m(l,`color`,t.t=r),i!==t.a&&m(u,`color`,t.a=i),a!==t.o&&m(g,`background`,t.o=a),t},{e:void 0,t:void 0,a:void 0,o:void 0}),n})()}})),e})(),t(x,{get page(){return p()},get total(){return n().total},count:M,onChange:P})]}}),null),r})()})]}})}export{P as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,C as t,F as n,J as r,M as i,O as a,V as o,_ as s,b as c,c as l,d as u,f as d,g as f,k as p,p as m,r as h,s as g,v as _,w as v,x as y,z as b}from"./Skeleton-DzR7XNxz.js";import{a as x,r as S,t as C}from"./index-D_lSDwKw.js";import{a as w,i as T,n as ee,o as E,r as D,t as O}from"./utils-DDJC7tJV.js";import{t as k}from"./PageHeader-C44KNMGm.js";import{t as A}from"./Modal-CN3rdKA_.js";import{t as j}from"./ArgsValue-D74zX0MI.js";var M=v(`<code style=font-size:12px>`),N=v(`<span class="badge badge-accent">`),P=v(`<span>`),F=v(`<div class=table-wrapper><table><thead><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody>`),I=v(`<div><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));gap:0.75rem;margin-bottom:1rem"></div><div style=margin-bottom:0.25rem></div><div style=display:flex;flex-wrap:wrap;gap:0.25rem;margin-bottom:1rem></div><h3 class=section-title style=margin-bottom:0.5rem> <span class="badge badge-muted">`),L=v(`<div><div></div><div style=font-size:14px>`),R=v(`<span class="badge badge-muted">`),z=v(`<div class=empty-state style=padding:1rem>`),B=v(`<tr><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td><span class="badge badge-muted"></span></td><td></td><td>`),V=v(`<span class="badge badge-muted"><i class="fa-solid fa-microchip"style=margin-right:0.35rem>`),te=v(`<span class="badge badge-muted"><i class="fa-solid fa-memory"style=margin-right:0.35rem>`),H=v(`<div style=display:flex;flex-wrap:wrap;align-items:center;gap:0.75rem;margin-bottom:0.75rem><span style=font-weight:600;font-size:15px><i class="fa-solid fa-server"style=color:var(--text-muted);margin-right:0.5rem></i></span><span class="badge badge-muted"> </span><span class="badge badge-muted"style=font-variant-numeric:tabular-nums> <!> / `),U=v(`<div>`),W=v(`<div class=empty-state style=color:var(--danger)>`),G=v(`<button class="btn btn-sm btn-ghost">`),K=v(`<button class="btn btn-sm btn-ghost btn-danger">`),q=v(`<div style=display:flex;align-items:center;gap:0.6rem><span class="badge badge-muted"> `),J=v(`<div class=empty-state>`),Y=v(`<section style=margin-bottom:1.5rem><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(min(100%, 320px), 1fr));gap:1rem">`),X=v(`<span class=live-dot title="Heartbeat OK">`),Z=v(`<span class="badge badge-accent"><i class="fa-solid fa-crown"style=margin-right:0.3rem>`),ne=v(`<span class="badge badge-warning">Quiet`),Q=v(`<span class="badge badge-muted">embedded`),re=v(`<div style=display:flex;gap:0.4rem;margin-top:0.85rem><button class="btn btn-sm"></button><button class="btn btn-sm btn-danger">`),ie=v(`<div class="card row-clickable"><div style=display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:0.75rem><div><div style=font-weight:600;font-size:15px>PID </div><div style=color:var(--text-muted);font-size:12px></div></div><div style=display:flex;gap:0.375rem></div></div><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:0.5rem;margin-bottom:0.75rem"><div><div> / </div><div style=font-weight:600;font-size:18px;font-variant-numeric:tabular-nums> / </div></div><div><div></div><div style=font-size:13px></div></div><div><div></div><div style=font-size:13px></div></div></div><div class=progress-bar-track style=margin-bottom:0.75rem><div class=progress-bar-fill></div></div><div><div style=margin-bottom:0.25rem></div><div style=display:flex;flex-wrap:wrap;gap:0.25rem>`);function ae(e){let t=new Map;for(let n of e){let e=t.get(n.hostname);e||(e={hostname:n.hostname,processes:[],busy:0,concurrency:0,rssKb:0},t.set(n.hostname,e)),e.processes.push(n),e.busy+=n.busy,e.concurrency+=n.concurrency,e.rssKb+=n.rss??0,e.cpuModel??=n.cpu_model??void 0,e.cores??=n.cores,e.memoryTotalKb??=n.memory_total_kb}return[...t.values()].sort((e,t)=>e.hostname.localeCompare(t.hostname))}function oe(e){return e>90?`var(--danger)`:e>70?`var(--warning)`:`var(--accent)`}var $={"font-size":`11px`,color:`var(--text-muted)`,"text-transform":`uppercase`,"letter-spacing":`0.04em`};function se(r){let i=d(()=>({queryKey:[`workers`],queryFn:()=>fetch(`${l()}/api/workers`).then(e=>e.json()),refetchInterval:5e3})),o=()=>(i.data??[]).filter(e=>e.process_id===r.proc.identity),u=()=>[[g(`busy.identity`),(()=>{var e=M();return s(e,()=>r.proc.identity),e})()],[g(`busy.leader`),r.proc.leader?(()=>{var e=N();return s(e,()=>g(`busy.leader`)),e})():`—`],[`PID`,r.proc.pid],[g(`busy.started`),r.proc.started_at?(()=>{var e=P();return s(e,()=>w(r.proc.started_at)),b(()=>c(e,`title`,T(r.proc.started_at))),e})():`—`],[g(`busy.heartbeat`),(()=>{var e=P();return s(e,()=>w(r.proc.beat)),b(()=>c(e,`title`,T(r.proc.beat))),e})()],[`${g(`table.busy`)} / ${g(`table.concurrency`)}`,`${r.proc.busy} / ${r.proc.concurrency}`],[g(`busy.rss`),D(r.proc.rss??0)],[g(`busy.rtt`),r.proc.rtt_us?`${(r.proc.rtt_us/1e3).toFixed(1)} ${g(`common.ms`)}`:`—`],[g(`busy.version`),r.proc.version??`—`],[g(`busy.tag`),r.proc.tag||`—`],[g(`busy.labels`),r.proc.labels?.length?r.proc.labels.join(`, `):`—`]];return(()=>{var i=I(),l=i.firstChild,d=l.nextSibling,f=d.nextSibling,p=f.nextSibling,m=p.firstChild,h=m.nextSibling;return s(l,n(a,{get each(){return u()},children:([e,n])=>(()=>{var r=L(),i=r.firstChild,a=i.nextSibling;return s(i,e),s(a,n),b(e=>t(i,$,e)),r})()})),s(d,()=>g(`table.queues`)),s(f,n(a,{get each(){return r.proc.queues},children:e=>(()=>{var t=R();return s(t,e),t})()})),s(p,()=>g(`busy.running_jobs`),m),s(h,()=>o().length),s(i,n(e,{get when(){return o().length>0},get fallback(){return(()=>{var e=z();return s(e,()=>g(`busy.no_running`)),e})()},get children(){var e=F(),t=e.firstChild.firstChild,r=t.firstChild.firstChild,i=r.nextSibling,l=i.nextSibling,u=l.nextSibling,d=u.nextSibling,f=t.nextSibling;return s(r,()=>g(`table.jid`)),s(i,()=>g(`table.class`)),s(l,()=>g(`table.queue`)),s(u,()=>g(`table.args`)),s(d,()=>g(`busy.running_since`)),s(f,n(a,{get each(){return o()},children:e=>(()=>{var t=B(),r=t.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.firstChild,l=a.nextSibling,u=l.nextSibling;return s(r,()=>E(e.jid,12)),s(i,()=>e.klass),s(o,()=>e.queue),s(l,n(j,{get str(){return O(e.args)},max:40})),s(u,()=>w(e.run_at)),b(t=>{var n=e.jid,i=T(e.run_at);return n!==t.e&&c(r,`title`,t.e=n),i!==t.t&&c(u,`title`,t.t=i),t},{e:void 0,t:void 0}),t})()})),e}}),null),b(e=>t(d,{...$},e)),i})()}function ce(t){let r=()=>t.group.memoryTotalKb?Math.min(100,t.group.rssKb/t.group.memoryTotalKb*100):null;return(()=>{var i=H(),a=i.firstChild;a.firstChild;var o=a.nextSibling,l=o.firstChild,u=o.nextSibling,d=u.firstChild,f=d.nextSibling;return f.nextSibling,s(a,()=>t.group.hostname,null),s(o,()=>t.group.processes.length,l),s(o,()=>g(`dashboard.processes`).toLowerCase(),null),s(i,n(e,{get when(){return t.group.cpuModel},get children(){var e=V();return e.firstChild,s(e,()=>E(t.group.cpuModel,40),null),b(()=>c(e,`title`,t.group.cpuModel??void 0)),e}}),u),s(i,n(e,{get when(){return _(()=>t.group.cores!=null)()&&t.group.cores>0},get children(){var e=R();return s(e,()=>g(`busy.cores`,{n:t.group.cores})),e}}),u),s(i,n(e,{get when(){return t.group.rssKb>0},get children(){var e=te();return e.firstChild,s(e,()=>D(t.group.rssKb),null),s(e,(()=>{var e=_(()=>!!t.group.memoryTotalKb);return()=>e()?` / ${D(t.group.memoryTotalKb)}`:``})(),null),b(()=>c(e,`title`,r()==null?void 0:`${r().toFixed(1)}% ${g(`busy.of_total_ram`)}`)),e}}),u),s(u,()=>g(`table.busy`),d),s(u,()=>t.group.busy,f),s(u,()=>t.group.concurrency,null),i})()}function le(){let f=x(),v=()=>f.data?.read_only??!1,T=m(),[E,O]=o(null);r(()=>{document.title=`${g(`nav.busy`)} — Wurk`});let j=d(()=>({queryKey:[`processes`],queryFn:()=>fetch(`${l()}/api/processes`).then(e=>e.json()),refetchInterval:5e3})),M=u(()=>({mutationFn:e=>S(`${l()}/api/busy/${e.signal}`,{identity:e.scope===`all`?`all`:e.identity}),onSuccess:()=>T.invalidateQueries({queryKey:[`processes`]}),onError:C})),N=e=>window.confirm(g(`actions.confirm`,{action:g(`actions.stop`),scope:e})),P=()=>(j.data??[]).some(e=>!e.embedded),F=()=>ae(j.data??[]),I=()=>(j.data??[]).find(e=>e.identity===E())??null;return n(i,{get children(){return[n(p,{get when(){return j.isPending},get children(){var e=U();return s(e,n(k,{icon:`fa-gears`,get title(){return g(`nav.busy`)},get summary(){return g(`summaries.busy`)}}),null),s(e,n(h,{count:6}),null),e}}),n(p,{get when(){return j.isError||!j.data},get children(){var e=W();return s(e,()=>g(`common.error`)),e}}),n(p,{get when(){return j.data},children:r=>(()=>{var i=U();return s(i,n(k,{icon:`fa-gears`,get title(){return g(`nav.busy`)},get summary(){return g(`summaries.busy`)},get children(){var t=q(),i=t.firstChild,a=i.firstChild;return s(i,()=>r().length,a),s(i,()=>g(`dashboard.processes`).toLowerCase(),null),s(t,n(e,{get when(){return F().length>1},get children(){var e=R();return s(e,()=>g(`busy.hosts`,{n:F().length})),e}}),null),s(t,n(e,{get when(){return _(()=>!v())()&&P()},get children(){return[(()=>{var e=G();return e.$$click=()=>M.mutate({signal:`quiet`,scope:`all`}),s(e,()=>`${g(`actions.quiet`)} ${g(`actions.all_suffix`)}`),b(()=>e.disabled=M.isPending),e})(),(()=>{var e=K();return e.$$click=()=>N(g(`actions.scope_all_processes`))&&M.mutate({signal:`stop`,scope:`all`}),s(e,()=>`${g(`actions.stop`)} ${g(`actions.all_suffix`)}`),b(()=>e.disabled=M.isPending),e})()]}}),null),t}}),null),s(i,n(e,{get when(){return r().length>0},get fallback(){return(()=>{var e=J();return s(e,()=>g(`common.empty`)),e})()},get children(){return n(a,{get each(){return F()},children:r=>(()=>{var i=Y(),o=i.firstChild;return s(i,n(ce,{group:r}),o),s(o,n(a,{get each(){return r.processes},children:r=>{let i=r.concurrency>0?r.busy/r.concurrency*100:0,o=Date.now()/1e3-r.beat<30;return(()=>{var l=ie(),u=l.firstChild,d=u.firstChild,f=d.firstChild;f.firstChild;var p=f.nextSibling,m=d.nextSibling,h=u.nextSibling,x=h.firstChild,S=x.firstChild,C=S.firstChild,T=S.nextSibling,E=T.firstChild,k=x.nextSibling,A=k.firstChild,j=A.nextSibling,P=k.nextSibling.firstChild,F=P.nextSibling,I=h.nextSibling,L=I.firstChild,z=I.nextSibling.firstChild,B=z.nextSibling;return l.$$click=()=>r.identity&&O(r.identity),s(f,()=>r.pid,null),s(p,()=>r.tag||r.hostname,null),s(p,(()=>{var e=_(()=>!!r.started_at);return()=>e()?` · ${g(`busy.up_for`)} ${ee(Date.now()/1e3-r.started_at)}`:``})(),null),s(m,n(e,{when:o,get children(){return X()}}),null),s(m,n(e,{get when(){return r.leader},get children(){var e=Z();return e.firstChild,s(e,()=>g(`busy.leader`),null),b(()=>c(e,`title`,g(`busy.leader_title`))),e}}),null),s(m,n(e,{get when(){return r.quiet},get children(){return ne()}}),null),s(m,n(e,{get when(){return r.embedded},get children(){return Q()}}),null),s(S,()=>g(`table.busy`),C),s(S,()=>g(`table.concurrency`),null),s(T,()=>r.busy,E),s(T,()=>r.concurrency,null),s(A,()=>g(`busy.heartbeat`)),y(j,`color`,o?`var(--success)`:`var(--danger)`),s(j,()=>w(r.beat)),s(P,()=>g(`busy.rss`)),s(F,()=>D(r.rss??0)),y(L,`width`,`${i}%`),s(z,()=>g(`table.queues`)),s(B,n(a,{get each(){return r.queues},children:e=>(()=>{var t=R();return s(t,e),t})()})),s(l,n(e,{get when(){return _(()=>!v())()&&!r.embedded},get children(){var e=re(),t=e.firstChild,n=t.nextSibling;return e.$$click=e=>e.stopPropagation(),t.$$click=()=>M.mutate({signal:`quiet`,scope:`one`,identity:r.identity}),s(t,()=>g(`actions.quiet`)),n.$$click=()=>N(g(`actions.scope_this_process`))&&M.mutate({signal:`stop`,scope:`one`,identity:r.identity}),s(n,()=>g(`actions.stop`)),b(e=>{var r=M.isPending,i=M.isPending;return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e}}),null),b(e=>{var n=$,r=$,a=$,o=oe(i),s={...$};return e.e=t(S,n,e.e),e.t=t(A,r,e.t),e.a=t(P,a,e.a),o!==e.o&&y(L,`background`,e.o=o),e.i=t(z,s,e.i),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),l})()}})),i})()})}}),null),s(i,n(A,{get open(){return I()!==null},onClose:()=>O(null),get title(){return _(()=>!!I())()?`${I().hostname} · PID ${I().pid}`:``},width:780,get children(){return n(e,{get when(){return I()},children:e=>n(se,{get proc(){return e()}})})}}),null),i})()})]}})}f([`click`]);export{le as default};
|
|
1
|
+
import{A as e,C as t,F as n,J as r,M as i,O as a,V as o,_ as s,b as c,c as l,d as u,f as d,g as f,k as p,p as m,r as h,s as g,v as _,w as v,x as y,z as b}from"./Skeleton-bC7HfQ9r.js";import{a as x,r as S,t as C}from"./index-B1N8hQUh.js";import{a as w,i as T,n as ee,o as E,r as D,t as O}from"./utils-DDJC7tJV.js";import{t as k}from"./PageHeader-fPrCcp_-.js";import{t as A}from"./Modal-B86q6ruL.js";import{t as j}from"./ArgsValue-CcR2ya6e.js";var M=v(`<code style=font-size:12px>`),N=v(`<span class="badge badge-accent">`),P=v(`<span>`),F=v(`<div class=table-wrapper><table><thead><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody>`),I=v(`<div><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));gap:0.75rem;margin-bottom:1rem"></div><div style=margin-bottom:0.25rem></div><div style=display:flex;flex-wrap:wrap;gap:0.25rem;margin-bottom:1rem></div><h3 class=section-title style=margin-bottom:0.5rem> <span class="badge badge-muted">`),L=v(`<div><div></div><div style=font-size:14px>`),R=v(`<span class="badge badge-muted">`),z=v(`<div class=empty-state style=padding:1rem>`),B=v(`<tr><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td><span class="badge badge-muted"></span></td><td></td><td>`),V=v(`<span class="badge badge-muted"><i class="fa-solid fa-microchip"style=margin-right:0.35rem>`),te=v(`<span class="badge badge-muted"><i class="fa-solid fa-memory"style=margin-right:0.35rem>`),H=v(`<div style=display:flex;flex-wrap:wrap;align-items:center;gap:0.75rem;margin-bottom:0.75rem><span style=font-weight:600;font-size:15px><i class="fa-solid fa-server"style=color:var(--text-muted);margin-right:0.5rem></i></span><span class="badge badge-muted"> </span><span class="badge badge-muted"style=font-variant-numeric:tabular-nums> <!> / `),U=v(`<div>`),W=v(`<div class=empty-state style=color:var(--danger)>`),G=v(`<button class="btn btn-sm btn-ghost">`),K=v(`<button class="btn btn-sm btn-ghost btn-danger">`),q=v(`<div style=display:flex;align-items:center;gap:0.6rem><span class="badge badge-muted"> `),J=v(`<div class=empty-state>`),Y=v(`<section style=margin-bottom:1.5rem><div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(min(100%, 320px), 1fr));gap:1rem">`),X=v(`<span class=live-dot title="Heartbeat OK">`),Z=v(`<span class="badge badge-accent"><i class="fa-solid fa-crown"style=margin-right:0.3rem>`),ne=v(`<span class="badge badge-warning">Quiet`),Q=v(`<span class="badge badge-muted">embedded`),re=v(`<div style=display:flex;gap:0.4rem;margin-top:0.85rem><button class="btn btn-sm"></button><button class="btn btn-sm btn-danger">`),ie=v(`<div class="card row-clickable"><div style=display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:0.75rem><div><div style=font-weight:600;font-size:15px>PID </div><div style=color:var(--text-muted);font-size:12px></div></div><div style=display:flex;gap:0.375rem></div></div><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:0.5rem;margin-bottom:0.75rem"><div><div> / </div><div style=font-weight:600;font-size:18px;font-variant-numeric:tabular-nums> / </div></div><div><div></div><div style=font-size:13px></div></div><div><div></div><div style=font-size:13px></div></div></div><div class=progress-bar-track style=margin-bottom:0.75rem><div class=progress-bar-fill></div></div><div><div style=margin-bottom:0.25rem></div><div style=display:flex;flex-wrap:wrap;gap:0.25rem>`);function ae(e){let t=new Map;for(let n of e){let e=t.get(n.hostname);e||(e={hostname:n.hostname,processes:[],busy:0,concurrency:0,rssKb:0},t.set(n.hostname,e)),e.processes.push(n),e.busy+=n.busy,e.concurrency+=n.concurrency,e.rssKb+=n.rss??0,e.cpuModel??=n.cpu_model??void 0,e.cores??=n.cores,e.memoryTotalKb??=n.memory_total_kb}return[...t.values()].sort((e,t)=>e.hostname.localeCompare(t.hostname))}function oe(e){return e>90?`var(--danger)`:e>70?`var(--warning)`:`var(--accent)`}var $={"font-size":`11px`,color:`var(--text-muted)`,"text-transform":`uppercase`,"letter-spacing":`0.04em`};function se(r){let i=d(()=>({queryKey:[`workers`],queryFn:()=>fetch(`${l()}/api/workers`).then(e=>e.json()),refetchInterval:5e3})),o=()=>(i.data??[]).filter(e=>e.process_id===r.proc.identity),u=()=>[[g(`busy.identity`),(()=>{var e=M();return s(e,()=>r.proc.identity),e})()],[g(`busy.leader`),r.proc.leader?(()=>{var e=N();return s(e,()=>g(`busy.leader`)),e})():`—`],[`PID`,r.proc.pid],[g(`busy.started`),r.proc.started_at?(()=>{var e=P();return s(e,()=>w(r.proc.started_at)),b(()=>c(e,`title`,T(r.proc.started_at))),e})():`—`],[g(`busy.heartbeat`),(()=>{var e=P();return s(e,()=>w(r.proc.beat)),b(()=>c(e,`title`,T(r.proc.beat))),e})()],[`${g(`table.busy`)} / ${g(`table.concurrency`)}`,`${r.proc.busy} / ${r.proc.concurrency}`],[g(`busy.rss`),D(r.proc.rss??0)],[g(`busy.rtt`),r.proc.rtt_us?`${(r.proc.rtt_us/1e3).toFixed(1)} ${g(`common.ms`)}`:`—`],[g(`busy.version`),r.proc.version??`—`],[g(`busy.tag`),r.proc.tag||`—`],[g(`busy.labels`),r.proc.labels?.length?r.proc.labels.join(`, `):`—`]];return(()=>{var i=I(),l=i.firstChild,d=l.nextSibling,f=d.nextSibling,p=f.nextSibling,m=p.firstChild,h=m.nextSibling;return s(l,n(a,{get each(){return u()},children:([e,n])=>(()=>{var r=L(),i=r.firstChild,a=i.nextSibling;return s(i,e),s(a,n),b(e=>t(i,$,e)),r})()})),s(d,()=>g(`table.queues`)),s(f,n(a,{get each(){return r.proc.queues},children:e=>(()=>{var t=R();return s(t,e),t})()})),s(p,()=>g(`busy.running_jobs`),m),s(h,()=>o().length),s(i,n(e,{get when(){return o().length>0},get fallback(){return(()=>{var e=z();return s(e,()=>g(`busy.no_running`)),e})()},get children(){var e=F(),t=e.firstChild.firstChild,r=t.firstChild.firstChild,i=r.nextSibling,l=i.nextSibling,u=l.nextSibling,d=u.nextSibling,f=t.nextSibling;return s(r,()=>g(`table.jid`)),s(i,()=>g(`table.class`)),s(l,()=>g(`table.queue`)),s(u,()=>g(`table.args`)),s(d,()=>g(`busy.running_since`)),s(f,n(a,{get each(){return o()},children:e=>(()=>{var t=B(),r=t.firstChild,i=r.nextSibling,a=i.nextSibling,o=a.firstChild,l=a.nextSibling,u=l.nextSibling;return s(r,()=>E(e.jid,12)),s(i,()=>e.klass),s(o,()=>e.queue),s(l,n(j,{get str(){return O(e.args)},max:40})),s(u,()=>w(e.run_at)),b(t=>{var n=e.jid,i=T(e.run_at);return n!==t.e&&c(r,`title`,t.e=n),i!==t.t&&c(u,`title`,t.t=i),t},{e:void 0,t:void 0}),t})()})),e}}),null),b(e=>t(d,{...$},e)),i})()}function ce(t){let r=()=>t.group.memoryTotalKb?Math.min(100,t.group.rssKb/t.group.memoryTotalKb*100):null;return(()=>{var i=H(),a=i.firstChild;a.firstChild;var o=a.nextSibling,l=o.firstChild,u=o.nextSibling,d=u.firstChild,f=d.nextSibling;return f.nextSibling,s(a,()=>t.group.hostname,null),s(o,()=>t.group.processes.length,l),s(o,()=>g(`dashboard.processes`).toLowerCase(),null),s(i,n(e,{get when(){return t.group.cpuModel},get children(){var e=V();return e.firstChild,s(e,()=>E(t.group.cpuModel,40),null),b(()=>c(e,`title`,t.group.cpuModel??void 0)),e}}),u),s(i,n(e,{get when(){return _(()=>t.group.cores!=null)()&&t.group.cores>0},get children(){var e=R();return s(e,()=>g(`busy.cores`,{n:t.group.cores})),e}}),u),s(i,n(e,{get when(){return t.group.rssKb>0},get children(){var e=te();return e.firstChild,s(e,()=>D(t.group.rssKb),null),s(e,(()=>{var e=_(()=>!!t.group.memoryTotalKb);return()=>e()?` / ${D(t.group.memoryTotalKb)}`:``})(),null),b(()=>c(e,`title`,r()==null?void 0:`${r().toFixed(1)}% ${g(`busy.of_total_ram`)}`)),e}}),u),s(u,()=>g(`table.busy`),d),s(u,()=>t.group.busy,f),s(u,()=>t.group.concurrency,null),i})()}function le(){let f=x(),v=()=>f.data?.read_only??!1,T=m(),[E,O]=o(null);r(()=>{document.title=`${g(`nav.busy`)} — Wurk`});let j=d(()=>({queryKey:[`processes`],queryFn:()=>fetch(`${l()}/api/processes`).then(e=>e.json()),refetchInterval:5e3})),M=u(()=>({mutationFn:e=>S(`${l()}/api/busy/${e.signal}`,{identity:e.scope===`all`?`all`:e.identity}),onSuccess:()=>T.invalidateQueries({queryKey:[`processes`]}),onError:C})),N=e=>window.confirm(g(`actions.confirm`,{action:g(`actions.stop`),scope:e})),P=()=>(j.data??[]).some(e=>!e.embedded),F=()=>ae(j.data??[]),I=()=>(j.data??[]).find(e=>e.identity===E())??null;return n(i,{get children(){return[n(p,{get when(){return j.isPending},get children(){var e=U();return s(e,n(k,{icon:`fa-gears`,get title(){return g(`nav.busy`)},get summary(){return g(`summaries.busy`)}}),null),s(e,n(h,{count:6}),null),e}}),n(p,{get when(){return j.isError||!j.data},get children(){var e=W();return s(e,()=>g(`common.error`)),e}}),n(p,{get when(){return j.data},children:r=>(()=>{var i=U();return s(i,n(k,{icon:`fa-gears`,get title(){return g(`nav.busy`)},get summary(){return g(`summaries.busy`)},get children(){var t=q(),i=t.firstChild,a=i.firstChild;return s(i,()=>r().length,a),s(i,()=>g(`dashboard.processes`).toLowerCase(),null),s(t,n(e,{get when(){return F().length>1},get children(){var e=R();return s(e,()=>g(`busy.hosts`,{n:F().length})),e}}),null),s(t,n(e,{get when(){return _(()=>!v())()&&P()},get children(){return[(()=>{var e=G();return e.$$click=()=>M.mutate({signal:`quiet`,scope:`all`}),s(e,()=>`${g(`actions.quiet`)} ${g(`actions.all_suffix`)}`),b(()=>e.disabled=M.isPending),e})(),(()=>{var e=K();return e.$$click=()=>N(g(`actions.scope_all_processes`))&&M.mutate({signal:`stop`,scope:`all`}),s(e,()=>`${g(`actions.stop`)} ${g(`actions.all_suffix`)}`),b(()=>e.disabled=M.isPending),e})()]}}),null),t}}),null),s(i,n(e,{get when(){return r().length>0},get fallback(){return(()=>{var e=J();return s(e,()=>g(`common.empty`)),e})()},get children(){return n(a,{get each(){return F()},children:r=>(()=>{var i=Y(),o=i.firstChild;return s(i,n(ce,{group:r}),o),s(o,n(a,{get each(){return r.processes},children:r=>{let i=r.concurrency>0?r.busy/r.concurrency*100:0,o=Date.now()/1e3-r.beat<30;return(()=>{var l=ie(),u=l.firstChild,d=u.firstChild,f=d.firstChild;f.firstChild;var p=f.nextSibling,m=d.nextSibling,h=u.nextSibling,x=h.firstChild,S=x.firstChild,C=S.firstChild,T=S.nextSibling,E=T.firstChild,k=x.nextSibling,A=k.firstChild,j=A.nextSibling,P=k.nextSibling.firstChild,F=P.nextSibling,I=h.nextSibling,L=I.firstChild,z=I.nextSibling.firstChild,B=z.nextSibling;return l.$$click=()=>r.identity&&O(r.identity),s(f,()=>r.pid,null),s(p,()=>r.tag||r.hostname,null),s(p,(()=>{var e=_(()=>!!r.started_at);return()=>e()?` · ${g(`busy.up_for`)} ${ee(Date.now()/1e3-r.started_at)}`:``})(),null),s(m,n(e,{when:o,get children(){return X()}}),null),s(m,n(e,{get when(){return r.leader},get children(){var e=Z();return e.firstChild,s(e,()=>g(`busy.leader`),null),b(()=>c(e,`title`,g(`busy.leader_title`))),e}}),null),s(m,n(e,{get when(){return r.quiet},get children(){return ne()}}),null),s(m,n(e,{get when(){return r.embedded},get children(){return Q()}}),null),s(S,()=>g(`table.busy`),C),s(S,()=>g(`table.concurrency`),null),s(T,()=>r.busy,E),s(T,()=>r.concurrency,null),s(A,()=>g(`busy.heartbeat`)),y(j,`color`,o?`var(--success)`:`var(--danger)`),s(j,()=>w(r.beat)),s(P,()=>g(`busy.rss`)),s(F,()=>D(r.rss??0)),y(L,`width`,`${i}%`),s(z,()=>g(`table.queues`)),s(B,n(a,{get each(){return r.queues},children:e=>(()=>{var t=R();return s(t,e),t})()})),s(l,n(e,{get when(){return _(()=>!v())()&&!r.embedded},get children(){var e=re(),t=e.firstChild,n=t.nextSibling;return e.$$click=e=>e.stopPropagation(),t.$$click=()=>M.mutate({signal:`quiet`,scope:`one`,identity:r.identity}),s(t,()=>g(`actions.quiet`)),n.$$click=()=>N(g(`actions.scope_this_process`))&&M.mutate({signal:`stop`,scope:`one`,identity:r.identity}),s(n,()=>g(`actions.stop`)),b(e=>{var r=M.isPending,i=M.isPending;return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e}}),null),b(e=>{var n=$,r=$,a=$,o=oe(i),s={...$};return e.e=t(S,n,e.e),e.t=t(A,r,e.t),e.a=t(P,a,e.a),o!==e.o&&y(L,`background`,e.o=o),e.i=t(z,s,e.i),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),l})()}})),i})()})}}),null),s(i,n(A,{get open(){return I()!==null},onClose:()=>O(null),get title(){return _(()=>!!I())()?`${I().hostname} · PID ${I().pid}`:``},width:780,get children(){return n(e,{get when(){return I()},children:e=>n(se,{get proc(){return e()}})})}}),null),i})()})]}})}f([`click`]);export{le as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,d as l,f as u,g as d,i as f,k as p,p as m,s as h,v as g,w as _,x as v,z as y}from"./Skeleton-
|
|
1
|
+
import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,d as l,f as u,g as d,i as f,k as p,p as m,s as h,v as g,w as _,x as v,z as y}from"./Skeleton-bC7HfQ9r.js";import{a as b,r as x,t as S}from"./index-B1N8hQUh.js";import{a as C,i as w,o as T}from"./utils-DDJC7tJV.js";import{n as E,t as D}from"./useSort-DvpwuNQE.js";import{t as O}from"./PageHeader-fPrCcp_-.js";import{t as k}from"./Modal-B86q6ruL.js";var A=_(`<div>`),j=_(`<div class=empty-state style=color:var(--danger)>`),M=_(`<span class="badge badge-muted">`),N=_(`<th>`),P=_(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),F=_(`<div class=empty-state>`),I=_(`<td><div style=display:flex;gap:0.4rem><button class="btn btn-sm"></button><button class="btn btn-sm">`),L=_(`<tr class=row-clickable><td style=font-family:monospace;font-size:12px></td><td></td><td></td><td style=color:var(--text-muted)></td><td></td><td>`),R=_(`<span class="badge badge-success">`),z=_(`<div class=table-wrapper><table><thead><tr><th></th><th></th></tr></thead><tbody>`),B=_(`<tr><td style=color:var(--text-muted)></td><td style=font-family:monospace;font-size:12px>`),V={schedule:e=>e.schedule,klass:e=>e.klass,queue:e=>e.queue,last_fire:e=>e.last_fire_at,next_fire:e=>e.next_fire_at,status:e=>e.paused?`paused`:`active`};function H(){let d=m(),_=b(),H=()=>_.data?.read_only??!1,[U,W]=a(null);n(()=>{document.title=`${h(`nav.cron`)} — Wurk`});let G=u(()=>({queryKey:[`cron`],queryFn:()=>fetch(`${c()}/api/cron`).then(e=>e.json()),refetchInterval:15e3})),K=(e,t)=>x(`${c()}/api/cron/${e}/${t}`),q=l(()=>({mutationFn:({lid:e,paused:t})=>K(e,t?`unpause`:`pause`),onSuccess:()=>d.invalidateQueries({queryKey:[`cron`]}),onError:S})),J=l(()=>({mutationFn:e=>K(e,`enqueue`),onSuccess:()=>d.invalidateQueries({queryKey:[`cron`]}),onError:S})),Y=u(()=>({queryKey:[`cron-history`,U()?.lid],queryFn:()=>fetch(`${c()}/api/cron/${U().lid}/history`).then(e=>e.json()).then(e=>e.history),enabled:U()!==null})),{sorted:X,sort:Z,toggle:Q}=D(()=>G.data??[],V);return t(r,{get children(){return[t(p,{get when(){return G.isPending},get children(){var e=A();return o(e,t(O,{icon:`fa-stopwatch`,get title(){return h(`nav.cron`)},get summary(){return h(`summaries.cron`)}}),null),o(e,t(f,{rows:8,get cols(){return H()?6:7}}),null),e}}),t(p,{get when(){return G.isError||!G.data},get children(){var e=j();return o(e,()=>h(`common.error`)),e}}),t(p,{get when(){return G.data},children:n=>(()=>{var a=A();return o(a,t(O,{icon:`fa-stopwatch`,get title(){return h(`nav.cron`)},get summary(){return h(`summaries.cron`)},get children(){var e=M();return o(e,()=>n().length),e}}),null),o(a,t(e,{get when(){return n().length>0},get fallback(){return(()=>{var e=F();return o(e,()=>h(`common.empty`)),e})()},get children(){var n=P(),r=n.firstChild.firstChild,a=r.firstChild,c=r.nextSibling;return o(a,t(E,{get label(){return h(`table.schedule`)},sortKey:`schedule`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`table.class`)},sortKey:`klass`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`table.queue`)},sortKey:`queue`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`cron.last_fire`)},sortKey:`last_fire`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`cron.next_fire`)},sortKey:`next_fire`,get sort(){return Z()},onSort:Q}),null),o(a,t(E,{get label(){return h(`table.status`)},sortKey:`status`,get sort(){return Z()},onSort:Q}),null),o(a,t(e,{get when(){return!H()},get children(){return N()}}),null),o(c,t(i,{get each(){return X()},children:n=>(()=>{var r=L(),i=r.firstChild,a=i.nextSibling,c=a.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling;return r.$$click=()=>W(n),o(i,()=>n.schedule),o(a,()=>T(n.klass,32)),o(c,()=>n.queue),o(l,(()=>{var e=g(()=>!!n.last_fire_at);return()=>e()?C(n.last_fire_at):`—`})()),o(u,(()=>{var e=g(()=>!!n.paused);return()=>e()?`—`:g(()=>!!n.next_fire_at)()?C(n.next_fire_at):`—`})()),o(d,t(e,{get when(){return n.paused},get fallback(){return(()=>{var e=R();return o(e,()=>h(`dashboard.active`)),e})()},get children(){var e=M();return o(e,()=>h(`dashboard.paused`)),e}})),o(r,t(e,{get when(){return!H()},get children(){var e=I(),t=e.firstChild.firstChild,r=t.nextSibling;return e.$$click=e=>e.stopPropagation(),t.$$click=()=>q.mutate({lid:n.lid,paused:n.paused}),o(t,(()=>{var e=g(()=>!!n.paused);return()=>e()?h(`actions.unpause`):h(`actions.pause`)})()),r.$$click=()=>J.mutate(n.lid),o(r,()=>h(`actions.enqueue`)),y(e=>{var n=q.isPending,i=J.isPending;return n!==e.e&&(t.disabled=e.e=n),i!==e.t&&(r.disabled=e.t=i),e},{e:void 0,t:void 0}),e}}),null),y(e=>{var t=n.tz??void 0,r=n.klass,o=n.paused?`var(--text-muted)`:`var(--accent)`;return t!==e.e&&s(i,`title`,e.e=t),r!==e.t&&s(a,`title`,e.t=r),o!==e.a&&v(u,`color`,e.a=o),e},{e:void 0,t:void 0,a:void 0}),r})()})),n}}),null),o(a,t(k,{get open(){return U()!==null},onClose:()=>W(null),get title(){return g(()=>!!U())()?`${h(`cron.history_title`)} — ${T(U().klass,40)}`:h(`cron.history_title`)},get children(){return t(r,{get children(){return[t(p,{get when(){return Y.isPending},get children(){return t(f,{rows:6,cols:2})}}),t(p,{get when(){return Y.isError},get children(){var e=j();return o(e,()=>h(`common.error`)),e}}),t(p,{get when(){return!Y.data||Y.data.length===0},get children(){var e=F();return o(e,()=>h(`cron.no_history`)),e}}),t(p,{get when(){return Y.data},children:e=>(()=>{var n=z(),r=n.firstChild.firstChild,a=r.firstChild.firstChild,c=a.nextSibling,l=r.nextSibling;return o(a,()=>h(`cron.fired`)),o(c,()=>h(`table.jid`)),o(l,t(i,{get each(){return e()},children:([e,t])=>(()=>{var n=B(),r=n.firstChild,i=r.nextSibling;return o(r,()=>C(e)),o(i,t),y(()=>s(r,`title`,w(e))),n})()})),n})()})]}})}}),null),a})()})]}})}d([`click`]);export{H as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,F as t,J as n,L as r,M as i,O as a,R as o,V as s,_ as c,b as l,c as u,f as d,g as f,h as p,i as m,k as h,n as g,q as _,r as v,s as y,v as b,w as x,z as S}from"./Skeleton-bC7HfQ9r.js";import{i as C,o as w}from"./index-B1N8hQUh.js";import{n as T}from"./utils-DDJC7tJV.js";import{t as E}from"./PageHeader-fPrCcp_-.js";import{r as ee}from"./charts-CLLzJ7vK.js";var D=e=>1-(1-e)**3,O=()=>typeof window<`u`&&window.matchMedia?.(`(prefers-reduced-motion: reduce)`).matches;function k(e,t=700){let[n,i]=s(0),a=0,o=null;return r(()=>{let n=e();if(O()||!Number.isFinite(n)){a=n,i(n);return}let r=a;if(r===n)return;let s=performance.now(),c=e=>{let l=Math.min((e-s)/t,1),u=r+(n-r)*D(l);a=u,i(u),l<1&&(o=requestAnimationFrame(c))};o=requestAnimationFrame(c),_(()=>{o!==null&&cancelAnimationFrame(o)})}),n}function A(e){let t=k(()=>e.value);return b(()=>Math.round(t()).toLocaleString())}var j=x(`<span class=obs-metric__sub>`),M=x(`<span class=obs-metric__sub><span> <!>%</span> `),N=x(`<div class=obs>`),P=x(`<div class=obs><div class=empty-state style=color:var(--danger)>`),F=x(`<div class=obs><div class=empty-state>`),te=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-circle-check obs-metric__icon"aria-hidden=true>`),I=x(`<span class=obs-metric__value>`),L=x(`<i class="fa-solid fa-arrow-right obs-card__go"aria-hidden=true>`),R=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-triangle-exclamation obs-metric__icon"aria-hidden=true>`),z=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-ban obs-metric__icon"aria-hidden=true>`),B=x(`<div class=obs-metric__head><span class=obs-mono></span><i class="fa-solid fa-spinner obs-metric__icon"aria-hidden=true>`),V=x(`<span class=obs-mono>`),H=x(`<span class=obs-stat__value>`),U=x(`<i class="fa-solid fa-arrow-right"aria-hidden=true>`),W=x(`<div class=obs-tablescroll><table><thead><tr><th>Name</th><th></th><th></th><th></th></tr></thead><tbody>`),G=x(`<div class=obs><div class=obs-metrics></div><div class="obs-card obs-panel"><div class=obs-panel__head><div><h2 class=obs-panel__title></h2><p class=obs-panel__sub></p></div><div class=obs-panel__controls><div class=obs-seg role=tablist aria-label="Time range"></div><div class=obs-legend><span><i class="dot dot--processed"></i> </span><span><i class="dot dot--failed"></i> </span></div></div></div><div class=obs-chartbox></div></div><div class=obs-stats></div><div class="obs-card obs-table"><div class=obs-table__head><h2 class=obs-table__title></h2></div></div><div class="obs-card obs-cta"><span class=obs-cta__icon><i class="fa-solid fa-bolt"aria-hidden=true></i></span><h2 class=obs-cta__title></h2><p class=obs-cta__text></p><div class=obs-cta__actions><a class="obs-btn obs-btn--primary"href=https://developerz-ai.github.io/wurk/ target=_blank rel=noreferrer><i class="fa-solid fa-download"aria-hidden=true></i> </a><a class="obs-btn obs-btn--ghost"href=https://github.com/developerz-ai/wurk/wiki target=_blank rel=noreferrer><i class="fa-solid fa-book"aria-hidden=true></i> `),ne=x(`<button role=tab>`),re=x(`<div class=empty-state style=height:320px;display:grid;place-items:center>`),ie=x(`<div class=empty-state>`),ae=x(`<span class="obs-chip obs-chip--paused">`),oe=x(`<tr><td style=font-weight:500;color:var(--obs-text)></td><td></td><td></td><td>`),se=x(`<span class="obs-chip obs-chip--active">`);function K(e,t){if(e.length<2)return null;let n=e[e.length-1].at,r=0,i=0;for(let a of e)a.at>n-3600?r+=a[t]:a.at>n-7200&&(i+=a[t]);return i===0?r===0?null:100:Math.round((r-i)/i*100)}var q=[{key:`1h`,bucket:`1m`,window:`24h`,slice:60,desc_key:`dashboard.range_1h_desc`},{key:`24h`,bucket:`1m`,window:`24h`,desc_key:`dashboard.range_24h_desc`},{key:`7d`,bucket:`5m`,window:`7d`,desc_key:`dashboard.range_7d_desc`},{key:`30d`,bucket:`1h`,window:`30d`,desc_key:`dashboard.range_30d_desc`}],J=(e,t)=>{let n=new Date(e*1e3),r=String(n.getHours()).padStart(2,`0`);return t===`1h`?`${n.getMonth()+1}/${n.getDate()} ${r}:00`:`${r}:${String(n.getMinutes()).padStart(2,`0`)}`};function Y(n){return t(e,{get when(){return n.pct!==null},get fallback(){return(()=>{var e=j();return c(e,()=>y(`dashboard.vs_last_hour`)),e})()},get children(){return(()=>{let e=()=>n.pct>=0,t=()=>e()===n.goodWhenUp;return(()=>{var r=M(),i=r.firstChild,a=i.firstChild,o=a.nextSibling;return o.nextSibling,i.nextSibling,c(i,()=>e()?`▲`:`▼`,a),c(i,()=>e()?`+`:``,o),c(i,()=>n.pct,o),c(r,()=>y(`dashboard.vs_last_hour`),null),S(()=>p(i,t()?`up`:`down`)),r})()})()}})}function X(){let r=C(),[f,_]=s(0),x=()=>q[f()];n(()=>{document.title=`${y(`nav.dashboard`)} — Wurk`});let D=d(()=>({queryKey:[`stats`],queryFn:()=>fetch(`${u()}/api/stats`).then(e=>e.json()),enabled:!r.connected(),refetchInterval:!r.connected()&&5e3})),O=d(()=>({queryKey:[`history`,x().bucket,x().window],queryFn:()=>fetch(`${u()}/api/history/${x().bucket}?window=${x().window}`).then(e=>e.json()),refetchInterval:3e4})),k=()=>r.stats()??D.data??null,M=o(()=>(O.data?.series??[]).map(e=>({...e,label:J(e.at,x().bucket)}))),X=o(()=>{let e=x(),t=`slice`in e?e.slice:void 0;return t?M().slice(-t):M()}),ce=o(()=>X().some(e=>e.processed>0||e.failed>0)),Z=()=>t(E,{icon:`fa-gauge-high`,get title(){return y(`nav.dashboard`)},get summary(){return y(`summaries.dashboard`)}});return t(i,{get children(){return[t(h,{get when(){return b(()=>!!D.isLoading)()&&!k()},get children(){var e=N();return c(e,t(Z,{}),null),c(e,t(v,{count:4}),null),c(e,t(m,{rows:6,cols:4}),null),e}}),t(h,{get when(){return b(()=>!!D.isError)()&&!k()},get children(){var e=P(),n=e.firstChild;return c(e,t(Z,{}),n),c(n,()=>y(`common.error`)),e}}),t(h,{get when(){return!k()},get children(){var e=F(),n=e.firstChild;return c(e,t(Z,{}),n),c(n,()=>y(`common.empty`)),e}}),t(h,{get when(){return k()},children:n=>(()=>{var r=G(),i=r.firstChild,o=i.nextSibling,s=o.firstChild,u=s.firstChild,d=u.firstChild,m=d.nextSibling,h=u.nextSibling.firstChild,v=h.nextSibling.firstChild;v.firstChild.nextSibling;var C=v.nextSibling;C.firstChild.nextSibling;var E=s.nextSibling,D=o.nextSibling,k=D.nextSibling,N=k.firstChild,P=N.firstChild,F=k.nextSibling.firstChild.nextSibling,J=F.nextSibling,Q=J.nextSibling.firstChild;Q.firstChild.nextSibling;var $=Q.nextSibling;return $.firstChild.nextSibling,c(r,t(Z,{}),i),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/metrics`,get children(){return[(()=>{var e=te(),t=e.firstChild;return c(t,()=>y(`dashboard.processed`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().processed}})),e})(),t(Y,{get pct(){return K(M(),`processed`)},goodWhenUp:!0}),L()]}}),null),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/retries`,get children(){return[(()=>{var e=R(),t=e.firstChild;return c(t,()=>y(`dashboard.failed`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().failed}})),e})(),t(Y,{get pct(){return K(M(),`failed`)},goodWhenUp:!1}),L()]}}),null),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/dead`,get children(){return[(()=>{var e=z(),t=e.firstChild;return c(t,()=>y(`dashboard.expired`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().expired}})),e})(),(()=>{var e=j();return c(e,(()=>{var e=b(()=>n().expired===0);return()=>e()?y(`dashboard.stable_threshold`):y(`dashboard.above_threshold`)})()),e})(),L()]}}),null),c(i,t(w,{class:`obs-card obs-metric obs-card--link`,href:`/busy`,get children(){return[(()=>{var e=B(),t=e.firstChild;return c(t,()=>y(`dashboard.busy`)),e})(),(()=>{var e=I();return c(e,t(A,{get value(){return n().busy}})),e})(),(()=>{var e=j();return c(e,(()=>{var e=b(()=>n().busy===0);return()=>e()?y(`dashboard.system_idle`):y(`dashboard.processing`)})()),e})(),L()]}}),null),c(d,()=>y(`dashboard.performance_insight`)),c(m,()=>y(`dashboard.perf_subtitle`,{range:y(x().desc_key)})),c(h,t(a,{each:q,children:(e,t)=>(()=>{var n=ne();return n.$$click=()=>_(t()),c(n,()=>e.key),S(e=>{var r=t()===f(),i=t()===f()?`is-active`:``;return r!==e.e&&l(n,`aria-selected`,e.e=r),i!==e.t&&p(n,e.t=i),e},{e:void 0,t:void 0}),n})()})),c(v,()=>y(`dashboard.processed`),null),c(C,()=>y(`dashboard.failed`),null),c(E,t(e,{get when(){return!O.isPending},get fallback(){return t(g,{height:320})},get children(){return t(e,{get when(){return ce()},get fallback(){return(()=>{var e=re();return c(e,()=>y(`dashboard.no_history`)),e})()},get children(){return t(ee,{get data(){return X()},height:320,xMinTickGap:64,get series(){return[{key:`processed`,name:y(`dashboard.processed`),stroke:`#fafafa`,strokeWidth:2,fill:`gradient`},{key:`failed`,name:y(`dashboard.failed`),stroke:`#a1a1aa`,strokeWidth:1.5,strokeDasharray:`5 4`,fill:`none`}]}})}})}})),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/queues`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.enqueued`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().enqueued}})),e})(),L()]}}),null),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/retries`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.retries`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().retries}})),e})(),L()]}}),null),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/scheduled`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.scheduled`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().scheduled}})),e})(),L()]}}),null),c(D,t(w,{class:`obs-card obs-stat obs-card--link`,href:`/dead`,get children(){return[(()=>{var e=V();return c(e,()=>y(`dashboard.dead`)),e})(),(()=>{var e=H();return c(e,t(A,{get value(){return n().dead}})),e})(),L()]}}),null),c(P,()=>y(`table.queues`)),c(N,t(w,{class:`obs-table__link`,href:`/queues`,get children(){return[`View All `,U()]}}),null),c(k,t(e,{get when(){return n().queues.length>0},get fallback(){return(()=>{var e=ie();return c(e,()=>y(`common.empty`)),e})()},get children(){var r=W(),i=r.firstChild.firstChild,o=i.firstChild.firstChild.nextSibling,s=o.nextSibling,u=s.nextSibling,d=i.nextSibling;return c(o,()=>y(`table.size`)),c(s,()=>y(`table.latency`)),c(u,()=>y(`table.status`)),c(d,t(a,{get each(){return n().queues},children:n=>(()=>{var r=oe(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling,s=o.nextSibling;return c(i,()=>n.name),c(a,t(A,{get value(){return n.size}})),c(o,()=>T(n.latency)),c(s,t(e,{get when(){return n.paused},get fallback(){return(()=>{var e=se();return c(e,()=>y(`dashboard.active`)),e})()},get children(){var e=ae();return c(e,()=>y(`dashboard.paused`)),e}})),S(()=>l(o,`title`,`${n.latency.toFixed(3)}s`)),r})()})),r}}),null),c(F,()=>y(`dashboard.strapline`)),c(J,()=>y(`dashboard.tagline`)),c(Q,()=>y(`dashboard.install`),null),c($,()=>y(`dashboard.docs`),null),r})()})]}})}f([`click`]);export{X as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,f as l,g as u,i as d,k as f,s as p,w as m,z as h}from"./Skeleton-
|
|
1
|
+
import{A as e,F as t,J as n,M as r,O as i,V as a,_ as o,b as s,c,f as l,g as u,i as d,k as f,s as p,w as m,z as h}from"./Skeleton-bC7HfQ9r.js";import{a as ee,n as te}from"./index-B1N8hQUh.js";import{a as g,i as _,o as v,t as y}from"./utils-DDJC7tJV.js";import{n as ne,r as b,t as re}from"./useResetPageOnEmpty-DpBjkf6_.js";import{n as x,t as S}from"./useSort-DvpwuNQE.js";import{t as C}from"./PageHeader-fPrCcp_-.js";import{t as w}from"./ArgsValue-CcR2ya6e.js";import{t as T}from"./JobDetailModal-DSWbT6G0.js";import{a as E,i as D,n as O,r as ie,t as ae}from"./FilterBox-CO3aYWIq.js";var k=m(`<div>`),oe=m(`<div class=empty-state style=color:var(--danger)>`),se=m(`<span class="badge badge-danger">`),ce=m(`<th class=row-action><input type=checkbox>`),A=m(`<div class=table-wrapper><table><thead><tr></tr></thead><tbody>`),j=m(`<div class=empty-state>`),M=m(`<td class=row-action><input type=checkbox>`),N=m(`<tr class=row-clickable><td style=font-family:monospace;font-size:12px;color:var(--text-muted)></td><td style=font-weight:500></td><td></td><td style=color:var(--danger)></td><td></td><td>`),P=25,F={jid:e=>e.jid,klass:e=>e.klass,args:e=>y(e.args),error_class:e=>e.error_class,error_message:e=>e.error_message,failed_at:e=>e.at},I=[{cmd:`retry`,label:p(`actions.retry`)},{cmd:`delete`,label:p(`actions.delete`),danger:!0}];function L(){let[u,m]=ne(),[L,R]=a(``),[z,B]=a(null),[V,H]=a(null),U=ee(),W=()=>U.data?.read_only??!1,G=D(),{single:K,bulk:q,all:J}=ie(`dead`),le=()=>K.isPending||q.isPending||J.isPending;n(()=>{document.title=`${p(`nav.dead`)} — Wurk`});let ue=e=>{R(e),m(1)},Y=l(()=>({queryKey:[`dead`,u(),L()],queryFn:()=>te(`${c()}/api/dead?page=${u()-1}&count=${P}&substr=${encodeURIComponent(L())}`)}));re(u,m,()=>!Y.isPending&&!!Y.data,()=>(Y.data?.entries.length??0)===0);let{sorted:X,sort:Z,toggle:Q}=S(()=>Y.data?.entries??[],F),$=()=>X().map(O),de=()=>$().length>0&&$().every(e=>G.selected().has(e));return t(r,{get children(){return[t(f,{get when(){return Y.isPending},get children(){var e=k();return o(e,t(C,{icon:`fa-skull`,get title(){return p(`nav.dead`)},get summary(){return p(`summaries.dead`)}}),null),o(e,t(d,{rows:8,cols:7}),null),e}}),t(f,{get when(){return Y.isError||!Y.data},get children(){var e=oe();return o(e,()=>p(`common.error`)),e}}),t(f,{get when(){return Y.data},children:n=>(()=>{var r=k();return o(r,t(C,{icon:`fa-skull`,get title(){return p(`nav.dead`)},get summary(){return p(`summaries.dead`)},get children(){var e=se();return o(e,()=>n().total.toLocaleString()),e}}),null),o(r,t(ae,{get value(){return L()},onChange:ue,get placeholder(){return p(`common.filter_placeholder`)}}),null),o(r,t(e,{get when(){return X().length>0},get fallback(){return(()=>{var e=j();return o(e,()=>p(`common.empty`)),e})()},get children(){return[t(e,{get when(){return!W()},get children(){return t(E,{bulk:I,all:I,get selectedCount(){return G.count()},get total(){return n().total},get pending(){return le()},onBulk:e=>q.mutate({keys:[...G.selected()],cmd:e},{onSuccess:G.clear}),onAll:e=>J.mutate(e,{onSuccess:G.clear})})}}),(()=>{var n=A(),r=n.firstChild.firstChild,a=r.firstChild,c=r.nextSibling;return o(a,t(e,{get when(){return!W()},get children(){var e=ce(),t=e.firstChild;return t.addEventListener(`change`,()=>G.toggleAll($())),h(()=>s(t,`aria-label`,p(`table.select_all`))),h(()=>t.checked=de()),e}}),null),o(a,t(x,{get label(){return p(`table.jid`)},sortKey:`jid`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.class`)},sortKey:`klass`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.args`)},sortKey:`args`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.error`)},sortKey:`error_class`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.message`)},sortKey:`error_message`,get sort(){return Z()},onSort:Q}),null),o(a,t(x,{get label(){return p(`table.failed_at`)},sortKey:`failed_at`,get sort(){return Z()},onSort:Q}),null),o(c,t(i,{get each(){return X()},children:n=>{let r=y(n.args),i=O(n);return(()=>{var a=N(),c=a.firstChild,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling,f=d.nextSibling,m=f.nextSibling;return a.$$click=()=>{B(n),H(i)},o(a,t(e,{get when(){return!W()},get children(){var e=M(),t=e.firstChild;return e.$$click=e=>e.stopPropagation(),t.addEventListener(`change`,()=>G.toggle(i)),h(()=>s(t,`aria-label`,p(`table.select_row`))),h(()=>t.checked=G.selected().has(i)),e}}),c),o(c,()=>v(n.jid,12)),o(l,()=>n.klass),o(u,t(w,{str:r,max:40})),o(d,()=>v(n.error_class,25)),o(f,()=>v(n.error_message,40)),o(m,()=>g(n.at)),h(e=>{var t=n.jid,r=n.error_class??``,i=n.error_message??``,a=_(n.at);return t!==e.e&&s(c,`title`,e.e=t),r!==e.t&&s(d,`title`,e.t=r),i!==e.a&&s(f,`title`,e.a=i),a!==e.o&&s(m,`title`,e.o=a),e},{e:void 0,t:void 0,a:void 0,o:void 0}),a})()}})),n})(),t(b,{get page(){return u()},get total(){return n().total},count:P,onChange:m})]}}),null),o(r,t(T,{get entry(){return z()},get atLabel(){return p(`table.failed_at`)},get actions(){return W()?void 0:I},get pending(){return K.isPending},onAction:e=>{let t=V();t&&K.mutate({key:t,cmd:e},{onSuccess:()=>{B(null),H(null)}})},onClose:()=>{B(null),H(null)}}),null),r})()})]}})}u([`click`]);export{L as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,F as t,L as n,V as r,_ as i,b as a,c as o,g as s,i as c,n as l,q as u,s as d,v as f,w as p,z as m}from"./Skeleton-
|
|
1
|
+
import{A as e,F as t,L as n,V as r,_ as i,b as a,c as o,g as s,i as c,n as l,q as u,s as d,v as f,w as p,z as m}from"./Skeleton-bC7HfQ9r.js";import{a as h,s as g}from"./index-B1N8hQUh.js";import{t as _}from"./PageHeader-fPrCcp_-.js";var v=p(`<div class=empty-state style=color:var(--danger)>`),y=p(`<div class=skeleton-stack>`),b=p(`<div class="card ext-view">`),x=p(`<a class="btn btn-sm"target=_blank rel="noopener noreferrer"><i class="fa-solid fa-arrow-up-right-from-square"style=margin-inline-end:0.4rem>`),S=p(`<iframe style="width:100%;height:calc(100vh - 11rem);border:1px solid var(--border);border-radius:var(--radius);background:var(--surface)">`);function C(){let n=g(),r=()=>n.tab??``,i=h(),a=e=>e.replace(/\/+$/,``),o=()=>i.data?.custom_tabs?.find(e=>a(e.path)===a(r())),s=()=>o()?.name??r();return t(e,{get when(){return o()?.ext_name},keyed:!0,get fallback(){return t(T,{get tab(){return r()},get title(){return s()}})},children:e=>t(w,{extName:e,get indexPath(){return r()},get title(){return s()}})})}function w(a){let s=`${o()}/ext/${a.extName}/`,[p,h]=r(null),[g,x]=r(!1),S=0,C,w=async(e,t)=>{let n=++S;C=new AbortController;try{let r=await fetch(s+e,{...t,signal:C.signal}),i=await r.text();if(n!==S)return;x(!r.ok&&r.status!==404),h(i)}catch(e){if(e instanceof DOMException&&e.name===`AbortError`)return;n===S&&x(!0)}};u(()=>C?.abort()),n(()=>{w(a.indexPath.replace(/\/+$/,``))});let T=e=>{let t=e.target.closest(`a`);if(!t?.getAttribute(`href`))return;let n=new URL(t.href,window.location.origin);n.origin!==window.location.origin||!n.pathname.startsWith(s)||(e.preventDefault(),w(n.pathname.slice(s.length)+n.search))},E=e=>{let t=e.target,n=new URL(t.getAttribute(`action`)||window.location.href,window.location.origin);if(n.origin!==window.location.origin||!n.pathname.startsWith(s))return;e.preventDefault();let r=new FormData(t);if((t.method||`get`).toUpperCase()===`GET`){let e=new URLSearchParams(Array.from(r.entries())).toString();w(`${n.pathname.slice(s.length)}${e?`?${e}`:``}`)}else w(n.pathname.slice(s.length)+n.search,{method:`POST`,body:r})};return[t(_,{icon:`fa-puzzle-piece`,get title(){return a.title},get summary(){return d(`extension.summary`)}}),t(e,{get when(){return g()},get children(){var e=v();return i(e,()=>d(`common.error`)),e}}),t(e,{get when(){return f(()=>p()===null)()&&!g()},get children(){var e=y();return i(e,t(l,{height:`1.5rem`,width:`40%`}),null),i(e,t(c,{rows:6,cols:4}),null),e}}),t(e,{get when(){return f(()=>p()!==null)()&&!g()},get children(){var e=b();return e.addEventListener(`submit`,E),e.$$click=T,m(()=>e.innerHTML=p()),e}})]}function T(e){let n=()=>`${o()}/${e.tab}?wurk_ext_embed=1`;return[t(_,{icon:`fa-puzzle-piece`,get title(){return e.title},get summary(){return d(`extension.summary`)},get children(){var t=x();return t.firstChild,i(t,()=>d(`extension.open`),null),m(()=>a(t,`href`,`${o()}/${e.tab}`)),t}}),(()=>{var t=S();return m(r=>{var i=e.title,o=n();return i!==r.e&&a(t,`title`,r.e=i),o!==r.t&&a(t,`src`,r.t=o),r},{e:void 0,t:void 0}),t})()]}s([`click`]);export{C as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as e,L as t,O as n,V as r,_ as i,b as a,c as o,d as s,g as c,h as l,p as u,q as d,s as f,v as p,w as m,z as h}from"./Skeleton-
|
|
1
|
+
import{F as e,L as t,O as n,V as r,_ as i,b as a,c as o,d as s,g as c,h as l,p as u,q as d,s as f,v as p,w as m,z as h}from"./Skeleton-bC7HfQ9r.js";import{r as g,t as _}from"./index-B1N8hQUh.js";var v=m(`<div class=action-bar><div class=action-bar-group><span class=action-bar-count></span></div><div class=action-bar-group>`),y=m(`<button>`);function b(t){let r=(e,t)=>!e.danger||window.confirm(f(`actions.confirm`,{action:e.label,scope:t}));return(()=>{var a=v(),o=a.firstChild,s=o.firstChild,c=o.nextSibling;return i(s,(()=>{var e=p(()=>t.selectedCount>0);return()=>e()?f(`actions.selected`,{n:t.selectedCount}):f(`actions.select_hint`)})()),i(o,e(n,{get each(){return t.bulk},children:e=>(()=>{var n=y();return n.$$click=()=>r(e,f(`actions.scope_selected`,{n:t.selectedCount}))&&t.onBulk(e.cmd),i(n,()=>e.label),h(r=>{var i=`btn btn-sm${e.danger?` btn-danger`:``}`,a=t.pending||t.selectedCount===0;return i!==r.e&&l(n,r.e=i),a!==r.t&&(n.disabled=r.t=a),r},{e:void 0,t:void 0}),n})()}),null),i(c,e(n,{get each(){return t.all},children:e=>(()=>{var n=y();return n.$$click=()=>r(e,f(`actions.scope_all`))&&t.onAll(e.cmd),i(n,()=>`${e.label} ${f(`actions.all_suffix`)}`),h(r=>{var i=`btn btn-sm btn-ghost${e.danger?` btn-danger`:``}`,a=t.pending||t.total===0;return i!==r.e&&l(n,r.e=i),a!==r.t&&(n.disabled=r.t=a),r},{e:void 0,t:void 0}),n})()})),a})()}c([`click`]);function x(){let[e,t]=r(new Set);return{selected:e,toggle:e=>t(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),toggleAll:e=>t(t=>e.length>0&&e.every(e=>t.has(e))?new Set:new Set(e)),clear:()=>t(new Set),count:()=>e().size}}function S(e){return`${e.score}|${e.jid}`}function C(e){let t=u(),n=()=>{t.invalidateQueries({queryKey:[e]}),t.invalidateQueries({queryKey:[`stats`]})};return{single:s(()=>({mutationFn:({key:t,cmd:n})=>g(`${o()}/api/${e}/${encodeURIComponent(t)}`,{cmd:n}),onSuccess:n,onError:_})),bulk:s(()=>({mutationFn:({keys:t,cmd:n})=>g(`${o()}/api/${e}`,{keys:t,cmd:n}),onSuccess:n,onError:_})),all:s(()=>({mutationFn:t=>g(`${o()}/api/${e}/all/${t}`),onSuccess:n,onError:_}))}}var w=m(`<div class=filter-box style=margin-bottom:1rem;display:flex><input class=input type=search style=flex:1;max-width:360px>`),T=250;function E(e){let[n,i]=r(e.value);return t(()=>{let t=n(),r=setTimeout(()=>{t!==e.value&&e.onChange(t)},T);d(()=>clearTimeout(r))}),(()=>{var t=w(),r=t.firstChild;return r.$$input=e=>i(e.currentTarget.value),h(t=>{var n=e.placeholder??f(`common.filter_placeholder`),i=e.placeholder??f(`common.filter_placeholder`);return n!==t.e&&a(r,`placeholder`,t.e=n),i!==t.t&&a(r,`aria-label`,t.t=i),t},{e:void 0,t:void 0}),h(()=>r.value=n()),t})()}c([`input`]);export{b as a,x as i,S as n,C as r,E as t};
|