Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/twilio

src/incoming-numbers.ts

76 lines · 1.8 KB · TypeScript
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