@codebucket/whatsapp
Version:
A reusable WhatsApp Business API client with template and non-template support, webhook handling, pluggable storage, and text sanitization
100 lines (99 loc) • 2.53 kB
TypeScript
export type Variables = string[] | Record<string, string>;
export interface ComponentDef {
type: 'HEADER' | 'BODY' | 'BUTTON' | string;
format?: 'TEXT' | 'IMAGE' | 'DOCUMENT' | 'VIDEO' | 'AUDIO';
text?: string;
sub_type?: string;
index?: number;
}
export declare enum Mode {
NUMERIC = "numeric",
NAMED = "named",
NONE = "none"
}
/**
* You can now pass either:
* 1) A positional array (old style)
* 2) A structured object for mixed media+named+buttons:
* {
* header?: string, // URL or media ID
* body?: Record<placeholder,string>,// named placeholders
* buttons?: string[] // button texts/URLs by index
* }
*/
export type TemplateVariables = string[] | {
header?: string;
body?: Record<string, string>;
buttons?: string[];
};
export interface TemplateDef {
name: string;
language: string;
components: ComponentDef[];
}
export interface SendMessageOptions {
senderUserId: string;
senderPhoneNumber: string;
accessToken: string;
to: string;
messagePayload: any;
}
export interface WebhookMessage {
id: string;
from: string;
to: string;
timestamp: number;
text?: {
body: string;
};
image?: {
id?: string;
mime_type?: string;
sha256?: string;
};
document?: {
id?: string;
filename?: string;
mime_type?: string;
};
video?: {
id?: string;
mime_type?: string;
};
audio?: {
id?: string;
mime_type?: string;
};
}
export interface WebhookStatus {
id: string;
status: string;
timestamp: number;
[key: string]: any;
}
export interface WebhookEntryChangeValue {
messaging_product: 'whatsapp';
metadata: {
phone_number_id: string;
display_phone_number: string;
};
messages?: WebhookMessage[];
statuses?: WebhookStatus[];
}
export interface WebhookEntryChange {
field: string;
value: WebhookEntryChangeValue;
}
export interface WebhookEntry {
id: string;
changes: WebhookEntryChange[];
}
export interface WebhookPayload {
object: 'whatsapp_business_account';
entry: WebhookEntry[];
}
export interface MessageStore {
saveIncomingMessage(accountId: string, msg: WebhookMessage): Promise<void>;
saveOutgoingMessage(accountId: string, opts: SendMessageOptions, response: any): Promise<void>;
saveMessageStatus?(accountId: string, status: WebhookStatus): Promise<void>;
}