npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@starvale-sdk/wa-socket

v0.0.2

Published

WhatsApp Web API Library

Downloads

188

Readme

✨ Fitur Utama

  • 🚀 Modern & Cepat - Dibangun dengan TypeScript dan teknologi terbaru
  • 🔧 Perbaikan @lid & @jid - Mengatasi masalah @lid ke @pn di grup WhatsApp
  • 📱 Dukungan Multi-Device - Mendukung koneksi multi-device WhatsApp
  • 🔐 Enkripsi End-to-End - Komunikasi terenkripsi penuh
  • 📨 Semua Jenis Pesan - Dukung teks, media, polling, dll.

⚠️ Peringatan

Proyek ini tidak berafiliasi, terkait, diotorisasi, didukung, atau terhubung secara resmi dengan WhatsApp atau anak perusahaannya. Situs resmi WhatsApp ada di whatsapp.com.

Pengelola Wileys tidak mendukung penggunaan aplikasi ini untuk melanggar Ketentuan Layanan WhatsApp. Kami menekankan tanggung jawab pribadi pengguna untuk menggunakan secara adil dan bertanggung jawab.

Gunakan dengan bijak. Hindari spam. Jangan gunakan otomatisasi berlebihan.

📦 Instalasi

Versi Stabil (Direkomendasikan)

npm i starvale-sdk/wa-socket

Versi Edge (Fitur Terbaru)

npm i starvale-sdk/wa-socket
# atau
yarn add starvale-sdk/wa-socket

Impor di Kode

const { default: makeWASocket } = require("starvale-sdk/wa-socket")
// atau ES6
import makeWASocket from "starvale-sdk/wa-socket"

🚀 Mulai Cepat

Contoh Dasar

const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('starvale-sdk/wa-socket')
const { Boom } = require('@hapi/boom')

async function connectToWhatsApp() {
    const { state, saveCreds } = await useMultiFileAuthState('auth_info_wileys')
    
    const sock = makeWASocket({
        auth: state,
        printQRInTerminal: true,
        browser: ['Wileys', 'Desktop', '3.0']
    })

    sock.ev.on('connection.update', (update) => {
        const { connection, lastDisconnect } = update
        if(connection === 'close') {
            const shouldReconnect = (lastDisconnect?.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
            console.log('Koneksi tertutup karena ', lastDisconnect.error, ', reconnecting ', shouldReconnect)
            if(shouldReconnect) {
                connectToWhatsApp()
            }
        } else if(connection === 'open') {
            console.log('✅ Berhasil terhubung ke WhatsApp!')
        }
    })

    sock.ev.on('messages.upsert', async ({ messages }) => {
        for (const m of messages) {
            if (!m.message) continue
            
            console.log('📱 Pesan baru:', JSON.stringify(m, undefined, 2))
            
            // Balas otomatis
            await sock.sendMessage(m.key.remoteJid!, { 
                text: 'Halo! Saya bot WhatsApp menggunakan Wileys 🤖' 
            })
        }
    })

    sock.ev.on('creds.update', saveCreds)
}

connectToWhatsApp()

📋 Daftar Isi

Disclaimer : Docs ini masih dalam tahap beta, jadi ada kesalahan atau ketidaksesuaian

🔌 Koneksi Akun

WhatsApp menyediakan API multi-device yang memungkinkan Wileys terautentikasi sebagai klien WhatsApp sekunder melalui QR code atau pairing code.

Hubungkan dengan QR Code

[!TIP]
Sesuaikan nama browser menggunakan konstanta Browsers. Lihat konfigurasi yang tersedia di bawah.

const { default: makeWASocket, Browsers } = require("starvale-sdk/wa-socket")

const sock = makeWASocket({
    browser: Browsers.ubuntu('My App'),
    printQRInTerminal: true
})

Setelah koneksi berhasil, QR code akan muncul di terminal. Pindai dengan WhatsApp di ponsel Anda untuk login.

Hubungkan dengan Pairing Code

[!IMPORTANT]
Pairing code bukan bagian dari Mobile API. Ini memungkinkan koneksi WhatsApp Web tanpa QR code, tapi hanya satu perangkat. Lihat FAQ WhatsApp.

Nomor telepon harus tanpa +, (), atau -, dan sertakan kode negara.

const { default: makeWASocket } = require("starvale-sdk/wa-socket")

const sock = makeWASocket({
    printQRInTerminal: false
})

// Pairing Normal
if (!sock.authState.creds.registered) {
    const number = '6285134816783'
    const code = await sock.requestPairingCode(number)
    console.log('🔑 Kode Pairing:', code)
}

// Pairing Kustom
if (!sock.authState.creds.registered) {
    const pair = "YP240125" // 8 karakter
    const number = '6285134816783'
    const code = await sock.requestPairingCode(number, pair)
    console.log('🔑 Kode Pairing Kustom:', code)
}

Terima Riwayat Lengkap

  1. Setel syncFullHistory ke true.
  2. Secara default, Wileys menggunakan konfigurasi Chrome. Untuk koneksi seperti desktop (untuk riwayat pesan lebih banyak), gunakan:
const { default: makeWASocket, Browsers } = require("starvale-sdk/wa-socket")

const sock = makeWASocket({
    browser: Browsers.macOS('Desktop'),
    syncFullHistory: true
})

⚙️ Catatan Penting Konfigurasi Socket

Caching Metadata Grup (Direkomendasikan)

Untuk penggunaan grup, implementasikan caching metadata grup:

const { default: makeWASocket } = require("starvale-sdk/wa-socket")
const NodeCache = require('node-cache')

const groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })

const sock = makeWASocket({
    cachedGroupMetadata: async (jid) => groupCache.get(jid)
})

sock.ev.on('groups.update', async ([event]) => {
    const metadata = await sock.groupMetadata(event.id)
    groupCache.set(event.id, metadata)
})

sock.ev.on('group-participants.update', async (event) => {
    const metadata = await sock.groupMetadata(event.id)
    groupCache.set(event.id, metadata)
})

Perbaiki Sistem Retry & Dekripsi Vote Poll

Tingkatkan pengiriman pesan dan dekripsi vote poll dengan store:

const sock = makeWASocket({
    getMessage: async (key) => await getMessageFromStore(key)
})

Terima Notifikasi di Aplikasi WhatsApp

Nonaktifkan status online untuk menerima notifikasi:

const sock = makeWASocket({
    markOnlineOnConnect: false
})

💾 Simpan Info Auth

Hindari pemindaian QR code berulang dengan menyimpan kredensial:

const makeWASocket = require("starvale-sdk/wa-socket").default
const { useMultiFileAuthState } = require("starvale-sdk/wa-socket")

async function connect() {
    const { state, saveCreds } = await useMultiFileAuthState('auth_info_wileys')
    const sock = makeWASocket({ auth: state })
    sock.ev.on('creds.update', saveCreds)
}

connect()

[!IMPORTANT]
useMultiFileAuthState menyimpan status auth di folder. Untuk produksi, gunakan database SQL/No-SQL dan kelola update kunci dengan hati-hati.

const sock = makeWASocket()
sock.ev.on('messages.upsert', ({ messages }) => {
    console.log('Dapat pesan:', messages)
})

Contoh Mulai

const makeWASocket = require("starvale-sdk/wa-socket").default
const { DisconnectReason, useMultiFileAuthState } = require("starvale-sdk/wa-socket")
const { Boom } = require('@hapi/boom')

async function connectToWhatsApp() {
    const { state, saveCreds } = await useMultiFileAuthState('auth_info_wileys')
    const sock = makeWASocket({
        auth: state,
        printQRInTerminal: true
    })

    sock.ev.on('connection.update', (update) => {
        const { connection, lastDisconnect } = update
        if(connection === 'close') {
            const shouldReconnect = (lastDisconnect.error as Boom)?.output?.statusCode !== DisconnectReason.loggedOut
            console.log('Koneksi tertutup karena ', lastDisconnect.error, ', reconnecting ', shouldReconnect)
            if(shouldReconnect) {
                connectToWhatsApp()
            }
        } else if(connection === 'open') {
            console.log('Koneksi terbuka')
        }
    })

    sock.ev.on('messages.upsert', async ({ messages }) => {
        for (const m of messages) {
            console.log(JSON.stringify(m, undefined, 2))
            console.log('Balas ke', m.key.remoteJid)
            await sock.sendMessage(m.key.remoteJid!, { text: 'Halo Dunia' })
        }
    })

    sock.ev.on('creds.update', saveCreds)
}

connectToWhatsApp()

Dekripsi Vote Poll

Secara default, vote poll terenkripsi dan ditangani di messages.update:

sock.ev.on('messages.update', event => {
    for(const { key, update } of event) {
        if(update.pollUpdates) {
            const pollCreation = await getMessage(key)
            if(pollCreation) {
                console.log(
                    'update poll diterima, agregasi: ',
                    getAggregateVotesInPollMessage({
                        message: pollCreation,
                        pollUpdates: update.pollUpdates,
                    })
                )
            }
        }
    }
})

getMessage adalah implementasi store (di pihak Anda).

Ringkasan Event Koneksi Pertama

  1. Saat koneksi pertama, connection.update akan dipicu meminta restart sock.
  2. Kemudian, pesan riwayat diterima di messaging.history-set.

🗄️ Implementasi Data Store

Wileys tidak menyertakan penyimpanan default untuk obrolan, kontak, atau pesan. Namun, implementasi in-memory sederhana disediakan. Store mendengarkan update obrolan, pesan baru, dll., untuk menjaga data tetap terkini.

[!IMPORTANT]
Saya sangat merekomendasikan membangun data store sendiri, karena menyimpan seluruh riwayat obrolan di memori sangat boros RAM.

const makeWASocket = require("starvale-sdk/wa-socket").default
const { makeInMemoryStore } = require("starvale-sdk/wa-socket")

const store = makeInMemoryStore({ })

store.readFromFile('./wileys_store.json')

setInterval(() => {
    store.writeToFile('./wileys_store.json')
}, 10_000)

const sock = makeWASocket({ })
store.bind(sock.ev)

sock.ev.on('chats.upsert', () => {
    console.log('dapat obrolan', store.chats.all())
})

sock.ev.on('contacts.upsert', () => {
    console.log('dapat kontak', Object.values(store.contacts))
})

Store juga menyediakan fungsi sederhana seperti loadMessages untuk mempercepat pengambilan data.

🆔 Penjelasan ID WhatsApp

id adalah ID WhatsApp, disebut juga jid, untuk orang atau grup tujuan pesan.

Format: [kode negara][nomor telepon]@s.whatsapp.net
Contoh untuk orang: [email protected].

Untuk grup: [email protected].

Untuk daftar siaran: [timestamp pembuatan]@broadcast.

Untuk cerita: status@broadcast.

🔧 Fungsi Utilitas

  • getContentType - Mengembalikan tipe konten pesan
  • getDevice - Mengembalikan perangkat dari pesan
  • makeCacheableSignalKeyStore - Mempercepat store auth
  • downloadContentFromMessage - Unduh konten dari pesan

📤 Kirim Pesan

Kirim semua jenis pesan dengan satu fungsi.

Lihat konten pesan yang didukung di bagian di bawah.
Lihat opsi seperti quote di contoh di bawah.

const jid: string
const content: AnyMessageContent
const options: MiscMessageGenerationOptions

sock.sendMessage(jid, content, options)

Pesan Non-Media

Pesan Teks

await sock.sendMessage(jid, { text: 'halo dunia' })

Pesan Kutipan (bekerja dengan semua tipe)

await sock.sendMessage(jid, { text: 'halo dunia' }, { quoted: message })

Sebut Pengguna (bekerja dengan sebagian besar tipe)

@number untuk sebut di teks, opsional.

await sock.sendMessage(
    jid,
    {
        text: '@12345678901',
        mentions: ['[email protected]']
    }
)

Teruskan Pesan

Butuh objek pesan, ambil dari store atau gunakan objek pesan.

const msg = getMessageFromStore() // implementasikan sendiri
await sock.sendMessage(jid, { forward: msg })

Pesan Lokasi

await sock.sendMessage(
    jid, 
    {
        location: {
            degreesLatitude: 24.121231,
            degreesLongitude: 55.1121221
        }
    }
)

Pesan Kontak

const vcard = 'BEGIN:VCARD\n' 
            + 'VERSION:3.0\n' 
            + 'FN:Jeff Singh\n' 
            + 'ORG:Ashoka Uni;\n' 
            + 'TEL;type=CELL;type=VOICE;waid=911234567890:+91 12345 67890\n' 
            + 'END:VCARD'

await sock.sendMessage(
    id,
    { 
        contacts: { 
            displayName: 'Jeff', 
            contacts: [{ vcard }] 
        }
    }
)

Pesan Reaksi

Butuh kunci pesan, ambil dari store atau gunakan objek kunci.

await sock.sendMessage(
    jid,
    {
        react: {
            text: '💖', // kosongkan untuk hapus reaksi
            key: message.key
        }
    }
)

Pin Pesan

Butuh kunci pesan.

Waktu:

| Waktu | Detik | |-------|------------| | 24j | 86.400 | | 7h | 604.800 | | 30h | 2.592.000 |

await sock.sendMessage(
    jid,
    {
        pin: {
            type: 1, // 0 untuk hapus
            time: 86400,
            key: message.key
        }
    }
)

Pesan Poll

await sock.sendMessage(
    jid,
    {
        poll: {
            name: 'Poll Saya',
            values: ['Opsi 1', 'Opsi 2', ...],
            selectableCount: 1,
            toAnnouncementGroup: false // atau true
        }
    }
)

Kirim dengan Pratinjau Tautan

  1. Secara default, WA tidak punya generasi tautan dari web.
  2. Wileys punya fungsi untuk pratinjau tautan.
  3. Tambahkan link-preview-js dengan npm i link-preview-js.
  4. Kirim tautan:
await sock.sendMessage(
    jid,
    {
        text: 'Halo, ini dikirim menggunakan https://npmjs.com/wileys'
    }
)

Pesan Media

Pengiriman media (video, stiker, gambar) lebih mudah & efisien.

[!NOTE] Di pesan media, bisa gunakan { stream: Stream } atau { url: Url } atau Buffer langsung, lihat contoh di bawah.

Wileys tidak muat seluruh buffer ke memori; enkripsi sebagai stream.

[!TIP] Gunakan Stream atau Url untuk hemat memori.

Pesan Gif

WA tidak dukung .gif, kirim sebagai .mp4 dengan flag gifPlayback.

await sock.sendMessage(
    jid, 
    { 
        video: fs.readFileSync('Media/ma_gif.mp4'),
        caption: 'halo dunia',
        gifPlayback: true
    }
)

Pesan Video

await sock.sendMessage(
    id, 
    { 
        video: {
            url: './Media/ma_gif.mp4'
        },
        caption: 'halo dunia',
        ptv: false // true untuk video note
    }
)

Pesan Audio

Konversi dengan ffmpeg: codec: libopus, ac: 1, avoid_negative_ts, make_zero.

Contoh: ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg

await sock.sendMessage(
    jid, 
    {
        audio: {
            url: './Media/audio.mp3'
        },
        mimetype: 'audio/mp4'
    }
)

Pesan Gambar

await sock.sendMessage(
    id, 
    { 
        image: {
            url: './Media/ma_img.png'
        },
        caption: 'halo dunia'
    }
)