@trap_stevo/filetide 0.0.80 → 0.0.82

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.
@@ -80,11 +80,9 @@ class FileMessager {
80
80
  }
81
81
  start() {
82
82
  this.fileNet.on("get-client-transfer-barrier-response", this.handleClientTransferBarrierResponse.bind(this));
83
- this.fileNet.on("get-client-transfer-state", this.handleGetClientTransferState.bind(this));
84
83
  this.fileNet.on("get-client", this.handleGetClient.bind(this));
85
84
  this.fileNet.on("acknowledge-transfer-tide", this.handleAcknowledgeTransferTide.bind(this));
86
85
  this.fileNet.on("notify-transfer-barrier", this.handleNotifyTransferBarrier.bind(this));
87
- this.fileNet.on("send-current-transfer-state", this.handleSendCurrentTransferState.bind(this));
88
86
  this.fileNet.on("sent-file-list-to-client", this.handleSentFileListToClient.bind(this));
89
87
  this.fileNet.on("send-file-list-to-client", this.handleSendFileListToClient.bind(this));
90
88
  this.fileNet.on("list-client-files", this.handleListClientFiles.bind(this));
@@ -1560,21 +1558,6 @@ class FileMessager {
1560
1558
  });
1561
1559
  }
1562
1560
  }
1563
- saveClientTransferStates(data) {
1564
- const tidingTransfers = this.currentTidingTransfers.get(data.clientID);
1565
- if (tidingTransfers && tidingTransfers.size > 0) {
1566
- for (let recipientID of tidingTransfers.keys()) {
1567
- const recipientConnectionID = FileNetClientManager.getOnlineClient(data.recipientID ?? recipientID).id;
1568
- const client = this.getClientFromID(recipientConnectionID);
1569
- if (client) {
1570
- this.fileNet.emitToTide(client.tideID, "save-current-transfer-states", {
1571
- clientID: recipientID
1572
- });
1573
- }
1574
- }
1575
- this.currentTidingTransfers.delete(data.clientID);
1576
- }
1577
- }
1578
1561
 
1579
1562
  // --- File Messager Event Management ---
1580
1563
 
@@ -2008,42 +1991,6 @@ class FileMessager {
2008
1991
  return;
2009
1992
  }
2010
1993
  }
2011
- handleSendCurrentTransferState(senderTide, data) {
2012
- try {
2013
- const senderConnectionID = FileNetClientManager.getOnlineClient(data.senderID).id;
2014
- const senderClient = this.getClientFromID(senderConnectionID);
2015
- if (!senderClient) {
2016
- console.log(`[FileTide ~ Net Transfers] ~ Sender ~ ${senderConnectionID.truncate(0, senderConnectionID.length / 2)}... not found.`);
2017
- return;
2018
- }
2019
- this.fileNet.emitToTide(senderClient.tideID, "sent-current-transfer-state", data.transferState || {
2020
- transferredSize: 0,
2021
- lastChunkSent: 0
2022
- });
2023
- } catch (error) {
2024
- console.error(`[FileTide ~ Net Transfers] ~ `, error);
2025
- return;
2026
- }
2027
- }
2028
- handleGetClientTransferState(senderTide, data) {
2029
- const filePath = data.filePath || data.path;
2030
- console.log(`[FileTide ~ Net] ~ Getting ${data.recipientID}'s transfer state for ~ ${filePath}...`);
2031
- try {
2032
- const recipientConnectionID = FileNetClientManager.getOnlineClient(data.recipientID).id;
2033
- const client = this.getClientFromID(recipientConnectionID);
2034
- if (!client) {
2035
- return;
2036
- }
2037
- this.fileNet.emitToTide(client.tideID, "current-transfer-state", {
2038
- senderID: data.senderID,
2039
- fileName: data.fileName,
2040
- filePath
2041
- });
2042
- } catch (error) {
2043
- console.error(`[FileTide ~ Net Transfers] ~ `, error);
2044
- return;
2045
- }
2046
- }
2047
1994
  handleGetClient(senderTide, data) {
2048
1995
  console.log(`[FileTide ~ Net] ~ Getting client ~ ${data.clientID}...`);
2049
1996
  try {
@@ -2423,11 +2370,6 @@ class FileMessager {
2423
2370
  const currentOnlineClients = Object.fromEntries(FileNetClientManager.getOnlineClients());
2424
2371
  this.fileNet.emit("current-online-clients", currentOnlineClients);
2425
2372
  this.fileNet.emit("current-clients", currentOnlineClients);
2426
- const senderClient = this.getClientFromID(clientDetails.id);
2427
- this.fileNet.emitToTide(senderClient.tideID, "save-current-transfer-states", {
2428
- clientID: clientData.clientID
2429
- });
2430
- this.saveClientTransferStates(clientData);
2431
2373
  } catch (error) {
2432
2374
  console.log(`[FileTide ~ Net Activity] ~ Did not process client ~ ${clientData} offline signal ~ ${error}`);
2433
2375
  }
@@ -17,7 +17,6 @@ const {
17
17
  const {
18
18
  FileTransferTrackingManager
19
19
  } = require("./HUDManagers/FileTransferTrackingManager.js");
20
- const FileTransferRecoveryManager = require("./HUDManagers/FileTransferRecoveryManager");
21
20
  const {
22
21
  FileMessagerConfigManager
23
22
  } = require("./HUDManagers/FileMessagerConfigManager");
@@ -285,7 +284,6 @@ class FileMessagerClient {
285
284
  });
286
285
  chunkBatch.length = 0;
287
286
  }
288
- FileTransferRecoveryManager.clearTransferState(clientID, recipientId, `${filePath}-${fileName}`);
289
287
  this.clientTide.emitEvent(clientID, "transfer-complete", {
290
288
  senderID: clientID,
291
289
  recipientId,
@@ -317,7 +315,6 @@ function _createClientInstance(clientID, clientOptions, options = {}, headers =
317
315
  ...options
318
316
  }, headers, authURL, authHeaders, useAuthentication, queryAuthToken, onConnect, async () => {
319
317
  FileTransferTrackingManager.outputCurrentTransfers();
320
- FileTransferRecoveryManager.flushToDisk();
321
318
  if (onDisconnect) {
322
319
  await onDisconnect();
323
320
  }
@@ -29,7 +29,6 @@ const {
29
29
  const {
30
30
  FileTransferReceiverManager
31
31
  } = require("./HUDManagers/FileTransferReceiverManager.js");
32
- const FileTransferRecoveryManager = require("./HUDManagers/FileTransferRecoveryManager.js");
33
32
  const TideTokenEnforcer = require("./HUDManagers/TideTokenEnforcementManager.js");
34
33
  const {
35
34
  FileNetConfigManager
@@ -198,15 +197,6 @@ class FileTide {
198
197
 
199
198
  // --- FileTide Transfer State Management ---
200
199
 
201
- async getTidingTransferStates() {
202
- return await TideTokenEnforcer.protect(() => FileTransferRecoveryManager.memoryStorage, "default")();
203
- }
204
- saveTransferStates() {
205
- TideTokenEnforcer.protect(() => {
206
- FileTransferRecoveryManager.flushToDisk();
207
- }, "default")();
208
- }
209
-
210
200
  // --- FileTide Remote Files Management ---
211
201
 
212
202
  listFilesFromClient(recipientID, depth = 1) {
@@ -572,24 +562,6 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
572
562
  });
573
563
  return;
574
564
  });
575
- client.clientTide.onEvent(userID, "save-current-transfer-states", async data => {
576
- this.saveTransferStates();
577
- return;
578
- });
579
- client.clientTide.onEvent(userID, "current-transfer-state", async data => {
580
- const {
581
- senderID,
582
- fileName,
583
- filePath
584
- } = data;
585
- const currentTransferState = FileTransferRecoveryManager.getTransferState(userID, senderID, `${filePath}-${fileName}`);
586
- client.clientTide.emitEvent(userID, "send-current-transfer-state", {
587
- recipientID: userID,
588
- senderID,
589
- transferState: currentTransferState
590
- });
591
- return;
592
- });
593
565
  client.clientTide.onEvent(userID, "queue-incoming-transfer", async data => {
594
566
  if (this.transferBarrier && onIncomingTransfer) {
595
567
  onIncomingTransfer(data, status => {
@@ -675,11 +647,6 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
675
647
  }
676
648
  await fileTransferReceiver.handleTransferProgress(data);
677
649
  this.progressBarManager.updateTaskProgress(data.fileName, data.chunkSize || 512 * 1024);
678
- const currentTransferState = FileTransferRecoveryManager.getTransferState(userID, data.senderName, `${data.path}-${data.fileName}`) || {
679
- transferredSize: 0
680
- };
681
- currentTransferState.transferredSize += data.chunkSize || 512 * 1024;
682
- FileTransferRecoveryManager.saveTransferState(userID, data.senderName, `${data.path}-${data.fileName}`, data.chunkIndex, currentTransferState.transferredSize);
683
650
  const taskBarStats = this.progressBarManager.getTaskBar(data.fileName);
684
651
  client.clientTide.emitEvent(userID, "acknowledge-transfer-tide", {
685
652
  fileName: data.fileName,
@@ -736,7 +703,6 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
736
703
  if (transferState.fileStream) {
737
704
  fileTransferReceiver.completeTransfer(data, (transferData, transfers, success, error) => {
738
705
  if (success) {
739
- FileTransferRecoveryManager.clearTransferState(userID, data.senderID, `${data.filePath}-${data.fileName}`);
740
706
  _FileTide.outputGradient(`[${userID}] File saved at ~ ${savePath}\n`, significantMessageColors);
741
707
  } else if (!success) {
742
708
  _FileTide.outputGradient(`[${userID}] Did not save file at ~ ${savePath}\n\t${error}\n`, errorMessageColors);
@@ -755,7 +721,6 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
755
721
  });
756
722
  return;
757
723
  }
758
- FileTransferRecoveryManager.clearTransferState(userID, data.senderID, `${data.filePath}-${data.fileName}`);
759
724
  FileTransferTrackingManager.untrackTransfer(data.fileName);
760
725
  _FileTide.outputGradient(`[${userID}] Transfer successfully sent to ~ ${data.recipientId} and saved at ~ ${path.join(data.filePath, data.fileName)}\n`, significantMessageColors);
761
726
  if (onTransferComplete) {
@@ -4,7 +4,6 @@ function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a
4
4
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
5
5
  function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
6
6
  const fs = require("fs");
7
- const FileTransferRecoveryManager = require("./FileTransferRecoveryManager.js");
8
7
  var _FileTransferManager_brand = /*#__PURE__*/new WeakSet();
9
8
  class FileTransferManager {
10
9
  constructor({
@@ -41,23 +40,14 @@ class FileTransferManager {
41
40
  onTiding
42
41
  }, clientTide) {
43
42
  const transferId = _assertClassBrand(_FileTransferManager_brand, this, _generateTransferId).call(this, fileDetails);
44
- const recoveredTransferState = (await clientTide.emitEventWithResponse(originDetails.senderID, "get-client-transfer-state", "sent-current-transfer-state", {
45
- recipientID,
46
- senderID: originDetails.senderID,
47
- filePath: fileDetails.destinationPath,
48
- fileName: fileDetails.name
49
- }, 30000)) || {
50
- transferredSize: 0,
51
- lastChunkSent: 0
52
- };
53
43
  const totalChunks = Math.ceil(fileDetails.size / this.chunkSize);
54
44
  this.activeTransfers.set(transferId, {
55
45
  totalChunks,
56
- transferredSize: recoveredTransferState.transferredSize,
57
- completedChunks: recoveredTransferState.lastChunkSent,
46
+ transferredSize: 0,
47
+ completedChunks: 0,
58
48
  activeChunks: 0,
59
49
  failedChunks: new Map(),
60
- currentChunk: recoveredTransferState.lastChunkSent,
50
+ currentChunk: 0,
61
51
  size: fileDetails.size
62
52
  });
63
53
  const updateProgress = () => {
@@ -67,7 +57,7 @@ class FileTransferManager {
67
57
  }
68
58
  };
69
59
  const exponentialBackoff = retryCount => Math.min(1000 * 2 ** retryCount, 10000);
70
- let nextExpectedChunk = recoveredTransferState.lastChunkSent;
60
+ let nextExpectedChunk = 0;
71
61
  const chunkBuffer = new Map();
72
62
  const sendChunk = async chunkIndex => {
73
63
  const start = chunkIndex * this.chunkSize;
@@ -145,25 +135,16 @@ class FileTransferManager {
145
135
  }
146
136
  }
147
137
  async function _startTransfer(file, transferId, fileDetails, originDetails, onSendChunk, onComplete, onProgress, onStart, onTiding, clientTide) {
148
- const recoveredTransferState = (await clientTide.emitEventWithResponse(originDetails.senderID, "get-client-transfer-state", "sent-current-transfer-state", {
149
- recipientID: originDetails.recipientID,
150
- senderID: originDetails.senderID,
151
- filePath: fileDetails.destinationPath,
152
- fileName: fileDetails.name
153
- }, 30000)) || {
154
- transferredSize: 0,
155
- lastChunkSent: 0
156
- };
157
138
  const totalChunks = Math.ceil(file.length / this.chunkSize);
158
- let nextExpectedChunk = recoveredTransferState.lastChunkSent;
139
+ let nextExpectedChunk = 0;
159
140
  const chunkBuffer = new Map();
160
141
  this.activeTransfers.set(transferId, {
161
142
  totalChunks,
162
- transferredSize: recoveredTransferState.transferredSize,
163
- completedChunks: recoveredTransferState.lastChunkSent,
143
+ transferredSize: 0,
144
+ completedChunks: 0,
164
145
  activeChunks: 0,
165
146
  failedChunks: new Map(),
166
- currentChunk: recoveredTransferState.lastChunkSent,
147
+ currentChunk: 0,
167
148
  size: fileDetails.size
168
149
  });
169
150
  const transferState = this.activeTransfers.get(transferId);
@@ -235,17 +216,15 @@ async function _startTransfer(file, transferId, fileDetails, originDetails, onSe
235
216
  }
236
217
  /*async #startTransfer(file, transferId, fileDetails, originDetails, onSendChunk, onComplete, onProgress, onStart, onTiding, clientTide)
237
218
  {
238
- const recoveredTransferState = await clientTide.emitEventWithResponse(originDetails.senderID, "get-client-transfer-state", "sent-current-transfer-state", { recipientID : originDetails.recipientID, senderID : originDetails.senderID, filePath : fileDetails.destinationPath, fileName : fileDetails.name }, 30000) || { transferredSize : 0, lastChunkSent : 0 };
239
-
240
219
  const totalChunks = Math.ceil(file.length / this.chunkSize);
241
220
 
242
221
  this.activeTransfers.set(transferId, {
243
222
  totalChunks,
244
- transferredSize : recoveredTransferState.transferredSize,
245
- completedChunks : recoveredTransferState.lastChunkSent,
223
+ transferredSize : 0,
224
+ completedChunks : 0,
246
225
  activeChunks : 0,
247
226
  failedChunks : new Map(),
248
- currentChunk : recoveredTransferState.lastChunkSent,
227
+ currentChunk : 0,
249
228
  size : fileDetails.size
250
229
  });
251
230
  const updateProgress = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trap_stevo/filetide",
3
- "version": "0.0.80",
3
+ "version": "0.0.82",
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": {
@@ -36,11 +36,11 @@
36
36
  "license": "See License in LICENSE.md",
37
37
  "dependencies": {
38
38
  "@trap_stevo/iotide": "^0.0.46",
39
- "@trap_stevo/iotide-client": "^0.0.26",
40
- "@trap_stevo/legendarybuilderpronodejs-utilities": "^1.0.49",
39
+ "@trap_stevo/iotide-client": "^0.0.27",
40
+ "@trap_stevo/legendarybuilderpronodejs-utilities": "^1.0.51",
41
41
  "@trap_stevo/lockline": "^0.0.11",
42
- "@trap_stevo/logictide": "^0.0.1",
43
- "@trap_stevo/metrictide": "^0.0.7",
42
+ "@trap_stevo/logictide": "^0.0.2",
43
+ "@trap_stevo/metrictide": "^0.0.10",
44
44
  "@trap_stevo/timelyst": "^0.0.7",
45
45
  "chalk": "^4.1.2",
46
46
  "readline": "^1.3.0"
@@ -1,8 +0,0 @@
1
- "use strict";
2
-
3
- const LogicTide = require("@trap_stevo/logictide");
4
-
5
- // ~ Universal FileTide Environment Mode ~
6
-
7
- const productionMode = true;
8
- LogicTide.setMode(productionMode ? "production" : "development");
@@ -1,165 +0,0 @@
1
- "use strict";
2
-
3
- const chalk = require("chalk");
4
- const readline = require("readline");
5
- let progressBars = [];
6
- let logs = [];
7
- let logOutputStartLine = 0;
8
- const originalLog = console.log;
9
- console.log = function (...args) {
10
- logs.push(args.join(" "));
11
- logOutputStartLine = progressBars.length * 2;
12
- logs.forEach((log, index) => {
13
- readline.cursorTo(process.stdout, 0, logOutputStartLine + index);
14
- process.stdout.clearLine();
15
- process.stdout.write(log);
16
- });
17
- progressBars.forEach((bar, index) => {
18
- if (!bar.completed) bar.render(index);
19
- });
20
- };
21
- class ConsoleProgressBar {
22
- constructor({
23
- name = "Process",
24
- total = 100,
25
- useGradient = true,
26
- completedColor = "green",
27
- remainingColor = "gray",
28
- barLength = 40,
29
- showPercentage = true,
30
- showCount = true,
31
- completedChar = "■",
32
- remainingChar = " ",
33
- leftBorder = "|",
34
- rightBorder = "|",
35
- textColor = "white",
36
- boldText = true,
37
- smoothUpdate = false,
38
- animationSpeed = 100,
39
- customFormatter = null,
40
- titleAlignment = "center",
41
- progressAlignment = "right",
42
- completionMessage = null
43
- } = {}) {
44
- this.name = name;
45
- this.total = total;
46
- this.current = 0;
47
- this.useGradient = useGradient;
48
- this.completedColor = completedColor;
49
- this.remainingColor = remainingColor;
50
- this.barLength = barLength;
51
- this.showPercentage = showPercentage;
52
- this.showCount = showCount;
53
- this.completedChar = completedChar;
54
- this.remainingChar = remainingChar;
55
- this.leftBorder = leftBorder;
56
- this.rightBorder = rightBorder;
57
- this.textColor = textColor;
58
- this.boldText = boldText;
59
- this.smoothUpdate = smoothUpdate;
60
- this.animationSpeed = animationSpeed;
61
- this.customFormatter = customFormatter;
62
- this.titleAlignment = titleAlignment;
63
- this.progressAlignment = progressAlignment;
64
- this.completionMessage = completionMessage;
65
- this.completed = false;
66
- this.initialized = false;
67
- progressBars.push(this);
68
- logOutputStartLine = progressBars.length * 2;
69
- }
70
- validateColor(color, defaultColor = "gray") {
71
- try {
72
- return chalk.keyword(color);
73
- } catch {
74
- return chalk.keyword(defaultColor);
75
- }
76
- }
77
- formatText(text) {
78
- let formattedText = this.validateColor(this.textColor)(text);
79
- if (this.boldText) {
80
- formattedText = chalk.bold(formattedText);
81
- }
82
- return formattedText;
83
- }
84
- getGradientBar(fraction) {
85
- const completed = Math.round(fraction * this.barLength);
86
- const completedColor = this.validateColor(this.completedColor);
87
- const remainingColor = this.validateColor(this.remainingColor);
88
- const barArray = Array.from({
89
- length: this.barLength
90
- }, (_, i) => i < completed ? completedColor(this.completedChar) : remainingColor(this.remainingChar));
91
- return this.leftBorder + barArray.join("") + this.rightBorder;
92
- }
93
- getNormalBar(fraction) {
94
- const completed = Math.round(fraction * this.barLength);
95
- const completedColor = this.validateColor(this.completedColor);
96
- const remainingColor = this.validateColor(this.remainingColor);
97
- return this.leftBorder + completedColor(this.completedChar.repeat(completed)) + remainingColor(this.remainingChar.repeat(this.barLength - completed)) + this.rightBorder;
98
- }
99
- getCenteredText(text, length) {
100
- const padding = Math.max(0, Math.floor((length - text.length) / 2));
101
- return " ".repeat(padding) + text + " ".repeat(padding);
102
- }
103
- alignText(text, alignment, totalLength) {
104
- if (alignment === "center") {
105
- return this.getCenteredText(text, totalLength);
106
- } else if (alignment === "right") {
107
- return text.padStart(totalLength);
108
- }
109
- return text;
110
- }
111
- renderTitle(index) {
112
- if (!this.initialized) {
113
- const titleText = this.alignText(this.name, this.titleAlignment, this.barLength);
114
- const titlePosition = index * 2;
115
- readline.cursorTo(process.stdout, 0, titlePosition);
116
- process.stdout.clearLine();
117
- process.stdout.write(this.formatText(titleText));
118
- this.initialized = true;
119
- }
120
- }
121
- render(index) {
122
- if (this.completed) return;
123
- const fraction = Math.min(this.current / this.total, 1);
124
- const percentage = Math.round(fraction * 100);
125
- const bar = this.useGradient ? this.getGradientBar(fraction) : this.getNormalBar(fraction);
126
- let progressText = "";
127
- if (this.showPercentage || this.showCount) {
128
- progressText = `${this.showPercentage ? `${percentage}% ` : ""}${this.showCount ? `(${this.current} / ${this.total})` : ""}`;
129
- }
130
- if (this.customFormatter) {
131
- progressText = this.customFormatter(this.name, bar, percentage, this.current, this.total);
132
- }
133
- const barWithProgress = `${bar} ${progressText}`;
134
- const barPosition = index * 2 + 1;
135
- readline.cursorTo(process.stdout, 0, barPosition);
136
- process.stdout.clearLine();
137
- process.stdout.write(this.formatText(barWithProgress));
138
- }
139
- renderCompletionMessage() {
140
- const message = this.completionMessage ? this.completionMessage : `${this.name} complete!`;
141
- console.log(this.formatText(message));
142
- }
143
- update(current) {
144
- this.current = Math.min(current, this.total);
145
- const index = progressBars.indexOf(this);
146
- this.renderTitle(index);
147
- if (this.current >= this.total) {
148
- if (!this.completed) {
149
- this.completed = true;
150
- this.renderCompletionMessage();
151
- setTimeout(() => {
152
- progressBars.splice(index, 1);
153
- ConsoleProgressBar.updateLogPosition();
154
- }, 500);
155
- }
156
- } else {
157
- this.render(index);
158
- }
159
- }
160
- static updateLogPosition() {
161
- logOutputStartLine = progressBars.length * 2;
162
- progressBars.forEach((bar, index) => bar.render(index));
163
- }
164
- }
165
- module.exports = ConsoleProgressBar;
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- const currentOnlineClients = new Map();
4
- class FileNetConfigManager {
5
- static addOnlineClient(clientID, pClientID, tideID) {
6
- if (currentOnlineClients.get(pClientID)) {
7
- currentOnlineClients.delete(pClientID);
8
- }
9
- currentOnlineClients.set(clientID, {
10
- pClientID: pClientID || "",
11
- clientID,
12
- tideID
13
- });
14
- return currentOnlineClients;
15
- }
16
- static clearOnlineClient(clientID, tideID) {
17
- if (!currentOnlineClients.get(clientID)) {
18
- return currentOnlineClients;
19
- }
20
- currentOnlineClients.delete(clientID);
21
- return currentOnlineClients;
22
- }
23
- static getOnlineClient(clientID) {
24
- if (!currentOnlineClients.get(clientID)) {
25
- return null;
26
- }
27
- return currentOnlineClients.get(clientID);
28
- }
29
- }
30
- module.exports = {
31
- FileNetConfigManager
32
- };
@@ -1,93 +0,0 @@
1
- "use strict";
2
-
3
- const path = require("path");
4
- const fs = require("fs");
5
- class FileTransferRecoveryManager {
6
- constructor(storagePath = `${process.cwd()}/transfer_states`) {
7
- if (FileTransferRecoveryManager.instance) {
8
- return FileTransferRecoveryManager.instance;
9
- }
10
- this.storagePath = storagePath;
11
- this.memoryStorage = new Map();
12
- this.ensureStorageDirectory();
13
- FileTransferRecoveryManager.instance = this;
14
- }
15
- ensureStorageDirectory() {
16
- if (!fs.existsSync(this.storagePath)) {
17
- fs.mkdirSync(this.storagePath, {
18
- recursive: true
19
- });
20
- }
21
- }
22
- sanitizeFileName(fileName) {
23
- return fileName.replace(/[^a-zA-Z0-9-_\.]/g, "-").replace(/-+/g, "-").trim();
24
- }
25
- generateKey(clientName, senderName, filePath) {
26
- const normalizedPath = this.sanitizeFileName(filePath);
27
- return `${clientName}_${senderName}_${normalizedPath}.json`;
28
- }
29
- getStorageFilePath(clientName, senderName, filePath) {
30
- return path.join(this.storagePath, this.generateKey(clientName, senderName, filePath));
31
- }
32
- saveTransferState(clientName, senderName, filePath, chunkIndex, transferredSize) {
33
- const key = this.generateKey(clientName, senderName, filePath);
34
- const transferState = {
35
- transferredSize,
36
- senderName,
37
- clientName,
38
- filePath,
39
- lastChunkSent: chunkIndex
40
- };
41
- this.memoryStorage.set(key, transferState);
42
- }
43
- saveToDisk(clientName, senderName, filePath) {
44
- const key = this.generateKey(clientName, senderName, filePath);
45
- const storageFile = this.getStorageFilePath(clientName, senderName, filePath);
46
- const transferState = this.memoryStorage.get(key);
47
- if (transferState) {
48
- try {
49
- fs.writeFileSync(storageFile, JSON.stringify(transferState, null, 2));
50
- console.log(`Saved transfer state to disk ~ ${storageFile}`);
51
- } catch (error) {
52
- console.error(`Error saving transfer state for ${key} ~ ${error.message}`);
53
- }
54
- }
55
- }
56
- getTransferState(clientName, senderName, filePath) {
57
- const key = this.generateKey(clientName, senderName, filePath);
58
- if (this.memoryStorage.has(key)) {
59
- return this.memoryStorage.get(key);
60
- }
61
- const storageFile = this.getStorageFilePath(clientName, senderName, filePath);
62
- if (fs.existsSync(storageFile)) {
63
- const transferState = JSON.parse(fs.readFileSync(storageFile, "utf-8"));
64
- return transferState;
65
- }
66
- return null;
67
- }
68
- getLastChunk(clientName, senderName, filePath) {
69
- const transferState = this.getTransferState(clientName, senderName, filePath);
70
- return transferState ? transferState.lastChunkSent : null;
71
- }
72
- clearTransferState(clientName, senderName, filePath) {
73
- const key = this.generateKey(clientName, senderName, filePath);
74
- this.memoryStorage.delete(key);
75
- const storageFile = this.getStorageFilePath(clientName, senderName, filePath);
76
- if (fs.existsSync(storageFile)) {
77
- fs.unlinkSync(storageFile);
78
- }
79
- }
80
- flushToDisk() {
81
- for (const [key, state] of this.memoryStorage.entries()) {
82
- const {
83
- clientName,
84
- senderName,
85
- filePath
86
- } = state;
87
- console.log("Saving current state ~ ", key);
88
- this.saveToDisk(clientName, senderName, filePath);
89
- }
90
- ;
91
- }
92
- }
93
- module.exports = new FileTransferRecoveryManager();