@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.
Files changed (119) hide show
  1. package/README.md +96 -85
  2. package/lib/Defaults/connection.js +39 -0
  3. package/lib/Defaults/constants.js +50 -0
  4. package/lib/Defaults/history.js +13 -0
  5. package/lib/Defaults/index.js +36 -151
  6. package/lib/Defaults/media.js +43 -0
  7. package/lib/Defaults/phonenumber-mcc.json +221 -221
  8. package/lib/Defaults/prefix.js +12 -0
  9. package/lib/Defaults/vialeys-version.json +7 -0
  10. package/lib/Signal/Group/ciphertext-message.js +10 -15
  11. package/lib/Signal/Group/group-session-builder.js +34 -60
  12. package/lib/Signal/Group/group_cipher.js +69 -76
  13. package/lib/Signal/Group/index.js +41 -60
  14. package/lib/Signal/Group/keyhelper.js +12 -57
  15. package/lib/Signal/Group/sender-chain-key.js +20 -33
  16. package/lib/Signal/Group/sender-key-distribution-message.js +43 -48
  17. package/lib/Signal/Group/sender-key-message.js +58 -53
  18. package/lib/Signal/Group/sender-key-name.js +21 -31
  19. package/lib/Signal/Group/sender-key-record.js +21 -34
  20. package/lib/Signal/Group/sender-key-state.js +59 -106
  21. package/lib/Signal/Group/sender-message-key.js +16 -21
  22. package/lib/Signal/libsignal.js +282 -203
  23. package/lib/Signal/lid-mapping.js +164 -184
  24. package/lib/Socket/Client/index.js +31 -22
  25. package/lib/Socket/Client/types.js +9 -15
  26. package/lib/Socket/Client/websocket.js +42 -37
  27. package/lib/Socket/business.js +212 -336
  28. package/lib/Socket/chats.js +696 -940
  29. package/lib/Socket/community.js +454 -369
  30. package/lib/Socket/groups.js +278 -280
  31. package/lib/Socket/index.js +9 -21
  32. package/lib/Socket/messages-recv.js +1027 -1570
  33. package/lib/Socket/messages-send.js +1180 -1136
  34. package/lib/Socket/mex.js +59 -0
  35. package/lib/Socket/newsletter.js +193 -251
  36. package/lib/Socket/socket.js +758 -898
  37. package/lib/Store/index.js +35 -24
  38. package/lib/Store/make-cache-manager-store.js +53 -66
  39. package/lib/Store/make-in-memory-store.js +319 -325
  40. package/lib/Store/make-ordered-dictionary.js +49 -57
  41. package/lib/Store/object-repository.js +10 -15
  42. package/lib/Types/Auth.js +2 -3
  43. package/lib/Types/Bussines.js +2 -3
  44. package/lib/Types/Call.js +2 -3
  45. package/lib/Types/Chat.js +10 -9
  46. package/lib/Types/Contact.js +2 -3
  47. package/lib/Types/Events.js +2 -3
  48. package/lib/Types/GroupMetadata.js +2 -3
  49. package/lib/Types/Label.js +6 -12
  50. package/lib/Types/LabelAssociation.js +4 -13
  51. package/lib/Types/Message.js +10 -18
  52. package/lib/Types/MexUpdates.js +15 -18
  53. package/lib/Types/Newsletter.js +26 -34
  54. package/lib/Types/Product.js +2 -3
  55. package/lib/Types/Signal.js +2 -3
  56. package/lib/Types/Socket.js +2 -3
  57. package/lib/Types/State.js +8 -13
  58. package/lib/Types/USync.js +2 -3
  59. package/lib/Types/index.js +49 -40
  60. package/lib/Utils/auth-utils.js +190 -495
  61. package/lib/Utils/browser-utils.js +29 -0
  62. package/lib/Utils/business.js +177 -199
  63. package/lib/Utils/chat-utils.js +711 -624
  64. package/lib/Utils/crypto.js +116 -161
  65. package/lib/Utils/decode-wa-message.js +225 -321
  66. package/lib/Utils/event-buffer.js +363 -405
  67. package/lib/Utils/generics.js +318 -472
  68. package/lib/Utils/history.js +72 -76
  69. package/lib/Utils/index.js +49 -41
  70. package/lib/Utils/link-preview.js +59 -103
  71. package/lib/Utils/logger.js +4 -7
  72. package/lib/Utils/lt-hash.js +29 -42
  73. package/lib/Utils/make-mutex.js +26 -42
  74. package/lib/Utils/message-retry-manager.js +134 -160
  75. package/lib/Utils/messages-media.js +665 -731
  76. package/lib/Utils/messages.js +518 -1
  77. package/lib/Utils/noise-handler.js +127 -125
  78. package/lib/Utils/pre-key-manager.js +86 -0
  79. package/lib/Utils/process-message.js +739 -351
  80. package/lib/Utils/signal.js +146 -129
  81. package/lib/Utils/use-multi-file-auth-state.js +68 -135
  82. package/lib/Utils/validate-connection.js +183 -142
  83. package/lib/Utils/vialeys-event-stream.js +41 -0
  84. package/lib/WABinary/constants.js +1281 -1289
  85. package/lib/WABinary/decode.js +145 -200
  86. package/lib/WABinary/encode.js +149 -202
  87. package/lib/WABinary/generic-utils.js +79 -97
  88. package/lib/WABinary/index.js +36 -25
  89. package/lib/WABinary/jid-utils.js +91 -123
  90. package/lib/WABinary/types.js +2 -3
  91. package/lib/WAM/BinaryInfo.js +8 -13
  92. package/lib/WAM/constants.js +16584 -11464
  93. package/lib/WAM/encode.js +117 -133
  94. package/lib/WAM/index.js +34 -23
  95. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +62 -69
  96. package/lib/WAUSync/Protocols/USyncContactProtocol.js +11 -25
  97. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +32 -44
  98. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +13 -23
  99. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +24 -38
  100. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +17 -31
  101. package/lib/WAUSync/Protocols/index.js +37 -26
  102. package/lib/WAUSync/USyncQuery.js +66 -66
  103. package/lib/WAUSync/USyncUser.js +13 -18
  104. package/lib/WAUSync/index.js +34 -23
  105. package/lib/index.js +95 -28
  106. package/package.json +2 -1
  107. package/lib/Defaults/baileys-version.json +0 -3
  108. package/lib/Signal/Group/queue-job.d.ts +0 -1
  109. package/lib/Signal/Group/queue-job.js +0 -57
  110. package/lib/Socket/usync.d.ts +0 -37
  111. package/lib/Socket/usync.js +0 -83
  112. package/lib/Utils/baileys-event-stream.d.ts +0 -18
  113. package/lib/Utils/baileys-event-stream.js +0 -70
  114. package/lib/Utils/signal-housekeeping.d.ts +0 -19
  115. package/lib/Utils/signal-housekeeping.js +0 -73
  116. package/lib/Utils/use-mongo-file-auth-state.d.ts +0 -6
  117. package/lib/Utils/use-mongo-file-auth-state.js +0 -84
  118. package/lib/Utils/use-single-file-auth-state.d.ts +0 -13
  119. 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
- }
@@ -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
- }
@@ -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,6 +0,0 @@
1
- import { AuthenticationState } from '../Types'
2
-
3
- export declare const useMongoFileAuthState: (collection: string) => Promise<{
4
- state: AuthenticationState
5
- saveCreds: () => Promise<void>
6
- }>
@@ -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
- }