@trap_stevo/filetide 0.0.61 → 0.0.63

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.
Files changed (51) hide show
  1. package/dist/cjs/FileMessager.js +628 -17
  2. package/dist/cjs/FileMessagerClient.js +6 -3
  3. package/dist/cjs/FileTide.js +56 -1
  4. package/dist/cjs/HUDManagers/TidalyticsInstanceManager.js +69 -0
  5. package/dist/cjs/HUDManagers/TidalyticsManager.js +9 -0
  6. package/dist/cjs/HUDManagers/TideSentinelManager.js +143 -0
  7. package/filetide_core/.tidalytics/000005.ldb +0 -0
  8. package/filetide_core/.tidalytics/000008.ldb +0 -0
  9. package/filetide_core/.tidalytics/000011.ldb +0 -0
  10. package/filetide_core/.tidalytics/000014.ldb +0 -0
  11. package/filetide_core/.tidalytics/000017.ldb +0 -0
  12. package/filetide_core/.tidalytics/000020.ldb +0 -0
  13. package/filetide_core/.tidalytics/000023.ldb +0 -0
  14. package/filetide_core/.tidalytics/000026.ldb +0 -0
  15. package/filetide_core/.tidalytics/000029.ldb +0 -0
  16. package/filetide_core/.tidalytics/000032.ldb +0 -0
  17. package/filetide_core/.tidalytics/000035.ldb +0 -0
  18. package/filetide_core/.tidalytics/000038.ldb +0 -0
  19. package/filetide_core/.tidalytics/000041.ldb +0 -0
  20. package/filetide_core/.tidalytics/000044.ldb +0 -0
  21. package/filetide_core/.tidalytics/000047.ldb +0 -0
  22. package/filetide_core/.tidalytics/000050.ldb +0 -0
  23. package/filetide_core/.tidalytics/000053.ldb +0 -0
  24. package/filetide_core/.tidalytics/000056.ldb +0 -0
  25. package/filetide_core/.tidalytics/000059.ldb +0 -0
  26. package/filetide_core/.tidalytics/000062.ldb +0 -0
  27. package/filetide_core/.tidalytics/000065.ldb +0 -0
  28. package/filetide_core/.tidalytics/000068.ldb +0 -0
  29. package/filetide_core/.tidalytics/000071.ldb +0 -0
  30. package/filetide_core/.tidalytics/000074.ldb +0 -0
  31. package/filetide_core/.tidalytics/000077.ldb +0 -0
  32. package/filetide_core/.tidalytics/000080.ldb +0 -0
  33. package/filetide_core/.tidalytics/000083.ldb +0 -0
  34. package/filetide_core/.tidalytics/000086.ldb +0 -0
  35. package/filetide_core/.tidalytics/000089.ldb +0 -0
  36. package/filetide_core/.tidalytics/000090.log +0 -0
  37. package/filetide_core/.tidalytics/CURRENT +1 -0
  38. package/filetide_core/.tidalytics/LOCK +0 -0
  39. package/filetide_core/.tidalytics/LOG +0 -0
  40. package/filetide_core/.tidalytics/LOG.old +6 -0
  41. package/filetide_core/.tidalytics/MANIFEST-000088 +0 -0
  42. package/filetide_core/tide_sentinel/banned-tiders/000092.log +0 -0
  43. package/filetide_core/tide_sentinel/banned-tiders/CURRENT +1 -0
  44. package/filetide_core/tide_sentinel/banned-tiders/LOCK +0 -0
  45. package/filetide_core/tide_sentinel/banned-tiders/LOG +3 -0
  46. package/filetide_core/tide_sentinel/banned-tiders/LOG.old +3 -0
  47. package/filetide_core/tide_sentinel/banned-tiders/MANIFEST-000091 +0 -0
  48. package/iotide_client/tide_session_id.json +1 -0
  49. package/iotide_client/tide_session_ids.json +5 -0
  50. package/package.json +5 -3
  51. package/transfer_states/FileNetServer_FileNetClient_-Documents-TestFileTideDropZone-TidalCore.txt.json +7 -0
@@ -19,7 +19,11 @@ const {
19
19
  const {
20
20
  FileTransferManager
21
21
  } = require("./HUDManagers/FileTransferManager");
22
+ const TideSentinelManager = require("./HUDManagers/TideSentinelManager");
22
23
  const HUDTargetQueue = require("./HUDManagers/HUDTargetQueueManager");
24
+ const {
25
+ tidalytics
26
+ } = require("./HUDManagers/TidalyticsManager");
23
27
  var _FileMessager_brand = /*#__PURE__*/new WeakSet();
24
28
  class FileMessager {
25
29
  constructor(options = {
@@ -28,7 +32,7 @@ class FileMessager {
28
32
  }, transportOptions = {
29
33
  parallelChunks: 3,
30
34
  maxRetries: 3
31
- }, debugMode = false) {
35
+ }, onTideAction = null, debugMode = false, tideSentinelOptions = {}) {
32
36
  _classPrivateMethodInitSpec(this, _FileMessager_brand);
33
37
  const serverOptions = FileMessagerConfigManager.getServerOptions(options);
34
38
  this.transporter = new FileTransferManager(transportOptions);
@@ -36,9 +40,17 @@ class FileMessager {
36
40
  this.currentTransferBarrierTransfers = new Map();
37
41
  this.clientTransferBarriers = new Map();
38
42
  this.currentTidingTransfers = new Map();
43
+ this.tideSentinel = new TideSentinelManager(tideSentinelOptions);
44
+ this.tideSentinel.registerEntryAddedHook((key, entryData) => {
45
+ console.log(key, entryData);
46
+ });
39
47
  this.fileNet = new IoTide(serverOptions.port, serverOptions, true, this.onConnect.bind(this), this.onDisconnect.bind(this));
40
48
  this.onlineClients = new OmniMap();
49
+ this.onTideAction = onTideAction ?? (() => {});
41
50
  this.debugMode = debugMode;
51
+ this.tideSentinelOptions = tideSentinelOptions;
52
+ this.transporterOptions = transportOptions;
53
+ this.options = serverOptions;
42
54
  return;
43
55
  }
44
56
  onConnect(socket) {
@@ -51,6 +63,10 @@ class FileMessager {
51
63
  this.onlineClients.delete(socket.id);
52
64
  return;
53
65
  }
66
+ close() {
67
+ this.fileNet.close();
68
+ return;
69
+ }
54
70
  start() {
55
71
  this.fileNet.on("get-client-transfer-barrier-response", this.handleClientTransferBarrierResponse.bind(this));
56
72
  this.fileNet.on("get-client-transfer-state", this.handleGetClientTransferState.bind(this));
@@ -66,6 +82,7 @@ class FileMessager {
66
82
  this.fileNet.on("transfer-complete", this.handleFileTransferComplete.bind(this));
67
83
  this.fileNet.on("request-transfer-from-client", this.handleRequestTransferFromClient.bind(this));
68
84
  this.fileNet.on("client-to-client-transfer", this.handleClientToClientTransfer.bind(this));
85
+ this.fileNet.on("check-client-banned", this.handleCheckClientBanned.bind(this));
69
86
  this.fileNet.on("check-client-online", this.handleCheckClientOnline.bind(this));
70
87
  this.fileNet.on("client-offline", this.handleClientOffline.bind(this));
71
88
  this.fileNet.on("clients-online", this.handleClientsOnline.bind(this));
@@ -73,6 +90,140 @@ class FileMessager {
73
90
  this.fileNet.on("client-tiding", this.handleClientTiding.bind(this));
74
91
  return;
75
92
  }
93
+
94
+ // --- File Messager Tidalytics Management ---
95
+
96
+ async getTidalyticsSince(interval = "1d", source = "storage", filter = {}) {
97
+ return await tidalytics.getMetricsSince(interval, source, filter);
98
+ }
99
+ async getStoredTidalytics(filter = {}) {
100
+ return await tidalytics.getStoredMetrics(filter);
101
+ }
102
+ async getTidalyticsInDomain(domain, options = {}) {
103
+ return await tidalytics.getMetricsInDomain(domain, options);
104
+ }
105
+ getTidalytics(filter = {}) {
106
+ return tidalytics.getMetrics(filter);
107
+ }
108
+ getTidalyticByID(id) {
109
+ return tidalytics.getMetricByID(id);
110
+ }
111
+ searchTidalyticByTagValue(key, match) {
112
+ return tidalytics.searchByTagValue(key, match);
113
+ }
114
+ getTidalyticAggregate(name) {
115
+ return tidalytics.getAggregate(name);
116
+ }
117
+ getTidalyticAggregateByType(type) {
118
+ return tidalytics.getAggregateByType(type);
119
+ }
120
+ groupTidalyticByTag(tagKey) {
121
+ return tidalytics.groupByTag(tagKey);
122
+ }
123
+ getTidalyticTimeSeries(name, options = {}) {
124
+ return tidalytics.getTimeSeries(name, options);
125
+ }
126
+ predictTidalytic(name, config = {}) {
127
+ return tidalytics.predictMetric(name, config);
128
+ }
129
+ async clearTidalytics(domain, options = {}) {
130
+ return await tidalytics.clearMetricsInDomain(domain, options);
131
+ }
132
+ clearAllTidalytics() {
133
+ return tidalytics.clearAllMetrics();
134
+ }
135
+
136
+ // --- File Messager Tide Sentinel Management ---
137
+
138
+ banClient(clientID, options = {}) {
139
+ const result = this.tideSentinel.banClient(clientID, options);
140
+ tidalytics.track("tider:banned", {
141
+ value: 1,
142
+ tags: {
143
+ "tider:banned": "tider:banned",
144
+ "tider": "tider",
145
+ clientID
146
+ },
147
+ metadata: {
148
+ clientID,
149
+ options
150
+ }
151
+ });
152
+ this.onTideAction({
153
+ tideActionID: "ban-client-activated",
154
+ tideActionDate: Date.now(),
155
+ tideActionDetails: {
156
+ clientID,
157
+ options
158
+ }
159
+ });
160
+ return result;
161
+ }
162
+ unbanClient(clientID) {
163
+ const result = this.tideSentinel.unbanClient(clientID);
164
+ tidalytics.track("tider:unbanned", {
165
+ value: 1,
166
+ tags: {
167
+ "tider:unbanned": "tider:unbanned",
168
+ "tider": "tider",
169
+ clientID
170
+ },
171
+ metadata: {
172
+ clientID
173
+ }
174
+ });
175
+ this.onTideAction({
176
+ tideActionID: "unban-client-activated",
177
+ tideActionDate: Date.now(),
178
+ tideActionDetails: {
179
+ clientID
180
+ }
181
+ });
182
+ return result;
183
+ }
184
+ clientBanned(clientID) {
185
+ const result = this.tideSentinel.clientBanned(clientID);
186
+ return result;
187
+ }
188
+ getBanEntry(clientID) {
189
+ const result = this.tideSentinel.getBanEntry(clientID);
190
+ return result;
191
+ }
192
+ filterBannedClients(filter = {}) {
193
+ const result = this.tideSentinel.filterBannedClients(filter);
194
+ return result;
195
+ }
196
+ registerTideSentinelExpireHook(list, callback) {
197
+ const result = this.tideSentinel.registerExpireHook(list, callback);
198
+ return result;
199
+ }
200
+ addToTideList(list, key, data) {
201
+ const result = this.tideSentinel.addToList(list, key, data);
202
+ return result;
203
+ }
204
+ removeFromTideList(list, key) {
205
+ const result = this.tideSentinel.removeFromList(list, key);
206
+ return result;
207
+ }
208
+ inTideList(list, key) {
209
+ const result = this.tideSentinel.inList(list, key);
210
+ return result;
211
+ }
212
+ getEntry(list, key) {
213
+ const result = this.tideSentinel.getEntry(list, key);
214
+ return result;
215
+ }
216
+ filterTideList(list, filter = {}) {
217
+ const result = this.tideSentinel.filterList(list, filter);
218
+ return result;
219
+ }
220
+ findSimilarKeys(keyword, options = {}) {
221
+ const result = this.tideSentinel.findSimilarKeys(keyword, options);
222
+ return result;
223
+ }
224
+
225
+ // --- File Messager Client Management ---
226
+
76
227
  getClientFromID(clientID) {
77
228
  const client = this.onlineClients.get(clientID);
78
229
  if (!client) {
@@ -120,6 +271,40 @@ class FileMessager {
120
271
  path: filePath,
121
272
  fileSize
122
273
  });
274
+ tidalytics.track("tide:incoming-file", {
275
+ value: 1,
276
+ tags: {
277
+ "tide:incoming-file": "tide:incoming-file",
278
+ "tide": "tide",
279
+ recipientID: clientData.userID,
280
+ senderID: senderData.userID,
281
+ path: filePath,
282
+ fileSize,
283
+ fileName
284
+ },
285
+ metadata: {
286
+ recipientID: clientData.userID,
287
+ senderID: senderData.userID,
288
+ path: filePath,
289
+ fileSize,
290
+ fileName,
291
+ totalChunks,
292
+ chunkSize
293
+ }
294
+ });
295
+ this.onTideAction({
296
+ tideActionID: "tide-incoming-file",
297
+ tideActionDate: Date.now(),
298
+ tideActionDetails: {
299
+ recipientID: clientData.userID,
300
+ senderID: senderData.userID,
301
+ path: filePath,
302
+ fileSize,
303
+ fileName,
304
+ totalChunks,
305
+ chunkSize
306
+ }
307
+ });
123
308
  }
124
309
  this.fileNet.emitToTide(client.tideID, "transfer-progress", {
125
310
  senderName: senderData.userID,
@@ -148,6 +333,24 @@ class FileMessager {
148
333
  });
149
334
  }
150
335
  }
336
+ saveClientTransferStates(data) {
337
+ const tidingTransfers = this.currentTidingTransfers.get(data.clientID);
338
+ if (tidingTransfers && tidingTransfers.size > 0) {
339
+ for (let recipientID of tidingTransfers.keys()) {
340
+ const recipientConnectionID = FileNetClientManager.getOnlineClient(data.recipientID ?? recipientID).id;
341
+ const client = this.getClientFromID(recipientConnectionID);
342
+ if (client) {
343
+ this.fileNet.emitToTide(client.tideID, "save-current-transfer-states", {
344
+ clientID: recipientID
345
+ });
346
+ }
347
+ }
348
+ this.currentTidingTransfers.delete(data.clientID);
349
+ }
350
+ }
351
+
352
+ // --- File Messager Event Management ---
353
+
151
354
  handleRequestTransferFromClient(senderTide, transferData) {
152
355
  const {
153
356
  requesterID,
@@ -177,6 +380,33 @@ class FileMessager {
177
380
  totalItemsSent,
178
381
  runningOn
179
382
  });
383
+ tidalytics.track("file-list:received", {
384
+ value: 1,
385
+ tags: {
386
+ "file-list:received": "file-list:received",
387
+ "file-list": "file-list",
388
+ recipientID,
389
+ senderID,
390
+ totalItems: totalItemsSent,
391
+ runningOn
392
+ },
393
+ metadata: {
394
+ recipientID,
395
+ senderID,
396
+ totalItems: totalItemsSent,
397
+ runningOn
398
+ }
399
+ });
400
+ this.onTideAction({
401
+ tideActionID: "file-list-received",
402
+ tideActionDate: Date.now(),
403
+ tideActionDetails: {
404
+ recipientID,
405
+ senderID,
406
+ totalItems: totalItemsSent,
407
+ runningOn
408
+ }
409
+ });
180
410
  } catch (error) {
181
411
  console.error(`[FileTide ~ Net Scanner] ~ `, error);
182
412
  return;
@@ -228,6 +458,30 @@ class FileMessager {
228
458
  recipientID,
229
459
  depth
230
460
  });
461
+ tidalytics.track("file-list:request", {
462
+ value: 1,
463
+ tags: {
464
+ "file-list:request": "file-list:request",
465
+ "file-list": "file-list",
466
+ recipientID,
467
+ requesterID,
468
+ depth
469
+ },
470
+ metadata: {
471
+ recipientID,
472
+ requesterID,
473
+ depth
474
+ }
475
+ });
476
+ this.onTideAction({
477
+ tideActionID: "file-list-request",
478
+ tideActionDate: Date.now(),
479
+ tideActionDetails: {
480
+ recipientID,
481
+ requesterID,
482
+ depth
483
+ }
484
+ });
231
485
  } catch (error) {
232
486
  console.error(`[FileTide ~ Net Scanner] ~ `, error);
233
487
  return;
@@ -275,6 +529,42 @@ class FileMessager {
275
529
  fileName,
276
530
  filePath
277
531
  });
532
+ tidalytics.track("tide:completed-transfer", {
533
+ value: 1,
534
+ tags: {
535
+ "tide:completed-transfer": "tide:completed-transfer",
536
+ "tide": "tide",
537
+ recipientID: recipientId,
538
+ senderID,
539
+ path: filePath,
540
+ fileSize,
541
+ fileName
542
+ },
543
+ metadata: {
544
+ recipientID: recipientId,
545
+ senderID,
546
+ path: filePath,
547
+ fileSize,
548
+ fileName,
549
+ completedChunks,
550
+ totalChunks,
551
+ chunkSize
552
+ }
553
+ });
554
+ this.onTideAction({
555
+ tideActionID: "tide-completed-transfer",
556
+ tideActionDate: Date.now(),
557
+ tideActionDetails: {
558
+ recipientID: recipientId,
559
+ senderID,
560
+ path: filePath,
561
+ fileSize,
562
+ fileName,
563
+ completedChunks,
564
+ totalChunks,
565
+ chunkSize
566
+ }
567
+ });
278
568
  console.log(`[FileTide ~ File Messager] ~ File transfer completed: ${fileName} from ${senderID} to ${recipientId}`);
279
569
  const tidingTransfers = this.currentTidingTransfers.get(senderID);
280
570
  if (tidingTransfers) {
@@ -319,6 +609,42 @@ class FileMessager {
319
609
  fileName,
320
610
  filePath
321
611
  });
612
+ tidalytics.track("tide:completed-transfer", {
613
+ value: 1,
614
+ tags: {
615
+ "tide:completed-transfer": "tide:completed-transfer",
616
+ "tide": "tide",
617
+ recipientID: recipientId,
618
+ senderID,
619
+ path: filePath,
620
+ fileSize,
621
+ fileName
622
+ },
623
+ metadata: {
624
+ recipientID: recipientId,
625
+ senderID,
626
+ path: filePath,
627
+ fileSize,
628
+ fileName,
629
+ completedChunks,
630
+ totalChunks,
631
+ chunkSize
632
+ }
633
+ });
634
+ this.onTideAction({
635
+ tideActionID: "tide-completed-transfer",
636
+ tideActionDate: Date.now(),
637
+ tideActionDetails: {
638
+ recipientID: recipientId,
639
+ senderID,
640
+ path: filePath,
641
+ fileSize,
642
+ fileName,
643
+ completedChunks,
644
+ totalChunks,
645
+ chunkSize
646
+ }
647
+ });
322
648
  console.log(`[FileTide ~ File Messager] ~ File transfer completed: ${fileName} from ${senderID} to ${recipientId}`);
323
649
  const tidingTransfers = this.currentTidingTransfers.get(senderID);
324
650
  if (tidingTransfers) {
@@ -350,12 +676,92 @@ class FileMessager {
350
676
  this.fileNet.emitToTide(senderClient.tideID, "transfer-barrier-response", accepted);
351
677
  this.currentTransferBarrierTransfers.delete(data.transferID);
352
678
  if (accepted) {
679
+ tidalytics.track("tide-barrier:accepted", {
680
+ value: 1,
681
+ tags: {
682
+ "tide-barrier:accepted": "tide-barrier:accepted",
683
+ "tide-barrier": "tide-barrier",
684
+ recipientID: data.recipientID,
685
+ transferID: data.transferID,
686
+ senderID: data.clientID,
687
+ tideTransferType: data.transferType,
688
+ tideDestinationPath: data.path,
689
+ tideOriginPath: data.originPath,
690
+ tideItemSize: data.itemSize
691
+ },
692
+ metadata: {
693
+ recipientID: data.recipientID,
694
+ transferID: data.transferID,
695
+ senderID: data.clientID,
696
+ tideItemCount: data.itemCount,
697
+ tideItemSize: data.itemSize,
698
+ tideTransferContentType: data.transferContentType,
699
+ tideTransferType: data.transferType,
700
+ tideDestinationPath: data.path,
701
+ tideOriginPath: data.originPath
702
+ }
703
+ });
704
+ this.onTideAction({
705
+ tideActionID: "tide-barrier-accepted",
706
+ tideActionDate: Date.now(),
707
+ tideActionDetails: {
708
+ recipientID: data.recipientID,
709
+ transferID: data.transferID,
710
+ senderID: data.clientID,
711
+ tideItemCount: data.itemCount,
712
+ tideItemSize: data.itemSize,
713
+ tideTransferContentType: data.transferContentType,
714
+ tideTransferType: data.transferType,
715
+ tideDestinationPath: data.path,
716
+ tideOriginPath: data.originPath
717
+ }
718
+ });
353
719
  this.fileNet.emitToTide(client.tideID, "accepted-transfer", {
354
720
  accepted,
355
721
  ...data
356
722
  });
357
723
  return;
358
724
  }
725
+ tidalytics.track("tide-barrier:denied", {
726
+ value: 1,
727
+ tags: {
728
+ "tide-barrier:denied": "tide-barrier:denied",
729
+ "tide-barrier": "tide-barrier",
730
+ recipientID: data.recipientID,
731
+ transferID: data.transferID,
732
+ senderID: data.clientID,
733
+ tideTransferType: data.transferType,
734
+ tideDestinationPath: data.path,
735
+ tideOriginPath: data.originPath,
736
+ tideItemSize: data.itemSize
737
+ },
738
+ metadata: {
739
+ recipientID: data.recipientID,
740
+ transferID: data.transferID,
741
+ senderID: data.clientID,
742
+ tideItemCount: data.itemCount,
743
+ tideItemSize: data.itemSize,
744
+ tideTransferContentType: data.transferContentType,
745
+ tideTransferType: data.transferType,
746
+ tideDestinationPath: data.path,
747
+ tideOriginPath: data.originPath
748
+ }
749
+ });
750
+ this.onTideAction({
751
+ tideActionID: "tide-barrier-denied",
752
+ tideActionDate: Date.now(),
753
+ tideActionDetails: {
754
+ recipientID: data.recipientID,
755
+ transferID: data.transferID,
756
+ senderID: data.clientID,
757
+ tideItemCount: data.itemCount,
758
+ tideItemSize: data.itemSize,
759
+ tideTransferContentType: data.transferContentType,
760
+ tideTransferType: data.transferType,
761
+ tideDestinationPath: data.path,
762
+ tideOriginPath: data.originPath
763
+ }
764
+ });
359
765
  this.fileNet.emitToTide(client.tideID, "denied-transfer", {
360
766
  accepted,
361
767
  ...data
@@ -424,7 +830,58 @@ class FileMessager {
424
830
  }
425
831
  handleAcknowledgeTransferTide(senderTide, data) {
426
832
  try {
427
- 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 !== null && data.transferStats.progress !== undefined ? data.transferStats.progress.toFixed(2) : "N/A"}%\n\t\t\tETA ~ ${data.transferStats.timeLeft <= 0 ? "Now" : FileNetUtilityManager.convertSeconds(data.transferStats.timeLeft !== null && data.transferStats.timeLeft !== undefined ? data.transferStats.timeLeft.toFixed(2) : Infinity)}\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`);
833
+ const transferETA = data.transferStats.timeLeft <= 0 ? "Now" : FileNetUtilityManager.convertSeconds(data.transferStats.timeLeft !== null && data.transferStats.timeLeft !== undefined ? data.transferStats.timeLeft.toFixed(2) : Infinity);
834
+ const transferProgress = data.transferStats.progress !== null && data.transferStats.progress !== undefined ? data.transferStats.progress.toFixed(2) : "N/A";
835
+ const currentTransferredSize = FileNetUtilityManager.getFormattedSize(data.transferStats.current, true);
836
+ const transferSize = FileNetUtilityManager.getFormattedSize(data.transferStats.totalSize, true);
837
+ const transferSpeed = FileNetUtilityManager.getFormattedSize(data.transferStats.speed, true);
838
+ const transferStartTime = data.transferStats.startTime;
839
+ const fileName = data.fileName;
840
+ console.log(`[FileTide ~ Net Activity] ~ ${data.recipientName} acknowledged tide transfer from ${data.senderName}.\n\n\t~ [${fileName}-${transferStartTime}] ~\n\n\t\tFile Name ~ ${fileName}\n\t\tDestination ~ ${data.path}\n\n\t\t\tProgress ~ ${transferProgress}%\n\t\t\tETA ~ ${transferETA}\n\t\t\tSpeed ~ ${transferSpeed}/s\n\t\t\tSize ~ ${transferSize}\n\t\t\tTransferred ~ ${currentTransferredSize}\n`);
841
+ tidalytics.track("tide:transfer-state", {
842
+ value: 1,
843
+ tags: {
844
+ "tide:transfer-state": "tide:transfer-state",
845
+ "tide": "tide",
846
+ transferStateID: data.transferStateID,
847
+ recipientID: data.recipientName,
848
+ senderID: data.senderName,
849
+ path: data.path,
850
+ startTime: transferStartTime,
851
+ transferSize,
852
+ fileName
853
+ },
854
+ metadata: {
855
+ transferStateID: data.transferStateID,
856
+ recipientID: data.recipientName,
857
+ senderID: data.senderName,
858
+ path: data.path,
859
+ startTime: transferStartTime,
860
+ currentTransferredSize,
861
+ speed: transferSpeed,
862
+ transferProgress,
863
+ transferSize,
864
+ transferETA,
865
+ fileName
866
+ }
867
+ });
868
+ this.onTideAction({
869
+ tideActionID: "tide-transfer-state",
870
+ tideActionDate: Date.now(),
871
+ tideActionDetails: {
872
+ transferStateID: data.transferStateID,
873
+ recipientID: data.recipientName,
874
+ senderID: data.senderName,
875
+ path: data.path,
876
+ startTime: transferStartTime,
877
+ currentTransferredSize,
878
+ speed: transferSpeed,
879
+ transferProgress,
880
+ transferSize,
881
+ transferETA,
882
+ fileName
883
+ }
884
+ });
428
885
  } catch (error) {
429
886
  console.error(`[FileTide ~ Net Activity] ~ ${data.recipientName} acknowledged tide transfer from ${data.senderName}.\n\n${error}`);
430
887
  }
@@ -449,11 +906,45 @@ class FileMessager {
449
906
  ...data,
450
907
  currentSender: data.senderID
451
908
  });
909
+ const now = new Date();
910
+ tidalytics.track("tide:incoming-transfer", {
911
+ value: 1,
912
+ tags: {
913
+ "tide:incoming-transfer": "tide:incoming-transfer",
914
+ "tide": "tide",
915
+ recipientID: data.recipientID,
916
+ senderID: data.senderID,
917
+ fileSize: data.fileSize,
918
+ fileName: data.fileName,
919
+ path: data.path,
920
+ startedOn: now
921
+ },
922
+ metadata: {
923
+ recipientID: data.recipientID,
924
+ senderID: data.senderID,
925
+ fileSize: data.fileSize,
926
+ fileName: data.fileName,
927
+ path: data.path,
928
+ startedOn: now
929
+ }
930
+ });
931
+ this.onTideAction({
932
+ tideActionID: "tide-incoming-transfer",
933
+ tideActionDate: Date.now(),
934
+ tideActionDetails: {
935
+ recipientID: data.recipientID,
936
+ senderID: data.senderID,
937
+ fileSize: data.fileSize,
938
+ fileName: data.fileName,
939
+ path: data.path,
940
+ startedOn: now
941
+ }
942
+ });
452
943
  if (!this.currentTidingTransfers.get(data.senderID) || this.currentTidingTransfers.get(data.senderID).length <= 0) {
453
944
  const tidingTransfers = new Map();
454
945
  tidingTransfers.set(data.recipientID, {
455
946
  recipientID: data.recipientID,
456
- startedOn: new Date(),
947
+ startedOn: now,
457
948
  size: data.fileSize,
458
949
  path: data.path
459
950
  });
@@ -462,7 +953,7 @@ class FileMessager {
462
953
  }
463
954
  this.currentTidingTransfers.get(data.senderID).set(data.recipientID, {
464
955
  recipientID: data.recipientID,
465
- startedOn: new Date(),
956
+ startedOn: now,
466
957
  size: data.fileSize,
467
958
  path: data.path
468
959
  });
@@ -477,6 +968,40 @@ class FileMessager {
477
968
  handleFileTransferComplete(senderTide, data) {
478
969
  console.log(`File transfer completed: ${data.fileName}`);
479
970
  }
971
+ async handleCheckClientBanned(senderTide, data) {
972
+ console.log(`[FileTide ~ Net Activity] ~ Checking if client ~ ${data.clientID} banned...`);
973
+ try {
974
+ const clientBanned = await this.clientBanned(data.tideID);
975
+ if (!clientBanned) {
976
+ console.log(`[FileTide ~ Net Activity] ~ Client ~ ${data.clientID} access authorized!`);
977
+ this.fileNet.emit("retrieved-client-banned", {
978
+ banned: false,
979
+ clientID: data.clientID,
980
+ tideID: data.tideID,
981
+ bannedDetails: null
982
+ });
983
+ return;
984
+ }
985
+ console.log(`[FileTide ~ Net Activity] ~ Client ~ ${data.clientID} banned.`);
986
+ const bannedClientDetails = await this.getBanEntry(data.tideID);
987
+ FileNetClientManager.clearOnlineClient(data.clientID);
988
+ this.saveClientTransferStates(data);
989
+ this.fileNet.emit("retrieved-client-banned", {
990
+ banned: true,
991
+ clientID: data.clientID,
992
+ tideID: data.tideID,
993
+ bannedDetails: bannedClientDetails
994
+ });
995
+ } catch (error) {
996
+ this.fileNet.emit("retrieved-client-banned", {
997
+ banned: false,
998
+ clientID: data.clientID,
999
+ tideID: data.tideID,
1000
+ bannedDetails: null
1001
+ });
1002
+ return;
1003
+ }
1004
+ }
480
1005
  handleCheckClientOnline(senderTide, data) {
481
1006
  console.log(`[FileTide ~ Net Activity] ~ Checking if client ~ ${data.clientID} online...`);
482
1007
  try {
@@ -524,6 +1049,40 @@ class FileMessager {
524
1049
  const currentClientID = clientID;
525
1050
  clientID = nClientID;
526
1051
  this.fileNet.emitToTide(tideID, "current-client-id-already-online", clientID);
1052
+ tidalytics.track("tider:already-online", {
1053
+ value: 1,
1054
+ tags: {
1055
+ "tider:already-online": "tider:already-online",
1056
+ "tider": "tider",
1057
+ originUser: originClientID,
1058
+ pUser: currentClientID,
1059
+ user: nClientID,
1060
+ tideID: senderTide.tideID,
1061
+ connectedOn: Date.now()
1062
+ },
1063
+ metadata: {
1064
+ currentTideChannel: currentTideChannel || "file-room",
1065
+ originUser: originClientID,
1066
+ user: nClientID,
1067
+ connectionID,
1068
+ pClientID: currentClientID,
1069
+ tideID: senderTide.tideID,
1070
+ connectedOn: Date.now()
1071
+ }
1072
+ });
1073
+ this.onTideAction({
1074
+ tideActionID: "tider-already-online",
1075
+ tideActionDate: Date.now(),
1076
+ tideActionDetails: {
1077
+ currentTideChannel: currentTideChannel || "file-room",
1078
+ originUser: originClientID,
1079
+ user: nClientID,
1080
+ connectionID,
1081
+ pClientID: currentClientID,
1082
+ tideID: senderTide.tideID,
1083
+ connectedOn: Date.now()
1084
+ }
1085
+ });
527
1086
  FileNetClientManager.updateOnlineClient(nClientID, {
528
1087
  pClientID: currentClientID,
529
1088
  clientID: nClientID,
@@ -535,6 +1094,38 @@ class FileMessager {
535
1094
  });
536
1095
  return;
537
1096
  }
1097
+ tidalytics.track("tider:online", {
1098
+ value: 1,
1099
+ tags: {
1100
+ "tider:online": "tider:online",
1101
+ "tider": "tider",
1102
+ originUser: originClientID,
1103
+ user: clientID,
1104
+ tideID
1105
+ },
1106
+ metadata: {
1107
+ currentTideChannel: currentTideChannel || "file-room",
1108
+ connectedOn: Date.now(),
1109
+ originUser: originClientID,
1110
+ user: clientID,
1111
+ connectionID,
1112
+ pClientID,
1113
+ tideID
1114
+ }
1115
+ });
1116
+ this.onTideAction({
1117
+ tideActionID: "tider-online",
1118
+ tideActionDate: Date.now(),
1119
+ tideActionDetails: {
1120
+ currentTideChannel: currentTideChannel || "file-room",
1121
+ connectedOn: Date.now(),
1122
+ originUser: originClientID,
1123
+ user: clientID,
1124
+ connectionID,
1125
+ pClientID,
1126
+ tideID
1127
+ }
1128
+ });
538
1129
  FileNetClientManager.addOnlineClient(clientID, pClientID, tideID, connectionID, {
539
1130
  connectedOn: Date.now(),
540
1131
  currentTideChannel: currentTideChannel || "file-room",
@@ -557,6 +1148,38 @@ class FileMessager {
557
1148
  console.log(!clientDetails ? `[FileTide ~ Net Activity] ~ Client ~ ${clientData.clientID} already offline.` : `[FileTide ~ Net Activity] ~ Unauthorized offline signal from connection ID ~ ${clientData.connectionID}.`);
558
1149
  return;
559
1150
  }
1151
+ tidalytics.track("tider:offline", {
1152
+ value: 1,
1153
+ tags: {
1154
+ "tider:offline": "tider:offline",
1155
+ "tider": "tider",
1156
+ originUser: clientDetails.originClientID,
1157
+ user: clientDetails.clientID,
1158
+ tideID: clientDetails.tideID
1159
+ },
1160
+ metadata: {
1161
+ currentTideChannel: clientDetails.currentTideChannel || "file-room",
1162
+ originUser: clientDetails.originClientID,
1163
+ user: clientDetails.clientID,
1164
+ connectionID: clientDetails.connectionID,
1165
+ pClientID: clientDetails.pClientID,
1166
+ tideID: clientDetails.tideID,
1167
+ connectedOn: clientDetails.connectedOn
1168
+ }
1169
+ });
1170
+ this.onTideAction({
1171
+ tideActionID: "tider-offline",
1172
+ tideActionDate: Date.now(),
1173
+ tideActionDetails: {
1174
+ currentTideChannel: clientDetails.currentTideChannel || "file-room",
1175
+ originUser: clientDetails.originClientID,
1176
+ user: clientDetails.clientID,
1177
+ connectionID: clientDetails.connectionID,
1178
+ pClientID: clientDetails.pClientID,
1179
+ tideID: clientDetails.tideID,
1180
+ connectedOn: clientDetails.connectedOn
1181
+ }
1182
+ });
560
1183
  FileNetClientManager.clearOnlineClient(clientData.clientID);
561
1184
  const currentOnlineClients = Object.fromEntries(FileNetClientManager.getOnlineClients());
562
1185
  this.fileNet.emit("current-online-clients", currentOnlineClients);
@@ -565,19 +1188,7 @@ class FileMessager {
565
1188
  this.fileNet.emitToTide(senderClient.tideID, "save-current-transfer-states", {
566
1189
  clientID: clientData.clientID
567
1190
  });
568
- const tidingTransfers = this.currentTidingTransfers.get(clientData.clientID);
569
- if (tidingTransfers && tidingTransfers.size > 0) {
570
- for (let recipientID of tidingTransfers.keys()) {
571
- const recipientConnectionID = FileNetClientManager.getOnlineClient(clientData.recipientID).id;
572
- const client = this.getClientFromID(recipientConnectionID);
573
- if (client) {
574
- this.fileNet.emitToTide(client.tideID, "save-current-transfer-states", {
575
- clientID: recipientID
576
- });
577
- }
578
- }
579
- this.currentTidingTransfers.delete(clientData.clientID);
580
- }
1191
+ this.saveClientTransferStates(clientData);
581
1192
  } catch (error) {
582
1193
  console.log(`[FileTide ~ Net Activity] ~ Did not process client ~ ${clientData} offline signal ~ ${error}`);
583
1194
  }