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,259 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016 - 2018, 2020, 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 test_utils_1 = require("../test-utils");
22
+ const sleep_1 = require("../../../../lib-common/processes/sleep");
23
+ const random_node_2 = require("../../../../lib-common/random-node");
24
+ const files = [{
25
+ content: 'This is file content for file #1',
26
+ name: 'file1'
27
+ }, {
28
+ content: 'Content for file #2 (longer file)\n' + (0, random_node_1.stringOfB64CharsSync)(100000),
29
+ name: 'file2'
30
+ }];
31
+ const folder = {
32
+ name: 'parent folder',
33
+ files: [files[0]],
34
+ folders: [{
35
+ name: 'child folder 1',
36
+ files: [files[0]],
37
+ folders: []
38
+ }, {
39
+ name: 'child folder 2',
40
+ files: [files[1]],
41
+ folders: []
42
+ }]
43
+ };
44
+ exports.specs = {
45
+ description: '.sendMsg',
46
+ its: []
47
+ };
48
+ let it = {
49
+ expectation: 'sending and getting message with attachments from synced fs'
50
+ };
51
+ it.func = async function (s) {
52
+ const u1_w3n = s.testAppCapsByUserIndex(0);
53
+ const u2 = s.users[1];
54
+ const txtBody = 'Some text\nBlah-blah-blah';
55
+ // user 1 sends message to user 2
56
+ const recipient = u2.userId;
57
+ // make fs objects for attachment
58
+ const appFS = await u1_w3n.storage.getAppSyncedFS('app.3nweb.test');
59
+ const filesToAttach = [];
60
+ for (const fp of files) {
61
+ const path = fp.name;
62
+ await appFS.writeTxtFile(path, fp.content);
63
+ const file = await appFS.readonlyFile(path);
64
+ filesToAttach.push(file);
65
+ }
66
+ const makeFolderIn = async (parent, folder) => {
67
+ const fs = await parent.writableSubRoot(folder.name);
68
+ for (const fp of folder.files) {
69
+ await fs.writeTxtFile(fp.name, fp.content);
70
+ }
71
+ for (const fp of folder.folders) {
72
+ await makeFolderIn(fs, fp);
73
+ }
74
+ return fs;
75
+ };
76
+ const folderToAttach = await makeFolderIn(appFS, folder);
77
+ // put together and send message
78
+ const outMsg = {
79
+ msgType: 'mail',
80
+ plainTxtBody: txtBody
81
+ };
82
+ outMsg.attachments = { files: {}, folders: {} };
83
+ for (const file of filesToAttach) {
84
+ outMsg.attachments.files[file.name] = file;
85
+ }
86
+ outMsg.attachments.folders[folderToAttach.name] = folderToAttach;
87
+ const idForSending = 'a1b2';
88
+ await u1_w3n.mail.delivery.addMsg([recipient], outMsg, idForSending);
89
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeTruthy();
90
+ const notifs = [];
91
+ await new Promise((resolve, reject) => {
92
+ const observer = {
93
+ next: (p) => { notifs.push(p); },
94
+ complete: resolve, error: reject
95
+ };
96
+ const cbDetach = u1_w3n.mail.delivery.observeDelivery(idForSending, observer);
97
+ expect(typeof cbDetach).toBe('function');
98
+ });
99
+ expect(notifs.length).toBeGreaterThan(0);
100
+ const lastInfo = notifs[notifs.length - 1];
101
+ expect(typeof lastInfo).toBe('object');
102
+ expect(lastInfo.allDone).toBe('all-ok');
103
+ (0, test_utils_1.throwDeliveryErrorFrom)(lastInfo);
104
+ await u1_w3n.mail.delivery.rmMsg(idForSending);
105
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeFalsy();
106
+ const recInfo = lastInfo.recipients[recipient];
107
+ expect(typeof recInfo.idOnDelivery).toBe('string');
108
+ const msgId = recInfo.idOnDelivery;
109
+ expect(msgId).toBeTruthy();
110
+ // user 2 gets incoming message after some delay
111
+ await (0, sleep_1.sleep)(500);
112
+ const u2_w3n = s.testAppCapsByUser(u2);
113
+ // check message
114
+ const msgs = await u2_w3n.mail.inbox.listMsgs();
115
+ const msgInfo = msgs.find(m => (m.msgId === msgId));
116
+ expect(msgInfo).withContext(`message ${msgId} should be present in a list of all messages`).toBeTruthy();
117
+ const inMsg = await u2_w3n.mail.inbox.getMsg(msgId);
118
+ expect(inMsg).toBeTruthy();
119
+ expect(inMsg.plainTxtBody).toBe(txtBody);
120
+ // check attachments presence
121
+ expect(inMsg.attachments).withContext(`attachments should be present in message ${msgId}`).toBeDefined();
122
+ const attachments = inMsg.attachments;
123
+ if (!attachments) {
124
+ throw new Error(`skipping further checks`);
125
+ }
126
+ expect(attachments.writable).toBeFalse();
127
+ // check files in attachments
128
+ for (const fp of files) {
129
+ expect(await attachments.readTxtFile(fp.name)).withContext(`file content should be exactly what has been sent`).toBe(fp.content);
130
+ await (0, sleep_1.sleep)(10);
131
+ const file = await attachments.readonlyFile(fp.name);
132
+ expect(file.writable).toBeFalse();
133
+ expect(await file.readTxt()).toBe(fp.content);
134
+ }
135
+ // check folder in attachments
136
+ const checkFolderIn = async (parent, params) => {
137
+ expect(await parent.checkFolderPresence(params.name)).withContext(`folder ${params.name} should be present in ${parent.name}`).toBe(true);
138
+ const fs = await parent.readonlySubRoot(params.name);
139
+ expect(fs.writable).toBeFalse();
140
+ for (const fp of params.files) {
141
+ expect(await fs.readTxtFile(fp.name)).withContext(`file content should be exactly what has been sent`).toBe(fp.content);
142
+ }
143
+ for (const fp of params.folders) {
144
+ await checkFolderIn(fs, fp);
145
+ }
146
+ };
147
+ await checkFolderIn(attachments, folder);
148
+ };
149
+ exports.specs.its.push(it);
150
+ async function doRoundTripSendingToEstablishInvites(u1, u1_w3n, u2, u2_w3n) {
151
+ // send message from 1 to 2
152
+ await (0, test_utils_1.sendTxtMsg)(u1_w3n, u2.userId, 'some text');
153
+ // read message from 1, and send reply, which establishes channel with invite
154
+ await u2_w3n.mail.inbox.listMsgs();
155
+ const msg = {
156
+ msgType: 'mail',
157
+ plainTxtBody: 'some text'
158
+ };
159
+ const idForSending = 'h3j4k5';
160
+ await u2_w3n.mail.delivery.addMsg([u1.userId], msg, idForSending);
161
+ await new Promise((resolve, reject) => {
162
+ u2_w3n.mail.delivery.observeDelivery(idForSending, { complete: resolve, error: reject });
163
+ });
164
+ await u2_w3n.mail.delivery.rmMsg(idForSending);
165
+ // read message from 2, to pick up established channel with invite
166
+ await u1_w3n.mail.inbox.listMsgs();
167
+ }
168
+ it = {
169
+ expectation: 'sending and getting message with MBs attachment'
170
+ };
171
+ it.func = async function (s) {
172
+ // XXX While this runs, storage call gets stopFromOtherSide=true ipc exception.
173
+ // And it isn't clear why. It looks like stop comes from an afterAll
174
+ // cleanup.
175
+ // On windows in vm this fail happens consistently.
176
+ const u1 = s.users[0];
177
+ const u1_w3n = s.testAppCapsByUser(u1, false);
178
+ const u2 = s.users[1];
179
+ const u2_w3n = s.testAppCapsByUser(u2, false);
180
+ // send small messages to establish trusted channel, else we hit a limit
181
+ // for a message from an unknown sender
182
+ await doRoundTripSendingToEstablishInvites(u1, u1_w3n, u2, u2_w3n);
183
+ // this text body will be used as a known end of long attachment, which
184
+ // recipient will check.
185
+ const txtBody = (0, random_node_1.stringOfB64CharsSync)(1000);
186
+ const fileName = 'big file';
187
+ // user 1 sends message to user 2
188
+ const recipient = u2.userId;
189
+ // make big file for attachment
190
+ const appFS = await u1_w3n.storage.getAppSyncedFS('app.3nweb.test');
191
+ // fingerprint bytes at the end
192
+ const endBytes = new Uint8Array(txtBody.split('').map(char => char.charCodeAt(0)));
193
+ const bytesToFile = new Uint8Array(3000000 + endBytes.length);
194
+ const rand = await (0, random_node_2.bytes)(1000);
195
+ for (let ofs = 0; ofs < 3000000; ofs += 1000) {
196
+ bytesToFile.set(rand, 1000);
197
+ }
198
+ bytesToFile.set(endBytes, 3000000);
199
+ await appFS.writeBytes(fileName, bytesToFile, { create: true });
200
+ // put together and send message
201
+ const outMsg = {
202
+ msgType: 'mail',
203
+ plainTxtBody: txtBody
204
+ };
205
+ outMsg.attachments = { files: {} };
206
+ outMsg.attachments.files[fileName] = await appFS.readonlyFile(fileName);
207
+ const idForSending = 'q2w3e4';
208
+ await u1_w3n.mail.delivery.addMsg([recipient], outMsg, idForSending);
209
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeTruthy();
210
+ const notifs = [];
211
+ await new Promise((resolve, reject) => {
212
+ const observer = {
213
+ next: (p) => { notifs.push(p); },
214
+ complete: resolve, error: reject
215
+ };
216
+ const cbDetach = u1_w3n.mail.delivery.observeDelivery(idForSending, observer);
217
+ expect(typeof cbDetach).toBe('function');
218
+ });
219
+ expect(notifs.length).toBeGreaterThan(0);
220
+ const lastInfo = notifs[notifs.length - 1];
221
+ expect(typeof lastInfo).toBe('object');
222
+ expect(lastInfo.allDone).toBe('all-ok');
223
+ (0, test_utils_1.throwDeliveryErrorFrom)(lastInfo);
224
+ await u1_w3n.mail.delivery.rmMsg(idForSending);
225
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeFalsy();
226
+ const recInfo = lastInfo.recipients[recipient];
227
+ expect(typeof recInfo.idOnDelivery).toBe('string');
228
+ const msgId = recInfo.idOnDelivery;
229
+ expect(msgId).toBeTruthy();
230
+ // user 2 gets incoming message, after a little wait
231
+ await (0, sleep_1.sleep)(500);
232
+ // check message
233
+ const msgs = await u2_w3n.mail.inbox.listMsgs();
234
+ const msgInfo = msgs.find(m => (m.msgId === msgId));
235
+ expect(msgInfo).withContext(`message ${msgId} should be present in a list of all messages`).toBeTruthy();
236
+ const inMsg = await u2_w3n.mail.inbox.getMsg(msgId);
237
+ expect(inMsg).toBeTruthy();
238
+ expect(inMsg.plainTxtBody).toBe(txtBody);
239
+ // check attachments presence
240
+ expect(!!inMsg.attachments).withContext(`attachments should be present in message ${msgId}`).toBe(true);
241
+ const attachments = inMsg.attachments;
242
+ if (!attachments) {
243
+ throw new Error(`skipping further checks`);
244
+ }
245
+ // check file attachment
246
+ const fileBytes = await attachments.readBytes(fileName);
247
+ // fingerprint bytes at the end
248
+ const receivedEndBytes = new Uint8Array(txtBody.split('').map(char => char.charCodeAt(0)));
249
+ const fileEnd = fileBytes.subarray(fileBytes.length - receivedEndBytes.length);
250
+ for (let i = 0; i < fileEnd.length; i += 1) {
251
+ if (fileEnd[i] !== receivedEndBytes[i]) {
252
+ throw new Error(`Byte at position ${i} in the end part of an attachment is not as expected`);
253
+ }
254
+ }
255
+ };
256
+ it.timeout = 15 * 1000;
257
+ // XXX skip this, till we capture described above error
258
+ // specs.its.push(it);
259
+ 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,90 @@
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
+ const test_utils_1 = require("../test-utils");
21
+ const sleep_1 = require("../../../../lib-common/processes/sleep");
22
+ const json_equal_1 = require("../../../libs-for-tests/json-equal");
23
+ exports.specs = {
24
+ description: '.sendMsg',
25
+ its: []
26
+ };
27
+ const it = {
28
+ expectation: 'send message to existing address and get it'
29
+ };
30
+ it.func = async function (s) {
31
+ const u1_w3n = s.testAppCapsByUserIndex(0);
32
+ const u2 = s.users[1];
33
+ const txtBody = 'Some text\nBlah-blah-blah';
34
+ const htmlBody = `Some html. Note that core isn't looking/checking this`;
35
+ const jsonBody = {
36
+ field1: 123,
37
+ field2: 'blah-blah'
38
+ };
39
+ // user 1 sends message to user 2
40
+ const recipient = u2.userId;
41
+ const outMsg = {
42
+ msgType: 'mail',
43
+ plainTxtBody: txtBody,
44
+ htmlTxtBody: htmlBody,
45
+ jsonBody
46
+ };
47
+ const idForSending = 'a4b5';
48
+ await u1_w3n.mail.delivery.addMsg([recipient], outMsg, idForSending);
49
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeTruthy();
50
+ const notifs = [];
51
+ await new Promise((resolve, reject) => {
52
+ const observer = {
53
+ next: (p) => { notifs.push(p); },
54
+ complete: resolve, error: reject
55
+ };
56
+ const cbDetach = u1_w3n.mail.delivery.observeDelivery(idForSending, observer);
57
+ expect(typeof cbDetach).toBe('function');
58
+ });
59
+ expect(notifs.length).toBeGreaterThan(0);
60
+ const lastInfo = notifs[notifs.length - 1];
61
+ expect(typeof lastInfo).toBe('object');
62
+ expect(lastInfo.allDone).toBe('all-ok');
63
+ (0, test_utils_1.throwDeliveryErrorFrom)(lastInfo);
64
+ await u1_w3n.mail.delivery.rmMsg(idForSending);
65
+ await u1_w3n.mail.delivery.rmMsg(idForSending); // noop after first rm
66
+ expect(await u1_w3n.mail.delivery.currentState(idForSending)).toBeFalsy();
67
+ const recInfo = lastInfo.recipients[recipient];
68
+ expect(typeof recInfo.bytesSent).toBe('number');
69
+ expect(typeof recInfo.idOnDelivery).toBe('string');
70
+ const msgId = recInfo.idOnDelivery;
71
+ expect(msgId).toBeTruthy();
72
+ // user 2 checks messages after some delay
73
+ await (0, sleep_1.sleep)(500);
74
+ const u2_w3n = s.testAppCapsByUser(u2);
75
+ const msgs = await u2_w3n.mail.inbox.listMsgs();
76
+ const msgInfo = msgs.find(m => (m.msgId === msgId));
77
+ expect(msgInfo).withContext(`message ${msgId} should be present in a list of all messages`).not.toBeUndefined();
78
+ expect(msgInfo.msgType).toBe('mail');
79
+ const inMsg = await u2_w3n.mail.inbox.getMsg(msgId);
80
+ expect(inMsg).toBeTruthy();
81
+ expect(inMsg.msgId).toBe(msgId);
82
+ expect(inMsg.msgType).toBe('mail');
83
+ expect(inMsg.plainTxtBody).toBe(txtBody);
84
+ expect(inMsg.htmlTxtBody).toBe(htmlBody);
85
+ expect((0, json_equal_1.deepEqual)(inMsg.jsonBody, jsonBody)).toBeTrue();
86
+ await u2_w3n.mail.inbox.removeMsg(msgId);
87
+ await u2_w3n.mail.inbox.removeMsg(msgId); // second call is a noop
88
+ };
89
+ exports.specs.its.push(it);
90
+ Object.freeze(exports);
@@ -0,0 +1,12 @@
1
+ import { SpecIt as GenericSpecIt } from "../../libs-for-tests/spec-module";
2
+ import { MultiUserSetup } from "../../libs-for-tests/setups";
3
+ type commonW3N = web3n.caps.common.W3N;
4
+ /**
5
+ * This function to be run in renderer's context via execExpects
6
+ * @param recipient
7
+ * @param txtBody
8
+ */
9
+ export declare function sendTxtMsg(w3n: commonW3N, recipient: string, txtBody: string): Promise<string>;
10
+ export type SpecIt = GenericSpecIt<MultiUserSetup>;
11
+ export declare function throwDeliveryErrorFrom(lastNotif: web3n.asmail.DeliveryProgress): void;
12
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2017 - 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.sendTxtMsg = sendTxtMsg;
20
+ exports.throwDeliveryErrorFrom = throwDeliveryErrorFrom;
21
+ const assert_1 = require("../../../lib-common/assert");
22
+ const error_1 = require("../../../lib-common/exceptions/error");
23
+ /**
24
+ * This function to be run in renderer's context via execExpects
25
+ * @param recipient
26
+ * @param txtBody
27
+ */
28
+ async function sendTxtMsg(w3n, recipient, txtBody) {
29
+ const msg = {
30
+ msgType: 'mail',
31
+ plainTxtBody: txtBody
32
+ };
33
+ const idForSending = 'd5b6';
34
+ await w3n.mail.delivery.addMsg([recipient], msg, idForSending);
35
+ expect(await w3n.mail.delivery.currentState(idForSending)).toBeTruthy();
36
+ const lastInfo = await new Promise((resolve, reject) => {
37
+ let lastInfo;
38
+ w3n.mail.delivery.observeDelivery(idForSending, {
39
+ next: info => (lastInfo = info),
40
+ complete: () => resolve(lastInfo),
41
+ error: reject
42
+ });
43
+ });
44
+ expect(typeof lastInfo).toBe('object');
45
+ expect(lastInfo.allDone).toBe('all-ok');
46
+ throwDeliveryErrorFrom(lastInfo);
47
+ await w3n.mail.delivery.rmMsg(idForSending);
48
+ expect(await w3n.mail.delivery.currentState(idForSending)).toBeFalsy();
49
+ const recInfo = lastInfo.recipients[recipient];
50
+ expect(typeof recInfo.idOnDelivery).toBe('string');
51
+ return recInfo.idOnDelivery;
52
+ }
53
+ function throwDeliveryErrorFrom(lastNotif) {
54
+ (0, assert_1.assert)(!!lastNotif.allDone, `Given delivery notification is not last`);
55
+ for (const info of Object.values(lastNotif.recipients)) {
56
+ if (info.err) {
57
+ throw (0, error_1.errWithCause)(info.err, `Error occured in message delivery:\n${(0, error_1.stringifyErr)(info.err)}`);
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,86 @@
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
+ const jasmine_utils_1 = require("../libs-for-tests/jasmine-utils");
20
+ const setups_1 = require("../libs-for-tests/setups");
21
+ const spec_module_1 = require("../libs-for-tests/spec-module");
22
+ const path_1 = require("path");
23
+ const assert_1 = require("../../lib-common/assert");
24
+ describe('ASMail', () => {
25
+ const s = (0, setups_1.setupWithUsers)(true, ['Bob Perkins @company.inc', 'John Morrison @bank.com']);
26
+ beforeAll(() => {
27
+ (0, assert_1.assert)(s.users.length >= 2, `at least two users should be set up`);
28
+ });
29
+ (0, jasmine_utils_1.itCond)('mail is present in common CAPs', async () => {
30
+ (0, assert_1.assert)(s.users.length > 0);
31
+ for (const u of s.users) {
32
+ const w3n = s.testAppCapsByUser(u);
33
+ expect(typeof w3n.mail).toBe('object');
34
+ expect(typeof w3n.mail.delivery).toBe('object');
35
+ expect(typeof w3n.mail.inbox).toBe('object');
36
+ expect(typeof w3n.mail.config).toBe('object');
37
+ expect(typeof w3n.mail.getUserId).toBe('function');
38
+ }
39
+ }, undefined, s);
40
+ (0, jasmine_utils_1.itCond)('gets current user id', async () => {
41
+ (0, assert_1.assert)(s.users.length > 0);
42
+ for (const u of s.users) {
43
+ const w3n = s.testAppCapsByUser(u);
44
+ const userId = await w3n.mail.getUserId();
45
+ expect(userId).toBe(u.userId);
46
+ }
47
+ }, undefined, s);
48
+ describe(`config`, () => {
49
+ let config;
50
+ beforeAll(() => {
51
+ config = s.testAppCapsByUserIndex(0).mail.config;
52
+ });
53
+ (0, jasmine_utils_1.itCond)(`shows parameter' values on the server`, async () => {
54
+ const initPubKey = await config.getOnServer('init-pub-key');
55
+ expect(typeof initPubKey).toBe('object');
56
+ const anonSenderPolicy = await config.getOnServer('anon-sender/policy');
57
+ expect(anonSenderPolicy).toBeTruthy();
58
+ expect(typeof anonSenderPolicy.accept).toBe('boolean');
59
+ expect(typeof anonSenderPolicy.defaultMsgSize).toBe('number');
60
+ const anonSenderInvites = await config.getOnServer('anon-sender/invites');
61
+ expect(anonSenderInvites).toBeTruthy();
62
+ expect(typeof anonSenderInvites).toBe('object');
63
+ }, undefined, s);
64
+ (0, jasmine_utils_1.itCond)(`sets parameter' values on the server`, async () => {
65
+ // some paramaters can be set directly
66
+ let anonSenderPolicy = await config.getOnServer('anon-sender/policy');
67
+ const newDefaultMsgSize = anonSenderPolicy.defaultMsgSize + 42;
68
+ anonSenderPolicy.defaultMsgSize = newDefaultMsgSize;
69
+ await config.setOnServer('anon-sender/policy', anonSenderPolicy);
70
+ anonSenderPolicy = await config.getOnServer('anon-sender/policy');
71
+ expect(anonSenderPolicy.defaultMsgSize).toBe(newDefaultMsgSize);
72
+ // but public key should be set via keyring cap, and not here
73
+ await config.setOnServer('init-pub-key', null).then(() => fail(`public key shouldn't be set directly`), err => expect(err).toBeTruthy());
74
+ }, undefined, s);
75
+ });
76
+ (0, jasmine_utils_1.itCond)('inbox lists incoming messages (no messages)', async () => {
77
+ (0, assert_1.assert)(s.users.length > 0);
78
+ for (const u of s.users) {
79
+ const w3n = s.testAppCapsByUser(u);
80
+ const msgs = await w3n.mail.inbox.listMsgs();
81
+ expect(Array.isArray(msgs)).toBe(true);
82
+ expect(msgs.length).toBe(0);
83
+ }
84
+ }, undefined, s);
85
+ (0, spec_module_1.loadSpecs)(s, (0, path_1.join)(__dirname, 'asmail', 'specs'));
86
+ });
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 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
+ const random_node_1 = require("../../../lib-common/random-node");
21
+ exports.specs = {
22
+ description: 'gives file sink',
23
+ its: []
24
+ // ,focused:true
25
+ };
26
+ let it = { expectation: 'to write big chunks' };
27
+ it.func = async function (s) {
28
+ const { testFS } = s;
29
+ // XXX This is WIP. This catches bug, presumably in writing stage.
30
+ const fileName = 'big file';
31
+ const sink = await testFS.getByteSink(fileName, { create: true });
32
+ // write big chunk
33
+ const bytes = await (0, random_node_1.bytes)(1000000);
34
+ await sink.splice(0, bytes.length, bytes);
35
+ // console.log(` -> layout after splice: ${JSON.stringify(await sink.showLayout(), null, 2)}`);
36
+ await sink.done();
37
+ console.log(`Reading file ${fileName}`);
38
+ const fileContent = await testFS.readBytes(fileName)
39
+ .catch((err) => {
40
+ console.log(err.cause);
41
+ throw err;
42
+ });
43
+ console.log(` file content length ${fileContent.length}`);
44
+ // XXX add some expect checks
45
+ };
46
+ // specs.its.push(it);
47
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../../libs-for-tests/spec-module';
2
+ export declare const specs: SpecDescribe;