spec-3nweb-server 1.8.4 → 1.8.6

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 (324) hide show
  1. package/.gitlab-ci-linux.yml +50 -0
  2. package/.gitlab-ci-mac.yml +29 -0
  3. package/.gitlab-ci-windows.yml +29 -0
  4. package/.gitlab-ci.yml +63 -0
  5. package/build/3nstorage/routes/owner/archive-obj-version.js +2 -2
  6. package/build/3nstorage/routes/owner/cancel-trans.js +2 -2
  7. package/build/3nstorage/routes/owner/delete-obj.js +2 -2
  8. package/build/3nstorage/routes/owner/get-current-obj.js +3 -4
  9. package/build/3nstorage/routes/owner/param-setter.js +2 -6
  10. package/build/asmail/routes/config/param-setter.js +2 -2
  11. package/build/asmail/routes/delivery/finalize-delivery.js +2 -2
  12. package/build/asmail/routes/delivery/put-obj.js +2 -2
  13. package/build/asmail/routes/delivery/sender-authorization.js +2 -2
  14. package/build/asmail/routes/retrieval/remove-message.js +2 -2
  15. package/build/cli/signup-cmd.js +0 -1
  16. package/build/lib-server/routes/sessions/close.js +2 -2
  17. package/build/lib-server/routes/sessions/mid-auth.js +2 -5
  18. package/build/main.js +12 -15
  19. package/build/mock/tls-options.js +46 -44
  20. package/build/signup/routes/add.js +4 -4
  21. package/build/tests/admin-proto/signup.d.ts +1 -0
  22. package/build/tests/admin-proto/signup.js +235 -0
  23. package/build/tests/jasmine.d.ts +1 -0
  24. package/build/tests/jasmine.js +32 -0
  25. package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
  26. package/build/tests/libs-for-tests/3nstorage.js +123 -0
  27. package/build/tests/libs-for-tests/asmail.d.ts +22 -0
  28. package/build/tests/libs-for-tests/asmail.js +179 -0
  29. package/build/tests/libs-for-tests/assert.d.ts +1 -0
  30. package/build/tests/libs-for-tests/assert.js +26 -0
  31. package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
  32. package/build/tests/libs-for-tests/async-jasmine.js +77 -0
  33. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  34. package/build/tests/libs-for-tests/bytes-equal.js +34 -0
  35. package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
  36. package/build/tests/libs-for-tests/json-copy.js +45 -0
  37. package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
  38. package/build/tests/libs-for-tests/json-equal.js +67 -0
  39. package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
  40. package/build/tests/libs-for-tests/mailerid.js +114 -0
  41. package/build/tests/libs-for-tests/pkl.d.ts +28 -0
  42. package/build/tests/libs-for-tests/pkl.js +89 -0
  43. package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
  44. package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
  45. package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
  46. package/build/tests/libs-for-tests/server-components/admin.js +43 -0
  47. package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
  48. package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
  49. package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
  50. package/build/tests/libs-for-tests/server-components/component.js +77 -0
  51. package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
  52. package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
  53. package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
  54. package/build/tests/libs-for-tests/server-runner.js +69 -0
  55. package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
  56. package/build/tests/libs-for-tests/spec-assembly.js +55 -0
  57. package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
  58. package/build/tests/libs-for-tests/ws-utils.js +59 -0
  59. package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
  60. package/build/tests/libs-for-tests/xhr-utils.js +154 -0
  61. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
  62. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
  63. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
  64. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
  65. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
  66. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
  67. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
  68. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
  69. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
  70. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
  71. package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
  72. package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
  73. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
  74. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
  75. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
  76. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
  77. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
  78. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
  79. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
  80. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
  81. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
  82. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
  83. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
  84. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
  85. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
  86. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
  87. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
  88. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
  89. package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
  90. package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
  91. package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
  92. package/build/tests/protocols/3nstorage/owner.js +138 -0
  93. package/build/tests/protocols/asmail/config.d.ts +1 -0
  94. package/build/tests/protocols/asmail/config.js +117 -0
  95. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
  96. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
  97. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
  98. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
  99. package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
  100. package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
  101. package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
  102. package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
  103. package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
  104. package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
  105. package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
  106. package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
  107. package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
  108. package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
  109. package/build/tests/protocols/asmail/delivery.d.ts +1 -0
  110. package/build/tests/protocols/asmail/delivery.js +46 -0
  111. package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
  112. package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
  113. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
  114. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
  115. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
  116. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
  117. package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
  118. package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
  119. package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
  120. package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
  121. package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
  122. package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
  123. package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
  124. package/build/tests/protocols/asmail/retrieval.js +92 -0
  125. package/build/tests/protocols/mailerid.d.ts +1 -0
  126. package/build/tests/protocols/mailerid.js +210 -0
  127. package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
  128. package/build/tests/shared-checks/check-mid-login.js +131 -0
  129. package/build/tests/shared-checks/requests.d.ts +20 -0
  130. package/build/tests/shared-checks/requests.js +123 -0
  131. package/package.json +1 -1
  132. package/packing/create-deb.sh +57 -0
  133. package/packing/deb/lib/systemd/system/3nweb.service +11 -0
  134. package/packing/deb/postinst +44 -0
  135. package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
  136. package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
  137. package/publish-task.sh +10 -0
  138. package/push-to-github.sh +105 -0
  139. package/ts-code/3nstorage/3nstorage-app.ts +99 -0
  140. package/ts-code/3nstorage/owner.ts +178 -0
  141. package/ts-code/3nstorage/resources/sessions.ts +37 -0
  142. package/ts-code/3nstorage/resources/store.ts +896 -0
  143. package/ts-code/3nstorage/resources/users.ts +258 -0
  144. package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +73 -0
  145. package/ts-code/3nstorage/routes/owner/cancel-trans.ts +58 -0
  146. package/ts-code/3nstorage/routes/owner/delete-obj.ts +103 -0
  147. package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +111 -0
  148. package/ts-code/3nstorage/routes/owner/get-current-obj.ts +122 -0
  149. package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
  150. package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
  151. package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
  152. package/ts-code/3nstorage/routes/owner/put-current-obj.ts +284 -0
  153. package/ts-code/3nstorage/routes/owner/session-params.ts +49 -0
  154. package/ts-code/3nstorage/shared.ts +43 -0
  155. package/ts-code/asmail/asmail-app.ts +91 -0
  156. package/ts-code/asmail/config.ts +96 -0
  157. package/ts-code/asmail/delivery.ts +94 -0
  158. package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
  159. package/ts-code/asmail/resources/inbox.ts +696 -0
  160. package/ts-code/asmail/resources/recipients.ts +495 -0
  161. package/ts-code/asmail/resources/sessions.ts +37 -0
  162. package/ts-code/asmail/retrieval.ts +96 -0
  163. package/ts-code/asmail/routes/config/param-getter.ts +49 -0
  164. package/ts-code/asmail/routes/config/param-setter.ts +49 -0
  165. package/ts-code/asmail/routes/delivery/finalize-delivery.ts +50 -0
  166. package/ts-code/asmail/routes/delivery/pre-flight.ts +132 -0
  167. package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
  168. package/ts-code/asmail/routes/delivery/put-metadata.ts +94 -0
  169. package/ts-code/asmail/routes/delivery/put-obj.ts +166 -0
  170. package/ts-code/asmail/routes/delivery/restart-session.ts +130 -0
  171. package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
  172. package/ts-code/asmail/routes/delivery/start-session.ts +151 -0
  173. package/ts-code/asmail/routes/retrieval/get-message-meta.ts +53 -0
  174. package/ts-code/asmail/routes/retrieval/get-message-obj.ts +109 -0
  175. package/ts-code/asmail/routes/retrieval/list-messages.ts +70 -0
  176. package/ts-code/asmail/routes/retrieval/remove-message.ts +47 -0
  177. package/ts-code/cli/index.ts +82 -0
  178. package/ts-code/cli/run-cmd.ts +81 -0
  179. package/ts-code/cli/show-sample-config.ts +78 -0
  180. package/ts-code/cli/signup-cmd.ts +229 -0
  181. package/ts-code/cli/user-cmd.ts +68 -0
  182. package/ts-code/cli/utils.ts +105 -0
  183. package/ts-code/config/default-confs.ts +22 -0
  184. package/ts-code/config/from-yaml.ts +35 -0
  185. package/ts-code/config/letsencrypt.ts +77 -0
  186. package/ts-code/config/signup.ts +137 -0
  187. package/ts-code/lib-common/admin-api/signup.ts +120 -0
  188. package/ts-code/lib-common/assert.ts +22 -0
  189. package/ts-code/lib-common/async-fs-node.ts +656 -0
  190. package/ts-code/lib-common/buffer-utils.ts +124 -0
  191. package/ts-code/lib-common/byte-streaming/common.ts +166 -0
  192. package/ts-code/lib-common/bytes-equal.ts +25 -0
  193. package/ts-code/lib-common/canonical-address.ts +92 -0
  194. package/ts-code/lib-common/exceptions/error.ts +44 -0
  195. package/ts-code/lib-common/exceptions/file.ts +84 -0
  196. package/ts-code/lib-common/exceptions/http.ts +69 -0
  197. package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
  198. package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
  199. package/ts-code/lib-common/json-equal.ts +55 -0
  200. package/ts-code/lib-common/json-utils.ts +130 -0
  201. package/ts-code/lib-common/jwkeys.ts +246 -0
  202. package/ts-code/lib-common/map-of-sets.ts +60 -0
  203. package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
  204. package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
  205. package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
  206. package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
  207. package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
  208. package/ts-code/lib-common/processes.ts +501 -0
  209. package/ts-code/lib-common/random-node.ts +79 -0
  210. package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
  211. package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
  212. package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
  213. package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
  214. package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
  215. package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
  216. package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
  217. package/ts-code/lib-common/service-api/locker.ts +44 -0
  218. package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
  219. package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
  220. package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
  221. package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
  222. package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
  223. package/ts-code/lib-common/session-encryptor.ts +54 -0
  224. package/ts-code/lib-common/time-window-cache.ts +74 -0
  225. package/ts-code/lib-common/transferable.d.ts +30 -0
  226. package/ts-code/lib-server/conf-util.ts +35 -0
  227. package/ts-code/lib-server/mid-access.ts +45 -0
  228. package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
  229. package/ts-code/lib-server/middleware/error-handler.ts +79 -0
  230. package/ts-code/lib-server/pkl-access.ts +46 -0
  231. package/ts-code/lib-server/resources/dns.ts +151 -0
  232. package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
  233. package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
  234. package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
  235. package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
  236. package/ts-code/lib-server/resources/sessions.ts +232 -0
  237. package/ts-code/lib-server/resources/user-files.ts +147 -0
  238. package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
  239. package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
  240. package/ts-code/lib-server/routes/sessions/close.ts +27 -0
  241. package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
  242. package/ts-code/lib-server/routes/sessions/start.ts +116 -0
  243. package/ts-code/lib-server/web-sockets/app.ts +339 -0
  244. package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
  245. package/ts-code/lib.ts +29 -0
  246. package/ts-code/locker/locker-app.ts +60 -0
  247. package/ts-code/locker/resources/lockers.ts +17 -0
  248. package/ts-code/locker/resources/sessions.ts +37 -0
  249. package/ts-code/locker/routes/create-locker.ts +47 -0
  250. package/ts-code/mailerId/mailerId-app.ts +107 -0
  251. package/ts-code/mailerId/resources/certifier.ts +181 -0
  252. package/ts-code/mailerId/resources/sessions.ts +44 -0
  253. package/ts-code/mailerId/resources/users.ts +88 -0
  254. package/ts-code/mailerId/routes/certify.ts +68 -0
  255. package/ts-code/main.ts +304 -0
  256. package/ts-code/mock/dns.ts +106 -0
  257. package/ts-code/mock/mock-as-child-proc.ts +130 -0
  258. package/ts-code/mock/node-child-ipc.ts +69 -0
  259. package/ts-code/mock/run-in-proc.ts +111 -0
  260. package/ts-code/mock/tls-options.ts +73 -0
  261. package/ts-code/services.ts +138 -0
  262. package/ts-code/signup/resources/users.ts +429 -0
  263. package/ts-code/signup/routes/add.ts +65 -0
  264. package/ts-code/signup/routes/get-available-addresses.ts +49 -0
  265. package/ts-code/signup/routes/get-available-domains.ts +45 -0
  266. package/ts-code/signup/signup-app.ts +54 -0
  267. package/ts-code/signup/signup-tokens.ts +148 -0
  268. package/ts-code/tests/admin-proto/signup.ts +277 -0
  269. package/ts-code/tests/jasmine.ts +37 -0
  270. package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
  271. package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
  272. package/ts-code/tests/libs-for-tests/assert.ts +22 -0
  273. package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
  274. package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
  275. package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
  276. package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
  277. package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
  278. package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
  279. package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
  280. package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
  281. package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
  282. package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
  283. package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
  284. package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
  285. package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
  286. package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
  287. package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
  288. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
  289. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
  290. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
  291. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
  292. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
  293. package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
  294. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
  295. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
  296. package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
  297. package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
  298. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
  299. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
  300. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
  301. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
  302. package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
  303. package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
  304. package/ts-code/tests/protocols/asmail/config.ts +172 -0
  305. package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
  306. package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
  307. package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
  308. package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
  309. package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
  310. package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
  311. package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
  312. package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
  313. package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
  314. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
  315. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
  316. package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
  317. package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
  318. package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
  319. package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
  320. package/ts-code/tests/protocols/mailerid.ts +271 -0
  321. package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
  322. package/ts-code/tests/shared-checks/requests.ts +135 -0
  323. package/ts-code/tsconfig.json +11 -0
  324. package/ts-code/web3n.d.ts +1068 -0
@@ -0,0 +1,325 @@
1
+ /*
2
+ Copyright (C) 2019 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import * as fs from '../async-fs-node';
19
+ import { errWithCause } from '../exceptions/error';
20
+ import { bytesEqual } from '../bytes-equal';
21
+ import { SingleProc, defer } from '../processes';
22
+ import { toBuffer } from '../buffer-utils';
23
+ import { Layout } from 'xsp-files';
24
+ import { uintFrom8Bytes, uintTo8Bytes, V1_FILE_START } from './v1-obj-file-format';
25
+ import { createReadStream } from 'fs';
26
+ import { ObjVersionBytesLayout, FiniteSegsChunk } from './file-layout';
27
+
28
+ export class ObjVersionFile {
29
+
30
+ private readonly writeProc = new SingleProc();
31
+
32
+ private constructor(
33
+ private path: string,
34
+ private readonly layout: ObjVersionBytesLayout
35
+ ) {
36
+ Object.seal(this);
37
+ }
38
+
39
+ static async forExisting(path: string): Promise<ObjVersionFile> {
40
+ const fd = await fs.open(path, 'r');
41
+ try {
42
+ const layout = await parseObjVersionBytesLayout(fd);
43
+ return new ObjVersionFile(path, layout);
44
+ } catch (err) {
45
+ if ((err as ObjFileParsingException).type === 'obj-file-parsing') {
46
+ (err as ObjFileParsingException).path = path;
47
+ }
48
+ throw err;
49
+ } finally {
50
+ await fs.close(fd).catch(err => {});
51
+ }
52
+ }
53
+
54
+ static async createNew(path: string): Promise<ObjVersionFile> {
55
+ await createNewV1File(path);
56
+ const layout = ObjVersionBytesLayout.forNewFile();
57
+ return new ObjVersionFile(path, layout);
58
+ }
59
+
60
+ moveFile(newPath: string): Promise<void> {
61
+ return this.writeProc.startOrChain(async () => {
62
+ await fs.rename(this.path, newPath);
63
+ this.path = newPath;
64
+ });
65
+ }
66
+
67
+ changePathWithoutFileMove(newPath: string): void {
68
+ this.path = newPath;
69
+ }
70
+
71
+ removeFile(): Promise<void> {
72
+ return this.writeProc.startOrChain(() => fs.unlink(this.path));
73
+ }
74
+
75
+ saveLayout(): Promise<void> {
76
+ return this.withRWFile(fd => this.recordLayout(fd));
77
+ }
78
+
79
+ private async recordLayout(fd: number): Promise<void> {
80
+ const layoutBytes = this.layout.toBytes();
81
+ const ofs = this.layout.getLayoutOfs();
82
+ await fs.writeFromBuf(fd, ofs, layoutBytes);
83
+ await recordLayoutOffsetInV1(fd, ofs);
84
+ await fs.ftruncate(fd, ofs + layoutBytes.length);
85
+ }
86
+
87
+ private withRWFile<T>(action: (fd: number) => Promise<T>): Promise<T> {
88
+ return this.writeProc.startOrChain(async () => {
89
+ const fd = await fs.open(this.path, 'r+')
90
+ .catch(exc => {
91
+ throw errWithCause(exc, `Can't open obj version file ${this.path}`);
92
+ });
93
+ try {
94
+ return await action(fd);
95
+ } finally {
96
+ await fs.close(fd).catch(err => {});
97
+ }
98
+ });
99
+ }
100
+
101
+ getTotalSegsLen(): number {
102
+ return this.layout.getTotalSegsLen();
103
+ }
104
+
105
+ isSegsLayoutSet(): boolean {
106
+ return this.layout.isLayoutFrozen();
107
+ }
108
+
109
+ saveHeader(header: Uint8Array, saveLayout: boolean): Promise<void> {
110
+ return this.withRWFile(async fd => {
111
+ const ofs = this.layout.getLayoutOfs();
112
+ await fs.writeFromBuf(fd, ofs, toBuffer(header));
113
+ this.layout.addHeader(header.length, ofs);
114
+ if (saveLayout) {
115
+ await this.recordLayout(fd);
116
+ }
117
+ });
118
+ }
119
+
120
+ saveSegs(segsChunks: Uint8Array, thisVerOfs: number,
121
+ baseVerOfs: number|undefined, saveLayout: boolean): Promise<void> {
122
+ return this.withRWFile(async fd => {
123
+ const ofs = this.layout.getLayoutOfs();
124
+ await fs.writeFromBuf(fd, ofs, toBuffer(segsChunks));
125
+ if (baseVerOfs === undefined) {
126
+ this.layout.addSegsOnFile(thisVerOfs, segsChunks.length, ofs);
127
+ } else {
128
+ this.layout.addBaseSegsOnFile(
129
+ thisVerOfs, baseVerOfs, segsChunks.length, ofs);
130
+ }
131
+ if (saveLayout) {
132
+ await this.recordLayout(fd);
133
+ }
134
+ });
135
+ }
136
+
137
+ getBaseVersion(): number|undefined {
138
+ return this.layout.getBaseVersion();
139
+ }
140
+
141
+ private async withROFile<T>(action: (fd: number) => Promise<T>): Promise<T> {
142
+ const fd = await fs.open(this.path, 'r')
143
+ .catch(exc => {
144
+ throw errWithCause(exc, `Can't open obj version file ${this.path}`);
145
+ });
146
+ try {
147
+ return await action(fd);
148
+ } finally {
149
+ await fs.close(fd).catch(err => {});
150
+ }
151
+ }
152
+
153
+ getHeaderLen(): number|undefined {
154
+ const chunkInfo = this.layout.headerLocation();
155
+ if (!chunkInfo) { return; }
156
+ return chunkInfo.len;
157
+ }
158
+
159
+ async readHeader(): Promise<Uint8Array|undefined> {
160
+ const chunkInfo = this.layout.headerLocation();
161
+ if (!chunkInfo) { return; }
162
+ return this.withROFile(async fd => {
163
+ const h = Buffer.allocUnsafe(chunkInfo.len);
164
+ await fs.readToBuf(fd, chunkInfo.fileOfs, h);
165
+ return h;
166
+ });
167
+ }
168
+
169
+ async streamHeaderInto(sink: NodeJS.WritableStream): Promise<void> {
170
+ const chunkInfo = this.layout.headerLocation();
171
+ if (!chunkInfo) { return; }
172
+ await this.withROFile(async fd => {
173
+ const src = createReadStream('', {
174
+ fd,
175
+ autoClose: false,
176
+ start: chunkInfo.fileOfs,
177
+ end: chunkInfo.fileOfs + chunkInfo.len - 1
178
+ });
179
+ return pipeBytes(src, sink);
180
+ });
181
+ }
182
+
183
+ async readSegs(thisVerOfs: number, len: number): Promise<Uint8Array[]> {
184
+ const chunks = this.layout.segsLocations(thisVerOfs, len);
185
+ return this.withROFile(async fd => {
186
+ const sections: Uint8Array[] = [];
187
+ for (const chunk of chunks) {
188
+ if ((chunk.type === 'new-on-disk')
189
+ || (chunk.type === 'base-on-disk')) {
190
+ const s = Buffer.allocUnsafe(chunk.len);
191
+ await fs.readToBuf(fd, chunk.fileOfs, s);
192
+ sections.push(s);
193
+ } else {
194
+ throw new Error(`Part of requested segments is not on a disk`);
195
+ }
196
+ }
197
+ return sections;
198
+ });
199
+ }
200
+
201
+ async streamSegsInto(
202
+ sink: NodeJS.WritableStream, thisVerOfs: number, len: number
203
+ ): Promise<void> {
204
+ const chunks = this.layout.segsLocations(thisVerOfs, len);
205
+ await this.withROFile(async fd => {
206
+ for (const chunk of chunks) {
207
+ if ((chunk.type === 'new-on-disk')
208
+ || (chunk.type === 'base-on-disk')) {
209
+ const src = createReadStream('', {
210
+ fd,
211
+ autoClose: false,
212
+ start: chunk.fileOfs,
213
+ end: chunk.fileOfs + chunk.len - 1
214
+ });
215
+ await pipeBytes(src, sink);
216
+ } else {
217
+ throw new Error(`Part of requested segments is not on a disk`);
218
+ }
219
+ }
220
+ });
221
+ }
222
+
223
+ segsLocations(thisVerOfs: number, len: number): FiniteSegsChunk[] {
224
+ return this.layout.segsLocations(thisVerOfs, len);
225
+ }
226
+
227
+ setSegsLayout(layout: Layout, saveLayout: boolean): Promise<void> {
228
+ this.layout.setAndFreezeWith(layout);
229
+ return this.withRWFile(async fd => {
230
+ if (saveLayout) {
231
+ await this.recordLayout(fd);
232
+ }
233
+ });
234
+ }
235
+
236
+ truncateEndlessLayout(): void {
237
+ this.layout.truncateIfEndless();
238
+ }
239
+
240
+ isFileComplete(): boolean {
241
+ return this.layout.isFileComplete();
242
+ }
243
+
244
+ }
245
+ Object.freeze(ObjVersionFile.prototype);
246
+ Object.freeze(ObjVersionFile);
247
+
248
+ async function pipeBytes(
249
+ src: NodeJS.ReadableStream, sink: NodeJS.WritableStream
250
+ ): Promise<void> {
251
+ const deferred = defer<void>();
252
+ src.pipe(sink, { end: false });
253
+ src.on('error', (err) => {
254
+ deferred.reject(err);
255
+ src.unpipe(sink);
256
+ });
257
+ src.on('end', () => {
258
+ src.unpipe(sink);
259
+ deferred.resolve();
260
+ });
261
+ return deferred.promise;
262
+ }
263
+
264
+ export interface ObjFileParsingException extends web3n.RuntimeException {
265
+ type: 'obj-file-parsing',
266
+ msg: string;
267
+ path: string;
268
+ }
269
+
270
+ function parsingException(msg: string, cause?: any): ObjFileParsingException {
271
+ return {
272
+ runtimeException: true,
273
+ type: 'obj-file-parsing',
274
+ cause, msg,
275
+ path: ''
276
+ };
277
+ }
278
+
279
+ /**
280
+ * This parses obj version file's informational parts.
281
+ * @param fd is an open file descriptor, of a file to parse
282
+ */
283
+ async function parseObjVersionBytesLayout(fd: number):
284
+ Promise<ObjVersionBytesLayout> {
285
+ const fstBytes = Buffer.allocUnsafe(12);
286
+ await fs.readToBuf(fd, 0, fstBytes).catch((exc: fs.FileException) => {
287
+ if (exc.endOfFile) { throw parsingException(
288
+ 'File is too short to contain object'); }
289
+ throw exc;
290
+ });
291
+ const fileStart = fstBytes.slice(0, 4);
292
+ if (bytesEqual(fileStart, V1_FILE_START)) {
293
+ const layoutOfs = uintFrom8Bytes(fstBytes, 4);
294
+ if (layoutOfs === 0) { throw parsingException(
295
+ `Obj version file is in incomplete state`); }
296
+ if (layoutOfs > Number.MAX_SAFE_INTEGER) { throw parsingException(
297
+ `This implementation can't handle files with length over 2^53`); }
298
+ const fileSize = (await fs.fstat(fd)).size;
299
+ if (layoutOfs >= fileSize) { throw parsingException(
300
+ `Layout offset is greater than file size`); }
301
+ const layoutBytes = Buffer.allocUnsafe(fileSize - layoutOfs);
302
+ await fs.readToBuf(fd, layoutOfs, layoutBytes);
303
+ return ObjVersionBytesLayout.fromV1Bytes(layoutOfs, layoutBytes);
304
+ } else {
305
+ throw parsingException(`Obj version file does not have recognizable byte signature at its start`);
306
+ }
307
+ }
308
+
309
+ async function createNewV1File(path: string): Promise<void> {
310
+ const initContent = Buffer.alloc(V1_FILE_START.length + 8, 0);
311
+ initContent.set(V1_FILE_START);
312
+ // note that all 8 bytes of layout offset are zeros
313
+ await fs.writeFile(path, initContent, { flag: 'wx' });
314
+ }
315
+
316
+ async function recordLayoutOffsetInV1(fd: number, ofs: number): Promise<void> {
317
+ const ofsInBytes = uintTo8Bytes(ofs);
318
+ await fs.writeFromBuf(fd, V1_FILE_START.length, ofsInBytes)
319
+ .catch(exc => {
320
+ throw errWithCause(exc, `Can't record layout offset in obj file`);
321
+ });
322
+ }
323
+
324
+
325
+ Object.freeze(exports);
@@ -0,0 +1,201 @@
1
+ /*
2
+ Copyright (C) 2019 - 2020 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { Layout, LayoutBaseSection, LayoutNewSection } from 'xsp-files';
19
+ import { defer, Deferred } from '../processes';
20
+ import { BytesFIFOBuffer } from '../byte-streaming/common';
21
+ import { DiffInfo } from '../service-api/3nstorage/owner';
22
+ import { ObjVersionFile } from './obj-file';
23
+ import { Readable } from 'stream';
24
+ import { makeFileException, Code as excCode } from '../exceptions/file';
25
+ import { assert } from '../assert';
26
+
27
+ export function diffToLayout(diff: DiffInfo): Layout {
28
+ const layout: Layout = {
29
+ base: diff.baseVersion,
30
+ sections: []
31
+ };
32
+ let ofs = 0;
33
+ for (const [ isNew, sOfs, len ] of diff.sections) {
34
+ let section: LayoutBaseSection|LayoutNewSection;
35
+ if (isNew === 1) {
36
+ section = { src: 'new', len, ofs };
37
+ } else {
38
+ section = { src: 'base', ofs, len, baseOfs: sOfs }
39
+ }
40
+ ofs += len;
41
+ layout.sections.push(section);
42
+ }
43
+ return layout;
44
+ }
45
+
46
+ export interface ChunkWithHeader {
47
+ type: 'header';
48
+ len: number;
49
+ }
50
+
51
+ export interface ChunkWithSegs {
52
+ type: 'segs';
53
+ len: number;
54
+ segsOfs: number;
55
+ }
56
+
57
+ export type Chunk = ChunkWithHeader | ChunkWithSegs;
58
+
59
+ export async function streamToObjFile(
60
+ file: ObjVersionFile, content: Chunk[], src: Readable, maxBufferLen: number
61
+ ): Promise<void> {
62
+ let deferred: Deferred<void>|undefined = defer<void>();
63
+ const contentIter = content.values();
64
+ let chunk: Chunk|undefined = undefined;
65
+ let buf = new BytesFIFOBuffer();
66
+ let chunkBytesWritten = 0;
67
+
68
+ // file.saveXXX(...)'s take care of ordering operations, hence, we need no
69
+ // awaits. At the same time completion of streaming deferred should happen
70
+ // after the last save operation.
71
+
72
+ const complete = (err?: any): void => {
73
+ if (!deferred) { return; }
74
+ const d = deferred;
75
+ deferred = undefined;
76
+ file.saveLayout()
77
+ .then(() => {
78
+ if (err) { d.reject(err); }
79
+ else { d.resolve(); }
80
+ })
81
+ .catch(exc => d.reject(err ? err : exc));
82
+ };
83
+
84
+ src.on('data', (data: Buffer) => {
85
+ let ofsInData = 0;
86
+ while (ofsInData < data.length) {
87
+ if (!deferred) { return; }
88
+ if (!chunk) {
89
+ const { value, done } = contentIter.next();
90
+ if (done) {
91
+ complete(new Error(`There are more bytes than expected by content info`));
92
+ return;
93
+ }
94
+ chunk = value;
95
+ }
96
+
97
+ const bytesToSelect = chunk!.len - (buf.length + chunkBytesWritten)
98
+ const bytes = data.subarray(ofsInData, ofsInData + bytesToSelect);
99
+ ofsInData += bytes.length;
100
+ buf.push(bytes);
101
+
102
+ if ((buf.length + chunkBytesWritten) === chunk!.len) {
103
+ const chunkBytes = buf.getBytes(undefined)!;
104
+ if (chunk!.type === 'header') {
105
+ file.saveHeader(chunkBytes, false)
106
+ .catch(err => complete(err));
107
+ } else {
108
+ const segsOfs = (chunk as ChunkWithSegs).segsOfs + chunkBytesWritten;
109
+ file.saveSegs(chunkBytes, segsOfs, undefined, false)
110
+ .catch(err => complete(err));
111
+ }
112
+ chunk = undefined;
113
+ chunkBytesWritten = 0;
114
+ } else if ((chunk!.type === 'segs') &&
115
+ ((buf.length >= maxBufferLen) || (buf.queueLength > 30))) {
116
+ const chunkBytes = buf.getBytes(undefined)!;
117
+ const segsOfs = (chunk as ChunkWithSegs).segsOfs + chunkBytesWritten;
118
+ file.saveSegs(chunkBytes, segsOfs, undefined, false)
119
+ .catch(err => complete(err));
120
+ chunkBytesWritten += chunkBytes.length;
121
+ }
122
+ }
123
+ });
124
+
125
+ src.on('end', () => {
126
+ if (chunk) {
127
+ complete(makeFileException(excCode.endOfFile, '<input stream>'));
128
+ } else {
129
+ complete();
130
+ }
131
+ });
132
+
133
+ src.on('error', err => complete(err));
134
+
135
+ src.resume(); // noop, if stream wasn't paused
136
+
137
+ return deferred.promise;
138
+ }
139
+
140
+ export function chunksInOrderedStream(
141
+ len: number, headerLen: undefined|number, segsOfs: number
142
+ ): Chunk[] {
143
+ const chunks: Chunk[] = [];
144
+ if (typeof headerLen === 'number') {
145
+ assert(len >= headerLen);
146
+ chunks.push({ type: 'header', len: headerLen });
147
+ len -= headerLen;
148
+ }
149
+ if (len === 0) { return chunks; }
150
+ chunks.push({ type: 'segs', segsOfs, len });
151
+ return chunks;
152
+ }
153
+
154
+ export type ObjPipe = (outStream: NodeJS.WritableStream) => Promise<void>;
155
+
156
+ export type GetObjFile =
157
+ (objId: string|null, version: number) => Promise<ObjVersionFile>;
158
+
159
+ export function makeObjPipe(
160
+ file: ObjVersionFile, header: boolean, segsOfs: number, segsLen: number,
161
+ objId: string|null, getObjFile: GetObjFile
162
+ ): ObjPipe {
163
+ const baseVersion = file.getBaseVersion();
164
+ if (baseVersion === undefined) {
165
+ return makeNoBaseObjPipe(file, header, segsOfs, segsLen);
166
+ }
167
+
168
+ segsLen = Math.min(segsLen, file.getTotalSegsLen());
169
+ const segsInRange = file.segsLocations(segsOfs, segsLen);
170
+ return async (outStream: NodeJS.WritableStream): Promise<void> => {
171
+ if (header) {
172
+ await file.streamHeaderInto(outStream);
173
+ }
174
+ for (const s of segsInRange) {
175
+ if ((s.type === 'new-on-disk') || (s.type === 'base-on-disk')) {
176
+ await file.streamSegsInto(outStream, s.thisVerOfs, s.len);
177
+ } else if (s.type === 'base') {
178
+ const base = await getObjFile(objId, baseVersion);
179
+ const pipeBase = makeObjPipe(
180
+ base, false, s.baseVerOfs, s.len, objId, getObjFile);
181
+ await pipeBase(outStream);
182
+ } else {
183
+ throw new Error(`Segment bytes from offset ${s.thisVerOfs} and length ${s.len} are not on the disk`);
184
+ }
185
+ }
186
+ };
187
+ }
188
+
189
+ export function makeNoBaseObjPipe(
190
+ file: ObjVersionFile, header: boolean, segsOfs: number, segsLen: number
191
+ ): ObjPipe {
192
+ return async (outStream: NodeJS.WritableStream): Promise<void> => {
193
+ if (header) {
194
+ await file.streamHeaderInto(outStream);
195
+ }
196
+ await file.streamSegsInto(outStream, segsOfs, segsLen);
197
+ };
198
+ }
199
+
200
+
201
+ Object.freeze(exports);