{"name":"stun.nu","source":"// examples/stun.nu — discover this host's public (server-reflexive) UDP\n// endpoint via a STUN server (TODO §7.4 Phase 1). The same socket the\n// transport uses sends a Binding request; the server echoes back the\n// address+port it saw — i.e. how peers across the NAT will reach us.\n//\n//   ./nurl.sh examples/stun.nu [stun_host] [stun_port]\n// Defaults to a public STUN server.\n\n$ `stdlib/core/string.nu`\n$ `stdlib/std/udp.nu`\n$ `stdlib/ext/env.nu`\n$ `stdlib/net/stun.nu`\n\n@ main → i {\n    : i argc ( env_args_count )\n    : String host ? > argc 1 ( env_arg 1 ) ( string_from `stun.l.google.com` )\n    : i port ? > argc 2 {\n        : String ps ( env_arg 2 ) : i p ( nurl_str_to_int ( string_data ps ) ) ( string_free ps ) p\n    } 19302\n\n    : !UdpSocket NetErr sr ( udp_bind_any )\n    ?? sr {\n        T sock → {\n            ( nurl_print `querying ` ) ( nurl_print ( string_data host ) )\n            ( nurl_print `:` ) ( nurl_print_int port ) ( nurl_print ` …\\n` )\n            : ?StunAddr a ( stun_query sock ( string_data host ) port 3000 )\n            ?? a {\n                T sa → {\n                    ( nurl_print `public endpoint: ` )\n                    ( nurl_print ( string_data . sa host ) )\n                    ( nurl_print `:` ) ( nurl_print_int . sa port ) ( nurl_print `\\n` )\n                    ( stun_addr_free sa )\n                }\n                F → ( nurl_print `no STUN response (no internet / DNS / blocked)\\n` )\n            }\n            ( udp_close sock )\n        }\n        F e → ( nurl_print `bind failed\\n` )\n    }\n    ( string_free host )\n    ^ 0\n}\n","bytes":1594}