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,269 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016 - 2017, 2025 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const test_utils_1 = require("../test-utils");
21
+ const owner_1 = require("../../../../../lib-common/service-api/3nstorage/owner");
22
+ const async_jasmine_1 = require("../../../../libs-for-tests/async-jasmine");
23
+ const xhr_utils_1 = require("../../../../libs-for-tests/xhr-utils");
24
+ const _3nstorage_1 = require("../../../../libs-for-tests/3nstorage");
25
+ const requests_1 = require("../../../../shared-checks/requests");
26
+ const random_node_1 = require("../../../../../lib-common/random-node");
27
+ const url_1 = require("url");
28
+ const json_copy_1 = require("../../../../libs-for-tests/json-copy");
29
+ const bytes_equal_1 = require("../../../../libs-for-tests/bytes-equal");
30
+ exports.specs = [];
31
+ const description = 'Request to get current non-root object';
32
+ const obj = {
33
+ objId: 'aaaa',
34
+ version: 1,
35
+ header: (0, random_node_1.bytesSync)(100),
36
+ segs: (0, random_node_1.bytesSync)(2345)
37
+ };
38
+ let reqOpts;
39
+ let storageServer;
40
+ let user;
41
+ let sessionId;
42
+ async function setStage(setup) {
43
+ storageServer = setup().storageServer;
44
+ user = setup().user;
45
+ await storageServer.restartAndClearStorageFor(user.id);
46
+ sessionId = await (0, test_utils_1.startSession)(user);
47
+ await (0, _3nstorage_1.saveObj)(user.storageOwnerUrl, sessionId, obj.objId, 1, obj);
48
+ reqOpts = {
49
+ url: (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { header: true })),
50
+ method: 'GET',
51
+ sessionId,
52
+ responseType: 'arraybuffer',
53
+ responseHeaders: [
54
+ owner_1.HTTP_HEADER.objSegmentsLength, owner_1.HTTP_HEADER.objVersion,
55
+ owner_1.HTTP_HEADER.objHeaderLength
56
+ ]
57
+ };
58
+ }
59
+ function checkReplyExpectation(rep, obj, headerPresent, expectedSegsBytes) {
60
+ // status
61
+ expect(rep.status).withContext('status for returned bytes').toBe(owner_1.currentObj.SC.okGet);
62
+ // version header
63
+ expect(parseInt(rep.headers.get(owner_1.HTTP_HEADER.objVersion))).withContext('object version must be given in the reply header').toBe(obj.version);
64
+ // object's header length http header
65
+ const headerLen = obj.header.length;
66
+ if (headerPresent) {
67
+ expect(parseInt(rep.headers.get(owner_1.HTTP_HEADER.objHeaderLength))).withContext('object header size must be given in the reply header').toBe(headerLen);
68
+ }
69
+ // segments length header
70
+ const segsLen = (obj.diff ? obj.diff.segsSize : obj.segs.length);
71
+ expect(parseInt(rep.headers.get(owner_1.HTTP_HEADER.objSegmentsLength))).withContext('object segments size must be given in the reply header').toBe(segsLen);
72
+ // check body
73
+ if (headerPresent) {
74
+ expect((0, bytes_equal_1.bytesEqual)(rep.data.subarray(0, headerLen), obj.header)).withContext('reply should have header bytes at the front').toBe(true);
75
+ expect((0, bytes_equal_1.bytesEqual)(rep.data.subarray(headerLen), expectedSegsBytes)).withContext('reply should have proper segments bytes, following header bytes').toBe(true);
76
+ }
77
+ else {
78
+ expect((0, bytes_equal_1.bytesEqual)(rep.data, expectedSegsBytes)).withContext('reply should have proper segments bytes').toBe(true);
79
+ }
80
+ }
81
+ const readSimpleObjVersion = { description };
82
+ exports.specs.push(readSimpleObjVersion);
83
+ readSimpleObjVersion.definition = (setup) => (() => {
84
+ (0, async_jasmine_1.beforeAllAsync)(() => setStage(setup));
85
+ (0, async_jasmine_1.itAsync)('will not work outside of a valid session', async () => {
86
+ const opts = (0, json_copy_1.copy)(reqOpts);
87
+ await (0, requests_1.expectNonAcceptanceOfBadSessionId)(opts);
88
+ });
89
+ (0, async_jasmine_1.itAsync)('fails when object does not exist', async () => {
90
+ const unknownObj = 'unknown-obj';
91
+ const opts = (0, json_copy_1.copy)(reqOpts);
92
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(unknownObj, { ofs: 0 }));
93
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
94
+ expect(rep.status).toBe(owner_1.currentObj.SC.unknownObj);
95
+ });
96
+ (0, async_jasmine_1.itAsync)('will not accept bad parameters', async () => {
97
+ const opts = (0, json_copy_1.copy)(reqOpts);
98
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { ofs: -34 }));
99
+ let rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
100
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
101
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { limit: -34 }));
102
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
103
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
104
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { ofs: 10, limit: 0 }));
105
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
106
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
107
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { header: true, ofs: 10 }));
108
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
109
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
110
+ });
111
+ (0, async_jasmine_1.itAsync)('returns header and all segments', async () => {
112
+ expect(await storageServer.currentObjExists(user.id, obj.objId, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
113
+ const opts = (0, json_copy_1.copy)(reqOpts);
114
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { header: true }));
115
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
116
+ checkReplyExpectation(rep, obj, true, obj.segs);
117
+ });
118
+ (0, async_jasmine_1.itAsync)('returns header without segments', async () => {
119
+ expect(await storageServer.currentObjExists(user.id, obj.objId, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
120
+ const opts = (0, json_copy_1.copy)(reqOpts);
121
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { header: true, limit: 0 }));
122
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
123
+ checkReplyExpectation(rep, obj, true, new Uint8Array(0));
124
+ });
125
+ (0, async_jasmine_1.itAsync)('returns all segments without header', async () => {
126
+ expect(await storageServer.currentObjExists(user.id, obj.objId, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
127
+ const opts = (0, json_copy_1.copy)(reqOpts);
128
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId));
129
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
130
+ checkReplyExpectation(rep, obj, false, obj.segs);
131
+ });
132
+ (0, async_jasmine_1.itAsync)('returns chunk, when offset and limit are given', async () => {
133
+ const opts = (0, json_copy_1.copy)(reqOpts);
134
+ // with non-overflowing limit
135
+ for (let offset = 0; offset <= obj.segs.length; offset += 512) {
136
+ const chunkLen = Math.min(512, obj.segs.length - offset);
137
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { ofs: offset, limit: chunkLen }));
138
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
139
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(offset, offset + chunkLen));
140
+ }
141
+ // with overflowing limit
142
+ const offset = obj.segs.length - 100;
143
+ const requestedLen = 300;
144
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { ofs: offset, limit: requestedLen }));
145
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
146
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(offset));
147
+ });
148
+ (0, async_jasmine_1.itAsync)('reads segments from start, when offset is not given', async () => {
149
+ const opts = (0, json_copy_1.copy)(reqOpts);
150
+ // with non-overflowing length
151
+ const chunkLen = 512;
152
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { limit: chunkLen }));
153
+ let rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
154
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(0, chunkLen));
155
+ // with overflowing length
156
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { limit: obj.segs.length + 300 }));
157
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
158
+ checkReplyExpectation(rep, obj, false, obj.segs);
159
+ });
160
+ (0, async_jasmine_1.itAsync)('reads segments to the end, when limit is not given', async () => {
161
+ const opts = (0, json_copy_1.copy)(reqOpts);
162
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { ofs: 1234 }));
163
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
164
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(1234));
165
+ });
166
+ (0, async_jasmine_1.itAsync)('no-bytes read', async () => {
167
+ const opts = (0, json_copy_1.copy)(reqOpts);
168
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(obj.objId, { ofs: obj.segs.length, limit: 500 }));
169
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
170
+ checkReplyExpectation(rep, obj, false, new Uint8Array(0));
171
+ });
172
+ });
173
+ const diffVer = {
174
+ objId: obj.objId,
175
+ version: obj.version + 1,
176
+ header: (0, random_node_1.bytesSync)(111),
177
+ segs: (0, random_node_1.bytesSync)(1000),
178
+ diff: {
179
+ baseVersion: obj.version,
180
+ segsSize: 2000,
181
+ sections: [
182
+ [0, 25, 500],
183
+ [1, 0, 300],
184
+ [0, 525, 500],
185
+ [1, 300, 700]
186
+ ]
187
+ }
188
+ };
189
+ function combineDiffSegs(baseSegs, diffObj) {
190
+ if (!diffObj.diff) {
191
+ throw new Error(`object has no diff`);
192
+ }
193
+ const combined = Buffer.alloc(diffObj.diff.segsSize);
194
+ let offset = 0;
195
+ for (const s of diffObj.diff.sections) {
196
+ const src = ((s[0] === 0) ? baseSegs : diffObj.segs);
197
+ const chunk = src.subarray(s[1], s[1] + s[2]);
198
+ if (chunk.length !== s[2]) {
199
+ throw new Error('Given DiffInfo incorrectly references chunks of segments');
200
+ }
201
+ combined.set(chunk, offset);
202
+ offset += s[2];
203
+ }
204
+ if (offset !== diffObj.diff.segsSize) {
205
+ throw new Error('Given DiffInfo states incorrect segments length');
206
+ }
207
+ return combined;
208
+ }
209
+ const accessDiffedObjVersion = {
210
+ description: `${description}, access to version, saved as a diff, is the same, as to version saved as a whole`
211
+ };
212
+ exports.specs.push(accessDiffedObjVersion);
213
+ accessDiffedObjVersion.definition = (setup) => (() => {
214
+ (0, async_jasmine_1.beforeAllAsync)(async () => {
215
+ await setStage(setup);
216
+ await (0, _3nstorage_1.saveObj)(user.storageOwnerUrl, sessionId, diffVer.objId, diffVer.version, diffVer);
217
+ reqOpts = {
218
+ url: (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(diffVer.objId, { header: true })),
219
+ method: 'GET',
220
+ sessionId,
221
+ responseType: 'arraybuffer',
222
+ responseHeaders: [
223
+ owner_1.HTTP_HEADER.objSegmentsLength, owner_1.HTTP_HEADER.objVersion,
224
+ owner_1.HTTP_HEADER.objHeaderLength
225
+ ]
226
+ };
227
+ });
228
+ (0, async_jasmine_1.itAsync)('returns header and all segments', async () => {
229
+ expect(await storageServer.currentObjExists(user.id, diffVer.objId, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
230
+ const opts = (0, json_copy_1.copy)(reqOpts);
231
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
232
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(diffVer.objId, { header: true }));
233
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
234
+ checkReplyExpectation(rep, diffVer, true, combinedBytes);
235
+ });
236
+ (0, async_jasmine_1.itAsync)('returns header without segments', async () => {
237
+ expect(await storageServer.currentObjExists(user.id, diffVer.objId, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
238
+ const opts = (0, json_copy_1.copy)(reqOpts);
239
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(diffVer.objId, { header: true, limit: 0 }));
240
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
241
+ checkReplyExpectation(rep, diffVer, true, new Uint8Array(0));
242
+ });
243
+ (0, async_jasmine_1.itAsync)('returns all segments without header', async () => {
244
+ expect(await storageServer.currentObjExists(user.id, diffVer.objId, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
245
+ const opts = (0, json_copy_1.copy)(reqOpts);
246
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
247
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(diffVer.objId));
248
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
249
+ checkReplyExpectation(rep, diffVer, false, combinedBytes);
250
+ });
251
+ (0, async_jasmine_1.itAsync)('returns chunk, when offset and limit are given', async () => {
252
+ const opts = (0, json_copy_1.copy)(reqOpts);
253
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
254
+ // with non-overflowing length
255
+ for (let offset = 0; offset <= diffVer.diff.segsSize; offset += 512) {
256
+ const chunkLen = Math.min(512, diffVer.diff.segsSize - offset);
257
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(diffVer.objId, { ofs: offset, limit: chunkLen }));
258
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
259
+ checkReplyExpectation(rep, diffVer, false, combinedBytes.subarray(offset, offset + chunkLen));
260
+ }
261
+ // with overflowing length
262
+ const offset = combinedBytes.length - 100;
263
+ const requestedLen = 300;
264
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentObj.getReqUrlEnd(diffVer.objId, { ofs: offset, limit: requestedLen }));
265
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
266
+ checkReplyExpectation(rep, diffVer, false, combinedBytes.subarray(offset));
267
+ });
268
+ });
269
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../test-utils';
2
+ export declare const specs: SpecDescribe[];
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016 - 2017, 2025 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const test_utils_1 = require("../test-utils");
21
+ const owner_1 = require("../../../../../lib-common/service-api/3nstorage/owner");
22
+ const async_jasmine_1 = require("../../../../libs-for-tests/async-jasmine");
23
+ const xhr_utils_1 = require("../../../../libs-for-tests/xhr-utils");
24
+ const _3nstorage_1 = require("../../../../libs-for-tests/3nstorage");
25
+ const requests_1 = require("../../../../shared-checks/requests");
26
+ const random_node_1 = require("../../../../../lib-common/random-node");
27
+ const url_1 = require("url");
28
+ const json_copy_1 = require("../../../../libs-for-tests/json-copy");
29
+ const bytes_equal_1 = require("../../../../libs-for-tests/bytes-equal");
30
+ exports.specs = [];
31
+ const description = 'Request to get current root object';
32
+ const obj = {
33
+ objId: null,
34
+ version: 1,
35
+ header: (0, random_node_1.bytesSync)(100),
36
+ segs: (0, random_node_1.bytesSync)(2345)
37
+ };
38
+ let reqOpts;
39
+ let storageServer;
40
+ let user;
41
+ let sessionId;
42
+ async function setStage(setup) {
43
+ storageServer = setup().storageServer;
44
+ user = setup().user;
45
+ await storageServer.restartAndClearStorageFor(user.id);
46
+ sessionId = await (0, test_utils_1.startSession)(user);
47
+ await (0, _3nstorage_1.saveObj)(user.storageOwnerUrl, sessionId, obj.objId, 1, obj);
48
+ reqOpts = {
49
+ url: (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true })),
50
+ method: 'GET',
51
+ sessionId,
52
+ responseType: 'arraybuffer',
53
+ responseHeaders: [
54
+ owner_1.HTTP_HEADER.objSegmentsLength, owner_1.HTTP_HEADER.objVersion,
55
+ owner_1.HTTP_HEADER.objHeaderLength
56
+ ]
57
+ };
58
+ }
59
+ function checkReplyExpectation(rep, obj, headerPresent, expectedSegsBytes) {
60
+ // status
61
+ expect(rep.status).withContext('status for returned bytes').toBe(owner_1.currentRootObj.SC.okGet);
62
+ // version header
63
+ expect(parseInt(rep.headers.get(owner_1.HTTP_HEADER.objVersion))).withContext('object version must be given in the reply header').toBe(obj.version);
64
+ // object's header length http header
65
+ const headerLen = obj.header.length;
66
+ if (headerPresent) {
67
+ expect(parseInt(rep.headers.get(owner_1.HTTP_HEADER.objHeaderLength))).withContext('object header size must be given in the reply header').toBe(headerLen);
68
+ }
69
+ // segments length header
70
+ const segsLen = (obj.diff ? obj.diff.segsSize : obj.segs.length);
71
+ expect(parseInt(rep.headers.get(owner_1.HTTP_HEADER.objSegmentsLength))).withContext('object segments size must be given in the reply header').toBe(segsLen);
72
+ // check body
73
+ if (headerPresent) {
74
+ expect((0, bytes_equal_1.bytesEqual)(rep.data.subarray(0, headerLen), obj.header)).withContext('reply should have header bytes at the front').toBe(true);
75
+ expect((0, bytes_equal_1.bytesEqual)(rep.data.subarray(headerLen), expectedSegsBytes)).withContext('reply should have proper segments bytes, following header bytes').toBe(true);
76
+ }
77
+ else {
78
+ expect((0, bytes_equal_1.bytesEqual)(rep.data, expectedSegsBytes)).withContext('reply should have proper segments bytes').toBe(true);
79
+ }
80
+ }
81
+ const readSimpleObjVersion = { description };
82
+ exports.specs.push(readSimpleObjVersion);
83
+ readSimpleObjVersion.definition = (setup) => (() => {
84
+ (0, async_jasmine_1.beforeAllAsync)(() => setStage(setup));
85
+ (0, async_jasmine_1.itAsync)('will not work outside of a valid session', async () => {
86
+ const opts = (0, json_copy_1.copy)(reqOpts);
87
+ await (0, requests_1.expectNonAcceptanceOfBadSessionId)(opts);
88
+ });
89
+ (0, async_jasmine_1.itAsync)('will not accept bad parameters', async () => {
90
+ const opts = (0, json_copy_1.copy)(reqOpts);
91
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: -34 }));
92
+ let rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
93
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
94
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ limit: -34 }));
95
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
96
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
97
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: 10, limit: 0 }));
98
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
99
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
100
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true, ofs: 10 }));
101
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
102
+ expect(rep.status).toBe(owner_1.ERR_SC.malformed);
103
+ });
104
+ (0, async_jasmine_1.itAsync)('returns header and all segments', async () => {
105
+ expect(await storageServer.currentRootObjExists(user.id, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
106
+ const opts = (0, json_copy_1.copy)(reqOpts);
107
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true }));
108
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
109
+ checkReplyExpectation(rep, obj, true, obj.segs);
110
+ });
111
+ (0, async_jasmine_1.itAsync)('returns header without segments', async () => {
112
+ expect(await storageServer.currentRootObjExists(user.id, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
113
+ const opts = (0, json_copy_1.copy)(reqOpts);
114
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true, limit: 0 }));
115
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
116
+ checkReplyExpectation(rep, obj, true, new Uint8Array(0));
117
+ });
118
+ (0, async_jasmine_1.itAsync)('returns all segments without header', async () => {
119
+ expect(await storageServer.currentRootObjExists(user.id, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
120
+ const opts = (0, json_copy_1.copy)(reqOpts);
121
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd());
122
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
123
+ checkReplyExpectation(rep, obj, false, obj.segs);
124
+ });
125
+ (0, async_jasmine_1.itAsync)('returns chunk, when offset and limit are given', async () => {
126
+ const opts = (0, json_copy_1.copy)(reqOpts);
127
+ // with non-overflowing limit
128
+ for (let offset = 0; offset <= obj.segs.length; offset += 512) {
129
+ const chunkLen = Math.min(512, obj.segs.length - offset);
130
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: offset, limit: chunkLen }));
131
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
132
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(offset, offset + chunkLen));
133
+ }
134
+ // with overflowing limit
135
+ const offset = obj.segs.length - 100;
136
+ const requestedLen = 300;
137
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: offset, limit: requestedLen }));
138
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
139
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(offset));
140
+ });
141
+ (0, async_jasmine_1.itAsync)('reads segments from start, when offset is not given', async () => {
142
+ const opts = (0, json_copy_1.copy)(reqOpts);
143
+ // with non-overflowing length
144
+ const chunkLen = 512;
145
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ limit: chunkLen }));
146
+ let rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
147
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(0, chunkLen));
148
+ // with overflowing length
149
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ limit: obj.segs.length + 300 }));
150
+ rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
151
+ checkReplyExpectation(rep, obj, false, obj.segs);
152
+ });
153
+ (0, async_jasmine_1.itAsync)('reads segments to the end, when limit is not given', async () => {
154
+ const opts = (0, json_copy_1.copy)(reqOpts);
155
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: 1234 }));
156
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
157
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(1234));
158
+ });
159
+ (0, async_jasmine_1.itAsync)('no-bytes read', async () => {
160
+ const opts = (0, json_copy_1.copy)(reqOpts);
161
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: obj.segs.length, limit: 500 }));
162
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
163
+ checkReplyExpectation(rep, obj, false, new Uint8Array(0));
164
+ });
165
+ });
166
+ const diffVer = {
167
+ objId: null,
168
+ version: obj.version + 1,
169
+ header: (0, random_node_1.bytesSync)(111),
170
+ segs: (0, random_node_1.bytesSync)(1000),
171
+ diff: {
172
+ baseVersion: obj.version,
173
+ segsSize: 2000,
174
+ sections: [
175
+ [0, 25, 500],
176
+ [1, 0, 300],
177
+ [0, 525, 500],
178
+ [1, 300, 700]
179
+ ]
180
+ }
181
+ };
182
+ function combineDiffSegs(baseSegs, diffObj) {
183
+ if (!diffObj.diff) {
184
+ throw new Error(`object has no diff`);
185
+ }
186
+ const combined = Buffer.alloc(diffObj.diff.segsSize);
187
+ let offset = 0;
188
+ for (const s of diffObj.diff.sections) {
189
+ const src = ((s[0] === 0) ? baseSegs : diffObj.segs);
190
+ const chunk = src.subarray(s[1], s[1] + s[2]);
191
+ if (chunk.length !== s[2]) {
192
+ throw new Error('Given DiffInfo incorrectly references chunks of segments');
193
+ }
194
+ combined.set(chunk, offset);
195
+ offset += s[2];
196
+ }
197
+ if (offset !== diffObj.diff.segsSize) {
198
+ throw new Error('Given DiffInfo states incorrect segments length');
199
+ }
200
+ return combined;
201
+ }
202
+ const accessDiffedObjVersion = {
203
+ description: `${description}, access to version, saved as a diff, is the same, as to version saved as a whole`
204
+ };
205
+ exports.specs.push(accessDiffedObjVersion);
206
+ accessDiffedObjVersion.definition = (setup) => (() => {
207
+ (0, async_jasmine_1.beforeAllAsync)(async () => {
208
+ await setStage(setup);
209
+ await (0, _3nstorage_1.saveObj)(user.storageOwnerUrl, sessionId, diffVer.objId, diffVer.version, diffVer);
210
+ reqOpts = {
211
+ url: (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true })),
212
+ method: 'GET',
213
+ sessionId,
214
+ responseType: 'arraybuffer',
215
+ responseHeaders: [
216
+ owner_1.HTTP_HEADER.objSegmentsLength, owner_1.HTTP_HEADER.objVersion,
217
+ owner_1.HTTP_HEADER.objHeaderLength
218
+ ]
219
+ };
220
+ });
221
+ (0, async_jasmine_1.itAsync)('returns header and all segments', async () => {
222
+ expect(await storageServer.currentRootObjExists(user.id, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
223
+ const opts = (0, json_copy_1.copy)(reqOpts);
224
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
225
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true }));
226
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
227
+ checkReplyExpectation(rep, diffVer, true, combinedBytes);
228
+ });
229
+ (0, async_jasmine_1.itAsync)('returns header without segments', async () => {
230
+ expect(await storageServer.currentRootObjExists(user.id, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
231
+ const opts = (0, json_copy_1.copy)(reqOpts);
232
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ header: true, limit: 0 }));
233
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
234
+ checkReplyExpectation(rep, diffVer, true, new Uint8Array(0));
235
+ });
236
+ (0, async_jasmine_1.itAsync)('returns all segments without header', async () => {
237
+ expect(await storageServer.currentRootObjExists(user.id, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
238
+ const opts = (0, json_copy_1.copy)(reqOpts);
239
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
240
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd());
241
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
242
+ checkReplyExpectation(rep, diffVer, false, combinedBytes);
243
+ });
244
+ (0, async_jasmine_1.itAsync)('returns chunk, when offset and limit are given', async () => {
245
+ const opts = (0, json_copy_1.copy)(reqOpts);
246
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
247
+ // with non-overflowing length
248
+ for (let offset = 0; offset <= diffVer.diff.segsSize; offset += 512) {
249
+ const chunkLen = Math.min(512, diffVer.diff.segsSize - offset);
250
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: offset, limit: chunkLen }));
251
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
252
+ checkReplyExpectation(rep, diffVer, false, combinedBytes.subarray(offset, offset + chunkLen));
253
+ }
254
+ // with overflowing length
255
+ const offset = combinedBytes.length - 100;
256
+ const requestedLen = 300;
257
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.currentRootObj.getReqUrlEnd({ ofs: offset, limit: requestedLen }));
258
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
259
+ checkReplyExpectation(rep, diffVer, false, combinedBytes.subarray(offset));
260
+ });
261
+ });
262
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../test-utils';
2
+ export declare const specs: SpecDescribe;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2022 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.specs = void 0;
20
+ const test_utils_1 = require("../test-utils");
21
+ const owner_1 = require("../../../../../lib-common/service-api/3nstorage/owner");
22
+ const async_jasmine_1 = require("../../../../libs-for-tests/async-jasmine");
23
+ const xhr_utils_1 = require("../../../../libs-for-tests/xhr-utils");
24
+ const _3nstorage_1 = require("../../../../libs-for-tests/3nstorage");
25
+ const requests_1 = require("../../../../shared-checks/requests");
26
+ const random_node_1 = require("../../../../../lib-common/random-node");
27
+ const url_1 = require("url");
28
+ const json_copy_1 = require("../../../../libs-for-tests/json-copy");
29
+ exports.specs = {
30
+ description: `Request to list object's archived versions`
31
+ };
32
+ const obj = {
33
+ objId: 'aaaa',
34
+ version: 1,
35
+ header: (0, random_node_1.bytesSync)(100),
36
+ segs: (0, random_node_1.bytesSync)(573)
37
+ };
38
+ exports.specs.definition = (setup) => (() => {
39
+ let reqOpts;
40
+ let storageServer;
41
+ let user;
42
+ let sessionId;
43
+ (0, async_jasmine_1.beforeAllAsync)(async () => {
44
+ storageServer = setup().storageServer;
45
+ user = setup().user;
46
+ await storageServer.restartAndClearStorageFor(user.id);
47
+ sessionId = await (0, test_utils_1.startSession)(user);
48
+ reqOpts = {
49
+ url: (0, url_1.resolve)(user.storageOwnerUrl, owner_1.objStatus.getReqUrlEnd(obj.objId)),
50
+ method: 'GET',
51
+ responseType: 'json',
52
+ sessionId
53
+ };
54
+ });
55
+ (0, async_jasmine_1.itAsync)('will not work outside of a valid session', async () => {
56
+ const opts = (0, json_copy_1.copy)(reqOpts);
57
+ await (0, requests_1.expectNonAcceptanceOfBadSessionId)(opts);
58
+ });
59
+ (0, async_jasmine_1.itAsync)('fails when object does not exist', async () => {
60
+ const unknownObj = 'unknown-obj';
61
+ const opts = (0, json_copy_1.copy)(reqOpts);
62
+ opts.url = (0, url_1.resolve)(user.storageOwnerUrl, owner_1.objStatus.getReqUrlEnd(unknownObj));
63
+ const rep = await (0, xhr_utils_1.doBodylessRequest)(opts);
64
+ expect(rep.status).toBe(owner_1.objStatus.SC.unknownObj);
65
+ });
66
+ (0, async_jasmine_1.itAsync)(`shows obj status with versions' info`, async () => {
67
+ await (0, _3nstorage_1.saveObj)(user.storageOwnerUrl, sessionId, obj.objId, 1, obj);
68
+ let rep = await (0, xhr_utils_1.doBodylessRequest)(reqOpts);
69
+ expect(rep.status).toBe(owner_1.objStatus.SC.ok);
70
+ expect(rep.data.current).toBe(1);
71
+ expect(rep.data.archived).toBeUndefined();
72
+ await (0, test_utils_1.archiveObjVer)(user, obj.objId, 1, sessionId);
73
+ rep = await (0, xhr_utils_1.doBodylessRequest)(reqOpts);
74
+ expect(rep.status).toBe(owner_1.objStatus.SC.ok);
75
+ expect(rep.data.current).toBe(1);
76
+ expect(rep.data.archived).toContain(1);
77
+ });
78
+ });
79
+ Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ import { SpecDescribe } from '../test-utils';
2
+ export declare const specs: SpecDescribe;