rynkai 0.1.4 → 0.2.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/README.md +39 -4
- package/dist/core/Client.d.ts +9 -0
- package/dist/core/Client.d.ts.map +1 -1
- package/dist/core/Client.js +25 -0
- package/dist/core/Client.js.map +1 -1
- package/dist/core/Middleware.test.d.ts +2 -0
- package/dist/core/Middleware.test.d.ts.map +1 -0
- package/dist/core/Middleware.test.js +60 -0
- package/dist/core/Middleware.test.js.map +1 -0
- package/dist/core/RateLimiter.test.d.ts +2 -0
- package/dist/core/RateLimiter.test.d.ts.map +1 -0
- package/dist/core/RateLimiter.test.js +52 -0
- package/dist/core/RateLimiter.test.js.map +1 -0
- package/dist/core/SendQueue.test.d.ts +2 -0
- package/dist/core/SendQueue.test.d.ts.map +1 -0
- package/dist/core/SendQueue.test.js +60 -0
- package/dist/core/SendQueue.test.js.map +1 -0
- package/dist/message/MessageParser.d.ts.map +1 -1
- package/dist/message/MessageParser.js +12 -0
- package/dist/message/MessageParser.js.map +1 -1
- package/dist/message/MessageParser.test.d.ts +2 -0
- package/dist/message/MessageParser.test.d.ts.map +1 -0
- package/dist/message/MessageParser.test.js +104 -0
- package/dist/message/MessageParser.test.js.map +1 -0
- package/dist/plugin/PluginLoader.test.d.ts +2 -0
- package/dist/plugin/PluginLoader.test.d.ts.map +1 -0
- package/dist/plugin/PluginLoader.test.js +82 -0
- package/dist/plugin/PluginLoader.test.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +9 -3
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# rynkai
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Wrapper TypeScript yang clean di atas [Baileys](https://github.com/WhiskeySockets/Baileys), lengkap dengan plugin system & session store yang bisa diganti-ganti sesuai kebutuhan.
|
|
4
6
|
|
|
5
7
|
## Install
|
|
6
8
|
|
|
@@ -60,6 +62,32 @@ await bot.plugins.loadFromDirectory('./plugins');
|
|
|
60
62
|
await bot.connect();
|
|
61
63
|
```
|
|
62
64
|
|
|
65
|
+
## Reactions & read receipt
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
bot.on('message', async (msg) => {
|
|
69
|
+
await bot.react(msg, '👍'); // kasih reaction ke pesan masuk
|
|
70
|
+
await bot.removeReaction(msg); // hapus reaction (kirim emoji kosong)
|
|
71
|
+
await bot.markAsRead(msg); // tandai sudah dibaca (centang biru)
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Deteksi kalau seseorang react ke pesan (termasuk pesan bot sendiri)
|
|
75
|
+
bot.on('message', (msg) => {
|
|
76
|
+
if (msg.type === 'reaction' && msg.reaction) {
|
|
77
|
+
console.log(`${msg.sender} react ${msg.reaction.emoji} ke pesan ${msg.reaction.targetMessageId}`);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Auto-mark semua pesan masuk sebagai sudah dibaca:
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
const bot = new Client({
|
|
86
|
+
sessionName: 'my-bot',
|
|
87
|
+
autoRead: true,
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
63
91
|
## Presence (typing / online status)
|
|
64
92
|
|
|
65
93
|
```ts
|
|
@@ -184,8 +212,6 @@ Kalau user kelebihan limit, bot otomatis reply pemberitahuan dan command tidak d
|
|
|
184
212
|
|
|
185
213
|
## Session store custom
|
|
186
214
|
|
|
187
|
-
Default-nya pakai `FileSessionStore` (simpan sesi sebagai file di disk). Kalau butuh store lain (MongoDB, Redis, dll), tinggal implement interface `SessionStore`:
|
|
188
|
-
|
|
189
215
|
```ts
|
|
190
216
|
import type { SessionStore } from 'rynkai';
|
|
191
217
|
|
|
@@ -210,4 +236,13 @@ const bot = new Client({
|
|
|
210
236
|
});
|
|
211
237
|
|
|
212
238
|
bot.on('pairingCode', (code) => console.log('Kode pairing:', code));
|
|
213
|
-
```
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Testing
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
npm test # run sekali
|
|
245
|
+
npm run test:watch # mode watch
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Test coverage saat ini: `MessageParser`, `PluginLoader` (termasuk cooldown), `RateLimiter`, `Middleware` (compose/onion), `SendQueue`.
|
package/dist/core/Client.d.ts
CHANGED
|
@@ -47,6 +47,15 @@ export declare class Client extends EventEmitter {
|
|
|
47
47
|
reply(message: NormalizedMessage, text: string): Promise<void>;
|
|
48
48
|
/** Download media (image/video/audio/sticker/document) dari sebuah pesan sebagai Buffer. */
|
|
49
49
|
downloadMedia(message: NormalizedMessage): Promise<Buffer>;
|
|
50
|
+
/** Beri reaction emoji ke sebuah pesan. Lewat send queue juga (throttle sama seperti send/reply). */
|
|
51
|
+
react(message: NormalizedMessage, emoji: string): Promise<void>;
|
|
52
|
+
/** Hapus reaction yang sudah dikirim ke sebuah pesan. */
|
|
53
|
+
removeReaction(message: NormalizedMessage): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Tandai satu atau beberapa pesan sebagai sudah dibaca (centang biru).
|
|
56
|
+
* Terima satu NormalizedMessage atau array.
|
|
57
|
+
*/
|
|
58
|
+
markAsRead(message: NormalizedMessage | NormalizedMessage[]): Promise<void>;
|
|
50
59
|
/** Update presence (online/typing/recording/dst) di sebuah chat. */
|
|
51
60
|
sendPresence(chatId: string, presence: WAPresence): Promise<void>;
|
|
52
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"AAAA,OAAqB,EAGnB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAiB,MAAM,UAAU,CAAC;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAKxD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,2BAA2B,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACtE;AAED;;;;GAIG;AACH,qBAAa,MAAO,SAAQ,YAAY;IAC/B,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAQ;IACpC,SAAgB,OAAO,eAAsB;IAE7C,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Client.js
CHANGED
|
@@ -67,6 +67,7 @@ class Client extends events_1.EventEmitter {
|
|
|
67
67
|
sessionName: config.sessionName,
|
|
68
68
|
rateLimit: config.rateLimit,
|
|
69
69
|
sendQueue: config.sendQueue,
|
|
70
|
+
autoRead: config.autoRead ?? false,
|
|
70
71
|
};
|
|
71
72
|
this.sessionStore = config.sessionStore ?? new FileSessionStore_1.FileSessionStore(config.sessionName);
|
|
72
73
|
this.logger = (0, pino_1.default)({ level: this.config.logLevel });
|
|
@@ -127,6 +128,9 @@ class Client extends events_1.EventEmitter {
|
|
|
127
128
|
continue;
|
|
128
129
|
const message = (0, MessageParser_1.parseMessage)(raw);
|
|
129
130
|
this.emit('message', message);
|
|
131
|
+
if (this.config.autoRead && !message.fromMe) {
|
|
132
|
+
await this.markAsRead(message).catch((err) => this.logger.error(err, 'gagal markAsRead'));
|
|
133
|
+
}
|
|
130
134
|
await this.dispatchPlugin(message);
|
|
131
135
|
}
|
|
132
136
|
});
|
|
@@ -185,6 +189,27 @@ class Client extends events_1.EventEmitter {
|
|
|
185
189
|
throw new Error('Client belum connect. Panggil connect() dulu.');
|
|
186
190
|
return (0, downloadMedia_1.downloadMedia)(message, this.sock, this.logger);
|
|
187
191
|
}
|
|
192
|
+
/** Beri reaction emoji ke sebuah pesan. Lewat send queue juga (throttle sama seperti send/reply). */
|
|
193
|
+
async react(message, emoji) {
|
|
194
|
+
if (!this.sock)
|
|
195
|
+
throw new Error('Client belum connect. Panggil connect() dulu.');
|
|
196
|
+
const sock = this.sock;
|
|
197
|
+
await this.sendQueue.push(() => sock.sendMessage(message.chatId, { react: { text: emoji, key: message.raw.key } }));
|
|
198
|
+
}
|
|
199
|
+
/** Hapus reaction yang sudah dikirim ke sebuah pesan. */
|
|
200
|
+
async removeReaction(message) {
|
|
201
|
+
await this.react(message, '');
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Tandai satu atau beberapa pesan sebagai sudah dibaca (centang biru).
|
|
205
|
+
* Terima satu NormalizedMessage atau array.
|
|
206
|
+
*/
|
|
207
|
+
async markAsRead(message) {
|
|
208
|
+
if (!this.sock)
|
|
209
|
+
throw new Error('Client belum connect. Panggil connect() dulu.');
|
|
210
|
+
const messages = Array.isArray(message) ? message : [message];
|
|
211
|
+
await this.sock.readMessages(messages.map((m) => m.raw.key));
|
|
212
|
+
}
|
|
188
213
|
/** Update presence (online/typing/recording/dst) di sebuah chat. */
|
|
189
214
|
async sendPresence(chatId, presence) {
|
|
190
215
|
if (!this.sock)
|
package/dist/core/Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mEAQiC;AAEjC,mCAAsC;AACtC,gDAAwB;AAGxB,kEAA+D;AAC/D,4DAAwD;AACxD,yDAAsD;AACtD,6CAAwD;AACxD,+CAA4C;AAC5C,2CAAwC;AACxC,0DAAuD;AAiBvD;;;;GAIG;AACH,MAAa,MAAO,SAAQ,qBAAY;IAYtC,YAAY,MAAoB;QAC9B,KAAK,EAAE,CAAC;QAZH,SAAI,GAAoB,IAAI,CAAC;QACpB,YAAO,GAAG,IAAI,2BAAY,EAAE,CAAC;QAMrC,gBAAW,GAAiB,EAAE,CAAC;QAMrC,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW;YAC5B,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/core/Client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Middleware.test.d.ts","sourceRoot":"","sources":["../../src/core/Middleware.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const Middleware_1 = require("./Middleware");
|
|
5
|
+
function fakeCtx() {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
(0, vitest_1.describe)('compose (middleware onion model)', () => {
|
|
9
|
+
(0, vitest_1.it)('menjalankan middleware sesuai urutan pendaftaran, lalu final handler', async () => {
|
|
10
|
+
const order = [];
|
|
11
|
+
const dispatch = (0, Middleware_1.compose)([
|
|
12
|
+
async (_ctx, next) => {
|
|
13
|
+
order.push('mw1-before');
|
|
14
|
+
await next();
|
|
15
|
+
order.push('mw1-after');
|
|
16
|
+
},
|
|
17
|
+
async (_ctx, next) => {
|
|
18
|
+
order.push('mw2-before');
|
|
19
|
+
await next();
|
|
20
|
+
order.push('mw2-after');
|
|
21
|
+
},
|
|
22
|
+
], async () => {
|
|
23
|
+
order.push('final');
|
|
24
|
+
});
|
|
25
|
+
await dispatch(fakeCtx());
|
|
26
|
+
(0, vitest_1.expect)(order).toEqual(['mw1-before', 'mw2-before', 'final', 'mw2-after', 'mw1-after']);
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('final handler tidak jalan kalau middleware tidak memanggil next()', async () => {
|
|
29
|
+
const final = vitest_1.vi.fn();
|
|
30
|
+
const dispatch = (0, Middleware_1.compose)([
|
|
31
|
+
async () => {
|
|
32
|
+
// sengaja tidak panggil next()
|
|
33
|
+
},
|
|
34
|
+
], final);
|
|
35
|
+
await dispatch(fakeCtx());
|
|
36
|
+
(0, vitest_1.expect)(final).not.toHaveBeenCalled();
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)('jalan langsung ke final kalau tidak ada middleware', async () => {
|
|
39
|
+
const final = vitest_1.vi.fn();
|
|
40
|
+
const dispatch = (0, Middleware_1.compose)([], final);
|
|
41
|
+
await dispatch(fakeCtx());
|
|
42
|
+
(0, vitest_1.expect)(final).toHaveBeenCalledOnce();
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('melempar error kalau next() dipanggil lebih dari sekali oleh middleware yang sama', async () => {
|
|
45
|
+
const dispatch = (0, Middleware_1.compose)([
|
|
46
|
+
async (_ctx, next) => {
|
|
47
|
+
await next();
|
|
48
|
+
await next(); // ini harus error
|
|
49
|
+
},
|
|
50
|
+
], async () => { });
|
|
51
|
+
await (0, vitest_1.expect)(dispatch(fakeCtx())).rejects.toThrow('next() dipanggil lebih dari sekali');
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('error dari middleware/final ter-propagate ke pemanggil dispatch', async () => {
|
|
54
|
+
const dispatch = (0, Middleware_1.compose)([], async () => {
|
|
55
|
+
throw new Error('gagal di final');
|
|
56
|
+
});
|
|
57
|
+
await (0, vitest_1.expect)(dispatch(fakeCtx())).rejects.toThrow('gagal di final');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=Middleware.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Middleware.test.js","sourceRoot":"","sources":["../../src/core/Middleware.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.test.d.ts","sourceRoot":"","sources":["../../src/core/RateLimiter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const RateLimiter_1 = require("./RateLimiter");
|
|
5
|
+
(0, vitest_1.describe)('RateLimiter', () => {
|
|
6
|
+
(0, vitest_1.beforeEach)(() => {
|
|
7
|
+
vitest_1.vi.useFakeTimers();
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.afterEach)(() => {
|
|
10
|
+
vitest_1.vi.useRealTimers();
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('mengizinkan request selama masih di bawah max', () => {
|
|
13
|
+
const limiter = new RateLimiter_1.RateLimiter({ max: 3, windowMs: 60_000 });
|
|
14
|
+
const user = 'userA';
|
|
15
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(true);
|
|
16
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(true);
|
|
17
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.it)('menolak request setelah melebihi max dalam satu window', () => {
|
|
20
|
+
const limiter = new RateLimiter_1.RateLimiter({ max: 2, windowMs: 60_000 });
|
|
21
|
+
const user = 'userA';
|
|
22
|
+
limiter.consume(user);
|
|
23
|
+
limiter.consume(user);
|
|
24
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)('reset otomatis setelah window berakhir', () => {
|
|
27
|
+
const limiter = new RateLimiter_1.RateLimiter({ max: 1, windowMs: 1000 });
|
|
28
|
+
const user = 'userA';
|
|
29
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(true);
|
|
30
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(false);
|
|
31
|
+
vitest_1.vi.advanceTimersByTime(1001);
|
|
32
|
+
(0, vitest_1.expect)(limiter.consume(user)).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('tidak saling mempengaruhi antar user berbeda', () => {
|
|
35
|
+
const limiter = new RateLimiter_1.RateLimiter({ max: 1, windowMs: 60_000 });
|
|
36
|
+
(0, vitest_1.expect)(limiter.consume('userA')).toBe(true);
|
|
37
|
+
(0, vitest_1.expect)(limiter.consume('userB')).toBe(true);
|
|
38
|
+
(0, vitest_1.expect)(limiter.consume('userA')).toBe(false);
|
|
39
|
+
(0, vitest_1.expect)(limiter.consume('userB')).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.it)('retryAfter mengembalikan 0 kalau user belum pernah request', () => {
|
|
42
|
+
const limiter = new RateLimiter_1.RateLimiter({ max: 1, windowMs: 60_000 });
|
|
43
|
+
(0, vitest_1.expect)(limiter.retryAfter('userBaru')).toBe(0);
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('retryAfter mengembalikan sisa detik yang mendekati window', () => {
|
|
46
|
+
const limiter = new RateLimiter_1.RateLimiter({ max: 1, windowMs: 10_000 });
|
|
47
|
+
limiter.consume('userA');
|
|
48
|
+
vitest_1.vi.advanceTimersByTime(4000);
|
|
49
|
+
(0, vitest_1.expect)(limiter.retryAfter('userA')).toBe(6);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=RateLimiter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RateLimiter.test.js","sourceRoot":"","sources":["../../src/core/RateLimiter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SendQueue.test.d.ts","sourceRoot":"","sources":["../../src/core/SendQueue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const SendQueue_1 = require("./SendQueue");
|
|
5
|
+
(0, vitest_1.describe)('SendQueue', () => {
|
|
6
|
+
(0, vitest_1.beforeEach)(() => {
|
|
7
|
+
vitest_1.vi.useFakeTimers();
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.afterEach)(() => {
|
|
10
|
+
vitest_1.vi.useRealTimers();
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('menjalankan task dan resolve dengan hasilnya', async () => {
|
|
13
|
+
const queue = new SendQueue_1.SendQueue({ intervalMs: 100 });
|
|
14
|
+
const result = await queue.push(async () => 'hasil');
|
|
15
|
+
(0, vitest_1.expect)(result).toBe('hasil');
|
|
16
|
+
});
|
|
17
|
+
(0, vitest_1.it)('menjalankan task secara berurutan (FIFO) dengan jeda antar task', async () => {
|
|
18
|
+
const queue = new SendQueue_1.SendQueue({ intervalMs: 100 });
|
|
19
|
+
const order = [];
|
|
20
|
+
const p1 = queue.push(async () => {
|
|
21
|
+
order.push(1);
|
|
22
|
+
});
|
|
23
|
+
const p2 = queue.push(async () => {
|
|
24
|
+
order.push(2);
|
|
25
|
+
});
|
|
26
|
+
const p3 = queue.push(async () => {
|
|
27
|
+
order.push(3);
|
|
28
|
+
});
|
|
29
|
+
await vitest_1.vi.runAllTimersAsync();
|
|
30
|
+
await Promise.all([p1, p2, p3]);
|
|
31
|
+
(0, vitest_1.expect)(order).toEqual([1, 2, 3]);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('reject promise kalau task melempar error, tapi tidak menghentikan antrian', async () => {
|
|
34
|
+
const queue = new SendQueue_1.SendQueue({ intervalMs: 10 });
|
|
35
|
+
const order = [];
|
|
36
|
+
const p1 = queue.push(async () => {
|
|
37
|
+
throw new Error('task 1 gagal');
|
|
38
|
+
});
|
|
39
|
+
p1.catch(() => { }); // pasang handler segera, cegah warning unhandled rejection dari Node
|
|
40
|
+
const p2 = queue.push(async () => {
|
|
41
|
+
order.push('task2 jalan');
|
|
42
|
+
});
|
|
43
|
+
await vitest_1.vi.runAllTimersAsync();
|
|
44
|
+
await (0, vitest_1.expect)(p1).rejects.toThrow('task 1 gagal');
|
|
45
|
+
await (0, vitest_1.expect)(p2).resolves.toBeUndefined();
|
|
46
|
+
(0, vitest_1.expect)(order).toEqual(['task2 jalan']);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('pending mencerminkan jumlah task yang masih menunggu', async () => {
|
|
49
|
+
const queue = new SendQueue_1.SendQueue({ intervalMs: 1000 });
|
|
50
|
+
queue.push(async () => { });
|
|
51
|
+
queue.push(async () => { });
|
|
52
|
+
const thirdTask = queue.push(async () => { });
|
|
53
|
+
// task pertama langsung mulai diproses, sisanya nunggu di antrian
|
|
54
|
+
(0, vitest_1.expect)(queue.pending).toBeGreaterThanOrEqual(1);
|
|
55
|
+
await vitest_1.vi.runAllTimersAsync();
|
|
56
|
+
await thirdTask;
|
|
57
|
+
(0, vitest_1.expect)(queue.pending).toBe(0);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=SendQueue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SendQueue.test.js","sourceRoot":"","sources":["../../src/core/SendQueue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageParser.d.ts","sourceRoot":"","sources":["../../src/message/MessageParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageParser.d.ts","sourceRoot":"","sources":["../../src/message/MessageParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAC;AAgEzE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,GAAG,iBAAiB,CAkB1E"}
|
|
@@ -55,9 +55,20 @@ function parseQuoted(msg) {
|
|
|
55
55
|
text: extractText(quotedRaw),
|
|
56
56
|
fromMe: false,
|
|
57
57
|
timestamp: 0,
|
|
58
|
+
reaction: null,
|
|
58
59
|
raw: { key: { id: ctx.stanzaId }, message: quotedRaw },
|
|
59
60
|
};
|
|
60
61
|
}
|
|
62
|
+
/** Ambil target message id & emoji dari sebuah reactionMessage */
|
|
63
|
+
function parseReaction(msg) {
|
|
64
|
+
const reactionMsg = msg?.reactionMessage;
|
|
65
|
+
if (!reactionMsg?.key?.id)
|
|
66
|
+
return null;
|
|
67
|
+
return {
|
|
68
|
+
targetMessageId: reactionMsg.key.id,
|
|
69
|
+
emoji: reactionMsg.text || '',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
61
72
|
/**
|
|
62
73
|
* Ubah proto.IWebMessageInfo mentah dari Baileys jadi NormalizedMessage
|
|
63
74
|
* yang lebih enak dipakai plugin/consumer library.
|
|
@@ -76,6 +87,7 @@ function parseMessage(raw) {
|
|
|
76
87
|
fromMe: raw.key.fromMe || false,
|
|
77
88
|
timestamp: Number(raw.messageTimestamp) || Math.floor(Date.now() / 1000),
|
|
78
89
|
quoted: parseQuoted(raw.message),
|
|
90
|
+
reaction: parseReaction(raw.message),
|
|
79
91
|
raw,
|
|
80
92
|
};
|
|
81
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageParser.js","sourceRoot":"","sources":["../../src/message/MessageParser.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"MessageParser.js","sourceRoot":"","sources":["../../src/message/MessageParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageParser.test.d.ts","sourceRoot":"","sources":["../../src/message/MessageParser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const MessageParser_1 = require("./MessageParser");
|
|
5
|
+
function fakeRaw(overrides = {}) {
|
|
6
|
+
return {
|
|
7
|
+
key: {
|
|
8
|
+
id: 'MSG1',
|
|
9
|
+
remoteJid: '628123456789@s.whatsapp.net',
|
|
10
|
+
fromMe: false,
|
|
11
|
+
},
|
|
12
|
+
message: {
|
|
13
|
+
conversation: 'halo bot',
|
|
14
|
+
},
|
|
15
|
+
messageTimestamp: 1700000000,
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
(0, vitest_1.describe)('parseMessage', () => {
|
|
20
|
+
(0, vitest_1.it)('parse pesan text biasa dari chat pribadi', () => {
|
|
21
|
+
const result = (0, MessageParser_1.parseMessage)(fakeRaw());
|
|
22
|
+
(0, vitest_1.expect)(result.id).toBe('MSG1');
|
|
23
|
+
(0, vitest_1.expect)(result.chatId).toBe('628123456789@s.whatsapp.net');
|
|
24
|
+
(0, vitest_1.expect)(result.sender).toBe('628123456789@s.whatsapp.net');
|
|
25
|
+
(0, vitest_1.expect)(result.isGroup).toBe(false);
|
|
26
|
+
(0, vitest_1.expect)(result.type).toBe('text');
|
|
27
|
+
(0, vitest_1.expect)(result.text).toBe('halo bot');
|
|
28
|
+
(0, vitest_1.expect)(result.fromMe).toBe(false);
|
|
29
|
+
(0, vitest_1.expect)(result.quoted).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.it)('deteksi pesan dari grup dan ambil sender dari participant', () => {
|
|
32
|
+
const raw = fakeRaw({
|
|
33
|
+
key: {
|
|
34
|
+
id: 'MSG2',
|
|
35
|
+
remoteJid: '120363000000000000@g.us',
|
|
36
|
+
participant: '628999999999@s.whatsapp.net',
|
|
37
|
+
fromMe: false,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const result = (0, MessageParser_1.parseMessage)(raw);
|
|
41
|
+
(0, vitest_1.expect)(result.isGroup).toBe(true);
|
|
42
|
+
(0, vitest_1.expect)(result.chatId).toBe('120363000000000000@g.us');
|
|
43
|
+
(0, vitest_1.expect)(result.sender).toBe('628999999999@s.whatsapp.net');
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('ambil caption sebagai text untuk pesan image', () => {
|
|
46
|
+
const raw = fakeRaw({
|
|
47
|
+
message: { imageMessage: { caption: 'lihat ini' } },
|
|
48
|
+
});
|
|
49
|
+
const result = (0, MessageParser_1.parseMessage)(raw);
|
|
50
|
+
(0, vitest_1.expect)(result.type).toBe('image');
|
|
51
|
+
(0, vitest_1.expect)(result.text).toBe('lihat ini');
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('return type unknown kalau tidak ada field message yang dikenali', () => {
|
|
54
|
+
const raw = fakeRaw({ message: {} });
|
|
55
|
+
const result = (0, MessageParser_1.parseMessage)(raw);
|
|
56
|
+
(0, vitest_1.expect)(result.type).toBe('unknown');
|
|
57
|
+
(0, vitest_1.expect)(result.text).toBe('');
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)('parse pesan reply/quoted dengan benar', () => {
|
|
60
|
+
const raw = fakeRaw({
|
|
61
|
+
message: {
|
|
62
|
+
extendedTextMessage: {
|
|
63
|
+
text: 'balasanku',
|
|
64
|
+
contextInfo: {
|
|
65
|
+
stanzaId: 'ORIGINAL1',
|
|
66
|
+
participant: '628111111111@s.whatsapp.net',
|
|
67
|
+
quotedMessage: { conversation: 'pesan asli' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
const result = (0, MessageParser_1.parseMessage)(raw);
|
|
73
|
+
(0, vitest_1.expect)(result.text).toBe('balasanku');
|
|
74
|
+
(0, vitest_1.expect)(result.quoted).not.toBeNull();
|
|
75
|
+
(0, vitest_1.expect)(result.quoted?.id).toBe('ORIGINAL1');
|
|
76
|
+
(0, vitest_1.expect)(result.quoted?.text).toBe('pesan asli');
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)('fallback ke timestamp sekarang kalau messageTimestamp kosong', () => {
|
|
79
|
+
const raw = fakeRaw({ messageTimestamp: undefined });
|
|
80
|
+
const before = Math.floor(Date.now() / 1000);
|
|
81
|
+
const result = (0, MessageParser_1.parseMessage)(raw);
|
|
82
|
+
(0, vitest_1.expect)(result.timestamp).toBeGreaterThanOrEqual(before);
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('parse pesan reaction dengan benar', () => {
|
|
85
|
+
const raw = fakeRaw({
|
|
86
|
+
message: {
|
|
87
|
+
reactionMessage: {
|
|
88
|
+
key: { id: 'TARGET_MSG_ID', remoteJid: '628123456789@s.whatsapp.net' },
|
|
89
|
+
text: '🔥',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
const result = (0, MessageParser_1.parseMessage)(raw);
|
|
94
|
+
(0, vitest_1.expect)(result.type).toBe('reaction');
|
|
95
|
+
(0, vitest_1.expect)(result.reaction).not.toBeNull();
|
|
96
|
+
(0, vitest_1.expect)(result.reaction?.targetMessageId).toBe('TARGET_MSG_ID');
|
|
97
|
+
(0, vitest_1.expect)(result.reaction?.emoji).toBe('🔥');
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)('reaction bernilai null untuk pesan biasa', () => {
|
|
100
|
+
const result = (0, MessageParser_1.parseMessage)(fakeRaw());
|
|
101
|
+
(0, vitest_1.expect)(result.reaction).toBeNull();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=MessageParser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageParser.test.js","sourceRoot":"","sources":["../../src/message/MessageParser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginLoader.test.d.ts","sourceRoot":"","sources":["../../src/plugin/PluginLoader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const PluginLoader_1 = require("./PluginLoader");
|
|
5
|
+
function fakeContext(sender = 'user1@s.whatsapp.net') {
|
|
6
|
+
return {
|
|
7
|
+
client: {},
|
|
8
|
+
message: { sender },
|
|
9
|
+
args: [],
|
|
10
|
+
reply: vitest_1.vi.fn(async () => { }),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
(0, vitest_1.describe)('PluginLoader', () => {
|
|
14
|
+
let loader;
|
|
15
|
+
(0, vitest_1.beforeEach)(() => {
|
|
16
|
+
loader = new PluginLoader_1.PluginLoader();
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)('register & find plugin berdasarkan command', () => {
|
|
19
|
+
const plugin = { name: 'ping', command: 'ping', execute: vitest_1.vi.fn() };
|
|
20
|
+
loader.register(plugin);
|
|
21
|
+
(0, vitest_1.expect)(loader.find('ping')).toBe(plugin);
|
|
22
|
+
(0, vitest_1.expect)(loader.find('PING')).toBe(plugin); // case-insensitive
|
|
23
|
+
(0, vitest_1.expect)(loader.find('tidak-ada')).toBeUndefined();
|
|
24
|
+
});
|
|
25
|
+
(0, vitest_1.it)('register plugin dengan multiple command alias', () => {
|
|
26
|
+
const plugin = { name: 'hello', command: ['hello', 'hi'], execute: vitest_1.vi.fn() };
|
|
27
|
+
loader.register(plugin);
|
|
28
|
+
(0, vitest_1.expect)(loader.find('hello')).toBe(plugin);
|
|
29
|
+
(0, vitest_1.expect)(loader.find('hi')).toBe(plugin);
|
|
30
|
+
});
|
|
31
|
+
(0, vitest_1.it)('execute menjalankan plugin yang cocok dan return true', async () => {
|
|
32
|
+
const execute = vitest_1.vi.fn();
|
|
33
|
+
loader.register({ name: 'ping', command: 'ping', execute });
|
|
34
|
+
const ctx = fakeContext();
|
|
35
|
+
const handled = await loader.execute('ping', ctx);
|
|
36
|
+
(0, vitest_1.expect)(handled).toBe(true);
|
|
37
|
+
(0, vitest_1.expect)(execute).toHaveBeenCalledWith(ctx);
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.it)('execute return false kalau tidak ada plugin yang cocok', async () => {
|
|
40
|
+
const ctx = fakeContext();
|
|
41
|
+
const handled = await loader.execute('tidak-ada', ctx);
|
|
42
|
+
(0, vitest_1.expect)(handled).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('list() tidak duplikat walau plugin punya banyak alias command', () => {
|
|
45
|
+
loader.register({ name: 'hello', command: ['hello', 'hi', 'hey'], execute: vitest_1.vi.fn() });
|
|
46
|
+
(0, vitest_1.expect)(loader.list()).toHaveLength(1);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.describe)('cooldown', () => {
|
|
49
|
+
(0, vitest_1.beforeEach)(() => {
|
|
50
|
+
vitest_1.vi.useFakeTimers();
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.afterEach)(() => {
|
|
53
|
+
vitest_1.vi.useRealTimers();
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('blokir eksekusi kedua dalam window cooldown & kasih tau sisa waktu', async () => {
|
|
56
|
+
const execute = vitest_1.vi.fn();
|
|
57
|
+
loader.register({ name: 'heal', command: 'heal', cooldown: 10, execute });
|
|
58
|
+
const ctx = fakeContext('userA');
|
|
59
|
+
await loader.execute('heal', ctx); // panggilan pertama, lolos
|
|
60
|
+
await loader.execute('heal', ctx); // panggilan kedua, kena cooldown
|
|
61
|
+
(0, vitest_1.expect)(execute).toHaveBeenCalledTimes(1);
|
|
62
|
+
(0, vitest_1.expect)(ctx.reply).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Tunggu'));
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)('boleh eksekusi lagi setelah cooldown habis', async () => {
|
|
65
|
+
const execute = vitest_1.vi.fn();
|
|
66
|
+
loader.register({ name: 'heal', command: 'heal', cooldown: 10, execute });
|
|
67
|
+
const ctx = fakeContext('userA');
|
|
68
|
+
await loader.execute('heal', ctx);
|
|
69
|
+
vitest_1.vi.advanceTimersByTime(10_001);
|
|
70
|
+
await loader.execute('heal', ctx);
|
|
71
|
+
(0, vitest_1.expect)(execute).toHaveBeenCalledTimes(2);
|
|
72
|
+
});
|
|
73
|
+
(0, vitest_1.it)('cooldown per-user, tidak saling mempengaruhi antar user berbeda', async () => {
|
|
74
|
+
const execute = vitest_1.vi.fn();
|
|
75
|
+
loader.register({ name: 'heal', command: 'heal', cooldown: 10, execute });
|
|
76
|
+
await loader.execute('heal', fakeContext('userA'));
|
|
77
|
+
await loader.execute('heal', fakeContext('userB'));
|
|
78
|
+
(0, vitest_1.expect)(execute).toHaveBeenCalledTimes(2);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=PluginLoader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginLoader.test.js","sourceRoot":"","sources":["../../src/plugin/PluginLoader.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ export interface NormalizedMessage {
|
|
|
20
20
|
timestamp: number;
|
|
21
21
|
/** Pesan yang di-quote/reply, kalau ada (sudah dinormalisasi juga, minus quotedMessage-nya sendiri) */
|
|
22
22
|
quoted: Omit<NormalizedMessage, 'quoted'> | null;
|
|
23
|
+
/** Detail reaction, terisi hanya kalau type === 'reaction' (orang lain react ke suatu pesan) */
|
|
24
|
+
reaction: {
|
|
25
|
+
targetMessageId: string;
|
|
26
|
+
emoji: string;
|
|
27
|
+
} | null;
|
|
23
28
|
/** Raw proto message asli dari Baileys, buat kasus yang butuh akses low-level */
|
|
24
29
|
raw: proto.IWebMessageInfo;
|
|
25
30
|
}
|
|
@@ -76,5 +81,7 @@ export interface RynkaiConfig {
|
|
|
76
81
|
sendQueue?: {
|
|
77
82
|
intervalMs?: number;
|
|
78
83
|
};
|
|
84
|
+
/** Otomatis tandai setiap pesan masuk sebagai sudah dibaca (centang biru). Default: false. */
|
|
85
|
+
autoRead?: boolean;
|
|
79
86
|
}
|
|
80
87
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEpF,iGAAiG;AACjG,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,UAAU,GACV,SAAS,GACT,UAAU,GACV,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,IAAI,EAAE,qBAAqB,CAAC;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,uGAAuG;IACvG,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACjD,iFAAiF;IACjF,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,IAAI,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mDAAmD;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,CAAC;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uEAAuE;IACvE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACpE;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,yCAAyC;QACzC,GAAG,EAAE,MAAM,CAAC;QACZ,qCAAqC;QACrC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,2FAA2F;IAC3F,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rynkai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
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
|
+
"engines": {
|
|
7
|
+
"node": ">=20.0.0"
|
|
8
|
+
},
|
|
6
9
|
"types": "dist/index.d.ts",
|
|
7
10
|
"type": "commonjs",
|
|
8
11
|
"scripts": {
|
|
9
12
|
"build": "tsc -p tsconfig.json",
|
|
10
13
|
"dev": "ts-node-dev --respawn --transpile-only src/index.ts",
|
|
11
|
-
"
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"prepublishOnly": "npm run build && npm test"
|
|
12
17
|
},
|
|
13
18
|
"keywords": [
|
|
14
19
|
"whatsapp",
|
|
@@ -43,7 +48,8 @@
|
|
|
43
48
|
"devDependencies": {
|
|
44
49
|
"typescript": "^5.5.4",
|
|
45
50
|
"ts-node-dev": "^2.0.0",
|
|
46
|
-
"@types/node": "^20.14.0"
|
|
51
|
+
"@types/node": "^20.14.0",
|
|
52
|
+
"vitest": "^2.1.0"
|
|
47
53
|
},
|
|
48
54
|
"files": [
|
|
49
55
|
"dist"
|