core-3nweb-client-lib 0.44.3 → 0.44.4
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 +7 -4
- package/build/core/storage/synced/storage.js +2 -2
- package/build/core-ipc/fs.js +11 -11
- package/build/lib-client/fs-utils/files.js +1 -1
- package/build/lib-client/xsp-fs/file-node.d.ts +1 -1
- package/build/lib-client/xsp-fs/file-node.js +5 -4
- package/build/lib-client/xsp-fs/folder-node.d.ts +3 -2
- package/build/lib-client/xsp-fs/folder-node.js +48 -61
- package/build/lib-client/xsp-fs/fs.d.ts +2 -2
- package/build/lib-client/xsp-fs/fs.js +2 -2
- package/build/lib-client/xsp-fs/link-node.d.ts +1 -0
- package/build/lib-client/xsp-fs/link-node.js +3 -0
- package/build/lib-client/xsp-fs/node-in-fs.d.ts +1 -1
- package/build/lib-client/xsp-fs/node-in-fs.js +14 -12
- package/build/lib-common/exceptions/error.js +2 -1
- package/build/protos/asmail.proto.js +158 -158
- package/build/protos/fs.proto.js +158 -158
- package/package.json +1 -1
- package/protos/fs.proto +3 -4
|
@@ -1669,15 +1669,18 @@ declare namespace web3n.files {
|
|
|
1669
1669
|
|
|
1670
1670
|
/**
|
|
1671
1671
|
* This method is for resolving conflicts on folders.
|
|
1672
|
-
* It
|
|
1672
|
+
* It absorbs folder changes done in remote version.
|
|
1673
1673
|
* Returns new local version, if there were remote items to adopt and their were added to local state.
|
|
1674
1674
|
* @param path
|
|
1675
1675
|
* @param opts
|
|
1676
1676
|
*/
|
|
1677
|
-
|
|
1678
|
-
path: string, opts?:
|
|
1677
|
+
absorbRemoteFolderChanges(
|
|
1678
|
+
path: string, opts?: OptionsToAdoptRemoteFolderChanges
|
|
1679
1679
|
): Promise<number|undefined>;
|
|
1680
1680
|
|
|
1681
|
+
// XXX
|
|
1682
|
+
// makeSnapshot(path: string); // -> snapshot points and archives current versions of tree elements
|
|
1683
|
+
|
|
1681
1684
|
}
|
|
1682
1685
|
|
|
1683
1686
|
interface OptionsToAdoptRemoteItem {
|
|
@@ -1700,7 +1703,7 @@ declare namespace web3n.files {
|
|
|
1700
1703
|
newItemName?: string;
|
|
1701
1704
|
}
|
|
1702
1705
|
|
|
1703
|
-
interface
|
|
1706
|
+
interface OptionsToAdoptRemoteFolderChanges {
|
|
1704
1707
|
/**
|
|
1705
1708
|
* Folder's local version. If not given, current local version is used.
|
|
1706
1709
|
*/
|
|
@@ -194,7 +194,7 @@ class SyncedStore {
|
|
|
194
194
|
return obj.getObjSrcFromLocalAndSyncedBranch(version);
|
|
195
195
|
}
|
|
196
196
|
async getObjSrcOfRemoteVersion(objId, version) {
|
|
197
|
-
const obj = await this.getObjOrThrow(objId);
|
|
197
|
+
const obj = await this.getObjOrThrow(objId, true);
|
|
198
198
|
return obj.getObjSrcFromRemoteAndSyncedBranch(version);
|
|
199
199
|
}
|
|
200
200
|
async saveObj(objId, version, encSub) {
|
|
@@ -225,7 +225,7 @@ class SyncedStore {
|
|
|
225
225
|
await obj.removeCurrentVersion();
|
|
226
226
|
}
|
|
227
227
|
async getNumOfBytesNeedingDownload(objId, version) {
|
|
228
|
-
const obj = await this.getObjOrThrow(objId);
|
|
228
|
+
const obj = await this.getObjOrThrow(objId, true);
|
|
229
229
|
return obj.getNumOfBytesNeedingDownload(version);
|
|
230
230
|
}
|
|
231
231
|
async close() {
|
package/build/core-ipc/fs.js
CHANGED
|
@@ -117,7 +117,7 @@ function makeFSCaller(caller, fsMsg) {
|
|
|
117
117
|
fs.v.sync.startUpload = vsStartUpload.makeCaller(caller, vsPath);
|
|
118
118
|
fs.v.sync.upload = vsUpload.makeCaller(caller, vsPath);
|
|
119
119
|
fs.v.sync.adoptRemoteFolderItem = vsAdoptRemoteFolderItem.makeCaller(caller, vsPath);
|
|
120
|
-
fs.v.sync.
|
|
120
|
+
fs.v.sync.absorbRemoteFolderChanges = vsAbsorbRemoteFolderChanges.makeCaller(caller, vsPath);
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -203,7 +203,7 @@ function exposeFSService(fs, expServices) {
|
|
|
203
203
|
implExp.v.sync.startUpload = vsStartUpload.wrapService(fs.v.sync.startUpload);
|
|
204
204
|
implExp.v.sync.upload = vsUpload.wrapService(fs.v.sync.upload);
|
|
205
205
|
implExp.v.sync.adoptRemoteFolderItem = vsAdoptRemoteFolderItem.wrapService(fs.v.sync.adoptRemoteFolderItem);
|
|
206
|
-
implExp.v.sync.
|
|
206
|
+
implExp.v.sync.absorbRemoteFolderChanges = vsAbsorbRemoteFolderChanges.wrapService(fs.v.sync.absorbRemoteFolderChanges);
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
}
|
|
@@ -1979,9 +1979,9 @@ var vsAdoptRemoteFolderItem;
|
|
|
1979
1979
|
vsAdoptRemoteFolderItem.makeCaller = makeCaller;
|
|
1980
1980
|
})(vsAdoptRemoteFolderItem || (vsAdoptRemoteFolderItem = {}));
|
|
1981
1981
|
Object.freeze(vsAdoptRemoteFolderItem);
|
|
1982
|
-
var
|
|
1983
|
-
(function (
|
|
1984
|
-
const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.
|
|
1982
|
+
var vsAbsorbRemoteFolderChanges;
|
|
1983
|
+
(function (vsAbsorbRemoteFolderChanges) {
|
|
1984
|
+
const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AbsorbRemoteFolderChangesRequestBody);
|
|
1985
1985
|
function optionsFromMsg(msg) {
|
|
1986
1986
|
if (!msg) {
|
|
1987
1987
|
return;
|
|
@@ -2002,7 +2002,7 @@ var vsMergeFolderCurrentAndRemoteVersions;
|
|
|
2002
2002
|
postfixForNameOverlaps: (0, protobuf_msg_1.toOptVal)(opts.postfixForNameOverlaps),
|
|
2003
2003
|
};
|
|
2004
2004
|
}
|
|
2005
|
-
const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.
|
|
2005
|
+
const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AbsorbRemoteFolderChangesReplyBody);
|
|
2006
2006
|
function wrapService(fn) {
|
|
2007
2007
|
return buf => {
|
|
2008
2008
|
const { path, opts } = requestType.unpack(buf);
|
|
@@ -2011,16 +2011,16 @@ var vsMergeFolderCurrentAndRemoteVersions;
|
|
|
2011
2011
|
return { promise };
|
|
2012
2012
|
};
|
|
2013
2013
|
}
|
|
2014
|
-
|
|
2014
|
+
vsAbsorbRemoteFolderChanges.wrapService = wrapService;
|
|
2015
2015
|
function makeCaller(caller, objPath) {
|
|
2016
|
-
const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, '
|
|
2016
|
+
const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'absorbRemoteFolderChanges');
|
|
2017
2017
|
return (path, opts) => caller
|
|
2018
2018
|
.startPromiseCall(ipcPath, requestType.pack({ path, opts: optionsToMsg(opts) }))
|
|
2019
2019
|
.then(buf => (0, protobuf_msg_1.valOfOptInt)(replyType.unpack(buf).newVersion));
|
|
2020
2020
|
}
|
|
2021
|
-
|
|
2022
|
-
})(
|
|
2023
|
-
Object.freeze(
|
|
2021
|
+
vsAbsorbRemoteFolderChanges.makeCaller = makeCaller;
|
|
2022
|
+
})(vsAbsorbRemoteFolderChanges || (vsAbsorbRemoteFolderChanges = {}));
|
|
2023
|
+
Object.freeze(vsAbsorbRemoteFolderChanges);
|
|
2024
2024
|
var vsAdoptRemote;
|
|
2025
2025
|
(function (vsAdoptRemote) {
|
|
2026
2026
|
const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptRemoteRequestBody);
|
|
@@ -251,7 +251,7 @@ function wrapWritableFSSyncAPI(sImpl) {
|
|
|
251
251
|
getRemoteFileItem: sImpl.getRemoteFileItem.bind(sImpl),
|
|
252
252
|
getRemoteFolderItem: sImpl.getRemoteFolderItem.bind(sImpl),
|
|
253
253
|
diffCurrentAndRemoteFileVersions: sImpl.diffCurrentAndRemoteFileVersions.bind(sImpl),
|
|
254
|
-
|
|
254
|
+
absorbRemoteFolderChanges: sImpl.absorbRemoteFolderChanges.bind(sImpl),
|
|
255
255
|
};
|
|
256
256
|
return Object.freeze(w);
|
|
257
257
|
}
|
|
@@ -41,7 +41,7 @@ export declare class FileNode extends NodeInFS<FilePersistance> {
|
|
|
41
41
|
static makeForNew(storage: Storage, parentId: string, name: string, key: Uint8Array): Promise<FileNode>;
|
|
42
42
|
static makeForExisting(storage: Storage, parentId: string, fileName: string, objId: string, key: Uint8Array): Promise<FileNode>;
|
|
43
43
|
static makeFromLinkParams(storage: Storage, params: FileLinkParams): Promise<FileNode>;
|
|
44
|
-
|
|
44
|
+
static readNodeFromObjBytes(storage: Storage, parentId: string | undefined, fileName: string, objId: string, src: ObjSource, key: Uint8Array): Promise<FileNode>;
|
|
45
45
|
protected setCurrentStateFrom(src: ObjSource): Promise<void>;
|
|
46
46
|
private setUpdatedState;
|
|
47
47
|
getStorage(): Storage;
|
|
@@ -103,17 +103,18 @@ class FileNode extends node_in_fs_1.NodeInFS {
|
|
|
103
103
|
if (!parentId) {
|
|
104
104
|
throw new Error("Bad parent id");
|
|
105
105
|
}
|
|
106
|
-
const
|
|
106
|
+
const src = await storage.getObjSrc(objId);
|
|
107
|
+
const file = await FileNode.readNodeFromObjBytes(storage, parentId, fileName, objId, src, key);
|
|
107
108
|
return file;
|
|
108
109
|
}
|
|
109
110
|
static async makeFromLinkParams(storage, params) {
|
|
110
111
|
const { objId, fileName } = params;
|
|
111
112
|
const key = buffer_utils_1.base64.open(params.fKey);
|
|
112
|
-
const
|
|
113
|
+
const src = await storage.getObjSrc(objId);
|
|
114
|
+
const file = await FileNode.readNodeFromObjBytes(storage, undefined, fileName, objId, src, key);
|
|
113
115
|
return file;
|
|
114
116
|
}
|
|
115
|
-
static async
|
|
116
|
-
const src = await storage.getObjSrc(objId);
|
|
117
|
+
static async readNodeFromObjBytes(storage, parentId, fileName, objId, src, key) {
|
|
117
118
|
const file = new FileNode(storage, fileName, objId, src.version, parentId, key);
|
|
118
119
|
await file.setCurrentStateFrom(src);
|
|
119
120
|
return file;
|
|
@@ -14,7 +14,7 @@ type OptionsToAdoptRemoteItem = web3n.files.OptionsToAdoptRemoteItem;
|
|
|
14
14
|
type OptionsToUploadLocal = web3n.files.OptionsToUploadLocal;
|
|
15
15
|
type VersionedReadFlags = web3n.files.VersionedReadFlags;
|
|
16
16
|
type Stats = web3n.files.Stats;
|
|
17
|
-
type
|
|
17
|
+
type OptionsToAdoptRemoteFolderChanges = web3n.files.OptionsToAdoptRemoteFolderChanges;
|
|
18
18
|
export interface NodeInfo {
|
|
19
19
|
/**
|
|
20
20
|
* This is a usual file name.
|
|
@@ -96,6 +96,7 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
|
|
|
96
96
|
hasChild(childName: string, throwIfMissing?: boolean): boolean;
|
|
97
97
|
getNode<T extends NodeInFS<any>>(type: NodeType | undefined, name: string, undefOnMissing?: boolean): Promise<T | undefined>;
|
|
98
98
|
private getOrMakeChildNodeForInfo;
|
|
99
|
+
private getNonLocal;
|
|
99
100
|
getFolder(name: string, undefOnMissing?: boolean): Promise<FolderNode | undefined>;
|
|
100
101
|
getFile(name: string, undefOnMissing?: boolean): Promise<FileNode | undefined>;
|
|
101
102
|
getLink(name: string, undefOnMissing?: boolean): Promise<LinkNode | undefined>;
|
|
@@ -178,6 +179,6 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
|
|
|
178
179
|
diffCurrentAndRemote(remoteVersion: number | undefined): Promise<FolderDiff | undefined>;
|
|
179
180
|
getRemoteItemNode<T extends NodeInFS<any>>(remoteItemName: string, remoteVersion: number | undefined): Promise<T>;
|
|
180
181
|
getStorage(): Storage;
|
|
181
|
-
|
|
182
|
+
absorbRemoteChanges(opts: OptionsToAdoptRemoteFolderChanges | undefined): Promise<number | undefined>;
|
|
182
183
|
}
|
|
183
184
|
export {};
|
|
@@ -344,17 +344,59 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
344
344
|
return nodeSet;
|
|
345
345
|
}
|
|
346
346
|
catch (exc) {
|
|
347
|
-
if (exc.
|
|
348
|
-
await this.fixMissingChildAndThrow(exc, info);
|
|
349
|
-
}
|
|
350
|
-
else if (exc.failedCipherVerification) {
|
|
347
|
+
if (exc.failedCipherVerification) {
|
|
351
348
|
exc = (0, file_1.makeFileException)('ioError', `${this.name}/${info.name}`, exc);
|
|
352
349
|
}
|
|
353
|
-
|
|
350
|
+
else if (exc.objNotFound) {
|
|
351
|
+
if (fromCurrentNodes) {
|
|
352
|
+
await this.fixMissingChildAndThrow(exc, info);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
try {
|
|
356
|
+
const node = await this.getNonLocal(info);
|
|
357
|
+
if (node) {
|
|
358
|
+
deferred.resolve(node);
|
|
359
|
+
return nodeSet;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
throw exc;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch (exc2) {
|
|
366
|
+
exc = exc2;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
354
370
|
deferred.reject((0, error_1.errWithCause)(exc, `Failed to instantiate fs node '${this.name}/${info.name}'`));
|
|
355
371
|
return nodeSet;
|
|
356
372
|
}
|
|
357
373
|
}
|
|
374
|
+
async getNonLocal(info) {
|
|
375
|
+
var _a;
|
|
376
|
+
const storage = this.syncedStorage();
|
|
377
|
+
const { objId, name, key } = info;
|
|
378
|
+
const status = await storage.status(objId);
|
|
379
|
+
const { remote, synced } = status.syncStatus();
|
|
380
|
+
const remoteVersion = (_a = remote === null || remote === void 0 ? void 0 : remote.latest) !== null && _a !== void 0 ? _a : synced === null || synced === void 0 ? void 0 : synced.latest;
|
|
381
|
+
if (!remoteVersion) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const src = await storage.getObjSrcOfRemoteVersion(info.objId, remoteVersion);
|
|
385
|
+
let node;
|
|
386
|
+
if (info.isFile) {
|
|
387
|
+
node = await file_node_1.FileNode.readNodeFromObjBytes(storage, undefined, name, objId, src, key);
|
|
388
|
+
}
|
|
389
|
+
else if (info.isFolder) {
|
|
390
|
+
node = await FolderNode.readNodeFromObjBytes(storage, undefined, objId, src, key);
|
|
391
|
+
}
|
|
392
|
+
else if (info.isLink) {
|
|
393
|
+
node = await link_node_1.LinkNode.readNodeFromObjBytes(storage, undefined, name, objId, src, key);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
throw new Error(`Unknown type of fs node`);
|
|
397
|
+
}
|
|
398
|
+
return node;
|
|
399
|
+
}
|
|
358
400
|
getFolder(name, undefOnMissing = false) {
|
|
359
401
|
return this.getNode('folder', name, undefOnMissing);
|
|
360
402
|
}
|
|
@@ -377,61 +419,6 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
377
419
|
fileExc.inconsistentStateOfFS = true;
|
|
378
420
|
throw fileExc;
|
|
379
421
|
}
|
|
380
|
-
// XXX should we keep this, when merge with certain inputs will do same action
|
|
381
|
-
// async adoptItemsFromRemoteVersion(opts: OptionsToAdoptAllRemoteItems|undefined): Promise<number|undefined> {
|
|
382
|
-
// const { state, remote } = await this.syncStatus();
|
|
383
|
-
// if ((state !== 'conflicting') && (state !== 'behind')) {
|
|
384
|
-
// return;
|
|
385
|
-
// }
|
|
386
|
-
// const remoteVersion = versionFromRemoteBranch(remote!, opts?.remoteVersion);
|
|
387
|
-
// if (!remoteVersion) {
|
|
388
|
-
// throw 'something';
|
|
389
|
-
// }
|
|
390
|
-
// const { folderInfo: remoteState } = await this.readRemoteVersion(remoteVersion);
|
|
391
|
-
// const synced = undefined;
|
|
392
|
-
// return await this.doChangeWhileTrackingVersion(opts?.localVersion, async (state, newVersion) => {
|
|
393
|
-
// const { inRemote, nameOverlaps, differentKeys } = diffNodes(state, remoteState, synced);
|
|
394
|
-
// if (differentKeys) {
|
|
395
|
-
// throw makeFSSyncException(this.name, {
|
|
396
|
-
// message: `There are different keys, and implementation for it is not implemented, yet.`
|
|
397
|
-
// });
|
|
398
|
-
// }
|
|
399
|
-
// const events: { event: FSEvent; childObjId: string; }[] = [];
|
|
400
|
-
// if (!inRemote) {
|
|
401
|
-
// return events;
|
|
402
|
-
// }
|
|
403
|
-
// const addedNodes = new Set<string>();
|
|
404
|
-
// if (nameOverlaps) {
|
|
405
|
-
// const postfix = opts?.postfixForNameOverlaps;
|
|
406
|
-
// if ((postfix === undefined) || (postfix.length < 0)) {
|
|
407
|
-
// // XXX better exception
|
|
408
|
-
// throw 'something';
|
|
409
|
-
// }
|
|
410
|
-
// for (const itemName of nameOverlaps) {
|
|
411
|
-
// const node = remoteState.nodes[itemName];
|
|
412
|
-
// let newName = `${itemName}${postfix}`;
|
|
413
|
-
// while (state.nodes[newName]) {
|
|
414
|
-
// newName = `${newName}${postfix}`;
|
|
415
|
-
// }
|
|
416
|
-
// node.name = newName;
|
|
417
|
-
// state.nodes[newName] = node;
|
|
418
|
-
// addedNodes.add(itemName);
|
|
419
|
-
// const { event, childObjId } = this.makeEntryAdditionEvent(newVersion, 'sync', node);
|
|
420
|
-
// events.push({ event, childObjId });
|
|
421
|
-
// }
|
|
422
|
-
// }
|
|
423
|
-
// for (const { name: itemName } of inRemote) {
|
|
424
|
-
// if (addedNodes.has(itemName)) {
|
|
425
|
-
// continue;
|
|
426
|
-
// }
|
|
427
|
-
// const node = remoteState.nodes[itemName];
|
|
428
|
-
// state.nodes[itemName] = node;
|
|
429
|
-
// const { event, childObjId } = this.makeEntryAdditionEvent(newVersion, 'sync', node);
|
|
430
|
-
// events.push({ event, childObjId });
|
|
431
|
-
// }
|
|
432
|
-
// return events;
|
|
433
|
-
// });
|
|
434
|
-
// }
|
|
435
422
|
/**
|
|
436
423
|
* If no initial local version given, then this performs like doTransition(change) method.
|
|
437
424
|
* When initial local version is given and check, exceptions are thrown if versions mismatch,
|
|
@@ -1061,7 +1048,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
1061
1048
|
getStorage() {
|
|
1062
1049
|
return this.storage;
|
|
1063
1050
|
}
|
|
1064
|
-
async
|
|
1051
|
+
async absorbRemoteChanges(opts) {
|
|
1065
1052
|
const diff = await this.diffCurrentAndRemote(opts === null || opts === void 0 ? void 0 : opts.remoteVersion);
|
|
1066
1053
|
if (!diff) {
|
|
1067
1054
|
return;
|
|
@@ -32,7 +32,7 @@ type OptionsToDiffFileVersions = web3n.files.OptionsToDiffFileVersions;
|
|
|
32
32
|
type OptionsToUploadLocal = web3n.files.OptionsToUploadLocal;
|
|
33
33
|
type FolderDiff = web3n.files.FolderDiff;
|
|
34
34
|
type FileDiff = web3n.files.FileDiff;
|
|
35
|
-
type
|
|
35
|
+
type OptionsToAdoptRemoteFolderChanges = web3n.files.OptionsToAdoptRemoteFolderChanges;
|
|
36
36
|
export declare class XspFS implements WritableFS {
|
|
37
37
|
readonly writable: boolean;
|
|
38
38
|
name: string;
|
|
@@ -188,6 +188,6 @@ declare class S implements WritableFSSyncAPI {
|
|
|
188
188
|
listRemoteFolderItem(path: string, remoteItemName: string, remoteVersion?: number): Promise<ListingEntry[]>;
|
|
189
189
|
getRemoteFileItem(path: string, remoteItemName: string, remoteVersion?: number): Promise<ReadonlyFile>;
|
|
190
190
|
getRemoteFolderItem(path: string, remoteItemName: string, remoteVersion?: number): Promise<ReadonlyFS>;
|
|
191
|
-
|
|
191
|
+
absorbRemoteFolderChanges(path: string, opts?: OptionsToAdoptRemoteFolderChanges): Promise<number | undefined>;
|
|
192
192
|
}
|
|
193
193
|
export {};
|
|
@@ -862,9 +862,9 @@ class S {
|
|
|
862
862
|
throw (0, file_1.makeFileException)('notDirectory', `${path}/${remoteItemName}`);
|
|
863
863
|
}
|
|
864
864
|
}
|
|
865
|
-
async
|
|
865
|
+
async absorbRemoteFolderChanges(path, opts) {
|
|
866
866
|
const folderNode = await this.getFolderNode(path);
|
|
867
|
-
return await folderNode.
|
|
867
|
+
return await folderNode.absorbRemoteChanges(opts);
|
|
868
868
|
}
|
|
869
869
|
}
|
|
870
870
|
Object.freeze(S.prototype);
|
|
@@ -26,6 +26,7 @@ export declare class LinkNode extends NodeInFS<LinkPersistance> {
|
|
|
26
26
|
constructor(storage: Storage, name: string, objId: string, version: number, parentId: string | undefined, key: Uint8Array);
|
|
27
27
|
static makeForNew(storage: Storage, parentId: string, name: string, key: Uint8Array): Promise<LinkNode>;
|
|
28
28
|
static makeForExisting(storage: Storage, parentId: string, name: string, objId: string, key: Uint8Array): Promise<LinkNode>;
|
|
29
|
+
static readNodeFromObjBytes(storage: Storage, parentId: string | undefined, name: string, objId: string, src: ObjSource, key: Uint8Array): Promise<LinkNode>;
|
|
29
30
|
protected setCurrentStateFrom(src: ObjSource): Promise<void>;
|
|
30
31
|
getStats(flags?: VersionedReadFlags): Promise<Stats>;
|
|
31
32
|
private setUpdatedState;
|
|
@@ -93,6 +93,9 @@ class LinkNode extends node_in_fs_1.NodeInFS {
|
|
|
93
93
|
}
|
|
94
94
|
static async makeForExisting(storage, parentId, name, objId, key) {
|
|
95
95
|
const src = await storage.getObjSrc(objId);
|
|
96
|
+
return await LinkNode.readNodeFromObjBytes(storage, parentId, name, objId, src, key);
|
|
97
|
+
}
|
|
98
|
+
static async readNodeFromObjBytes(storage, parentId, name, objId, src, key) {
|
|
96
99
|
const link = new LinkNode(storage, name, objId, src.version, parentId, key);
|
|
97
100
|
const { params, attrs, xattrs } = await link.crypto.read(src);
|
|
98
101
|
link.setUpdatedState(params, src.version, attrs, xattrs);
|
|
@@ -124,5 +124,5 @@ export declare abstract class NodeInFS<P extends NodePersistance> implements Nod
|
|
|
124
124
|
}
|
|
125
125
|
export declare function shouldReadCurrentVersion(flags: VersionedReadFlags | undefined): boolean;
|
|
126
126
|
export declare function areBytesEqual(b1: Uint8Array, b2: Uint8Array): boolean;
|
|
127
|
-
export declare function
|
|
127
|
+
export declare function versionFromBranch(branch: SyncVersionsBranch, versionInBranch: number | undefined): number | undefined;
|
|
128
128
|
export {};
|
|
@@ -19,7 +19,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
19
19
|
exports.NodeInFS = void 0;
|
|
20
20
|
exports.shouldReadCurrentVersion = shouldReadCurrentVersion;
|
|
21
21
|
exports.areBytesEqual = areBytesEqual;
|
|
22
|
-
exports.
|
|
22
|
+
exports.versionFromBranch = versionFromBranch;
|
|
23
23
|
/**
|
|
24
24
|
* Everything in this module is assumed to be inside of a file system
|
|
25
25
|
* reliance set.
|
|
@@ -550,14 +550,19 @@ class NodeInFS {
|
|
|
550
550
|
let isCurrentLocal;
|
|
551
551
|
if (state === 'behind') {
|
|
552
552
|
isCurrentLocal = false;
|
|
553
|
+
remoteVersion = versionFromBranch(remote, remoteVersion);
|
|
553
554
|
}
|
|
554
555
|
else if (state === 'conflicting') {
|
|
555
556
|
isCurrentLocal = true;
|
|
557
|
+
remoteVersion = versionFromBranch(remote, remoteVersion);
|
|
558
|
+
}
|
|
559
|
+
else if (state === 'unsynced') {
|
|
560
|
+
isCurrentLocal = true;
|
|
561
|
+
remoteVersion = versionFromBranch(synced, remoteVersion);
|
|
556
562
|
}
|
|
557
563
|
else {
|
|
558
564
|
return;
|
|
559
565
|
}
|
|
560
|
-
remoteVersion = versionFromRemoteBranch(remote, remoteVersion);
|
|
561
566
|
if (remoteVersion) {
|
|
562
567
|
return { rm: false, isCurrentLocal, remoteVersion, syncedVersion: synced === null || synced === void 0 ? void 0 : synced.latest };
|
|
563
568
|
}
|
|
@@ -708,23 +713,20 @@ function areBytesEqual(b1, b2) {
|
|
|
708
713
|
}
|
|
709
714
|
return true;
|
|
710
715
|
}
|
|
711
|
-
function
|
|
716
|
+
function versionFromBranch(branch, versionInBranch) {
|
|
712
717
|
var _a;
|
|
713
|
-
if (
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
if (remoteVersion) {
|
|
717
|
-
if ((remoteVersion !== remote.latest)
|
|
718
|
-
&& !((_a = remote.archived) === null || _a === void 0 ? void 0 : _a.includes(remoteVersion))) {
|
|
718
|
+
if (versionInBranch) {
|
|
719
|
+
if ((versionInBranch !== branch.latest)
|
|
720
|
+
&& !((_a = branch.archived) === null || _a === void 0 ? void 0 : _a.includes(versionInBranch))) {
|
|
719
721
|
throw (0, exceptions_1.makeFSSyncException)(this.name, {
|
|
720
722
|
versionMismatch: true,
|
|
721
|
-
message: `Unknown
|
|
723
|
+
message: `Unknown version in branch: ${versionInBranch}`
|
|
722
724
|
});
|
|
723
725
|
}
|
|
724
|
-
return
|
|
726
|
+
return versionInBranch;
|
|
725
727
|
}
|
|
726
728
|
else {
|
|
727
|
-
return
|
|
729
|
+
return branch.latest;
|
|
728
730
|
}
|
|
729
731
|
}
|
|
730
732
|
Object.freeze(exports);
|
|
@@ -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.errWithCause = errWithCause;
|
|
19
20
|
exports.recursiveErrJSONify = recursiveErrJSONify;
|