Skip to content

Referensi API Message Builders

leaves-guardian menyediakan rangkaian terpadu berisi 12 Message Builders berorientasi objek yang dibangun di atas abstract base class bersama (BaseBuilder). Dokumen ini berfungsi sebagai referensi API formal yang menetapkan hierarki inheritance, signature method, tipe parameter, nilai kembalian, aturan interpolasi template, perilaku serialisasi Baileys, serta error validasi umum.


1. Model Arsitektur & Pewarisan BaseBuilder

Seluruh 12 message builders mewarisi BaseBuilder (baik secara langsung maupun transitif, seperti CanvasMessage yang memperluas AIRichMessage).

mermaid
classDiagram
    class BaseBuilder {
        <<Abstract Base>>
        +resolveSocket(client)$
        +setTitle(title)
        +setBody(body)
        +setFooter(footer)
        +setContextInfo(obj)
        +setAdReply(opts)
        +setChannelForward(opts)
        +mention(jids)
        +quote(quotedMsg)
        +setVars(vars)
    }

    BaseBuilder <|-- TextMessage
    BaseBuilder <|-- ButtonMessage
    BaseBuilder <|-- ListMessage
    BaseBuilder <|-- CarouselMessage
    BaseBuilder <|-- MediaMessage
    BaseBuilder <|-- StickerMessage
    BaseBuilder <|-- ProductMessage
    BaseBuilder <|-- PollMessage
    BaseBuilder <|-- AIRichMessage
    BaseBuilder <|-- EventMessage
    BaseBuilder <|-- RichMessage
    AIRichMessage <|-- CanvasMessage

Kontrak Resolusi Socket

Setiap message builder membutuhkan instance socket atau client pada konstruktornya.

js
import { ButtonMessage, LeavesClient } from 'leaves-guardian';

// Menggunakan LeavesClient
const client = new LeavesClient({ /* ... */ });
const btn = new ButtonMessage(client);

// BaseBuilder secara internal menyelesaikan socket aktif:
// BaseBuilder.resolveSocket(client)
  • BaseBuilder.resolveSocket(client): Menyelesaikan underlying socket dari input client/socket yang didukung (misalnya memanggil client.getRawSocket() jika instance LeavesClient diberikan, atau memakai objek socket langsung). Melempar Error('Socket Baileys wajib di-pass ke constructor') jika parameter bernilai nullish.

Konvensi Fluent Chaining

Method mutasi pada builder umumnya mendukung fluent chaining dan mengembalikan instance builder (this) kecuali ditentukan lain (seperti factory method CarouselMessage.prototype.newCard(), static helper, atau method pengiriman asynchronous seperti send()).


2. Shared BaseBuilder Methods API

Method berikut diwarisi oleh seluruh builder konkret:

MethodSignatureParameter & TipeNilai KembalianDeskripsi
setTitle(title: string)title: stringthisMenetapkan string judul/header utama.
setBody(body: string)body: stringthisMenetapkan teks badan utama pesan.
setFooter(footer: string)footer: stringthisMenetapkan teks footer kecil di bagian bawah.
setContextInfo(obj: object)obj: Record<string, any>thisMenggabungkan field contextInfo Baileys kustom.
setAdReply(opts: object)opts: AdReplyOptionsthisMenempelkan metadata pratinjau tautan interaktif (externalAdReply).
setChannelForward(opts: object)opts: ChannelForwardOptionsthisMengonfigurasi metadata header terusan saluran/newsletter.
mention(jids: string | string[])jids: string | string[]thisMenambahkan JID ke dalam mentionedJid context info.
quote(quotedMsg: object)quotedMsg: WAMessage | objectthisMenempelkan pesan yang dikutip untuk konteks balasan (quote).
setVars(vars: object)vars: Record<string, any>thisMenetapkan kamus variabel untuk interpolasi template .

Mesin Interpolasi Template

Seluruh teks yang dirender melalui BaseBuilder mendukung placeholder . Ketika setVars({ nama: 'Rafa' }) disetel:

  • Placeholder digantikan dengan representasi string dari Rafa.
  • Placeholder yang tidak memiliki pasangan tetap dibiarkan sebagai teks literal (misalnya tetap menjadi ).
  • Interpolasi dieksekusi secara lazy saat build() atau send() dipanggil.

3. Katalog Spesifikasi Builder

3.1 TextMessage

Builder pesan teks biasa dengan kontrol link preview dan metadata konteks.

  • Impor: import { TextMessage } from 'leaves-guardian';
  • Konstruktor: new TextMessage(client)
MethodSignatureNilai KembalianDeskripsi
disableLinkPreview()thisMenonaktifkan pratinjau URL otomatis (linkPreview = false).
build()objectMengembalikan objek Baileys { text, mentions, linkPreview, contextInfo }.
sendasync (jid: string, options?: object)Promise<WAMessage>Memvalidasi isi teks dan mengirim pesan via client.sendMessage.

3.2 ButtonMessage

Pesan tombol interaktif dengan quick reply, tautan URL CTA, tombol salin teks CTA, banner promosi, dan header media opsional.

  • Impor: import { ButtonMessage } from 'leaves-guardian';
  • Konstruktor: new ButtonMessage(client)
MethodSignatureNilai KembalianDeskripsi
addReply(displayText: string, id: string)thisMenambahkan tombol aksi balasan cepat (quick_reply).
addUrl(displayText: string, url: string)thisMenambahkan tombol tautan web eksternal (cta_url).
addCopy(displayText: string, copyCode: string)thisMenambahkan tombol salin kode clipboard 1-ketukan (cta_copy).
addLimitedOffer(displayText: string, opts?: object)thisMenambahkan tombol penawaran terbatas dengan badge/countdown.
setBanner(bannerText: string, opts?: object)thisAlias untuk mengatur teks banner promosi.
setImage(source: string | Buffer)thisMenempelkan header gambar (URL, path file, atau Buffer).
setVideo(source: string | Buffer)thisMenempelkan header video.
setDocument(source: string | Buffer, options?: object)thisMenempelkan header dokumen dengan opsi fileName dan mimetype.
buildasync ()Promise<object>Menyiapkan lampiran media dan membangun payload interaktif Native Flow.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim pesan Native Flow terbungkus viewOnceMessage dengan node biz.

3.3 ListMessage

Menu pilihan interaktif yang mendukung pembagian seksi berkategori dan baris pilihan tunggal.

  • Impor: import { ListMessage } from 'leaves-guardian';
  • Konstruktor: new ListMessage(client)
MethodSignatureNilai KembalianDeskripsi
setButtonText(text: string)thisMengatur label tombol pembuka menu (default: 'Pilih').
addSection(sectionTitle: string, rows: ListRow[])thisMenambahkan seksi berisi baris { id, title, description?, header? }.
findRow(id: string)ListRowMencari baris berdasarkan ID; melempar ItemNotFoundError jika tidak ada.
buildasync ()Promise<object>Memvalidasi seksi dan merakit payload Native Flow single_select.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim pesan interaktif single_select dengan node biz.

3.4 CarouselMessage

Slider kartu geser horizontal multi-kartu. Setiap kartu memiliki media header, judul, badan teks, footer, dan tombolnya sendiri.

  • Impor: import { CarouselMessage } from 'leaves-guardian';
  • Konstruktor: new CarouselMessage(client)
MethodSignatureNilai KembalianDeskripsi
addCard(cardOrFn: ((card: CarouselCard) => void) | CarouselCard)thisMenambahkan kartu lewat callback fungsi builder atau instance kartu.
newCard(id: string)CarouselCardMembuat dan mengembalikan instance CarouselCard baru terdaftar pada id.
buildasync ()Promise<object>Memvalidasi minimal 2 kartu, mengunggah media kartu, dan merakit payload.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim pesan carousel interaktif dengan node biz.

Method CarouselCard

MethodSignatureNilai KembalianDeskripsi
setTitle(title: string)thisMengatur judul kartu.
setBody(body: string)thisMengatur badan teks kartu.
setFooter(footer: string)thisMengatur footer kartu.
setImage(source: string | Buffer)thisMengatur gambar kartu.
addReply(displayText: string, id: string)thisMenambahkan tombol quick reply pada kartu.
addUrl(displayText: string, url: string)thisMenambahkan tombol URL pada kartu.
addCopy(displayText: string, copyCode: string)thisMenambahkan tombol salin kode pada kartu.

3.5 MediaMessage

Builder media terpadu untuk payload gambar, video, dokumen, audio, dan stiker.

  • Impor: import { MediaMessage } from 'leaves-guardian';
  • Konstruktor: new MediaMessage(client, type = 'image')
MethodSignatureNilai KembalianDeskripsi
setType(type: 'image' | 'video' | 'document' | 'sticker' | 'audio')thisMemperbarui tipe media. Divalidasi terhadap tipe yang didukung.
setSource(source: string | Buffer)thisMenyetel sumber media (URL HTTP, path file lokal, atau Buffer).
setFileName(name: string)thisMenyetel nama file dokumen (wajib untuk type === 'document').
setMimetype(mimetype: string)thisMenyetel MIME type eksplisit (cth: application/pdf, audio/ogg).
asVoiceNote()thisMenyetel ptt = true (hanya berlaku untuk type === 'audio').
asGif()thisMenyetel gifPlayback = true (hanya berlaku untuk type === 'video').
buildasync ()Promise<object>Menyelesaikan sumber media dan merakit payload pesan media Baileys.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim pesan media via client.sendMessage.

3.6 StickerMessage

Generator stiker WebP dengan konversi otomatis canvas 512x512 dan penyematan metadata EXIF pack & author.

  • Impor: import { StickerMessage } from 'leaves-guardian';
  • Konstruktor: new StickerMessage(client)
Method / HelperSignatureNilai KembalianDeskripsi
setSource(source: string | Buffer)thisMenyetel sumber stiker (URL, path file, Buffer, base64).
setPackName(name: string)thisMenyetel nama pack stiker pada EXIF (default: 'Leaves Guardian').
setAuthor(author: string)thisMenyetel pembuat/author stiker pada EXIF (default: 'Royal Engine Studio').
setCategories(categories: string | string[])thisMenyetel kategori emoji stiker (default: ['🍃']).
StickerMessage.createExifstatic (packName?, author?, categories?)BufferMembangun chunk biner metadata EXIF resmi WhatsApp.
StickerMessage.attachExifToWebpstatic (webpBuffer: Buffer, exifBuffer: Buffer)BufferMenyisipkan chunk EXIF ke dalam kontainer WebP RIFF/VP8X.
StickerMessage.convertToWebpstatic async (buffer: Buffer)Promise<Buffer>Mengonversi sembarang buffer gambar ke WebP 512x512 via canvas.
buildasync ()Promise<object>Menyelesaikan sumber, mengubah ke WebP, menyematkan EXIF, return { sticker, ... }.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim stiker via client.sendMessage.

3.7 ProductMessage

Builder kartu produk WhatsApp universal dengan pemformatan harga dan integrasi opsional Meta Business Catalog.

  • Impor: import { ProductMessage } from 'leaves-guardian';
  • Konstruktor: new ProductMessage(client)
Method / HelperSignatureNilai KembalianDeskripsi
setDescription(desc: string)thisMenyetel deskripsi detail produk.
setPrice(amount: number, currencyCode = 'IDR')thisMenyetel nominal harga angka dan kode mata uang ISO.
setImage(source: string | Buffer)thisMenyetel gambar pratinjau produk.
setRetailerId(id: string)thisMenyetel ID/SKU unik produk untuk pelacakan pesanan.
setUrl(url: string)thisMenyetel tautan web halaman toko / produk.
setButtonText(text: string)thisMenyetel label tombol aksi (default: 'Beli Sekarang').
setSeller(jid: string)thisMenyetel WhatsApp JID penjual/seller.
useBusinessCatalog(value = true)thisMengaktifkan skema katalog resmi WhatsApp Business.
ProductMessage.formatPricestatic (amount: number, currency = 'IDR')stringMemformat harga teralokasi (cth: 'Rp 15.000').
buildasync ()Promise<object>Menyiapkan media dan merakit payload katalog atau produk interaktif.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim pesan produk dengan pembungkusan protokol yang sesuai.

3.8 PollMessage

Builder pembuatan polling/voting resmi WhatsApp.

  • Impor: import { PollMessage } from 'leaves-guardian';
  • Konstruktor: new PollMessage(client)
MethodSignatureNilai KembalianDeskripsi
setQuestion / setTitle(question: string)thisMenyetel topik/pertanyaan polling.
addOption(name: string)thisMenambahkan opsi pilihan polling (maksimal 12 opsi).
setSelectableCount(count: number)thisMenyetel jumlah pilihan yang diizinkan (1 = single-select, 0 = unlimited).
allowMultipleAnswers(allow = true)thisHelper kenyamanan (trueselectableCount = 0, false1).
build()objectMemvalidasi opsi (min 2, max 12) dan merakit payload poll.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim polling via client.sendMessage.

3.9 AIRichMessage

Builder layout Meta AI Rich Response yang mendukung hyperlink markdown, syntax highlighting kode, chip saran interaktif, sitasi sumber, formula LaTeX, dan widget HTML interaktif.

  • Impor: import { AIRichMessage } from 'leaves-guardian';
  • Konstruktor: new AIRichMessage(client)
Method / HelperSignatureNilai KembalianDeskripsi
addText(text: string, options?: object)thisMenambahkan teks markdown dengan dukungan tautan [link](url) dan formula LaTeX.
addCode(language: string, code: string)thisMenambahkan blok kode dengan penyorotan sintaksis.
addTable(table: any[][])thisMenambahkan tabel terstruktur GenAI dengan baris header.
addChip(label: string, query?: string)thisMenambahkan chip saran prompt interaktif tunggal.
addSuggest(suggestions: string[])thisMenambahkan daftar chip rekomendasi/saran di bawah pesan.
addCitation(index: number, url: string, title?: string)thisMenempelkan tautan referensi sitasi sumber.
addTip(text: string)thisMenambahkan catatan tip kecil di bawah pesan.
addHtml(htmlPayload: string, options?: object)thisMenambahkan payload mini-app / canvas HTML interaktif.
AIRichMessage.generateVerificationMetadatastatic ()objectMenghasilkan struktur bukti verifikasi Meta AI.
build(jid: string, options?: object)objectMerakit botForwardedMessage dengan unifiedResponse base64.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim respons kaya menggunakan jalur serialisasi khusus Meta AI.

3.10 CanvasMessage

Pelari mini-app / game HTML5 interaktif di WhatsApp. Memperluas AIRichMessage.

  • Impor: import { CanvasMessage } from 'leaves-guardian';
  • Konstruktor: new CanvasMessage(client)
MethodSignatureNilai KembalianDeskripsi
setHtml(html: string, options?: object)thisMenyetel kode HTML/CSS/JS lengkap serta domain whitelist trustedSources opsional.
build(jid: string, options?: object)objectMembungkus HTML ke dalam GenAIaeacdsnwHtmlPrimitive dan merakit payload.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim canvas mini-app melalui pipeline pengiriman AIRichMessage.

3.11 EventMessage

Builder undangan acara resmi WhatsApp Group Event.

  • Impor: import { EventMessage } from 'leaves-guardian';
  • Konstruktor: new EventMessage(client)
MethodSignatureNilai KembalianDeskripsi
setName(name: string)thisMenyetel judul resmi acara/event.
setDescription(desc: string)thisMenyetel deskripsi detail acara.
setStartTime(dateOrTs: Date | number)thisMenyetel waktu mulai acara.
setEndTime(dateOrTs: Date | number)thisMenyetel waktu selesai acara (opsional).
setLocation(locationName: string)thisMenyetel nama lokasi/tempat acara fisik.
setCallLink(url: string)thisMenyetel URL panggilan/rapat WhatsApp.
setCanceled(isCanceled = true)thisMenyetel status pembatalan acara.
build()objectMenghasilkan payload event Baileys dengan messageSecret acak.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim pesan acara via client.sendMessage.

3.12 RichMessage

Builder teks monospace terstruktur yang mendukung tabel (ASCII / daftar bullet), blok kode, dan tip kutipan tanpa ketergantungan media eksternal.

  • Impor: import { RichMessage } from 'leaves-guardian';
  • Konstruktor: new RichMessage(client)
Method / HelperSignatureNilai KembalianDeskripsi
addHeader(text: string)thisMenyetel judul header utama (alias untuk setTitle).
addText(text: string)thisMenambahkan paragraf teks standar.
addTable(table: any[][], options?: object)thisMenambahkan tabel terstruktur dengan gaya 'list' (default) atau 'table' (ASCII).
addCode(language: string, code: string)thisMenambahkan blok kode berpagar (\```).
addTip(text: string)thisMenambahkan kutipan catatan tip (> 💡 _text_).
RichMessage.formatTableListstatic (tableData: any[][])stringMemformat array tabel menjadi daftar kartu bullet yang ramah layar ponsel.
RichMessage.formatTableAsciistatic (tableData: any[][])stringMemformat array tabel menjadi grid kotak ASCII yang sejajar.
formatMessage()stringMerakit seluruh elemen menjadi string terformat final.
build()objectMengembalikan objek { text, contextInfo }.
sendasync (jid: string, options?: object)Promise<WAMessage>Mengirim teks kaya via client.sendMessage.

4. Mekanisme Serialisasi & Pengiriman

.build() vs .send(jid, options)

Setiap message builder memisahkan antara kompilasi struktural dan pengiriman jaringan:

  1. build(): Validasi dan perakitan objek secara synchronous atau asynchronous murni. Menyiapkan lampiran media (jika ada) dan menghasilkan struktur payload persis seperti yang diharapkan Baileys.
  2. send(jid, options): Mengeksekusi build(), kemudian mentransmisikan pesan melalui socket aktif menggunakan pipeline pengiriman yang sesuai.

Taksonomi Pengiriman

leaves-guardian merutekan pesan melalui tiga pipeline pengiriman berbeda:

mermaid
flowchart TD
    subgraph Standard [1. Pipeline Standar sendMessage]
        T[TextMessage]
        M[MediaMessage]
        S[StickerMessage]
        P[PollMessage]
        E[EventMessage]
        R[RichMessage]
        T & M & S & P & E & R --> SM[client.sendMessage]
    end

    subgraph NativeFlow [2. Relay Interaktif Native Flow]
        B[ButtonMessage]
        L[ListMessage]
        C[CarouselMessage]
        PR[ProductMessage Standar]
        B & L & C & PR --> GW[generateWAMessageFromContent viewOnceMessage]
        GW --> RM[client.relayMessage dengan node biz / native_flow]
    end

    subgraph MetaAI [3. Jalur Serialisasi Meta AI]
        AI[AIRichMessage]
        CV[CanvasMessage]
        AI & CV --> BF[botForwardedMessage unifiedResponse]
        BF --> RELAY[client.relayMessage]
    end

NOTE

Catatan Detail Implementasi: Builder pada pipeline Meta AI (AIRichMessage dan CanvasMessage) secara internal menggunakan jalur serialisasi khusus yang kompatibel dengan Meta AI untuk memastikan pesan ter-render andal di berbagai versi aplikasi WhatsApp. Format amplop protokol internal tersebut merupakan detail implementasi dan tidak perlu disusun secara manual oleh konsumen library.


5. Validasi Umum & Error Penggunaan

Rangkaian builder melempar error deskriptif ketika prasyarat atau batasan terlanggar:

Kelas ErrorSkenario Pemicu UmumRekomendasi Penanganan
ContentValidationErrorBody kosong pada TextMessage, < 2 opsi pada PollMessage, < 2 kartu pada CarouselMessage, fileName dokumen tidak ada, harga bernilai negatif, atau tombol kosong.Validasi parameter input sebelum builder dikompilasi.
DuplicateIdErrorMenambahkan ID baris list atau ID kartu carousel yang sudah ada sebelumnya pada instance builder.Pastikan keunikan ID di seluruh baris atau kartu.
ItemNotFoundErrorMencari ID baris yang tidak ada lewat ListMessage.prototype.findRow(id).Pastikan keberadaan ID item sebelum melakukan pencarian.
TypeErrorMemberikan tipe data non-string atau tipe parameter tidak valid ke method yang mengharapkan primitif tertentu (cth: setName, addText, setHtml).Terapkan pengecekan tipe data runtime / TypeScript yang disiplin.

Released under the MIT License.