mirror of
https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit-grasp.git
synced 2026-10-05 15:08:24 +00:00
3.4 KiB
3.4 KiB
Archive Services Setting
ID: 9f23
Problem
Operators need a way to backup/archive one or more GRASP servers by domain. Currently, there's no configuration option to selectively accept announcement events based on the services they advertise.
We need an archive-services setting that:
- Accepts a list of domain names (GRASP server domains to archive)
- Filters announcement event acceptance based on whether the event lists any of the configured services
- Enables relay operators to act as archival mirrors for specific GRASP servers
Plan
- Phase 1: Add
archive_grasp_servicesconfiguration option- Update
src/config.rswith new field - Update
docs/reference/configuration.md - Update
nix/module.nix - Update
.env.example
- Update
- Phase 2: Implement announcement event filtering logic
- Extract service domains from announcement events
- Compare against configured archive-grasp-services list
- Accept/reject based on match
- Phase 3: Add tests for archive-grasp-services functionality
- Unit tests for configuration parsing
- Integration tests for event filtering
Progress
2026-01-21 [Session Start]
- Started: Created issue for archive-services setting feature
- Started work: Created worktree 9f23-archive-services-setting
- Completed Phase 1: Added
archive-grasp-servicesconfiguration option- Implemented in all four sources (config.rs, docs, nix module, .env.example)
- Added validation for mutual exclusivity with archive-all and archive-whitelist
- Defaults read-only to true
- Added 9 comprehensive tests (all 61 config tests pass)
- Completed Phase 2: Implemented filtering logic
- Added
clone_url_domains()to extract domains from announcement clone URLs - Added
matches_grasp_services()for case-insensitive domain matching - Integrated filtering into
validate_announcement()flow - Added 8 tests for domain extraction and matching (all 390 lib tests pass)
- Added
- Decision: Only bare domains accepted (no ws:// or wss:// prefixes)
- Clone URLs use https:// scheme, domain extraction strips that prefix
- Exact case-insensitive matching ensures correct behavior
- Documentation updated to clarify bare domain requirement
- Completed Phase 3: Added integration tests
- Created tests/archive_grasp_services.rs with 4 test scenarios
- Tests matching/non-matching domains, multiple services, case-insensitivity
- All 39 integration tests pass (525 total tests)
- Simplified implementation via rebase:
- Rebased onto master with clean commit history
- Removed complex
matches_grasp_services()function - Reused existing
lists_service()infrastructure - Added
has_clone_url_with_case()helper for case-insensitive matching - Validation logic now uses existing methods: checks clone URLs only (archiving from other services)
- Removed 88 lines of unnecessary code, added 42 lines of simple helpers
- Net improvement: 46 lines less code, much cleaner
- Final commits: 25351fd (test helper fix), f911d00 (complete feature)
- All 39 integration tests pass
2026-01-21 [Session End]
- Completed: All phases finished, tests passing, ready to merge
- Merging back to main and cleaning up worktree
Notes
- This enables relay operators to selectively mirror specific GRASP servers
- Announcement events contain service information that can be matched against the configured list
- Must maintain consistency across all four configuration sources (critical per AGENTS.md)