@node9/proxy 2.36.0 → 2.37.1

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/dist/cli.mjs CHANGED
@@ -7730,7 +7730,7 @@ function* stringValues(obj, depth = 0) {
7730
7730
  }
7731
7731
  for (const v of Object.values(obj)) yield* stringValues(v, depth + 1);
7732
7732
  }
7733
- var aws_default, bash_safe_default, docker_default, filesystem_default, github_default, k8s_default, mongodb_default, postgres_default, project_jail_default, redis_default, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, CHECK_TEXT, VERDICTS, CHECK_VERDICT_RANK, CHECK_GROUPS, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, MAX_BLOBS, MIN_DECODED, BASE64_RUN_RE, HEX_RUN_RE, HEX_ESCAPE_RUN_RE, syntax, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, AST_CACHE_MAX, astCache, PARSE_FAIL, MAX_READING_PAYLOADS, defaultExpansionOps, VARIABLE_READERS, FS_READ_TOOLS, GREP_SHAPE, PATTERN_VERBS, PATTERN_VERB_NAMES, GREP_FILE_OPERANDS, READER_VALUE_LETTERS, FILE_OPERAND_FLAGS, SCP_VALUE_FLAGS, CURL_SOURCE_FLAGS, CURL_VALUE_LETTERS, WGET_VALUE_LETTERS, TAR_VALUE_LETTERS, ZIP_VALUE_LETTERS, RSYNC_VALUE_LETTERS, RSYNC_SKIP, CP_VALUE_LETTERS, INSTALL_VALUE_LETTERS, COPY_VERBS, TAR_MODE_WORD, COPY_VERB_HEADS, FS_OP_PRESCREEN_RE, HOME_CACHE_ALLOWLIST, SENSITIVE_PATH_RULES, AST_FS_REGEX_RULES, SQL_DB_CLIS, SQL_DDL_RE, CHMOD_OPEN_PERM_TOKENS, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _redirStdinOps, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, INTERP_LEADING_TARGET, MAX_PAYLOAD_NESTING, payloadNesting, SCRIPT_RUNNERS, SCRIPT_RUNNER_VALUE_FLAGS, MAX_SCRIPT_OPERANDS, NET_BINARIES, VALUE_FLAGS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, isReaderWord, positionalAfter, NONE, UNKNOWN, MAX_REGEX_LENGTH, REGEX_CACHE_MAX, regexCache, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, syntax2, MAX_ALTERNATIVES, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, POSITIONAL, MAX_DEPTH, MAX_PAYLOAD_DEPTH, unique, clone, SENDING_STDIN, DOWNLOAD_SHORT_VALUE, DOWNLOAD_LONG_VALUE, DOWNLOAD_OUTPUT_FLAGS, DOWNLOAD_DIR_FLAGS, base, quoteGlob, asWord, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, SYSTEM_AUTH_FILES, SYSTEM_AUTH_DIRS, PASSWORD_HASH_FILES, STARTUP_NAMES, SYSTEM_DIRS, SYSTEM_DIRS_EXEMPT, UPLOAD_SYSTEM_DIRS, AGENT_INSTRUCTION_FILES, AGENT_INSTRUCTION_DIRS, LEGACY_SYSTEM_PATH_RE, exempt, RANK, BIP39_ENGLISH, BIP39_PUBLIC_VECTORS, indices, lengths, hash, MAX_MNEMONIC_HASHES, SECRET_VIEW_LIMITS, IBAN_LENGTH, IBAN_BBAN_SHAPE, B58, B58_INDEX, XPRV_VERSIONS, B62, CRC32_TABLE, GITHUB_TOKEN_RE, B64URL, B64URL_INDEX, CASK_TWO_ZERO_SUFFIX, CASK_FOUR_ZERO_SUFFIX, CF_ODD, CF_EVEN, SPANISH_LETTERS, HETU_CHARS, MAX, UNTRUSTED_TOOLS, SIGNALS, MENTION_QUOTE_RE, MENTION_WORD_RE, ASSIGNMENT_CONTEXT_RE, DLP_STOPWORDS, REFERENCE_VALUE_RE, IDENTIFIER_VALUE_RE, PATH_VALUE_RE, DOTTED_REFERENCE_RE, CONCATENATION_RE, EMAIL_VALUE_RE, FIXTURE_NAME_RE, DERIVATIVE_NAME_RE, QUERY_CREDENTIAL_VALUE_RE, OTP_SECRET_RE, OTP_DOC_SECRETS, ASSIGNED_SECRET_VALUE_RE, ASSIGNED_SECRET_NAME_RE, NAME_KEYWORD_RE, ARN_CONTEXT_RE, CIPHER_KEY_NAME_RE, CIPHER_NAME_PARTS, CIPHER_KEY_VALUE_RE, LARAVEL_KEY_VALUE_RE, SQL_PASSWORD_VALUE_RE, GRAFANA_KEY_VALUE_RE, BASIC_VALUE_RE, BASIC_PAIR_RE, OTP_CAPTURE_RE, DB_URL_PASSWORD_RE, DLP_PATTERNS, DLP_PATTERNS_GLOBAL, SENSITIVE_PATH_PATTERNS, SENSITIVE_PATH_REGEXES, MAX_DEPTH2, MAX_STRING_BYTES, MAX_JSON_PARSE_BYTES, DLP_SCAN_LIMITS, BATCH_SEPARATOR, ENCODED_RUN_RE, syntax3, NPM_INSTALL_VERBS, NPM_EXEC_VERBS, PNPM_INSTALL_VERBS, YARN_INSTALL_VERBS, BUN_INSTALL_VERBS, DLX_VERBS, NON_REGISTRY_RE, NPM_NAME_RE, EXACT_SEMVER_RE, NPM_VALUE_FLAGS, PNPM_VALUE_FLAGS, YARN_VALUE_FLAGS, BUN_VALUE_FLAGS, PIP_VALUE_FLAGS, UV_VALUE_FLAGS, POETRY_VALUE_FLAGS, PIPENV_VALUE_FLAGS, PIPX_VALUE_FLAGS, PY_SPEC_RE, PY_EXACT_RE, EXACT_VERSION_RE, GEM_NAME_RE, GEM_VALUE_FLAGS, BUNDLE_VALUE_FLAGS, CRATE_NAME_RE, CARGO_ADD_VALUE_FLAGS, CARGO_INSTALL_VALUE_FLAGS, GO_VALUE_FLAGS, GO_PATH_RE, NUGET_NAME_RE, DOTNET_ADD_VALUE_FLAGS, DOTNET_TOOL_VALUE_FLAGS, NUGET_VALUE_FLAGS, MAVEN_COORD_RE, COMPOSER_NAME_RE, COMPOSER_VALUE_FLAGS, EDITOR_HEADS, EXTENSION_ID_RE, MANAGER_HEADS, SHELLS, MAX_NESTING, SHELL_VALUE_FLAGS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, DEFAULT_EGRESS_ALLOWLIST, PRIVATE_HOST_SUFFIXES, SOURCE_COMMANDS, SINK_COMMANDS, OBFUSCATORS, SENSITIVE_PATTERNS, FLAGS_WITH_VALUES, DESTINATION_ARGS, MCP_DESTINATION_KEYS, ARGUMENT_SCAN_LIMITS, RUN_CHAR, runChar, VERDICT_RANK, SQL_DML_KEYWORDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, DESTRUCTIVE_VERB_RE, PII_EMAIL_RE, PII_SSN_RE, PII_PHONE_RE, PII_CC16_RE, PII_CC15_RE, PII_CC14_RE, PII_CC13_RE, PII_CC19_RE, CARD_PATTERNS, PII_ROUTING_RE, ROUTING_LABEL_RE, ROUTING_LABEL_WINDOW, NATIONAL_ID_SHAPES, NATIONAL_ID_LABEL_RE, NATIONAL_ID_LABEL_WINDOW, NATIONAL_ID_GUARD_RE, PII_IBAN_RE, REALTIME_PII_PATTERNS, MAX_PII_SCAN_BYTES, IBAN_DESTINATION_KEYS, WHOLE_IBAN_RE, JSON_ESCAPE_RE, JSON_ESCAPES, MASKED_KINDS, ENTRY_RE, IBAN_TEXT_RE, EMAIL_TEXT_RE, ACCOUNT_KEY_RE, ACCOUNT_VALUE_RE, MAX_MASK_DEPTH, syntax4, EMPTY, CURL_SEND_FLAGS, WGET_SEND_FLAGS, IWR_SEND_FLAGS, WRITE_METHODS, GH_READ, GH_WRITE, GH_HOSTNAME_FLAGS, GH_REPO_VALUE_FLAGS, GH_API_VALUE_FLAGS, GIT_FETCH, PUBLISH, SHELLS2, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, CONTROL_CHAR_RE, LOOP_MAX_RECORDS, FINDING_TO_SIGNAL, SCAN_SIGNAL_WEIGHTS, LOOP_THRESHOLD_FOR_WASTE, MAX_BLAST_PATH, DESTRUCTIVE_OP_RE, SENSITIVE_PATH_RE, FILE_TOOLS, CANARY_MIN_LENGTH, MAX_TEXT, MAX_DEPTH4, MAX_JSON_PARSE, URL_DEPTH, B64_DEPTH, MIN_SEGMENT, SEPARATORS, stripSeparators, looksText, CANARY_DECODERS, VIEWS, LONG_OUTPUT_THRESHOLD_BYTES, CANONICAL_EXTRACTOR_VERSION, DEDUPE_PREVIEW_LEN, ENGINE_VERSION;
7733
+ var aws_default, bash_safe_default, docker_default, filesystem_default, finance_default, github_default, identity_default, k8s_default, mongodb_default, postgres_default, project_jail_default, publishing_default, redis_default, BUILTIN_SHIELDS, ACTION_SHIELD_NAMES, SSRF_MAX_HOST, METADATA_ADDRESSES, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, CHECK_TEXT, VERDICTS, CHECK_VERDICT_RANK, CHECK_GROUPS, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, MAX_BLOBS, MIN_DECODED, BASE64_RUN_RE, HEX_RUN_RE, HEX_ESCAPE_RUN_RE, syntax, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, AST_CACHE_MAX, astCache, PARSE_FAIL, MAX_READING_PAYLOADS, defaultExpansionOps, VARIABLE_READERS, FS_READ_TOOLS, GREP_SHAPE, PATTERN_VERBS, PATTERN_VERB_NAMES, GREP_FILE_OPERANDS, READER_VALUE_LETTERS, FILE_OPERAND_FLAGS, SCP_VALUE_FLAGS, CURL_SOURCE_FLAGS, CURL_VALUE_LETTERS, WGET_VALUE_LETTERS, TAR_VALUE_LETTERS, ZIP_VALUE_LETTERS, RSYNC_VALUE_LETTERS, RSYNC_SKIP, CP_VALUE_LETTERS, INSTALL_VALUE_LETTERS, COPY_VERBS, TAR_MODE_WORD, COPY_VERB_HEADS, FS_OP_PRESCREEN_RE, HOME_CACHE_ALLOWLIST, SENSITIVE_PATH_RULES, AST_FS_REGEX_RULES, SQL_DB_CLIS, SQL_DDL_RE, CHMOD_OPEN_PERM_TOKENS, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _redirStdinOps, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, INTERP_LEADING_TARGET, MAX_PAYLOAD_NESTING, payloadNesting, SCRIPT_RUNNERS, SCRIPT_RUNNER_VALUE_FLAGS, MAX_SCRIPT_OPERANDS, NET_BINARIES, VALUE_FLAGS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, isReaderWord, positionalAfter, NONE, UNKNOWN, MAX_REGEX_LENGTH, REGEX_CACHE_MAX, regexCache, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, syntax2, MAX_ALTERNATIVES, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, POSITIONAL, MAX_DEPTH, MAX_PAYLOAD_DEPTH, unique, clone, SENDING_STDIN, DOWNLOAD_SHORT_VALUE, DOWNLOAD_LONG_VALUE, DOWNLOAD_OUTPUT_FLAGS, DOWNLOAD_DIR_FLAGS, base, quoteGlob, asWord, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, SYSTEM_AUTH_FILES, SYSTEM_AUTH_DIRS, PASSWORD_HASH_FILES, STARTUP_NAMES, SYSTEM_DIRS, SYSTEM_DIRS_EXEMPT, UPLOAD_SYSTEM_DIRS, AGENT_INSTRUCTION_FILES, AGENT_INSTRUCTION_DIRS, LEGACY_SYSTEM_PATH_RE, exempt, RANK, BIP39_ENGLISH, BIP39_PUBLIC_VECTORS, indices, lengths, hash, MAX_MNEMONIC_HASHES, SECRET_VIEW_LIMITS, IBAN_LENGTH, IBAN_BBAN_SHAPE, B58, B58_INDEX, XPRV_VERSIONS, B62, CRC32_TABLE, GITHUB_TOKEN_RE, B64URL, B64URL_INDEX, CASK_TWO_ZERO_SUFFIX, CASK_FOUR_ZERO_SUFFIX, CF_ODD, CF_EVEN, SPANISH_LETTERS, HETU_CHARS, MAX, UNTRUSTED_TOOLS, SIGNALS, MENTION_QUOTE_RE, MENTION_WORD_RE, ASSIGNMENT_CONTEXT_RE, DLP_STOPWORDS, REFERENCE_VALUE_RE, IDENTIFIER_VALUE_RE, PATH_VALUE_RE, DOTTED_REFERENCE_RE, CONCATENATION_RE, EMAIL_VALUE_RE, FIXTURE_NAME_RE, DERIVATIVE_NAME_RE, QUERY_CREDENTIAL_VALUE_RE, OTP_SECRET_RE, OTP_DOC_SECRETS, ASSIGNED_SECRET_VALUE_RE, ASSIGNED_SECRET_NAME_RE, NAME_KEYWORD_RE, ARN_CONTEXT_RE, CIPHER_KEY_NAME_RE, CIPHER_NAME_PARTS, CIPHER_KEY_VALUE_RE, LARAVEL_KEY_VALUE_RE, SQL_PASSWORD_VALUE_RE, GRAFANA_KEY_VALUE_RE, BASIC_VALUE_RE, BASIC_PAIR_RE, OTP_CAPTURE_RE, DB_URL_PASSWORD_RE, DLP_PATTERNS, DLP_PATTERNS_GLOBAL, SENSITIVE_PATH_PATTERNS, SENSITIVE_PATH_REGEXES, MAX_DEPTH2, MAX_STRING_BYTES, MAX_JSON_PARSE_BYTES, DLP_SCAN_LIMITS, BATCH_SEPARATOR, ENCODED_RUN_RE, syntax3, NPM_INSTALL_VERBS, NPM_EXEC_VERBS, PNPM_INSTALL_VERBS, YARN_INSTALL_VERBS, BUN_INSTALL_VERBS, DLX_VERBS, NON_REGISTRY_RE, NPM_NAME_RE, EXACT_SEMVER_RE, NPM_VALUE_FLAGS, PNPM_VALUE_FLAGS, YARN_VALUE_FLAGS, BUN_VALUE_FLAGS, PIP_VALUE_FLAGS, UV_VALUE_FLAGS, POETRY_VALUE_FLAGS, PIPENV_VALUE_FLAGS, PIPX_VALUE_FLAGS, PY_SPEC_RE, PY_EXACT_RE, EXACT_VERSION_RE, GEM_NAME_RE, GEM_VALUE_FLAGS, BUNDLE_VALUE_FLAGS, CRATE_NAME_RE, CARGO_ADD_VALUE_FLAGS, CARGO_INSTALL_VALUE_FLAGS, GO_VALUE_FLAGS, GO_PATH_RE, NUGET_NAME_RE, DOTNET_ADD_VALUE_FLAGS, DOTNET_TOOL_VALUE_FLAGS, NUGET_VALUE_FLAGS, MAVEN_COORD_RE, COMPOSER_NAME_RE, COMPOSER_VALUE_FLAGS, EDITOR_HEADS, EXTENSION_ID_RE, MANAGER_HEADS, SHELLS, MAX_NESTING, SHELL_VALUE_FLAGS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, DEFAULT_EGRESS_ALLOWLIST, PRIVATE_HOST_SUFFIXES, SOURCE_COMMANDS, SINK_COMMANDS, OBFUSCATORS, SENSITIVE_PATTERNS, FLAGS_WITH_VALUES, DESTINATION_ARGS, MCP_DESTINATION_KEYS, ARGUMENT_SCAN_LIMITS, RUN_CHAR, runChar, VERDICT_RANK, SQL_DML_KEYWORDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, DESTRUCTIVE_VERB_RE, PII_EMAIL_RE, PII_SSN_RE, PII_PHONE_RE, PII_CC16_RE, PII_CC15_RE, PII_CC14_RE, PII_CC13_RE, PII_CC19_RE, CARD_PATTERNS, PII_ROUTING_RE, ROUTING_LABEL_RE, ROUTING_LABEL_WINDOW, NATIONAL_ID_SHAPES, NATIONAL_ID_LABEL_RE, NATIONAL_ID_LABEL_WINDOW, NATIONAL_ID_GUARD_RE, PII_IBAN_RE, REALTIME_PII_PATTERNS, MAX_PII_SCAN_BYTES, IBAN_DESTINATION_KEYS, WHOLE_IBAN_RE, JSON_ESCAPE_RE, JSON_ESCAPES, MASKED_KINDS, ENTRY_RE, IBAN_TEXT_RE, EMAIL_TEXT_RE, ACCOUNT_KEY_RE, ACCOUNT_VALUE_RE, MAX_MASK_DEPTH, syntax4, EMPTY, CURL_SEND_FLAGS, WGET_SEND_FLAGS, IWR_SEND_FLAGS, WRITE_METHODS, GH_READ, GH_WRITE, GH_HOSTNAME_FLAGS, GH_REPO_VALUE_FLAGS, GH_API_VALUE_FLAGS, GIT_FETCH, PUBLISH, SHELLS2, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, CONTROL_CHAR_RE, LOOP_MAX_RECORDS, FINDING_TO_SIGNAL, SCAN_SIGNAL_WEIGHTS, LOOP_THRESHOLD_FOR_WASTE, MAX_BLAST_PATH, DESTRUCTIVE_OP_RE, SENSITIVE_PATH_RE, FILE_TOOLS, CANARY_MIN_LENGTH, MAX_TEXT, MAX_DEPTH4, MAX_JSON_PARSE, URL_DEPTH, B64_DEPTH, MIN_SEGMENT, SEPARATORS, stripSeparators, looksText, CANARY_DECODERS, VIEWS, LONG_OUTPUT_THRESHOLD_BYTES, CANONICAL_EXTRACTOR_VERSION, DEDUPE_PREVIEW_LEN, ENGINE_VERSION;
7734
7734
  var init_dist = __esm({
7735
7735
  "packages/policy-engine/dist/index.mjs"() {
7736
7736
  "use strict";
@@ -8035,6 +8035,77 @@ var init_dist = __esm({
8035
8035
  ],
8036
8036
  dangerousWords: ["wipefs"]
8037
8037
  };
8038
+ finance_default = {
8039
+ name: "finance",
8040
+ description: "Asks before money moves through a payment or banking app (refunds, payouts, transfers, charges, invoices), whatever the request said. Reads are never asked about.",
8041
+ aliases: ["payments", "money"],
8042
+ smartRules: [
8043
+ {
8044
+ name: "shield:finance:review-refund",
8045
+ tool: "{,mcp__*__}{create_refund,refund_payment,refund_charge,refund_order,issue_refund}",
8046
+ conditions: [],
8047
+ verdict: "review",
8048
+ reason: "A refund returns money to a customer. node9 asks before money moves, whatever the request said (Finance shield)."
8049
+ },
8050
+ {
8051
+ name: "shield:finance:review-payout",
8052
+ tool: "{,mcp__*__}{create_payout,send_payout,payout,create_payouts_batch}",
8053
+ conditions: [],
8054
+ verdict: "review",
8055
+ reason: "A payout moves the balance to a bank account. node9 asks before money moves (Finance shield)."
8056
+ },
8057
+ {
8058
+ name: "shield:finance:review-transfer",
8059
+ tool: "{,mcp__*__}{transfer_create,transfer_authorization_create,create_transfer,transfer_money,transfer_funds,send_money,wire_transfer,create_wire,schedule_transaction,update_scheduled_transaction,create_transaction}",
8060
+ conditions: [],
8061
+ verdict: "review",
8062
+ reason: "A transfer moves money between accounts. node9 asks before money moves (Finance shield)."
8063
+ },
8064
+ {
8065
+ name: "shield:finance:review-charge",
8066
+ tool: "{,mcp__*__}{create_payment_intent,confirm_payment_intent,capture_payment_intent,create_charge,create_payment,capture_payment,capture_order,create_order,authorize_order,create_checkout_session}",
8067
+ conditions: [],
8068
+ verdict: "review",
8069
+ reason: "This charges a card or captures a payment. node9 asks before money moves (Finance shield)."
8070
+ },
8071
+ {
8072
+ name: "shield:finance:review-payment-link",
8073
+ tool: "{,mcp__*__}{create_payment_link,create_invoice,finalize_invoice,send_invoice,pay_invoice,create_invoice_item}",
8074
+ conditions: [],
8075
+ verdict: "review",
8076
+ reason: "This bills someone or creates a link that charges a card. node9 asks before money moves (Finance shield)."
8077
+ },
8078
+ {
8079
+ name: "shield:finance:review-subscription",
8080
+ tool: "{,mcp__*__}{create_subscription,cancel_subscription,update_subscription,pause_subscription,resume_subscription}",
8081
+ conditions: [],
8082
+ verdict: "review",
8083
+ reason: "A subscription starts or stops recurring charges. node9 asks before money moves (Finance shield)."
8084
+ },
8085
+ {
8086
+ name: "shield:finance:review-dispute",
8087
+ tool: "{,mcp__*__}{update_dispute,accept_dispute,close_dispute}",
8088
+ conditions: [],
8089
+ verdict: "review",
8090
+ reason: "This answers or concedes a chargeback. node9 asks before money moves (Finance shield)."
8091
+ },
8092
+ {
8093
+ name: "shield:finance:review-card",
8094
+ tool: "{,mcp__*__}{issue_card,create_virtual_card,create_issuing_card,update_card_limit}",
8095
+ conditions: [],
8096
+ verdict: "review",
8097
+ reason: "This issues a card or changes its limit. node9 asks before money moves (Finance shield)."
8098
+ },
8099
+ {
8100
+ name: "shield:finance:review-withdraw",
8101
+ tool: "{,mcp__*__}{withdraw,withdraw_funds,create_withdrawal,request_withdrawal}",
8102
+ conditions: [],
8103
+ verdict: "review",
8104
+ reason: "A withdrawal moves money out. node9 asks before money moves (Finance shield)."
8105
+ }
8106
+ ],
8107
+ dangerousWords: []
8108
+ };
8038
8109
  github_default = {
8039
8110
  name: "github",
8040
8111
  description: "Protects GitHub repositories from destructive AI operations",
@@ -8061,6 +8132,56 @@ var init_dist = __esm({
8061
8132
  ],
8062
8133
  dangerousWords: []
8063
8134
  };
8135
+ identity_default = {
8136
+ name: "identity",
8137
+ description: "Asks before a password, a key, a token, a role or a user changes in an identity or admin app, whatever the request said. Reads are never asked about.",
8138
+ aliases: ["access", "iam"],
8139
+ smartRules: [
8140
+ {
8141
+ name: "shield:identity:review-password",
8142
+ tool: "{,mcp__*__}{change_password,update_password,reset_password,set_password,expire_password,force_password_reset}",
8143
+ conditions: [],
8144
+ verdict: "review",
8145
+ reason: "This changes or resets a password. node9 asks before credentials change, whatever the request said (Identity shield)."
8146
+ },
8147
+ {
8148
+ name: "shield:identity:review-key",
8149
+ tool: "{,mcp__*__}{rotate_key,rotate_api_key,create_api_key,create_token,create_access_token,create_personal_access_token,regenerate_secret,rotate_secret,create_service_account_key,create_credential}",
8150
+ conditions: [],
8151
+ verdict: "review",
8152
+ reason: "This creates or rotates a key, token or secret. node9 asks before credentials change (Identity shield)."
8153
+ },
8154
+ {
8155
+ name: "shield:identity:review-access",
8156
+ tool: "{,mcp__*__}{grant_access,grant_permission,grant_role,revoke_access,revoke_permission,revoke_role,revoke_token,set_permission,set_permissions,set_role,assign_role,update_role,add_permission,remove_permission,attach_policy,detach_policy}",
8157
+ conditions: [],
8158
+ verdict: "review",
8159
+ reason: "This grants or revokes access. node9 asks before access changes (Identity shield)."
8160
+ },
8161
+ {
8162
+ name: "shield:identity:review-membership",
8163
+ tool: "{,mcp__*__}{add_member,remove_member,add_user_to_group,remove_user_from_group,add_collaborator,remove_collaborator,invite_user,invite_member,invite_user_to_slack,invite_users,add_org_member,remove_org_member,add_team_member,remove_team_member}",
8164
+ conditions: [],
8165
+ verdict: "review",
8166
+ reason: "This changes who belongs where. node9 asks before membership changes (Identity shield)."
8167
+ },
8168
+ {
8169
+ name: "shield:identity:review-user",
8170
+ tool: "{,mcp__*__}{create_user,delete_user,deactivate_user,suspend_user,activate_user,unlock_user,make_admin,promote_user,demote_user,update_user_role}",
8171
+ conditions: [],
8172
+ verdict: "review",
8173
+ reason: "This creates, removes or promotes an account. node9 asks before accounts change (Identity shield)."
8174
+ },
8175
+ {
8176
+ name: "shield:identity:review-mfa",
8177
+ tool: "{,mcp__*__}{reset_mfa,reset_factors,disable_mfa,enroll_factor,deactivate_factor}",
8178
+ conditions: [],
8179
+ verdict: "review",
8180
+ reason: "This changes a second factor. node9 asks before credentials change (Identity shield)."
8181
+ }
8182
+ ],
8183
+ dangerousWords: []
8184
+ };
8064
8185
  k8s_default = {
8065
8186
  name: "k8s",
8066
8187
  description: "Protects Kubernetes clusters from destructive AI operations",
@@ -8393,6 +8514,175 @@ var init_dist = __esm({
8393
8514
  ],
8394
8515
  dangerousWords: []
8395
8516
  };
8517
+ publishing_default = {
8518
+ name: "publishing",
8519
+ description: "Asks before something goes public or ships outside the organisation (a release, a package, a deploy, a post), whatever the request said. The same switch covers the shell commands that publish.",
8520
+ aliases: ["release", "deploy"],
8521
+ smartRules: [
8522
+ {
8523
+ name: "shield:publishing:review-release",
8524
+ tool: "{,mcp__*__}{create_release,publish_release,create_tag_release,update_release,promote_release}",
8525
+ conditions: [],
8526
+ verdict: "review",
8527
+ reason: "A release ships code to everyone who installs it. node9 asks before publishing, whatever the request said (Publishing shield)."
8528
+ },
8529
+ {
8530
+ name: "shield:publishing:review-package",
8531
+ tool: "{,mcp__*__}{publish_package,npm_publish,pypi_upload,publish_version,publish_extension}",
8532
+ conditions: [],
8533
+ verdict: "review",
8534
+ reason: "This publishes a package. node9 asks before publishing (Publishing shield)."
8535
+ },
8536
+ {
8537
+ name: "shield:publishing:review-deploy",
8538
+ tool: "{,mcp__*__}{deploy,create_deployment,deploy_site,promote_deployment,trigger_deploy,deploy_to_production,rollout}",
8539
+ conditions: [],
8540
+ verdict: "review",
8541
+ reason: "This deploys to an environment other people use. node9 asks before publishing (Publishing shield)."
8542
+ },
8543
+ {
8544
+ name: "shield:publishing:review-post",
8545
+ tool: "{,mcp__*__}{post_tweet,create_tweet,post_webpage,publish_post,create_post,publish_page,send_announcement,post_announcement,create_linkedin_post,schedule_post}",
8546
+ conditions: [],
8547
+ verdict: "review",
8548
+ reason: "This posts outside the organisation. node9 asks before publishing (Publishing shield)."
8549
+ },
8550
+ {
8551
+ name: "shield:publishing:review-visibility",
8552
+ tool: "{,mcp__*__}{set_visibility,make_public,set_public,publish_repository,change_visibility,update_visibility}",
8553
+ conditions: [],
8554
+ verdict: "review",
8555
+ reason: "This makes something public. node9 asks before publishing (Publishing shield)."
8556
+ },
8557
+ {
8558
+ name: "shield:publishing:review-npm-publish",
8559
+ tool: "bash",
8560
+ conditions: [
8561
+ {
8562
+ field: "command",
8563
+ op: "matches",
8564
+ value: "(?:^|[^\\w-])(?:npm|pnpm)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8565
+ flags: "i"
8566
+ }
8567
+ ],
8568
+ verdict: "review",
8569
+ reason: "npm publish ships the package to everyone who installs it. node9 asks before publishing (Publishing shield)."
8570
+ },
8571
+ {
8572
+ name: "shield:publishing:review-yarn-publish",
8573
+ tool: "bash",
8574
+ conditions: [
8575
+ {
8576
+ field: "command",
8577
+ op: "matches",
8578
+ value: "(?:^|[^\\w-])(?:yarn)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8579
+ flags: "i"
8580
+ }
8581
+ ],
8582
+ verdict: "review",
8583
+ reason: "yarn publish ships the package to everyone who installs it. node9 asks before publishing (Publishing shield)."
8584
+ },
8585
+ {
8586
+ name: "shield:publishing:review-twine-upload",
8587
+ tool: "bash",
8588
+ conditions: [
8589
+ {
8590
+ field: "command",
8591
+ op: "matches",
8592
+ value: "(?:^|[^\\w-])(?:twine)(?![\\w-])[^;&|]{0,200}?\\s(?:upload)(?![\\w-])",
8593
+ flags: "i"
8594
+ }
8595
+ ],
8596
+ verdict: "review",
8597
+ reason: "twine upload publishes to PyPI. node9 asks before publishing (Publishing shield)."
8598
+ },
8599
+ {
8600
+ name: "shield:publishing:review-python-publish",
8601
+ tool: "bash",
8602
+ conditions: [
8603
+ {
8604
+ field: "command",
8605
+ op: "matches",
8606
+ value: "(?:^|[^\\w-])(?:poetry|uv|hatch|flit)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8607
+ flags: "i"
8608
+ }
8609
+ ],
8610
+ verdict: "review",
8611
+ reason: "This publishes the Python package to PyPI. node9 asks before publishing (Publishing shield)."
8612
+ },
8613
+ {
8614
+ name: "shield:publishing:review-release-tool-publish",
8615
+ tool: "bash",
8616
+ conditions: [
8617
+ {
8618
+ field: "command",
8619
+ op: "matches",
8620
+ value: "(?:^|[^\\w-])(?:lerna|changeset|vsce|ovsx)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8621
+ flags: "i"
8622
+ }
8623
+ ],
8624
+ verdict: "review",
8625
+ reason: "This publishes packages or an editor extension through a release tool. node9 asks before publishing (Publishing shield)."
8626
+ },
8627
+ {
8628
+ name: "shield:publishing:review-cargo-publish",
8629
+ tool: "bash",
8630
+ conditions: [
8631
+ {
8632
+ field: "command",
8633
+ op: "matches",
8634
+ value: "(?:^|[^\\w-])(?:cargo)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8635
+ flags: "i"
8636
+ }
8637
+ ],
8638
+ verdict: "review",
8639
+ reason: "cargo publish ships the crate. node9 asks before publishing (Publishing shield)."
8640
+ },
8641
+ {
8642
+ name: "shield:publishing:review-gem-push",
8643
+ tool: "bash",
8644
+ conditions: [
8645
+ {
8646
+ field: "command",
8647
+ op: "matches",
8648
+ value: "(?:^|[^\\w-])(?:gem)(?![\\w-])[^;&|]{0,200}?\\s(?:push)(?![\\w-])",
8649
+ flags: "i"
8650
+ }
8651
+ ],
8652
+ verdict: "review",
8653
+ reason: "gem push publishes to RubyGems. node9 asks before publishing (Publishing shield)."
8654
+ },
8655
+ {
8656
+ name: "shield:publishing:review-docker-push",
8657
+ tool: "bash",
8658
+ conditions: [
8659
+ {
8660
+ field: "command",
8661
+ op: "matches",
8662
+ value: "(?:^|[^\\w-])(?:docker|podman)(?![\\w-])[^;&|]{0,200}?\\s(?:push|--push)(?![\\w-])",
8663
+ flags: "i"
8664
+ }
8665
+ ],
8666
+ verdict: "review",
8667
+ reason: "docker push publishes the image to a registry. node9 asks before publishing (Publishing shield)."
8668
+ },
8669
+ {
8670
+ name: "shield:publishing:review-gh-release",
8671
+ tool: "bash",
8672
+ conditions: [
8673
+ {
8674
+ field: "command",
8675
+ op: "matches",
8676
+ value: "(?:^|[^\\w-])(?:gh)(?![\\w-])[^;&|]{0,200}?\\srelease\\s+(?:create|upload|edit)(?![\\w-])",
8677
+ flags: "i"
8678
+ }
8679
+ ],
8680
+ verdict: "review",
8681
+ reason: "gh release ships a release on GitHub. node9 asks before publishing (Publishing shield)."
8682
+ }
8683
+ ],
8684
+ dangerousWords: []
8685
+ };
8396
8686
  redis_default = {
8397
8687
  name: "redis",
8398
8688
  description: "Protects Redis instances from destructive AI operations",
@@ -8477,13 +8767,25 @@ var init_dist = __esm({
8477
8767
  [bash_safe_default.name]: bash_safe_default,
8478
8768
  [docker_default.name]: docker_default,
8479
8769
  [filesystem_default.name]: filesystem_default,
8770
+ // Dangerous actions as category shields (node9Firewall#385): an MCP app's
8771
+ // money, credential and publishing tools, asked about whatever the request
8772
+ // said. One glob per rule covers the bare name the gateway sends and the
8773
+ // mcp__<server>__ name the agent hook sends.
8774
+ [finance_default.name]: finance_default,
8480
8775
  [github_default.name]: github_default,
8776
+ [identity_default.name]: identity_default,
8481
8777
  [k8s_default.name]: k8s_default,
8482
8778
  [mongodb_default.name]: mongodb_default,
8483
8779
  [postgres_default.name]: postgres_default,
8484
8780
  [project_jail_default.name]: project_jail_default,
8781
+ [publishing_default.name]: publishing_default,
8485
8782
  [redis_default.name]: redis_default
8486
8783
  };
8784
+ ACTION_SHIELD_NAMES = /* @__PURE__ */ new Set([
8785
+ "finance",
8786
+ "identity",
8787
+ "publishing"
8788
+ ]);
8487
8789
  assertBuiltinShieldRegexesAreSafe();
8488
8790
  SSRF_MAX_HOST = 253;
8489
8791
  METADATA_ADDRESSES = /* @__PURE__ */ new Set([
@@ -30957,7 +31259,7 @@ function renderPanelScorecard(input, now = /* @__PURE__ */ new Date()) {
30957
31259
  const hitShieldSet = new Set(
30958
31260
  shieldImpacts.filter((i) => i.totalCatches > 0).map((i) => i.shieldName)
30959
31261
  );
30960
- const zeroHitAll = Object.keys(BUILTIN_SHIELDS).filter((name) => !hitShieldSet.has(name)).sort();
31262
+ const zeroHitAll = Object.keys(BUILTIN_SHIELDS).filter((name) => !hitShieldSet.has(name) && !ACTION_SHIELD_NAMES.has(name)).sort();
30961
31263
  const zeroHitBuiltins = zeroHitAll.filter((name) => !enabledSet.has(name));
30962
31264
  const zeroHitEnabled = zeroHitAll.filter((name) => enabledSet.has(name));
30963
31265
  if (zeroHitEnabled.length > 0) {
@@ -31449,7 +31751,7 @@ function registerScanCommand(program2) {
31449
31751
  const hitShieldIds = new Set(
31450
31752
  summary.sections.filter((s) => s.sourceType === "shield" && s.shieldKey).map((s) => s.shieldKey)
31451
31753
  );
31452
- const noHitShields = Object.keys(SHIELDS).filter((n) => !hitShieldIds.has(n)).sort();
31754
+ const noHitShields = Object.keys(SHIELDS).filter((n) => !hitShieldIds.has(n) && !ACTION_SHIELD_NAMES.has(n)).sort();
31453
31755
  const quietEnabled = noHitShields.filter((n) => enabledShieldSet.has(n));
31454
31756
  const emptyShields = noHitShields.filter((n) => !enabledShieldSet.has(n));
31455
31757
  if (quietEnabled.length > 0) {
@@ -39299,6 +39601,7 @@ var require_symbols = __commonJS({
39299
39601
  kDestroy: /* @__PURE__ */ Symbol("destroy"),
39300
39602
  kDispatch: /* @__PURE__ */ Symbol("dispatch"),
39301
39603
  kUrl: /* @__PURE__ */ Symbol("url"),
39604
+ kRedirectCacheControl: /* @__PURE__ */ Symbol("redirect cache control"),
39302
39605
  kWriting: /* @__PURE__ */ Symbol("writing"),
39303
39606
  kResuming: /* @__PURE__ */ Symbol("resuming"),
39304
39607
  kQueue: /* @__PURE__ */ Symbol("queue"),
@@ -41593,10 +41896,27 @@ var require_request = __commonJS({
41593
41896
  return false;
41594
41897
  }
41595
41898
  }
41596
- onUpgrade(statusCode, headers, socket) {
41899
+ /**
41900
+ * @param {number} statusCode
41901
+ * @param {Buffer[]|string[]} headers
41902
+ * @param {import('node:stream').Duplex} socket
41903
+ * @param {string} [statusText]
41904
+ */
41905
+ onUpgrade(statusCode, headers, socket, statusText = "") {
41906
+ this.onFinally();
41597
41907
  assert(!this.aborted);
41598
41908
  assert(!this.completed);
41599
- return this[kHandler].onUpgrade(statusCode, headers, socket);
41909
+ if (channels.headers.hasSubscribers) {
41910
+ channels.headers.publish({ request: this, response: { statusCode, headers, statusText } });
41911
+ }
41912
+ const result = this[kHandler].onUpgrade(statusCode, headers, socket);
41913
+ if (!this.aborted) {
41914
+ this.completed = true;
41915
+ if (channels.trailers.hasSubscribers) {
41916
+ channels.trailers.publish({ request: this, trailers: [] });
41917
+ }
41918
+ }
41919
+ return result;
41600
41920
  }
41601
41921
  onComplete(trailers) {
41602
41922
  this.onFinally();
@@ -41946,6 +42266,7 @@ var require_unwrap_handler = __commonJS({
41946
42266
  var require_dispatcher_base = __commonJS({
41947
42267
  "node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports, module) {
41948
42268
  "use strict";
42269
+ var buffer = __require("buffer");
41949
42270
  var Dispatcher = require_dispatcher();
41950
42271
  var UnwrapHandler = require_unwrap_handler();
41951
42272
  var {
@@ -41957,6 +42278,7 @@ var require_dispatcher_base = __commonJS({
41957
42278
  var kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed");
41958
42279
  var kOnClosed = /* @__PURE__ */ Symbol("onClosed");
41959
42280
  var kWebSocketOptions = /* @__PURE__ */ Symbol("webSocketOptions");
42281
+ var kEventSourceOptions = /* @__PURE__ */ Symbol("eventSourceOptions");
41960
42282
  var DispatcherBase = class extends Dispatcher {
41961
42283
  /** @type {boolean} */
41962
42284
  [kDestroyed] = false;
@@ -41972,6 +42294,7 @@ var require_dispatcher_base = __commonJS({
41972
42294
  constructor(opts) {
41973
42295
  super();
41974
42296
  this[kWebSocketOptions] = opts?.webSocket ?? {};
42297
+ this[kEventSourceOptions] = opts?.eventSource ?? {};
41975
42298
  }
41976
42299
  /**
41977
42300
  * @returns {import('../../types/dispatcher').WebSocketOptions}
@@ -41983,6 +42306,14 @@ var require_dispatcher_base = __commonJS({
41983
42306
  // 128 MB default
41984
42307
  };
41985
42308
  }
42309
+ /**
42310
+ * @returns {import('../../types/client').Client.EventSourceOptions}
42311
+ */
42312
+ get eventSourceOptions() {
42313
+ return {
42314
+ maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength
42315
+ };
42316
+ }
41986
42317
  /** @returns {boolean} */
41987
42318
  get destroyed() {
41988
42319
  return this[kDestroyed];
@@ -42128,15 +42459,19 @@ var require_connect = __commonJS({
42128
42459
  if (this._sessionCache.has(sessionKey)) {
42129
42460
  this._sessionCache.delete(sessionKey);
42130
42461
  } else if (this._sessionCache.size >= this._maxCachedSessions) {
42462
+ let evicted = false;
42131
42463
  for (const [key, ref] of this._sessionCache) {
42132
42464
  if (ref.deref() === void 0) {
42133
42465
  this._sessionCache.delete(key);
42134
- return;
42466
+ evicted = true;
42467
+ break;
42135
42468
  }
42136
42469
  }
42137
- const oldest = this._sessionCache.keys().next();
42138
- if (!oldest.done) {
42139
- this._sessionCache.delete(oldest.value);
42470
+ if (!evicted) {
42471
+ const oldest = this._sessionCache.keys().next();
42472
+ if (!oldest.done) {
42473
+ this._sessionCache.delete(oldest.value);
42474
+ }
42140
42475
  }
42141
42476
  }
42142
42477
  this._sessionCache.set(sessionKey, new WeakRef(session));
@@ -43195,6 +43530,10 @@ var require_infra = __commonJS({
43195
43530
  return input.slice(start, position.position);
43196
43531
  }
43197
43532
  var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g;
43533
+ var nonASCIIRegex = /[^\x00-\x7F]/;
43534
+ function asciiLowercase(str2) {
43535
+ return nonASCIIRegex.test(str2) ? str2.replace(/[A-Z]+/g, (upper) => upper.toLowerCase()) : str2.toLowerCase();
43536
+ }
43198
43537
  function forgivingBase64(data) {
43199
43538
  data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, "");
43200
43539
  let dataLength = data.length;
@@ -43269,6 +43608,7 @@ var require_infra = __commonJS({
43269
43608
  return result;
43270
43609
  }
43271
43610
  module.exports = {
43611
+ asciiLowercase,
43272
43612
  collectASequenceOfCodePoints,
43273
43613
  collectASequenceOfCodePointsFast,
43274
43614
  forgivingBase64,
@@ -45893,7 +46233,13 @@ var require_client_h1 = __commonJS({
45893
46233
  function lazyllhttp() {
45894
46234
  const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0;
45895
46235
  let mod;
45896
- let useWasmSIMD = process.arch !== "ppc64";
46236
+ let useWasmSIMD = true;
46237
+ if (process.arch === "ppc64") {
46238
+ const [major, minor] = process.versions.node.split(".").map((n) => parseInt(n, 10));
46239
+ if (major < 24 || major === 24 && minor < 12) {
46240
+ useWasmSIMD = false;
46241
+ }
46242
+ }
45897
46243
  if (process.env.UNDICI_NO_WASM_SIMD === "1") {
45898
46244
  useWasmSIMD = false;
45899
46245
  } else if (process.env.UNDICI_NO_WASM_SIMD === "0") {
@@ -46247,7 +46593,7 @@ var require_client_h1 = __commonJS({
46247
46593
  * @param {Buffer} head
46248
46594
  */
46249
46595
  onUpgrade(head) {
46250
- const { upgrade, client, socket, headers, statusCode } = this;
46596
+ const { upgrade, client, socket, headers, statusCode, statusText } = this;
46251
46597
  assert(upgrade);
46252
46598
  assert(client[kSocket] === socket);
46253
46599
  assert(!socket.destroyed);
@@ -46272,8 +46618,9 @@ var require_client_h1 = __commonJS({
46272
46618
  client[kQueue][client[kRunningIdx]++] = null;
46273
46619
  client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade"));
46274
46620
  try {
46275
- request2.onUpgrade(statusCode, headers, socket);
46621
+ request2.onUpgrade(statusCode, headers, socket, statusText);
46276
46622
  } catch (err2) {
46623
+ util.errorRequest(client, request2, err2);
46277
46624
  util.destroy(socket, err2);
46278
46625
  }
46279
46626
  client[kResume]();
@@ -46541,7 +46888,6 @@ var require_client_h1 = __commonJS({
46541
46888
  };
46542
46889
  }
46543
46890
  function onHttpSocketError(err2) {
46544
- assert(err2.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
46545
46891
  const parser = this[kParser];
46546
46892
  if (err2.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) {
46547
46893
  const parserErr = parser.finish();
@@ -47321,7 +47667,6 @@ var require_client_h2 = __commonJS({
47321
47667
  }
47322
47668
  }
47323
47669
  function onHttp2SessionError(err2) {
47324
- assert(err2.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
47325
47670
  this[kSocket][kError] = err2;
47326
47671
  this[kClient][kOnError](err2);
47327
47672
  }
@@ -47411,7 +47756,6 @@ var require_client_h2 = __commonJS({
47411
47756
  client[kResume]();
47412
47757
  }
47413
47758
  function onHttp2SocketError(err2) {
47414
- assert(err2.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
47415
47759
  this[kError] = err2;
47416
47760
  this[kClient][kOnError](err2);
47417
47761
  }
@@ -47505,10 +47849,15 @@ var require_client_h2 = __commonJS({
47505
47849
  }
47506
47850
  stream = session.request(headers, { endStream: false, signal });
47507
47851
  stream[kHTTP2Stream] = true;
47852
+ ++session[kOpenStreams];
47508
47853
  stream.once("response", (headers2, _flags) => {
47509
47854
  const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
47510
- request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47511
- ++session[kOpenStreams];
47855
+ try {
47856
+ request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47857
+ } catch (err2) {
47858
+ abort(err2);
47859
+ return;
47860
+ }
47512
47861
  completeRequest(client, request2);
47513
47862
  });
47514
47863
  stream.on("error", () => {
@@ -47525,10 +47874,15 @@ var require_client_h2 = __commonJS({
47525
47874
  }
47526
47875
  stream = session.request(headers, { endStream: false, signal });
47527
47876
  stream[kHTTP2Stream] = true;
47877
+ ++session[kOpenStreams];
47528
47878
  stream.on("response", (headers2) => {
47529
47879
  const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
47530
- request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47531
- ++session[kOpenStreams];
47880
+ try {
47881
+ request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47882
+ } catch (err2) {
47883
+ abort(err2);
47884
+ return;
47885
+ }
47532
47886
  completeRequest(client, request2);
47533
47887
  });
47534
47888
  stream.on("error", abort);
@@ -47962,7 +48316,8 @@ var require_client = __commonJS({
47962
48316
  initialWindowSize,
47963
48317
  connectionWindowSize,
47964
48318
  pingInterval,
47965
- webSocket
48319
+ webSocket,
48320
+ eventSource
47966
48321
  } = {}) {
47967
48322
  if (keepAlive !== void 0) {
47968
48323
  throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
@@ -48040,7 +48395,7 @@ var require_client = __commonJS({
48040
48395
  if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) {
48041
48396
  throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0");
48042
48397
  }
48043
- super({ webSocket });
48398
+ super({ webSocket, eventSource });
48044
48399
  if (typeof connect2 !== "function") {
48045
48400
  connect2 = buildConnector({
48046
48401
  ...tls,
@@ -49021,7 +49376,7 @@ var require_agent = __commonJS({
49021
49376
  return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts);
49022
49377
  }
49023
49378
  var Agent = class extends DispatcherBase {
49024
- constructor({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {
49379
+ constructor({ factory = defaultFactory, maxOrigins = Infinity, connect, tls, ...options } = {}) {
49025
49380
  if (typeof factory !== "function") {
49026
49381
  throw new InvalidArgumentError("factory must be a function.");
49027
49382
  }
@@ -49035,7 +49390,10 @@ var require_agent = __commonJS({
49035
49390
  if (connect && typeof connect !== "function") {
49036
49391
  connect = { ...connect };
49037
49392
  }
49038
- this[kOptions] = { ...util.deepClone(options), maxOrigins, connect };
49393
+ if (tls && typeof tls !== "function") {
49394
+ tls = { ...tls };
49395
+ }
49396
+ this[kOptions] = { ...util.deepClone(options), maxOrigins, connect, tls };
49039
49397
  this[kFactory] = factory;
49040
49398
  this[kClients] = /* @__PURE__ */ new Map();
49041
49399
  this[kOrigins] = /* @__PURE__ */ new Set();
@@ -50244,6 +50602,55 @@ var require_retry_handler = __commonJS({
50244
50602
  });
50245
50603
  }
50246
50604
  }
50605
+ var RetryController = class {
50606
+ #paused = false;
50607
+ #target = null;
50608
+ set target(target) {
50609
+ this.#target = target;
50610
+ if (this.#paused) {
50611
+ target?.pause();
50612
+ }
50613
+ }
50614
+ get target() {
50615
+ return this.#target;
50616
+ }
50617
+ pause() {
50618
+ this.#paused = true;
50619
+ this.#target?.pause();
50620
+ }
50621
+ resume() {
50622
+ this.#paused = false;
50623
+ this.#target?.resume();
50624
+ }
50625
+ abort(reason) {
50626
+ this.#target?.abort(reason);
50627
+ }
50628
+ get paused() {
50629
+ return this.#paused || (this.#target?.paused ?? false);
50630
+ }
50631
+ get aborted() {
50632
+ return this.#target?.aborted ?? false;
50633
+ }
50634
+ get reason() {
50635
+ return this.#target?.reason ?? null;
50636
+ }
50637
+ get rawHeaders() {
50638
+ return this.#target?.rawHeaders ?? null;
50639
+ }
50640
+ set rawHeaders(value) {
50641
+ if (this.#target) {
50642
+ this.#target.rawHeaders = value;
50643
+ }
50644
+ }
50645
+ get rawTrailers() {
50646
+ return this.#target?.rawTrailers ?? null;
50647
+ }
50648
+ set rawTrailers(value) {
50649
+ if (this.#target) {
50650
+ this.#target.rawTrailers = value;
50651
+ }
50652
+ }
50653
+ };
50247
50654
  var RetryHandler = class _RetryHandler {
50248
50655
  constructor(opts, { dispatch, handler }) {
50249
50656
  const { retryOptions, ...dispatchOpts } = opts;
@@ -50298,16 +50705,17 @@ var require_retry_handler = __commonJS({
50298
50705
  this.start = 0;
50299
50706
  this.end = null;
50300
50707
  this.etag = null;
50708
+ this.controllerProxy = new RetryController();
50301
50709
  }
50302
50710
  onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err2) {
50303
50711
  if (this.retryOpts.throwOnError) {
50304
50712
  if (this.retryOpts.statusCodes.includes(statusCode) === false) {
50305
50713
  if (this.headersSent) {
50306
- this.handler.onResponseError?.(controller, err2);
50714
+ this.handler.onResponseError?.(this.controllerProxy, err2);
50307
50715
  } else {
50308
50716
  this.headersSent = true;
50309
50717
  this.checkpointResponseEnd(headers);
50310
- this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
50718
+ this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
50311
50719
  }
50312
50720
  } else {
50313
50721
  this.error = err2;
@@ -50317,17 +50725,17 @@ var require_retry_handler = __commonJS({
50317
50725
  if (isDisturbed(this.opts.body)) {
50318
50726
  this.headersSent = true;
50319
50727
  this.checkpointResponseEnd(headers);
50320
- this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
50728
+ this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
50321
50729
  return;
50322
50730
  }
50323
50731
  function shouldRetry(passedErr) {
50324
50732
  if (passedErr) {
50325
50733
  if (this.headersSent) {
50326
- this.handler.onResponseError?.(controller, passedErr);
50734
+ this.handler.onResponseError?.(this.controllerProxy, passedErr);
50327
50735
  } else {
50328
50736
  this.headersSent = true;
50329
50737
  this.checkpointResponseEnd(headers);
50330
- this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
50738
+ this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
50331
50739
  }
50332
50740
  controller.resume();
50333
50741
  return;
@@ -50357,12 +50765,13 @@ var require_retry_handler = __commonJS({
50357
50765
  }
50358
50766
  }
50359
50767
  onRequestStart(controller, context) {
50768
+ this.controllerProxy.target = controller;
50360
50769
  if (!this.headersSent) {
50361
- this.handler.onRequestStart?.(controller, context);
50770
+ this.handler.onRequestStart?.(this.controllerProxy, context);
50362
50771
  }
50363
50772
  }
50364
- onRequestUpgrade(controller, statusCode, headers, socket) {
50365
- this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket);
50773
+ onRequestUpgrade(_controller, statusCode, headers, socket) {
50774
+ this.handler.onRequestUpgrade?.(this.controllerProxy, statusCode, headers, socket);
50366
50775
  }
50367
50776
  static [kRetryHandlerDefaultRetry](err2, { state, opts }, cb) {
50368
50777
  const { statusCode, code: code2, headers } = err2;
@@ -50450,7 +50859,7 @@ var require_retry_handler = __commonJS({
50450
50859
  if (range == null) {
50451
50860
  this.headersSent = true;
50452
50861
  this.handler.onResponseStart?.(
50453
- controller,
50862
+ this.controllerProxy,
50454
50863
  statusCode,
50455
50864
  headers,
50456
50865
  statusMessage
@@ -50483,7 +50892,7 @@ var require_retry_handler = __commonJS({
50483
50892
  }
50484
50893
  this.headersSent = true;
50485
50894
  this.handler.onResponseStart?.(
50486
- controller,
50895
+ this.controllerProxy,
50487
50896
  statusCode,
50488
50897
  headers,
50489
50898
  statusMessage
@@ -50495,24 +50904,24 @@ var require_retry_handler = __commonJS({
50495
50904
  });
50496
50905
  }
50497
50906
  }
50498
- onResponseData(controller, chunk2) {
50907
+ onResponseData(_controller, chunk2) {
50499
50908
  if (this.error) {
50500
50909
  return;
50501
50910
  }
50502
50911
  this.start += chunk2.length;
50503
- this.handler.onResponseData?.(controller, chunk2);
50912
+ this.handler.onResponseData?.(this.controllerProxy, chunk2);
50504
50913
  }
50505
- onResponseEnd(controller, trailers) {
50914
+ onResponseEnd(_controller, trailers) {
50506
50915
  if (this.error && this.retryOpts.throwOnError) {
50507
50916
  throw this.error;
50508
50917
  }
50509
50918
  if (!this.error) {
50510
50919
  this.retryCount = 0;
50511
- return this.handler.onResponseEnd?.(controller, trailers);
50920
+ return this.handler.onResponseEnd?.(this.controllerProxy, trailers);
50512
50921
  }
50513
- this.retry(controller);
50922
+ this.retry();
50514
50923
  }
50515
- retry(controller) {
50924
+ retry() {
50516
50925
  if (this.start !== 0) {
50517
50926
  const headers = { range: `bytes=${this.start}-${this.end ?? ""}` };
50518
50927
  if (this.etag != null) {
@@ -50530,20 +50939,20 @@ var require_retry_handler = __commonJS({
50530
50939
  this.retryCountCheckpoint = this.retryCount;
50531
50940
  this.dispatch(this.opts, this);
50532
50941
  } catch (err2) {
50533
- this.handler.onResponseError?.(controller, err2);
50942
+ this.handler.onResponseError?.(this.controllerProxy, err2);
50534
50943
  }
50535
50944
  }
50536
50945
  onResponseError(controller, err2) {
50537
50946
  if (controller?.aborted || isDisturbed(this.opts.body) || this.headersSent && !this.resume) {
50538
- this.handler.onResponseError?.(controller, err2);
50947
+ this.handler.onResponseError?.(this.controllerProxy, err2);
50539
50948
  return;
50540
50949
  }
50541
50950
  function shouldRetry(returnedErr) {
50542
50951
  if (!returnedErr) {
50543
- this.retry(controller);
50952
+ this.retry();
50544
50953
  return;
50545
50954
  }
50546
- this.handler?.onResponseError?.(controller, returnedErr);
50955
+ this.handler?.onResponseError?.(this.controllerProxy, returnedErr);
50547
50956
  }
50548
50957
  if (this.retryCount - this.retryCountCheckpoint > 0) {
50549
50958
  this.retryCount = this.retryCountCheckpoint + (this.retryCount - this.retryCountCheckpoint);
@@ -53848,7 +54257,7 @@ var require_redirect_handler = __commonJS({
53848
54257
  "node_modules/undici/lib/handler/redirect-handler.js"(exports, module) {
53849
54258
  "use strict";
53850
54259
  var util = require_util();
53851
- var { kBodyUsed } = require_symbols();
54260
+ var { kBodyUsed, kRedirectCacheControl } = require_symbols();
53852
54261
  var assert = __require("assert");
53853
54262
  var { InvalidArgumentError } = require_errors();
53854
54263
  var EE = __require("events");
@@ -53886,6 +54295,10 @@ var require_redirect_handler = __commonJS({
53886
54295
  this.maxRedirections = maxRedirections;
53887
54296
  this.handler = handler;
53888
54297
  this.history = [];
54298
+ Object.defineProperty(this.history, kRedirectCacheControl, {
54299
+ value: [],
54300
+ enumerable: false
54301
+ });
53889
54302
  if (util.isStream(this.opts.body)) {
53890
54303
  if (util.bodyLength(this.opts.body) === 0) {
53891
54304
  this.opts.body.on("data", function() {
@@ -53936,6 +54349,7 @@ var require_redirect_handler = __commonJS({
53936
54349
  this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
53937
54350
  return;
53938
54351
  }
54352
+ this.history[kRedirectCacheControl].push(headers["cache-control"]);
53939
54353
  const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)));
53940
54354
  const path99 = search ? `${pathname}${search}` : pathname;
53941
54355
  const redirectUrlString = `${origin}${path99}`;
@@ -55637,6 +56051,7 @@ var require_cache_handler = __commonJS({
55637
56051
  "node_modules/undici/lib/handler/cache-handler.js"(exports, module) {
55638
56052
  "use strict";
55639
56053
  var util = require_util();
56054
+ var { kRedirectCacheControl } = require_symbols();
55640
56055
  var {
55641
56056
  parseCacheControlHeader,
55642
56057
  hasInvalidCacheControlDirective,
@@ -55648,6 +56063,13 @@ var require_cache_handler = __commonJS({
55648
56063
  var { parseHttpDate } = require_date();
55649
56064
  function noop() {
55650
56065
  }
56066
+ function sameOrigin(a, b) {
56067
+ try {
56068
+ return new URL(String(a)).origin === new URL(String(b)).origin;
56069
+ } catch {
56070
+ return String(a) === String(b);
56071
+ }
56072
+ }
55651
56073
  var HEURISTICALLY_CACHEABLE_STATUS_CODES = [
55652
56074
  200,
55653
56075
  203,
@@ -55763,6 +56185,13 @@ var require_cache_handler = __commonJS({
55763
56185
  * @type {import('node:stream').Writable | undefined}
55764
56186
  */
55765
56187
  #writeStream;
56188
+ /**
56189
+ * The URLs visited while following redirects, shared by reference from the
56190
+ * redirect handler through the request context. Carries the suppressed hops'
56191
+ * cache-control under {@link kRedirectCacheControl}.
56192
+ * @type {URL[] | undefined}
56193
+ */
56194
+ #history;
55766
56195
  /**
55767
56196
  * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts
55768
56197
  * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey
@@ -55778,6 +56207,7 @@ var require_cache_handler = __commonJS({
55778
56207
  onRequestStart(controller, context) {
55779
56208
  this.#writeStream?.destroy();
55780
56209
  this.#writeStream = void 0;
56210
+ this.#history = context?.history;
55781
56211
  this.#handler.onRequestStart?.(controller, context);
55782
56212
  }
55783
56213
  onRequestUpgrade(controller, statusCode, headers, socket) {
@@ -55801,6 +56231,21 @@ var require_cache_handler = __commonJS({
55801
56231
  invalidateUnsafeRequest(this.#store, this.#cacheKey, resHeaders);
55802
56232
  return downstreamOnHeaders();
55803
56233
  }
56234
+ if (this.#history && this.#history.length > 0) {
56235
+ const finalUrl = this.#history[this.#history.length - 1];
56236
+ if (!sameOrigin(finalUrl.origin, this.#cacheKey.origin)) {
56237
+ return downstreamOnHeaders();
56238
+ }
56239
+ }
56240
+ const redirectCacheControl = this.#history?.[kRedirectCacheControl];
56241
+ if (redirectCacheControl) {
56242
+ for (const hopCacheControl of redirectCacheControl) {
56243
+ const hopDirectives = hopCacheControl ? parseCacheControlHeader(hopCacheControl) : {};
56244
+ if (hopDirectives["no-store"] === true || this.#cacheType === "shared" && hopDirectives.private === true) {
56245
+ return downstreamOnHeaders();
56246
+ }
56247
+ }
56248
+ }
55804
56249
  const cacheControlHeader = resHeaders["cache-control"];
55805
56250
  const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
55806
56251
  if (revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives)) {
@@ -56877,6 +57322,61 @@ var require_decompress = __commonJS({
56877
57322
  var { InvalidArgumentError, ResponseExceededMaxSizeError } = require_errors();
56878
57323
  var DecoratorHandler = require_decorator_handler();
56879
57324
  var { runtimeFeatures } = require_runtime_features();
57325
+ var DecompressController = class {
57326
+ #onPause;
57327
+ #onResume;
57328
+ #onAbort;
57329
+ #paused = false;
57330
+ constructor(onPause, onResume, onAbort) {
57331
+ this.#onPause = onPause;
57332
+ this.#onResume = onResume;
57333
+ this.#onAbort = onAbort;
57334
+ this.target = null;
57335
+ }
57336
+ pause() {
57337
+ if (this.#paused) {
57338
+ return;
57339
+ }
57340
+ this.#paused = true;
57341
+ this.#onPause();
57342
+ }
57343
+ resume() {
57344
+ if (!this.#paused) {
57345
+ return;
57346
+ }
57347
+ this.#paused = false;
57348
+ this.#onResume();
57349
+ }
57350
+ abort(reason) {
57351
+ this.target?.abort(reason);
57352
+ this.#onAbort(reason);
57353
+ }
57354
+ get paused() {
57355
+ return this.#paused;
57356
+ }
57357
+ get aborted() {
57358
+ return this.target?.aborted ?? false;
57359
+ }
57360
+ get reason() {
57361
+ return this.target?.reason ?? null;
57362
+ }
57363
+ get rawHeaders() {
57364
+ return this.target?.rawHeaders ?? null;
57365
+ }
57366
+ set rawHeaders(value) {
57367
+ if (this.target) {
57368
+ this.target.rawHeaders = value;
57369
+ }
57370
+ }
57371
+ get rawTrailers() {
57372
+ return this.target?.rawTrailers ?? null;
57373
+ }
57374
+ set rawTrailers(value) {
57375
+ if (this.target) {
57376
+ this.target.rawTrailers = value;
57377
+ }
57378
+ }
57379
+ };
56880
57380
  var supportedEncodings = {
56881
57381
  gzip: createGunzip,
56882
57382
  "x-gzip": createGunzip,
@@ -56890,7 +57390,7 @@ var require_decompress = __commonJS({
56890
57390
  /** @type {const} */
56891
57391
  [204, 304]
56892
57392
  );
56893
- var defaultMaxSize = 64 * 1024 * 1024;
57393
+ var defaultMaxSize = 0;
56894
57394
  function createMaxSizeLimiter(maxSize) {
56895
57395
  let size = 0;
56896
57396
  return new TransformStream2({
@@ -56928,14 +57428,124 @@ var require_decompress = __commonJS({
56928
57428
  #terminated = false;
56929
57429
  /** @type {boolean} */
56930
57430
  #inputEnded = false;
57431
+ /** @type {boolean} */
57432
+ #inputBackpressured = false;
57433
+ /** @type {boolean} */
57434
+ #upstreamPaused = false;
57435
+ /** @type {boolean} */
57436
+ #draining = false;
57437
+ /** @type {boolean} */
57438
+ #drainRequested = false;
57439
+ /** @type {boolean} */
57440
+ #completionPending = false;
57441
+ /** @type {DecompressorStream | undefined} */
57442
+ #finalDecompressor;
57443
+ /** @type {DecompressController} */
57444
+ #controller;
56931
57445
  constructor(handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true, maxSize = defaultMaxSize } = {}) {
56932
- if (!Number.isSafeInteger(maxSize) || maxSize < 1) {
56933
- throw new InvalidArgumentError("maxSize must be a positive integer");
57446
+ if (!Number.isSafeInteger(maxSize) || maxSize < 0) {
57447
+ throw new InvalidArgumentError("maxSize must be a non-negative integer");
56934
57448
  }
56935
57449
  super(handler);
56936
57450
  this.#skipStatusCodes = skipStatusCodes;
56937
57451
  this.#skipErrorResponses = skipErrorResponses;
56938
57452
  this.#maxSize = maxSize;
57453
+ this.#controller = new DecompressController(
57454
+ () => this.#onDownstreamPause(),
57455
+ () => this.#onDownstreamResume(),
57456
+ (reason) => {
57457
+ if (this.#inputEnded && !this.#terminated) {
57458
+ this.onResponseError(this.#controller, reason);
57459
+ }
57460
+ }
57461
+ );
57462
+ }
57463
+ #onDownstreamPause() {
57464
+ this.#pauseUpstream();
57465
+ }
57466
+ #onDownstreamResume() {
57467
+ const drainWasDeferred = this.#draining;
57468
+ this.#drainOutput();
57469
+ if (!drainWasDeferred) {
57470
+ this.#resumeUpstreamIfNeeded();
57471
+ this.#finishIfReady();
57472
+ }
57473
+ }
57474
+ #pauseUpstream() {
57475
+ if (!this.#upstreamPaused && !this.#terminated) {
57476
+ this.#upstreamPaused = true;
57477
+ this.#controller.target?.pause();
57478
+ }
57479
+ }
57480
+ #resumeUpstreamIfNeeded() {
57481
+ if (this.#upstreamPaused && !this.#controller.paused && !this.#inputBackpressured) {
57482
+ this.#upstreamPaused = false;
57483
+ if (!this.#inputEnded) {
57484
+ this.#controller.target?.resume();
57485
+ }
57486
+ }
57487
+ }
57488
+ #drainOutput() {
57489
+ if (this.#terminated || this.#controller.paused || !this.#finalDecompressor) {
57490
+ return;
57491
+ }
57492
+ if (this.#draining) {
57493
+ this.#drainRequested = true;
57494
+ return;
57495
+ }
57496
+ this.#draining = true;
57497
+ try {
57498
+ do {
57499
+ this.#drainRequested = false;
57500
+ let chunk2;
57501
+ while (!this.#terminated && !this.#controller.paused && (chunk2 = this.#finalDecompressor.read()) !== null) {
57502
+ if (this.#maxSize > 0) {
57503
+ const decompressedSize = this.#decompressedSize + chunk2.length;
57504
+ if (decompressedSize > this.#maxSize) {
57505
+ this.#fail(new ResponseExceededMaxSizeError(
57506
+ `Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
57507
+ ));
57508
+ return;
57509
+ }
57510
+ this.#decompressedSize = decompressedSize;
57511
+ }
57512
+ try {
57513
+ const result = super.onResponseData(this.#controller, chunk2);
57514
+ if (result === false && !this.#controller.paused) {
57515
+ this.#controller.pause();
57516
+ }
57517
+ } catch (err2) {
57518
+ this.#fail(err2);
57519
+ return;
57520
+ }
57521
+ }
57522
+ } while (this.#drainRequested && !this.#terminated && !this.#controller.paused);
57523
+ } finally {
57524
+ this.#draining = false;
57525
+ }
57526
+ this.#resumeUpstreamIfNeeded();
57527
+ this.#finishIfReady();
57528
+ }
57529
+ #finishIfReady() {
57530
+ if (this.#terminated || !this.#completionPending || this.#controller.paused || this.#draining) {
57531
+ return;
57532
+ }
57533
+ this.#cleanupDecompressors();
57534
+ try {
57535
+ super.onResponseEnd(this.#controller, this.#trailers);
57536
+ } catch (err2) {
57537
+ this.#fail(err2);
57538
+ return;
57539
+ }
57540
+ this.#terminated = true;
57541
+ }
57542
+ #onDecompressionEnd() {
57543
+ if (this.#terminated) {
57544
+ return;
57545
+ }
57546
+ this.#completionPending = true;
57547
+ this.#drainOutput();
57548
+ this.#finishIfReady();
56939
57549
  }
56940
57550
  /**
56941
57551
  * Determines if decompression should be skipped based on encoding and status code
@@ -56978,7 +57588,7 @@ var require_decompress = __commonJS({
56978
57588
  const streams = [];
56979
57589
  for (let i = 0; i < decompressors.length; i++) {
56980
57590
  streams.push(decompressors[i]);
56981
- if (i < decompressors.length - 1) {
57591
+ if (i < decompressors.length - 1 && this.#maxSize > 0) {
56982
57592
  streams.push(createMaxSizeLimiter(this.#maxSize));
56983
57593
  }
56984
57594
  }
@@ -56986,87 +57596,67 @@ var require_decompress = __commonJS({
56986
57596
  }
56987
57597
  /**
56988
57598
  * Stops decompression and reports an error.
56989
- * @param {Controller} controller - The controller to coordinate with
56990
57599
  * @param {Error} error - The decompression error
56991
57600
  * @returns {void}
56992
57601
  */
56993
- #fail(controller, error) {
57602
+ #fail(error) {
56994
57603
  if (this.#terminated) {
56995
57604
  return;
56996
57605
  }
56997
57606
  if (this.#inputEnded) {
56998
- this.onResponseError(controller, error);
57607
+ this.onResponseError(this.#controller, error);
56999
57608
  } else {
57000
- controller.abort(error);
57609
+ this.#controller.abort(error);
57001
57610
  }
57002
57611
  }
57003
57612
  /**
57004
- * Sets up event handlers for a decompressor stream using readable events
57613
+ * Sets up event handlers for the final decompressor stream.
57005
57614
  * @param {DecompressorStream} decompressor - The decompressor stream
57006
- * @param {Controller} controller - The controller to coordinate with
57007
57615
  * @returns {void}
57008
57616
  */
57009
- #setupDecompressorEvents(decompressor, controller) {
57010
- decompressor.on("readable", () => {
57011
- if (this.#terminated) {
57012
- return;
57013
- }
57014
- let chunk2;
57015
- while ((chunk2 = decompressor.read()) !== null) {
57016
- const decompressedSize = this.#decompressedSize + chunk2.length;
57017
- if (decompressedSize > this.#maxSize) {
57018
- this.#fail(controller, new ResponseExceededMaxSizeError(
57019
- `Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
57020
- ));
57021
- return;
57022
- }
57023
- this.#decompressedSize = decompressedSize;
57024
- const result = super.onResponseData(controller, chunk2);
57025
- if (result === false) {
57026
- break;
57027
- }
57028
- }
57029
- });
57030
- decompressor.on("error", (error) => {
57031
- this.#fail(controller, error);
57032
- });
57617
+ #setupDecompressorEvents(decompressor) {
57618
+ this.#finalDecompressor = decompressor;
57619
+ decompressor.on("readable", () => this.#drainOutput());
57620
+ decompressor.on("error", (error) => this.#fail(error));
57033
57621
  }
57034
57622
  /**
57035
57623
  * Sets up event handling for a single decompressor
57036
- * @param {Controller} controller - The controller to handle events
57037
57624
  * @returns {void}
57038
57625
  */
57039
- #setupSingleDecompressor(controller) {
57626
+ #setupSingleDecompressor() {
57040
57627
  const decompressor = this.#decompressors[0];
57041
- this.#setupDecompressorEvents(decompressor, controller);
57042
- decompressor.on("end", () => {
57043
- if (this.#terminated) {
57044
- return;
57045
- }
57046
- this.#terminated = true;
57047
- this.#cleanupDecompressors();
57048
- super.onResponseEnd(controller, this.#trailers);
57049
- });
57628
+ this.#setupDecompressorEvents(decompressor);
57629
+ decompressor.on("end", () => this.#onDecompressionEnd());
57050
57630
  }
57051
57631
  /**
57052
57632
  * Sets up event handling for multiple chained decompressors using pipeline
57053
- * @param {Controller} controller - The controller to handle events
57054
57633
  * @returns {void}
57055
57634
  */
57056
- #setupMultipleDecompressors(controller) {
57635
+ #setupMultipleDecompressors() {
57057
57636
  const lastDecompressor = this.#decompressors[this.#decompressors.length - 1];
57058
- this.#setupDecompressorEvents(lastDecompressor, controller);
57637
+ this.#setupDecompressorEvents(lastDecompressor);
57059
57638
  pipeline2(this.#decompressors, (err2) => {
57060
57639
  if (this.#terminated) {
57061
57640
  return;
57062
57641
  }
57063
57642
  if (err2) {
57064
- this.#fail(controller, err2);
57643
+ this.#fail(err2);
57065
57644
  return;
57066
57645
  }
57067
- this.#terminated = true;
57068
- this.#cleanupDecompressors();
57069
- super.onResponseEnd(controller, this.#trailers);
57646
+ this.#onDecompressionEnd();
57647
+ });
57648
+ }
57649
+ #setupInputBackpressure() {
57650
+ const decompressor = this.#decompressors[0];
57651
+ decompressor.on("drain", () => {
57652
+ if (this.#terminated) {
57653
+ return;
57654
+ }
57655
+ this.#inputBackpressured = false;
57656
+ if (!this.#controller.paused) {
57657
+ this.#drainOutput();
57658
+ this.#resumeUpstreamIfNeeded();
57659
+ }
57070
57660
  });
57071
57661
  }
57072
57662
  /**
@@ -57075,6 +57665,14 @@ var require_decompress = __commonJS({
57075
57665
  */
57076
57666
  #cleanupDecompressors() {
57077
57667
  this.#decompressors.length = 0;
57668
+ this.#finalDecompressor = void 0;
57669
+ }
57670
+ onRequestStart(controller, context) {
57671
+ this.#controller.target = controller;
57672
+ return super.onRequestStart(this.#controller, context);
57673
+ }
57674
+ onRequestUpgrade(controller, statusCode, headers, socket) {
57675
+ return super.onRequestUpgrade(this.#controller, statusCode, headers, socket);
57078
57676
  }
57079
57677
  /**
57080
57678
  * @param {Controller} controller
@@ -57086,17 +57684,17 @@ var require_decompress = __commonJS({
57086
57684
  onResponseStart(controller, statusCode, headers, statusMessage) {
57087
57685
  const contentEncoding = headers["content-encoding"];
57088
57686
  if (this.#shouldSkipDecompression(contentEncoding, statusCode)) {
57089
- return super.onResponseStart(controller, statusCode, headers, statusMessage);
57687
+ return super.onResponseStart(this.#controller, statusCode, headers, statusMessage);
57090
57688
  }
57091
57689
  const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase());
57092
57690
  if (decompressors.length === 0) {
57093
57691
  this.#cleanupDecompressors();
57094
- return super.onResponseStart(controller, statusCode, headers, statusMessage);
57692
+ return super.onResponseStart(this.#controller, statusCode, headers, statusMessage);
57095
57693
  }
57096
57694
  this.#decompressors = decompressors;
57097
57695
  const { "content-encoding": _, "content-length": __, ...newHeaders } = headers;
57098
- if (controller?.rawHeaders) {
57099
- const rawHeaders = controller.rawHeaders;
57696
+ if (this.#controller.rawHeaders) {
57697
+ const rawHeaders = this.#controller.rawHeaders;
57100
57698
  if (Array.isArray(rawHeaders)) {
57101
57699
  const filteredHeaders = [];
57102
57700
  for (let i = 0; i < rawHeaders.length; i += 2) {
@@ -57118,12 +57716,13 @@ var require_decompress = __commonJS({
57118
57716
  }
57119
57717
  }
57120
57718
  }
57719
+ this.#setupInputBackpressure();
57121
57720
  if (this.#decompressors.length === 1) {
57122
- this.#setupSingleDecompressor(controller);
57721
+ this.#setupSingleDecompressor();
57123
57722
  } else {
57124
- this.#setupMultipleDecompressors(controller);
57723
+ this.#setupMultipleDecompressors();
57125
57724
  }
57126
- return super.onResponseStart(controller, statusCode, newHeaders, statusMessage);
57725
+ return super.onResponseStart(this.#controller, statusCode, newHeaders, statusMessage);
57127
57726
  }
57128
57727
  /**
57129
57728
  * @param {Controller} controller
@@ -57132,10 +57731,13 @@ var require_decompress = __commonJS({
57132
57731
  */
57133
57732
  onResponseData(controller, chunk2) {
57134
57733
  if (this.#decompressors.length > 0) {
57135
- this.#decompressors[0].write(chunk2);
57734
+ if (!this.#decompressors[0].write(chunk2)) {
57735
+ this.#inputBackpressured = true;
57736
+ this.#pauseUpstream();
57737
+ }
57136
57738
  return;
57137
57739
  }
57138
- super.onResponseData(controller, chunk2);
57740
+ return super.onResponseData(this.#controller, chunk2);
57139
57741
  }
57140
57742
  /**
57141
57743
  * @param {Controller} controller
@@ -57149,7 +57751,7 @@ var require_decompress = __commonJS({
57149
57751
  this.#decompressors[0].end();
57150
57752
  return;
57151
57753
  }
57152
- super.onResponseEnd(controller, trailers);
57754
+ return super.onResponseEnd(this.#controller, trailers);
57153
57755
  }
57154
57756
  /**
57155
57757
  * @param {Controller} controller
@@ -57165,7 +57767,7 @@ var require_decompress = __commonJS({
57165
57767
  decompressor.destroy();
57166
57768
  }
57167
57769
  this.#cleanupDecompressors();
57168
- super.onResponseError(controller, err2);
57770
+ super.onResponseError(this.#controller, err2);
57169
57771
  }
57170
57772
  };
57171
57773
  function createDecompressInterceptor(options = {}) {
@@ -57198,6 +57800,18 @@ var require_deduplication_handler = __commonJS({
57198
57800
  * @type {DispatchHandler}
57199
57801
  */
57200
57802
  #primaryHandler;
57803
+ /**
57804
+ * Whether the primary request has started (onRequestStart received). Until
57805
+ * then the request context is unknown and cannot be given to waiting handlers.
57806
+ * @type {boolean}
57807
+ */
57808
+ #requestStarted = false;
57809
+ /**
57810
+ * The primary request context, replayed to waiting handlers so they observe
57811
+ * the same redirect history as the primary.
57812
+ * @type {any}
57813
+ */
57814
+ #context = null;
57201
57815
  /**
57202
57816
  * @type {WaitingHandler[]}
57203
57817
  */
@@ -57266,18 +57880,22 @@ var require_deduplication_handler = __commonJS({
57266
57880
  const waitingHandler = this.#createWaitingHandler(handler);
57267
57881
  const waitingController = waitingHandler.controller;
57268
57882
  try {
57269
- handler.onRequestStart?.(waitingController, null);
57270
- if (waitingController.aborted) {
57271
- waitingHandler.done = true;
57272
- return true;
57273
- }
57274
- if (this.#responseStarted) {
57275
- handler.onResponseStart?.(
57276
- waitingController,
57277
- this.#statusCode,
57278
- this.#headers,
57279
- this.#statusMessage
57280
- );
57883
+ if (this.#requestStarted) {
57884
+ handler.onRequestStart?.(waitingController, this.#context);
57885
+ if (waitingController.aborted) {
57886
+ waitingHandler.done = true;
57887
+ return true;
57888
+ }
57889
+ if (this.#responseStarted) {
57890
+ handler.onResponseStart?.(
57891
+ waitingController,
57892
+ this.#statusCode,
57893
+ this.#headers,
57894
+ this.#statusMessage
57895
+ );
57896
+ }
57897
+ } else {
57898
+ waitingHandler.pendingStart = true;
57281
57899
  }
57282
57900
  } catch {
57283
57901
  waitingHandler.done = true;
@@ -57294,6 +57912,21 @@ var require_deduplication_handler = __commonJS({
57294
57912
  */
57295
57913
  onRequestStart(controller, context) {
57296
57914
  this.#controller = controller;
57915
+ if (!this.#requestStarted) {
57916
+ this.#requestStarted = true;
57917
+ this.#context = context;
57918
+ for (const waitingHandler of this.#waitingHandlers) {
57919
+ if (waitingHandler.pendingStart && !waitingHandler.done && !waitingHandler.controller.aborted) {
57920
+ waitingHandler.pendingStart = false;
57921
+ try {
57922
+ waitingHandler.handler.onRequestStart?.(waitingHandler.controller, context);
57923
+ } catch {
57924
+ waitingHandler.done = true;
57925
+ }
57926
+ }
57927
+ }
57928
+ this.#pruneDoneWaitingHandlers();
57929
+ }
57297
57930
  this.#primaryHandler.onRequestStart?.(controller, context);
57298
57931
  }
57299
57932
  /**
@@ -57431,7 +58064,8 @@ var require_deduplication_handler = __commonJS({
57431
58064
  bufferedChunks: [],
57432
58065
  bufferedBytes: 0,
57433
58066
  pendingTrailers: null,
57434
- done: false
58067
+ done: false,
58068
+ pendingStart: false
57435
58069
  };
57436
58070
  const state = {
57437
58071
  aborted: false,
@@ -59640,6 +60274,7 @@ var require_subresource_integrity = __commonJS({
59640
60274
  "use strict";
59641
60275
  var assert = __require("assert");
59642
60276
  var { runtimeFeatures } = require_runtime_features();
60277
+ var { asciiLowercase } = require_infra();
59643
60278
  var validSRIHashAlgorithmTokenSet = /* @__PURE__ */ new Map([["sha256", 0], ["sha384", 1], ["sha512", 2]]);
59644
60279
  var crypto12;
59645
60280
  if (runtimeFeatures.has("crypto")) {
@@ -59662,10 +60297,7 @@ var require_subresource_integrity = __commonJS({
59662
60297
  validSRIHashAlgorithmTokenSet
59663
60298
  )
59664
60299
  );
59665
- var isValidSRIHashAlgorithm = (
59666
- /** @type {IsValidSRIHashAlgorithm} */
59667
- Map.prototype.has.bind(validSRIHashAlgorithmTokenSet)
59668
- );
60300
+ var isValidSRIHashAlgorithm = (algorithm) => validSRIHashAlgorithmTokenSet.has(asciiLowercase(algorithm));
59669
60301
  var bytesMatch = runtimeFeatures.has("crypto") === false || validSRIHashAlgorithmTokenSet.size === 0 ? () => true : (bytes, metadataList) => {
59670
60302
  const parsedMetadata = parseMetadata(metadataList);
59671
60303
  if (parsedMetadata.length === 0) {
@@ -59726,7 +60358,8 @@ var require_subresource_integrity = __commonJS({
59726
60358
  base64Value = algorithmAndValue[1];
59727
60359
  }
59728
60360
  const metadata2 = {
59729
- alg: algorithm,
60361
+ // Possible spec bug?
60362
+ alg: asciiLowercase(algorithm),
59730
60363
  val: base64Value
59731
60364
  };
59732
60365
  result.push(metadata2);
@@ -60775,7 +61408,6 @@ var require_fetch = __commonJS({
60775
61408
  }
60776
61409
  }
60777
61410
  const location = headersList.get("location", true);
60778
- this.body = new Readable2({ read: resume });
60779
61411
  const willFollow = location && request2.redirect === "follow" && redirectStatusSet.has(status);
60780
61412
  const decoders = [];
60781
61413
  if (request2.method !== "HEAD" && request2.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) {
@@ -60783,7 +61415,7 @@ var require_fetch = __commonJS({
60783
61415
  const codings = contentEncoding ? contentEncoding.toLowerCase().split(",") : [];
60784
61416
  const maxContentEncodings = 5;
60785
61417
  if (codings.length > maxContentEncodings) {
60786
- reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`));
61418
+ this.abort(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`));
60787
61419
  return true;
60788
61420
  }
60789
61421
  for (let i = codings.length - 1; i >= 0; --i) {
@@ -60818,6 +61450,7 @@ var require_fetch = __commonJS({
60818
61450
  }
60819
61451
  }
60820
61452
  }
61453
+ this.body = new Readable2({ read: resume });
60821
61454
  const onError = this.onError.bind(this);
60822
61455
  resolve2({
60823
61456
  status,
@@ -61797,8 +62430,12 @@ var require_util4 = __commonJS({
61797
62430
  validateCookiePath(cookie.path);
61798
62431
  out.push(`Path=${cookie.path}`);
61799
62432
  }
61800
- if (cookie.expires && cookie.expires.toString() !== "Invalid Date") {
61801
- out.push(`Expires=${toIMFDate(cookie.expires)}`);
62433
+ if (cookie.expires != null) {
62434
+ const expiresMs = cookie.expires instanceof Date ? cookie.expires.getTime() : cookie.expires;
62435
+ const maxTimeValue = 864e13;
62436
+ if (typeof expiresMs === "number" && Number.isFinite(expiresMs) && Math.abs(expiresMs) <= maxTimeValue) {
62437
+ out.push(`Expires=${toIMFDate(cookie.expires)}`);
62438
+ }
61802
62439
  }
61803
62440
  if (cookie.sameSite) {
61804
62441
  out.push(`SameSite=${cookie.sameSite}`);
@@ -61873,88 +62510,89 @@ var require_parse = __commonJS({
61873
62510
  };
61874
62511
  }
61875
62512
  function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) {
61876
- if (unparsedAttributes.length === 0) {
61877
- return cookieAttributeList;
61878
- }
61879
- assert(unparsedAttributes[0] === ";");
61880
- unparsedAttributes = unparsedAttributes.slice(1);
61881
- let cookieAv = "";
61882
- if (unparsedAttributes.includes(";")) {
61883
- cookieAv = collectASequenceOfCodePointsFast(
61884
- ";",
61885
- unparsedAttributes,
61886
- { position: 0 }
61887
- );
61888
- unparsedAttributes = unparsedAttributes.slice(cookieAv.length);
61889
- } else {
61890
- cookieAv = unparsedAttributes;
61891
- unparsedAttributes = "";
61892
- }
61893
- let attributeName = "";
61894
- let attributeValue = "";
61895
- if (cookieAv.includes("=")) {
61896
- const position = { position: 0 };
61897
- attributeName = collectASequenceOfCodePointsFast(
61898
- "=",
61899
- cookieAv,
61900
- position
61901
- );
61902
- attributeValue = cookieAv.slice(position.position + 1);
61903
- } else {
61904
- attributeName = cookieAv;
61905
- }
61906
- attributeName = attributeName.trim();
61907
- attributeValue = attributeValue.trim();
61908
- if (attributeValue.length > maxAttributeValueSize) {
61909
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61910
- }
61911
- const attributeNameLowercase = attributeName.toLowerCase();
61912
- if (attributeNameLowercase === "expires") {
61913
- const expiryTime = new Date(attributeValue);
61914
- cookieAttributeList.expires = expiryTime;
61915
- } else if (attributeNameLowercase === "max-age") {
61916
- const charCode = attributeValue.charCodeAt(0);
61917
- if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") {
61918
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61919
- }
61920
- if (!/^\d+$/.test(attributeValue)) {
61921
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61922
- }
61923
- const deltaSeconds = Number(attributeValue);
61924
- cookieAttributeList.maxAge = deltaSeconds;
61925
- } else if (attributeNameLowercase === "domain") {
61926
- let cookieDomain = attributeValue;
61927
- if (cookieDomain[0] === ".") {
61928
- cookieDomain = cookieDomain.slice(1);
61929
- }
61930
- cookieDomain = cookieDomain.toLowerCase();
61931
- cookieAttributeList.domain = cookieDomain;
61932
- } else if (attributeNameLowercase === "path") {
61933
- let cookiePath = "";
61934
- if (attributeValue.length === 0 || attributeValue[0] !== "/") {
61935
- cookiePath = "/";
62513
+ while (true) {
62514
+ if (unparsedAttributes.length === 0) {
62515
+ return cookieAttributeList;
62516
+ }
62517
+ assert(unparsedAttributes[0] === ";");
62518
+ unparsedAttributes = unparsedAttributes.slice(1);
62519
+ let cookieAv = "";
62520
+ if (unparsedAttributes.includes(";")) {
62521
+ cookieAv = collectASequenceOfCodePointsFast(
62522
+ ";",
62523
+ unparsedAttributes,
62524
+ { position: 0 }
62525
+ );
62526
+ unparsedAttributes = unparsedAttributes.slice(cookieAv.length);
61936
62527
  } else {
61937
- cookiePath = attributeValue;
61938
- }
61939
- cookieAttributeList.path = cookiePath;
61940
- } else if (attributeNameLowercase === "secure") {
61941
- cookieAttributeList.secure = true;
61942
- } else if (attributeNameLowercase === "httponly") {
61943
- cookieAttributeList.httpOnly = true;
61944
- } else if (attributeNameLowercase === "samesite") {
61945
- const attributeValueLowercase = attributeValue.toLowerCase();
61946
- if (attributeValueLowercase === "none") {
61947
- cookieAttributeList.sameSite = "None";
61948
- } else if (attributeValueLowercase === "strict") {
61949
- cookieAttributeList.sameSite = "Strict";
61950
- } else if (attributeValueLowercase === "lax") {
61951
- cookieAttributeList.sameSite = "Lax";
62528
+ cookieAv = unparsedAttributes;
62529
+ unparsedAttributes = "";
62530
+ }
62531
+ let attributeName = "";
62532
+ let attributeValue = "";
62533
+ if (cookieAv.includes("=")) {
62534
+ const position = { position: 0 };
62535
+ attributeName = collectASequenceOfCodePointsFast(
62536
+ "=",
62537
+ cookieAv,
62538
+ position
62539
+ );
62540
+ attributeValue = cookieAv.slice(position.position + 1);
62541
+ } else {
62542
+ attributeName = cookieAv;
62543
+ }
62544
+ attributeName = attributeName.trim();
62545
+ attributeValue = attributeValue.trim();
62546
+ if (attributeValue.length > maxAttributeValueSize) {
62547
+ continue;
62548
+ }
62549
+ const attributeNameLowercase = attributeName.toLowerCase();
62550
+ if (attributeNameLowercase === "expires") {
62551
+ const expiryTime = new Date(attributeValue);
62552
+ cookieAttributeList.expires = expiryTime;
62553
+ } else if (attributeNameLowercase === "max-age") {
62554
+ const charCode = attributeValue.charCodeAt(0);
62555
+ if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") {
62556
+ continue;
62557
+ }
62558
+ if (!/^\d+$/.test(attributeValue)) {
62559
+ continue;
62560
+ }
62561
+ const deltaSeconds = Number(attributeValue);
62562
+ cookieAttributeList.maxAge = deltaSeconds;
62563
+ } else if (attributeNameLowercase === "domain") {
62564
+ let cookieDomain = attributeValue;
62565
+ if (cookieDomain[0] === ".") {
62566
+ cookieDomain = cookieDomain.slice(1);
62567
+ }
62568
+ cookieDomain = cookieDomain.toLowerCase();
62569
+ cookieAttributeList.domain = cookieDomain;
62570
+ } else if (attributeNameLowercase === "path") {
62571
+ let cookiePath = "";
62572
+ if (attributeValue.length === 0 || attributeValue[0] !== "/") {
62573
+ cookiePath = "/";
62574
+ } else {
62575
+ cookiePath = attributeValue;
62576
+ }
62577
+ cookieAttributeList.path = cookiePath;
62578
+ } else if (attributeNameLowercase === "secure") {
62579
+ cookieAttributeList.secure = true;
62580
+ } else if (attributeNameLowercase === "httponly") {
62581
+ cookieAttributeList.httpOnly = true;
62582
+ } else if (attributeNameLowercase === "samesite") {
62583
+ const attributeValueLowercase = attributeValue.toLowerCase();
62584
+ if (attributeValueLowercase === "none") {
62585
+ cookieAttributeList.sameSite = "None";
62586
+ } else if (attributeValueLowercase === "strict") {
62587
+ cookieAttributeList.sameSite = "Strict";
62588
+ } else if (attributeValueLowercase === "lax") {
62589
+ cookieAttributeList.sameSite = "Lax";
62590
+ }
62591
+ } else {
62592
+ cookieAttributeList.unparsed ??= [];
62593
+ cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`);
61952
62594
  }
61953
- } else {
61954
- cookieAttributeList.unparsed ??= [];
61955
- cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`);
61956
62595
  }
61957
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61958
62596
  }
61959
62597
  module.exports = {
61960
62598
  parseSetCookie,
@@ -61976,7 +62614,7 @@ var require_cookies = __commonJS({
61976
62614
  webidl.argumentLengthCheck(arguments, 1, "getCookies");
61977
62615
  brandChecks(headers);
61978
62616
  const cookie = headers.get("cookie");
61979
- const out = {};
62617
+ const out = { __proto__: null };
61980
62618
  if (!cookie) {
61981
62619
  return out;
61982
62620
  }
@@ -62752,11 +63390,11 @@ var require_connection = __commonJS({
62752
63390
  processResponse(response) {
62753
63391
  if (response.type === "error" || response.status !== 101) {
62754
63392
  if (response.socket?.session == null) {
62755
- failWebsocketConnection(handler, 1002, "Received network error or non-101 status code.", response.error);
63393
+ failHandshake(handler, response, 1002, "Received network error or non-101 status code.", response.error);
62756
63394
  return;
62757
63395
  }
62758
63396
  if (response.status !== 200) {
62759
- failWebsocketConnection(handler, 1002, "Received network error or non-200 status code.", response.error);
63397
+ failHandshake(handler, response, 1002, "Received network error or non-200 status code.", response.error);
62760
63398
  return;
62761
63399
  }
62762
63400
  }
@@ -62765,21 +63403,21 @@ var require_connection = __commonJS({
62765
63403
  warningEmitted = true;
62766
63404
  }
62767
63405
  if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) {
62768
- failWebsocketConnection(handler, 1002, "Server did not respond with sent protocols.");
63406
+ failHandshake(handler, response, 1002, "Server did not respond with sent protocols.");
62769
63407
  return;
62770
63408
  }
62771
63409
  if (response.socket.session == null && response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") {
62772
- failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".');
63410
+ failHandshake(handler, response, 1002, 'Server did not set Upgrade header to "websocket".');
62773
63411
  return;
62774
63412
  }
62775
63413
  if (response.socket.session == null && response.headersList.get("Connection")?.toLowerCase() !== "upgrade") {
62776
- failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".');
63414
+ failHandshake(handler, response, 1002, 'Server did not set Connection header to "upgrade".');
62777
63415
  return;
62778
63416
  }
62779
63417
  const secWSAccept = response.headersList.get("Sec-WebSocket-Accept");
62780
63418
  const digest = crypto12.hash("sha1", keyValue + uid, "base64");
62781
63419
  if (secWSAccept !== digest) {
62782
- failWebsocketConnection(handler, 1002, "Incorrect hash received in Sec-WebSocket-Accept header.");
63420
+ failHandshake(handler, response, 1002, "Incorrect hash received in Sec-WebSocket-Accept header.");
62783
63421
  return;
62784
63422
  }
62785
63423
  const secExtension = response.headersList.get("Sec-WebSocket-Extensions");
@@ -62787,7 +63425,7 @@ var require_connection = __commonJS({
62787
63425
  if (secExtension !== null) {
62788
63426
  extensions = parseExtensions(secExtension);
62789
63427
  if (!extensions.has("permessage-deflate")) {
62790
- failWebsocketConnection(handler, 1002, "Sec-WebSocket-Extensions header does not match.");
63428
+ failHandshake(handler, response, 1002, "Sec-WebSocket-Extensions header does not match.");
62791
63429
  return;
62792
63430
  }
62793
63431
  }
@@ -62795,7 +63433,7 @@ var require_connection = __commonJS({
62795
63433
  if (secProtocol !== null) {
62796
63434
  const requestProtocols = getDecodeSplit("sec-websocket-protocol", request2.headersList);
62797
63435
  if (requestProtocols === null || !requestProtocols.includes(secProtocol)) {
62798
- failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake.");
63436
+ failHandshake(handler, response, 1002, "Protocol was not set in the opening handshake.");
62799
63437
  return;
62800
63438
  }
62801
63439
  }
@@ -62841,6 +63479,12 @@ var require_connection = __commonJS({
62841
63479
  object.readyState = states.CLOSING;
62842
63480
  }
62843
63481
  }
63482
+ function failHandshake(handler, response, code2, reason, cause) {
63483
+ if (response.socket?.session != null && !response.socket.destroyed) {
63484
+ response.socket.destroy();
63485
+ }
63486
+ failWebsocketConnection(handler, code2, reason, cause);
63487
+ }
62844
63488
  function failWebsocketConnection(handler, code2, reason, cause) {
62845
63489
  if (isEstablished(handler.readyState)) {
62846
63490
  closeWebSocketConnection(handler, code2, reason, false);
@@ -63119,6 +63763,15 @@ var require_receiver = __commonJS({
63119
63763
  if (isControlFrame(this.#info.opcode)) {
63120
63764
  this.#loop = this.parseControlFrame(body);
63121
63765
  this.#state = parserStates.INFO;
63766
+ if (this.#loop && this.#handler.socket.writableNeedDrain) {
63767
+ this.#loop = false;
63768
+ this.#handler.socket.once("drain", () => {
63769
+ if (this.destroyed) return;
63770
+ this.#loop = true;
63771
+ this.run(callback);
63772
+ });
63773
+ return;
63774
+ }
63122
63775
  } else {
63123
63776
  if (!this.#info.compressed) {
63124
63777
  if (!this.writeFragments(body)) {
@@ -64294,6 +64947,7 @@ var require_util6 = __commonJS({
64294
64947
  var require_eventsource_stream = __commonJS({
64295
64948
  "node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports, module) {
64296
64949
  "use strict";
64950
+ var buffer = __require("buffer");
64297
64951
  var { Transform } = __require("stream");
64298
64952
  var { isASCIINumber, isValidLastEventId } = require_util6();
64299
64953
  var BOM = [239, 187, 191];
@@ -64301,24 +64955,28 @@ var require_eventsource_stream = __commonJS({
64301
64955
  var CR = 13;
64302
64956
  var COLON = 58;
64303
64957
  var SPACE = 32;
64958
+ var defaultMaxEventSize = buffer.kStringMaxLength;
64304
64959
  var DATA = Buffer.from("data");
64305
64960
  var EVENT = Buffer.from("event");
64306
64961
  var ID = Buffer.from("id");
64307
64962
  var RETRY = Buffer.from("retry");
64308
- function isASCIINumberBytes(buffer, start) {
64309
- if (start >= buffer.length) {
64963
+ var minParserItems = 1024;
64964
+ var maxParserItems = 131072;
64965
+ var bytesPerParserItem = 128;
64966
+ function isASCIINumberBytes(buffer2, start) {
64967
+ if (start >= buffer2.length) {
64310
64968
  return false;
64311
64969
  }
64312
- for (let i = start; i < buffer.length; i++) {
64313
- if (buffer[i] < 48 || buffer[i] > 57) {
64970
+ for (let i = start; i < buffer2.length; i++) {
64971
+ if (buffer2[i] < 48 || buffer2[i] > 57) {
64314
64972
  return false;
64315
64973
  }
64316
64974
  }
64317
64975
  return true;
64318
64976
  }
64319
- function isValidLastEventIdBytes(buffer, start) {
64320
- for (let i = start; i < buffer.length; i++) {
64321
- if (buffer[i] === 0) {
64977
+ function isValidLastEventIdBytes(buffer2, start) {
64978
+ for (let i = start; i < buffer2.length; i++) {
64979
+ if (buffer2[i] === 0) {
64322
64980
  return false;
64323
64981
  }
64324
64982
  }
@@ -64335,6 +64993,11 @@ var require_eventsource_stream = __commonJS({
64335
64993
  }
64336
64994
  return true;
64337
64995
  }
64996
+ function createMaxEventSizeExceededError() {
64997
+ const error = new Error("EventSource message size exceeded");
64998
+ error.aborted = false;
64999
+ return error;
65000
+ }
64338
65001
  var EventSourceStream = class extends Transform {
64339
65002
  /**
64340
65003
  * @type {eventSourceSettings}
@@ -64361,6 +65024,13 @@ var require_eventsource_stream = __commonJS({
64361
65024
  pos = 0;
64362
65025
  lineChunkIndex = 0;
64363
65026
  linePos = 0;
65027
+ lineLength = 0;
65028
+ eventSize = 0;
65029
+ eventFieldSizes = { data: 0, event: 0, id: 0, retry: 0 };
65030
+ dataLineCount = 0;
65031
+ maxEventSize;
65032
+ maxDataLines;
65033
+ maxBufferedChunks;
64364
65034
  event = {
64365
65035
  data: void 0,
64366
65036
  event: void 0,
@@ -64370,6 +65040,7 @@ var require_eventsource_stream = __commonJS({
64370
65040
  /**
64371
65041
  * @param {object} options
64372
65042
  * @param {boolean} [options.readableObjectMode]
65043
+ * @param {number} [options.maxEventSize]
64373
65044
  * @param {eventSourceSettings} [options.eventSourceSettings]
64374
65045
  * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push]
64375
65046
  */
@@ -64377,6 +65048,10 @@ var require_eventsource_stream = __commonJS({
64377
65048
  options.readableObjectMode = true;
64378
65049
  super(options);
64379
65050
  this.state = options.eventSourceSettings || {};
65051
+ this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize;
65052
+ const parserItemLimit = this.maxEventSize > 0 ? Math.min(maxParserItems, Math.max(minParserItems, Math.floor(this.maxEventSize / bytesPerParserItem))) : 0;
65053
+ this.maxDataLines = parserItemLimit;
65054
+ this.maxBufferedChunks = parserItemLimit;
64380
65055
  if (options.push) {
64381
65056
  this.push = options.push;
64382
65057
  }
@@ -64392,6 +65067,10 @@ var require_eventsource_stream = __commonJS({
64392
65067
  callback();
64393
65068
  return;
64394
65069
  }
65070
+ if (this.maxEventSize > 0 && this.chunks.length >= this.maxBufferedChunks && chunk2[0] !== LF && chunk2[0] !== CR) {
65071
+ callback(createMaxEventSizeExceededError());
65072
+ return;
65073
+ }
64395
65074
  this.chunks.push(chunk2);
64396
65075
  if (this.checkBOM) {
64397
65076
  if (this.handleBOM()) {
@@ -64428,15 +65107,29 @@ var require_eventsource_stream = __commonJS({
64428
65107
  if (byte === CR) {
64429
65108
  this.crlfCheck = true;
64430
65109
  }
64431
- this.parseLine(this.readLine(), this.event);
65110
+ try {
65111
+ this.parseLine(this.readLine(), this.event);
65112
+ } catch (error) {
65113
+ callback(error);
65114
+ return;
65115
+ }
64432
65116
  this.consumeCurrentByte();
64433
65117
  this.eventEndCheck = true;
64434
65118
  continue;
64435
65119
  }
65120
+ if (this.maxEventSize > 0 && ++this.lineLength > this.maxEventSize + 7) {
65121
+ callback(createMaxEventSizeExceededError());
65122
+ return;
65123
+ }
64436
65124
  this.advanceCursor();
64437
65125
  }
64438
65126
  callback();
64439
65127
  }
65128
+ _destroy(error, callback) {
65129
+ this.chunks.length = 0;
65130
+ this.clearEvent();
65131
+ super._destroy(error, callback);
65132
+ }
64440
65133
  /**
64441
65134
  * @param {Buffer} line
64442
65135
  * @param {EventSourceStreamEvent} event
@@ -64459,6 +65152,12 @@ var require_eventsource_stream = __commonJS({
64459
65152
  }
64460
65153
  }
64461
65154
  if (isFieldName(line, fieldLength, DATA)) {
65155
+ if (this.maxEventSize > 0 && this.dataLineCount >= this.maxDataLines) {
65156
+ throw createMaxEventSizeExceededError();
65157
+ }
65158
+ const valueBytes = line.length - valueStart;
65159
+ const dataSize = this.eventFieldSizes.data + (event.data === void 0 ? 0 : 1) + valueBytes;
65160
+ this.setEventFieldSize("data", dataSize);
64462
65161
  const value = line.toString("utf8", valueStart);
64463
65162
  if (event.data === void 0) {
64464
65163
  event.data = value;
@@ -64466,27 +65165,38 @@ var require_eventsource_stream = __commonJS({
64466
65165
  event.data += `
64467
65166
  ${value}`;
64468
65167
  }
65168
+ this.dataLineCount++;
64469
65169
  return;
64470
65170
  }
64471
65171
  if (isFieldName(line, fieldLength, RETRY)) {
64472
65172
  if (isASCIINumberBytes(line, valueStart)) {
65173
+ this.setEventFieldSize("retry", line.length - valueStart);
64473
65174
  event.retry = line.toString("utf8", valueStart);
64474
65175
  }
64475
65176
  return;
64476
65177
  }
64477
65178
  if (isFieldName(line, fieldLength, ID)) {
64478
65179
  if (isValidLastEventIdBytes(line, valueStart)) {
65180
+ this.setEventFieldSize("id", line.length - valueStart);
64479
65181
  event.id = line.toString("utf8", valueStart);
64480
65182
  }
64481
65183
  return;
64482
65184
  }
64483
65185
  if (isFieldName(line, fieldLength, EVENT)) {
64484
- const value = line.toString("utf8", valueStart);
64485
- if (value.length > 0) {
64486
- event.event = value;
65186
+ if (valueStart < line.length) {
65187
+ this.setEventFieldSize("event", line.length - valueStart);
65188
+ event.event = line.toString("utf8", valueStart);
64487
65189
  }
64488
65190
  }
64489
65191
  }
65192
+ setEventFieldSize(field, size) {
65193
+ const eventSize = this.eventSize - this.eventFieldSizes[field] + size;
65194
+ if (this.maxEventSize > 0 && eventSize > this.maxEventSize) {
65195
+ throw createMaxEventSizeExceededError();
65196
+ }
65197
+ this.eventSize = eventSize;
65198
+ this.eventFieldSizes[field] = size;
65199
+ }
64490
65200
  /**
64491
65201
  * @param {EventSourceStreamEvent} event
64492
65202
  */
@@ -64513,6 +65223,12 @@ ${value}`;
64513
65223
  this.event.event = void 0;
64514
65224
  this.event.id = void 0;
64515
65225
  this.event.retry = void 0;
65226
+ this.eventSize = 0;
65227
+ this.dataLineCount = 0;
65228
+ this.eventFieldSizes.data = 0;
65229
+ this.eventFieldSizes.event = 0;
65230
+ this.eventFieldSizes.id = 0;
65231
+ this.eventFieldSizes.retry = 0;
64516
65232
  }
64517
65233
  hasPendingEvent() {
64518
65234
  return this.event.data !== void 0 || this.event.event !== void 0 || this.event.id !== void 0 || this.event.retry !== void 0;
@@ -64537,13 +65253,15 @@ ${value}`;
64537
65253
  syncLineStartToCursor() {
64538
65254
  this.lineChunkIndex = this.chunkIndex;
64539
65255
  this.linePos = this.pos;
65256
+ this.lineLength = 0;
64540
65257
  this.dropConsumedChunks();
64541
65258
  }
64542
65259
  dropConsumedChunks() {
64543
- while (this.lineChunkIndex > 0) {
64544
- this.chunks.shift();
64545
- this.lineChunkIndex--;
64546
- this.chunkIndex--;
65260
+ if (this.lineChunkIndex > 0) {
65261
+ const consumed = this.lineChunkIndex;
65262
+ this.chunks.splice(0, consumed);
65263
+ this.lineChunkIndex = 0;
65264
+ this.chunkIndex -= consumed;
64547
65265
  }
64548
65266
  if (this.chunkIndex === this.chunks.length) {
64549
65267
  this.chunks.length = 0;
@@ -64645,6 +65363,7 @@ var require_eventsource = __commonJS({
64645
65363
  var { isNetworkError } = require_response();
64646
65364
  var { kEnumerableProperty } = require_util();
64647
65365
  var { environmentSettingsObject } = require_util2();
65366
+ var { getGlobalDispatcher } = require_global2();
64648
65367
  var experimentalWarned = false;
64649
65368
  var defaultReconnectionTime = 3e3;
64650
65369
  var CONNECTING = 0;
@@ -64786,6 +65505,7 @@ var require_eventsource = __commonJS({
64786
65505
  this.#state.origin = response.urlList[response.urlList.length - 1].origin;
64787
65506
  const eventSourceStream = new EventSourceStream({
64788
65507
  eventSourceSettings: this.#state,
65508
+ maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize,
64789
65509
  push: (event) => {
64790
65510
  this.dispatchEvent(createFastMessageEvent(
64791
65511
  event.type,
@@ -64922,7 +65642,8 @@ var require_eventsource = __commonJS({
64922
65642
  {
64923
65643
  key: "dispatcher",
64924
65644
  // undici only
64925
- converter: webidl.converters.any
65645
+ converter: webidl.converters.any,
65646
+ defaultValue: () => getGlobalDispatcher()
64926
65647
  },
64927
65648
  {
64928
65649
  key: "node",