spec-3nweb-server 1.8.5 → 1.8.7

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 (340) 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/resources/store.d.ts +2 -2
  6. package/build/3nstorage/resources/store.js +1 -1
  7. package/build/3nstorage/resources/users.d.ts +3 -3
  8. package/build/3nstorage/resources/users.js +1 -1
  9. package/build/3nstorage/resources/utils.d.ts +6 -0
  10. package/build/3nstorage/resources/utils.js +41 -0
  11. package/build/3nstorage/routes/owner/archive-obj-version.js +8 -10
  12. package/build/3nstorage/routes/owner/cancel-trans.js +5 -4
  13. package/build/3nstorage/routes/owner/delete-obj.js +7 -8
  14. package/build/3nstorage/routes/owner/get-archived-obj-ver.js +11 -13
  15. package/build/3nstorage/routes/owner/get-current-obj.js +7 -6
  16. package/build/3nstorage/routes/owner/get-obj-status.js +8 -8
  17. package/build/3nstorage/routes/owner/put-current-obj.js +25 -55
  18. package/build/3nstorage/routes/owner/session-params.js +2 -0
  19. package/build/asmail/resources/utils.d.ts +6 -0
  20. package/build/asmail/resources/utils.js +36 -0
  21. package/build/asmail/routes/delivery/finalize-delivery.js +3 -2
  22. package/build/asmail/routes/delivery/pre-flight.js +9 -26
  23. package/build/asmail/routes/delivery/provide-recipient-pubkey.js +4 -3
  24. package/build/asmail/routes/delivery/put-metadata.js +13 -21
  25. package/build/asmail/routes/delivery/put-obj.js +19 -25
  26. package/build/asmail/routes/delivery/restart-session.d.ts +4 -8
  27. package/build/asmail/routes/delivery/restart-session.js +10 -23
  28. package/build/asmail/routes/delivery/sender-authorization.js +5 -5
  29. package/build/asmail/routes/delivery/start-session.js +9 -24
  30. package/build/asmail/routes/retrieval/get-message-meta.js +4 -7
  31. package/build/asmail/routes/retrieval/get-message-obj.js +10 -7
  32. package/build/asmail/routes/retrieval/list-messages.js +4 -4
  33. package/build/asmail/routes/retrieval/remove-message.js +3 -2
  34. package/build/mock/tls-options.js +46 -44
  35. package/build/tests/admin-proto/signup.d.ts +1 -0
  36. package/build/tests/admin-proto/signup.js +235 -0
  37. package/build/tests/jasmine.d.ts +1 -0
  38. package/build/tests/jasmine.js +32 -0
  39. package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
  40. package/build/tests/libs-for-tests/3nstorage.js +123 -0
  41. package/build/tests/libs-for-tests/asmail.d.ts +22 -0
  42. package/build/tests/libs-for-tests/asmail.js +179 -0
  43. package/build/tests/libs-for-tests/assert.d.ts +1 -0
  44. package/build/tests/libs-for-tests/assert.js +26 -0
  45. package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
  46. package/build/tests/libs-for-tests/async-jasmine.js +77 -0
  47. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  48. package/build/tests/libs-for-tests/bytes-equal.js +34 -0
  49. package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
  50. package/build/tests/libs-for-tests/json-copy.js +45 -0
  51. package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
  52. package/build/tests/libs-for-tests/json-equal.js +67 -0
  53. package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
  54. package/build/tests/libs-for-tests/mailerid.js +114 -0
  55. package/build/tests/libs-for-tests/pkl.d.ts +28 -0
  56. package/build/tests/libs-for-tests/pkl.js +89 -0
  57. package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
  58. package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
  59. package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
  60. package/build/tests/libs-for-tests/server-components/admin.js +43 -0
  61. package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
  62. package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
  63. package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
  64. package/build/tests/libs-for-tests/server-components/component.js +77 -0
  65. package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
  66. package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
  67. package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
  68. package/build/tests/libs-for-tests/server-runner.js +69 -0
  69. package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
  70. package/build/tests/libs-for-tests/spec-assembly.js +55 -0
  71. package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
  72. package/build/tests/libs-for-tests/ws-utils.js +59 -0
  73. package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
  74. package/build/tests/libs-for-tests/xhr-utils.js +154 -0
  75. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
  76. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
  77. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
  78. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
  79. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
  80. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
  81. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
  82. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
  83. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
  84. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
  85. package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
  86. package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
  87. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
  88. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
  89. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
  90. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
  91. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
  92. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
  93. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
  94. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
  95. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
  96. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
  97. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
  98. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
  99. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
  100. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
  101. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
  102. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
  103. package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
  104. package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
  105. package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
  106. package/build/tests/protocols/3nstorage/owner.js +138 -0
  107. package/build/tests/protocols/asmail/config.d.ts +1 -0
  108. package/build/tests/protocols/asmail/config.js +117 -0
  109. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
  110. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
  111. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
  112. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
  113. package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
  114. package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
  115. package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
  116. package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
  117. package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
  118. package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
  119. package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
  120. package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
  121. package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
  122. package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
  123. package/build/tests/protocols/asmail/delivery.d.ts +1 -0
  124. package/build/tests/protocols/asmail/delivery.js +46 -0
  125. package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
  126. package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
  127. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
  128. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
  129. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
  130. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
  131. package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
  132. package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
  133. package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
  134. package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
  135. package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
  136. package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
  137. package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
  138. package/build/tests/protocols/asmail/retrieval.js +92 -0
  139. package/build/tests/protocols/mailerid.d.ts +1 -0
  140. package/build/tests/protocols/mailerid.js +210 -0
  141. package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
  142. package/build/tests/shared-checks/check-mid-login.js +131 -0
  143. package/build/tests/shared-checks/requests.d.ts +20 -0
  144. package/build/tests/shared-checks/requests.js +123 -0
  145. package/package.json +1 -1
  146. package/packing/create-deb.sh +57 -0
  147. package/packing/deb/lib/systemd/system/3nweb.service +11 -0
  148. package/packing/deb/postinst +44 -0
  149. package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
  150. package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
  151. package/publish-task.sh +10 -0
  152. package/push-to-github.sh +105 -0
  153. package/ts-code/3nstorage/3nstorage-app.ts +99 -0
  154. package/ts-code/3nstorage/owner.ts +178 -0
  155. package/ts-code/3nstorage/resources/sessions.ts +37 -0
  156. package/ts-code/3nstorage/resources/store.ts +896 -0
  157. package/ts-code/3nstorage/resources/users.ts +258 -0
  158. package/ts-code/3nstorage/resources/utils.ts +45 -0
  159. package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +71 -0
  160. package/ts-code/3nstorage/routes/owner/cancel-trans.ts +60 -0
  161. package/ts-code/3nstorage/routes/owner/delete-obj.ts +99 -0
  162. package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +109 -0
  163. package/ts-code/3nstorage/routes/owner/get-current-obj.ts +124 -0
  164. package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
  165. package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
  166. package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
  167. package/ts-code/3nstorage/routes/owner/put-current-obj.ts +257 -0
  168. package/ts-code/3nstorage/routes/owner/session-params.ts +50 -0
  169. package/ts-code/3nstorage/shared.ts +43 -0
  170. package/ts-code/asmail/asmail-app.ts +91 -0
  171. package/ts-code/asmail/config.ts +96 -0
  172. package/ts-code/asmail/delivery.ts +94 -0
  173. package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
  174. package/ts-code/asmail/resources/inbox.ts +696 -0
  175. package/ts-code/asmail/resources/recipients.ts +495 -0
  176. package/ts-code/asmail/resources/sessions.ts +37 -0
  177. package/ts-code/asmail/resources/utils.ts +41 -0
  178. package/ts-code/asmail/retrieval.ts +96 -0
  179. package/ts-code/asmail/routes/config/param-getter.ts +49 -0
  180. package/ts-code/asmail/routes/config/param-setter.ts +49 -0
  181. package/ts-code/asmail/routes/delivery/finalize-delivery.ts +51 -0
  182. package/ts-code/asmail/routes/delivery/pre-flight.ts +118 -0
  183. package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
  184. package/ts-code/asmail/routes/delivery/put-metadata.ts +85 -0
  185. package/ts-code/asmail/routes/delivery/put-obj.ts +152 -0
  186. package/ts-code/asmail/routes/delivery/restart-session.ts +117 -0
  187. package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
  188. package/ts-code/asmail/routes/delivery/start-session.ts +136 -0
  189. package/ts-code/asmail/routes/retrieval/get-message-meta.ts +50 -0
  190. package/ts-code/asmail/routes/retrieval/get-message-obj.ts +106 -0
  191. package/ts-code/asmail/routes/retrieval/list-messages.ts +68 -0
  192. package/ts-code/asmail/routes/retrieval/remove-message.ts +48 -0
  193. package/ts-code/cli/index.ts +82 -0
  194. package/ts-code/cli/run-cmd.ts +81 -0
  195. package/ts-code/cli/show-sample-config.ts +78 -0
  196. package/ts-code/cli/signup-cmd.ts +229 -0
  197. package/ts-code/cli/user-cmd.ts +68 -0
  198. package/ts-code/cli/utils.ts +105 -0
  199. package/ts-code/config/default-confs.ts +22 -0
  200. package/ts-code/config/from-yaml.ts +35 -0
  201. package/ts-code/config/letsencrypt.ts +77 -0
  202. package/ts-code/config/signup.ts +137 -0
  203. package/ts-code/lib-common/admin-api/signup.ts +120 -0
  204. package/ts-code/lib-common/assert.ts +22 -0
  205. package/ts-code/lib-common/async-fs-node.ts +656 -0
  206. package/ts-code/lib-common/buffer-utils.ts +124 -0
  207. package/ts-code/lib-common/byte-streaming/common.ts +166 -0
  208. package/ts-code/lib-common/bytes-equal.ts +25 -0
  209. package/ts-code/lib-common/canonical-address.ts +92 -0
  210. package/ts-code/lib-common/exceptions/error.ts +44 -0
  211. package/ts-code/lib-common/exceptions/file.ts +84 -0
  212. package/ts-code/lib-common/exceptions/http.ts +69 -0
  213. package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
  214. package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
  215. package/ts-code/lib-common/json-equal.ts +55 -0
  216. package/ts-code/lib-common/json-utils.ts +130 -0
  217. package/ts-code/lib-common/jwkeys.ts +246 -0
  218. package/ts-code/lib-common/map-of-sets.ts +60 -0
  219. package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
  220. package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
  221. package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
  222. package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
  223. package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
  224. package/ts-code/lib-common/processes.ts +501 -0
  225. package/ts-code/lib-common/random-node.ts +79 -0
  226. package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
  227. package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
  228. package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
  229. package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
  230. package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
  231. package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
  232. package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
  233. package/ts-code/lib-common/service-api/locker.ts +44 -0
  234. package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
  235. package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
  236. package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
  237. package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
  238. package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
  239. package/ts-code/lib-common/session-encryptor.ts +54 -0
  240. package/ts-code/lib-common/time-window-cache.ts +74 -0
  241. package/ts-code/lib-common/transferable.d.ts +30 -0
  242. package/ts-code/lib-server/conf-util.ts +35 -0
  243. package/ts-code/lib-server/mid-access.ts +45 -0
  244. package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
  245. package/ts-code/lib-server/middleware/error-handler.ts +79 -0
  246. package/ts-code/lib-server/pkl-access.ts +46 -0
  247. package/ts-code/lib-server/resources/dns.ts +151 -0
  248. package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
  249. package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
  250. package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
  251. package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
  252. package/ts-code/lib-server/resources/sessions.ts +232 -0
  253. package/ts-code/lib-server/resources/user-files.ts +147 -0
  254. package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
  255. package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
  256. package/ts-code/lib-server/routes/sessions/close.ts +27 -0
  257. package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
  258. package/ts-code/lib-server/routes/sessions/start.ts +116 -0
  259. package/ts-code/lib-server/web-sockets/app.ts +339 -0
  260. package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
  261. package/ts-code/lib.ts +29 -0
  262. package/ts-code/locker/locker-app.ts +60 -0
  263. package/ts-code/locker/resources/lockers.ts +17 -0
  264. package/ts-code/locker/resources/sessions.ts +37 -0
  265. package/ts-code/locker/routes/create-locker.ts +47 -0
  266. package/ts-code/mailerId/mailerId-app.ts +107 -0
  267. package/ts-code/mailerId/resources/certifier.ts +181 -0
  268. package/ts-code/mailerId/resources/sessions.ts +44 -0
  269. package/ts-code/mailerId/resources/users.ts +88 -0
  270. package/ts-code/mailerId/routes/certify.ts +68 -0
  271. package/ts-code/main.ts +304 -0
  272. package/ts-code/mock/dns.ts +106 -0
  273. package/ts-code/mock/mock-as-child-proc.ts +130 -0
  274. package/ts-code/mock/node-child-ipc.ts +69 -0
  275. package/ts-code/mock/run-in-proc.ts +111 -0
  276. package/ts-code/mock/tls-options.ts +73 -0
  277. package/ts-code/services.ts +138 -0
  278. package/ts-code/signup/resources/users.ts +429 -0
  279. package/ts-code/signup/routes/add.ts +65 -0
  280. package/ts-code/signup/routes/get-available-addresses.ts +49 -0
  281. package/ts-code/signup/routes/get-available-domains.ts +45 -0
  282. package/ts-code/signup/signup-app.ts +54 -0
  283. package/ts-code/signup/signup-tokens.ts +148 -0
  284. package/ts-code/tests/admin-proto/signup.ts +277 -0
  285. package/ts-code/tests/jasmine.ts +37 -0
  286. package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
  287. package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
  288. package/ts-code/tests/libs-for-tests/assert.ts +22 -0
  289. package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
  290. package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
  291. package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
  292. package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
  293. package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
  294. package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
  295. package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
  296. package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
  297. package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
  298. package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
  299. package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
  300. package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
  301. package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
  302. package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
  303. package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
  304. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
  305. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
  306. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
  307. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
  308. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
  309. package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
  310. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
  311. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
  312. package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
  313. package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
  314. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
  315. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
  316. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
  317. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
  318. package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
  319. package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
  320. package/ts-code/tests/protocols/asmail/config.ts +172 -0
  321. package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
  322. package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
  323. package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
  324. package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
  325. package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
  326. package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
  327. package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
  328. package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
  329. package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
  330. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
  331. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
  332. package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
  333. package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
  334. package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
  335. package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
  336. package/ts-code/tests/protocols/mailerid.ts +271 -0
  337. package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
  338. package/ts-code/tests/shared-checks/requests.ts +135 -0
  339. package/ts-code/tsconfig.json +11 -0
  340. package/ts-code/web3n.d.ts +1068 -0
@@ -0,0 +1,656 @@
1
+ /*
2
+ Copyright (C) 2015 - 2017, 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 * as fs from 'fs';
19
+ import { createReadStream, createWriteStream, statSync } from 'fs';
20
+ import { Readable, Writable } from 'stream';
21
+ import { FileException, Code as excCode, makeFileException }
22
+ from './exceptions/file';
23
+ import { SingleProc, defer, Deferred } from './processes';
24
+ import { BytesFIFOBuffer } from './byte-streaming/common';
25
+ import { toBuffer } from './buffer-utils';
26
+ import { join } from 'path';
27
+
28
+ export { Stats } from 'fs';
29
+ export { FileException } from './exceptions/file';
30
+
31
+ function makeFileExceptionFromNodes(nodeExc: NodeJS.ErrnoException):
32
+ FileException {
33
+ return makeFileException(nodeExc.code!, nodeExc.path!);
34
+ }
35
+
36
+ export function readFile(filename: string,
37
+ options: { encoding: string; flag?: string; }): Promise<string>;
38
+ export function readFile(filename: string,
39
+ options?: { flag?: string; }): Promise<Buffer>;
40
+ export function readFile(path: string,
41
+ options?: { flag?: string; encoding?: string; }): Promise<Buffer|string> {
42
+ return new Promise<Buffer>((resolve, reject) => {
43
+ const cb = (err, data) => {
44
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
45
+ else { resolve(data); }
46
+ };
47
+ if (options) {
48
+ fs.readFile(path, options as any, cb);
49
+ } else {
50
+ fs.readFile(path, cb);
51
+ }
52
+ });
53
+ }
54
+
55
+ export function writeFile(path: string, data: any,
56
+ options: { encoding?: string; mode?: number|string; flag?: string; }):
57
+ Promise<void> {
58
+ return new Promise<void>((resolve, reject) => {
59
+ fs.writeFile(path, data, options as any, (err) => {
60
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
61
+ else { resolve(); }
62
+ });
63
+ });
64
+ }
65
+
66
+ export function mkdir(path: string): Promise<void> {
67
+ return new Promise<void>((resolve, reject) => {
68
+ fs.mkdir(path, (err) => {
69
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
70
+ else { resolve(); }
71
+ });
72
+ });
73
+ }
74
+
75
+ export function open(path: string, flags: string): Promise<number> {
76
+ return new Promise<number>((resolve, reject) => {
77
+ fs.open(path, flags, (err, df) => {
78
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
79
+ else { resolve(df); }
80
+ });
81
+ });
82
+ }
83
+
84
+ function writeOrig(fd: number, buffer: Buffer, offset: number,
85
+ length: number, position?: number): Promise<number> {
86
+ return new Promise<number>((resolve, reject) => {
87
+ const cb = (err, written) => {
88
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
89
+ else { resolve(written); }
90
+ };
91
+ if (typeof position === 'number') {
92
+ fs.write(fd, buffer, offset, length, position, cb);
93
+ } else {
94
+ fs.write(fd, buffer, offset, length, cb);
95
+ }
96
+ });
97
+ }
98
+
99
+ function readOrig(fd: number, buffer: Buffer, offset: number,
100
+ length: number, position: number): Promise<number> {
101
+ return new Promise<number>((resolve, reject) => {
102
+ fs.read(fd, buffer, offset, length, position, (err, bytesRead) => {
103
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
104
+ else { resolve(bytesRead); }
105
+ });
106
+ });
107
+ }
108
+
109
+ export function close(fd: number): Promise<void> {
110
+ return new Promise<void>((resolve, reject) => {
111
+ fs.close(fd, (err) => {
112
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
113
+ else { resolve(); }
114
+ });
115
+ });
116
+ }
117
+
118
+ export function symlink(target: string, path: string,
119
+ type?: 'dir'|'file'|'junction'): Promise<void> {
120
+ return new Promise<void>((resolve, reject) => {
121
+ fs.symlink(target, path, type, (err) => {
122
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
123
+ else { resolve(); }
124
+ });
125
+ });
126
+ }
127
+
128
+ export function readlink(path: string): Promise<string> {
129
+ return new Promise<string>((resolve, reject) => {
130
+ fs.readlink(path, (err, targetPath) => {
131
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
132
+ else { resolve(targetPath); }
133
+ });
134
+ });
135
+ }
136
+
137
+ export function lstat(path: string): Promise<fs.Stats> {
138
+ return new Promise<fs.Stats>((resolve, reject) => {
139
+ fs.lstat(path, (err, stat) => {
140
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
141
+ else { resolve(stat); }
142
+ });
143
+ });
144
+ }
145
+
146
+ export function stat(path: string): Promise<fs.Stats> {
147
+ return new Promise<fs.Stats>((resolve, reject) => {
148
+ fs.stat(path, (err, stat) => {
149
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
150
+ else { resolve(stat); }
151
+ });
152
+ });
153
+ }
154
+
155
+ export function fstat(fd: number): Promise<fs.Stats> {
156
+ return new Promise<fs.Stats>((resolve, reject) => {
157
+ fs.fstat(fd, (err, stat) => {
158
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
159
+ else { resolve(stat); }
160
+ });
161
+ });
162
+ }
163
+
164
+ export function readdir(path: string): Promise<string[]> {
165
+ return new Promise<string[]>((resolve, reject) => {
166
+ fs.readdir(path, (err, list) => {
167
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
168
+ else { resolve(list); }
169
+ });
170
+ });
171
+ }
172
+
173
+ export function rmdir(path: string): Promise<void> {
174
+ return new Promise<void>((resolve, reject) => {
175
+ fs.rmdir(path, (err) => {
176
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
177
+ else { resolve(); }
178
+ });
179
+ });
180
+ }
181
+
182
+ export function unlink(path: string): Promise<void> {
183
+ return new Promise<void>((resolve, reject) => {
184
+ fs.unlink(path, (err) => {
185
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
186
+ else { resolve(); }
187
+ });
188
+ });
189
+ }
190
+
191
+ export function rename(oldPath: string, newPath: string): Promise<void> {
192
+ return new Promise<void>((resolve, reject) => {
193
+ fs.rename(oldPath, newPath, (err) => {
194
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
195
+ else { resolve(); }
196
+ });
197
+ });
198
+ }
199
+
200
+ export function truncate(path: string, size: number): Promise<void> {
201
+ return new Promise<void>((resolve, reject) => {
202
+ fs.truncate(path, size, (err) => {
203
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
204
+ else { resolve(); }
205
+ });
206
+ });
207
+ }
208
+
209
+ export function ftruncate(fd: number, size: number): Promise<void> {
210
+ return new Promise<void>((resolve, reject) => {
211
+ fs.ftruncate(fd, size, (err) => {
212
+ if (err) { reject(makeFileExceptionFromNodes(err)); }
213
+ else { resolve(); }
214
+ });
215
+ });
216
+ }
217
+
218
+ /**
219
+ * @param fd is an open file descriptor
220
+ * @param pos is a position in the file, from which reading should start
221
+ * @param buf is a buffer, into which bytes should be read from start to
222
+ * the end, i.e. number of bytes that must be read is equal to the buffer's
223
+ * length.
224
+ * @returns a promise, resolvable when buffer is completely filled with bytes
225
+ * from the file.
226
+ * The promise fails, if an end of file is encountered before entire buffer is
227
+ * filled up with bytes.
228
+ */
229
+ export async function readToBuf(fd: number, pos: number, buf: Buffer):
230
+ Promise<void> {
231
+ if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
232
+ 'Illegal file position given: '+pos); }
233
+ let bytesRead = 0
234
+ while (bytesRead < buf.length) {
235
+ const bNum = await readOrig(fd, buf, bytesRead, buf.length-bytesRead, pos);
236
+ if (bNum === 0) { throw makeFileException(excCode.endOfFile, '<file descriptor>'); }
237
+ bytesRead += bNum;
238
+ pos += bNum;
239
+ }
240
+ }
241
+
242
+ /**
243
+ * @param fd is an open file descriptor
244
+ * @param pos is a position in the file, from which writing should start
245
+ * @param buf is a buffer, from which all bytes should be written into the file.
246
+ * @returns a promise, resolvable when all bytes were written to the file.
247
+ */
248
+ export async function writeFromBuf(fd: number, pos: number, buf: Buffer):
249
+ Promise<void> {
250
+ if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
251
+ 'Illegal file position given: '+pos); }
252
+ let bytesWritten = 0;
253
+ while (bytesWritten < buf.length) {
254
+ const bNum = await writeOrig(fd, buf,
255
+ bytesWritten, buf.length-bytesWritten, pos);
256
+ bytesWritten += bNum;
257
+ pos += bNum;
258
+ }
259
+ }
260
+
261
+ const SINGLE_BYTE_BUF = Buffer.alloc(1);
262
+ SINGLE_BYTE_BUF[0] = 0;
263
+
264
+ /**
265
+ * This will create a new file of a given size, and will fail, if a file
266
+ * with a given path already exists.
267
+ * @param filePath
268
+ * @param fileSize
269
+ * @param keepFileOpen
270
+ * @returns a promise, resolvable, when a new empty file has been created.
271
+ * When keep open flag was passed, live numeric file descriptor is returned,
272
+ * else return value is undefined and should be ignored.
273
+ */
274
+ export async function createEmptyFile(filePath: string, fileSize: number,
275
+ keepFileOpen?: boolean): Promise<number|undefined> {
276
+ if ((typeof fileSize !== 'number') || (fileSize < 0)) { throw new Error(
277
+ 'Illegal file size given: '+fileSize); }
278
+ let fileDescr: number|undefined;
279
+ try {
280
+ fileDescr = await open(filePath, 'wx');
281
+ if (fileSize > 0) {
282
+ await writeOrig(fileDescr, SINGLE_BYTE_BUF, 0, 1, fileSize-1);
283
+ }
284
+ if (keepFileOpen) { return fileDescr; }
285
+ await close(fileDescr);
286
+ } catch (exc) {
287
+ if (fileDescr) {
288
+ close(fileDescr).catch(() => {});
289
+ }
290
+ throw exc;
291
+ }
292
+ }
293
+
294
+ /**
295
+ * @param path
296
+ * @return true, if given path represents directory, or false, if it does not.
297
+ */
298
+ export function existsFolderSync(path: string): boolean {
299
+ try {
300
+ if (statSync(path).isDirectory()) {
301
+ return true;
302
+ } else {
303
+ throw makeFileException(excCode.notDirectory, path);
304
+ }
305
+ } catch (e) {
306
+ if ((<NodeJS.ErrnoException> e).code === excCode.notFound) {
307
+ return false;
308
+ }
309
+ throw e;
310
+ }
311
+ }
312
+
313
+ /**
314
+ * @param filePath
315
+ * @return a promise, resolvable to file's size.
316
+ */
317
+ export async function getFileSize(filePath: string): Promise<number> {
318
+ const st = await stat(filePath);
319
+ return st.size;
320
+ }
321
+
322
+ /**
323
+ * This returns a promise of total size of given folder's content.
324
+ * Sizes of linked objects are not included.
325
+ * @param folderPath
326
+ */
327
+ export async function getFolderContentSize(folderPath: string):
328
+ Promise<number> {
329
+ const list = await readdir(folderPath);
330
+ let size = 0;
331
+ for (const childName of list) {
332
+ const childPath = `${folderPath}/${childName}`;
333
+ const childStats = await stat(childPath);
334
+ if (childStats.isFile()) {
335
+ size += childStats.size;
336
+ } else if (childStats.isDirectory()) {
337
+ size += await getFolderContentSize(childPath);
338
+ }
339
+ }
340
+ return size;
341
+ }
342
+
343
+ /**
344
+ * @param fd is an open file descriptor
345
+ * @param pos is a position in the file, from which writing should start
346
+ * @param buf is a buffer, from which all bytes should be written into the file.
347
+ * @returns a promise, resolvable when all bytes were written to it.
348
+ */
349
+ export async function write(fd: number, pos: number, buf: Buffer):
350
+ Promise<void> {
351
+ if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
352
+ 'Illegal file position given: '+pos); }
353
+ let bytesWritten = 0;
354
+ while (bytesWritten < buf.length) {
355
+ const bNum = await writeOrig(fd, buf,
356
+ bytesWritten, buf.length-bytesWritten, pos);
357
+ bytesWritten += bNum;
358
+ pos += bNum;
359
+ }
360
+ }
361
+
362
+ /**
363
+ * @param fd is an open file descriptor in append mode.
364
+ * @param buf is a buffer, from which all bytes should be written into the file.
365
+ * @returns a promise, resolvable when all bytes were written to it.
366
+ */
367
+ export async function append(fd: number, buf: Buffer):
368
+ Promise<void> {
369
+ let bytesWritten = 0;
370
+ while (bytesWritten < buf.length) {
371
+ const bNum = await writeOrig(fd, buf,
372
+ bytesWritten, buf.length-bytesWritten);
373
+ bytesWritten += bNum;
374
+ }
375
+ }
376
+
377
+ /**
378
+ * @param filePath is a path to an existing file
379
+ * @param pos is a position in the file, from which writing should start
380
+ * @param buf is a buffer, from which all bytes should be written into the file.
381
+ * @returns a promise, resolvable when all bytes were written to it.
382
+ */
383
+ async function writeToExistingFile(filePath: string, pos: number,
384
+ buf: Buffer): Promise<void> {
385
+ const fd = await open(filePath, 'r+');
386
+ try {
387
+ await write(fd, pos, buf);
388
+ } finally {
389
+ await close(fd);
390
+ }
391
+ }
392
+
393
+ /**
394
+ * @param filePath
395
+ * @param pos is a position in the file, from which writting should start
396
+ * @param len is a number of bytes to read from a source and write into a file
397
+ * @param src is a readable stream, from which bytes should be written into a
398
+ * file
399
+ * @param bufSize is a size of the buffer, used in this streaming
400
+ * @return a promise, resolvable when streaming into file from a given readable
401
+ * source completes.
402
+ */
403
+ export async function streamToExistingFile(filePath: string, pos: number,
404
+ len: number, src: Readable, bufSize: number): Promise<void> {
405
+ if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
406
+ 'Illegal file position given: '+pos); }
407
+ if ((typeof len !== 'number') || (len < 1)) { throw new Error(
408
+ 'Illegal length given: '+len); }
409
+ if ((typeof bufSize !== 'number') || (bufSize < 1024)) { throw new Error(
410
+ 'Illegal buffer size given: '+bufSize); }
411
+
412
+ const writeProc = new SingleProc();
413
+ let bytesWritten = 0;
414
+ let bytesRead = 0;
415
+ const buf = new BytesFIFOBuffer();
416
+ let deferred: Deferred<void>|undefined = defer<void>();
417
+ let doneReading = false;
418
+
419
+ const complete = (err?: any): void => {
420
+ if (!deferred) { return; }
421
+ if (err) { deferred.reject(err); }
422
+ else { deferred.resolve(); }
423
+ deferred = undefined;
424
+ doneReading = true;
425
+ buf.clear();
426
+ };
427
+
428
+ src.on('data', (data: Buffer) => {
429
+ if (doneReading || !deferred) { return; }
430
+ buf.push(data);
431
+ bytesRead += data.length;
432
+
433
+ if (bytesRead >= len) {
434
+ doneReading = true;
435
+ } else if (buf.length < bufSize) {
436
+ return;
437
+ }
438
+
439
+ writeProc.startOrChain(async () => {
440
+ if (!deferred) { return; }
441
+ try {
442
+ const bytesToWrite = buf.getBytes(len - bytesWritten, true);
443
+ if (!bytesToWrite) { return; }
444
+ await writeToExistingFile(filePath, pos, toBuffer(bytesToWrite));
445
+ pos += bytesToWrite.length;
446
+ bytesWritten += bytesToWrite.length;
447
+ if (bytesWritten < len) { return; }
448
+ complete();
449
+ } catch (err) {
450
+ complete(err);
451
+ }
452
+ });
453
+
454
+ });
455
+
456
+ src.on('end', () => {
457
+ if (doneReading) { return; }
458
+ complete(makeFileException(excCode.endOfFile, '<input stream>'));
459
+ });
460
+
461
+ src.on('error', (err) => {
462
+ complete(err);
463
+ });
464
+
465
+ src.resume(); // noop, if stream wasn't paused
466
+
467
+ return deferred.promise;
468
+ }
469
+
470
+ /**
471
+ * @param fd is an open file descriptor
472
+ * @param pos is a position in the file, from which reading should start
473
+ * @param buf is a buffer, into which bytes should be read from start to
474
+ * the end, i.e. number of bytes that must be read is equal to the buffer's
475
+ * length.
476
+ * @returns a promise, resolvable when buffer is completely filled with bytes
477
+ * from the file.
478
+ * The promise fails, if an end of file is encountered before entire buffer is
479
+ * filled up with bytes.
480
+ */
481
+ export async function read(fd: number, pos: number, buf: Buffer):
482
+ Promise<void> {
483
+ if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
484
+ 'Illegal file position given: '+pos); }
485
+ let bytesRead = 0
486
+ while (bytesRead < buf.length) {
487
+ const bNum = await readOrig(fd, buf, bytesRead, buf.length-bytesRead, pos);
488
+ if (bNum === 0) { throw makeFileException(excCode.endOfFile, '<file descriptor>'); }
489
+ bytesRead += bNum;
490
+ pos += bNum;
491
+ }
492
+ }
493
+
494
+ /**
495
+ * @param filePath is a file's path, from which to read
496
+ * @param pos is a position in the file, from which reading should start
497
+ * @param buf is a buffer, into which bytes should be read from start to
498
+ * the end, i.e. number of bytes that must be read is equal to the buffer's
499
+ * length.
500
+ * @returns a promise, resolvable when buffer is completely filled with bytes
501
+ * from the file.
502
+ * The promise fails, if an end of file is encountered before entire buffer is
503
+ * filled up with bytes.
504
+ */
505
+ async function readFromFile(filePath: string, pos: number, buf: Buffer):
506
+ Promise<void> {
507
+ const fd = await open(filePath, 'r');
508
+ try {
509
+ return read(fd, pos, buf);
510
+ } finally {
511
+ return close(fd);
512
+ }
513
+ }
514
+
515
+ /**
516
+ * @param folder is a path to a folder, which should be recursively removed,
517
+ * together with all files.
518
+ * @returns a promise, resolvable, when a folder has been recursively removed.
519
+ */
520
+ export async function rmDirWithContent(folder: string): Promise<void> {
521
+ const files = await readdir(folder);
522
+ if (files.length === 0) {
523
+ await rmdir(folder);
524
+ return;
525
+ }
526
+ const rmTasks: Promise<void>[] = [];
527
+ for (const name of files) {
528
+ const innerPath = `${folder}/${name}`;
529
+ const task = lstat(innerPath)
530
+ .then((st) => {
531
+ if (st.isDirectory()) {
532
+ return rmDirWithContent(innerPath);
533
+ } else {
534
+ return unlink(innerPath);
535
+ }
536
+ });
537
+ rmTasks.push(task);
538
+ }
539
+ await Promise.all(rmTasks);
540
+ await rmdir(folder);
541
+ }
542
+
543
+ /**
544
+ * @param w is a writable stream
545
+ * @param buf is buffer of bytes that should be sunk into given stream
546
+ * @return a promise, resolvable when all bytes have been absobed by the
547
+ * writable.
548
+ */
549
+ function sinkBytes(w: Writable, buf: Buffer): Promise<void> {
550
+ return new Promise<void>((resolve, reject) => {
551
+ w.write(buf, (err) => {
552
+ if (err) { reject(err); }
553
+ else { resolve(); }
554
+ });
555
+ });
556
+ }
557
+
558
+ /**
559
+ * @param filePath
560
+ * @param pos is a position in the file, from which read should start
561
+ * @param len is a number of bytes to read from file and write into a sink
562
+ * @param sink is a writable stream, into which bytes should be sunk
563
+ * @param bufSize is a size of the buffer, used in this streaming
564
+ * @return a promise, resolvable when streaming from file into given writable
565
+ * sink completes.
566
+ */
567
+ export async function streamFromFile(filePath: string, pos: number,
568
+ len: number, sink: Writable, bufSize: number): Promise<void> {
569
+ if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
570
+ 'Illegal file position given: '+pos); }
571
+ if ((typeof len !== 'number') || (len < 1)) { throw new Error(
572
+ 'Illegal length given: '+len); }
573
+ if ((typeof bufSize !== 'number') || (bufSize < 1024)) { throw new Error(
574
+ 'Illegal buffer size given: '+bufSize); }
575
+ let buf = Buffer.alloc(Math.min(bufSize, len));
576
+ let byteCount = 0;
577
+ while (byteCount < len) {
578
+ const bytesLeft = len - byteCount;
579
+ if (buf.length > bytesLeft) {
580
+ buf = buf.slice(0, bytesLeft);
581
+ }
582
+ await readFromFile(filePath, pos+byteCount, buf);
583
+ await sinkBytes(sink, buf);
584
+ byteCount += buf.length;
585
+ }
586
+ }
587
+
588
+ /**
589
+ * This pipes source file into destination file.
590
+ * @param src
591
+ * @param dst
592
+ * @param overwrite
593
+ * @return a promise, resolvable when piping completes.
594
+ */
595
+ export function copyFile(src: string, dst: string, overwrite = false,
596
+ dstMode = '660'): Promise<void> {
597
+ return new Promise<void>((resolve, reject) => {
598
+ const srcStream = createReadStream(src);
599
+ const dstStream = createWriteStream(dst, {
600
+ mode: parseInt(dstMode, 8),
601
+ flags: (overwrite ? 'w' : 'wx')
602
+ });
603
+ srcStream.pipe(dstStream);
604
+ dstStream.on('finish', () => {
605
+ resolve();
606
+ });
607
+ const isRejected = false;
608
+ const onErr = (err) => {
609
+ if (!isRejected) {
610
+ reject(err);
611
+ srcStream.unpipe();
612
+ }
613
+ };
614
+ srcStream.on('error', onErr);
615
+ dstStream.on('error', onErr);
616
+ });
617
+ }
618
+
619
+ /**
620
+ * This copies tree of files from source to destination folders.
621
+ * Target folders may exist in a destination tree.
622
+ * Objects that are neither files, nor folders, are ignored.
623
+ * @param src
624
+ * @param dst
625
+ * @param fileOverwrite when set to true, allows to overwrite files in a
626
+ * destination tree. Otherwise, exception is thrown on already existing files.
627
+ * @return a promise resolvable when the whole tree is copied from source to
628
+ * destination.
629
+ */
630
+ export async function copyTree(
631
+ src: string, dst: string, fileOverwrite = false
632
+ ): Promise<void> {
633
+ // ensure presence of destination folder
634
+ await mkdir(dst).catch((exc: FileException) => {
635
+ if (!exc.alreadyExists) { throw exc; }
636
+ });
637
+ // copy files and folders from src folder
638
+ const srcFNames = await readdir(src);
639
+ const cpTasks: Promise<void>[] = [];
640
+ for (const fName of srcFNames) {
641
+ const srcPath = join(src, fName);
642
+ const dstPath = join(dst, fName);
643
+ const task = stat(srcPath)
644
+ .then((stats) => {
645
+ if (stats.isFile()) {
646
+ return copyFile(srcPath, dstPath, fileOverwrite);
647
+ } else if (stats.isDirectory()) {
648
+ return copyTree(srcPath, dstPath, fileOverwrite);
649
+ }
650
+ });
651
+ cpTasks.push(task);
652
+ }
653
+ await Promise.all(cpTasks);
654
+ }
655
+
656
+ Object.freeze(exports);