mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-26 15:05:24 +00:00
Replaces the scheduled workflow that pushed upstream georelay CSV directly to main unreviewed with a validator-backed automation that resolves an immutable upstream commit, validates against the reviewed baseline, and opens a non-auto-merged PR (or tracking issue) instead of writing to main. Adds a mirrored strict client-side validator in GeoRelayDirectory (all-or-nothing, size/row/host/coord caps, streamed 512KiB cap, >=50% baseline overlap) that fails safe to last-known-good, and retargets runtime refresh to bitchat's reviewed copy.
43 lines
1.2 KiB
Swift
43 lines
1.2 KiB
Swift
import Foundation
|
|
|
|
enum NostrRelayURL {
|
|
static func normalized(_ rawValue: String, defaultScheme: String? = nil) -> String? {
|
|
var value = rawValue.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
guard !value.isEmpty else { return nil }
|
|
|
|
if !value.contains("://"), let defaultScheme {
|
|
value = "\(defaultScheme)://\(value)"
|
|
}
|
|
|
|
guard var components = URLComponents(string: value),
|
|
let rawScheme = components.scheme?.lowercased(),
|
|
let rawHost = components.host?.lowercased(),
|
|
!rawHost.isEmpty else {
|
|
return nil
|
|
}
|
|
|
|
switch rawScheme {
|
|
case "wss", "https":
|
|
components.scheme = "wss"
|
|
if components.port == 443 {
|
|
components.port = nil
|
|
}
|
|
case "ws", "http":
|
|
components.scheme = "ws"
|
|
if components.port == 80 {
|
|
components.port = nil
|
|
}
|
|
default:
|
|
return nil
|
|
}
|
|
|
|
components.host = rawHost
|
|
if components.path == "/" {
|
|
components.path = ""
|
|
}
|
|
components.fragment = nil
|
|
|
|
return components.string
|
|
}
|
|
}
|