# Konfigurasi Socket

Semua opsi konfigurasi untuk `makeWASocket(config)`.

## Opsi Wajib

| Opsi | Tipe | Deskripsi |
|---|---|---|
| `auth` | `AuthenticationState` | State autentikasi dari `useMultiFileAuthState()` |

## Opsi Koneksi

| Opsi | Default | Deskripsi |
|---|---|---|
| `waWebSocketUrl` | `'wss://web.whatsapp.com/ws/chat'` | URL WebSocket WA |
| `connectTimeoutMs` | `20000` | Timeout koneksi (ms) |
| `keepAliveIntervalMs` | `30000` | Interval ping (ms) |
| `defaultQueryTimeoutMs` | `60000` | Timeout query default (ms) |
| `retryRequestDelayMs` | `250` | Delay antar retry (ms) |
| `maxMsgRetryCount` | `5` | Maksimal retry pesan |

## Opsi Browser

| Opsi | Default | Deskripsi |
|---|---|---|
| `browser` | `Browsers.macOS('Chrome')` | Identitas browser |

Gunakan salah satu:

```ts
Browsers.macOS('Chrome')    // → ['Mac OS', 'Chrome', '14.4.1']
Browsers.windows('Edge')    // → ['Windows', 'Edge', '10.0.22631']
Browsers.ubuntu('Firefox')  // → ['Ubuntu', 'Firefox', '22.04.4']
Browsers.mataram('App')     // → ['Mac OS', 'Mataram/App', '14.4.1']
```

> ⚠ Jangan pake nama browser palsu  WA bakal nolak koneksi.

## Opsi Sinkronisasi

| Opsi | Default | Deskripsi |
|---|---|---|
| `syncFullHistory` | `true` | Ambil history chat lengkap |
| `shouldSyncHistoryMessage` |  | Filter history sync (function) |
| `fireInitQueries` | `true` | Kirim query inisialisasi otomatis |
| `markOnlineOnConnect` | `true` | Tampilkan online pas connect |

## Opsi Retry & Poll

| Opsi | Tipe | Deskripsi |
|---|---|---|
| `getMessage` | `(key) => Promise<WAMessage>` | Cari pesan asli buat retry |
| `msgRetryCounterCache` | `CacheStore` | Cache counter retry |
| `cachedGroupMetadata` | `(jid) => Promise<GroupMetadata>` | Cache metadata grup |

## Opsi Media

| Opsi | Default | Deskripsi |
|---|---|---|
| `customUploadHosts` | `[]` | Host upload media kustom |
| `generateHighQualityLinkPreview` | `false` | Generate link preview |
| `linkPreviewImageThumbnailWidth` | `192` | Lebar thumbnail preview |

## Opsi Proxy

| Opsi | Tipe | Deskripsi |
|---|---|---|
| `agent` | `https.Agent` | Agent untuk WebSocket |
| `fetchAgent` | `https.Agent` | Agent untuk fetch |
| `options` | `RequestInit` | Opsi fetch tambahan |

## Opsi Debug

| Opsi | Default | Deskripsi |
|---|---|---|
| `logger` | pino `child({ class: 'mataram' })` | Instance logger |
| `emitOwnEvents` | `true` | Emit event untuk aksi sendiri |
| `printQRInTerminal` |  | *(deprecated)* QR terminal |

## Opsi Lain

| Opsi | Default | Deskripsi |
|---|---|---|
| `version` | latest | Versi WA Web |
| `auth` |  | **(wajib)** State autentikasi |
| `transactionOpts` |  | Opsi transaksi Signal store |
| `pushName` |  | Nama perangkat (mock server) |
| `patchMessageBeforeSending` | `(msg) => msg` | Transform pesan sebelum kirim |

## Contoh Lengkap

```ts
import makeWASocket, { useMultiFileAuthState, Browsers } from '@mataram/wa'
import NodeCache from 'node-cache'
import P from 'pino'

async function start() {
  const { state, saveCreds } = await useMultiFileAuthState('auth_info')

  const sock = makeWASocket({
    auth: state,
    version: [2, 3000, 1035194821],
    browser: Browsers.windows('Chrome'),
    logger: P({ level: 'debug' }),
    syncFullHistory: false,
    markOnlineOnConnect: false,
    emitOwnEvents: true,
    defaultQueryTimeoutMs: 30000,
    keepAliveIntervalMs: 15000,
    generateHighQualityLinkPreview: true,
    msgRetryCounterCache: new NodeCache({ stdTTL: 60 }),
    cachedGroupMetadata: async (jid) => groupCache.get(jid),
    getMessage: async (key) => {
      // Ambil pesan dari database
      return db.loadMessage(key.id)
    },
  })

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

start()
```
