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,258 @@
1
+ /*
2
+ Copyright (C) 2015 - 2017, 2020, 2025 - 2026 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
+ /**
19
+ * This module produces users object, which managers users, and manages
20
+ * storage. The whole storage reliance set is located behind user's factory,
21
+ * which is created by this module.
22
+ */
23
+
24
+ import { Readable as ReadableStream } from 'stream';
25
+ import { Store, SC, ObjReader, StorageEventsSink, StorageParams } from './store';
26
+ import { PutObjFirstQueryOpts, PutObjSecondQueryOpts, DiffInfo, ObjStatus } from '../../lib-common/service-api/3nstorage/owner';
27
+ import { userDataInRootFolder } from '../../lib-server/resources/server-data-folders';
28
+
29
+ export { SC, ObjReader, MismatchedObjVerException } from './store';
30
+
31
+ export type UserExists = (userId: string) => Promise<boolean>;
32
+
33
+ export type GetCurrentObj = (
34
+ userId: string, objId: string|null,
35
+ header: boolean, segsOffset: number, segsLimit: number|undefined
36
+ ) => Promise<{ version: number; reader: ObjReader; }>;
37
+
38
+ export type SaveNewObjVersion = (
39
+ userId: string, objId: string|null,
40
+ fstReq: PutObjFirstQueryOpts|undefined, diff: DiffInfo|undefined,
41
+ sndReq: PutObjSecondQueryOpts|undefined,
42
+ bytesLen: number, bytes: ReadableStream
43
+ ) => Promise<string|undefined>;
44
+
45
+ export type GetArchivedObjVersion = (
46
+ userId: string, objId: string|null, version: number,
47
+ header: boolean, segsOffset: number, segsLimit: number|undefined
48
+ ) => Promise<ObjReader>;
49
+
50
+ export type CancelTransaction = (
51
+ userId: string, objId: string|null, transactionId?: string
52
+ ) => Promise<void>;
53
+
54
+ export type ArchiveObjCurrentVersion = (
55
+ userId: string, objId: string|null, version: number
56
+ ) => Promise<void>;
57
+
58
+ export type GetObjStatus = (
59
+ userId: string, objId: string|null
60
+ ) => Promise<ObjStatus>;
61
+
62
+ export type DeleteCurrentObjVersion = (
63
+ userId: string, objId: string, version?: number
64
+ ) => Promise<void>;
65
+
66
+ export type DeleteArchivedObjVersion = (
67
+ userId: string, objId: string|null, version: number
68
+ ) => Promise<void>;
69
+
70
+ export type GetSpaceQuota = (userId: string) => Promise<number>;
71
+
72
+ type GetParam<P extends keyof StorageParams> = (
73
+ userId: string
74
+ ) => Promise<StorageParams[P]>;
75
+ type SetParam<P extends keyof StorageParams> = (
76
+ userId: string, param: StorageParams[P]
77
+ ) => Promise<boolean>;
78
+
79
+ export type GetKeyDerivParams = GetParam<'key-deriv'>;
80
+ export type SetKeyDerivParams = SetParam<'key-deriv'>;
81
+
82
+ export type EventsSink = StorageEventsSink;
83
+
84
+ /**
85
+ * This is an external interface, behind which all storage machinery is hidding.
86
+ */
87
+ export interface Factory {
88
+ exists: UserExists;
89
+ getKeyDerivParams: GetKeyDerivParams;
90
+ setKeyDerivParams: SetKeyDerivParams;
91
+ getSpaceQuota: GetSpaceQuota;
92
+ cancelTransaction: CancelTransaction;
93
+ getCurrentObj: GetCurrentObj;
94
+ saveNewObjVersion: SaveNewObjVersion;
95
+ saveNewRootVersion: SaveNewObjVersion;
96
+ getCurrentRootObj: GetCurrentObj;
97
+ getObjStatus: GetObjStatus;
98
+ archiveObjVersion: ArchiveObjCurrentVersion;
99
+ getArchivedRootVersion: GetArchivedObjVersion;
100
+ getArchivedObjVersion: GetArchivedObjVersion;
101
+ deleteCurrentObjVersion: DeleteCurrentObjVersion;
102
+ deleteArchivedObjVersion: DeleteArchivedObjVersion;
103
+ setStorageEventsSink(sink: EventsSink): void;
104
+ }
105
+
106
+ export function makeFactory(
107
+ rootFolder: string,
108
+ writeBufferSize?: string|number, readBufferSize?: string|number
109
+ ): Factory {
110
+
111
+ const stores = new Map<string, Store>();
112
+
113
+ let storageEventsSink: StorageEventsSink|undefined = undefined;
114
+
115
+ async function getStore(userId: string): Promise<Store> {
116
+ if (!storageEventsSink) {
117
+ throw new Error(`Storage events sink is not set`);
118
+ }
119
+ const store = stores.get(userId);
120
+ if (store) {
121
+ try {
122
+ await store.ensureUserExistsOnDisk();
123
+ return store;
124
+ } catch (err) {
125
+ stores.delete(userId);
126
+ throw err;
127
+ }
128
+ } else {
129
+ const userFolder = userDataInRootFolder(rootFolder, userId);
130
+ const store = await Store.make(
131
+ userFolder, userId, storageEventsSink,
132
+ writeBufferSize, readBufferSize
133
+ );
134
+ stores.set(userId, store);
135
+ return store;
136
+ }
137
+ }
138
+
139
+ function makeCurrentObjGetter(isRoot?: boolean): GetCurrentObj {
140
+ return async (userId: string, objId: string|null, header: boolean,
141
+ segsOffset: number, segsLimit: number|undefined) => {
142
+ if ((isRoot && objId) || (!isRoot && !objId)) {
143
+ throw new Error("Mixed object types' functions.");
144
+ }
145
+ const store = await getStore(userId);
146
+ return store.getCurrentObj(objId, header, segsOffset, segsLimit);
147
+ }
148
+ }
149
+
150
+ function makeArchivedObjGetter(isRoot?: boolean): GetArchivedObjVersion {
151
+ return async (userId: string, objId: string|null, version: number,
152
+ header: boolean, segsOffset: number,
153
+ segsLimit: number|undefined) => {
154
+ if ((isRoot && objId) || (!isRoot && !objId)) {
155
+ throw new Error("Mixed object types' functions.");
156
+ }
157
+ const store = await getStore(userId);
158
+ return store.getArchivedObjVersion(objId, version, header, segsOffset, segsLimit);
159
+ }
160
+ }
161
+
162
+ function makeObjSaver(isRoot: boolean): SaveNewObjVersion {
163
+ return async (userId: string, objId: string|null,
164
+ fstReq: PutObjFirstQueryOpts|undefined, diff: DiffInfo|undefined,
165
+ sndReq: PutObjSecondQueryOpts|undefined, bytesLen: number,
166
+ bytes: ReadableStream): Promise<string|undefined> => {
167
+ if ((isRoot && objId) || (!isRoot && !objId)) {
168
+ throw new Error("Mixed object types' functions.");
169
+ }
170
+ const store = await getStore(userId);
171
+ if (fstReq) {
172
+ return store.startSavingObjNewVersion(objId, diff,
173
+ bytes, bytesLen, fstReq);
174
+ } else if (sndReq) {
175
+ return store.continueSavingObjNewVersion(objId,
176
+ bytes, bytesLen, sndReq);
177
+ } else {
178
+ throw new Error(`Missing both request options`);
179
+ }
180
+ };
181
+ }
182
+
183
+ function makeTransactionCanceller(): CancelTransaction {
184
+ return async (userId: string, objId: string|null, transactionId?: string) => {
185
+ const store = await getStore(userId);
186
+ await store.cancelTransaction(objId, transactionId);
187
+ };
188
+ }
189
+
190
+ const factory: Factory = {
191
+
192
+ exists: async userId => {
193
+ try {
194
+ const store = await getStore(userId);
195
+ return true;
196
+ } catch (err) {
197
+ if (err !== SC.USER_UNKNOWN) { throw err; }
198
+ return false;
199
+ }
200
+ },
201
+
202
+ getSpaceQuota: async userId => {
203
+ const store = await getStore(userId);
204
+ return await store.getSpaceQuota();
205
+ },
206
+
207
+ getKeyDerivParams: async userId => {
208
+ const store = await getStore(userId);
209
+ return await store.getParam('key-deriv');
210
+ },
211
+ setKeyDerivParams: async (userId, keyParams) => {
212
+ const store = await getStore(userId);
213
+ return await store.setKeyDerivParams(keyParams, false);
214
+ },
215
+
216
+ getCurrentRootObj: makeCurrentObjGetter(true),
217
+ getCurrentObj: makeCurrentObjGetter(false),
218
+
219
+ getArchivedRootVersion: makeArchivedObjGetter(true),
220
+ getArchivedObjVersion: makeArchivedObjGetter(false),
221
+
222
+ saveNewRootVersion: makeObjSaver(true),
223
+ saveNewObjVersion: makeObjSaver(false),
224
+
225
+ cancelTransaction: makeTransactionCanceller(),
226
+
227
+ deleteCurrentObjVersion: async (userId, objId, version) => {
228
+ const store = await getStore(userId);
229
+ await store.deleteCurrentObjVer(objId, version);
230
+ },
231
+
232
+ archiveObjVersion: async (userId, objId, version) => {
233
+ const store = await getStore(userId);
234
+ await store.archiveCurrentObjVersion(objId, version);
235
+ },
236
+
237
+ getObjStatus: async (userId, objId) => {
238
+ const store = await getStore(userId);
239
+ return store.getObjStatus(objId);
240
+ },
241
+
242
+ deleteArchivedObjVersion: async (userId, objId, version) => {
243
+ const store = await getStore(userId);
244
+ await store.deleteArchivedObjVer(objId, version);
245
+ },
246
+
247
+ setStorageEventsSink(sink: EventsSink): void {
248
+ if (storageEventsSink) { throw new Error(
249
+ `Storage events sink is already set`); }
250
+ storageEventsSink = sink;
251
+ }
252
+
253
+ };
254
+ Object.freeze(factory);
255
+ return factory;
256
+ }
257
+
258
+ Object.freeze(exports);
@@ -0,0 +1,45 @@
1
+ /*
2
+ Copyright (C) 2026 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 { Response, Request } from 'express';
19
+ import { base64urlSafe } from '../../lib-common/buffer-utils';
20
+ import { ErrorReply } from '../../lib-common/service-api/3nstorage/owner';
21
+ import { attachByteDrainToRequest } from '../../lib-server/middleware/body-parsers';
22
+
23
+ export function getObjIdFromParams(rootObj: boolean, req: Request): {
24
+ objId: string|null; objIdParseErr?: string;
25
+ } {
26
+ if (rootObj) {
27
+ return { objId: null };
28
+ } else {
29
+ const objId = req.params.objId;
30
+ return ((!!objId && base64urlSafe.allCharsFromAlphabet(objId)) ?
31
+ { objId } :
32
+ { objId: undefined as any, objIdParseErr: "Bad object id" }
33
+ );
34
+ }
35
+ }
36
+
37
+ export function replyWithErr(status: number, msg: string, res: Response, reqToDrainBytesFrom?: Request): void {
38
+ if (reqToDrainBytesFrom) {
39
+ attachByteDrainToRequest(reqToDrainBytesFrom);
40
+ }
41
+ res.status(status).json({ error: msg } as ErrorReply);
42
+ }
43
+
44
+
45
+ Object.freeze(exports);
@@ -0,0 +1,71 @@
1
+ /*
2
+ Copyright (C) 2022, 2026 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 { RequestHandler } from 'express';
19
+ import { ArchiveObjCurrentVersion, MismatchedObjVerException, SC as storeSC } from '../../resources/users';
20
+ import { archiveObj as api, ERR_SC, HTTP_HEADER } from '../../../lib-common/service-api/3nstorage/owner';
21
+ import { Request } from '../../resources/sessions';
22
+ import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
23
+
24
+ const SC = api.SC;
25
+
26
+ export function archiveCurrentObjVersion(
27
+ root: boolean, archiveObjVerFunc: ArchiveObjCurrentVersion
28
+ ): RequestHandler {
29
+
30
+ return async (req: Request, res, next) => {
31
+
32
+ const userId = req.session.params.userId;
33
+ const { objId, objIdParseErr } = getObjIdFromParams(root, req);
34
+ if (objIdParseErr) {
35
+ return replyWithErr(ERR_SC.malformed, objIdParseErr, res);
36
+ }
37
+
38
+ const version = parseInt(req.query.ver as any);
39
+ if (isNaN(version) || (version < 1)) {
40
+ return replyWithErr(ERR_SC.malformed, "Bad query parameters", res);
41
+ }
42
+
43
+ try {
44
+ await archiveObjVerFunc(userId, objId, version);
45
+ res.status(SC.okPost).send();
46
+ } catch (err) {
47
+ if ("string" !== typeof err) {
48
+ if ((err as MismatchedObjVerException).type === 'mismatched-obj-ver') {
49
+ const rep: api.MismatchedObjVerReply = {
50
+ error: "Current object version doesn't match assumed one.",
51
+ current_version: (err as MismatchedObjVerException).current_version
52
+ };
53
+ res.set(HTTP_HEADER.objVersion, `${(err as MismatchedObjVerException).current_version}`);
54
+ res.status(api.SC.mismatchedObjVer).json(rep);
55
+ } else {
56
+ next(err);
57
+ }
58
+ } else if (err === storeSC.OBJ_UNKNOWN) {
59
+ replyWithErr(SC.unknownObj, (root ? `Root object is not set.` : `Object ${objId} is unknown.`), res);
60
+ } else if (err === storeSC.USER_UNKNOWN) {
61
+ replyWithErr(ERR_SC.server, "Recipient disappeared from the system.", res);
62
+ req.session.close();
63
+ } else {
64
+ next(new Error("Unhandled storage error code: "+err));
65
+ }
66
+ }
67
+
68
+ };
69
+ };
70
+
71
+ Object.freeze(exports);
@@ -0,0 +1,60 @@
1
+ /*
2
+ Copyright (C) 2015 - 2017, 2020, 2026 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 { RequestHandler } from 'express';
19
+ import { CancelTransaction, SC as storeSC } from '../../resources/users';
20
+ import { cancelTransaction as api, ERR_SC } from '../../../lib-common/service-api/3nstorage/owner';
21
+ import { Request } from '../../resources/sessions';
22
+ import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
23
+
24
+ export function cancelTransaction(
25
+ root: boolean, cancelTransFunc: CancelTransaction
26
+ ): RequestHandler {
27
+
28
+ return async (req: Request, res, next) => {
29
+
30
+ const userId = req.session.params.userId;
31
+ const { objId, objIdParseErr } = getObjIdFromParams(root, req);
32
+ if (objIdParseErr) {
33
+ return replyWithErr(ERR_SC.malformed, objIdParseErr, res);
34
+ }
35
+ const transactionId: string = req.params.transactionId;
36
+
37
+ try {
38
+ await cancelTransFunc(userId, objId, ((transactionId === '-') ? undefined : transactionId));
39
+ res.status(api.SC.ok).send();
40
+ } catch (err) {
41
+ if ("string" !== typeof err) {
42
+ next(err);
43
+ } else if ((err === storeSC.TRANSACTION_UNKNOWN)
44
+ || (err === storeSC.OBJ_UNKNOWN)
45
+ || (err === storeSC.OBJ_VER_UNKNOWN)) {
46
+ res.status(api.SC.missing).send(
47
+ "Unknown transaction or object.");
48
+ } else if (err === storeSC.USER_UNKNOWN) {
49
+ res.status(ERR_SC.server).send(
50
+ "Recipient disappeared from the system.");
51
+ req.session.close();
52
+ } else {
53
+ next(new Error("Unhandled storage error code: "+err));
54
+ }
55
+ }
56
+
57
+ };
58
+ };
59
+
60
+ Object.freeze(exports);
@@ -0,0 +1,99 @@
1
+ /*
2
+ Copyright (C) 2016, 2020, 2022, 2026 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 { RequestHandler } from 'express';
19
+ import { DeleteArchivedObjVersion, DeleteCurrentObjVersion, SC as storeSC } from '../../resources/users';
20
+ import { ERR_SC, currentObj as api } from '../../../lib-common/service-api/3nstorage/owner';
21
+ import { Request } from '../../resources/sessions';
22
+ import { assert } from '../../../lib-common/assert';
23
+ import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
24
+
25
+ function deleteObj(
26
+ root: boolean, delCurrent: boolean,
27
+ deleteObjFunc: DeleteArchivedObjVersion|DeleteCurrentObjVersion
28
+ ): RequestHandler {
29
+ if (delCurrent) {
30
+ assert(!root);
31
+ }
32
+
33
+ return async (req: Request, res, next) => {
34
+
35
+ const userId = req.session.params.userId;
36
+ const { objId, objIdParseErr } = getObjIdFromParams(root, req);
37
+ if (objIdParseErr) {
38
+ return replyWithErr(ERR_SC.malformed, objIdParseErr, res);
39
+ }
40
+
41
+ const ver = parseInt(req.query.ver as string);
42
+ let version: number|undefined;
43
+ if (isNaN(ver)) {
44
+ if (delCurrent) {
45
+ version = undefined
46
+ } else {
47
+ return replyWithErr(ERR_SC.malformed, "Bad query parameters", res);
48
+ }
49
+ } else {
50
+ if (ver < 1) {
51
+ return replyWithErr(ERR_SC.malformed, "Bad query parameters", res);
52
+ }
53
+ version = ver;
54
+ }
55
+
56
+ try {
57
+ if (delCurrent) {
58
+ await (deleteObjFunc as DeleteCurrentObjVersion)(userId, objId!, version);
59
+ } else {
60
+ await (deleteObjFunc as DeleteArchivedObjVersion)(userId, objId, version!);
61
+ }
62
+ res.status(api.SC.okDelete).send();
63
+ } catch (err) {
64
+ if ("string" !== typeof err) {
65
+ next(err);
66
+ } else if (err === storeSC.CONCURRENT_TRANSACTION) {
67
+ res.status(api.SC.concurrentTransaction).send(
68
+ `Object ${objId} is currently under a transaction.`);
69
+ } else if (err === storeSC.OBJ_UNKNOWN) {
70
+ res.status(api.SC.unknownObj).send(`Object ${objId} is unknown.`);
71
+ } else if (err === storeSC.OBJ_VER_UNKNOWN) {
72
+ res.status(api.SC.unknownObjVer).send(
73
+ `Object version ${version} is unknown.`);
74
+ } else if (err === storeSC.USER_UNKNOWN) {
75
+ res.status(ERR_SC.server).send(
76
+ "Recipient disappeared from the system.");
77
+ req.session.close();
78
+ } else {
79
+ next(new Error("Unhandled storage error code: "+err));
80
+ }
81
+ }
82
+
83
+ };
84
+ }
85
+
86
+ export function deleteCurrentObjVer(
87
+ deleteObjFunc: DeleteCurrentObjVersion
88
+ ): RequestHandler {
89
+ return deleteObj(false, true, deleteObjFunc);
90
+ }
91
+
92
+ export function deleteArchivedObjVer(
93
+ root: boolean, deleteObjFunc: DeleteArchivedObjVersion
94
+ ): RequestHandler {
95
+ return deleteObj(root, false, deleteObjFunc);
96
+ }
97
+
98
+
99
+ Object.freeze(exports);
@@ -0,0 +1,109 @@
1
+ /*
2
+ Copyright (C) 2017, 2020, 2026 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 { RequestHandler } from 'express';
19
+ import { GetArchivedObjVersion, SC as storeSC } from '../../resources/users';
20
+ import { GetObjQueryOpts, ERR_SC, HTTP_HEADER, BIN_TYPE, archivedObjVersion as api } from '../../../lib-common/service-api/3nstorage/owner';
21
+ import { Request } from '../../resources/sessions';
22
+ import { errWithCause } from '../../../lib-common/exceptions/error';
23
+ import { EMPTY_BUFFER } from '../../../lib-common/buffer-utils';
24
+ import { getObjIdFromParams, replyWithErr } from '../../resources/utils';
25
+
26
+ function extractQueryOptions(req: Request): undefined|{
27
+ header: boolean; limit: number|undefined; ofs: number; ver: number
28
+ } {
29
+ // query fields are string or undefined, yet, type info helps the show
30
+ const query: GetObjQueryOpts = req.query;
31
+
32
+ const header = ((query.header as any) === 'true');
33
+
34
+ const ofs = (query.ofs ? parseInt(query.ofs as any) : 0);
35
+ if (isNaN(ofs) ||
36
+ (ofs < 0) ||
37
+ (header && (ofs > 0))) { return; }
38
+
39
+ const limit = (query.limit ? parseInt(query.limit as any) : undefined);
40
+ if (limit !== undefined) {
41
+ if (isNaN(limit) ||
42
+ (limit < 0) ||
43
+ (!header && (limit === 0))) { return; }
44
+ }
45
+
46
+ let ver = parseInt(query.ver as any);
47
+ if (isNaN(ver) || (ver < 1)) { return; }
48
+
49
+ return { header, limit, ofs, ver };
50
+ }
51
+
52
+ export function getArchivedObjVersion(
53
+ root: boolean, getArchivedObjFunc: GetArchivedObjVersion
54
+ ): RequestHandler {
55
+
56
+ return async (req: Request, res, next) => {
57
+
58
+ const userId = req.session.params.userId;
59
+ const { objId, objIdParseErr } = getObjIdFromParams(root, req);
60
+ if (objIdParseErr) {
61
+ return replyWithErr(ERR_SC.malformed, objIdParseErr, res);
62
+ }
63
+
64
+ const opts = extractQueryOptions(req);
65
+ if (!opts) {
66
+ return replyWithErr(ERR_SC.malformed, "Bad query parameters", res);
67
+ }
68
+
69
+ try {
70
+ const reader = await getArchivedObjFunc(userId, objId, opts.ver, opts.header, opts.ofs, opts.limit);
71
+ res.status(api.SC.okGet);
72
+ res.set(HTTP_HEADER.contentType, BIN_TYPE);
73
+ res.set(HTTP_HEADER.contentLength, `${reader.len}`);
74
+ if (opts.header) {
75
+ res.set(HTTP_HEADER.objHeaderLength, `${reader.headerLen}`);
76
+ }
77
+ res.set(HTTP_HEADER.objSegmentsLength, `${reader.segsLen}`);
78
+ if (reader.len > 0) {
79
+ try {
80
+ await reader.pipe!(res);
81
+ } catch (err) {
82
+ console.error(errWithCause(err, `Wasn't able to complete sending segments due to error in piping`));
83
+ } finally {
84
+ res.end();
85
+ }
86
+ } else {
87
+ res.send(EMPTY_BUFFER);
88
+ }
89
+ } catch (err) {
90
+ if ("string" !== typeof err) {
91
+ next(err);
92
+ } else if (err === storeSC.OBJ_UNKNOWN) {
93
+ replyWithErr(api.SC.unknownObj, (objId ? `Object ${objId}is unknown.` : `Root object is not set`), res);
94
+ } else if (err === storeSC.OBJ_VER_UNKNOWN) {
95
+ replyWithErr(api.SC.unknownObjVer, (objId ?
96
+ `Object ${objId}, version ${opts.ver} is unknown.` : `Root object version ${opts.ver} is not known.`
97
+ ), res);
98
+ } else if (err === storeSC.USER_UNKNOWN) {
99
+ replyWithErr(ERR_SC.server, `Recipient disappeared from the system.`, res);
100
+ req.session.close();
101
+ } else {
102
+ next(new Error(`Unhandled storage error code: ${err}`));
103
+ }
104
+ }
105
+
106
+ };
107
+ };
108
+
109
+ Object.freeze(exports);