@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
@@ -41,18 +41,21 @@ class FileMessagerClient {
41
41
  this.clientOptions = FileMessagerConfigManager.getClientOptions(options);
42
42
  this.transporter = new FileTransferManager(transportOptions);
43
43
  this.activeTransferTypes = new Map();
44
- this.clientTide = new HUDIoTide(maxReconnectionAttempts, reconnectionAttempts, maxReconnectionDelay);
44
+ this.clientTide = new HUDIoTide(maxReconnectionAttempts, reconnectionAttempts, maxReconnectionDelay, {
45
+ persistentTideIDs: true,
46
+ persistentTideID: true
47
+ });
45
48
  this.clients = new Map();
46
49
  }
47
50
  createClientInstance(clientID, clientOptions, options = {}, headers = {}, onConnect = null, onDisconnect = null, authURL = "", authHeaders = {}, useAuthentication = false, queryAuthToken = false) {
48
51
  this.clientTide.createIO(clientID, clientOptions.url, {
49
52
  transports: ["websocket"],
50
53
  ...options
51
- }, headers, authURL, authHeaders, useAuthentication, queryAuthToken, onConnect, () => {
54
+ }, headers, authURL, authHeaders, useAuthentication, queryAuthToken, onConnect, async () => {
52
55
  FileTransferTrackingManager.outputCurrentTransfers();
53
56
  FileTransferRecoveryManager.flushToDisk();
54
57
  if (onDisconnect) {
55
- onDisconnect();
58
+ await onDisconnect();
56
59
  }
57
60
  });
58
61
  FileTideDebugUtilityManager.outputGradient(`\n[FileTide ~ File Messager] ~ Created client with ID ${clientID} and socket ${clientID}!`, significantMessageColors);
@@ -47,6 +47,7 @@ class FileTide {
47
47
  });
48
48
  this.clientShorePolicies = new Map();
49
49
  this.transferBarrier = false;
50
+ this.clientDetails = new Map();
50
51
  this.clients = new Map();
51
52
  this.currentUserID = "";
52
53
  this.runningOn = os.platform();
@@ -109,11 +110,29 @@ class FileTide {
109
110
  if (this.clients.has(userID)) {
110
111
  this.stopMessager(userID);
111
112
  }
113
+ const currentClientDetails = this.clientDetails.get(userID);
114
+ if (currentClientDetails && currentClientDetails.unauthorized) {
115
+ const {
116
+ onCurrentClientUnauthorized
117
+ } = options;
118
+ FileTide.outputGradient(`[FileTide ~ FileNet] ~ Unauthorized access detected.`, errorMessageColors);
119
+ if (onCurrentClientUnauthorized) {
120
+ onCurrentClientUnauthorized({
121
+ ...currentClientDetails,
122
+ userID
123
+ });
124
+ }
125
+ return;
126
+ }
112
127
  const newClient = new FileMessagerClient(clientOptions, transportOptions, messagerSettings);
113
128
  const enterRoom = newClient.joinRoom(userID, roomName, connectionOptions, headers, onConnect, onDisconnect, authURL, authHeaders, useAuthentication, queryAuthToken);
114
129
  this.transferBarrier = enableTransferBarrier;
115
130
  this.clientShorePolicies.set(userID, [FileUtilityManager.getTidePath(">Downloads"), FileUtilityManager.getTidePath(">Documents"), FileUtilityManager.getTidePath(">Desktop"), FileUtilityManager.getTidePath(">Photos"), FileUtilityManager.getTidePath(">Videos"), FileUtilityManager.getTidePath(">Music")]);
116
131
  this.clients.set(userID, newClient);
132
+ this.clientDetails.set(userID, {
133
+ unauthorized: false,
134
+ userID
135
+ });
117
136
  FileTide.outputGradient(`[FileTide] ~ Messager launched successfully for client ~ ${userID}!`, significantMessageColors);
118
137
  _assertClassBrand(_FileTide_brand, this, _setupFileEventListeners).call(this, userID, newClient, onTransferProgress, onIncomingTransfer, onIncomingFile, onTransferBarrier, options);
119
138
  if (onLaunch) {
@@ -153,6 +172,10 @@ class FileTide {
153
172
  FileTide.outputGradient(`[FileTide] Client ~ ${clientID} not found.`, errorMessageColors);
154
173
  return;
155
174
  }
175
+ clientMessager.clientTide.emitEvent(clientID, "check-client-banned", {
176
+ clientID,
177
+ tideID: clientMessager.clientTide.sockets[clientID].tideID
178
+ });
156
179
  clientMessager.listFiles(clientID, recipientID, depth);
157
180
  }
158
181
  async listFiles(directories, depth = 1, onDirectory) {
@@ -201,6 +224,10 @@ class FileTide {
201
224
  FileTide.outputGradient(`[FileTide] Client ~ ${clientID} not found.`, errorMessageColors);
202
225
  return false;
203
226
  }
227
+ clientMessager.clientTide.emitEvent(clientID, "check-client-banned", {
228
+ clientID,
229
+ tideID: clientMessager.clientTide.sockets[clientID].tideID
230
+ });
204
231
  const recipientOnline = await clientMessager.clientTide.emitEventWithResponse(clientID, "check-client-online", "retrieved-client-online", {
205
232
  clientID: recipientID
206
233
  }, 5000);
@@ -254,6 +281,7 @@ class FileTide {
254
281
  stopFileTide() {
255
282
  if (this.fileNet) {
256
283
  FileTide.outputGradient("Stopping FileTide...", significantMessageColors);
284
+ this.fileNet.close();
257
285
  this.fileNet = null;
258
286
  FileTide.outputGradient("Stopped FileTide.", significantMessageColors);
259
287
  }
@@ -349,7 +377,10 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
349
377
  onFileListReceived,
350
378
  onCurrentOnlineClients,
351
379
  onClientTiding,
352
- onCurrentClientIDAlreadyOnline
380
+ onCurrentClientIDAlreadyOnline,
381
+ onCurrentClientUnauthorized,
382
+ onBeforeCurrentClientUnauthorizedDisconnect,
383
+ onCurrentClientUnauthorizedDisconnect
353
384
  } = options;
354
385
  const cliTable = new ConsoleTable({
355
386
  padding: 2,
@@ -379,6 +410,10 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
379
410
  });
380
411
  const fileTransferReceiver = new FileTransferReceiverManager();
381
412
  client.clientTide.onEvent(userID, "current-online-clients", data => {
413
+ client.clientTide.emitEvent(userID, "check-client-banned", {
414
+ clientID: userID,
415
+ tideID: client.clientTide.sockets[userID].tideID
416
+ });
382
417
  const currentClients = {};
383
418
  Object.keys(data).forEach(key => {
384
419
  if (key !== userID) {
@@ -429,6 +464,22 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
429
464
  }
430
465
  return;
431
466
  });
467
+ client.clientTide.onEvent(userID, "retrieved-client-banned", async bannedDetails => {
468
+ const clientID = bannedDetails.clientID;
469
+ if (userID !== clientID) {
470
+ return;
471
+ }
472
+ if (!bannedDetails.banned) {
473
+ return;
474
+ }
475
+ _FileTide.outputGradient(`[FileTide ~ FileNet] ~ Unauthorized access detected.`, errorMessageColors);
476
+ await this.stopAllMessagers(onBeforeCurrentClientUnauthorizedDisconnect, onCurrentClientUnauthorizedDisconnect, async () => {
477
+ if (onCurrentClientUnauthorized) {
478
+ onCurrentClientUnauthorized(bannedDetails);
479
+ }
480
+ });
481
+ return;
482
+ });
432
483
  client.clientTide.onEvent(userID, "save-current-transfer-states", async data => {
433
484
  this.saveTransferStates();
434
485
  return;
@@ -686,6 +737,10 @@ function _setupFileEventListeners(userID, client, onTransferProgress, onIncoming
686
737
  }
687
738
  });
688
739
  client.clientTide.onEvent(userID, "client-file-list", async data => {
740
+ client.clientTide.emitEvent(userID, "check-client-banned", {
741
+ clientID: userID,
742
+ tideID: client.clientTide.sockets[userID].tideID
743
+ });
689
744
  _FileTide.outputGradient(`[${userID}] Received ${HUDUtilityManager.convertNumberToMoneyFormat(data.totalItems, false)} directory contents from ${data.senderID}'s file list!`, significantMessageColors);
690
745
  if (onListFiles) {
691
746
  onListFiles(data);
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ const MetricTide = require("@trap_stevo/metrictide");
4
+ class TidalyticsInstanceManager {
5
+ constructor() {
6
+ this.instances = new Map();
7
+ }
8
+ createInstance(name = "default", config = {}) {
9
+ if (this.instances.has(name)) {
10
+ return this.instances.get(name);
11
+ }
12
+ const defaultConfig = {
13
+ dbPath: "./filetide_core/.tidalytics",
14
+ persistence: {
15
+ alwaysOn: true
16
+ },
17
+ loadMetricsOnLaunch: false,
18
+ onTrack: record => {
19
+ console.log("[Tidalytics] Tracked:", record.name, record.value);
20
+ }
21
+ };
22
+ const mergedConfig = {
23
+ ...defaultConfig,
24
+ ...config,
25
+ persistence: {
26
+ ...defaultConfig.persistence,
27
+ ...(config.persistence || {})
28
+ }
29
+ };
30
+ const instance = new MetricTide(mergedConfig);
31
+ this.instances.set(name, instance);
32
+ return instance;
33
+ }
34
+ getInstance(name = "default", configurations = {}) {
35
+ if (!this.instances.has(name)) {
36
+ if (configurations) {
37
+ return this.createInstance(name, configurations);
38
+ }
39
+ return null;
40
+ }
41
+ return this.instances.get(name);
42
+ }
43
+ containsInstance(name = "default") {
44
+ return this.instances.has(name);
45
+ }
46
+ clearInstance(name = "default") {
47
+ this.instances.delete(name);
48
+ }
49
+ listInstances() {
50
+ return Array.from(this.instances.entries());
51
+ }
52
+ clearAll() {
53
+ this.instances.clear();
54
+ }
55
+ }
56
+ ;
57
+ let singleton = null;
58
+ const Tidalytics = {
59
+ get() {
60
+ if (!singleton) {
61
+ singleton = new TidalyticsInstanceManager();
62
+ }
63
+ return singleton;
64
+ }
65
+ };
66
+ module.exports = {
67
+ TidalyticsInstanceManager,
68
+ Tidalytics
69
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ const {
4
+ Tidalytics
5
+ } = require("./TidalyticsInstanceManager");
6
+ const tidalytics = Tidalytics.get().getInstance("Tidalytics", {});
7
+ module.exports = {
8
+ tidalytics
9
+ };
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
4
+ function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
5
+ function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
6
+ function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
7
+ function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
8
+ 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"); }
9
+ const Timelyst = require("@trap_stevo/timelyst");
10
+ var _config = /*#__PURE__*/new WeakMap();
11
+ var _lists = /*#__PURE__*/new WeakMap();
12
+ var _manager = /*#__PURE__*/new WeakMap();
13
+ var _onEntryAddedHooks = /*#__PURE__*/new WeakMap();
14
+ var _onExpireHooks = /*#__PURE__*/new WeakMap();
15
+ var _TideSentinelManager_brand = /*#__PURE__*/new WeakSet();
16
+ class TideSentinelManager {
17
+ constructor(config = {}) {
18
+ _classPrivateMethodInitSpec(this, _TideSentinelManager_brand);
19
+ _classPrivateFieldInitSpec(this, _config, void 0);
20
+ _classPrivateFieldInitSpec(this, _lists, void 0);
21
+ _classPrivateFieldInitSpec(this, _manager, void 0);
22
+ _classPrivateFieldInitSpec(this, _onEntryAddedHooks, {});
23
+ _classPrivateFieldInitSpec(this, _onExpireHooks, {});
24
+ const {
25
+ lists = {},
26
+ enableOfflineStorage = true,
27
+ autoCleanupInterval = "15s",
28
+ basePath = "./filetide_core/tide_sentinel",
29
+ ...rest
30
+ } = config;
31
+ _classPrivateFieldSet(_config, this, {
32
+ enableOfflineStorage,
33
+ autoCleanupInterval,
34
+ basePath,
35
+ ...rest
36
+ });
37
+ _classPrivateFieldSet(_lists, this, lists);
38
+ _classPrivateFieldSet(_manager, this, new Timelyst(_classPrivateFieldGet(_config, this)));
39
+ _classPrivateFieldGet(_manager, this).on("entry-expired", (list, key, entry) => {
40
+ const hook = _classPrivateFieldGet(_onExpireHooks, this)[list];
41
+ if (typeof hook === "function") {
42
+ hook(key, entry);
43
+ }
44
+ });
45
+ _classPrivateFieldGet(_manager, this).on("entry-added", (list, key, entry) => {
46
+ const hook = _classPrivateFieldGet(_onEntryAddedHooks, this)[list];
47
+ if (typeof hook === "function") {
48
+ hook(key, entry);
49
+ }
50
+ });
51
+ }
52
+ registerEntryAddedHook(list, callback) {
53
+ if (typeof callback === "function") {
54
+ _classPrivateFieldGet(_onEntryAddedHooks, this)[list] = callback;
55
+ }
56
+ }
57
+ registerExpireHook(list, callback) {
58
+ if (typeof callback === "function") {
59
+ _classPrivateFieldGet(_onExpireHooks, this)[list] = callback;
60
+ }
61
+ }
62
+ async createList(name, options = {}) {
63
+ _classPrivateFieldGet(_lists, this)[name] = options;
64
+ return _classPrivateFieldGet(_manager, this).createList(name, options);
65
+ }
66
+ async deleteList(name) {
67
+ delete _classPrivateFieldGet(_lists, this)[name];
68
+ return _classPrivateFieldGet(_manager, this).deleteList(name);
69
+ }
70
+ async reconfigureList(name, newOptions = {}) {
71
+ Object.assign(_classPrivateFieldGet(_lists, this)[name] = _classPrivateFieldGet(_lists, this)[name] || {}, newOptions);
72
+ await _classPrivateFieldGet(_manager, this).deleteList(name);
73
+ return _classPrivateFieldGet(_manager, this).createList(name, _classPrivateFieldGet(_lists, this)[name]);
74
+ }
75
+ async banClient(clientID, options = {}) {
76
+ const {
77
+ reason = "Unspecified.",
78
+ duration = null,
79
+ tags = [],
80
+ priority = 10,
81
+ category = "ban",
82
+ details = {}
83
+ } = options;
84
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, "banned-tiders");
85
+ return _classPrivateFieldGet(_manager, this).addToList("banned-tiders", clientID, {
86
+ expiresIn: duration,
87
+ priority,
88
+ category,
89
+ tags,
90
+ details
91
+ });
92
+ }
93
+ async unbanClient(clientID) {
94
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, "banned-tiders");
95
+ return _classPrivateFieldGet(_manager, this).removeFromList("banned-tiders", clientID);
96
+ }
97
+ async clientBanned(clientID) {
98
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, "banned-tiders");
99
+ return _classPrivateFieldGet(_manager, this).inList("banned-tiders", clientID);
100
+ }
101
+ async getBanEntry(clientID) {
102
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, "banned-tiders");
103
+ return _classPrivateFieldGet(_manager, this).getEntryByKey("banned-tiders", clientID);
104
+ }
105
+ async filterBannedClients(filter = {}) {
106
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, "banned-tiders");
107
+ return _classPrivateFieldGet(_manager, this).filterList("banned-tiders", filter);
108
+ }
109
+ async addToList(list, key, data) {
110
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, list);
111
+ return _classPrivateFieldGet(_manager, this).addToList(list, key, data);
112
+ }
113
+ async removeFromList(list, key) {
114
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, list);
115
+ return _classPrivateFieldGet(_manager, this).removeFromList(list, key);
116
+ }
117
+ async inList(list, key) {
118
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, list);
119
+ return _classPrivateFieldGet(_manager, this).inList(list, key);
120
+ }
121
+ async getEntry(list, key) {
122
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, list);
123
+ return _classPrivateFieldGet(_manager, this).getEntryByKey(list, key);
124
+ }
125
+ async filterList(list, filter = {}) {
126
+ await _assertClassBrand(_TideSentinelManager_brand, this, _ensureList).call(this, list);
127
+ return _classPrivateFieldGet(_manager, this).filterList(list, filter);
128
+ }
129
+ async findSimilarKeys(key, options = {}) {
130
+ return _classPrivateFieldGet(_manager, this).findSimilarKeys(key, options);
131
+ }
132
+ }
133
+ async function _ensureList(name) {
134
+ if (!_classPrivateFieldGet(_lists, this)[name]) {
135
+ _classPrivateFieldGet(_lists, this)[name] = {};
136
+ }
137
+ const exists = await _classPrivateFieldGet(_manager, this).listOperational(name);
138
+ if (!exists) {
139
+ await _classPrivateFieldGet(_manager, this).createList(name, _classPrivateFieldGet(_lists, this)[name]);
140
+ }
141
+ }
142
+ ;
143
+ module.exports = TideSentinelManager;
@@ -0,0 +1 @@
1
+ MANIFEST-000088
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ 2025/04/26-16:56:15.117 8174 Recovering log #84
2
+ 2025/04/26-16:56:15.117 8174 Level-0 table #86: started
3
+ 2025/04/26-16:56:15.122 8174 Level-0 table #86: 529 bytes OK
4
+ 2025/04/26-16:56:15.130 8174 Delete type=0 #84
5
+ 2025/04/26-16:56:15.130 8174 Delete type=3 #82
6
+ 2025/04/26-16:56:15.133 3da4 Moved #77 to level-1 1047 bytes OK: files[ 3 25 0 0 0 0 0 ]
@@ -0,0 +1 @@
1
+ MANIFEST-000091
File without changes
@@ -0,0 +1,3 @@
1
+ 2025/04/26-16:58:12.482 7d4c Recovering log #90
2
+ 2025/04/26-16:58:12.493 7d4c Delete type=0 #90
3
+ 2025/04/26-16:58:12.493 7d4c Delete type=3 #89
@@ -0,0 +1,3 @@
1
+ 2025/04/26-16:56:15.155 8174 Recovering log #88
2
+ 2025/04/26-16:56:15.166 8174 Delete type=0 #88
3
+ 2025/04/26-16:56:15.166 8174 Delete type=3 #87
@@ -0,0 +1 @@
1
+ b27541b4-aa20-4f49-8e88-4854fd97faf6
@@ -0,0 +1,5 @@
1
+ {
2
+ "FileNetClient": "7a236449-e992-425b-a565-83886f74d394",
3
+ "FileNetServer": "b1cf34c6-481e-4e4d-b0ea-dc55eb94fe24",
4
+ "FileNettClient": "d253ca4f-ea5f-4a4c-92e7-356d7442db46"
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trap_stevo/filetide",
3
- "version": "0.0.61",
3
+ "version": "0.0.63",
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": {
@@ -34,9 +34,11 @@
34
34
  "author": "Steven Compton",
35
35
  "license": "See License in LICENSE.md",
36
36
  "dependencies": {
37
- "@trap_stevo/iotide": "^0.0.41",
38
- "@trap_stevo/iotide-client": "^0.0.23",
37
+ "@trap_stevo/iotide": "^0.0.43",
38
+ "@trap_stevo/iotide-client": "^0.0.25",
39
39
  "@trap_stevo/legendarybuilderpronodejs-utilities": "^1.0.43",
40
+ "@trap_stevo/metrictide": "^0.0.3",
41
+ "@trap_stevo/timelyst": "^0.0.5",
40
42
  "chalk": "^4.1.2",
41
43
  "readline": "^1.3.0"
42
44
  },
@@ -0,0 +1,7 @@
1
+ {
2
+ "transferredSize": 524288,
3
+ "senderName": "FileNetClient",
4
+ "clientName": "FileNetServer",
5
+ "filePath": ">Documents\\TestFileTideDropZone-TidalCore.txt",
6
+ "lastChunkSent": 147
7
+ }