{ lib, inputs, snowfall-inputs }: let inherit (inputs.nixpkgs.lib) assertMsg last; in { network = { # Split an address to get its host name or ip and its port. # Type: String -> Attrs # Usage: get-address-parts "bismuth:3000" # result: { host = "bismuth"; port = "3000"; } get-address-parts = address: let address-parts = builtins.split ":" address; ip = builtins.head address-parts; host = if ip == "" then "127.0.0.1" else ip; port = if builtins.length address-parts != 3 then "" else last address-parts; in { inherit host port; }; ## Create proxy configuration for NGINX virtual hosts. ## ## ```nix ## services.nginx.virtualHosts."example.com" = lib.network.create-proxy { ## port = 3000; ## host = "0.0.0.0"; ## proxy-web-sockets = true; ## extra-config = { ## forceSSL = true; ## }; ## } ## `` ## #@ { port: Int ? null, host: String ? "127.0.0.1", proxy-web-sockets: Bool ? false, extra-config: Attrs ? { } } -> Attrs create-proxy = { port ? null , host ? "127.0.0.1" , proxy-web-sockets ? false , extra-config ? { } }: assert assertMsg (port != "" && port != null) "port cannot be empty"; assert assertMsg (host != "") "host cannot be empty"; extra-config // { locations = (extra-config.locations or { }) // { "/" = (extra-config.locations."/" or { }) // { proxyPass = "http://${host}${if port != null then ":${builtins.toString port}" else ""}"; proxyWebsockets = proxy-web-sockets; }; }; }; }; }