<class
    name = "zgossip"
    title = "zgossip server"
    script = "zproto_server_c"
    protocol_class = "zgossip_msg"
    project_header = "../include/czmq.h"
    export_macro = "CZMQ_EXPORT"
    >
    This is a server implementation of the ZeroMQ Gossip Discovery Protocol
    <include filename = "../license.xml" />

    <state name = "start" inherit = "external">
        <!-- Peer says HELLO and we send it all known tuples -->
        <event name = "HELLO" next = "have tuple">
            <action name = "get first tuple" />
        </event>
    </state>

    <state name = "have tuple">
        <event name = "ok">
            <action name = "send" message = "PUBLISH" />
            <action name = "get next tuple" />
        </event>
        <event name = "finished" next = "connected" />
    </state>

    <state name = "connected" inherit = "external">
        <!-- Peer publishes a new tuple -->
        <event name = "PUBLISH">
            <action name = "store tuple if new" />
        </event>
        <!-- Forward a new tuple to this client -->
        <event name = "forward">
            <action name = "get tuple to forward" />
            <action name = "send" message = "PUBLISH" />
        </event>
    </state>

    <!-- Superstate for external states -->
    <state name = "external">
        <!-- Peer signals it's alive -->
        <event name = "PING">
            <action name = "send" message = "PONG" />
        </event>

        <!-- All other protocol messages are invalid -->
        <event name = "*">
            <action name = "send" message = "INVALID" />
            <action name = "terminate" />
        </event>

        <!-- This built-in event hits on a client timeout -->
        <event name = "expired">
            <action name = "terminate" />
        </event>
    </state>
</class>
