@kangwifi-pro/waliwa 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Waliwa - makeWASocketWithDefaults()
3
+ *
4
+ * Pre-configured makeWASocket dengan sensible defaults:
5
+ * - Auto-display QR code di terminal (qrcode-terminal)
6
+ * - Auto-reconnect saat disconnect (kecuali logged out)
7
+ * - Auto-save credentials (creds.update → saveCreds)
8
+ * - Logger pino pretty print (jika tidak di-override)
9
+ * - Browser identification default
10
+ * - Default connection options (keepAlive, timeout, dll)
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { makeWASocketWithDefaults, useMultiFileAuthState } from 'waliwa';
15
+ *
16
+ * const { state, saveCreds } = await useMultiFileAuthState('./auth');
17
+ * const sock = makeWASocketWithDefaults({
18
+ * authState: state,
19
+ * saveCreds,
20
+ * browser: ['Waliwa Bot', 'Chrome', '1.0.0']
21
+ * });
22
+ *
23
+ * // QR auto-display, auto-reconnect, auto-save creds sudah aktif
24
+ * // Tinggal listen events yang kamu butuhkan
25
+ * sock.ev.on('messages.upsert', ({ messages }) => {
26
+ * console.log('Got messages:', messages);
27
+ * });
28
+ * ```
29
+ */
30
+ export interface WaliwaDefaultsOptions {
31
+ /** Auth state dari useMultiFileAuthState */
32
+ authState: any;
33
+ /** Function saveCreds dari useMultiFileAuthState (auto-bound jika tidak diisi) */
34
+ saveCreds?: () => Promise<void>;
35
+ /** Browser identification [name, shortName, version] */
36
+ browser?: [string, string, string];
37
+ /** Custom logger (default: pino pretty print) */
38
+ logger?: any;
39
+ /** Print QR to terminal (default: true) */
40
+ printQRInTerminal?: boolean;
41
+ /** Auto-reconnect on disconnect (default: true) */
42
+ autoReconnect?: boolean;
43
+ /** Reconnect delay in ms (default: 5000) */
44
+ reconnectDelayMs?: number;
45
+ /** Mark online on connect (default: true) */
46
+ markOnlineOnConnect?: boolean;
47
+ /** Sync full history (default: false) */
48
+ syncFullHistory?: boolean;
49
+ /** Custom QR handler (override default terminal print) */
50
+ onQR?: (qr: string) => void;
51
+ /** Custom connection open handler */
52
+ onOpen?: () => void;
53
+ /** Custom connection close handler */
54
+ onClose?: (statusCode: number, shouldReconnect: boolean) => void;
55
+ /** WA WebSocket URL (default: wss://web.whatsapp.com/ws/chat) */
56
+ waWebSocketUrl?: string;
57
+ /** Keep alive interval ms (default: 20000) */
58
+ keepAliveIntervalMs?: number;
59
+ /** Connect timeout ms (default: 20000) */
60
+ connectTimeoutMs?: number;
61
+ /** Default query timeout ms (default: 60000) */
62
+ defaultQueryTimeoutMs?: number;
63
+ /** Additional config passed to makeWASocket */
64
+ additionalConfig?: Record<string, any>;
65
+ }
66
+ /**
67
+ * Create WhatsApp socket with sensible defaults.
68
+ *
69
+ * Features enabled by default:
70
+ * - QR auto-display in terminal
71
+ * - Auto-reconnect on disconnect (except logged out)
72
+ * - Auto-save credentials
73
+ * - Pino pretty logger
74
+ * - Default browser identification
75
+ * - Keep alive ping every 20s
76
+ */
77
+ export declare function makeWASocketWithDefaults(options: WaliwaDefaultsOptions): any;
78
+ /**
79
+ * Quick start helper - buat socket + setup auth dengan 1 call
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * import { quickStart } from 'waliwa';
84
+ *
85
+ * const sock = await quickStart({
86
+ * authFolder: './auth',
87
+ * browser: ['Waliwa Bot', 'Chrome', '1.0.0']
88
+ * });
89
+ *
90
+ * sock.ev.on('messages.upsert', ({ messages }) => {
91
+ * console.log('Got:', messages);
92
+ * });
93
+ * ```
94
+ */
95
+ export declare function quickStart(opts: {
96
+ authFolder: string;
97
+ browser?: [string, string, string];
98
+ printQRInTerminal?: boolean;
99
+ onOpen?: () => void;
100
+ onClose?: (statusCode: number, shouldReconnect: boolean) => void;
101
+ }): Promise<any>;
102
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/helpers/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAOH,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,SAAS,EAAE,GAAG,CAAC;IAEf,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC,wDAAwD;IACxD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,iDAAiD;IACjD,MAAM,CAAC,EAAE,GAAG,CAAC;IAEb,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,mDAAmD;IACnD,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,yCAAyC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5B,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjE,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,8CAA8C;IAC9C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACxC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,GAAG,CAqH5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,KAAK,IAAI,CAAC;CAClE,GAAG,OAAO,CAAC,GAAG,CAAC,CAaf"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - makeWASocketWithDefaults()
4
+ *
5
+ * Pre-configured makeWASocket dengan sensible defaults:
6
+ * - Auto-display QR code di terminal (qrcode-terminal)
7
+ * - Auto-reconnect saat disconnect (kecuali logged out)
8
+ * - Auto-save credentials (creds.update → saveCreds)
9
+ * - Logger pino pretty print (jika tidak di-override)
10
+ * - Browser identification default
11
+ * - Default connection options (keepAlive, timeout, dll)
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { makeWASocketWithDefaults, useMultiFileAuthState } from 'waliwa';
16
+ *
17
+ * const { state, saveCreds } = await useMultiFileAuthState('./auth');
18
+ * const sock = makeWASocketWithDefaults({
19
+ * authState: state,
20
+ * saveCreds,
21
+ * browser: ['Waliwa Bot', 'Chrome', '1.0.0']
22
+ * });
23
+ *
24
+ * // QR auto-display, auto-reconnect, auto-save creds sudah aktif
25
+ * // Tinggal listen events yang kamu butuhkan
26
+ * sock.ev.on('messages.upsert', ({ messages }) => {
27
+ * console.log('Got messages:', messages);
28
+ * });
29
+ * ```
30
+ */
31
+ var __importDefault = (this && this.__importDefault) || function (mod) {
32
+ return (mod && mod.__esModule) ? mod : { "default": mod };
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.makeWASocketWithDefaults = makeWASocketWithDefaults;
36
+ exports.quickStart = quickStart;
37
+ const baileys_1 = require("@whiskeysockets/baileys");
38
+ const boom_1 = require("@hapi/boom");
39
+ const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
40
+ const pino_1 = __importDefault(require("pino"));
41
+ /**
42
+ * Create WhatsApp socket with sensible defaults.
43
+ *
44
+ * Features enabled by default:
45
+ * - QR auto-display in terminal
46
+ * - Auto-reconnect on disconnect (except logged out)
47
+ * - Auto-save credentials
48
+ * - Pino pretty logger
49
+ * - Default browser identification
50
+ * - Keep alive ping every 20s
51
+ */
52
+ function makeWASocketWithDefaults(options) {
53
+ const { authState, saveCreds, browser = ['Waliwa Bot', 'Chrome', '1.0.0'], logger, printQRInTerminal = true, autoReconnect = true, reconnectDelayMs = 5000, markOnlineOnConnect = true, syncFullHistory = false, onQR, onOpen, onClose, waWebSocketUrl, keepAliveIntervalMs = 20000, connectTimeoutMs = 20000, defaultQueryTimeoutMs = 60000, additionalConfig = {} } = options;
54
+ // Default logger: pino with pretty print
55
+ const defaultLogger = logger ?? (0, pino_1.default)({
56
+ level: 'warn',
57
+ transport: {
58
+ target: 'pino-pretty',
59
+ options: { colorize: true, translateTime: 'SYS:HH:MM:ss' }
60
+ }
61
+ });
62
+ // Create socket
63
+ const sock = (0, baileys_1.makeWASocket)({
64
+ auth: authState,
65
+ browser,
66
+ logger: defaultLogger,
67
+ markOnlineOnConnect,
68
+ syncFullHistory,
69
+ printQRInTerminal: false, // We handle QR manually
70
+ waWebSocketUrl,
71
+ keepAliveIntervalMs,
72
+ connectTimeoutMs,
73
+ defaultQueryTimeoutMs,
74
+ ...additionalConfig
75
+ });
76
+ // Auto-save credentials
77
+ if (saveCreds) {
78
+ sock.ev.on('creds.update', saveCreds);
79
+ }
80
+ // Handle connection updates
81
+ sock.ev.on('connection.update', (update) => {
82
+ const { connection, lastDisconnect, qr } = update;
83
+ // QR handler
84
+ if (qr) {
85
+ if (onQR) {
86
+ onQR(qr);
87
+ }
88
+ else if (printQRInTerminal) {
89
+ console.log('\n📱 Scan QR dengan WhatsApp → Settings → Linked Devices:\n');
90
+ qrcode_terminal_1.default.generate(qr, { small: true }, (code) => {
91
+ console.log(code);
92
+ });
93
+ }
94
+ }
95
+ // Connection open
96
+ if (connection === 'open') {
97
+ if (onOpen) {
98
+ onOpen();
99
+ }
100
+ else {
101
+ console.log('✅ Bot terhubung! Logged in sebagai:', sock.user?.id ?? 'unknown');
102
+ }
103
+ }
104
+ // Connection close
105
+ if (connection === 'close') {
106
+ const statusCode = new boom_1.Boom(lastDisconnect?.error)?.output?.statusCode;
107
+ const shouldReconnect = statusCode !== baileys_1.DisconnectReason.loggedOut && autoReconnect;
108
+ if (onClose) {
109
+ onClose(statusCode, shouldReconnect);
110
+ }
111
+ else {
112
+ console.log(`❌ Koneksi terputus (code: ${statusCode})${shouldReconnect ? ', reconnecting...' : ''}`);
113
+ }
114
+ if (shouldReconnect) {
115
+ setTimeout(() => {
116
+ console.log('🔄 Reconnecting...');
117
+ // Reconnect with same config
118
+ makeWASocketWithDefaults({
119
+ authState,
120
+ saveCreds,
121
+ browser,
122
+ logger: defaultLogger,
123
+ printQRInTerminal,
124
+ autoReconnect,
125
+ reconnectDelayMs,
126
+ markOnlineOnConnect,
127
+ syncFullHistory,
128
+ onQR,
129
+ onOpen,
130
+ onClose,
131
+ waWebSocketUrl,
132
+ keepAliveIntervalMs,
133
+ connectTimeoutMs,
134
+ defaultQueryTimeoutMs,
135
+ additionalConfig
136
+ });
137
+ }, reconnectDelayMs);
138
+ }
139
+ else if (statusCode === baileys_1.DisconnectReason.loggedOut) {
140
+ console.log('🚫 Logged out. Hapus folder auth dan restart untuk scan QR baru.');
141
+ }
142
+ }
143
+ });
144
+ return sock;
145
+ }
146
+ /**
147
+ * Quick start helper - buat socket + setup auth dengan 1 call
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * import { quickStart } from 'waliwa';
152
+ *
153
+ * const sock = await quickStart({
154
+ * authFolder: './auth',
155
+ * browser: ['Waliwa Bot', 'Chrome', '1.0.0']
156
+ * });
157
+ *
158
+ * sock.ev.on('messages.upsert', ({ messages }) => {
159
+ * console.log('Got:', messages);
160
+ * });
161
+ * ```
162
+ */
163
+ async function quickStart(opts) {
164
+ const { authFolder, browser, printQRInTerminal, onOpen, onClose } = opts;
165
+ const { state, saveCreds } = await (0, baileys_1.useMultiFileAuthState)(authFolder);
166
+ return makeWASocketWithDefaults({
167
+ authState: state,
168
+ saveCreds,
169
+ browser: browser ?? ['Waliwa Bot', 'Chrome', '1.0.0'],
170
+ printQRInTerminal: printQRInTerminal ?? true,
171
+ onOpen,
172
+ onClose
173
+ });
174
+ }
175
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/helpers/defaults.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;;;AAuEH,4DAqHC;AAmBD,gCAmBC;AAhOD,qDAAgG;AAChG,qCAAkC;AAClC,sEAAqC;AACrC,gDAAwB;AAuDxB;;;;;;;;;;GAUG;AACH,SAAgB,wBAAwB,CAAC,OAA8B;IACrE,MAAM,EACJ,SAAS,EACT,SAAS,EACT,OAAO,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC3C,MAAM,EACN,iBAAiB,GAAG,IAAI,EACxB,aAAa,GAAG,IAAI,EACpB,gBAAgB,GAAG,IAAI,EACvB,mBAAmB,GAAG,IAAI,EAC1B,eAAe,GAAG,KAAK,EACvB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,cAAc,EACd,mBAAmB,GAAG,KAAK,EAC3B,gBAAgB,GAAG,KAAK,EACxB,qBAAqB,GAAG,KAAK,EAC7B,gBAAgB,GAAG,EAAE,EACtB,GAAG,OAAO,CAAC;IAEZ,yCAAyC;IACzC,MAAM,aAAa,GAAG,MAAM,IAAI,IAAA,cAAI,EAAC;QACnC,KAAK,EAAE,MAAM;QACb,SAAS,EAAE;YACT,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE;SAC3D;KACF,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,IAAI,GAAG,IAAA,sBAAY,EAAC;QACxB,IAAI,EAAE,SAAS;QACf,OAAO;QACP,MAAM,EAAE,aAAa;QACrB,mBAAmB;QACnB,eAAe;QACf,iBAAiB,EAAE,KAAK,EAAE,wBAAwB;QAClD,cAAc;QACd,mBAAmB;QACnB,gBAAgB;QAChB,qBAAqB;QACrB,GAAG,gBAAgB;KACpB,CAAC,CAAC;IAEH,wBAAwB;IACxB,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,MAAW,EAAE,EAAE;QAC9C,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAElD,aAAa;QACb,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,EAAE,CAAC,CAAC;YACX,CAAC;iBAAM,IAAI,iBAAiB,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;gBAC3E,yBAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE;oBACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,SAAS,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,WAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC;YACvE,MAAM,eAAe,GAAG,UAAU,KAAK,0BAAgB,CAAC,SAAS,IAAI,aAAa,CAAC;YAEnF,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,UAAU,IAAI,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvG,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,UAAU,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;oBAClC,6BAA6B;oBAC7B,wBAAwB,CAAC;wBACvB,SAAS;wBACT,SAAS;wBACT,OAAO;wBACP,MAAM,EAAE,aAAa;wBACrB,iBAAiB;wBACjB,aAAa;wBACb,gBAAgB;wBAChB,mBAAmB;wBACnB,eAAe;wBACf,IAAI;wBACJ,MAAM;wBACN,OAAO;wBACP,cAAc;wBACd,mBAAmB;wBACnB,gBAAgB;wBAChB,qBAAqB;wBACrB,gBAAgB;qBACjB,CAAC,CAAC;gBACL,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACvB,CAAC;iBAAM,IAAI,UAAU,KAAK,0BAAgB,CAAC,SAAS,EAAE,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACI,KAAK,UAAU,UAAU,CAAC,IAMhC;IACC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEzE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,+BAAqB,EAAC,UAAU,CAAC,CAAC;IAErE,OAAO,wBAAwB,CAAC;QAC9B,SAAS,EAAE,KAAK;QAChB,SAAS;QACT,OAAO,EAAE,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC;QACrD,iBAAiB,EAAE,iBAAiB,IAAI,IAAI;QAC5C,MAAM;QACN,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Waliwa - MediaHelper
3
+ *
4
+ * Helper untuk download, convert, dan process media files.
5
+ * Pakai sharp untuk image processing dan axios untuk HTTP downloads.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { MediaHelper } from 'waliwa';
10
+ *
11
+ * // Download media dari message
12
+ * const buffer = await MediaHelper.downloadFromMessage(sock, message);
13
+ *
14
+ * // Resize image untuk profile picture (640x640)
15
+ * const resized = await MediaHelper.resizeImage(buffer, 640, 640);
16
+ *
17
+ * // Convert image ke WebP (untuk sticker)
18
+ * const webp = await MediaHelper.toWebP(buffer);
19
+ * ```
20
+ */
21
+ export declare class MediaHelper {
22
+ /**
23
+ * Download media dari WhatsApp message
24
+ */
25
+ static downloadFromMessage(sock: any, message: any): Promise<Buffer>;
26
+ /**
27
+ * Download media dari URL
28
+ */
29
+ static downloadFromUrl(url: string): Promise<Buffer>;
30
+ /**
31
+ * Resize image (untuk profile picture, thumbnail, dll)
32
+ */
33
+ static resizeImage(buffer: Buffer, width: number, height: number, options?: {
34
+ fit?: 'cover' | 'contain' | 'fill';
35
+ quality?: number;
36
+ }): Promise<Buffer>;
37
+ /**
38
+ * Convert image ke WebP (untuk sticker)
39
+ */
40
+ static toWebP(buffer: Buffer, options?: {
41
+ width?: number;
42
+ height?: number;
43
+ quality?: number;
44
+ }): Promise<Buffer>;
45
+ /**
46
+ * Convert image ke JPEG
47
+ */
48
+ static toJPEG(buffer: Buffer, quality?: number): Promise<Buffer>;
49
+ /**
50
+ * Convert image ke PNG
51
+ */
52
+ static toPNG(buffer: Buffer): Promise<Buffer>;
53
+ /**
54
+ * Get image metadata
55
+ */
56
+ static getMetadata(buffer: Buffer): Promise<{
57
+ width: number;
58
+ height: number;
59
+ format: string;
60
+ size: number;
61
+ }>;
62
+ /**
63
+ * Get MIME type from file extension
64
+ */
65
+ static getMimeType(filename: string): string;
66
+ /**
67
+ * Get file extension from MIME type
68
+ */
69
+ static getExtension(mimetype: string): string;
70
+ /**
71
+ * Save buffer to file
72
+ */
73
+ static saveToFile(buffer: Buffer, filePath: string): Promise<void>;
74
+ /**
75
+ * Read file to buffer
76
+ */
77
+ static readFromFile(filePath: string): Promise<Buffer>;
78
+ /**
79
+ * Compress image (reduce file size)
80
+ */
81
+ static compress(buffer: Buffer, quality?: number): Promise<Buffer>;
82
+ /**
83
+ * Create thumbnail from image
84
+ */
85
+ static createThumbnail(buffer: Buffer, size?: number): Promise<Buffer>;
86
+ /**
87
+ * Rotate image
88
+ */
89
+ static rotate(buffer: Buffer, degrees: number): Promise<Buffer>;
90
+ /**
91
+ * Flip image (horizontal/vertical)
92
+ */
93
+ static flip(buffer: Buffer, direction: 'horizontal' | 'vertical'): Promise<Buffer>;
94
+ /**
95
+ * Apply grayscale
96
+ */
97
+ static grayscale(buffer: Buffer): Promise<Buffer>;
98
+ /**
99
+ * Blur image
100
+ */
101
+ static blur(buffer: Buffer, sigma?: number): Promise<Buffer>;
102
+ /**
103
+ * Add watermark/text overlay
104
+ */
105
+ static addWatermark(buffer: Buffer, text: string, options?: {
106
+ fontSize?: number;
107
+ color?: string;
108
+ opacity?: number;
109
+ }): Promise<Buffer>;
110
+ /**
111
+ * Convert buffer to base64 data URL
112
+ */
113
+ static toDataUrl(buffer: Buffer, mimetype: string): string;
114
+ /**
115
+ * Convert base64 data URL to buffer
116
+ */
117
+ static fromDataUrl(dataUrl: string): Buffer;
118
+ /**
119
+ * Get file size in human-readable format
120
+ */
121
+ static formatSize(bytes: number): string;
122
+ }
123
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/helpers/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,qBAAa,WAAW;IACtB;;OAEG;WACU,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E;;OAEG;WACU,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW1D;;OAEG;WACU,WAAW,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACrE,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;WACU,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAClE,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;WACU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1E;;OAEG;WACU,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD;;OAEG;WACU,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAChD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAUF;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI5C;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;WACU,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE;;OAEG;WACU,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D;;OAEG;WACU,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E;;OAEG;WACU,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAOjF;;OAEG;WACU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE;;OAEG;WACU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAQxF;;OAEG;WACU,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD;;OAEG;WACU,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE;;OAEG;WACU,YAAY,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACpE,OAAO,CAAC,MAAM,CAAC;IAqBlB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK1D;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAK3C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAMzC"}
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /**
3
+ * Waliwa - MediaHelper
4
+ *
5
+ * Helper untuk download, convert, dan process media files.
6
+ * Pakai sharp untuk image processing dan axios untuk HTTP downloads.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { MediaHelper } from 'waliwa';
11
+ *
12
+ * // Download media dari message
13
+ * const buffer = await MediaHelper.downloadFromMessage(sock, message);
14
+ *
15
+ * // Resize image untuk profile picture (640x640)
16
+ * const resized = await MediaHelper.resizeImage(buffer, 640, 640);
17
+ *
18
+ * // Convert image ke WebP (untuk sticker)
19
+ * const webp = await MediaHelper.toWebP(buffer);
20
+ * ```
21
+ */
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ var desc = Object.getOwnPropertyDescriptor(m, k);
25
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
26
+ desc = { enumerable: true, get: function() { return m[k]; } };
27
+ }
28
+ Object.defineProperty(o, k2, desc);
29
+ }) : (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ o[k2] = m[k];
32
+ }));
33
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
34
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
35
+ }) : function(o, v) {
36
+ o["default"] = v;
37
+ });
38
+ var __importStar = (this && this.__importStar) || (function () {
39
+ var ownKeys = function(o) {
40
+ ownKeys = Object.getOwnPropertyNames || function (o) {
41
+ var ar = [];
42
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
43
+ return ar;
44
+ };
45
+ return ownKeys(o);
46
+ };
47
+ return function (mod) {
48
+ if (mod && mod.__esModule) return mod;
49
+ var result = {};
50
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
51
+ __setModuleDefault(result, mod);
52
+ return result;
53
+ };
54
+ })();
55
+ var __importDefault = (this && this.__importDefault) || function (mod) {
56
+ return (mod && mod.__esModule) ? mod : { "default": mod };
57
+ };
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.MediaHelper = void 0;
60
+ const sharp_1 = __importDefault(require("sharp"));
61
+ const axios_1 = __importDefault(require("axios"));
62
+ const mime = __importStar(require("mime-types"));
63
+ const fs_1 = require("fs");
64
+ const path = __importStar(require("path"));
65
+ class MediaHelper {
66
+ /**
67
+ * Download media dari WhatsApp message
68
+ */
69
+ static async downloadFromMessage(sock, message) {
70
+ const buffer = await sock.downloadMediaMessage(message);
71
+ return Buffer.from(buffer);
72
+ }
73
+ /**
74
+ * Download media dari URL
75
+ */
76
+ static async downloadFromUrl(url) {
77
+ const response = await axios_1.default.get(url, {
78
+ responseType: 'arraybuffer',
79
+ timeout: 30000,
80
+ headers: {
81
+ 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
82
+ }
83
+ });
84
+ return Buffer.from(response.data);
85
+ }
86
+ /**
87
+ * Resize image (untuk profile picture, thumbnail, dll)
88
+ */
89
+ static async resizeImage(buffer, width, height, options = {}) {
90
+ const { fit = 'cover', quality = 80 } = options;
91
+ return (0, sharp_1.default)(buffer)
92
+ .resize(width, height, { fit })
93
+ .jpeg({ quality })
94
+ .toBuffer();
95
+ }
96
+ /**
97
+ * Convert image ke WebP (untuk sticker)
98
+ */
99
+ static async toWebP(buffer, options = {}) {
100
+ const { width = 512, height = 512, quality = 80 } = options;
101
+ return (0, sharp_1.default)(buffer)
102
+ .resize(width, height, { fit: 'contain', background: { r: 0, g: 0, b: 0, alpha: 0 } })
103
+ .webp({ quality })
104
+ .toBuffer();
105
+ }
106
+ /**
107
+ * Convert image ke JPEG
108
+ */
109
+ static async toJPEG(buffer, quality = 80) {
110
+ return (0, sharp_1.default)(buffer).jpeg({ quality }).toBuffer();
111
+ }
112
+ /**
113
+ * Convert image ke PNG
114
+ */
115
+ static async toPNG(buffer) {
116
+ return (0, sharp_1.default)(buffer).png().toBuffer();
117
+ }
118
+ /**
119
+ * Get image metadata
120
+ */
121
+ static async getMetadata(buffer) {
122
+ const meta = await (0, sharp_1.default)(buffer).metadata();
123
+ return {
124
+ width: meta.width ?? 0,
125
+ height: meta.height ?? 0,
126
+ format: meta.format ?? 'unknown',
127
+ size: buffer.length
128
+ };
129
+ }
130
+ /**
131
+ * Get MIME type from file extension
132
+ */
133
+ static getMimeType(filename) {
134
+ return mime.lookup(filename) || 'application/octet-stream';
135
+ }
136
+ /**
137
+ * Get file extension from MIME type
138
+ */
139
+ static getExtension(mimetype) {
140
+ return mime.extension(mimetype) || '';
141
+ }
142
+ /**
143
+ * Save buffer to file
144
+ */
145
+ static async saveToFile(buffer, filePath) {
146
+ await fs_1.promises.mkdir(path.dirname(filePath), { recursive: true });
147
+ await fs_1.promises.writeFile(filePath, buffer);
148
+ }
149
+ /**
150
+ * Read file to buffer
151
+ */
152
+ static async readFromFile(filePath) {
153
+ return fs_1.promises.readFile(filePath);
154
+ }
155
+ /**
156
+ * Compress image (reduce file size)
157
+ */
158
+ static async compress(buffer, quality = 60) {
159
+ return (0, sharp_1.default)(buffer).jpeg({ quality, mozjpeg: true }).toBuffer();
160
+ }
161
+ /**
162
+ * Create thumbnail from image
163
+ */
164
+ static async createThumbnail(buffer, size = 200) {
165
+ return (0, sharp_1.default)(buffer)
166
+ .resize(size, size, { fit: 'cover' })
167
+ .jpeg({ quality: 70 })
168
+ .toBuffer();
169
+ }
170
+ /**
171
+ * Rotate image
172
+ */
173
+ static async rotate(buffer, degrees) {
174
+ return (0, sharp_1.default)(buffer).rotate(degrees).toBuffer();
175
+ }
176
+ /**
177
+ * Flip image (horizontal/vertical)
178
+ */
179
+ static async flip(buffer, direction) {
180
+ const image = (0, sharp_1.default)(buffer);
181
+ if (direction === 'horizontal') {
182
+ return image.flop().toBuffer();
183
+ }
184
+ return image.flip().toBuffer();
185
+ }
186
+ /**
187
+ * Apply grayscale
188
+ */
189
+ static async grayscale(buffer) {
190
+ return (0, sharp_1.default)(buffer).grayscale().toBuffer();
191
+ }
192
+ /**
193
+ * Blur image
194
+ */
195
+ static async blur(buffer, sigma = 5) {
196
+ return (0, sharp_1.default)(buffer).blur(sigma).toBuffer();
197
+ }
198
+ /**
199
+ * Add watermark/text overlay
200
+ */
201
+ static async addWatermark(buffer, text, options = {}) {
202
+ const { fontSize = 32, color = '#ffffff', opacity = 0.8 } = options;
203
+ // Create SVG watermark
204
+ const svg = `
205
+ <svg width="500" height="100">
206
+ <text x="50%" y="50%" font-size="${fontSize}" fill="${color}" opacity="${opacity}"
207
+ text-anchor="middle" dominant-baseline="middle"
208
+ font-family="Arial, sans-serif" font-weight="bold">
209
+ ${text}
210
+ </text>
211
+ </svg>
212
+ `;
213
+ const watermark = Buffer.from(svg);
214
+ return (0, sharp_1.default)(buffer)
215
+ .composite([{ input: watermark, gravity: 'southeast' }])
216
+ .toBuffer();
217
+ }
218
+ /**
219
+ * Convert buffer to base64 data URL
220
+ */
221
+ static toDataUrl(buffer, mimetype) {
222
+ const base64 = buffer.toString('base64');
223
+ return `data:${mimetype};base64,${base64}`;
224
+ }
225
+ /**
226
+ * Convert base64 data URL to buffer
227
+ */
228
+ static fromDataUrl(dataUrl) {
229
+ const base64 = dataUrl.split(',')[1];
230
+ return Buffer.from(base64, 'base64');
231
+ }
232
+ /**
233
+ * Get file size in human-readable format
234
+ */
235
+ static formatSize(bytes) {
236
+ if (bytes < 1024)
237
+ return `${bytes} B`;
238
+ if (bytes < 1024 * 1024)
239
+ return `${(bytes / 1024).toFixed(1)} KB`;
240
+ if (bytes < 1024 * 1024 * 1024)
241
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
242
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
243
+ }
244
+ }
245
+ exports.MediaHelper = MediaHelper;
246
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/helpers/media.ts"],"names":[],"mappings":"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"}