hailer 0.4.0-x86_64-linux-gnu → 0.5.0-x86_64-linux-gnu
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 +15 -110
- data/docs/durable-delivery.md +3 -6
- data/hailer.example.toml +1 -2
- data/lib/hailer/version.rb +1 -1
- data/vendor/x86_64-linux-gnu/bin/hailer +0 -0
- data/vendor/x86_64-linux-gnu/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: 39beb5b2307b47977e5d09d65d42c9dc1792b69592055533ab78991a63beead5
|
|
4
|
+
data.tar.gz: 859fa5e751bdf54ab2acdbbee153e2461ee0b970e5347fffd22ef88d93aa635a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 231b00ce887b6f932d04ebc175a2e3ec8a60d2c26dcbef5aac179489fc5e1eb9626197f5cf05663e39fea13f04b793f7b89a710386909c6ae228cd051fd86b9b
|
|
7
|
+
data.tar.gz: af449db240a78a8e119da179bde8da3ca762cc89ae79adc1934e360def5585472dca5e5bcd9f94b35df94d0f4335f10d7552834bb52d44c2f3757800b17b85e6
|
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Rails writes the email. Hailer deals with sending it.
|
|
4
4
|
|
|
5
|
-
This repository
|
|
5
|
+
This repository is two things:
|
|
6
6
|
|
|
7
7
|
- **`hailer` gem** — an ActionMailer adapter, feedback client, and executable
|
|
8
8
|
launcher. Platform gems bundle the Rust binary. No Ruby AWS SDK or native extension.
|
|
@@ -13,11 +13,9 @@ This repository prepares two things at version **0.2.0** (not published yet):
|
|
|
13
13
|
ActionMailer → hailer gem → private Mothership route → hailer binary → SES
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
[durable delivery](docs/durable-delivery.md) for ownership,
|
|
18
|
-
and operator controls.
|
|
19
|
-
candidates. Current-source macOS, ARM64 Linux and x86_64 Linux verification
|
|
20
|
-
gates pass locally; this work has not been published or deployed.
|
|
16
|
+
An **opt-in durable queued adapter** sits alongside the default synchronous
|
|
17
|
+
send path. See [durable delivery](docs/durable-delivery.md) for ownership,
|
|
18
|
+
recovery, routing and operator controls.
|
|
21
19
|
|
|
22
20
|
## Rails
|
|
23
21
|
|
|
@@ -25,7 +23,6 @@ Requires Ruby 4.0+ and Rails 8.1 or newer within Rails 8.x.
|
|
|
25
23
|
Rails main (8.2 alpha) is also exercised in CommonShare. Older releases are not supported.
|
|
26
24
|
|
|
27
25
|
```ruby
|
|
28
|
-
# Gemfile (use path: "/path/to/hailer" while developing)
|
|
29
26
|
gem "hailer"
|
|
30
27
|
```
|
|
31
28
|
|
|
@@ -98,7 +95,7 @@ SES account/identities must be configured for sending.
|
|
|
98
95
|
|
|
99
96
|
### PostgreSQL
|
|
100
97
|
|
|
101
|
-
PostgreSQL is the **only live backend
|
|
98
|
+
PostgreSQL is the **only live backend**. Hailer owns a `hailer` schema,
|
|
102
99
|
not Rails tables. Use a separate database/role where practical:
|
|
103
100
|
|
|
104
101
|
```sh
|
|
@@ -384,49 +381,14 @@ The SES SDK makes **one send attempt**. AWS throttling/transient failures return
|
|
|
384
381
|
IDs carry the explicit unknown-outcome code. None of these responses authorizes
|
|
385
382
|
an automatic retry of an ambiguous send.
|
|
386
383
|
|
|
387
|
-
## Status
|
|
388
|
-
|
|
389
|
-
The delivery contract
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
2. Provision an **empty** Hailer PostgreSQL database and set its URL.
|
|
396
|
-
3. Run `hailer migrate-redb --file /private/path/state.redb`.
|
|
397
|
-
4. Check reported counts, event cursors, and suppression enforcement before
|
|
398
|
-
starting 0.2. Keep the source backup; do not restart old writers after cutover.
|
|
399
|
-
|
|
400
|
-
Migration opens redb read-only, checks event/dedup mappings and suppression keys,
|
|
401
|
-
and copies bounded batches in **one destination transaction**. It preserves
|
|
402
|
-
event IDs, sequence values, suppression metadata, and next-cursor continuity.
|
|
403
|
-
It rejects missing/corrupt sources and nonempty targets without wiping anything.
|
|
404
|
-
An unclean redb file may require recovery with the old version against a backup
|
|
405
|
-
before migration. There is no implicit fallback and no dual-write period.
|
|
406
|
-
|
|
407
|
-
Before switching an existing app:
|
|
408
|
-
|
|
409
|
-
1. Provision PostgreSQL, run Hailer on a private Mothership bind, check readiness,
|
|
410
|
-
and verify real SES delivery using a deliberate test.
|
|
411
|
-
2. Add the gem, set `HAILER_URL`, and remove the app's old delivery-method
|
|
412
|
-
override so Hailer's default takes effect.
|
|
413
|
-
3. Subscribe a dedicated SQS queue before exporting and importing existing
|
|
414
|
-
suppressions. Let Hailer catch up and verify the event feed.
|
|
415
|
-
4. Keep existing receivers/interceptors until routing, suppression import,
|
|
416
|
-
and any provider-neutral app history consumer have been verified.
|
|
417
|
-
5. Only then remove the old sender and AWS-specific feedback handling.
|
|
418
|
-
|
|
419
|
-
CommonShare's local 0.2 integration is tested with its real application,
|
|
420
|
-
test database, Mothership, the optimized binary from the macOS gem, its installed 0.1 Ruby
|
|
421
|
-
client, and a loopback SES fixture. Its existing AWS
|
|
422
|
-
receivers remain until the real subscription and suppression cutover is verified.
|
|
423
|
-
No deployed AWS routing has been changed.
|
|
424
|
-
The current-source queued adapter and dispatcher also pass a CommonShare smoke
|
|
425
|
-
using an isolated Bundler Gemfile, real Mothership and loopback SES. No app
|
|
426
|
-
Gemfile or production configuration was changed. Its legacy history observer
|
|
427
|
-
still needs queued-ownership semantics before opt-in deployment.
|
|
428
|
-
Validation/behavior plugins and distributed account-wide quotas remain later
|
|
429
|
-
work. No plugin API or provider exactly-once delivery is promised.
|
|
384
|
+
## Status
|
|
385
|
+
|
|
386
|
+
The delivery contract, Hailer-side feedback processing, domain blocklist,
|
|
387
|
+
impossible-address rejection, address verification, the queued/quarantine
|
|
388
|
+
pipeline, and SES account diagnostics are all implemented and shipped.
|
|
389
|
+
`[queued]`, `[domain_intel]`, `[suppression_sync]`, `[feedback]`, and
|
|
390
|
+
`[email_verification]` ship disabled by default - absent config, not
|
|
391
|
+
missing code.
|
|
430
392
|
|
|
431
393
|
## Development
|
|
432
394
|
|
|
@@ -435,8 +397,6 @@ bundle install
|
|
|
435
397
|
bundle exec rake
|
|
436
398
|
HAILER_TEST_DATABASE_URL=postgres://test_user:password@127.0.0.1/hailer_test cargo test --locked
|
|
437
399
|
cargo fmt --all -- --check
|
|
438
|
-
gem build hailer.gemspec --output /tmp/hailer-0.2.0.gem
|
|
439
|
-
bundle exec rake native:package
|
|
440
400
|
```
|
|
441
401
|
|
|
442
402
|
The Ruby suite exercises real local HTTP exchanges and a booted Rails app.
|
|
@@ -461,63 +421,8 @@ It refuses a non-test app database, points the AWS SDK at a loopback fixture,
|
|
|
461
421
|
and rolls back application-history changes. It does not change the app's
|
|
462
422
|
dependency lockfile or send external mail.
|
|
463
423
|
|
|
464
|
-
`native:package` builds a locked release and writes
|
|
465
|
-
`pkg/hailer-0.2.0-<platform>.gem`. Each platform gem contains exactly its host
|
|
466
|
-
binary and a version/platform/SHA-256 manifest. The launcher verifies that
|
|
467
|
-
manifest before `exec`, preserving arguments, exit status, and signal handling.
|
|
468
424
|
`HAILER_BINARY` is an explicit, version-checked source-build override; there is
|
|
469
425
|
no download or PATH fallback.
|
|
470
426
|
|
|
471
|
-
|
|
472
|
-
in
|
|
473
|
-
|
|
474
|
-
## Linux releases and RubyGems
|
|
475
|
-
|
|
476
|
-
The **Linux binary gems** GitHub Actions workflow builds `x86_64-linux-gnu`
|
|
477
|
-
and `aarch64-linux-gnu` natively against Debian 13 Trixie (glibc 2.41).
|
|
478
|
-
New Trixie-built artifacts target glibc 2.41 or newer, not Bookworm or
|
|
479
|
-
Alpine/musl. The preserved older 0.2 candidates retain their original baseline.
|
|
480
|
-
Local OrbStack verification uses `test/linux/Dockerfile` for each architecture
|
|
481
|
-
and a separate `ruby:4.0-slim-trixie` runtime.
|
|
482
|
-
Use a copied checkout in separate per-architecture Docker work volumes; do not
|
|
483
|
-
reuse the macOS `target/` or Ruby bundle. Run the locked Ruby tests, release Rust
|
|
484
|
-
tests and `native:package` with an isolated PostgreSQL fixture, then install each
|
|
485
|
-
gem in its slim runtime and exercise the launcher, migrations and import CLI.
|
|
486
|
-
When transferring a macOS snapshot, use `COPYFILE_DISABLE=1 tar --no-xattrs`
|
|
487
|
-
so AppleDouble `._*` metadata cannot appear as spurious SQL migrations.
|
|
488
|
-
|
|
489
|
-
```sh
|
|
490
|
-
gh workflow run linux-gems.yml --repo seuros/hailer -f tag=v0.2.0
|
|
491
|
-
```
|
|
492
|
-
|
|
493
|
-
The workflow checks out the requested release tag, runs the Ruby and Rust
|
|
494
|
-
suites against an isolated PostgreSQL 18 service, and installs each binary gem
|
|
495
|
-
in a separate slim Debian container. Pushes/PRs also verify the branch without
|
|
496
|
-
creating a release or publishing anything; only explicit workflow dispatch
|
|
497
|
-
can attach assets to an existing release.
|
|
498
|
-
It verifies the installed platform, bundled-binary manifest, executable version,
|
|
499
|
-
and PostgreSQL suppression import before attaching either Linux gem to the
|
|
500
|
-
existing release. Existing gem assets are never overwritten; `SHA256SUMS` is
|
|
501
|
-
updated to cover all release gems.
|
|
502
|
-
|
|
503
|
-
Publishing a GitHub release does **not** publish to RubyGems. Like Shuttlebay,
|
|
504
|
-
release assets can be fetched and published with Rake:
|
|
505
|
-
|
|
506
|
-
```sh
|
|
507
|
-
bundle exec rake gems:fetch
|
|
508
|
-
bundle exec rake gems:push_all
|
|
509
|
-
# Or select an explicit release:
|
|
510
|
-
bundle exec rake 'gems:push_all[v0.2.0]'
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
`gems:push_all` fetches fresh assets, checks every archive's SHA-256,
|
|
514
|
-
name/version/platform, and publishes only that verified set. It skips
|
|
515
|
-
already-published platforms only when RubyGems reports the identical archive
|
|
516
|
-
hash, so an interrupted publication can be resumed without replacing artifacts.
|
|
517
|
-
`gems:push` is an alias. No release task rebuilds or silently republishes gems.
|
|
518
|
-
|
|
519
|
-
RubyGems may require MFA or a suitably scoped API key. Keep credentials out of
|
|
520
|
-
the repository. Publishing makes the packaged Ruby code and binaries public,
|
|
521
|
-
even when the GitHub repository is private. Once published, Bundler selects
|
|
522
|
-
the matching native gem; do not set `force_ruby_platform` in deployment if
|
|
523
|
-
you want the bundled executable.
|
|
427
|
+
Bundler selects the matching native platform gem automatically; do not set
|
|
428
|
+
`force_ruby_platform` in deployment if you want the bundled executable.
|
data/docs/durable-delivery.md
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
# Durable delivery
|
|
1
|
+
# Durable delivery
|
|
2
2
|
|
|
3
3
|
The queued Ruby interface, PostgreSQL spool and supervised dispatcher are
|
|
4
|
-
implemented
|
|
5
|
-
|
|
6
|
-
Trixie runtime checks also pass in OrbStack (x86_64 under emulation).
|
|
7
|
-
Do not enable queued delivery against the existing 0.2 release
|
|
8
|
-
candidates or treat this working tree as a published durable-delivery release.
|
|
4
|
+
implemented and shipped (0.3.0+). It is opt-in: absent `[queued]` config,
|
|
5
|
+
Hailer stays on the synchronous send path and none of this runs.
|
|
9
6
|
|
|
10
7
|
## Opt-in Rails configuration
|
|
11
8
|
|
data/hailer.example.toml
CHANGED
|
@@ -17,8 +17,7 @@ interval_seconds = 3600
|
|
|
17
17
|
# recipients_per_second = 10.0
|
|
18
18
|
# burst = 50
|
|
19
19
|
|
|
20
|
-
#
|
|
21
|
-
# Requires the durable-dispatch build, not the existing 0.2 release candidates.
|
|
20
|
+
# Durable intake requires explicit logical payload budgets.
|
|
22
21
|
# [queued]
|
|
23
22
|
# max_bytes = 268435456
|
|
24
23
|
# max_messages = 10000
|
data/lib/hailer/version.rb
CHANGED
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.5.0",
|
|
3
3
|
"platform": "x86_64-linux-gnu",
|
|
4
4
|
"target": "x86_64-unknown-linux-gnu",
|
|
5
|
-
"sha256": "
|
|
5
|
+
"sha256": "c5b25e418064118318a87745fce6c6c27fa0d266a9292e33c54f6da4d8021821"
|
|
6
6
|
}
|