{"name":"relay.nu","source":"// examples/relay.nu — a deployable DERP-style relay daemon (TODO §7.4\n// Phase 2). NAT'd peers that can't open a direct path dial out to a relay,\n// register their public key, and exchange opaque (already E2E-encrypted)\n// datagrams addressed by the *destination's* pubkey. The relay never\n// decrypts — it just forwards by pubkey.\n//\n//   ./nurl.sh examples/relay.nu [host] [port]      # default 0.0.0.0:47700\n//\n// A peer uses the client API (stdlib/net/relay.nu):\n//\n//     : !RelayClient NetErr d ( relay_dial relay_host relay_port )\n//     ?? d { T rc → {\n//         ( relay_register rc my_pubkey )            // announce identity\n//         ( relay_send rc dest_pubkey opaque_bytes ) // forward to a peer\n//         ?? ( relay_recv rc ) {                     // {src_pubkey, payload}\n//             T m → { /* . m src, . m payload */ ( relay_msg_free m ) }\n//             F → {} }\n//         ( relay_close rc )\n//     } F e → {} }\n\n$ `stdlib/core/string.nu`\n$ `stdlib/core/vec.nu`\n$ `stdlib/ext/env.nu`\n$ `stdlib/net/relay.nu`\n\n@ main → i {\n    : i argc ( env_args_count )\n    : String host ? > argc 1 ( env_arg 1 ) ( string_from `0.0.0.0` )\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    } 47700\n\n    ?? ( relay_server_start ( string_data host ) port ) {\n        T rs → {\n            : *RelayServer p # *RelayServer ( nurl_alloc Z RelayServer )\n            = . p lst . rs lst\n            = . p clients . rs clients\n            = . p groups . rs groups\n            ( nurl_print `relay listening on ` ) ( nurl_print ( string_data host ) )\n            ( nurl_print `:` ) ( nurl_print_int port )\n            ( relay_server_run p )  // blocks until the listener is closed\n            ( relay_server_free p )\n        }\n        F e → ( nurl_print `relay failed to bind\\n` )\n    }\n    ( string_free host )\n    ^ 0\n}\n","bytes":1918}