63 lines
1.5 KiB
Ruby
63 lines
1.5 KiB
Ruby
|
|
class Voice::Provider::Twilio::TokenService
|
||
|
|
pattr_initialize [:inbox!, :user!, :account!]
|
||
|
|
|
||
|
|
def generate
|
||
|
|
{
|
||
|
|
token: access_token.to_jwt,
|
||
|
|
identity: identity,
|
||
|
|
voice_enabled: true,
|
||
|
|
account_sid: config['account_sid'],
|
||
|
|
agent_id: user.id,
|
||
|
|
account_id: account.id,
|
||
|
|
inbox_id: inbox.id,
|
||
|
|
phone_number: inbox.channel.phone_number,
|
||
|
|
twiml_endpoint: twiml_url,
|
||
|
|
has_twiml_app: config['twiml_app_sid'].present?
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
private
|
||
|
|
|
||
|
|
def config
|
||
|
|
@config ||= inbox.channel.provider_config_hash || {}
|
||
|
|
end
|
||
|
|
|
||
|
|
def identity
|
||
|
|
@identity ||= "agent-#{user.id}-account-#{account.id}"
|
||
|
|
end
|
||
|
|
|
||
|
|
def access_token
|
||
|
|
Twilio::JWT::AccessToken.new(
|
||
|
|
config['account_sid'],
|
||
|
|
config['api_key_sid'],
|
||
|
|
config['api_key_secret'],
|
||
|
|
identity: identity,
|
||
|
|
ttl: 1.hour.to_i
|
||
|
|
).tap { |token| token.add_grant(voice_grant) }
|
||
|
|
end
|
||
|
|
|
||
|
|
def voice_grant
|
||
|
|
Twilio::JWT::AccessToken::VoiceGrant.new.tap do |grant|
|
||
|
|
grant.incoming_allow = true
|
||
|
|
grant.outgoing_application_sid = config['twiml_app_sid']
|
||
|
|
grant.outgoing_application_params = outgoing_params
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def outgoing_params
|
||
|
|
{
|
||
|
|
account_id: account.id,
|
||
|
|
agent_id: user.id,
|
||
|
|
identity: identity,
|
||
|
|
client_name: identity,
|
||
|
|
accountSid: config['account_sid'],
|
||
|
|
is_agent: 'true'
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
def twiml_url
|
||
|
|
digits = inbox.channel.phone_number.delete_prefix('+')
|
||
|
|
Rails.application.routes.url_helpers.twilio_voice_call_url(phone: digits)
|
||
|
|
end
|
||
|
|
end
|