core-3nweb-client-lib 0.43.16 → 0.43.18

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.
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright (C) 2016 - 2018, 2020, 2022, 2025 3NSoft Inc.
2
+ Copyright (C) 2016 - 2018, 2020, 2022, 2025 - 2026 3NSoft Inc.
3
3
 
4
4
  This program is free software: you can redistribute it and/or modify it under
5
5
  the terms of the GNU General Public License as published by the Free Software
@@ -1331,8 +1331,22 @@ declare namespace web3n.files {
1331
1331
  */
1332
1332
  getRemoteFileItem(path: string, remoteItemName: string, remoteVersion?: number): Promise<ReadonlyFile>;
1333
1333
 
1334
+ /**
1335
+ * Returns child folder from remote version of a folder.
1336
+ * @param path of folder
1337
+ * @param remoteItemName
1338
+ * @param remoteVersion of folder. Default is current remote.
1339
+ */
1340
+ getRemoteFolderItem(path: string, remoteItemName: string, remoteVersion?: number): Promise<ReadonlyFS>;
1341
+
1342
+ // XXX method to work around demaged files
1343
+ // reloadFromServer(path: string): Promise<SyncStatus>;
1344
+
1334
1345
  }
1335
1346
 
1347
+ /**
1348
+ *
1349
+ */
1336
1350
  interface FolderDiff {
1337
1351
  currentVersion: number;
1338
1352
  isCurrentLocal: boolean;
@@ -1340,6 +1354,14 @@ declare namespace web3n.files {
1340
1354
  isRemoteArchived: boolean;
1341
1355
  inCurrent?: ListingEntry[];
1342
1356
  inRemote?: ListingEntry[];
1357
+
1358
+ // XXX add indication for items that have different name
1359
+ differentNames?: {
1360
+ localName: string;
1361
+ remoteName: string;
1362
+ }[];
1363
+ differentKeys?: string[];
1364
+
1343
1365
  nameOverlaps?: string[];
1344
1366
  ctime: {
1345
1367
  remote?: Date;
@@ -1382,7 +1404,8 @@ declare namespace web3n.files {
1382
1404
 
1383
1405
  /**
1384
1406
  * This method is for resolving conflicts on folders.
1385
- * It adopts some folder items, and not the whole folder state.
1407
+ * It adopts given folder item, that is present in remote version and is missing in local version.
1408
+ * Returns new local version.
1386
1409
  * @param path
1387
1410
  * @param remoteItemName
1388
1411
  * @param opts
@@ -1391,6 +1414,15 @@ declare namespace web3n.files {
1391
1414
  path: string, remoteItemName: string, opts?: OptionsToAdoptRemoteItem
1392
1415
  ): Promise<number>;
1393
1416
 
1417
+ /**
1418
+ * This method is for resolving conflicts on folders.
1419
+ * It adopts all folder items, that are present in remote version and are missing in local version.
1420
+ * Returns new local version, if there were remote items to adopt and their were added to local state.
1421
+ * @param path
1422
+ * @param opts
1423
+ */
1424
+ adoptAllRemoteItems(path: string, opts?: OptionsToAdoptAllRemoteItems): Promise<number|undefined>;
1425
+
1394
1426
  }
1395
1427
 
1396
1428
  interface OptionsToAdoptRemoteItem {
@@ -1413,6 +1445,22 @@ declare namespace web3n.files {
1413
1445
  newItemName?: string;
1414
1446
  }
1415
1447
 
1448
+ interface OptionsToAdoptAllRemoteItems {
1449
+ /**
1450
+ * Folder's local version. If not given, current local version is used.
1451
+ */
1452
+ localVersion?: number;
1453
+ /**
1454
+ * Folder's remote version. If not given, current remote version is used.
1455
+ */
1456
+ remoteVersion?: number;
1457
+ /**
1458
+ * Postfix to add to remote item names that have overlapping names with existing local items.
1459
+ * If there are name overlaps and postfix isn't given, then exception is thrown.
1460
+ */
1461
+ postfixForNameOverlaps?: string;
1462
+ }
1463
+
1416
1464
  interface FSEvent {
1417
1465
  path: string;
1418
1466
  }
@@ -66,10 +66,7 @@ class IdManager {
66
66
  }
67
67
  return {
68
68
  idManager,
69
- setupManagerStorage: (fs, keys) => setupManagerStorage(fs, (keys ? {
70
- address: idManager.address,
71
- keys
72
- } : undefined))
69
+ setupManagerStorage: (fs, keys) => setupManagerStorage(fs, (keys ? { address: idManager.address, keys } : undefined))
73
70
  };
74
71
  };
75
72
  }
@@ -4,7 +4,6 @@ import { Caller, CoreSideServices } from "../ipc-via-protobuf/connector";
4
4
  import { FileMsg } from "./file";
5
5
  type FS = web3n.files.FS;
6
6
  type FSItem = web3n.files.FSItem;
7
- type OptionsToAdoptRemoteItem = web3n.files.OptionsToAdoptRemoteItem;
8
7
  export declare function makeFSCaller(caller: Caller, fsMsg: FSMsg): FS;
9
8
  export declare function exposeFSService(fs: FS, expServices: CoreSideServices): FSMsg;
10
9
  export interface FSMsg {
@@ -38,12 +37,4 @@ export declare namespace fsItem {
38
37
  function exposeFSItem(expServices: CoreSideServices, item: FSItem): FSItemMsg;
39
38
  function fsItemFromMsg(caller: Caller, msg: FSItemMsg): FSItem;
40
39
  }
41
- interface OptionsToAdoptRemoteItemMsg {
42
- localVersion?: Value<number>;
43
- remoteVersion?: Value<number>;
44
- replaceLocalItem?: Value<boolean>;
45
- newItemName?: Value<string>;
46
- }
47
- export declare function optionsToAdoptRemoteItemToMsg(opts: OptionsToAdoptRemoteItem | undefined): OptionsToAdoptRemoteItemMsg | undefined;
48
- export declare function optionsToAdoptRemoteItemFromMsg(msg: OptionsToAdoptRemoteItemMsg | undefined): OptionsToAdoptRemoteItem | undefined;
49
40
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2020, 2022, 2025 3NSoft Inc.
3
+ Copyright (C) 2020, 2022, 2025 - 2026 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -19,8 +19,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.fsItem = exports.fsMsgType = void 0;
20
20
  exports.makeFSCaller = makeFSCaller;
21
21
  exports.exposeFSService = exposeFSService;
22
- exports.optionsToAdoptRemoteItemToMsg = optionsToAdoptRemoteItemToMsg;
23
- exports.optionsToAdoptRemoteItemFromMsg = optionsToAdoptRemoteItemFromMsg;
24
22
  const protobuf_msg_1 = require("../ipc-via-protobuf/protobuf-msg");
25
23
  const protobuf_type_1 = require("../lib-client/protobuf-type");
26
24
  const fs_proto_1 = require("../protos/fs.proto");
@@ -111,11 +109,13 @@ function makeFSCaller(caller, fsMsg) {
111
109
  statRemoteItem: vsStatRemoteItem.makeCaller(caller, vsPath),
112
110
  listRemoteFolderItem: vsListRemoteFolderItem.makeCaller(caller, vsPath),
113
111
  getRemoteFileItem: vsGetRemoteFileItem.makeCaller(caller, vsPath),
112
+ getRemoteFolderItem: vsGetRemoteFolderItem.makeCaller(caller, vsPath),
114
113
  };
115
114
  if (fs.writable) {
116
115
  fs.v.sync.startUpload = vsStartUpload.makeCaller(caller, vsPath);
117
116
  fs.v.sync.upload = vsUpload.makeCaller(caller, vsPath);
118
117
  fs.v.sync.adoptRemoteFolderItem = vsAdoptRemoteFolderItem.makeCaller(caller, vsPath);
118
+ fs.v.sync.adoptAllRemoteItems = vsAdoptAllRemoteItems.makeCaller(caller, vsPath);
119
119
  }
120
120
  }
121
121
  }
@@ -192,12 +192,14 @@ function exposeFSService(fs, expServices) {
192
192
  statRemoteItem: vsStatRemoteItem.wrapService(fs.v.sync.statRemoteItem),
193
193
  listRemoteFolderItem: vsListRemoteFolderItem.wrapService(fs.v.sync.listRemoteFolderItem),
194
194
  getRemoteFileItem: vsGetRemoteFileItem.wrapService(fs.v.sync.getRemoteFileItem, expServices),
195
+ getRemoteFolderItem: vsGetRemoteFolderItem.wrapService(fs.v.sync.getRemoteFolderItem, expServices),
195
196
  diffCurrentAndRemoteFolderVersions: vsDiffCurrentAndRemoteFolderVersions.wrapService(fs.v.sync.diffCurrentAndRemoteFolderVersions)
196
197
  };
197
198
  if (fs.writable) {
198
199
  implExp.v.sync.startUpload = vsStartUpload.wrapService(fs.v.sync.startUpload);
199
200
  implExp.v.sync.upload = vsUpload.wrapService(fs.v.sync.upload);
200
201
  implExp.v.sync.adoptRemoteFolderItem = vsAdoptRemoteFolderItem.wrapService(fs.v.sync.adoptRemoteFolderItem);
202
+ implExp.v.sync.adoptAllRemoteFolderItems = vsAdoptAllRemoteItems.wrapService(fs.v.sync.adoptAllRemoteItems);
201
203
  }
202
204
  }
203
205
  }
@@ -1928,35 +1930,35 @@ var vsUpload;
1928
1930
  vsUpload.makeCaller = makeCaller;
1929
1931
  })(vsUpload || (vsUpload = {}));
1930
1932
  Object.freeze(vsUpload);
1931
- function optionsToAdoptRemoteItemToMsg(opts) {
1932
- if (!opts) {
1933
- return;
1934
- }
1935
- return {
1936
- localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
1937
- remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion),
1938
- replaceLocalItem: (0, protobuf_msg_1.toOptVal)(opts.replaceLocalItem),
1939
- newItemName: (0, protobuf_msg_1.toOptVal)(opts.newItemName)
1940
- };
1941
- }
1942
- function optionsToAdoptRemoteItemFromMsg(msg) {
1943
- if (!msg) {
1944
- return;
1945
- }
1946
- return {
1947
- localVersion: (0, protobuf_msg_1.valOfOptInt)(msg.localVersion),
1948
- remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
1949
- replaceLocalItem: (0, protobuf_msg_1.valOfOpt)(msg.replaceLocalItem),
1950
- newItemName: (0, protobuf_msg_1.valOfOpt)(msg.newItemName)
1951
- };
1952
- }
1953
1933
  var vsAdoptRemoteFolderItem;
1954
1934
  (function (vsAdoptRemoteFolderItem) {
1955
1935
  const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptRemoteFolderItemRequestBody);
1936
+ function optionsFromMsg(msg) {
1937
+ if (!msg) {
1938
+ return;
1939
+ }
1940
+ return {
1941
+ localVersion: (0, protobuf_msg_1.valOfOptInt)(msg.localVersion),
1942
+ remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
1943
+ replaceLocalItem: (0, protobuf_msg_1.valOfOpt)(msg.replaceLocalItem),
1944
+ newItemName: (0, protobuf_msg_1.valOfOpt)(msg.newItemName)
1945
+ };
1946
+ }
1947
+ function optionsToMsg(opts) {
1948
+ if (!opts) {
1949
+ return;
1950
+ }
1951
+ return {
1952
+ localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
1953
+ remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion),
1954
+ replaceLocalItem: (0, protobuf_msg_1.toOptVal)(opts.replaceLocalItem),
1955
+ newItemName: (0, protobuf_msg_1.toOptVal)(opts.newItemName)
1956
+ };
1957
+ }
1956
1958
  function wrapService(fn) {
1957
1959
  return buf => {
1958
1960
  const { path, itemName, opts } = requestType.unpack(buf);
1959
- const promise = fn(path, itemName, optionsToAdoptRemoteItemFromMsg(opts))
1961
+ const promise = fn(path, itemName, optionsFromMsg(opts))
1960
1962
  .then(protobuf_msg_1.packInt);
1961
1963
  return { promise };
1962
1964
  };
@@ -1966,13 +1968,55 @@ var vsAdoptRemoteFolderItem;
1966
1968
  const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'adoptRemoteFolderItem');
1967
1969
  return (path, itemName, opts) => caller
1968
1970
  .startPromiseCall(ipcPath, requestType.pack({
1969
- path, itemName, opts: optionsToAdoptRemoteItemToMsg(opts)
1971
+ path, itemName, opts: optionsToMsg(opts)
1970
1972
  }))
1971
1973
  .then(protobuf_msg_1.unpackInt);
1972
1974
  }
1973
1975
  vsAdoptRemoteFolderItem.makeCaller = makeCaller;
1974
1976
  })(vsAdoptRemoteFolderItem || (vsAdoptRemoteFolderItem = {}));
1975
1977
  Object.freeze(vsAdoptRemoteFolderItem);
1978
+ var vsAdoptAllRemoteItems;
1979
+ (function (vsAdoptAllRemoteItems) {
1980
+ const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptAllRemoteFolderItemsRequestBody);
1981
+ function optionsFromMsg(msg) {
1982
+ if (!msg) {
1983
+ return;
1984
+ }
1985
+ return {
1986
+ localVersion: (0, protobuf_msg_1.valOfOptInt)(msg.localVersion),
1987
+ remoteVersion: (0, protobuf_msg_1.valOfOptInt)(msg.remoteVersion),
1988
+ postfixForNameOverlaps: (0, protobuf_msg_1.valOfOpt)(msg.postfixForNameOverlaps),
1989
+ };
1990
+ }
1991
+ function optionsToMsg(opts) {
1992
+ if (!opts) {
1993
+ return;
1994
+ }
1995
+ return {
1996
+ localVersion: (0, protobuf_msg_1.toOptVal)(opts.localVersion),
1997
+ remoteVersion: (0, protobuf_msg_1.toOptVal)(opts.remoteVersion),
1998
+ postfixForNameOverlaps: (0, protobuf_msg_1.toOptVal)(opts.postfixForNameOverlaps),
1999
+ };
2000
+ }
2001
+ const replyType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptAllRemoteFolderItemsReplyBody);
2002
+ function wrapService(fn) {
2003
+ return buf => {
2004
+ const { path, opts } = requestType.unpack(buf);
2005
+ const promise = fn(path, optionsFromMsg(opts))
2006
+ .then(newVersion => replyType.pack({ newVersion: (0, protobuf_msg_1.toOptVal)(newVersion) }));
2007
+ return { promise };
2008
+ };
2009
+ }
2010
+ vsAdoptAllRemoteItems.wrapService = wrapService;
2011
+ function makeCaller(caller, objPath) {
2012
+ const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'adoptAllRemoteItems');
2013
+ return (path, opts) => caller
2014
+ .startPromiseCall(ipcPath, requestType.pack({ path, opts: optionsToMsg(opts) }))
2015
+ .then(buf => (0, protobuf_msg_1.valOfOpt)(replyType.unpack(buf).newVersion));
2016
+ }
2017
+ vsAdoptAllRemoteItems.makeCaller = makeCaller;
2018
+ })(vsAdoptAllRemoteItems || (vsAdoptAllRemoteItems = {}));
2019
+ Object.freeze(vsAdoptAllRemoteItems);
1976
2020
  var vsAdoptRemote;
1977
2021
  (function (vsAdoptRemote) {
1978
2022
  const requestType = protobuf_type_1.ProtoType.for(fs_proto_1.fs.AdoptRemoteRequestBody);
@@ -2068,6 +2112,34 @@ var vsGetRemoteFileItem;
2068
2112
  vsGetRemoteFileItem.makeCaller = makeCaller;
2069
2113
  })(vsGetRemoteFileItem || (vsGetRemoteFileItem = {}));
2070
2114
  Object.freeze(vsGetRemoteFileItem);
2115
+ var vsGetRemoteFolderItem;
2116
+ (function (vsGetRemoteFolderItem) {
2117
+ function wrapService(fn, expServices) {
2118
+ return buf => {
2119
+ const { path, remoteItemName, remoteVersion } = remoteChildReqType.unpack(buf);
2120
+ const promise = fn(path, remoteItemName, (0, protobuf_msg_1.valOfOptInt)(remoteVersion))
2121
+ .then(fs => {
2122
+ const fsMsg = exposeFSService(fs, expServices);
2123
+ return exports.fsMsgType.pack(fsMsg);
2124
+ });
2125
+ return { promise };
2126
+ };
2127
+ }
2128
+ vsGetRemoteFolderItem.wrapService = wrapService;
2129
+ function makeCaller(caller, objPath) {
2130
+ const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getRemoteFolderItem');
2131
+ return (path, remoteItemName, remoteVersion) => caller
2132
+ .startPromiseCall(ipcPath, remoteChildReqType.pack({
2133
+ path, remoteItemName, remoteVersion: (0, protobuf_msg_1.toOptVal)(remoteVersion)
2134
+ }))
2135
+ .then(buf => {
2136
+ const fsMsg = exports.fsMsgType.unpack(buf);
2137
+ return makeFSCaller(caller, fsMsg);
2138
+ });
2139
+ }
2140
+ vsGetRemoteFolderItem.makeCaller = makeCaller;
2141
+ })(vsGetRemoteFolderItem || (vsGetRemoteFolderItem = {}));
2142
+ Object.freeze(vsGetRemoteFolderItem);
2071
2143
  var vListVersions;
2072
2144
  (function (vListVersions) {
2073
2145
  function wrapService(fn) {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2016 - 2022, 2025 3NSoft Inc.
3
+ Copyright (C) 2016 - 2022, 2025 - 2026 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -241,9 +241,11 @@ function wrapWritableFSSyncAPI(sImpl) {
241
241
  startUpload: sImpl.startUpload.bind(sImpl),
242
242
  upload: sImpl.upload.bind(sImpl),
243
243
  adoptRemoteFolderItem: sImpl.adoptRemoteFolderItem.bind(sImpl),
244
+ adoptAllRemoteItems: sImpl.adoptAllRemoteItems.bind(sImpl),
244
245
  statRemoteItem: sImpl.statRemoteItem.bind(sImpl),
245
246
  listRemoteFolderItem: sImpl.listRemoteFolderItem.bind(sImpl),
246
247
  getRemoteFileItem: sImpl.getRemoteFileItem.bind(sImpl),
248
+ getRemoteFolderItem: sImpl.getRemoteFolderItem.bind(sImpl),
247
249
  };
248
250
  return Object.freeze(w);
249
251
  }
@@ -305,6 +307,7 @@ function wrapReadonlyFSSyncAPI(sImpl) {
305
307
  statRemoteItem: sImpl.statRemoteItem.bind(sImpl),
306
308
  listRemoteFolderItem: sImpl.listRemoteFolderItem.bind(sImpl),
307
309
  getRemoteFileItem: sImpl.getRemoteFileItem.bind(sImpl),
310
+ getRemoteFolderItem: sImpl.getRemoteFolderItem.bind(sImpl),
308
311
  diffCurrentAndRemoteFolderVersions: sImpl.diffCurrentAndRemoteFolderVersions.bind(sImpl),
309
312
  };
310
313
  return Object.freeze(w);
@@ -11,6 +11,7 @@ type XAttrsChanges = web3n.files.XAttrsChanges;
11
11
  type FolderDiff = web3n.files.FolderDiff;
12
12
  type OptionsToAdopteRemote = web3n.files.OptionsToAdopteRemote;
13
13
  type OptionsToAdoptRemoteItem = web3n.files.OptionsToAdoptRemoteItem;
14
+ type OptionsToAdoptAllRemoteItems = web3n.files.OptionsToAdoptAllRemoteItems;
14
15
  type OptionsToUploadLocal = web3n.files.OptionsToUploadLocal;
15
16
  type VersionedReadFlags = web3n.files.VersionedReadFlags;
16
17
  type Stats = web3n.files.Stats;
@@ -96,6 +97,16 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
96
97
  getFile(name: string, undefOnMissing?: boolean): Promise<FileNode | undefined>;
97
98
  getLink(name: string, undefOnMissing?: boolean): Promise<LinkNode | undefined>;
98
99
  private fixMissingChildAndThrow;
100
+ adoptItemsFromRemoteVersion(opts: OptionsToAdoptAllRemoteItems | undefined): Promise<number | undefined>;
101
+ /**
102
+ * If no initial local version given, then this performs like doTransition(change) method.
103
+ * When initial local version is given and check, exceptions are thrown if versions mismatch,
104
+ * or when there is another concurrent process that is already transitioning folder state to new state.
105
+ * This returns value of new local version.
106
+ * @param initLocalVersion
107
+ * @param change
108
+ */
109
+ private doChangeWhileTrackingVersion;
99
110
  /**
100
111
  * This method prepares a transition state, runs given action, and completes
101
112
  * transition to a new version.
@@ -161,9 +172,11 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
161
172
  private getRemoteChildNodeInfo;
162
173
  private addRemoteChild;
163
174
  private replaceLocalChildWithRemote;
175
+ private readRemoteVersion;
164
176
  diffCurrentAndRemote(remoteVersion: number | undefined): Promise<FolderDiff | undefined>;
165
177
  private diffWithArchivedRemote;
166
178
  private diffWithRemote;
167
179
  getRemoteItemNode<T extends NodeInFS<any>>(remoteItemName: string, remoteVersion: number | undefined): Promise<T>;
180
+ getStorage(): Storage;
168
181
  }
169
182
  export {};