spec-3nweb-server 1.8.4 → 1.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.gitlab-ci-linux.yml +50 -0
  2. package/.gitlab-ci-mac.yml +29 -0
  3. package/.gitlab-ci-windows.yml +29 -0
  4. package/.gitlab-ci.yml +63 -0
  5. package/build/3nstorage/routes/owner/archive-obj-version.js +2 -2
  6. package/build/3nstorage/routes/owner/cancel-trans.js +2 -2
  7. package/build/3nstorage/routes/owner/delete-obj.js +2 -2
  8. package/build/3nstorage/routes/owner/get-current-obj.js +3 -4
  9. package/build/3nstorage/routes/owner/param-setter.js +2 -6
  10. package/build/asmail/routes/config/param-setter.js +2 -2
  11. package/build/asmail/routes/delivery/finalize-delivery.js +2 -2
  12. package/build/asmail/routes/delivery/put-obj.js +2 -2
  13. package/build/asmail/routes/delivery/sender-authorization.js +2 -2
  14. package/build/asmail/routes/retrieval/remove-message.js +2 -2
  15. package/build/cli/signup-cmd.js +0 -1
  16. package/build/lib-server/routes/sessions/close.js +2 -2
  17. package/build/lib-server/routes/sessions/mid-auth.js +2 -5
  18. package/build/main.js +12 -15
  19. package/build/mock/tls-options.js +46 -44
  20. package/build/signup/routes/add.js +4 -4
  21. package/build/tests/admin-proto/signup.d.ts +1 -0
  22. package/build/tests/admin-proto/signup.js +235 -0
  23. package/build/tests/jasmine.d.ts +1 -0
  24. package/build/tests/jasmine.js +32 -0
  25. package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
  26. package/build/tests/libs-for-tests/3nstorage.js +123 -0
  27. package/build/tests/libs-for-tests/asmail.d.ts +22 -0
  28. package/build/tests/libs-for-tests/asmail.js +179 -0
  29. package/build/tests/libs-for-tests/assert.d.ts +1 -0
  30. package/build/tests/libs-for-tests/assert.js +26 -0
  31. package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
  32. package/build/tests/libs-for-tests/async-jasmine.js +77 -0
  33. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  34. package/build/tests/libs-for-tests/bytes-equal.js +34 -0
  35. package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
  36. package/build/tests/libs-for-tests/json-copy.js +45 -0
  37. package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
  38. package/build/tests/libs-for-tests/json-equal.js +67 -0
  39. package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
  40. package/build/tests/libs-for-tests/mailerid.js +114 -0
  41. package/build/tests/libs-for-tests/pkl.d.ts +28 -0
  42. package/build/tests/libs-for-tests/pkl.js +89 -0
  43. package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
  44. package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
  45. package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
  46. package/build/tests/libs-for-tests/server-components/admin.js +43 -0
  47. package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
  48. package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
  49. package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
  50. package/build/tests/libs-for-tests/server-components/component.js +77 -0
  51. package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
  52. package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
  53. package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
  54. package/build/tests/libs-for-tests/server-runner.js +69 -0
  55. package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
  56. package/build/tests/libs-for-tests/spec-assembly.js +55 -0
  57. package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
  58. package/build/tests/libs-for-tests/ws-utils.js +59 -0
  59. package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
  60. package/build/tests/libs-for-tests/xhr-utils.js +154 -0
  61. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
  62. package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
  63. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
  64. package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
  65. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
  66. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
  67. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
  68. package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
  69. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
  70. package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
  71. package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
  72. package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
  73. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
  74. package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
  75. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
  76. package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
  77. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
  78. package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
  79. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
  80. package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
  81. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
  82. package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
  83. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
  84. package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
  85. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
  86. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
  87. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
  88. package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
  89. package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
  90. package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
  91. package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
  92. package/build/tests/protocols/3nstorage/owner.js +138 -0
  93. package/build/tests/protocols/asmail/config.d.ts +1 -0
  94. package/build/tests/protocols/asmail/config.js +117 -0
  95. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
  96. package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
  97. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
  98. package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
  99. package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
  100. package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
  101. package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
  102. package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
  103. package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
  104. package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
  105. package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
  106. package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
  107. package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
  108. package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
  109. package/build/tests/protocols/asmail/delivery.d.ts +1 -0
  110. package/build/tests/protocols/asmail/delivery.js +46 -0
  111. package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
  112. package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
  113. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
  114. package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
  115. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
  116. package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
  117. package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
  118. package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
  119. package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
  120. package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
  121. package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
  122. package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
  123. package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
  124. package/build/tests/protocols/asmail/retrieval.js +92 -0
  125. package/build/tests/protocols/mailerid.d.ts +1 -0
  126. package/build/tests/protocols/mailerid.js +210 -0
  127. package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
  128. package/build/tests/shared-checks/check-mid-login.js +131 -0
  129. package/build/tests/shared-checks/requests.d.ts +20 -0
  130. package/build/tests/shared-checks/requests.js +123 -0
  131. package/package.json +1 -1
  132. package/packing/create-deb.sh +57 -0
  133. package/packing/deb/lib/systemd/system/3nweb.service +11 -0
  134. package/packing/deb/postinst +44 -0
  135. package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
  136. package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
  137. package/publish-task.sh +10 -0
  138. package/push-to-github.sh +105 -0
  139. package/ts-code/3nstorage/3nstorage-app.ts +99 -0
  140. package/ts-code/3nstorage/owner.ts +178 -0
  141. package/ts-code/3nstorage/resources/sessions.ts +37 -0
  142. package/ts-code/3nstorage/resources/store.ts +896 -0
  143. package/ts-code/3nstorage/resources/users.ts +258 -0
  144. package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +73 -0
  145. package/ts-code/3nstorage/routes/owner/cancel-trans.ts +58 -0
  146. package/ts-code/3nstorage/routes/owner/delete-obj.ts +103 -0
  147. package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +111 -0
  148. package/ts-code/3nstorage/routes/owner/get-current-obj.ts +122 -0
  149. package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
  150. package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
  151. package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
  152. package/ts-code/3nstorage/routes/owner/put-current-obj.ts +284 -0
  153. package/ts-code/3nstorage/routes/owner/session-params.ts +49 -0
  154. package/ts-code/3nstorage/shared.ts +43 -0
  155. package/ts-code/asmail/asmail-app.ts +91 -0
  156. package/ts-code/asmail/config.ts +96 -0
  157. package/ts-code/asmail/delivery.ts +94 -0
  158. package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
  159. package/ts-code/asmail/resources/inbox.ts +696 -0
  160. package/ts-code/asmail/resources/recipients.ts +495 -0
  161. package/ts-code/asmail/resources/sessions.ts +37 -0
  162. package/ts-code/asmail/retrieval.ts +96 -0
  163. package/ts-code/asmail/routes/config/param-getter.ts +49 -0
  164. package/ts-code/asmail/routes/config/param-setter.ts +49 -0
  165. package/ts-code/asmail/routes/delivery/finalize-delivery.ts +50 -0
  166. package/ts-code/asmail/routes/delivery/pre-flight.ts +132 -0
  167. package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
  168. package/ts-code/asmail/routes/delivery/put-metadata.ts +94 -0
  169. package/ts-code/asmail/routes/delivery/put-obj.ts +166 -0
  170. package/ts-code/asmail/routes/delivery/restart-session.ts +130 -0
  171. package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
  172. package/ts-code/asmail/routes/delivery/start-session.ts +151 -0
  173. package/ts-code/asmail/routes/retrieval/get-message-meta.ts +53 -0
  174. package/ts-code/asmail/routes/retrieval/get-message-obj.ts +109 -0
  175. package/ts-code/asmail/routes/retrieval/list-messages.ts +70 -0
  176. package/ts-code/asmail/routes/retrieval/remove-message.ts +47 -0
  177. package/ts-code/cli/index.ts +82 -0
  178. package/ts-code/cli/run-cmd.ts +81 -0
  179. package/ts-code/cli/show-sample-config.ts +78 -0
  180. package/ts-code/cli/signup-cmd.ts +229 -0
  181. package/ts-code/cli/user-cmd.ts +68 -0
  182. package/ts-code/cli/utils.ts +105 -0
  183. package/ts-code/config/default-confs.ts +22 -0
  184. package/ts-code/config/from-yaml.ts +35 -0
  185. package/ts-code/config/letsencrypt.ts +77 -0
  186. package/ts-code/config/signup.ts +137 -0
  187. package/ts-code/lib-common/admin-api/signup.ts +120 -0
  188. package/ts-code/lib-common/assert.ts +22 -0
  189. package/ts-code/lib-common/async-fs-node.ts +656 -0
  190. package/ts-code/lib-common/buffer-utils.ts +124 -0
  191. package/ts-code/lib-common/byte-streaming/common.ts +166 -0
  192. package/ts-code/lib-common/bytes-equal.ts +25 -0
  193. package/ts-code/lib-common/canonical-address.ts +92 -0
  194. package/ts-code/lib-common/exceptions/error.ts +44 -0
  195. package/ts-code/lib-common/exceptions/file.ts +84 -0
  196. package/ts-code/lib-common/exceptions/http.ts +69 -0
  197. package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
  198. package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
  199. package/ts-code/lib-common/json-equal.ts +55 -0
  200. package/ts-code/lib-common/json-utils.ts +130 -0
  201. package/ts-code/lib-common/jwkeys.ts +246 -0
  202. package/ts-code/lib-common/map-of-sets.ts +60 -0
  203. package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
  204. package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
  205. package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
  206. package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
  207. package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
  208. package/ts-code/lib-common/processes.ts +501 -0
  209. package/ts-code/lib-common/random-node.ts +79 -0
  210. package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
  211. package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
  212. package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
  213. package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
  214. package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
  215. package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
  216. package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
  217. package/ts-code/lib-common/service-api/locker.ts +44 -0
  218. package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
  219. package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
  220. package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
  221. package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
  222. package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
  223. package/ts-code/lib-common/session-encryptor.ts +54 -0
  224. package/ts-code/lib-common/time-window-cache.ts +74 -0
  225. package/ts-code/lib-common/transferable.d.ts +30 -0
  226. package/ts-code/lib-server/conf-util.ts +35 -0
  227. package/ts-code/lib-server/mid-access.ts +45 -0
  228. package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
  229. package/ts-code/lib-server/middleware/error-handler.ts +79 -0
  230. package/ts-code/lib-server/pkl-access.ts +46 -0
  231. package/ts-code/lib-server/resources/dns.ts +151 -0
  232. package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
  233. package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
  234. package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
  235. package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
  236. package/ts-code/lib-server/resources/sessions.ts +232 -0
  237. package/ts-code/lib-server/resources/user-files.ts +147 -0
  238. package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
  239. package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
  240. package/ts-code/lib-server/routes/sessions/close.ts +27 -0
  241. package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
  242. package/ts-code/lib-server/routes/sessions/start.ts +116 -0
  243. package/ts-code/lib-server/web-sockets/app.ts +339 -0
  244. package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
  245. package/ts-code/lib.ts +29 -0
  246. package/ts-code/locker/locker-app.ts +60 -0
  247. package/ts-code/locker/resources/lockers.ts +17 -0
  248. package/ts-code/locker/resources/sessions.ts +37 -0
  249. package/ts-code/locker/routes/create-locker.ts +47 -0
  250. package/ts-code/mailerId/mailerId-app.ts +107 -0
  251. package/ts-code/mailerId/resources/certifier.ts +181 -0
  252. package/ts-code/mailerId/resources/sessions.ts +44 -0
  253. package/ts-code/mailerId/resources/users.ts +88 -0
  254. package/ts-code/mailerId/routes/certify.ts +68 -0
  255. package/ts-code/main.ts +304 -0
  256. package/ts-code/mock/dns.ts +106 -0
  257. package/ts-code/mock/mock-as-child-proc.ts +130 -0
  258. package/ts-code/mock/node-child-ipc.ts +69 -0
  259. package/ts-code/mock/run-in-proc.ts +111 -0
  260. package/ts-code/mock/tls-options.ts +73 -0
  261. package/ts-code/services.ts +138 -0
  262. package/ts-code/signup/resources/users.ts +429 -0
  263. package/ts-code/signup/routes/add.ts +65 -0
  264. package/ts-code/signup/routes/get-available-addresses.ts +49 -0
  265. package/ts-code/signup/routes/get-available-domains.ts +45 -0
  266. package/ts-code/signup/signup-app.ts +54 -0
  267. package/ts-code/signup/signup-tokens.ts +148 -0
  268. package/ts-code/tests/admin-proto/signup.ts +277 -0
  269. package/ts-code/tests/jasmine.ts +37 -0
  270. package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
  271. package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
  272. package/ts-code/tests/libs-for-tests/assert.ts +22 -0
  273. package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
  274. package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
  275. package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
  276. package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
  277. package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
  278. package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
  279. package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
  280. package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
  281. package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
  282. package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
  283. package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
  284. package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
  285. package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
  286. package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
  287. package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
  288. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
  289. package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
  290. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
  291. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
  292. package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
  293. package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
  294. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
  295. package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
  296. package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
  297. package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
  298. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
  299. package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
  300. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
  301. package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
  302. package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
  303. package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
  304. package/ts-code/tests/protocols/asmail/config.ts +172 -0
  305. package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
  306. package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
  307. package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
  308. package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
  309. package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
  310. package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
  311. package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
  312. package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
  313. package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
  314. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
  315. package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
  316. package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
  317. package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
  318. package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
  319. package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
  320. package/ts-code/tests/protocols/mailerid.ts +271 -0
  321. package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
  322. package/ts-code/tests/shared-checks/requests.ts +135 -0
  323. package/ts-code/tsconfig.json +11 -0
  324. package/ts-code/web3n.d.ts +1068 -0
@@ -0,0 +1,81 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2026 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler } from 'express';
19
+ import { SignedLoad } from '../../../lib-common/jwkeys';
20
+ import { authSender as api, ERR_SC } from '../../../lib-common/service-api/asmail/delivery';
21
+ import { Request } from '../../resources/delivery-sessions';
22
+
23
+ export type IMidAuthorizer = (
24
+ rpDomain: string, sessionId: string, userId: string,
25
+ mailerIdAssertion: SignedLoad, userCert: SignedLoad, provCert: SignedLoad
26
+ ) => Promise<boolean>;
27
+
28
+
29
+ /**
30
+ * This creates an authorize-sender route handler.
31
+ * @param relyingPartyDomain at which this service operates, as seen by client
32
+ * @param mailerIdAuthorizingFunc is a function returning promise, which
33
+ * resolves into boolean flag, with true value for authorization passing,
34
+ * and false for failed authorization.
35
+ */
36
+ export function authorize(relyingPartyDomain: string, midAuthorizingFunc: IMidAuthorizer): RequestHandler {
37
+
38
+ return async (req: Request, res, next) => {
39
+
40
+ if (req.session.isAuthorized) {
41
+ res.status(ERR_SC.duplicateReq).send("This protocol request has already been served.");
42
+ return;
43
+ }
44
+
45
+ const rb: api.Request = req.body;
46
+ const sender = req.session.params.sender;
47
+ const sessionId = req.session.id;
48
+
49
+ if (!sender) {
50
+ // This case must be rejected, because place for authorizing
51
+ // anonymous connection is at the session start.
52
+ res.status(api.SC.authFailed).send("Server is not accepting provided credentials.");
53
+ req.session.close();
54
+ return;
55
+ }
56
+
57
+ if (!rb.assertion || !rb.userCert || !rb.provCert) {
58
+ res.status(ERR_SC.malformed).send("No credentials given.");
59
+ req.session.close();
60
+ return;
61
+ }
62
+
63
+ try {
64
+ const certsVerified = await midAuthorizingFunc(
65
+ relyingPartyDomain, sessionId, sender, rb.assertion, rb.userCert, rb.provCert
66
+ );
67
+ if (certsVerified) {
68
+ req.session.isAuthorized = true;
69
+ res.status(api.SC.ok).send();
70
+ } else {
71
+ res.status(api.SC.authFailed).send("Server is not accepting provided credentials.");
72
+ req.session.close();
73
+ }
74
+ } catch (err) {
75
+ next(err);
76
+ }
77
+
78
+ };
79
+ }
80
+
81
+ Object.freeze(exports);
@@ -0,0 +1,151 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 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 { RequestHandler, Response } from 'express';
19
+ import { GenerateSession, Request } from '../../resources/delivery-sessions';
20
+ import { SC as recipSC, MsgDelivery } from '../../resources/recipients';
21
+ import { sessionStart as api, ERR_SC, ErrorReply } from '../../../lib-common/service-api/asmail/delivery';
22
+ import { checkAndTransformAddress } from '../../../lib-common/canonical-address';
23
+
24
+ export type Redirect = (userId: string) => Promise<string>;
25
+
26
+ /**
27
+ * This creates a start-session route handler.
28
+ * @param allowedMsgSizeFunc is a function returning promises, that
29
+ * may resolve to
30
+ * (1) undefined, if recipient is unknown,
31
+ * (2) zero (0), if leaving mail is forbidden,
32
+ * (3) greater than zero maximum message length, and
33
+ * (4) -1, if mail cannot be accepted due to full mail box.
34
+ * @param sessionGenFunc is a promise returning function that generates new
35
+ * session objects.
36
+ * @param redirectFunc is an optional function that returns a promise,
37
+ * resolvable to
38
+ * (1) string with URI for ASMail service, which is serving given recipient,
39
+ * (2) undefined, if it is this server should service given recipient.
40
+ */
41
+ export function startSession(
42
+ allowedMsgSizeFunc: MsgDelivery['allowedMaxMsgSize'],
43
+ sessionGenFunc: GenerateSession, redirectFunc?: Redirect
44
+ ): RequestHandler {
45
+
46
+ async function serveRequestHere(
47
+ recipient: string, sender: string|undefined,
48
+ invitation: string|undefined, res: Response
49
+ ): Promise<void> {
50
+ const msgSize = await allowedMsgSizeFunc(recipient, sender, invitation);
51
+ if (msgSize > 0) {
52
+ const session = await sessionGenFunc();
53
+ session.params.recipient = recipient;
54
+ session.params.sender = sender;
55
+ session.params.invite = invitation;
56
+ session.params.maxMsgLength = msgSize;
57
+ if (!sender) {
58
+ // message delivery is allowed for anonymous
59
+ // sender, thus, we set isAuthorized flag here
60
+ session.isAuthorized = true;
61
+ }
62
+ res.status(api.SC.ok).json( <api.Reply> {
63
+ sessionId: session.id,
64
+ maxMsgLength: msgSize
65
+ });
66
+ } else if (msgSize === 0) {
67
+ res.status(api.SC.senderNotAllowed).json( <ErrorReply> {
68
+ error: `${sender ? sender : "Anonymous sender "} is not allowed to leave mail for ${recipient}`
69
+ });
70
+ } else if (msgSize === -1) {
71
+ res.status(api.SC.inboxFull).json( <ErrorReply> {
72
+ error: `Mail box for ${recipient} is full.`
73
+ });
74
+ } else {
75
+ throw new Error(
76
+ `Unrecognized code ${msgSize} for message size limits.`
77
+ );
78
+ }
79
+ }
80
+
81
+ return async (req: Request, res, next) => {
82
+
83
+ const rb: api.Request = req.body;
84
+ const recipient = checkAndTransformAddress(rb.recipient);
85
+ let sender = rb.sender;
86
+ const invitation = rb.invitation;
87
+ const session = req.session;
88
+
89
+ // already existing session indicates repeated call, which should be bounced off
90
+ if (session) {
91
+ res.status(ERR_SC.duplicateReq).json( <ErrorReply> {
92
+ error: "This protocol request has already been served."
93
+ });
94
+ return;
95
+ }
96
+
97
+ // missing recipient makes a bad request
98
+ if (!recipient) {
99
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
100
+ error: "Recipient is either missing in the request, or is malformed"
101
+ });
102
+ return;
103
+ }
104
+
105
+ // if sender is given, we canonicalize the address
106
+ if (sender) {
107
+ sender = checkAndTransformAddress(sender);
108
+ if (!sender) {
109
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
110
+ error: "Sender field is malformed"
111
+ });
112
+ return;
113
+ }
114
+ }
115
+
116
+ // check invitation field
117
+ if ((invitation !== undefined) && (typeof invitation !== 'string')) {
118
+ res.status(ERR_SC.malformed).json( <ErrorReply> {
119
+ error: "Inviation field is malformed"
120
+ });
121
+ return;
122
+ }
123
+
124
+ try {
125
+ if (redirectFunc) {
126
+ const redirectTo = await redirectFunc(recipient)
127
+ if (redirectTo) {
128
+ res.status(api.SC.redirect).json(
129
+ <api.RedirectReply> {
130
+ redirect: redirectTo
131
+ });
132
+ } else {
133
+ await serveRequestHere(recipient, sender, invitation, res);
134
+ }
135
+ } else {
136
+ await serveRequestHere(recipient, sender, invitation, res);
137
+ }
138
+ } catch (err) {
139
+ if (err === recipSC.USER_UNKNOWN) {
140
+ res.status(api.SC.unknownRecipient).json( <ErrorReply> {
141
+ error: `Recipient ${recipient} is unknown.`
142
+ });
143
+ } else {
144
+ next(err);
145
+ }
146
+ }
147
+
148
+ };
149
+ }
150
+
151
+ Object.freeze(exports);
@@ -0,0 +1,53 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 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 { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgRetrieval } from '../../resources/recipients';
20
+ import { msgMetadata as api, ERR_SC, ErrorReply } from '../../../lib-common/service-api/asmail/retrieval';
21
+ import { Request } from '../../resources/sessions';
22
+
23
+ export function getMsgMeta(
24
+ getMsgMetaFunc: MsgRetrieval['getMsgMeta']
25
+ ): RequestHandler {
26
+ return async (req: Request, res, next) => {
27
+ const userId = req.session.params.userId;
28
+ const msgId: string = req.params.msgId;
29
+
30
+ try {
31
+ const meta = await getMsgMetaFunc(userId, msgId);
32
+ res.status(api.SC.ok).json(meta);
33
+ } catch (err) {
34
+ if ("string" !== typeof err) {
35
+ next(err);
36
+ } else if (err === recipSC.MSG_UNKNOWN) {
37
+ res.status(api.SC.unknownMsg).json(<ErrorReply> {
38
+ error: "Message "+msgId+" is unknown."
39
+ });
40
+ } else if (err === recipSC.USER_UNKNOWN) {
41
+ res.status(ERR_SC.server).json( <ErrorReply> {
42
+ error: "Recipient disappeared from the system."
43
+ });
44
+ req.session.close();
45
+ } else {
46
+ next(new Error("Unhandled storage error code: "+err));
47
+ }
48
+ }
49
+
50
+ };
51
+ }
52
+
53
+ Object.freeze(exports);
@@ -0,0 +1,109 @@
1
+ /*
2
+ Copyright (C) 2015 - 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 { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgRetrieval, BIN_TYPE } from '../../resources/recipients';
20
+ import { GetObjQueryOpts, ERR_SC, msgObj as api, HTTP_HEADER } from '../../../lib-common/service-api/asmail/retrieval';
21
+ import { Request } from '../../resources/sessions';
22
+ import { errWithCause } from '../../../lib-common/exceptions/error';
23
+ import { EMPTY_BUFFER } from '../../../lib-common/buffer-utils';
24
+
25
+ function extractQueryOptions(req: Request): undefined|{
26
+ header: boolean; limit: number|undefined; ofs: number;
27
+ } {
28
+ // query fields are string or undefined, yet, type info helps the show
29
+ const query: GetObjQueryOpts = req.query;
30
+
31
+ const header = ((query.header as any) === 'true');
32
+
33
+ const ofs = (query.ofs ? parseInt(query.ofs as any) : 0);
34
+ if (isNaN(ofs) || (ofs < 0) || (header && (ofs > 0))) {
35
+ return;
36
+ }
37
+
38
+ const limit = (query.limit ? parseInt(query.limit as any) : undefined);
39
+ if (limit !== undefined) {
40
+ if (isNaN(limit) || (limit < 0) || (!header && (limit === 0))) {
41
+ return;
42
+ }
43
+ }
44
+
45
+ return { header, limit, ofs };
46
+ }
47
+
48
+ export function getMsgObj(
49
+ getMsgObjFunc: MsgRetrieval['getObj']
50
+ ): RequestHandler {
51
+ return async (req: Request, res, next) => {
52
+
53
+ const userId = req.session.params.userId;
54
+ const msgId: string = req.params.msgId;
55
+ const objId: string = req.params.objId;
56
+
57
+ const opts = extractQueryOptions(req);
58
+ if (!opts) {
59
+ res.status(ERR_SC.malformed).send("Bad query parameters");
60
+ return;
61
+ }
62
+
63
+ try{
64
+ const reader = await getMsgObjFunc(userId, msgId, objId,
65
+ opts.header, opts.ofs, opts.limit);
66
+ res.status(api.SC.ok);
67
+ res.set(HTTP_HEADER.contentType, BIN_TYPE);
68
+ res.set(HTTP_HEADER.contentLength, `${reader.len}`);
69
+ if (opts.header) {
70
+ res.set(HTTP_HEADER.objHeaderLength, `${reader.headerLen}`);
71
+ }
72
+ res.set(HTTP_HEADER.objSegmentsLength, `${reader.segsLen}`);
73
+ if (reader.len > 0) {
74
+ try {
75
+ await reader.pipe!(res);
76
+ } catch (err) {
77
+ console.error(errWithCause(
78
+ err, `Wasn't able to complete sending segments due to error in piping`
79
+ ));
80
+ } finally {
81
+ res.end();
82
+ }
83
+ } else {
84
+ res.send(EMPTY_BUFFER);
85
+ }
86
+ } catch (err) {
87
+ if ("string" !== typeof err) {
88
+ next(err);
89
+ } else if (err === recipSC.OBJ_UNKNOWN) {
90
+ res.status(api.SC.unknownMsgOrObj).send(
91
+ `Object ${objId} is unknown.`
92
+ );
93
+ } else if (err === recipSC.MSG_UNKNOWN) {
94
+ res.status(api.SC.unknownMsgOrObj).send(
95
+ `Message ${msgId} is unknown.`
96
+ );
97
+ } else if (err === recipSC.USER_UNKNOWN) {
98
+ res.status(ERR_SC.server).send(
99
+ `Recipient disappeared from the system.`
100
+ );
101
+ req.session.close();
102
+ } else {
103
+ next(new Error(`Unhandled storage error code: ${err}`));
104
+ }
105
+ }
106
+ };
107
+ }
108
+
109
+ Object.freeze(exports);
@@ -0,0 +1,70 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 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 { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgRetrieval } from '../../resources/recipients';
20
+ import { listMsgs as api, ERR_SC, ListMsgsOpts } from '../../../lib-common/service-api/asmail/retrieval';
21
+ import { Request } from '../../resources/sessions';
22
+
23
+ export function listMsgIds(
24
+ listMsgIdsFunc: MsgRetrieval['getMsgIds']
25
+ ): RequestHandler {
26
+ return async (req: Request, res, next) => {
27
+ const userId = req.session.params.userId;
28
+
29
+ const opts = extractQueryOptions(req);
30
+ if (!opts) {
31
+ res.status(ERR_SC.malformed).send("Bad query parameters");
32
+ return;
33
+ }
34
+
35
+ try {
36
+ const { from, to } = opts;
37
+ const msgIds = await listMsgIdsFunc(userId, from, to);
38
+ res.status(api.SC.ok).json(msgIds);
39
+ } catch (err) {
40
+ if ("string" !== typeof err) {
41
+ next(err);
42
+ } else if (err === recipSC.USER_UNKNOWN) {
43
+ res.status(ERR_SC.server).send(
44
+ "Recipient disappeared from the system."
45
+ );
46
+ req.session.close();
47
+ } else {
48
+ next(new Error("Unhandled storage error code: "+err));
49
+ }
50
+ }
51
+
52
+ };
53
+ }
54
+
55
+ function extractQueryOptions(req: Request): ListMsgsOpts|undefined {
56
+ const query: ListMsgsOpts = req.query;
57
+
58
+ const from = (query.from ? parseInt(query.from as any) : undefined);
59
+ if ((from !== undefined) && (isNaN(from) || (from <= 0))) {
60
+ return;
61
+ }
62
+ const to = (query.to ? parseInt(query.to as any) : undefined);
63
+ if ((to !== undefined) && (isNaN(to) || (to <= 0))) {
64
+ return;
65
+ }
66
+
67
+ return { from, to };
68
+ }
69
+
70
+ Object.freeze(exports);
@@ -0,0 +1,47 @@
1
+ /*
2
+ Copyright (C) 2015 - 2016, 2026 3NSoft Inc.
3
+
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the Free Software
6
+ Foundation, either version 3 of the License, or (at your option) any later
7
+ version.
8
+
9
+ This program is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
+ See the GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along with
15
+ this program. If not, see <http://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { RequestHandler } from 'express';
19
+ import { SC as recipSC, MsgRetrieval } from '../../resources/recipients';
20
+ import { rmMsg as api, ERR_SC } from '../../../lib-common/service-api/asmail/retrieval';
21
+ import { Request } from '../../resources/sessions';
22
+
23
+ export function deleteMsg(delMsgFunc: MsgRetrieval['deleteMsg']): RequestHandler {
24
+ return async (req: Request, res, next) => {
25
+ const userId = req.session.params.userId;
26
+ const msgId: string = req.params.msgId;
27
+
28
+ try {
29
+ await delMsgFunc(userId, msgId);
30
+ res.status(api.SC.ok).send();
31
+ } catch (err) {
32
+ if ("string" !== typeof err) {
33
+ next(err);
34
+ } else if (err === recipSC.MSG_UNKNOWN) {
35
+ res.status(api.SC.unknownMsg).send("Message "+msgId+" is unknown.");
36
+ } else if (err === recipSC.USER_UNKNOWN) {
37
+ res.status(ERR_SC.server).send("Recipient disappeared from the system.");
38
+ req.session.close();
39
+ } else {
40
+ next(new Error("Unhandled storage error code: "+err));
41
+ }
42
+ }
43
+
44
+ };
45
+ }
46
+
47
+ Object.freeze(exports);
@@ -0,0 +1,82 @@
1
+ /*
2
+ Copyright (C) 2023, 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 { EXECUTABLE_NAME } from "../config/default-confs";
19
+ import { ParsedRunArgs, parseRunArgs, runCmd } from "./run-cmd";
20
+ import { sampleConfig, showSampleConfigCmd } from "./show-sample-config";
21
+ import { ParsedSignupArgs, parseSignupArgs, signupCmd } from "./signup-cmd";
22
+ import { CliUsageDisplay, HelpArg, UsageSection, helpOpt, parseArgv, toErrorUsage, toUsageDisplay } from "./utils";
23
+
24
+ export { CliUsageDisplay } from "./utils";
25
+
26
+ function mainUsage(execName: string): UsageSection[] {
27
+ return [
28
+ {
29
+ header: execName,
30
+ content: `Server of all 3NWeb utilities: MailerId, ASMail, 3NStorage.`
31
+ },
32
+ {
33
+ header: `Usage:`,
34
+ content: `${execName} [command]`
35
+ },
36
+ {
37
+ header: 'Available commands:',
38
+ content: [
39
+ runCmd,
40
+ signupCmd,
41
+ showSampleConfigCmd
42
+ ]
43
+ },
44
+ {
45
+ header: '',
46
+ content: `Use "${execName} [command] --help" for more information about a command.`
47
+ }
48
+ ];
49
+ }
50
+
51
+ export function parseProcessArgv(): {
52
+ runCmd?: ParsedRunArgs;
53
+ signupCmd?: ParsedSignupArgs;
54
+ showUsage?: CliUsageDisplay;
55
+ showSampleConfig?: CliUsageDisplay;
56
+ } {
57
+ const args = process.argv.slice(2);
58
+ if (args.length === 0) {
59
+ return toUsageDisplay(0, mainUsage(EXECUTABLE_NAME));
60
+ }
61
+ if (args[0] === runCmd.name) {
62
+ return parseRunArgs(args.slice(1), EXECUTABLE_NAME);
63
+ } else if (args[0] === signupCmd.name) {
64
+ return parseSignupArgs(args.slice(1), EXECUTABLE_NAME);
65
+ } else if (args[0] === showSampleConfigCmd.name) {
66
+ return { showSampleConfig: {
67
+ txtToDisplay: sampleConfig, exitStatus: 0
68
+ }};
69
+ } else {
70
+ const opts = parseArgv<HelpArg>(args, [ helpOpt ], { partial: true });
71
+ if (opts.help) {
72
+ return toUsageDisplay(0, mainUsage(EXECUTABLE_NAME));
73
+ }
74
+ return toUsageDisplay(-1, toErrorUsage(
75
+ mainUsage(EXECUTABLE_NAME),
76
+ `Unknown command '${args[0]}'`
77
+ ));
78
+ }
79
+ }
80
+
81
+
82
+ Object.freeze(exports);
@@ -0,0 +1,81 @@
1
+ /*
2
+ Copyright (C) 2023 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 { CliUsageDisplay, CommandDef, OptionDef, UsageSection, helpOpt, parseArgv, toErrorUsage, toUsageDisplay } from "./utils";
19
+
20
+
21
+ export const runCmd: CommandDef<'run'> = {
22
+ name: 'run',
23
+ summary: 'runs 3NWeb services'
24
+ };
25
+
26
+ function runUsage(execName: string): UsageSection[] {
27
+ return [
28
+ {
29
+ content: `This command runs some or all 3NWeb services. Configuration is read from a yaml file.`
30
+ },
31
+ {
32
+ header: 'Usage:',
33
+ content: `${execName} ${runCmd.name} [options] [config_file]`
34
+ },
35
+ {
36
+ header: 'Options:',
37
+ optionList: runOpts
38
+ }
39
+ ];
40
+ }
41
+
42
+ const runOpts: OptionDef[] = [
43
+ {
44
+ name: 'config',
45
+ alias: 'c',
46
+ type: String,
47
+ typeLabel: '{underline <file>}',
48
+ description: `path of a configuration yaml file`
49
+ },
50
+ helpOpt
51
+ ];
52
+
53
+ export interface ParsedRunArgs {
54
+ config?: string;
55
+ help?: boolean;
56
+ }
57
+
58
+ export function parseRunArgs(args: string[], execName: string): {
59
+ runCmd?: ParsedRunArgs;
60
+ showUsage?: CliUsageDisplay;
61
+ } {
62
+ if (args.length === 0) {
63
+ return toUsageDisplay(0, runUsage(execName));
64
+ }
65
+ const runArgs = parseArgv<ParsedRunArgs>(args, runOpts, { partial: true });
66
+ if (runArgs.help) {
67
+ return toUsageDisplay(0, runUsage(execName));
68
+ } else if (runArgs.config) {
69
+ return { runCmd: runArgs };
70
+ } else if (runArgs._unknown) {
71
+ return { runCmd: { config: runArgs._unknown[0] } };
72
+ } else {
73
+ return toUsageDisplay(-1, toErrorUsage(
74
+ runUsage(execName),
75
+ `Missing configuration file path.`
76
+ ));
77
+ }
78
+ }
79
+
80
+
81
+ Object.freeze(exports);