@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.
@@ -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.log(error);
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.log(`[FileTide ~ Net Activity] ~ ${data.recipientName} acknowledged tide transfer from ${data.senderName}.\n\n${error}`);
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
- clientID = `${clientID}_${connectionID.slice(0, 4)}`;
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(data.recipientID).id;
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
- FileNetUtilityManager,
10
+ FileTideDebugUtilityManager,
11
11
  significantMessageColors,
12
12
  errorMessageColors
13
- } = require("./HUDManagers/FileNetUtilityManager");
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
- FileNetUtilityManager.outputGradient(`\n[FileTide ~ File Messager] ~ Created client with ID ${clientID} and socket ${clientID}!`, significantMessageColors);
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
- FileNetUtilityManager.outputGradient(`\n[FileTide ~ File Messager] ~ Client ~ ${userID} joined room ${roomName} successfully!`, significantMessageColors);
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
- FileNetUtilityManager.outputGradient(`[FileTide ~ File Messager] ${recipientID} denied your transfer.`, errorMessageColors);
116
+ FileTideDebugUtilityManager.outputGradient(`[FileTide ~ File Messager] ${recipientID} denied your transfer.`, errorMessageColors);
113
117
  return false;
114
118
  } else if (transferAccepted) {
115
- FileNetUtilityManager.outputGradient(`[FileTide ~ File Messager] ${recipientID} accepted your transfer!`, significantMessageColors);
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
- FileNetUtilityManager.outputGradient("[FileTide ~ File Messager] Transfer approval timed out.", errorMessageColors);
124
+ FileTideDebugUtilityManager.outputGradient("[FileTide ~ File Messager] Transfer approval timed out.", errorMessageColors);
121
125
  return false;
122
126
  }
123
- FileNetUtilityManager.outputGradient(`[FileTide ~ File Messager] Transfer approval refused.\n${error}`, errorMessageColors);
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
- FileNetUtilityManager.outputGradient(`[FileTide ~ File Messager] ~ Refused directory transfer: ${error}`, errorMessageColors);
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
- FileNetUtilityManager.outputGradient(largeFile ? `[FileTide ~ File Messager] ~ Requesting to transfer large file ~ ${destinationPath} to ${recipientId}!` : `[FileTide ~ File Messager] ~ Requesting to transfer ~ ${destinationPath} to ${recipientId}!`, significantMessageColors);
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
- FileNetUtilityManager.outputGradient(largeFile ? `[FileTide ~ File Messager] ~ Large file ~ ${fileName} transfer complete!` : `[FileTide ~ File Messager] ~ File ~ ${fileName} transfer complete!`, significantMessageColors);
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
- FileNetUtilityManager.outputGradient(largeFile ? `[FileTide ~ File Messager] ~ Error transferring large file: ${error.message}` : `[FileTide ~ File Messager] ~ Error transferring file ~ ${error.message}`, errorMessageColors);
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
  }
@@ -11,10 +11,13 @@ const chalk = require("chalk");
11
11
  const path = require("path");
12
12
  const fs = require("fs");
13
13
  const {
14
- FileNetUtilityManager,
14
+ FileTideDebugUtilityManager,
15
15
  significantMessageColors,
16
16
  errorMessageColors
17
- } = require("./HUDManagers/FileNetUtilityManager.js");
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
- FileNetUtilityManager.outputGradient(text, colors);
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(">CurrentUser"), FileUtilityManager.getTidePath(">Downloads"), FileUtilityManager.getTidePath(">Documents")]);
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.`, ["#F94144", "#F3722C"]);
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.`, ["#F94144", "#F3722C"]);
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.`, ["#F94144", "#F3722C"]);
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.`, ["#F94144", "#F3722C"]);
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.`, ["#F94144", "#F3722C"]);
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.`, ["#F94144", "#F3722C"]);
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}...`, ["#00C897", "#00E0FF"]);
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}...`, ["#00C897", "#00E0FF"]);
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}...`, ["#00C897", "#00E0FF"]);
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
- }, fileTransferReceiver.activeTransfers);
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 = fileTransferReceiver.activeTransfers.get(data.fileName);
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
- fileTransferReceiver.completeTransfer(data, (transferData, transfers, success, error) => {
525
- if (success) {
526
- FileTransferRecoveryManager.clearTransferState(userID, data.senderID, `${data.filePath}-${data.fileName}`);
527
- _FileTide.outputGradient(`[${userID}] File saved at ~ ${savePath}\n`, significantMessageColors);
528
- } else if (!success) {
529
- _FileTide.outputGradient(`[${userID}] Did not save file at ~ ${savePath}\n\t${error}\n`, errorMessageColors);
530
- }
531
- if (onTransferComplete) {
532
- const taskBarStats = this.progressBarManager.getTaskBar(data.fileName);
533
- onTransferComplete({
534
- ...data,
535
- stats: taskBarStats
536
- }, fileTransferReceiver.activeTransfers, success);
537
- }
538
- setTimeout(() => {
539
- this.progressBarManager.clearTaskBar(data.fileName);
540
- }, this.progressBarManager.completionTimeout);
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
- }, fileTransferReceiver.activeTransfers, false);
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
- if (this.activeTransfers.has(data.fileName)) {
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
- this.activeTransfers.set(data.fileName, {
30
- receivedChunks: new Set(),
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 = this.activeTransfers.get(data.fileName);
43
+ let transferState = FileTransferTrackingManager.getTransfer(data.fileName);
44
44
  if (!transferState) {
45
45
  await this.initializeTransfer(data);
46
- transferState = this.activeTransfers.get(data.fileName);
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 = this.activeTransfers.get(data.fileName);
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 = this.activeTransfers.get(data.fileName);
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
- this.activeTransfers.delete(data.fileName);
69
- if (onComplete) onComplete(data, this.activeTransfers, true);
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, this.activeTransfers, false, error);
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
- ">Pictures": path.join(homeDir, "Pictures"),
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.52",
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",
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",