Skip to content

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

Package listing

@kody/twilio

src/messages.ts

76 lines · 1.8 KB · TypeScript
import { twilioRequest } from './client.ts'
import {
	asRecord,
	boundedPageSize,
	inputRecord,
	optionalE164,
	optionalString,
	stringField,
	type TwilioAuthOptions,
} from './validation.ts'

export type MessageLog = {
	sid: string | null
	from: string | null
	to: string | null
	body: string | null
	status: string | null
	direction: string | null
	dateSent: string | null
	errorCode: number | null
	errorMessage: string | null
	numMedia: string | null
}

function summarizeMessage(value: unknown): MessageLog {
	const record = asRecord(value)
	return {
		sid: stringField(record, 'sid'),
		from: stringField(record, 'from'),
		to: stringField(record, 'to'),
		body: stringField(record, 'body'),
		status: stringField(record, 'status'),
		direction: stringField(record, 'direction'),
		dateSent: stringField(record, 'date_sent'),
		errorCode: typeof record.error_code === 'number' ? record.error_code : null,
		errorMessage: stringField(record, 'error_message'),
		numMedia: stringField(record, 'num_media'),
	}
}

/** List recent SMS/MMS logs on the authenticated Twilio account. */
export async function listMessages(
	params: TwilioAuthOptions & {
		pageSize?: number
		pageUri?: string
		to?: string
		from?: string
		dateSent?: string
	} = {},
) {
	const input = inputRecord(params)
	const raw = await twilioRequest({
		...input,
		resource: '/Messages.json',
		href: optionalString(input, 'pageUri'),
		method: 'GET',
		query: optionalString(input, 'pageUri')
			? {}
			: {
					PageSize: boundedPageSize(input.pageSize),
					To: optionalE164(input, 'to'),
					From: optionalE164(input, 'from'),
					DateSent: optionalString(input, 'dateSent'),
				},
	})
	const items = Array.isArray(raw.messages)
		? raw.messages.map(summarizeMessage)
		: []
	return {
		ok: true,
		items,
		nextPageUri: stringField(raw, 'next_page_uri'),
	}
}

export default listMessages