def test_all(self): z1 = Zyre(b't1') z2 = Zyre(b't2') z1.set_header(b'test_header', b'test1') z2.set_header(b'test_header', b'test2') self.assertEquals(z1.start(), 0) self.assertEquals(z2.start(), 0) e = ZyreEvent(z1) self.assertEquals(e.peer_name(), z2.name()) self.assertEquals(e.peer_uuid(), z2.uuid()) self.assertEquals(e.type(), b'ENTER') e = ZyreEvent(z2) self.assertEquals(e.peer_name(), z1.name()) self.assertEquals(e.peer_uuid(), z1.uuid()) self.assertEquals(e.type(), b'ENTER') z1.join(b'test group') z2.join(b'test group') e = ZyreEvent(z1) self.assertEquals(e.peer_name(), z2.name()) self.assertEquals(e.peer_uuid(), z2.uuid()) self.assertEquals(e.type(), b'JOIN') self.assertEquals(e.group(), b'test group') e = ZyreEvent(z2) self.assertEquals(e.peer_name(), z1.name()) self.assertEquals(e.peer_uuid(), z1.uuid()) self.assertEquals(e.type(), b'JOIN') self.assertEquals(e.group(), b'test group') z1.shouts(b'test group', b"Hello World") e = ZyreEvent(z2) self.assertEquals(e.peer_name(), z1.name()) self.assertEquals(e.peer_uuid(), z1.uuid()) self.assertEquals(e.type(), b'SHOUT') self.assertEquals(e.group(), b'test group') self.assertEquals(e.msg().popstr(), b"Hello World")
def test_all(self): z1 = Zyre('t1') z2 = Zyre('t2') z1.set_header('test_header', 'test1') z2.set_header('test_header', 'test2') self.assertEquals(z1.start(), 0) self.assertEquals(z2.start(), 0) e = ZyreEvent(z1) self.assertEquals(e.name(), z2.name()) self.assertEquals(e.sender(), z2.uuid()) self.assertEquals(e.type(), 'enter') e = ZyreEvent(z2) self.assertEquals(e.name(), z1.name()) self.assertEquals(e.sender(), z1.uuid()) self.assertEquals(e.type(), 'enter') z1.join('test group') z2.join('test group') e = ZyreEvent(z1) self.assertEquals(e.name(), z2.name()) self.assertEquals(e.sender(), z2.uuid()) self.assertEquals(e.type(), 'join') self.assertEquals(e.group(), 'test group') e = ZyreEvent(z2) self.assertEquals(e.name(), z1.name()) self.assertEquals(e.sender(), z1.uuid()) self.assertEquals(e.type(), 'join') self.assertEquals(e.group(), 'test group') z1.shouts('test group', "Hello World") e = ZyreEvent(z2) self.assertEquals(e.name(), z1.name()) self.assertEquals(e.sender(), z1.uuid()) self.assertEquals(e.type(), 'shout') self.assertEquals(e.group(), 'test group') self.assertEquals(e.msg().popstr(), "Hello World")
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
def actor_fn(self, pipe, netiface): # Internal internal_pipe = Zsock(pipe, False) # We don't own the pipe, so False. # Poller poller = Zpoller(self.zyre.socket(), internal_pipe, self.publisher, self.timereply, None) # RUN self.interface.log('Node started') internal_pipe.signal(0) while True: sock = poller.wait(500) if not sock: continue # # ZYRE receive # if sock == self.zyre.socket(): e = ZyreEvent(self.zyre) uuid = e.peer_uuid() # self.interface.log("ZYREmsg", uuid, e.peer_name().decode(), e.type().decode()) # ENTER: add to book for external contact (i.e. TimeSync) if e.type() == b"ENTER": newpeer = Peer(self, e) existing = None if uuid in self.book: # print ('UUID already exist: replacing') ## PROBLEM : Same name may appear with different uuid (not a real problem, only if crash and restart with new uuid in a short time..) self.book[uuid].stop() existing = uuid for p in self.book.values(): if p.name == newpeer.name: # print ('Name already exist: replacing') p.stop() existing = p.uuid if existing: del self.book[existing] self.book[uuid] = newpeer self.book[uuid].subscribe(self.topics) # EVASIVE elif e.type() == b"EVASIVE": # if uuid in self.book: # self.book[uuid].linker(2) pass # SILENT elif e.type() == b"SILENT": if uuid in self.book: self.book[uuid].linker(1) # EXIT elif e.type() == b"EXIT": if uuid in self.book: self.book[uuid].linker(0) self.book[uuid].stop() del self.book[uuid] # JOIN elif e.type() == b"JOIN": # self.interface.log("peer join a group..", e.peer_name(), e.group().decode()) # SYNC clocks if e.group() == b"sync": if self.peer(uuid): self.peer(uuid).sync() # LEAVE elif e.type() == b"LEAVE": # self.interface.log("peer left a group..") pass # SHOUT -> process event elif e.type() == b"SHOUT" or e.type() == b"WHISPER": # Parsing message data = json.loads(e.msg().popstr().decode()) data['from'] = uuid # add group if e.type() == b"SHOUT": data['group'] = e.group().decode() else: data['group'] = 'whisper' self.preProcessor1(data) # # PUBLISHER event # elif sock == self.publisher: msg = Zmsg.recv(self.publisher) if not msg: break topic = msg.popstr() # Somebody subscribed: push Last Value Cache ! if len(topic) > 0 and topic[0] == 1: topic = topic[1:] if topic in self.pub_cache: # self.interface.log('XPUB lvc send for', topic.decode()) msg = Zmsg.dup(self.pub_cache[topic]) Zmsg.send(msg, self.publisher) # else: # self.interface.log('XPUB lvc empty for', topic.decode()) # # TIMESERVER event # elif sock == self.timereply: msgin = Zmsg.recv(self.timereply) msg = Zmsg() msg.addstr(str(int(time.time() * PRECISION)).encode()) Zmsg.send(msg, self.timereply) # # INTERNAL commands # elif sock == internal_pipe: msg = Zmsg.recv(internal_pipe) if not msg or msg.popstr() == b"$TERM": # print('ZYRE Node TERM') break internal_pipe.__del__() self.interface.log(' - node stopped' ) # WEIRD: print helps the closing going smoothly.. self.done = True