genesyscloud/genesyscloud-audiohook/audiohook.py (58 lines of code) (raw):

# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Module for Audiohook protocol message exchange """ import logging DEFAULT_CONVERSATION_ID = "00000000-0000-0000-0000-000000000000" AUDIOHOOK_VERSION = "2" class AudioHook: """Audiohook protocol implementation Reference: https://developer.genesys.cloud/devapps/audiohook/session-walkthrough#establishing-connection ` The server and client each maintain a monotonically increasing message sequence number to determine the which message the party has already seen and which is still in flight ` Returns: _type_: Audiohook type definition based on the protocol definition """ def __init__(self): self.pre_server_sequence = 0 self.pre_client_sequence = 0 self.server_sequence = 0 self.client_sequence = 0 self.session_id = 0 self.first_resume = True def create_opened_message(self): """On receiving the "open" message, the server picks the audio format and respond with an "opened" message """ opened_message = self.create_message_by_type( message_type="opened") opened_message["parameters"] = { "startPaused": True, "media": [ { "type": "audio", "format": "PCMU", "channels": ["external", "internal"], "rate": 8000, } ], } logging.debug("Get opened message %s", opened_message) return opened_message def create_resume_message(self): """The resume message send back to Genesys Audiohook client When the server is ready to process the Audio. """ resume_message = self.create_message_by_type( message_type="resume") logging.debug("send resume messages to the client %s", resume_message) return resume_message def create_close_message(self): """The server must respond the client a "closed" message response to indicate the Genesys Audiohook client it is done. And the client then close the TLS connection """ return self.create_message_by_type( message_type="closed") def create_pong_message(self): """Once receive a "ping" message from the Audiohook client, the server must respond with a "pong" message to keep the connection alive """ pong_message = self.create_message_by_type( message_type="pong") logging.debug("send pong messages to the client %s", pong_message) return pong_message def set_session_id(self, session_id: str): """Set function for session id Args: session_id (str): Unique identifier of the streaming session as a UUID string """ self.session_id = session_id def set_client_sequence(self, client_sequence): """Keep the sequence from Audio connector Args: client_sequence (int): _description_ """ self.client_sequence = client_sequence def create_message_by_type( self, message_type: str, ): """Create standard message format required by the Audiohook protocol """ self.pre_server_sequence = self.server_sequence self.server_sequence += 1 return { "version": AUDIOHOOK_VERSION, "type": message_type, "seq": self.server_sequence, "clientseq": self.client_sequence, "id": self.session_id, "parameters": {}, }