core-3nweb-client-lib 0.43.4 → 0.43.6
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.
- package/build/api-defs/files.d.ts +9 -5
- package/build/core/asmail/inbox/inbox-events.d.ts +2 -7
- package/build/core/asmail/inbox/inbox-events.js +28 -75
- package/build/core/storage/synced/obj-status.d.ts +1 -1
- package/build/core/storage/synced/obj-status.js +2 -2
- package/build/core/storage/synced/remote-events.d.ts +3 -2
- package/build/core/storage/synced/remote-events.js +19 -24
- package/build/core/storage/synced/storage.js +3 -7
- package/build/core-ipc/file.js +2 -2
- package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
- package/build/lib-client/cryptor/cryptor.wasm +0 -0
- package/build/lib-client/xsp-fs/folder-node.js +5 -10
- package/build/lib-client/xsp-fs/node-in-fs.d.ts +2 -0
- package/build/lib-client/xsp-fs/node-in-fs.js +11 -5
- package/build/lib-common/ipc/ws-ipc.d.ts +12 -0
- package/build/lib-common/ipc/ws-ipc.js +66 -1
- package/package.json +1 -1
|
@@ -603,16 +603,19 @@ declare namespace web3n.files {
|
|
|
603
603
|
|
|
604
604
|
/**
|
|
605
605
|
* Adopts remote version.
|
|
606
|
-
*
|
|
606
|
+
* In conflicting state remote version must be present in options.
|
|
607
|
+
* @param opts options let one to pass exact remote version.
|
|
607
608
|
*/
|
|
608
609
|
adoptRemote(opts?: OptionsToAdopteRemote): Promise<void>;
|
|
609
610
|
|
|
610
611
|
}
|
|
611
612
|
|
|
612
613
|
interface OptionsToAdopteRemote {
|
|
613
|
-
|
|
614
|
+
/**
|
|
615
|
+
* Identifies remote version that should be adopted.
|
|
616
|
+
* In conflicting state this must be present.
|
|
617
|
+
*/
|
|
614
618
|
remoteVersion?: number;
|
|
615
|
-
download?: boolean;
|
|
616
619
|
}
|
|
617
620
|
|
|
618
621
|
interface WritableFileSyncAPI extends ReadonlyFileSyncAPI {
|
|
@@ -1228,9 +1231,10 @@ declare namespace web3n.files {
|
|
|
1228
1231
|
download(path: string, version: number): Promise<void>;
|
|
1229
1232
|
|
|
1230
1233
|
/**
|
|
1231
|
-
* Adopts remote version of fs object at given path
|
|
1234
|
+
* Adopts remote version of fs object at given path.
|
|
1235
|
+
* In conflicting state remote version must be present in options.
|
|
1232
1236
|
* @param path
|
|
1233
|
-
* @param opts options let one to pass exact remote version
|
|
1237
|
+
* @param opts options let one to pass exact remote version.
|
|
1234
1238
|
*/
|
|
1235
1239
|
adoptRemote(path: string, opts?: OptionsToAdopteRemote): Promise<void>;
|
|
1236
1240
|
|
|
@@ -29,18 +29,13 @@ export declare class InboxEvents {
|
|
|
29
29
|
private readonly newMsg$;
|
|
30
30
|
private readonly connectionEvents;
|
|
31
31
|
readonly connectionEvent$: Observable<InboxConnectionStatus>;
|
|
32
|
-
private
|
|
33
|
-
private networkActive;
|
|
32
|
+
private readonly wsProc;
|
|
34
33
|
private disconnectedAt;
|
|
35
34
|
constructor(msgReceiver: MailRecipient, getMsg: (msgId: string) => Promise<IncomingMessage>, listNewMsgs: (fromTS: number) => Promise<MsgInfo[]>, rmMsg: (msgId: string) => Promise<void>, logError: LogError);
|
|
36
|
-
private
|
|
37
|
-
private sleepAndRestart;
|
|
35
|
+
private makeProc;
|
|
38
36
|
private getMessage;
|
|
39
37
|
subscribe<T>(event: InboxEventType, observer: Observer<T>): () => void;
|
|
40
38
|
close(): void;
|
|
41
|
-
get isListening(): boolean;
|
|
42
|
-
private shouldRestartAfterErr;
|
|
43
|
-
private stopListening;
|
|
44
39
|
suspendNetworkActivity(): void;
|
|
45
40
|
resumeNetworkActivity(): void;
|
|
46
41
|
private listMsgsFromDisconnectedPeriod;
|
|
@@ -22,7 +22,6 @@ const retrieval_1 = require("../../../lib-common/service-api/asmail/retrieval");
|
|
|
22
22
|
const operators_1 = require("rxjs/operators");
|
|
23
23
|
const utils_for_observables_1 = require("../../../lib-common/utils-for-observables");
|
|
24
24
|
const ws_ipc_1 = require("../../../lib-common/ipc/ws-ipc");
|
|
25
|
-
const sleep_1 = require("../../../lib-common/processes/sleep");
|
|
26
25
|
function toInboxConnectionStatus(status, params) {
|
|
27
26
|
return (0, ws_ipc_1.addToStatus)(status, {
|
|
28
27
|
service: 'inbox',
|
|
@@ -52,54 +51,30 @@ class InboxEvents {
|
|
|
52
51
|
this.newMsg$ = this.newMsgs.asObservable().pipe((0, operators_1.share)());
|
|
53
52
|
this.connectionEvents = new rxjs_1.Subject();
|
|
54
53
|
this.connectionEvent$ = this.connectionEvents.asObservable().pipe((0, operators_1.share)());
|
|
55
|
-
this.listeningProc = undefined;
|
|
56
|
-
this.networkActive = true;
|
|
57
54
|
this.disconnectedAt = undefined;
|
|
58
|
-
this.
|
|
55
|
+
this.wsProc = new ws_ipc_1.WebSocketListening(SERVER_EVENTS_RESTART_WAIT_SECS, this.makeProc.bind(this));
|
|
56
|
+
this.wsProc.startListening();
|
|
59
57
|
Object.seal(this);
|
|
60
58
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const clearListeningProc = () => {
|
|
66
|
-
if (this.listeningProc === sub) {
|
|
67
|
-
this.listeningProc = undefined;
|
|
68
|
-
}
|
|
69
|
-
if (!this.disconnectedAt) {
|
|
70
|
-
this.disconnectedAt = Date.now();
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
const sub = (0, rxjs_1.from)(this.msgReceiver.openEventSource().then(({ client, heartbeat }) => {
|
|
59
|
+
makeProc() {
|
|
60
|
+
const proc$ = (0, rxjs_1.from)(this.msgReceiver.openEventSource().then(({ client, heartbeat }) => {
|
|
74
61
|
const channel = retrieval_1.msgRecievedCompletely.EVENT_NAME;
|
|
75
62
|
heartbeat.subscribe({
|
|
76
63
|
next: ev => this.connectionEvents.next(toInboxConnectionStatus(ev))
|
|
77
64
|
});
|
|
78
65
|
return new rxjs_1.Observable(obs => client.subscribe(channel, obs));
|
|
79
66
|
}))
|
|
80
|
-
.pipe((0, operators_1.mergeMap)(events => events), (0, operators_1.mergeMap)(async (ev) => this.getMessage(ev.msgId), 5))
|
|
81
|
-
.
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
this.
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
complete: () => {
|
|
88
|
-
clearListeningProc();
|
|
89
|
-
},
|
|
90
|
-
error: async (exc) => {
|
|
91
|
-
clearListeningProc();
|
|
92
|
-
if (this.shouldRestartAfterErr(exc)) {
|
|
93
|
-
this.sleepAndRestart();
|
|
67
|
+
.pipe((0, operators_1.mergeMap)(events => events), (0, operators_1.mergeMap)(async (ev) => this.getMessage(ev.msgId), 5), (0, operators_1.filter)(msg => !!msg), (0, operators_1.tap)({
|
|
68
|
+
next: msg => this.newMsgs.next(msg),
|
|
69
|
+
error: () => {
|
|
70
|
+
if (!this.disconnectedAt) {
|
|
71
|
+
this.disconnectedAt = Date.now();
|
|
94
72
|
}
|
|
95
73
|
}
|
|
96
|
-
});
|
|
97
|
-
|
|
74
|
+
}));
|
|
75
|
+
// list messages as a side effect of starting, or at point of starting.
|
|
98
76
|
this.listMsgsFromDisconnectedPeriod();
|
|
99
|
-
|
|
100
|
-
async sleepAndRestart() {
|
|
101
|
-
await (0, sleep_1.sleep)(SERVER_EVENTS_RESTART_WAIT_SECS);
|
|
102
|
-
this.startListening();
|
|
77
|
+
return proc$;
|
|
103
78
|
}
|
|
104
79
|
async getMessage(msgId) {
|
|
105
80
|
try {
|
|
@@ -123,45 +98,26 @@ class InboxEvents {
|
|
|
123
98
|
}
|
|
124
99
|
close() {
|
|
125
100
|
this.newMsgs.complete();
|
|
101
|
+
this.wsProc.close();
|
|
126
102
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
if (exc.type === 'connect') {
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
else if (exc.type === 'http-request') {
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
else if (exc.type === 'websocket') {
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
stopListening() {
|
|
148
|
-
var _a;
|
|
149
|
-
(_a = this.listeningProc) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
150
|
-
this.listeningProc = undefined;
|
|
151
|
-
}
|
|
103
|
+
// XXX we should go along:
|
|
104
|
+
// - last working connection and ping
|
|
105
|
+
// - may be have an expect suspending of network, with less aggressive attempts to reconnect
|
|
106
|
+
// - instead of talking about presence of network, expose methods to nudge restarting behaviour, as outside
|
|
107
|
+
// may have better clues and able to command behaviour switch
|
|
152
108
|
suspendNetworkActivity() {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
109
|
+
// XXX code below shutdown for good, but restart sometimes has been failing.
|
|
110
|
+
//
|
|
111
|
+
// if (this.isListening) {
|
|
112
|
+
// if (!this.disconnectedAt) {
|
|
113
|
+
// this.disconnectedAt = Date.now();
|
|
114
|
+
// }
|
|
115
|
+
// this.stopListening();
|
|
116
|
+
// }
|
|
160
117
|
}
|
|
161
118
|
resumeNetworkActivity() {
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
this.startListening();
|
|
119
|
+
if (!this.wsProc.isListening) {
|
|
120
|
+
this.wsProc.startListening();
|
|
165
121
|
}
|
|
166
122
|
}
|
|
167
123
|
async listMsgsFromDisconnectedPeriod() {
|
|
@@ -178,9 +134,6 @@ class InboxEvents {
|
|
|
178
134
|
this.newMsgs.next(msg);
|
|
179
135
|
this.disconnectedAt = msg.deliveryTS;
|
|
180
136
|
}
|
|
181
|
-
else if (!this.networkActive) {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
137
|
}
|
|
185
138
|
this.disconnectedAt = undefined;
|
|
186
139
|
}
|
|
@@ -124,7 +124,7 @@ export declare class ObjStatus implements SyncedObjStatus, UploadStatusRecorder
|
|
|
124
124
|
syncStatus(): SyncStatus;
|
|
125
125
|
neverUploaded(): boolean;
|
|
126
126
|
versionBeforeUnsyncedRemoval(): number | undefined;
|
|
127
|
-
adoptRemoteVersion(version?: number
|
|
127
|
+
adoptRemoteVersion(version?: number): Promise<void>;
|
|
128
128
|
isAmongRemote(version: number): boolean;
|
|
129
129
|
}
|
|
130
130
|
export declare function readAndCheckStatus(objFolder: string, objId: ObjId): Promise<ObjStatusInfo>;
|
|
@@ -510,14 +510,14 @@ class ObjStatus {
|
|
|
510
510
|
return this.status.upload.localVersion;
|
|
511
511
|
}
|
|
512
512
|
}
|
|
513
|
-
async adoptRemoteVersion(version
|
|
513
|
+
async adoptRemoteVersion(version) {
|
|
514
514
|
var _a;
|
|
515
515
|
const { local, remote } = this.status;
|
|
516
516
|
if (this.stateIndicator !== 'behind') {
|
|
517
517
|
if (this.stateIndicator === 'synced') {
|
|
518
518
|
return;
|
|
519
519
|
}
|
|
520
|
-
else if (!
|
|
520
|
+
else if ((this.stateIndicator === 'conflicting') && !version) {
|
|
521
521
|
throw (0, exceptions_1.makeFSSyncException)('', {
|
|
522
522
|
localVersion: local === null || local === void 0 ? void 0 : local.current,
|
|
523
523
|
remoteVersion: remote.current,
|
|
@@ -18,9 +18,10 @@ export declare class RemoteEvents {
|
|
|
18
18
|
private readonly logError;
|
|
19
19
|
private readonly connectionEvents;
|
|
20
20
|
readonly connectionEvent$: Observable<StorageConnectionStatus>;
|
|
21
|
+
private readonly wsProc;
|
|
21
22
|
constructor(remoteStorage: StorageOwner, files: ObjFiles, broadcastNodeEvent: Storage['broadcastNodeEvent'], logError: LogError);
|
|
22
|
-
private
|
|
23
|
-
|
|
23
|
+
private makeProc;
|
|
24
|
+
startListening(): void;
|
|
24
25
|
close(): Promise<void>;
|
|
25
26
|
private absorbObjChange;
|
|
26
27
|
private absorbObjRemoval;
|
|
@@ -33,6 +33,7 @@ const SERVER_EVENTS_RESTART_WAIT_SECS = 5;
|
|
|
33
33
|
* events. Someone down the stream can react to these changes from remote.
|
|
34
34
|
*/
|
|
35
35
|
class RemoteEvents {
|
|
36
|
+
// private listeningProc: Subscription|undefined = undefined;
|
|
36
37
|
constructor(remoteStorage, files, broadcastNodeEvent, logError) {
|
|
37
38
|
this.remoteStorage = remoteStorage;
|
|
38
39
|
this.files = files;
|
|
@@ -40,11 +41,11 @@ class RemoteEvents {
|
|
|
40
41
|
this.logError = logError;
|
|
41
42
|
this.connectionEvents = new rxjs_1.Subject();
|
|
42
43
|
this.connectionEvent$ = this.connectionEvents.asObservable().pipe((0, operators_1.share)());
|
|
43
|
-
this.
|
|
44
|
+
this.wsProc = new ws_ipc_1.WebSocketListening(SERVER_EVENTS_RESTART_WAIT_SECS, this.makeProc.bind(this));
|
|
44
45
|
Object.seal(this);
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
makeProc() {
|
|
48
|
+
return (0, rxjs_1.from)(this.remoteStorage.openEventSource().then(({ client, heartbeat }) => {
|
|
48
49
|
heartbeat.subscribe({
|
|
49
50
|
next: ev => this.connectionEvents.next(toStorageConnectionStatus(ev))
|
|
50
51
|
});
|
|
@@ -56,23 +57,14 @@ class RemoteEvents {
|
|
|
56
57
|
// this.absorbArchVersionRemoval(client)
|
|
57
58
|
];
|
|
58
59
|
}))
|
|
59
|
-
.pipe((0, operators_1.mergeMap)(event$ => event$), (0, operators_1.mergeMap)(event$ => event$))
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
await this.logError(err);
|
|
64
|
-
this.absorbingRemoteEventsProc = undefined;
|
|
65
|
-
},
|
|
66
|
-
complete: () => {
|
|
67
|
-
this.absorbingRemoteEventsProc = undefined;
|
|
68
|
-
}
|
|
69
|
-
});
|
|
60
|
+
.pipe((0, operators_1.mergeMap)(event$ => event$), (0, operators_1.mergeMap)(event$ => event$));
|
|
61
|
+
}
|
|
62
|
+
startListening() {
|
|
63
|
+
this.wsProc.startListening();
|
|
70
64
|
}
|
|
71
65
|
async close() {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.absorbingRemoteEventsProc = undefined;
|
|
75
|
-
}
|
|
66
|
+
this.connectionEvents.complete();
|
|
67
|
+
this.wsProc.close();
|
|
76
68
|
}
|
|
77
69
|
absorbObjChange(client) {
|
|
78
70
|
return (new rxjs_1.Observable(obs => client.subscribe(owner_1.events.objChanged.EVENT_NAME, obs)))
|
|
@@ -136,19 +128,22 @@ class RemoteEvents {
|
|
|
136
128
|
});
|
|
137
129
|
}, 1));
|
|
138
130
|
}
|
|
131
|
+
// XXX we should go along:
|
|
132
|
+
// - last working connection and ping
|
|
133
|
+
// - may be have an expect suspending of network, with less aggressive attempts to reconnect
|
|
134
|
+
// - instead of talking about presence of network, expose methods to nudge restarting behaviour, as outside
|
|
135
|
+
// may have better clues and able to command behaviour switch
|
|
139
136
|
suspendNetworkActivity() {
|
|
140
137
|
// XXX
|
|
141
|
-
// -
|
|
142
|
-
// - press breaks on events from server
|
|
138
|
+
// - ...
|
|
143
139
|
}
|
|
144
140
|
resumeNetworkActivity() {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
141
|
+
if (!this.wsProc.isListening) {
|
|
142
|
+
this.wsProc.startListening();
|
|
143
|
+
}
|
|
148
144
|
}
|
|
149
145
|
}
|
|
150
146
|
exports.RemoteEvents = RemoteEvents;
|
|
151
147
|
Object.freeze(RemoteEvents.prototype);
|
|
152
148
|
Object.freeze(RemoteEvents);
|
|
153
|
-
function noop() { }
|
|
154
149
|
Object.freeze(exports);
|
|
@@ -51,7 +51,7 @@ class SyncedStore {
|
|
|
51
51
|
return {
|
|
52
52
|
syncedStore: (0, common_1.wrapSyncStorageImplementation)(s),
|
|
53
53
|
startObjProcs: () => {
|
|
54
|
-
s.remoteEvents.
|
|
54
|
+
s.remoteEvents.startListening();
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
}
|
|
@@ -64,7 +64,7 @@ class SyncedStore {
|
|
|
64
64
|
setupRemoteAndStartObjProcs: getSigner => {
|
|
65
65
|
setMid(getSigner);
|
|
66
66
|
s.uploader.start();
|
|
67
|
-
s.remoteEvents.
|
|
67
|
+
s.remoteEvents.startListening();
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
}
|
|
@@ -92,11 +92,7 @@ class SyncedStore {
|
|
|
92
92
|
async adoptRemote(objId, opts) {
|
|
93
93
|
const obj = await this.getObjOrThrow(objId);
|
|
94
94
|
const objStatus = obj.statusObj();
|
|
95
|
-
await objStatus.adoptRemoteVersion(opts === null || opts === void 0 ? void 0 : opts.remoteVersion
|
|
96
|
-
if (opts && opts.download) {
|
|
97
|
-
// XXX this needs implementation
|
|
98
|
-
throw new Error('SyncedStore.adoptRemote() with download option needs implementation, probably using SyncedStore.download().');
|
|
99
|
-
}
|
|
95
|
+
await objStatus.adoptRemoteVersion(opts === null || opts === void 0 ? void 0 : opts.remoteVersion);
|
|
100
96
|
this.files.scheduleGC(obj);
|
|
101
97
|
return objStatus.syncStatus().synced.latest;
|
|
102
98
|
}
|
package/build/core-ipc/file.js
CHANGED
|
@@ -1199,7 +1199,7 @@ function remoteAdoptionOptsToMsg(opts) {
|
|
|
1199
1199
|
return;
|
|
1200
1200
|
}
|
|
1201
1201
|
return {
|
|
1202
|
-
dropLocalVer:
|
|
1202
|
+
// dropLocalVer: toOptVal(opts.dropLocalVer),
|
|
1203
1203
|
remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion)
|
|
1204
1204
|
};
|
|
1205
1205
|
}
|
|
@@ -1208,7 +1208,7 @@ function remoteAdoptionOptsFromMsg(msg) {
|
|
|
1208
1208
|
return;
|
|
1209
1209
|
}
|
|
1210
1210
|
return {
|
|
1211
|
-
dropLocalVer:
|
|
1211
|
+
// dropLocalVer: valOfOpt(msg.dropLocalVer),
|
|
1212
1212
|
remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion)
|
|
1213
1213
|
};
|
|
1214
1214
|
}
|