@teleporthq/teleport-plugin-next-workflows 0.44.11 → 0.44.17
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/__tests__/_helpers/fake-fetch.ts +75 -0
- package/__tests__/_helpers/gui-place-order-statements.ts +17 -0
- package/__tests__/_helpers/inserted-lines.ts +22 -0
- package/__tests__/_helpers/invoice-store.ts +10 -1
- package/__tests__/_helpers/load-security-runtime.ts +45 -0
- package/__tests__/_helpers/load-server-runtime.ts +26 -3
- package/__tests__/_helpers/run-account-delete-route.ts +3 -1
- package/__tests__/_helpers/run-generated-middleware.ts +7 -2
- package/__tests__/account-delete-owned-rows.test.ts +3 -1
- package/__tests__/adopted-element-trigger-code.test.ts +128 -0
- package/__tests__/analytics-track-outcome.test.ts +145 -0
- package/__tests__/auth-password-change-ends-sessions.test.ts +8 -1
- package/__tests__/auth-password-security.test.ts +2275 -0
- package/__tests__/auth-session-cost.test.ts +31 -0
- package/__tests__/auth-signup-route.test.ts +960 -0
- package/__tests__/authored-code-every-path.test.ts +247 -0
- package/__tests__/automations-bus.test.ts +3820 -0
- package/__tests__/automations-catalog-drift.test.ts +97 -0
- package/__tests__/booking-calendar-feed-route.test.ts +20 -3
- package/__tests__/cart-price-order.test.ts +336 -1
- package/__tests__/code-lookup-rate-limit-route.test.ts +189 -0
- package/__tests__/cost-bearing-node-types.test.ts +119 -0
- package/__tests__/credential-columns-reply.test.ts +9 -0
- package/__tests__/credential-result-reply.test.ts +19 -5
- package/__tests__/cron-route-loop-templateparams.test.ts +6 -3
- package/__tests__/custom-js-authored-code.test.ts +304 -0
- package/__tests__/custom-node-custom-code-gate.test.ts +136 -0
- package/__tests__/custom-node-step-handlers.test.ts +251 -0
- package/__tests__/custom-node-step-reach.test.ts +63 -0
- package/__tests__/data-api-anon-user-id-fallback.test.ts +7 -2
- package/__tests__/data-api-browser-reads.test.ts +7 -0
- package/__tests__/data-api-business-events.test.ts +403 -0
- package/__tests__/data-api-invalid-body.test.ts +7 -0
- package/__tests__/data-api-low-stock-autofire.test.ts +30 -4
- package/__tests__/data-api-optional-feature-columns.test.ts +44 -0
- package/__tests__/data-api-owner-scope-credentials.test.ts +1324 -0
- package/__tests__/data-api-protected-tables.test.ts +48 -15
- package/__tests__/data-api-retired-table-and-account-fields.test.ts +208 -0
- package/__tests__/email-locale-senders.test.ts +5 -3
- package/__tests__/expression-injection.test.ts +343 -0
- package/__tests__/fixtures/admin-file-workflows.json +242 -0
- package/__tests__/form-confirmation-email-template.test.ts +44 -0
- package/__tests__/internal-request-headers.test.ts +25 -0
- package/__tests__/invoice-pdf-service-project-header.test.ts +120 -0
- package/__tests__/invoice-self-call-origin.test.ts +57 -1
- package/__tests__/legacy-webhook-self-calls.test.ts +86 -1
- package/__tests__/middleware-home-route-protection.test.ts +3 -1
- package/__tests__/middleware-subscriber-access.test.ts +1 -1
- package/__tests__/newsletter-admin-route.test.ts +649 -0
- package/__tests__/newsletter-plugin.test.ts +1248 -0
- package/__tests__/outbound-nodes-security.test.ts +1929 -0
- package/__tests__/page-access-guard.test.ts +217 -0
- package/__tests__/page-access-route-table.test.ts +231 -0
- package/__tests__/payment-drivers-module.test.ts +23 -0
- package/__tests__/payment-legacy-webhook-routes.test.ts +100 -5
- package/__tests__/payment-webhook-route.test.ts +4 -1
- package/__tests__/paypal-webhook-signature-verification.test.ts +44 -0
- package/__tests__/place-order-guards.test.ts +506 -0
- package/__tests__/public-step-guards.test.ts +310 -0
- package/__tests__/publish-refusals.test.ts +505 -0
- package/__tests__/realtime-identity-routes.test.ts +492 -0
- package/__tests__/record-event-writer-server-only.test.ts +975 -0
- package/__tests__/resolve-config-template-params.test.ts +3 -3
- package/__tests__/runtime-storage-upload-access.test.ts +280 -17
- package/__tests__/security-integration-env-names.test.ts +74 -0
- package/__tests__/security-lists-parity.test.ts +245 -0
- package/__tests__/security-runtime-shadow.test.ts +224 -1
- package/__tests__/security-runtime.test.ts +893 -0
- package/__tests__/segment-rate-limit-error-branch.test.ts +284 -0
- package/__tests__/segment-route-abuse-gate.test.ts +309 -0
- package/__tests__/server-job-hops-real-data-api.test.ts +669 -0
- package/__tests__/server-session-identity.test.ts +522 -0
- package/__tests__/server-step-chain.test.ts +222 -0
- package/__tests__/server-step-signing.test.ts +107 -2
- package/__tests__/session-cookie-resolver.test.ts +62 -106
- package/__tests__/signup-event.test.ts +649 -0
- package/__tests__/signup-reply-identical.test.ts +144 -0
- package/__tests__/slack-message-escaping.test.ts +123 -0
- package/__tests__/visitor-step-limits.test.ts +318 -0
- package/__tests__/webhook-delivery-lease.test.ts +4 -1
- package/__tests__/webpack-safe-handlers.test.ts +57 -8
- package/__tests__/workflow-auth-guard.test.ts +9 -1
- package/dist/cjs/account-delete-route-generator.d.ts +1 -0
- package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
- package/dist/cjs/account-delete-route-generator.js +18 -3
- package/dist/cjs/account-delete-route-generator.js.map +1 -1
- package/dist/cjs/api-route-generator.d.ts +52 -3
- package/dist/cjs/api-route-generator.d.ts.map +1 -1
- package/dist/cjs/api-route-generator.js +600 -145
- package/dist/cjs/api-route-generator.js.map +1 -1
- package/dist/cjs/auth-generator.d.ts +126 -3
- package/dist/cjs/auth-generator.d.ts.map +1 -1
- package/dist/cjs/auth-generator.js +1353 -139
- package/dist/cjs/auth-generator.js.map +1 -1
- package/dist/cjs/automations/activity-kicks.d.ts +12 -0
- package/dist/cjs/automations/activity-kicks.d.ts.map +1 -0
- package/dist/cjs/automations/activity-kicks.js +123 -0
- package/dist/cjs/automations/activity-kicks.js.map +1 -0
- package/dist/cjs/automations/app-events-source.d.ts +33 -0
- package/dist/cjs/automations/app-events-source.d.ts.map +1 -0
- package/dist/cjs/automations/app-events-source.js +109 -0
- package/dist/cjs/automations/app-events-source.js.map +1 -0
- package/dist/cjs/automations/automations-project-plugin.d.ts +21 -0
- package/dist/cjs/automations/automations-project-plugin.d.ts.map +1 -0
- package/dist/cjs/automations/automations-project-plugin.js +102 -0
- package/dist/cjs/automations/automations-project-plugin.js.map +1 -0
- package/dist/cjs/automations/automations-scope.d.ts +104 -0
- package/dist/cjs/automations/automations-scope.d.ts.map +1 -0
- package/dist/cjs/automations/automations-scope.js +176 -0
- package/dist/cjs/automations/automations-scope.js.map +1 -0
- package/dist/cjs/automations/dispatcher-source.d.ts +72 -0
- package/dist/cjs/automations/dispatcher-source.d.ts.map +1 -0
- package/dist/cjs/automations/dispatcher-source.js +1008 -0
- package/dist/cjs/automations/dispatcher-source.js.map +1 -0
- package/dist/cjs/automations/event-bus-source.d.ts +44 -0
- package/dist/cjs/automations/event-bus-source.d.ts.map +1 -0
- package/dist/cjs/automations/event-bus-source.js +427 -0
- package/dist/cjs/automations/event-bus-source.js.map +1 -0
- package/dist/cjs/automations/handler-module-generator.d.ts +25 -0
- package/dist/cjs/automations/handler-module-generator.d.ts.map +1 -0
- package/dist/cjs/automations/handler-module-generator.js +78 -0
- package/dist/cjs/automations/handler-module-generator.js.map +1 -0
- package/dist/cjs/automations/hydrators-source.d.ts +33 -0
- package/dist/cjs/automations/hydrators-source.d.ts.map +1 -0
- package/dist/cjs/automations/hydrators-source.js +571 -0
- package/dist/cjs/automations/hydrators-source.js.map +1 -0
- package/dist/cjs/booking-calendar-feed-route-generator.d.ts.map +1 -1
- package/dist/cjs/booking-calendar-feed-route-generator.js +8 -0
- package/dist/cjs/booking-calendar-feed-route-generator.js.map +1 -1
- package/dist/cjs/configured-nextauth-url.d.ts +17 -0
- package/dist/cjs/configured-nextauth-url.d.ts.map +1 -0
- package/dist/cjs/configured-nextauth-url.js +20 -0
- package/dist/cjs/configured-nextauth-url.js.map +1 -0
- package/dist/cjs/cron-request-verification.d.ts +22 -1
- package/dist/cjs/cron-request-verification.d.ts.map +1 -1
- package/dist/cjs/cron-request-verification.js +50 -6
- package/dist/cjs/cron-request-verification.js.map +1 -1
- package/dist/cjs/data-api-route-generator.d.ts +19 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +711 -43
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts +3 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
- package/dist/cjs/ecommerce/parameterized-stock-chain.js +45 -5
- package/dist/cjs/ecommerce/parameterized-stock-chain.js.map +1 -1
- package/dist/cjs/ecommerce/place-order-guards.d.ts +126 -0
- package/dist/cjs/ecommerce/place-order-guards.d.ts.map +1 -0
- package/dist/cjs/ecommerce/place-order-guards.js +670 -0
- package/dist/cjs/ecommerce/place-order-guards.js.map +1 -0
- package/dist/cjs/ecommerce-customhandler-rewriter.d.ts +2 -0
- package/dist/cjs/ecommerce-customhandler-rewriter.d.ts.map +1 -1
- package/dist/cjs/ecommerce-customhandler-rewriter.js +38 -2
- package/dist/cjs/ecommerce-customhandler-rewriter.js.map +1 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +368 -60
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/graph-utils.d.ts +9 -0
- package/dist/cjs/graph-utils.d.ts.map +1 -1
- package/dist/cjs/graph-utils.js +32 -1
- package/dist/cjs/graph-utils.js.map +1 -1
- package/dist/cjs/index.d.ts +20 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +72 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/invoice/api-routes-code.d.ts +9 -3
- package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/cjs/invoice/api-routes-code.js +9 -7
- package/dist/cjs/invoice/api-routes-code.js.map +1 -1
- package/dist/cjs/invoice/index.d.ts.map +1 -1
- package/dist/cjs/invoice/index.js +12 -7
- package/dist/cjs/invoice/index.js.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.js +8 -3
- package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-generator-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-generator-code.js +2 -1
- package/dist/cjs/invoice/pdf-generator-code.js.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/cjs/invoice/pdf-service-client-code.js +15 -7
- package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/cjs/newsletter/admin-route-code.d.ts +60 -0
- package/dist/cjs/newsletter/admin-route-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/admin-route-code.js +300 -0
- package/dist/cjs/newsletter/admin-route-code.js.map +1 -0
- package/dist/cjs/newsletter/helper-code.d.ts +109 -0
- package/dist/cjs/newsletter/helper-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/helper-code.js +662 -0
- package/dist/cjs/newsletter/helper-code.js.map +1 -0
- package/dist/cjs/newsletter/newsletter-scope.d.ts +65 -0
- package/dist/cjs/newsletter/newsletter-scope.d.ts.map +1 -0
- package/dist/cjs/newsletter/newsletter-scope.js +103 -0
- package/dist/cjs/newsletter/newsletter-scope.js.map +1 -0
- package/dist/cjs/newsletter/project-plugin.d.ts +18 -0
- package/dist/cjs/newsletter/project-plugin.d.ts.map +1 -0
- package/dist/cjs/newsletter/project-plugin.js +97 -0
- package/dist/cjs/newsletter/project-plugin.js.map +1 -0
- package/dist/cjs/newsletter/routes-code.d.ts +6 -0
- package/dist/cjs/newsletter/routes-code.d.ts.map +1 -0
- package/dist/cjs/newsletter/routes-code.js +181 -0
- package/dist/cjs/newsletter/routes-code.js.map +1 -0
- package/dist/cjs/nodes/account/account-compare-passwords.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-compare-passwords.js +16 -6
- package/dist/cjs/nodes/account/account-compare-passwords.js.map +1 -1
- package/dist/cjs/nodes/account/account-delete-current.js +1 -1
- package/dist/cjs/nodes/account/account-get-current.js +1 -1
- package/dist/cjs/nodes/account/account-hash-password.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-hash-password.js +15 -3
- package/dist/cjs/nodes/account/account-hash-password.js.map +1 -1
- package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-login.js +23 -6
- package/dist/cjs/nodes/account/account-login.js.map +1 -1
- package/dist/cjs/nodes/account/account-logout.js +1 -1
- package/dist/cjs/nodes/account/account-refresh-session.js +1 -1
- package/dist/cjs/nodes/account/account-request-password-reset.d.ts +3 -0
- package/dist/cjs/nodes/account/account-request-password-reset.d.ts.map +1 -0
- package/dist/cjs/nodes/account/account-request-password-reset.js +46 -0
- package/dist/cjs/nodes/account/account-request-password-reset.js.map +1 -0
- package/dist/cjs/nodes/account/account-reset-password.d.ts +3 -0
- package/dist/cjs/nodes/account/account-reset-password.d.ts.map +1 -0
- package/dist/cjs/nodes/account/account-reset-password.js +44 -0
- package/dist/cjs/nodes/account/account-reset-password.js.map +1 -0
- package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/cjs/nodes/account/account-signup.js +82 -19
- package/dist/cjs/nodes/account/account-signup.js.map +1 -1
- package/dist/cjs/nodes/account/account-social-login.js +1 -1
- package/dist/cjs/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-custom-prompt.js +20 -5
- package/dist/cjs/nodes/ai/ai-custom-prompt.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-detect-language.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-detect-language.js +20 -5
- package/dist/cjs/nodes/ai/ai-detect-language.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.js +10 -2
- package/dist/cjs/nodes/ai/ai-generate-text-embedding.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
- package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils.d.ts +31 -2
- package/dist/cjs/nodes/ai/ai-provider-utils.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-provider-utils.js +125 -11
- package/dist/cjs/nodes/ai/ai-provider-utils.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -2
- package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.js +20 -5
- package/dist/cjs/nodes/ai/ai-sentiment-analysis.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-summarization.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-summarization.js +20 -5
- package/dist/cjs/nodes/ai/ai-summarization.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-classifier.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-classifier.js +20 -5
- package/dist/cjs/nodes/ai/ai-text-classifier.js.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-transform.d.ts.map +1 -1
- package/dist/cjs/nodes/ai/ai-text-transform.js +20 -5
- package/dist/cjs/nodes/ai/ai-text-transform.js.map +1 -1
- package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts +3 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.js +110 -0
- package/dist/cjs/nodes/analytics/analytics-track-outcome.js.map +1 -0
- package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -1
- package/dist/cjs/nodes/cart/cart-price-order.js +161 -2
- package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -1
- package/dist/cjs/nodes/cost-bearing-node-types.d.ts +4 -0
- package/dist/cjs/nodes/cost-bearing-node-types.d.ts.map +1 -0
- package/dist/cjs/nodes/cost-bearing-node-types.js +43 -0
- package/dist/cjs/nodes/cost-bearing-node-types.js.map +1 -0
- package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-select.js +12 -2
- package/dist/cjs/nodes/data/data-select.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailersend.js +15 -11
- package/dist/cjs/nodes/email/email-mailersend.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.js +15 -15
- package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.js +15 -15
- package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
- package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-resend.js +15 -15
- package/dist/cjs/nodes/email/email-resend.js.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.js +15 -15
- package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/cjs/nodes/email/html-escape-code.d.ts +3 -0
- package/dist/cjs/nodes/email/html-escape-code.d.ts.map +1 -0
- package/dist/cjs/nodes/email/html-escape-code.js +23 -0
- package/dist/cjs/nodes/email/html-escape-code.js.map +1 -0
- package/dist/cjs/nodes/email/message-trust.d.ts +40 -0
- package/dist/cjs/nodes/email/message-trust.d.ts.map +1 -0
- package/dist/cjs/nodes/email/message-trust.js +167 -0
- package/dist/cjs/nodes/email/message-trust.js.map +1 -0
- package/dist/cjs/nodes/email/outbound-message-guard.d.ts +113 -0
- package/dist/cjs/nodes/email/outbound-message-guard.d.ts.map +1 -0
- package/dist/cjs/nodes/email/outbound-message-guard.js +460 -0
- package/dist/cjs/nodes/email/outbound-message-guard.js.map +1 -0
- package/dist/cjs/nodes/email/trusted-html-code.d.ts +22 -0
- package/dist/cjs/nodes/email/trusted-html-code.d.ts.map +1 -0
- package/dist/cjs/nodes/email/trusted-html-code.js +52 -0
- package/dist/cjs/nodes/email/trusted-html-code.js.map +1 -0
- package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.js +44 -7
- package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
- package/dist/cjs/nodes/general/general-http-request.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-http-request.js +431 -45
- package/dist/cjs/nodes/general/general-http-request.js.map +1 -1
- package/dist/cjs/nodes/general/general-rate-limiter.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-rate-limiter.js +46 -78
- package/dist/cjs/nodes/general/general-rate-limiter.js.map +1 -1
- package/dist/cjs/nodes/general/general-wait.d.ts +3 -0
- package/dist/cjs/nodes/general/general-wait.d.ts.map +1 -0
- package/dist/cjs/nodes/general/general-wait.js +81 -0
- package/dist/cjs/nodes/general/general-wait.js.map +1 -0
- package/dist/cjs/nodes/general/visitor-request.d.ts +44 -0
- package/dist/cjs/nodes/general/visitor-request.d.ts.map +1 -0
- package/dist/cjs/nodes/general/visitor-request.js +72 -0
- package/dist/cjs/nodes/general/visitor-request.js.map +1 -0
- package/dist/cjs/nodes/index.d.ts.map +1 -1
- package/dist/cjs/nodes/index.js +7 -1
- package/dist/cjs/nodes/index.js.map +1 -1
- package/dist/cjs/nodes/integrations/integration-slack.d.ts.map +1 -1
- package/dist/cjs/nodes/integrations/integration-slack.js +17 -6
- package/dist/cjs/nodes/integrations/integration-slack.js.map +1 -1
- package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts +3 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.js +41 -0
- package/dist/cjs/nodes/newsletter/newsletter-confirm.js.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.js +69 -0
- package/dist/cjs/nodes/newsletter/newsletter-subscribe.js.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js +42 -0
- package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
- package/dist/cjs/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-join-channel.js +5 -4
- package/dist/cjs/nodes/realtime/realtime-join-channel.js.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.js +11 -2
- package/dist/cjs/nodes/realtime/realtime-send-channel-event.js.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.js +11 -2
- package/dist/cjs/nodes/realtime/realtime-send-channel-message.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-infobip.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-infobip.js +11 -8
- package/dist/cjs/nodes/sms/sms-infobip.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-smsapi.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-smsapi.js +11 -8
- package/dist/cjs/nodes/sms/sms-smsapi.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-textmagic.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-textmagic.js +11 -8
- package/dist/cjs/nodes/sms/sms-textmagic.js.map +1 -1
- package/dist/cjs/nodes/sms/sms-twilio.d.ts.map +1 -1
- package/dist/cjs/nodes/sms/sms-twilio.js +12 -10
- package/dist/cjs/nodes/sms/sms-twilio.js.map +1 -1
- package/dist/cjs/nodes/types.d.ts +8 -1
- package/dist/cjs/nodes/types.d.ts.map +1 -1
- package/dist/cjs/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
- package/dist/cjs/nodes/utility/utility-similarity-scoring.js +29 -10
- package/dist/cjs/nodes/utility/utility-similarity-scoring.js.map +1 -1
- package/dist/cjs/page-access-guard-generator.d.ts +23 -0
- package/dist/cjs/page-access-guard-generator.d.ts.map +1 -0
- package/dist/cjs/page-access-guard-generator.js +135 -0
- package/dist/cjs/page-access-guard-generator.js.map +1 -0
- package/dist/cjs/password-reset-route-generator.d.ts +119 -0
- package/dist/cjs/password-reset-route-generator.d.ts.map +1 -0
- package/dist/cjs/password-reset-route-generator.js +460 -0
- package/dist/cjs/password-reset-route-generator.js.map +1 -0
- package/dist/cjs/payments/payment-core-code.d.ts.map +1 -1
- package/dist/cjs/payments/payment-core-code.js +12 -7
- package/dist/cjs/payments/payment-core-code.js.map +1 -1
- package/dist/cjs/project-code-scanner.d.ts +11 -0
- package/dist/cjs/project-code-scanner.d.ts.map +1 -0
- package/dist/cjs/project-code-scanner.js +80 -0
- package/dist/cjs/project-code-scanner.js.map +1 -0
- package/dist/cjs/public-step-guards.d.ts +122 -0
- package/dist/cjs/public-step-guards.d.ts.map +1 -0
- package/dist/cjs/public-step-guards.js +288 -0
- package/dist/cjs/public-step-guards.js.map +1 -0
- package/dist/cjs/publish-refusals.d.ts +66 -0
- package/dist/cjs/publish-refusals.d.ts.map +1 -0
- package/dist/cjs/publish-refusals.js +278 -0
- package/dist/cjs/publish-refusals.js.map +1 -0
- package/dist/cjs/realtime-generator.d.ts +63 -1
- package/dist/cjs/realtime-generator.d.ts.map +1 -1
- package/dist/cjs/realtime-generator.js +404 -230
- package/dist/cjs/realtime-generator.js.map +1 -1
- package/dist/cjs/runtime-storage-generator.d.ts +32 -1
- package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
- package/dist/cjs/runtime-storage-generator.js +265 -12
- package/dist/cjs/runtime-storage-generator.js.map +1 -1
- package/dist/cjs/security-runtime/index.d.ts +14 -0
- package/dist/cjs/security-runtime/index.d.ts.map +1 -0
- package/dist/cjs/security-runtime/index.js +48 -0
- package/dist/cjs/security-runtime/index.js.map +1 -0
- package/dist/cjs/security-runtime/security-runtime-code.d.ts +53 -0
- package/dist/cjs/security-runtime/security-runtime-code.d.ts.map +1 -0
- package/dist/cjs/security-runtime/security-runtime-code.js +580 -0
- package/dist/cjs/security-runtime/security-runtime-code.js.map +1 -0
- package/dist/cjs/security-scanner.d.ts +72 -3
- package/dist/cjs/security-scanner.d.ts.map +1 -1
- package/dist/cjs/security-scanner.js +220 -8
- package/dist/cjs/security-scanner.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +10 -2
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/segment-trust.d.ts +36 -0
- package/dist/cjs/segment-trust.d.ts.map +1 -1
- package/dist/cjs/segment-trust.js +147 -3
- package/dist/cjs/segment-trust.js.map +1 -1
- package/dist/cjs/self-call-headers.d.ts +31 -0
- package/dist/cjs/self-call-headers.d.ts.map +1 -0
- package/dist/cjs/self-call-headers.js +48 -0
- package/dist/cjs/self-call-headers.js.map +1 -0
- package/dist/cjs/sent-email-log/index.d.ts +7 -0
- package/dist/cjs/sent-email-log/index.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/index.js +17 -1
- package/dist/cjs/sent-email-log/index.js.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +7 -0
- package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/cjs/sent-email-log/sent-email-log-code.js +17 -3
- package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/cjs/server-custom-node-call.d.ts +79 -0
- package/dist/cjs/server-custom-node-call.d.ts.map +1 -0
- package/dist/cjs/server-custom-node-call.js +285 -0
- package/dist/cjs/server-custom-node-call.js.map +1 -0
- package/dist/cjs/server-runtime-code.d.ts +39 -12
- package/dist/cjs/server-runtime-code.d.ts.map +1 -1
- package/dist/cjs/server-runtime-code.js +484 -41
- package/dist/cjs/server-runtime-code.js.map +1 -1
- package/dist/cjs/session-cookie-resolver.d.ts +3 -1
- package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
- package/dist/cjs/session-revocation-generator.d.ts +39 -0
- package/dist/cjs/session-revocation-generator.d.ts.map +1 -0
- package/dist/cjs/session-revocation-generator.js +177 -0
- package/dist/cjs/session-revocation-generator.js.map +1 -0
- package/dist/cjs/slack-message-values.d.ts +6 -0
- package/dist/cjs/slack-message-values.d.ts.map +1 -0
- package/dist/cjs/slack-message-values.js +73 -0
- package/dist/cjs/slack-message-values.js.map +1 -0
- package/dist/cjs/transactional-email-code.d.ts +11 -0
- package/dist/cjs/transactional-email-code.d.ts.map +1 -1
- package/dist/cjs/transactional-email-code.js +29 -5
- package/dist/cjs/transactional-email-code.js.map +1 -1
- package/dist/cjs/trigger-generator.d.ts +2 -0
- package/dist/cjs/trigger-generator.d.ts.map +1 -1
- package/dist/cjs/trigger-generator.js +17 -4
- package/dist/cjs/trigger-generator.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/visitor-step-limits.d.ts +66 -0
- package/dist/cjs/visitor-step-limits.d.ts.map +1 -0
- package/dist/cjs/visitor-step-limits.js +187 -0
- package/dist/cjs/visitor-step-limits.js.map +1 -0
- package/dist/cjs/webhook-generator.d.ts.map +1 -1
- package/dist/cjs/webhook-generator.js +93 -15
- package/dist/cjs/webhook-generator.js.map +1 -1
- package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
- package/dist/cjs/webhook-signature-verification.js +13 -3
- package/dist/cjs/webhook-signature-verification.js.map +1 -1
- package/dist/cjs/workflow-auth-generator.d.ts +4 -1
- package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
- package/dist/cjs/workflow-auth-generator.js +8 -3
- package/dist/cjs/workflow-auth-generator.js.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +11 -3
- package/dist/cjs/workflow-component-plugin.js.map +1 -1
- package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-project-plugin.js +302 -56
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/cjs/workflow-scope.d.ts.map +1 -1
- package/dist/cjs/workflow-scope.js +5 -0
- package/dist/cjs/workflow-scope.js.map +1 -1
- package/dist/esm/account-delete-route-generator.d.ts +1 -0
- package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
- package/dist/esm/account-delete-route-generator.js +18 -3
- package/dist/esm/account-delete-route-generator.js.map +1 -1
- package/dist/esm/api-route-generator.d.ts +52 -3
- package/dist/esm/api-route-generator.d.ts.map +1 -1
- package/dist/esm/api-route-generator.js +595 -142
- package/dist/esm/api-route-generator.js.map +1 -1
- package/dist/esm/auth-generator.d.ts +126 -3
- package/dist/esm/auth-generator.d.ts.map +1 -1
- package/dist/esm/auth-generator.js +1350 -140
- package/dist/esm/auth-generator.js.map +1 -1
- package/dist/esm/automations/activity-kicks.d.ts +12 -0
- package/dist/esm/automations/activity-kicks.d.ts.map +1 -0
- package/dist/esm/automations/activity-kicks.js +118 -0
- package/dist/esm/automations/activity-kicks.js.map +1 -0
- package/dist/esm/automations/app-events-source.d.ts +33 -0
- package/dist/esm/automations/app-events-source.d.ts.map +1 -0
- package/dist/esm/automations/app-events-source.js +104 -0
- package/dist/esm/automations/app-events-source.js.map +1 -0
- package/dist/esm/automations/automations-project-plugin.d.ts +21 -0
- package/dist/esm/automations/automations-project-plugin.d.ts.map +1 -0
- package/dist/esm/automations/automations-project-plugin.js +98 -0
- package/dist/esm/automations/automations-project-plugin.js.map +1 -0
- package/dist/esm/automations/automations-scope.d.ts +104 -0
- package/dist/esm/automations/automations-scope.d.ts.map +1 -0
- package/dist/esm/automations/automations-scope.js +165 -0
- package/dist/esm/automations/automations-scope.js.map +1 -0
- package/dist/esm/automations/dispatcher-source.d.ts +72 -0
- package/dist/esm/automations/dispatcher-source.d.ts.map +1 -0
- package/dist/esm/automations/dispatcher-source.js +999 -0
- package/dist/esm/automations/dispatcher-source.js.map +1 -0
- package/dist/esm/automations/event-bus-source.d.ts +44 -0
- package/dist/esm/automations/event-bus-source.d.ts.map +1 -0
- package/dist/esm/automations/event-bus-source.js +421 -0
- package/dist/esm/automations/event-bus-source.js.map +1 -0
- package/dist/esm/automations/handler-module-generator.d.ts +25 -0
- package/dist/esm/automations/handler-module-generator.d.ts.map +1 -0
- package/dist/esm/automations/handler-module-generator.js +71 -0
- package/dist/esm/automations/handler-module-generator.js.map +1 -0
- package/dist/esm/automations/hydrators-source.d.ts +33 -0
- package/dist/esm/automations/hydrators-source.d.ts.map +1 -0
- package/dist/esm/automations/hydrators-source.js +567 -0
- package/dist/esm/automations/hydrators-source.js.map +1 -0
- package/dist/esm/booking-calendar-feed-route-generator.d.ts.map +1 -1
- package/dist/esm/booking-calendar-feed-route-generator.js +8 -0
- package/dist/esm/booking-calendar-feed-route-generator.js.map +1 -1
- package/dist/esm/configured-nextauth-url.d.ts +17 -0
- package/dist/esm/configured-nextauth-url.d.ts.map +1 -0
- package/dist/esm/configured-nextauth-url.js +17 -0
- package/dist/esm/configured-nextauth-url.js.map +1 -0
- package/dist/esm/cron-request-verification.d.ts +22 -1
- package/dist/esm/cron-request-verification.d.ts.map +1 -1
- package/dist/esm/cron-request-verification.js +48 -5
- package/dist/esm/cron-request-verification.js.map +1 -1
- package/dist/esm/data-api-route-generator.d.ts +19 -0
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +710 -43
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.d.ts +3 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
- package/dist/esm/ecommerce/parameterized-stock-chain.js +43 -4
- package/dist/esm/ecommerce/parameterized-stock-chain.js.map +1 -1
- package/dist/esm/ecommerce/place-order-guards.d.ts +126 -0
- package/dist/esm/ecommerce/place-order-guards.d.ts.map +1 -0
- package/dist/esm/ecommerce/place-order-guards.js +655 -0
- package/dist/esm/ecommerce/place-order-guards.js.map +1 -0
- package/dist/esm/ecommerce-customhandler-rewriter.d.ts +2 -0
- package/dist/esm/ecommerce-customhandler-rewriter.d.ts.map +1 -1
- package/dist/esm/ecommerce-customhandler-rewriter.js +38 -2
- package/dist/esm/ecommerce-customhandler-rewriter.js.map +1 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +368 -60
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/graph-utils.d.ts +9 -0
- package/dist/esm/graph-utils.d.ts.map +1 -1
- package/dist/esm/graph-utils.js +30 -0
- package/dist/esm/graph-utils.js.map +1 -1
- package/dist/esm/index.d.ts +20 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +27 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/invoice/api-routes-code.d.ts +9 -3
- package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/esm/invoice/api-routes-code.js +9 -7
- package/dist/esm/invoice/api-routes-code.js.map +1 -1
- package/dist/esm/invoice/index.d.ts.map +1 -1
- package/dist/esm/invoice/index.js +12 -7
- package/dist/esm/invoice/index.js.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.js +8 -3
- package/dist/esm/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/esm/invoice/pdf-generator-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-generator-code.js +2 -1
- package/dist/esm/invoice/pdf-generator-code.js.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
- package/dist/esm/invoice/pdf-service-client-code.js +15 -7
- package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
- package/dist/esm/newsletter/admin-route-code.d.ts +60 -0
- package/dist/esm/newsletter/admin-route-code.d.ts.map +1 -0
- package/dist/esm/newsletter/admin-route-code.js +295 -0
- package/dist/esm/newsletter/admin-route-code.js.map +1 -0
- package/dist/esm/newsletter/helper-code.d.ts +109 -0
- package/dist/esm/newsletter/helper-code.d.ts.map +1 -0
- package/dist/esm/newsletter/helper-code.js +656 -0
- package/dist/esm/newsletter/helper-code.js.map +1 -0
- package/dist/esm/newsletter/newsletter-scope.d.ts +65 -0
- package/dist/esm/newsletter/newsletter-scope.d.ts.map +1 -0
- package/dist/esm/newsletter/newsletter-scope.js +97 -0
- package/dist/esm/newsletter/newsletter-scope.js.map +1 -0
- package/dist/esm/newsletter/project-plugin.d.ts +18 -0
- package/dist/esm/newsletter/project-plugin.d.ts.map +1 -0
- package/dist/esm/newsletter/project-plugin.js +93 -0
- package/dist/esm/newsletter/project-plugin.js.map +1 -0
- package/dist/esm/newsletter/routes-code.d.ts +6 -0
- package/dist/esm/newsletter/routes-code.d.ts.map +1 -0
- package/dist/esm/newsletter/routes-code.js +175 -0
- package/dist/esm/newsletter/routes-code.js.map +1 -0
- package/dist/esm/nodes/account/account-compare-passwords.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-compare-passwords.js +16 -6
- package/dist/esm/nodes/account/account-compare-passwords.js.map +1 -1
- package/dist/esm/nodes/account/account-delete-current.js +1 -1
- package/dist/esm/nodes/account/account-get-current.js +1 -1
- package/dist/esm/nodes/account/account-hash-password.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-hash-password.js +15 -3
- package/dist/esm/nodes/account/account-hash-password.js.map +1 -1
- package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-login.js +23 -6
- package/dist/esm/nodes/account/account-login.js.map +1 -1
- package/dist/esm/nodes/account/account-logout.js +1 -1
- package/dist/esm/nodes/account/account-refresh-session.js +1 -1
- package/dist/esm/nodes/account/account-request-password-reset.d.ts +3 -0
- package/dist/esm/nodes/account/account-request-password-reset.d.ts.map +1 -0
- package/dist/esm/nodes/account/account-request-password-reset.js +43 -0
- package/dist/esm/nodes/account/account-request-password-reset.js.map +1 -0
- package/dist/esm/nodes/account/account-reset-password.d.ts +3 -0
- package/dist/esm/nodes/account/account-reset-password.d.ts.map +1 -0
- package/dist/esm/nodes/account/account-reset-password.js +41 -0
- package/dist/esm/nodes/account/account-reset-password.js.map +1 -0
- package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
- package/dist/esm/nodes/account/account-signup.js +82 -19
- package/dist/esm/nodes/account/account-signup.js.map +1 -1
- package/dist/esm/nodes/account/account-social-login.js +1 -1
- package/dist/esm/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-custom-prompt.js +20 -5
- package/dist/esm/nodes/ai/ai-custom-prompt.js.map +1 -1
- package/dist/esm/nodes/ai/ai-detect-language.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-detect-language.js +20 -5
- package/dist/esm/nodes/ai/ai-detect-language.js.map +1 -1
- package/dist/esm/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-generate-text-embedding.js +10 -2
- package/dist/esm/nodes/ai/ai-generate-text-embedding.js.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
- package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils.d.ts +31 -2
- package/dist/esm/nodes/ai/ai-provider-utils.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-provider-utils.js +124 -10
- package/dist/esm/nodes/ai/ai-provider-utils.js.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-select-database-data.js +6 -2
- package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
- package/dist/esm/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-sentiment-analysis.js +20 -5
- package/dist/esm/nodes/ai/ai-sentiment-analysis.js.map +1 -1
- package/dist/esm/nodes/ai/ai-summarization.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-summarization.js +20 -5
- package/dist/esm/nodes/ai/ai-summarization.js.map +1 -1
- package/dist/esm/nodes/ai/ai-text-classifier.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-text-classifier.js +20 -5
- package/dist/esm/nodes/ai/ai-text-classifier.js.map +1 -1
- package/dist/esm/nodes/ai/ai-text-transform.d.ts.map +1 -1
- package/dist/esm/nodes/ai/ai-text-transform.js +20 -5
- package/dist/esm/nodes/ai/ai-text-transform.js.map +1 -1
- package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts +3 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.js +107 -0
- package/dist/esm/nodes/analytics/analytics-track-outcome.js.map +1 -0
- package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -1
- package/dist/esm/nodes/cart/cart-price-order.js +161 -2
- package/dist/esm/nodes/cart/cart-price-order.js.map +1 -1
- package/dist/esm/nodes/cost-bearing-node-types.d.ts +4 -0
- package/dist/esm/nodes/cost-bearing-node-types.d.ts.map +1 -0
- package/dist/esm/nodes/cost-bearing-node-types.js +39 -0
- package/dist/esm/nodes/cost-bearing-node-types.js.map +1 -0
- package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-select.js +12 -2
- package/dist/esm/nodes/data/data-select.js.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailersend.js +15 -11
- package/dist/esm/nodes/email/email-mailersend.js.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.js +15 -15
- package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
- package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-postmark.js +15 -15
- package/dist/esm/nodes/email/email-postmark.js.map +1 -1
- package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-resend.js +15 -15
- package/dist/esm/nodes/email/email-resend.js.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.js +15 -15
- package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/esm/nodes/email/html-escape-code.d.ts +3 -0
- package/dist/esm/nodes/email/html-escape-code.d.ts.map +1 -0
- package/dist/esm/nodes/email/html-escape-code.js +18 -0
- package/dist/esm/nodes/email/html-escape-code.js.map +1 -0
- package/dist/esm/nodes/email/message-trust.d.ts +40 -0
- package/dist/esm/nodes/email/message-trust.d.ts.map +1 -0
- package/dist/esm/nodes/email/message-trust.js +161 -0
- package/dist/esm/nodes/email/message-trust.js.map +1 -0
- package/dist/esm/nodes/email/outbound-message-guard.d.ts +113 -0
- package/dist/esm/nodes/email/outbound-message-guard.d.ts.map +1 -0
- package/dist/esm/nodes/email/outbound-message-guard.js +452 -0
- package/dist/esm/nodes/email/outbound-message-guard.js.map +1 -0
- package/dist/esm/nodes/email/trusted-html-code.d.ts +22 -0
- package/dist/esm/nodes/email/trusted-html-code.d.ts.map +1 -0
- package/dist/esm/nodes/email/trusted-html-code.js +49 -0
- package/dist/esm/nodes/email/trusted-html-code.js.map +1 -0
- package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.js +44 -7
- package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
- package/dist/esm/nodes/general/general-http-request.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-http-request.js +431 -45
- package/dist/esm/nodes/general/general-http-request.js.map +1 -1
- package/dist/esm/nodes/general/general-rate-limiter.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-rate-limiter.js +46 -78
- package/dist/esm/nodes/general/general-rate-limiter.js.map +1 -1
- package/dist/esm/nodes/general/general-wait.d.ts +3 -0
- package/dist/esm/nodes/general/general-wait.d.ts.map +1 -0
- package/dist/esm/nodes/general/general-wait.js +78 -0
- package/dist/esm/nodes/general/general-wait.js.map +1 -0
- package/dist/esm/nodes/general/visitor-request.d.ts +44 -0
- package/dist/esm/nodes/general/visitor-request.d.ts.map +1 -0
- package/dist/esm/nodes/general/visitor-request.js +65 -0
- package/dist/esm/nodes/general/visitor-request.js.map +1 -0
- package/dist/esm/nodes/index.d.ts.map +1 -1
- package/dist/esm/nodes/index.js +7 -1
- package/dist/esm/nodes/index.js.map +1 -1
- package/dist/esm/nodes/integrations/integration-slack.d.ts.map +1 -1
- package/dist/esm/nodes/integrations/integration-slack.js +17 -6
- package/dist/esm/nodes/integrations/integration-slack.js.map +1 -1
- package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts +3 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.js +38 -0
- package/dist/esm/nodes/newsletter/newsletter-confirm.js.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.js +66 -0
- package/dist/esm/nodes/newsletter/newsletter-subscribe.js.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js +39 -0
- package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
- package/dist/esm/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-join-channel.js +5 -4
- package/dist/esm/nodes/realtime/realtime-join-channel.js.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-event.js +11 -2
- package/dist/esm/nodes/realtime/realtime-send-channel-event.js.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
- package/dist/esm/nodes/realtime/realtime-send-channel-message.js +11 -2
- package/dist/esm/nodes/realtime/realtime-send-channel-message.js.map +1 -1
- package/dist/esm/nodes/sms/sms-infobip.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-infobip.js +11 -8
- package/dist/esm/nodes/sms/sms-infobip.js.map +1 -1
- package/dist/esm/nodes/sms/sms-smsapi.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-smsapi.js +11 -8
- package/dist/esm/nodes/sms/sms-smsapi.js.map +1 -1
- package/dist/esm/nodes/sms/sms-textmagic.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-textmagic.js +11 -8
- package/dist/esm/nodes/sms/sms-textmagic.js.map +1 -1
- package/dist/esm/nodes/sms/sms-twilio.d.ts.map +1 -1
- package/dist/esm/nodes/sms/sms-twilio.js +12 -10
- package/dist/esm/nodes/sms/sms-twilio.js.map +1 -1
- package/dist/esm/nodes/types.d.ts +8 -1
- package/dist/esm/nodes/types.d.ts.map +1 -1
- package/dist/esm/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
- package/dist/esm/nodes/utility/utility-similarity-scoring.js +29 -10
- package/dist/esm/nodes/utility/utility-similarity-scoring.js.map +1 -1
- package/dist/esm/page-access-guard-generator.d.ts +23 -0
- package/dist/esm/page-access-guard-generator.d.ts.map +1 -0
- package/dist/esm/page-access-guard-generator.js +131 -0
- package/dist/esm/page-access-guard-generator.js.map +1 -0
- package/dist/esm/password-reset-route-generator.d.ts +119 -0
- package/dist/esm/password-reset-route-generator.d.ts.map +1 -0
- package/dist/esm/password-reset-route-generator.js +448 -0
- package/dist/esm/password-reset-route-generator.js.map +1 -0
- package/dist/esm/payments/payment-core-code.d.ts.map +1 -1
- package/dist/esm/payments/payment-core-code.js +12 -7
- package/dist/esm/payments/payment-core-code.js.map +1 -1
- package/dist/esm/project-code-scanner.d.ts +11 -0
- package/dist/esm/project-code-scanner.d.ts.map +1 -0
- package/dist/esm/project-code-scanner.js +75 -0
- package/dist/esm/project-code-scanner.js.map +1 -0
- package/dist/esm/public-step-guards.d.ts +122 -0
- package/dist/esm/public-step-guards.d.ts.map +1 -0
- package/dist/esm/public-step-guards.js +280 -0
- package/dist/esm/public-step-guards.js.map +1 -0
- package/dist/esm/publish-refusals.d.ts +66 -0
- package/dist/esm/publish-refusals.d.ts.map +1 -0
- package/dist/esm/publish-refusals.js +271 -0
- package/dist/esm/publish-refusals.js.map +1 -0
- package/dist/esm/realtime-generator.d.ts +63 -1
- package/dist/esm/realtime-generator.d.ts.map +1 -1
- package/dist/esm/realtime-generator.js +401 -229
- package/dist/esm/realtime-generator.js.map +1 -1
- package/dist/esm/runtime-storage-generator.d.ts +32 -1
- package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
- package/dist/esm/runtime-storage-generator.js +264 -11
- package/dist/esm/runtime-storage-generator.js.map +1 -1
- package/dist/esm/security-runtime/index.d.ts +14 -0
- package/dist/esm/security-runtime/index.d.ts.map +1 -0
- package/dist/esm/security-runtime/index.js +37 -0
- package/dist/esm/security-runtime/index.js.map +1 -0
- package/dist/esm/security-runtime/security-runtime-code.d.ts +53 -0
- package/dist/esm/security-runtime/security-runtime-code.d.ts.map +1 -0
- package/dist/esm/security-runtime/security-runtime-code.js +575 -0
- package/dist/esm/security-runtime/security-runtime-code.js.map +1 -0
- package/dist/esm/security-scanner.d.ts +72 -3
- package/dist/esm/security-scanner.d.ts.map +1 -1
- package/dist/esm/security-scanner.js +217 -8
- package/dist/esm/security-scanner.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +10 -2
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/segment-trust.d.ts +36 -0
- package/dist/esm/segment-trust.d.ts.map +1 -1
- package/dist/esm/segment-trust.js +146 -2
- package/dist/esm/segment-trust.js.map +1 -1
- package/dist/esm/self-call-headers.d.ts +31 -0
- package/dist/esm/self-call-headers.d.ts.map +1 -0
- package/dist/esm/self-call-headers.js +43 -0
- package/dist/esm/self-call-headers.js.map +1 -0
- package/dist/esm/sent-email-log/index.d.ts +7 -0
- package/dist/esm/sent-email-log/index.d.ts.map +1 -1
- package/dist/esm/sent-email-log/index.js +15 -0
- package/dist/esm/sent-email-log/index.js.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts +7 -0
- package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
- package/dist/esm/sent-email-log/sent-email-log-code.js +17 -3
- package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
- package/dist/esm/server-custom-node-call.d.ts +79 -0
- package/dist/esm/server-custom-node-call.d.ts.map +1 -0
- package/dist/esm/server-custom-node-call.js +278 -0
- package/dist/esm/server-custom-node-call.js.map +1 -0
- package/dist/esm/server-runtime-code.d.ts +39 -12
- package/dist/esm/server-runtime-code.d.ts.map +1 -1
- package/dist/esm/server-runtime-code.js +483 -40
- package/dist/esm/server-runtime-code.js.map +1 -1
- package/dist/esm/session-cookie-resolver.d.ts +3 -1
- package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
- package/dist/esm/session-revocation-generator.d.ts +39 -0
- package/dist/esm/session-revocation-generator.d.ts.map +1 -0
- package/dist/esm/session-revocation-generator.js +172 -0
- package/dist/esm/session-revocation-generator.js.map +1 -0
- package/dist/esm/slack-message-values.d.ts +6 -0
- package/dist/esm/slack-message-values.d.ts.map +1 -0
- package/dist/esm/slack-message-values.js +68 -0
- package/dist/esm/slack-message-values.js.map +1 -0
- package/dist/esm/transactional-email-code.d.ts +11 -0
- package/dist/esm/transactional-email-code.d.ts.map +1 -1
- package/dist/esm/transactional-email-code.js +28 -4
- package/dist/esm/transactional-email-code.js.map +1 -1
- package/dist/esm/trigger-generator.d.ts +2 -0
- package/dist/esm/trigger-generator.d.ts.map +1 -1
- package/dist/esm/trigger-generator.js +15 -3
- package/dist/esm/trigger-generator.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/visitor-step-limits.d.ts +66 -0
- package/dist/esm/visitor-step-limits.d.ts.map +1 -0
- package/dist/esm/visitor-step-limits.js +181 -0
- package/dist/esm/visitor-step-limits.js.map +1 -0
- package/dist/esm/webhook-generator.d.ts.map +1 -1
- package/dist/esm/webhook-generator.js +93 -15
- package/dist/esm/webhook-generator.js.map +1 -1
- package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
- package/dist/esm/webhook-signature-verification.js +13 -3
- package/dist/esm/webhook-signature-verification.js.map +1 -1
- package/dist/esm/workflow-auth-generator.d.ts +4 -1
- package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
- package/dist/esm/workflow-auth-generator.js +8 -3
- package/dist/esm/workflow-auth-generator.js.map +1 -1
- package/dist/esm/workflow-component-plugin.js +12 -4
- package/dist/esm/workflow-component-plugin.js.map +1 -1
- package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-project-plugin.js +306 -60
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/dist/esm/workflow-scope.d.ts.map +1 -1
- package/dist/esm/workflow-scope.js +5 -0
- package/dist/esm/workflow-scope.js.map +1 -1
- package/package.json +4 -4
- package/src/account-delete-route-generator.ts +28 -4
- package/src/api-route-generator.ts +712 -134
- package/src/auth-generator.ts +1471 -142
- package/src/automations/activity-kicks.ts +139 -0
- package/src/automations/app-events-source.ts +117 -0
- package/src/automations/automations-project-plugin.ts +202 -0
- package/src/automations/automations-scope.ts +196 -0
- package/src/automations/dispatcher-source.ts +1072 -0
- package/src/automations/event-bus-source.ts +428 -0
- package/src/automations/handler-module-generator.ts +107 -0
- package/src/automations/hydrators-source.ts +647 -0
- package/src/booking-calendar-feed-route-generator.ts +8 -0
- package/src/configured-nextauth-url.ts +17 -0
- package/src/cron-request-verification.ts +55 -5
- package/src/data-api-route-generator.ts +780 -43
- package/src/ecommerce/parameterized-stock-chain.ts +52 -5
- package/src/ecommerce/place-order-guards.ts +785 -0
- package/src/ecommerce-customhandler-rewriter.ts +55 -2
- package/src/executor-generator.ts +372 -60
- package/src/graph-utils.ts +33 -0
- package/src/index.ts +70 -0
- package/src/invoice/api-routes-code.ts +20 -7
- package/src/invoice/index.ts +11 -6
- package/src/invoice/invoice-assembly-code.ts +8 -3
- package/src/invoice/pdf-generator-code.ts +2 -1
- package/src/invoice/pdf-service-client-code.ts +15 -7
- package/src/newsletter/admin-route-code.ts +319 -0
- package/src/newsletter/helper-code.ts +748 -0
- package/src/newsletter/newsletter-scope.ts +116 -0
- package/src/newsletter/project-plugin.ts +119 -0
- package/src/newsletter/routes-code.ts +186 -0
- package/src/nodes/account/account-compare-passwords.ts +17 -6
- package/src/nodes/account/account-delete-current.ts +1 -1
- package/src/nodes/account/account-get-current.ts +1 -1
- package/src/nodes/account/account-hash-password.ts +19 -3
- package/src/nodes/account/account-login.ts +24 -7
- package/src/nodes/account/account-logout.ts +1 -1
- package/src/nodes/account/account-refresh-session.ts +1 -1
- package/src/nodes/account/account-request-password-reset.ts +47 -0
- package/src/nodes/account/account-reset-password.ts +45 -0
- package/src/nodes/account/account-signup.ts +86 -20
- package/src/nodes/account/account-social-login.ts +1 -1
- package/src/nodes/ai/ai-custom-prompt.ts +25 -6
- package/src/nodes/ai/ai-detect-language.ts +25 -6
- package/src/nodes/ai/ai-generate-text-embedding.ts +16 -3
- package/src/nodes/ai/ai-provider-utils-sources.generated.ts +2 -2
- package/src/nodes/ai/ai-provider-utils.ts +135 -10
- package/src/nodes/ai/ai-select-database-data.ts +8 -3
- package/src/nodes/ai/ai-sentiment-analysis.ts +25 -6
- package/src/nodes/ai/ai-summarization.ts +25 -6
- package/src/nodes/ai/ai-text-classifier.ts +25 -6
- package/src/nodes/ai/ai-text-transform.ts +25 -6
- package/src/nodes/analytics/analytics-track-outcome.ts +111 -0
- package/src/nodes/cart/cart-price-order.ts +200 -2
- package/src/nodes/cost-bearing-node-types.ts +45 -0
- package/src/nodes/data/data-select.ts +11 -2
- package/src/nodes/email/email-mailersend.ts +16 -8
- package/src/nodes/email/email-mailgun.ts +17 -12
- package/src/nodes/email/email-postmark.ts +17 -12
- package/src/nodes/email/email-resend.ts +17 -12
- package/src/nodes/email/email-sendgrid.ts +17 -12
- package/src/nodes/email/html-escape-code.ts +21 -0
- package/src/nodes/email/message-trust.ts +198 -0
- package/src/nodes/email/outbound-message-guard.ts +572 -0
- package/src/nodes/email/trusted-html-code.ts +49 -0
- package/src/nodes/general/general-custom-js.ts +46 -7
- package/src/nodes/general/general-http-request.ts +449 -46
- package/src/nodes/general/general-rate-limiter.ts +54 -81
- package/src/nodes/general/general-wait.ts +80 -0
- package/src/nodes/general/visitor-request.ts +79 -0
- package/src/nodes/index.ts +12 -0
- package/src/nodes/integrations/integration-slack.ts +21 -6
- package/src/nodes/newsletter/newsletter-confirm.ts +44 -0
- package/src/nodes/newsletter/newsletter-subscribe.ts +78 -0
- package/src/nodes/newsletter/newsletter-unsubscribe.ts +43 -0
- package/src/nodes/realtime/realtime-join-channel.ts +5 -4
- package/src/nodes/realtime/realtime-send-channel-event.ts +13 -2
- package/src/nodes/realtime/realtime-send-channel-message.ts +13 -2
- package/src/nodes/sms/sms-infobip.ts +14 -4
- package/src/nodes/sms/sms-smsapi.ts +14 -4
- package/src/nodes/sms/sms-textmagic.ts +14 -4
- package/src/nodes/sms/sms-twilio.ts +14 -4
- package/src/nodes/types.ts +9 -1
- package/src/nodes/utility/utility-similarity-scoring.ts +33 -12
- package/src/page-access-guard-generator.ts +154 -0
- package/src/password-reset-route-generator.ts +531 -0
- package/src/payments/payment-core-code.ts +12 -7
- package/src/project-code-scanner.ts +98 -0
- package/src/public-step-guards.ts +448 -0
- package/src/publish-refusals.ts +459 -0
- package/src/realtime-generator.ts +457 -234
- package/src/runtime-storage-generator.ts +270 -11
- package/src/security-runtime/index.ts +53 -0
- package/src/security-runtime/security-runtime-code.ts +579 -0
- package/src/security-scanner.ts +253 -10
- package/src/segment-splitter.ts +10 -2
- package/src/segment-trust.ts +205 -2
- package/src/self-call-headers.ts +46 -0
- package/src/sent-email-log/index.ts +16 -0
- package/src/sent-email-log/sent-email-log-code.ts +30 -4
- package/src/server-custom-node-call.ts +331 -0
- package/src/server-runtime-code.ts +488 -40
- package/src/session-revocation-generator.ts +177 -0
- package/src/slack-message-values.ts +84 -0
- package/src/transactional-email-code.ts +30 -4
- package/src/trigger-generator.ts +19 -3
- package/src/visitor-step-limits.ts +228 -0
- package/src/webhook-generator.ts +94 -14
- package/src/webhook-signature-verification.ts +13 -3
- package/src/workflow-auth-generator.ts +9 -4
- package/src/workflow-component-plugin.ts +14 -4
- package/src/workflow-project-plugin.ts +374 -61
- package/src/workflow-scope.ts +6 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateSecurityRuntimeCode = exports.securityRuntimeSpecifier = exports.TOO_MANY_REQUESTS_MESSAGE = exports.RATE_LIMITS_TABLE = exports.SECURITY_RUNTIME_FILE_NAME = exports.SECURITY_RUNTIME_PATH = exports.SECURITY_RUNTIME_FILE_KEY = void 0;
|
|
4
|
+
const pg_client_code_1 = require("../pg-client-code");
|
|
5
|
+
/**
|
|
6
|
+
* Where the shared security runtime lives in the generated project
|
|
7
|
+
* (`utils/security-runtime.js`), and the table its rate limits keep.
|
|
8
|
+
*/
|
|
9
|
+
exports.SECURITY_RUNTIME_FILE_KEY = 'security-runtime';
|
|
10
|
+
exports.SECURITY_RUNTIME_PATH = ['utils'];
|
|
11
|
+
exports.SECURITY_RUNTIME_FILE_NAME = 'security-runtime';
|
|
12
|
+
exports.RATE_LIMITS_TABLE = 'teleport_rate_limits';
|
|
13
|
+
/** What `rateLimitRequest` answers a refused request, with a 429. */
|
|
14
|
+
exports.TOO_MANY_REQUESTS_MESSAGE = 'Too many requests. Try again later.';
|
|
15
|
+
/**
|
|
16
|
+
* The `require` specifier of the runtime from a generated file whose folder
|
|
17
|
+
* is `relativePrefix` below the project root: `'../../..'` for
|
|
18
|
+
* `pages/api/<folder>/<route>.js`, `'../..'` for `pages/api/<route>.js` and
|
|
19
|
+
* for `utils/workflows/server-runtime.js`.
|
|
20
|
+
*/
|
|
21
|
+
const securityRuntimeSpecifier = (relativePrefix) => `${relativePrefix}/${exports.SECURITY_RUNTIME_PATH.join('/')}/${exports.SECURITY_RUNTIME_FILE_NAME}`;
|
|
22
|
+
exports.securityRuntimeSpecifier = securityRuntimeSpecifier;
|
|
23
|
+
/**
|
|
24
|
+
* Emits `utils/security-runtime.js` — the one place the generated app's
|
|
25
|
+
* server code takes the visitor's address, compares secrets, counts rate
|
|
26
|
+
* limits and answers errors from.
|
|
27
|
+
*
|
|
28
|
+
* - `clientIp(req)` reads the address only where the host guarantees it: on
|
|
29
|
+
* Vercel the headers its edge sets; elsewhere `X-Forwarded-For` only when
|
|
30
|
+
* the connection comes from a proxy on a private address, and only the hop
|
|
31
|
+
* that proxy appended; otherwise the socket address. A visitor-written hop
|
|
32
|
+
* is never read. `TQ_TRUSTED_PROXY` (`private` default | `vercel` | `none`)
|
|
33
|
+
* lets a self-hoster narrow that (see the emitted header).
|
|
34
|
+
* - `safeEqual(a, b)` is a constant-time compare that is false for anything
|
|
35
|
+
* missing, empty or of another length, and never throws.
|
|
36
|
+
* - `visitorKey(ip)` is the visitor an address stands for: an IPv4 address
|
|
37
|
+
* itself, an IPv6 one its /64 (an IPv4 tail counted as the two groups it
|
|
38
|
+
* fills). Every rate limit keyed by visitor uses it.
|
|
39
|
+
* - `rateLimit` counts fixed windows in the app's Postgres database (table
|
|
40
|
+
* `teleport_rate_limits`, created on first use under an advisory lock), so
|
|
41
|
+
* every instance of a serverless app counts together. Only an app with no
|
|
42
|
+
* database (or no `pg` driver) counts in a bounded per-instance map; a
|
|
43
|
+
* database error counts in that map for a short while and is logged once.
|
|
44
|
+
* A request waits on the database at most 1.5 s; after a failure one
|
|
45
|
+
* request at a time probes it. Keys are stored as `<windowSeconds>:<sha256>`,
|
|
46
|
+
* so no address or email reaches the table; each row carries its indexed
|
|
47
|
+
* `expires_at`, and an unawaited cleanup deletes windows that are over.
|
|
48
|
+
* - `rateLimitRequest` keys by route scope, visitor (an IPv6 visitor by its
|
|
49
|
+
* /64) and optional parts, and answers a refusal with a 429 itself.
|
|
50
|
+
* - `sendClientError` answers `{ error, id }` with a generic message and logs
|
|
51
|
+
* the detail under the same opaque id, server-side only.
|
|
52
|
+
*
|
|
53
|
+
* One module for every app: whether a database is there is read at run time
|
|
54
|
+
* (`TELEPORT_DB_CONNECTION_STRING` / `TELEPORT_DB_HOST` and the driver), and
|
|
55
|
+
* the driver is loaded on first use, so an app without `pg` still builds.
|
|
56
|
+
*/
|
|
57
|
+
const generateSecurityRuntimeCode = () => `/**
|
|
58
|
+
* Shared security runtime. Server-only; CommonJS, so API routes and the
|
|
59
|
+
* workflow server runtime \`require\` it.
|
|
60
|
+
*
|
|
61
|
+
* clientIp(req) the visitor's address, read only where the host guarantees it
|
|
62
|
+
* safeEqual(a, b) constant-time compare of secrets and tokens
|
|
63
|
+
* visitorKey(ip) the visitor an address stands for: itself, or an IPv6 address's /64
|
|
64
|
+
* rateLimit({ key, limit, windowSeconds }) durable fixed-window counter -> { allowed, retryAfter }
|
|
65
|
+
* rateLimitRequest(req, res, { scope, limit, windowSeconds, keyParts })
|
|
66
|
+
* the same per route and visitor; answers 429 itself, resolves false
|
|
67
|
+
* peekRateLimitRequest(req, { scope, limit, windowSeconds, keyParts })
|
|
68
|
+
* what that has counted so far, counting nothing -> { allowed, retryAfter }
|
|
69
|
+
* sendClientError(res, status, publicMessage, err) a generic error with an opaque id; the detail stays in the server log
|
|
70
|
+
*
|
|
71
|
+
* TQ_TRUSTED_PROXY (environment) says which proxy may tell clientIp the visitor's address:
|
|
72
|
+
* private (default) on Vercel the headers its edge sets; elsewhere the last X-Forwarded-For hop,
|
|
73
|
+
* only when the connection comes from a private or loopback address (a load balancer or
|
|
74
|
+
* reverse proxy in front of the app); otherwise the socket address.
|
|
75
|
+
* A self-hosted app that visitors reach directly through a private address (Docker port
|
|
76
|
+
* publishing, a Kubernetes NodePort, any SNAT) must set "none": there the visitor writes
|
|
77
|
+
* the last hop itself and could pick its own rate-limit bucket.
|
|
78
|
+
* vercel the Vercel edge headers (x-vercel-forwarded-for, x-real-ip) only, wherever it runs.
|
|
79
|
+
* none the socket address only; every forwarding header is ignored.
|
|
80
|
+
*/
|
|
81
|
+
var crypto = require('crypto');
|
|
82
|
+
var net = require('net');
|
|
83
|
+
${(0, pg_client_code_1.generateLazyPgClientCode)()}
|
|
84
|
+
|
|
85
|
+
var RATE_LIMITS_TABLE = '${exports.RATE_LIMITS_TABLE}';
|
|
86
|
+
var TOO_MANY_REQUESTS = '${exports.TOO_MANY_REQUESTS_MESSAGE}';
|
|
87
|
+
// A guarded request waits on the database at most DATABASE_BUDGET_MS in all:
|
|
88
|
+
// connect and each query get at most a second of it. The limits are enforced
|
|
89
|
+
// here, on the client: a server-side statement_timeout would be a startup
|
|
90
|
+
// parameter that pooled connection strings refuse, or a session SET that a
|
|
91
|
+
// pooler hands to the next client.
|
|
92
|
+
var CONNECT_TIMEOUT_MS = 1000;
|
|
93
|
+
var QUERY_TIMEOUT_MS = 1000;
|
|
94
|
+
var DATABASE_BUDGET_MS = 1500;
|
|
95
|
+
// After a database error, count in memory this long before one request asks the database again.
|
|
96
|
+
var DATABASE_RETRY_MS = 30000;
|
|
97
|
+
// How often one instance deletes the windows that are over, and how much one pass deletes.
|
|
98
|
+
var CLEANUP_INTERVAL_MS = 60000;
|
|
99
|
+
var CLEANUP_BATCH = 5000;
|
|
100
|
+
var CLEANUP_MAX_BATCHES = 3;
|
|
101
|
+
var CLEANUP_QUERY_TIMEOUT_MS = 5000;
|
|
102
|
+
var MEMORY_MAX_WINDOWS = 10000;
|
|
103
|
+
|
|
104
|
+
var CREATE_SQL = 'CREATE TABLE IF NOT EXISTS "' + RATE_LIMITS_TABLE + '" (' +
|
|
105
|
+
'"key" TEXT NOT NULL, "window_start" BIGINT NOT NULL, "count" INTEGER NOT NULL DEFAULT 0, ' +
|
|
106
|
+
'"expires_at" BIGINT NOT NULL, PRIMARY KEY ("key", "window_start"))';
|
|
107
|
+
var INDEX_SQL = 'CREATE INDEX IF NOT EXISTS "' + RATE_LIMITS_TABLE + '_expires_at_idx" ' +
|
|
108
|
+
'ON "' + RATE_LIMITS_TABLE + '" ("expires_at")';
|
|
109
|
+
// Two instances creating the table at the same moment can still collide in
|
|
110
|
+
// Postgres, IF NOT EXISTS or not: they take turns under this lock.
|
|
111
|
+
var LOCK_SQL = 'SELECT pg_advisory_xact_lock(hashtext($1))';
|
|
112
|
+
// One atomic statement: the window's row is created or its count raised under
|
|
113
|
+
// the row lock, and the new count comes back. expires_at is when the window ends.
|
|
114
|
+
var HIT_SQL = 'INSERT INTO "' + RATE_LIMITS_TABLE + '" AS r ("key", "window_start", "count", "expires_at") ' +
|
|
115
|
+
'VALUES ($1, $2, 1, $3) ' +
|
|
116
|
+
'ON CONFLICT ("key", "window_start") DO UPDATE SET "count" = r."count" + 1 RETURNING "count"';
|
|
117
|
+
// Windows that are over, a batch at a time, through the expires_at index.
|
|
118
|
+
var CLEANUP_SQL = 'DELETE FROM "' + RATE_LIMITS_TABLE + '" WHERE ctid IN (SELECT ctid FROM "' + RATE_LIMITS_TABLE + '" ' +
|
|
119
|
+
'WHERE "expires_at" < $1 LIMIT ' + CLEANUP_BATCH + ')';
|
|
120
|
+
|
|
121
|
+
var __logged = {};
|
|
122
|
+
|
|
123
|
+
function __logOnce(kind, level, message) {
|
|
124
|
+
if (__logged[kind]) return;
|
|
125
|
+
__logged[kind] = true;
|
|
126
|
+
console[level]('[security-runtime] ' + message);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function __errorText(err) {
|
|
130
|
+
return err && err.message ? err.message : String(err);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// clientIp
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
function __header(req, name) {
|
|
138
|
+
var value = req && req.headers ? req.headers[name] : undefined;
|
|
139
|
+
if (Array.isArray(value)) value = value.join(',');
|
|
140
|
+
return typeof value === 'string' ? value : '';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function __normalizeIp(raw) {
|
|
144
|
+
if (typeof raw !== 'string') return '';
|
|
145
|
+
var ip = raw.trim().toLowerCase();
|
|
146
|
+
if (!ip || ip.length > 64) return '';
|
|
147
|
+
var bracketed = /^\\[([^\\]]+)\\](?::\\d{1,5})?$/.exec(ip);
|
|
148
|
+
if (bracketed) {
|
|
149
|
+
ip = bracketed[1];
|
|
150
|
+
} else if (/^\\d{1,3}(?:\\.\\d{1,3}){3}:\\d{1,5}$/.test(ip)) {
|
|
151
|
+
ip = ip.slice(0, ip.lastIndexOf(':'));
|
|
152
|
+
}
|
|
153
|
+
var zone = ip.indexOf('%');
|
|
154
|
+
if (zone !== -1) ip = ip.slice(0, zone);
|
|
155
|
+
// An IPv4 address mapped into IPv6, dotted (::ffff:10.0.0.1) or hex (::ffff:a00:1).
|
|
156
|
+
if (ip.indexOf('::ffff:') === 0) {
|
|
157
|
+
var mapped = ip.slice(7);
|
|
158
|
+
var hex = /^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(mapped);
|
|
159
|
+
if (hex) {
|
|
160
|
+
var high = parseInt(hex[1], 16);
|
|
161
|
+
var low = parseInt(hex[2], 16);
|
|
162
|
+
mapped = (high >> 8) + '.' + (high & 255) + '.' + (low >> 8) + '.' + (low & 255);
|
|
163
|
+
}
|
|
164
|
+
if (net.isIPv4(mapped)) ip = mapped;
|
|
165
|
+
}
|
|
166
|
+
return net.isIP(ip) ? ip : '';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// The last hop of a forwarded list is the one the nearest proxy wrote; every
|
|
170
|
+
// earlier hop is whatever the visitor sent. Only the last is ever read.
|
|
171
|
+
function __lastHop(value) {
|
|
172
|
+
if (!value) return '';
|
|
173
|
+
var hops = value.split(',');
|
|
174
|
+
return __normalizeIp(hops[hops.length - 1]);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function __isPrivateAddress(ip) {
|
|
178
|
+
if (net.isIPv4(ip)) {
|
|
179
|
+
var o = ip.split('.').map(Number);
|
|
180
|
+
return o[0] === 127 || o[0] === 10 || (o[0] === 172 && o[1] >= 16 && o[1] <= 31) ||
|
|
181
|
+
(o[0] === 192 && o[1] === 168) || (o[0] === 169 && o[1] === 254) ||
|
|
182
|
+
(o[0] === 100 && o[1] >= 64 && o[1] <= 127);
|
|
183
|
+
}
|
|
184
|
+
return ip === '::1' || /^f[cd][0-9a-f]{2}:/.test(ip) || /^fe[89ab][0-9a-f]:/.test(ip);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* TQ_TRUSTED_PROXY (see the top of this file): private (default), vercel or none.
|
|
189
|
+
* An unknown value keeps the default and is reported once.
|
|
190
|
+
*/
|
|
191
|
+
function __trustedProxy() {
|
|
192
|
+
var mode = String(process.env.TQ_TRUSTED_PROXY || '').trim().toLowerCase();
|
|
193
|
+
if (!mode || mode === 'private') return 'private';
|
|
194
|
+
if (mode === 'vercel' || mode === 'none') return mode;
|
|
195
|
+
__logOnce('trusted-proxy', 'warn', 'TQ_TRUSTED_PROXY=' + JSON.stringify(mode) + ' is not private, vercel or none: using private');
|
|
196
|
+
return 'private';
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The visitor's address. On Vercel its edge sets x-vercel-forwarded-for and
|
|
201
|
+
* x-real-ip itself, whatever the visitor sent. Elsewhere X-Forwarded-For is
|
|
202
|
+
* read only when the connection comes from a proxy on a private address (a
|
|
203
|
+
* load balancer, a reverse proxy on the same host), and only the hop that
|
|
204
|
+
* proxy appended; a visitor connecting directly is its socket address.
|
|
205
|
+
*/
|
|
206
|
+
function clientIp(req) {
|
|
207
|
+
var trusted = __trustedProxy();
|
|
208
|
+
if (trusted === 'vercel' || (trusted === 'private' && process.env.VERCEL)) {
|
|
209
|
+
var edge = __lastHop(__header(req, 'x-vercel-forwarded-for')) || __lastHop(__header(req, 'x-real-ip'));
|
|
210
|
+
if (edge) return edge;
|
|
211
|
+
}
|
|
212
|
+
var socket = (req && (req.socket || req.connection)) || null;
|
|
213
|
+
var peer = __normalizeIp(socket ? socket.remoteAddress : '');
|
|
214
|
+
if (trusted === 'private' && peer && __isPrivateAddress(peer)) {
|
|
215
|
+
var hop = __lastHop(__header(req, 'x-forwarded-for'));
|
|
216
|
+
if (hop) return hop;
|
|
217
|
+
}
|
|
218
|
+
return peer || 'unknown';
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// One visitor on IPv6 holds a whole /64 (often more): counting each address
|
|
222
|
+
// apart would let it rotate through 2^64 of them, so the /64 is the visitor.
|
|
223
|
+
function __visitorKey(ip) {
|
|
224
|
+
if (!net.isIPv6(ip)) return ip;
|
|
225
|
+
var halves = ip.split('::');
|
|
226
|
+
var head = halves[0] ? halves[0].split(':') : [];
|
|
227
|
+
var tail = halves.length > 1 && halves[1] ? halves[1].split(':') : [];
|
|
228
|
+
var last = tail.length ? tail[tail.length - 1] : head[head.length - 1];
|
|
229
|
+
var missing = 8 - head.length - tail.length - (last && last.indexOf('.') !== -1 ? 1 : 0);
|
|
230
|
+
var groups = head.slice();
|
|
231
|
+
for (var i = 0; i < missing; i++) groups.push('0');
|
|
232
|
+
return groups.concat(tail).slice(0, 4).map(function (group) {
|
|
233
|
+
return (parseInt(group, 16) || 0).toString(16);
|
|
234
|
+
}).join(':') + '::/64';
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// safeEqual
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Constant-time compare; false for anything missing, empty or of another
|
|
243
|
+
* length (so two empty values are NOT equal: an unset secret never matches).
|
|
244
|
+
* The digests are compared, so the time taken does not tell the length either.
|
|
245
|
+
* Never throws.
|
|
246
|
+
*/
|
|
247
|
+
function safeEqual(a, b) {
|
|
248
|
+
try {
|
|
249
|
+
if ((typeof a !== 'string' && !Buffer.isBuffer(a)) || (typeof b !== 'string' && !Buffer.isBuffer(b))) return false;
|
|
250
|
+
var left = Buffer.isBuffer(a) ? a : Buffer.from(a, 'utf8');
|
|
251
|
+
var right = Buffer.isBuffer(b) ? b : Buffer.from(b, 'utf8');
|
|
252
|
+
if (left.length === 0 || right.length === 0) return false;
|
|
253
|
+
var same = crypto.timingSafeEqual(
|
|
254
|
+
crypto.createHash('sha256').update(left).digest(),
|
|
255
|
+
crypto.createHash('sha256').update(right).digest()
|
|
256
|
+
);
|
|
257
|
+
return same && left.length === right.length;
|
|
258
|
+
} catch (_e) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// rateLimit
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
|
|
267
|
+
// NO-DATABASE FALLBACK ONLY. These counts live in this one process: on a host
|
|
268
|
+
// that runs several instances of the app (serverless) each instance counts on
|
|
269
|
+
// its own, so a limit here holds per instance, not for the app. Used only when
|
|
270
|
+
// the app has no database (or no pg driver), and for DATABASE_RETRY_MS after a
|
|
271
|
+
// database error, so a database outage never takes the routes it guards down
|
|
272
|
+
// with it. Bounded: at most MEMORY_MAX_WINDOWS windows, the oldest go first —
|
|
273
|
+
// so in this fallback a sender of 10,000 fresh keys can push an older
|
|
274
|
+
// visitor's count out and give it a fresh window. The database path has no
|
|
275
|
+
// such limit.
|
|
276
|
+
var __memoryWindows = new Map();
|
|
277
|
+
|
|
278
|
+
function __memoryMakeRoom(nowSec) {
|
|
279
|
+
__memoryWindows.forEach(function (entry, mapKey) {
|
|
280
|
+
if (entry.endsAt <= nowSec) __memoryWindows.delete(mapKey);
|
|
281
|
+
});
|
|
282
|
+
var keys = __memoryWindows.keys();
|
|
283
|
+
while (__memoryWindows.size >= MEMORY_MAX_WINDOWS) {
|
|
284
|
+
__memoryWindows.delete(keys.next().value);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function __memoryHit(storageKey, windowStart, windowSeconds, nowSec) {
|
|
289
|
+
var mapKey = storageKey + '@' + windowStart;
|
|
290
|
+
var entry = __memoryWindows.get(mapKey);
|
|
291
|
+
if (!entry) {
|
|
292
|
+
if (__memoryWindows.size >= MEMORY_MAX_WINDOWS) __memoryMakeRoom(nowSec);
|
|
293
|
+
entry = { count: 0, endsAt: windowStart + windowSeconds };
|
|
294
|
+
__memoryWindows.set(mapKey, entry);
|
|
295
|
+
}
|
|
296
|
+
entry.count += 1;
|
|
297
|
+
return entry.count;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
var __tableReady = false;
|
|
301
|
+
// Healthy, every request asks the database. After a failure, requests count in
|
|
302
|
+
// memory until __databaseRetryAt; then ONE request probes (it pushes the retry
|
|
303
|
+
// time back before it asks), so the requests beside it never wait on a
|
|
304
|
+
// database that may still be down.
|
|
305
|
+
var __databaseFailing = false;
|
|
306
|
+
var __databaseRetryAt = 0;
|
|
307
|
+
var __lastCleanupAt = 0;
|
|
308
|
+
var __cleanupRunning = false;
|
|
309
|
+
|
|
310
|
+
function __hasDatabase() {
|
|
311
|
+
return !!(process.env.TELEPORT_DB_CONNECTION_STRING || process.env.TELEPORT_DB_HOST) && !!__loadPg();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function __withTimeout(promise, ms, onTimeout) {
|
|
315
|
+
var timer;
|
|
316
|
+
var timeout = new Promise(function (_resolve, reject) {
|
|
317
|
+
timer = setTimeout(function () {
|
|
318
|
+
if (onTimeout) onTimeout();
|
|
319
|
+
reject(new Error('rate-limit database call timed out after ' + Math.max(0, ms) + 'ms'));
|
|
320
|
+
}, Math.max(0, ms));
|
|
321
|
+
});
|
|
322
|
+
return Promise.race([promise, timeout]).then(
|
|
323
|
+
function (value) { clearTimeout(timer); return value; },
|
|
324
|
+
function (err) { clearTimeout(timer); throw err; }
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Closes a client without waiting for it: a database that stopped answering
|
|
329
|
+
// may never acknowledge the close either. A client that timed out has its
|
|
330
|
+
// socket destroyed first.
|
|
331
|
+
function __release(client, destroy) {
|
|
332
|
+
if (destroy) {
|
|
333
|
+
try { client.connection.stream.destroy(); } catch (_e) {}
|
|
334
|
+
}
|
|
335
|
+
try {
|
|
336
|
+
var ended = client.end();
|
|
337
|
+
if (ended && typeof ended.catch === 'function') ended.catch(function () {});
|
|
338
|
+
} catch (_e) {}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Deletes windows that are over on the client the request used, after the
|
|
342
|
+
// request has its answer: never awaited by it. On Vercel the platform's
|
|
343
|
+
// waitUntil, when the app has one, keeps the function alive for it.
|
|
344
|
+
function __cleanupOn(client, nowSec) {
|
|
345
|
+
__cleanupRunning = true;
|
|
346
|
+
var timedOut = false;
|
|
347
|
+
var cut = function () { timedOut = true; };
|
|
348
|
+
var pass = (async function () {
|
|
349
|
+
for (var batch = 0; batch < CLEANUP_MAX_BATCHES; batch++) {
|
|
350
|
+
var result = await __withTimeout(client.query(CLEANUP_SQL, [nowSec]), CLEANUP_QUERY_TIMEOUT_MS, cut);
|
|
351
|
+
if (!result || !(result.rowCount >= CLEANUP_BATCH)) break;
|
|
352
|
+
}
|
|
353
|
+
})().then(
|
|
354
|
+
function () {},
|
|
355
|
+
function (err) { __logOnce('cleanup', 'error', 'could not delete rate-limit windows that are over: ' + __errorText(err)); }
|
|
356
|
+
).then(function () {
|
|
357
|
+
__cleanupRunning = false;
|
|
358
|
+
__release(client, timedOut);
|
|
359
|
+
});
|
|
360
|
+
var waitUntil = process.env.VERCEL && typeof globalThis.__tqWaitUntil === 'function' ? globalThis.__tqWaitUntil : null;
|
|
361
|
+
if (waitUntil) {
|
|
362
|
+
try { waitUntil(pass); } catch (_e) {}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
async function __databaseHit(storageKey, windowStart, expiresAt, nowSec) {
|
|
367
|
+
var client = getClient();
|
|
368
|
+
if (typeof client.on === 'function') client.on('error', function () {});
|
|
369
|
+
var deadline = Date.now() + DATABASE_BUDGET_MS;
|
|
370
|
+
var timedOut = false;
|
|
371
|
+
var cut = function () { timedOut = true; };
|
|
372
|
+
var within = function (promise, cap) {
|
|
373
|
+
return __withTimeout(promise, Math.min(cap, deadline - Date.now()), cut);
|
|
374
|
+
};
|
|
375
|
+
var run = function (sql, values) {
|
|
376
|
+
return within(client.query(sql, values || []), QUERY_TIMEOUT_MS);
|
|
377
|
+
};
|
|
378
|
+
var createTable = async function () {
|
|
379
|
+
await run('BEGIN');
|
|
380
|
+
await run(LOCK_SQL, [RATE_LIMITS_TABLE]);
|
|
381
|
+
await run(CREATE_SQL);
|
|
382
|
+
await run(INDEX_SQL);
|
|
383
|
+
await run('COMMIT');
|
|
384
|
+
__tableReady = true;
|
|
385
|
+
};
|
|
386
|
+
var hit = function () {
|
|
387
|
+
return run(HIT_SQL, [storageKey, windowStart, expiresAt]);
|
|
388
|
+
};
|
|
389
|
+
var handedToCleanup = false;
|
|
390
|
+
try {
|
|
391
|
+
await within(client.connect(), CONNECT_TIMEOUT_MS);
|
|
392
|
+
if (!__tableReady) await createTable();
|
|
393
|
+
var result;
|
|
394
|
+
try {
|
|
395
|
+
result = await hit();
|
|
396
|
+
} catch (err) {
|
|
397
|
+
// The table went away (dropped, or the database restored from an
|
|
398
|
+
// older backup): create it again and count this request in it.
|
|
399
|
+
if (!err || err.code !== '42P01') throw err;
|
|
400
|
+
__tableReady = false;
|
|
401
|
+
await createTable();
|
|
402
|
+
result = await hit();
|
|
403
|
+
}
|
|
404
|
+
var count = result && result.rows && result.rows[0] ? Number(result.rows[0].count) : NaN;
|
|
405
|
+
if (!(count >= 1)) throw new Error('the rate-limit upsert returned no count');
|
|
406
|
+
if (!__cleanupRunning && Date.now() - __lastCleanupAt >= CLEANUP_INTERVAL_MS) {
|
|
407
|
+
__lastCleanupAt = Date.now();
|
|
408
|
+
handedToCleanup = true;
|
|
409
|
+
__cleanupOn(client, nowSec);
|
|
410
|
+
}
|
|
411
|
+
return count;
|
|
412
|
+
} finally {
|
|
413
|
+
if (!handedToCleanup) __release(client, timedOut);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function __atLeastOne(value) {
|
|
418
|
+
return typeof value === 'number' && isFinite(value) && value >= 1;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Counts one request against \`key\` in the current fixed window of
|
|
423
|
+
* \`windowSeconds\`. Resolves \`{ allowed, retryAfter }\`: \`retryAfter\` is the
|
|
424
|
+
* seconds until the window ends when refused, 0 when allowed. Rejects with a
|
|
425
|
+
* TypeError for a missing key or a limit/window below 1 (a route that cannot
|
|
426
|
+
* say what it limits refuses, never opens).
|
|
427
|
+
*/
|
|
428
|
+
async function rateLimit(options) {
|
|
429
|
+
var o = options || {};
|
|
430
|
+
if (typeof o.key !== 'string' || !o.key) throw new TypeError('rateLimit: key must be a non-empty string');
|
|
431
|
+
if (!__atLeastOne(o.limit)) throw new TypeError('rateLimit: limit must be a number of at least 1');
|
|
432
|
+
if (!__atLeastOne(o.windowSeconds)) throw new TypeError('rateLimit: windowSeconds must be a number of at least 1');
|
|
433
|
+
var windowSeconds = Math.floor(o.windowSeconds);
|
|
434
|
+
var nowMs = Date.now();
|
|
435
|
+
var nowSec = Math.floor(nowMs / 1000);
|
|
436
|
+
var windowStart = nowSec - (nowSec % windowSeconds);
|
|
437
|
+
var storageKey = windowSeconds + ':' + crypto.createHash('sha256').update(o.key).digest('hex');
|
|
438
|
+
var count = 0;
|
|
439
|
+
if (!__hasDatabase()) {
|
|
440
|
+
__logOnce('no-database', 'warn', 'no database is configured: rate limits are counted per server instance only');
|
|
441
|
+
} else if (nowMs >= __databaseRetryAt) {
|
|
442
|
+
// After a failure this request is the one probe: the rest count in memory until it answers.
|
|
443
|
+
if (__databaseFailing) __databaseRetryAt = nowMs + DATABASE_RETRY_MS;
|
|
444
|
+
try {
|
|
445
|
+
count = await __databaseHit(storageKey, windowStart, windowStart + windowSeconds, nowSec);
|
|
446
|
+
__databaseFailing = false;
|
|
447
|
+
__databaseRetryAt = 0;
|
|
448
|
+
__logged.database = false;
|
|
449
|
+
} catch (err) {
|
|
450
|
+
count = 0;
|
|
451
|
+
__databaseFailing = true;
|
|
452
|
+
__databaseRetryAt = Date.now() + DATABASE_RETRY_MS;
|
|
453
|
+
__logOnce('database', 'error', 'the rate-limit database failed, counting in memory per instance until it answers again: ' + __errorText(err));
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if (!count) count = __memoryHit(storageKey, windowStart, windowSeconds, nowSec);
|
|
457
|
+
var allowed = count <= o.limit;
|
|
458
|
+
return { allowed: allowed, retryAfter: allowed ? 0 : Math.max(1, windowStart + windowSeconds - nowSec) };
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// ---------------------------------------------------------------------------
|
|
462
|
+
// Responses
|
|
463
|
+
// ---------------------------------------------------------------------------
|
|
464
|
+
|
|
465
|
+
function __sendJson(res, status, body, headers) {
|
|
466
|
+
if (!res || res.headersSent || res.writableEnded) return;
|
|
467
|
+
try {
|
|
468
|
+
var names = headers ? Object.keys(headers) : [];
|
|
469
|
+
for (var i = 0; i < names.length; i++) res.setHeader(names[i], headers[names[i]]);
|
|
470
|
+
if (typeof res.status === 'function' && typeof res.json === 'function') {
|
|
471
|
+
res.status(status).json(body);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
res.statusCode = status;
|
|
475
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
476
|
+
res.end(JSON.stringify(body));
|
|
477
|
+
} catch (err) {
|
|
478
|
+
console.error('[security-runtime] could not send a ' + status + ' response: ' + __errorText(err));
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Counts the request against \`scope\` for this visitor (and \`keyParts\`, e.g.
|
|
484
|
+
* the email a sign-in names). Resolves true when it may go on; otherwise
|
|
485
|
+
* answers 429 with Retry-After and \`{ error: TOO_MANY_REQUESTS }\` and
|
|
486
|
+
* resolves false — the route returns without writing anything else.
|
|
487
|
+
*/
|
|
488
|
+
async function rateLimitRequest(req, res, options) {
|
|
489
|
+
var o = options || {};
|
|
490
|
+
if (typeof o.scope !== 'string' || !o.scope) throw new TypeError('rateLimitRequest: scope must be a non-empty string');
|
|
491
|
+
var parts = Array.isArray(o.keyParts)
|
|
492
|
+
? o.keyParts.map(function (part) { return part == null ? '' : String(part); })
|
|
493
|
+
: [];
|
|
494
|
+
var key = JSON.stringify(['request', o.scope, __visitorKey(clientIp(req))].concat(parts));
|
|
495
|
+
var result = await rateLimit({ key: key, limit: o.limit, windowSeconds: o.windowSeconds });
|
|
496
|
+
if (result.allowed) return true;
|
|
497
|
+
__sendJson(res, 429, { error: TOO_MANY_REQUESTS }, { 'Retry-After': String(result.retryAfter) });
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* What \`rateLimitRequest\` with the same arguments has counted so far in the
|
|
503
|
+
* current window, WITHOUT counting this call: \`{ allowed, retryAfter }\`, where
|
|
504
|
+
* \`allowed\` is false once \`limit\` hits are in. For a limit on failures only
|
|
505
|
+
* (a sign-in): peek before the attempt, count with \`rateLimitRequest(req, null,
|
|
506
|
+
* …)\` after a failure — \`res\` null answers nothing. A table not created yet
|
|
507
|
+
* is a window with no hits; a database error reads the in-memory count.
|
|
508
|
+
*/
|
|
509
|
+
async function peekRateLimitRequest(req, options) {
|
|
510
|
+
var o = options || {};
|
|
511
|
+
if (typeof o.scope !== 'string' || !o.scope) throw new TypeError('peekRateLimitRequest: scope must be a non-empty string');
|
|
512
|
+
if (!__atLeastOne(o.limit)) throw new TypeError('peekRateLimitRequest: limit must be a number of at least 1');
|
|
513
|
+
if (!__atLeastOne(o.windowSeconds)) throw new TypeError('peekRateLimitRequest: windowSeconds must be a number of at least 1');
|
|
514
|
+
var parts = Array.isArray(o.keyParts)
|
|
515
|
+
? o.keyParts.map(function (part) { return part == null ? '' : String(part); })
|
|
516
|
+
: [];
|
|
517
|
+
var key = JSON.stringify(['request', o.scope, __visitorKey(clientIp(req))].concat(parts));
|
|
518
|
+
var windowSeconds = Math.floor(o.windowSeconds);
|
|
519
|
+
var nowMs = Date.now();
|
|
520
|
+
var nowSec = Math.floor(nowMs / 1000);
|
|
521
|
+
var windowStart = nowSec - (nowSec % windowSeconds);
|
|
522
|
+
var storageKey = windowSeconds + ':' + crypto.createHash('sha256').update(key).digest('hex');
|
|
523
|
+
var memory = __memoryWindows.get(storageKey + '@' + windowStart);
|
|
524
|
+
var count = memory ? memory.count : 0;
|
|
525
|
+
// A failing database is left to rateLimit's one probe: until it answers,
|
|
526
|
+
// the counts are the in-memory ones.
|
|
527
|
+
if (__hasDatabase() && !__databaseFailing) {
|
|
528
|
+
var client = getClient();
|
|
529
|
+
if (typeof client.on === 'function') client.on('error', function () {});
|
|
530
|
+
var deadline = Date.now() + DATABASE_BUDGET_MS;
|
|
531
|
+
var timedOut = false;
|
|
532
|
+
var cut = function () { timedOut = true; };
|
|
533
|
+
try {
|
|
534
|
+
await __withTimeout(client.connect(), Math.min(CONNECT_TIMEOUT_MS, deadline - Date.now()), cut);
|
|
535
|
+
var result = await __withTimeout(
|
|
536
|
+
client.query('SELECT "count" FROM "' + RATE_LIMITS_TABLE + '" WHERE "key" = $1 AND "window_start" = $2', [storageKey, windowStart]),
|
|
537
|
+
Math.min(QUERY_TIMEOUT_MS, deadline - Date.now()),
|
|
538
|
+
cut
|
|
539
|
+
);
|
|
540
|
+
var stored = result && result.rows && result.rows[0] ? Number(result.rows[0].count) : 0;
|
|
541
|
+
count = Math.max(count, isFinite(stored) ? stored : 0);
|
|
542
|
+
} catch (err) {
|
|
543
|
+
// 42P01: nothing was ever counted, so the table is not there yet.
|
|
544
|
+
if (!err || err.code !== '42P01') {
|
|
545
|
+
__databaseFailing = true;
|
|
546
|
+
__databaseRetryAt = Date.now() + DATABASE_RETRY_MS;
|
|
547
|
+
__logOnce('database', 'error', 'the rate-limit database failed, counting in memory per instance until it answers again: ' + __errorText(err));
|
|
548
|
+
}
|
|
549
|
+
} finally {
|
|
550
|
+
__release(client, timedOut);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
var allowed = count < o.limit;
|
|
554
|
+
return { allowed: allowed, retryAfter: allowed ? 0 : Math.max(1, windowStart + windowSeconds - nowSec) };
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Answers \`{ error: publicMessage, id }\` with \`status\` (500 unless a 4xx/5xx)
|
|
559
|
+
* and logs \`err\` under the same opaque id, server-side only: the client never
|
|
560
|
+
* sees a driver, provider or secret-name detail. Leaves a response that is
|
|
561
|
+
* already sent alone. Returns the id.
|
|
562
|
+
*/
|
|
563
|
+
function sendClientError(res, status, publicMessage, err) {
|
|
564
|
+
var id = crypto.randomBytes(8).toString('hex');
|
|
565
|
+
var code = typeof status === 'number' && status >= 400 && status <= 599 ? Math.floor(status) : 500;
|
|
566
|
+
var message = typeof publicMessage === 'string' && publicMessage ? publicMessage : 'Something went wrong.';
|
|
567
|
+
var line = '[request-error ' + id + '] ' + code + ' ' + message;
|
|
568
|
+
if (err !== undefined) {
|
|
569
|
+
console.error(line, err);
|
|
570
|
+
} else {
|
|
571
|
+
console.warn(line);
|
|
572
|
+
}
|
|
573
|
+
__sendJson(res, code, { error: message, id: id });
|
|
574
|
+
return id;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
module.exports = { clientIp, safeEqual, visitorKey: __visitorKey, rateLimit, rateLimitRequest, peekRateLimitRequest, sendClientError };
|
|
578
|
+
`;
|
|
579
|
+
exports.generateSecurityRuntimeCode = generateSecurityRuntimeCode;
|
|
580
|
+
//# sourceMappingURL=security-runtime-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-runtime-code.js","sourceRoot":"","sources":["../../../src/security-runtime/security-runtime-code.ts"],"names":[],"mappings":";;;AAAA,sDAA4D;AAE5D;;;GAGG;AACU,QAAA,yBAAyB,GAAG,kBAAkB,CAAA;AAC9C,QAAA,qBAAqB,GAAG,CAAC,OAAO,CAAC,CAAA;AACjC,QAAA,0BAA0B,GAAG,kBAAkB,CAAA;AAC/C,QAAA,iBAAiB,GAAG,sBAAsB,CAAA;AAEvD,qEAAqE;AACxD,QAAA,yBAAyB,GAAG,qCAAqC,CAAA;AAE9E;;;;;GAKG;AACI,MAAM,wBAAwB,GAAG,CAAC,cAAsB,EAAU,EAAE,CACzE,GAAG,cAAc,IAAI,6BAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,kCAA0B,EAAE,CAAA;AADzE,QAAA,wBAAwB,4BACiD;AAEtF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACI,MAAM,2BAA2B,GAAG,GAAW,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BvD,IAAA,yCAAwB,GAAE;;2BAED,yBAAiB;2BACjB,iCAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4enD,CAAA;AAzgBY,QAAA,2BAA2B,+BAygBvC"}
|