Esempio n. 1
0
    def actor_fn(self, pipe, arg):
        internal_pipe = Zsock(pipe, False) # We don't own the pipe, so False.
        arg = string_at(arg)

        global port

        zyre_node = Zyre(None)
        zyre_node.set_header (b"TS-PORT", str(port).encode());
        zyre_node.start()
        zyre_node.join(b"broadcast")
        zyre_node.join(b"sync")
        zyre_pipe = zyre_node.socket()

        poller = Zpoller(zyre_pipe, internal_pipe)

        internal_pipe.signal(0)

        print('ZYRE Node started')
        terminated = False
        while not terminated:
            # time.sleep(1)
            # sock = poller.wait(1000)
            # if not sock:
            #     continue
            #
            #
            # ZYRE receive
            #
            # if sock == zyre_pipe:
                e = ZyreEvent(zyre_node)

                # ANY
                if e.type() != b"EVASIVE":
                    e.print()
                    pass

                # ENTER: add to phonebook for external contact (i.e. TimeSync)
                if e.type() == b"ENTER":
                    self.timebook.newpeer(e.peer_uuid(), e.peer_addr(), e.header(b"TS-PORT"))

                # EXIT
                elif e.type() == b"EXIT":
                    print( "ZYRE Node: peer is gone..")

                # JOIN
                elif e.type() == b"JOIN":

                    # SYNC clocks
                    if e.group() == b"sync":
                        pass
                        self.timebook.sync(e.peer_uuid())

                # LEAVE
                elif e.type() == b"LEAVE":
                    print("ZYRE Node: peer left a group..")

                # SHOUT -> process event
                elif e.type() == b"SHOUT" or e.type() == b"WHISPER":

                    # Parsing message
                    data = json.loads(e.msg().popstr().decode())
                    data['from'] = e.peer_uuid()

                    # add group
                    if e.type() == b"SHOUT": data['group'] = e.group().decode()
                    else: data['group'] = 'whisper'

                    self.eventProc(data)
            #
            #
            # #
            # # INTERNAL commands
            # #
            # elif sock == internal_pipe:
            #     msg = Zmsg.recv(internal_pipe)
            #     if not msg: break
            #
            #     command = msg.popstr()
            #     if command == b"$TERM":
            #         print('ZYRE Node TERM')
            #         break
            #
            #     elif command == b"JOIN":
            #         group = msg.popstr()
            #         zyre_node.join(group)
            #
            #     elif command == b"LEAVE":
            #         group = msg.popstr()
            #         zyre_node.leave(group)
            #
            #     elif command == b"SHOUT":
            #         group = msg.popstr()
            #         data = msg.popstr()
            #         zyre_node.shouts(group, data)
            #
            #         # if own group -> send to self too !
            #         groups = zlist_strlist( zyre_node.own_groups() )
            #         if group.decode() in groups:
            #             data = json.loads(data.decode())
            #             data['from'] = 'self'
            #             data['group'] = group.decode()
            #             self.eventProc(data)


        # zyre_node.stop()  # HANGS !
        internal_pipe.__del__()
        zyre_node.__del__()
        print('ZYRE Node stopped')   # WEIRD: print helps the closing going smoothly..
        self.done = True