@wenzyx1/bails 1.0.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 (218) hide show
  1. package/README.md +231 -0
  2. package/WAProto/fix-imports.js +85 -0
  3. package/WAProto/index.d.ts +79257 -0
  4. package/WAProto/index.js +242946 -0
  5. package/engine-requirements.js +10 -0
  6. package/lib/Defaults/baileys-version.json +3 -0
  7. package/lib/Defaults/index.d.ts +53 -0
  8. package/lib/Defaults/index.js +147 -0
  9. package/lib/Defaults/phonenumber-mcc.json +223 -0
  10. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  11. package/lib/Signal/Group/ciphertext-message.js +15 -0
  12. package/lib/Signal/Group/group-session-builder.d.ts +14 -0
  13. package/lib/Signal/Group/group-session-builder.js +64 -0
  14. package/lib/Signal/Group/group_cipher.d.ts +17 -0
  15. package/lib/Signal/Group/group_cipher.js +93 -0
  16. package/lib/Signal/Group/index.d.ts +11 -0
  17. package/lib/Signal/Group/index.js +57 -0
  18. package/lib/Signal/Group/keyhelper.d.ts +10 -0
  19. package/lib/Signal/Group/keyhelper.js +55 -0
  20. package/lib/Signal/Group/queue-job.d.ts +1 -0
  21. package/lib/Signal/Group/queue-job.js +53 -0
  22. package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
  23. package/lib/Signal/Group/sender-chain-key.js +34 -0
  24. package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
  25. package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
  26. package/lib/Signal/Group/sender-key-message.d.ts +18 -0
  27. package/lib/Signal/Group/sender-key-message.js +69 -0
  28. package/lib/Signal/Group/sender-key-name.d.ts +17 -0
  29. package/lib/Signal/Group/sender-key-name.js +51 -0
  30. package/lib/Signal/Group/sender-key-record.d.ts +30 -0
  31. package/lib/Signal/Group/sender-key-record.js +53 -0
  32. package/lib/Signal/Group/sender-key-state.d.ts +38 -0
  33. package/lib/Signal/Group/sender-key-state.js +99 -0
  34. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  35. package/lib/Signal/Group/sender-message-key.js +29 -0
  36. package/lib/Signal/libsignal.d.ts +3 -0
  37. package/lib/Signal/libsignal.js +454 -0
  38. package/lib/Signal/lid-mapping.js +280 -0
  39. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  40. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  41. package/lib/Socket/Client/index.d.ts +3 -0
  42. package/lib/Socket/Client/index.js +19 -0
  43. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  44. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  45. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  46. package/lib/Socket/Client/web-socket-client.js +62 -0
  47. package/lib/Socket/business.d.ts +171 -0
  48. package/lib/Socket/business.js +342 -0
  49. package/lib/Socket/chats.d.ts +267 -0
  50. package/lib/Socket/chats.js +978 -0
  51. package/lib/Socket/communities.mjs +428 -0
  52. package/lib/Socket/dugong.d.ts +254 -0
  53. package/lib/Socket/dugong.js +558 -0
  54. package/lib/Socket/groups.d.ts +115 -0
  55. package/lib/Socket/groups.js +380 -0
  56. package/lib/Socket/index.d.ts +173 -0
  57. package/lib/Socket/index.js +32 -0
  58. package/lib/Socket/luxu.js +545 -0
  59. package/lib/Socket/messages-recv.d.ts +161 -0
  60. package/lib/Socket/messages-recv.js +1124 -0
  61. package/lib/Socket/messages-send.d.ts +149 -0
  62. package/lib/Socket/messages-send.js +1476 -0
  63. package/lib/Socket/mex.mjs +50 -0
  64. package/lib/Socket/newsletter.d.ts +134 -0
  65. package/lib/Socket/newsletter.js +351 -0
  66. package/lib/Socket/registration.d.ts +267 -0
  67. package/lib/Socket/registration.js +166 -0
  68. package/lib/Socket/socket.d.ts +43 -0
  69. package/lib/Socket/socket.js +904 -0
  70. package/lib/Socket/username.mjs +132 -0
  71. package/lib/Socket/usync.d.ts +36 -0
  72. package/lib/Socket/usync.js +70 -0
  73. package/lib/Store/index.d.ts +3 -0
  74. package/lib/Store/index.js +10 -0
  75. package/lib/Store/keyed-db.d.ts +30 -0
  76. package/lib/Store/keyed-db.js +233 -0
  77. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  78. package/lib/Store/make-cache-manager-store.js +83 -0
  79. package/lib/Store/make-in-memory-store.d.ts +118 -0
  80. package/lib/Store/make-in-memory-store.js +427 -0
  81. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  82. package/lib/Store/make-ordered-dictionary.js +81 -0
  83. package/lib/Store/object-repository.d.ts +10 -0
  84. package/lib/Store/object-repository.js +27 -0
  85. package/lib/Types/Auth.d.ts +110 -0
  86. package/lib/Types/Auth.js +2 -0
  87. package/lib/Types/Call.d.ts +13 -0
  88. package/lib/Types/Call.js +2 -0
  89. package/lib/Types/Chat.d.ts +102 -0
  90. package/lib/Types/Chat.js +4 -0
  91. package/lib/Types/Contact.d.ts +19 -0
  92. package/lib/Types/Contact.js +2 -0
  93. package/lib/Types/Events.d.ts +157 -0
  94. package/lib/Types/Events.js +2 -0
  95. package/lib/Types/GroupMetadata.d.ts +55 -0
  96. package/lib/Types/GroupMetadata.js +2 -0
  97. package/lib/Types/Label.d.ts +35 -0
  98. package/lib/Types/Label.js +27 -0
  99. package/lib/Types/LabelAssociation.d.ts +29 -0
  100. package/lib/Types/LabelAssociation.js +9 -0
  101. package/lib/Types/Message.d.ts +273 -0
  102. package/lib/Types/Message.js +9 -0
  103. package/lib/Types/Mex.js +39 -0
  104. package/lib/Types/Newsletter.d.ts +103 -0
  105. package/lib/Types/Newsletter.js +38 -0
  106. package/lib/Types/Product.d.ts +78 -0
  107. package/lib/Types/Product.js +2 -0
  108. package/lib/Types/Signal.d.ts +57 -0
  109. package/lib/Types/Signal.js +2 -0
  110. package/lib/Types/Socket.d.ts +111 -0
  111. package/lib/Types/Socket.js +2 -0
  112. package/lib/Types/State.d.ts +27 -0
  113. package/lib/Types/State.js +2 -0
  114. package/lib/Types/USync.d.ts +25 -0
  115. package/lib/Types/USync.js +2 -0
  116. package/lib/Types/index.d.ts +57 -0
  117. package/lib/Types/index.js +43 -0
  118. package/lib/Utils/Mex.js +39 -0
  119. package/lib/Utils/auth-utils.d.ts +18 -0
  120. package/lib/Utils/auth-utils.js +206 -0
  121. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  122. package/lib/Utils/baileys-event-stream.js +57 -0
  123. package/lib/Utils/browser-presets.js +64 -0
  124. package/lib/Utils/business.d.ts +22 -0
  125. package/lib/Utils/business.js +234 -0
  126. package/lib/Utils/chat-utils.d.ts +71 -0
  127. package/lib/Utils/chat-utils.js +726 -0
  128. package/lib/Utils/companion-reg-client-utils.js +40 -0
  129. package/lib/Utils/crypto.d.ts +41 -0
  130. package/lib/Utils/crypto.js +151 -0
  131. package/lib/Utils/decode-wa-message.d.ts +19 -0
  132. package/lib/Utils/decode-wa-message.js +198 -0
  133. package/lib/Utils/event-buffer.d.ts +35 -0
  134. package/lib/Utils/event-buffer.js +514 -0
  135. package/lib/Utils/extended-messages.js +231 -0
  136. package/lib/Utils/generics.d.ts +92 -0
  137. package/lib/Utils/generics.js +425 -0
  138. package/lib/Utils/history.d.ts +15 -0
  139. package/lib/Utils/history.js +96 -0
  140. package/lib/Utils/identity-change-handler.js +52 -0
  141. package/lib/Utils/index.d.ts +17 -0
  142. package/lib/Utils/index.js +40 -0
  143. package/lib/Utils/link-preview.d.ts +21 -0
  144. package/lib/Utils/link-preview.js +93 -0
  145. package/lib/Utils/logger.d.ts +4 -0
  146. package/lib/Utils/logger.js +7 -0
  147. package/lib/Utils/lt-hash.d.ts +12 -0
  148. package/lib/Utils/lt-hash.js +51 -0
  149. package/lib/Utils/make-mutex.d.ts +7 -0
  150. package/lib/Utils/make-mutex.js +43 -0
  151. package/lib/Utils/message-composer.js +293 -0
  152. package/lib/Utils/message-retry-manager.js +226 -0
  153. package/lib/Utils/messages-media.d.ts +116 -0
  154. package/lib/Utils/messages-media.js +815 -0
  155. package/lib/Utils/messages.d.ts +77 -0
  156. package/lib/Utils/messages.js +888 -0
  157. package/lib/Utils/noise-handler.d.ts +21 -0
  158. package/lib/Utils/noise-handler.js +155 -0
  159. package/lib/Utils/offline-node-processor.js +46 -0
  160. package/lib/Utils/pre-key-manager.js +95 -0
  161. package/lib/Utils/process-message.d.ts +41 -0
  162. package/lib/Utils/process-message.js +321 -0
  163. package/lib/Utils/reporting-utils.js +272 -0
  164. package/lib/Utils/signal.d.ts +32 -0
  165. package/lib/Utils/signal.js +160 -0
  166. package/lib/Utils/stanza-ack.js +38 -0
  167. package/lib/Utils/sync-action-utils.js +50 -0
  168. package/lib/Utils/tc-token-utils.js +169 -0
  169. package/lib/Utils/use-multi-file-auth-state.d.ts +13 -0
  170. package/lib/Utils/use-multi-file-auth-state.js +119 -0
  171. package/lib/Utils/validate-connection.d.ts +11 -0
  172. package/lib/Utils/validate-connection.js +229 -0
  173. package/lib/WABinary/constants.d.ts +30 -0
  174. package/lib/WABinary/constants.js +40 -0
  175. package/lib/WABinary/decode.d.ts +7 -0
  176. package/lib/WABinary/decode.js +252 -0
  177. package/lib/WABinary/encode.d.ts +3 -0
  178. package/lib/WABinary/encode.js +265 -0
  179. package/lib/WABinary/generic-utils.d.ts +17 -0
  180. package/lib/WABinary/generic-utils.js +204 -0
  181. package/lib/WABinary/index.d.ts +5 -0
  182. package/lib/WABinary/index.js +21 -0
  183. package/lib/WABinary/jid-utils.d.ts +31 -0
  184. package/lib/WABinary/jid-utils.js +132 -0
  185. package/lib/WABinary/types.d.ts +18 -0
  186. package/lib/WABinary/types.js +2 -0
  187. package/lib/WAM/BinaryInfo.d.ts +17 -0
  188. package/lib/WAM/BinaryInfo.js +13 -0
  189. package/lib/WAM/constants.d.ts +38 -0
  190. package/lib/WAM/constants.js +15350 -0
  191. package/lib/WAM/encode.d.ts +3 -0
  192. package/lib/WAM/encode.js +155 -0
  193. package/lib/WAM/index.d.ts +3 -0
  194. package/lib/WAM/index.js +19 -0
  195. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  196. package/lib/WAUSync/Protocols/USyncContactProtocol.js +55 -0
  197. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  198. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  199. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  200. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  201. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  202. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  203. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +27 -0
  204. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  205. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  206. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  207. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  208. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  209. package/lib/WAUSync/Protocols/index.js +21 -0
  210. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  211. package/lib/WAUSync/USyncQuery.js +93 -0
  212. package/lib/WAUSync/USyncUser.d.ts +12 -0
  213. package/lib/WAUSync/USyncUser.js +34 -0
  214. package/lib/WAUSync/index.d.ts +3 -0
  215. package/lib/WAUSync/index.js +19 -0
  216. package/lib/index.d.ts +12 -0
  217. package/lib/index.js +52 -0
  218. package/package.json +112 -0
@@ -0,0 +1,132 @@
1
+ import { executeWMexQuery } from './mex.mjs';
2
+ import WAUSyncDefault from '../WAUSync/index.js';
3
+
4
+ const { USyncQuery, USyncUser } = WAUSyncDefault;
5
+
6
+ /**
7
+ * Ported from xata-bail's lib/Socket/username.js.
8
+ * Adapted for edgar-bail: instead of building its own socket chain via
9
+ * makeNewsletterSocket(config), this layer takes an already-built `sock`
10
+ * (the output of edgar's existing, unmodified synchronous chain) and adds
11
+ * username-related methods on top of it.
12
+ */
13
+
14
+ export const USERNAME_QUERY_IDS = {
15
+ CHECK: '26124072630599520', // UsernameCheck
16
+ CHECK_MULTI: '27134626522840290', // UsernameCheckMulti
17
+ SET: '27108705368767936', // UsernameSet
18
+ GET: '32618050064506056', // UsernameGet
19
+ GET_RECOMMENDATIONS: '26077456248616956', // UsernameGetRecommendationsQuery
20
+ PIN_SET: '25529696019976770' // UsernamePinSet
21
+ };
22
+
23
+ export const USERNAME_CHECK_RESULT = {
24
+ SUCCESS: 'SUCCESS',
25
+ INVALID: 'INVALID'
26
+ };
27
+
28
+ export const USERNAME_SOURCE = {
29
+ FB: 'FB',
30
+ IG: 'IG',
31
+ USER_INPUT: 'USER_INPUT',
32
+ SUGGESTION: 'SUGGESTION'
33
+ };
34
+
35
+ export const makeUsernameSocketLayer = (sock) => {
36
+ const { query, generateMessageTag, executeUSyncQuery } = sock;
37
+
38
+ const mexQuery = (variables, queryId, dataPath) =>
39
+ executeWMexQuery(variables, queryId, dataPath, query, generateMessageTag);
40
+
41
+ const checkUsername = async (username, includeSuggestions = true) => {
42
+ const data = await mexQuery(
43
+ { username, include_suggestions: includeSuggestions },
44
+ USERNAME_QUERY_IDS.CHECK,
45
+ 'xwa2_username_check'
46
+ );
47
+ if (data?.result === USERNAME_CHECK_RESULT.SUCCESS) {
48
+ return { available: true, username };
49
+ }
50
+ return {
51
+ available: false,
52
+ username,
53
+ suggestions: data?.suggestions ?? [],
54
+ rejectionReasons: data?.rejection_reasons ?? [],
55
+ suggestionsEligible: data?.suggestions_eligible ?? true
56
+ };
57
+ };
58
+
59
+ const setUsername = async (username, options = {}) => {
60
+ const { source = USERNAME_SOURCE.USER_INPUT, sessionId, pin } = options;
61
+ const variables = {
62
+ username,
63
+ reserved: false,
64
+ source,
65
+ ...(sessionId ? { session_id: sessionId } : {}),
66
+ ...(pin ? { pin } : {})
67
+ };
68
+ return mexQuery(variables, USERNAME_QUERY_IDS.SET, 'xwa2_username_set');
69
+ };
70
+
71
+ const deleteUsername = async () => {
72
+ return mexQuery({ username: null }, USERNAME_QUERY_IDS.SET, 'xwa2_username_delete');
73
+ };
74
+
75
+ const getMyUsername = async () => {
76
+ const data = await mexQuery({}, USERNAME_QUERY_IDS.GET, 'xwa2_username_get');
77
+ return data?.username ?? null;
78
+ };
79
+
80
+ const setUsernamePin = async pin => {
81
+ return mexQuery({ pin }, USERNAME_QUERY_IDS.PIN_SET, 'xwa2_username_pin_set');
82
+ };
83
+
84
+ const findUserByUsername = async (username, pin) => {
85
+ const usyncQuery = new USyncQuery().withContactProtocol();
86
+ const user = new USyncUser().withUsername(username);
87
+ if (pin) user.withUsernameKey(pin);
88
+ usyncQuery.withUser(user);
89
+ const result = await executeUSyncQuery(usyncQuery);
90
+ if (!result?.list?.length) return null;
91
+ const entry = result.list[0];
92
+ return {
93
+ jid: entry.id,
94
+ contact: entry.contact ?? false
95
+ };
96
+ };
97
+
98
+ const fetchContactUsernames = async (...jids) => {
99
+ const usyncQuery = new USyncQuery().withUsernameProtocol();
100
+ for (const jid of jids) {
101
+ usyncQuery.withUser(new USyncUser().withId(jid));
102
+ }
103
+ const result = await executeUSyncQuery(usyncQuery);
104
+ return result?.list ?? [];
105
+ };
106
+
107
+ const checkUsernameMulti = async usernames => {
108
+ return mexQuery({ usernames }, USERNAME_QUERY_IDS.CHECK_MULTI, 'xwa2_username_check_multi');
109
+ };
110
+
111
+ const getUsernameRecommendations = async (source = null) => {
112
+ const variables = {};
113
+ if (source) variables.source = source;
114
+ return mexQuery(variables, USERNAME_QUERY_IDS.GET_RECOMMENDATIONS, 'xwa2_username_get_recommendations');
115
+ };
116
+
117
+ return {
118
+ ...sock,
119
+ checkUsername,
120
+ checkUsernameMulti,
121
+ setUsername,
122
+ deleteUsername,
123
+ getMyUsername,
124
+ getUsernameRecommendations,
125
+ setUsernamePin,
126
+ findUserByUsername,
127
+ fetchContactUsernames,
128
+ USERNAME_QUERY_IDS,
129
+ USERNAME_CHECK_RESULT,
130
+ USERNAME_SOURCE
131
+ };
132
+ };
@@ -0,0 +1,36 @@
1
+ import { Boom } from '@hapi/boom';
2
+ import { SocketConfig } from '../Types';
3
+ import { BinaryNode } from '../WABinary';
4
+ import { USyncQuery } from '../WAUSync';
5
+ export declare const makeUSyncSocket: (config: SocketConfig) => {
6
+ executeUSyncQuery: (usyncQuery: USyncQuery) => Promise<import("../WAUSync").USyncQueryResult | undefined>;
7
+ type: "md";
8
+ ws: import("./Client").WebSocketClient;
9
+ ev: import("../Types").BaileysEventEmitter & {
10
+ process(handler: (events: Partial<import("../Types").BaileysEventMap>) => void | Promise<void>): (() => void);
11
+ buffer(): void;
12
+ createBufferedFunction<A extends any[], T>(work: (...args: A) => Promise<T>): ((...args: A) => Promise<T>);
13
+ flush(force?: boolean): boolean;
14
+ isBuffering(): boolean;
15
+ };
16
+ authState: {
17
+ creds: import("../Types").AuthenticationCreds;
18
+ keys: import("../Types").SignalKeyStoreWithTransaction;
19
+ };
20
+ signalRepository: import("../Types").SignalRepository;
21
+ user: import("../Types").Contact | undefined;
22
+ generateMessageTag: () => string;
23
+ query: (node: BinaryNode, timeoutMs?: number) => Promise<BinaryNode>;
24
+ waitForMessage: <T>(msgId: string, timeoutMs?: number | undefined) => Promise<any>;
25
+ waitForSocketOpen: () => Promise<void>;
26
+ sendRawMessage: (data: Uint8Array | Buffer) => Promise<void>;
27
+ sendNode: (frame: BinaryNode) => Promise<void>;
28
+ logout: (msg?: string) => Promise<void>;
29
+ end: (error: Error | undefined) => void;
30
+ onUnexpectedError: (err: Error | Boom, msg: string) => void;
31
+ uploadPreKeys: (count?: number) => Promise<void>;
32
+ uploadPreKeysToServerIfRequired: () => Promise<void>;
33
+ requestPairingCode: (phoneNumber: string, customPairingCode?: string) => Promise<string>;
34
+ waitForConnectionUpdate: (check: (u: Partial<import("../Types").ConnectionState>) => Promise<boolean | undefined>, timeoutMs?: number) => Promise<void>;
35
+ sendWAMBuffer: (wamBuffer: Buffer) => Promise<BinaryNode>;
36
+ };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeUSyncSocket = void 0;
4
+ const boom_1 = require("@hapi/boom");
5
+ const WABinary_1 = require("../WABinary");
6
+ const socket_1 = require("./socket");
7
+ const makeUSyncSocket = (config) => {
8
+ const sock = (0, socket_1.makeSocket)(config);
9
+ const { generateMessageTag, query, } = sock;
10
+ const executeUSyncQuery = async (usyncQuery) => {
11
+ if (usyncQuery.protocols.length === 0) {
12
+ throw new boom_1.Boom('USyncQuery must have at least one protocol');
13
+ }
14
+ // todo: validate users, throw WARNING on no valid users
15
+ // variable below has only validated users
16
+ const validUsers = usyncQuery.users;
17
+ const userNodes = validUsers.map((user) => {
18
+ return {
19
+ tag: 'user',
20
+ attrs: {
21
+ jid: !user.phone ? user.id : undefined,
22
+ },
23
+ content: usyncQuery.protocols
24
+ .map((a) => a.getUserElement(user))
25
+ .filter(a => a !== null)
26
+ };
27
+ });
28
+ const listNode = {
29
+ tag: 'list',
30
+ attrs: {},
31
+ content: userNodes
32
+ };
33
+ const queryNode = {
34
+ tag: 'query',
35
+ attrs: {},
36
+ content: usyncQuery.protocols.map((a) => a.getQueryElement())
37
+ };
38
+ const iq = {
39
+ tag: 'iq',
40
+ attrs: {
41
+ to: WABinary_1.S_WHATSAPP_NET,
42
+ type: 'get',
43
+ xmlns: 'usync',
44
+ },
45
+ content: [
46
+ {
47
+ tag: 'usync',
48
+ attrs: {
49
+ context: usyncQuery.context,
50
+ mode: usyncQuery.mode,
51
+ sid: generateMessageTag(),
52
+ last: 'true',
53
+ index: '0',
54
+ },
55
+ content: [
56
+ queryNode,
57
+ listNode
58
+ ]
59
+ }
60
+ ],
61
+ };
62
+ const result = await query(iq);
63
+ return usyncQuery.parseUSyncQueryResult(result);
64
+ };
65
+ return {
66
+ ...sock,
67
+ executeUSyncQuery,
68
+ };
69
+ };
70
+ exports.makeUSyncSocket = makeUSyncSocket;
@@ -0,0 +1,3 @@
1
+ import makeCacheManagerAuthState from './make-cache-manager-store';
2
+ import makeInMemoryStore from './make-in-memory-store';
3
+ export { makeInMemoryStore, makeCacheManagerAuthState };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.makeCacheManagerAuthState = exports.makeInMemoryStore = void 0;
7
+ const make_cache_manager_store_1 = __importDefault(require("./make-cache-manager-store"));
8
+ exports.makeCacheManagerAuthState = make_cache_manager_store_1.default;
9
+ const make_in_memory_store_1 = __importDefault(require("./make-in-memory-store"));
10
+ exports.makeInMemoryStore = make_in_memory_store_1.default;
@@ -0,0 +1,30 @@
1
+ export interface Comparable {
2
+ key: (value: any) => string | number;
3
+ compare: (k1: string | number, k2: string | number) => number;
4
+ }
5
+ export default class KeyedDB<T = any> {
6
+ key: Comparable;
7
+ idGetter: (value: T) => string;
8
+ dict: { [id: string]: T };
9
+ array: T[];
10
+ constructor(key: Comparable, id?: (value: T) => string);
11
+ get length(): number;
12
+ get first(): T | undefined;
13
+ get last(): T | undefined;
14
+ toJSON(): T[];
15
+ insert(...values: T[]): void;
16
+ upsert(...values: T[]): T[];
17
+ insertIfAbsent(...values: T[]): T[];
18
+ deleteById(id: string, assertPresent?: boolean): T | null | undefined;
19
+ delete(value: T): T | null;
20
+ slice(start?: number, end?: number): KeyedDB<T>;
21
+ clear(): void;
22
+ get(id: string): T | undefined;
23
+ all(): T[];
24
+ update(id: string, update: (value: T) => void): number | undefined;
25
+ updateKey(value: T, update: (value: T) => void): number | undefined;
26
+ filter(predicate: (value: T, index: number) => boolean): KeyedDB<T>;
27
+ paginatedByValue(value: T | null | undefined, limit: number, predicate?: (value: T, index: number) => boolean, mode?: 'before' | 'after'): T[];
28
+ paginated(cursor: string | number | null | undefined, limit: number, predicate?: (value: T, index: number) => boolean, mode?: 'before' | 'after'): T[];
29
+ firstIndex(value: T): number;
30
+ }
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ /**
3
+ * Local, dependency-free reimplementation of `@adiwajshing/keyed-db` (v0.2.4).
4
+ * The original package on npm has not been updated in 5+ years — this file
5
+ * replaces it 1:1 (same method names, same signatures, same behaviour) so
6
+ * nothing else in this codebase needs to change.
7
+ *
8
+ * key: { key: (value) => Comparable, compare: (a, b) => number }
9
+ * id: (value) => string (optional — defaults to key.key(value).toString())
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+
13
+ function binarySearch(array, comparator) {
14
+ // returns the first index i for which comparator(array[i]) <= 0
15
+ let low = 0;
16
+ let high = array.length;
17
+ while (low < high) {
18
+ const mid = (low + high) >>> 1;
19
+ if (comparator(array[mid]) > 0) {
20
+ low = mid + 1;
21
+ }
22
+ else {
23
+ high = mid;
24
+ }
25
+ }
26
+ return low;
27
+ }
28
+
29
+ class KeyedDB {
30
+ /**
31
+ * @param key Object describing how to sort & key items: { key, compare }
32
+ * @param id The unique ID getter for the items (optional)
33
+ */
34
+ constructor(key, id) {
35
+ this.key = key;
36
+ this.idGetter = id || (v => this.key.key(v).toString());
37
+ this.dict = {};
38
+ this.array = [];
39
+ }
40
+ get length() {
41
+ return this.array.length;
42
+ }
43
+ get first() {
44
+ return this.array[0];
45
+ }
46
+ get last() {
47
+ return this.array[this.array.length - 1];
48
+ }
49
+ toJSON() {
50
+ return this.array;
51
+ }
52
+ /** Inserts items into the DB in klogN time. */
53
+ insert(...values) {
54
+ values.forEach(v => this._insertSingle(v));
55
+ }
56
+ /**
57
+ * Upserts items into the DB.
58
+ * If a duplicate is found, it is deleted first and then the new one is inserted.
59
+ * @returns list of updated (previously-existing) values
60
+ */
61
+ upsert(...values) {
62
+ const updates = [];
63
+ values.forEach(v => {
64
+ if (!v)
65
+ return;
66
+ const deleted = this.deleteById(this.idGetter(v), false);
67
+ this._insertSingle(v);
68
+ deleted && updates.push(v);
69
+ });
70
+ return updates;
71
+ }
72
+ /** Inserts items only if they are not already present in the DB */
73
+ insertIfAbsent(...values) {
74
+ const insertions = [];
75
+ values.forEach(v => {
76
+ if (!v)
77
+ return;
78
+ const presentValue = this.get(this.idGetter(v));
79
+ if (presentValue)
80
+ return;
81
+ const presentKey = this.firstIndex(v);
82
+ if (this.array[presentKey] && this.key.key(this.array[presentKey]) === this.key.key(v))
83
+ return;
84
+ this.insert(v);
85
+ insertions.push(v);
86
+ });
87
+ return insertions;
88
+ }
89
+ /** Deletes an item indexed by the ID */
90
+ deleteById(id, assertPresent = true) {
91
+ const value = this.get(id);
92
+ if (!value) {
93
+ if (assertPresent)
94
+ throw new Error(`Value not found`);
95
+ else
96
+ return;
97
+ }
98
+ return this.delete(value);
99
+ }
100
+ delete(value) {
101
+ const index = this.firstIndex(value);
102
+ if (index < 0 || index >= this.array.length || this.key.key(value) !== this.key.key(this.array[index])) {
103
+ return null;
104
+ }
105
+ delete this.dict[this.idGetter(value)];
106
+ return this.array.splice(index, 1)[0];
107
+ }
108
+ slice(start, end) {
109
+ const db = new KeyedDB(this.key, this.idGetter);
110
+ db.array = this.array.slice(start, end);
111
+ db.array.forEach(item => db.dict[this.idGetter(item)] = item);
112
+ return db;
113
+ }
114
+ /** Clears the DB */
115
+ clear() {
116
+ this.array = [];
117
+ this.dict = {};
118
+ }
119
+ get(id) {
120
+ return this.dict[id];
121
+ }
122
+ all() {
123
+ return this.array;
124
+ }
125
+ /**
126
+ * Updates a value specified by the ID and repositions it in the DB if
127
+ * the sort key changed.
128
+ */
129
+ update(id, update) {
130
+ const value = this.get(id);
131
+ if (value) {
132
+ const idx = this.firstIndex(value);
133
+ if (idx >= 0 && idx < this.array.length && this.idGetter(this.array[idx]) === id) {
134
+ const oldKey = this.key.key(value);
135
+ update(value);
136
+ const newKey = this.key.key(value);
137
+ if (newKey !== oldKey) {
138
+ delete this.dict[id];
139
+ this.array.splice(idx, 1);
140
+ this._insertSingle(value);
141
+ return 2;
142
+ }
143
+ return 1;
144
+ }
145
+ }
146
+ }
147
+ /** @deprecated see `update` */
148
+ updateKey(value, update) {
149
+ return this.update(this.idGetter(value), update);
150
+ }
151
+ filter(predicate) {
152
+ const db = new KeyedDB(this.key, this.idGetter);
153
+ db.array = this.array.filter((value, index) => {
154
+ if (predicate(value, index)) {
155
+ db.dict[this.idGetter(value)] = value;
156
+ return true;
157
+ }
158
+ return false;
159
+ });
160
+ return db;
161
+ }
162
+ paginatedByValue(value, limit, predicate, mode = 'after') {
163
+ return this.paginated(value && this.key.key(value), limit, predicate, mode);
164
+ }
165
+ paginated(cursor, limit, predicate, mode = 'after') {
166
+ let index = mode === 'after' ? 0 : this.array.length;
167
+ if (cursor !== null && typeof cursor !== 'undefined') {
168
+ index = binarySearch(this.array, v => this.key.compare(cursor, this.key.key(v)));
169
+ if (index < 0)
170
+ index = 0;
171
+ if (this.array[index] && this.key.key(this.array[index]) === cursor)
172
+ index += (mode === 'after' ? 1 : 0);
173
+ }
174
+ return this._filtered(index, limit, mode, predicate);
175
+ }
176
+ _insertSingle(value) {
177
+ if (!value)
178
+ throw new Error('falsey value');
179
+ const valueID = this.idGetter(value);
180
+ if (this.get(valueID)) {
181
+ throw new Error('duplicate ID being inserted: ' + valueID);
182
+ }
183
+ if (this.array.length > 0) {
184
+ const index = this.firstIndex(value);
185
+ if (index >= this.array.length)
186
+ this.array.push(value);
187
+ else if (index < 0)
188
+ this.array.unshift(value);
189
+ else if (this.key.key(value) !== this.key.key(this.array[index]))
190
+ this.array.splice(index, 0, value);
191
+ else
192
+ throw new Error(`duplicate key: ${this.key.key(value)}, of inserting: ${valueID}, present: ${this.idGetter(this.array[index])}`);
193
+ }
194
+ else {
195
+ this.array.push(value);
196
+ }
197
+ this.dict[valueID] = value;
198
+ }
199
+ _filtered(start, count, mode, predicate) {
200
+ let arr;
201
+ if (mode === 'after') {
202
+ if (predicate) {
203
+ arr = [];
204
+ for (const item of this.array.slice(start)) {
205
+ predicate(item, start + arr.length) && arr.push(item);
206
+ if (arr.length >= count)
207
+ break;
208
+ }
209
+ }
210
+ else
211
+ arr = this.array.slice(start, start + count);
212
+ }
213
+ else if (mode === 'before') {
214
+ if (predicate) {
215
+ arr = [];
216
+ for (let i = start - 1; i >= 0; i--) {
217
+ const item = this.array[i];
218
+ predicate(item, start + arr.length) && arr.unshift(item);
219
+ if (arr.length >= count)
220
+ break;
221
+ }
222
+ }
223
+ else
224
+ arr = this.array.slice(Math.max(start - count, 0), start);
225
+ }
226
+ return arr;
227
+ }
228
+ firstIndex(value) {
229
+ const valueKey = this.key.key(value);
230
+ return binarySearch(this.array, v => this.key.compare(valueKey, this.key.key(v)));
231
+ }
232
+ }
233
+ exports.default = KeyedDB;
@@ -0,0 +1,13 @@
1
+ import { AuthenticationCreds } from '../Types';
2
+ declare const makeCacheManagerAuthState: (store: Storage, sessionKey: string) => Promise<{
3
+ clearState: () => Promise<void>;
4
+ saveCreds: () => Promise<void>;
5
+ state: {
6
+ creds: AuthenticationCreds;
7
+ keys: {
8
+ get: (type: string, ids: string[]) => Promise<{}>;
9
+ set: (data: any) => Promise<void>;
10
+ };
11
+ };
12
+ }>;
13
+ export default makeCacheManagerAuthState;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const cache_manager_1 = require("cache-manager");
7
+ const WAProto_1 = require("../../WAProto");
8
+ const Utils_1 = require("../Utils");
9
+ const logger_1 = __importDefault(require("../Utils/logger"));
10
+ const makeCacheManagerAuthState = async (store, sessionKey) => {
11
+ const defaultKey = (file) => `${sessionKey}:${file}`;
12
+ const databaseConn = await (0, cache_manager_1.caching)(store);
13
+ const writeData = async (file, data) => {
14
+ let ttl = undefined;
15
+ if (file === 'creds') {
16
+ ttl = 63115200; // 2 years
17
+ }
18
+ await databaseConn.set(defaultKey(file), JSON.stringify(data, Utils_1.BufferJSON.replacer), ttl);
19
+ };
20
+ const readData = async (file) => {
21
+ try {
22
+ const data = await databaseConn.get(defaultKey(file));
23
+ if (data) {
24
+ return JSON.parse(data, Utils_1.BufferJSON.reviver);
25
+ }
26
+ return null;
27
+ }
28
+ catch (error) {
29
+ logger_1.default.error(error);
30
+ return null;
31
+ }
32
+ };
33
+ const removeData = async (file) => {
34
+ try {
35
+ return await databaseConn.del(defaultKey(file));
36
+ }
37
+ catch (_a) {
38
+ logger_1.default.error(`Error removing ${file} from session ${sessionKey}`);
39
+ }
40
+ };
41
+ const clearState = async () => {
42
+ try {
43
+ const result = await databaseConn.store.keys(`${sessionKey}*`);
44
+ await Promise.all(result.map(async (key) => await databaseConn.del(key)));
45
+ }
46
+ catch (err) {
47
+ }
48
+ };
49
+ const creds = (await readData('creds')) || (0, Utils_1.initAuthCreds)();
50
+ return {
51
+ clearState,
52
+ saveCreds: () => writeData('creds', creds),
53
+ state: {
54
+ creds,
55
+ keys: {
56
+ get: async (type, ids) => {
57
+ const data = {};
58
+ await Promise.all(ids.map(async (id) => {
59
+ let value = await readData(`${type}-${id}`);
60
+ if (type === 'app-state-sync-key' && value) {
61
+ value = WAProto_1.proto.Message.AppStateSyncKeyData.fromObject(value);
62
+ }
63
+ data[id] = value;
64
+ }));
65
+ return data;
66
+ },
67
+ set: async (data) => {
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
+ const tasks = [];
70
+ for (const category in data) {
71
+ for (const id in data[category]) {
72
+ const value = data[category][id];
73
+ const key = `${category}-${id}`;
74
+ tasks.push(value ? writeData(key, value) : removeData(key));
75
+ }
76
+ }
77
+ await Promise.all(tasks);
78
+ },
79
+ }
80
+ }
81
+ };
82
+ };
83
+ exports.default = makeCacheManagerAuthState;