core-3nweb-client-lib 0.42.3 → 0.42.5

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 (37) hide show
  1. package/build/core/asmail/inbox/inbox-events.d.ts +10 -3
  2. package/build/core/asmail/inbox/inbox-events.js +38 -18
  3. package/build/core/asmail/inbox/index.d.ts +2 -0
  4. package/build/core/asmail/inbox/index.js +22 -1
  5. package/build/core/asmail/index.d.ts +1 -0
  6. package/build/core/asmail/index.js +3 -0
  7. package/build/core/index.d.ts +3 -0
  8. package/build/core/index.js +5 -0
  9. package/build/core/storage/common/constants.d.ts +1 -1
  10. package/build/core/storage/common/constants.js +6 -5
  11. package/build/core/storage/index.js +3 -3
  12. package/build/core/storage/synced/remote-events.d.ts +7 -0
  13. package/build/core/storage/synced/remote-events.js +27 -14
  14. package/build/lib-client/3nstorage/storage-owner.d.ts +2 -3
  15. package/build/lib-client/3nstorage/storage-owner.js +2 -2
  16. package/build/lib-client/asmail/recipient.d.ts +2 -3
  17. package/build/lib-client/asmail/recipient.js +2 -2
  18. package/build/lib-common/ipc/ws-ipc.d.ts +18 -2
  19. package/build/lib-common/ipc/ws-ipc.js +62 -79
  20. package/build/lib-index.d.ts +1 -0
  21. package/build/lib-index.js +2 -1
  22. package/package.json +1 -1
  23. package/build/lib-client/server-events.d.ts +0 -14
  24. package/build/lib-client/server-events.js +0 -82
  25. package/test-data-1-1759691784470/util/logs/2025-10-05.log.txt +0 -14
  26. package/test-data-10-1759691821007/util/logs/2025-10-05.log.txt +0 -14
  27. package/test-data-11-1759691821008/util/logs/2025-10-05.log.txt +0 -14
  28. package/test-data-12-1759691824688/util/logs/2025-10-05.log.txt +0 -14
  29. package/test-data-13-1759691825525/util/logs/2025-10-05.log.txt +0 -28
  30. package/test-data-2-1759691784473/util/logs/2025-10-05.log.txt +0 -14
  31. package/test-data-3-1759691789049/util/logs/2025-10-05.log.txt +0 -28
  32. package/test-data-4-1759691794994/util/logs/2025-10-05.log.txt +0 -28
  33. package/test-data-5-1759691804247/util/logs/2025-10-05.log.txt +0 -14
  34. package/test-data-6-1759691806167/util/logs/2025-10-05.log.txt +0 -14
  35. package/test-data-7-1759691808152/util/logs/2025-10-05.log.txt +0 -14
  36. package/test-data-8-1759691816773/util/logs/2025-10-05.log.txt +0 -14
  37. package/test-data-9-1759691817611/util/logs/2025-10-05.log.txt +0 -28
@@ -1,9 +1,14 @@
1
1
  import { MailRecipient } from '../../../lib-client/asmail/recipient';
2
+ import { Observable } from 'rxjs';
2
3
  import { LogError } from '../../../lib-client/logging/log-to-file';
4
+ import { ConnectionStatus } from '../../../lib-common/ipc/ws-ipc';
3
5
  type IncomingMessage = web3n.asmail.IncomingMessage;
4
6
  type InboxEventType = web3n.asmail.InboxEventType;
5
7
  type Observer<T> = web3n.Observer<T>;
6
8
  type MsgInfo = web3n.asmail.MsgInfo;
9
+ export interface InboxConnectionStatus extends ConnectionStatus {
10
+ service: 'inbox';
11
+ }
7
12
  /**
8
13
  * Instance of this class handles event subscription from UI side. It observes
9
14
  * inbox server events, handles them, and generates respective events for UI
@@ -15,17 +20,19 @@ type MsgInfo = web3n.asmail.MsgInfo;
15
20
  * Hence, this should do restarts to server around wakeup events.
16
21
  */
17
22
  export declare class InboxEvents {
23
+ private readonly msgReceiver;
18
24
  private readonly getMsg;
19
- private readonly listMsgs;
25
+ private readonly listNewMsgs;
20
26
  private readonly rmMsg;
21
27
  private readonly logError;
22
28
  private readonly newMsgs;
23
29
  private readonly newMsg$;
30
+ private readonly connectionEvents;
31
+ readonly connectionEvent$: Observable<InboxConnectionStatus>;
24
32
  private listeningProc;
25
- private readonly makeServerEvents;
26
33
  private networkActive;
27
34
  private disconnectedAt;
28
- constructor(msgReceiver: MailRecipient, getMsg: (msgId: string) => Promise<IncomingMessage>, listMsgs: (fromTS: number) => Promise<MsgInfo[]>, rmMsg: (msgId: string) => Promise<void>, logError: LogError);
35
+ constructor(msgReceiver: MailRecipient, getMsg: (msgId: string) => Promise<IncomingMessage>, listNewMsgs: (fromTS: number) => Promise<MsgInfo[]>, rmMsg: (msgId: string) => Promise<void>, logError: LogError);
29
36
  private startListening;
30
37
  private sleepAndRestart;
31
38
  private getMessage;
@@ -19,10 +19,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.InboxEvents = void 0;
20
20
  const rxjs_1 = require("rxjs");
21
21
  const retrieval_1 = require("../../../lib-common/service-api/asmail/retrieval");
22
- const server_events_1 = require("../../../lib-client/server-events");
23
22
  const operators_1 = require("rxjs/operators");
24
23
  const utils_for_observables_1 = require("../../../lib-common/utils-for-observables");
24
+ const ws_ipc_1 = require("../../../lib-common/ipc/ws-ipc");
25
25
  const sleep_1 = require("../../../lib-common/processes/sleep");
26
+ function toInboxConnectionStatus(status, params) {
27
+ return (0, ws_ipc_1.addToStatus)(status, {
28
+ service: 'inbox',
29
+ ...params
30
+ });
31
+ }
26
32
  const SERVER_EVENTS_RESTART_WAIT_SECS = 5;
27
33
  const BUFFER_MILLIS_FOR_LISTING = 2 * 60 * 1000;
28
34
  /**
@@ -36,17 +42,19 @@ const BUFFER_MILLIS_FOR_LISTING = 2 * 60 * 1000;
36
42
  * Hence, this should do restarts to server around wakeup events.
37
43
  */
38
44
  class InboxEvents {
39
- constructor(msgReceiver, getMsg, listMsgs, rmMsg, logError) {
45
+ constructor(msgReceiver, getMsg, listNewMsgs, rmMsg, logError) {
46
+ this.msgReceiver = msgReceiver;
40
47
  this.getMsg = getMsg;
41
- this.listMsgs = listMsgs;
48
+ this.listNewMsgs = listNewMsgs;
42
49
  this.rmMsg = rmMsg;
43
50
  this.logError = logError;
44
51
  this.newMsgs = new rxjs_1.Subject();
45
52
  this.newMsg$ = this.newMsgs.asObservable().pipe((0, operators_1.share)());
53
+ this.connectionEvents = new rxjs_1.Subject();
54
+ this.connectionEvent$ = this.connectionEvents.asObservable().pipe((0, operators_1.share)());
46
55
  this.listeningProc = undefined;
47
56
  this.networkActive = true;
48
57
  this.disconnectedAt = undefined;
49
- this.makeServerEvents = () => new server_events_1.ServerEvents(() => msgReceiver.openEventSource(this.logError));
50
58
  this.startListening();
51
59
  Object.seal(this);
52
60
  }
@@ -62,9 +70,14 @@ class InboxEvents {
62
70
  this.disconnectedAt = Date.now();
63
71
  }
64
72
  };
65
- const sub = this.makeServerEvents()
66
- .observe(retrieval_1.msgRecievedCompletely.EVENT_NAME)
67
- .pipe((0, operators_1.mergeMap)(async (ev) => this.getMessage(ev.msgId), 5))
73
+ const sub = (0, rxjs_1.from)(this.msgReceiver.openEventSource().then(({ client, heartbeat }) => {
74
+ const channel = retrieval_1.msgRecievedCompletely.EVENT_NAME;
75
+ heartbeat.subscribe({
76
+ next: ev => this.connectionEvents.next(toInboxConnectionStatus(ev))
77
+ });
78
+ return new rxjs_1.Observable(obs => client.subscribe(channel, obs));
79
+ }))
80
+ .pipe((0, operators_1.mergeMap)(events => events), (0, operators_1.mergeMap)(async (ev) => this.getMessage(ev.msgId), 5))
68
81
  .subscribe({
69
82
  next: msg => {
70
83
  if (msg) {
@@ -155,20 +168,27 @@ class InboxEvents {
155
168
  if (!this.disconnectedAt) {
156
169
  return;
157
170
  }
158
- const fromTS = this.disconnectedAt - BUFFER_MILLIS_FOR_LISTING;
159
- let msgInfos = (await this.listMsgs(fromTS))
160
- .filter(info => (fromTS <= info.deliveryTS))
161
- .sort((a, b) => (a.deliveryTS - b.deliveryTS));
162
- for (const info of msgInfos) {
163
- const msg = await this.getMessage(info.msgId);
164
- if (msg) {
165
- this.newMsgs.next(msg);
171
+ try {
172
+ const fromTS = this.disconnectedAt - BUFFER_MILLIS_FOR_LISTING;
173
+ const msgInfos = (await this.listNewMsgs(fromTS))
174
+ .sort((a, b) => (a.deliveryTS - b.deliveryTS));
175
+ for (const info of msgInfos) {
176
+ const msg = await this.getMessage(info.msgId);
177
+ if (msg) {
178
+ this.newMsgs.next(msg);
179
+ this.disconnectedAt = msg.deliveryTS;
180
+ }
181
+ else if (!this.networkActive) {
182
+ return;
183
+ }
166
184
  }
167
- else if (!this.networkActive) {
168
- return;
185
+ this.disconnectedAt = undefined;
186
+ }
187
+ catch (err) {
188
+ if (err.type !== 'connect') {
189
+ await this.logError(err, `Error while retrieving messages, from disconnected period`);
169
190
  }
170
191
  }
171
- this.disconnectedAt = undefined;
172
192
  }
173
193
  }
174
194
  exports.InboxEvents = InboxEvents;
@@ -94,9 +94,11 @@ export declare class InboxOnServer {
94
94
  private absorbSendingParams;
95
95
  private checkServerAuthIfPresent;
96
96
  private listMsgs;
97
+ private listNewMsgs;
97
98
  private getMsg;
98
99
  private msgToUIForm;
99
100
  suspendNetworkActivity(): void;
100
101
  resumeNetworkActivity(): void;
102
+ get connectivityEvent$(): import("rxjs").Observable<import("./inbox-events").InboxConnectionStatus>;
101
103
  }
102
104
  export {};
@@ -51,7 +51,7 @@ class InboxOnServer {
51
51
  this.logError = logError;
52
52
  this.procs = new synced_1.NamedProcs();
53
53
  this.recentlyOpenedMsgs = (0, timed_cache_1.makeTimedCache)(60 * 1000);
54
- this.inboxEvents = new inbox_events_1.InboxEvents(this.msgReceiver, this.getMsg.bind(this), this.listMsgs.bind(this), this.removeMsg.bind(this), this.logError);
54
+ this.inboxEvents = new inbox_events_1.InboxEvents(this.msgReceiver, this.getMsg.bind(this), this.listNewMsgs.bind(this), this.removeMsg.bind(this), this.logError);
55
55
  Object.seal(this);
56
56
  }
57
57
  static async makeAndStart(cachePath, syncedFS, r) {
@@ -237,6 +237,24 @@ class InboxOnServer {
237
237
  return this.index.listMsgs(fromTS);
238
238
  });
239
239
  }
240
+ async listNewMsgs(fromTS) {
241
+ const msgIds = await this.msgReceiver.listMsgs(fromTS);
242
+ // remove from listing messages already in index
243
+ const indexedMsgs = await this.index.listMsgs(fromTS);
244
+ for (const info of indexedMsgs) {
245
+ const ind = msgIds.indexOf(info.msgId);
246
+ if (ind >= 0) {
247
+ msgIds.splice(ind, 1);
248
+ }
249
+ }
250
+ if (msgIds.length === 0) {
251
+ return [];
252
+ }
253
+ // cache and index these
254
+ await Promise.all(msgIds.map(msgId => this.startCachingAndAddKeyToIndex(msgId)));
255
+ // get info's from index, focusing on specific messages only
256
+ return (await this.index.listMsgs(fromTS)).filter(({ msgId }) => msgIds.includes(msgId));
257
+ }
240
258
  async getMsg(msgId) {
241
259
  if (!msgId || (typeof msgId !== 'string')) {
242
260
  throw `Given message id is not a non-empty string`;
@@ -315,6 +333,9 @@ class InboxOnServer {
315
333
  resumeNetworkActivity() {
316
334
  this.inboxEvents.resumeNetworkActivity();
317
335
  }
336
+ get connectivityEvent$() {
337
+ return this.inboxEvents.connectionEvent$;
338
+ }
318
339
  }
319
340
  exports.InboxOnServer = InboxOnServer;
320
341
  Object.freeze(InboxOnServer.prototype);
@@ -31,5 +31,6 @@ export declare class ASMail {
31
31
  close(): Promise<void>;
32
32
  suspendNetworkActivity(): void;
33
33
  resumeNetworkActivity(): void;
34
+ get connectivityEvent$(): import("rxjs").Observable<import("./inbox/inbox-events").InboxConnectionStatus>;
34
35
  }
35
36
  export {};
@@ -135,6 +135,9 @@ class ASMail {
135
135
  resumeNetworkActivity() {
136
136
  this.inbox.resumeNetworkActivity();
137
137
  }
138
+ get connectivityEvent$() {
139
+ return this.inbox.connectivityEvent$;
140
+ }
138
141
  }
139
142
  exports.ASMail = ASMail;
140
143
  Object.freeze(ASMail.prototype);
@@ -47,5 +47,8 @@ export declare class Core {
47
47
  getStorages(): FactoryOfFSs;
48
48
  onDeviceSystemSuspend(): Promise<void>;
49
49
  onDeviceSystemResume(): Promise<void>;
50
+ get connectivityEvents(): {
51
+ inbox$: import("rxjs").Observable<import("./asmail/inbox/inbox-events").InboxConnectionStatus>;
52
+ };
50
53
  }
51
54
  export {};
@@ -334,6 +334,11 @@ class Core {
334
334
  this.storages.resumeNetworkActivity();
335
335
  this.asmail.resumeNetworkActivity();
336
336
  }
337
+ get connectivityEvents() {
338
+ return {
339
+ inbox$: this.asmail.connectivityEvent$
340
+ };
341
+ }
337
342
  }
338
343
  exports.Core = Core;
339
344
  Object.freeze(Core.prototype);
@@ -1,4 +1,4 @@
1
- export declare const CORE_APPS_PREFIX = "computer.3nweb.core";
1
+ export declare const SYSTEM_PREFIX = "computer.3nweb";
2
2
  export declare const ASMAIL_APP_NAME = "computer.3nweb.core.asmail";
3
3
  export declare const KEYRINGS_APP_NAME = "computer.3nweb.core.keyrings";
4
4
  export declare const MAILERID_APP_NAME = "computer.3nweb.core.mailerid";
@@ -16,9 +16,10 @@
16
16
  this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.MAILERID_APP_NAME = exports.KEYRINGS_APP_NAME = exports.ASMAIL_APP_NAME = exports.CORE_APPS_PREFIX = void 0;
20
- exports.CORE_APPS_PREFIX = 'computer.3nweb.core';
21
- exports.ASMAIL_APP_NAME = `${exports.CORE_APPS_PREFIX}.asmail`;
22
- exports.KEYRINGS_APP_NAME = `${exports.CORE_APPS_PREFIX}.keyrings`;
23
- exports.MAILERID_APP_NAME = `${exports.CORE_APPS_PREFIX}.mailerid`;
19
+ exports.MAILERID_APP_NAME = exports.KEYRINGS_APP_NAME = exports.ASMAIL_APP_NAME = exports.SYSTEM_PREFIX = void 0;
20
+ exports.SYSTEM_PREFIX = 'computer.3nweb';
21
+ const CORE_APPS_PREFIX = `${exports.SYSTEM_PREFIX}.core`;
22
+ exports.ASMAIL_APP_NAME = `${CORE_APPS_PREFIX}.asmail`;
23
+ exports.KEYRINGS_APP_NAME = `${CORE_APPS_PREFIX}.keyrings`;
24
+ exports.MAILERID_APP_NAME = `${CORE_APPS_PREFIX}.mailerid`;
24
25
  Object.freeze(exports);
@@ -186,8 +186,8 @@ class StorageAndFS {
186
186
  * @param dst is a path starting with core app folder name
187
187
  */
188
188
  async migrateCoreAppDataOnFirstRun(src, dst) {
189
- (0, assert_1.assert)(src.startsWith(constants_1.CORE_APPS_PREFIX) && !src.includes('..') &&
190
- dst.startsWith(constants_1.CORE_APPS_PREFIX) && !dst.includes('..'), `Invalid core app data migration paths`);
189
+ (0, assert_1.assert)(src.startsWith(constants_1.SYSTEM_PREFIX) && !src.includes('..') &&
190
+ dst.startsWith(constants_1.SYSTEM_PREFIX) && !dst.includes('..'), `Invalid core app data migration paths`);
191
191
  if (!(await this.rootFS.checkFolderPresence(src))
192
192
  || !(await this.rootFS.checkFilePresence(src))
193
193
  || (await this.rootFS.checkFolderPresence(dst))
@@ -454,7 +454,7 @@ class PerAppStorage {
454
454
  if (typeof appFolder !== 'string') {
455
455
  throw makeBadAppNameExc(appFolder);
456
456
  }
457
- if (appFolder.startsWith(constants_1.CORE_APPS_PREFIX)) {
457
+ if (appFolder.startsWith(constants_1.SYSTEM_PREFIX)) {
458
458
  throw makeNotAllowedToOpenAppFSExc(appFolder);
459
459
  }
460
460
  if (!this.policy.canOpenAppFS(appFolder, type)) {
@@ -1,7 +1,12 @@
1
+ import { Observable } from 'rxjs';
1
2
  import { StorageOwner } from '../../../lib-client/3nstorage/storage-owner';
2
3
  import { ObjFiles } from './obj-files';
3
4
  import { Storage } from '../../../lib-client/xsp-fs/common';
4
5
  import { LogError } from '../../../lib-client/logging/log-to-file';
6
+ import { ConnectionStatus } from '../../../lib-common/ipc/ws-ipc';
7
+ export interface StorageConnectionStatus extends ConnectionStatus {
8
+ service: 'storage';
9
+ }
5
10
  /**
6
11
  * Remote events are absorbed into objects' statuses, broadcasting respective
7
12
  * events. Someone down the stream can react to these changes from remote.
@@ -11,6 +16,8 @@ export declare class RemoteEvents {
11
16
  private readonly files;
12
17
  private readonly broadcastNodeEvent;
13
18
  private readonly logError;
19
+ private readonly connectionEvents;
20
+ readonly connectionEvent$: Observable<StorageConnectionStatus>;
14
21
  constructor(remoteStorage: StorageOwner, files: ObjFiles, broadcastNodeEvent: Storage['broadcastNodeEvent'], logError: LogError);
15
22
  private absorbingRemoteEventsProc;
16
23
  startAbsorbingRemoteEvents(): void;
@@ -18,9 +18,15 @@
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.RemoteEvents = void 0;
20
20
  const rxjs_1 = require("rxjs");
21
- const server_events_1 = require("../../../lib-client/server-events");
22
21
  const owner_1 = require("../../../lib-common/service-api/3nstorage/owner");
23
22
  const operators_1 = require("rxjs/operators");
23
+ const ws_ipc_1 = require("../../../lib-common/ipc/ws-ipc");
24
+ function toStorageConnectionStatus(status, params) {
25
+ return (0, ws_ipc_1.addToStatus)(status, {
26
+ service: 'storage',
27
+ ...params
28
+ });
29
+ }
24
30
  const SERVER_EVENTS_RESTART_WAIT_SECS = 5;
25
31
  /**
26
32
  * Remote events are absorbed into objects' statuses, broadcasting respective
@@ -32,16 +38,23 @@ class RemoteEvents {
32
38
  this.files = files;
33
39
  this.broadcastNodeEvent = broadcastNodeEvent;
34
40
  this.logError = logError;
41
+ this.connectionEvents = new rxjs_1.Subject();
42
+ this.connectionEvent$ = this.connectionEvents.asObservable().pipe((0, operators_1.share)());
35
43
  this.absorbingRemoteEventsProc = undefined;
36
44
  Object.seal(this);
37
45
  }
38
46
  startAbsorbingRemoteEvents() {
39
- const serverEvents = new server_events_1.ServerEvents(() => this.remoteStorage.openEventSource(this.logError));
40
- this.absorbingRemoteEventsProc = (0, rxjs_1.merge)(this.absorbObjChange(serverEvents), this.absorbObjRemoval(serverEvents),
47
+ this.absorbingRemoteEventsProc = (0, rxjs_1.from)(this.remoteStorage.openEventSource().then(({ client, heartbeat }) => {
48
+ heartbeat.subscribe({
49
+ next: ev => this.connectionEvents.next(toStorageConnectionStatus(ev))
50
+ });
51
+ return client;
52
+ }))
53
+ .pipe((0, operators_1.map)(client => (0, rxjs_1.merge)(this.absorbObjChange(client), this.absorbObjRemoval(client),
41
54
  // XXX commenting out to see if unknownEvent exception goes away
42
55
  // Is server doesn't know it?
43
- // this.absorbObjVersionArchival(serverEvents),
44
- this.absorbArchVersionRemoval(serverEvents))
56
+ // this.absorbObjVersionArchival(client),
57
+ this.absorbArchVersionRemoval(client))), (0, operators_1.mergeMap)(event$ => event$))
45
58
  .subscribe({
46
59
  next: noop,
47
60
  error: async (err) => {
@@ -59,8 +72,8 @@ class RemoteEvents {
59
72
  this.absorbingRemoteEventsProc = undefined;
60
73
  }
61
74
  }
62
- absorbObjChange(serverEvents) {
63
- return serverEvents.observe(owner_1.events.objChanged.EVENT_NAME)
75
+ absorbObjChange(client) {
76
+ return (new rxjs_1.Observable(obs => client.subscribe(owner_1.events.objChanged.EVENT_NAME, obs)))
64
77
  .pipe((0, operators_1.mergeMap)(async ({ newVer, objId }) => {
65
78
  if (!Number.isInteger(newVer) || (newVer < 1)) {
66
79
  return;
@@ -77,9 +90,9 @@ class RemoteEvents {
77
90
  });
78
91
  }, 1));
79
92
  }
80
- absorbObjRemoval(serverEvents) {
81
- return serverEvents.observe(owner_1.events.objRemoved.EVENT_NAME)
82
- .pipe((0, operators_1.filter)((objRm) => !!objRm.objId), (0, operators_1.mergeMap)(async ({ objId }) => {
93
+ absorbObjRemoval(client) {
94
+ return (new rxjs_1.Observable(obs => client.subscribe(owner_1.events.objRemoved.EVENT_NAME, obs)))
95
+ .pipe((0, operators_1.filter)(objRmEvent => !!objRmEvent.objId), (0, operators_1.mergeMap)(async ({ objId }) => {
83
96
  const obj = await this.files.findObj(objId);
84
97
  if (!obj) {
85
98
  return;
@@ -91,8 +104,8 @@ class RemoteEvents {
91
104
  });
92
105
  }, 1));
93
106
  }
94
- absorbObjVersionArchival(serverEvents) {
95
- return serverEvents.observe(owner_1.events.objVersionArchived.EVENT_NAME)
107
+ absorbObjVersionArchival(client) {
108
+ return (new rxjs_1.Observable(obs => client.subscribe(owner_1.events.objVersionArchived.EVENT_NAME, obs)))
96
109
  .pipe((0, operators_1.mergeMap)(async ({ objId, archivedVer }) => {
97
110
  const obj = await this.files.findObj(objId);
98
111
  if (!obj) {
@@ -106,8 +119,8 @@ class RemoteEvents {
106
119
  });
107
120
  }, 1));
108
121
  }
109
- absorbArchVersionRemoval(serverEvents) {
110
- return serverEvents.observe(owner_1.events.objArchivedVersionRemoved.EVENT_NAME)
122
+ absorbArchVersionRemoval(client) {
123
+ return (new rxjs_1.Observable(obs => client.subscribe(owner_1.events.objArchivedVersionRemoved.EVENT_NAME, obs)))
111
124
  .pipe((0, operators_1.mergeMap)(async ({ objId, archivedVer }) => {
112
125
  const obj = await this.files.findObj(objId);
113
126
  if (!obj) {
@@ -2,9 +2,8 @@ import { NetClient } from '../request-utils';
2
2
  import * as api from '../../lib-common/service-api/3nstorage/owner';
3
3
  import { ServiceUser, IGetMailerIdSigner } from '../user-with-mid-session';
4
4
  import * as keyGen from '../key-derivation';
5
- import { SubscribingClient } from '../../lib-common/ipc/ws-ipc';
5
+ import { makeSubscriber } from '../../lib-common/ipc/ws-ipc';
6
6
  import { ObjId } from '../xsp-fs/common';
7
- import { LogError } from '../logging/log-to-file';
8
7
  export type FirstSaveReqOpts = api.PutObjFirstQueryOpts;
9
8
  export type FollowingSaveReqOpts = api.PutObjSecondQueryOpts;
10
9
  export declare class StorageOwner extends ServiceUser {
@@ -87,5 +86,5 @@ export declare class StorageOwner extends ServiceUser {
87
86
  * @return a promise, resolvable, when an object is deleted.
88
87
  */
89
88
  deleteObj(objId: string): Promise<void>;
90
- openEventSource(log: LogError): Promise<SubscribingClient>;
89
+ openEventSource(): Promise<ReturnType<typeof makeSubscriber>>;
91
90
  }
@@ -329,10 +329,10 @@ class StorageOwner extends user_with_mid_session_1.ServiceUser {
329
329
  throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
330
330
  }
331
331
  }
332
- async openEventSource(log) {
332
+ async openEventSource() {
333
333
  const rep = await this.openWS(api.wsEventChannel.URL_END);
334
334
  if (rep.status === api.wsEventChannel.SC.ok) {
335
- return (0, ws_ipc_1.makeSubscriber)(rep.data, undefined, log);
335
+ return (0, ws_ipc_1.makeSubscriber)(rep.data, undefined);
336
336
  }
337
337
  else {
338
338
  throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
@@ -1,8 +1,7 @@
1
1
  import { NetClient } from '../request-utils';
2
2
  import * as api from '../../lib-common/service-api/asmail/retrieval';
3
3
  import { ServiceUser, IGetMailerIdSigner } from '../user-with-mid-session';
4
- import { SubscribingClient } from '../../lib-common/ipc/ws-ipc';
5
- import { LogError } from '../logging/log-to-file';
4
+ import { makeSubscriber } from '../../lib-common/ipc/ws-ipc';
6
5
  type InboxException = web3n.asmail.InboxException;
7
6
  export declare function makeMsgNotFoundException(msgId: string): InboxException;
8
7
  export declare function makeObjNotFoundException(msgId: string, objId: string): InboxException;
@@ -37,6 +36,6 @@ export declare class MailRecipient extends ServiceUser {
37
36
  */
38
37
  getObjSegs(msgId: string, objId: string, start: number, end: number): Promise<Uint8Array>;
39
38
  removeMsg(msgId: string): Promise<void>;
40
- openEventSource(log: LogError): Promise<SubscribingClient>;
39
+ openEventSource(): Promise<ReturnType<typeof makeSubscriber>>;
41
40
  }
42
41
  export {};
@@ -191,10 +191,10 @@ class MailRecipient extends user_with_mid_session_1.ServiceUser {
191
191
  throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
192
192
  }
193
193
  }
194
- async openEventSource(log) {
194
+ async openEventSource() {
195
195
  const rep = await this.openWS(api.wsEventChannel.URL_END);
196
196
  if (rep.status === api.wsEventChannel.SC.ok) {
197
- return (0, ws_ipc_1.makeSubscriber)(rep.data, undefined, log);
197
+ return (0, ws_ipc_1.makeSubscriber)(rep.data, undefined);
198
198
  }
199
199
  else {
200
200
  throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
@@ -1,4 +1,4 @@
1
- import { LogError } from '../../lib-client/logging/log-to-file';
1
+ import { Observable } from 'rxjs';
2
2
  import { SubscribingClient } from './generic-ipc';
3
3
  import * as WebSocket from 'ws';
4
4
  export { RequestEnvelope, RequestHandler, EventfulServer, makeEventfulServer, SubscribingClient } from './generic-ipc';
@@ -8,4 +8,20 @@ export interface WSException extends web3n.RuntimeException {
8
8
  socketClosed?: true;
9
9
  }
10
10
  export declare function makeWSException(params: Partial<WSException>, flags?: Partial<WSException>): WSException;
11
- export declare function makeSubscriber(ws: WebSocket, ipcChannel: string | undefined, log: LogError): SubscribingClient;
11
+ export interface ConnectionStatus {
12
+ /**
13
+ * ping number is a number of millisecond between previous and current data receiving from server.
14
+ */
15
+ ping?: number;
16
+ /**
17
+ * This mirrors a "slow socket" exception, thrown to data sending process.
18
+ */
19
+ slowSocket?: true;
20
+ socketClosed?: true;
21
+ error?: any;
22
+ }
23
+ export declare function makeSubscriber(ws: WebSocket, ipcChannel: string | undefined): {
24
+ client: SubscribingClient;
25
+ heartbeat: Observable<ConnectionStatus>;
26
+ };
27
+ export declare function addToStatus<T extends ConnectionStatus>(status: ConnectionStatus, params: Partial<T>): T;
@@ -18,6 +18,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.makeEventfulServer = void 0;
19
19
  exports.makeWSException = makeWSException;
20
20
  exports.makeSubscriber = makeSubscriber;
21
+ exports.addToStatus = addToStatus;
22
+ const rxjs_1 = require("rxjs");
21
23
  const runtime_1 = require("../exceptions/runtime");
22
24
  const generic_ipc_1 = require("./generic-ipc");
23
25
  var generic_ipc_2 = require("./generic-ipc");
@@ -32,31 +34,10 @@ const MAX_TXT_BUFFER = 64 * 1024;
32
34
  * messages.
33
35
  * @param ws
34
36
  */
35
- function makeJsonCommPoint(ws, log) {
37
+ function makeJsonCommPoint(ws) {
36
38
  const observers = new generic_ipc_1.MultiObserverWrap();
37
- const resetTimer = makeSignalsTimeObserver(ws.url, log);
38
- ws.on('message', onTxtMessage(ws, observers, resetTimer));
39
- ws.on('close', onClose(observers, resetTimer));
40
- ws.on('error', onError(ws, observers, resetTimer));
41
- ws.on('ping', onPing(ws, resetTimer));
42
- const commPoint = {
43
- subscribe: obs => observers.add(obs),
44
- postMessage(env) {
45
- if (ws.bufferedAmount > MAX_TXT_BUFFER) {
46
- throw makeWSException({ socketSlow: true });
47
- }
48
- ws.send(JSON.stringify(env));
49
- }
50
- };
51
- return commPoint;
52
- }
53
- /**
54
- * This generates an on-message callback for text messages in a web socket.
55
- * @param ws
56
- * @param observers
57
- */
58
- function onTxtMessage(ws, observers, resetTimer) {
59
- return (data) => {
39
+ const { heartbeat, healthyBeat, otherBeat } = makeHeartbeat();
40
+ ws.on('message', data => {
60
41
  if (typeof data !== 'string') {
61
42
  return;
62
43
  }
@@ -69,83 +50,85 @@ function onTxtMessage(ws, observers, resetTimer) {
69
50
  }
70
51
  catch (err) {
71
52
  ws.close();
53
+ otherBeat(err, true);
72
54
  observers.error(err);
73
55
  return;
74
56
  }
75
57
  observers.next(env);
76
- resetTimer();
77
- };
78
- }
79
- /**
80
- * This generates an on-close callback for a web socket.
81
- * @param observers
82
- */
83
- function onClose(observers, resetTimer) {
84
- return (code, reason) => {
58
+ healthyBeat();
59
+ });
60
+ ws.on('close', (code, reason) => {
85
61
  if (code === 1000) {
86
- resetTimer(true);
62
+ otherBeat(undefined, true);
87
63
  observers.complete();
88
64
  }
89
65
  else {
90
- resetTimer(true, { code, reason });
66
+ otherBeat({ error: { code, reason } }, true);
91
67
  observers.error(makeWSException({
92
68
  socketClosed: true,
93
69
  cause: { code, reason }
94
70
  }));
95
71
  }
96
- };
97
- }
98
- /**
99
- * This generates an on-error callback for a web socket.
100
- * @param ws
101
- * @param observers
102
- */
103
- function onError(ws, observers, closeTimer) {
104
- return (err) => {
105
- closeTimer(true, err);
72
+ });
73
+ ws.on('error', (err) => {
74
+ otherBeat(err, true);
106
75
  observers.error(makeWSException({ cause: err }));
107
76
  ws.close();
108
- };
109
- }
110
- function onPing(ws, resetTimer) {
111
- return () => {
112
- resetTimer();
77
+ });
78
+ ws.on('ping', () => {
113
79
  ws.pong();
80
+ healthyBeat();
81
+ });
82
+ const comm = {
83
+ subscribe: obs => observers.add(obs),
84
+ postMessage(env) {
85
+ if (ws.bufferedAmount > MAX_TXT_BUFFER) {
86
+ otherBeat({ slowSocket: true });
87
+ throw makeWSException({ socketSlow: true });
88
+ }
89
+ ws.send(JSON.stringify(env));
90
+ }
114
91
  };
92
+ return { comm, heartbeat };
115
93
  }
116
- function makeSignalsTimeObserver(url, log) {
117
- const serverPingSettings = 2 * 60 * 1000;
118
- let lastMoment = Date.now();
119
- let int = undefined;
120
- function resetWait(setNew = true) {
121
- lastMoment = Date.now();
122
- if (int) {
123
- clearInterval(int);
124
- int = undefined;
125
- }
126
- if (setNew) {
127
- int = setInterval(() => {
128
- log(`Ping/data from ${url} is not observed in last ${Math.floor((Date.now() - lastMoment) / 1000)} seconds`);
129
- }, serverPingSettings * 1.5).unref();
130
- }
94
+ function makeHeartbeat() {
95
+ const status = new rxjs_1.Subject();
96
+ let lastInfo = Date.now();
97
+ function healthyBeat() {
98
+ const now = Date.now();
99
+ status.next({
100
+ ping: now - lastInfo
101
+ });
102
+ lastInfo = now;
131
103
  }
132
- return (done, err) => {
133
- if (done) {
134
- if (err) {
135
- log(err, `WebSocket to ${url} closed with error`);
136
- }
137
- else {
138
- log(null, `WebSocket to ${url} closed`);
139
- }
140
- resetWait(false);
104
+ function otherBeat(beat, end = false) {
105
+ if (beat) {
106
+ status.next(beat);
141
107
  }
142
- else {
143
- resetWait();
108
+ if (end) {
109
+ status.next({
110
+ socketClosed: true
111
+ });
112
+ status.complete();
144
113
  }
114
+ }
115
+ return {
116
+ heartbeat: status.asObservable().pipe((0, rxjs_1.share)()),
117
+ healthyBeat,
118
+ otherBeat
119
+ };
120
+ }
121
+ function makeSubscriber(ws, ipcChannel) {
122
+ const { comm, heartbeat } = makeJsonCommPoint(ws);
123
+ return {
124
+ client: (0, generic_ipc_1.makeSubscribingClient)(ipcChannel, comm),
125
+ heartbeat
145
126
  };
146
127
  }
147
- function makeSubscriber(ws, ipcChannel, log) {
148
- const comm = makeJsonCommPoint(ws, log);
149
- return (0, generic_ipc_1.makeSubscribingClient)(ipcChannel, comm);
128
+ function addToStatus(status, params) {
129
+ for (const [field, value] of Object.values(params)) {
130
+ status[field] = value;
131
+ }
132
+ return status;
150
133
  }
151
134
  Object.freeze(exports);
@@ -11,3 +11,4 @@ export { appDirs } from './core/app-files';
11
11
  export { sysFolders } from "./core/storage/system-folders";
12
12
  export { DeviceFS } from './lib-client/local-files/device-fs';
13
13
  export { makeLogger } from './lib-client/logging/log-to-file';
14
+ export declare const SYSTEM_DOMAIN = "3nweb.computer";
@@ -30,7 +30,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
30
30
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
31
31
  };
32
32
  Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.makeLogger = exports.DeviceFS = exports.sysFolders = exports.appDirs = exports.makeNetClient = exports.makeServiceLocator = exports.ASMail = exports.SignIn = exports.reverseDomain = exports.Storages = exports.IdManager = exports.SignUp = void 0;
33
+ exports.SYSTEM_DOMAIN = exports.makeLogger = exports.DeviceFS = exports.sysFolders = exports.appDirs = exports.makeNetClient = exports.makeServiceLocator = exports.ASMail = exports.SignIn = exports.reverseDomain = exports.Storages = exports.IdManager = exports.SignUp = void 0;
34
34
  __exportStar(require("./core"), exports);
35
35
  var sign_up_1 = require("./core/startup/sign-up");
36
36
  Object.defineProperty(exports, "SignUp", { enumerable: true, get: function () { return sign_up_1.SignUp; } });
@@ -55,4 +55,5 @@ var device_fs_1 = require("./lib-client/local-files/device-fs");
55
55
  Object.defineProperty(exports, "DeviceFS", { enumerable: true, get: function () { return device_fs_1.DeviceFS; } });
56
56
  var log_to_file_1 = require("./lib-client/logging/log-to-file");
57
57
  Object.defineProperty(exports, "makeLogger", { enumerable: true, get: function () { return log_to_file_1.makeLogger; } });
58
+ exports.SYSTEM_DOMAIN = '3nweb.computer';
58
59
  Object.freeze(exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "core-3nweb-client-lib",
3
- "version": "0.42.3",
3
+ "version": "0.42.5",
4
4
  "description": "3NWeb client core library, embeddable into different environments",
5
5
  "main": "build/lib-index.js",
6
6
  "types": "build/lib-index.d.ts",
@@ -1,14 +0,0 @@
1
- import { SubscribingClient } from '../lib-common/ipc/generic-ipc';
2
- import { Observable } from 'rxjs';
3
- export declare class ServerEvents<N extends string, T> {
4
- private readonly subscribeToServer;
5
- private server;
6
- private openningServer;
7
- constructor(subscribeToServer: () => Promise<SubscribingClient>);
8
- /**
9
- * This method creates an observable of server's events.
10
- * @param event is an event on server, to which to subscribe.
11
- */
12
- observe(event: N): Observable<T>;
13
- private setServer;
14
- }
@@ -1,82 +0,0 @@
1
- "use strict";
2
- /*
3
- Copyright (C) 2017, 2019, 2022, 2025 3NSoft Inc.
4
-
5
- This program is free software: you can redistribute it and/or modify it under
6
- the terms of the GNU General Public License as published by the Free Software
7
- Foundation, either version 3 of the License, or (at your option) any later
8
- version.
9
-
10
- This program is distributed in the hope that it will be useful, but
11
- WITHOUT ANY WARRANTY; without even the implied warranty of
12
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
- See the GNU General Public License for more details.
14
-
15
- You should have received a copy of the GNU General Public License along with
16
- this program. If not, see <http://www.gnu.org/licenses/>.
17
- */
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.ServerEvents = void 0;
20
- const rxjs_1 = require("rxjs");
21
- const synced_1 = require("../lib-common/processes/synced");
22
- class ServerEvents {
23
- constructor(subscribeToServer) {
24
- this.subscribeToServer = subscribeToServer;
25
- this.server = undefined;
26
- this.openningServer = new synced_1.SingleProc();
27
- Object.seal(this);
28
- }
29
- /**
30
- * This method creates an observable of server's events.
31
- * @param event is an event on server, to which to subscribe.
32
- */
33
- observe(event) {
34
- return new rxjs_1.Observable(observer => {
35
- // simple sync creation of detach function
36
- if (this.server) {
37
- return this.server.subscribe(event, observer);
38
- }
39
- // detach function that works around of async creation of event source
40
- let detach;
41
- let obs = observer;
42
- // open server, ensuring only one process running
43
- if (!this.openningServer.isProcessing()) {
44
- this.openningServer.addStarted(this.subscribeToServer());
45
- }
46
- this.openningServer.latestTaskAtThisMoment()
47
- .then((server) => {
48
- this.setServer(server);
49
- if (!obs) {
50
- return;
51
- }
52
- detach = this.server.subscribe(event, obs);
53
- obs = undefined;
54
- })
55
- .catch(err => {
56
- obs === null || obs === void 0 ? void 0 : obs.error(err);
57
- obs = undefined;
58
- });
59
- return () => {
60
- if (detach) {
61
- detach();
62
- detach = undefined;
63
- }
64
- else {
65
- obs = undefined;
66
- }
67
- };
68
- });
69
- }
70
- setServer(server) {
71
- this.server = server;
72
- this.server.on('end', () => {
73
- if (this.server === server) {
74
- this.server = undefined;
75
- }
76
- });
77
- }
78
- }
79
- exports.ServerEvents = ServerEvents;
80
- Object.freeze(ServerEvents.prototype);
81
- Object.freeze(ServerEvents);
82
- Object.freeze(exports);
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:42 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:42 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:17:04 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:17:04 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:17:04 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:17:04 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:17:07 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:17:07 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,28 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:17:07 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:17:07 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
13
-
14
- Error message: undefined
15
-
16
- Sun Oct 05 2025 15:17:07 GMT-0400 (Eastern Daylight Saving Time) ==================================
17
- Core version 0.42.3
18
- Log level: error.
19
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
20
-
21
- Error message: undefined
22
-
23
- Sun Oct 05 2025 15:17:07 GMT-0400 (Eastern Daylight Saving Time) ==================================
24
- Core version 0.42.3
25
- Log level: error.
26
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
27
-
28
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:44 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:44 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,28 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:34 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:34 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
13
-
14
- Error message: undefined
15
-
16
- Sun Oct 05 2025 15:16:34 GMT-0400 (Eastern Daylight Saving Time) ==================================
17
- Core version 0.42.3
18
- Log level: error.
19
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
20
-
21
- Error message: undefined
22
-
23
- Sun Oct 05 2025 15:16:34 GMT-0400 (Eastern Daylight Saving Time) ==================================
24
- Core version 0.42.3
25
- Log level: error.
26
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
27
-
28
- Error message: undefined
@@ -1,28 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:40 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:40 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
13
-
14
- Error message: undefined
15
-
16
- Sun Oct 05 2025 15:16:40 GMT-0400 (Eastern Daylight Saving Time) ==================================
17
- Core version 0.42.3
18
- Log level: error.
19
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
20
-
21
- Error message: undefined
22
-
23
- Sun Oct 05 2025 15:16:40 GMT-0400 (Eastern Daylight Saving Time) ==================================
24
- Core version 0.42.3
25
- Log level: error.
26
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
27
-
28
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:46 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:46 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:48 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:48 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:16:56 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:16:56 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,14 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:17:00 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:17:00 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
13
-
14
- Error message: undefined
@@ -1,28 +0,0 @@
1
-
2
- Sun Oct 05 2025 15:17:00 GMT-0400 (Eastern Daylight Saving Time) ==================================
3
- Core version 0.42.3
4
- Log level: error.
5
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
6
-
7
- Error message: undefined
8
-
9
- Sun Oct 05 2025 15:17:00 GMT-0400 (Eastern Daylight Saving Time) ==================================
10
- Core version 0.42.3
11
- Log level: error.
12
- WebSocket to wss://localhost:8088/asmail/retrieval/events closed with error
13
-
14
- Error message: undefined
15
-
16
- Sun Oct 05 2025 15:17:00 GMT-0400 (Eastern Daylight Saving Time) ==================================
17
- Core version 0.42.3
18
- Log level: error.
19
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
20
-
21
- Error message: undefined
22
-
23
- Sun Oct 05 2025 15:17:00 GMT-0400 (Eastern Daylight Saving Time) ==================================
24
- Core version 0.42.3
25
- Log level: error.
26
- WebSocket to wss://localhost:8088/3nstorage/owner/events closed with error
27
-
28
- Error message: undefined