@cexy/hoonfca 1.0.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +3 -0
  2. package/examples/login-with-cookies.js +102 -0
  3. package/examples/verify.js +70 -0
  4. package/index.js +2 -8
  5. package/package.json +82 -61
  6. package/src/{api/action → apis}/addExternalModule.js +24 -25
  7. package/src/apis/addUserToGroup.js +108 -0
  8. package/src/apis/changeAdminStatus.js +148 -0
  9. package/src/apis/changeArchivedStatus.js +61 -0
  10. package/src/apis/changeAvatar.js +103 -0
  11. package/src/apis/changeBio.js +69 -0
  12. package/src/apis/changeBlockedStatus.js +54 -0
  13. package/src/apis/changeGroupImage.js +136 -0
  14. package/src/apis/changeThreadColor.js +116 -0
  15. package/src/apis/changeThreadEmoji.js +53 -0
  16. package/src/apis/comment.js +207 -0
  17. package/src/apis/createAITheme.js +129 -0
  18. package/src/apis/createNewGroup.js +79 -0
  19. package/src/apis/createPoll.js +73 -0
  20. package/src/apis/deleteMessage.js +44 -0
  21. package/src/apis/deleteThread.js +52 -0
  22. package/src/apis/e2ee.js +17 -0
  23. package/src/apis/editMessage.js +70 -0
  24. package/src/apis/emoji.js +124 -0
  25. package/src/apis/fetchThemeData.js +82 -0
  26. package/src/apis/follow.js +81 -0
  27. package/src/apis/forwardMessage.js +52 -0
  28. package/src/apis/friend.js +243 -0
  29. package/src/apis/gcmember.js +122 -0
  30. package/src/apis/gcname.js +123 -0
  31. package/src/apis/gcrule.js +119 -0
  32. package/src/apis/getAccess.js +111 -0
  33. package/src/apis/getBotInfo.js +88 -0
  34. package/src/apis/getBotInitialData.js +43 -0
  35. package/src/apis/getFriendsList.js +79 -0
  36. package/src/apis/getMessage.js +423 -0
  37. package/src/apis/getTheme.js +95 -0
  38. package/src/apis/getThemeInfo.js +116 -0
  39. package/src/apis/getThreadHistory.js +239 -0
  40. package/src/apis/getThreadInfo.js +267 -0
  41. package/src/apis/getThreadList.js +232 -0
  42. package/src/apis/getThreadPictures.js +58 -0
  43. package/src/apis/getUserID.js +117 -0
  44. package/src/apis/getUserInfo.js +513 -0
  45. package/src/{api/users → apis}/getUserInfoV2.js +146 -134
  46. package/src/apis/handleMessageRequest.js +50 -0
  47. package/src/apis/httpGet.js +63 -0
  48. package/src/apis/httpPost.js +89 -0
  49. package/src/apis/httpPostFormData.js +69 -0
  50. package/src/apis/listenMqtt.js +1236 -0
  51. package/src/apis/listenSpeed.js +179 -0
  52. package/src/apis/logout.js +87 -0
  53. package/src/apis/markAsDelivered.js +47 -0
  54. package/src/{api/messaging → apis}/markAsRead.js +99 -88
  55. package/src/apis/markAsReadAll.js +40 -0
  56. package/src/apis/markAsSeen.js +70 -0
  57. package/src/apis/mqttDeltaValue.js +278 -0
  58. package/src/apis/muteThread.js +45 -0
  59. package/src/apis/nickname.js +132 -0
  60. package/src/apis/notes.js +163 -0
  61. package/src/apis/pinMessage.js +150 -0
  62. package/src/apis/produceMetaTheme.js +180 -0
  63. package/src/apis/realtime.js +182 -0
  64. package/src/apis/removeUserFromGroup.js +117 -0
  65. package/src/apis/resolvePhotoUrl.js +58 -0
  66. package/src/apis/searchForThread.js +154 -0
  67. package/src/apis/sendMessage.js +354 -0
  68. package/src/apis/sendMessageMqtt.js +249 -0
  69. package/src/apis/sendTypingIndicator.js +91 -0
  70. package/src/apis/setMessageReaction.js +27 -0
  71. package/src/apis/setMessageReactionMqtt.js +61 -0
  72. package/src/apis/setThreadTheme.js +260 -0
  73. package/src/apis/setThreadThemeMqtt.js +94 -0
  74. package/src/apis/share.js +107 -0
  75. package/src/apis/shareContact.js +66 -0
  76. package/src/apis/stickers.js +257 -0
  77. package/src/apis/story.js +181 -0
  78. package/src/apis/theme.js +233 -0
  79. package/src/apis/unfriend.js +47 -0
  80. package/src/apis/unsendMessage.js +17 -0
  81. package/src/engine/client.js +92 -0
  82. package/src/engine/models/buildAPI.js +152 -0
  83. package/src/engine/models/loginHelper.js +519 -0
  84. package/src/engine/models/setOptions.js +88 -0
  85. package/src/security/e2ee.js +109 -0
  86. package/src/types/index.d.ts +498 -0
  87. package/src/utils/antiSuspension.js +506 -0
  88. package/src/utils/auth-helpers.js +149 -0
  89. package/src/utils/autoReLogin.js +336 -0
  90. package/src/utils/axios.js +436 -0
  91. package/src/utils/cache.js +54 -0
  92. package/src/utils/clients.js +282 -0
  93. package/src/utils/constants.js +410 -23
  94. package/src/utils/formatters/data/formatAttachment.js +370 -0
  95. package/src/utils/formatters/data/formatDelta.js +109 -0
  96. package/src/utils/formatters/index.js +159 -0
  97. package/src/utils/formatters/value/formatCookie.js +91 -0
  98. package/src/utils/formatters/value/formatDate.js +36 -0
  99. package/src/utils/formatters/value/formatID.js +16 -0
  100. package/src/utils/formatters.js +1373 -0
  101. package/src/utils/headers.js +214 -99
  102. package/src/utils/index.js +153 -0
  103. package/src/utils/monitoring.js +333 -0
  104. package/src/utils/rateLimiter.js +319 -0
  105. package/src/utils/tokenRefresh.js +657 -0
  106. package/src/utils/user-agents.js +238 -0
  107. package/src/utils/validation.js +157 -0
  108. package/CHANGELOG.md +0 -181
  109. package/DOCS.md +0 -2636
  110. package/LICENSE-MIT +0 -21
  111. package/README.md +0 -632
  112. package/func/checkUpdate.js +0 -233
  113. package/func/logger.js +0 -48
  114. package/index.d.ts +0 -746
  115. package/module/config.js +0 -67
  116. package/module/login.js +0 -154
  117. package/module/loginHelper.js +0 -1034
  118. package/module/options.js +0 -54
  119. package/src/api/action/changeAvatar.js +0 -137
  120. package/src/api/action/changeBio.js +0 -75
  121. package/src/api/action/enableAutoSaveAppState.js +0 -73
  122. package/src/api/action/getCurrentUserID.js +0 -7
  123. package/src/api/action/handleFriendRequest.js +0 -57
  124. package/src/api/action/logout.js +0 -76
  125. package/src/api/action/refreshFb_dtsg.js +0 -48
  126. package/src/api/action/setPostReaction.js +0 -106
  127. package/src/api/action/unfriend.js +0 -54
  128. package/src/api/http/httpGet.js +0 -46
  129. package/src/api/http/httpPost.js +0 -52
  130. package/src/api/http/postFormData.js +0 -47
  131. package/src/api/messaging/addUserToGroup.js +0 -68
  132. package/src/api/messaging/changeAdminStatus.js +0 -122
  133. package/src/api/messaging/changeArchivedStatus.js +0 -55
  134. package/src/api/messaging/changeBlockedStatus.js +0 -48
  135. package/src/api/messaging/changeGroupImage.js +0 -90
  136. package/src/api/messaging/changeNickname.js +0 -70
  137. package/src/api/messaging/changeThreadColor.js +0 -79
  138. package/src/api/messaging/changeThreadEmoji.js +0 -106
  139. package/src/api/messaging/createNewGroup.js +0 -88
  140. package/src/api/messaging/createPoll.js +0 -43
  141. package/src/api/messaging/createThemeAI.js +0 -98
  142. package/src/api/messaging/deleteMessage.js +0 -56
  143. package/src/api/messaging/deleteThread.js +0 -56
  144. package/src/api/messaging/editMessage.js +0 -68
  145. package/src/api/messaging/forwardAttachment.js +0 -51
  146. package/src/api/messaging/getEmojiUrl.js +0 -29
  147. package/src/api/messaging/getFriendsList.js +0 -82
  148. package/src/api/messaging/getMessage.js +0 -829
  149. package/src/api/messaging/getThemePictures.js +0 -62
  150. package/src/api/messaging/handleMessageRequest.js +0 -65
  151. package/src/api/messaging/markAsDelivered.js +0 -57
  152. package/src/api/messaging/markAsReadAll.js +0 -49
  153. package/src/api/messaging/markAsSeen.js +0 -61
  154. package/src/api/messaging/muteThread.js +0 -50
  155. package/src/api/messaging/removeUserFromGroup.js +0 -106
  156. package/src/api/messaging/resolvePhotoUrl.js +0 -43
  157. package/src/api/messaging/scheduler.js +0 -264
  158. package/src/api/messaging/searchForThread.js +0 -52
  159. package/src/api/messaging/sendMessage.js +0 -272
  160. package/src/api/messaging/sendTypingIndicator.js +0 -67
  161. package/src/api/messaging/setMessageReaction.js +0 -76
  162. package/src/api/messaging/setTitle.js +0 -119
  163. package/src/api/messaging/shareContact.js +0 -49
  164. package/src/api/messaging/threadColors.js +0 -128
  165. package/src/api/messaging/unsendMessage.js +0 -81
  166. package/src/api/messaging/uploadAttachment.js +0 -94
  167. package/src/api/socket/core/connectMqtt.js +0 -255
  168. package/src/api/socket/core/emitAuth.js +0 -106
  169. package/src/api/socket/core/getSeqID.js +0 -40
  170. package/src/api/socket/core/getTaskResponseData.js +0 -22
  171. package/src/api/socket/core/markDelivery.js +0 -12
  172. package/src/api/socket/core/parseDelta.js +0 -391
  173. package/src/api/socket/detail/buildStream.js +0 -208
  174. package/src/api/socket/detail/constants.js +0 -24
  175. package/src/api/socket/listenMqtt.js +0 -364
  176. package/src/api/socket/middleware/index.js +0 -216
  177. package/src/api/threads/getThreadHistory.js +0 -664
  178. package/src/api/threads/getThreadInfo.js +0 -438
  179. package/src/api/threads/getThreadList.js +0 -293
  180. package/src/api/threads/getThreadPictures.js +0 -78
  181. package/src/api/users/getUserID.js +0 -65
  182. package/src/api/users/getUserInfo.js +0 -327
  183. package/src/core/sendReqMqtt.js +0 -96
  184. package/src/database/models/index.js +0 -87
  185. package/src/database/models/thread.js +0 -45
  186. package/src/database/models/user.js +0 -46
  187. package/src/database/threadData.js +0 -98
  188. package/src/database/userData.js +0 -89
  189. package/src/utils/client.js +0 -320
  190. package/src/utils/format.js +0 -1115
  191. package/src/utils/request.js +0 -305
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ const { getRandom } = require("./constants");
3
+
4
+ const BROWSER_DATA = {
5
+ windows: {
6
+ platform: "Windows NT 10.0; Win64; x64",
7
+ chromeVersions: ["139.0.0.0", "131.0.6778.86", "130.0.6723.92", "129.0.6668.101", "128.0.6613.120", "127.0.6533.120"],
8
+ edgeVersions: ["139.0.0.0", "131.0.2903.51", "130.0.2849.68", "129.0.2792.89"],
9
+ platformVersion: '"15.0.0"'
10
+ },
11
+ mac: {
12
+ platform: "Macintosh; Intel Mac OS X 10_15_7",
13
+ chromeVersions: ["139.0.0.0", "131.0.6778.86", "130.0.6723.92", "129.0.6668.101", "128.0.6613.120", "127.0.6533.120"],
14
+ edgeVersions: ["139.0.0.0", "131.0.2903.51", "130.0.2849.68", "129.0.2792.89"],
15
+ platformVersion: '"14.7.0"'
16
+ },
17
+ linux: {
18
+ platform: "X11; Linux x86_64",
19
+ chromeVersions: ["139.0.0.0", "131.0.6778.86", "130.0.6723.92", "129.0.6668.101", "128.0.6613.120"],
20
+ edgeVersions: ["139.0.0.0", "131.0.2903.51", "130.0.2849.68"],
21
+ platformVersion: '""'
22
+ }
23
+ };
24
+
25
+ const defaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36";
26
+
27
+ /**
28
+ * Generates a realistic, randomized User-Agent string and related Sec-CH headers.
29
+ * Supports Chrome and Edge browsers across Windows, macOS, and Linux.
30
+ * @returns {{userAgent: string, secChUa: string, secChUaFullVersionList: string, secChUaPlatform: string, secChUaPlatformVersion: string, browser: string}}
31
+ */
32
+ function randomUserAgent() {
33
+ const os = getRandom(Object.keys(BROWSER_DATA));
34
+ const data = BROWSER_DATA[os];
35
+
36
+ const useEdge = Math.random() > 0.7 && data.edgeVersions;
37
+ const versions = useEdge ? data.edgeVersions : data.chromeVersions;
38
+ const version = getRandom(versions);
39
+ const majorVersion = version.split('.')[0];
40
+ const browserName = useEdge ? 'Microsoft Edge' : 'Google Chrome';
41
+ const browserIdentifier = useEdge ? 'Edg' : 'Chrome';
42
+
43
+ const userAgent = useEdge
44
+ ? `Mozilla/5.0 (${data.platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version} Safari/537.36 Edg/${version}`
45
+ : `Mozilla/5.0 (${data.platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version} Safari/537.36`;
46
+
47
+ const greeseValue = Math.random() > 0.5 ? '99' : '8';
48
+ const brands = useEdge ? [
49
+ `"Chromium";v="${majorVersion}"`,
50
+ `"Not(A:Brand";v="${greeseValue}"`,
51
+ `"${browserName}";v="${majorVersion}"`
52
+ ] : [
53
+ `"${browserName}";v="${majorVersion}"`,
54
+ `"Not;A=Brand";v="${greeseValue}"`,
55
+ `"Chromium";v="${majorVersion}"`
56
+ ];
57
+
58
+ const secChUa = brands.join(', ');
59
+ const secChUaFullVersionList = brands.map(b => {
60
+ const match = b.match(/v="(\d+)"/);
61
+ if (match && match[1] === majorVersion) {
62
+ return b.replace(`v="${majorVersion}"`, `v="${version}"`);
63
+ }
64
+ return b;
65
+ }).join(', ');
66
+
67
+ const platformName = os === 'windows' ? 'Windows' : os === 'mac' ? 'macOS' : 'Linux';
68
+
69
+ return {
70
+ userAgent,
71
+ secChUa,
72
+ secChUaFullVersionList,
73
+ secChUaPlatform: `"${platformName}"`,
74
+ secChUaPlatformVersion: data.platformVersion,
75
+ browser: browserName
76
+ };
77
+ }
78
+
79
+ function randomInt(min, max) {
80
+ return Math.floor(Math.random() * (max - min + 1)) + min;
81
+ }
82
+
83
+ function randomChoice(arr) {
84
+ return arr[Math.floor(Math.random() * arr.length)];
85
+ }
86
+
87
+ function randomBuildId() {
88
+ const prefixes = ["QP1A", "RP1A", "SP1A", "TP1A", "UP1A", "AP4A"];
89
+ return `${randomChoice(prefixes)}.${randomInt(180000, 250000)}.${randomInt(10, 99)}`;
90
+ }
91
+
92
+ function randomResolution() {
93
+ const presets = [
94
+ { width: 720, height: 1280, density: 2.0 },
95
+ { width: 1080, height: 1920, density: 2.625 },
96
+ { width: 1080, height: 2400, density: 3.0 },
97
+ { width: 1440, height: 3040, density: 3.5 },
98
+ { width: 1440, height: 3200, density: 4.0 }
99
+ ];
100
+ return randomChoice(presets);
101
+ }
102
+
103
+ function randomFbav() {
104
+ return `${randomInt(390, 499)}.${randomInt(0, 3)}.${randomInt(0, 2)}.${randomInt(10, 60)}.${randomInt(100, 999)}`;
105
+ }
106
+
107
+ function randomOrcaUA() {
108
+ const androidVersions = ["8.1.0", "9", "10", "11", "12", "13", "14"];
109
+ const devices = [
110
+ { brand: "samsung", model: "SM-G996B" },
111
+ { brand: "samsung", model: "SM-S908E" },
112
+ { brand: "Xiaomi", model: "M2101K9AG" },
113
+ { brand: "OPPO", model: "CPH2219" },
114
+ { brand: "vivo", model: "V2109" },
115
+ { brand: "HUAWEI", model: "VOG-L29" },
116
+ { brand: "asus", model: "ASUS_I001DA" },
117
+ { brand: "Google", model: "Pixel 6" },
118
+ { brand: "realme", model: "RMX2170" }
119
+ ];
120
+ const carriers = [
121
+ "Viettel Telecom", "Mobifone", "Vinaphone",
122
+ "T-Mobile", "Verizon", "AT&T",
123
+ "Telkomsel", "Jio", "NTT DOCOMO",
124
+ "Vodafone", "Orange"
125
+ ];
126
+ const locales = [
127
+ "vi_VN", "en_US", "en_GB", "id_ID",
128
+ "th_TH", "fr_FR", "de_DE", "es_ES", "pt_BR"
129
+ ];
130
+ const archs = ["arm64-v8a", "armeabi-v7a"];
131
+
132
+ const androidVersion = randomChoice(androidVersions);
133
+ const device = randomChoice(devices);
134
+ const buildId = randomBuildId();
135
+ const resolution = randomResolution();
136
+ const fbav = randomFbav();
137
+ const fbbv = randomInt(320000000, 520000000);
138
+ const arch = `${randomChoice(archs)}:${randomChoice(archs)}`;
139
+ const selectedLocale = randomChoice(locales);
140
+ const selectedCarrier = randomChoice(carriers);
141
+
142
+ const userAgent = `Dalvik/2.1.0 (Linux; U; Android ${androidVersion}; ${device.model} Build/${buildId}) ` +
143
+ `[FBAN/Orca-Android;FBAV/${fbav};FBPN/com.facebook.orca;` +
144
+ `FBLC/${selectedLocale};FBBV/${fbbv};FBCR/${selectedCarrier};` +
145
+ `FBMF/${device.brand};FBBD/${device.brand};FBDV/${device.model};` +
146
+ `FBSV/${androidVersion};FBCA/${arch};` +
147
+ `FBDM/{density=${resolution.density.toFixed(1)},width=${resolution.width},height=${resolution.height}};` +
148
+ `FB_FW/1;]`;
149
+
150
+ return {
151
+ userAgent,
152
+ androidVersion,
153
+ device,
154
+ buildId,
155
+ resolution,
156
+ fbav,
157
+ fbbv,
158
+ locale: selectedLocale,
159
+ carrier: selectedCarrier
160
+ };
161
+ }
162
+
163
+ function generateUserAgentByPersona(persona = 'desktop', options = {}) {
164
+ if (persona === 'android' || persona === 'mobile') {
165
+ if (options.cachedAndroidUA && options.cachedAndroidDevice) {
166
+ return {
167
+ userAgent: options.cachedAndroidUA,
168
+ androidVersion: options.cachedAndroidVersion,
169
+ device: options.cachedAndroidDevice,
170
+ buildId: options.cachedAndroidBuildId,
171
+ resolution: options.cachedAndroidResolution,
172
+ fbav: options.cachedAndroidFbav,
173
+ fbbv: options.cachedAndroidFbbv,
174
+ locale: options.cachedAndroidLocale,
175
+ carrier: options.cachedAndroidCarrier,
176
+ persona: 'android'
177
+ };
178
+ }
179
+
180
+ const androidData = randomOrcaUA();
181
+ return {
182
+ ...androidData,
183
+ persona: 'android'
184
+ };
185
+ }
186
+
187
+ if (options.cachedUserAgent && options.cachedSecChUa) {
188
+ return {
189
+ userAgent: options.cachedUserAgent,
190
+ secChUa: options.cachedSecChUa,
191
+ secChUaFullVersionList: options.cachedSecChUaFullVersionList,
192
+ secChUaPlatform: options.cachedSecChUaPlatform,
193
+ secChUaPlatformVersion: options.cachedSecChUaPlatformVersion,
194
+ browser: options.cachedBrowser || 'Google Chrome',
195
+ persona: 'desktop'
196
+ };
197
+ }
198
+
199
+ const desktopData = randomUserAgent();
200
+ return {
201
+ ...desktopData,
202
+ persona: 'desktop'
203
+ };
204
+ }
205
+
206
+ function cachePersonaData(options, personaData) {
207
+ if (personaData.persona === 'android') {
208
+ options.cachedAndroidUA = personaData.userAgent;
209
+ options.cachedAndroidVersion = personaData.androidVersion;
210
+ options.cachedAndroidDevice = personaData.device;
211
+ options.cachedAndroidBuildId = personaData.buildId;
212
+ options.cachedAndroidResolution = personaData.resolution;
213
+ options.cachedAndroidFbav = personaData.fbav;
214
+ options.cachedAndroidFbbv = personaData.fbbv;
215
+ options.cachedAndroidLocale = personaData.locale;
216
+ options.cachedAndroidCarrier = personaData.carrier;
217
+ } else {
218
+ options.cachedUserAgent = personaData.userAgent;
219
+ options.cachedSecChUa = personaData.secChUa;
220
+ options.cachedSecChUaFullVersionList = personaData.secChUaFullVersionList;
221
+ options.cachedSecChUaPlatform = personaData.secChUaPlatform;
222
+ options.cachedSecChUaPlatformVersion = personaData.secChUaPlatformVersion;
223
+ options.cachedBrowser = personaData.browser;
224
+ }
225
+ return options;
226
+ }
227
+
228
+ module.exports = {
229
+ defaultUserAgent,
230
+ windowsUserAgent: defaultUserAgent,
231
+ randomUserAgent,
232
+ randomBuildId,
233
+ randomResolution,
234
+ randomFbav,
235
+ randomOrcaUA,
236
+ generateUserAgentByPersona,
237
+ cachePersonaData,
238
+ };
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Input validation and sanitization utilities
5
+ */
6
+
7
+ class InputValidator {
8
+ constructor() {
9
+ this.maxMessageLength = 10000;
10
+ this.maxThreadNameLength = 255;
11
+ this.maxNicknameLength = 50;
12
+ }
13
+
14
+ /**
15
+ * Validate thread ID
16
+ * @param {string|number} threadID
17
+ * @returns {boolean}
18
+ */
19
+ isValidThreadID(threadID) {
20
+ if (!threadID) return false;
21
+ const id = String(threadID).trim();
22
+ // Thread IDs are numeric, can be up to 20 digits
23
+ return /^\d{1,20}$/.test(id);
24
+ }
25
+
26
+ /**
27
+ * Validate user ID
28
+ * @param {string|number} userID
29
+ * @returns {boolean}
30
+ */
31
+ isValidUserID(userID) {
32
+ return this.isValidThreadID(userID); // Same format
33
+ }
34
+
35
+ /**
36
+ * Validate message content
37
+ * @param {string|object} message
38
+ * @returns {boolean}
39
+ */
40
+ isValidMessage(message) {
41
+ if (typeof message === 'string') {
42
+ return message.length > 0 && message.length <= this.maxMessageLength;
43
+ }
44
+ if (typeof message === 'object' && message !== null) {
45
+ return message.body || message.sticker || message.attachment || message.emoji;
46
+ }
47
+ return false;
48
+ }
49
+
50
+ /**
51
+ * Sanitize message content
52
+ * @param {string} message
53
+ * @returns {string}
54
+ */
55
+ sanitizeMessage(message) {
56
+ if (typeof message !== 'string') return message;
57
+ // Remove null bytes and control characters
58
+ return message.replace(/[\x00-\x1F\x7F]/g, '').trim();
59
+ }
60
+
61
+ /**
62
+ * Validate and sanitize thread name
63
+ * @param {string} name
64
+ * @returns {string|null}
65
+ */
66
+ sanitizeThreadName(name) {
67
+ if (typeof name !== 'string') return null;
68
+ const sanitized = name.trim();
69
+ return sanitized.length > 0 && sanitized.length <= this.maxThreadNameLength ? sanitized : null;
70
+ }
71
+
72
+ /**
73
+ * Validate and sanitize nickname
74
+ * @param {string} nickname
75
+ * @returns {string|null}
76
+ */
77
+ sanitizeNickname(nickname) {
78
+ if (typeof nickname !== 'string') return null;
79
+ const sanitized = nickname.trim();
80
+ return sanitized.length > 0 && sanitized.length <= this.maxNicknameLength ? sanitized : null;
81
+ }
82
+
83
+ /**
84
+ * Validate array of IDs
85
+ * @param {Array} ids
86
+ * @param {function} validator
87
+ * @returns {boolean}
88
+ */
89
+ validateIDArray(ids, validator = this.isValidThreadID.bind(this)) {
90
+ if (!Array.isArray(ids)) return false;
91
+ return ids.length > 0 && ids.length <= 100 && ids.every(validator);
92
+ }
93
+
94
+ /**
95
+ * Validate email
96
+ * @param {string} email
97
+ * @returns {boolean}
98
+ */
99
+ isValidEmail(email) {
100
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
101
+ return emailRegex.test(email);
102
+ }
103
+
104
+ /**
105
+ * Validate URL
106
+ * @param {string} url
107
+ * @returns {boolean}
108
+ */
109
+ isValidUrl(url) {
110
+ try {
111
+ new URL(url);
112
+ return true;
113
+ } catch {
114
+ return false;
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Validate file path (basic check)
120
+ * @param {string} path
121
+ * @returns {boolean}
122
+ */
123
+ isValidFilePath(path) {
124
+ if (typeof path !== 'string') return false;
125
+ // Basic check - no null bytes, reasonable length
126
+ return path.length > 0 && path.length <= 255 && !path.includes('\x00');
127
+ }
128
+
129
+ /**
130
+ * Validate emoji
131
+ * @param {string} emoji
132
+ * @returns {boolean}
133
+ */
134
+ isValidEmoji(emoji) {
135
+ if (typeof emoji !== 'string') return false;
136
+ // Check if it's an emoji (basic check)
137
+ return /\p{Emoji}/u.test(emoji) || emoji.length === 1;
138
+ }
139
+ }
140
+
141
+ const globalValidator = new InputValidator();
142
+
143
+ module.exports = {
144
+ InputValidator,
145
+ globalValidator,
146
+ validateThreadID: (id) => globalValidator.isValidThreadID(id),
147
+ validateUserID: (id) => globalValidator.isValidUserID(id),
148
+ validateMessage: (msg) => globalValidator.isValidMessage(msg),
149
+ sanitizeMessage: (msg) => globalValidator.sanitizeMessage(msg),
150
+ sanitizeThreadName: (name) => globalValidator.sanitizeThreadName(name),
151
+ sanitizeNickname: (nick) => globalValidator.sanitizeNickname(nick),
152
+ validateIDArray: (ids, validator) => globalValidator.validateIDArray(ids, validator),
153
+ isValidEmail: (email) => globalValidator.isValidEmail(email),
154
+ isValidUrl: (url) => globalValidator.isValidUrl(url),
155
+ isValidFilePath: (path) => globalValidator.isValidFilePath(path),
156
+ isValidEmoji: (emoji) => globalValidator.isValidEmoji(emoji)
157
+ };
package/CHANGELOG.md DELETED
@@ -1,181 +0,0 @@
1
- # Changelog
2
- Too lazy to write changelog, sorry! (will write changelog in the next release, through.)
3
- ## v1.0.10 - 2025-04-24
4
- - Hotfix / auto bump
5
-
6
- ## v1.0.11 - 2025-04-24
7
- - Hotfix / auto bump
8
-
9
- ## v1.0.12 - 2025-04-28
10
- - Hotfix / auto bump
11
-
12
- ## v1.0.13 - 2025-04-28
13
- - Hotfix / auto bump
14
-
15
- ## v1.0.14 - 2025-04-28
16
- - Hotfix / auto bump
17
-
18
- ## v1.0.15 - 2025-05-03
19
- - Hotfix / auto bump
20
-
21
- ## v1.0.16 - 2025-05-07
22
- - Hotfix / auto bump
23
-
24
- ## v1.0.17 - 2025-05-07
25
- - Hotfix / auto bump
26
-
27
- ## v1.0.18 - 2025-05-22
28
- - Hotfix / auto bump
29
-
30
- ## v1.0.19 - 2025-05-23
31
- - Hotfix / auto bump
32
-
33
- ## v2.0.0 - 2025-10-05
34
- - Hotfix / auto bump
35
-
36
- ## v2.0.1 - 2025-10-05
37
- - Hotfix / auto bump
38
-
39
- ## v2.0.2 - 2025-10-05
40
- - Hotfix / auto bump
41
-
42
- ## v2.0.3 - 2025-10-05
43
- - Hotfix / auto bump
44
-
45
- ## v2.0.4 - 2025-10-05
46
- - Hotfix / auto bump
47
-
48
- ## v2.0.5 - 2025-10-06
49
- - Now you can turn on/off autoLogin in config file.
50
- - Added autoUpdate feature.
51
- ## v2.0.6-beta - 2025-10-06
52
- - Hotfix / auto bump
53
-
54
- ## v2.0.7 - 2025-10-06
55
- - Hotfix / auto bump
56
-
57
- ## v2.0.8 - 2025-10-07
58
- - Hotfix / auto bump
59
-
60
- ## v2.0.9 - 2025-10-07
61
- - Hotfix / auto bump
62
-
63
- ## v2.0.9 - 2025-10-07
64
- - Hotfix / auto bump
65
-
66
- ## v2.0.10 - 2025-10-07
67
- - Hotfix / auto bump
68
-
69
- ## v2.0.10 - 2025-10-07
70
- - Hotfix / auto bump
71
-
72
- ## v2.0.11 - 2025-10-07
73
- - Hotfix / auto bump
74
-
75
- ## v2.0.12 - 2025-10-07
76
- - Hotfix / auto bump
77
-
78
- ## v2.0.13 - 2025-10-07
79
- - Hotfix / auto bump
80
-
81
- ## v2.0.14 - 2025-10-07
82
- - Hotfix / auto bump
83
-
84
- ## v2.0.15 - 2025-10-07
85
- - Hotfix / auto bump
86
-
87
- ## v2.0.16 - 2025-10-07
88
- - Hotfix / auto bump
89
-
90
- ## v2.0.17 - 2025-10-07
91
- - Hotfix / auto bump
92
-
93
- ## v2.0.18 - 2025-10-07
94
- - Hotfix / auto bump
95
-
96
- ## v2.0.19 - 2025-10-07
97
- - Hotfix / auto bump
98
-
99
- ## v2.0.20 - 2025-10-08
100
- - Hotfix / auto bump
101
-
102
- ## v2.0.21 - 2025-10-08
103
- - Hotfix / auto bump
104
-
105
- ## v2.0.22 - 2025-10-09
106
- - Hotfix / auto bump
107
-
108
- ## v2.0.23 - 2025-10-11
109
- - Hotfix / auto bump
110
-
111
- ## v2.0.24 - 2025-10-11
112
- - Hotfix / auto bump
113
-
114
- ## v2.0.25 - 2025-10-12
115
- - Hotfix / auto bump
116
-
117
- ## v2.0.26 - 2025-10-16
118
- - Hotfix / auto bump
119
-
120
- ## v2.0.27 - 2025-10-18
121
- - Hotfix / auto bump
122
-
123
- ## v2.0.28 - 2025-10-18
124
- - Hotfix / auto bump
125
-
126
- ## v2.0.29 - 2025-10-19
127
- - Hotfix / auto bump
128
-
129
- ## v2.0.30 - 2025-10-19
130
- - Hotfix / auto bump
131
-
132
- ## v2.0.31 - 2025-10-27
133
- - Hotfix / auto bump
134
-
135
- ## v2.0.32 - 2025-10-30
136
- - Hotfix / auto bump
137
-
138
- ## v3.0.2 - 2025-11-27
139
- - Hotfix / auto bump
140
-
141
- ## v3.0.3 - 2025-11-27
142
- - Hotfix / auto bump
143
-
144
- ## v3.0.4 - 2025-11-27
145
- - Hotfix / auto bump
146
-
147
- ## v3.0.5 - 2025-11-27
148
- - Hotfix / auto bump
149
-
150
- ## v3.0.6 - 2025-11-27
151
- - Hotfix / auto bump
152
-
153
- ## v3.0.7 - 2025-11-27
154
- - Hotfix / auto bump
155
-
156
- ## v3.0.8 - 2025-11-27
157
- - Hotfix / auto bump
158
-
159
- ## v3.0.9 - 2025-12-05
160
- - Hotfix / auto bump
161
-
162
- ## v3.0.10 - 2025-12-05
163
- - Hotfix / auto bump
164
-
165
- ## v3.0.11 - 2025-12-05
166
- - Hotfix / auto bump
167
-
168
- ## v3.0.12 - 2025-12-05
169
- - Hotfix / auto bump
170
-
171
- ## v3.0.15 - 2025-12-12
172
- - Hotfix / auto bump
173
-
174
- ## v3.0.17 - 2025-12-16
175
- - Hotfix / auto bump
176
-
177
- ## v3.0.19 - 2025-12-31
178
- - Hotfix / auto bump
179
-
180
- ## v3.0.20 - 2025-12-31
181
- - Hotfix / auto bump