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.
- package/.gitlab-ci-linux.yml +50 -0
- package/.gitlab-ci-mac.yml +29 -0
- package/.gitlab-ci-windows.yml +29 -0
- package/.gitlab-ci.yml +63 -0
- package/build/3nstorage/routes/owner/archive-obj-version.js +2 -2
- package/build/3nstorage/routes/owner/cancel-trans.js +2 -2
- package/build/3nstorage/routes/owner/delete-obj.js +2 -2
- package/build/3nstorage/routes/owner/get-current-obj.js +3 -4
- package/build/3nstorage/routes/owner/param-setter.js +2 -6
- package/build/asmail/routes/config/param-setter.js +2 -2
- package/build/asmail/routes/delivery/finalize-delivery.js +2 -2
- package/build/asmail/routes/delivery/put-obj.js +2 -2
- package/build/asmail/routes/delivery/sender-authorization.js +2 -2
- package/build/asmail/routes/retrieval/remove-message.js +2 -2
- package/build/cli/signup-cmd.js +0 -1
- package/build/lib-server/routes/sessions/close.js +2 -2
- package/build/lib-server/routes/sessions/mid-auth.js +2 -5
- package/build/main.js +12 -15
- package/build/mock/tls-options.js +46 -44
- package/build/signup/routes/add.js +4 -4
- package/build/tests/admin-proto/signup.d.ts +1 -0
- package/build/tests/admin-proto/signup.js +235 -0
- package/build/tests/jasmine.d.ts +1 -0
- package/build/tests/jasmine.js +32 -0
- package/build/tests/libs-for-tests/3nstorage.d.ts +22 -0
- package/build/tests/libs-for-tests/3nstorage.js +123 -0
- package/build/tests/libs-for-tests/asmail.d.ts +22 -0
- package/build/tests/libs-for-tests/asmail.js +179 -0
- package/build/tests/libs-for-tests/assert.d.ts +1 -0
- package/build/tests/libs-for-tests/assert.js +26 -0
- package/build/tests/libs-for-tests/async-jasmine.d.ts +7 -0
- package/build/tests/libs-for-tests/async-jasmine.js +77 -0
- package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
- package/build/tests/libs-for-tests/bytes-equal.js +34 -0
- package/build/tests/libs-for-tests/json-copy.d.ts +1 -0
- package/build/tests/libs-for-tests/json-copy.js +45 -0
- package/build/tests/libs-for-tests/json-equal.d.ts +4 -0
- package/build/tests/libs-for-tests/json-equal.js +67 -0
- package/build/tests/libs-for-tests/mailerid.d.ts +13 -0
- package/build/tests/libs-for-tests/mailerid.js +114 -0
- package/build/tests/libs-for-tests/pkl.d.ts +28 -0
- package/build/tests/libs-for-tests/pkl.js +89 -0
- package/build/tests/libs-for-tests/server-components/3nstorage.d.ts +20 -0
- package/build/tests/libs-for-tests/server-components/3nstorage.js +200 -0
- package/build/tests/libs-for-tests/server-components/admin.d.ts +6 -0
- package/build/tests/libs-for-tests/server-components/admin.js +43 -0
- package/build/tests/libs-for-tests/server-components/asmail.d.ts +16 -0
- package/build/tests/libs-for-tests/server-components/asmail.js +143 -0
- package/build/tests/libs-for-tests/server-components/component.d.ts +13 -0
- package/build/tests/libs-for-tests/server-components/component.js +77 -0
- package/build/tests/libs-for-tests/server-components/mailerid.d.ts +10 -0
- package/build/tests/libs-for-tests/server-components/mailerid.js +103 -0
- package/build/tests/libs-for-tests/server-runner.d.ts +15 -0
- package/build/tests/libs-for-tests/server-runner.js +69 -0
- package/build/tests/libs-for-tests/spec-assembly.d.ts +6 -0
- package/build/tests/libs-for-tests/spec-assembly.js +55 -0
- package/build/tests/libs-for-tests/ws-utils.d.ts +3 -0
- package/build/tests/libs-for-tests/ws-utils.js +59 -0
- package/build/tests/libs-for-tests/xhr-utils.d.ts +61 -0
- package/build/tests/libs-for-tests/xhr-utils.js +154 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-obj-ver.js +84 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/archive-root-ver.js +78 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.js +83 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.js +77 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-obj.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/delete-obj.js +75 -0
- package/build/tests/protocols/3nstorage/owner/specs/events.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/events.js +91 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-obj.js +269 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-root.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-current-root.js +262 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-obj-status.js +79 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-root-status.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/get-root-status.js +72 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-obj.js +287 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-root.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/put-current-root.js +274 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel-root.js +73 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.d.ts +2 -0
- package/build/tests/protocols/3nstorage/owner/specs/trans-cancel.js +72 -0
- package/build/tests/protocols/3nstorage/owner/test-utils.d.ts +14 -0
- package/build/tests/protocols/3nstorage/owner/test-utils.js +54 -0
- package/build/tests/protocols/3nstorage/owner.d.ts +1 -0
- package/build/tests/protocols/3nstorage/owner.js +138 -0
- package/build/tests/protocols/asmail/config.d.ts +1 -0
- package/build/tests/protocols/asmail/config.js +117 -0
- package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/finalize-delivery.js +60 -0
- package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.js +68 -0
- package/build/tests/protocols/asmail/delivery/specs/put-metadata.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/put-metadata.js +83 -0
- package/build/tests/protocols/asmail/delivery/specs/put-obj.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/put-obj.js +123 -0
- package/build/tests/protocols/asmail/delivery/specs/restart-session.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/restart-session.js +79 -0
- package/build/tests/protocols/asmail/delivery/specs/start-session.d.ts +2 -0
- package/build/tests/protocols/asmail/delivery/specs/start-session.js +64 -0
- package/build/tests/protocols/asmail/delivery/test-utils.d.ts +16 -0
- package/build/tests/protocols/asmail/delivery/test-utils.js +46 -0
- package/build/tests/protocols/asmail/delivery.d.ts +1 -0
- package/build/tests/protocols/asmail/delivery.js +46 -0
- package/build/tests/protocols/asmail/retrieval/specs/events.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/events.js +62 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-meta.js +70 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/get-message-obj.js +166 -0
- package/build/tests/protocols/asmail/retrieval/specs/list-messages.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/list-messages.js +96 -0
- package/build/tests/protocols/asmail/retrieval/specs/remove-message.d.ts +2 -0
- package/build/tests/protocols/asmail/retrieval/specs/remove-message.js +66 -0
- package/build/tests/protocols/asmail/retrieval/test-utils.d.ts +17 -0
- package/build/tests/protocols/asmail/retrieval/test-utils.js +46 -0
- package/build/tests/protocols/asmail/retrieval.d.ts +1 -0
- package/build/tests/protocols/asmail/retrieval.js +92 -0
- package/build/tests/protocols/mailerid.d.ts +1 -0
- package/build/tests/protocols/mailerid.js +210 -0
- package/build/tests/shared-checks/check-mid-login.d.ts +2 -0
- package/build/tests/shared-checks/check-mid-login.js +131 -0
- package/build/tests/shared-checks/requests.d.ts +20 -0
- package/build/tests/shared-checks/requests.js +123 -0
- package/package.json +1 -1
- package/packing/create-deb.sh +57 -0
- package/packing/deb/lib/systemd/system/3nweb.service +11 -0
- package/packing/deb/postinst +44 -0
- package/packing/deb/usr/share/doc/3nweb-server/conf-for-postinstall.yaml +19 -0
- package/packing/deb/usr/share/doc/3nweb-server/copyright +22 -0
- package/publish-task.sh +10 -0
- package/push-to-github.sh +105 -0
- package/ts-code/3nstorage/3nstorage-app.ts +99 -0
- package/ts-code/3nstorage/owner.ts +178 -0
- package/ts-code/3nstorage/resources/sessions.ts +37 -0
- package/ts-code/3nstorage/resources/store.ts +896 -0
- package/ts-code/3nstorage/resources/users.ts +258 -0
- package/ts-code/3nstorage/routes/owner/archive-obj-version.ts +73 -0
- package/ts-code/3nstorage/routes/owner/cancel-trans.ts +58 -0
- package/ts-code/3nstorage/routes/owner/delete-obj.ts +103 -0
- package/ts-code/3nstorage/routes/owner/get-archived-obj-ver.ts +111 -0
- package/ts-code/3nstorage/routes/owner/get-current-obj.ts +122 -0
- package/ts-code/3nstorage/routes/owner/get-obj-status.ts +55 -0
- package/ts-code/3nstorage/routes/owner/param-getter.ts +51 -0
- package/ts-code/3nstorage/routes/owner/param-setter.ts +50 -0
- package/ts-code/3nstorage/routes/owner/put-current-obj.ts +284 -0
- package/ts-code/3nstorage/routes/owner/session-params.ts +49 -0
- package/ts-code/3nstorage/shared.ts +43 -0
- package/ts-code/asmail/asmail-app.ts +91 -0
- package/ts-code/asmail/config.ts +96 -0
- package/ts-code/asmail/delivery.ts +94 -0
- package/ts-code/asmail/resources/delivery-sessions.ts +118 -0
- package/ts-code/asmail/resources/inbox.ts +696 -0
- package/ts-code/asmail/resources/recipients.ts +495 -0
- package/ts-code/asmail/resources/sessions.ts +37 -0
- package/ts-code/asmail/retrieval.ts +96 -0
- package/ts-code/asmail/routes/config/param-getter.ts +49 -0
- package/ts-code/asmail/routes/config/param-setter.ts +49 -0
- package/ts-code/asmail/routes/delivery/finalize-delivery.ts +50 -0
- package/ts-code/asmail/routes/delivery/pre-flight.ts +132 -0
- package/ts-code/asmail/routes/delivery/provide-recipient-pubkey.ts +58 -0
- package/ts-code/asmail/routes/delivery/put-metadata.ts +94 -0
- package/ts-code/asmail/routes/delivery/put-obj.ts +166 -0
- package/ts-code/asmail/routes/delivery/restart-session.ts +130 -0
- package/ts-code/asmail/routes/delivery/sender-authorization.ts +81 -0
- package/ts-code/asmail/routes/delivery/start-session.ts +151 -0
- package/ts-code/asmail/routes/retrieval/get-message-meta.ts +53 -0
- package/ts-code/asmail/routes/retrieval/get-message-obj.ts +109 -0
- package/ts-code/asmail/routes/retrieval/list-messages.ts +70 -0
- package/ts-code/asmail/routes/retrieval/remove-message.ts +47 -0
- package/ts-code/cli/index.ts +82 -0
- package/ts-code/cli/run-cmd.ts +81 -0
- package/ts-code/cli/show-sample-config.ts +78 -0
- package/ts-code/cli/signup-cmd.ts +229 -0
- package/ts-code/cli/user-cmd.ts +68 -0
- package/ts-code/cli/utils.ts +105 -0
- package/ts-code/config/default-confs.ts +22 -0
- package/ts-code/config/from-yaml.ts +35 -0
- package/ts-code/config/letsencrypt.ts +77 -0
- package/ts-code/config/signup.ts +137 -0
- package/ts-code/lib-common/admin-api/signup.ts +120 -0
- package/ts-code/lib-common/assert.ts +22 -0
- package/ts-code/lib-common/async-fs-node.ts +656 -0
- package/ts-code/lib-common/buffer-utils.ts +124 -0
- package/ts-code/lib-common/byte-streaming/common.ts +166 -0
- package/ts-code/lib-common/bytes-equal.ts +25 -0
- package/ts-code/lib-common/canonical-address.ts +92 -0
- package/ts-code/lib-common/exceptions/error.ts +44 -0
- package/ts-code/lib-common/exceptions/file.ts +84 -0
- package/ts-code/lib-common/exceptions/http.ts +69 -0
- package/ts-code/lib-common/ipc/generic-ipc.ts +750 -0
- package/ts-code/lib-common/ipc/ws-ipc.ts +117 -0
- package/ts-code/lib-common/json-equal.ts +55 -0
- package/ts-code/lib-common/json-utils.ts +130 -0
- package/ts-code/lib-common/jwkeys.ts +246 -0
- package/ts-code/lib-common/map-of-sets.ts +60 -0
- package/ts-code/lib-common/mid-sigs-NaCl-Ed.ts +677 -0
- package/ts-code/lib-common/objs-on-disk/file-layout.ts +480 -0
- package/ts-code/lib-common/objs-on-disk/obj-file.ts +325 -0
- package/ts-code/lib-common/objs-on-disk/utils.ts +201 -0
- package/ts-code/lib-common/objs-on-disk/v1-obj-file-format.ts +329 -0
- package/ts-code/lib-common/processes.ts +501 -0
- package/ts-code/lib-common/random-node.ts +79 -0
- package/ts-code/lib-common/service-api/3nstorage/owner.ts +559 -0
- package/ts-code/lib-common/service-api/3nstorage/root-route.ts +22 -0
- package/ts-code/lib-common/service-api/asmail/config.ts +144 -0
- package/ts-code/lib-common/service-api/asmail/delivery.ts +250 -0
- package/ts-code/lib-common/service-api/asmail/retrieval.ts +238 -0
- package/ts-code/lib-common/service-api/asmail/root-route.ts +22 -0
- package/ts-code/lib-common/service-api/ipc-api.ts +44 -0
- package/ts-code/lib-common/service-api/locker.ts +44 -0
- package/ts-code/lib-common/service-api/mailer-id/login.ts +80 -0
- package/ts-code/lib-common/service-api/mailer-id/provisioning.ts +64 -0
- package/ts-code/lib-common/service-api/mailer-id/root-route.ts +25 -0
- package/ts-code/lib-common/service-api/pub-key-login.ts +75 -0
- package/ts-code/lib-common/service-api/web-socket-base.ts +87 -0
- package/ts-code/lib-common/session-encryptor.ts +54 -0
- package/ts-code/lib-common/time-window-cache.ts +74 -0
- package/ts-code/lib-common/transferable.d.ts +30 -0
- package/ts-code/lib-server/conf-util.ts +35 -0
- package/ts-code/lib-server/mid-access.ts +45 -0
- package/ts-code/lib-server/middleware/body-parsers.ts +248 -0
- package/ts-code/lib-server/middleware/error-handler.ts +79 -0
- package/ts-code/lib-server/pkl-access.ts +46 -0
- package/ts-code/lib-server/resources/dns.ts +151 -0
- package/ts-code/lib-server/resources/mailerid-authorizer.ts +115 -0
- package/ts-code/lib-server/resources/mem-backed-sessions-factory.ts +132 -0
- package/ts-code/lib-server/resources/server-data-folders.ts +160 -0
- package/ts-code/lib-server/resources/server-key-for-pkl-challenge.ts +41 -0
- package/ts-code/lib-server/resources/sessions.ts +232 -0
- package/ts-code/lib-server/resources/user-files.ts +147 -0
- package/ts-code/lib-server/routes/pub-key-login/complete-exchange.ts +63 -0
- package/ts-code/lib-server/routes/pub-key-login/start-exchange.ts +189 -0
- package/ts-code/lib-server/routes/sessions/close.ts +27 -0
- package/ts-code/lib-server/routes/sessions/mid-auth.ts +77 -0
- package/ts-code/lib-server/routes/sessions/start.ts +116 -0
- package/ts-code/lib-server/web-sockets/app.ts +339 -0
- package/ts-code/lib-server/web-sockets/server-events.ts +63 -0
- package/ts-code/lib.ts +29 -0
- package/ts-code/locker/locker-app.ts +60 -0
- package/ts-code/locker/resources/lockers.ts +17 -0
- package/ts-code/locker/resources/sessions.ts +37 -0
- package/ts-code/locker/routes/create-locker.ts +47 -0
- package/ts-code/mailerId/mailerId-app.ts +107 -0
- package/ts-code/mailerId/resources/certifier.ts +181 -0
- package/ts-code/mailerId/resources/sessions.ts +44 -0
- package/ts-code/mailerId/resources/users.ts +88 -0
- package/ts-code/mailerId/routes/certify.ts +68 -0
- package/ts-code/main.ts +304 -0
- package/ts-code/mock/dns.ts +106 -0
- package/ts-code/mock/mock-as-child-proc.ts +130 -0
- package/ts-code/mock/node-child-ipc.ts +69 -0
- package/ts-code/mock/run-in-proc.ts +111 -0
- package/ts-code/mock/tls-options.ts +73 -0
- package/ts-code/services.ts +138 -0
- package/ts-code/signup/resources/users.ts +429 -0
- package/ts-code/signup/routes/add.ts +65 -0
- package/ts-code/signup/routes/get-available-addresses.ts +49 -0
- package/ts-code/signup/routes/get-available-domains.ts +45 -0
- package/ts-code/signup/signup-app.ts +54 -0
- package/ts-code/signup/signup-tokens.ts +148 -0
- package/ts-code/tests/admin-proto/signup.ts +277 -0
- package/ts-code/tests/jasmine.ts +37 -0
- package/ts-code/tests/libs-for-tests/3nstorage.ts +144 -0
- package/ts-code/tests/libs-for-tests/asmail.ts +220 -0
- package/ts-code/tests/libs-for-tests/assert.ts +22 -0
- package/ts-code/tests/libs-for-tests/async-jasmine.ts +89 -0
- package/ts-code/tests/libs-for-tests/bytes-equal.ts +25 -0
- package/ts-code/tests/libs-for-tests/json-copy.ts +38 -0
- package/ts-code/tests/libs-for-tests/json-equal.ts +55 -0
- package/ts-code/tests/libs-for-tests/mailerid.ts +123 -0
- package/ts-code/tests/libs-for-tests/pkl.ts +127 -0
- package/ts-code/tests/libs-for-tests/server-components/3nstorage.ts +206 -0
- package/ts-code/tests/libs-for-tests/server-components/admin.ts +49 -0
- package/ts-code/tests/libs-for-tests/server-components/asmail.ts +152 -0
- package/ts-code/tests/libs-for-tests/server-components/component.ts +90 -0
- package/ts-code/tests/libs-for-tests/server-components/mailerid.ts +114 -0
- package/ts-code/tests/libs-for-tests/server-runner.ts +82 -0
- package/ts-code/tests/libs-for-tests/spec-assembly.ts +60 -0
- package/ts-code/tests/libs-for-tests/ws-utils.ts +61 -0
- package/ts-code/tests/libs-for-tests/xhr-utils.ts +179 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/archive-obj-ver.ts +100 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/archive-root-ver.ts +91 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-obj-ver.ts +99 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/delete-archive-root-ver.ts +90 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/delete-obj.ts +84 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/events.ts +125 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-obj.ts +298 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-current-root.ts +290 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-obj-status.ts +88 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/get-root-status.ts +80 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-obj.ts +366 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/put-current-root.ts +329 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel-root.ts +86 -0
- package/ts-code/tests/protocols/3nstorage/owner/specs/trans-cancel.ts +86 -0
- package/ts-code/tests/protocols/3nstorage/owner/test-utils.ts +72 -0
- package/ts-code/tests/protocols/3nstorage/owner.ts +198 -0
- package/ts-code/tests/protocols/asmail/config.ts +172 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/finalize-delivery.ts +69 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/provide-recipient-pubkey.ts +88 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/put-metadata.ts +102 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/put-obj.ts +156 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/restart-session.ts +97 -0
- package/ts-code/tests/protocols/asmail/delivery/specs/start-session.ts +79 -0
- package/ts-code/tests/protocols/asmail/delivery/test-utils.ts +64 -0
- package/ts-code/tests/protocols/asmail/delivery.ts +56 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/events.ts +78 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-meta.ts +80 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/get-message-obj.ts +197 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/list-messages.ts +110 -0
- package/ts-code/tests/protocols/asmail/retrieval/specs/remove-message.ts +74 -0
- package/ts-code/tests/protocols/asmail/retrieval/test-utils.ts +60 -0
- package/ts-code/tests/protocols/asmail/retrieval.ts +115 -0
- package/ts-code/tests/protocols/mailerid.ts +271 -0
- package/ts-code/tests/shared-checks/check-mid-login.ts +164 -0
- package/ts-code/tests/shared-checks/requests.ts +135 -0
- package/ts-code/tsconfig.json +11 -0
- package/ts-code/web3n.d.ts +1068 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2015, 2017, 2019 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 { errWithCause } from "./exceptions/error";
|
|
19
|
+
|
|
20
|
+
export function sleep(millis: number): Promise<void> {
|
|
21
|
+
return new Promise<void>((resolve) => {
|
|
22
|
+
setTimeout(resolve, millis).unref();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Standard Promise has no finally() method, when all respected libraries do.
|
|
28
|
+
* Inside of an async function one may use try-finally clause. But, when we
|
|
29
|
+
* work with raw promises, we need a compact finalization routine. And this is
|
|
30
|
+
* it for synchronous completion.
|
|
31
|
+
* @param promise
|
|
32
|
+
* @param fin is a synchronous function that performs necessary
|
|
33
|
+
* finalization/cleanup. Use finalizeAsync, when finalization is asynchronous.
|
|
34
|
+
* @return a finalized promise
|
|
35
|
+
*/
|
|
36
|
+
export function finalize<T>(promise: Promise<T>, fin: () => void): Promise<T> {
|
|
37
|
+
return promise
|
|
38
|
+
.then((res) => {
|
|
39
|
+
fin();
|
|
40
|
+
return res;
|
|
41
|
+
}, (err) => {
|
|
42
|
+
fin();
|
|
43
|
+
throw err;
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Standard Promise has no finally() method, when all respected libraries do.
|
|
49
|
+
* Inside of an async function one may use try-finally clause. But, when we
|
|
50
|
+
* work with raw promises, we need a compact finalization routine. And this is
|
|
51
|
+
* it for an asynchronous completion.
|
|
52
|
+
* @param promise
|
|
53
|
+
* @param fin is an asynchronous function that performs necessary
|
|
54
|
+
* finalization/cleanup. Use finalize, when finalization is synchronous
|
|
55
|
+
* (is not returning promise).
|
|
56
|
+
* @return a finalized promise
|
|
57
|
+
*/
|
|
58
|
+
export function finalizeAsync<T>(promise: Promise<T>, fin: () => Promise<void>):
|
|
59
|
+
Promise<T> {
|
|
60
|
+
return promise
|
|
61
|
+
.then((res) => {
|
|
62
|
+
return fin()
|
|
63
|
+
.then(() => { return res; });
|
|
64
|
+
}, (err) => {
|
|
65
|
+
return fin()
|
|
66
|
+
.then(() => { throw err; });
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* This represents a function that will create a promise, potentially starting
|
|
72
|
+
* some background process, only when it is called. Such wrap of code is needed
|
|
73
|
+
* for scheduling, as very often any start of an action must be postponed till
|
|
74
|
+
* later time. Scheduler needs a not-yet-started activity, as scheduler has
|
|
75
|
+
* control action's start.
|
|
76
|
+
*/
|
|
77
|
+
export type Action<T> = () => Promise<T>;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* This is a container of processes, labeled by some ids. It allows to track if
|
|
81
|
+
* there is a process already in progress with a given id. And, it allows to
|
|
82
|
+
* chain process, when needed.
|
|
83
|
+
*
|
|
84
|
+
* Common use of such class is to reuse getting of some expensive resource(s).
|
|
85
|
+
*/
|
|
86
|
+
export class NamedProcs {
|
|
87
|
+
|
|
88
|
+
private promises = new Map<string, Promise<any>>();
|
|
89
|
+
|
|
90
|
+
constructor() {
|
|
91
|
+
Object.freeze(this);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @param id is a string key of a process
|
|
96
|
+
* @return a promise of a process' completion, or undefined, if process with
|
|
97
|
+
* given id is unknown.
|
|
98
|
+
*/
|
|
99
|
+
getP<T>(id: string): Promise<T> | undefined {
|
|
100
|
+
return this.promises.get(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private insertPromise<T>(id: string, promise: Promise<T>): Promise<T> {
|
|
104
|
+
promise = finalize(promise, () => {
|
|
105
|
+
if (this.promises.get(id) === promise) {
|
|
106
|
+
this.promises.delete(id);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
this.promises.set(id, promise);
|
|
110
|
+
return promise;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* This method will add a promise of an already started process.
|
|
115
|
+
* @param id is a string key of a process
|
|
116
|
+
* @param promise of an already started process
|
|
117
|
+
* @return a promise of a process' completion.
|
|
118
|
+
*/
|
|
119
|
+
addStarted<T>(id: string, promise: Promise<T>): Promise<T> {
|
|
120
|
+
if (this.promises.has(id)) { throw new Error(
|
|
121
|
+
'Process with id "'+id+'" is already in progress.'); }
|
|
122
|
+
return this.insertPromise(id, promise);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* This method will start a given action only, if a process with a given id
|
|
127
|
+
* is not running.
|
|
128
|
+
* @param id is a string key of a process
|
|
129
|
+
* @param action is a function that starts some process
|
|
130
|
+
* @return a promise of a process' completion.
|
|
131
|
+
*/
|
|
132
|
+
start<T>(id: string, action: Action<T>): Promise<T> {
|
|
133
|
+
if (this.promises.has(id)) { throw new Error(
|
|
134
|
+
'Process with id "'+id+'" is already in progress.'); }
|
|
135
|
+
return this.insertPromise(id, action());
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* This method will chain a given action to an already running process, or,
|
|
140
|
+
* if identified process is not running, this will start given action under
|
|
141
|
+
* a given id.
|
|
142
|
+
* @param id is a string key of a process
|
|
143
|
+
* @param action is a function that starts some process
|
|
144
|
+
* @return a promise of a process' completion.
|
|
145
|
+
*/
|
|
146
|
+
startOrChain<T>(id: string, action: Action<T>): Promise<T> {
|
|
147
|
+
const promise = this.promises.get(id);
|
|
148
|
+
if (promise) {
|
|
149
|
+
const next = promise.then(() => { return action(); });
|
|
150
|
+
return this.insertPromise(id, next);
|
|
151
|
+
} else {
|
|
152
|
+
return this.insertPromise(id, action());
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
Object.freeze(NamedProcs.prototype);
|
|
158
|
+
Object.freeze(NamedProcs);
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* This is a container of process. It allows to track if a process is already
|
|
162
|
+
* in progress. It also allows to chain process, when needed.
|
|
163
|
+
*
|
|
164
|
+
* Common use of such class is to reuse getting of some expensive resource, or
|
|
165
|
+
* do ning something as an exclusive process.
|
|
166
|
+
*/
|
|
167
|
+
export class SingleProc {
|
|
168
|
+
|
|
169
|
+
private promise: Promise<any>|undefined = undefined;
|
|
170
|
+
|
|
171
|
+
constructor() {
|
|
172
|
+
Object.seal(this);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private insertPromise<T>(promise: Promise<T>): Promise<T> {
|
|
176
|
+
promise = finalize(promise, () => {
|
|
177
|
+
if (this.promise === promise) {
|
|
178
|
+
this.promise = undefined;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
this.promise = promise;
|
|
182
|
+
return promise;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
getP<T>(): Promise<T>|undefined {
|
|
186
|
+
return this.promise;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
addStarted<T>(promise: Promise<T>): Promise<T> {
|
|
190
|
+
if (this.promise) { throw new Error('Process is already in progress.'); }
|
|
191
|
+
return this.insertPromise(promise);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
start<T>(action: Action<T>): Promise<T> {
|
|
195
|
+
if (this.promise) { throw new Error('Process is already in progress.'); }
|
|
196
|
+
return this.insertPromise(action());
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
startOrChain<T>(action: Action<T>): Promise<T> {
|
|
200
|
+
if (this.promise) {
|
|
201
|
+
const next = this.promise.then(() => { return action(); });
|
|
202
|
+
return this.insertPromise(next);
|
|
203
|
+
} else {
|
|
204
|
+
return this.insertPromise(action());
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
Object.freeze(SingleProc.prototype);
|
|
210
|
+
Object.freeze(SingleProc);
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* This wraps given function/method into syncing wrap.
|
|
214
|
+
*/
|
|
215
|
+
export function makeSyncedFunc<T extends Function>(
|
|
216
|
+
syncProc: SingleProc, thisArg: any, func: T): T {
|
|
217
|
+
return ((...args) => syncProc.startOrChain(() => func.apply(thisArg, args))) as any as T;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* This is a cycling process, that ensures single execution.
|
|
222
|
+
* It cycles while given "while" predicate returns true. When predicate returns
|
|
223
|
+
* false, process goes to idle. Pushing this process into action is done via
|
|
224
|
+
* startIfIdle() method.
|
|
225
|
+
*/
|
|
226
|
+
export class SingleCyclicProc {
|
|
227
|
+
|
|
228
|
+
private proc: Promise<void>|undefined = undefined;
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @param cycleWhile is a "while" predicate. When it returns true, process
|
|
232
|
+
* continues to cycle, and when it returns false, process goes to idle.
|
|
233
|
+
* @param action is an async cycle body to run at each iteration.
|
|
234
|
+
*/
|
|
235
|
+
constructor(
|
|
236
|
+
private cycleWhile: () => boolean,
|
|
237
|
+
private action: () => Promise<void>) {
|
|
238
|
+
Object.seal(this);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* This starts process, if it is idle.
|
|
243
|
+
*/
|
|
244
|
+
startIfIdle(): void {
|
|
245
|
+
if (this.proc) { return; }
|
|
246
|
+
this.proc = this.action();
|
|
247
|
+
this.proc.then(this.cycleOrIdle);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
private cycleOrIdle = () => {
|
|
251
|
+
if (this.cycleWhile()) {
|
|
252
|
+
this.proc = this.action();
|
|
253
|
+
} else {
|
|
254
|
+
this.proc = undefined;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
isRunning(): boolean {
|
|
259
|
+
return !!this.proc;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* This makes process unusable and unstartable. Waiting on a return promise,
|
|
264
|
+
* awaits the completion of the last iteration this process is in (if any).
|
|
265
|
+
*/
|
|
266
|
+
async close(): Promise<void> {
|
|
267
|
+
this.cycleWhile = () => false;
|
|
268
|
+
this.action = () => {
|
|
269
|
+
throw new Error('This cyclic process has already been closed');
|
|
270
|
+
};
|
|
271
|
+
await this.proc;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
}
|
|
275
|
+
Object.freeze(SingleCyclicProc.prototype);
|
|
276
|
+
Object.freeze(SingleCyclicProc);
|
|
277
|
+
|
|
278
|
+
function oneTimeCaller(f: () => void): () => void {
|
|
279
|
+
let hasBeenCalled = false;
|
|
280
|
+
return function(): void {
|
|
281
|
+
if (hasBeenCalled) { return; }
|
|
282
|
+
hasBeenCalled = true;
|
|
283
|
+
f();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Lock allows for exclusive process flow.
|
|
289
|
+
* Locking is done by calling a lock function that returns an unlocker. Unlocker
|
|
290
|
+
* must be called when lock can be released, preferably in a finally clause.
|
|
291
|
+
* @return a lock function.
|
|
292
|
+
* CAUTION: Lock is not re-entrant.
|
|
293
|
+
*/
|
|
294
|
+
export function makeLock(): () => Promise<() => void> {
|
|
295
|
+
|
|
296
|
+
let isLocked = false;
|
|
297
|
+
const queue: ((unlock: () => void) => void)[] = [];
|
|
298
|
+
|
|
299
|
+
function unlock(): void {
|
|
300
|
+
if (queue.length === 0) {
|
|
301
|
+
isLocked = false;
|
|
302
|
+
} else {
|
|
303
|
+
const next = queue.shift();
|
|
304
|
+
if (!next) { return; }
|
|
305
|
+
next(oneTimeCaller(unlock));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async function lock(): Promise<() => void> {
|
|
310
|
+
if (isLocked) {
|
|
311
|
+
return await new Promise<() => void>((resolve) => {
|
|
312
|
+
queue.push(resolve);
|
|
313
|
+
});
|
|
314
|
+
} else {
|
|
315
|
+
isLocked = true;
|
|
316
|
+
return oneTimeCaller(unlock);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
return lock;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Read-write lock allows reads to occur concurrently, while writes exclude
|
|
325
|
+
* both reads and other writes. Implementation uses fair locking policy.
|
|
326
|
+
* Locking is done by calling proper function that returns an unlocker. Unlocker
|
|
327
|
+
* must be called when lock can be released, preferably in finally clause.
|
|
328
|
+
* CAUTION: Lock is not re-entrant.
|
|
329
|
+
*/
|
|
330
|
+
export interface ReadWriteLock {
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* This method acquires lock for reading. This excludes writes, but does
|
|
334
|
+
* allows other reads, unless they have to be scheduled after an already
|
|
335
|
+
* waiting write (as per fair policy).
|
|
336
|
+
* @return a promise, resolvable to unlocking function.
|
|
337
|
+
*/
|
|
338
|
+
lockForRead(): Promise<() => void>;
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* This method acquires lock for writing. This excludes both reads and other
|
|
342
|
+
* writes.
|
|
343
|
+
* @return a promise, resolvable to unlocking function.
|
|
344
|
+
*/
|
|
345
|
+
lockForWrite(): Promise<() => void>;
|
|
346
|
+
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* @return new read-write lock
|
|
351
|
+
*/
|
|
352
|
+
export function makeReadWriteLock(): ReadWriteLock {
|
|
353
|
+
|
|
354
|
+
interface Queued {
|
|
355
|
+
isWrite: boolean;
|
|
356
|
+
write?: (unlock: () => void) => void;
|
|
357
|
+
reads?: ((unlock: () => void) => void)[];
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
let isLockedForWrite = false;
|
|
361
|
+
let isLockedForRead = false;
|
|
362
|
+
const queue: Queued[] = [];
|
|
363
|
+
let readsInProgress = 0;
|
|
364
|
+
|
|
365
|
+
async function lockForWrite(): Promise<() => void> {
|
|
366
|
+
if (isLockedForRead || isLockedForWrite) {
|
|
367
|
+
return await new Promise<() => void>((resolve) => {
|
|
368
|
+
queue.push({
|
|
369
|
+
isWrite: true,
|
|
370
|
+
write: resolve
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
} else {
|
|
374
|
+
isLockedForWrite = true;
|
|
375
|
+
return oneTimeCaller(unlockAfterWrite);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function unlockAfterWrite(): void {
|
|
380
|
+
if (queue.length === 0) {
|
|
381
|
+
isLockedForWrite = false;
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const next = queue.shift();
|
|
385
|
+
if (!next) { return; }
|
|
386
|
+
if (next.isWrite) {
|
|
387
|
+
next.write!(oneTimeCaller(unlockAfterWrite));
|
|
388
|
+
} else {
|
|
389
|
+
isLockedForWrite = false;
|
|
390
|
+
isLockedForRead = true;
|
|
391
|
+
readsInProgress = next.reads!.length;
|
|
392
|
+
for (const read of next.reads!) {
|
|
393
|
+
read(oneTimeCaller(unlockAfterRead));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
async function lockForRead(): Promise<() => void> {
|
|
399
|
+
if (isLockedForRead) {
|
|
400
|
+
if (queue.length === 0) {
|
|
401
|
+
readsInProgress += 1;
|
|
402
|
+
return oneTimeCaller(unlockAfterRead);
|
|
403
|
+
} else {
|
|
404
|
+
return await queueRead();
|
|
405
|
+
}
|
|
406
|
+
} else if (isLockedForWrite) {
|
|
407
|
+
return await queueRead();
|
|
408
|
+
} else {
|
|
409
|
+
isLockedForRead = true;
|
|
410
|
+
readsInProgress = 1; // no plus, as it is the first read
|
|
411
|
+
return oneTimeCaller(unlockAfterRead);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
async function queueRead(): Promise<() => void> {
|
|
416
|
+
const last = queue[queue.length-1];
|
|
417
|
+
if (!last || last.isWrite) {
|
|
418
|
+
return await new Promise<() => void>((resolve) => {
|
|
419
|
+
queue.push({
|
|
420
|
+
isWrite: false,
|
|
421
|
+
reads: [ resolve ]
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
} else {
|
|
425
|
+
return await new Promise<() => void>((resolve) => {
|
|
426
|
+
last.reads!.push(resolve);
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function unlockAfterRead(): void {
|
|
432
|
+
readsInProgress -= 1;
|
|
433
|
+
if (readsInProgress > 0) { return; }
|
|
434
|
+
if (queue.length === 0) {
|
|
435
|
+
isLockedForRead = false;
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
const next = queue.shift();
|
|
439
|
+
if (!next) { return; }
|
|
440
|
+
if (next.isWrite) {
|
|
441
|
+
isLockedForWrite = true;
|
|
442
|
+
isLockedForRead = false;
|
|
443
|
+
next.write!(oneTimeCaller(unlockAfterWrite));
|
|
444
|
+
} else {
|
|
445
|
+
throw new Error('Read locking is incorrectly queued');
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
return { lockForRead, lockForWrite };
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export interface Deferred<T> {
|
|
453
|
+
promise: Promise<T>;
|
|
454
|
+
resolve: (result?: T|PromiseLike<T>) => void;
|
|
455
|
+
reject: (err: any) => void;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
export function defer<T>(): Deferred<T> {
|
|
459
|
+
const d = <Deferred<T>> {};
|
|
460
|
+
d.promise = new Promise<T>((resolve, reject) => {
|
|
461
|
+
d.resolve = resolve;
|
|
462
|
+
d.reject = reject;
|
|
463
|
+
});
|
|
464
|
+
Object.freeze(d);
|
|
465
|
+
return d;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
export class PressureValve {
|
|
469
|
+
|
|
470
|
+
private stopper: Deferred<void>|undefined = undefined;
|
|
471
|
+
|
|
472
|
+
constructor() {
|
|
473
|
+
Object.seal(this);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
toggle(flag: boolean): void {
|
|
477
|
+
if (flag) {
|
|
478
|
+
if (this.stopper) { return; }
|
|
479
|
+
this.stopper = defer();
|
|
480
|
+
} else {
|
|
481
|
+
if (!this.stopper) { return; }
|
|
482
|
+
this.stopper.resolve();
|
|
483
|
+
this.stopper = undefined;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
pressWithError(err: any): void {
|
|
488
|
+
this.toggle(true);
|
|
489
|
+
this.stopper!.reject(errWithCause(err, `Backpressure error`));
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
readonly pressure = async (): Promise<void> => {
|
|
493
|
+
if (!this.stopper) { return; }
|
|
494
|
+
await this.stopper.promise;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
}
|
|
498
|
+
Object.freeze(PressureValve.prototype);
|
|
499
|
+
Object.freeze(PressureValve);
|
|
500
|
+
|
|
501
|
+
Object.freeze(exports);
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2015 - 2017 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 { base64urlSafe } from './buffer-utils';
|
|
19
|
+
import { randomBytes } from 'crypto';
|
|
20
|
+
|
|
21
|
+
export function bytesSync(numOfBytes: number): Uint8Array {
|
|
22
|
+
return randomBytes(numOfBytes);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function bytes(numOfBytes: number): Promise<Uint8Array> {
|
|
26
|
+
return new Promise((res, rej) => randomBytes(numOfBytes, (err, buf) => {
|
|
27
|
+
if (err) { rej(err); }
|
|
28
|
+
else { res(buf); }
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function uint8Sync(): number {
|
|
33
|
+
return randomBytes(1)[0];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function uint8(): Promise<number> {
|
|
37
|
+
return (await randomBytes(1))[0];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function uint48Sync(): number {
|
|
41
|
+
const b = randomBytes(6);
|
|
42
|
+
const l = b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
|
|
43
|
+
const h = b[4] + (b[5] << 8);
|
|
44
|
+
return h*0x100000000 + l;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function uint48(): Promise<number> {
|
|
48
|
+
const b = await bytes(6);
|
|
49
|
+
const l = b[0] + (b[1] << 8) + (b[2] << 16) + (b[3] << 24);
|
|
50
|
+
const h = b[4] + (b[5] << 8);
|
|
51
|
+
return h*0x100000000 + l;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function stringOfB64UrlSafeCharsSync(numOfChars: number): string {
|
|
55
|
+
const numOfbytes = 3*(1 + Math.floor(numOfChars/4));
|
|
56
|
+
const byteArr = randomBytes(numOfbytes);
|
|
57
|
+
return base64urlSafe.pack(byteArr).substring(0, numOfChars);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function stringOfB64CharsSync(numOfChars: number): string {
|
|
61
|
+
const numOfbytes = 3*(1 + Math.floor(numOfChars/4));
|
|
62
|
+
return randomBytes(numOfbytes).toString('base64').substring(0, numOfChars);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function stringOfB64UrlSafeChars(numOfChars: number):
|
|
66
|
+
Promise<string> {
|
|
67
|
+
const numOfbytes = 3*(1 + Math.floor(numOfChars/4));
|
|
68
|
+
const byteArr = await bytes(numOfbytes);
|
|
69
|
+
return base64urlSafe.pack(byteArr).substring(0, numOfChars);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export async function stringOfB64Chars(numOfChars: number):
|
|
73
|
+
Promise<string> {
|
|
74
|
+
const numOfbytes = 3*(1 + Math.floor(numOfChars/4));
|
|
75
|
+
const byteArr = await bytes(numOfbytes);
|
|
76
|
+
return (byteArr as Buffer).toString('base64').substring(0, numOfChars);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
Object.freeze(exports);
|