core-3nweb-client-lib 0.44.12 → 0.45.1

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 (209) hide show
  1. package/build/core/asmail/msg/opener.js +1 -1
  2. package/build/core/asmail/msg/packer.js +1 -1
  3. package/build/core/index.d.ts +2 -2
  4. package/build/core/keyring/correspondent-keys.js +1 -1
  5. package/build/core/keyring/index.js +1 -1
  6. package/build/core/startup/sign-in.d.ts +1 -1
  7. package/build/core/startup/sign-up.d.ts +1 -1
  8. package/build/core/storage/index.d.ts +1 -1
  9. package/build/lib-client/doh.d.ts +2 -0
  10. package/build/lib-client/doh.js +68 -0
  11. package/build/lib-client/key-derivation.d.ts +1 -1
  12. package/build/lib-client/request-utils.js +1 -1
  13. package/build/lib-client/service-checks.js +3 -11
  14. package/build/lib-client/service-locator.d.ts +10 -2
  15. package/build/lib-client/service-locator.js +40 -27
  16. package/build/lib-client/xsp-fs/node-persistence.js +1 -1
  17. package/build/lib-index.d.ts +1 -0
  18. package/build/lib-index.js +3 -1
  19. package/build/tests/caps-api/asmail/specs/events.d.ts +2 -0
  20. package/build/tests/caps-api/asmail/specs/events.js +63 -0
  21. package/build/tests/caps-api/asmail/specs/send-to-wrong-address.d.ts +2 -0
  22. package/build/tests/caps-api/asmail/specs/send-to-wrong-address.js +68 -0
  23. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.d.ts +2 -0
  24. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.js +259 -0
  25. package/build/tests/caps-api/asmail/specs/send-without-attachments.d.ts +2 -0
  26. package/build/tests/caps-api/asmail/specs/send-without-attachments.js +90 -0
  27. package/build/tests/caps-api/asmail/test-utils.d.ts +12 -0
  28. package/build/tests/caps-api/asmail/test-utils.js +60 -0
  29. package/build/tests/caps-api/asmail.js +86 -0
  30. package/build/tests/caps-api/file-sink-checks/different-cases.d.ts +2 -0
  31. package/build/tests/caps-api/file-sink-checks/different-cases.js +47 -0
  32. package/build/tests/caps-api/file-sink-checks/splice.d.ts +2 -0
  33. package/build/tests/caps-api/file-sink-checks/splice.js +122 -0
  34. package/build/tests/caps-api/file-sink-checks/truncate.d.ts +2 -0
  35. package/build/tests/caps-api/file-sink-checks/truncate.js +122 -0
  36. package/build/tests/caps-api/fs-checks/local-to-synced-linking/link.d.ts +2 -0
  37. package/build/tests/caps-api/fs-checks/local-to-synced-linking/link.js +82 -0
  38. package/build/tests/caps-api/fs-checks/local-to-synced-linking/reversed-linking.d.ts +2 -0
  39. package/build/tests/caps-api/fs-checks/local-to-synced-linking/reversed-linking.js +50 -0
  40. package/build/tests/caps-api/fs-checks/not-versioned/deleteFile.d.ts +2 -0
  41. package/build/tests/caps-api/fs-checks/not-versioned/deleteFile.js +73 -0
  42. package/build/tests/caps-api/fs-checks/not-versioned/deleteFolder.d.ts +2 -0
  43. package/build/tests/caps-api/fs-checks/not-versioned/deleteFolder.js +75 -0
  44. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.d.ts +2 -0
  45. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.js +96 -0
  46. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.d.ts +2 -0
  47. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.js +67 -0
  48. package/build/tests/caps-api/fs-checks/not-versioned/getXAttr.d.ts +2 -0
  49. package/build/tests/caps-api/fs-checks/not-versioned/getXAttr.js +77 -0
  50. package/build/tests/caps-api/fs-checks/not-versioned/link.d.ts +2 -0
  51. package/build/tests/caps-api/fs-checks/not-versioned/link.js +115 -0
  52. package/build/tests/caps-api/fs-checks/not-versioned/listFolder.d.ts +2 -0
  53. package/build/tests/caps-api/fs-checks/not-versioned/listFolder.js +129 -0
  54. package/build/tests/caps-api/fs-checks/not-versioned/listXAttrs.d.ts +2 -0
  55. package/build/tests/caps-api/fs-checks/not-versioned/listXAttrs.js +73 -0
  56. package/build/tests/caps-api/fs-checks/not-versioned/makeFolder.d.ts +2 -0
  57. package/build/tests/caps-api/fs-checks/not-versioned/makeFolder.js +95 -0
  58. package/build/tests/caps-api/fs-checks/not-versioned/move.d.ts +2 -0
  59. package/build/tests/caps-api/fs-checks/not-versioned/move.js +127 -0
  60. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.d.ts +2 -0
  61. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.js +80 -0
  62. package/build/tests/caps-api/fs-checks/not-versioned/readJSONFile.d.ts +2 -0
  63. package/build/tests/caps-api/fs-checks/not-versioned/readJSONFile.js +59 -0
  64. package/build/tests/caps-api/fs-checks/not-versioned/readLink.d.ts +2 -0
  65. package/build/tests/caps-api/fs-checks/not-versioned/readLink.js +39 -0
  66. package/build/tests/caps-api/fs-checks/not-versioned/readTxtFile.d.ts +2 -0
  67. package/build/tests/caps-api/fs-checks/not-versioned/readTxtFile.js +54 -0
  68. package/build/tests/caps-api/fs-checks/not-versioned/readonlyFile.d.ts +2 -0
  69. package/build/tests/caps-api/fs-checks/not-versioned/readonlyFile.js +55 -0
  70. package/build/tests/caps-api/fs-checks/not-versioned/readonlySubRoot.d.ts +2 -0
  71. package/build/tests/caps-api/fs-checks/not-versioned/readonlySubRoot.js +55 -0
  72. package/build/tests/caps-api/fs-checks/not-versioned/select.d.ts +2 -0
  73. package/build/tests/caps-api/fs-checks/not-versioned/select.js +119 -0
  74. package/build/tests/caps-api/fs-checks/not-versioned/stat.d.ts +2 -0
  75. package/build/tests/caps-api/fs-checks/not-versioned/stat.js +96 -0
  76. package/build/tests/caps-api/fs-checks/not-versioned/updateXAttrs.d.ts +2 -0
  77. package/build/tests/caps-api/fs-checks/not-versioned/updateXAttrs.js +126 -0
  78. package/build/tests/caps-api/fs-checks/not-versioned/writableFile.d.ts +2 -0
  79. package/build/tests/caps-api/fs-checks/not-versioned/writableFile.js +79 -0
  80. package/build/tests/caps-api/fs-checks/not-versioned/writableSubRoot.d.ts +2 -0
  81. package/build/tests/caps-api/fs-checks/not-versioned/writableSubRoot.js +90 -0
  82. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.d.ts +2 -0
  83. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.js +137 -0
  84. package/build/tests/caps-api/fs-checks/not-versioned/writeJSONFile.d.ts +2 -0
  85. package/build/tests/caps-api/fs-checks/not-versioned/writeJSONFile.js +101 -0
  86. package/build/tests/caps-api/fs-checks/not-versioned/writeTxtFile.d.ts +2 -0
  87. package/build/tests/caps-api/fs-checks/not-versioned/writeTxtFile.js +100 -0
  88. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.d.ts +2 -0
  89. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.js +187 -0
  90. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.d.ts +2 -0
  91. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.js +70 -0
  92. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.d.ts +2 -0
  93. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.js +53 -0
  94. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.d.ts +2 -0
  95. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.js +194 -0
  96. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.d.ts +2 -0
  97. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.js +396 -0
  98. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.d.ts +2 -0
  99. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.js +229 -0
  100. package/build/tests/caps-api/fs-checks/test-utils.d.ts +34 -0
  101. package/build/tests/caps-api/fs-checks/test-utils.js +95 -0
  102. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.d.ts +2 -0
  103. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.js +73 -0
  104. package/build/tests/caps-api/fs-checks/versioned/getByteSink.d.ts +2 -0
  105. package/build/tests/caps-api/fs-checks/versioned/getByteSink.js +122 -0
  106. package/build/tests/caps-api/fs-checks/versioned/getByteSource.d.ts +2 -0
  107. package/build/tests/caps-api/fs-checks/versioned/getByteSource.js +71 -0
  108. package/build/tests/caps-api/fs-checks/versioned/listFolder.d.ts +2 -0
  109. package/build/tests/caps-api/fs-checks/versioned/listFolder.js +109 -0
  110. package/build/tests/caps-api/fs-checks/versioned/listVersions.d.ts +2 -0
  111. package/build/tests/caps-api/fs-checks/versioned/listVersions.js +48 -0
  112. package/build/tests/caps-api/fs-checks/versioned/readBytes.d.ts +2 -0
  113. package/build/tests/caps-api/fs-checks/versioned/readBytes.js +90 -0
  114. package/build/tests/caps-api/fs-checks/versioned/readJSONFile.d.ts +2 -0
  115. package/build/tests/caps-api/fs-checks/versioned/readJSONFile.js +60 -0
  116. package/build/tests/caps-api/fs-checks/versioned/readTxtFile.d.ts +2 -0
  117. package/build/tests/caps-api/fs-checks/versioned/readTxtFile.js +56 -0
  118. package/build/tests/caps-api/fs-checks/versioned/stat.d.ts +2 -0
  119. package/build/tests/caps-api/fs-checks/versioned/stat.js +80 -0
  120. package/build/tests/caps-api/fs-checks/versioned/watchFile.d.ts +2 -0
  121. package/build/tests/caps-api/fs-checks/versioned/watchFile.js +64 -0
  122. package/build/tests/caps-api/fs-checks/versioned/writeBytes.d.ts +2 -0
  123. package/build/tests/caps-api/fs-checks/versioned/writeBytes.js +128 -0
  124. package/build/tests/caps-api/fs-checks/versioned/writeJSONFile.d.ts +2 -0
  125. package/build/tests/caps-api/fs-checks/versioned/writeJSONFile.js +111 -0
  126. package/build/tests/caps-api/fs-checks/versioned/writeTxtFile.d.ts +2 -0
  127. package/build/tests/caps-api/fs-checks/versioned/writeTxtFile.js +107 -0
  128. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.d.ts +2 -0
  129. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.js +50 -0
  130. package/build/tests/caps-api/keyrings.js +69 -0
  131. package/build/tests/caps-api/mailerid.d.ts +1 -0
  132. package/build/tests/caps-api/mailerid.js +59 -0
  133. package/build/tests/caps-api/startup/signin-empty-cache.d.ts +1 -0
  134. package/build/tests/caps-api/startup/signin-empty-cache.js +108 -0
  135. package/build/tests/caps-api/startup/signin-with-cache.d.ts +1 -0
  136. package/build/tests/caps-api/startup/signin-with-cache.js +83 -0
  137. package/build/tests/caps-api/startup/signup-with-token.d.ts +1 -0
  138. package/build/tests/caps-api/startup/signup-with-token.js +53 -0
  139. package/build/tests/caps-api/startup/signup.d.ts +1 -0
  140. package/build/tests/caps-api/startup/signup.js +86 -0
  141. package/build/tests/caps-api/storage.d.ts +1 -0
  142. package/build/tests/caps-api/storage.js +225 -0
  143. package/build/tests/computer.3nweb.core/id-manager.d.ts +1 -0
  144. package/build/tests/computer.3nweb.core/id-manager.js +78 -0
  145. package/build/tests/computer.3nweb.core/inbox/msg-indexing.d.ts +1 -0
  146. package/build/tests/computer.3nweb.core/inbox/msg-indexing.js +145 -0
  147. package/build/tests/computer.3nweb.core/keyrings.d.ts +1 -0
  148. package/build/tests/computer.3nweb.core/keyrings.js +64 -0
  149. package/build/tests/computer.3nweb.core/test-utils.d.ts +21 -0
  150. package/build/tests/computer.3nweb.core/test-utils.js +92 -0
  151. package/build/tests/jasmine.d.ts +1 -0
  152. package/build/tests/jasmine.js +45 -0
  153. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  154. package/build/tests/libs-for-tests/bytes-equal.js +32 -0
  155. package/build/tests/libs-for-tests/caps-ipc-wrap.d.ts +11 -0
  156. package/build/tests/libs-for-tests/caps-ipc-wrap.js +55 -0
  157. package/build/tests/libs-for-tests/core-runner.d.ts +39 -0
  158. package/build/tests/libs-for-tests/core-runner.js +231 -0
  159. package/build/tests/libs-for-tests/jasmine-utils.d.ts +13 -0
  160. package/build/tests/libs-for-tests/jasmine-utils.js +110 -0
  161. package/build/tests/libs-for-tests/json-equal.d.ts +1 -0
  162. package/build/tests/libs-for-tests/json-equal.js +78 -0
  163. package/build/tests/libs-for-tests/services-runner.d.ts +18 -0
  164. package/build/tests/libs-for-tests/services-runner.js +64 -0
  165. package/build/tests/libs-for-tests/setups.d.ts +51 -0
  166. package/build/tests/libs-for-tests/setups.js +305 -0
  167. package/build/tests/libs-for-tests/spec-module.d.ts +16 -0
  168. package/build/tests/libs-for-tests/spec-module.js +92 -0
  169. package/build/tests/libs-for-tests/startup.d.ts +1 -0
  170. package/build/tests/libs-for-tests/startup.js +29 -0
  171. package/build/tests/libs-for-tests/watching.d.ts +7 -0
  172. package/build/tests/libs-for-tests/watching.js +33 -0
  173. package/build/tests/units/canonical-address.d.ts +1 -0
  174. package/build/tests/units/canonical-address.js +41 -0
  175. package/build/tests/units/device-fs.d.ts +1 -0
  176. package/build/tests/units/device-fs.js +70 -0
  177. package/build/tests/units/folder-node-serialization.d.ts +1 -0
  178. package/build/tests/units/folder-node-serialization.js +74 -0
  179. package/build/tests/units/mid-sigs-NaCl-Ed.d.ts +1 -0
  180. package/build/tests/units/mid-sigs-NaCl-Ed.js +123 -0
  181. package/build/tests/units/number-line.d.ts +1 -0
  182. package/build/tests/units/number-line.js +63 -0
  183. package/build/tests/units/obj-folders.d.ts +1 -0
  184. package/build/tests/units/obj-folders.js +152 -0
  185. package/package.json +11 -3
  186. package/postinstall.js +1 -1
  187. package/build/cryptors.d.ts +0 -1
  188. package/build/cryptors.js +0 -34
  189. package/build/lib-client/cryptor/cryptor-in-worker.d.ts +0 -20
  190. package/build/lib-client/cryptor/cryptor-in-worker.js +0 -357
  191. package/build/lib-client/cryptor/cryptor-wasm.js +0 -1
  192. package/build/lib-client/cryptor/cryptor.d.ts +0 -30
  193. package/build/lib-client/cryptor/cryptor.js +0 -44
  194. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  195. package/build/lib-client/cryptor/in-proc-js.d.ts +0 -2
  196. package/build/lib-client/cryptor/in-proc-js.js +0 -57
  197. package/build/lib-client/cryptor/in-proc-wasm.d.ts +0 -2
  198. package/build/lib-client/cryptor/in-proc-wasm.js +0 -176
  199. package/build/lib-client/cryptor/serialization-for-wasm.d.ts +0 -35
  200. package/build/lib-client/cryptor/serialization-for-wasm.js +0 -57
  201. package/build/lib-client/cryptor/wasm-mp1-modules.d.ts +0 -5
  202. package/build/lib-client/cryptor/wasm-mp1-modules.js +0 -78
  203. package/build/lib-client/cryptor/worker-js.js +0 -131
  204. package/build/lib-client/cryptor/worker-wasm.js +0 -37
  205. package/build/protos/cryptor.proto.js +0 -1804
  206. /package/build/lib-client/{cryptor/cryptor-work-labels.d.ts → cryptor-work-labels.d.ts} +0 -0
  207. /package/build/lib-client/{cryptor/cryptor-work-labels.js → cryptor-work-labels.js} +0 -0
  208. /package/build/{lib-client/cryptor/worker-js.d.ts → tests/caps-api/asmail.d.ts} +0 -0
  209. /package/build/{lib-client/cryptor/worker-wasm.d.ts → tests/caps-api/keyrings.d.ts} +0 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016, 2018, 2020 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.specs = void 0;
20
+ exports.specs = {
21
+ description: '.writeTxtFile',
22
+ its: []
23
+ };
24
+ let it = { expectation: 'if not allowed to create, fails for missing file' };
25
+ it.func = async function (s) {
26
+ const { testFS } = s;
27
+ let txt = 'Should I be at BlackHat conference or working?';
28
+ await testFS.writeTxtFile('non-existing-file', txt, {})
29
+ .then(() => {
30
+ fail('should fail for missing file');
31
+ }, (e) => {
32
+ expect(e.notFound).toBe(true);
33
+ });
34
+ };
35
+ exports.specs.its.push(it);
36
+ it = { expectation: 'creates file in existing folder' };
37
+ it.func = async function (s) {
38
+ const { testFS } = s;
39
+ let path = 'file1';
40
+ let txt = 'Should I be at BlackHat conference or working?';
41
+ expect(await testFS.checkFilePresence(path)).toBe(false);
42
+ await testFS.writeTxtFile(path, txt);
43
+ expect(await testFS.checkFilePresence(path)).toBe(true);
44
+ expect(await testFS.readTxtFile(path)).toBe(txt);
45
+ };
46
+ exports.specs.its.push(it);
47
+ it = { expectation: 'creates parent folder(s) on the way' };
48
+ it.func = async function (s) {
49
+ const { testFS } = s;
50
+ let fName = 'file2';
51
+ let grParent = 'grand-parent';
52
+ let parent2 = 'grand-parent/parent2';
53
+ let path = `${parent2}/${fName}`;
54
+ expect(await testFS.checkFolderPresence(grParent)).toBe(false);
55
+ expect(await testFS.checkFolderPresence(parent2)).toBe(false);
56
+ expect(await testFS.checkFolderPresence(path)).toBe(false);
57
+ let txt = 'Should I be at BlackHat conference or working?';
58
+ await testFS.writeTxtFile(path, txt);
59
+ expect(await testFS.checkFolderPresence(grParent)).toBe(true);
60
+ expect(await testFS.checkFolderPresence(parent2)).toBe(true);
61
+ expect(await testFS.checkFilePresence(path)).toBe(true);
62
+ expect(await testFS.readTxtFile(path)).toBe(txt);
63
+ };
64
+ exports.specs.its.push(it);
65
+ it = { expectation: 'over-writes existing file with a non-exclusive call' };
66
+ it.func = async function (s) {
67
+ const { testFS } = s;
68
+ let path = 'file3';
69
+ // setup initial file
70
+ let initTxt = 'Should I be at BlackHat conference or working?';
71
+ await testFS.writeTxtFile(path, initTxt);
72
+ expect(await testFS.checkFilePresence(path)).toBe(true);
73
+ expect(await testFS.readTxtFile(path)).toBe(initTxt);
74
+ // write new file content
75
+ let newTxt = 'Work gives tangible benefits.\nRetire and go anywhere.';
76
+ await testFS.writeTxtFile(path, newTxt);
77
+ expect(await testFS.checkFilePresence(path)).toBe(true);
78
+ expect(await testFS.readTxtFile(path)).toBe(newTxt);
79
+ };
80
+ exports.specs.its.push(it);
81
+ it = { expectation: 'exclusive-create write throws when file already exists' };
82
+ it.func = async function (s) {
83
+ const { testFS } = s;
84
+ let path = 'file4';
85
+ // setup initial file
86
+ let initTxt = 'Should I be at BlackHat conference or working?';
87
+ await testFS.writeTxtFile(path, initTxt);
88
+ expect(await testFS.checkFilePresence(path)).toBe(true);
89
+ // try an exclusive write
90
+ let newTxt = 'Work gives tangible benefits.\nRetire and go anywhere.';
91
+ await testFS.writeTxtFile(path, newTxt, { create: true, exclusive: true })
92
+ .then(() => {
93
+ fail('exclusive-create write operation must fail, when file exists.');
94
+ }, (exc) => {
95
+ expect(exc.alreadyExists).toBe(true);
96
+ });
97
+ expect(await testFS.readTxtFile(path)).withContext('initial file content stays intact').toBe(initTxt);
98
+ };
99
+ exports.specs.its.push(it);
100
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2022, 2025 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.specs = void 0;
20
+ const random_node_1 = require("../../../../lib-common/random-node");
21
+ const json_equal_1 = require("../../../libs-for-tests/json-equal");
22
+ const deferred_1 = require("../../../../lib-common/processes/deferred");
23
+ exports.specs = {
24
+ description: '.v.sync.startedUpload',
25
+ its: []
26
+ };
27
+ let it = { expectation: 'fails to read non-existent path' };
28
+ it.func = async function (s) {
29
+ const { testFS } = s;
30
+ const fName = 'unknown-file';
31
+ expect(await testFS.checkFilePresence(fName)).toBe(false);
32
+ await testFS.v.sync.startUpload(fName)
33
+ .then(() => {
34
+ fail('reading status must fail, when path does not exist');
35
+ }, (err) => {
36
+ expect(err.notFound).toBeTrue();
37
+ if (!err.notFound) {
38
+ throw err;
39
+ }
40
+ });
41
+ };
42
+ exports.specs.its.push(it);
43
+ function collectFileUploadEvents(fs, path) {
44
+ const startEvent = (0, deferred_1.defer)();
45
+ const doneEvent = (0, deferred_1.defer)();
46
+ const unsub = fs.watchFile(path, {
47
+ next: ev => {
48
+ switch (ev.type) {
49
+ case 'upload-started':
50
+ startEvent.resolve(ev);
51
+ break;
52
+ case 'upload-done':
53
+ doneEvent.resolve(ev);
54
+ unsub();
55
+ break;
56
+ }
57
+ }
58
+ });
59
+ return {
60
+ startEvent: startEvent.promise,
61
+ doneEvent: doneEvent.promise
62
+ };
63
+ }
64
+ it = { expectation: 'uploads versions' };
65
+ it.func = async function (s) {
66
+ const { testFS } = s;
67
+ const file1 = 'some folder/file 1';
68
+ const v1 = await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(10));
69
+ let syncStatus = await testFS.v.sync.status(file1, true);
70
+ expect(syncStatus.state).toBe('unsynced');
71
+ expect(syncStatus.synced).toBeUndefined();
72
+ expect(syncStatus.local).toBeDefined();
73
+ expect(syncStatus.local.latest).toBe(v1);
74
+ // file version written as a whole
75
+ const v2 = await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(10));
76
+ syncStatus = await testFS.v.sync.status(file1, true);
77
+ expect(syncStatus.local.latest).toBe(v2);
78
+ try {
79
+ await testFS.v.sync.startUpload(file1, { localVersion: v1 });
80
+ fail(`Version ${v1} is not current can't be upload`);
81
+ }
82
+ catch (exc) {
83
+ expect(exc.type).toBe('fs-sync');
84
+ }
85
+ let events = collectFileUploadEvents(testFS, file1);
86
+ let startedUpload = await testFS.v.sync.startUpload(file1, { localVersion: v2 });
87
+ expect(startedUpload).withContext(`upload should be started`).toBeDefined();
88
+ expect(startedUpload.uploadVersion).withContext(`first uploaded version should be equal to 1`).toBe(1);
89
+ syncStatus = await testFS.v.sync.status(file1, true);
90
+ expect(syncStatus.uploading).toBeDefined();
91
+ expect(syncStatus.uploading.localVersion).toBe(v2);
92
+ expect(syncStatus.uploading.remoteVersion).toBe(startedUpload.uploadVersion);
93
+ // await upload events and completion
94
+ let startEvent = await events.startEvent;
95
+ expect(startEvent.type).toBe('upload-started');
96
+ expect(startEvent.uploadTaskId).toBe(startedUpload.uploadTaskId);
97
+ expect(startEvent.localVersion).toBe(v2);
98
+ expect(startEvent.uploadVersion).toBe(startedUpload.uploadVersion);
99
+ expect(startEvent.totalBytesToUpload).toBeGreaterThan(10);
100
+ await events.doneEvent;
101
+ syncStatus = await testFS.v.sync.status(file1, true);
102
+ expect(syncStatus.state).toBe('synced');
103
+ expect(syncStatus.uploading).toBeUndefined();
104
+ expect(syncStatus.synced).toBeDefined();
105
+ expect(syncStatus.local).toBeUndefined();
106
+ expect(syncStatus.synced.latest).toBe(startedUpload.uploadVersion);
107
+ expect((await testFS.stat(file1)).version).toBe(startedUpload.uploadVersion);
108
+ // file version written as a diff from a synced version
109
+ const { sink: sink3, version: v3 } = await testFS.v.getByteSink(file1, { truncate: false });
110
+ expect(v3).withContext(`normal increase of version by 1`).toBe(2);
111
+ await sink3.splice(10, 0, await (0, random_node_1.bytes)(10));
112
+ await sink3.done();
113
+ syncStatus = await testFS.v.sync.status(file1, true);
114
+ expect(syncStatus.local.latest).toBe(v3);
115
+ expect(syncStatus.uploading).toBeUndefined();
116
+ events = collectFileUploadEvents(testFS, file1);
117
+ // note upload of latest version, when version isn't given
118
+ startedUpload = await testFS.v.sync.startUpload(file1);
119
+ expect(startedUpload.uploadVersion)
120
+ .withContext(`next uploaded version increases by 1`)
121
+ .toBe(2);
122
+ syncStatus = await testFS.v.sync.status(file1, true);
123
+ expect(syncStatus.uploading)
124
+ .withContext(`started upload normally won't be fast to complete by this point`)
125
+ .toBeDefined();
126
+ expect(syncStatus.uploading.localVersion).toBe(v3);
127
+ expect(syncStatus.uploading.remoteVersion).toBe(2);
128
+ // watch and await upload completion
129
+ await events.doneEvent;
130
+ syncStatus = await testFS.v.sync.status(file1, true);
131
+ expect(syncStatus.uploading)
132
+ .withContext(`upload must be complete after watch end`)
133
+ .toBeUndefined();
134
+ // file version written as a diff from a synced version and diff of that
135
+ let sink = (await testFS.v.getByteSink(file1, { truncate: false })).sink;
136
+ await sink.splice(20, 0, await (0, random_node_1.bytes)(10));
137
+ await sink.done();
138
+ sink = (await testFS.v.getByteSink(file1, { truncate: false })).sink;
139
+ await sink.splice(25, 0, await (0, random_node_1.bytes)(10));
140
+ await sink.done();
141
+ syncStatus = await testFS.v.sync.status(file1, true);
142
+ expect(syncStatus.local.latest).toBe(v3 + 2);
143
+ events = collectFileUploadEvents(testFS, file1);
144
+ startedUpload = await testFS.v.sync.startUpload(file1);
145
+ expect(startedUpload.uploadVersion)
146
+ .withContext(`next uploaded version increases by 1`)
147
+ .toBe(3);
148
+ await events.doneEvent;
149
+ syncStatus = await testFS.v.sync.status(file1, true);
150
+ expect(syncStatus.uploading)
151
+ .withContext(`upload must be complete after watch end`)
152
+ .toBeUndefined();
153
+ // upload of uploaded is a noop
154
+ startedUpload = await testFS.v.sync.startUpload(file1);
155
+ expect(startedUpload)
156
+ .withContext(`noop returns undefined, as upload wasn't started`)
157
+ .toBeUndefined();
158
+ expect((0, json_equal_1.deepEqual)(syncStatus, await testFS.v.sync.status(file1, true)))
159
+ .withContext(`nothing changed with noop`)
160
+ .toBeTrue();
161
+ };
162
+ exports.specs.its.push(it);
163
+ const mb = 1024 * 1024;
164
+ it = { expectation: 'uploads big file versions', timeout: 10000 };
165
+ it.func = async function (s) {
166
+ const { testFS } = s;
167
+ const file1 = 'some folder/file 1';
168
+ // file version written as a whole
169
+ await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(3 * mb));
170
+ await testFS.v.sync.upload(file1);
171
+ let syncStatus = await testFS.v.sync.status(file1, true);
172
+ expect(syncStatus.synced.latest)
173
+ .withContext(`first uploaded version should be equal to 1`).toBe(1);
174
+ expect((await testFS.stat(file1)).version).toBe(1);
175
+ // file version written as a diff from a synced version
176
+ const { sink: sinkForV2, version: v2 } = await testFS.v.getByteSink(file1, { truncate: false });
177
+ expect(v2).withContext(`normal increase of version by 1`).toBe(2);
178
+ await sinkForV2.splice(2 * mb, 0, await (0, random_node_1.bytes)(2 * mb));
179
+ await sinkForV2.done();
180
+ await testFS.v.sync.upload(file1);
181
+ syncStatus = await testFS.v.sync.status(file1, true);
182
+ expect(syncStatus.synced.latest)
183
+ .withContext(`next uploaded version increases by 1`).toBe(2);
184
+ };
185
+ // XXX add this, when changed to proper event checking
186
+ // specs.its.push(it);
187
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2025 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.specs = void 0;
20
+ const sleep_1 = require("../../../../lib-common/processes/sleep");
21
+ const random_node_1 = require("../../../../lib-common/random-node");
22
+ exports.specs = {
23
+ description: '.v.stat',
24
+ its: []
25
+ };
26
+ let it = { expectation: 'fails to read non-existent path' };
27
+ it.func = async function (s) {
28
+ const { testFS } = s;
29
+ const fName = 'unknown-file';
30
+ expect(await testFS.checkFilePresence(fName)).toBe(false);
31
+ await testFS.v.stat(fName)
32
+ .then(() => {
33
+ fail('reading status must fail, when path does not exist');
34
+ }, (err) => {
35
+ expect(err.notFound).toBe(true);
36
+ if (!err.notFound) {
37
+ throw err;
38
+ }
39
+ });
40
+ };
41
+ exports.specs.its.push(it);
42
+ it = { expectation: `gets stats` };
43
+ it.func = async function (s) {
44
+ var _a, _b, _c;
45
+ const { testFS } = s;
46
+ const file1 = 'some folder/file 1';
47
+ const fstSize = 10;
48
+ await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(fstSize));
49
+ const v1stats = await testFS.stat(file1);
50
+ expect(v1stats.versionSyncBranch).toBe('local');
51
+ await (0, sleep_1.sleep)(10);
52
+ await testFS.v.sync.upload(file1);
53
+ await (0, sleep_1.sleep)(10);
54
+ const sndSize = 20;
55
+ await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(sndSize));
56
+ const syncStatus = await testFS.v.sync.status(file1, true);
57
+ const statsLocal = await testFS.v.stat(file1);
58
+ expect(statsLocal.version).toBe((_a = syncStatus.local) === null || _a === void 0 ? void 0 : _a.latest);
59
+ expect(statsLocal.size).toBe(sndSize);
60
+ const statsSynced = await testFS.v.stat(file1, { remoteVersion: (_b = syncStatus.synced) === null || _b === void 0 ? void 0 : _b.latest });
61
+ expect(statsSynced.version).toBe((_c = syncStatus.synced) === null || _c === void 0 ? void 0 : _c.latest);
62
+ expect(statsSynced.size).toBe(fstSize);
63
+ expect(statsSynced.versionSyncBranch).toBe('synced');
64
+ expect(statsSynced.ctime.valueOf()).toBe(statsLocal.ctime.valueOf());
65
+ expect(statsSynced.mtime.valueOf()).toBeLessThan(statsLocal.mtime.valueOf());
66
+ expect(statsSynced.ctime.valueOf()).toBe(v1stats.ctime.valueOf());
67
+ expect(statsSynced.mtime.valueOf()).toBe(v1stats.mtime.valueOf());
68
+ };
69
+ exports.specs.its.push(it);
70
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2022, 2025 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.specs = void 0;
20
+ const random_node_1 = require("../../../../lib-common/random-node");
21
+ exports.specs = {
22
+ description: '.v.sync.status',
23
+ its: []
24
+ };
25
+ let it = { expectation: 'fails to read non-existent path' };
26
+ it.func = async function (s) {
27
+ const { testFS } = s;
28
+ const fName = 'unknown-file';
29
+ expect(await testFS.checkFilePresence(fName)).toBe(false);
30
+ await testFS.v.sync.status(fName)
31
+ .then(() => {
32
+ fail('reading status must fail, when path does not exist');
33
+ }, (err) => {
34
+ expect(err.notFound).toBe(true);
35
+ if (!err.notFound) {
36
+ throw err;
37
+ }
38
+ });
39
+ };
40
+ exports.specs.its.push(it);
41
+ it = { expectation: 'gets synchronization status' };
42
+ it.func = async function (s) {
43
+ const { testFS } = s;
44
+ const file1 = 'some folder/file 1';
45
+ const v1 = await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(10));
46
+ const syncStatus = await testFS.v.sync.status(file1, true);
47
+ expect(syncStatus.state).toBe('unsynced');
48
+ expect(syncStatus.local.latest).toBe(v1);
49
+ expect(syncStatus.synced).toBeUndefined();
50
+ expect(syncStatus.remote).toBeUndefined();
51
+ };
52
+ exports.specs.its.push(it);
53
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2022, 2025 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.specs = void 0;
20
+ const random_node_1 = require("../../../../lib-common/random-node");
21
+ const json_equal_1 = require("../../../libs-for-tests/json-equal");
22
+ const sleep_1 = require("../../../../lib-common/processes/sleep");
23
+ exports.specs = {
24
+ description: '.v.sync.upload',
25
+ its: []
26
+ };
27
+ let it = { expectation: 'fails to read non-existent path' };
28
+ it.func = async function (s) {
29
+ const { testFS } = s;
30
+ const fName = 'unknown-file';
31
+ expect(await testFS.checkFilePresence(fName)).toBe(false);
32
+ await testFS.v.sync.upload(fName)
33
+ .then(() => {
34
+ fail('reading status must fail, when path does not exist');
35
+ }, (err) => {
36
+ expect(err.notFound).toBeTrue();
37
+ if (!err.notFound) {
38
+ throw err;
39
+ }
40
+ });
41
+ };
42
+ exports.specs.its.push(it);
43
+ it = { expectation: 'uploads versions' };
44
+ it.func = async function (s) {
45
+ const { testFS } = s;
46
+ const file1 = 'some folder/file 1';
47
+ const v1 = await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(10));
48
+ let syncStatus = await testFS.v.sync.status(file1, true);
49
+ expect(syncStatus.state).toBe('unsynced');
50
+ expect(syncStatus.synced).toBeUndefined();
51
+ expect(syncStatus.local).toBeDefined();
52
+ expect(syncStatus.local.latest).toBe(v1);
53
+ // file version written as a whole
54
+ const v2 = await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(10));
55
+ syncStatus = await testFS.v.sync.status(file1, true);
56
+ expect(syncStatus.local.latest).toBe(v2);
57
+ try {
58
+ await testFS.v.sync.upload(file1, { localVersion: v1 });
59
+ fail(`Version ${v1} is not current can't be upload`);
60
+ }
61
+ catch (exc) {
62
+ expect(exc.type).toBe('fs-sync');
63
+ }
64
+ let uploadedVersion = await testFS.v.sync.upload(file1, { localVersion: v2 });
65
+ expect(uploadedVersion)
66
+ .withContext(`first uploaded version should be equal to 1`)
67
+ .toBe(1);
68
+ syncStatus = await testFS.v.sync.status(file1, true);
69
+ expect(syncStatus.state).toBe('synced');
70
+ expect(syncStatus.synced).toBeDefined();
71
+ expect(syncStatus.local).toBeUndefined();
72
+ expect(syncStatus.synced.latest).toBe(uploadedVersion);
73
+ expect((await testFS.stat(file1)).version).toBe(uploadedVersion);
74
+ // file version written as a diff from a synced version
75
+ const { sink: sink3, version: v3 } = await testFS.v.getByteSink(file1, { truncate: false });
76
+ expect(v3).withContext(`normal increase of version by 1`).toBe(2);
77
+ await sink3.splice(10, 0, await (0, random_node_1.bytes)(10));
78
+ await sink3.done();
79
+ syncStatus = await testFS.v.sync.status(file1, true);
80
+ expect(syncStatus.local.latest).toBe(v3);
81
+ // note upload of latest version, when version isn't given
82
+ uploadedVersion = await testFS.v.sync.upload(file1);
83
+ expect(uploadedVersion)
84
+ .withContext(`next uploaded version increases by 1`)
85
+ .toBe(2);
86
+ // file version written as a diff from a synced version and diff of that
87
+ let sink = (await testFS.v.getByteSink(file1, { truncate: false })).sink;
88
+ await sink.splice(20, 0, await (0, random_node_1.bytes)(10));
89
+ await sink.done();
90
+ sink = (await testFS.v.getByteSink(file1, { truncate: false })).sink;
91
+ await sink.splice(25, 0, await (0, random_node_1.bytes)(10));
92
+ await sink.done();
93
+ syncStatus = await testFS.v.sync.status(file1, true);
94
+ expect(syncStatus.local.latest).toBe(v3 + 2);
95
+ uploadedVersion = await testFS.v.sync.upload(file1);
96
+ expect(uploadedVersion)
97
+ .withContext(`next uploaded version increases by 1`)
98
+ .toBe(3);
99
+ syncStatus = await testFS.v.sync.status(file1, true);
100
+ // upload of uploaded is a noop
101
+ uploadedVersion = await testFS.v.sync.upload(file1);
102
+ expect(uploadedVersion)
103
+ .withContext(`noop returns no version, as nothing was uploaded`)
104
+ .toBeUndefined();
105
+ expect((0, json_equal_1.deepEqual)(syncStatus, await testFS.v.sync.status(file1, true)))
106
+ .withContext(`nothing changed with noop`)
107
+ .toBeTrue();
108
+ };
109
+ exports.specs.its.push(it);
110
+ const mb = 1024 * 1024;
111
+ it = { expectation: 'uploads big file versions', timeout: 10000 };
112
+ it.func = async function (s) {
113
+ const { testFS } = s;
114
+ const file1 = 'some folder/file 1';
115
+ // file version written as a whole
116
+ await testFS.v.writeBytes(file1, await (0, random_node_1.bytes)(3 * mb));
117
+ await testFS.v.sync.upload(file1);
118
+ let syncStatus = await testFS.v.sync.status(file1, true);
119
+ expect(syncStatus.synced.latest)
120
+ .withContext(`first uploaded version should be equal to 1`).toBe(1);
121
+ expect((await testFS.stat(file1)).version).toBe(1);
122
+ // file version written as a diff from a synced version
123
+ const { sink: sinkForV2, version: v2 } = await testFS.v.getByteSink(file1, { truncate: false });
124
+ expect(v2).withContext(`normal increase of version by 1`).toBe(2);
125
+ await sinkForV2.splice(2 * mb, 0, await (0, random_node_1.bytes)(2 * mb));
126
+ await sinkForV2.done();
127
+ await testFS.v.sync.upload(file1);
128
+ syncStatus = await testFS.v.sync.status(file1, true);
129
+ expect(syncStatus.synced.latest)
130
+ .withContext(`next uploaded version increases by 1`).toBe(2);
131
+ };
132
+ exports.specs.its.push(it);
133
+ it = { expectation: 'refuses to upload folder if any child is never uploaded' };
134
+ it.func = async function (s) {
135
+ const { testFS } = s;
136
+ const folder = 'folder-to-upload';
137
+ const childName = `child-file`;
138
+ const childPath = `${folder}/${childName}`;
139
+ expect(await testFS.checkFolderPresence(folder)).toBeFalse();
140
+ await testFS.writeBytes(childPath, await (0, random_node_1.bytes)(10));
141
+ expect(await testFS.checkFolderPresence(folder)).toBeTrue();
142
+ let syncStatus = await testFS.v.sync.status(childPath, true);
143
+ expect(syncStatus.synced).toBeUndefined();
144
+ expect(syncStatus.existsInSyncedParent).toBeFalsy();
145
+ // child never uploaded at this point
146
+ await testFS.v.sync.upload(folder).then(() => fail(`upload of folder must fail with child that was never uploaded`), (exc) => {
147
+ expect(exc.type).toBe('fs-sync');
148
+ expect(exc.childNeverUploaded).toBeTrue();
149
+ expect(exc.childName).toBe(childName);
150
+ });
151
+ // upload child and update into unsynced state
152
+ await testFS.v.sync.upload(childPath);
153
+ syncStatus = await testFS.v.sync.status(childPath, true);
154
+ expect(syncStatus.state).toBe('synced');
155
+ expect(syncStatus.existsInSyncedParent).toBeFalsy();
156
+ await testFS.writeBytes(childPath, await (0, random_node_1.bytes)(20));
157
+ syncStatus = await testFS.v.sync.status(childPath, true);
158
+ expect(syncStatus.synced).toBeDefined();
159
+ expect(syncStatus.state).toBe('unsynced');
160
+ expect(syncStatus.existsInSyncedParent).toBeFalsy();
161
+ await testFS.v.sync.upload(folder);
162
+ syncStatus = await testFS.v.sync.status(folder, true);
163
+ expect(syncStatus.state).toBe('synced');
164
+ // note again that upload is not uploading children
165
+ syncStatus = await testFS.v.sync.status(childPath, true);
166
+ expect(syncStatus.state).toBe('unsynced');
167
+ expect(syncStatus.existsInSyncedParent).toBeTruthy();
168
+ };
169
+ exports.specs.its.push(it);
170
+ it = { expectation: `should do own concurrently` };
171
+ it.func = async function (s) {
172
+ const { testFS } = s;
173
+ // let's make and upload folder
174
+ const folderName = 'folder-to-upload';
175
+ const folder = await testFS.writableSubRoot(folderName);
176
+ const fstUpload = folder.v.sync.upload('');
177
+ await (0, sleep_1.sleep)(0);
178
+ folder.v.sync.upload('').catch((exc) => {
179
+ expect(exc.alreadyUploading).withContext(`Upload and syncing better be a single non-concurrent process, that synchronizes itself, following its own logical context.`).toBeTrue();
180
+ });
181
+ await fstUpload;
182
+ // let's make child entries and upload them, one-by-one
183
+ const children = [1, 2, 3, 4, 5].map(i => `child-file-${i}`);
184
+ const someContent = await (0, random_node_1.bytes)(50);
185
+ await Promise.all(children.map(child => folder.writeBytes(child, someContent)));
186
+ await Promise.all(children.map(child => folder.v.sync.upload(child)));
187
+ await folder.v.sync.upload('');
188
+ expect(((await folder.listFolder('')).length)).toBe(children.length);
189
+ await Promise.all(children.map(child => folder.deleteFile(child)));
190
+ await folder.v.sync.upload('');
191
+ expect(((await folder.listFolder('')).length)).toBe(0);
192
+ };
193
+ exports.specs.its.push(it);
194
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;