Files
protocol/sip/phonenumber.go
2025-10-08 18:14:18 +05:30

58 lines
1.7 KiB
Go

package sip
import (
"github.com/livekit/protocol/livekit"
"github.com/nyaruka/phonenumbers"
)
// ExtractAreaCode extracts the area code from a phone number using the phonenumbers library
func ExtractAreaCode(phoneNumber string) string {
// Parse the phone number without defaulting to any country
num, err := phonenumbers.Parse(phoneNumber, "")
if err != nil {
// If parsing fails, fall back to empty string
return ""
}
// Get the country code
countryCode := phonenumbers.GetRegionCodeForNumber(num)
// Only handle US numbers for now
if countryCode != "US" {
return ""
}
// Get the national number and extract first 3 digits (area code for US)
nationalNumber := phonenumbers.GetNationalSignificantNumber(num)
if len(nationalNumber) < 3 {
return ""
}
return nationalNumber[:3]
}
// DetermineNumberType determines the phone number type using the phonenumbers library
func DetermineNumberType(phoneNumber string) livekit.PhoneNumberType {
// Parse the phone number without defaulting to any country
num, err := phonenumbers.Parse(phoneNumber, "")
if err != nil {
// If parsing fails, fall back to unknown
return livekit.PhoneNumberType_PHONE_NUMBER_TYPE_UNKNOWN
}
numberType := phonenumbers.GetNumberType(num)
// We are excluding a bunch of number types for now
switch numberType {
case phonenumbers.MOBILE:
return livekit.PhoneNumberType_PHONE_NUMBER_TYPE_MOBILE
case phonenumbers.FIXED_LINE:
return livekit.PhoneNumberType_PHONE_NUMBER_TYPE_LOCAL
case phonenumbers.FIXED_LINE_OR_MOBILE:
return livekit.PhoneNumberType_PHONE_NUMBER_TYPE_LOCAL
case phonenumbers.TOLL_FREE:
return livekit.PhoneNumberType_PHONE_NUMBER_TYPE_TOLL_FREE
default:
return livekit.PhoneNumberType_PHONE_NUMBER_TYPE_UNKNOWN
}
}