15 from concurrent.futures
import ThreadPoolExecutor
18 from typing
import Iterator
29 phone_number: str) ->
None:
43 response_iterator: Iterator[phone_pb2.StreamCallResponse]) ->
None:
45 for response
in response_iterator:
49 if response.HasField(
"call_info"):
51 elif response.HasField(
"call_state"):
55 "Received StreamCallResponse without call_info and call_state"
57 except Exception
as e:
66 logging.info(
"Call toward [%s] enters [%s] state", self.
_phone_number,
67 phone_pb2.CallState.State.Name(call_state))
69 if call_state == phone_pb2.CallState.State.ACTIVE:
71 if call_state == phone_pb2.CallState.State.ENDED:
78 response_iterator = self.
_stub.StreamCall(
iter((request,)))
84 logging.info(
"Waiting for peer to connect [%s]...", self.
_phone_number)
89 return self.
_call_state == phone_pb2.CallState.State.ACTIVE
99 phone_number: str) ->
None:
100 call_maker =
CallMaker(executor, channel, phone_number)
102 if call_maker.wait_peer():
103 call_maker.audio_session()
104 logging.info(
"Call finished!")
106 logging.info(
"Call failed: peer didn't answer")
110 executor = ThreadPoolExecutor()
112 future = executor.submit(process_call, executor, channel,
117 if __name__ ==
'__main__':
118 logging.basicConfig(level=logging.INFO)