{"name":"transport.nu","source":"// examples/transport.nu — the pubkey-addressed overlay in use (TODO §7.4\n// Phase 4). A group-broadcast client: it opens a transport over a relay,\n// joins a group, broadcasts one opaque payload to the whole group (the\n// shape a group-audio sender uses — one uplink, the relay fans out), and\n// receives messages from peers. Addressing is by public key only; the\n// transport hides direct-vs-relay, NAT and roaming.\n//\n//   ./nurl.sh examples/transport.nu <relay_host> <relay_port>\n//\n// Run a relay with examples/relay.nu. The payload here is just text; a real\n// app puts a distributed-compute task or an Opus audio frame there,\n// E2E-encrypted with the group key.\n\n$ `stdlib/core/string.nu`\n$ `stdlib/core/vec.nu`\n$ `stdlib/ext/env.nu`\n$ `stdlib/net/relay.nu`\n$ `stdlib/net/transport.nu`\n\n@ my_pubkey → ( Vec u ) { : ( Vec u ) v ( vec_new [u] ) : ~ i k 0 ~ < k 32 { ( vec_push [u] v # u + 7 k ) = k + k 1 } ^ v }\n\n@ group_id → ( Vec u ) { : ( Vec u ) v ( vec_new [u] ) : ~ i k 0 ~ < k 32 { ( vec_push [u] v # u + 200 k ) = k + k 1 } ^ v }\n\n@ frame s text i n → ( Vec u ) { : ( Vec u ) v ( vec_new [u] ) : *u sp # *u text : ~ i k 0 ~ < k n { ( vec_push [u] v # u . sp k ) = k + k 1 } ^ v }\n\n@ main → i {\n    : i argc ( env_args_count )\n    : String host ? > argc 1 ( env_arg 1 ) ( string_from `127.0.0.1` )\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_dial ( string_data host ) port ) {\n        T rc → {\n            : ( Vec u ) me ( my_pubkey )\n            ?? ( relay_register rc me ) { T _ → {} F _ → {} }\n            ( relay_set_timeout rc 3000 )\n\n            // relay-only transport (no direct UDP leg in this demo)\n            : *Transport t # *Transport ( transport_open # s 0 rc 1 )\n\n            : ( Vec u ) g ( group_id )\n            ?? ( transport_group_join t g ) { T _ → {} F _ → {} }\n\n            : ( Vec u ) payload ( frame `hello-group` 11 )\n            ?? ( transport_broadcast t g payload ) {\n                T _ → ( nurl_print `broadcast to group sent\\n` )\n                F _ → ( nurl_print `broadcast failed\\n` )\n            }\n\n            // receive whatever peers send back\n            ?? ( transport_recv t 3000 ) {\n                T m → {\n                    ( nurl_print `recv ` ) ( nurl_print_int ( vec_len [u] . m payload ) ) ( nurl_print ` bytes from a peer\\n` )\n                    ( transport_msg_free m )\n                }\n                F → ( nurl_print `no message this round\\n` )\n            }\n\n            ( vec_free [u] me ) ( vec_free [u] g ) ( vec_free [u] payload )\n            ( transport_free t )\n            ( relay_close rc )\n        }\n        F e → ( nurl_print `could not reach relay\\n` )\n    }\n    ( string_free host )\n    ^ 0\n}\n","bytes":2821}