@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.
- package/dist/helpers/defaults.d.ts +102 -0
- package/dist/helpers/defaults.d.ts.map +1 -0
- package/dist/helpers/defaults.js +175 -0
- package/dist/helpers/defaults.js.map +1 -0
- package/dist/helpers/media.d.ts +123 -0
- package/dist/helpers/media.d.ts.map +1 -0
- package/dist/helpers/media.js +246 -0
- package/dist/helpers/media.js.map +1 -0
- package/dist/helpers/message.d.ts +147 -0
- package/dist/helpers/message.d.ts.map +1 -0
- package/dist/helpers/message.js +322 -0
- package/dist/helpers/message.js.map +1 -0
- package/dist/helpers/sticker.d.ts +112 -0
- package/dist/helpers/sticker.d.ts.map +1 -0
- package/dist/helpers/sticker.js +267 -0
- package/dist/helpers/sticker.js.map +1 -0
- package/dist/index.d.ts +28 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -14
- package/dist/index.js.map +1 -1
- package/package.json +13 -2
|
@@ -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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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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"}
|