# Utility Functions

## getContentType

Mendapatkan tipe konten dari sebuah pesan.

```ts
import { getContentType } from '@mataram/wa'

const type = getContentType(message)
// 'conversation' | 'imageMessage' | 'videoMessage' | 'extendedTextMessage' | etc.
```

## getDevice

Mendapatkan perangkat asal pesan.

```ts
import { getDevice } from '@mataram/wa'

const device = getDevice(message)
// 'android' | 'ios' | 'web' | 'desktop' | 'unknown'
```

## downloadContentFromMessage

Download media dari pesan.

```ts
import { downloadContentFromMessage } from '@mataram/wa'

const stream = await downloadContentFromMessage(mediaMessage, 'image')
const chunks = []
for await (const chunk of stream) chunks.push(chunk)
const buffer = Buffer.concat(chunks)
```

## downloadMediaMessage

Download media dengan opsi lebih lengkap.

```ts
import { downloadMediaMessage } from '@mataram/wa'

// Sebagai buffer
const buffer = await downloadMediaMessage(message, 'buffer', {}, {
  logger,
  reuploadRequest: sock.updateMediaMessage,
})

// Sebagai stream
const stream = await downloadMediaMessage(message, 'stream', {}, { logger })
```

## getAggregateVotesInPollMessage

Menghitung hasil voting poll.

```ts
import { getAggregateVotesInPollMessage } from '@mataram/wa'

sock.ev.on('messages.update', (updates) => {
  for (const { key, update } of updates) {
    if (update.pollUpdates) {
      const result = getAggregateVotesInPollMessage({
        message: pollCreation,
        pollUpdates: update.pollUpdates,
      })
      console.log('Poll results:', result)
    }
  }
})
```

## BufferJSON

Utility untuk serialize/deserialize Buffer ke JSON.

```ts
import { BufferJSON } from '@mataram/wa'

// Simpan state ke file
const json = JSON.stringify(state, BufferJSON.replacer)
fs.writeFileSync('state.json', json)

// Baca dari file
const data = JSON.parse(fs.readFileSync('state.json', 'utf-8'), BufferJSON.reviver)
```

## makeCacheableSignalKeyStore

Membungkus key store dengan cache untuk performa lebih baik.

```ts
import { makeCacheableSignalKeyStore } from '@mataram/wa'

const sock = makeWASocket({
  auth: {
    creds: state.creds,
    keys: makeCacheableSignalKeyStore(state.keys, logger),
  },
})
```

## fetchLatestVersion

Mendapatkan versi WhatsApp Web terbaru.

```ts
import { fetchLatestVersion } from '@mataram/wa'

const { version, isLatest } = await fetchLatestVersion()
console.log('WA Version:', version.join('.'))

if (isLatest) {
  const sock = makeWASocket({ version })
}
```

## jidDecode / jidEncode

Memproses JID (WhatsApp ID).

```ts
import { jidDecode, jidEncode } from '@mataram/wa'

const decoded = jidDecode('628xxx@s.whatsapp.net')
// { user: '628xxx', server: 's.whatsapp.net', device?: number }

const encoded = jidEncode('628xxx', 's.whatsapp.net', 0)
// '628xxx:0@s.whatsapp.net'
```

## areJidsSameUser

Membandingkan dua JID (tanpa device).

```ts
import { areJidsSameUser } from '@mataram/wa'

areJidsSameUser('628xxx:0@s.whatsapp.net', '628xxx@s.whatsapp.net')
// true
```

## isJidGroup / isJidNewsletter / isJidUser

Cek tipe JID.

```ts
import { isJidGroup, isJidNewsletter, isJidUser } from '@mataram/wa'

isJidGroup('123@g.us')       // true
isJidNewsletter('123@newsletter') // true
isJidUser('628xxx@s.whatsapp.net')  // true
```
