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,656 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2015 - 2017, 2020 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 * as fs from 'fs';
|
|
19
|
+
import { createReadStream, createWriteStream, statSync } from 'fs';
|
|
20
|
+
import { Readable, Writable } from 'stream';
|
|
21
|
+
import { FileException, Code as excCode, makeFileException }
|
|
22
|
+
from './exceptions/file';
|
|
23
|
+
import { SingleProc, defer, Deferred } from './processes';
|
|
24
|
+
import { BytesFIFOBuffer } from './byte-streaming/common';
|
|
25
|
+
import { toBuffer } from './buffer-utils';
|
|
26
|
+
import { join } from 'path';
|
|
27
|
+
|
|
28
|
+
export { Stats } from 'fs';
|
|
29
|
+
export { FileException } from './exceptions/file';
|
|
30
|
+
|
|
31
|
+
function makeFileExceptionFromNodes(nodeExc: NodeJS.ErrnoException):
|
|
32
|
+
FileException {
|
|
33
|
+
return makeFileException(nodeExc.code!, nodeExc.path!);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function readFile(filename: string,
|
|
37
|
+
options: { encoding: string; flag?: string; }): Promise<string>;
|
|
38
|
+
export function readFile(filename: string,
|
|
39
|
+
options?: { flag?: string; }): Promise<Buffer>;
|
|
40
|
+
export function readFile(path: string,
|
|
41
|
+
options?: { flag?: string; encoding?: string; }): Promise<Buffer|string> {
|
|
42
|
+
return new Promise<Buffer>((resolve, reject) => {
|
|
43
|
+
const cb = (err, data) => {
|
|
44
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
45
|
+
else { resolve(data); }
|
|
46
|
+
};
|
|
47
|
+
if (options) {
|
|
48
|
+
fs.readFile(path, options as any, cb);
|
|
49
|
+
} else {
|
|
50
|
+
fs.readFile(path, cb);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function writeFile(path: string, data: any,
|
|
56
|
+
options: { encoding?: string; mode?: number|string; flag?: string; }):
|
|
57
|
+
Promise<void> {
|
|
58
|
+
return new Promise<void>((resolve, reject) => {
|
|
59
|
+
fs.writeFile(path, data, options as any, (err) => {
|
|
60
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
61
|
+
else { resolve(); }
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function mkdir(path: string): Promise<void> {
|
|
67
|
+
return new Promise<void>((resolve, reject) => {
|
|
68
|
+
fs.mkdir(path, (err) => {
|
|
69
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
70
|
+
else { resolve(); }
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function open(path: string, flags: string): Promise<number> {
|
|
76
|
+
return new Promise<number>((resolve, reject) => {
|
|
77
|
+
fs.open(path, flags, (err, df) => {
|
|
78
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
79
|
+
else { resolve(df); }
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function writeOrig(fd: number, buffer: Buffer, offset: number,
|
|
85
|
+
length: number, position?: number): Promise<number> {
|
|
86
|
+
return new Promise<number>((resolve, reject) => {
|
|
87
|
+
const cb = (err, written) => {
|
|
88
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
89
|
+
else { resolve(written); }
|
|
90
|
+
};
|
|
91
|
+
if (typeof position === 'number') {
|
|
92
|
+
fs.write(fd, buffer, offset, length, position, cb);
|
|
93
|
+
} else {
|
|
94
|
+
fs.write(fd, buffer, offset, length, cb);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function readOrig(fd: number, buffer: Buffer, offset: number,
|
|
100
|
+
length: number, position: number): Promise<number> {
|
|
101
|
+
return new Promise<number>((resolve, reject) => {
|
|
102
|
+
fs.read(fd, buffer, offset, length, position, (err, bytesRead) => {
|
|
103
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
104
|
+
else { resolve(bytesRead); }
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function close(fd: number): Promise<void> {
|
|
110
|
+
return new Promise<void>((resolve, reject) => {
|
|
111
|
+
fs.close(fd, (err) => {
|
|
112
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
113
|
+
else { resolve(); }
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function symlink(target: string, path: string,
|
|
119
|
+
type?: 'dir'|'file'|'junction'): Promise<void> {
|
|
120
|
+
return new Promise<void>((resolve, reject) => {
|
|
121
|
+
fs.symlink(target, path, type, (err) => {
|
|
122
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
123
|
+
else { resolve(); }
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function readlink(path: string): Promise<string> {
|
|
129
|
+
return new Promise<string>((resolve, reject) => {
|
|
130
|
+
fs.readlink(path, (err, targetPath) => {
|
|
131
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
132
|
+
else { resolve(targetPath); }
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function lstat(path: string): Promise<fs.Stats> {
|
|
138
|
+
return new Promise<fs.Stats>((resolve, reject) => {
|
|
139
|
+
fs.lstat(path, (err, stat) => {
|
|
140
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
141
|
+
else { resolve(stat); }
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function stat(path: string): Promise<fs.Stats> {
|
|
147
|
+
return new Promise<fs.Stats>((resolve, reject) => {
|
|
148
|
+
fs.stat(path, (err, stat) => {
|
|
149
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
150
|
+
else { resolve(stat); }
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function fstat(fd: number): Promise<fs.Stats> {
|
|
156
|
+
return new Promise<fs.Stats>((resolve, reject) => {
|
|
157
|
+
fs.fstat(fd, (err, stat) => {
|
|
158
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
159
|
+
else { resolve(stat); }
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function readdir(path: string): Promise<string[]> {
|
|
165
|
+
return new Promise<string[]>((resolve, reject) => {
|
|
166
|
+
fs.readdir(path, (err, list) => {
|
|
167
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
168
|
+
else { resolve(list); }
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function rmdir(path: string): Promise<void> {
|
|
174
|
+
return new Promise<void>((resolve, reject) => {
|
|
175
|
+
fs.rmdir(path, (err) => {
|
|
176
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
177
|
+
else { resolve(); }
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function unlink(path: string): Promise<void> {
|
|
183
|
+
return new Promise<void>((resolve, reject) => {
|
|
184
|
+
fs.unlink(path, (err) => {
|
|
185
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
186
|
+
else { resolve(); }
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function rename(oldPath: string, newPath: string): Promise<void> {
|
|
192
|
+
return new Promise<void>((resolve, reject) => {
|
|
193
|
+
fs.rename(oldPath, newPath, (err) => {
|
|
194
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
195
|
+
else { resolve(); }
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function truncate(path: string, size: number): Promise<void> {
|
|
201
|
+
return new Promise<void>((resolve, reject) => {
|
|
202
|
+
fs.truncate(path, size, (err) => {
|
|
203
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
204
|
+
else { resolve(); }
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function ftruncate(fd: number, size: number): Promise<void> {
|
|
210
|
+
return new Promise<void>((resolve, reject) => {
|
|
211
|
+
fs.ftruncate(fd, size, (err) => {
|
|
212
|
+
if (err) { reject(makeFileExceptionFromNodes(err)); }
|
|
213
|
+
else { resolve(); }
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* @param fd is an open file descriptor
|
|
220
|
+
* @param pos is a position in the file, from which reading should start
|
|
221
|
+
* @param buf is a buffer, into which bytes should be read from start to
|
|
222
|
+
* the end, i.e. number of bytes that must be read is equal to the buffer's
|
|
223
|
+
* length.
|
|
224
|
+
* @returns a promise, resolvable when buffer is completely filled with bytes
|
|
225
|
+
* from the file.
|
|
226
|
+
* The promise fails, if an end of file is encountered before entire buffer is
|
|
227
|
+
* filled up with bytes.
|
|
228
|
+
*/
|
|
229
|
+
export async function readToBuf(fd: number, pos: number, buf: Buffer):
|
|
230
|
+
Promise<void> {
|
|
231
|
+
if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
|
|
232
|
+
'Illegal file position given: '+pos); }
|
|
233
|
+
let bytesRead = 0
|
|
234
|
+
while (bytesRead < buf.length) {
|
|
235
|
+
const bNum = await readOrig(fd, buf, bytesRead, buf.length-bytesRead, pos);
|
|
236
|
+
if (bNum === 0) { throw makeFileException(excCode.endOfFile, '<file descriptor>'); }
|
|
237
|
+
bytesRead += bNum;
|
|
238
|
+
pos += bNum;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @param fd is an open file descriptor
|
|
244
|
+
* @param pos is a position in the file, from which writing should start
|
|
245
|
+
* @param buf is a buffer, from which all bytes should be written into the file.
|
|
246
|
+
* @returns a promise, resolvable when all bytes were written to the file.
|
|
247
|
+
*/
|
|
248
|
+
export async function writeFromBuf(fd: number, pos: number, buf: Buffer):
|
|
249
|
+
Promise<void> {
|
|
250
|
+
if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
|
|
251
|
+
'Illegal file position given: '+pos); }
|
|
252
|
+
let bytesWritten = 0;
|
|
253
|
+
while (bytesWritten < buf.length) {
|
|
254
|
+
const bNum = await writeOrig(fd, buf,
|
|
255
|
+
bytesWritten, buf.length-bytesWritten, pos);
|
|
256
|
+
bytesWritten += bNum;
|
|
257
|
+
pos += bNum;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const SINGLE_BYTE_BUF = Buffer.alloc(1);
|
|
262
|
+
SINGLE_BYTE_BUF[0] = 0;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* This will create a new file of a given size, and will fail, if a file
|
|
266
|
+
* with a given path already exists.
|
|
267
|
+
* @param filePath
|
|
268
|
+
* @param fileSize
|
|
269
|
+
* @param keepFileOpen
|
|
270
|
+
* @returns a promise, resolvable, when a new empty file has been created.
|
|
271
|
+
* When keep open flag was passed, live numeric file descriptor is returned,
|
|
272
|
+
* else return value is undefined and should be ignored.
|
|
273
|
+
*/
|
|
274
|
+
export async function createEmptyFile(filePath: string, fileSize: number,
|
|
275
|
+
keepFileOpen?: boolean): Promise<number|undefined> {
|
|
276
|
+
if ((typeof fileSize !== 'number') || (fileSize < 0)) { throw new Error(
|
|
277
|
+
'Illegal file size given: '+fileSize); }
|
|
278
|
+
let fileDescr: number|undefined;
|
|
279
|
+
try {
|
|
280
|
+
fileDescr = await open(filePath, 'wx');
|
|
281
|
+
if (fileSize > 0) {
|
|
282
|
+
await writeOrig(fileDescr, SINGLE_BYTE_BUF, 0, 1, fileSize-1);
|
|
283
|
+
}
|
|
284
|
+
if (keepFileOpen) { return fileDescr; }
|
|
285
|
+
await close(fileDescr);
|
|
286
|
+
} catch (exc) {
|
|
287
|
+
if (fileDescr) {
|
|
288
|
+
close(fileDescr).catch(() => {});
|
|
289
|
+
}
|
|
290
|
+
throw exc;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @param path
|
|
296
|
+
* @return true, if given path represents directory, or false, if it does not.
|
|
297
|
+
*/
|
|
298
|
+
export function existsFolderSync(path: string): boolean {
|
|
299
|
+
try {
|
|
300
|
+
if (statSync(path).isDirectory()) {
|
|
301
|
+
return true;
|
|
302
|
+
} else {
|
|
303
|
+
throw makeFileException(excCode.notDirectory, path);
|
|
304
|
+
}
|
|
305
|
+
} catch (e) {
|
|
306
|
+
if ((<NodeJS.ErrnoException> e).code === excCode.notFound) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
throw e;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* @param filePath
|
|
315
|
+
* @return a promise, resolvable to file's size.
|
|
316
|
+
*/
|
|
317
|
+
export async function getFileSize(filePath: string): Promise<number> {
|
|
318
|
+
const st = await stat(filePath);
|
|
319
|
+
return st.size;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* This returns a promise of total size of given folder's content.
|
|
324
|
+
* Sizes of linked objects are not included.
|
|
325
|
+
* @param folderPath
|
|
326
|
+
*/
|
|
327
|
+
export async function getFolderContentSize(folderPath: string):
|
|
328
|
+
Promise<number> {
|
|
329
|
+
const list = await readdir(folderPath);
|
|
330
|
+
let size = 0;
|
|
331
|
+
for (const childName of list) {
|
|
332
|
+
const childPath = `${folderPath}/${childName}`;
|
|
333
|
+
const childStats = await stat(childPath);
|
|
334
|
+
if (childStats.isFile()) {
|
|
335
|
+
size += childStats.size;
|
|
336
|
+
} else if (childStats.isDirectory()) {
|
|
337
|
+
size += await getFolderContentSize(childPath);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return size;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* @param fd is an open file descriptor
|
|
345
|
+
* @param pos is a position in the file, from which writing should start
|
|
346
|
+
* @param buf is a buffer, from which all bytes should be written into the file.
|
|
347
|
+
* @returns a promise, resolvable when all bytes were written to it.
|
|
348
|
+
*/
|
|
349
|
+
export async function write(fd: number, pos: number, buf: Buffer):
|
|
350
|
+
Promise<void> {
|
|
351
|
+
if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
|
|
352
|
+
'Illegal file position given: '+pos); }
|
|
353
|
+
let bytesWritten = 0;
|
|
354
|
+
while (bytesWritten < buf.length) {
|
|
355
|
+
const bNum = await writeOrig(fd, buf,
|
|
356
|
+
bytesWritten, buf.length-bytesWritten, pos);
|
|
357
|
+
bytesWritten += bNum;
|
|
358
|
+
pos += bNum;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* @param fd is an open file descriptor in append mode.
|
|
364
|
+
* @param buf is a buffer, from which all bytes should be written into the file.
|
|
365
|
+
* @returns a promise, resolvable when all bytes were written to it.
|
|
366
|
+
*/
|
|
367
|
+
export async function append(fd: number, buf: Buffer):
|
|
368
|
+
Promise<void> {
|
|
369
|
+
let bytesWritten = 0;
|
|
370
|
+
while (bytesWritten < buf.length) {
|
|
371
|
+
const bNum = await writeOrig(fd, buf,
|
|
372
|
+
bytesWritten, buf.length-bytesWritten);
|
|
373
|
+
bytesWritten += bNum;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* @param filePath is a path to an existing file
|
|
379
|
+
* @param pos is a position in the file, from which writing should start
|
|
380
|
+
* @param buf is a buffer, from which all bytes should be written into the file.
|
|
381
|
+
* @returns a promise, resolvable when all bytes were written to it.
|
|
382
|
+
*/
|
|
383
|
+
async function writeToExistingFile(filePath: string, pos: number,
|
|
384
|
+
buf: Buffer): Promise<void> {
|
|
385
|
+
const fd = await open(filePath, 'r+');
|
|
386
|
+
try {
|
|
387
|
+
await write(fd, pos, buf);
|
|
388
|
+
} finally {
|
|
389
|
+
await close(fd);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* @param filePath
|
|
395
|
+
* @param pos is a position in the file, from which writting should start
|
|
396
|
+
* @param len is a number of bytes to read from a source and write into a file
|
|
397
|
+
* @param src is a readable stream, from which bytes should be written into a
|
|
398
|
+
* file
|
|
399
|
+
* @param bufSize is a size of the buffer, used in this streaming
|
|
400
|
+
* @return a promise, resolvable when streaming into file from a given readable
|
|
401
|
+
* source completes.
|
|
402
|
+
*/
|
|
403
|
+
export async function streamToExistingFile(filePath: string, pos: number,
|
|
404
|
+
len: number, src: Readable, bufSize: number): Promise<void> {
|
|
405
|
+
if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
|
|
406
|
+
'Illegal file position given: '+pos); }
|
|
407
|
+
if ((typeof len !== 'number') || (len < 1)) { throw new Error(
|
|
408
|
+
'Illegal length given: '+len); }
|
|
409
|
+
if ((typeof bufSize !== 'number') || (bufSize < 1024)) { throw new Error(
|
|
410
|
+
'Illegal buffer size given: '+bufSize); }
|
|
411
|
+
|
|
412
|
+
const writeProc = new SingleProc();
|
|
413
|
+
let bytesWritten = 0;
|
|
414
|
+
let bytesRead = 0;
|
|
415
|
+
const buf = new BytesFIFOBuffer();
|
|
416
|
+
let deferred: Deferred<void>|undefined = defer<void>();
|
|
417
|
+
let doneReading = false;
|
|
418
|
+
|
|
419
|
+
const complete = (err?: any): void => {
|
|
420
|
+
if (!deferred) { return; }
|
|
421
|
+
if (err) { deferred.reject(err); }
|
|
422
|
+
else { deferred.resolve(); }
|
|
423
|
+
deferred = undefined;
|
|
424
|
+
doneReading = true;
|
|
425
|
+
buf.clear();
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
src.on('data', (data: Buffer) => {
|
|
429
|
+
if (doneReading || !deferred) { return; }
|
|
430
|
+
buf.push(data);
|
|
431
|
+
bytesRead += data.length;
|
|
432
|
+
|
|
433
|
+
if (bytesRead >= len) {
|
|
434
|
+
doneReading = true;
|
|
435
|
+
} else if (buf.length < bufSize) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
writeProc.startOrChain(async () => {
|
|
440
|
+
if (!deferred) { return; }
|
|
441
|
+
try {
|
|
442
|
+
const bytesToWrite = buf.getBytes(len - bytesWritten, true);
|
|
443
|
+
if (!bytesToWrite) { return; }
|
|
444
|
+
await writeToExistingFile(filePath, pos, toBuffer(bytesToWrite));
|
|
445
|
+
pos += bytesToWrite.length;
|
|
446
|
+
bytesWritten += bytesToWrite.length;
|
|
447
|
+
if (bytesWritten < len) { return; }
|
|
448
|
+
complete();
|
|
449
|
+
} catch (err) {
|
|
450
|
+
complete(err);
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
src.on('end', () => {
|
|
457
|
+
if (doneReading) { return; }
|
|
458
|
+
complete(makeFileException(excCode.endOfFile, '<input stream>'));
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
src.on('error', (err) => {
|
|
462
|
+
complete(err);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
src.resume(); // noop, if stream wasn't paused
|
|
466
|
+
|
|
467
|
+
return deferred.promise;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* @param fd is an open file descriptor
|
|
472
|
+
* @param pos is a position in the file, from which reading should start
|
|
473
|
+
* @param buf is a buffer, into which bytes should be read from start to
|
|
474
|
+
* the end, i.e. number of bytes that must be read is equal to the buffer's
|
|
475
|
+
* length.
|
|
476
|
+
* @returns a promise, resolvable when buffer is completely filled with bytes
|
|
477
|
+
* from the file.
|
|
478
|
+
* The promise fails, if an end of file is encountered before entire buffer is
|
|
479
|
+
* filled up with bytes.
|
|
480
|
+
*/
|
|
481
|
+
export async function read(fd: number, pos: number, buf: Buffer):
|
|
482
|
+
Promise<void> {
|
|
483
|
+
if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
|
|
484
|
+
'Illegal file position given: '+pos); }
|
|
485
|
+
let bytesRead = 0
|
|
486
|
+
while (bytesRead < buf.length) {
|
|
487
|
+
const bNum = await readOrig(fd, buf, bytesRead, buf.length-bytesRead, pos);
|
|
488
|
+
if (bNum === 0) { throw makeFileException(excCode.endOfFile, '<file descriptor>'); }
|
|
489
|
+
bytesRead += bNum;
|
|
490
|
+
pos += bNum;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* @param filePath is a file's path, from which to read
|
|
496
|
+
* @param pos is a position in the file, from which reading should start
|
|
497
|
+
* @param buf is a buffer, into which bytes should be read from start to
|
|
498
|
+
* the end, i.e. number of bytes that must be read is equal to the buffer's
|
|
499
|
+
* length.
|
|
500
|
+
* @returns a promise, resolvable when buffer is completely filled with bytes
|
|
501
|
+
* from the file.
|
|
502
|
+
* The promise fails, if an end of file is encountered before entire buffer is
|
|
503
|
+
* filled up with bytes.
|
|
504
|
+
*/
|
|
505
|
+
async function readFromFile(filePath: string, pos: number, buf: Buffer):
|
|
506
|
+
Promise<void> {
|
|
507
|
+
const fd = await open(filePath, 'r');
|
|
508
|
+
try {
|
|
509
|
+
return read(fd, pos, buf);
|
|
510
|
+
} finally {
|
|
511
|
+
return close(fd);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* @param folder is a path to a folder, which should be recursively removed,
|
|
517
|
+
* together with all files.
|
|
518
|
+
* @returns a promise, resolvable, when a folder has been recursively removed.
|
|
519
|
+
*/
|
|
520
|
+
export async function rmDirWithContent(folder: string): Promise<void> {
|
|
521
|
+
const files = await readdir(folder);
|
|
522
|
+
if (files.length === 0) {
|
|
523
|
+
await rmdir(folder);
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
const rmTasks: Promise<void>[] = [];
|
|
527
|
+
for (const name of files) {
|
|
528
|
+
const innerPath = `${folder}/${name}`;
|
|
529
|
+
const task = lstat(innerPath)
|
|
530
|
+
.then((st) => {
|
|
531
|
+
if (st.isDirectory()) {
|
|
532
|
+
return rmDirWithContent(innerPath);
|
|
533
|
+
} else {
|
|
534
|
+
return unlink(innerPath);
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
rmTasks.push(task);
|
|
538
|
+
}
|
|
539
|
+
await Promise.all(rmTasks);
|
|
540
|
+
await rmdir(folder);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* @param w is a writable stream
|
|
545
|
+
* @param buf is buffer of bytes that should be sunk into given stream
|
|
546
|
+
* @return a promise, resolvable when all bytes have been absobed by the
|
|
547
|
+
* writable.
|
|
548
|
+
*/
|
|
549
|
+
function sinkBytes(w: Writable, buf: Buffer): Promise<void> {
|
|
550
|
+
return new Promise<void>((resolve, reject) => {
|
|
551
|
+
w.write(buf, (err) => {
|
|
552
|
+
if (err) { reject(err); }
|
|
553
|
+
else { resolve(); }
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* @param filePath
|
|
560
|
+
* @param pos is a position in the file, from which read should start
|
|
561
|
+
* @param len is a number of bytes to read from file and write into a sink
|
|
562
|
+
* @param sink is a writable stream, into which bytes should be sunk
|
|
563
|
+
* @param bufSize is a size of the buffer, used in this streaming
|
|
564
|
+
* @return a promise, resolvable when streaming from file into given writable
|
|
565
|
+
* sink completes.
|
|
566
|
+
*/
|
|
567
|
+
export async function streamFromFile(filePath: string, pos: number,
|
|
568
|
+
len: number, sink: Writable, bufSize: number): Promise<void> {
|
|
569
|
+
if ((typeof pos !== 'number') || (pos < 0)) { throw new Error(
|
|
570
|
+
'Illegal file position given: '+pos); }
|
|
571
|
+
if ((typeof len !== 'number') || (len < 1)) { throw new Error(
|
|
572
|
+
'Illegal length given: '+len); }
|
|
573
|
+
if ((typeof bufSize !== 'number') || (bufSize < 1024)) { throw new Error(
|
|
574
|
+
'Illegal buffer size given: '+bufSize); }
|
|
575
|
+
let buf = Buffer.alloc(Math.min(bufSize, len));
|
|
576
|
+
let byteCount = 0;
|
|
577
|
+
while (byteCount < len) {
|
|
578
|
+
const bytesLeft = len - byteCount;
|
|
579
|
+
if (buf.length > bytesLeft) {
|
|
580
|
+
buf = buf.slice(0, bytesLeft);
|
|
581
|
+
}
|
|
582
|
+
await readFromFile(filePath, pos+byteCount, buf);
|
|
583
|
+
await sinkBytes(sink, buf);
|
|
584
|
+
byteCount += buf.length;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* This pipes source file into destination file.
|
|
590
|
+
* @param src
|
|
591
|
+
* @param dst
|
|
592
|
+
* @param overwrite
|
|
593
|
+
* @return a promise, resolvable when piping completes.
|
|
594
|
+
*/
|
|
595
|
+
export function copyFile(src: string, dst: string, overwrite = false,
|
|
596
|
+
dstMode = '660'): Promise<void> {
|
|
597
|
+
return new Promise<void>((resolve, reject) => {
|
|
598
|
+
const srcStream = createReadStream(src);
|
|
599
|
+
const dstStream = createWriteStream(dst, {
|
|
600
|
+
mode: parseInt(dstMode, 8),
|
|
601
|
+
flags: (overwrite ? 'w' : 'wx')
|
|
602
|
+
});
|
|
603
|
+
srcStream.pipe(dstStream);
|
|
604
|
+
dstStream.on('finish', () => {
|
|
605
|
+
resolve();
|
|
606
|
+
});
|
|
607
|
+
const isRejected = false;
|
|
608
|
+
const onErr = (err) => {
|
|
609
|
+
if (!isRejected) {
|
|
610
|
+
reject(err);
|
|
611
|
+
srcStream.unpipe();
|
|
612
|
+
}
|
|
613
|
+
};
|
|
614
|
+
srcStream.on('error', onErr);
|
|
615
|
+
dstStream.on('error', onErr);
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
/**
|
|
620
|
+
* This copies tree of files from source to destination folders.
|
|
621
|
+
* Target folders may exist in a destination tree.
|
|
622
|
+
* Objects that are neither files, nor folders, are ignored.
|
|
623
|
+
* @param src
|
|
624
|
+
* @param dst
|
|
625
|
+
* @param fileOverwrite when set to true, allows to overwrite files in a
|
|
626
|
+
* destination tree. Otherwise, exception is thrown on already existing files.
|
|
627
|
+
* @return a promise resolvable when the whole tree is copied from source to
|
|
628
|
+
* destination.
|
|
629
|
+
*/
|
|
630
|
+
export async function copyTree(
|
|
631
|
+
src: string, dst: string, fileOverwrite = false
|
|
632
|
+
): Promise<void> {
|
|
633
|
+
// ensure presence of destination folder
|
|
634
|
+
await mkdir(dst).catch((exc: FileException) => {
|
|
635
|
+
if (!exc.alreadyExists) { throw exc; }
|
|
636
|
+
});
|
|
637
|
+
// copy files and folders from src folder
|
|
638
|
+
const srcFNames = await readdir(src);
|
|
639
|
+
const cpTasks: Promise<void>[] = [];
|
|
640
|
+
for (const fName of srcFNames) {
|
|
641
|
+
const srcPath = join(src, fName);
|
|
642
|
+
const dstPath = join(dst, fName);
|
|
643
|
+
const task = stat(srcPath)
|
|
644
|
+
.then((stats) => {
|
|
645
|
+
if (stats.isFile()) {
|
|
646
|
+
return copyFile(srcPath, dstPath, fileOverwrite);
|
|
647
|
+
} else if (stats.isDirectory()) {
|
|
648
|
+
return copyTree(srcPath, dstPath, fileOverwrite);
|
|
649
|
+
}
|
|
650
|
+
});
|
|
651
|
+
cpTasks.push(task);
|
|
652
|
+
}
|
|
653
|
+
await Promise.all(cpTasks);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
Object.freeze(exports);
|