wurk 1.7.4 → 1.7.6
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 -3
- data/lib/wurk/encryption.rb +7 -1
- data/lib/wurk/swarm.rb +13 -0
- data/lib/wurk/version.rb +1 -1
- data/vendor/assets/dashboard/wurk-manifest.json +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d232f2e0c78233c2bbd71051a07df6e791d1fb1c0d701c9e3ff0820035207077
|
|
4
|
+
data.tar.gz: 06d15b628db2d8ab75ab8440b48f372ea0943108a0c19533db0c2cf82a1b74fe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 522ee07752a14d58635f770411bf7d74d53fca26141f04f73e0f6596e27374ea580b11d405cdcaf297c53aeaca3e08f06e1409b876159fea34cd6c91bbbcbf89
|
|
7
|
+
data.tar.gz: 1ffc5b66a6ce06ee39353e3593296f22ac99f8851000fa1b78fcbfb30ff7617a742804fdf6584a07b9a4b039477b736b26c644e8844c8f420766fb21670fc287
|
data/README.md
CHANGED
|
@@ -130,7 +130,7 @@ Method, per-invocation records, workload definitions, and the separate `rake ben
|
|
|
130
130
|
|
|
131
131
|
## Documentation
|
|
132
132
|
|
|
133
|
-
- **[Website](https://developerz-ai.github.io/wurk/)** · **[Wiki
|
|
133
|
+
- **[Website](https://developerz-ai.github.io/wurk/)** · **[Wiki](https://github.com/developerz-ai/wurk/wiki)** — the pitch, install, and short orientation guides; the complete reference is [`docs/`](https://github.com/developerz-ai/wurk/tree/main/docs), linked from every wiki page.
|
|
134
134
|
- **[API reference (YARD)](https://developerz-ai.github.io/wurk/api/)** — generated docs for the public classes (`Wurk::Worker`, `Wurk::Client`, `Wurk::Configuration`, `Wurk::Batch`, `Wurk::Limiter`, `Wurk::Unique`, and the `Sidekiq::*` aliases). Machine-readable map for AI agents: **[llms.txt](https://developerz-ai.github.io/wurk/llms.txt)**.
|
|
135
135
|
- **[Getting started & architecture](https://github.com/developerz-ai/wurk/blob/main/docs/idea/01-overview.md)** — how the swarm, manager, fetcher, and processor fit together.
|
|
136
136
|
- **[Starting the worker](https://github.com/developerz-ai/wurk/blob/main/docs/running.md)** — Rails auto-start, the `wurk`/`wurkswarm` runners, and running standalone without Rails.
|
|
@@ -278,7 +278,7 @@ Infrastructure this basic should be free software. A Rails app shouldn't need a
|
|
|
278
278
|
What has made that hard is maintenance: someone has to be paid to do it. Sidekiq funds a decade of *human* maintenance through its paid tiers, which is an honest trade. Wurk makes a different one — it is maintained **AI-first**: implementation, parity suite, docs, and benchmarks are written and kept current by AI agents under human review. A fix, a doc update, or a version bump is no longer somebody's week, which is what makes it practical to:
|
|
279
279
|
|
|
280
280
|
- ship the entire Pro + Enterprise surface with no tier, no flag gate, and no license check;
|
|
281
|
-
- keep parity honest mechanically rather than by hand — an independently written parity oracle suite, pinned to a documented Sidekiq revision, plus
|
|
281
|
+
- keep parity honest mechanically rather than by hand — an independently written parity oracle suite, pinned to a documented Sidekiq revision, plus sidekiq-cron's upstream suite running against Wurk on every push ([docs/idea/14-ecosystem-compat.md](https://github.com/developerz-ai/wurk/blob/main/docs/idea/14-ecosystem-compat.md) tracks the rest);
|
|
282
282
|
- keep adding surface Sidekiq doesn't have — the [Wurk extras](#wurk-extras) above landed as one release;
|
|
283
283
|
- hold ourselves to published numbers instead of adjectives — the suite runs against stock Sidekiq every release and ships the results [as measured](docs/benchmarks.md), including the unflattering ones.
|
|
284
284
|
|
|
@@ -297,7 +297,7 @@ Wurk is MIT and stays that way. If what you need is a commercial support contrac
|
|
|
297
297
|
+ gem "wurk"
|
|
298
298
|
```
|
|
299
299
|
|
|
300
|
-
`bundle install && restart`. Wurk reads and writes the same Redis schema, so a rolling deploy can run Sidekiq and Wurk against the same Redis during the cutover.
|
|
300
|
+
`bundle install && restart`. Wurk reads and writes the same Redis schema, so a rolling deploy can run Sidekiq and Wurk against the same Redis during the cutover. sidekiq-cron's upstream suite runs against Wurk in the [`ecosystem` CI job](https://github.com/developerz-ai/wurk/blob/main/.github/workflows/ecosystem.yml) (see [`test/ecosystem/`](https://github.com/developerz-ai/wurk/tree/main/test/ecosystem)). sidekiq-unique-jobs, sidekiq-scheduler, sidekiq-status, sidekiq-failures and sidekiq-throttled are target additions tracked in [docs/idea/14-ecosystem-compat.md](https://github.com/developerz-ai/wurk/blob/main/docs/idea/14-ecosystem-compat.md).
|
|
301
301
|
|
|
302
302
|
Full walkthrough — config side-by-side, the Redis key/`sidekiq_options` mapping, known incompatibilities, and a one-page cutover checklist: **[docs/migrate-from-sidekiq.md](https://github.com/developerz-ai/wurk/blob/main/docs/migrate-from-sidekiq.md)**.
|
|
303
303
|
|
data/lib/wurk/encryption.rb
CHANGED
|
@@ -150,7 +150,13 @@ module Wurk
|
|
|
150
150
|
version = Integer(envelope['v'])
|
|
151
151
|
cipher = build_decrypt_cipher(envelope, key_for(version))
|
|
152
152
|
plain = cipher.update(::Base64.strict_decode64(envelope['ct'])) + cipher.final
|
|
153
|
-
|
|
153
|
+
# No `quirks_mode:` — an encrypted arg may be a bare scalar ("hi", 42,
|
|
154
|
+
# null), and every json the gemspec's `>= 3.2` floor can resolve parses
|
|
155
|
+
# those at the top level by default (RFC 7159, json >= 2.0). The option
|
|
156
|
+
# was therefore already a no-op, and json 3.0.0 removed it outright:
|
|
157
|
+
# passing it raises ArgumentError and every encrypted job dies in the
|
|
158
|
+
# server middleware.
|
|
159
|
+
::JSON.parse(plain)
|
|
154
160
|
end
|
|
155
161
|
|
|
156
162
|
# @return [Boolean] true if `value` looks like a Wurk crypto envelope.
|
data/lib/wurk/swarm.rb
CHANGED
|
@@ -360,7 +360,20 @@ module Wurk
|
|
|
360
360
|
# stall signal delivery if the pipe fills. `exception: false` returns
|
|
361
361
|
# :wait_writable instead of raising when full (drop the coalescible
|
|
362
362
|
# duplicate); a closed pipe during shutdown is ignored too.
|
|
363
|
+
#
|
|
364
|
+
# The owner check is what keeps ONE child's signal from draining the whole
|
|
365
|
+
# fleet. A forked child inherits both this trap and the parent's live pipe,
|
|
366
|
+
# and `fork_child` cannot drop them until `Process.fork` RETURNS — the
|
|
367
|
+
# `_fork` hook chain runs child-side before that, so there is a window
|
|
368
|
+
# where an operator's `kill <child_pid>` writes TERM into the PARENT's
|
|
369
|
+
# supervise loop and drains every sibling. Measured: with that chain slowed
|
|
370
|
+
# the way a loaded box does, TERMing a single child killed the supervisor
|
|
371
|
+
# and all of it. Comparing pids instead closes it with no window at all —
|
|
372
|
+
# the inherited trap is inert in the child from its first instruction,
|
|
373
|
+
# because `@owner_pid` was stamped before the fork.
|
|
363
374
|
def emit_signal(sig)
|
|
375
|
+
return unless owner?
|
|
376
|
+
|
|
364
377
|
@signal_write&.write_nonblock("#{sig}\n", exception: false)
|
|
365
378
|
rescue ::IOError, ::Errno::EPIPE, ::Errno::EBADF
|
|
366
379
|
nil
|
data/lib/wurk/version.rb
CHANGED