shadowx-fca 8.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.
- package/README.md +1066 -0
- package/build/messagix.dll +0 -0
- package/build/messagix.so +0 -0
- package/checkUpdate.js +393 -0
- package/config.json +17 -0
- package/e2ee.js +563 -0
- package/e2eetest.js +356 -0
- package/index.js +611 -0
- package/lib/index.mjs +1412 -0
- package/logger.js +500 -0
- package/package.json +65 -0
- package/src/GetBotInfo.js +66 -0
- package/src/OldMessage.js +182 -0
- package/src/Screenshot.js +83 -0
- package/src/addExternalModule.js +13 -0
- package/src/addUserToGroup.js +33 -0
- package/src/approveGroupJoinRequests.js +18 -0
- package/src/changeAdminStatus.js +16 -0
- package/src/changeArchivedStatus.js +17 -0
- package/src/changeAvatar.js +136 -0
- package/src/changeAvatarV2.js +86 -0
- package/src/changeAvt.js +85 -0
- package/src/changeBio.js +76 -0
- package/src/changeBlockedStatus.js +20 -0
- package/src/changeBlockedStatusMqtt.js +80 -0
- package/src/changeCover.js +72 -0
- package/src/changeGroupImage.js +16 -0
- package/src/changeName.js +79 -0
- package/src/changeNickname.js +16 -0
- package/src/changeThreadColor.js +15 -0
- package/src/changeThreadEmoji.js +15 -0
- package/src/changeThreadMemberNickname.js +6 -0
- package/src/changeUsername.js +59 -0
- package/src/createCommentPost.js +230 -0
- package/src/createNewGroup.js +38 -0
- package/src/createNote.js +35 -0
- package/src/createPoll.js +27 -0
- package/src/createPost.js +276 -0
- package/src/createThemeAI.js +129 -0
- package/src/data/cache/system/data.json +4 -0
- package/src/data/cache/system/datahandle.js +21 -0
- package/src/data/getThreadInfo.json +1 -0
- package/src/deleteComment.js +23 -0
- package/src/deleteMessage.js +15 -0
- package/src/deleteThread.js +15 -0
- package/src/denyGroupJoinRequests.js +18 -0
- package/src/e2ee/crypto.js +173 -0
- package/src/e2ee/index.js +144 -0
- package/src/e2ee/proto/ArmadilloApplication.proto +281 -0
- package/src/e2ee/proto/ArmadilloICDC.proto +14 -0
- package/src/e2ee/proto/ConsumerApplication.proto +232 -0
- package/src/e2ee/proto/MessageApplication.proto +82 -0
- package/src/e2ee/proto/MessageTransport.proto +77 -0
- package/src/e2ee/proto/WACommon.proto +66 -0
- package/src/e2ee/proto/WAMediaTransport.proto +176 -0
- package/src/e2ee/proto/proto-writer.ts +76 -0
- package/src/e2ee/protocol.js +196 -0
- package/src/e2ee/ratchet.js +219 -0
- package/src/e2ee/store.js +182 -0
- package/src/e2ee.js +8 -0
- package/src/editMessage.js +56 -0
- package/src/editMessageOld.js +67 -0
- package/src/enableReactions.js +24 -0
- package/src/follow.js +74 -0
- package/src/followUser.js +23 -0
- package/src/forwardAttachment.js +16 -0
- package/src/friendList.js +98 -0
- package/src/getAccess.js +112 -0
- package/src/getAppState.js +13 -0
- package/src/getAvatarUser.js +11 -0
- package/src/getBio.js +24 -0
- package/src/getBotInitialData.js +42 -0
- package/src/getCtx.js +5 -0
- package/src/getCurrentUserID.js +6 -0
- package/src/getEmojiUrl.js +29 -0
- package/src/getFriendsList.js +36 -0
- package/src/getMessage.js +37 -0
- package/src/getNotes.js +17 -0
- package/src/getOptions.js +5 -0
- package/src/getPinnedMessages.js +33 -0
- package/src/getPostInfo.js +17 -0
- package/src/getProfileInfo.js +17 -0
- package/src/getPublicData.js +25 -0
- package/src/getRegion.js +7 -0
- package/src/getRepInfo.js +17 -0
- package/src/getStickerPacks.js +25 -0
- package/src/getStickers.js +39 -0
- package/src/getStoryReactions.js +18 -0
- package/src/getThreadHistory.js +45 -0
- package/src/getThreadHistoryDeprecated.js +71 -0
- package/src/getThreadInfo.js +73 -0
- package/src/getThreadInfoDeprecated.js +56 -0
- package/src/getThreadList.js +76 -0
- package/src/getThreadListDeprecated.js +46 -0
- package/src/getThreadPictures.js +59 -0
- package/src/getThreadTheme.js +77 -0
- package/src/getUID.js +17 -0
- package/src/getUserID.js +17 -0
- package/src/getUserInfo.js +28 -0
- package/src/handleFriendRequest.js +21 -0
- package/src/handleMessageRequest.js +15 -0
- package/src/httpGet.js +13 -0
- package/src/httpPost.js +12 -0
- package/src/httpPostFormData.js +12 -0
- package/src/listenE2EE.js +75 -0
- package/src/listenMqtt.js +802 -0
- package/src/listenNotification.js +85 -0
- package/src/logout.js +22 -0
- package/src/markAsDelivered.js +17 -0
- package/src/markAsRead.js +14 -0
- package/src/markAsReadAll.js +15 -0
- package/src/markAsSeen.js +15 -0
- package/src/metaTheme.js +185 -0
- package/src/muteThread.js +52 -0
- package/src/note.js +228 -0
- package/src/pin.js +53 -0
- package/src/pinMessage.js +6 -0
- package/src/postComment.js +29 -0
- package/src/postFormData.js +46 -0
- package/src/reactToComment.js +31 -0
- package/src/reactToPost.js +32 -0
- package/src/refreshFb_dtsg.js +31 -0
- package/src/removeSuspiciousAccount.js +74 -0
- package/src/removeUserFromGroup.js +15 -0
- package/src/reply.js +442 -0
- package/src/resolvePhotoUrl.js +15 -0
- package/src/searchForThread.js +20 -0
- package/src/searchFriends.js +28 -0
- package/src/searchStickers.js +53 -0
- package/src/send.js +46 -0
- package/src/sendAudio.js +8 -0
- package/src/sendBroadcast.js +93 -0
- package/src/sendButtons.js +161 -0
- package/src/sendComment.js +159 -0
- package/src/sendEmoji.js +10 -0
- package/src/sendFile.js +9 -0
- package/src/sendFriendRequest.js +33 -0
- package/src/sendGif.js +24 -0
- package/src/sendImage.js +9 -0
- package/src/sendLocation.js +9 -0
- package/src/sendMessage.js +487 -0
- package/src/sendMessage1.js +309 -0
- package/src/sendMessageMqtt.js +68 -0
- package/src/sendSticker.js +8 -0
- package/src/sendTypingIndicator.js +36 -0
- package/src/sendTypingIndicatorV2.js +28 -0
- package/src/sendVideo.js +9 -0
- package/src/sessionGuard.js +130 -0
- package/src/setActiveStatus.js +16 -0
- package/src/setMessageReaction.js +61 -0
- package/src/setMessageReactionMqtt.js +62 -0
- package/src/setOptions.js +22 -0
- package/src/setPollVote.js +17 -0
- package/src/setPostReaction.js +112 -0
- package/src/setProfileGuard.js +44 -0
- package/src/setProfileLock.js +93 -0
- package/src/setStoryReaction.js +129 -0
- package/src/setStorySeen.js +99 -0
- package/src/setThreadTheme.js +17 -0
- package/src/setTitle.js +15 -0
- package/src/shareContact.js +33 -0
- package/src/shareLink.js +8 -0
- package/src/sharePost.js +31 -0
- package/src/stopListenMqtt.js +23 -0
- package/src/storyManager.js +353 -0
- package/src/suggestFriend.js +128 -0
- package/src/threadColors.js +131 -0
- package/src/unfollowUser.js +23 -0
- package/src/unfriend.js +15 -0
- package/src/unpinMessage.js +6 -0
- package/src/unsendMessage.js +14 -0
- package/src/uploadAttachment.js +58 -0
- package/src/uploadImageToImgbb.js +29 -0
- package/utils.js +2945 -0
|
Binary file
|
|
Binary file
|
package/checkUpdate.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const axios = require('axios');
|
|
4
|
+
const { execSync } = require('child_process');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const logger = require('./logger');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Check for updates to shadowx-fca package
|
|
11
|
+
* @returns {Promise<boolean>} True if update was performed, false otherwise
|
|
12
|
+
*/
|
|
13
|
+
async function checkForFCAUpdate() {
|
|
14
|
+
try {
|
|
15
|
+
logger.info('UPDATE', 'Checking for shadowx-fca updates...');
|
|
16
|
+
|
|
17
|
+
// Get latest version from npm registry
|
|
18
|
+
const { data: npmData } = await axios.get(
|
|
19
|
+
'https://registry.npmjs.org/shadowx-fca/latest',
|
|
20
|
+
{ timeout: 10000 }
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const latestVersion = npmData.version;
|
|
24
|
+
|
|
25
|
+
// Check current installed version in multiple locations
|
|
26
|
+
let currentVersion = '0.0.0';
|
|
27
|
+
const searchPaths = [
|
|
28
|
+
path.join(process.cwd(), 'node_modules', 'shadowx-fca', 'package.json'),
|
|
29
|
+
path.join(__dirname, '..', 'package.json'), // Parent directory
|
|
30
|
+
path.join(process.cwd(), 'package.json'), // Check if running from source
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
for (const pkgPath of searchPaths) {
|
|
34
|
+
if (fs.existsSync(pkgPath)) {
|
|
35
|
+
try {
|
|
36
|
+
const installedPackage = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
37
|
+
if (installedPackage.name === 'shadowx-fca') {
|
|
38
|
+
currentVersion = installedPackage.version;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
} catch (err) {
|
|
42
|
+
// Continue to next path
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
logger.debug('UPDATE', `Current version: ${currentVersion}, Latest version: ${latestVersion}`);
|
|
48
|
+
|
|
49
|
+
if (compareVersions(latestVersion, currentVersion) > 0) {
|
|
50
|
+
logger.box(
|
|
51
|
+
`✨ New update available!\n` +
|
|
52
|
+
`Current: v${currentVersion}\n` +
|
|
53
|
+
`Latest: v${latestVersion}`,
|
|
54
|
+
'warn'
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Show changelog if available
|
|
58
|
+
await showChangelog(latestVersion);
|
|
59
|
+
|
|
60
|
+
// Confirm update
|
|
61
|
+
const shouldUpdate = await confirmUpdate();
|
|
62
|
+
|
|
63
|
+
if (shouldUpdate) {
|
|
64
|
+
logger.group('📦 Updating shadowx-fca', async () => {
|
|
65
|
+
// Backup current version
|
|
66
|
+
await backupCurrentVersion(currentVersion);
|
|
67
|
+
|
|
68
|
+
// Update npm package
|
|
69
|
+
await updateNpmPackage(latestVersion);
|
|
70
|
+
|
|
71
|
+
// Update version in user's package.json
|
|
72
|
+
await updateUserPackageJson(latestVersion);
|
|
73
|
+
|
|
74
|
+
logger.success('UPDATE', `Successfully updated to v${latestVersion}`);
|
|
75
|
+
logger.warn('UPDATE', 'Restarting to apply changes...');
|
|
76
|
+
|
|
77
|
+
// Graceful restart
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
process.exit(2);
|
|
80
|
+
}, 2000);
|
|
81
|
+
|
|
82
|
+
return true;
|
|
83
|
+
});
|
|
84
|
+
} else {
|
|
85
|
+
logger.info('UPDATE', 'Update skipped by user');
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
} else if (compareVersions(latestVersion, currentVersion) < 0) {
|
|
89
|
+
logger.info('UPDATE', `Running development version v${currentVersion} (latest: v${latestVersion})`);
|
|
90
|
+
return false;
|
|
91
|
+
} else {
|
|
92
|
+
logger.success('UPDATE', `shadowx-fca is up to date (v${currentVersion})`);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (error.code === 'ECONNREFUSED' || error.code === 'ETIMEDOUT') {
|
|
97
|
+
logger.warn('UPDATE', 'Could not reach npm registry. Skipping update check.');
|
|
98
|
+
} else {
|
|
99
|
+
logger.error('UPDATE', `Failed to check for updates: ${error.message}`);
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Show changelog for the new version
|
|
107
|
+
* @param {string} version - Latest version number
|
|
108
|
+
*/
|
|
109
|
+
async function showChangelog(version) {
|
|
110
|
+
try {
|
|
111
|
+
const changelogUrls = [
|
|
112
|
+
`https://raw.githubusercontent.com/mueidmursalinrifat/shadowx-fca/main/CHANGELOG.md`,
|
|
113
|
+
`https://raw.githubusercontent.com/mueidmursalinrifat/shadowx-fca/master/CHANGELOG.md`,
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
for (const url of changelogUrls) {
|
|
117
|
+
try {
|
|
118
|
+
const { data: changesData } = await axios.get(url, { timeout: 5000 });
|
|
119
|
+
|
|
120
|
+
logger.info('UPDATE', '📋 Recent Changes:');
|
|
121
|
+
|
|
122
|
+
// Parse changelog sections
|
|
123
|
+
const sections = changesData.split(/(?=##\s)/);
|
|
124
|
+
let latestChanges = '';
|
|
125
|
+
|
|
126
|
+
// Find the section for this version or the latest version
|
|
127
|
+
for (const section of sections) {
|
|
128
|
+
if (section.includes(version) || sections.indexOf(section) === 1) {
|
|
129
|
+
const lines = section.split('\n').filter(line => line.trim());
|
|
130
|
+
// Skip the header line
|
|
131
|
+
latestChanges = lines.slice(1, 6).join('\n');
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (latestChanges) {
|
|
137
|
+
console.log(logger.C.dim + latestChanges + logger.C.reset);
|
|
138
|
+
} else {
|
|
139
|
+
// Show first few lines if no version-specific section
|
|
140
|
+
const lines = changesData.split('\n').slice(0, 10);
|
|
141
|
+
console.log(logger.C.dim + lines.join('\n') + logger.C.reset);
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
} catch (err) {
|
|
145
|
+
// Try next URL
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
} catch (err) {
|
|
149
|
+
logger.debug('UPDATE', 'Could not fetch changelog');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Confirm with user before updating
|
|
155
|
+
* @returns {Promise<boolean>}
|
|
156
|
+
*/
|
|
157
|
+
async function confirmUpdate() {
|
|
158
|
+
return new Promise((resolve) => {
|
|
159
|
+
// Auto-update in production, ask in development
|
|
160
|
+
if (process.env.NODE_ENV === 'production' || process.env.AUTO_UPDATE === 'true') {
|
|
161
|
+
logger.info('UPDATE', 'Auto-update enabled, proceeding...');
|
|
162
|
+
resolve(true);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// If no TTY, auto-accept
|
|
167
|
+
if (!process.stdin.isTTY) {
|
|
168
|
+
logger.info('UPDATE', 'Non-interactive mode, proceeding with update...');
|
|
169
|
+
resolve(true);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Default to yes after timeout
|
|
174
|
+
const timeout = setTimeout(() => {
|
|
175
|
+
logger.info('UPDATE', 'No response, proceeding with update...');
|
|
176
|
+
resolve(true);
|
|
177
|
+
}, 10000);
|
|
178
|
+
|
|
179
|
+
process.stdout.write(
|
|
180
|
+
`${logger.C.bYellow}Do you want to update? (Y/n): ${logger.C.reset}`
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const handler = (data) => {
|
|
184
|
+
clearTimeout(timeout);
|
|
185
|
+
const input = data.toString().trim().toLowerCase();
|
|
186
|
+
process.stdin.removeListener('data', handler);
|
|
187
|
+
|
|
188
|
+
if (input === 'n' || input === 'no') {
|
|
189
|
+
resolve(false);
|
|
190
|
+
} else {
|
|
191
|
+
resolve(true);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
process.stdin.once('data', handler);
|
|
196
|
+
process.stdin.resume();
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Backup current version before updating
|
|
202
|
+
* @param {string} currentVersion - Current version number
|
|
203
|
+
*/
|
|
204
|
+
async function backupCurrentVersion(currentVersion) {
|
|
205
|
+
try {
|
|
206
|
+
const backupDir = path.join(process.cwd(), 'node_modules', '.shadowx-fca-backup');
|
|
207
|
+
const sourceDir = path.join(process.cwd(), 'node_modules', 'shadowx-fca');
|
|
208
|
+
|
|
209
|
+
if (fs.existsSync(sourceDir)) {
|
|
210
|
+
if (!fs.existsSync(backupDir)) {
|
|
211
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const backupPath = path.join(backupDir, `v${currentVersion}-${Date.now()}`);
|
|
215
|
+
|
|
216
|
+
// Copy package.json for reference
|
|
217
|
+
const pkgPath = path.join(sourceDir, 'package.json');
|
|
218
|
+
if (fs.existsSync(pkgPath)) {
|
|
219
|
+
fs.copyFileSync(pkgPath, path.join(backupDir, `package-v${currentVersion}.json`));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
logger.debug('UPDATE', `Backed up current version v${currentVersion}`);
|
|
223
|
+
}
|
|
224
|
+
} catch (error) {
|
|
225
|
+
logger.warn('UPDATE', `Could not create backup: ${error.message}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Compare two semantic versions
|
|
231
|
+
* @param {string} v1 - First version
|
|
232
|
+
* @param {string} v2 - Second version
|
|
233
|
+
* @returns {number} 1 if v1 > v2, -1 if v1 < v2, 0 if equal
|
|
234
|
+
*/
|
|
235
|
+
function compareVersions(v1, v2) {
|
|
236
|
+
const parts1 = v1.split('.').map(Number);
|
|
237
|
+
const parts2 = v2.split('.').map(Number);
|
|
238
|
+
|
|
239
|
+
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
240
|
+
const part1 = parts1[i] || 0;
|
|
241
|
+
const part2 = parts2[i] || 0;
|
|
242
|
+
|
|
243
|
+
if (part1 > part2) return 1;
|
|
244
|
+
if (part1 < part2) return -1;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return 0;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Update npm package to latest version
|
|
252
|
+
* @param {string} version - Version to install
|
|
253
|
+
* @returns {Promise<boolean>}
|
|
254
|
+
*/
|
|
255
|
+
async function updateNpmPackage(version) {
|
|
256
|
+
return new Promise((resolve, reject) => {
|
|
257
|
+
try {
|
|
258
|
+
logger.info('UPDATE', `📦 Installing shadowx-fca@${version}...`);
|
|
259
|
+
|
|
260
|
+
// Try multiple package managers
|
|
261
|
+
const packageManagers = ['npm', 'yarn', 'pnpm'];
|
|
262
|
+
let installed = false;
|
|
263
|
+
|
|
264
|
+
for (const pm of packageManagers) {
|
|
265
|
+
try {
|
|
266
|
+
const command = pm === 'yarn'
|
|
267
|
+
? `yarn add shadowx-fca@${version}`
|
|
268
|
+
: pm === 'pnpm'
|
|
269
|
+
? `pnpm add shadowx-fca@${version}`
|
|
270
|
+
: `npm install shadowx-fca@${version} --save`;
|
|
271
|
+
|
|
272
|
+
logger.debug('UPDATE', `Trying ${pm}...`);
|
|
273
|
+
|
|
274
|
+
execSync(command, {
|
|
275
|
+
cwd: process.cwd(),
|
|
276
|
+
stdio: 'pipe',
|
|
277
|
+
timeout: 60000
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
installed = true;
|
|
281
|
+
logger.success('UPDATE', `Package installed successfully using ${pm}`);
|
|
282
|
+
break;
|
|
283
|
+
} catch (err) {
|
|
284
|
+
logger.debug('UPDATE', `${pm} failed: ${err.message}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (installed) {
|
|
289
|
+
resolve(true);
|
|
290
|
+
} else {
|
|
291
|
+
reject(new Error('All package managers failed'));
|
|
292
|
+
}
|
|
293
|
+
} catch (error) {
|
|
294
|
+
logger.error('UPDATE', `Failed to install package: ${error.message}`);
|
|
295
|
+
reject(error);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Update user's package.json with new version
|
|
302
|
+
* @param {string} version - New version number
|
|
303
|
+
* @returns {Promise<boolean>}
|
|
304
|
+
*/
|
|
305
|
+
async function updateUserPackageJson(version) {
|
|
306
|
+
try {
|
|
307
|
+
const userPackageJsonPath = path.join(process.cwd(), 'package.json');
|
|
308
|
+
|
|
309
|
+
if (!fs.existsSync(userPackageJsonPath)) {
|
|
310
|
+
logger.warn('UPDATE', 'No package.json found in project root');
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const packageJson = JSON.parse(fs.readFileSync(userPackageJsonPath, 'utf-8'));
|
|
315
|
+
let updated = false;
|
|
316
|
+
|
|
317
|
+
// Update in dependencies
|
|
318
|
+
if (packageJson.dependencies && packageJson.dependencies['shadowx-fca']) {
|
|
319
|
+
packageJson.dependencies['shadowx-fca'] = `^${version}`;
|
|
320
|
+
updated = true;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Update in devDependencies
|
|
324
|
+
if (packageJson.devDependencies && packageJson.devDependencies['shadowx-fca']) {
|
|
325
|
+
packageJson.devDependencies['shadowx-fca'] = `^${version}`;
|
|
326
|
+
updated = true;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Update in peerDependencies
|
|
330
|
+
if (packageJson.peerDependencies && packageJson.peerDependencies['shadowx-fca']) {
|
|
331
|
+
packageJson.peerDependencies['shadowx-fca'] = `^${version}`;
|
|
332
|
+
updated = true;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (updated) {
|
|
336
|
+
fs.writeFileSync(userPackageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
337
|
+
logger.success('UPDATE', `Updated package.json to shadowx-fca@^${version}`);
|
|
338
|
+
} else {
|
|
339
|
+
logger.debug('UPDATE', 'shadowx-fca not found in package.json dependencies');
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return true;
|
|
343
|
+
} catch (error) {
|
|
344
|
+
logger.warn('UPDATE', `Failed to update user package.json: ${error.message}`);
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Check for updates with retry mechanism
|
|
351
|
+
* @param {number} retries - Number of retry attempts
|
|
352
|
+
* @param {number} delay - Delay between retries in ms
|
|
353
|
+
* @returns {Promise<boolean>}
|
|
354
|
+
*/
|
|
355
|
+
async function checkForUpdatesWithRetry(retries = 3, delay = 5000) {
|
|
356
|
+
for (let i = 0; i < retries; i++) {
|
|
357
|
+
try {
|
|
358
|
+
const result = await checkForFCAUpdate();
|
|
359
|
+
return result;
|
|
360
|
+
} catch (error) {
|
|
361
|
+
if (i < retries - 1) {
|
|
362
|
+
logger.warn('UPDATE', `Retry ${i + 1}/${retries} in ${delay/1000}s...`);
|
|
363
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
logger.error('UPDATE', 'All update attempts failed');
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Initialize update check if not disabled
|
|
372
|
+
function initAutoUpdate() {
|
|
373
|
+
const disableUpdate = process.env.DISABLE_UPDATE === 'true' ||
|
|
374
|
+
process.argv.includes('--no-update');
|
|
375
|
+
|
|
376
|
+
if (!disableUpdate) {
|
|
377
|
+
// Check for updates after a delay to not block startup
|
|
378
|
+
setTimeout(() => {
|
|
379
|
+
checkForUpdatesWithRetry().catch(() => {
|
|
380
|
+
// Silently fail - updates are non-critical
|
|
381
|
+
});
|
|
382
|
+
}, 3000);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
module.exports = {
|
|
387
|
+
checkForFCAUpdate,
|
|
388
|
+
updateNpmPackage,
|
|
389
|
+
updateUserPackageJson,
|
|
390
|
+
checkForUpdatesWithRetry,
|
|
391
|
+
initAutoUpdate,
|
|
392
|
+
compareVersions
|
|
393
|
+
};
|
package/config.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"e2ee": {
|
|
3
|
+
"enable": true,
|
|
4
|
+
"memoryOnly": true,
|
|
5
|
+
"autoReconnect": true,
|
|
6
|
+
"logLevel": "none",
|
|
7
|
+
"devicePath": null
|
|
8
|
+
},
|
|
9
|
+
"enableTypingIndicator": true,
|
|
10
|
+
"typingDuration": 2000,
|
|
11
|
+
"listenEvents": true,
|
|
12
|
+
"autoMarkRead": true,
|
|
13
|
+
"autoMarkDelivery": false,
|
|
14
|
+
"selfListen": false,
|
|
15
|
+
"online": true,
|
|
16
|
+
"logLevel": "silent"
|
|
17
|
+
}
|