@bitblit/ratchet-epsilon-common 4.0.85-alpha
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/CHANGELOG.md +177 -0
- package/License.txt +13 -0
- package/README.md +242 -0
- package/dist/cjs/background/background-dynamo-log-table-handler.js +38 -0
- package/dist/cjs/background/background-entry.js +2 -0
- package/dist/cjs/background/background-execution-event-type.js +11 -0
- package/dist/cjs/background/background-execution-event.js +2 -0
- package/dist/cjs/background/background-execution-listener.js +2 -0
- package/dist/cjs/background/background-handler.js +269 -0
- package/dist/cjs/background/background-http-adapter-handler.js +127 -0
- package/dist/cjs/background/background-meta-response-internal.js +2 -0
- package/dist/cjs/background/background-process-handling.js +8 -0
- package/dist/cjs/background/background-process-log-table-entry.js +2 -0
- package/dist/cjs/background/background-queue-response-internal.js +2 -0
- package/dist/cjs/background/background-validator.js +88 -0
- package/dist/cjs/background/epsilon-background-process-error.js +93 -0
- package/dist/cjs/background/internal-background-entry.js +2 -0
- package/dist/cjs/background/manager/abstract-background-manager.js +92 -0
- package/dist/cjs/background/manager/aws-sqs-sns-background-manager.js +153 -0
- package/dist/cjs/background/manager/background-manager-like.js +2 -0
- package/dist/cjs/background/manager/single-thread-local-background-manager.js +49 -0
- package/dist/cjs/background/s3-background-transaction-logger.js +54 -0
- package/dist/cjs/build/ratchet-epsilon-common-info.js +18 -0
- package/dist/cjs/built-in/background/echo-processor.js +18 -0
- package/dist/cjs/built-in/background/log-and-enqueue-echo-processor.js +16 -0
- package/dist/cjs/built-in/background/log-message-background-error-processor.js +10 -0
- package/dist/cjs/built-in/background/no-op-processor.js +13 -0
- package/dist/cjs/built-in/background/retry-processor.js +41 -0
- package/dist/cjs/built-in/background/sample-delay-processor.js +16 -0
- package/dist/cjs/built-in/background/sample-input-validated-processor-data.js +2 -0
- package/dist/cjs/built-in/background/sample-input-validated-processor.js +16 -0
- package/dist/cjs/built-in/built-in-trace-id-generators.js +25 -0
- package/dist/cjs/built-in/daemon/daemon-authorizer-function.js +2 -0
- package/dist/cjs/built-in/daemon/daemon-config.js +2 -0
- package/dist/cjs/built-in/daemon/daemon-group-selection-function.js +2 -0
- package/dist/cjs/built-in/daemon/daemon-handler.js +62 -0
- package/dist/cjs/built-in/daemon/daemon-process-state-list.js +2 -0
- package/dist/cjs/built-in/http/apollo-filter.js +63 -0
- package/dist/cjs/built-in/http/built-in-auth-filters.js +115 -0
- package/dist/cjs/built-in/http/built-in-authorizers.js +43 -0
- package/dist/cjs/built-in/http/built-in-filters.js +222 -0
- package/dist/cjs/built-in/http/built-in-handlers.js +73 -0
- package/dist/cjs/built-in/http/log-level-manipulation-filter.js +20 -0
- package/dist/cjs/built-in/http/run-handler-as-filter.js +64 -0
- package/dist/cjs/cli-bootstrap/epsilon-run-background-process-from-command-line-dry-run.js +20 -0
- package/dist/cjs/config/background/background-aws-config.js +2 -0
- package/dist/cjs/config/background/background-config.js +2 -0
- package/dist/cjs/config/background/background-error-processor.js +2 -0
- package/dist/cjs/config/background/background-processor.js +2 -0
- package/dist/cjs/config/background/background-transaction-log.js +2 -0
- package/dist/cjs/config/background/background-transaction-logger.js +2 -0
- package/dist/cjs/config/cron/abstract-cron-entry.js +2 -0
- package/dist/cjs/config/cron/cron-background-entry.js +2 -0
- package/dist/cjs/config/cron/cron-config.js +2 -0
- package/dist/cjs/config/dynamo-db-config.js +2 -0
- package/dist/cjs/config/epsilon-config.js +2 -0
- package/dist/cjs/config/epsilon-lambda-event-handler.js +2 -0
- package/dist/cjs/config/epsilon-logger-config.js +2 -0
- package/dist/cjs/config/generic-aws-event-handler-function.js +2 -0
- package/dist/cjs/config/http/authorizer-function.js +2 -0
- package/dist/cjs/config/http/epsilon-authorization-context.js +2 -0
- package/dist/cjs/config/http/extended-api-gateway-event.js +2 -0
- package/dist/cjs/config/http/filter-chain-context.js +2 -0
- package/dist/cjs/config/http/filter-function.js +2 -0
- package/dist/cjs/config/http/handler-function.js +2 -0
- package/dist/cjs/config/http/http-config.js +2 -0
- package/dist/cjs/config/http/http-processing-config.js +2 -0
- package/dist/cjs/config/http/mapped-http-processing-config.js +2 -0
- package/dist/cjs/config/http/null-returned-object-handling.js +9 -0
- package/dist/cjs/config/inter-api/inter-api-aws-config.js +2 -0
- package/dist/cjs/config/inter-api/inter-api-config.js +2 -0
- package/dist/cjs/config/inter-api/inter-api-process-mapping.js +2 -0
- package/dist/cjs/config/logging-trace-id-generator.js +2 -0
- package/dist/cjs/config/open-api/open-api-document-components.js +2 -0
- package/dist/cjs/config/open-api/open-api-document-path.js +2 -0
- package/dist/cjs/config/open-api/open-api-document.js +2 -0
- package/dist/cjs/config/s3-config.js +2 -0
- package/dist/cjs/config/sns-config.js +2 -0
- package/dist/cjs/epsilon-build-properties.js +28 -0
- package/dist/cjs/epsilon-constants.js +49 -0
- package/dist/cjs/epsilon-global-handler.js +155 -0
- package/dist/cjs/epsilon-instance.js +2 -0
- package/dist/cjs/epsilon-logging-extension-processor.js +19 -0
- package/dist/cjs/http/auth/api-gateway-adapter-authentication-handler.js +75 -0
- package/dist/cjs/http/auth/auth0-web-token-manipulator.js +62 -0
- package/dist/cjs/http/auth/basic-auth-token.js +2 -0
- package/dist/cjs/http/auth/google-web-token-manipulator.js +72 -0
- package/dist/cjs/http/auth/jwt-ratchet-local-web-token-manipulator.js +29 -0
- package/dist/cjs/http/auth/local-web-token-manipulator.js +74 -0
- package/dist/cjs/http/auth/web-token-manipulator.js +2 -0
- package/dist/cjs/http/error/bad-gateway.js +12 -0
- package/dist/cjs/http/error/bad-request-error.js +12 -0
- package/dist/cjs/http/error/conflict-error.js +12 -0
- package/dist/cjs/http/error/epsilon-http-error.js +132 -0
- package/dist/cjs/http/error/forbidden-error.js +12 -0
- package/dist/cjs/http/error/gateway-timeout.js +12 -0
- package/dist/cjs/http/error/method-not-allowed-error.js +12 -0
- package/dist/cjs/http/error/misconfigured-error.js +12 -0
- package/dist/cjs/http/error/not-found-error.js +12 -0
- package/dist/cjs/http/error/not-implemented.js +12 -0
- package/dist/cjs/http/error/request-timeout-error.js +12 -0
- package/dist/cjs/http/error/service-unavailable.js +12 -0
- package/dist/cjs/http/error/too-many-requests-error.js +12 -0
- package/dist/cjs/http/error/unauthorized-error.js +12 -0
- package/dist/cjs/http/event-util.js +180 -0
- package/dist/cjs/http/response-util.js +146 -0
- package/dist/cjs/http/route/epsilon-router.js +2 -0
- package/dist/cjs/http/route/extended-auth-response-context.js +2 -0
- package/dist/cjs/http/route/route-mapping.js +2 -0
- package/dist/cjs/http/route/route-validator-config.js +2 -0
- package/dist/cjs/http/route/router-util.js +238 -0
- package/dist/cjs/http/web-handler.js +122 -0
- package/dist/cjs/http/web-v2-handler.js +25 -0
- package/dist/cjs/index.js +136 -0
- package/dist/cjs/inter-api/inter-api-entry.js +2 -0
- package/dist/cjs/inter-api/inter-api-util.js +62 -0
- package/dist/cjs/inter-api-manager.js +67 -0
- package/dist/cjs/lambda-event-handler/cron-epsilon-lambda-event-handler.js +76 -0
- package/dist/cjs/lambda-event-handler/dynamo-epsilon-lambda-event-handler.js +36 -0
- package/dist/cjs/lambda-event-handler/generic-sns-epsilon-lambda-event-handler.js +32 -0
- package/dist/cjs/lambda-event-handler/inter-api-epsilon-lambda-event-handler.js +26 -0
- package/dist/cjs/lambda-event-handler/s3-epsilon-lambda-event-handler.js +44 -0
- package/dist/cjs/local-container-server.js +79 -0
- package/dist/cjs/local-server-cert.js +71 -0
- package/dist/cjs/local-server.js +145 -0
- package/dist/cjs/open-api-util/open-api-doc-modifications.js +2 -0
- package/dist/cjs/open-api-util/open-api-doc-modifier.js +83 -0
- package/dist/cjs/open-api-util/yaml-combiner.js +32 -0
- package/dist/cjs/run-background-process-from-command-line.js +37 -0
- package/dist/cjs/sample/sample-batch-only-local-server.js +19 -0
- package/dist/cjs/sample/sample-local-server.js +30 -0
- package/dist/cjs/sample/sample-server-components.js +197 -0
- package/dist/cjs/test-error-server.js +48 -0
- package/dist/cjs/util/aws-util.js +69 -0
- package/dist/cjs/util/context-util.js +104 -0
- package/dist/cjs/util/cron-util.js +72 -0
- package/dist/cjs/util/epsilon-config-parser.js +70 -0
- package/dist/es/background/background-dynamo-log-table-handler.js +33 -0
- package/dist/es/background/background-entry.js +1 -0
- package/dist/es/background/background-execution-event-type.js +8 -0
- package/dist/es/background/background-execution-event.js +1 -0
- package/dist/es/background/background-execution-listener.js +1 -0
- package/dist/es/background/background-handler.js +265 -0
- package/dist/es/background/background-http-adapter-handler.js +123 -0
- package/dist/es/background/background-meta-response-internal.js +1 -0
- package/dist/es/background/background-process-handling.js +5 -0
- package/dist/es/background/background-process-log-table-entry.js +1 -0
- package/dist/es/background/background-queue-response-internal.js +1 -0
- package/dist/es/background/background-validator.js +84 -0
- package/dist/es/background/epsilon-background-process-error.js +88 -0
- package/dist/es/background/internal-background-entry.js +1 -0
- package/dist/es/background/manager/abstract-background-manager.js +88 -0
- package/dist/es/background/manager/aws-sqs-sns-background-manager.js +149 -0
- package/dist/es/background/manager/background-manager-like.js +1 -0
- package/dist/es/background/manager/single-thread-local-background-manager.js +45 -0
- package/dist/es/background/s3-background-transaction-logger.js +49 -0
- package/dist/es/build/ratchet-epsilon-common-info.js +14 -0
- package/dist/es/built-in/background/echo-processor.js +14 -0
- package/dist/es/built-in/background/log-and-enqueue-echo-processor.js +12 -0
- package/dist/es/built-in/background/log-message-background-error-processor.js +6 -0
- package/dist/es/built-in/background/no-op-processor.js +9 -0
- package/dist/es/built-in/background/retry-processor.js +36 -0
- package/dist/es/built-in/background/sample-delay-processor.js +12 -0
- package/dist/es/built-in/background/sample-input-validated-processor-data.js +1 -0
- package/dist/es/built-in/background/sample-input-validated-processor.js +12 -0
- package/dist/es/built-in/built-in-trace-id-generators.js +21 -0
- package/dist/es/built-in/daemon/daemon-authorizer-function.js +1 -0
- package/dist/es/built-in/daemon/daemon-config.js +1 -0
- package/dist/es/built-in/daemon/daemon-group-selection-function.js +1 -0
- package/dist/es/built-in/daemon/daemon-handler.js +58 -0
- package/dist/es/built-in/daemon/daemon-process-state-list.js +1 -0
- package/dist/es/built-in/http/apollo-filter.js +58 -0
- package/dist/es/built-in/http/built-in-auth-filters.js +107 -0
- package/dist/es/built-in/http/built-in-authorizers.js +39 -0
- package/dist/es/built-in/http/built-in-filters.js +208 -0
- package/dist/es/built-in/http/built-in-handlers.js +69 -0
- package/dist/es/built-in/http/log-level-manipulation-filter.js +16 -0
- package/dist/es/built-in/http/run-handler-as-filter.js +60 -0
- package/dist/es/cli-bootstrap/epsilon-run-background-process-from-command-line-dry-run.js +17 -0
- package/dist/es/config/background/background-aws-config.js +1 -0
- package/dist/es/config/background/background-config.js +1 -0
- package/dist/es/config/background/background-error-processor.js +1 -0
- package/dist/es/config/background/background-processor.js +1 -0
- package/dist/es/config/background/background-transaction-log.js +1 -0
- package/dist/es/config/background/background-transaction-logger.js +1 -0
- package/dist/es/config/cron/abstract-cron-entry.js +1 -0
- package/dist/es/config/cron/cron-background-entry.js +1 -0
- package/dist/es/config/cron/cron-config.js +1 -0
- package/dist/es/config/dynamo-db-config.js +1 -0
- package/dist/es/config/epsilon-config.js +1 -0
- package/dist/es/config/epsilon-lambda-event-handler.js +1 -0
- package/dist/es/config/epsilon-logger-config.js +1 -0
- package/dist/es/config/generic-aws-event-handler-function.js +1 -0
- package/dist/es/config/http/authorizer-function.js +1 -0
- package/dist/es/config/http/epsilon-authorization-context.js +1 -0
- package/dist/es/config/http/extended-api-gateway-event.js +1 -0
- package/dist/es/config/http/filter-chain-context.js +1 -0
- package/dist/es/config/http/filter-function.js +1 -0
- package/dist/es/config/http/handler-function.js +1 -0
- package/dist/es/config/http/http-config.js +1 -0
- package/dist/es/config/http/http-processing-config.js +1 -0
- package/dist/es/config/http/mapped-http-processing-config.js +1 -0
- package/dist/es/config/http/null-returned-object-handling.js +6 -0
- package/dist/es/config/inter-api/inter-api-aws-config.js +1 -0
- package/dist/es/config/inter-api/inter-api-config.js +1 -0
- package/dist/es/config/inter-api/inter-api-process-mapping.js +1 -0
- package/dist/es/config/logging-trace-id-generator.js +1 -0
- package/dist/es/config/open-api/open-api-document-components.js +1 -0
- package/dist/es/config/open-api/open-api-document-path.js +1 -0
- package/dist/es/config/open-api/open-api-document.js +1 -0
- package/dist/es/config/s3-config.js +1 -0
- package/dist/es/config/sns-config.js +1 -0
- package/dist/es/epsilon-build-properties.js +24 -0
- package/dist/es/epsilon-constants.js +45 -0
- package/dist/es/epsilon-global-handler.js +149 -0
- package/dist/es/epsilon-instance.js +1 -0
- package/dist/es/epsilon-logging-extension-processor.js +15 -0
- package/dist/es/http/auth/api-gateway-adapter-authentication-handler.js +71 -0
- package/dist/es/http/auth/auth0-web-token-manipulator.js +56 -0
- package/dist/es/http/auth/basic-auth-token.js +1 -0
- package/dist/es/http/auth/google-web-token-manipulator.js +67 -0
- package/dist/es/http/auth/jwt-ratchet-local-web-token-manipulator.js +25 -0
- package/dist/es/http/auth/local-web-token-manipulator.js +70 -0
- package/dist/es/http/auth/web-token-manipulator.js +1 -0
- package/dist/es/http/error/bad-gateway.js +8 -0
- package/dist/es/http/error/bad-request-error.js +8 -0
- package/dist/es/http/error/conflict-error.js +8 -0
- package/dist/es/http/error/epsilon-http-error.js +127 -0
- package/dist/es/http/error/forbidden-error.js +8 -0
- package/dist/es/http/error/gateway-timeout.js +8 -0
- package/dist/es/http/error/method-not-allowed-error.js +8 -0
- package/dist/es/http/error/misconfigured-error.js +8 -0
- package/dist/es/http/error/not-found-error.js +8 -0
- package/dist/es/http/error/not-implemented.js +8 -0
- package/dist/es/http/error/request-timeout-error.js +8 -0
- package/dist/es/http/error/service-unavailable.js +8 -0
- package/dist/es/http/error/too-many-requests-error.js +8 -0
- package/dist/es/http/error/unauthorized-error.js +8 -0
- package/dist/es/http/event-util.js +175 -0
- package/dist/es/http/response-util.js +141 -0
- package/dist/es/http/route/epsilon-router.js +1 -0
- package/dist/es/http/route/extended-auth-response-context.js +1 -0
- package/dist/es/http/route/route-mapping.js +1 -0
- package/dist/es/http/route/route-validator-config.js +1 -0
- package/dist/es/http/route/router-util.js +233 -0
- package/dist/es/http/web-handler.js +116 -0
- package/dist/es/http/web-v2-handler.js +21 -0
- package/dist/es/index.js +133 -0
- package/dist/es/inter-api/inter-api-entry.js +1 -0
- package/dist/es/inter-api/inter-api-util.js +58 -0
- package/dist/es/inter-api-manager.js +63 -0
- package/dist/es/lambda-event-handler/cron-epsilon-lambda-event-handler.js +72 -0
- package/dist/es/lambda-event-handler/dynamo-epsilon-lambda-event-handler.js +32 -0
- package/dist/es/lambda-event-handler/generic-sns-epsilon-lambda-event-handler.js +28 -0
- package/dist/es/lambda-event-handler/inter-api-epsilon-lambda-event-handler.js +22 -0
- package/dist/es/lambda-event-handler/s3-epsilon-lambda-event-handler.js +40 -0
- package/dist/es/local-container-server.js +74 -0
- package/dist/es/local-server-cert.js +67 -0
- package/dist/es/local-server.js +140 -0
- package/dist/es/open-api-util/open-api-doc-modifications.js +1 -0
- package/dist/es/open-api-util/open-api-doc-modifier.js +78 -0
- package/dist/es/open-api-util/yaml-combiner.js +27 -0
- package/dist/es/run-background-process-from-command-line.js +32 -0
- package/dist/es/sample/sample-batch-only-local-server.js +17 -0
- package/dist/es/sample/sample-local-server.js +28 -0
- package/dist/es/sample/sample-server-components.js +192 -0
- package/dist/es/test-error-server.js +43 -0
- package/dist/es/util/aws-util.js +65 -0
- package/dist/es/util/context-util.js +95 -0
- package/dist/es/util/cron-util.js +68 -0
- package/dist/es/util/epsilon-config-parser.js +64 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.es.tsbuildinfo +1 -0
- package/dist/tsconfig.types.tsbuildinfo +1 -0
- package/dist/types/background/background-dynamo-log-table-handler.d.ts +11 -0
- package/dist/types/background/background-entry.d.ts +4 -0
- package/dist/types/background/background-execution-event-type.d.ts +7 -0
- package/dist/types/background/background-execution-event.d.ts +8 -0
- package/dist/types/background/background-execution-listener.d.ts +5 -0
- package/dist/types/background/background-handler.d.ts +33 -0
- package/dist/types/background/background-http-adapter-handler.d.ts +26 -0
- package/dist/types/background/background-meta-response-internal.d.ts +5 -0
- package/dist/types/background/background-process-handling.d.ts +4 -0
- package/dist/types/background/background-process-log-table-entry.d.ts +11 -0
- package/dist/types/background/background-queue-response-internal.d.ts +8 -0
- package/dist/types/background/background-validator.d.ts +20 -0
- package/dist/types/background/epsilon-background-process-error.d.ts +30 -0
- package/dist/types/background/internal-background-entry.d.ts +7 -0
- package/dist/types/background/manager/abstract-background-manager.d.ts +26 -0
- package/dist/types/background/manager/aws-sqs-sns-background-manager.d.ts +30 -0
- package/dist/types/background/manager/background-manager-like.d.ts +24 -0
- package/dist/types/background/manager/single-thread-local-background-manager.d.ts +22 -0
- package/dist/types/background/s3-background-transaction-logger.d.ts +17 -0
- package/dist/types/build/ratchet-epsilon-common-info.d.ts +5 -0
- package/dist/types/built-in/background/echo-processor.d.ts +7 -0
- package/dist/types/built-in/background/log-and-enqueue-echo-processor.d.ts +6 -0
- package/dist/types/built-in/background/log-message-background-error-processor.d.ts +5 -0
- package/dist/types/built-in/background/no-op-processor.d.ts +6 -0
- package/dist/types/built-in/background/retry-processor.d.ts +16 -0
- package/dist/types/built-in/background/sample-delay-processor.d.ts +6 -0
- package/dist/types/built-in/background/sample-input-validated-processor-data.d.ts +4 -0
- package/dist/types/built-in/background/sample-input-validated-processor.d.ts +8 -0
- package/dist/types/built-in/built-in-trace-id-generators.d.ts +5 -0
- package/dist/types/built-in/daemon/daemon-authorizer-function.d.ts +5 -0
- package/dist/types/built-in/daemon/daemon-config.d.ts +8 -0
- package/dist/types/built-in/daemon/daemon-group-selection-function.d.ts +4 -0
- package/dist/types/built-in/daemon/daemon-handler.d.ts +22 -0
- package/dist/types/built-in/daemon/daemon-process-state-list.d.ts +8 -0
- package/dist/types/built-in/http/apollo-filter.d.ts +10 -0
- package/dist/types/built-in/http/built-in-auth-filters.d.ts +9 -0
- package/dist/types/built-in/http/built-in-authorizers.d.ts +8 -0
- package/dist/types/built-in/http/built-in-filters.d.ts +25 -0
- package/dist/types/built-in/http/built-in-handlers.d.ts +9 -0
- package/dist/types/built-in/http/log-level-manipulation-filter.d.ts +9 -0
- package/dist/types/built-in/http/run-handler-as-filter.d.ts +12 -0
- package/dist/types/cli-bootstrap/epsilon-run-background-process-from-command-line-dry-run.d.ts +2 -0
- package/dist/types/config/background/background-aws-config.d.ts +7 -0
- package/dist/types/config/background/background-config.d.ts +14 -0
- package/dist/types/config/background/background-error-processor.d.ts +4 -0
- package/dist/types/config/background/background-processor.d.ts +6 -0
- package/dist/types/config/background/background-transaction-log.d.ts +8 -0
- package/dist/types/config/background/background-transaction-logger.d.ts +5 -0
- package/dist/types/config/cron/abstract-cron-entry.d.ts +12 -0
- package/dist/types/config/cron/cron-background-entry.d.ts +15 -0
- package/dist/types/config/cron/cron-config.d.ts +6 -0
- package/dist/types/config/dynamo-db-config.d.ts +5 -0
- package/dist/types/config/epsilon-config.d.ts +20 -0
- package/dist/types/config/epsilon-lambda-event-handler.d.ts +7 -0
- package/dist/types/config/epsilon-logger-config.d.ts +12 -0
- package/dist/types/config/generic-aws-event-handler-function.d.ts +3 -0
- package/dist/types/config/http/authorizer-function.d.ts +6 -0
- package/dist/types/config/http/epsilon-authorization-context.d.ts +5 -0
- package/dist/types/config/http/extended-api-gateway-event.d.ts +7 -0
- package/dist/types/config/http/filter-chain-context.d.ts +14 -0
- package/dist/types/config/http/filter-function.d.ts +4 -0
- package/dist/types/config/http/handler-function.d.ts +5 -0
- package/dist/types/config/http/http-config.d.ts +15 -0
- package/dist/types/config/http/http-processing-config.d.ts +11 -0
- package/dist/types/config/http/mapped-http-processing-config.d.ts +7 -0
- package/dist/types/config/http/null-returned-object-handling.d.ts +5 -0
- package/dist/types/config/inter-api/inter-api-aws-config.d.ts +5 -0
- package/dist/types/config/inter-api/inter-api-config.d.ts +6 -0
- package/dist/types/config/inter-api/inter-api-process-mapping.d.ts +11 -0
- package/dist/types/config/logging-trace-id-generator.d.ts +4 -0
- package/dist/types/config/open-api/open-api-document-components.d.ts +4 -0
- package/dist/types/config/open-api/open-api-document-path.d.ts +2 -0
- package/dist/types/config/open-api/open-api-document.d.ts +6 -0
- package/dist/types/config/s3-config.d.ts +6 -0
- package/dist/types/config/sns-config.d.ts +5 -0
- package/dist/types/epsilon-build-properties.d.ts +9 -0
- package/dist/types/epsilon-constants.d.ts +16 -0
- package/dist/types/epsilon-global-handler.d.ts +23 -0
- package/dist/types/epsilon-instance.d.ts +19 -0
- package/dist/types/epsilon-logging-extension-processor.d.ts +5 -0
- package/dist/types/http/auth/api-gateway-adapter-authentication-handler.d.ts +18 -0
- package/dist/types/http/auth/auth0-web-token-manipulator.d.ts +13 -0
- package/dist/types/http/auth/basic-auth-token.d.ts +7 -0
- package/dist/types/http/auth/google-web-token-manipulator.d.ts +14 -0
- package/dist/types/http/auth/jwt-ratchet-local-web-token-manipulator.d.ts +13 -0
- package/dist/types/http/auth/local-web-token-manipulator.d.ts +20 -0
- package/dist/types/http/auth/web-token-manipulator.d.ts +7 -0
- package/dist/types/http/error/bad-gateway.d.ts +5 -0
- package/dist/types/http/error/bad-request-error.d.ts +5 -0
- package/dist/types/http/error/conflict-error.d.ts +5 -0
- package/dist/types/http/error/epsilon-http-error.d.ts +41 -0
- package/dist/types/http/error/forbidden-error.d.ts +5 -0
- package/dist/types/http/error/gateway-timeout.d.ts +5 -0
- package/dist/types/http/error/method-not-allowed-error.d.ts +5 -0
- package/dist/types/http/error/misconfigured-error.d.ts +5 -0
- package/dist/types/http/error/not-found-error.d.ts +5 -0
- package/dist/types/http/error/not-implemented.d.ts +5 -0
- package/dist/types/http/error/request-timeout-error.d.ts +5 -0
- package/dist/types/http/error/service-unavailable.d.ts +5 -0
- package/dist/types/http/error/too-many-requests-error.d.ts +5 -0
- package/dist/types/http/error/unauthorized-error.d.ts +5 -0
- package/dist/types/http/event-util.d.ts +47 -0
- package/dist/types/http/response-util.d.ts +11 -0
- package/dist/types/http/route/epsilon-router.d.ts +8 -0
- package/dist/types/http/route/extended-auth-response-context.d.ts +6 -0
- package/dist/types/http/route/route-mapping.d.ts +12 -0
- package/dist/types/http/route/route-validator-config.d.ts +5 -0
- package/dist/types/http/route/router-util.d.ts +26 -0
- package/dist/types/http/web-handler.d.ts +26 -0
- package/dist/types/http/web-v2-handler.d.ts +13 -0
- package/dist/types/index.d.ts +136 -0
- package/dist/types/inter-api/inter-api-entry.d.ts +7 -0
- package/dist/types/inter-api/inter-api-util.d.ts +10 -0
- package/dist/types/inter-api-manager.d.ts +17 -0
- package/dist/types/lambda-event-handler/cron-epsilon-lambda-event-handler.d.ts +14 -0
- package/dist/types/lambda-event-handler/dynamo-epsilon-lambda-event-handler.d.ts +11 -0
- package/dist/types/lambda-event-handler/generic-sns-epsilon-lambda-event-handler.d.ts +10 -0
- package/dist/types/lambda-event-handler/inter-api-epsilon-lambda-event-handler.d.ts +10 -0
- package/dist/types/lambda-event-handler/s3-epsilon-lambda-event-handler.d.ts +10 -0
- package/dist/types/local-container-server.d.ts +13 -0
- package/dist/types/local-server-cert.d.ts +5 -0
- package/dist/types/local-server.d.ts +19 -0
- package/dist/types/open-api-util/open-api-doc-modifications.d.ts +8 -0
- package/dist/types/open-api-util/open-api-doc-modifier.d.ts +10 -0
- package/dist/types/open-api-util/yaml-combiner.d.ts +3 -0
- package/dist/types/run-background-process-from-command-line.d.ts +13 -0
- package/dist/types/sample/sample-batch-only-local-server.d.ts +1 -0
- package/dist/types/sample/sample-local-server.d.ts +1 -0
- package/dist/types/sample/sample-server-components.d.ts +12 -0
- package/dist/types/test-error-server.d.ts +13 -0
- package/dist/types/util/aws-util.d.ts +8 -0
- package/dist/types/util/context-util.d.ts +33 -0
- package/dist/types/util/cron-util.d.ts +11 -0
- package/dist/types/util/epsilon-config-parser.d.ts +14 -0
- package/package.json +132 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Logger } from '@bitblit/ratchet-common';
|
|
2
|
+
import { EchoProcessor } from './echo-processor';
|
|
3
|
+
export class LogAndEnqueueEchoProcessor {
|
|
4
|
+
get typeName() {
|
|
5
|
+
return 'EpsilonLogAndEnqueueEcho';
|
|
6
|
+
}
|
|
7
|
+
async handleEvent(data, cfg) {
|
|
8
|
+
Logger.info('LogAndEnqueueEchoProcessor : %j', data);
|
|
9
|
+
await cfg.fireImmediateProcessRequestByParts(EchoProcessor.TYPE_NAME, { upstream: data });
|
|
10
|
+
Logger.info('Completed : LogAndEnqueueEchoProcessor');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DurationRatchet, Logger, PromiseRatchet } from '@bitblit/ratchet-common';
|
|
2
|
+
import { StringRatchet } from '@bitblit/ratchet-common';
|
|
3
|
+
import { NumberRatchet } from '@bitblit/ratchet-common';
|
|
4
|
+
export class RetryProcessor {
|
|
5
|
+
constructor(delegate, opts) {
|
|
6
|
+
this.delegate = delegate;
|
|
7
|
+
this.opts = opts;
|
|
8
|
+
}
|
|
9
|
+
get typeName() {
|
|
10
|
+
return StringRatchet.trimToEmpty(this.opts?.typePrefix) + this.delegate.typeName + StringRatchet.trimToEmpty(this.opts?.typeSuffix);
|
|
11
|
+
}
|
|
12
|
+
async handleEvent(data, mgr) {
|
|
13
|
+
const tryNumber = data && data[RetryProcessor.RETRY_FIELD_NAME] ? NumberRatchet.safeNumber(data[RetryProcessor.RETRY_FIELD_NAME]) : 1;
|
|
14
|
+
const dataCopy = data ? Object.assign({}, data) : null;
|
|
15
|
+
delete dataCopy[RetryProcessor.RETRY_FIELD_NAME];
|
|
16
|
+
Logger.info('RetryProcessor : %s : Try %d of %d', this.delegate.typeName, tryNumber, this.opts.retryCount);
|
|
17
|
+
try {
|
|
18
|
+
await this.delegate.handleEvent(dataCopy, mgr);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
Logger.error('Failed to process : %s', err, err);
|
|
22
|
+
if (tryNumber < this.opts.retryCount) {
|
|
23
|
+
const waitTimeMS = tryNumber * this.opts.baseDelayMS;
|
|
24
|
+
Logger.info('Firing automatic retry after a wait of %s', DurationRatchet.formatMsDuration(waitTimeMS));
|
|
25
|
+
await PromiseRatchet.wait(waitTimeMS);
|
|
26
|
+
const wrapped = dataCopy || {};
|
|
27
|
+
wrapped[RetryProcessor.RETRY_FIELD_NAME] = tryNumber + 1;
|
|
28
|
+
await mgr.fireImmediateProcessRequestByParts(this.typeName, wrapped);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
Logger.error('That was the last try - giving up');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
RetryProcessor.RETRY_FIELD_NAME = '___RetryProcessorTryNumber';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Logger, PromiseRatchet } from '@bitblit/ratchet-common';
|
|
2
|
+
export class SampleDelayProcessor {
|
|
3
|
+
get typeName() {
|
|
4
|
+
return 'EpsilonSampleDelay';
|
|
5
|
+
}
|
|
6
|
+
async handleEvent(data, mgr) {
|
|
7
|
+
const delayMS = Math.floor(Math.random() * 5000);
|
|
8
|
+
Logger.info('Running sample processor for %d', delayMS);
|
|
9
|
+
await PromiseRatchet.wait(delayMS);
|
|
10
|
+
Logger.info('Sample processor complete');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Logger } from '@bitblit/ratchet-common';
|
|
2
|
+
export class SampleInputValidatedProcessor {
|
|
3
|
+
get typeName() {
|
|
4
|
+
return 'EpsilonSampleInputValidated';
|
|
5
|
+
}
|
|
6
|
+
async handleEvent(data, mgr) {
|
|
7
|
+
Logger.info('Running SampleInputValidatedProcessor, data was : %j', data);
|
|
8
|
+
}
|
|
9
|
+
get dataSchemaName() {
|
|
10
|
+
return 'BackgroundSampleInputValidatedProcessorData';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { StringRatchet } from '@bitblit/ratchet-common';
|
|
2
|
+
import { ContextUtil } from '../util/context-util';
|
|
3
|
+
export class BuiltInTraceIdGenerators {
|
|
4
|
+
static fullAwsRequestId() {
|
|
5
|
+
let rval = ContextUtil.currentRequestId();
|
|
6
|
+
rval = rval ?? StringRatchet.createType4Guid();
|
|
7
|
+
return rval;
|
|
8
|
+
}
|
|
9
|
+
static shortAwsRequestId() {
|
|
10
|
+
let rval = BuiltInTraceIdGenerators.fullAwsRequestId();
|
|
11
|
+
if (rval.length > 10) {
|
|
12
|
+
let idx = rval.lastIndexOf('-');
|
|
13
|
+
idx = idx === -1 ? rval.length - 10 : idx;
|
|
14
|
+
rval = rval.substring(idx);
|
|
15
|
+
}
|
|
16
|
+
return rval;
|
|
17
|
+
}
|
|
18
|
+
static fixedLengthHex(length = 10) {
|
|
19
|
+
return StringRatchet.createRandomHexString(length);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { Logger } from '@bitblit/ratchet-common';
|
|
3
|
+
import { NotFoundError } from '../../http/error/not-found-error';
|
|
4
|
+
import { StringRatchet } from '@bitblit/ratchet-common';
|
|
5
|
+
export class DaemonHandler {
|
|
6
|
+
constructor(daemon, inConfig) {
|
|
7
|
+
this.daemon = daemon;
|
|
8
|
+
this.inConfig = inConfig;
|
|
9
|
+
this.config = inConfig || {};
|
|
10
|
+
this.config.authorizer = this.config.authorizer || DaemonHandler.ALLOW_EVERYTHING_AUTHORIZER;
|
|
11
|
+
this.config.groupSelector = this.config.groupSelector || ((evt) => Promise.resolve(daemon.defaultGroup));
|
|
12
|
+
this.config.fetchDaemonStatusByPublicTokenPathParameter =
|
|
13
|
+
StringRatchet.trimToNull(this.config.fetchDaemonStatusByPublicTokenPathParameter) || 'publicToken';
|
|
14
|
+
this.config.fetchDaemonStatusPathParameter = StringRatchet.trimToNull(this.config.fetchDaemonStatusPathParameter) || 'key';
|
|
15
|
+
}
|
|
16
|
+
async fetchDaemonStatusByPublicToken(evt) {
|
|
17
|
+
const publicToken = evt.pathParameters[this.config.fetchDaemonStatusByPublicTokenPathParameter];
|
|
18
|
+
Logger.info('Fetching daemon status for token: %s', publicToken);
|
|
19
|
+
let rval = await this.daemon.statFromPublicToken(publicToken);
|
|
20
|
+
const canRead = rval ? await this.config.authorizer(evt, rval) : false;
|
|
21
|
+
rval = canRead ? rval : null;
|
|
22
|
+
if (rval === null) {
|
|
23
|
+
throw new NotFoundError('No such token : ' + publicToken);
|
|
24
|
+
}
|
|
25
|
+
return rval;
|
|
26
|
+
}
|
|
27
|
+
async fetchDaemonStatus(evt) {
|
|
28
|
+
const daemonKey = evt.pathParameters[this.config.fetchDaemonStatusPathParameter];
|
|
29
|
+
Logger.info('Fetching daemon status for : %s', daemonKey);
|
|
30
|
+
let rval = await this.daemon.stat(daemonKey);
|
|
31
|
+
const canRead = rval ? await this.config.authorizer(evt, rval) : false;
|
|
32
|
+
rval = canRead ? rval : null;
|
|
33
|
+
if (rval === null) {
|
|
34
|
+
throw new NotFoundError('No such key : ' + daemonKey);
|
|
35
|
+
}
|
|
36
|
+
return rval;
|
|
37
|
+
}
|
|
38
|
+
async listDaemonStatus(evt) {
|
|
39
|
+
const group = await this.config.groupSelector(evt);
|
|
40
|
+
const keys = await this.daemon.list(group);
|
|
41
|
+
const allowed = [];
|
|
42
|
+
for (let i = 0; i < keys.length; i++) {
|
|
43
|
+
const canRead = await this.config.authorizer(evt, keys[i]);
|
|
44
|
+
if (canRead) {
|
|
45
|
+
allowed.push(keys[i]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const rval = {
|
|
49
|
+
results: allowed,
|
|
50
|
+
nextToken: null,
|
|
51
|
+
};
|
|
52
|
+
return rval;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
_a = DaemonHandler;
|
|
56
|
+
DaemonHandler.ALLOW_EVERYTHING_AUTHORIZER = async (evt, proc) => {
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Logger } from '@bitblit/ratchet-common';
|
|
2
|
+
import { PromiseRatchet } from '@bitblit/ratchet-common';
|
|
3
|
+
import { TimeoutToken } from '@bitblit/ratchet-common';
|
|
4
|
+
import { RequestTimeoutError } from '../../http/error/request-timeout-error';
|
|
5
|
+
import { StringRatchet } from '@bitblit/ratchet-common';
|
|
6
|
+
export class ApolloFilter {
|
|
7
|
+
static async handlePathWithApollo(fCtx, apolloPathRegex, apolloServer, createHandlerOptions) {
|
|
8
|
+
if (fCtx.event?.path && apolloPathRegex && apolloPathRegex.test(fCtx.event.path)) {
|
|
9
|
+
fCtx.result = await ApolloFilter.processApolloRequest(fCtx.event, fCtx.context, apolloServer, createHandlerOptions);
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
static async processApolloRequest(event, context, apolloServer, createHandlerOptions) {
|
|
17
|
+
Logger.silly('Processing event with apollo: %j', event);
|
|
18
|
+
let rval = null;
|
|
19
|
+
if (!ApolloFilter.CACHE_APOLLO_HANDLER) {
|
|
20
|
+
ApolloFilter.CACHE_APOLLO_HANDLER = apolloServer.createHandler(createHandlerOptions);
|
|
21
|
+
}
|
|
22
|
+
event.multiValueHeaders = event.multiValueHeaders || {};
|
|
23
|
+
Object.keys(event.headers).forEach((k) => {
|
|
24
|
+
event.multiValueHeaders[k] = [event.headers[k]];
|
|
25
|
+
});
|
|
26
|
+
event.httpMethod = event.httpMethod.toUpperCase();
|
|
27
|
+
if (event.isBase64Encoded && !!event.body) {
|
|
28
|
+
event.body = Buffer.from(event.body, 'base64').toString();
|
|
29
|
+
event.isBase64Encoded = false;
|
|
30
|
+
}
|
|
31
|
+
const apolloPromise = ApolloFilter.CACHE_APOLLO_HANDLER(event, context, null) || Promise.resolve(null);
|
|
32
|
+
const timeoutMS = context.getRemainingTimeInMillis() - 500;
|
|
33
|
+
let result = null;
|
|
34
|
+
if (timeoutMS) {
|
|
35
|
+
result = await PromiseRatchet.timeout(apolloPromise, 'Apollo timed out after ' + timeoutMS + ' ms.', timeoutMS);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
Logger.warn('No timeout set even after defaulting for Apollo');
|
|
39
|
+
result = await apolloPromise;
|
|
40
|
+
}
|
|
41
|
+
if (TimeoutToken.isTimeoutToken(result)) {
|
|
42
|
+
result.writeToLog();
|
|
43
|
+
throw new RequestTimeoutError('Timed out');
|
|
44
|
+
}
|
|
45
|
+
rval = result;
|
|
46
|
+
if (StringRatchet.trimToEmpty(rval?.body).startsWith('<!DOCTYPE html>')) {
|
|
47
|
+
Logger.info('Forcing content type to html');
|
|
48
|
+
rval.headers = rval.headers || {};
|
|
49
|
+
rval.headers['content-type'] = 'text/html';
|
|
50
|
+
}
|
|
51
|
+
return rval;
|
|
52
|
+
}
|
|
53
|
+
static addApolloFilterToList(filters, apolloPathRegex, apolloServer, createHandlerOptions) {
|
|
54
|
+
if (filters) {
|
|
55
|
+
filters.push((fCtx) => ApolloFilter.handlePathWithApollo(fCtx, apolloPathRegex, apolloServer, createHandlerOptions));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { StringRatchet } from '@bitblit/ratchet-common';
|
|
2
|
+
import { UnauthorizedError } from '../../http/error/unauthorized-error';
|
|
3
|
+
import { MisconfiguredError } from '../../http/error/misconfigured-error';
|
|
4
|
+
import { ForbiddenError } from '../../http/error/forbidden-error';
|
|
5
|
+
import { EventUtil } from '../../http/event-util';
|
|
6
|
+
export class BuiltInAuthFilters {
|
|
7
|
+
static async requireAllRolesInCommonJwt(fCtx, requiredRoleAllOf) {
|
|
8
|
+
if (!requiredRoleAllOf || requiredRoleAllOf.length === 0) {
|
|
9
|
+
throw new MisconfiguredError('You must require at least 1 role');
|
|
10
|
+
}
|
|
11
|
+
if (!fCtx.event?.authorization?.auth) {
|
|
12
|
+
throw new UnauthorizedError('May not proceed, not authenticated');
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
const asJwt = fCtx.event.authorization.auth;
|
|
16
|
+
if (!asJwt.roles || asJwt.roles.length === 0) {
|
|
17
|
+
throw new UnauthorizedError('Required role not found');
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
requiredRoleAllOf.forEach((r) => {
|
|
21
|
+
if (!asJwt.roles.includes(r)) {
|
|
22
|
+
throw new UnauthorizedError('Required role not found');
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
static async requireAnyRoleInCommonJwt(fCtx, requiredRoleOneOf) {
|
|
30
|
+
if (!requiredRoleOneOf || requiredRoleOneOf.length === 0) {
|
|
31
|
+
throw new MisconfiguredError('You must require at least 1 role');
|
|
32
|
+
}
|
|
33
|
+
if (!fCtx.event?.authorization?.auth) {
|
|
34
|
+
throw new UnauthorizedError('May not proceed, not authenticated');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const asJwt = fCtx.event.authorization.auth;
|
|
38
|
+
if (!asJwt.roles || asJwt.roles.length === 0) {
|
|
39
|
+
throw new UnauthorizedError('Required role not found');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
let found = false;
|
|
43
|
+
requiredRoleOneOf.forEach((r) => {
|
|
44
|
+
if (!found && asJwt.roles.includes(r)) {
|
|
45
|
+
found = true;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if (!found) {
|
|
49
|
+
throw new UnauthorizedError('Required role not found');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
static async parseAuthorizationHeader(fCtx, webTokenManipulators) {
|
|
56
|
+
if (!fCtx?.event || !webTokenManipulators || (Array.isArray(webTokenManipulators) && !webTokenManipulators.length)) {
|
|
57
|
+
throw new MisconfiguredError('Cannot continue - missing event or encryption');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const tokenString = EventUtil.extractBearerTokenFromEvent(fCtx?.event);
|
|
61
|
+
if (!Array.isArray(webTokenManipulators)) {
|
|
62
|
+
webTokenManipulators = [webTokenManipulators];
|
|
63
|
+
}
|
|
64
|
+
for (let i = 0; i < webTokenManipulators.length && !fCtx?.event?.authorization?.auth; i++) {
|
|
65
|
+
const manipulator = webTokenManipulators[i];
|
|
66
|
+
try {
|
|
67
|
+
const token = await manipulator.extractTokenFromAuthorizationHeader(tokenString);
|
|
68
|
+
fCtx.event.authorization = {
|
|
69
|
+
raw: tokenString,
|
|
70
|
+
auth: token,
|
|
71
|
+
error: null,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
fCtx.event.authorization = {
|
|
76
|
+
raw: tokenString,
|
|
77
|
+
auth: null,
|
|
78
|
+
error: err['message'],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
static async applyOpenApiAuthorization(fCtx) {
|
|
86
|
+
if (StringRatchet.trimToNull(fCtx?.routeAndParse?.mapping?.authorizerName)) {
|
|
87
|
+
const authorizer = fCtx?.authenticators?.get(fCtx.routeAndParse.mapping.authorizerName);
|
|
88
|
+
if (authorizer) {
|
|
89
|
+
if (fCtx?.event?.authorization?.auth) {
|
|
90
|
+
const allowed = await authorizer(fCtx.event.authorization, fCtx.event, fCtx.routeAndParse.mapping);
|
|
91
|
+
if (!allowed) {
|
|
92
|
+
throw new ForbiddenError('You lack privileges to see this endpoint');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
throw new UnauthorizedError('You need to supply credentials for this endpoint');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
throw new MisconfiguredError().withFormattedErrorMessage('Authorizer %s requested but not found', fCtx.routeAndParse.mapping.authorizerName);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Logger } from '@bitblit/ratchet-common';
|
|
2
|
+
export class BuiltInAuthorizers {
|
|
3
|
+
static async simpleNoAuthenticationLogAccess(authorizationContext, evt) {
|
|
4
|
+
Logger.debug('Auth requested for %s : %j', evt.path, authorizationContext?.auth);
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
static async simpleLoggedInAuth(authorizationContext, evt) {
|
|
8
|
+
const rval = !!authorizationContext?.auth;
|
|
9
|
+
Logger.silly('SimpleLoggedInAuth returning %s for %s', rval, evt.path);
|
|
10
|
+
return rval;
|
|
11
|
+
}
|
|
12
|
+
static async simpleRoleRouteAuth(authorizationContext, event, route, requiredRoleOneOf = null, requiredRoleAllOf = null) {
|
|
13
|
+
let rval = true;
|
|
14
|
+
const token = authorizationContext?.auth;
|
|
15
|
+
if (token) {
|
|
16
|
+
if (requiredRoleOneOf) {
|
|
17
|
+
requiredRoleOneOf.forEach((r) => {
|
|
18
|
+
rval = rval || token.roles.indexOf(r) > -1;
|
|
19
|
+
});
|
|
20
|
+
if (!rval) {
|
|
21
|
+
Logger.warn('Request to %s failed to find at least one of %j', route.path, requiredRoleOneOf);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (rval && requiredRoleAllOf) {
|
|
25
|
+
requiredRoleAllOf.forEach((r) => {
|
|
26
|
+
rval = rval && token.roles.indexOf(r) > -1;
|
|
27
|
+
});
|
|
28
|
+
if (!rval) {
|
|
29
|
+
Logger.warn('Request to %s failed to find all of %j', route.path, requiredRoleAllOf);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
Logger.warn('Cannot authenticate - no parsed auth found');
|
|
35
|
+
rval = false;
|
|
36
|
+
}
|
|
37
|
+
return rval;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { Logger } from '@bitblit/ratchet-common';
|
|
2
|
+
import { StringRatchet } from '@bitblit/ratchet-common';
|
|
3
|
+
import { MapRatchet } from '@bitblit/ratchet-common';
|
|
4
|
+
import { EventUtil } from '../../http/event-util';
|
|
5
|
+
import { BadRequestError } from '../../http/error/bad-request-error';
|
|
6
|
+
import { ResponseUtil } from '../../http/response-util';
|
|
7
|
+
import { EpsilonHttpError } from '../../http/error/epsilon-http-error';
|
|
8
|
+
import { MisconfiguredError } from '../../http/error/misconfigured-error';
|
|
9
|
+
export class BuiltInFilters {
|
|
10
|
+
static async combineFilters(fCtx, filters) {
|
|
11
|
+
let cont = true;
|
|
12
|
+
if (filters && filters.length > 0) {
|
|
13
|
+
for (let i = 0; i < filters.length && cont; i++) {
|
|
14
|
+
cont = await filters[i](fCtx);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return cont;
|
|
18
|
+
}
|
|
19
|
+
static async applyGzipIfPossible(fCtx) {
|
|
20
|
+
if (fCtx.event?.headers && fCtx.result) {
|
|
21
|
+
const encodingHeader = fCtx.event && fCtx.event.headers ? MapRatchet.extractValueFromMapIgnoreCase(fCtx.event.headers, 'accept-encoding') : null;
|
|
22
|
+
fCtx.result = await ResponseUtil.applyGzipIfPossible(encodingHeader, fCtx.result);
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
static async addConstantHeaders(fCtx, headers) {
|
|
27
|
+
if (headers && fCtx.result) {
|
|
28
|
+
fCtx.result.headers = Object.assign({}, headers, fCtx.result.headers);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
Logger.warn('Could not add headers - either result or headers were missing');
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
static async addAWSRequestIdHeader(fCtx, headerName = 'X-REQUEST-ID') {
|
|
36
|
+
if (fCtx.result && StringRatchet.trimToNull(headerName) && headerName.startsWith('X-')) {
|
|
37
|
+
fCtx.result.headers = fCtx.result.headers || {};
|
|
38
|
+
fCtx.result.headers[headerName] = fCtx.context?.awsRequestId || 'Request-Id-Missing';
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
Logger.warn('Could not add request id header - either result or context were missing or name was invalid');
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
static async addAllowEverythingCORSHeaders(fCtx) {
|
|
46
|
+
return BuiltInFilters.addConstantHeaders(fCtx, {
|
|
47
|
+
'Access-Control-Allow-Origin': '*',
|
|
48
|
+
'Access-Control-Allow-Methods': '*',
|
|
49
|
+
'Access-Control-Allow-Headers': '*',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
static async addAllowReflectionCORSHeaders(fCtx) {
|
|
53
|
+
return BuiltInFilters.addConstantHeaders(fCtx, {
|
|
54
|
+
'Access-Control-Allow-Origin': MapRatchet.caseInsensitiveAccess(fCtx.event.headers, 'Origin') || '*',
|
|
55
|
+
'Access-Control-Allow-Methods': MapRatchet.caseInsensitiveAccess(fCtx.event.headers, 'Access-Control-Request-Method') || '*',
|
|
56
|
+
'Access-Control-Allow-Headers': MapRatchet.caseInsensitiveAccess(fCtx.event.headers, 'Access-Control-Request-Headers') || '*',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
static async uriDecodeQueryParams(fCtx) {
|
|
60
|
+
if (fCtx?.event?.queryStringParameters) {
|
|
61
|
+
Object.keys(fCtx.event.queryStringParameters).forEach((k) => {
|
|
62
|
+
const val = fCtx.event.queryStringParameters[k];
|
|
63
|
+
if (val) {
|
|
64
|
+
fCtx.event.queryStringParameters[k] = decodeURIComponent(val);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (fCtx?.event?.multiValueQueryStringParameters) {
|
|
69
|
+
Object.keys(fCtx.event.multiValueQueryStringParameters).forEach((k) => {
|
|
70
|
+
const val = fCtx.event.multiValueQueryStringParameters[k];
|
|
71
|
+
if (val && val.length) {
|
|
72
|
+
const cleaned = val.map((v) => decodeURIComponent(v));
|
|
73
|
+
fCtx.event.multiValueQueryStringParameters[k] = cleaned;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
static async fixStillEncodedQueryParams(fCtx) {
|
|
80
|
+
EventUtil.fixStillEncodedQueryParams(fCtx.event);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
static async disallowStringNullAsPathParameter(fCtx) {
|
|
84
|
+
if (fCtx?.event?.pathParameters) {
|
|
85
|
+
Object.keys(fCtx.event.pathParameters).forEach((k) => {
|
|
86
|
+
if ('null' === StringRatchet.trimToEmpty(fCtx.event.pathParameters[k]).toLowerCase()) {
|
|
87
|
+
throw new BadRequestError().withFormattedErrorMessage('Path parameter %s was string -null-', k);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
static async disallowStringNullAsQueryStringParameter(fCtx) {
|
|
94
|
+
if (fCtx?.event?.queryStringParameters) {
|
|
95
|
+
Object.keys(fCtx.event.queryStringParameters).forEach((k) => {
|
|
96
|
+
if ('null' === StringRatchet.trimToEmpty(fCtx.event.queryStringParameters[k]).toLowerCase()) {
|
|
97
|
+
throw new BadRequestError().withFormattedErrorMessage('Query parameter %s was string -null-', k);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
static async ensureEventMaps(fCtx) {
|
|
104
|
+
fCtx.event.queryStringParameters = fCtx.event.queryStringParameters || {};
|
|
105
|
+
fCtx.event.headers = fCtx.event.headers || {};
|
|
106
|
+
fCtx.event.pathParameters = fCtx.event.pathParameters || {};
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
static async parseJsonBodyToObject(fCtx) {
|
|
110
|
+
if (fCtx.event?.body) {
|
|
111
|
+
try {
|
|
112
|
+
fCtx.event.parsedBody = EventUtil.jsonBodyToObject(fCtx.event);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
throw new EpsilonHttpError('Supplied body was not parsable as valid JSON').withHttpStatusCode(400);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
static async checkMaximumLambdaBodySize(fCtx) {
|
|
121
|
+
if (fCtx.result?.body && fCtx.result.body.length > BuiltInFilters.MAXIMUM_LAMBDA_BODY_SIZE_BYTES) {
|
|
122
|
+
const delta = fCtx.result.body.length - BuiltInFilters.MAXIMUM_LAMBDA_BODY_SIZE_BYTES;
|
|
123
|
+
throw new EpsilonHttpError('Response size is ' + fCtx.result.body.length + ' bytes, which is ' + delta + ' bytes too large for this handler').withHttpStatusCode(500);
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
static async validateInboundBody(fCtx) {
|
|
128
|
+
if (fCtx?.event?.parsedBody && fCtx.routeAndParse) {
|
|
129
|
+
if (fCtx.routeAndParse.mapping.validation) {
|
|
130
|
+
if (!fCtx.modelValidator) {
|
|
131
|
+
throw new MisconfiguredError('Requested body validation but supplied no validator');
|
|
132
|
+
}
|
|
133
|
+
const errors = fCtx.modelValidator.validate(fCtx.routeAndParse.mapping.validation.modelName, fCtx.event.parsedBody, fCtx.routeAndParse.mapping.validation.emptyAllowed, fCtx.routeAndParse.mapping.validation.extraPropertiesAllowed);
|
|
134
|
+
if (errors.length > 0) {
|
|
135
|
+
Logger.info('Found errors while validating %s object %j', fCtx.routeAndParse.mapping.validation.modelName, errors);
|
|
136
|
+
const newError = new BadRequestError(...errors);
|
|
137
|
+
throw newError;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
Logger.debug('No validation since no route specified or no parsed body');
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
static async validateInboundQueryParams(fCtx) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
static async validateInboundPathParams(fCtx) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
static async validateOutboundResponse(fCtx) {
|
|
153
|
+
if (fCtx?.rawResult) {
|
|
154
|
+
if (fCtx.routeAndParse.mapping.outboundValidation) {
|
|
155
|
+
Logger.debug('Applying outbound check to %j', fCtx.rawResult);
|
|
156
|
+
const errors = fCtx.modelValidator.validate(fCtx.routeAndParse.mapping.outboundValidation.modelName, fCtx.rawResult, fCtx.routeAndParse.mapping.outboundValidation.emptyAllowed, fCtx.routeAndParse.mapping.outboundValidation.extraPropertiesAllowed);
|
|
157
|
+
if (errors.length > 0) {
|
|
158
|
+
Logger.error('Found outbound errors while validating %s object %j', fCtx.routeAndParse.mapping.outboundValidation.modelName, errors);
|
|
159
|
+
errors.unshift('Server sent object invalid according to spec');
|
|
160
|
+
throw new EpsilonHttpError().withErrors(errors).withHttpStatusCode(500).withDetails(fCtx.rawResult);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
Logger.debug('Applied no outbound validation because none set');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
Logger.debug('No validation since no outbound body or disabled');
|
|
169
|
+
}
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
static async autoRespondToOptionsRequestWithCors(fCtx) {
|
|
173
|
+
if (StringRatchet.trimToEmpty(fCtx?.event?.httpMethod).toLowerCase() === 'options') {
|
|
174
|
+
fCtx.result = {
|
|
175
|
+
statusCode: 200,
|
|
176
|
+
body: '{"cors":true, "m":2}',
|
|
177
|
+
};
|
|
178
|
+
await BuiltInFilters.addAllowReflectionCORSHeaders(fCtx);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
static async autoRespond(fCtx, inBody) {
|
|
186
|
+
const body = inBody || {
|
|
187
|
+
message: 'Not Implemented',
|
|
188
|
+
};
|
|
189
|
+
fCtx.result = {
|
|
190
|
+
statusCode: 200,
|
|
191
|
+
body: JSON.stringify(body),
|
|
192
|
+
};
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
static async secureOutboundServerErrorForProduction(fCtx, errorMessage, errCode) {
|
|
196
|
+
if (fCtx?.result?.statusCode) {
|
|
197
|
+
if (errCode === null || fCtx.result.statusCode === errCode) {
|
|
198
|
+
Logger.warn('Securing outbound error info (was : %j)', fCtx.result.body);
|
|
199
|
+
fCtx.rawResult = new EpsilonHttpError(errorMessage).withHttpStatusCode(fCtx.result.statusCode);
|
|
200
|
+
const oldResult = fCtx.result;
|
|
201
|
+
fCtx.result = ResponseUtil.errorResponse(fCtx.rawResult);
|
|
202
|
+
fCtx.result.headers = Object.assign({}, oldResult.headers || {}, fCtx.result.headers || {});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
BuiltInFilters.MAXIMUM_LAMBDA_BODY_SIZE_BYTES = 1024 * 1024 * 5 - 1024 * 100;
|