rynkai 0.2.2 → 0.3.1

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.
Files changed (33) hide show
  1. package/README.md +65 -2
  2. package/dist/core/AccessControl.d.ts +68 -0
  3. package/dist/core/AccessControl.d.ts.map +1 -0
  4. package/dist/core/AccessControl.js +87 -0
  5. package/dist/core/AccessControl.js.map +1 -0
  6. package/dist/core/AccessControl.test.d.ts +2 -0
  7. package/dist/core/AccessControl.test.d.ts.map +1 -0
  8. package/dist/core/AccessControl.test.js +100 -0
  9. package/dist/core/AccessControl.test.js.map +1 -0
  10. package/dist/core/Client.d.ts +12 -0
  11. package/dist/core/Client.d.ts.map +1 -1
  12. package/dist/core/Client.js +43 -1
  13. package/dist/core/Client.js.map +1 -1
  14. package/dist/core/EventEmitterErrorSemantics.test.d.ts +2 -0
  15. package/dist/core/EventEmitterErrorSemantics.test.d.ts.map +1 -0
  16. package/dist/core/EventEmitterErrorSemantics.test.js +29 -0
  17. package/dist/core/EventEmitterErrorSemantics.test.js.map +1 -0
  18. package/dist/index.d.ts +4 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +6 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/session/FileSessionStore.d.ts.map +1 -1
  23. package/dist/session/FileSessionStore.js +6 -2
  24. package/dist/session/FileSessionStore.js.map +1 -1
  25. package/dist/sticker/createSticker.d.ts +30 -0
  26. package/dist/sticker/createSticker.d.ts.map +1 -0
  27. package/dist/sticker/createSticker.js +161 -0
  28. package/dist/sticker/createSticker.js.map +1 -0
  29. package/dist/sticker/createSticker.test.d.ts +2 -0
  30. package/dist/sticker/createSticker.test.d.ts.map +1 -0
  31. package/dist/sticker/createSticker.test.js +69 -0
  32. package/dist/sticker/createSticker.test.js.map +1 -0
  33. package/package.json +13 -3
package/README.md CHANGED
@@ -64,6 +64,67 @@ await bot.plugins.loadFromDirectory('./plugins');
64
64
  await bot.connect();
65
65
  ```
66
66
 
67
+ ## Sticker maker
68
+
69
+ Butuh package tambahan:
70
+ ```bash
71
+ npm install sharp # wajib, buat convert gambar -> webp
72
+ npm install node-webpmux # opsional, cuma kalau mau isi packname/author
73
+ ```
74
+
75
+ ```ts
76
+ import { MessageBuilder } from 'rynkai';
77
+
78
+ bot.on('message', async (msg) => {
79
+ if (msg.text === '.stiker' && msg.type === 'image') {
80
+ const buffer = await bot.downloadMedia(msg);
81
+ await bot.sendSticker(msg.chatId, buffer, { packname: 'Bot Aku', author: 'rynk' });
82
+ }
83
+ });
84
+ ```
85
+
86
+ > Catatan: `bot.downloadMedia()` butuh objek `NormalizedMessage` penuh (termasuk `raw`). Kalau mau download media dari pesan yang **di-reply** (`msg.quoted`), simpan/ambil pesan aslinya lewat `raw.key` dan proses manual — `msg.quoted` sengaja tidak menyertakan field `quoted`-nya sendiri (menghindari nesting tak terbatas), jadi bukan tipe yang sama persis.
87
+
88
+ Atau pakai fungsi standalone-nya langsung kalau butuh buffer-nya (bukan langsung kirim):
89
+ ```ts
90
+ import { createSticker } from 'rynkai';
91
+
92
+ const stickerBuffer = await createSticker(imageBuffer, { packname: 'Bot Aku', author: 'rynk' });
93
+ await bot.send(chatId, MessageBuilder.sticker(stickerBuffer));
94
+ ```
95
+
96
+ **Sticker animasi (dari video/gif)** butuh `ffmpeg` terinstall di sistem (bukan package npm) — `apt install ffmpeg` di Debian/Ubuntu, atau `pkg install ffmpeg` di Termux:
97
+ ```ts
98
+ await bot.sendAnimatedSticker(chatId, videoBuffer, { packname: 'Bot Aku' });
99
+ // otomatis dipotong maksimal 6 detik pertama
100
+ ```
101
+
102
+ > **Catatan kompatibilitas:** `sharp` adalah native binding (butuh libvips terkompilasi). Di kebanyakan platform (Linux x64/arm64 server, macOS, Windows, GitHub Actions) ini terinstall otomatis lewat prebuilt binary. Tapi di **Termux/Android ARM64**, prebuilt binary sharp sering tidak tersedia — kalau kamu develop bot di HP lewat Termux, fitur sticker gambar mungkin tidak berfungsi sampai kamu install libvips manual (lihat [dokumentasi instalasi sharp](https://sharp.pixelplumbing.com/install)) atau pakai varian WASM-nya. Ini bukan bug di rynkai, melainkan keterbatasan platform Termux itu sendiri.
103
+
104
+ ## Blocklist / whitelist user & grup
105
+
106
+ ```ts
107
+ import { AccessControl } from 'rynkai';
108
+
109
+ // Mode blocklist (default): bot terbuka untuk semua, kecuali yang di-block
110
+ const acl = new AccessControl({ replyMessage: 'Kamu diblokir dari bot ini.' });
111
+ acl.block('628123456789@s.whatsapp.net');
112
+ acl.unblock('628123456789@s.whatsapp.net');
113
+
114
+ bot.use(acl.middleware());
115
+ ```
116
+
117
+ ```ts
118
+ // Mode whitelist: bot privat, cuma JID tertentu yang boleh pakai
119
+ const acl = new AccessControl({ mode: 'whitelist' });
120
+ acl.allow('628123456789@s.whatsapp.net'); // izinkan user tertentu
121
+ acl.allow('120363000000000000@g.us'); // izinkan grup tertentu
122
+
123
+ bot.use(acl.middleware());
124
+ ```
125
+
126
+ Satu instance `AccessControl` bisa dipakai buat user maupun grup sekaligus (dibedakan dari suffix JID-nya). Middleware ini mengecek **sender DAN chatId grup** — kalau salah satu diblokir, command tidak diteruskan ke plugin.
127
+
67
128
  ## Reconnect backoff & graceful shutdown
68
129
 
69
130
  Kalau koneksi putus (bukan karena logout), rynkai otomatis reconnect dengan **exponential backoff** (jeda 1 detik → 2 → 4 → ... sampai maksimal 30 detik, plus sedikit jitter acak) — bukan reconnect instan yang bisa bikin WA curiga.
@@ -276,7 +337,7 @@ bot.on('pairingCode', (code) => console.log('Kode pairing:', code));
276
337
 
277
338
  ## Error handling
278
339
 
279
- Kalau ada plugin/middleware yang throw error, rynkai **tidak akan crash** — errornya diisolasi per-pesan, jadi pesan lain tetap diproses normal.
340
+ Kalau ada plugin/middleware yang throw error, rynkai **tidak akan crash** — errornya diisolasi per-pesan, jadi pesan lain tetap diproses normal. Ini berlaku otomatis walau kamu tidak pasang listener `error` sama sekali (rynkai selalu punya listener default internal, jadi aman dari perilaku khusus Node.js `EventEmitter` yang biasanya crash kalau event `'error'` di-emit tanpa listener).
280
341
 
281
342
  ```ts
282
343
  bot.on('error', (err, { source, message }) => {
@@ -324,6 +385,8 @@ Masih tahap awal (0.1.0). Yang sudah ada:
324
385
  - [x] GitHub Actions CI (auto build+test tiap push/PR, matrix Node 20 & 22)
325
386
  - [x] Message reactions (`react`, `removeReaction`) & read receipt (`markAsRead`, `autoRead`)
326
387
  - [x] Graceful shutdown (`disconnect()`) + reconnect exponential backoff dengan jitter
388
+ - [x] Blocklist/whitelist user & grup built-in (`AccessControl`)
389
+ - [x] Sticker maker (`createSticker`, `createAnimatedSticker`, `sendSticker`, `sendAnimatedSticker`)
327
390
 
328
391
  Belum ada (rencana selanjutnya):
329
- - [ ] CLI scaffold (`npx create-rynkai-bot`)
392
+ - [x] ~~CLI scaffold (`npx create-rynkai-bot`)~~ — sudah tersedia sebagai package terpisah
@@ -0,0 +1,68 @@
1
+ import type { Middleware } from './Middleware';
2
+ export type AccessControlMode = 'blocklist' | 'whitelist';
3
+ export interface AccessControlConfig {
4
+ /**
5
+ * 'blocklist' (default): semua JID boleh pakai bot KECUALI yang ada di list.
6
+ * 'whitelist': semua JID diblokir KECUALI yang ada di list.
7
+ */
8
+ mode?: AccessControlMode;
9
+ /** Daftar awal JID (user atau grup, bisa dicampur). */
10
+ initial?: string[];
11
+ /**
12
+ * Pesan yang dikirim ke JID yang diblokir. Default: tidak ada balasan sama
13
+ * sekali (silent) — command diam-diam tidak dijalankan.
14
+ */
15
+ replyMessage?: string;
16
+ }
17
+ /**
18
+ * Kelola daftar blokir/izin untuk user & group JID, dan sediakan sebagai
19
+ * middleware siap pakai lewat client.use(). Satu instance bisa dipakai untuk
20
+ * JID user maupun grup sekaligus (keduanya cuma string JID, dibedakan
21
+ * suffix "@s.whatsapp.net" vs "@g.us").
22
+ *
23
+ * Mode blocklist (paling umum — bot terbuka untuk semua, kecuali yang di-block):
24
+ * ```ts
25
+ * const acl = new AccessControl({ mode: 'blocklist', replyMessage: 'Kamu diblokir dari bot ini.' });
26
+ * acl.block('628123456789@s.whatsapp.net');
27
+ * bot.use(acl.middleware());
28
+ * ```
29
+ *
30
+ * Mode whitelist (bot privat — cuma JID tertentu yang boleh pakai):
31
+ * ```ts
32
+ * const acl = new AccessControl({ mode: 'whitelist' });
33
+ * acl.allow('628123456789@s.whatsapp.net');
34
+ * acl.allow('120363000000000000@g.us'); // izinkan satu grup spesifik
35
+ * bot.use(acl.middleware());
36
+ * ```
37
+ */
38
+ export declare class AccessControl {
39
+ private mode;
40
+ private entries;
41
+ private replyMessage?;
42
+ constructor(config?: AccessControlConfig);
43
+ /** Tambah JID ke daftar. Di mode blocklist ini artinya "blokir", di mode whitelist artinya "izinkan". */
44
+ add(jid: string): void;
45
+ /** Alias add() — lebih intuitif dipakai di mode blocklist. */
46
+ block(jid: string): void;
47
+ /** Alias add() — lebih intuitif dipakai di mode whitelist. */
48
+ allow(jid: string): void;
49
+ /** Hapus JID dari daftar. */
50
+ remove(jid: string): void;
51
+ /** Alias remove() — lebih intuitif dipakai di mode blocklist. */
52
+ unblock(jid: string): void;
53
+ /** Alias remove() — lebih intuitif dipakai di mode whitelist. */
54
+ disallow(jid: string): void;
55
+ /** Cek apakah JID ada di daftar (terlepas dari mode aktif). */
56
+ has(jid: string): boolean;
57
+ /** Semua JID yang ada di daftar saat ini. */
58
+ list(): string[];
59
+ /** True kalau JID ini boleh pakai bot, sesuai mode aktif saat ini. */
60
+ isAllowed(jid: string): boolean;
61
+ /**
62
+ * Ubah instance ini jadi Middleware siap pakai lewat client.use().
63
+ * Mengecek sender (JID pengirim) DAN chatId (JID grup kalau di grup) —
64
+ * keduanya harus lolos supaya command diteruskan ke plugin.
65
+ */
66
+ middleware(): Middleware;
67
+ }
68
+ //# sourceMappingURL=AccessControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessControl.d.ts","sourceRoot":"","sources":["../../src/core/AccessControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,MAAM,GAAE,mBAAwB;IAM5C,yGAAyG;IACzG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAItB,8DAA8D;IAC9D,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB,8DAA8D;IAC9D,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB,6BAA6B;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,iEAAiE;IACjE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1B,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI3B,+DAA+D;IAC/D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,6CAA6C;IAC7C,IAAI,IAAI,MAAM,EAAE;IAIhB,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK/B;;;;OAIG;IACH,UAAU,IAAI,UAAU;CAczB"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccessControl = void 0;
4
+ /**
5
+ * Kelola daftar blokir/izin untuk user & group JID, dan sediakan sebagai
6
+ * middleware siap pakai lewat client.use(). Satu instance bisa dipakai untuk
7
+ * JID user maupun grup sekaligus (keduanya cuma string JID, dibedakan
8
+ * suffix "@s.whatsapp.net" vs "@g.us").
9
+ *
10
+ * Mode blocklist (paling umum — bot terbuka untuk semua, kecuali yang di-block):
11
+ * ```ts
12
+ * const acl = new AccessControl({ mode: 'blocklist', replyMessage: 'Kamu diblokir dari bot ini.' });
13
+ * acl.block('628123456789@s.whatsapp.net');
14
+ * bot.use(acl.middleware());
15
+ * ```
16
+ *
17
+ * Mode whitelist (bot privat — cuma JID tertentu yang boleh pakai):
18
+ * ```ts
19
+ * const acl = new AccessControl({ mode: 'whitelist' });
20
+ * acl.allow('628123456789@s.whatsapp.net');
21
+ * acl.allow('120363000000000000@g.us'); // izinkan satu grup spesifik
22
+ * bot.use(acl.middleware());
23
+ * ```
24
+ */
25
+ class AccessControl {
26
+ constructor(config = {}) {
27
+ this.mode = config.mode ?? 'blocklist';
28
+ this.entries = new Set(config.initial ?? []);
29
+ this.replyMessage = config.replyMessage;
30
+ }
31
+ /** Tambah JID ke daftar. Di mode blocklist ini artinya "blokir", di mode whitelist artinya "izinkan". */
32
+ add(jid) {
33
+ this.entries.add(jid);
34
+ }
35
+ /** Alias add() — lebih intuitif dipakai di mode blocklist. */
36
+ block(jid) {
37
+ this.add(jid);
38
+ }
39
+ /** Alias add() — lebih intuitif dipakai di mode whitelist. */
40
+ allow(jid) {
41
+ this.add(jid);
42
+ }
43
+ /** Hapus JID dari daftar. */
44
+ remove(jid) {
45
+ this.entries.delete(jid);
46
+ }
47
+ /** Alias remove() — lebih intuitif dipakai di mode blocklist. */
48
+ unblock(jid) {
49
+ this.remove(jid);
50
+ }
51
+ /** Alias remove() — lebih intuitif dipakai di mode whitelist. */
52
+ disallow(jid) {
53
+ this.remove(jid);
54
+ }
55
+ /** Cek apakah JID ada di daftar (terlepas dari mode aktif). */
56
+ has(jid) {
57
+ return this.entries.has(jid);
58
+ }
59
+ /** Semua JID yang ada di daftar saat ini. */
60
+ list() {
61
+ return [...this.entries];
62
+ }
63
+ /** True kalau JID ini boleh pakai bot, sesuai mode aktif saat ini. */
64
+ isAllowed(jid) {
65
+ const inList = this.entries.has(jid);
66
+ return this.mode === 'blocklist' ? !inList : inList;
67
+ }
68
+ /**
69
+ * Ubah instance ini jadi Middleware siap pakai lewat client.use().
70
+ * Mengecek sender (JID pengirim) DAN chatId (JID grup kalau di grup) —
71
+ * keduanya harus lolos supaya command diteruskan ke plugin.
72
+ */
73
+ middleware() {
74
+ return async (ctx, next) => {
75
+ const { sender, chatId } = ctx.message;
76
+ if (!this.isAllowed(sender) || !this.isAllowed(chatId)) {
77
+ if (this.replyMessage) {
78
+ await ctx.reply(this.replyMessage);
79
+ }
80
+ return; // next() tidak dipanggil — command tidak diteruskan ke plugin
81
+ }
82
+ await next();
83
+ };
84
+ }
85
+ }
86
+ exports.AccessControl = AccessControl;
87
+ //# sourceMappingURL=AccessControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessControl.js","sourceRoot":"","sources":["../../src/core/AccessControl.ts"],"names":[],"mappings":";;;AAmBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,aAAa;IAKxB,YAAY,SAA8B,EAAE;QAC1C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED,yGAAyG;IACzG,GAAG,CAAC,GAAW;QACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,6BAA6B;IAC7B,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,iEAAiE;IACjE,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,iEAAiE;IACjE,QAAQ,CAAC,GAAW;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,+DAA+D;IAC/D,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,6CAA6C;IAC7C,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,sEAAsE;IACtE,SAAS,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;YAEvC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,CAAC;gBACD,OAAO,CAAC,8DAA8D;YACxE,CAAC;YAED,MAAM,IAAI,EAAE,CAAC;QACf,CAAC,CAAC;IACJ,CAAC;CACF;AA5ED,sCA4EC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AccessControl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessControl.test.d.ts","sourceRoot":"","sources":["../../src/core/AccessControl.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const AccessControl_1 = require("./AccessControl");
5
+ function fakeCtx(sender, chatId = sender) {
6
+ return {
7
+ client: {},
8
+ message: { sender, chatId },
9
+ args: [],
10
+ reply: vitest_1.vi.fn(async () => { }),
11
+ };
12
+ }
13
+ (0, vitest_1.describe)('AccessControl', () => {
14
+ (0, vitest_1.describe)('mode blocklist (default)', () => {
15
+ (0, vitest_1.it)('mengizinkan semua JID secara default', () => {
16
+ const acl = new AccessControl_1.AccessControl();
17
+ (0, vitest_1.expect)(acl.isAllowed('siapa-saja@s.whatsapp.net')).toBe(true);
18
+ });
19
+ (0, vitest_1.it)('memblokir JID yang di-block()', () => {
20
+ const acl = new AccessControl_1.AccessControl();
21
+ acl.block('spammer@s.whatsapp.net');
22
+ (0, vitest_1.expect)(acl.isAllowed('spammer@s.whatsapp.net')).toBe(false);
23
+ (0, vitest_1.expect)(acl.isAllowed('orang-lain@s.whatsapp.net')).toBe(true);
24
+ });
25
+ (0, vitest_1.it)('unblock() mengembalikan akses', () => {
26
+ const acl = new AccessControl_1.AccessControl();
27
+ acl.block('user@s.whatsapp.net');
28
+ acl.unblock('user@s.whatsapp.net');
29
+ (0, vitest_1.expect)(acl.isAllowed('user@s.whatsapp.net')).toBe(true);
30
+ });
31
+ });
32
+ (0, vitest_1.describe)('mode whitelist', () => {
33
+ (0, vitest_1.it)('memblokir semua JID secara default', () => {
34
+ const acl = new AccessControl_1.AccessControl({ mode: 'whitelist' });
35
+ (0, vitest_1.expect)(acl.isAllowed('siapa-saja@s.whatsapp.net')).toBe(false);
36
+ });
37
+ (0, vitest_1.it)('mengizinkan JID yang di-allow()', () => {
38
+ const acl = new AccessControl_1.AccessControl({ mode: 'whitelist' });
39
+ acl.allow('owner@s.whatsapp.net');
40
+ (0, vitest_1.expect)(acl.isAllowed('owner@s.whatsapp.net')).toBe(true);
41
+ (0, vitest_1.expect)(acl.isAllowed('orang-lain@s.whatsapp.net')).toBe(false);
42
+ });
43
+ (0, vitest_1.it)('disallow() mencabut izin', () => {
44
+ const acl = new AccessControl_1.AccessControl({ mode: 'whitelist' });
45
+ acl.allow('user@s.whatsapp.net');
46
+ acl.disallow('user@s.whatsapp.net');
47
+ (0, vitest_1.expect)(acl.isAllowed('user@s.whatsapp.net')).toBe(false);
48
+ });
49
+ });
50
+ (0, vitest_1.describe)('list() & has()', () => {
51
+ (0, vitest_1.it)('list() mengembalikan semua entry', () => {
52
+ const acl = new AccessControl_1.AccessControl({ initial: ['a@s.whatsapp.net', 'b@s.whatsapp.net'] });
53
+ (0, vitest_1.expect)(acl.list().sort()).toEqual(['a@s.whatsapp.net', 'b@s.whatsapp.net']);
54
+ });
55
+ (0, vitest_1.it)('has() mengecek keberadaan di list terlepas dari mode', () => {
56
+ const acl = new AccessControl_1.AccessControl({ mode: 'whitelist', initial: ['a@s.whatsapp.net'] });
57
+ (0, vitest_1.expect)(acl.has('a@s.whatsapp.net')).toBe(true);
58
+ (0, vitest_1.expect)(acl.has('b@s.whatsapp.net')).toBe(false);
59
+ });
60
+ });
61
+ (0, vitest_1.describe)('middleware()', () => {
62
+ (0, vitest_1.it)('meneruskan ke next() kalau sender & chatId diizinkan', async () => {
63
+ const acl = new AccessControl_1.AccessControl();
64
+ const next = vitest_1.vi.fn(async () => { });
65
+ const mw = acl.middleware();
66
+ await mw(fakeCtx('user@s.whatsapp.net'), next);
67
+ (0, vitest_1.expect)(next).toHaveBeenCalledOnce();
68
+ });
69
+ (0, vitest_1.it)('tidak memanggil next() kalau sender diblokir', async () => {
70
+ const acl = new AccessControl_1.AccessControl();
71
+ acl.block('spammer@s.whatsapp.net');
72
+ const next = vitest_1.vi.fn(async () => { });
73
+ const mw = acl.middleware();
74
+ await mw(fakeCtx('spammer@s.whatsapp.net'), next);
75
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
76
+ });
77
+ (0, vitest_1.it)('mengirim replyMessage kalau diblokir dan replyMessage diset', async () => {
78
+ const acl = new AccessControl_1.AccessControl({ replyMessage: 'Diblokir!' });
79
+ acl.block('spammer@s.whatsapp.net');
80
+ const ctx = fakeCtx('spammer@s.whatsapp.net');
81
+ await acl.middleware()(ctx, vitest_1.vi.fn());
82
+ (0, vitest_1.expect)(ctx.reply).toHaveBeenCalledWith('Diblokir!');
83
+ });
84
+ (0, vitest_1.it)('tidak reply sama sekali kalau replyMessage tidak diset (silent)', async () => {
85
+ const acl = new AccessControl_1.AccessControl();
86
+ acl.block('spammer@s.whatsapp.net');
87
+ const ctx = fakeCtx('spammer@s.whatsapp.net');
88
+ await acl.middleware()(ctx, vitest_1.vi.fn());
89
+ (0, vitest_1.expect)(ctx.reply).not.toHaveBeenCalled();
90
+ });
91
+ (0, vitest_1.it)('memblokir kalau chatId (grup) diblokir walau sender diizinkan', async () => {
92
+ const acl = new AccessControl_1.AccessControl();
93
+ acl.block('120363000000000000@g.us');
94
+ const next = vitest_1.vi.fn(async () => { });
95
+ await acl.middleware()(fakeCtx('user-biasa@s.whatsapp.net', '120363000000000000@g.us'), next);
96
+ (0, vitest_1.expect)(next).not.toHaveBeenCalled();
97
+ });
98
+ });
99
+ });
100
+ //# sourceMappingURL=AccessControl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessControl.test.js","sourceRoot":"","sources":["../../src/core/AccessControl.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { EventEmitter } from 'events';
3
3
  import type { NormalizedMessage, RynkaiConfig } from '../types';
4
4
  import { PluginLoader } from '../plugin/PluginLoader';
5
5
  import { type Middleware } from './Middleware';
6
+ import { type StickerOptions } from '../sticker/createSticker';
6
7
  export interface GroupParticipantsEvent {
7
8
  groupId: string;
8
9
  action: ParticipantAction;
@@ -51,6 +52,7 @@ export declare class Client extends EventEmitter {
51
52
  private backoff;
52
53
  private manualClose;
53
54
  private reconnectTimer;
55
+ private connectionState;
54
56
  constructor(config: RynkaiConfig);
55
57
  /**
56
58
  * Daftarkan middleware yang jalan sebelum (dan bisa membungkus) eksekusi plugin.
@@ -68,6 +70,16 @@ export declare class Client extends EventEmitter {
68
70
  reply(message: NormalizedMessage, text: string): Promise<void>;
69
71
  /** Download media (image/video/audio/sticker/document) dari sebuah pesan sebagai Buffer. */
70
72
  downloadMedia(message: NormalizedMessage): Promise<Buffer>;
73
+ /**
74
+ * Ubah buffer gambar jadi WhatsApp sticker dan langsung kirim ke sebuah chat.
75
+ * Butuh package "sharp" terinstall (`npm install sharp`).
76
+ */
77
+ sendSticker(chatId: string, imageBuffer: Buffer, options?: StickerOptions): Promise<void>;
78
+ /**
79
+ * Ubah buffer video/gif jadi WhatsApp sticker animasi dan langsung kirim.
80
+ * Butuh `ffmpeg` terinstall di sistem (lihat dokumentasi createAnimatedSticker).
81
+ */
82
+ sendAnimatedSticker(chatId: string, videoBuffer: Buffer, options?: StickerOptions): Promise<void>;
71
83
  /** Beri reaction emoji ke sebuah pesan. Lewat send queue juga (throttle sama seperti send/reply). */
72
84
  react(message: NormalizedMessage, emoji: string): Promise<void>;
73
85
  /** Hapus reaction yang sudah dikirim ke sebuah pesan. */
@@ -1 +1 @@
1
- {"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,7 @@ const RateLimiter_1 = require("./RateLimiter");
48
48
  const SendQueue_1 = require("./SendQueue");
49
49
  const Backoff_1 = require("./Backoff");
50
50
  const downloadMedia_1 = require("../media/downloadMedia");
51
+ const createSticker_1 = require("../sticker/createSticker");
51
52
  /**
52
53
  * Client utama rynkai. Bungkus WASocket Baileys dan expose API yang lebih
53
54
  * sederhana: client.on('message', ...), client.send(...), plugin otomatis
@@ -61,6 +62,7 @@ class Client extends events_1.EventEmitter {
61
62
  this.middlewares = [];
62
63
  this.manualClose = false;
63
64
  this.reconnectTimer = null;
65
+ this.connectionState = 'idle';
64
66
  this.config = {
65
67
  prefix: '.',
66
68
  printQR: !config.pairingCode,
@@ -78,6 +80,16 @@ class Client extends events_1.EventEmitter {
78
80
  this.rateLimiter = config.rateLimit ? new RateLimiter_1.RateLimiter(config.rateLimit) : null;
79
81
  this.sendQueue = new SendQueue_1.SendQueue(config.sendQueue);
80
82
  this.backoff = new Backoff_1.Backoff(config.reconnect);
83
+ // PENTING: Node.js EventEmitter melempar (throw) error secara sinkron
84
+ // kalau event 'error' di-emit tanpa ada listener sama sekali. Tanpa
85
+ // default listener ini, fitur isolasi error yang kita bangun (supaya
86
+ // plugin yang gagal tidak men-crash bot) justru jadi celah crash baru
87
+ // kalau consumer lupa pasang bot.on('error', ...). Listener default ini
88
+ // menjamin itu tidak pernah terjadi; consumer tetap bisa pasang listener
89
+ // tambahan sendiri untuk reporting custom.
90
+ super.on('error', (err, context) => {
91
+ this.logger.error({ err, context }, 'Unhandled error di rynkai (tidak men-crash proses)');
92
+ });
81
93
  }
82
94
  /**
83
95
  * Daftarkan middleware yang jalan sebelum (dan bisa membungkus) eksekusi plugin.
@@ -90,6 +102,10 @@ class Client extends events_1.EventEmitter {
90
102
  }
91
103
  /** Konek ke WhatsApp. Resolve setelah koneksi berhasil "open". */
92
104
  async connect() {
105
+ if (this.connectionState === 'connecting' || this.connectionState === 'connected') {
106
+ throw new Error('Client sudah terhubung atau sedang menyambungkan. Panggil disconnect() dulu sebelum connect() lagi.');
107
+ }
108
+ this.connectionState = 'connecting';
93
109
  this.manualClose = false;
94
110
  const state = await this.sessionStore.load();
95
111
  if (!state) {
@@ -103,7 +119,13 @@ class Client extends events_1.EventEmitter {
103
119
  printQRInTerminal: false, // kita handle sendiri lewat event 'qr'
104
120
  });
105
121
  this.sock.ev.on('creds.update', async () => {
106
- await this.sessionStore.save(state);
122
+ try {
123
+ await this.sessionStore.save(state);
124
+ }
125
+ catch (err) {
126
+ this.logger.error(err, 'gagal menyimpan sesi (creds.update)');
127
+ this.emit('error', err, { source: 'sessionStore.save' });
128
+ }
107
129
  });
108
130
  if (this.config.pairingCode && !this.sock.authState.creds.registered) {
109
131
  const code = await this.sock.requestPairingCode(this.config.pairingCode.phoneNumber);
@@ -115,10 +137,12 @@ class Client extends events_1.EventEmitter {
115
137
  this.emit('qr', qr);
116
138
  }
117
139
  if (connection === 'open') {
140
+ this.connectionState = 'connected';
118
141
  this.backoff.reset();
119
142
  this.emit('ready');
120
143
  }
121
144
  if (connection === 'close') {
145
+ this.connectionState = 'disconnected';
122
146
  const statusCode = lastDisconnect?.error?.output?.statusCode;
123
147
  const loggedOut = statusCode === baileys_1.DisconnectReason.loggedOut;
124
148
  this.emit('disconnected', String(statusCode ?? 'unknown'));
@@ -220,6 +244,22 @@ class Client extends events_1.EventEmitter {
220
244
  throw new Error('Client belum connect. Panggil connect() dulu.');
221
245
  return (0, downloadMedia_1.downloadMedia)(message, this.sock, this.logger);
222
246
  }
247
+ /**
248
+ * Ubah buffer gambar jadi WhatsApp sticker dan langsung kirim ke sebuah chat.
249
+ * Butuh package "sharp" terinstall (`npm install sharp`).
250
+ */
251
+ async sendSticker(chatId, imageBuffer, options) {
252
+ const sticker = await (0, createSticker_1.createSticker)(imageBuffer, options);
253
+ await this.send(chatId, { sticker });
254
+ }
255
+ /**
256
+ * Ubah buffer video/gif jadi WhatsApp sticker animasi dan langsung kirim.
257
+ * Butuh `ffmpeg` terinstall di sistem (lihat dokumentasi createAnimatedSticker).
258
+ */
259
+ async sendAnimatedSticker(chatId, videoBuffer, options) {
260
+ const sticker = await (0, createSticker_1.createAnimatedSticker)(videoBuffer, options);
261
+ await this.send(chatId, { sticker });
262
+ }
223
263
  /** Beri reaction emoji ke sebuah pesan. Lewat send queue juga (throttle sama seperti send/reply). */
224
264
  async react(message, emoji) {
225
265
  if (!this.sock)
@@ -291,6 +331,7 @@ class Client extends events_1.EventEmitter {
291
331
  /** Logout & bersihkan sesi tersimpan. */
292
332
  async logout() {
293
333
  this.manualClose = true;
334
+ this.connectionState = 'disconnected';
294
335
  if (this.reconnectTimer)
295
336
  clearTimeout(this.reconnectTimer);
296
337
  await this.sock?.logout();
@@ -308,6 +349,7 @@ class Client extends events_1.EventEmitter {
308
349
  */
309
350
  async disconnect() {
310
351
  this.manualClose = true;
352
+ this.connectionState = 'disconnected';
311
353
  if (this.reconnectTimer)
312
354
  clearTimeout(this.reconnectTimer);
313
355
  this.sock?.end(undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EventEmitterErrorSemantics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitterErrorSemantics.test.d.ts","sourceRoot":"","sources":["../../src/core/EventEmitterErrorSemantics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const events_1 = require("events");
5
+ /**
6
+ * Test ini bukan nguji Client secara penuh (butuh koneksi WA asli),
7
+ * tapi menguji prinsip yang jadi dasar fix di Client: Node.js EventEmitter
8
+ * melempar error secara sinkron kalau event 'error' di-emit tanpa listener
9
+ * sama sekali. Client HARUS selalu punya minimal satu listener 'error'
10
+ * terpasang dari constructor-nya sendiri (lihat Client.ts) supaya emit('error', ...)
11
+ * dari isolasi plugin/middleware tidak pernah men-crash proses consumer
12
+ * yang lupa pasang bot.on('error', ...).
13
+ */
14
+ (0, vitest_1.describe)('EventEmitter "error" semantics (dasar fix di Client)', () => {
15
+ (0, vitest_1.it)('EventEmitter bawaan Node MELEMPAR error kalau tidak ada listener sama sekali', () => {
16
+ const emitter = new events_1.EventEmitter();
17
+ (0, vitest_1.expect)(() => emitter.emit('error', new Error('boom'))).toThrow('boom');
18
+ });
19
+ (0, vitest_1.it)('EventEmitter TIDAK melempar kalau sudah ada minimal satu listener error', () => {
20
+ const emitter = new events_1.EventEmitter();
21
+ let caught = null;
22
+ emitter.on('error', (err) => {
23
+ caught = err;
24
+ });
25
+ (0, vitest_1.expect)(() => emitter.emit('error', new Error('boom'))).not.toThrow();
26
+ (0, vitest_1.expect)(caught.message).toBe('boom');
27
+ });
28
+ });
29
+ //# sourceMappingURL=EventEmitterErrorSemantics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitterErrorSemantics.test.js","sourceRoot":"","sources":["../../src/core/EventEmitterErrorSemantics.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,mCAAsC;AAEtC;;;;;;;;GAQG;AACH,IAAA,iBAAQ,EAAC,sDAAsD,EAAE,GAAG,EAAE;IACpE,IAAA,WAAE,EAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,OAAO,GAAG,IAAI,qBAAY,EAAE,CAAC;QACnC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,OAAO,GAAG,IAAI,qBAAY,EAAE,CAAC;QACnC,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrE,IAAA,eAAM,EAAE,MAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,11 +6,15 @@ export { RateLimiter } from './core/RateLimiter';
6
6
  export { compose } from './core/Middleware';
7
7
  export { SendQueue } from './core/SendQueue';
8
8
  export { Backoff } from './core/Backoff';
9
+ export { AccessControl } from './core/AccessControl';
9
10
  export { downloadMedia } from './media/downloadMedia';
11
+ export { createSticker, createAnimatedSticker } from './sticker/createSticker';
10
12
  export type { NormalizedMessage, NormalizedMessageType, SessionStore, Plugin, PluginContext, RynkaiConfig, } from './types';
11
13
  export type { Middleware, NextFunction } from './core/Middleware';
12
14
  export type { RateLimitConfig } from './core/RateLimiter';
13
15
  export type { SendQueueConfig } from './core/SendQueue';
14
16
  export type { BackoffConfig } from './core/Backoff';
17
+ export type { AccessControlConfig, AccessControlMode } from './core/AccessControl';
18
+ export type { StickerOptions } from './sticker/createSticker';
15
19
  export type { GroupParticipantsEvent, RynkaiEvents } from './core/Client';
16
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE/E,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.downloadMedia = exports.Backoff = exports.SendQueue = exports.compose = exports.RateLimiter = exports.PluginLoader = exports.MessageBuilder = exports.FileSessionStore = exports.Client = void 0;
3
+ exports.createAnimatedSticker = exports.createSticker = exports.downloadMedia = exports.AccessControl = exports.Backoff = exports.SendQueue = exports.compose = exports.RateLimiter = exports.PluginLoader = exports.MessageBuilder = exports.FileSessionStore = exports.Client = void 0;
4
4
  var Client_1 = require("./core/Client");
5
5
  Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return Client_1.Client; } });
6
6
  var FileSessionStore_1 = require("./session/FileSessionStore");
@@ -17,6 +17,11 @@ var SendQueue_1 = require("./core/SendQueue");
17
17
  Object.defineProperty(exports, "SendQueue", { enumerable: true, get: function () { return SendQueue_1.SendQueue; } });
18
18
  var Backoff_1 = require("./core/Backoff");
19
19
  Object.defineProperty(exports, "Backoff", { enumerable: true, get: function () { return Backoff_1.Backoff; } });
20
+ var AccessControl_1 = require("./core/AccessControl");
21
+ Object.defineProperty(exports, "AccessControl", { enumerable: true, get: function () { return AccessControl_1.AccessControl; } });
20
22
  var downloadMedia_1 = require("./media/downloadMedia");
21
23
  Object.defineProperty(exports, "downloadMedia", { enumerable: true, get: function () { return downloadMedia_1.downloadMedia; } });
24
+ var createSticker_1 = require("./sticker/createSticker");
25
+ Object.defineProperty(exports, "createSticker", { enumerable: true, get: function () { return createSticker_1.createSticker; } });
26
+ Object.defineProperty(exports, "createAnimatedSticker", { enumerable: true, get: function () { return createSticker_1.createAnimatedSticker; } });
22
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wCAAuC;AAA9B,gGAAA,MAAM,OAAA;AACf,+DAA8D;AAArD,oHAAA,gBAAgB,OAAA;AACzB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,sDAAqD;AAA5C,4GAAA,YAAY,OAAA;AACrB,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AACpB,gDAA4C;AAAnC,qGAAA,OAAO,OAAA;AAChB,8CAA6C;AAApC,sGAAA,SAAS,OAAA;AAClB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAChB,uDAAsD;AAA7C,8GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wCAAuC;AAA9B,gGAAA,MAAM,OAAA;AACf,+DAA8D;AAArD,oHAAA,gBAAgB,OAAA;AACzB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,sDAAqD;AAA5C,4GAAA,YAAY,OAAA;AACrB,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AACpB,gDAA4C;AAAnC,qGAAA,OAAO,OAAA;AAChB,8CAA6C;AAApC,sGAAA,SAAS,OAAA;AAClB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAChB,sDAAqD;AAA5C,8GAAA,aAAa,OAAA;AACtB,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,yDAA+E;AAAtE,8GAAA,aAAa,OAAA;AAAE,sHAAA,qBAAqB,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileSessionStore.d.ts","sourceRoot":"","sources":["../../src/session/FileSessionStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,SAAS,CAAsC;gBAE3C,WAAW,EAAE,MAAM,EAAE,OAAO,SAAqB;IAIvD,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAM3C,IAAI,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
1
+ {"version":3,"file":"FileSessionStore.d.ts","sourceRoot":"","sources":["../../src/session/FileSessionStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,SAAS,CAAsC;gBAE3C,WAAW,EAAE,MAAM,EAAE,OAAO,SAAqB;IAIvD,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAM3C,IAAI,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -57,11 +57,15 @@ class FileSessionStore {
57
57
  }
58
58
  async save(_state) {
59
59
  // useMultiFileAuthState sudah otomatis nulis ke disk tiap kali keys/creds
60
- // berubah lewat event 'creds.update' — kita cukup panggil saveCreds
61
- // yang di-provide-nya. Lihat ConnectionManager untuk pemanggilannya.
60
+ // berubah — kita cukup panggil saveCreds yang di-provide-nya lewat load().
62
61
  if (this.saveCreds) {
63
62
  await this.saveCreds();
63
+ return;
64
64
  }
65
+ // Kalau ini kejadian, artinya save() dipanggil sebelum load() pernah
66
+ // sukses — biasanya bug di pemanggil (mestinya connect() selalu load()
67
+ // dulu). Di-log biar tidak silent-fail dan bikin sesi hilang tanpa jejak.
68
+ console.warn('[rynkai] FileSessionStore.save() dipanggil sebelum load() pernah sukses — perubahan sesi TIDAK tersimpan.');
65
69
  }
66
70
  async clear() {
67
71
  if (fs.existsSync(this.folder)) {
@@ -1 +1 @@
1
- {"version":3,"file":"FileSessionStore.js","sourceRoot":"","sources":["../../src/session/FileSessionStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAA0F;AAC1F,uCAAyB;AACzB,2CAA6B;AAG7B;;;;;GAKG;AACH,MAAa,gBAAgB;IAM3B,YAAY,WAAmB,EAAE,OAAO,GAAG,kBAAkB;QAJ7D,uEAAuE;QACvE,qEAAqE;QAC7D,cAAS,GAAiC,IAAI,CAAC;QAGrD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA2B;QACpC,0EAA0E;QAC1E,oEAAoE;QACpE,qEAAqE;QACrE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;CACF;AA/BD,4CA+BC"}
1
+ {"version":3,"file":"FileSessionStore.js","sourceRoot":"","sources":["../../src/session/FileSessionStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAA0F;AAC1F,uCAAyB;AACzB,2CAA6B;AAG7B;;;;;GAKG;AACH,MAAa,gBAAgB;IAM3B,YAAY,WAAmB,EAAE,OAAO,GAAG,kBAAkB;QAJ7D,uEAAuE;QACvE,qEAAqE;QAC7D,cAAS,GAAiC,IAAI,CAAC;QAGrD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA2B;QACpC,0EAA0E;QAC1E,2EAA2E;QAC3E,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,uEAAuE;QACvE,0EAA0E;QAC1E,OAAO,CAAC,IAAI,CACV,2GAA2G,CAC5G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;CACF;AAtCD,4CAsCC"}
@@ -0,0 +1,30 @@
1
+ export interface StickerOptions {
2
+ /** Nama sticker pack, muncul saat orang add sticker ke koleksinya. */
3
+ packname?: string;
4
+ /** Nama author/publisher sticker pack. */
5
+ author?: string;
6
+ /** Kualitas webp 0-100, default 80. Cuma berlaku untuk sticker gambar (bukan animasi). */
7
+ quality?: number;
8
+ }
9
+ /**
10
+ * Ubah buffer gambar (jpg/png/dst) jadi WhatsApp sticker statis (webp).
11
+ * Butuh package "sharp" terinstall (`npm install sharp`), dan "node-webpmux"
12
+ * kalau mau isi packname/author (`npm install node-webpmux`).
13
+ *
14
+ * ```ts
15
+ * const buffer = await bot.downloadMedia(msg);
16
+ * const sticker = await createSticker(buffer, { packname: 'Bot Aku', author: 'rynk' });
17
+ * await bot.send(msg.chatId, MessageBuilder.sticker(sticker));
18
+ * ```
19
+ */
20
+ export declare function createSticker(imageBuffer: Buffer, options?: StickerOptions): Promise<Buffer>;
21
+ /**
22
+ * Ubah buffer video/gif jadi WhatsApp sticker animasi (webp animasi).
23
+ *
24
+ * **Butuh `ffmpeg` terinstall di sistem dan ada di PATH** — ini bukan
25
+ * package npm, tapi program eksternal. Di server Linux biasanya:
26
+ * `apt install ffmpeg` (Debian/Ubuntu) atau `pkg install ffmpeg` (Termux).
27
+ * Batas durasi otomatis dipotong 6 detik pertama (batas wajar sticker WA).
28
+ */
29
+ export declare function createAnimatedSticker(videoBuffer: Buffer, options?: StickerOptions): Promise<Buffer>;
30
+ //# sourceMappingURL=createSticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSticker.d.ts","sourceRoot":"","sources":["../../src/sticker/createSticker.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAatG;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD9G"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createSticker = createSticker;
37
+ exports.createAnimatedSticker = createAnimatedSticker;
38
+ const child_process_1 = require("child_process");
39
+ const fs = __importStar(require("fs/promises"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ function loadSharp() {
43
+ try {
44
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
45
+ return require('sharp');
46
+ }
47
+ catch {
48
+ throw new Error('[rynkai] createSticker butuh package "sharp" tapi belum terinstall. Jalankan: npm install sharp');
49
+ }
50
+ }
51
+ function loadWebpmux() {
52
+ try {
53
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
54
+ return require('node-webpmux');
55
+ }
56
+ catch {
57
+ throw new Error('[rynkai] Metadata sticker (packname/author) butuh package "node-webpmux" tapi belum terinstall. ' +
58
+ 'Jalankan: npm install node-webpmux (atau panggil tanpa packname/author untuk skip ini).');
59
+ }
60
+ }
61
+ /** Suntik metadata sticker pack (nama & author) ke buffer webp lewat EXIF chunk. */
62
+ async function addStickerMetadata(webpBuffer, packname, author) {
63
+ const { Image } = loadWebpmux();
64
+ const img = new Image();
65
+ await img.load(webpBuffer);
66
+ const payload = {
67
+ 'sticker-pack-id': `rynkai-${Date.now()}`,
68
+ 'sticker-pack-name': packname,
69
+ 'sticker-pack-publisher': author,
70
+ emojis: ['😀'],
71
+ };
72
+ // Header EXIF TIFF standar yang dipakai WhatsApp buat baca metadata sticker.
73
+ // Ini format yang sama dipakai library sticker WA populer lainnya.
74
+ const exifHeader = Buffer.from([
75
+ 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0x57, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16,
76
+ 0x00, 0x00, 0x00,
77
+ ]);
78
+ const jsonBuffer = Buffer.from(JSON.stringify(payload), 'utf8');
79
+ const exif = Buffer.concat([exifHeader, jsonBuffer]);
80
+ exif.writeUIntLE(jsonBuffer.length, 14, 4);
81
+ img.exif = exif;
82
+ return img.save(null);
83
+ }
84
+ /**
85
+ * Ubah buffer gambar (jpg/png/dst) jadi WhatsApp sticker statis (webp).
86
+ * Butuh package "sharp" terinstall (`npm install sharp`), dan "node-webpmux"
87
+ * kalau mau isi packname/author (`npm install node-webpmux`).
88
+ *
89
+ * ```ts
90
+ * const buffer = await bot.downloadMedia(msg);
91
+ * const sticker = await createSticker(buffer, { packname: 'Bot Aku', author: 'rynk' });
92
+ * await bot.send(msg.chatId, MessageBuilder.sticker(sticker));
93
+ * ```
94
+ */
95
+ async function createSticker(imageBuffer, options = {}) {
96
+ const sharp = loadSharp();
97
+ const webpBuffer = await sharp(imageBuffer)
98
+ .resize(512, 512, { fit: 'contain', background: { r: 0, g: 0, b: 0, alpha: 0 } })
99
+ .webp({ quality: options.quality ?? 80 })
100
+ .toBuffer();
101
+ if (!options.packname && !options.author) {
102
+ return webpBuffer;
103
+ }
104
+ return addStickerMetadata(webpBuffer, options.packname ?? '', options.author ?? '');
105
+ }
106
+ /**
107
+ * Ubah buffer video/gif jadi WhatsApp sticker animasi (webp animasi).
108
+ *
109
+ * **Butuh `ffmpeg` terinstall di sistem dan ada di PATH** — ini bukan
110
+ * package npm, tapi program eksternal. Di server Linux biasanya:
111
+ * `apt install ffmpeg` (Debian/Ubuntu) atau `pkg install ffmpeg` (Termux).
112
+ * Batas durasi otomatis dipotong 6 detik pertama (batas wajar sticker WA).
113
+ */
114
+ async function createAnimatedSticker(videoBuffer, options = {}) {
115
+ const tmpDir = os.tmpdir();
116
+ const inputPath = path.join(tmpDir, `rynkai-in-${Date.now()}-${Math.random().toString(36).slice(2)}.mp4`);
117
+ const outputPath = path.join(tmpDir, `rynkai-out-${Date.now()}-${Math.random().toString(36).slice(2)}.webp`);
118
+ await fs.writeFile(inputPath, videoBuffer);
119
+ try {
120
+ await new Promise((resolve, reject) => {
121
+ const ffmpeg = (0, child_process_1.spawn)('ffmpeg', [
122
+ '-y',
123
+ '-i',
124
+ inputPath,
125
+ '-vcodec',
126
+ 'libwebp',
127
+ '-vf',
128
+ "scale='min(512,iw)':'min(512,ih)':force_original_aspect_ratio=decrease,fps=15,pad=512:512:-1:-1:color=white@0.0",
129
+ '-loop',
130
+ '0',
131
+ '-ss',
132
+ '00:00:00',
133
+ '-t',
134
+ '00:00:06',
135
+ '-an',
136
+ '-vsync',
137
+ '0',
138
+ outputPath,
139
+ ]);
140
+ ffmpeg.on('error', (err) => {
141
+ reject(new Error(`[rynkai] Gagal menjalankan ffmpeg. Pastikan ffmpeg terinstall dan ada di PATH. (${err.message})`));
142
+ });
143
+ ffmpeg.on('close', (code) => {
144
+ if (code === 0)
145
+ resolve();
146
+ else
147
+ reject(new Error(`[rynkai] ffmpeg keluar dengan kode ${code} saat membuat sticker animasi.`));
148
+ });
149
+ });
150
+ const outputBuffer = await fs.readFile(outputPath);
151
+ if (!options.packname && !options.author) {
152
+ return outputBuffer;
153
+ }
154
+ return await addStickerMetadata(outputBuffer, options.packname ?? '', options.author ?? '');
155
+ }
156
+ finally {
157
+ await fs.unlink(inputPath).catch(() => { });
158
+ await fs.unlink(outputPath).catch(() => { });
159
+ }
160
+ }
161
+ //# sourceMappingURL=createSticker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSticker.js","sourceRoot":"","sources":["../../src/sticker/createSticker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createSticker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSticker.test.d.ts","sourceRoot":"","sources":["../../src/sticker/createSticker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const createSticker_1 = require("./createSticker");
5
+ // sharp adalah native binding (butuh libvips terkompilasi) — di beberapa
6
+ // platform seperti Termux/Android ARM64, binary prebuilt-nya sering tidak
7
+ // tersedia. Daripada bikin seluruh test suite gagal karena satu dependency
8
+ // opsional yang tidak kompatibel, kita skip test ini dengan baik dan kasih
9
+ // tau lewat console kalau sharp memang tidak bisa dimuat di environment ini.
10
+ let sharp = null;
11
+ try {
12
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
13
+ sharp = require('sharp');
14
+ }
15
+ catch {
16
+ console.warn('\n[rynkai] Melewati test createSticker: package "sharp" tidak bisa dimuat di environment ini ' +
17
+ '(umum terjadi di Termux/Android ARM64 tanpa libvips). Fitur sticker tetap akan berfungsi normal ' +
18
+ 'di platform yang didukung sharp (Linux x64/arm64 server, macOS, Windows, GitHub Actions, dll).\n');
19
+ }
20
+ function isWebp(buffer) {
21
+ return buffer.subarray(0, 4).toString('ascii') === 'RIFF' && buffer.subarray(8, 12).toString('ascii') === 'WEBP';
22
+ }
23
+ vitest_1.describe.skipIf(!sharp)('createSticker', () => {
24
+ (0, vitest_1.it)('mengubah buffer gambar jadi webp valid', async () => {
25
+ const input = await sharp({
26
+ create: { width: 100, height: 100, channels: 4, background: { r: 255, g: 0, b: 0, alpha: 1 } },
27
+ })
28
+ .png()
29
+ .toBuffer();
30
+ const result = await (0, createSticker_1.createSticker)(input);
31
+ (0, vitest_1.expect)(isWebp(result)).toBe(true);
32
+ });
33
+ (0, vitest_1.it)('hasil selalu 512x512 terlepas dari ukuran/rasio gambar asli', async () => {
34
+ const input = await sharp({
35
+ create: { width: 300, height: 150, channels: 4, background: { r: 0, g: 0, b: 255, alpha: 1 } },
36
+ })
37
+ .png()
38
+ .toBuffer();
39
+ const result = await (0, createSticker_1.createSticker)(input);
40
+ const metadata = await sharp(result).metadata();
41
+ (0, vitest_1.expect)(metadata.width).toBe(512);
42
+ (0, vitest_1.expect)(metadata.height).toBe(512);
43
+ });
44
+ (0, vitest_1.it)('menyisipkan packname & author ke metadata kalau diisi', async () => {
45
+ const input = await sharp({
46
+ create: { width: 100, height: 100, channels: 4, background: { r: 0, g: 255, b: 0, alpha: 1 } },
47
+ })
48
+ .png()
49
+ .toBuffer();
50
+ const result = await (0, createSticker_1.createSticker)(input, { packname: 'Pack Ujian', author: 'Penguji' });
51
+ (0, vitest_1.expect)(isWebp(result)).toBe(true);
52
+ // Metadata disimpan sebagai JSON di EXIF chunk, jadi teksnya harus
53
+ // ketemu di suatu tempat dalam buffer hasil.
54
+ (0, vitest_1.expect)(result.includes('Pack Ujian')).toBe(true);
55
+ (0, vitest_1.expect)(result.includes('Penguji')).toBe(true);
56
+ });
57
+ (0, vitest_1.it)('tidak menyisipkan metadata kalau packname & author kosong', async () => {
58
+ const input = await sharp({
59
+ create: { width: 100, height: 100, channels: 4, background: { r: 100, g: 100, b: 100, alpha: 1 } },
60
+ })
61
+ .png()
62
+ .toBuffer();
63
+ const withoutMeta = await (0, createSticker_1.createSticker)(input);
64
+ const withMeta = await (0, createSticker_1.createSticker)(input, { packname: 'X' });
65
+ // Versi dengan metadata harus lebih besar (nambah EXIF chunk)
66
+ (0, vitest_1.expect)(withMeta.length).toBeGreaterThan(withoutMeta.length);
67
+ });
68
+ });
69
+ //# sourceMappingURL=createSticker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSticker.test.js","sourceRoot":"","sources":["../../src/sticker/createSticker.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rynkai",
3
- "version": "0.2.2",
3
+ "version": "0.3.1",
4
4
  "description": "Clean, typed wrapper around Baileys with built-in plugin system and pluggable session store — for building WhatsApp bots fast.",
5
5
  "main": "dist/index.js",
6
6
  "engines": {
@@ -38,18 +38,28 @@
38
38
  "pino": "^9.4.0"
39
39
  },
40
40
  "peerDependencies": {
41
- "qrcode-terminal": "^0.12.0"
41
+ "qrcode-terminal": "^0.12.0",
42
+ "sharp": "^0.33.0",
43
+ "node-webpmux": "^3.1.0"
42
44
  },
43
45
  "peerDependenciesMeta": {
44
46
  "qrcode-terminal": {
45
47
  "optional": true
48
+ },
49
+ "sharp": {
50
+ "optional": true
51
+ },
52
+ "node-webpmux": {
53
+ "optional": true
46
54
  }
47
55
  },
48
56
  "devDependencies": {
49
57
  "typescript": "^5.5.4",
50
58
  "ts-node-dev": "^2.0.0",
51
59
  "@types/node": "^20.14.0",
52
- "vitest": "^2.1.0"
60
+ "vitest": "^2.1.0",
61
+ "sharp": "^0.33.0",
62
+ "node-webpmux": "^3.1.0"
53
63
  },
54
64
  "files": [
55
65
  "dist"