spec-3nweb-server 1.8.5 → 1.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) 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/mock/tls-options.js +46 -44
  6. package/build/tests/admin-proto/signup.d.ts +1 -0
  7. package/build/tests/admin-proto/signup.js +235 -0
  8. package/build/tests/jasmine.d.ts +1 -0
  9. package/build/tests/jasmine.js +32 -0
  10. package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
  11. package/build/tests/libs-for-tests/3nstorage.js +123 -0
  12. package/build/tests/libs-for-tests/asmail.d.ts +22 -0
  13. package/build/tests/libs-for-tests/asmail.js +179 -0
  14. package/build/tests/libs-for-tests/assert.d.ts +1 -0
  15. package/build/tests/libs-for-tests/assert.js +26 -0
  16. package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
  17. package/build/tests/libs-for-tests/async-jasmine.js +77 -0
  18. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  19. package/build/tests/libs-for-tests/bytes-equal.js +34 -0
  20. package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
  21. package/build/tests/libs-for-tests/json-copy.js +45 -0
  22. package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
  23. package/build/tests/libs-for-tests/json-equal.js +67 -0
  24. package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
  25. package/build/tests/libs-for-tests/mailerid.js +114 -0
  26. package/build/tests/libs-for-tests/pkl.d.ts +28 -0
  27. package/build/tests/libs-for-tests/pkl.js +89 -0
  28. package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
  29. package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
  30. package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
  31. package/build/tests/libs-for-tests/server-components/admin.js +43 -0
  32. package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
  33. package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
  34. package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
  35. package/build/tests/libs-for-tests/server-components/component.js +77 -0
  36. package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
  37. package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
  38. package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
  39. package/build/tests/libs-for-tests/server-runner.js +69 -0
  40. package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
  41. package/build/tests/libs-for-tests/spec-assembly.js +55 -0
  42. package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
  43. package/build/tests/libs-for-tests/ws-utils.js +59 -0
  44. package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
  45. package/build/tests/libs-for-tests/xhr-utils.js +154 -0
  46. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
  47. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
  48. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
  49. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
  50. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
  51. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
  52. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
  53. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
  54. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
  55. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
  56. package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
  57. package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
  58. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
  59. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
  60. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
  61. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
  62. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
  63. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
  64. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
  65. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
  66. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
  67. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
  68. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
  69. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
  70. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
  71. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
  72. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
  73. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
  74. package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
  75. package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
  76. package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
  77. package/build/tests/protocols/3nstorage/owner.js +138 -0
  78. package/build/tests/protocols/asmail/config.d.ts +1 -0
  79. package/build/tests/protocols/asmail/config.js +117 -0
  80. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
  81. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
  82. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
  83. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
  84. package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
  85. package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
  86. package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
  87. package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
  88. package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
  89. package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
  90. package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
  91. package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
  92. package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
  93. package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
  94. package/build/tests/protocols/asmail/delivery.d.ts +1 -0
  95. package/build/tests/protocols/asmail/delivery.js +46 -0
  96. package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
  97. package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
  98. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
  99. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
  100. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
  101. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
  102. package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
  103. package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
  104. package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
  105. package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
  106. package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
  107. package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
  108. package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
  109. package/build/tests/protocols/asmail/retrieval.js +92 -0
  110. package/build/tests/protocols/mailerid.d.ts +1 -0
  111. package/build/tests/protocols/mailerid.js +210 -0
  112. package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
  113. package/build/tests/shared-checks/check-mid-login.js +131 -0
  114. package/build/tests/shared-checks/requests.d.ts +20 -0
  115. package/build/tests/shared-checks/requests.js +123 -0
  116. package/package.json +1 -1
  117. package/packing/create-deb.sh +57 -0
  118. package/packing/deb/lib/systemd/system/3nweb.service +11 -0
  119. package/packing/deb/postinst +44 -0
  120. package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
  121. package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
  122. package/publish-task.sh +10 -0
  123. package/push-to-github.sh +105 -0
  124. package/ts-code/3nstorage/3nstorage-app.ts +99 -0
  125. package/ts-code/3nstorage/owner.ts +178 -0
  126. package/ts-code/3nstorage/resources/sessions.ts +37 -0
  127. package/ts-code/3nstorage/resources/store.ts +896 -0
  128. package/ts-code/3nstorage/resources/users.ts +258 -0
  129. package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +73 -0
  130. package/ts-code/3nstorage/routes/owner/cancel-trans.ts +58 -0
  131. package/ts-code/3nstorage/routes/owner/delete-obj.ts +103 -0
  132. package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +111 -0
  133. package/ts-code/3nstorage/routes/owner/get-current-obj.ts +122 -0
  134. package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
  135. package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
  136. package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
  137. package/ts-code/3nstorage/routes/owner/put-current-obj.ts +284 -0
  138. package/ts-code/3nstorage/routes/owner/session-params.ts +49 -0
  139. package/ts-code/3nstorage/shared.ts +43 -0
  140. package/ts-code/asmail/asmail-app.ts +91 -0
  141. package/ts-code/asmail/config.ts +96 -0
  142. package/ts-code/asmail/delivery.ts +94 -0
  143. package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
  144. package/ts-code/asmail/resources/inbox.ts +696 -0
  145. package/ts-code/asmail/resources/recipients.ts +495 -0
  146. package/ts-code/asmail/resources/sessions.ts +37 -0
  147. package/ts-code/asmail/retrieval.ts +96 -0
  148. package/ts-code/asmail/routes/config/param-getter.ts +49 -0
  149. package/ts-code/asmail/routes/config/param-setter.ts +49 -0
  150. package/ts-code/asmail/routes/delivery/finalize-delivery.ts +50 -0
  151. package/ts-code/asmail/routes/delivery/pre-flight.ts +132 -0
  152. package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
  153. package/ts-code/asmail/routes/delivery/put-metadata.ts +94 -0
  154. package/ts-code/asmail/routes/delivery/put-obj.ts +166 -0
  155. package/ts-code/asmail/routes/delivery/restart-session.ts +130 -0
  156. package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
  157. package/ts-code/asmail/routes/delivery/start-session.ts +151 -0
  158. package/ts-code/asmail/routes/retrieval/get-message-meta.ts +53 -0
  159. package/ts-code/asmail/routes/retrieval/get-message-obj.ts +109 -0
  160. package/ts-code/asmail/routes/retrieval/list-messages.ts +70 -0
  161. package/ts-code/asmail/routes/retrieval/remove-message.ts +47 -0
  162. package/ts-code/cli/index.ts +82 -0
  163. package/ts-code/cli/run-cmd.ts +81 -0
  164. package/ts-code/cli/show-sample-config.ts +78 -0
  165. package/ts-code/cli/signup-cmd.ts +229 -0
  166. package/ts-code/cli/user-cmd.ts +68 -0
  167. package/ts-code/cli/utils.ts +105 -0
  168. package/ts-code/config/default-confs.ts +22 -0
  169. package/ts-code/config/from-yaml.ts +35 -0
  170. package/ts-code/config/letsencrypt.ts +77 -0
  171. package/ts-code/config/signup.ts +137 -0
  172. package/ts-code/lib-common/admin-api/signup.ts +120 -0
  173. package/ts-code/lib-common/assert.ts +22 -0
  174. package/ts-code/lib-common/async-fs-node.ts +656 -0
  175. package/ts-code/lib-common/buffer-utils.ts +124 -0
  176. package/ts-code/lib-common/byte-streaming/common.ts +166 -0
  177. package/ts-code/lib-common/bytes-equal.ts +25 -0
  178. package/ts-code/lib-common/canonical-address.ts +92 -0
  179. package/ts-code/lib-common/exceptions/error.ts +44 -0
  180. package/ts-code/lib-common/exceptions/file.ts +84 -0
  181. package/ts-code/lib-common/exceptions/http.ts +69 -0
  182. package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
  183. package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
  184. package/ts-code/lib-common/json-equal.ts +55 -0
  185. package/ts-code/lib-common/json-utils.ts +130 -0
  186. package/ts-code/lib-common/jwkeys.ts +246 -0
  187. package/ts-code/lib-common/map-of-sets.ts +60 -0
  188. package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
  189. package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
  190. package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
  191. package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
  192. package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
  193. package/ts-code/lib-common/processes.ts +501 -0
  194. package/ts-code/lib-common/random-node.ts +79 -0
  195. package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
  196. package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
  197. package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
  198. package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
  199. package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
  200. package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
  201. package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
  202. package/ts-code/lib-common/service-api/locker.ts +44 -0
  203. package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
  204. package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
  205. package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
  206. package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
  207. package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
  208. package/ts-code/lib-common/session-encryptor.ts +54 -0
  209. package/ts-code/lib-common/time-window-cache.ts +74 -0
  210. package/ts-code/lib-common/transferable.d.ts +30 -0
  211. package/ts-code/lib-server/conf-util.ts +35 -0
  212. package/ts-code/lib-server/mid-access.ts +45 -0
  213. package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
  214. package/ts-code/lib-server/middleware/error-handler.ts +79 -0
  215. package/ts-code/lib-server/pkl-access.ts +46 -0
  216. package/ts-code/lib-server/resources/dns.ts +151 -0
  217. package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
  218. package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
  219. package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
  220. package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
  221. package/ts-code/lib-server/resources/sessions.ts +232 -0
  222. package/ts-code/lib-server/resources/user-files.ts +147 -0
  223. package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
  224. package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
  225. package/ts-code/lib-server/routes/sessions/close.ts +27 -0
  226. package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
  227. package/ts-code/lib-server/routes/sessions/start.ts +116 -0
  228. package/ts-code/lib-server/web-sockets/app.ts +339 -0
  229. package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
  230. package/ts-code/lib.ts +29 -0
  231. package/ts-code/locker/locker-app.ts +60 -0
  232. package/ts-code/locker/resources/lockers.ts +17 -0
  233. package/ts-code/locker/resources/sessions.ts +37 -0
  234. package/ts-code/locker/routes/create-locker.ts +47 -0
  235. package/ts-code/mailerId/mailerId-app.ts +107 -0
  236. package/ts-code/mailerId/resources/certifier.ts +181 -0
  237. package/ts-code/mailerId/resources/sessions.ts +44 -0
  238. package/ts-code/mailerId/resources/users.ts +88 -0
  239. package/ts-code/mailerId/routes/certify.ts +68 -0
  240. package/ts-code/main.ts +304 -0
  241. package/ts-code/mock/dns.ts +106 -0
  242. package/ts-code/mock/mock-as-child-proc.ts +130 -0
  243. package/ts-code/mock/node-child-ipc.ts +69 -0
  244. package/ts-code/mock/run-in-proc.ts +111 -0
  245. package/ts-code/mock/tls-options.ts +73 -0
  246. package/ts-code/services.ts +138 -0
  247. package/ts-code/signup/resources/users.ts +429 -0
  248. package/ts-code/signup/routes/add.ts +65 -0
  249. package/ts-code/signup/routes/get-available-addresses.ts +49 -0
  250. package/ts-code/signup/routes/get-available-domains.ts +45 -0
  251. package/ts-code/signup/signup-app.ts +54 -0
  252. package/ts-code/signup/signup-tokens.ts +148 -0
  253. package/ts-code/tests/admin-proto/signup.ts +277 -0
  254. package/ts-code/tests/jasmine.ts +37 -0
  255. package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
  256. package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
  257. package/ts-code/tests/libs-for-tests/assert.ts +22 -0
  258. package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
  259. package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
  260. package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
  261. package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
  262. package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
  263. package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
  264. package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
  265. package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
  266. package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
  267. package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
  268. package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
  269. package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
  270. package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
  271. package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
  272. package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
  273. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
  274. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
  275. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
  276. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
  277. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
  278. package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
  279. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
  280. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
  281. package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
  282. package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
  283. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
  284. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
  285. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
  286. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
  287. package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
  288. package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
  289. package/ts-code/tests/protocols/asmail/config.ts +172 -0
  290. package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
  291. package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
  292. package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
  293. package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
  294. package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
  295. package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
  296. package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
  297. package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
  298. package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
  299. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
  300. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
  301. package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
  302. package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
  303. package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
  304. package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
  305. package/ts-code/tests/protocols/mailerid.ts +271 -0
  306. package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
  307. package/ts-code/tests/shared-checks/requests.ts +135 -0
  308. package/ts-code/tsconfig.json +11 -0
  309. package/ts-code/web3n.d.ts +1068 -0
@@ -0,0 +1,84 @@
1
+ /*
2
+ Copyright (C) 2016 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 { startSession, SpecDescribe, TestSetup, User, StorageComponent } from '../test-utils';
19
+ import { currentObj as api } from '../../../../../lib-common/service-api/3nstorage/owner';
20
+ import { beforeAllAsync, itAsync, xitAsync } from '../../../../libs-for-tests/async-jasmine';
21
+ import { RequestOpts, doBodylessRequest } from '../../../../libs-for-tests/xhr-utils';
22
+ import { Obj, saveObj } from '../../../../libs-for-tests/3nstorage';
23
+ import { expectNonAcceptanceOfBadSessionId } from '../../../../shared-checks/requests';
24
+ import { bytesSync as randomBytes } from '../../../../../lib-common/random-node';
25
+ import { resolve as resolveUrl } from 'url';
26
+ import { copy } from '../../../../libs-for-tests/json-copy';
27
+
28
+ export const specs: SpecDescribe = {
29
+ description: 'Request to delete object\'s current version'
30
+ };
31
+
32
+ const obj: Obj = {
33
+ objId: 'aaaa',
34
+ version: 1,
35
+ header: randomBytes(100),
36
+ segs: randomBytes(573)
37
+ };
38
+
39
+ specs.definition = (setup: () => TestSetup) => (() => {
40
+
41
+ let reqOpts: RequestOpts
42
+ let storageServer: StorageComponent;
43
+ let user: User;
44
+ let sessionId: string;
45
+
46
+ beforeAllAsync(async () => {
47
+ storageServer = setup().storageServer;
48
+ user = setup().user;
49
+ await storageServer.restartAndClearStorageFor(user.id);
50
+ sessionId = await startSession(user);
51
+ reqOpts = {
52
+ url: resolveUrl(user.storageOwnerUrl, api.delReqUrlEnd(obj.objId)),
53
+ method: 'DELETE',
54
+ sessionId
55
+ };
56
+ });
57
+
58
+ itAsync('fails when object does not exist', async () => {
59
+ const unknownObj = 'unknown-obj';
60
+ expect(await storageServer.currentObjExists(user.id, unknownObj)).toBeFalsy();
61
+ const opts = copy(reqOpts);
62
+ opts.url = resolveUrl(user.storageOwnerUrl, api.delReqUrlEnd(unknownObj));
63
+ const rep = await doBodylessRequest(opts);
64
+ expect(rep.status).toBe(api.SC.unknownObj);
65
+ });
66
+
67
+ itAsync('does remove it', async () => {
68
+ await saveObj(user.storageOwnerUrl, sessionId, obj.objId, 1, obj);
69
+ expect(await storageServer.currentObjExists(user.id, obj.objId)).toBeTruthy();
70
+ const rep = await doBodylessRequest(reqOpts);
71
+ expect(rep.status).toBe(api.SC.okDelete);
72
+ expect(await storageServer.currentObjExists(user.id, obj.objId)).toBeFalsy();
73
+ });
74
+
75
+ xitAsync('keeps archived versions intact');
76
+
77
+ itAsync('will not work outside of a valid session', async () => {
78
+ const opts = copy(reqOpts);
79
+ await expectNonAcceptanceOfBadSessionId(opts);
80
+ });
81
+
82
+ });
83
+
84
+ Object.freeze(exports);
@@ -0,0 +1,125 @@
1
+ /*
2
+ Copyright (C) 2017, 2025 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 { beforeEachAsync, itAsync } from '../../../../libs-for-tests/async-jasmine';
19
+ import { SpecDescribe, TestSetup, User, startSession, StorageComponent } from '../test-utils';
20
+ import { openSocket } from '../../../../libs-for-tests/ws-utils';
21
+ import { sleep } from '../../../../../lib-common/processes';
22
+ import { makeSubscriber } from '../../../../../lib-common/ipc/ws-ipc';
23
+ import { wsEventChannel as api, ERR_SC, events } from '../../../../../lib-common/service-api/3nstorage/owner';
24
+ import { Obj, saveObj, removeObj } from '../../../../libs-for-tests/3nstorage';
25
+ import { bytesSync as randomBytes } from '../../../../../lib-common/random-node';
26
+ import { Observable } from 'rxjs';
27
+
28
+ export const specs: SpecDescribe = {
29
+ description: `is an event emitter`
30
+ };
31
+
32
+ const obj: Obj = {
33
+ objId: 'aaaa',
34
+ version: 1,
35
+ header: randomBytes(100),
36
+ segs: randomBytes(573)
37
+ };
38
+
39
+ specs.definition = (setup: () => TestSetup) => (() => {
40
+
41
+ let storageServer: StorageComponent;
42
+ let wsUrl: string;
43
+ let user: User;
44
+ let sessionId: string;
45
+
46
+ beforeEachAsync(async () => {
47
+ storageServer = setup().storageServer;
48
+ user = setup().user;
49
+ wsUrl = `wss${user.storageOwnerUrl.substring(5)}${api.URL_END}`;
50
+ sessionId = await startSession(user);
51
+ });
52
+
53
+ itAsync(`requires session to open web socket`, async () => {
54
+
55
+ const rep = await openSocket(wsUrl, 'invalid session id');
56
+ expect(rep.status).withContext('status for missing authorized session').toBe(ERR_SC.needAuth);
57
+
58
+ });
59
+
60
+ itAsync(`emits event on completion of object has new version (1st version is an object creation event)`, async () => {
61
+
62
+ const rep = await openSocket(wsUrl, sessionId);
63
+ expect(rep.status).toBe(api.SC.ok);
64
+
65
+ const eventSrc = makeSubscriber(rep.data, undefined);
66
+
67
+ const eventPromise = (Observable.create(
68
+ obs => eventSrc.subscribe<events.objChanged.Event>(
69
+ events.objChanged.EVENT_NAME, obs
70
+ ))
71
+ )
72
+ .take(2)
73
+ .toArray()
74
+ .toPromise();
75
+
76
+ // give some time for subscription to occur
77
+ await sleep(10);
78
+
79
+ // create first version of an object
80
+ await saveObj(user.storageOwnerUrl, sessionId, obj.objId, 1, obj);
81
+
82
+ // create second version
83
+ await saveObj(user.storageOwnerUrl, sessionId, obj.objId, 2, obj);
84
+
85
+ (await eventPromise).forEach((event, index) => {
86
+ expect(typeof event).toBe('object');
87
+ expect(event.objId).withContext(`object change event should identify the object`).toBe(obj.objId);
88
+ expect(event.newVer).withContext(`event provides new object version`).toBe(index+1);
89
+ });
90
+
91
+ });
92
+
93
+ itAsync(`emits event on object removal, i.e. when current version is removed, even if there may be archived versions present`, async () => {
94
+
95
+ const rep = await openSocket(wsUrl, sessionId);
96
+ expect(rep.status).toBe(api.SC.ok);
97
+
98
+ const eventSrc = makeSubscriber(rep.data, undefined);
99
+
100
+ const eventPromise = (Observable.create(
101
+ obs => eventSrc.subscribe<events.objChanged.Event>(
102
+ events.objRemoved.EVENT_NAME, obs
103
+ ))
104
+ )
105
+ .take(1)
106
+ .toPromise();
107
+
108
+ // give some time for subscription to occur
109
+ await sleep(10);
110
+
111
+ const objId ='bbbb';
112
+
113
+ // create an object
114
+ await saveObj(user.storageOwnerUrl, sessionId, objId, 1, obj);
115
+
116
+ // create second version
117
+ await removeObj(user.storageOwnerUrl, sessionId, objId);
118
+
119
+ const event = await eventPromise;
120
+ expect(typeof event).toBe('object');
121
+ expect(event.objId).withContext(`object removal event should identify the object`).toBe(objId);
122
+
123
+ });
124
+
125
+ });
@@ -0,0 +1,298 @@
1
+ /*
2
+ Copyright (C) 2016 - 2017, 2025 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 { startSession, SpecDescribe, TestSetup, User, StorageComponent } from '../test-utils';
19
+ import { HTTP_HEADER, ERR_SC, currentObj as api } from '../../../../../lib-common/service-api/3nstorage/owner';
20
+ import { beforeAllAsync, itAsync } from '../../../../libs-for-tests/async-jasmine';
21
+ import { RequestOpts, doBodylessRequest, Reply } from '../../../../libs-for-tests/xhr-utils';
22
+ import { Obj, saveObj } from '../../../../libs-for-tests/3nstorage';
23
+ import { expectNonAcceptanceOfBadSessionId } from '../../../../shared-checks/requests';
24
+ import { bytesSync as randomBytes } from '../../../../../lib-common/random-node';
25
+ import { resolve as resolveUrl } from 'url';
26
+ import { copy } from '../../../../libs-for-tests/json-copy';
27
+ import { bytesEqual } from '../../../../libs-for-tests/bytes-equal';
28
+
29
+ export const specs: SpecDescribe[] = [];
30
+
31
+ const description = 'Request to get current non-root object';
32
+
33
+ const obj: Obj = {
34
+ objId: 'aaaa',
35
+ version: 1,
36
+ header: randomBytes(100),
37
+ segs: randomBytes(2345)
38
+ };
39
+
40
+ let reqOpts: RequestOpts
41
+ let storageServer: StorageComponent;
42
+ let user: User;
43
+ let sessionId: string;
44
+
45
+ async function setStage(setup: () => TestSetup): Promise<void> {
46
+ storageServer = setup().storageServer;
47
+ user = setup().user;
48
+ await storageServer.restartAndClearStorageFor(user.id);
49
+ sessionId = await startSession(user);
50
+ await saveObj(user.storageOwnerUrl, sessionId, obj.objId, 1, obj);
51
+ reqOpts = {
52
+ url: resolveUrl(
53
+ user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { header: true })),
54
+ method: 'GET',
55
+ sessionId,
56
+ responseType: 'arraybuffer',
57
+ responseHeaders: [
58
+ HTTP_HEADER.objSegmentsLength, HTTP_HEADER.objVersion,
59
+ HTTP_HEADER.objHeaderLength ]
60
+ };
61
+ }
62
+
63
+ function checkReplyExpectation(
64
+ rep: Reply<Uint8Array>, obj: Obj, headerPresent: boolean,
65
+ expectedSegsBytes: Uint8Array
66
+ ): void {
67
+ // status
68
+ expect(rep.status).withContext('status for returned bytes').toBe(api.SC.okGet);
69
+
70
+ // version header
71
+ expect(parseInt(rep.headers!.get(HTTP_HEADER.objVersion)!)).withContext('object version must be given in the reply header').toBe(obj.version);
72
+
73
+ // object's header length http header
74
+ const headerLen = obj.header.length;
75
+ if (headerPresent) {
76
+ expect(parseInt(rep.headers!.get(HTTP_HEADER.objHeaderLength)!)).withContext('object header size must be given in the reply header').toBe(headerLen);
77
+ }
78
+
79
+ // segments length header
80
+ const segsLen = (obj.diff ? obj.diff.segsSize : obj.segs.length);
81
+ expect(parseInt(rep.headers!.get(HTTP_HEADER.objSegmentsLength)!)).withContext('object segments size must be given in the reply header').toBe(segsLen);
82
+
83
+ // check body
84
+ if (headerPresent) {
85
+ expect(bytesEqual(rep.data.subarray(0, headerLen), obj.header)).withContext('reply should have header bytes at the front').toBe(true);
86
+ expect(bytesEqual(rep.data.subarray(headerLen), expectedSegsBytes)).withContext('reply should have proper segments bytes, following header bytes').toBe(true);
87
+ } else {
88
+ expect(bytesEqual(rep.data, expectedSegsBytes)).withContext('reply should have proper segments bytes').toBe(true);
89
+ }
90
+ }
91
+
92
+ const readSimpleObjVersion: SpecDescribe = { description };
93
+ specs.push(readSimpleObjVersion);
94
+ readSimpleObjVersion.definition = (setup: () => TestSetup) => (() => {
95
+
96
+ beforeAllAsync(() => setStage(setup));
97
+
98
+ itAsync('will not work outside of a valid session', async () => {
99
+ const opts = copy(reqOpts);
100
+ await expectNonAcceptanceOfBadSessionId(opts);
101
+ });
102
+
103
+ itAsync('fails when object does not exist', async () => {
104
+ const unknownObj = 'unknown-obj';
105
+ const opts = copy(reqOpts);
106
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(unknownObj, { ofs: 0 }));
107
+ const rep = await doBodylessRequest<Uint8Array>(opts);
108
+ expect(rep.status).toBe(api.SC.unknownObj);
109
+ });
110
+
111
+ itAsync('will not accept bad parameters', async () => {
112
+ const opts = copy(reqOpts);
113
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { ofs: -34 }));
114
+ let rep = await doBodylessRequest<Uint8Array>(opts);
115
+ expect(rep.status).toBe(ERR_SC.malformed);
116
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { limit: -34 }));
117
+ rep = await doBodylessRequest<Uint8Array>(opts);
118
+ expect(rep.status).toBe(ERR_SC.malformed);
119
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { ofs: 10, limit: 0 }));
120
+ rep = await doBodylessRequest<Uint8Array>(opts);
121
+ expect(rep.status).toBe(ERR_SC.malformed);
122
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { header: true, ofs: 10 }));
123
+ rep = await doBodylessRequest<Uint8Array>(opts);
124
+ expect(rep.status).toBe(ERR_SC.malformed);
125
+ });
126
+
127
+ itAsync('returns header and all segments', async () => {
128
+ expect(await storageServer.currentObjExists(user.id, obj.objId, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
129
+ const opts = copy(reqOpts);
130
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { header: true }));
131
+ const rep = await doBodylessRequest<Uint8Array>(opts);
132
+ checkReplyExpectation(rep, obj, true, obj.segs);
133
+ });
134
+
135
+ itAsync('returns header without segments', async () => {
136
+ expect(await storageServer.currentObjExists(user.id, obj.objId, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
137
+ const opts = copy(reqOpts);
138
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { header: true, limit: 0 }));
139
+ const rep = await doBodylessRequest<Uint8Array>(opts);
140
+ checkReplyExpectation(rep, obj, true, new Uint8Array(0));
141
+ });
142
+
143
+ itAsync('returns all segments without header', async () => {
144
+ expect(await storageServer.currentObjExists(user.id, obj.objId, obj.version, obj)).withContext('object must be in serve\'s store').toBe(true);
145
+ const opts = copy(reqOpts);
146
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId));
147
+ const rep = await doBodylessRequest<Uint8Array>(opts);
148
+ checkReplyExpectation(rep, obj, false, obj.segs);
149
+ });
150
+
151
+ itAsync('returns chunk, when offset and limit are given', async () => {
152
+ const opts = copy(reqOpts);
153
+ // with non-overflowing limit
154
+ for (let offset=0; offset<=obj.segs.length; offset+=512) {
155
+ const chunkLen = Math.min(512, obj.segs.length - offset);
156
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { ofs: offset, limit: chunkLen }));
157
+ const rep = await doBodylessRequest<Uint8Array>(opts);
158
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(offset, offset+chunkLen));
159
+ }
160
+ // with overflowing limit
161
+ const offset = obj.segs.length - 100;
162
+ const requestedLen = 300
163
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { ofs: offset, limit: requestedLen }));
164
+ const rep = await doBodylessRequest<Uint8Array>(opts);
165
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(offset));
166
+ });
167
+
168
+ itAsync('reads segments from start, when offset is not given', async () => {
169
+ const opts = copy(reqOpts);
170
+ // with non-overflowing length
171
+ const chunkLen = 512;
172
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { limit: chunkLen }));
173
+ let rep = await doBodylessRequest<Uint8Array>(opts);
174
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(0, chunkLen));
175
+ // with overflowing length
176
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { limit: obj.segs.length+300 }));
177
+ rep = await doBodylessRequest<Uint8Array>(opts);
178
+ checkReplyExpectation(rep, obj, false, obj.segs);
179
+ });
180
+
181
+ itAsync('reads segments to the end, when limit is not given', async () => {
182
+ const opts = copy(reqOpts);
183
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { ofs: 1234 }));
184
+ const rep = await doBodylessRequest<Uint8Array>(opts);
185
+ checkReplyExpectation(rep, obj, false, obj.segs.subarray(1234));
186
+ });
187
+
188
+ itAsync('no-bytes read', async () => {
189
+ const opts = copy(reqOpts);
190
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(obj.objId, { ofs: obj.segs.length, limit: 500 }));
191
+ const rep = await doBodylessRequest<Uint8Array>(opts);
192
+ checkReplyExpectation(rep, obj, false, new Uint8Array(0));
193
+ });
194
+
195
+ });
196
+
197
+ const diffVer: Obj = {
198
+ objId: obj.objId,
199
+ version: obj.version + 1,
200
+ header: randomBytes(111),
201
+ segs: randomBytes(1000),
202
+ diff: {
203
+ baseVersion: obj.version,
204
+ segsSize: 2000,
205
+ sections: [
206
+ [ 0, 25, 500 ],
207
+ [ 1, 0, 300 ],
208
+ [ 0, 525, 500 ],
209
+ [ 1, 300, 700 ] ]
210
+ }
211
+ };
212
+
213
+ function combineDiffSegs(baseSegs: Uint8Array, diffObj: Obj): Uint8Array {
214
+ if (!diffObj.diff) { throw new Error(`object has no diff`); }
215
+ const combined = Buffer.alloc(diffObj.diff.segsSize);
216
+ let offset = 0;
217
+ for (const s of diffObj.diff.sections) {
218
+ const src = ((s[0] === 0) ? baseSegs : diffObj.segs);
219
+ const chunk = src.subarray(s[1], s[1]+s[2]);
220
+ if (chunk.length !== s[2]) { throw new Error(
221
+ 'Given DiffInfo incorrectly references chunks of segments'); }
222
+ combined.set(chunk, offset);
223
+ offset += s[2];
224
+ }
225
+ if (offset !== diffObj.diff.segsSize) { throw new Error(
226
+ 'Given DiffInfo states incorrect segments length'); }
227
+ return combined;
228
+ }
229
+
230
+ const accessDiffedObjVersion: SpecDescribe = {
231
+ description: `${description}, access to version, saved as a diff, is the same, as to version saved as a whole`
232
+ };
233
+ specs.push(accessDiffedObjVersion);
234
+ accessDiffedObjVersion.definition = (setup: () => TestSetup) => (() => {
235
+
236
+ beforeAllAsync(async () => {
237
+ await setStage(setup);
238
+ await saveObj(
239
+ user.storageOwnerUrl, sessionId,
240
+ diffVer.objId, diffVer.version, diffVer);
241
+ reqOpts = {
242
+ url: resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(diffVer.objId, { header: true })),
243
+ method: 'GET',
244
+ sessionId,
245
+ responseType: 'arraybuffer',
246
+ responseHeaders: [
247
+ HTTP_HEADER.objSegmentsLength, HTTP_HEADER.objVersion,
248
+ HTTP_HEADER.objHeaderLength ]
249
+ };
250
+ });
251
+
252
+ itAsync('returns header and all segments', async () => {
253
+ expect(await storageServer.currentObjExists(user.id, diffVer.objId, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
254
+ const opts = copy(reqOpts);
255
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
256
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(diffVer.objId, { header: true }));
257
+ const rep = await doBodylessRequest<Uint8Array>(opts);
258
+ checkReplyExpectation(rep, diffVer, true, combinedBytes);
259
+ });
260
+
261
+ itAsync('returns header without segments', async () => {
262
+ expect(await storageServer.currentObjExists(user.id, diffVer.objId, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
263
+ const opts = copy(reqOpts);
264
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(diffVer.objId, { header: true, limit: 0 }));
265
+ const rep = await doBodylessRequest<Uint8Array>(opts);
266
+ checkReplyExpectation(rep, diffVer, true, new Uint8Array(0));
267
+ });
268
+
269
+ itAsync('returns all segments without header', async () => {
270
+ expect(await storageServer.currentObjExists(user.id, diffVer.objId, diffVer.version, diffVer)).withContext(`object must be in serve's store`).toBe(true);
271
+ const opts = copy(reqOpts);
272
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
273
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(diffVer.objId));
274
+ const rep = await doBodylessRequest<Uint8Array>(opts);
275
+ checkReplyExpectation(rep, diffVer, false, combinedBytes);
276
+ });
277
+
278
+ itAsync('returns chunk, when offset and limit are given', async () => {
279
+ const opts = copy(reqOpts);
280
+ const combinedBytes = combineDiffSegs(obj.segs, diffVer);
281
+ // with non-overflowing length
282
+ for (let offset=0; offset<=diffVer.diff!.segsSize; offset+=512) {
283
+ const chunkLen = Math.min(512, diffVer.diff!.segsSize - offset);
284
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(diffVer.objId, { ofs: offset, limit: chunkLen }));
285
+ const rep = await doBodylessRequest<Uint8Array>(opts);
286
+ checkReplyExpectation(rep, diffVer, false, combinedBytes.subarray(offset, offset+chunkLen));
287
+ }
288
+ // with overflowing length
289
+ const offset = combinedBytes.length - 100;
290
+ const requestedLen = 300
291
+ opts.url = resolveUrl(user.storageOwnerUrl, api.getReqUrlEnd(diffVer.objId, { ofs: offset, limit: requestedLen }));
292
+ const rep = await doBodylessRequest<Uint8Array>(opts);
293
+ checkReplyExpectation(rep, diffVer, false, combinedBytes.subarray(offset));
294
+ });
295
+
296
+ });
297
+
298
+ Object.freeze(exports);