@pontalabs/baileys 1.0.11 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -85
- package/lib/Defaults/connection.js +39 -0
- package/lib/Defaults/constants.js +50 -0
- package/lib/Defaults/history.js +13 -0
- package/lib/Defaults/index.js +36 -151
- package/lib/Defaults/media.js +43 -0
- package/lib/Defaults/phonenumber-mcc.json +221 -221
- package/lib/Defaults/prefix.js +12 -0
- package/lib/Defaults/vialeys-version.json +7 -0
- package/lib/Signal/Group/ciphertext-message.js +10 -15
- package/lib/Signal/Group/group-session-builder.js +34 -60
- package/lib/Signal/Group/group_cipher.js +69 -76
- package/lib/Signal/Group/index.js +41 -60
- package/lib/Signal/Group/keyhelper.js +12 -57
- package/lib/Signal/Group/sender-chain-key.js +20 -33
- package/lib/Signal/Group/sender-key-distribution-message.js +43 -48
- package/lib/Signal/Group/sender-key-message.js +58 -53
- package/lib/Signal/Group/sender-key-name.js +21 -31
- package/lib/Signal/Group/sender-key-record.js +21 -34
- package/lib/Signal/Group/sender-key-state.js +59 -106
- package/lib/Signal/Group/sender-message-key.js +16 -21
- package/lib/Signal/libsignal.js +282 -203
- package/lib/Signal/lid-mapping.js +164 -184
- package/lib/Socket/Client/index.js +31 -22
- package/lib/Socket/Client/types.js +9 -15
- package/lib/Socket/Client/websocket.js +42 -37
- package/lib/Socket/business.js +212 -336
- package/lib/Socket/chats.js +696 -940
- package/lib/Socket/community.js +454 -369
- package/lib/Socket/groups.js +278 -280
- package/lib/Socket/index.js +9 -21
- package/lib/Socket/messages-recv.js +1027 -1570
- package/lib/Socket/messages-send.js +1180 -1136
- package/lib/Socket/mex.js +59 -0
- package/lib/Socket/newsletter.js +193 -251
- package/lib/Socket/socket.js +758 -898
- package/lib/Store/index.js +35 -24
- package/lib/Store/make-cache-manager-store.js +53 -66
- package/lib/Store/make-in-memory-store.js +319 -325
- package/lib/Store/make-ordered-dictionary.js +49 -57
- package/lib/Store/object-repository.js +10 -15
- package/lib/Types/Auth.js +2 -3
- package/lib/Types/Bussines.js +2 -3
- package/lib/Types/Call.js +2 -3
- package/lib/Types/Chat.js +10 -9
- package/lib/Types/Contact.js +2 -3
- package/lib/Types/Events.js +2 -3
- package/lib/Types/GroupMetadata.js +2 -3
- package/lib/Types/Label.js +6 -12
- package/lib/Types/LabelAssociation.js +4 -13
- package/lib/Types/Message.js +10 -18
- package/lib/Types/MexUpdates.js +15 -18
- package/lib/Types/Newsletter.js +26 -34
- package/lib/Types/Product.js +2 -3
- package/lib/Types/Signal.js +2 -3
- package/lib/Types/Socket.js +2 -3
- package/lib/Types/State.js +8 -13
- package/lib/Types/USync.js +2 -3
- package/lib/Types/index.js +49 -40
- package/lib/Utils/auth-utils.js +190 -495
- package/lib/Utils/browser-utils.js +29 -0
- package/lib/Utils/business.js +177 -199
- package/lib/Utils/chat-utils.js +711 -624
- package/lib/Utils/crypto.js +116 -161
- package/lib/Utils/decode-wa-message.js +225 -321
- package/lib/Utils/event-buffer.js +363 -405
- package/lib/Utils/generics.js +318 -472
- package/lib/Utils/history.js +72 -76
- package/lib/Utils/index.js +49 -41
- package/lib/Utils/link-preview.js +59 -103
- package/lib/Utils/logger.js +4 -7
- package/lib/Utils/lt-hash.js +29 -42
- package/lib/Utils/make-mutex.js +26 -42
- package/lib/Utils/message-retry-manager.js +134 -160
- package/lib/Utils/messages-media.js +665 -731
- package/lib/Utils/messages.js +518 -1
- package/lib/Utils/noise-handler.js +127 -125
- package/lib/Utils/pre-key-manager.js +86 -0
- package/lib/Utils/process-message.js +739 -351
- package/lib/Utils/signal.js +146 -129
- package/lib/Utils/use-multi-file-auth-state.js +68 -135
- package/lib/Utils/validate-connection.js +183 -142
- package/lib/Utils/vialeys-event-stream.js +41 -0
- package/lib/WABinary/constants.js +1281 -1289
- package/lib/WABinary/decode.js +145 -200
- package/lib/WABinary/encode.js +149 -202
- package/lib/WABinary/generic-utils.js +79 -97
- package/lib/WABinary/index.js +36 -25
- package/lib/WABinary/jid-utils.js +91 -123
- package/lib/WABinary/types.js +2 -3
- package/lib/WAM/BinaryInfo.js +8 -13
- package/lib/WAM/constants.js +16584 -11464
- package/lib/WAM/encode.js +117 -133
- package/lib/WAM/index.js +34 -23
- package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +62 -69
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +11 -25
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +32 -44
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +13 -23
- package/lib/WAUSync/Protocols/USyncLIDProtocol.js +24 -38
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +17 -31
- package/lib/WAUSync/Protocols/index.js +37 -26
- package/lib/WAUSync/USyncQuery.js +66 -66
- package/lib/WAUSync/USyncUser.js +13 -18
- package/lib/WAUSync/index.js +34 -23
- package/lib/index.js +95 -28
- package/package.json +2 -1
- package/lib/Defaults/baileys-version.json +0 -3
- package/lib/Signal/Group/queue-job.d.ts +0 -1
- package/lib/Signal/Group/queue-job.js +0 -57
- package/lib/Socket/usync.d.ts +0 -37
- package/lib/Socket/usync.js +0 -83
- package/lib/Utils/baileys-event-stream.d.ts +0 -18
- package/lib/Utils/baileys-event-stream.js +0 -70
- package/lib/Utils/signal-housekeeping.d.ts +0 -19
- package/lib/Utils/signal-housekeeping.js +0 -73
- package/lib/Utils/use-mongo-file-auth-state.d.ts +0 -6
- package/lib/Utils/use-mongo-file-auth-state.js +0 -84
- package/lib/Utils/use-single-file-auth-state.d.ts +0 -13
- package/lib/Utils/use-single-file-auth-state.js +0 -80
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = queueJob;
|
|
4
|
-
const _queueAsyncBuckets = new Map();
|
|
5
|
-
const _gcLimit = 10000;
|
|
6
|
-
async function _asyncQueueExecutor(queue, cleanup) {
|
|
7
|
-
let offt = 0;
|
|
8
|
-
// eslint-disable-next-line no-constant-condition
|
|
9
|
-
while (true) {
|
|
10
|
-
const limit = Math.min(queue.length, _gcLimit);
|
|
11
|
-
for (let i = offt; i < limit; i++) {
|
|
12
|
-
const job = queue[i];
|
|
13
|
-
try {
|
|
14
|
-
job.resolve(await job.awaitable());
|
|
15
|
-
}
|
|
16
|
-
catch (e) {
|
|
17
|
-
job.reject(e);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
if (limit < queue.length) {
|
|
21
|
-
if (limit >= _gcLimit) {
|
|
22
|
-
queue.splice(0, limit);
|
|
23
|
-
offt = 0;
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
offt = limit;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
cleanup();
|
|
34
|
-
}
|
|
35
|
-
function queueJob(bucket, awaitable) {
|
|
36
|
-
// Skip name assignment since it's readonly in strict mode
|
|
37
|
-
if (typeof bucket !== 'string') {
|
|
38
|
-
console.warn('Unhandled bucket type (for naming):', typeof bucket, bucket);
|
|
39
|
-
}
|
|
40
|
-
let inactive = false;
|
|
41
|
-
if (!_queueAsyncBuckets.has(bucket)) {
|
|
42
|
-
_queueAsyncBuckets.set(bucket, []);
|
|
43
|
-
inactive = true;
|
|
44
|
-
}
|
|
45
|
-
const queue = _queueAsyncBuckets.get(bucket);
|
|
46
|
-
const job = new Promise((resolve, reject) => {
|
|
47
|
-
queue.push({
|
|
48
|
-
awaitable,
|
|
49
|
-
resolve: resolve,
|
|
50
|
-
reject
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
if (inactive) {
|
|
54
|
-
_asyncQueueExecutor(queue, () => _queueAsyncBuckets.delete(bucket));
|
|
55
|
-
}
|
|
56
|
-
return job;
|
|
57
|
-
}
|
package/lib/Socket/usync.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Boom } from '@hapi/boom'
|
|
2
|
-
import { SocketConfig } from '../Types'
|
|
3
|
-
import { BinaryNode } from '../WABinary'
|
|
4
|
-
import { USyncQuery } from '../WAUSync'
|
|
5
|
-
|
|
6
|
-
export declare const makeUSyncSocket: (config: SocketConfig) => {
|
|
7
|
-
executeUSyncQuery: (usyncQuery: USyncQuery) => Promise<import("../WAUSync").USyncQueryResult | undefined>
|
|
8
|
-
type: "md"
|
|
9
|
-
ws: import("./Client").WebSocketClient
|
|
10
|
-
ev: import("../Types").BaileysEventEmitter & {
|
|
11
|
-
process(handler: (events: Partial<import("../Types").BaileysEventMap>) => void | Promise<void>): () => void
|
|
12
|
-
buffer(): void
|
|
13
|
-
createBufferedFunction<A extends any[], T>(work: (...args: A) => Promise<T>): (...args: A) => Promise<T>
|
|
14
|
-
flush(force?: boolean | undefined): boolean
|
|
15
|
-
isBuffering(): boolean
|
|
16
|
-
}
|
|
17
|
-
authState: {
|
|
18
|
-
creds: import("../Types").AuthenticationCreds
|
|
19
|
-
keys: import("../Types").SignalKeyStoreWithTransaction
|
|
20
|
-
}
|
|
21
|
-
signalRepository: import("../Types").SignalRepository
|
|
22
|
-
user: import("../Types").Contact | undefined
|
|
23
|
-
generateMessageTag: () => string
|
|
24
|
-
query: (node: BinaryNode, timeoutMs?: number | undefined) => Promise<BinaryNode>
|
|
25
|
-
waitForMessage: <T_1>(msgId: string, timeoutMs?: number | undefined) => Promise<T_1>
|
|
26
|
-
waitForSocketOpen: () => Promise<void>
|
|
27
|
-
sendRawMessage: (data: Uint8Array | Buffer) => Promise<void>
|
|
28
|
-
sendNode: (frame: BinaryNode) => Promise<void>
|
|
29
|
-
logout: (msg?: string | undefined) => Promise<void>
|
|
30
|
-
end: (error: Error | undefined) => void
|
|
31
|
-
onUnexpectedError: (err: Error | Boom<any>, msg: string) => void
|
|
32
|
-
uploadPreKeys: (count?: number) => Promise<void>
|
|
33
|
-
uploadPreKeysToServerIfRequired: () => Promise<void>
|
|
34
|
-
requestPairingCode: (phoneNumber: string, code?: string) => Promise<string>
|
|
35
|
-
waitForConnectionUpdate: (check: (u: Partial<import("../Types").ConnectionState>) => boolean | undefined, timeoutMs?: number | undefined) => Promise<void>
|
|
36
|
-
sendWAMBuffer: (wamBuffer: Buffer) => Promise<BinaryNode>
|
|
37
|
-
}
|
package/lib/Socket/usync.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
4
|
-
|
|
5
|
-
const boom_1 = require("@hapi/boom")
|
|
6
|
-
const WABinary_1 = require("../WABinary")
|
|
7
|
-
const socket_1 = require("./socket")
|
|
8
|
-
|
|
9
|
-
const makeUSyncSocket = (config) => {
|
|
10
|
-
const sock = socket_1.makeSocket(config)
|
|
11
|
-
const { generateMessageTag, query, } = sock
|
|
12
|
-
|
|
13
|
-
const executeUSyncQuery = async (usyncQuery) => {
|
|
14
|
-
if (usyncQuery.protocols.length === 0) {
|
|
15
|
-
throw new boom_1.Boom('USyncQuery must have at least one protocol')
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// todo: validate users, throw WARNING on no valid users
|
|
19
|
-
// variable below has only validated users
|
|
20
|
-
const validUsers = usyncQuery.users
|
|
21
|
-
|
|
22
|
-
const userNodes = validUsers.map((user) => {
|
|
23
|
-
return {
|
|
24
|
-
tag: 'user',
|
|
25
|
-
attrs: {
|
|
26
|
-
jid: !user.phone ? user.id : undefined,
|
|
27
|
-
},
|
|
28
|
-
content: usyncQuery.protocols
|
|
29
|
-
.map((a) => a.getUserElement(user))
|
|
30
|
-
.filter(a => a !== null)
|
|
31
|
-
}
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
const listNode = {
|
|
35
|
-
tag: 'list',
|
|
36
|
-
attrs: {},
|
|
37
|
-
content: userNodes
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const queryNode = {
|
|
41
|
-
tag: 'query',
|
|
42
|
-
attrs: {},
|
|
43
|
-
content: usyncQuery.protocols.map((a) => a.getQueryElement())
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const iq = {
|
|
47
|
-
tag: 'iq',
|
|
48
|
-
attrs: {
|
|
49
|
-
to: WABinary_1.S_WHATSAPP_NET,
|
|
50
|
-
type: 'get',
|
|
51
|
-
xmlns: 'usync',
|
|
52
|
-
},
|
|
53
|
-
content: [
|
|
54
|
-
{
|
|
55
|
-
tag: 'usync',
|
|
56
|
-
attrs: {
|
|
57
|
-
context: usyncQuery.context,
|
|
58
|
-
mode: usyncQuery.mode,
|
|
59
|
-
sid: generateMessageTag(),
|
|
60
|
-
last: 'true',
|
|
61
|
-
index: '0',
|
|
62
|
-
},
|
|
63
|
-
content: [
|
|
64
|
-
queryNode,
|
|
65
|
-
listNode
|
|
66
|
-
]
|
|
67
|
-
}
|
|
68
|
-
],
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const result = await query(iq)
|
|
72
|
-
|
|
73
|
-
return usyncQuery.parseUSyncQueryResult(result)
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
...sock,
|
|
77
|
-
executeUSyncQuery
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
module.exports = {
|
|
82
|
-
makeUSyncSocket
|
|
83
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { BaileysEventEmitter } from '../Types'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Captures events from a baileys event emitter & stores them in a file
|
|
5
|
-
* @param ev The event emitter to read events from
|
|
6
|
-
* @param filename File to save to
|
|
7
|
-
*/
|
|
8
|
-
export declare const captureEventStream: (ev: BaileysEventEmitter, filename: string) => void
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Read event file and emit events from there
|
|
12
|
-
* @param filename filename containing event data
|
|
13
|
-
* @param delayIntervalMs delay between each event emit
|
|
14
|
-
*/
|
|
15
|
-
export declare const readAndEmitEventStream: (filename: string, delayIntervalMs?: number) => {
|
|
16
|
-
ev: BaileysEventEmitter
|
|
17
|
-
task: Promise<void>
|
|
18
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod }
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
8
|
-
|
|
9
|
-
const events_1 = __importDefault(require("events"))
|
|
10
|
-
const fs_1 = require("fs")
|
|
11
|
-
const promises_1 = require("fs/promises")
|
|
12
|
-
const readline_1 = require("readline")
|
|
13
|
-
const generics_1 = require("./generics")
|
|
14
|
-
const make_mutex_1 = require("./make-mutex")
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Captures events from a baileys event emitter & stores them in a file
|
|
18
|
-
* @param ev The event emitter to read events from
|
|
19
|
-
* @param filename File to save to
|
|
20
|
-
*/
|
|
21
|
-
const captureEventStream = (ev, filename) => {
|
|
22
|
-
const oldEmit = ev.emit
|
|
23
|
-
// write mutex so data is appended in order
|
|
24
|
-
const writeMutex = make_mutex_1.makeMutex()
|
|
25
|
-
// monkey patch eventemitter to capture all events
|
|
26
|
-
ev.emit = function (...args) {
|
|
27
|
-
const content = JSON.stringify({ timestamp: Date.now(), event: args[0], data: args[1] }) + '\n'
|
|
28
|
-
const result = oldEmit.apply(ev, args)
|
|
29
|
-
writeMutex.mutex(async () => {
|
|
30
|
-
await promises_1.writeFile(filename, content, { flag: 'a' })
|
|
31
|
-
})
|
|
32
|
-
return result
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Read event file and emit events from there
|
|
38
|
-
* @param filename filename containing event data
|
|
39
|
-
* @param delayIntervalMs delay between each event emit
|
|
40
|
-
*/
|
|
41
|
-
const readAndEmitEventStream = (filename, delayIntervalMs = 0) => {
|
|
42
|
-
const ev = new events_1.default()
|
|
43
|
-
const fireEvents = async () => {
|
|
44
|
-
// from: https://stackoverflow.com/questions/6156501/read-a-file-one-line-at-a-time-in-node-js
|
|
45
|
-
const fileStream = fs_1.createReadStream(filename)
|
|
46
|
-
const rl = readline_1.createInterface({
|
|
47
|
-
input: fileStream,
|
|
48
|
-
crlfDelay: Infinity
|
|
49
|
-
})
|
|
50
|
-
// Note: we use the crlfDelay option to recognize all instances of CR LF
|
|
51
|
-
// ('\r\n') in input.txt as a single line break.
|
|
52
|
-
for await (const line of rl) {
|
|
53
|
-
if (line) {
|
|
54
|
-
const { event, data } = JSON.parse(line)
|
|
55
|
-
ev.emit(event, data)
|
|
56
|
-
delayIntervalMs && await generics_1.delay(delayIntervalMs)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
fileStream.close()
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
ev,
|
|
63
|
-
task: fireEvents()
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
module.exports = {
|
|
68
|
-
captureEventStream,
|
|
69
|
-
readAndEmitEventStream
|
|
70
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Logger } from 'pino'
|
|
2
|
-
|
|
3
|
-
export interface CleanupSignalAuthFolderOptions {
|
|
4
|
-
/** File yang mtime-nya lebih tua dari ini (dalam hari) akan dihapus. Default 30. */
|
|
5
|
-
maxAgeDays?: number
|
|
6
|
-
/** Prefix nama file yang boleh dibersihkan. Default ['session-', 'sender-key-']. */
|
|
7
|
-
prefixes?: string[]
|
|
8
|
-
logger?: Logger
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface CleanupSignalAuthFolderResult {
|
|
12
|
-
removed: string[]
|
|
13
|
-
scanned: number
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function cleanupSignalAuthFolder(
|
|
17
|
-
folder: string,
|
|
18
|
-
options?: CleanupSignalAuthFolderOptions
|
|
19
|
-
): Promise<CleanupSignalAuthFolderResult>
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
4
|
-
exports.cleanupSignalAuthFolder = cleanupSignalAuthFolder
|
|
5
|
-
|
|
6
|
-
const fs = require("fs/promises")
|
|
7
|
-
const path = require("path")
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Bersihkan file session/sender-key yang sudah usang di folder auth yang dipakai
|
|
11
|
-
* bareng useMultiFileAuthState(). Tujuannya supaya store signal tidak numpuk terus
|
|
12
|
-
* selama bot jalan berbulan-bulan dengan ribuan kontak/grup yang sudah gak aktif.
|
|
13
|
-
*
|
|
14
|
-
* Aman dipakai karena: mtime sebuah file session-*.json / sender-key-*.json selalu
|
|
15
|
-
* ke-update setiap kali ada pertukaran pesan dengan kontak/grup itu (storeSession /
|
|
16
|
-
* storeSenderKey menulis ulang filenya). Jadi kalau sebuah file gak pernah disentuh
|
|
17
|
-
* lagi lebih dari `maxAgeDays`, itu tandanya kontak/grup itu memang sudah gak aktif -
|
|
18
|
-
* hapus filenya aman, nanti kalau ada pesan baru sesi/sender-key otomatis dibuat ulang
|
|
19
|
-
* dari prekey bundle / SenderKeyDistributionMessage yang baru.
|
|
20
|
-
*
|
|
21
|
-
* creds.json, app-state-sync-key-*.json, dan pre-key-*.json SENGAJA tidak disentuh
|
|
22
|
-
* di sini secara default - itu bukan sumber "numpuk", dan prekey yang sudah dipakai
|
|
23
|
-
* memang sudah dihapus otomatis lewat removePreKey() di libsignal.js.
|
|
24
|
-
*
|
|
25
|
-
* @param {string} folder - folder yang sama dipakai di useMultiFileAuthState()
|
|
26
|
-
* @param {object} [options]
|
|
27
|
-
* @param {number} [options.maxAgeDays=30] - file yang mtime-nya lebih tua dari ini akan dihapus
|
|
28
|
-
* @param {string[]} [options.prefixes] - prefix nama file yang boleh dibersihkan
|
|
29
|
-
* @param {import('pino').Logger} [options.logger]
|
|
30
|
-
* @returns {Promise<{ removed: string[], scanned: number }>}
|
|
31
|
-
*/
|
|
32
|
-
async function cleanupSignalAuthFolder(folder, options = {}) {
|
|
33
|
-
const {
|
|
34
|
-
maxAgeDays = 30,
|
|
35
|
-
prefixes = ['session-', 'sender-key-'],
|
|
36
|
-
logger
|
|
37
|
-
} = options
|
|
38
|
-
|
|
39
|
-
const removed = []
|
|
40
|
-
let scanned = 0
|
|
41
|
-
const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000
|
|
42
|
-
const now = Date.now()
|
|
43
|
-
|
|
44
|
-
let entries
|
|
45
|
-
try {
|
|
46
|
-
entries = await fs.readdir(folder)
|
|
47
|
-
} catch (err) {
|
|
48
|
-
logger?.warn?.({ err, folder }, '[cleanupSignalAuthFolder] gagal baca folder auth')
|
|
49
|
-
return { removed, scanned }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
for (const name of entries) {
|
|
53
|
-
if (!prefixes.some((p) => name.startsWith(p))) {
|
|
54
|
-
continue
|
|
55
|
-
}
|
|
56
|
-
scanned++
|
|
57
|
-
const filePath = path.join(folder, name)
|
|
58
|
-
try {
|
|
59
|
-
const stat = await fs.stat(filePath)
|
|
60
|
-
if (now - stat.mtimeMs > maxAgeMs) {
|
|
61
|
-
await fs.unlink(filePath)
|
|
62
|
-
removed.push(name)
|
|
63
|
-
}
|
|
64
|
-
} catch {
|
|
65
|
-
// File mungkin sudah kehapus proses lain (race antar-worker), aman diabaikan.
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
logger?.info?.({ scanned, removedCount: removed.length, maxAgeDays }, '[cleanupSignalAuthFolder] selesai')
|
|
70
|
-
return { removed, scanned }
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
module.exports = { cleanupSignalAuthFolder }
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
4
|
-
|
|
5
|
-
const WAProto_1 = require("../../WAProto")
|
|
6
|
-
const auth_utils_1 = require("./auth-utils")
|
|
7
|
-
const generics_1 = require("./generics")
|
|
8
|
-
|
|
9
|
-
/*
|
|
10
|
-
code from amiruldev readjusted by @irull2nd, don't delete WM!
|
|
11
|
-
*/
|
|
12
|
-
const useMongoFileAuthState = async (collection) => {
|
|
13
|
-
const writeData = (data,id) => {
|
|
14
|
-
const informationToStore = JSON.parse(
|
|
15
|
-
JSON.stringify(data, generics_1.BufferJSON.replacer)
|
|
16
|
-
)
|
|
17
|
-
const update = {
|
|
18
|
-
$set: {
|
|
19
|
-
...informationToStore,
|
|
20
|
-
},
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return collection.updateOne({_id: id},update, {upsert: true})
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const readData = async (id) => {
|
|
27
|
-
try {
|
|
28
|
-
const data = JSON.stringify(await collection.findOne({_id: id}))
|
|
29
|
-
return JSON.parse(data, generics_1.BufferJSON.reviver)
|
|
30
|
-
} catch (err) {
|
|
31
|
-
console.log(err)
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const removeData = async (id) => {
|
|
36
|
-
try{
|
|
37
|
-
await collection.deleteOne({_id: id})
|
|
38
|
-
}catch(err){
|
|
39
|
-
console.log('error',err)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const creds = (await readData('creds')) || auth_utils_1.initAuthCreds()
|
|
44
|
-
|
|
45
|
-
return{
|
|
46
|
-
state:{
|
|
47
|
-
creds,
|
|
48
|
-
keys: {
|
|
49
|
-
get: async (type,ids)=> {
|
|
50
|
-
const data = {}
|
|
51
|
-
await Promise
|
|
52
|
-
.all(
|
|
53
|
-
ids.map(async (id) => {
|
|
54
|
-
let value = await readData(`${type}-${id}`)
|
|
55
|
-
if(type === "app-state-sync-key"){
|
|
56
|
-
value = WAProto_1.proto.Message.AppStateSyncKeyData.fromObject(data)
|
|
57
|
-
}
|
|
58
|
-
data[id] = value
|
|
59
|
-
})
|
|
60
|
-
)
|
|
61
|
-
return data
|
|
62
|
-
},
|
|
63
|
-
set: async (data) => {
|
|
64
|
-
const tasks = []
|
|
65
|
-
for (const category of Object.keys(data)){
|
|
66
|
-
for (const id of Object.keys(data[category])){
|
|
67
|
-
const value = data[category][id]
|
|
68
|
-
const key = `${category}-${id}`
|
|
69
|
-
tasks.push(value? writeData(value,key) : removeData(key))
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
await Promise.all(tasks)
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
saveCreds: () => {
|
|
77
|
-
return writeData(creds, "creds")
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
module.exports = {
|
|
83
|
-
useMongoFileAuthState
|
|
84
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { ILogger } from './logger'
|
|
2
|
-
import type { AuthenticationState } from '../Types'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated use multi file auth state instead please
|
|
6
|
-
* stores the full authentication state in a single JSON file
|
|
7
|
-
*
|
|
8
|
-
* DO NOT USE IN A PROD ENVIRONMENT, only meant to serve as an example
|
|
9
|
-
* */
|
|
10
|
-
export declare const useSingleFileAuthState: (filename: string, logger?: ILogger) => {
|
|
11
|
-
state: AuthenticationState
|
|
12
|
-
saveState: () => void
|
|
13
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict"
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true })
|
|
4
|
-
|
|
5
|
-
const WAProto_1 = require("../../WAProto")
|
|
6
|
-
const auth_utils_1 = require("./auth-utils")
|
|
7
|
-
const generics_1 = require("./generics")
|
|
8
|
-
|
|
9
|
-
// useless key map only there to maintain backwards compatibility
|
|
10
|
-
// do not use in your own systems please
|
|
11
|
-
const KEY_MAP = {
|
|
12
|
-
'pre-key': 'preKeys',
|
|
13
|
-
'session': 'sessions',
|
|
14
|
-
'sender-key': 'senderKeys',
|
|
15
|
-
'app-state-sync-key': 'appStateSyncKeys',
|
|
16
|
-
'app-state-sync-version': 'appStateVersions',
|
|
17
|
-
'sender-key-memory': 'senderKeyMemory'
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @deprecated use multi file auth state instead please
|
|
22
|
-
* stores the full authentication state in a single JSON file
|
|
23
|
-
*
|
|
24
|
-
* DO NOT USE IN A PROD ENVIRONMENT, only meant to serve as an example
|
|
25
|
-
* */
|
|
26
|
-
const useSingleFileAuthState = (filename, logger) => {
|
|
27
|
-
// require fs here so that in case "fs" is not available -- the app does not crash
|
|
28
|
-
const { readFileSync, writeFileSync, existsSync } = require('fs')
|
|
29
|
-
let creds
|
|
30
|
-
let keys = {}
|
|
31
|
-
// save the authentication state to a file
|
|
32
|
-
const saveState = () => {
|
|
33
|
-
logger && logger.trace('saving auth state')
|
|
34
|
-
writeFileSync(filename,
|
|
35
|
-
// BufferJSON replacer utility saves buffers nicely
|
|
36
|
-
JSON.stringify({ creds, keys }, generics_1.BufferJSON.replacer, 2))
|
|
37
|
-
}
|
|
38
|
-
if (existsSync(filename)) {
|
|
39
|
-
const result = JSON.parse(readFileSync(filename, { encoding: 'utf-8' }), generics_1.BufferJSON.reviver)
|
|
40
|
-
creds = result.creds
|
|
41
|
-
keys = result.keys
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
creds = auth_utils_1.initAuthCreds()
|
|
45
|
-
keys = {}
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
state: {
|
|
49
|
-
creds,
|
|
50
|
-
keys: {
|
|
51
|
-
get: (type, ids) => {
|
|
52
|
-
const key = KEY_MAP[type]
|
|
53
|
-
return ids.reduce((dict, id) => {
|
|
54
|
-
let value = keys[key]?.[id]
|
|
55
|
-
if (value) {
|
|
56
|
-
if (type === 'app-state-sync-key') {
|
|
57
|
-
value = WAProto_1.proto.Message.AppStateSyncKeyData.fromObject(value)
|
|
58
|
-
}
|
|
59
|
-
dict[id] = value
|
|
60
|
-
}
|
|
61
|
-
return dict
|
|
62
|
-
}, {})
|
|
63
|
-
},
|
|
64
|
-
set: (data) => {
|
|
65
|
-
for (const _key in data) {
|
|
66
|
-
const key = KEY_MAP[_key]
|
|
67
|
-
keys[key] = keys[key] || {}
|
|
68
|
-
Object.assign(keys[key], data[_key])
|
|
69
|
-
}
|
|
70
|
-
saveState()
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
saveState
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
module.exports = {
|
|
79
|
-
useSingleFileAuthState
|
|
80
|
-
}
|