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

lupy4u

v4.5.6

Published

Lupy4u WhatsApp Multi-Device API Library

Readme

LUPY4U CORE


💝 Show Some Love & Support

Saya develop dan maintain projek ni dengan jiwa dan raga. Kalau rasa projek ni bermanfaat, hulurkan sedikit sokongan buat developer mr.luppy:


✨ Ultimate Features (Apa Yang Kami Tawarkan)

  • 🚀 High-Performance Core – Dibangun atas TypeScript yang dioptimumkan untuk kelajuan maksimum dan kestabilan melampau.
  • 🔧 Battle-Tested ID Fixes – Penyelesaian pintar untuk masalah @lid & @jid dalam kumpulan WhatsApp.
  • 📱 Full Multi-Device Support – Koneksi tanpa batasan ke ekosistem WhatsApp Multi-Device.
  • 🔐 End-to-End Military Encryption – Semua data dan pesan dienkripsi. Privasi adalah hak mutlak.
  • 📨 Complete Message Parsing – Mampu tangani teks, media berat (imej, video, audio), polling, stiker, lokasi, kontak, dan banyak lagi.
  • 🧩 Lightweight & Super Optimized – Guna sedikit RAM, tapi power luar biasa. Streaming media pun lancar jaya.
  • 📂 Flexible Auth Management – Simpan kredensial anda di fail atau terus ke database SQL/NoSQL.

⚠️ Legal Notice & Disclaimer

Projek ini tiada kaitan, sokongan, atau persekutuan rasmi dengan WhatsApp Inc. atau syarikat induknya. Laman rasmi WhatsApp: whatsapp.com.

Penafian Keras: Penggunaan tool ini adalah tanggungjawab anda sepenuhnya. Jangan guna untuk spam, scraping berlebihan, atau automation gila-gila yang melanggar Terma Perkhidmatan WhatsApp. Kalau akaun anda kena ban, itu urusan anda sendiri—kami hanya sediakan engine, anda yang tentukan hala tuju. Deal?


📦 Installation (Power Up Your Project)

Stable Release (Disyorkan - Paling Stabil)

npm install lupy4u

Latest Edge Version (Untuk Pengguna Berani)

```bash
npm install lupy4u@latest
# atau pakai yarn
yarn add lupy4u@latest

Cara Import Dalam Kod Anda

// CommonJS (Standard Node.js)
const { default: makeWASocket } = require("lupy4u")

// ES6 Module (Modern JS)
import makeWASocket from "lupy4u"

🚀 Quick Start - Jom Mulakan!

Ini contoh asas untuk sambung guna QR Code.

const { default: makeWASocket, DisconnectReason, useMultiFileAuthState } = require('lupy4u')
const { Boom } = require('@hapi/boom')

async function connectToWhatsApp() {
    // Simpan kredensial anda di folder 'auth_info_lupy4u'
    const { state, saveCreds } = await useMultiFileAuthState('auth_info_lupy4u')
    
    const sock = makeWASocket({
        auth: state,
        printQRInTerminal: true,
        browser: ['lupy4u', 'Desktop', '3.0']
    })

    // Event Connection State
    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 putus, kita cuba sambung balik ye:', shouldReconnect)
            if (shouldReconnect) connectToWhatsApp()
        } else if (connection === 'open') {
            console.log('✅ Boom! Berjaya connect ke WhatsApp!')
        }
    })

    // Event Incoming Messages
    sock.ev.on('messages.upsert', async ({ messages }) => {
        for (const m of messages) {
            if (!m.message) continue
            console.log('📱 Ada pesan baru masuk:', JSON.stringify(m, undefined, 2))
            
            // Auto-reply spec
            await sock.sendMessage(m.key.remoteJid!, { 
                text: 'Aku sedia membantu, boss! 🤖 Lupy4u Core sedia berkhidmat.' 
            })
        }
    })

    // Simpan credentials bila ada update
    sock.ev.on('creds.update', saveCreds)
}

connectToWhatsApp()

🔌 Account Connection Methods

WhatsApp menyediakan API Multi-Device. lupy4u membolehkan anda autentikasi sebagai klien sekunder melalui QR Code atau Pairing Code.

QR Code (Paling Biasa)

const { default: makeWASocket, Browsers } = require("lupy4u")

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

LePasti QR code keluar di terminal, scan je guna WhatsApp telefon anda.

Pairing Code (Tanpa Scan QR)

Sesuai untuk yang buat bot di server tanpa paparan skrin.

const { default: makeWASocket } = require("lupy4u")

const sock = makeWASocket({
    printQRInTerminal: false
})

// Pairing biasa
if (!sock.authState.creds.registered) {
    const number = '60123456789' // Ganti dengan no. telefon anda
    const code = await sock.requestPairingCode(number)
    console.log('🔑 Kode Pairing Anda:', code)
}

// Pairing dengan custom code (8 aksara)
if (!sock.authState.creds.registered) {
    const pair = "LUPPY4U"
    const number = '60123456789'
    const code = await sock.requestPairingCode(number, pair)
    console.log('🔑 Custom Pairing Code:', code)
}

Full History Sync

Nak dapatkan riwayat chat penuh? Set syncFullHistory ke true.

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

⚙️ Advanced Socket Config (Power User Area)

Cache Metadata Group (Wajib untuk Bot Grup)

Untuk performa optimum di grup, implementasikan caching metadata:

const { default: makeWASocket } = require("lupy4u")
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)
})

Fix Retry & Poll Vote Decryption

Tingkatkan kejayaan hantar pesan dan decrypt vote poll dengan custom store:

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

Terima Notifikasi Tanpa Online Status

Nak keep low profile? Matikan status online:

const sock = makeWASocket({
    markOnlineOnConnect: false
})

💾 Persistent Auth (Jangan Scan QR Setiap Hari)

Guna useMultiFileAuthState untuk simpan status login di folder. Kalau bot restart, dia auto-login balik.

const { default: makeWASocket, useMultiFileAuthState } = require("lupy4u")

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

connect()

🗄️ Data Store Implementation (In-Memory)

lupy4u sengaja tidak sertakan storage default untuk chat atau contact. Tapi kami sediakan in-memory store mudah untuk anda guna.

const { default: makeWASocket, makeInMemoryStore } = require("lupy4u")

const store = makeInMemoryStore({ })
store.readFromFile('./lupy4u_store.json')

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

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

sock.ev.on('chats.upsert', () => {
    console.log('Dapat chat baru:', store.chats.all())
})

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

🆔 WhatsApp IDs (JID Mastery)

jid adalah ID unik untuk setiap sasaran pesanan.

· Individu: [country_code][phone_number]@s.whatsapp.net (cth: [email protected]) · Grup: [email protected] · Broadcast List: [timestamp]@broadcast · Status / Stories: status@broadcast


🔧 Core Utilities

· getContentType – Dapatkan jenis mesej sebenar. · getDevice – Kenal pasti device penghantar mesej. · makeCacheableSignalKeyStore – Akselerasi key store untuk speed yang lebih pantas. · downloadContentFromMessage – Download media terus dari mesej.


📤 Send Messages (Heavy Artillery)

Guna satu fungsi utama untuk semua jenis mesej.

sock.sendMessage(jid, content, options)

📝 Non-Media Messages

Text & Quote

await sock.sendMessage(jid, { text: 'Halo dunia, ini Lupy4u!' })
await sock.sendMessage(jid, { text: 'Kuquote ini ye.' }, { quoted: message })

Tag Orang (Mention)

await sock.sendMessage(
    jid,
    {
        text: '@60123456789 tolong check ye.',
        mentions: ['[email protected]']
    }
)

Forward Message

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

Location & Contacts

// Lokasi
await sock.sendMessage(jid, { location: { degreesLatitude: 3.12, degreesLongitude: 101.55 } })

// Kontak (vCard)
const vcard = 'BEGIN:VCARD\nVERSION:3.0\nFN:Mr Luppy\nTEL;type=CELL;type=VOICE;waid=60123456789:+60 123456789\nEND:VCARD'
await sock.sendMessage(jid, { contacts: { displayName: 'Mr Luppy', contacts: [{ vcard }] } })

Reactions, Pins, & Polls

// Reaksi (ketik ❤️)
await sock.sendMessage(jid, { react: { text: '🔥', key: message.key } })

// Pin Message (24 jam)
await sock.sendMessage(jid, { pin: { type: 1, time: 86400, key: message.key } })

// Polling
await sock.sendMessage(jid, { poll: { name: 'Lupy4u power tak?', values: ['Power Gila', 'Biasa je'], selectableCount: 1 } })

🖼️ Media & File Messages

Boleh guna { stream: Stream }, { url: Url }, atau terus Buffer.

Gambar, Video, GIF, Audio

await sock.sendMessage(jid, { image: { url: './foto.jpeg' }, caption: 'Ini gambar power' })
await sock.sendMessage(jid, { video: { url: './video.mp4' }, caption: 'Tengok ni', ptv: false })
await sock.sendMessage(jid, { video: fs.readFileSync('./gif.mp4'), caption: 'gif ke ni', gifPlayback: true })
await sock.sendMessage(jid, { audio: { url: './lagu.mp3' }, mimetype: 'audio/mp4' })

// View Once (Tengok sekali je)
await sock.sendMessage(jid, { image: { url: './rahsia.jpeg' }, viewOnce: true, caption: 'Rahsia ni' })

✏️ Message Manipulation

Delete & Edit

const msg = await sock.sendMessage(jid, { text: 'Aku nak delete ni' })
await sock.sendMessage(jid, { delete: msg.key })

await sock.sendMessage(jid, { text: 'Teks update terbaru', edit: response.key })

Download Media (Contoh Image)

import { createWriteStream } from 'fs'
import { downloadMediaMessage, getContentType } from 'lupy4u'

sock.ev.on('messages.upsert', async ({ messages: [m] }) => {
    if (!m.message) return
    const messageType = getContentType(m)

    if (messageType === 'imageMessage') {
        const stream = await downloadMediaMessage(m, 'stream', {}, { logger, reuploadRequest: sock.updateMediaMessage })
        stream.pipe(createWriteStream('./download.jpeg'))
    }
})

Tolak Panggilan

await sock.rejectCall(callId, callFrom)

📁 Chat Management (Admin Tools)

Read & Presence

// Tandakan sebagai telah dibaca
await sock.readMessages([key]) 

// Set presence (composing, available)
await sock.sendPresenceUpdate('composing', jid) 

Archive, Mute, Delete Chat

const lastMsg = await getLastMessageInChat(jid) // Anda implementasi sendiri

// Archive
await sock.chatModify({ archive: true, lastMessages: [lastMsg] }, jid)

// Mute (8 jam)
await sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)

// Clear chat for me
await sock.chatModify({ clear: { messages: [{ id: 'MSG_ID', fromMe: true, timestamp: '123456' }] } }, jid)

// Delete entire chat
await sock.chatModify({ delete: true, lastMessages: [lastMsg] }, jid)

Pin, Star, Disappearing Messages

// Pin & Unpin chat
await sock.chatModify({ pin: true }, jid)
await sock.chatModify({ pin: false }, jid)

// Star messages
await sock.chatModify({ star: { messages: [{ id: 'MSG_ID', fromMe: true }], star: true } }, jid)

// Turn on disappearing mode (7 hari)
await sock.sendMessage(jid, { disappearingMessagesInChat: 604800 })

👤 User & Group Queries

Check User Validity

const [result] = await sock.onWhatsApp(jid)
if (result.exists) console.log(`${jid} active di WA, jid sebenar: ${result.jid}`)

Group Operations

// Create Group
const group = await sock.groupCreate('Grup Lupy4u', ['[email protected]'])
console.log('Grup ID:', group.gid)

// Add, Remove, Promote, Demote
await sock.groupParticipantsUpdate(jid, ['[email protected]'], 'add') 

// Update Subject & Description
await sock.groupUpdateSubject(jid, 'Nama Baru Keren')
await sock.groupUpdateDescription(jid, 'Deskripsi baru power')

// Group Settings (Announcement / Not Announcement)
await sock.groupSettingUpdate(jid, 'announcement')
await sock.groupSettingUpdate(jid, 'not_announcement')

🔒 Privacy Settings

// Block/Unblock
await sock.updateBlockStatus(jid, 'block')

// Fetch Privacy Settings
const privacySettings = await sock.fetchPrivacySettings(true)
console.log(privacySettings)

// Update Last Seen, Read Receipts, etc.
await sock.updateLastSeenPrivacy('contacts')
await sock.updateReadReceiptsPrivacy('all')
await sock.updateDefaultDisappearingMode(86400) // 24 jam

🛠️ Custom Functions & Debugging

Live Debug Logs

const { P } = require('lupy4u')
const sock = makeWASocket({ logger: P({ level: 'debug' }) })

Websocket Event Callbacks

sock.ws.on('CB:edge_routing', (node) => { })
sock.ws.on('CB:edge_routing,id:abcd', (node) => { })

💡 Pro Tips & Best Practices (Sumpah Tak Tipu)

· Caching is King: Cache metadata grup untuk performa melampau. · Handle Auto-Reconnect: Pastikan sambungan bot tahan lasak. Guna contoh kod connection.update kami di atas. · Ini power untuk developer sejati: Jangan guna readMessages secara berlebihan, nanti WhatsApp detect bot anda pelik. Use wisely.


🙏 Special Credits

This project is standing tall on the shoulders of giants. A massive shoutout and deepest gratitude goes to whiskeySocket (and the original LevviCode team) for laying the foundation of this phenomenal Multi-Device engine.

Without your open-source dedication, lupy4u would never have existed. Thank you, whiskeySocket! 🙌


Maintained with passion by mr.luppy.

## 🏁 Penutup / Closing Words

Terima kasih kerana mempercayai **lupy4u** sebagai enjin utama bot anda. 
Kami tidak pernah berhenti untuk menambah baik dan mengoptimumkan *core engine* ini. 
Jika projek ini membantu anda, jangan lupa tinggalkan bintang ⭐ sebagai tanda sokongan!

---

<div align='center'>
  <strong>lupy4u</strong> — The Ultimate WhatsApp Multi-Device API Engine. Built for Power. Designed for Scalability.
</div>