import { twilioRequest } from './client.ts'
import {
asRecord,
boundedPageSize,
inputRecord,
optionalString,
stringField,
type TwilioAuthOptions,
} from './validation.ts'
export type IncomingNumber = {
sid: string | null
phoneNumber: string | null
friendlyName: string | null
status: string | null
capabilities: {
voice: boolean
sms: boolean
mms: boolean
fax: boolean
}
dateCreated: string | null
}
function summarizeNumber(value: unknown): IncomingNumber {
const record = asRecord(value)
const capabilities = asRecord(record.capabilities)
return {
sid: stringField(record, 'sid'),
phoneNumber: stringField(record, 'phone_number'),
friendlyName: stringField(record, 'friendly_name'),
status: stringField(record, 'status'),
capabilities: {
voice: capabilities.voice === true,
sms: capabilities.sms === true,
mms: capabilities.mms === true,
fax: capabilities.fax === true,
},
dateCreated: stringField(record, 'date_created'),
}
}
/** List incoming phone numbers on the authenticated Twilio account. */
export async function listIncomingNumbers(
params: TwilioAuthOptions & {
pageSize?: number
pageUri?: string
phoneNumber?: string
friendlyName?: string
} = {},
) {
const input = inputRecord(params)
const raw = await twilioRequest({
...input,
resource: '/IncomingPhoneNumbers.json',
href: optionalString(input, 'pageUri'),
method: 'GET',
query: optionalString(input, 'pageUri')
? {}
: {
PageSize: boundedPageSize(input.pageSize),
PhoneNumber: optionalString(input, 'phoneNumber'),
FriendlyName: optionalString(input, 'friendlyName'),
},
})
const items = Array.isArray(raw.incoming_phone_numbers)
? raw.incoming_phone_numbers.map(summarizeNumber)
: []
return {
ok: true,
items,
nextPageUri: stringField(raw, 'next_page_uri'),
}
}
export default listIncomingNumbers