core-3nweb-client-lib 0.27.1 → 0.27.3
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 +4 -7
- package/build/core/asmail/inbox/attachments/fs.d.ts +2 -1
- package/build/core/asmail/inbox/attachments/fs.js +4 -3
- package/build/core/asmail/inbox/index.js +1 -1
- package/build/core/id-manager/index.d.ts +43 -0
- package/build/core/{id-manager.js → id-manager/index.js} +33 -114
- package/build/core/id-manager/key-storage.d.ts +21 -0
- package/build/core/id-manager/key-storage.js +96 -0
- package/build/core/index.js +21 -23
- package/build/core/sign-in.d.ts +1 -2
- package/build/core/sign-in.js +4 -13
- package/build/core/sign-up.d.ts +2 -0
- package/build/core/sign-up.js +2 -1
- package/build/core/storage/index.d.ts +4 -2
- package/build/core/storage/index.js +36 -57
- package/build/core/storage/local/storage.d.ts +1 -1
- package/build/core/storage/synced/obj-files-gc.d.ts +1 -4
- package/build/core/storage/synced/obj-files-gc.js +1 -18
- package/build/core/storage/synced/obj-files.d.ts +9 -1
- package/build/core/storage/synced/obj-files.js +41 -33
- package/build/core/storage/synced/obj-status.d.ts +18 -7
- package/build/core/storage/synced/obj-status.js +148 -83
- package/build/core/storage/synced/storage.d.ts +7 -2
- package/build/core/storage/synced/storage.js +50 -10
- package/build/core/storage/synced/upsyncer.d.ts +4 -4
- package/build/core/storage/synced/upsyncer.js +12 -6
- package/build/lib-client/3nstorage/exceptions.d.ts +13 -1
- package/build/lib-client/3nstorage/exceptions.js +9 -3
- package/build/lib-client/3nstorage/service.d.ts +6 -1
- package/build/lib-client/3nstorage/service.js +31 -15
- package/build/lib-client/3nstorage/util/file-based-json.js +2 -1
- package/build/lib-client/3nstorage/util/for-arrays.d.ts +1 -0
- package/build/lib-client/3nstorage/util/for-arrays.js +32 -0
- package/build/lib-client/3nstorage/xsp-fs/common.d.ts +5 -4
- package/build/lib-client/3nstorage/xsp-fs/common.js +1 -0
- package/build/lib-client/3nstorage/xsp-fs/file.js +2 -2
- package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +11 -5
- package/build/lib-client/3nstorage/xsp-fs/folder-node.js +232 -68
- package/build/lib-client/3nstorage/xsp-fs/fs.js +15 -19
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +4 -9
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +16 -17
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +1 -1
- package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
- package/build/lib-client/cryptor/cryptor.wasm +0 -0
- package/build/lib-client/local-files/device-fs.js +11 -11
- package/build/lib-client/user-with-mid-session.d.ts +2 -1
- package/build/lib-client/user-with-mid-session.js +7 -1
- package/build/lib-common/async-fs-node.js +8 -8
- package/build/lib-common/exceptions/file.d.ts +4 -2
- package/build/lib-common/exceptions/file.js +24 -58
- package/build/lib-common/ipc/generic-ipc.js +5 -4
- package/build/lib-common/objs-on-disk/utils.js +1 -1
- package/build/lib-common/service-api/3nstorage/owner.d.ts +8 -5
- package/build/lib-common/service-api/3nstorage/owner.js +2 -1
- package/package.json +3 -2
- package/build/core/id-manager.d.ts +0 -46
|
@@ -28,23 +28,39 @@ const keyGen = require("../key-derivation");
|
|
|
28
28
|
const exceptions_1 = require("./exceptions");
|
|
29
29
|
const ws_ipc_1 = require("../../lib-common/ipc/ws-ipc");
|
|
30
30
|
const assert_1 = require("../../lib-common/assert");
|
|
31
|
+
function toInitServiceUriGetter(net, mainUrlGetter) {
|
|
32
|
+
return async () => {
|
|
33
|
+
const serviceUrl = await mainUrlGetter();
|
|
34
|
+
const info = await (0, service_locator_1.storageInfoAt)(net, serviceUrl);
|
|
35
|
+
if (!info.owner) {
|
|
36
|
+
throw new Error(`Missing owner service url in 3NStorage information at ${serviceUrl}`);
|
|
37
|
+
}
|
|
38
|
+
return info.owner;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
31
41
|
class StorageOwner extends user_with_mid_session_1.ServiceUser {
|
|
32
|
-
constructor(user, getSigner,
|
|
42
|
+
constructor(user, getSigner, getInitServiceURI, net) {
|
|
33
43
|
super(user, {
|
|
34
44
|
login: api.midLogin.MID_URL_PART,
|
|
35
45
|
logout: api.closeSession.URL_END,
|
|
36
46
|
canBeRedirected: true
|
|
37
|
-
}, getSigner,
|
|
38
|
-
const serviceUrl = await mainUrlGetter();
|
|
39
|
-
const info = await (0, service_locator_1.storageInfoAt)(this.net, serviceUrl);
|
|
40
|
-
if (!info.owner) {
|
|
41
|
-
throw new Error(`Missing owner service url in 3NStorage information at ${serviceUrl}`);
|
|
42
|
-
}
|
|
43
|
-
return info.owner;
|
|
44
|
-
}, net);
|
|
47
|
+
}, getSigner, getInitServiceURI, net);
|
|
45
48
|
this.maxChunkSize = undefined;
|
|
46
49
|
Object.seal(this);
|
|
47
50
|
}
|
|
51
|
+
static make(user, getSigner, mainUrlGetter, net) {
|
|
52
|
+
const srvUriGetter = toInitServiceUriGetter(net, mainUrlGetter);
|
|
53
|
+
const remote = new StorageOwner(user, getSigner, srvUriGetter, net);
|
|
54
|
+
return remote;
|
|
55
|
+
}
|
|
56
|
+
static makeBeforeMidSetup(user, mainUrlGetter, net) {
|
|
57
|
+
const srvUriGetter = toInitServiceUriGetter(net, mainUrlGetter);
|
|
58
|
+
const remote = new StorageOwner(user, undefined, srvUriGetter, net);
|
|
59
|
+
return {
|
|
60
|
+
remote,
|
|
61
|
+
setMid: getSigner => remote.setGetterOfSigner(getSigner)
|
|
62
|
+
};
|
|
63
|
+
}
|
|
48
64
|
async getKeyDerivParams() {
|
|
49
65
|
const rep = await this.doBodylessSessionRequest({
|
|
50
66
|
appPath: api.keyDerivParams.URL_END,
|
|
@@ -144,7 +160,7 @@ class StorageOwner extends user_with_mid_session_1.ServiceUser {
|
|
|
144
160
|
};
|
|
145
161
|
}
|
|
146
162
|
else if (rep.status === api.currentObj.SC.unknownObj) {
|
|
147
|
-
throw (0, exceptions_1.makeObjNotFoundExc)(objId,
|
|
163
|
+
throw (0, exceptions_1.makeObjNotFoundExc)(objId, true);
|
|
148
164
|
}
|
|
149
165
|
else {
|
|
150
166
|
throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
|
|
@@ -179,7 +195,7 @@ class StorageOwner extends user_with_mid_session_1.ServiceUser {
|
|
|
179
195
|
return rep.data;
|
|
180
196
|
}
|
|
181
197
|
else if (rep.status === api.currentObj.SC.unknownObj) {
|
|
182
|
-
throw (0, exceptions_1.makeObjNotFoundExc)(objId,
|
|
198
|
+
throw (0, exceptions_1.makeObjNotFoundExc)(objId, true);
|
|
183
199
|
}
|
|
184
200
|
else {
|
|
185
201
|
throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
|
|
@@ -246,7 +262,7 @@ class StorageOwner extends user_with_mid_session_1.ServiceUser {
|
|
|
246
262
|
throw (0, exceptions_1.makeObjExistsExc)(objId, undefined, true);
|
|
247
263
|
}
|
|
248
264
|
else if (rep.status === api.currentObj.SC.unknownObj) {
|
|
249
|
-
throw (0, exceptions_1.makeObjNotFoundExc)(objId,
|
|
265
|
+
throw (0, exceptions_1.makeObjNotFoundExc)(objId, true);
|
|
250
266
|
}
|
|
251
267
|
else if (rep.status === api.currentObj.SC.concurrentTransaction) {
|
|
252
268
|
throw (0, exceptions_1.makeConcurrentTransExc)(objId);
|
|
@@ -276,10 +292,10 @@ class StorageOwner extends user_with_mid_session_1.ServiceUser {
|
|
|
276
292
|
return;
|
|
277
293
|
}
|
|
278
294
|
else if (rep.status === api.currentObj.SC.unknownObj) {
|
|
279
|
-
throw (0, exceptions_1.makeObjNotFoundExc)(objId,
|
|
295
|
+
throw (0, exceptions_1.makeObjNotFoundExc)(objId, true);
|
|
280
296
|
}
|
|
281
297
|
else if (rep.status === api.currentObj.SC.unknownObjVer) {
|
|
282
|
-
throw (0, exceptions_1.
|
|
298
|
+
throw (0, exceptions_1.makeObjVersionNotFoundExc)(objId, currentVer, true);
|
|
283
299
|
}
|
|
284
300
|
else {
|
|
285
301
|
throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
|
|
@@ -298,7 +314,7 @@ class StorageOwner extends user_with_mid_session_1.ServiceUser {
|
|
|
298
314
|
return rep.data;
|
|
299
315
|
}
|
|
300
316
|
else if (rep.status === api.objStatus.SC.unknownObj) {
|
|
301
|
-
throw (0, exceptions_1.makeObjNotFoundExc)(objId,
|
|
317
|
+
throw (0, exceptions_1.makeObjNotFoundExc)(objId, true);
|
|
302
318
|
}
|
|
303
319
|
else {
|
|
304
320
|
throw (0, request_utils_1.makeException)(rep, 'Unexpected status');
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
See the GNU General Public License for more details.
|
|
14
14
|
|
|
15
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/>.
|
|
16
|
+
this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
17
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
19
|
exports.JsonFileProc = void 0;
|
|
19
20
|
const rxjs_1 = require("rxjs");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function appendArray<T>(arr: T[], elems: T[] | T | undefined): T[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (C) 2022 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.appendArray = void 0;
|
|
20
|
+
function appendArray(arr, elems) {
|
|
21
|
+
if (elems !== undefined) {
|
|
22
|
+
if (Array.isArray(elems)) {
|
|
23
|
+
arr.push(...elems);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
arr.push(elems);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return arr;
|
|
30
|
+
}
|
|
31
|
+
exports.appendArray = appendArray;
|
|
32
|
+
Object.freeze(exports);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ScryptGenParams } from '../../key-derivation';
|
|
2
2
|
import { AsyncSBoxCryptor, Subscribe, ObjSource } from 'xsp-files';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
|
+
import { LogError } from '../../logging/log-to-file';
|
|
4
5
|
export { AsyncSBoxCryptor } from 'xsp-files';
|
|
5
6
|
export { FolderInJSON } from './folder-node';
|
|
6
7
|
declare type StorageType = web3n.files.FSType;
|
|
@@ -16,7 +17,6 @@ export interface Node {
|
|
|
16
17
|
objId: string;
|
|
17
18
|
name: string;
|
|
18
19
|
type: NodeType;
|
|
19
|
-
removeObj(src?: FSChangeSrc): Promise<void>;
|
|
20
20
|
}
|
|
21
21
|
export declare type NodeType = 'file' | 'link' | 'folder';
|
|
22
22
|
export declare type ObjId = string | null;
|
|
@@ -58,6 +58,7 @@ export interface Storage {
|
|
|
58
58
|
readonly versioned: boolean;
|
|
59
59
|
readonly cryptor: AsyncSBoxCryptor;
|
|
60
60
|
readonly nodes: NodesContainer;
|
|
61
|
+
readonly logError: LogError;
|
|
61
62
|
getNodeEvents(): Observable<NodeEvent>;
|
|
62
63
|
broadcastNodeEvent(objId: ObjId, parentObjId: ObjId | undefined, childObjId: ObjId | undefined, ev: NodeEvent['event']): void;
|
|
63
64
|
/**
|
|
@@ -73,10 +74,8 @@ export interface Storage {
|
|
|
73
74
|
generateNewObjId(): Promise<string>;
|
|
74
75
|
/**
|
|
75
76
|
* This returns a promise, resolvable to source for a requested object.
|
|
76
|
-
* @param objId
|
|
77
|
-
* @param version
|
|
78
77
|
*/
|
|
79
|
-
getObjSrc(objId: ObjId, version?: number): Promise<ObjSource>;
|
|
78
|
+
getObjSrc(objId: ObjId, version?: number, allowArchived?: boolean): Promise<ObjSource>;
|
|
80
79
|
/**
|
|
81
80
|
* This saves given object, asynchronously.
|
|
82
81
|
* @param objId
|
|
@@ -114,6 +113,7 @@ export interface SyncedStorage extends Storage {
|
|
|
114
113
|
getRootKeyDerivParamsFromServer(): Promise<ScryptGenParams>;
|
|
115
114
|
adoptRemote(objId: ObjId, opts: OptionsToAdopteRemote | undefined): Promise<number | undefined>;
|
|
116
115
|
updateStatusInfo(objId: ObjId): Promise<SyncStatus>;
|
|
116
|
+
isObjOnDisk(objId: ObjId): Promise<boolean>;
|
|
117
117
|
isRemoteVersionOnDisk(objId: ObjId, version: number): Promise<'partial' | 'complete' | 'none'>;
|
|
118
118
|
download(objId: ObjId, version: number): Promise<void>;
|
|
119
119
|
upload(objId: ObjId, localVersion: number, uploadVersion: number, uploadHeader: UploadHeaderChange | undefined, createOnRemote: boolean): Promise<void>;
|
|
@@ -124,6 +124,7 @@ export interface SyncedStorage extends Storage {
|
|
|
124
124
|
export interface SyncedObjStatus extends LocalObjStatus {
|
|
125
125
|
syncStatus(): SyncStatus;
|
|
126
126
|
neverUploaded(): boolean;
|
|
127
|
+
versionBeforeUnsyncedRemoval(): number | undefined;
|
|
127
128
|
}
|
|
128
129
|
export interface UploadHeaderChange {
|
|
129
130
|
localVersion: number;
|
|
@@ -98,6 +98,7 @@ function wrapStorageImplementation(impl) {
|
|
|
98
98
|
type: impl.type,
|
|
99
99
|
versioned: impl.versioned,
|
|
100
100
|
nodes: impl.nodes,
|
|
101
|
+
logError: impl.logError,
|
|
101
102
|
getNodeEvents: impl.getNodeEvents.bind(impl),
|
|
102
103
|
broadcastNodeEvent: impl.broadcastNodeEvent.bind(impl),
|
|
103
104
|
storageForLinking: impl.storageForLinking.bind(impl),
|
|
@@ -178,7 +178,7 @@ class V {
|
|
|
178
178
|
}
|
|
179
179
|
async getByteSource() {
|
|
180
180
|
if (!this.node) {
|
|
181
|
-
throw (0, file_1.makeFileException)(
|
|
181
|
+
throw (0, file_1.makeFileException)('notFound', this.name);
|
|
182
182
|
}
|
|
183
183
|
return this.node.readSrc();
|
|
184
184
|
}
|
|
@@ -196,7 +196,7 @@ class V {
|
|
|
196
196
|
}
|
|
197
197
|
async readBytes(start, end) {
|
|
198
198
|
if (!this.node) {
|
|
199
|
-
throw (0, file_1.makeFileException)(
|
|
199
|
+
throw (0, file_1.makeFileException)('notFound', this.name);
|
|
200
200
|
}
|
|
201
201
|
return await this.node.readBytes(start, end);
|
|
202
202
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Storage,
|
|
1
|
+
import { Storage, NodeType } from './common';
|
|
2
2
|
import { NodeInFS } from './node-in-fs';
|
|
3
3
|
import { FileNode } from './file-node';
|
|
4
4
|
import { LinkNode } from './link-node';
|
|
@@ -58,6 +58,7 @@ declare class FolderPersistance extends NodePersistance {
|
|
|
58
58
|
attrs: CommonAttrs;
|
|
59
59
|
xattrs?: XAttrs;
|
|
60
60
|
}>;
|
|
61
|
+
static readFolderContent(objId: string | null, key: Uint8Array, src: ObjSource, cryptor: AsyncSBoxCryptor): Promise<FolderInfo>;
|
|
61
62
|
}
|
|
62
63
|
export interface FolderLinkParams {
|
|
63
64
|
folderName: string;
|
|
@@ -74,15 +75,15 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
|
|
|
74
75
|
static rootFromJSON(storage: Storage, name: string | undefined, folderJson: FolderInJSON): FolderNode;
|
|
75
76
|
protected setCurrentStateFrom(src: ObjSource): Promise<void>;
|
|
76
77
|
adoptRemote(opts: OptionsToAdopteRemote | undefined): Promise<void>;
|
|
78
|
+
private callRemoveObjOn;
|
|
77
79
|
list(): {
|
|
78
80
|
lst: ListingEntry[];
|
|
79
81
|
version: number;
|
|
80
82
|
};
|
|
81
83
|
childExistsInSyncedVersion(childObjId: string): Promise<boolean>;
|
|
82
|
-
listFolders(): string[];
|
|
83
84
|
getNodeInfo(name: string, undefOnMissing?: boolean): NodeInfo | undefined;
|
|
84
85
|
hasChild(childName: string, throwIfMissing?: boolean): boolean;
|
|
85
|
-
getNode<T extends
|
|
86
|
+
getNode<T extends NodeInFS<any>>(type: NodeType | undefined, name: string, undefOnMissing?: boolean): Promise<T | undefined>;
|
|
86
87
|
private getOrMakeChildNodeForInfo;
|
|
87
88
|
getFolder(name: string, undefOnMissing?: boolean): Promise<FolderNode | undefined>;
|
|
88
89
|
getFile(name: string, undefOnMissing?: boolean): Promise<FileNode | undefined>;
|
|
@@ -131,17 +132,22 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
|
|
|
131
132
|
*/
|
|
132
133
|
isEmpty(): boolean;
|
|
133
134
|
private getAllNodes;
|
|
134
|
-
|
|
135
|
+
private removeFolderObj;
|
|
136
|
+
private callRemoveObjOnAll;
|
|
137
|
+
private removeChildrenObjsInSyncedStorage;
|
|
138
|
+
private uploadRemovalOfObjs;
|
|
135
139
|
getParamsForLink(): LinkParameters<FolderLinkParams>;
|
|
136
140
|
upload(opts: OptionsToUploadLocal | undefined): Promise<void>;
|
|
141
|
+
private uploadRemovalOf;
|
|
142
|
+
private listRemovedInTreeToUploadRm;
|
|
137
143
|
protected needUpload(localVersion: number | undefined): Promise<{
|
|
138
144
|
localVersion: number;
|
|
139
145
|
uploadVersion: number;
|
|
140
146
|
createOnRemote: boolean;
|
|
141
147
|
} | undefined>;
|
|
148
|
+
private getNodesRemovedBetweenVersions;
|
|
142
149
|
adoptRemoteFolderItem(itemName: string, opts: OptionsToAdoptRemoteItem | undefined): Promise<number>;
|
|
143
150
|
private addRemoteChild;
|
|
144
|
-
private setRemoteNodeInfo;
|
|
145
151
|
private replaceLocalChildWithRemote;
|
|
146
152
|
diffCurrentAndRemote(remoteVersion: number | undefined): Promise<FolderDiff | undefined>;
|
|
147
153
|
private diffWithArchivedRemote;
|