@trap_stevo/filetide 0.0.52 → 0.0.54
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/dist/cjs/FileMessager.js +47 -26
- package/dist/cjs/FileMessagerClient.js +16 -12
- package/dist/cjs/FileTide.js +66 -36
- package/dist/cjs/HUDComponents/ConsoleProgressBarManager.js +12 -1
- package/dist/cjs/HUDManagers/FileNetClientManager.js +11 -0
- package/dist/cjs/HUDManagers/FileNetUtilityManager.js +1 -16
- package/dist/cjs/HUDManagers/FileTideDebugUtilityManager.js +73 -0
- package/dist/cjs/HUDManagers/FileTransferReceiverManager.js +30 -21
- package/dist/cjs/HUDManagers/FileTransferTrackingManager.js +84 -0
- package/dist/cjs/HUDManagers/FileUtilityManager.js +1 -1
- package/package.json +3 -2
package/dist/cjs/FileMessager.js
CHANGED
|
@@ -136,6 +136,8 @@ class FileMessager {
|
|
|
136
136
|
this.fileNet.emitToTide(senderClient.tideID, "transfer-status", {
|
|
137
137
|
status: `Chunk ${chunkIndex} of ${fileName} sent to client ${clientData.userID}!`,
|
|
138
138
|
recipientID: clientData.userID,
|
|
139
|
+
senderName: senderData.userID,
|
|
140
|
+
senderID: senderData.id,
|
|
139
141
|
success: true,
|
|
140
142
|
fileName,
|
|
141
143
|
chunkIndex,
|
|
@@ -146,7 +148,7 @@ class FileMessager {
|
|
|
146
148
|
});
|
|
147
149
|
}
|
|
148
150
|
}
|
|
149
|
-
handleRequestTransferFromClient(transferData) {
|
|
151
|
+
handleRequestTransferFromClient(senderTide, transferData) {
|
|
150
152
|
const {
|
|
151
153
|
requesterID,
|
|
152
154
|
senderID,
|
|
@@ -155,7 +157,7 @@ class FileMessager {
|
|
|
155
157
|
} = transferData;
|
|
156
158
|
this.requestFromClient(requesterID, senderID, filePath, destinationPath);
|
|
157
159
|
}
|
|
158
|
-
handleSentFileListToClient(listData) {
|
|
160
|
+
handleSentFileListToClient(senderTide, listData) {
|
|
159
161
|
const {
|
|
160
162
|
totalItemsSent,
|
|
161
163
|
recipientID,
|
|
@@ -174,10 +176,11 @@ class FileMessager {
|
|
|
174
176
|
totalItemsSent
|
|
175
177
|
});
|
|
176
178
|
} catch (error) {
|
|
179
|
+
console.error(`[FileTide ~ Net Scanner] ~ `, error);
|
|
177
180
|
return;
|
|
178
181
|
}
|
|
179
182
|
}
|
|
180
|
-
handleSendFileListToClient(listData) {
|
|
183
|
+
handleSendFileListToClient(senderTide, listData) {
|
|
181
184
|
const {
|
|
182
185
|
listedFiles,
|
|
183
186
|
totalItems,
|
|
@@ -198,10 +201,11 @@ class FileMessager {
|
|
|
198
201
|
listedFiles
|
|
199
202
|
});
|
|
200
203
|
} catch (error) {
|
|
204
|
+
console.error(`[FileTide ~ Net Scanner] ~ `, error);
|
|
201
205
|
return;
|
|
202
206
|
}
|
|
203
207
|
}
|
|
204
|
-
handleListClientFiles(clientData) {
|
|
208
|
+
handleListClientFiles(senderTide, clientData) {
|
|
205
209
|
const {
|
|
206
210
|
requesterID,
|
|
207
211
|
recipientID,
|
|
@@ -221,10 +225,11 @@ class FileMessager {
|
|
|
221
225
|
depth
|
|
222
226
|
});
|
|
223
227
|
} catch (error) {
|
|
228
|
+
console.error(`[FileTide ~ Net Scanner] ~ `, error);
|
|
224
229
|
return;
|
|
225
230
|
}
|
|
226
231
|
}
|
|
227
|
-
handleClientToClientTransfer(transferData) {
|
|
232
|
+
handleClientToClientTransfer(senderTide, transferData) {
|
|
228
233
|
try {
|
|
229
234
|
const {
|
|
230
235
|
chunkBatch
|
|
@@ -317,11 +322,11 @@ class FileMessager {
|
|
|
317
322
|
}
|
|
318
323
|
}
|
|
319
324
|
} catch (error) {
|
|
320
|
-
console.
|
|
325
|
+
console.error(`[FileTide ~ Net Transporter] ~ `, error);
|
|
321
326
|
return;
|
|
322
327
|
}
|
|
323
328
|
}
|
|
324
|
-
handleClientTransferBarrierResponse(data) {
|
|
329
|
+
handleClientTransferBarrierResponse(senderTide, data) {
|
|
325
330
|
console.log(`[FileTide ~ Net] Checking ${data.recipientID}'s transfer barrier for transfer ~ ${data.transferID}...`);
|
|
326
331
|
try {
|
|
327
332
|
const recipientConnectionID = FileNetClientManager.getOnlineClient(data.recipientID).id;
|
|
@@ -329,6 +334,7 @@ class FileMessager {
|
|
|
329
334
|
const senderClient = this.getClientFromID(senderConnectionID);
|
|
330
335
|
const client = this.getClientFromID(recipientConnectionID);
|
|
331
336
|
if (!client || !senderClient) {
|
|
337
|
+
console.log(`[FileTide ~ Net Barrier] ~ Both, recipient and sender connection authorization required.`);
|
|
332
338
|
return;
|
|
333
339
|
}
|
|
334
340
|
this.fileNet.emitToTide(client.tideID, "queue-incoming-transfer", {
|
|
@@ -351,18 +357,20 @@ class FileMessager {
|
|
|
351
357
|
...data
|
|
352
358
|
});
|
|
353
359
|
}).catch(error => {
|
|
354
|
-
console.error(error.message);
|
|
360
|
+
console.error(`[FileTide ~ Net Barrier] ~ ${error.message}`);
|
|
355
361
|
});
|
|
356
362
|
return;
|
|
357
363
|
} catch (error) {
|
|
364
|
+
console.error(`[FileTide ~ Net Barrier] ~ `, error);
|
|
358
365
|
return;
|
|
359
366
|
}
|
|
360
367
|
}
|
|
361
|
-
handleSendCurrentTransferState(data) {
|
|
368
|
+
handleSendCurrentTransferState(senderTide, data) {
|
|
362
369
|
try {
|
|
363
370
|
const senderConnectionID = FileNetClientManager.getOnlineClient(data.senderID).id;
|
|
364
371
|
const senderClient = this.getClientFromID(senderConnectionID);
|
|
365
372
|
if (!senderClient) {
|
|
373
|
+
console.log(`[FileTide ~ Net Transfers] ~ Sender ~ ${senderConnectionID.truncate(0, senderConnectionID.length / 2)}... not found.`);
|
|
366
374
|
return;
|
|
367
375
|
}
|
|
368
376
|
this.fileNet.emitToTide(senderClient.tideID, "sent-current-transfer-state", data.transferState || {
|
|
@@ -370,10 +378,11 @@ class FileMessager {
|
|
|
370
378
|
lastChunkSent: 0
|
|
371
379
|
});
|
|
372
380
|
} catch (error) {
|
|
381
|
+
console.error(`[FileTide ~ Net Transfers] ~ `, error);
|
|
373
382
|
return;
|
|
374
383
|
}
|
|
375
384
|
}
|
|
376
|
-
handleGetClientTransferState(data) {
|
|
385
|
+
handleGetClientTransferState(senderTide, data) {
|
|
377
386
|
const filePath = data.filePath || data.path;
|
|
378
387
|
console.log(`[FileTide ~ Net] ~ Getting ${data.recipientID}'s transfer state for ~ ${filePath}...`);
|
|
379
388
|
try {
|
|
@@ -388,10 +397,11 @@ class FileMessager {
|
|
|
388
397
|
filePath
|
|
389
398
|
});
|
|
390
399
|
} catch (error) {
|
|
400
|
+
console.error(`[FileTide ~ Net Transfers] ~ `, error);
|
|
391
401
|
return;
|
|
392
402
|
}
|
|
393
403
|
}
|
|
394
|
-
handleGetClient(data) {
|
|
404
|
+
handleGetClient(senderTide, data) {
|
|
395
405
|
console.log(`[FileTide ~ Net] ~ Getting client ~ ${data.clientID}...`);
|
|
396
406
|
try {
|
|
397
407
|
const senderConnectionID = FileNetClientManager.getOnlineClient(data.senderID).id;
|
|
@@ -404,22 +414,23 @@ class FileMessager {
|
|
|
404
414
|
console.log(`[FileTide ~ Net] Got client ~ ${data.clientID}!`);
|
|
405
415
|
this.fileNet.emitToTide(senderClient.tideID, "retrieved-current-client", client);
|
|
406
416
|
} catch (error) {
|
|
417
|
+
console.error(`[FileTide ~ Net Activity] ~ `, error);
|
|
407
418
|
return;
|
|
408
419
|
}
|
|
409
420
|
}
|
|
410
|
-
handleAcknowledgeTransferTide(data) {
|
|
421
|
+
handleAcknowledgeTransferTide(senderTide, data) {
|
|
411
422
|
try {
|
|
412
423
|
console.log(`[FileTide ~ Net Activity] ~ ${data.recipientName} acknowledged tide transfer from ${data.senderName}.\n\n\t~ [${data.fileName}-${data.transferStats.startTime}] ~\n\n\t\tFile Name ~ ${data.fileName}\n\t\tDestination ~ ${data.path}\n\n\t\t\tProgress ~ ${data.transferStats.progress.toFixed(2)}%\n\t\t\tETA ~ ${data.transferStats.timeLeft <= 0 ? "Now" : FileNetUtilityManager.convertSeconds(data.transferStats.timeLeft.toFixed(2))}\n\t\t\tSpeed ~ ${FileNetUtilityManager.getFormattedSize(data.transferStats.speed, true)}/s\n\t\t\tSize ~ ${FileNetUtilityManager.getFormattedSize(data.transferStats.totalSize, true)}\n\t\t\tTransferred ~ ${FileNetUtilityManager.getFormattedSize(data.transferStats.current, true)}\n`);
|
|
413
424
|
} catch (error) {
|
|
414
|
-
console.
|
|
425
|
+
console.error(`[FileTide ~ Net Activity] ~ ${data.recipientName} acknowledged tide transfer from ${data.senderName}.\n\n${error}`);
|
|
415
426
|
}
|
|
416
427
|
}
|
|
417
|
-
handleNotifyTransferBarrier(data, emitToChannel) {
|
|
428
|
+
handleNotifyTransferBarrier(senderTide, data, emitToChannel) {
|
|
418
429
|
const accepted = data.accepted;
|
|
419
430
|
const transferID = data.data.transferID;
|
|
420
431
|
this.currentTransferBarrierTransfers.set(transferID, accepted);
|
|
421
432
|
}
|
|
422
|
-
handleFileTransferStart(data, emitToChannel) {
|
|
433
|
+
handleFileTransferStart(senderTide, data, emitToChannel) {
|
|
423
434
|
console.log(`[FileTide ~ File Messager] ~ Alerting client of incoming transfer from ${data.senderID}...`);
|
|
424
435
|
try {
|
|
425
436
|
const recipientConnectionID = FileNetClientManager.getOnlineClient(data.recipientID).id;
|
|
@@ -434,7 +445,7 @@ class FileMessager {
|
|
|
434
445
|
...data,
|
|
435
446
|
currentSender: data.senderID
|
|
436
447
|
});
|
|
437
|
-
if (!this.currentTidingTransfers.get(senderID) || this.currentTidingTransfers.get(senderID).length <= 0) {
|
|
448
|
+
if (!this.currentTidingTransfers.get(data.senderID) || this.currentTidingTransfers.get(data.senderID).length <= 0) {
|
|
438
449
|
const tidingTransfers = new Map();
|
|
439
450
|
tidingTransfers.set(data.recipientID, {
|
|
440
451
|
recipientID: data.recipientID,
|
|
@@ -445,23 +456,24 @@ class FileMessager {
|
|
|
445
456
|
this.currentTidingTransfers.set(data.senderID, tidingTransfers);
|
|
446
457
|
return;
|
|
447
458
|
}
|
|
448
|
-
this.currentTidingTransfers.get(senderID).set(data.recipientID, {
|
|
459
|
+
this.currentTidingTransfers.get(data.senderID).set(data.recipientID, {
|
|
449
460
|
recipientID: data.recipientID,
|
|
450
461
|
startedOn: new Date(),
|
|
451
462
|
size: data.fileSize,
|
|
452
463
|
path: data.path
|
|
453
464
|
});
|
|
454
465
|
} catch (error) {
|
|
466
|
+
console.error(`[FileTide ~ Net Transfers] ~ `, error);
|
|
455
467
|
return;
|
|
456
468
|
}
|
|
457
469
|
}
|
|
458
|
-
handleFileTransferProgress(data, emitToChannel) {
|
|
470
|
+
handleFileTransferProgress(senderTide, data, emitToChannel) {
|
|
459
471
|
console.log(`Progress: ${data.progress}`);
|
|
460
472
|
}
|
|
461
|
-
handleFileTransferComplete(data) {
|
|
473
|
+
handleFileTransferComplete(senderTide, data) {
|
|
462
474
|
console.log(`File transfer completed: ${data.fileName}`);
|
|
463
475
|
}
|
|
464
|
-
handleCheckClientOnline(data) {
|
|
476
|
+
handleCheckClientOnline(senderTide, data) {
|
|
465
477
|
console.log(`[FileTide ~ Net Activity] ~ Checking if client ~ ${data.clientID} online...`);
|
|
466
478
|
try {
|
|
467
479
|
const client = FileNetClientManager.getOnlineClient(data.clientID);
|
|
@@ -485,7 +497,7 @@ class FileMessager {
|
|
|
485
497
|
return;
|
|
486
498
|
}
|
|
487
499
|
}
|
|
488
|
-
handleClientsOnline(clientID) {
|
|
500
|
+
handleClientsOnline(senderTide, clientID) {
|
|
489
501
|
const connectionDetails = FileNetClientManager.getOnlineClient(clientID);
|
|
490
502
|
if (!connectionDetails) {
|
|
491
503
|
console.log(`[FileTide ~ Net Activity] ~ Client ~ ${clientID} not authorized.`);
|
|
@@ -499,13 +511,21 @@ class FileMessager {
|
|
|
499
511
|
this.fileNet.emitToTide(connectionDetails.tideID, "current-online-clients", Object.fromEntries(FileNetClientManager.getOnlineClients()));
|
|
500
512
|
return;
|
|
501
513
|
}
|
|
502
|
-
handleClientOnline(clientID, tideID, pClientID, connectionID, activeTransferBarrier) {
|
|
514
|
+
handleClientOnline(senderTide, clientID, tideID, pClientID, connectionID, activeTransferBarrier) {
|
|
503
515
|
if (!this.onlineClients.contains(connectionID)) {
|
|
504
516
|
return;
|
|
505
517
|
}
|
|
506
518
|
if (FileNetClientManager.getOnlineClient(clientID) && this.onlineClients.get(connectionID)) {
|
|
507
|
-
|
|
519
|
+
const nClientID = `${clientID}_${connectionID.slice(0, 4)}`;
|
|
520
|
+
const currentClientID = clientID;
|
|
521
|
+
clientID = nClientID;
|
|
508
522
|
this.fileNet.emitToTide(tideID, "current-client-id-already-online", clientID);
|
|
523
|
+
FileNetClientManager.updateOnlineClient(nClientID, {
|
|
524
|
+
pClientID: currentClientID,
|
|
525
|
+
clientID: nClientID,
|
|
526
|
+
tideID: senderTide.tideID,
|
|
527
|
+
id: senderTide.id
|
|
528
|
+
});
|
|
509
529
|
return;
|
|
510
530
|
}
|
|
511
531
|
FileNetClientManager.addOnlineClient(clientID, pClientID, tideID, connectionID);
|
|
@@ -518,7 +538,7 @@ class FileMessager {
|
|
|
518
538
|
this.fileNet.emit("current-clients", currentOnlineClients);
|
|
519
539
|
return;
|
|
520
540
|
}
|
|
521
|
-
handleClientOffline(clientData) {
|
|
541
|
+
handleClientOffline(senderTide, clientData) {
|
|
522
542
|
console.log(`[FileTide ~ Net Activity] ~ Client ~ ${clientData.clientID} | connection origin ~ ${clientData.connectionID} going offline...`);
|
|
523
543
|
try {
|
|
524
544
|
const clientDetails = FileNetClientManager.getOnlineClient(clientData.clientID);
|
|
@@ -537,7 +557,7 @@ class FileMessager {
|
|
|
537
557
|
const tidingTransfers = this.currentTidingTransfers.get(clientData.clientID);
|
|
538
558
|
if (tidingTransfers && tidingTransfers.size > 0) {
|
|
539
559
|
for (let recipientID of tidingTransfers.keys()) {
|
|
540
|
-
const recipientConnectionID = FileNetClientManager.getOnlineClient(
|
|
560
|
+
const recipientConnectionID = FileNetClientManager.getOnlineClient(clientData.recipientID).id;
|
|
541
561
|
const client = this.getClientFromID(recipientConnectionID);
|
|
542
562
|
if (client) {
|
|
543
563
|
this.fileNet.emitToTide(client.tideID, "save-current-transfer-states", {
|
|
@@ -552,7 +572,7 @@ class FileMessager {
|
|
|
552
572
|
}
|
|
553
573
|
return;
|
|
554
574
|
}
|
|
555
|
-
handleClientTiding(data) {
|
|
575
|
+
handleClientTiding(senderTide, data) {
|
|
556
576
|
try {
|
|
557
577
|
const senderConnectionID = FileNetClientManager.getOnlineClient(data.senderID).id;
|
|
558
578
|
const senderClient = this.getClientFromID(senderConnectionID);
|
|
@@ -565,6 +585,7 @@ class FileMessager {
|
|
|
565
585
|
});
|
|
566
586
|
return;
|
|
567
587
|
} catch (error) {
|
|
588
|
+
console.error(`[FileTide ~ Net Activity] ~ `, error);
|
|
568
589
|
return;
|
|
569
590
|
}
|
|
570
591
|
}
|
|
@@ -7,10 +7,13 @@ const chalk = require("chalk");
|
|
|
7
7
|
const path = require("path");
|
|
8
8
|
const fs = require("fs");
|
|
9
9
|
const {
|
|
10
|
-
|
|
10
|
+
FileTideDebugUtilityManager,
|
|
11
11
|
significantMessageColors,
|
|
12
12
|
errorMessageColors
|
|
13
|
-
} = require("./HUDManagers/
|
|
13
|
+
} = require("./HUDManagers/FileTideDebugUtilityManager");
|
|
14
|
+
const {
|
|
15
|
+
FileTransferTrackingManager
|
|
16
|
+
} = require("./HUDManagers/FileTransferTrackingManager.js");
|
|
14
17
|
const FileTransferRecoveryManager = require("./HUDManagers/FileTransferRecoveryManager");
|
|
15
18
|
const {
|
|
16
19
|
FileMessagerConfigManager
|
|
@@ -46,12 +49,13 @@ class FileMessagerClient {
|
|
|
46
49
|
transports: ["websocket"],
|
|
47
50
|
...options
|
|
48
51
|
}, headers, authURL, authHeaders, useAuthentication, queryAuthToken, onConnect, () => {
|
|
52
|
+
FileTransferTrackingManager.outputCurrentTransfers();
|
|
49
53
|
FileTransferRecoveryManager.flushToDisk();
|
|
50
54
|
if (onDisconnect) {
|
|
51
55
|
onDisconnect();
|
|
52
56
|
}
|
|
53
57
|
});
|
|
54
|
-
|
|
58
|
+
FileTideDebugUtilityManager.outputGradient(`\n[FileTide ~ File Messager] ~ Created client with ID ${clientID} and socket ${clientID}!`, significantMessageColors);
|
|
55
59
|
return clientID;
|
|
56
60
|
}
|
|
57
61
|
joinRoom(userID, roomName, options = {}, headers = {}, onConnect = null, onDisconnect = null, authURL = "", authHeaders = {}, useAuthentication = false, queryAuthToken = false) {
|
|
@@ -60,7 +64,7 @@ class FileMessagerClient {
|
|
|
60
64
|
}, options, headers, onConnect, onDisconnect, authURL, authHeaders, useAuthentication, queryAuthToken);
|
|
61
65
|
return () => {
|
|
62
66
|
this.clientTide.joinChannel(socketName, roomName, userID, () => {
|
|
63
|
-
|
|
67
|
+
FileTideDebugUtilityManager.outputGradient(`\n[FileTide ~ File Messager] ~ Client ~ ${userID} joined room ${roomName} successfully!`, significantMessageColors);
|
|
64
68
|
this.clients.set(userID, {
|
|
65
69
|
roomName
|
|
66
70
|
});
|
|
@@ -109,18 +113,18 @@ class FileMessagerClient {
|
|
|
109
113
|
transferType
|
|
110
114
|
}, transferExpirationTime);
|
|
111
115
|
if (!transferAccepted) {
|
|
112
|
-
|
|
116
|
+
FileTideDebugUtilityManager.outputGradient(`[FileTide ~ File Messager] ${recipientID} denied your transfer.`, errorMessageColors);
|
|
113
117
|
return false;
|
|
114
118
|
} else if (transferAccepted) {
|
|
115
|
-
|
|
119
|
+
FileTideDebugUtilityManager.outputGradient(`[FileTide ~ File Messager] ${recipientID} accepted your transfer!`, significantMessageColors);
|
|
116
120
|
return true;
|
|
117
121
|
}
|
|
118
122
|
} catch (error) {
|
|
119
123
|
if (error.message.startsWith("Timeout: No response")) {
|
|
120
|
-
|
|
124
|
+
FileTideDebugUtilityManager.outputGradient("[FileTide ~ File Messager] Transfer approval timed out.", errorMessageColors);
|
|
121
125
|
return false;
|
|
122
126
|
}
|
|
123
|
-
|
|
127
|
+
FileTideDebugUtilityManager.outputGradient(`[FileTide ~ File Messager] Transfer approval refused.\n${error}`, errorMessageColors);
|
|
124
128
|
return false;
|
|
125
129
|
}
|
|
126
130
|
}
|
|
@@ -163,7 +167,7 @@ class FileMessagerClient {
|
|
|
163
167
|
});
|
|
164
168
|
Promise.all(sendFilePromises).then(() => console.log("\nAll files in directory transferred successfully!")).catch(error => console.error("Did not transfer directory: ", error));
|
|
165
169
|
} catch (error) {
|
|
166
|
-
|
|
170
|
+
FileTideDebugUtilityManager.outputGradient(`[FileTide ~ File Messager] ~ Refused directory transfer: ${error}`, errorMessageColors);
|
|
167
171
|
}
|
|
168
172
|
}
|
|
169
173
|
async sendDirectoryLargeFile(clientID, recipientId, fileName, filePath = process.cwd(), destinationPath = null, fileSize, index = 0, tideSize = 500, minTideSize = 10, maxTideSize = 2000, transferRequestExpirationTime = 30000) {
|
|
@@ -192,7 +196,7 @@ class FileMessagerClient {
|
|
|
192
196
|
}
|
|
193
197
|
async sendFile(clientID, recipientId, fileName, filePath = process.cwd(), destination = process.cwd(), fileSize, tideSize = 500, minTideSize = 10, maxTideSize = 2000, initiatingTransfer = true, inDirectory = false, largeFile = false, transferRequestExpirationTime = 30000) {
|
|
194
198
|
const destinationPath = FileUtilityManager.normalizePath(path.join(destination, fileName));
|
|
195
|
-
|
|
199
|
+
FileTideDebugUtilityManager.outputGradient(largeFile ? `[FileTide ~ File Messager] ~ Requesting to transfer large file ~ ${destinationPath} to ${recipientId}!` : `[FileTide ~ File Messager] ~ Requesting to transfer ~ ${destinationPath} to ${recipientId}!`, significantMessageColors);
|
|
196
200
|
const incomingType = this.activeTransferTypes.get(filePath);
|
|
197
201
|
if (!inDirectory && initiatingTransfer) {
|
|
198
202
|
const transferAllowed = incomingType && incomingType === "requestedTransfer" ? true : await this.allowedTransfer(clientID, recipientId, destinationPath, filePath, fileSize, 1, "file", "send", transferRequestExpirationTime);
|
|
@@ -298,9 +302,9 @@ class FileMessagerClient {
|
|
|
298
302
|
});
|
|
299
303
|
}
|
|
300
304
|
}, this.clientTide);
|
|
301
|
-
|
|
305
|
+
FileTideDebugUtilityManager.outputGradient(largeFile ? `[FileTide ~ File Messager] ~ Large file ~ ${fileName} transfer complete!` : `[FileTide ~ File Messager] ~ File ~ ${fileName} transfer complete!`, significantMessageColors);
|
|
302
306
|
} catch (error) {
|
|
303
|
-
|
|
307
|
+
FileTideDebugUtilityManager.outputGradient(largeFile ? `[FileTide ~ File Messager] ~ Error transferring large file: ${error.message}` : `[FileTide ~ File Messager] ~ Error transferring file ~ ${error.message}`, errorMessageColors);
|
|
304
308
|
} finally {
|
|
305
309
|
await fileHandle.close();
|
|
306
310
|
}
|
package/dist/cjs/FileTide.js
CHANGED
|
@@ -11,10 +11,13 @@ const chalk = require("chalk");
|
|
|
11
11
|
const path = require("path");
|
|
12
12
|
const fs = require("fs");
|
|
13
13
|
const {
|
|
14
|
-
|
|
14
|
+
FileTideDebugUtilityManager,
|
|
15
15
|
significantMessageColors,
|
|
16
16
|
errorMessageColors
|
|
17
|
-
} = require("./HUDManagers/
|
|
17
|
+
} = require("./HUDManagers/FileTideDebugUtilityManager.js");
|
|
18
|
+
const {
|
|
19
|
+
FileTransferTrackingManager
|
|
20
|
+
} = require("./HUDManagers/FileTransferTrackingManager.js");
|
|
18
21
|
const {
|
|
19
22
|
FileTransferReceiverManager
|
|
20
23
|
} = require("./HUDManagers/FileTransferReceiverManager.js");
|
|
@@ -32,7 +35,7 @@ const FileMessagerClient = require("./FileMessagerClient");
|
|
|
32
35
|
const FileMessager = require("./FileMessager");
|
|
33
36
|
var _FileTide_brand = /*#__PURE__*/new WeakSet();
|
|
34
37
|
class FileTide {
|
|
35
|
-
constructor() {
|
|
38
|
+
constructor(debugMode = true) {
|
|
36
39
|
/**
|
|
37
40
|
* Set up file transfer event listeners natively.
|
|
38
41
|
* Automatically checks and creates directories as needed.
|
|
@@ -45,10 +48,12 @@ class FileTide {
|
|
|
45
48
|
this.transferBarrier = false;
|
|
46
49
|
this.clients = new Map();
|
|
47
50
|
this.currentUserID = "";
|
|
51
|
+
this.inDebugMode = debugMode;
|
|
52
|
+
FileTideDebugUtilityManager.setDebugMode(debugMode);
|
|
48
53
|
return;
|
|
49
54
|
}
|
|
50
55
|
static outputGradient(text, colors) {
|
|
51
|
-
|
|
56
|
+
FileTideDebugUtilityManager.outputGradient(text, colors);
|
|
52
57
|
return;
|
|
53
58
|
}
|
|
54
59
|
|
|
@@ -104,7 +109,7 @@ class FileTide {
|
|
|
104
109
|
const newClient = new FileMessagerClient(clientOptions, transportOptions, messagerSettings);
|
|
105
110
|
const enterRoom = newClient.joinRoom(userID, roomName, connectionOptions, headers, onConnect, onDisconnect, authURL, authHeaders, useAuthentication, queryAuthToken);
|
|
106
111
|
this.transferBarrier = enableTransferBarrier;
|
|
107
|
-
this.clientShorePolicies.set(userID, [FileUtilityManager.getTidePath(">
|
|
112
|
+
this.clientShorePolicies.set(userID, [FileUtilityManager.getTidePath(">Downloads"), FileUtilityManager.getTidePath(">Documents"), FileUtilityManager.getTidePath(">Desktop"), FileUtilityManager.getTidePath(">Photos"), FileUtilityManager.getTidePath(">Videos"), FileUtilityManager.getTidePath(">Music")]);
|
|
108
113
|
this.clients.set(userID, newClient);
|
|
109
114
|
FileTide.outputGradient(`[FileTide] ~ Messager launched successfully for client ~ ${userID}!`, significantMessageColors);
|
|
110
115
|
_assertClassBrand(_FileTide_brand, this, _setupFileEventListeners).call(this, userID, newClient, onTransferProgress, onIncomingTransfer, onIncomingFile, onTransferBarrier, options);
|
|
@@ -142,7 +147,7 @@ class FileTide {
|
|
|
142
147
|
const clientID = this.currentUserID;
|
|
143
148
|
const clientMessager = this.clients.get(clientID);
|
|
144
149
|
if (!clientMessager) {
|
|
145
|
-
FileTide.outputGradient(`[FileTide] Client ~ ${clientID} not found.`,
|
|
150
|
+
FileTide.outputGradient(`[FileTide] Client ~ ${clientID} not found.`, errorMessageColors);
|
|
146
151
|
return;
|
|
147
152
|
}
|
|
148
153
|
clientMessager.listFiles(clientID, recipientID, depth);
|
|
@@ -153,7 +158,7 @@ class FileTide {
|
|
|
153
158
|
clearShorePolicies(clientID, shores = []) {
|
|
154
159
|
let clientShorePolicies = this.clientShorePolicies.get(clientID);
|
|
155
160
|
if (!shores || shores.length <= 0 || !clientShorePolicies || !clientID) {
|
|
156
|
-
FileTide.outputGradient(`[FileTide] Did not clear from client ~ ${clientID} shore policies.`,
|
|
161
|
+
FileTide.outputGradient(`[FileTide] Did not clear from client ~ ${clientID} shore policies.`, errorMessageColors);
|
|
157
162
|
return false;
|
|
158
163
|
}
|
|
159
164
|
const shorePolicies = Array.from(clientShorePolicies.values());
|
|
@@ -164,7 +169,7 @@ class FileTide {
|
|
|
164
169
|
addShorePolicies(clientID, shores = []) {
|
|
165
170
|
const clientShorePolicies = this.clientShorePolicies.get(clientID);
|
|
166
171
|
if (!shores || shores.length <= 0 || !clientShorePolicies || !clientID) {
|
|
167
|
-
FileTide.outputGradient(`[FileTide] Did not add to client ~ ${clientID} shore policies.`,
|
|
172
|
+
FileTide.outputGradient(`[FileTide] Did not add to client ~ ${clientID} shore policies.`, errorMessageColors);
|
|
168
173
|
return false;
|
|
169
174
|
}
|
|
170
175
|
this.clientShorePolicies.set(clientID, [...new Set([...clientShorePolicies, ...shores])]);
|
|
@@ -190,33 +195,33 @@ class FileTide {
|
|
|
190
195
|
const clientID = this.currentUserID;
|
|
191
196
|
const clientMessager = this.clients.get(clientID);
|
|
192
197
|
if (!clientMessager) {
|
|
193
|
-
FileTide.outputGradient(`[FileTide] Client ~ ${clientID} not found.`,
|
|
198
|
+
FileTide.outputGradient(`[FileTide] Client ~ ${clientID} not found.`, errorMessageColors);
|
|
194
199
|
return false;
|
|
195
200
|
}
|
|
196
201
|
const recipientOnline = await clientMessager.clientTide.emitEventWithResponse(clientID, "check-client-online", "retrieved-client-online", {
|
|
197
202
|
clientID: recipientID
|
|
198
203
|
}, 5000);
|
|
199
204
|
if (!recipientOnline || !recipientOnline.online) {
|
|
200
|
-
FileTide.outputGradient(`[FileTide] ${recipientID} currently not tiding.`,
|
|
205
|
+
FileTide.outputGradient(`[FileTide] ${recipientID} currently not tiding.`, errorMessageColors);
|
|
201
206
|
return false;
|
|
202
207
|
}
|
|
203
208
|
const fileDetails = await this.getPathData(filePath, filterDirectoryContent);
|
|
204
209
|
if (!fileDetails) {
|
|
205
|
-
FileTide.outputGradient(`[${clientID}] File at path ${filePath} not found.`,
|
|
210
|
+
FileTide.outputGradient(`[${clientID}] File at path ${filePath} not found.`, errorMessageColors);
|
|
206
211
|
return false;
|
|
207
212
|
}
|
|
208
213
|
if (fileDetails.type === "file") {
|
|
209
214
|
if (fileDetails.largeFile) {
|
|
210
|
-
FileTide.outputGradient(`[${clientID}] Sending large file ~ ${fileDetails.fileName} to client ~ ${recipientID}...`,
|
|
215
|
+
FileTide.outputGradient(`[${clientID}] Sending large file ~ ${fileDetails.fileName} to client ~ ${recipientID}...`, significantMessageColors);
|
|
211
216
|
await clientMessager.sendFile(clientID, recipientID, fileDetails.fileName, fileDetails.filePath, destinationPath, fileDetails.fileSize, tidalSize, minTideSize, maxTideSize, true, false, true, transferRequestExpirationTime);
|
|
212
217
|
return true;
|
|
213
218
|
}
|
|
214
|
-
FileTide.outputGradient(`[${clientID}] Sending file ~ ${fileDetails.content.fileName} to client ~ ${recipientID}...`,
|
|
219
|
+
FileTide.outputGradient(`[${clientID}] Sending file ~ ${fileDetails.content.fileName} to client ~ ${recipientID}...`, significantMessageColors);
|
|
215
220
|
await clientMessager.sendFile(clientID, recipientID, fileDetails.content.fileName, fileDetails.content.filePath, destinationPath, fileDetails.content.size, tideSize, minTideSize, maxTideSize, transferRequestExpirationTime);
|
|
216
221
|
return true;
|
|
217
222
|
}
|
|
218
223
|
if (fileDetails.type === "directory") {
|
|
219
|
-
FileTide.outputGradient(`[${clientID}] Sending ${fileDetails.content.length} files in directory ~ ${path.basename(filePath)} to client ~ ${recipientID}...`,
|
|
224
|
+
FileTide.outputGradient(`[${clientID}] Sending ${fileDetails.content.length} files in directory ~ ${path.basename(filePath)} to client ~ ${recipientID}...`, significantMessageColors);
|
|
220
225
|
await clientMessager.sendDirectoryFiles(clientID, recipientID, fileDetails.content, this.getTidePath(filePath), destinationPath, tideSize, minTideSize, maxTideSize, transferRequestExpirationTime);
|
|
221
226
|
return true;
|
|
222
227
|
}
|
|
@@ -439,7 +444,7 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
|
|
|
439
444
|
onIncomingFile(verifiedSender, {
|
|
440
445
|
...data,
|
|
441
446
|
stats: taskBarStats
|
|
442
|
-
},
|
|
447
|
+
}, FileTransferTrackingManager.activeTransfers);
|
|
443
448
|
}
|
|
444
449
|
if (verifiedSender && !fs.existsSync(saveDir)) {
|
|
445
450
|
fs.mkdirSync(saveDir, {
|
|
@@ -465,6 +470,8 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
|
|
|
465
470
|
});
|
|
466
471
|
client.clientTide.onEvent(userID, "transfer-progress", async data => {
|
|
467
472
|
if (!data || data.fileChunk === undefined || data.fileChunk === null) {
|
|
473
|
+
FileTideDebugUtilityManager.log("notice", true, `Received invalid data chunk from ~ ${data.senderName} in transfer progress ~ ${data.fileName}`);
|
|
474
|
+
FileTransferTrackingManager.outputCurrentTransfers();
|
|
468
475
|
return;
|
|
469
476
|
}
|
|
470
477
|
await fileTransferReceiver.handleTransferProgress(data);
|
|
@@ -498,12 +505,15 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
|
|
|
498
505
|
fileSize
|
|
499
506
|
} = data;
|
|
500
507
|
if (chunkIndex === 0) {
|
|
508
|
+
FileTransferTrackingManager.trackTransfer(data);
|
|
501
509
|
this.progressBarManager.addTask({
|
|
502
510
|
name: fileName,
|
|
503
511
|
size: fileSize
|
|
504
512
|
});
|
|
513
|
+
} else if (chunkIndex > 0) {
|
|
514
|
+
FileTransferTrackingManager.updateTransfer(data);
|
|
515
|
+
this.progressBarManager.updateTaskProgress(fileName, chunkSize);
|
|
505
516
|
}
|
|
506
|
-
this.progressBarManager.updateTaskProgress(fileName, chunkSize);
|
|
507
517
|
if (onTransferStatus) {
|
|
508
518
|
const taskBarStats = this.progressBarManager.getTaskBar(fileName);
|
|
509
519
|
onTransferStatus({
|
|
@@ -517,28 +527,47 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
|
|
|
517
527
|
const savePath = FileUtilityManager.getTidePath(path.join(data.filePath, data.fileName));
|
|
518
528
|
try {
|
|
519
529
|
_FileTide.outputGradient(`[${userID}] File transfer complete ~ ${data.fileName}`, significantMessageColors);
|
|
520
|
-
const transferState =
|
|
530
|
+
const transferState = FileTransferTrackingManager.getTransfer(data.fileName);
|
|
531
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer state ~ ${data.fileName} active | ${transferState !== null && transferState !== undefined ? true : false}`);
|
|
521
532
|
if (!transferState) {
|
|
522
533
|
return;
|
|
523
534
|
}
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
535
|
+
if (transferState.fileStream) {
|
|
536
|
+
fileTransferReceiver.completeTransfer(data, (transferData, transfers, success, error) => {
|
|
537
|
+
if (success) {
|
|
538
|
+
FileTransferRecoveryManager.clearTransferState(userID, data.senderID, `${data.filePath}-${data.fileName}`);
|
|
539
|
+
_FileTide.outputGradient(`[${userID}] File saved at ~ ${savePath}\n`, significantMessageColors);
|
|
540
|
+
} else if (!success) {
|
|
541
|
+
_FileTide.outputGradient(`[${userID}] Did not save file at ~ ${savePath}\n\t${error}\n`, errorMessageColors);
|
|
542
|
+
}
|
|
543
|
+
if (onTransferComplete) {
|
|
544
|
+
const taskBarStats = this.progressBarManager.getTaskBar(data.fileName);
|
|
545
|
+
onTransferComplete({
|
|
546
|
+
...data,
|
|
547
|
+
stats: taskBarStats
|
|
548
|
+
}, FileTransferTrackingManager.activeTransfers, success);
|
|
549
|
+
}
|
|
550
|
+
setTimeout(() => {
|
|
551
|
+
FileTransferTrackingManager.outputCurrentTransfers();
|
|
552
|
+
this.progressBarManager.clearTaskBar(data.fileName);
|
|
553
|
+
}, this.progressBarManager.completionTimeout);
|
|
554
|
+
});
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
FileTransferRecoveryManager.clearTransferState(userID, data.senderID, `${data.filePath}-${data.fileName}`);
|
|
558
|
+
FileTransferTrackingManager.untrackTransfer(data.fileName);
|
|
559
|
+
_FileTide.outputGradient(`[${userID}] Transfer successfully sent to ~ ${data.recipientId} and saved at ~ ${path.join(data.filePath, data.fileName)}\n`, significantMessageColors);
|
|
560
|
+
if (onTransferComplete) {
|
|
561
|
+
const taskBarStats = this.progressBarManager.getTaskBar(data.fileName);
|
|
562
|
+
onTransferComplete({
|
|
563
|
+
...data,
|
|
564
|
+
stats: taskBarStats
|
|
565
|
+
}, FileTransferTrackingManager.activeTransfers, true);
|
|
566
|
+
}
|
|
567
|
+
setTimeout(() => {
|
|
568
|
+
FileTransferTrackingManager.outputCurrentTransfers();
|
|
569
|
+
this.progressBarManager.clearTaskBar(data.fileName);
|
|
570
|
+
}, this.progressBarManager.completionTimeout);
|
|
542
571
|
} catch (error) {
|
|
543
572
|
_FileTide.outputGradient(`[${userID}] Did not save file at ~ ${savePath}\n${error}`, errorMessageColors);
|
|
544
573
|
if (onTransferComplete) {
|
|
@@ -546,9 +575,10 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
|
|
|
546
575
|
onTransferComplete({
|
|
547
576
|
...data,
|
|
548
577
|
stats: taskBarStats
|
|
549
|
-
},
|
|
578
|
+
}, FileTransferTrackingManager.activeTransfers, false);
|
|
550
579
|
}
|
|
551
580
|
setTimeout(() => {
|
|
581
|
+
FileTransferTrackingManager.outputCurrentTransfers();
|
|
552
582
|
this.progressBarManager.clearTaskBar(data.fileName);
|
|
553
583
|
}, this.progressBarManager.completionTimeout);
|
|
554
584
|
}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
const readline = require("readline");
|
|
4
4
|
const chalk = require("chalk");
|
|
5
|
+
const {
|
|
6
|
+
FileTideDebugUtilityManager
|
|
7
|
+
} = require("../HUDManagers/FileTideDebugUtilityManager.js");
|
|
5
8
|
const {
|
|
6
9
|
FileNetUtilityManager
|
|
7
10
|
} = require("../HUDManagers/FileNetUtilityManager");
|
|
@@ -107,7 +110,9 @@ class ConsoleProgressBarManager {
|
|
|
107
110
|
setTimeout(() => {
|
|
108
111
|
this.completionFeed = this.completionFeed.filter(task => task !== newBar.taskName);
|
|
109
112
|
}, this.completionTimeout);
|
|
113
|
+
FileTideDebugUtilityManager.log("notice", true, `Tasks Completion Status ~\n\n\tTasks ~ (${this.completedTasksCount}/${this.totalTasks})`);
|
|
110
114
|
if (this.completedTasksCount === this.totalTasks) {
|
|
115
|
+
FileTideDebugUtilityManager.log("notice", true, `All Tasks Complete!`);
|
|
111
116
|
this.allTasksCompleted = true;
|
|
112
117
|
this.exitInputListener();
|
|
113
118
|
this.displayPage();
|
|
@@ -153,7 +158,7 @@ class ConsoleProgressBarManager {
|
|
|
153
158
|
getCurrentStats() {
|
|
154
159
|
const completedTasks = this.taskBars.filter(bar => bar.completed).length;
|
|
155
160
|
const totalTasks = this.taskBars.length;
|
|
156
|
-
const overallProgress = this.taskBars.reduce((acc, bar) => acc + bar.current / bar.totalSize * 100, 0) / totalTasks;
|
|
161
|
+
const overallProgress = totalTasks === 0 ? 0 : this.taskBars.reduce((acc, bar) => acc + bar.current / bar.totalSize * 100, 0) / totalTasks;
|
|
157
162
|
const stats = {
|
|
158
163
|
completedTasks,
|
|
159
164
|
totalTasks,
|
|
@@ -259,14 +264,20 @@ class ConsoleProgressBarManager {
|
|
|
259
264
|
}
|
|
260
265
|
exitInputListener() {
|
|
261
266
|
process.stdin.removeListener("data", this.inputListener);
|
|
267
|
+
FileTideDebugUtilityManager.log("notice", true, `Exiting input listener...`);
|
|
268
|
+
FileTideDebugUtilityManager.log("notice", true, `Process TTY ~ ${process.stdout.isTTY}`);
|
|
262
269
|
if (process.stdout.isTTY) {
|
|
263
270
|
process.stdin.setRawMode(false);
|
|
264
271
|
process.stdin.resume();
|
|
272
|
+
FileTideDebugUtilityManager.log("notice", true, `Resumed process.`);
|
|
265
273
|
}
|
|
274
|
+
FileTideDebugUtilityManager.log("notice", true, `Exited input listener.`);
|
|
266
275
|
}
|
|
267
276
|
displayCompletionMessage() {
|
|
268
277
|
const lastLine = Math.min(this.taskBars.length, this.barsPerPage);
|
|
269
278
|
readline.cursorTo(process.stdout, 0, lastLine);
|
|
279
|
+
FileTideDebugUtilityManager.log("notice", true, `Displaying task completion message...`);
|
|
280
|
+
FileTideDebugUtilityManager.log("notice", true, `Process TTY ~ ${process.stdout.isTTY}`);
|
|
270
281
|
if (process.stdout.isTTY) {
|
|
271
282
|
process.stdout.clearLine();
|
|
272
283
|
}
|
|
@@ -14,6 +14,17 @@ class FileNetClientManager {
|
|
|
14
14
|
});
|
|
15
15
|
return currentOnlineClients;
|
|
16
16
|
}
|
|
17
|
+
static updateOnlineClient(clientID, data) {
|
|
18
|
+
const onlineClient = currentOnlineClients.get(clientID);
|
|
19
|
+
if (!onlineClient) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
currentOnlineClients.set(clientID, {
|
|
23
|
+
...onlineClient,
|
|
24
|
+
...data
|
|
25
|
+
});
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
17
28
|
static clearOnlineClient(clientID) {
|
|
18
29
|
if (!currentOnlineClients.get(clientID)) {
|
|
19
30
|
return currentOnlineClients;
|
|
@@ -3,20 +3,7 @@
|
|
|
3
3
|
const {
|
|
4
4
|
HUDUtilityManager
|
|
5
5
|
} = require("@trap_stevo/legendarybuilderpronodejs-utilities");
|
|
6
|
-
const chalk = require("chalk");
|
|
7
|
-
const significantMessageColors = ["#00C897", "#00E0FF"];
|
|
8
|
-
const errorMessageColors = ["#F94144", "#F3722C"];
|
|
9
6
|
class FileNetUtilityManager {
|
|
10
|
-
static outputGradient(text, colors) {
|
|
11
|
-
const gradient = HUDUtilityManager.generateGradientColors(colors, text.length);
|
|
12
|
-
let coloredText = "";
|
|
13
|
-
for (let i = 0; i < text.length; i++) {
|
|
14
|
-
const [r, g, b] = gradient[i];
|
|
15
|
-
coloredText += chalk.rgb(r, g, b)(text[i]);
|
|
16
|
-
}
|
|
17
|
-
console.log(coloredText);
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
7
|
static convertSeconds(seconds) {
|
|
21
8
|
if (seconds === 0) return "0 s";
|
|
22
9
|
const units = [{
|
|
@@ -80,7 +67,5 @@ class FileNetUtilityManager {
|
|
|
80
67
|
}
|
|
81
68
|
}
|
|
82
69
|
module.exports = {
|
|
83
|
-
FileNetUtilityManager
|
|
84
|
-
significantMessageColors,
|
|
85
|
-
errorMessageColors
|
|
70
|
+
FileNetUtilityManager
|
|
86
71
|
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
HUDUtilityManager
|
|
5
|
+
} = require("@trap_stevo/legendarybuilderpronodejs-utilities");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
const significantMessageColors = ["#00C897", "#00E0FF"];
|
|
8
|
+
const noticeMessageColors = ["#4A90E2", "#A3D8F4"];
|
|
9
|
+
const errorMessageColors = ["#F94144", "#F3722C"];
|
|
10
|
+
const infoMessageColors = ["#028090", "#56cfe1"];
|
|
11
|
+
const logHandler = {
|
|
12
|
+
"significant": function (includeDate = false, ...message) {
|
|
13
|
+
const log = includeDate ? `[${new Date().toLocaleString()}] ~ ` : "";
|
|
14
|
+
outputGradient(log + message.join(" "), significantMessageColors);
|
|
15
|
+
},
|
|
16
|
+
"notice": function (includeDate = false, ...message) {
|
|
17
|
+
const log = includeDate ? `[${new Date().toLocaleString()}] ~ ` : "";
|
|
18
|
+
outputGradient(log + message.join(" "), noticeMessageColors);
|
|
19
|
+
},
|
|
20
|
+
"error": function (includeDate = false, ...message) {
|
|
21
|
+
const log = includeDate ? `[${new Date().toLocaleString()}] ~ ` : "";
|
|
22
|
+
outputGradient(log + message.join(" "), errorMessageColors);
|
|
23
|
+
},
|
|
24
|
+
"info": function (includeDate = false, ...message) {
|
|
25
|
+
const log = includeDate ? `[${new Date().toLocaleString()}] ~ ` : "";
|
|
26
|
+
outputGradient(log + message.join(" "), infoMessageColors);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
function outputGradient(text, colors) {
|
|
30
|
+
const gradient = HUDUtilityManager.generateGradientColors(colors, text.length);
|
|
31
|
+
let coloredText = "";
|
|
32
|
+
for (let i = 0; i < text.length; i++) {
|
|
33
|
+
const [r, g, b] = gradient[i];
|
|
34
|
+
coloredText += chalk.rgb(r, g, b)(text[i]);
|
|
35
|
+
}
|
|
36
|
+
console.log(coloredText);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
;
|
|
40
|
+
class FileTideDebugUtilityManager {
|
|
41
|
+
constructor() {
|
|
42
|
+
if (FileTideDebugUtilityManager.instance) {
|
|
43
|
+
return FileTideDebugUtilityManager.instance;
|
|
44
|
+
}
|
|
45
|
+
this.debugMode = false;
|
|
46
|
+
FileTideDebugUtilityManager.instance = this;
|
|
47
|
+
}
|
|
48
|
+
outputGradient(text, colors) {
|
|
49
|
+
outputGradient(text, colors);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
setDebugMode(mode) {
|
|
53
|
+
this.debugMode = mode;
|
|
54
|
+
}
|
|
55
|
+
log(type = "info", includeDate = false, ...message) {
|
|
56
|
+
if (!this.debugMode && type !== "error") {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (logHandler[type]) {
|
|
60
|
+
logHandler[type](includeDate, ...message);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
console.log(new Date().toLocaleString(), chalk.gray("Unknown log type ~ "), type, ...message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const instance = new FileTideDebugUtilityManager();
|
|
67
|
+
module.exports = {
|
|
68
|
+
FileTideDebugUtilityManager: instance,
|
|
69
|
+
significantMessageColors,
|
|
70
|
+
noticeMessageColors,
|
|
71
|
+
errorMessageColors,
|
|
72
|
+
infoMessageColors
|
|
73
|
+
};
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const fs = require("fs");
|
|
4
3
|
const path = require("path");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const {
|
|
6
|
+
FileTransferTrackingManager
|
|
7
|
+
} = require("./FileTransferTrackingManager.js");
|
|
8
|
+
const {
|
|
9
|
+
FileTideDebugUtilityManager
|
|
10
|
+
} = require("./FileTideDebugUtilityManager.js");
|
|
5
11
|
const {
|
|
6
12
|
FileUtilityManager
|
|
7
13
|
} = require("./FileUtilityManager.js");
|
|
8
14
|
class FileTransferReceiverManager {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.activeTransfers = new Map();
|
|
11
|
-
}
|
|
15
|
+
constructor() {}
|
|
12
16
|
async initializeTransfer(data, onError) {
|
|
13
17
|
const savePath = FileUtilityManager.getTidePath(path.join(data.path || data.filePath, data.fileName));
|
|
14
|
-
|
|
18
|
+
FileTideDebugUtilityManager.log("notice", true, `Initializing transfer ~ ${data.fileName} | ${savePath}...`);
|
|
19
|
+
if (FileTransferTrackingManager.containsTransfer(data.fileName)) {
|
|
20
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer ~ ${data.fileName} | ${savePath} already initialized.`);
|
|
15
21
|
return;
|
|
16
22
|
}
|
|
17
|
-
const totalChunks = data.totalChunks || Math.ceil(data.fileSize / (data.chunkSize || 512 * 1024));
|
|
18
|
-
const chunkSize = data.chunkSize || 512 * 1024;
|
|
19
23
|
try {
|
|
20
24
|
const dir = path.dirname(savePath);
|
|
21
25
|
if (!fs.existsSync(dir)) {
|
|
@@ -26,53 +30,58 @@ class FileTransferReceiverManager {
|
|
|
26
30
|
const fileStream = fs.createWriteStream(savePath, {
|
|
27
31
|
flags: "w"
|
|
28
32
|
});
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
fileInfo: data,
|
|
32
|
-
totalChunks,
|
|
33
|
-
fileStream,
|
|
34
|
-
chunkSize
|
|
35
|
-
});
|
|
33
|
+
FileTransferTrackingManager.trackTransfer(data, fileStream);
|
|
34
|
+
FileTideDebugUtilityManager.log("notice", true, `Initialized transfer ~ ${data.fileName} | ${savePath}!`);
|
|
36
35
|
} catch (error) {
|
|
36
|
+
FileTideDebugUtilityManager.log("error", true, `Did not initialize transfer ~ ${data.fileName} | ${savePath}.\n\t\t${error}`);
|
|
37
37
|
if (onError) {
|
|
38
38
|
onError(`[${data.fileName}] Did not initialize transfer ~ ${error.message}`);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
async handleTransferProgress(data, onError) {
|
|
43
|
-
let transferState =
|
|
43
|
+
let transferState = FileTransferTrackingManager.getTransfer(data.fileName);
|
|
44
44
|
if (!transferState) {
|
|
45
45
|
await this.initializeTransfer(data);
|
|
46
|
-
transferState =
|
|
46
|
+
transferState = tFileTransferTrackingManager.getTransfer(data.fileName);
|
|
47
47
|
}
|
|
48
48
|
const chunkBuffer = Buffer.from(data.fileChunk);
|
|
49
49
|
try {
|
|
50
50
|
transferState.fileStream.write(chunkBuffer);
|
|
51
51
|
transferState.receivedChunks.add(data.chunkIndex);
|
|
52
52
|
} catch (error) {
|
|
53
|
+
FileTideDebugUtilityManager.log("error", true, `Did not write chunk ${data.chunkIndex} ~ ${data.fileName}.\n\t\t${error}`);
|
|
53
54
|
if (onError) {
|
|
54
55
|
onError(`[${data.fileName}] Did not write chunk ${data.chunkIndex} ~ ${error.message}`);
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
59
|
async completeTransfer(data, onComplete) {
|
|
59
|
-
let transferState =
|
|
60
|
+
let transferState = FileTransferTrackingManager.getTransfer(data.fileName);
|
|
61
|
+
FileTideDebugUtilityManager.log("notice", true, `Completing transfer ~ ${data.fileName}...`);
|
|
60
62
|
if (!transferState) {
|
|
63
|
+
FileTideDebugUtilityManager.log("notice", true, `Did not get transfer state ~ ${data.fileName}...re-initializing....`);
|
|
61
64
|
await this.initializeTransfer(data);
|
|
62
|
-
transferState =
|
|
65
|
+
transferState = FileTransferTrackingManager.getTransfer(data.fileName);
|
|
63
66
|
}
|
|
64
67
|
try {
|
|
68
|
+
FileTideDebugUtilityManager.log("notice", true, `Verifying transfer state ~ ${data.fileName} completion (${transferState.receivedChunks.size}/${transferState.totalChunks})...`);
|
|
69
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer state ~ ${data.fileName} completed ~ (${transferState.receivedChunks.size === transferState.totalChunks}).`);
|
|
65
70
|
if (transferState.receivedChunks.size === transferState.totalChunks) {
|
|
66
71
|
transferState.fileStream.end();
|
|
67
72
|
console.log(`[${data.fileName}] Transfer complete. All chunks received and file written.`);
|
|
68
|
-
|
|
69
|
-
|
|
73
|
+
FileTransferTrackingManager.untrackTransfer(data.fileName);
|
|
74
|
+
FileTideDebugUtilityManager.log("notice", true, `Cleared transfer state ~ ${data.fileName}.`);
|
|
75
|
+
FileTransferTrackingManager.outputCurrentTransfers();
|
|
76
|
+
if (onComplete) onComplete(data, FileTransferTrackingManager.activeTransfers, true);
|
|
70
77
|
} else {
|
|
78
|
+
FileTideDebugUtilityManager.log("error", true, `Transfer incomplete. Received ${transferState.receivedChunks.size}/${transferState.totalChunks} chunks.`);
|
|
71
79
|
throw new Error(`[${data.fileName}] Transfer incomplete. Received ${transferState.receivedChunks.size}/${transferState.totalChunks} chunks.`);
|
|
72
80
|
}
|
|
73
81
|
} catch (error) {
|
|
82
|
+
FileTideDebugUtilityManager.log("error", true, `Transfer incomplete.\n\t\t${error}`);
|
|
74
83
|
if (onComplete) {
|
|
75
|
-
onComplete(data,
|
|
84
|
+
onComplete(data, FileTransferTrackingManager.activeTransfers, false, error);
|
|
76
85
|
}
|
|
77
86
|
}
|
|
78
87
|
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
FileTideDebugUtilityManager
|
|
5
|
+
} = require("./FileTideDebugUtilityManager.js");
|
|
6
|
+
class FileTransferTrackingManager {
|
|
7
|
+
constructor() {
|
|
8
|
+
if (FileTransferTrackingManager.instance) {
|
|
9
|
+
return FileTransferTrackingManager.instance;
|
|
10
|
+
}
|
|
11
|
+
this.activeTransfers = new Map();
|
|
12
|
+
FileTransferTrackingManager.instance = this;
|
|
13
|
+
}
|
|
14
|
+
trackTransfer(data, fileStream) {
|
|
15
|
+
FileTideDebugUtilityManager.log("notice", true, `Tracking transfer ~ ${data.fileName} | ${data.senderName}...`);
|
|
16
|
+
if (this.containsTransfer(data.fileName)) {
|
|
17
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer ~ ${data.fileName} | ${data.senderName} already tracked.`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const totalChunks = data.totalChunks || Math.ceil(data.fileSize / (data.chunkSize || 512 * 1024));
|
|
21
|
+
const chunkSize = data.chunkSize || 512 * 1024;
|
|
22
|
+
this.activeTransfers.set(data.fileName, {
|
|
23
|
+
receivedChunks: new Set(),
|
|
24
|
+
fileInfo: data,
|
|
25
|
+
totalChunks,
|
|
26
|
+
fileStream,
|
|
27
|
+
chunkSize
|
|
28
|
+
});
|
|
29
|
+
FileTideDebugUtilityManager.log("notice", true, `Tracked transfer ~ ${data.fileName} | ${data.senderName}!`);
|
|
30
|
+
}
|
|
31
|
+
updateTransfer(data) {
|
|
32
|
+
FileTideDebugUtilityManager.log("notice", true, `Updating tracked transfer ~ ${data.fileName} | ${data.senderName}...`);
|
|
33
|
+
if (!this.containsTransfer(data.fileName)) {
|
|
34
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer ~ ${data.fileName} | ${data.senderName} not tracked.`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const transferState = this.getTransfer(data.fileName);
|
|
38
|
+
transferState.receivedChunks.add(data.chunkIndex);
|
|
39
|
+
FileTideDebugUtilityManager.log("notice", true, `Updated tracked transfer ~ ${data.fileName} | ${data.senderName}!`);
|
|
40
|
+
}
|
|
41
|
+
containsTransfer(transferID) {
|
|
42
|
+
return this.activeTransfers.has(transferID);
|
|
43
|
+
}
|
|
44
|
+
getTransfer(transferID) {
|
|
45
|
+
return this.activeTransfers.get(transferID);
|
|
46
|
+
}
|
|
47
|
+
untrackTransfer(transferID) {
|
|
48
|
+
FileTideDebugUtilityManager.log("notice", true, `Untracking transfer ~ ${transferID}...`);
|
|
49
|
+
if (this.containsTransfer(transferID)) {
|
|
50
|
+
this.activeTransfers.delete(transferID);
|
|
51
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer ~ ${transferID} untracked!`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
FileTideDebugUtilityManager.log("notice", true, `Transfer ~ ${transferID} already untracked.`);
|
|
55
|
+
}
|
|
56
|
+
outputCurrentTransfers() {
|
|
57
|
+
if (this.activeTransfers.size === 0) {
|
|
58
|
+
FileTideDebugUtilityManager.log("notice", true, "No active file transfers.");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
FileTideDebugUtilityManager.log("notice", true, "Ongoing Transfers ~\n");
|
|
62
|
+
this.activeTransfers.forEach((transfer, fileName) => {
|
|
63
|
+
const {
|
|
64
|
+
totalChunks,
|
|
65
|
+
receivedChunks,
|
|
66
|
+
fileInfo
|
|
67
|
+
} = transfer;
|
|
68
|
+
const percentage = (receivedChunks.size / totalChunks * 100).toFixed(2);
|
|
69
|
+
FileTideDebugUtilityManager.log("notice", false, `\nFile Name ~ ${fileName}`);
|
|
70
|
+
FileTideDebugUtilityManager.log("notice", false, `File Path ~ ${fileInfo.path || fileInfo.filePath}`);
|
|
71
|
+
FileTideDebugUtilityManager.log("notice", false, `File Size ~ ${fileInfo.fileSize} bytes`);
|
|
72
|
+
FileTideDebugUtilityManager.log("notice", false, `Chunk Size ~ ${transfer.chunkSize} bytes`);
|
|
73
|
+
FileTideDebugUtilityManager.log("notice", false, `Total Chunks ~ ${totalChunks}`);
|
|
74
|
+
FileTideDebugUtilityManager.log("notice", false, `Received Chunks ~ ${receivedChunks.size}`);
|
|
75
|
+
FileTideDebugUtilityManager.log("notice", false, `Progress ~ ${percentage}%`);
|
|
76
|
+
});
|
|
77
|
+
FileTideDebugUtilityManager.log("notice", false, "=================================\n");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
;
|
|
81
|
+
const instance = new FileTransferTrackingManager();
|
|
82
|
+
module.exports = {
|
|
83
|
+
FileTransferTrackingManager: instance
|
|
84
|
+
};
|
|
@@ -271,7 +271,7 @@ class FileUtilityManager {
|
|
|
271
271
|
">AppData": platform === "win32" ? path.join(homeDir, "AppData", "Roaming") : path.join(homeDir, ".config"),
|
|
272
272
|
">LocalAppData": platform === "win32" ? path.join(homeDir, "AppData", "Local") : path.join(homeDir, ".local", "share"),
|
|
273
273
|
">Music": path.join(homeDir, "Music"),
|
|
274
|
-
">
|
|
274
|
+
">Photos": platform === "win32" ? path.join(homeDir, "Pictures") : path.join(homeDir, "Photos"),
|
|
275
275
|
">Videos": path.join(homeDir, "Videos"),
|
|
276
276
|
">Public": platform === "win32" ? path.join("C:", "Users", "Public") : "/usr/share",
|
|
277
277
|
">Templates": path.join(homeDir, "Templates"),
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trap_stevo/filetide",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.54",
|
|
4
4
|
"description": "Revolutionizing real-time file transfer with seamless, instant communication across any device. Deliver files instantly, regardless of platform, and experience unparalleled speed and control in managing transfers. Elevate your file-sharing capabilities with a tool designed for precision, efficiency, and effortless connectivity.",
|
|
5
5
|
"main": "dist/cjs/FileTide.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "babel src -d dist/cjs --env-name cjs",
|
|
8
|
+
"start-file-generation": "node demos/FileGenerator.js",
|
|
8
9
|
"start-messager": "node demos/FileTideClientDemo.js",
|
|
9
10
|
"start-net": "node demos/FileTideNetDemo.js",
|
|
10
11
|
"start": "node dist/cjs/FileTide.js"
|
|
@@ -33,7 +34,7 @@
|
|
|
33
34
|
"author": "Steven Compton",
|
|
34
35
|
"license": "See License in LICENSE.md",
|
|
35
36
|
"dependencies": {
|
|
36
|
-
"@trap_stevo/iotide": "^0.0.
|
|
37
|
+
"@trap_stevo/iotide": "^0.0.41",
|
|
37
38
|
"@trap_stevo/iotide-client": "^0.0.23",
|
|
38
39
|
"@trap_stevo/legendarybuilderpronodejs-utilities": "^1.0.43",
|
|
39
40
|
"chalk": "^4.1.2",
|