@trap_stevo/filetide 0.0.42 → 0.0.44

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.
@@ -211,15 +211,23 @@ class FileMessager {
211
211
  totalChunks
212
212
  } = chunkData;
213
213
  console.log(`[FileTide ~ File Messager] ~ Transferring file ~ ${fileName} | chunk ${chunkIndex + 1} >> ${completedChunks} of ${totalChunks} to client (${recipientId})`);
214
+ const recipientClient = FileNetClientManager.getOnlineClient(recipientId);
215
+ const senderClient = FileNetClientManager.getOnlineClient(senderID);
214
216
  this.sendFileChunkToClient({
215
217
  userID: senderID,
216
- id: FileNetClientManager.getOnlineClient(senderID).id
218
+ id: senderClient.id
217
219
  }, {
218
220
  userID: recipientId,
219
- id: FileNetClientManager.getOnlineClient(recipientId).id
221
+ id: recipientClient.id
220
222
  }, fileChunk, fileName, chunkIndex, chunkSize, totalChunks, filePath, fileSize);
221
223
  if (completedChunks === totalChunks) {
222
- this.fileNet.emit("transfer-complete", {
224
+ this.fileNet.emitToTide(recipientClient.tideID, "transfer-complete", {
225
+ senderID,
226
+ recipientId,
227
+ fileName,
228
+ filePath
229
+ });
230
+ this.fileNet.emitToTide(senderClient.tideID, "transfer-complete", {
223
231
  senderID,
224
232
  recipientId,
225
233
  fileName,
@@ -228,7 +236,7 @@ class FileMessager {
228
236
  console.log(`[FileTide ~ File Messager] ~ File transfer completed: ${fileName} from ${senderID} to ${recipientId}`);
229
237
  const tidingTransfers = this.currentTidingTransfers.get(senderID);
230
238
  if (tidingTransfers) {
231
- tidingTransfers.delete(recipientId);
239
+ tidingTransfers.delete(senderID);
232
240
  }
233
241
  }
234
242
  }
@@ -247,15 +255,23 @@ class FileMessager {
247
255
  totalChunks
248
256
  } = transferData;
249
257
  console.log(`[FileTide ~ File Messager] ~ Transferring file ~ ${fileName} | chunk ${chunkIndex + 1} >> ${completedChunks} of ${totalChunks} to client (${recipientId})`);
258
+ const recipientClient = FileNetClientManager.getOnlineClient(recipientId);
259
+ const senderClient = FileNetClientManager.getOnlineClient(senderID);
250
260
  this.sendFileChunkToClient({
251
261
  userID: senderID,
252
- id: FileNetClientManager.getOnlineClient(senderID).id
262
+ id: senderClient.id
253
263
  }, {
254
264
  userID: recipientId,
255
- id: FileNetClientManager.getOnlineClient(recipientId).id
265
+ id: recipientClient.id
256
266
  }, fileChunk, fileName, chunkIndex, chunkSize, totalChunks, filePath, fileSize);
257
267
  if (chunkIndex + 1 === totalChunks) {
258
- this.fileNet.emit("transfer-complete", {
268
+ this.fileNet.emitToTide(recipientClient.tideID, "transfer-complete", {
269
+ senderID,
270
+ recipientId,
271
+ fileName,
272
+ filePath
273
+ });
274
+ this.fileNet.emitToTide(senderClient.tideID, "transfer-complete", {
259
275
  senderID,
260
276
  recipientId,
261
277
  fileName,
@@ -264,7 +280,7 @@ class FileMessager {
264
280
  console.log(`[FileTide ~ File Messager] ~ File transfer completed: ${fileName} from ${senderID} to ${recipientId}`);
265
281
  const tidingTransfers = this.currentTidingTransfers.get(senderID);
266
282
  if (tidingTransfers) {
267
- tidingTransfers.delete(recipientId);
283
+ tidingTransfers.delete(senderID);
268
284
  }
269
285
  }
270
286
  } catch (error) {
@@ -474,18 +490,23 @@ class FileMessager {
474
490
  const currentOnlineClients = Object.fromEntries(FileNetClientManager.getOnlineClients());
475
491
  this.fileNet.emit("current-online-clients", currentOnlineClients);
476
492
  this.fileNet.emit("current-clients", currentOnlineClients);
477
- this.fileNet.emit("save-current-transfer-states", {
493
+ const senderClient = this.getClientFromID(clientDetails.id);
494
+ this.fileNet.emitToTide(senderClient.tideID, "save-current-transfer-states", {
478
495
  clientID: clientData.clientID
479
496
  });
480
497
  const tidingTransfers = this.currentTidingTransfers.get(clientData.clientID);
481
498
  if (tidingTransfers && tidingTransfers.size > 0) {
482
499
  for (let recipientID of tidingTransfers.keys()) {
483
- this.fileNet.emit("save-current-transfer-states", {
484
- clientID: recipientID
485
- });
500
+ const recipientConnectionID = FileNetClientManager.getOnlineClient(data.recipientID).id;
501
+ const client = this.getClientFromID(recipientConnectionID);
502
+ if (client) {
503
+ this.fileNet.emitToTide(client.tideID, "save-current-transfer-states", {
504
+ clientID: recipientID
505
+ });
506
+ }
486
507
  }
508
+ this.currentTidingTransfers.delete(clientData.clientID);
487
509
  }
488
- this.currentTidingTransfers.delete(clientData.clientID);
489
510
  } catch (error) {
490
511
  console.log(`[FileTide ~ Net Activity] ~ Did not process client ~ ${clientData} offline signal ~ ${error}`);
491
512
  }
@@ -170,13 +170,14 @@ class FileMessagerClient {
170
170
  });
171
171
  }
172
172
  this.transporter.sendFile(file, {
173
- onSendChunk: (transferId, chunkIndex, chunkSize, chunkData, totalChunks) => {
173
+ onSendChunk: (transferId, chunkIndex, chunkSize, chunkData, totalChunks, completedChunks) => {
174
174
  return new Promise((resolve, reject) => {
175
175
  this.clientTide.emitEvent(clientID, "client-to-client-transfer", {
176
176
  senderID: clientID,
177
177
  recipientId,
178
178
  fileName,
179
179
  fileChunk: chunkData,
180
+ completedChunks,
180
181
  totalChunks,
181
182
  chunkIndex,
182
183
  chunkSize,
@@ -188,6 +189,7 @@ class FileMessagerClient {
188
189
  },
189
190
  onComplete: () => {
190
191
  return new Promise((resolve, reject) => {
192
+ FileTransferRecoveryManager.clearTransferState(clientID, recipientId, `${filePath}-${fileName}`);
191
193
  this.clientTide.emitEvent(clientID, "transfer-complete", {
192
194
  senderID: clientID,
193
195
  recipientId,
@@ -293,6 +295,7 @@ class FileMessagerClient {
293
295
  });
294
296
  chunkBatch.length = 0;
295
297
  }
298
+ FileTransferRecoveryManager.clearTransferState(clientID, recipientId, `${filePath}-${fileName}`);
296
299
  this.clientTide.emitEvent(clientID, "transfer-complete", {
297
300
  senderID: clientID,
298
301
  recipientId,
@@ -357,6 +360,7 @@ class FileMessagerClient {
357
360
  },
358
361
  onComplete: () => {
359
362
  return new Promise((resolve, reject) => {
363
+ FileTransferRecoveryManager.clearTransferState(clientID, recipientId, `${filePath}-${fileName}`);
360
364
  this.clientTide.emitEvent(clientID, "transfer-complete", {
361
365
  senderID: clientID,
362
366
  recipientId,
@@ -113,6 +113,9 @@ class FileTide {
113
113
  getTidePath(inputPath) {
114
114
  return FileUtilityManager.getTidePath(inputPath);
115
115
  }
116
+ getTidingTransferStates() {
117
+ return FileTransferRecoveryManager.memoryStorage;
118
+ }
116
119
  saveTransferStates() {
117
120
  FileTransferRecoveryManager.flushToDisk();
118
121
  }
@@ -481,7 +484,6 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
481
484
  _FileTide.outputGradient(`[${userID}] File transfer complete : ${data.fileName}`, significantMessageColors);
482
485
  const transferState = fileTransferReceiver.activeTransfers.get(data.fileName);
483
486
  if (!transferState) {
484
- FileTransferRecoveryManager.clearTransferState(userID, data.senderID, `${data.filePath}-${data.fileName}`);
485
487
  return;
486
488
  }
487
489
  fileTransferReceiver.completeTransfer(data, (transferData, transfers, success, error) => {
@@ -178,6 +178,7 @@ async function _startTransfer(file, transferId, fileDetails, originDetails, onSe
178
178
  transferState.activeChunks++;
179
179
  try {
180
180
  await onSendChunk(transferId, chunkIndex, this.chunkSize, chunk, transferState.totalChunks, transferState.completedChunks + 1);
181
+ transferState.transferredSize += this.chunkSize;
181
182
  transferState.completedChunks++;
182
183
  transferState.activeChunks--;
183
184
  updateProgress();
@@ -190,7 +191,7 @@ async function _startTransfer(file, transferId, fileDetails, originDetails, onSe
190
191
  resolve();
191
192
  }
192
193
  } catch (error) {
193
- console.error(`Did not send chunk ${chunkIndex} ~ ${error.message}`);
194
+ console.error(`[FileTide ~ File Messager] ~ Did not send chunk ${chunkIndex} ~ ${error.message}`);
194
195
  transferState.activeChunks--;
195
196
  const retryCount = (transferState.failedChunks.get(chunkIndex) || 0) + 1;
196
197
  if (retryCount > this.maxRetries) {
@@ -47,9 +47,9 @@ class FileTransferRecoveryManager {
47
47
  if (transferState) {
48
48
  try {
49
49
  fs.writeFileSync(storageFile, JSON.stringify(transferState, null, 2));
50
- console.log(`Saved transfer state to disk: ${storageFile}`);
50
+ console.log(`Saved transfer state to disk ~ ${storageFile}`);
51
51
  } catch (error) {
52
- console.error(`Error saving transfer state for ${key}: ${error.message}`);
52
+ console.error(`Error saving transfer state for ${key} ~ ${error.message}`);
53
53
  }
54
54
  }
55
55
  }
@@ -84,7 +84,7 @@ class FileTransferRecoveryManager {
84
84
  senderName,
85
85
  filePath
86
86
  } = state;
87
- console.log("Saving current state ~ ", state);
87
+ console.log("Saving current state ~ ", key);
88
88
  this.saveToDisk(clientName, senderName, filePath);
89
89
  }
90
90
  ;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trap_stevo/filetide",
3
- "version": "0.0.42",
3
+ "version": "0.0.44",
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": {
@@ -1,379 +0,0 @@
1
- "use strict";
2
-
3
- const {
4
- HUDIoTide
5
- } = require("@trap_stevo/iotide-client");
6
- const IoTide = require("@trap_stevo/iotide");
7
- const Loml = require("@trap_stevo/loml");
8
- class LomlLoggingSystem {
9
- constructor(config = {}, ...args) {
10
- this.lomlLogging = null;
11
- this.clientInstance = config.clientInstance || false;
12
- this.serverInstance = config.serverInstance || false;
13
- this.setupIoTideInstance(config.lomlLoggingSystemOptions, ...args);
14
- if (this.clientInstance) {
15
- this.lomlLoggerClient = new HUDIoTide();
16
- this.initializeClient(config.clientOptions);
17
- }
18
- if (this.serverInstance) {
19
- this.lomlLogging.on("external-log", data => {
20
- this.processExternalLog(data);
21
- });
22
- }
23
- }
24
- setupIoTideInstance(lomlLoggingSystemOptions, ...args) {
25
- if (this.serverInstance) {
26
- this.lomlLogging = new IoTide(lomlLoggingSystemOptions.port || 3069, lomlLoggingSystemOptions.options || {}, ...args);
27
- this.lomlLogging.server.listen(lomlLoggingSystemOptions.port || 3069, "0.0.0.0", () => {
28
- console.log(`LomlLoggingSystem ~ ${lomlLoggingSystemOptions.port || 3069}`);
29
- });
30
- }
31
- }
32
- initializeClient(clientOptions) {
33
- const {
34
- socketName,
35
- url,
36
- options,
37
- onConnect
38
- } = clientOptions;
39
- this.lomlLoggerClient.createIO(socketName, url, options);
40
- this.lomlLoggerClient.onEvent(socketName, "connect", () => {
41
- console.log("Connected to the LomlLoggingSystem!");
42
- if (onConnect) {
43
- onConnect(this.lomlLoggerClient);
44
- }
45
- });
46
- }
47
- processExternalLog(data) {
48
- const {
49
- roomName,
50
- tideID,
51
- text,
52
- styles,
53
- colors,
54
- direction,
55
- href,
56
- tag,
57
- type,
58
- protocol
59
- } = data;
60
- const loml = new Loml();
61
- let formattedMessage;
62
- switch (type) {
63
- case "text":
64
- formattedMessage = loml.text(text, styles).build();
65
- break;
66
- case "bold":
67
- formattedMessage = loml.bold(text, styles).build();
68
- break;
69
- case "italic":
70
- formattedMessage = loml.italic(text, styles).build();
71
- break;
72
- case "link":
73
- formattedMessage = loml.link(text, href, styles).build();
74
- break;
75
- case "color":
76
- formattedMessage = loml.color(text, styles.color, styles).build();
77
- break;
78
- case "gradientText":
79
- formattedMessage = loml.gradientText(text, colors, direction, styles).build();
80
- break;
81
- case "customElement":
82
- formattedMessage = loml.element(tag, text, styles).build();
83
- break;
84
- default:
85
- formattedMessage = loml.text(text, styles).build();
86
- }
87
- if (protocol && protocol === "system") {
88
- this.lomlLogging.emitTide("log", {
89
- message: formattedMessage
90
- });
91
- return formattedMessage;
92
- }
93
- if (roomName) {
94
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
95
- message: formattedMessage
96
- });
97
- return formattedMessage;
98
- }
99
- this.lomlLogging.emit("log", {
100
- message: formattedMessage
101
- });
102
- return formattedMessage;
103
- }
104
- logToAll(text, styles = {}) {
105
- const loml = new Loml();
106
- const formattedMessage = loml.text(text, styles).build();
107
- this.lomlLogging.emit("log", {
108
- message: formattedMessage
109
- });
110
- return formattedMessage;
111
- }
112
- logToRoom(tideID, roomName, text, styles = {}) {
113
- const loml = new Loml();
114
- const formattedMessage = loml.text(text, styles).build();
115
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
116
- message: formattedMessage
117
- });
118
- return formattedMessage;
119
- }
120
- logBoldToAll(text, styles = {}) {
121
- const loml = new Loml();
122
- const formattedMessage = loml.bold(text, styles).build();
123
- this.lomlLogging.emit("log", {
124
- message: formattedMessage
125
- });
126
- return formattedMessage;
127
- }
128
- logBoldToRoom(tideID, roomName, text, styles = {}) {
129
- const loml = new Loml();
130
- const formattedMessage = loml.bold(text, styles).build();
131
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
132
- message: formattedMessage
133
- });
134
- return formattedMessage;
135
- }
136
- logItalicToAll(text, styles = {}) {
137
- const loml = new Loml();
138
- const formattedMessage = loml.italic(text, styles).build();
139
- this.lomlLogging.emit("log", {
140
- message: formattedMessage
141
- });
142
- return formattedMessage;
143
- }
144
- logItalicToRoom(tideID, roomName, text, styles = {}) {
145
- const loml = new Loml();
146
- const formattedMessage = loml.italic(text, styles).build();
147
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
148
- message: formattedMessage
149
- });
150
- return formattedMessage;
151
- }
152
- logLinkToAll(text, href, styles = {}) {
153
- const loml = new Loml();
154
- const formattedMessage = loml.link(text, href, styles).build();
155
- this.lomlLogging.emit("log", {
156
- message: formattedMessage
157
- });
158
- return formattedMessage;
159
- }
160
- logLinkToRoom(tideID, roomName, text, href, styles = {}) {
161
- const loml = new Loml();
162
- const formattedMessage = loml.link(text, href, styles).build();
163
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
164
- message: formattedMessage
165
- });
166
- return formattedMessage;
167
- }
168
- logColorToAll(text, color, styles = {}) {
169
- const loml = new Loml();
170
- const formattedMessage = loml.color(text, color, styles).build();
171
- this.lomlLogging.emit("log", {
172
- message: formattedMessage
173
- });
174
- return formattedMessage;
175
- }
176
- logColorToRoom(tideID, roomName, text, color, styles = {}) {
177
- const loml = new Loml();
178
- const formattedMessage = loml.color(text, color, styles).build();
179
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
180
- message: formattedMessage
181
- });
182
- return formattedMessage;
183
- }
184
- logGradientTextToRoom(tideID, roomName, text, colors, direction = "to right", styles = {}) {
185
- const loml = new Loml();
186
- const formattedMessage = loml.gradientText(text, colors, direction, styles).build();
187
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
188
- message: formattedMessage
189
- });
190
- return formattedMessage;
191
- }
192
- logGradientTextToAll(text, colors, direction = "to right", styles = {}) {
193
- const loml = new Loml();
194
- const formattedMessage = loml.gradientText(text, colors, direction, styles).build();
195
- this.lomlLogging.emit("log", {
196
- message: formattedMessage
197
- });
198
- return formattedMessage;
199
- }
200
- logCustomElementToAll(tag, text, styles = {}) {
201
- const loml = new Loml();
202
- const formattedMessage = loml.element(tag, text, styles).build();
203
- this.lomlLogging.emit("log", {
204
- message: formattedMessage
205
- });
206
- return formattedMessage;
207
- }
208
- logCustomElementToRoom(tideID, roomName, tag, text, styles = {}) {
209
- const loml = new Loml();
210
- const formattedMessage = loml.element(tag, text, styles).build();
211
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
212
- message: formattedMessage
213
- });
214
- return formattedMessage;
215
- }
216
- logLineBreakToAll() {
217
- const loml = new Loml();
218
- const formattedMessage = loml.br().build();
219
- this.lomlLogging.emit("log", {
220
- message: formattedMessage
221
- });
222
- return formattedMessage;
223
- }
224
- logLineBreakToRoom(tideID, roomName) {
225
- const loml = new Loml();
226
- const formattedMessage = loml.br().build();
227
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
228
- message: formattedMessage
229
- });
230
- return formattedMessage;
231
- }
232
- logStyledMessageToAll(messageParts) {
233
- const loml = new Loml();
234
- messageParts.forEach(part => {
235
- if (typeof loml[part.method] === "function") {
236
- loml[part.method](...part.args);
237
- }
238
- });
239
- const formattedMessage = loml.build();
240
- this.lomlLogging.emit("log", {
241
- message: formattedMessage
242
- });
243
- return formattedMessage;
244
- }
245
- logStyledMessageToRoom(tideID, roomName, messageParts) {
246
- const loml = new Loml();
247
- messageParts.forEach(part => {
248
- if (typeof loml[part.method] === "function") {
249
- loml[part.method](...part.args);
250
- }
251
- });
252
- const formattedMessage = loml.build();
253
- this.lomlLogging.emitToChannel(tideID, roomName, "log", {
254
- message: formattedMessage
255
- });
256
- return formattedMessage;
257
- }
258
- logTextToSystem(text, styles = {}) {
259
- const loml = new Loml();
260
- const formattedMessage = loml.text(text, styles).build();
261
- this.lomlLogging.emitTide("log", {
262
- message: formattedMessage
263
- });
264
- return formattedMessage;
265
- }
266
- logBoldToSystem(text, styles = {}) {
267
- const loml = new Loml();
268
- const formattedMessage = loml.bold(text, styles).build();
269
- this.lomlLogging.emitTide("log", {
270
- message: formattedMessage
271
- });
272
- return formattedMessage;
273
- }
274
- logItalicToSystem(text, styles = {}) {
275
- const loml = new Loml();
276
- const formattedMessage = loml.italic(text, styles).build();
277
- this.lomlLogging.emitTide("log", {
278
- message: formattedMessage
279
- });
280
- return formattedMessage;
281
- }
282
- logLinkToSystem(text, href, styles = {}) {
283
- const loml = new Loml();
284
- const formattedMessage = loml.link(text, href, styles).build();
285
- this.lomlLogging.emitTide("log", {
286
- message: formattedMessage
287
- });
288
- return formattedMessage;
289
- }
290
- logColorToSystem(text, color, styles = {}) {
291
- const loml = new Loml();
292
- const formattedMessage = loml.color(text, color, styles).build();
293
- this.lomlLogging.emitTide("log", {
294
- message: formattedMessage
295
- });
296
- return formattedMessage;
297
- }
298
- logGradientTextToSystem(text, colors, direction = "to right", styles = {}) {
299
- const loml = new Loml();
300
- const formattedMessage = loml.gradientText(text, colors, direction, styles).build();
301
- this.lomlLogging.emitTide("log", {
302
- message: formattedMessage
303
- });
304
- return formattedMessage;
305
- }
306
- logCustomElementToSystem(tag, text, styles = {}) {
307
- const loml = new Loml();
308
- const formattedMessage = loml.element(tag, text, styles).build();
309
- this.lomlLogging.emitTide("log", {
310
- message: formattedMessage
311
- });
312
- return formattedMessage;
313
- }
314
- logLineBreakToSystem() {
315
- const loml = new Loml();
316
- const formattedMessage = loml.br().build();
317
- this.lomlLogging.emitTide("log", {
318
- message: formattedMessage
319
- });
320
- return formattedMessage;
321
- }
322
- logStyledMessageToSystem(messageParts) {
323
- const loml = new Loml();
324
- messageParts.forEach(part => {
325
- if (typeof loml[part.method] === "function") {
326
- loml[part.method](...part.args);
327
- }
328
- });
329
- const formattedMessage = loml.build();
330
- this.lomlLogging.emitTide("log", {
331
- message: formattedMessage
332
- });
333
- return formattedMessage;
334
- }
335
- static log(options = {}) {
336
- const {
337
- text = "Sample text",
338
- type = "text",
339
- direction = "to right",
340
- colors = [],
341
- styles = {},
342
- href = "",
343
- tag = "span",
344
- logToConsole = true
345
- } = options;
346
- const loml = new Loml();
347
- let formattedMessage;
348
- switch (type) {
349
- case "text":
350
- formattedMessage = loml.text(text, styles).build();
351
- break;
352
- case "bold":
353
- formattedMessage = loml.bold(text, styles).build();
354
- break;
355
- case "italic":
356
- formattedMessage = loml.italic(text, styles).build();
357
- break;
358
- case "link":
359
- formattedMessage = loml.link(text, href, styles).build();
360
- break;
361
- case "color":
362
- formattedMessage = loml.color(text, styles.color, styles).build();
363
- break;
364
- case "gradientText":
365
- formattedMessage = loml.gradientText(text, colors, direction, styles).build();
366
- break;
367
- case "customElement":
368
- formattedMessage = loml.element(tag, text, styles).build();
369
- break;
370
- default:
371
- formattedMessage = loml.text(text, styles).build();
372
- }
373
- if (logToConsole) {
374
- console.log(`${type.charAt(0).toUpperCase() + type.slice(1)} Log:`, formattedMessage);
375
- }
376
- return formattedMessage;
377
- }
378
- }
379
- module.exports = LomlLoggingSystem;