- Publicity: Public Only All
message-relay-procs.tcl
Generic MessageRelay procs Provide means to publish a subscription key and let clients write to these keys. These functions are used e.g. by the chat.
This file defines the following Objects and Classes: ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::none, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::MessageRelay, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::bgdelivery, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::connchan, ::xo::mr::bgdelivery
- Location:
- packages/xotcl-core/tcl/message-relay-procs.tcl
- Created:
- 2019-02-23
- Author:
- Gustaf Neumann
Procedures in this file
- Class ::xo::MessageRelay (public)
- Object ::xo::mr::bgdelivery (public)
- Object ::xo::mr::connchan (public)
- Object ::xo::mr::none (public)
- xo::MessageRelay instproc can_be_used (public)
- xo::MessageRelay instproc encode_message (public)
- xo::MessageRelay instproc send_to_subscriber (public)
- xo::MessageRelay instproc subscribe (public)
- xo::MessageRelay instproc sweep (public)
- xo::mr::bgdelivery proc can_be_used (public)
- xo::mr::bgdelivery proc send_to_subscriber (public)
- xo::mr::bgdelivery proc subscribe (public)
- xo::mr::bgdelivery proc sweep (public)
- xo::mr::connchan proc can_be_used (public)
- xo::mr::connchan proc send_to_subscriber (public)
- xo::mr::connchan proc subscribe (public)
- xo::mr::connchan proc sweep (public)
Detailed information
Class ::xo::MessageRelay (public)
::nx::Class ::xo::MessageRelay
Generic Message Relay class
- Testcases:
- No testcase defined.
Object ::xo::mr::bgdelivery (public)
::xo::MessageRelay ::xo::mr::bgdelivery
Message relay based on bgdelivery
Object ::xo::mr::connchan (public)
::xo::MessageRelay ::xo::mr::connchan
Message relay based on ns_connchan
xo::MessageRelay method can_be_used (public)
<instance of xo::MessageRelay> can_be_used
Check, if a message relay can be used in the current configuration.
- Testcases:
- No testcase defined.
xo::MessageRelay method encode_message (public)
<instance of xo::MessageRelay> encode_message mode msg
Provide different "encoding" depending on the mode. Notice that for one chat, multiple clients might have difference modes, since the modes are determined at also by the capabilities of the client browser. So the incoming message has to be recoded multiple times.
- Parameters:
- mode (required)
- msg (required)
- Testcases:
- No testcase defined.
xo::MessageRelay method send_to_subscriber (public)
<instance of xo::MessageRelay> send_to_subscriber key msg
Send a message to a service identified by the key (communication hub).
- Parameters:
- key (required)
- id for an existing communication hub
- msg (required)
- message to be sent
- Testcases:
- No testcase defined.
xo::MessageRelay method subscribe (public)
<instance of xo::MessageRelay> subscribe [ -initmsg initmsg ] \ [ -mode mode ] key
Subscribe to a service identified by a key.
- Switches:
- -initmsg (optional)
- optional message to be sent, when subscription happens
- -mode (optional, defaults to
"default"
)- optional mode
- Parameters:
- key (required)
- unique id for a (potentially new communication hub)
- Testcases:
- No testcase defined.
xo::MessageRelay method sweep (public)
<instance of xo::MessageRelay> sweep key
Check existing subscriptions and clean stale ones.
- Parameters:
- key (required)
- key of the communication hub
- Testcases:
- No testcase defined.
xo::mr::bgdelivery proc can_be_used (public)
xo::mr::bgdelivery can_be_used
To use the bgdelivery serive, we require support from the web server, an installed bgdelivery. This method does not work on HTTPS, since this method writes to the raw sockets.
- Testcases:
- No testcase defined.
xo::mr::bgdelivery proc send_to_subscriber (public)
xo::mr::bgdelivery send_to_subscriber key msg
Send a message to the subscriber via bgdelivery
- Parameters:
- key (required)
- msg (required)
- Testcases:
- No testcase defined.
xo::mr::bgdelivery proc subscribe (public)
xo::mr::bgdelivery subscribe [ -initmsg initmsg ] [ -mode mode ] key
Subscribe to a messaging service using bgdelivery as the low level transport.
- Switches:
- -initmsg (optional)
- -mode (optional, defaults to
"default"
)- Parameters:
- key (required)
- Testcases:
- No testcase defined.
xo::mr::bgdelivery proc sweep (public)
xo::mr::bgdelivery sweep key
Clean up messages for this key. This should handle potentially stale operations.
- Parameters:
- key (required)
- Testcases:
- No testcase defined.
xo::mr::connchan proc can_be_used (public)
xo::mr::connchan can_be_used
ns_connchan can be used on every recent NaviServer.
- Testcases:
- No testcase defined.
xo::mr::connchan proc send_to_subscriber (public)
xo::mr::connchan send_to_subscriber key msg
Write directly to the subscribers from the connection thread via ns_connchan. It would be possible, to perform asynchronous operations via "ns_connchan callback", which would be handled in the background. Not sure, this is necessary.
- Parameters:
- key (required)
- msg (required)
- Testcases:
- No testcase defined.
xo::mr::connchan proc subscribe (public)
xo::mr::connchan subscribe [ -initmsg initmsg ] [ -mode mode ] key
ns_log notice "#### [self] subscribe $key mode $mode" Unplug the connection channel from the current connection thread. The currently unplugged channels can be queried via "ns_connchan list"
- Switches:
- -initmsg (optional)
- -mode (optional)
- Parameters:
- key (required)
- Testcases:
- No testcase defined.
xo::mr::connchan proc sweep (public)
xo::mr::connchan sweep key
For the time being, do nothing. Since the chat is verbose on logins/logouts, write operations will fail, in which case the array is cleaned up. If this is not sufficient, probably a "ns_connchan eof" operation would be useful.
- Parameters:
- key (required)
- Testcases:
- No testcase defined.
Content File Source
::xo::library doc { Generic MessageRelay procs Provide means to publish a subscription key and let clients write to these keys. These functions are used e.g. by the chat. @creation-date 2019-02-23 @author Gustaf Neumann } namespace eval ::xo { nx::Class create ::xo::MessageRelay { # # Generic Message Relay class # :public method subscribe {key {-initmsg ""} {-mode default}} { # # Subscribe to a service identified by a key. # # @param key unique id for a (potentially new communication hub) # @param initmsg optional message to be sent, when subscription happens # @param mode optional mode # } :public method send_to_subscriber {key msg} { # # Send a message to a service identified by the key # (communication hub). # # @param key id for an existing communication hub # @param msg message to be sent # } :public method sweep {key} { # # Check existing subscriptions and clean stale ones. # # @param key key of the communication hub # } :public method can_be_used {} { # # Check, if a message relay can be used in the current # configuration. # return 1 } :method start_of_page {mode} { # # Compose reply header. # if {$mode eq "scripted"} { # # Scripted streaming relies on an infinitely long request, # providing chunks of javascript code conveying the # message. Widely supported e.g. also by Internet Explorer, # but not recommended on modern browsers. # set content_type "text/html;charset=utf-8" set encoding "Cache-Control: no-cache\r\nTransfer-Encoding: chunked\r\n" set body "<html><body>[string repeat { } 1024]\r\n" set body [format %x [string length $body]]\r\n$body\r\n return "HTTP/1.1 200 OK\r\nContent-type: $content_type\r\n$encoding\r\n$body" } else { # # Other modes will use Server Sent Events. # return [append _ \ "HTTP/1.1 200 OK\r\n" \ "Cache-Control: no-cache\r\n" \ "X-Accel-Buffering': no\r\n" \ "Content-type: text/event-stream\r\n" \ "\r\n"] } } :public method encode_message {mode msg} { # # Provide different "encoding" depending on the mode. Notice # that for one chat, multiple clients might have difference # modes, since the modes are determined at also by the # capabilities of the client browser. So the incoming message # has to be recoded multiple times. # set msg [encoding convertto utf-8 $msg] if {$mode eq "scripted"} { #::sec_handler_reset #ns_log notice "SEND data <$msg> encoded <$emsg>" set jsMsg [subst { <script nonce='[::security::csp::nonce]'> window.parent.postMessage($msg); </script> }] set msg [format %x [string length $jsMsg]]\r\n$jsMsg\r\n } else { set msg [string cat {data: } $msg \n\n] } #ns_log notice "#### [self] encode_message <$mode> returns <$msg>" return $msg } } } namespace eval ::xo::mr { # # Create a dummy message relay (which can be always used) # xo::MessageRelay create ::xo::mr::none { # # Dummy message relay, doing nothing. # } # # Message Relay based on bgdelivery. This interface works directly # on the socket and is therefore only useful for plain HTTP # connections. # xo::MessageRelay create ::xo::mr::bgdelivery { # # Message relay based on bgdelivery # :public object method subscribe {key {-initmsg ""} {-mode default} } { # # Subscribe to a messaging service using bgdelivery as the low # level transport. # ns_log notice "#### [self] subscribe <$key> mode <$mode>" set ch [ns_conn channel] thread::transfer [::bgdelivery get_tid] $ch # ::bgdelivery do ::Subscriber sweep $key ::bgdelivery do ::Subscriber new \ -channel $ch -key $key \ -user_id [ad_conn user_id] -mode $mode \ -start_of_page [:start_of_page $mode] } :public object method send_to_subscriber {key msg} { # # Send a message to the subscriber via bgdelivery # ns_log notice "#### [self] send_to_subscriber $key $msg" ::bgdelivery do -async ::Subscriber broadcast $key $msg } :public object method can_be_used {} { # # To use the bgdelivery serive, we require support from the web # server, an installed bgdelivery. This method does not work on # HTTPS, since this method writes to the raw sockets. # return [expr { [info commands ::thread::mutex] ne "" && [info commands ::bgdelivery] ne "" && (![ns_conn isconnected] || ![security::secure_conn_p]) }] } :public object method sweep {key} { # # Clean up messages for this key. This should handle potentially # stale operations. # ::bgdelivery do ::Subscriber sweep $key } } # # Message Relay based on ns_connchan. This interface works on the # full connection structure and can therefore be used for HTTP and # HTTPS connections. # xo::MessageRelay create ::xo::mr::connchan { # # Message relay based on ns_connchan # :object method cleanup {key handle} { catch {ns_connchan close $handle} catch {nsv_unset mr_connchan_$key $handle} } :public object method subscribe {key {-initmsg ""} {-mode ""} } { #ns_log notice "#### [self] subscribe $key mode $mode" # # Unplug the connection channel from the current connection # thread. The currently unplugged channels can be queried via # "ns_connchan list" # set handle [ns_connchan detach] # # should check and append # if {![nsv_exists mr_connchan_$key $handle]} { nsv_set mr_connchan_$key $handle $mode try { ns_connchan write $handle [:start_of_page $mode] } on error {errorMsg} { ns_log warning "message relay: write on <$key> failed: $errorMsg" :cleanup $key $handle } } else { ns_log warning "message relay: duplicate registration for <$key> attempted" } #::bgdelivery do ::Subscriber new \ # -channel $ch -key $key \ # -user_id [ad_conn user_id] -mode $mode } :public object method send_to_subscriber {key msg} { # # Write directly to the subscribers from the connection thread # via ns_connchan. It would be possible, to perform asynchronous # operations via "ns_connchan callback", which would be handled # in the background. Not sure, this is necessary. # #ns_log notice "#### [self] send_to_subscriber <[nsv_array names mr_connchan_$key]>" foreach handle [nsv_array names mr_connchan_$key] { try { set mode [nsv_get mr_connchan_$key $handle] ns_connchan write $handle [:encode_message $mode $msg] } on error {errorMsg} { ns_log warning "message relay: duplicate registration for <$key> attempted" :cleanup $key $handle } } } :public object method can_be_used {} { # # ns_connchan can be used on every recent NaviServer. # return [expr {[info commands ::ns_connchan] ne ""}] } :public object method sweep {key} { # # For the time being, do nothing. Since the chat is verbose on # logins/logouts, write operations will fail, in which case the # array is cleaned up. If this is not sufficient, probably a # "ns_connchan eof" operation would be useful. # } } } ::xo::library source_dependent # # Local variables: # mode: tcl # tcl-indent-level: 2 # indent-tabs-mode: nil # End: