core-3nweb-client-lib 0.20.9 → 0.23.0

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 (67) hide show
  1. package/build/api-defs/common-caps.d.ts +6 -10
  2. package/build/api-defs/files.d.ts +8 -7
  3. package/build/core/asmail/inbox/attachments/fs.d.ts +2 -2
  4. package/build/core/asmail/inbox/attachments/fs.js +3 -2
  5. package/build/core/asmail/msg/common.d.ts +2 -2
  6. package/build/core/asmail/msg/common.js +3 -2
  7. package/build/core/asmail/msg/opener.d.ts +2 -2
  8. package/build/core/asmail/msg/opener.js +3 -2
  9. package/build/core/asmail/msg/packer.d.ts +2 -2
  10. package/build/core/asmail/msg/packer.js +7 -6
  11. package/build/core/index.d.ts +2 -2
  12. package/build/core/index.js +24 -28
  13. package/build/core/storage/index.js +2 -2
  14. package/build/core/storage/local/obj-files.js +8 -5
  15. package/build/core/storage/local/obj-status.js +4 -3
  16. package/build/core/storage/synced/obj-status.js +4 -3
  17. package/build/ipc-via-protobuf/bytes.js +1 -1
  18. package/build/ipc-via-protobuf/file.d.ts +4 -0
  19. package/build/ipc-via-protobuf/file.js +17 -15
  20. package/build/ipc-via-protobuf/fs.js +1 -1
  21. package/build/lib-client/3nstorage/xsp-fs/attrs.d.ts +28 -0
  22. package/build/lib-client/3nstorage/xsp-fs/attrs.js +337 -0
  23. package/build/lib-client/3nstorage/xsp-fs/common.d.ts +1 -1
  24. package/build/lib-client/3nstorage/xsp-fs/common.js +3 -2
  25. package/build/lib-client/3nstorage/xsp-fs/file-node.d.ts +31 -18
  26. package/build/lib-client/3nstorage/xsp-fs/file-node.js +130 -118
  27. package/build/lib-client/3nstorage/xsp-fs/file.d.ts +0 -1
  28. package/build/lib-client/3nstorage/xsp-fs/file.js +14 -49
  29. package/build/lib-client/3nstorage/xsp-fs/folder-node-serialization.d.ts +1 -1
  30. package/build/lib-client/3nstorage/xsp-fs/folder-node-serialization.js +95 -91
  31. package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +19 -24
  32. package/build/lib-client/3nstorage/xsp-fs/folder-node.js +133 -190
  33. package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +3 -4
  34. package/build/lib-client/3nstorage/xsp-fs/fs.js +18 -21
  35. package/build/lib-client/3nstorage/xsp-fs/link-node.d.ts +13 -8
  36. package/build/lib-client/3nstorage/xsp-fs/link-node.js +46 -38
  37. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +17 -35
  38. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +34 -127
  39. package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +57 -0
  40. package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +182 -0
  41. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.d.ts +3 -0
  42. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +87 -0
  43. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.d.ts +6 -0
  44. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +1022 -0
  45. package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
  46. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  47. package/build/lib-client/local-files/device-fs.js +7 -3
  48. package/build/lib-client/objs-on-disk/file-writing-proc.js +3 -2
  49. package/build/lib-client/objs-on-disk/obj-on-disk.js +8 -7
  50. package/build/lib-common/big-endian.d.ts +0 -24
  51. package/build/lib-common/big-endian.js +16 -78
  52. package/build/lib-common/exceptions/file.js +6 -2
  53. package/build/lib-common/obj-streaming/sink-utils.d.ts +0 -4
  54. package/build/lib-common/obj-streaming/sink-utils.js +4 -70
  55. package/build/lib-common/objs-on-disk/file-layout.js +2 -1
  56. package/build/lib-common/objs-on-disk/obj-file.js +2 -2
  57. package/build/lib-common/objs-on-disk/utils.js +2 -1
  58. package/build/lib-common/objs-on-disk/v1-obj-file-format.js +2 -1
  59. package/package.json +2 -2
  60. package/build/lib-client/files/file-attrs.d.ts +0 -76
  61. package/build/lib-client/files/file-attrs.js +0 -549
  62. package/build/lib-client/files/file-layout.d.ts +0 -56
  63. package/build/lib-client/files/file-layout.js +0 -456
  64. package/build/lib-client/files/file-sink.d.ts +0 -33
  65. package/build/lib-client/files/file-sink.js +0 -173
  66. package/build/lib-client/files/file-source.d.ts +0 -19
  67. package/build/lib-client/files/file-source.js +0 -115
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2017 3NSoft Inc.
3
+ Copyright (C) 2017, 2022 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
@@ -13,113 +13,117 @@
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
- exports.deserializeFolderInfo = exports.serializeFolderInfo = void 0;
19
- /**
20
- * Everything in this module is assumed to be inside of a file system
21
- * reliance set.
22
- */
19
+ exports.serializeFolderInfo = exports.parseFolderInfo = void 0;
23
20
  const buffer_utils_1 = require("../../../lib-common/buffer-utils");
24
21
  const xsp_files_1 = require("xsp-files");
25
- const error_1 = require("../../../lib-common/exceptions/error");
22
+ const big_endian_1 = require("../../../lib-common/big-endian");
23
+ const assert_1 = require("../../../lib-common/assert");
26
24
  const ver1Serialization = new Uint8Array([1]);
27
- function serializeFolderInfoV1(folderInfo) {
28
- const bytes = [ver1Serialization];
29
- Object.values(folderInfo.nodes)
30
- .map(serializeNodeInfoV1)
31
- .forEach(nodeBytes => bytes.push(...nodeBytes));
32
- return bytes;
33
- }
34
- function serializeNodeInfoV1(nodeInfo) {
35
- const bytes = [nodeInfo.key];
36
- const json = {
37
- t: (nodeInfo.isFolder ? 1 : (nodeInfo.isFile ? 2 : 3)),
38
- n: nodeInfo.name,
39
- o: nodeInfo.objId
40
- };
41
- const jsonBytes = buffer_utils_1.utf8.pack(JSON.stringify(json));
42
- bytes.push(numberToBytes(jsonBytes.length));
43
- bytes.push(jsonBytes);
44
- return bytes;
45
- }
46
- function load_bigendian(arr) {
47
- return (arr[3] | arr[2] << 8) | (arr[1] << 16) | (arr[0] << 24);
48
- }
49
- function store_bigendian(arr, x) {
50
- if (x > 0xffffffff) {
51
- throw new Error(`Number ${x} is bigger than expected unsigned 32 bit integer`);
25
+ function parseFolderInfo(bytes) {
26
+ if (!bytes) {
27
+ throw parsingException(`Can't parse folder from no bytes`);
52
28
  }
53
- arr[3] = x;
54
- arr[2] = x >>> 8;
55
- arr[1] = x >>> 16;
56
- arr[0] = x >>> 24;
57
- }
58
- function numberToBytes(x) {
59
- const arr = new Uint8Array(4);
60
- store_bigendian(arr, x);
61
- return arr;
62
- }
63
- function serializeFolderInfo(folderInfo) {
64
- return serializeFolderInfoV1(folderInfo);
65
- }
66
- exports.serializeFolderInfo = serializeFolderInfo;
67
- function deserializeFolderInfo(bytes) {
68
29
  if (bytes[0] === ver1Serialization[0]) {
69
- return deserializeFolderInfoV1(bytes.subarray(1));
30
+ return formatV1.parse(bytes.subarray(1));
70
31
  }
71
32
  else {
72
- throw new Error(`Cannot recognize folder's serialization version`);
33
+ throw parsingException(`Cannot recognize folder's serialization version`);
73
34
  }
74
35
  }
75
- exports.deserializeFolderInfo = deserializeFolderInfo;
76
- function deserializeFolderInfoV1(bytes) {
77
- let slice = bytes;
78
- const folderInfo = {
79
- nodes: {}
36
+ exports.parseFolderInfo = parseFolderInfo;
37
+ function serializeFolderInfo(folderInfo) {
38
+ return formatV1.pack(folderInfo);
39
+ }
40
+ exports.serializeFolderInfo = serializeFolderInfo;
41
+ function parsingException(msg, cause) {
42
+ return {
43
+ runtimeException: true,
44
+ type: 'folder-parsing',
45
+ message: msg,
46
+ cause
80
47
  };
81
- while (slice.length > 0) {
82
- const { node, bytesRead } = deserializeNodeInfoV1(slice);
83
- slice = slice.subarray(bytesRead);
84
- folderInfo.nodes[node.name] = node;
85
- }
86
- bytes.fill(0);
87
- return folderInfo;
88
48
  }
89
- function deserializeNodeInfoV1(bytes) {
90
- if (bytes.length < (xsp_files_1.KEY_LENGTH + 4)) {
91
- throw new Error(`Cannot deserialize node key from bytes`);
49
+ var formatV1;
50
+ (function (formatV1) {
51
+ function pack(folderInfo) {
52
+ const bytes = [ver1Serialization];
53
+ for (const nodeInfo of Object.values(folderInfo.nodes)) {
54
+ bytes.push(...packNode(nodeInfo));
55
+ }
56
+ return bytes;
57
+ }
58
+ formatV1.pack = pack;
59
+ function packNode(nodeInfo) {
60
+ const bytes = [nodeInfo.key];
61
+ const json = {
62
+ t: (nodeInfo.isFolder ? 1 : (nodeInfo.isFile ? 2 : 3)),
63
+ n: nodeInfo.name,
64
+ o: nodeInfo.objId
65
+ };
66
+ const jsonBytes = buffer_utils_1.utf8.pack(JSON.stringify(json));
67
+ assert_1.assert(jsonBytes.length < 0xffffffff);
68
+ bytes.push(numberToBytes(jsonBytes.length));
69
+ bytes.push(jsonBytes);
70
+ return bytes;
92
71
  }
93
- const key = buffer_utils_1.makeUint8ArrayCopy(bytes.subarray(0, xsp_files_1.KEY_LENGTH));
94
- bytes = bytes.subarray(xsp_files_1.KEY_LENGTH);
95
- const jsonBytesLen = load_bigendian(bytes);
96
- bytes = bytes.subarray(4);
97
- try {
98
- const json = JSON.parse(buffer_utils_1.utf8.open(bytes.subarray(0, jsonBytesLen)));
99
- const node = {
100
- name: json.n,
101
- key,
102
- objId: json.o
72
+ function numberToBytes(x) {
73
+ const arr = Buffer.allocUnsafe(4);
74
+ big_endian_1.packUintTo4Bytes(x, arr, 0);
75
+ return arr;
76
+ }
77
+ function parse(bytes) {
78
+ let slice = bytes;
79
+ const folderInfo = {
80
+ nodes: {}
103
81
  };
104
- if (json.t === 1) {
105
- node.isFolder = true;
82
+ while (slice.length > 0) {
83
+ const { node, bytesRead } = deserializeNodeInfoV1(slice);
84
+ slice = slice.subarray(bytesRead);
85
+ folderInfo.nodes[node.name] = node;
106
86
  }
107
- else if (json.t === 2) {
108
- node.isFile = true;
87
+ bytes.fill(0);
88
+ return folderInfo;
89
+ }
90
+ formatV1.parse = parse;
91
+ function deserializeNodeInfoV1(bytes) {
92
+ if (bytes.length < (xsp_files_1.KEY_LENGTH + 4)) {
93
+ throw parsingException(`Cannot deserialize node key from bytes`);
109
94
  }
110
- else if (json.t === 3) {
111
- node.isLink = true;
95
+ const key = buffer_utils_1.makeUint8ArrayCopy(bytes.subarray(0, xsp_files_1.KEY_LENGTH));
96
+ bytes = bytes.subarray(xsp_files_1.KEY_LENGTH);
97
+ const jsonBytesLen = big_endian_1.uintFrom4Bytes(bytes);
98
+ bytes = bytes.subarray(4);
99
+ try {
100
+ const json = JSON.parse(buffer_utils_1.utf8.open(bytes.subarray(0, jsonBytesLen)));
101
+ const node = {
102
+ name: json.n,
103
+ key,
104
+ objId: json.o
105
+ };
106
+ if (json.t === 1) {
107
+ node.isFolder = true;
108
+ }
109
+ else if (json.t === 2) {
110
+ node.isFile = true;
111
+ }
112
+ else if (json.t === 3) {
113
+ node.isLink = true;
114
+ }
115
+ else {
116
+ throw parsingException('unidentified node type');
117
+ }
118
+ return {
119
+ node,
120
+ bytesRead: xsp_files_1.KEY_LENGTH + 4 + jsonBytesLen
121
+ };
112
122
  }
113
- else {
114
- throw 'unidentified node type';
123
+ catch (err) {
124
+ throw parsingException(`Cannot deserialize node info from bytes.`, err);
115
125
  }
116
- return {
117
- node,
118
- bytesRead: xsp_files_1.KEY_LENGTH + 4 + jsonBytesLen
119
- };
120
126
  }
121
- catch (err) {
122
- throw error_1.errWithCause(err, `Cannot deserialize node info from bytes.`);
123
- }
124
- }
127
+ })(formatV1 || (formatV1 = {}));
128
+ Object.freeze(formatV1);
125
129
  Object.freeze(exports);
@@ -1,11 +1,13 @@
1
1
  import { Storage, Node, NodeType } from './common';
2
- import { NodeInFS, NodeCrypto } from './node-in-fs';
2
+ import { NodeInFS } from './node-in-fs';
3
3
  import { FileNode } from './file-node';
4
4
  import { LinkNode } from './link-node';
5
5
  import { LinkParameters } from '../../files';
6
6
  import { AsyncSBoxCryptor, Subscribe, ObjSource } from 'xsp-files';
7
- import { FolderAttrs, AttrsHolder, EntityAttrs } from '../../files/file-attrs';
7
+ import { CommonAttrs, XAttrs } from './attrs';
8
+ import { NodePersistance } from './node-persistence';
8
9
  declare type ListingEntry = web3n.files.ListingEntry;
10
+ declare type XAttrsChanges = web3n.files.XAttrsChanges;
9
11
  export interface NodeInfo {
10
12
  /**
11
13
  * This is a usual file name.
@@ -40,15 +42,17 @@ export interface FolderInfo {
40
42
  [name: string]: NodeInfo;
41
43
  };
42
44
  }
43
- export interface FolderInfoWithAttrs extends FolderInfo {
44
- attrs?: FolderAttrs;
45
+ export interface FolderInJSON extends FolderInfo {
46
+ ctime: number;
47
+ xattrs?: any;
45
48
  }
46
- declare class FolderCrypto extends NodeCrypto {
49
+ declare class FolderPersistance extends NodePersistance {
47
50
  constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor);
48
- pack(folderInfo: FolderInfo, version: number, attrs: AttrsHolder<FolderAttrs>): Promise<Subscribe>;
49
- open(src: ObjSource): Promise<{
51
+ write(folderInfo: FolderInfo, version: number, attrs: CommonAttrs, xattrs: XAttrs | undefined): Promise<Subscribe>;
52
+ read(src: ObjSource): Promise<{
50
53
  folderInfo: FolderInfo;
51
- attrs?: AttrsHolder<FolderAttrs>;
54
+ attrs: CommonAttrs;
55
+ xattrs?: XAttrs;
52
56
  }>;
53
57
  }
54
58
  export interface FolderLinkParams {
@@ -56,17 +60,14 @@ export interface FolderLinkParams {
56
60
  objId: string;
57
61
  fKey: string;
58
62
  }
59
- export declare class FolderNode extends NodeInFS<FolderCrypto, FolderAttrs> {
63
+ export declare class FolderNode extends NodeInFS<FolderPersistance> {
60
64
  private currentState;
61
- private transitionState;
62
- private transitionVersion;
63
- private transitionSaved;
64
65
  private constructor();
65
66
  static newRoot(storage: Storage, key: Uint8Array): Promise<FolderNode>;
66
67
  static rootFromObjBytes(storage: Storage, name: string | undefined, objId: string | null, src: ObjSource, key: Uint8Array): Promise<FolderNode>;
67
68
  private static readNodeFromObjBytes;
68
69
  static rootFromLinkParams(storage: Storage, params: FolderLinkParams): Promise<FolderNode>;
69
- static rootFromJSON(storage: Storage, name: string | undefined, folderJson: FolderInfoWithAttrs): FolderNode;
70
+ static rootFromJSON(storage: Storage, name: string | undefined, folderJson: FolderInJSON): FolderNode;
70
71
  list(): {
71
72
  lst: ListingEntry[];
72
73
  version: number;
@@ -88,21 +89,15 @@ export declare class FolderNode extends NodeInFS<FolderCrypto, FolderAttrs> {
88
89
  private fixMissingChildAndThrow;
89
90
  /**
90
91
  * This method prepares a transition state, runs given action, and completes
91
- * transition to a new version. Returned promise resolves to whatever given
92
- * action returns (promise is unwrapped).
92
+ * transition to a new version.
93
93
  * Note that if there is already an ongoing change, this transition will
94
94
  * wait. Such behaviour is generally needed for folder as different processes
95
95
  * may be sharing same elements in a file tree. In contrast, file
96
96
  * operations should more often follow a throw instead wait approach.
97
- * @param autoSave true value turns on saving in of transition by this call,
98
- * while false value indicates that saving will be done within a given action
99
- * @param action is a function that is run when transition is started
97
+ * @param change is a function that is run when transition is started
100
98
  */
101
99
  private doTransition;
102
- private wrapInTransition;
103
- private clearTransitionState;
104
- private saveTransitionState;
105
- private addToTransitionState;
100
+ private performTransition;
106
101
  /**
107
102
  * This function only creates folder node, but it doesn't insert it anywhere.
108
103
  * @param name
@@ -121,10 +116,10 @@ export declare class FolderNode extends NodeInFS<FolderCrypto, FolderAttrs> {
121
116
  */
122
117
  private makeAndSaveNewChildLinkNode;
123
118
  private create;
124
- createFolder(name: string, exclusive: boolean): Promise<FolderNode>;
119
+ createFolder(name: string, exclusive: boolean, changes: XAttrsChanges | undefined): Promise<FolderNode>;
125
120
  createFile(name: string, exclusive: boolean): Promise<FileNode>;
126
121
  createLink(name: string, params: LinkParameters<any>): Promise<void>;
127
- removeChild(f: NodeInFS<NodeCrypto, EntityAttrs>): Promise<void>;
122
+ removeChild(f: NodeInFS<any>): Promise<void>;
128
123
  private changeChildName;
129
124
  moveChildTo(childName: string, dst: FolderNode, nameInDst: string): Promise<void>;
130
125
  private moveChildOut;