Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
6b5c3ea
chore(deps): switch h3x dependency to endpoint branch
eareimu May 11, 2026
73ac61f
refactor(resolvers): migrate h3/http/mdns resolvers to h3x endpoint API
eareimu May 11, 2026
de62cb8
refactor(examples): migrate publish to h3x endpoint API, remove error…
eareimu May 11, 2026
80eb8f0
refactor(examples): migrate query to h3x endpoint API, remove error a…
eareimu May 11, 2026
044c481
refactor(server): migrate gmdns-server to QuicEndpoint + H3Endpoint::…
eareimu May 11, 2026
963b0a5
fix: replace io::Error::other with explicit io::ErrorKind
eareimu May 11, 2026
6819743
fix(gmdns): adapt to dquic v0.5.1 and h3x Request API changes
eareimu May 13, 2026
8e2d3e0
fix(gmdns): fix clippy warnings and clean up deprecated Request API u…
eareimu May 14, 2026
ade2545
fix(gmdns): adapt to ServerName FromStr and remove deprecated with_md…
eareimu May 14, 2026
355c74c
refactor(gmdns): adapt H3Resolver to H3Endpoint<Q, C> dual-generic
eareimu May 17, 2026
aeeb338
chore: repair gmdns server redis dependency baseline
eareimu May 18, 2026
2875756
chore: create ddns workspace skeleton
eareimu May 18, 2026
76fe869
refactor: move DNS protocol code to ddns-core
eareimu May 18, 2026
58d6a6a
refactor: move multicast DNS code to gmdns crate
eareimu May 18, 2026
a416006
refactor: move resolver facade to ddns crate
eareimu May 18, 2026
22e1322
refactor: rename gmdns server to ddns-server
eareimu May 18, 2026
ed6bf83
docs: update crate split documentation
eareimu May 18, 2026
174f63e
feat(resolvers): move mdns network integration to gmdns
eareimu May 19, 2026
bfcd36e
docs: design ddns publisher
eareimu May 19, 2026
b2f7b5a
feat(publisher): add signed dns publishing
eareimu May 19, 2026
67593a0
feat: add configurable dns publisher options
eareimu May 19, 2026
e7fb6f0
chore(deps): remove local workspace patches
eareimu May 19, 2026
3d251a5
fix(ddns-server): keep h3 server running
eareimu May 19, 2026
6f15627
fix(ddns-server): advertise h3 alpn
eareimu May 19, 2026
1a1bb2d
fix(publisher): bound dns publish attempts
eareimu May 19, 2026
8c16a69
fix(server): bind wildcard listen as dual stack
eareimu May 19, 2026
a5cdf3a
fix(resolver): reset h3 pool after request failures
eareimu May 19, 2026
e058379
fix(publisher): reset h3 pools after publish timeout
eareimu May 19, 2026
d41aef5
fix(publisher): republish on binding changes
eareimu May 19, 2026
b9bcb94
fix(publisher): ignore self-generated publish events
eareimu May 19, 2026
224351d
fix(publisher): ignore failed location updates
eareimu May 19, 2026
5e344e5
fix(publisher): retry publishes after binding changes
eareimu May 19, 2026
20aa273
fix(publisher): fall back to default route endpoint
eareimu May 19, 2026
f8f9493
fix(publisher): retry failed publishes with endpoints
eareimu May 19, 2026
234e904
fix(resolver): bound h3 lookup retries
eareimu May 20, 2026
259c2f1
fix(publisher): preserve publishable location changes
eareimu May 20, 2026
aae3865
fix(resolver): leave retry timeout margin
eareimu May 20, 2026
dcc3ccf
fix(publisher): preserve nat agent for translated full cone
eareimu May 20, 2026
6bf1f66
fix(publisher): include local default-route endpoints
eareimu May 20, 2026
ddbd56d
fix(publisher): preserve endpoint publish order
eareimu May 20, 2026
3a48e05
fix(publisher): append direct endpoint after stun
eareimu May 20, 2026
dbfc9e5
refactor(publisher): simplify publish loop and update stun name
eareimu May 20, 2026
867950f
refactor(h3): use raw h3x hyper endpoint api
eareimu May 20, 2026
effe065
chore: add dns publish diagnostics
eareimu May 20, 2026
01ea585
fix: bind mdns sockets to apple interfaces
eareimu May 20, 2026
8a7188e
fix(server): accept empty dns publish as clear
eareimu May 21, 2026
eadd851
fix(publisher): replace stale publish attempts on changes
eareimu May 21, 2026
51ceaa0
fix(resolver): report h3 dns source
eareimu May 21, 2026
4058ed9
fix ddns tests and suppress proc-macro future-incompat warnings
eareimu May 22, 2026
d39950a
refactor: consolidate ddns crates
eareimu May 22, 2026
0ff552e
Inject ddns bootstrap constants at build time
eareimu May 25, 2026
1068c47
chore: use https git dependencies
eareimu May 28, 2026
52684eb
refactor: nest ddns public API exports
eareimu May 29, 2026
3ed6b92
ci: prepare ddns crates.io release
eareimu May 31, 2026
fb7e1db
refactor: migrate endpoint signing to authorities
eareimu May 31, 2026
6becba5
chore: normalize release metadata formatting
eareimu May 31, 2026
42f0ccc
fix: sync ddns with agent APIs
eareimu May 31, 2026
31f06dd
feat(resolvers): add deferred weak resolver wrappers
eareimu Jun 1, 2026
5f7ec9d
refactor: use authority identity naming
eareimu Jun 2, 2026
8e08aed
chore: align dependency versions
eareimu Jun 2, 2026
d1a42a7
chore: remove unused dependencies
eareimu Jun 2, 2026
5a9774d
chore: update resolver dependencies
eareimu Jun 2, 2026
21c0881
fix: add bootstrap placeholder defaults
eareimu Jun 4, 2026
4fd0a57
ci: rename release workflows to publish
eareimu Jun 4, 2026
81053dc
refactor: omit endpoint signature schemes
eareimu Jun 5, 2026
fb05dbd
fix: update h3x hyper facade imports
eareimu Jun 6, 2026
8280957
ci: rename publish workflow titles
eareimu Jun 8, 2026
57083dd
fix: encode endpoint signature scheme
eareimu Jun 8, 2026
b807fc5
test(resolvers): document h3 endpoint port semantics
eareimu Jun 8, 2026
c600308
feat: publish explicit dns host endpoints
eareimu Jun 8, 2026
550005d
feat(identity): use dhttp suffix in dns examples
eareimu Jun 8, 2026
ddb22b4
refactor: split dns endpoint publisher roles
eareimu Jun 9, 2026
c267e7f
chore: clean repository artifacts
eareimu Jun 9, 2026
89554ce
docs: refresh public documentation
eareimu Jun 9, 2026
2723d7f
fix: add publishable genmeta dependency versions
eareimu Jun 9, 2026
a67cfed
feat: derive dns selectors from certificate ski
eareimu Jun 12, 2026
81eae5d
refactor: remove publish options compatibility
eareimu Jun 12, 2026
22b8988
test: lock dns error block format
eareimu Jun 14, 2026
eace052
fix: format dns resolver error blocks
eareimu Jun 14, 2026
5afe65d
release: prepare v0.3.0
eareimu Jun 14, 2026
ed23d98
refactor(server): use explicit bind patterns
eareimu Jun 14, 2026
f705233
release: converge upstream tags
eareimu Jun 15, 2026
5990614
fix: publish dyns package name
eareimu Jun 15, 2026
d9551af
release: converge registry deps and gate crates publish
eareimu Jun 15, 2026
a1fd466
ci: gate dry-run by registry publish eligibility
eareimu Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
105 changes: 105 additions & 0 deletions .github/workflows/publish-crates.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: Publish crates.io

on:
pull_request:
workflow_dispatch:
push:
branches:
- main
tags:
- "v*"

env:
CARGO_TERM_COLOR: always

jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write

steps:
- uses: actions/checkout@v4

- name: Install Rust stable toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1

- name: Test crate
run: cargo test --all-features --all-targets

- name: Authenticate to crates.io
if: github.ref_type == 'tag' && startsWith(github.ref_name, 'v')
uses: rust-lang/crates-io-auth-action@v1
id: auth

- name: Release dyns crate
shell: bash
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
run: |
set -euo pipefail

if [[ "${GITHUB_REF_TYPE}" == "tag" && "${GITHUB_REF_NAME}" == v* ]]; then
mode=publish
else
mode=dry-run
fi

package_name=dyns
package_version="$(cargo metadata --no-deps --format-version 1 | python3 -c 'import json, sys; print(json.load(sys.stdin)["packages"][0]["version"])')"

crate_state="$(
python3 - <<'PY' "$package_name" "$package_version"
import sys
import urllib.error
import urllib.request

name, version = sys.argv[1], sys.argv[2]
headers = {"User-Agent": "genmeta ddns publish workflow"}
version_url = f"https://crates.io/api/v1/crates/{name}/{version}"
version_request = urllib.request.Request(version_url, headers=headers)
try:
with urllib.request.urlopen(version_request, timeout=20) as response:
if response.status == 200:
print("published_version")
else:
raise SystemExit(f"unexpected crates.io status for {name} {version}: {response.status}")
except urllib.error.HTTPError as error:
if error.code == 404:
crate_url = f"https://crates.io/api/v1/crates/{name}"
crate_request = urllib.request.Request(crate_url, headers=headers)
try:
with urllib.request.urlopen(crate_request, timeout=20) as response:
if response.status == 200:
print("missing_version")
else:
raise SystemExit(f"unexpected crates.io crate status for {name}: {response.status}")
except urllib.error.HTTPError as crate_error:
if crate_error.code == 404:
print("missing_crate")
else:
raise
else:
raise
PY
)"

if [[ "$crate_state" == "published_version" ]]; then
echo "skip $package_name $package_version (already on crates.io)"
exit 0
fi

if [[ "$crate_state" == "missing_crate" ]]; then
echo "skip $package_name $package_version (crate not yet initialized on crates.io)"
exit 0
fi

if [[ "$mode" == "dry-run" ]]; then
echo "dry-run $package_name $package_version"
cargo publish --dry-run --locked
exit 0
fi

echo "publish $package_name $package_version"
cargo publish --locked
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@
Cargo.lock
*.log
build

.DS_Store
.vscode/
5 changes: 0 additions & 5 deletions .vscode/settings.json

This file was deleted.

107 changes: 73 additions & 34 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,72 +1,111 @@
[workspace]
members = ["gmdns-server"]
resolver = "2"

[package]
name = "gmdns"
version = "0.2.0"
name = "dyns"
description = "DNS discovery and resolver support for DHTTP applications"
version = "0.3.0"
edition = "2024"
license = "Apache-2.0"
repository = "https://github.com/genmeta/ddns"
readme = "README.md"
keywords = ["dhttp", "dns", "mdns", "http3", "quic"]
categories = ["network-programming", "asynchronous"]
autoexamples = false

[lib]
name = "ddns"

[dependencies]
base64 = "0.22"
bitfield-struct = "0.10"
bitfield-struct = "0.13"
bytes = "1"
dashmap = "6"
dhttp-identity = "0.1.0"
dquic = "0.5.1"
flume = "0.12"
futures = "0.3"
libc = "0.2"
nom = "8"
rand = "0.9"
reqwest = { version = "0.12", default-features = false, features = [
"charset",
"rustls-tls",
"http2",
"macos-system-configuration",
"json",
] }
rand = "0.10"
ring = "0.17"
rustls = { version = "0.23", default-features = false, features = [
"logging",
"ring",
] }
rustls-native-certs = { version = "0.8", optional = true }
rustls-pemfile = "2"
serde = "1"
shellexpand = "3"
snafu = "0.8"
socket2 = { version = "0.5.8", features = ["all"] }
snafu = "0.9"
socket2 = { version = "0.6", features = ["all"] }
tokio = { version = "1", features = [
"time",
"macros",
"net",
"sync",
"rt",
"rt-multi-thread",
"io-util",
] }
tokio-util = { version = "0.7", features = ["rt"] }
tracing = "0.1"
url = "2"
x509-parser = "0.18"

# Optional HTTP/3 publisher/resolver via h3x
h3x = { git = "https://github.com/genmeta/h3x.git", branch = "main", default-features = false, features = [
"dquic",
], optional = true }
h3x = { version = "0.3.1", default-features = false, optional = true }
http = { version = "1", optional = true }
http-body = { version = "1", optional = true }
http-body-util = { version = "0.1", optional = true }
reqwest = { version = "0.13", default-features = false, features = [
"charset",
"http2",
"json",
"query",
"rustls-no-provider",
"system-proxy",
], optional = true }
url = { version = "2", optional = true }

clap = { version = "4", features = ["derive"], optional = true }
deadpool-redis = { version = "0.23", optional = true }
idna = { version = "1", optional = true }
serde = { version = "1", features = ["derive"], optional = true }
toml = { version = "1", optional = true }
tower-service = { version = "0.3", optional = true }
tracing-subscriber = { version = "0.3", features = [
"env-filter",
], optional = true }

[features]
default = ["h3x-resolver"]
h3x-resolver = ["dep:h3x", "dep:http"]
default = []
h3x-resolver = [
"dep:h3x",
"h3x/dquic",
"h3x/hyper",
"dep:http",
"dep:http-body",
"dep:http-body-util",
"dep:url",
]
mdns-resolver = ["dep:h3x", "h3x/dquic"]
http-resolver = ["dep:reqwest", "dep:rustls-native-certs"]
server = [
"h3x-resolver",
"dep:clap",
"dep:deadpool-redis",
"dep:idna",
"dep:serde",
"dep:toml",
"dep:tower-service",
"dep:tracing-subscriber",
]

[dev-dependencies]
criterion = "0.5"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
rustls-pki-types = "1"
tracing-appender = "0.2"
# examples: publish / query
clap = { version = "4", features = ["derive"] }
idna = "1"
serde = { version = "1", features = ["derive"] }
h3x = { version = "0.3.1", default-features = false, features = [
"dquic",
] }
shellexpand = "3"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }

[[bin]]
name = "ddns-server"
path = "src/bin/ddns-server/main.rs"
required-features = ["server"]

[[example]]
name = "mdns_discover"
Expand Down
Loading
Loading