@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.js CHANGED
@@ -7713,7 +7713,7 @@ function* stringValues(obj, depth = 0) {
7713
7713
  }
7714
7714
  for (const v of Object.values(obj)) yield* stringValues(v, depth + 1);
7715
7715
  }
7716
- var import_picomatch, import_safe_regex2, import_picomatch2, import_mvdan_sh, import_safe_regex22, import_mvdan_sh2, import_safe_regex23, import_crypto2, import_crypto3, import_mvdan_sh3, import_crypto4, import_mvdan_sh4, import_crypto5, 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;
7716
+ var import_picomatch, import_safe_regex2, import_picomatch2, import_mvdan_sh, import_safe_regex22, import_mvdan_sh2, import_safe_regex23, import_crypto2, import_crypto3, import_mvdan_sh3, import_crypto4, import_mvdan_sh4, import_crypto5, 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;
7717
7717
  var init_dist = __esm({
7718
7718
  "packages/policy-engine/dist/index.mjs"() {
7719
7719
  "use strict";
@@ -8031,6 +8031,77 @@ var init_dist = __esm({
8031
8031
  ],
8032
8032
  dangerousWords: ["wipefs"]
8033
8033
  };
8034
+ finance_default = {
8035
+ name: "finance",
8036
+ 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.",
8037
+ aliases: ["payments", "money"],
8038
+ smartRules: [
8039
+ {
8040
+ name: "shield:finance:review-refund",
8041
+ tool: "{,mcp__*__}{create_refund,refund_payment,refund_charge,refund_order,issue_refund}",
8042
+ conditions: [],
8043
+ verdict: "review",
8044
+ reason: "A refund returns money to a customer. node9 asks before money moves, whatever the request said (Finance shield)."
8045
+ },
8046
+ {
8047
+ name: "shield:finance:review-payout",
8048
+ tool: "{,mcp__*__}{create_payout,send_payout,payout,create_payouts_batch}",
8049
+ conditions: [],
8050
+ verdict: "review",
8051
+ reason: "A payout moves the balance to a bank account. node9 asks before money moves (Finance shield)."
8052
+ },
8053
+ {
8054
+ name: "shield:finance:review-transfer",
8055
+ 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}",
8056
+ conditions: [],
8057
+ verdict: "review",
8058
+ reason: "A transfer moves money between accounts. node9 asks before money moves (Finance shield)."
8059
+ },
8060
+ {
8061
+ name: "shield:finance:review-charge",
8062
+ 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}",
8063
+ conditions: [],
8064
+ verdict: "review",
8065
+ reason: "This charges a card or captures a payment. node9 asks before money moves (Finance shield)."
8066
+ },
8067
+ {
8068
+ name: "shield:finance:review-payment-link",
8069
+ tool: "{,mcp__*__}{create_payment_link,create_invoice,finalize_invoice,send_invoice,pay_invoice,create_invoice_item}",
8070
+ conditions: [],
8071
+ verdict: "review",
8072
+ reason: "This bills someone or creates a link that charges a card. node9 asks before money moves (Finance shield)."
8073
+ },
8074
+ {
8075
+ name: "shield:finance:review-subscription",
8076
+ tool: "{,mcp__*__}{create_subscription,cancel_subscription,update_subscription,pause_subscription,resume_subscription}",
8077
+ conditions: [],
8078
+ verdict: "review",
8079
+ reason: "A subscription starts or stops recurring charges. node9 asks before money moves (Finance shield)."
8080
+ },
8081
+ {
8082
+ name: "shield:finance:review-dispute",
8083
+ tool: "{,mcp__*__}{update_dispute,accept_dispute,close_dispute}",
8084
+ conditions: [],
8085
+ verdict: "review",
8086
+ reason: "This answers or concedes a chargeback. node9 asks before money moves (Finance shield)."
8087
+ },
8088
+ {
8089
+ name: "shield:finance:review-card",
8090
+ tool: "{,mcp__*__}{issue_card,create_virtual_card,create_issuing_card,update_card_limit}",
8091
+ conditions: [],
8092
+ verdict: "review",
8093
+ reason: "This issues a card or changes its limit. node9 asks before money moves (Finance shield)."
8094
+ },
8095
+ {
8096
+ name: "shield:finance:review-withdraw",
8097
+ tool: "{,mcp__*__}{withdraw,withdraw_funds,create_withdrawal,request_withdrawal}",
8098
+ conditions: [],
8099
+ verdict: "review",
8100
+ reason: "A withdrawal moves money out. node9 asks before money moves (Finance shield)."
8101
+ }
8102
+ ],
8103
+ dangerousWords: []
8104
+ };
8034
8105
  github_default = {
8035
8106
  name: "github",
8036
8107
  description: "Protects GitHub repositories from destructive AI operations",
@@ -8057,6 +8128,56 @@ var init_dist = __esm({
8057
8128
  ],
8058
8129
  dangerousWords: []
8059
8130
  };
8131
+ identity_default = {
8132
+ name: "identity",
8133
+ 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.",
8134
+ aliases: ["access", "iam"],
8135
+ smartRules: [
8136
+ {
8137
+ name: "shield:identity:review-password",
8138
+ tool: "{,mcp__*__}{change_password,update_password,reset_password,set_password,expire_password,force_password_reset}",
8139
+ conditions: [],
8140
+ verdict: "review",
8141
+ reason: "This changes or resets a password. node9 asks before credentials change, whatever the request said (Identity shield)."
8142
+ },
8143
+ {
8144
+ name: "shield:identity:review-key",
8145
+ 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}",
8146
+ conditions: [],
8147
+ verdict: "review",
8148
+ reason: "This creates or rotates a key, token or secret. node9 asks before credentials change (Identity shield)."
8149
+ },
8150
+ {
8151
+ name: "shield:identity:review-access",
8152
+ 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}",
8153
+ conditions: [],
8154
+ verdict: "review",
8155
+ reason: "This grants or revokes access. node9 asks before access changes (Identity shield)."
8156
+ },
8157
+ {
8158
+ name: "shield:identity:review-membership",
8159
+ 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}",
8160
+ conditions: [],
8161
+ verdict: "review",
8162
+ reason: "This changes who belongs where. node9 asks before membership changes (Identity shield)."
8163
+ },
8164
+ {
8165
+ name: "shield:identity:review-user",
8166
+ tool: "{,mcp__*__}{create_user,delete_user,deactivate_user,suspend_user,activate_user,unlock_user,make_admin,promote_user,demote_user,update_user_role}",
8167
+ conditions: [],
8168
+ verdict: "review",
8169
+ reason: "This creates, removes or promotes an account. node9 asks before accounts change (Identity shield)."
8170
+ },
8171
+ {
8172
+ name: "shield:identity:review-mfa",
8173
+ tool: "{,mcp__*__}{reset_mfa,reset_factors,disable_mfa,enroll_factor,deactivate_factor}",
8174
+ conditions: [],
8175
+ verdict: "review",
8176
+ reason: "This changes a second factor. node9 asks before credentials change (Identity shield)."
8177
+ }
8178
+ ],
8179
+ dangerousWords: []
8180
+ };
8060
8181
  k8s_default = {
8061
8182
  name: "k8s",
8062
8183
  description: "Protects Kubernetes clusters from destructive AI operations",
@@ -8389,6 +8510,175 @@ var init_dist = __esm({
8389
8510
  ],
8390
8511
  dangerousWords: []
8391
8512
  };
8513
+ publishing_default = {
8514
+ name: "publishing",
8515
+ 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.",
8516
+ aliases: ["release", "deploy"],
8517
+ smartRules: [
8518
+ {
8519
+ name: "shield:publishing:review-release",
8520
+ tool: "{,mcp__*__}{create_release,publish_release,create_tag_release,update_release,promote_release}",
8521
+ conditions: [],
8522
+ verdict: "review",
8523
+ reason: "A release ships code to everyone who installs it. node9 asks before publishing, whatever the request said (Publishing shield)."
8524
+ },
8525
+ {
8526
+ name: "shield:publishing:review-package",
8527
+ tool: "{,mcp__*__}{publish_package,npm_publish,pypi_upload,publish_version,publish_extension}",
8528
+ conditions: [],
8529
+ verdict: "review",
8530
+ reason: "This publishes a package. node9 asks before publishing (Publishing shield)."
8531
+ },
8532
+ {
8533
+ name: "shield:publishing:review-deploy",
8534
+ tool: "{,mcp__*__}{deploy,create_deployment,deploy_site,promote_deployment,trigger_deploy,deploy_to_production,rollout}",
8535
+ conditions: [],
8536
+ verdict: "review",
8537
+ reason: "This deploys to an environment other people use. node9 asks before publishing (Publishing shield)."
8538
+ },
8539
+ {
8540
+ name: "shield:publishing:review-post",
8541
+ tool: "{,mcp__*__}{post_tweet,create_tweet,post_webpage,publish_post,create_post,publish_page,send_announcement,post_announcement,create_linkedin_post,schedule_post}",
8542
+ conditions: [],
8543
+ verdict: "review",
8544
+ reason: "This posts outside the organisation. node9 asks before publishing (Publishing shield)."
8545
+ },
8546
+ {
8547
+ name: "shield:publishing:review-visibility",
8548
+ tool: "{,mcp__*__}{set_visibility,make_public,set_public,publish_repository,change_visibility,update_visibility}",
8549
+ conditions: [],
8550
+ verdict: "review",
8551
+ reason: "This makes something public. node9 asks before publishing (Publishing shield)."
8552
+ },
8553
+ {
8554
+ name: "shield:publishing:review-npm-publish",
8555
+ tool: "bash",
8556
+ conditions: [
8557
+ {
8558
+ field: "command",
8559
+ op: "matches",
8560
+ value: "(?:^|[^\\w-])(?:npm|pnpm)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8561
+ flags: "i"
8562
+ }
8563
+ ],
8564
+ verdict: "review",
8565
+ reason: "npm publish ships the package to everyone who installs it. node9 asks before publishing (Publishing shield)."
8566
+ },
8567
+ {
8568
+ name: "shield:publishing:review-yarn-publish",
8569
+ tool: "bash",
8570
+ conditions: [
8571
+ {
8572
+ field: "command",
8573
+ op: "matches",
8574
+ value: "(?:^|[^\\w-])(?:yarn)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8575
+ flags: "i"
8576
+ }
8577
+ ],
8578
+ verdict: "review",
8579
+ reason: "yarn publish ships the package to everyone who installs it. node9 asks before publishing (Publishing shield)."
8580
+ },
8581
+ {
8582
+ name: "shield:publishing:review-twine-upload",
8583
+ tool: "bash",
8584
+ conditions: [
8585
+ {
8586
+ field: "command",
8587
+ op: "matches",
8588
+ value: "(?:^|[^\\w-])(?:twine)(?![\\w-])[^;&|]{0,200}?\\s(?:upload)(?![\\w-])",
8589
+ flags: "i"
8590
+ }
8591
+ ],
8592
+ verdict: "review",
8593
+ reason: "twine upload publishes to PyPI. node9 asks before publishing (Publishing shield)."
8594
+ },
8595
+ {
8596
+ name: "shield:publishing:review-python-publish",
8597
+ tool: "bash",
8598
+ conditions: [
8599
+ {
8600
+ field: "command",
8601
+ op: "matches",
8602
+ value: "(?:^|[^\\w-])(?:poetry|uv|hatch|flit)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8603
+ flags: "i"
8604
+ }
8605
+ ],
8606
+ verdict: "review",
8607
+ reason: "This publishes the Python package to PyPI. node9 asks before publishing (Publishing shield)."
8608
+ },
8609
+ {
8610
+ name: "shield:publishing:review-release-tool-publish",
8611
+ tool: "bash",
8612
+ conditions: [
8613
+ {
8614
+ field: "command",
8615
+ op: "matches",
8616
+ value: "(?:^|[^\\w-])(?:lerna|changeset|vsce|ovsx)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8617
+ flags: "i"
8618
+ }
8619
+ ],
8620
+ verdict: "review",
8621
+ reason: "This publishes packages or an editor extension through a release tool. node9 asks before publishing (Publishing shield)."
8622
+ },
8623
+ {
8624
+ name: "shield:publishing:review-cargo-publish",
8625
+ tool: "bash",
8626
+ conditions: [
8627
+ {
8628
+ field: "command",
8629
+ op: "matches",
8630
+ value: "(?:^|[^\\w-])(?:cargo)(?![\\w-])[^;&|]{0,200}?\\s(?:publish)(?![\\w-])",
8631
+ flags: "i"
8632
+ }
8633
+ ],
8634
+ verdict: "review",
8635
+ reason: "cargo publish ships the crate. node9 asks before publishing (Publishing shield)."
8636
+ },
8637
+ {
8638
+ name: "shield:publishing:review-gem-push",
8639
+ tool: "bash",
8640
+ conditions: [
8641
+ {
8642
+ field: "command",
8643
+ op: "matches",
8644
+ value: "(?:^|[^\\w-])(?:gem)(?![\\w-])[^;&|]{0,200}?\\s(?:push)(?![\\w-])",
8645
+ flags: "i"
8646
+ }
8647
+ ],
8648
+ verdict: "review",
8649
+ reason: "gem push publishes to RubyGems. node9 asks before publishing (Publishing shield)."
8650
+ },
8651
+ {
8652
+ name: "shield:publishing:review-docker-push",
8653
+ tool: "bash",
8654
+ conditions: [
8655
+ {
8656
+ field: "command",
8657
+ op: "matches",
8658
+ value: "(?:^|[^\\w-])(?:docker|podman)(?![\\w-])[^;&|]{0,200}?\\s(?:push|--push)(?![\\w-])",
8659
+ flags: "i"
8660
+ }
8661
+ ],
8662
+ verdict: "review",
8663
+ reason: "docker push publishes the image to a registry. node9 asks before publishing (Publishing shield)."
8664
+ },
8665
+ {
8666
+ name: "shield:publishing:review-gh-release",
8667
+ tool: "bash",
8668
+ conditions: [
8669
+ {
8670
+ field: "command",
8671
+ op: "matches",
8672
+ value: "(?:^|[^\\w-])(?:gh)(?![\\w-])[^;&|]{0,200}?\\srelease\\s+(?:create|upload|edit)(?![\\w-])",
8673
+ flags: "i"
8674
+ }
8675
+ ],
8676
+ verdict: "review",
8677
+ reason: "gh release ships a release on GitHub. node9 asks before publishing (Publishing shield)."
8678
+ }
8679
+ ],
8680
+ dangerousWords: []
8681
+ };
8392
8682
  redis_default = {
8393
8683
  name: "redis",
8394
8684
  description: "Protects Redis instances from destructive AI operations",
@@ -8473,13 +8763,25 @@ var init_dist = __esm({
8473
8763
  [bash_safe_default.name]: bash_safe_default,
8474
8764
  [docker_default.name]: docker_default,
8475
8765
  [filesystem_default.name]: filesystem_default,
8766
+ // Dangerous actions as category shields (node9Firewall#385): an MCP app's
8767
+ // money, credential and publishing tools, asked about whatever the request
8768
+ // said. One glob per rule covers the bare name the gateway sends and the
8769
+ // mcp__<server>__ name the agent hook sends.
8770
+ [finance_default.name]: finance_default,
8476
8771
  [github_default.name]: github_default,
8772
+ [identity_default.name]: identity_default,
8477
8773
  [k8s_default.name]: k8s_default,
8478
8774
  [mongodb_default.name]: mongodb_default,
8479
8775
  [postgres_default.name]: postgres_default,
8480
8776
  [project_jail_default.name]: project_jail_default,
8777
+ [publishing_default.name]: publishing_default,
8481
8778
  [redis_default.name]: redis_default
8482
8779
  };
8780
+ ACTION_SHIELD_NAMES = /* @__PURE__ */ new Set([
8781
+ "finance",
8782
+ "identity",
8783
+ "publishing"
8784
+ ]);
8483
8785
  assertBuiltinShieldRegexesAreSafe();
8484
8786
  SSRF_MAX_HOST = 253;
8485
8787
  METADATA_ADDRESSES = /* @__PURE__ */ new Set([
@@ -30962,7 +31264,7 @@ function renderPanelScorecard(input, now = /* @__PURE__ */ new Date()) {
30962
31264
  const hitShieldSet = new Set(
30963
31265
  shieldImpacts.filter((i) => i.totalCatches > 0).map((i) => i.shieldName)
30964
31266
  );
30965
- const zeroHitAll = Object.keys(BUILTIN_SHIELDS).filter((name) => !hitShieldSet.has(name)).sort();
31267
+ const zeroHitAll = Object.keys(BUILTIN_SHIELDS).filter((name) => !hitShieldSet.has(name) && !ACTION_SHIELD_NAMES.has(name)).sort();
30966
31268
  const zeroHitBuiltins = zeroHitAll.filter((name) => !enabledSet.has(name));
30967
31269
  const zeroHitEnabled = zeroHitAll.filter((name) => enabledSet.has(name));
30968
31270
  if (zeroHitEnabled.length > 0) {
@@ -31454,7 +31756,7 @@ function registerScanCommand(program2) {
31454
31756
  const hitShieldIds = new Set(
31455
31757
  summary.sections.filter((s) => s.sourceType === "shield" && s.shieldKey).map((s) => s.shieldKey)
31456
31758
  );
31457
- const noHitShields = Object.keys(SHIELDS).filter((n) => !hitShieldIds.has(n)).sort();
31759
+ const noHitShields = Object.keys(SHIELDS).filter((n) => !hitShieldIds.has(n) && !ACTION_SHIELD_NAMES.has(n)).sort();
31458
31760
  const quietEnabled = noHitShields.filter((n) => enabledShieldSet.has(n));
31459
31761
  const emptyShields = noHitShields.filter((n) => !enabledShieldSet.has(n));
31460
31762
  if (quietEnabled.length > 0) {
@@ -39318,6 +39620,7 @@ var require_symbols = __commonJS({
39318
39620
  kDestroy: /* @__PURE__ */ Symbol("destroy"),
39319
39621
  kDispatch: /* @__PURE__ */ Symbol("dispatch"),
39320
39622
  kUrl: /* @__PURE__ */ Symbol("url"),
39623
+ kRedirectCacheControl: /* @__PURE__ */ Symbol("redirect cache control"),
39321
39624
  kWriting: /* @__PURE__ */ Symbol("writing"),
39322
39625
  kResuming: /* @__PURE__ */ Symbol("resuming"),
39323
39626
  kQueue: /* @__PURE__ */ Symbol("queue"),
@@ -41612,10 +41915,27 @@ var require_request = __commonJS({
41612
41915
  return false;
41613
41916
  }
41614
41917
  }
41615
- onUpgrade(statusCode, headers, socket) {
41918
+ /**
41919
+ * @param {number} statusCode
41920
+ * @param {Buffer[]|string[]} headers
41921
+ * @param {import('node:stream').Duplex} socket
41922
+ * @param {string} [statusText]
41923
+ */
41924
+ onUpgrade(statusCode, headers, socket, statusText = "") {
41925
+ this.onFinally();
41616
41926
  assert(!this.aborted);
41617
41927
  assert(!this.completed);
41618
- return this[kHandler].onUpgrade(statusCode, headers, socket);
41928
+ if (channels.headers.hasSubscribers) {
41929
+ channels.headers.publish({ request: this, response: { statusCode, headers, statusText } });
41930
+ }
41931
+ const result = this[kHandler].onUpgrade(statusCode, headers, socket);
41932
+ if (!this.aborted) {
41933
+ this.completed = true;
41934
+ if (channels.trailers.hasSubscribers) {
41935
+ channels.trailers.publish({ request: this, trailers: [] });
41936
+ }
41937
+ }
41938
+ return result;
41619
41939
  }
41620
41940
  onComplete(trailers) {
41621
41941
  this.onFinally();
@@ -41965,6 +42285,7 @@ var require_unwrap_handler = __commonJS({
41965
42285
  var require_dispatcher_base = __commonJS({
41966
42286
  "node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) {
41967
42287
  "use strict";
42288
+ var buffer = require("buffer");
41968
42289
  var Dispatcher = require_dispatcher();
41969
42290
  var UnwrapHandler = require_unwrap_handler();
41970
42291
  var {
@@ -41976,6 +42297,7 @@ var require_dispatcher_base = __commonJS({
41976
42297
  var kOnDestroyed = /* @__PURE__ */ Symbol("onDestroyed");
41977
42298
  var kOnClosed = /* @__PURE__ */ Symbol("onClosed");
41978
42299
  var kWebSocketOptions = /* @__PURE__ */ Symbol("webSocketOptions");
42300
+ var kEventSourceOptions = /* @__PURE__ */ Symbol("eventSourceOptions");
41979
42301
  var DispatcherBase = class extends Dispatcher {
41980
42302
  /** @type {boolean} */
41981
42303
  [kDestroyed] = false;
@@ -41991,6 +42313,7 @@ var require_dispatcher_base = __commonJS({
41991
42313
  constructor(opts) {
41992
42314
  super();
41993
42315
  this[kWebSocketOptions] = opts?.webSocket ?? {};
42316
+ this[kEventSourceOptions] = opts?.eventSource ?? {};
41994
42317
  }
41995
42318
  /**
41996
42319
  * @returns {import('../../types/dispatcher').WebSocketOptions}
@@ -42002,6 +42325,14 @@ var require_dispatcher_base = __commonJS({
42002
42325
  // 128 MB default
42003
42326
  };
42004
42327
  }
42328
+ /**
42329
+ * @returns {import('../../types/client').Client.EventSourceOptions}
42330
+ */
42331
+ get eventSourceOptions() {
42332
+ return {
42333
+ maxEventSize: this[kEventSourceOptions].maxEventSize ?? buffer.kStringMaxLength
42334
+ };
42335
+ }
42005
42336
  /** @returns {boolean} */
42006
42337
  get destroyed() {
42007
42338
  return this[kDestroyed];
@@ -42147,15 +42478,19 @@ var require_connect = __commonJS({
42147
42478
  if (this._sessionCache.has(sessionKey)) {
42148
42479
  this._sessionCache.delete(sessionKey);
42149
42480
  } else if (this._sessionCache.size >= this._maxCachedSessions) {
42481
+ let evicted = false;
42150
42482
  for (const [key, ref] of this._sessionCache) {
42151
42483
  if (ref.deref() === void 0) {
42152
42484
  this._sessionCache.delete(key);
42153
- return;
42485
+ evicted = true;
42486
+ break;
42154
42487
  }
42155
42488
  }
42156
- const oldest = this._sessionCache.keys().next();
42157
- if (!oldest.done) {
42158
- this._sessionCache.delete(oldest.value);
42489
+ if (!evicted) {
42490
+ const oldest = this._sessionCache.keys().next();
42491
+ if (!oldest.done) {
42492
+ this._sessionCache.delete(oldest.value);
42493
+ }
42159
42494
  }
42160
42495
  }
42161
42496
  this._sessionCache.set(sessionKey, new WeakRef(session));
@@ -43214,6 +43549,10 @@ var require_infra = __commonJS({
43214
43549
  return input.slice(start, position.position);
43215
43550
  }
43216
43551
  var ASCII_WHITESPACE_REPLACE_REGEX = /[\u0009\u000A\u000C\u000D\u0020]/g;
43552
+ var nonASCIIRegex = /[^\x00-\x7F]/;
43553
+ function asciiLowercase(str2) {
43554
+ return nonASCIIRegex.test(str2) ? str2.replace(/[A-Z]+/g, (upper) => upper.toLowerCase()) : str2.toLowerCase();
43555
+ }
43217
43556
  function forgivingBase64(data) {
43218
43557
  data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, "");
43219
43558
  let dataLength = data.length;
@@ -43288,6 +43627,7 @@ var require_infra = __commonJS({
43288
43627
  return result;
43289
43628
  }
43290
43629
  module2.exports = {
43630
+ asciiLowercase,
43291
43631
  collectASequenceOfCodePoints,
43292
43632
  collectASequenceOfCodePointsFast,
43293
43633
  forgivingBase64,
@@ -45912,7 +46252,13 @@ var require_client_h1 = __commonJS({
45912
46252
  function lazyllhttp() {
45913
46253
  const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0;
45914
46254
  let mod;
45915
- let useWasmSIMD = process.arch !== "ppc64";
46255
+ let useWasmSIMD = true;
46256
+ if (process.arch === "ppc64") {
46257
+ const [major, minor] = process.versions.node.split(".").map((n) => parseInt(n, 10));
46258
+ if (major < 24 || major === 24 && minor < 12) {
46259
+ useWasmSIMD = false;
46260
+ }
46261
+ }
45916
46262
  if (process.env.UNDICI_NO_WASM_SIMD === "1") {
45917
46263
  useWasmSIMD = false;
45918
46264
  } else if (process.env.UNDICI_NO_WASM_SIMD === "0") {
@@ -46266,7 +46612,7 @@ var require_client_h1 = __commonJS({
46266
46612
  * @param {Buffer} head
46267
46613
  */
46268
46614
  onUpgrade(head) {
46269
- const { upgrade, client, socket, headers, statusCode } = this;
46615
+ const { upgrade, client, socket, headers, statusCode, statusText } = this;
46270
46616
  assert(upgrade);
46271
46617
  assert(client[kSocket] === socket);
46272
46618
  assert(!socket.destroyed);
@@ -46291,8 +46637,9 @@ var require_client_h1 = __commonJS({
46291
46637
  client[kQueue][client[kRunningIdx]++] = null;
46292
46638
  client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade"));
46293
46639
  try {
46294
- request2.onUpgrade(statusCode, headers, socket);
46640
+ request2.onUpgrade(statusCode, headers, socket, statusText);
46295
46641
  } catch (err2) {
46642
+ util.errorRequest(client, request2, err2);
46296
46643
  util.destroy(socket, err2);
46297
46644
  }
46298
46645
  client[kResume]();
@@ -46560,7 +46907,6 @@ var require_client_h1 = __commonJS({
46560
46907
  };
46561
46908
  }
46562
46909
  function onHttpSocketError(err2) {
46563
- assert(err2.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
46564
46910
  const parser = this[kParser];
46565
46911
  if (err2.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) {
46566
46912
  const parserErr = parser.finish();
@@ -47340,7 +47686,6 @@ var require_client_h2 = __commonJS({
47340
47686
  }
47341
47687
  }
47342
47688
  function onHttp2SessionError(err2) {
47343
- assert(err2.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
47344
47689
  this[kSocket][kError] = err2;
47345
47690
  this[kClient][kOnError](err2);
47346
47691
  }
@@ -47430,7 +47775,6 @@ var require_client_h2 = __commonJS({
47430
47775
  client[kResume]();
47431
47776
  }
47432
47777
  function onHttp2SocketError(err2) {
47433
- assert(err2.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
47434
47778
  this[kError] = err2;
47435
47779
  this[kClient][kOnError](err2);
47436
47780
  }
@@ -47524,10 +47868,15 @@ var require_client_h2 = __commonJS({
47524
47868
  }
47525
47869
  stream = session.request(headers, { endStream: false, signal });
47526
47870
  stream[kHTTP2Stream] = true;
47871
+ ++session[kOpenStreams];
47527
47872
  stream.once("response", (headers2, _flags) => {
47528
47873
  const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
47529
- request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47530
- ++session[kOpenStreams];
47874
+ try {
47875
+ request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47876
+ } catch (err2) {
47877
+ abort(err2);
47878
+ return;
47879
+ }
47531
47880
  completeRequest(client, request2);
47532
47881
  });
47533
47882
  stream.on("error", () => {
@@ -47544,10 +47893,15 @@ var require_client_h2 = __commonJS({
47544
47893
  }
47545
47894
  stream = session.request(headers, { endStream: false, signal });
47546
47895
  stream[kHTTP2Stream] = true;
47896
+ ++session[kOpenStreams];
47547
47897
  stream.on("response", (headers2) => {
47548
47898
  const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
47549
- request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47550
- ++session[kOpenStreams];
47899
+ try {
47900
+ request2.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
47901
+ } catch (err2) {
47902
+ abort(err2);
47903
+ return;
47904
+ }
47551
47905
  completeRequest(client, request2);
47552
47906
  });
47553
47907
  stream.on("error", abort);
@@ -47981,7 +48335,8 @@ var require_client = __commonJS({
47981
48335
  initialWindowSize,
47982
48336
  connectionWindowSize,
47983
48337
  pingInterval,
47984
- webSocket
48338
+ webSocket,
48339
+ eventSource
47985
48340
  } = {}) {
47986
48341
  if (keepAlive !== void 0) {
47987
48342
  throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
@@ -48059,7 +48414,7 @@ var require_client = __commonJS({
48059
48414
  if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) {
48060
48415
  throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0");
48061
48416
  }
48062
- super({ webSocket });
48417
+ super({ webSocket, eventSource });
48063
48418
  if (typeof connect2 !== "function") {
48064
48419
  connect2 = buildConnector({
48065
48420
  ...tls,
@@ -49040,7 +49395,7 @@ var require_agent = __commonJS({
49040
49395
  return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts);
49041
49396
  }
49042
49397
  var Agent = class extends DispatcherBase {
49043
- constructor({ factory = defaultFactory, maxOrigins = Infinity, connect, ...options } = {}) {
49398
+ constructor({ factory = defaultFactory, maxOrigins = Infinity, connect, tls, ...options } = {}) {
49044
49399
  if (typeof factory !== "function") {
49045
49400
  throw new InvalidArgumentError("factory must be a function.");
49046
49401
  }
@@ -49054,7 +49409,10 @@ var require_agent = __commonJS({
49054
49409
  if (connect && typeof connect !== "function") {
49055
49410
  connect = { ...connect };
49056
49411
  }
49057
- this[kOptions] = { ...util.deepClone(options), maxOrigins, connect };
49412
+ if (tls && typeof tls !== "function") {
49413
+ tls = { ...tls };
49414
+ }
49415
+ this[kOptions] = { ...util.deepClone(options), maxOrigins, connect, tls };
49058
49416
  this[kFactory] = factory;
49059
49417
  this[kClients] = /* @__PURE__ */ new Map();
49060
49418
  this[kOrigins] = /* @__PURE__ */ new Set();
@@ -50263,6 +50621,55 @@ var require_retry_handler = __commonJS({
50263
50621
  });
50264
50622
  }
50265
50623
  }
50624
+ var RetryController = class {
50625
+ #paused = false;
50626
+ #target = null;
50627
+ set target(target) {
50628
+ this.#target = target;
50629
+ if (this.#paused) {
50630
+ target?.pause();
50631
+ }
50632
+ }
50633
+ get target() {
50634
+ return this.#target;
50635
+ }
50636
+ pause() {
50637
+ this.#paused = true;
50638
+ this.#target?.pause();
50639
+ }
50640
+ resume() {
50641
+ this.#paused = false;
50642
+ this.#target?.resume();
50643
+ }
50644
+ abort(reason) {
50645
+ this.#target?.abort(reason);
50646
+ }
50647
+ get paused() {
50648
+ return this.#paused || (this.#target?.paused ?? false);
50649
+ }
50650
+ get aborted() {
50651
+ return this.#target?.aborted ?? false;
50652
+ }
50653
+ get reason() {
50654
+ return this.#target?.reason ?? null;
50655
+ }
50656
+ get rawHeaders() {
50657
+ return this.#target?.rawHeaders ?? null;
50658
+ }
50659
+ set rawHeaders(value) {
50660
+ if (this.#target) {
50661
+ this.#target.rawHeaders = value;
50662
+ }
50663
+ }
50664
+ get rawTrailers() {
50665
+ return this.#target?.rawTrailers ?? null;
50666
+ }
50667
+ set rawTrailers(value) {
50668
+ if (this.#target) {
50669
+ this.#target.rawTrailers = value;
50670
+ }
50671
+ }
50672
+ };
50266
50673
  var RetryHandler = class _RetryHandler {
50267
50674
  constructor(opts, { dispatch, handler }) {
50268
50675
  const { retryOptions, ...dispatchOpts } = opts;
@@ -50317,16 +50724,17 @@ var require_retry_handler = __commonJS({
50317
50724
  this.start = 0;
50318
50725
  this.end = null;
50319
50726
  this.etag = null;
50727
+ this.controllerProxy = new RetryController();
50320
50728
  }
50321
50729
  onResponseStartWithRetry(controller, statusCode, headers, statusMessage, err2) {
50322
50730
  if (this.retryOpts.throwOnError) {
50323
50731
  if (this.retryOpts.statusCodes.includes(statusCode) === false) {
50324
50732
  if (this.headersSent) {
50325
- this.handler.onResponseError?.(controller, err2);
50733
+ this.handler.onResponseError?.(this.controllerProxy, err2);
50326
50734
  } else {
50327
50735
  this.headersSent = true;
50328
50736
  this.checkpointResponseEnd(headers);
50329
- this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
50737
+ this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
50330
50738
  }
50331
50739
  } else {
50332
50740
  this.error = err2;
@@ -50336,17 +50744,17 @@ var require_retry_handler = __commonJS({
50336
50744
  if (isDisturbed(this.opts.body)) {
50337
50745
  this.headersSent = true;
50338
50746
  this.checkpointResponseEnd(headers);
50339
- this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
50747
+ this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
50340
50748
  return;
50341
50749
  }
50342
50750
  function shouldRetry(passedErr) {
50343
50751
  if (passedErr) {
50344
50752
  if (this.headersSent) {
50345
- this.handler.onResponseError?.(controller, passedErr);
50753
+ this.handler.onResponseError?.(this.controllerProxy, passedErr);
50346
50754
  } else {
50347
50755
  this.headersSent = true;
50348
50756
  this.checkpointResponseEnd(headers);
50349
- this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
50757
+ this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
50350
50758
  }
50351
50759
  controller.resume();
50352
50760
  return;
@@ -50376,12 +50784,13 @@ var require_retry_handler = __commonJS({
50376
50784
  }
50377
50785
  }
50378
50786
  onRequestStart(controller, context) {
50787
+ this.controllerProxy.target = controller;
50379
50788
  if (!this.headersSent) {
50380
- this.handler.onRequestStart?.(controller, context);
50789
+ this.handler.onRequestStart?.(this.controllerProxy, context);
50381
50790
  }
50382
50791
  }
50383
- onRequestUpgrade(controller, statusCode, headers, socket) {
50384
- this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket);
50792
+ onRequestUpgrade(_controller, statusCode, headers, socket) {
50793
+ this.handler.onRequestUpgrade?.(this.controllerProxy, statusCode, headers, socket);
50385
50794
  }
50386
50795
  static [kRetryHandlerDefaultRetry](err2, { state, opts }, cb) {
50387
50796
  const { statusCode, code: code2, headers } = err2;
@@ -50469,7 +50878,7 @@ var require_retry_handler = __commonJS({
50469
50878
  if (range == null) {
50470
50879
  this.headersSent = true;
50471
50880
  this.handler.onResponseStart?.(
50472
- controller,
50881
+ this.controllerProxy,
50473
50882
  statusCode,
50474
50883
  headers,
50475
50884
  statusMessage
@@ -50502,7 +50911,7 @@ var require_retry_handler = __commonJS({
50502
50911
  }
50503
50912
  this.headersSent = true;
50504
50913
  this.handler.onResponseStart?.(
50505
- controller,
50914
+ this.controllerProxy,
50506
50915
  statusCode,
50507
50916
  headers,
50508
50917
  statusMessage
@@ -50514,24 +50923,24 @@ var require_retry_handler = __commonJS({
50514
50923
  });
50515
50924
  }
50516
50925
  }
50517
- onResponseData(controller, chunk2) {
50926
+ onResponseData(_controller, chunk2) {
50518
50927
  if (this.error) {
50519
50928
  return;
50520
50929
  }
50521
50930
  this.start += chunk2.length;
50522
- this.handler.onResponseData?.(controller, chunk2);
50931
+ this.handler.onResponseData?.(this.controllerProxy, chunk2);
50523
50932
  }
50524
- onResponseEnd(controller, trailers) {
50933
+ onResponseEnd(_controller, trailers) {
50525
50934
  if (this.error && this.retryOpts.throwOnError) {
50526
50935
  throw this.error;
50527
50936
  }
50528
50937
  if (!this.error) {
50529
50938
  this.retryCount = 0;
50530
- return this.handler.onResponseEnd?.(controller, trailers);
50939
+ return this.handler.onResponseEnd?.(this.controllerProxy, trailers);
50531
50940
  }
50532
- this.retry(controller);
50941
+ this.retry();
50533
50942
  }
50534
- retry(controller) {
50943
+ retry() {
50535
50944
  if (this.start !== 0) {
50536
50945
  const headers = { range: `bytes=${this.start}-${this.end ?? ""}` };
50537
50946
  if (this.etag != null) {
@@ -50549,20 +50958,20 @@ var require_retry_handler = __commonJS({
50549
50958
  this.retryCountCheckpoint = this.retryCount;
50550
50959
  this.dispatch(this.opts, this);
50551
50960
  } catch (err2) {
50552
- this.handler.onResponseError?.(controller, err2);
50961
+ this.handler.onResponseError?.(this.controllerProxy, err2);
50553
50962
  }
50554
50963
  }
50555
50964
  onResponseError(controller, err2) {
50556
50965
  if (controller?.aborted || isDisturbed(this.opts.body) || this.headersSent && !this.resume) {
50557
- this.handler.onResponseError?.(controller, err2);
50966
+ this.handler.onResponseError?.(this.controllerProxy, err2);
50558
50967
  return;
50559
50968
  }
50560
50969
  function shouldRetry(returnedErr) {
50561
50970
  if (!returnedErr) {
50562
- this.retry(controller);
50971
+ this.retry();
50563
50972
  return;
50564
50973
  }
50565
- this.handler?.onResponseError?.(controller, returnedErr);
50974
+ this.handler?.onResponseError?.(this.controllerProxy, returnedErr);
50566
50975
  }
50567
50976
  if (this.retryCount - this.retryCountCheckpoint > 0) {
50568
50977
  this.retryCount = this.retryCountCheckpoint + (this.retryCount - this.retryCountCheckpoint);
@@ -53867,7 +54276,7 @@ var require_redirect_handler = __commonJS({
53867
54276
  "node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) {
53868
54277
  "use strict";
53869
54278
  var util = require_util();
53870
- var { kBodyUsed } = require_symbols();
54279
+ var { kBodyUsed, kRedirectCacheControl } = require_symbols();
53871
54280
  var assert = require("assert");
53872
54281
  var { InvalidArgumentError } = require_errors();
53873
54282
  var EE = require("events");
@@ -53905,6 +54314,10 @@ var require_redirect_handler = __commonJS({
53905
54314
  this.maxRedirections = maxRedirections;
53906
54315
  this.handler = handler;
53907
54316
  this.history = [];
54317
+ Object.defineProperty(this.history, kRedirectCacheControl, {
54318
+ value: [],
54319
+ enumerable: false
54320
+ });
53908
54321
  if (util.isStream(this.opts.body)) {
53909
54322
  if (util.bodyLength(this.opts.body) === 0) {
53910
54323
  this.opts.body.on("data", function() {
@@ -53955,6 +54368,7 @@ var require_redirect_handler = __commonJS({
53955
54368
  this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage);
53956
54369
  return;
53957
54370
  }
54371
+ this.history[kRedirectCacheControl].push(headers["cache-control"]);
53958
54372
  const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)));
53959
54373
  const path99 = search ? `${pathname}${search}` : pathname;
53960
54374
  const redirectUrlString = `${origin}${path99}`;
@@ -55656,6 +56070,7 @@ var require_cache_handler = __commonJS({
55656
56070
  "node_modules/undici/lib/handler/cache-handler.js"(exports2, module2) {
55657
56071
  "use strict";
55658
56072
  var util = require_util();
56073
+ var { kRedirectCacheControl } = require_symbols();
55659
56074
  var {
55660
56075
  parseCacheControlHeader,
55661
56076
  hasInvalidCacheControlDirective,
@@ -55667,6 +56082,13 @@ var require_cache_handler = __commonJS({
55667
56082
  var { parseHttpDate } = require_date();
55668
56083
  function noop() {
55669
56084
  }
56085
+ function sameOrigin(a, b) {
56086
+ try {
56087
+ return new URL(String(a)).origin === new URL(String(b)).origin;
56088
+ } catch {
56089
+ return String(a) === String(b);
56090
+ }
56091
+ }
55670
56092
  var HEURISTICALLY_CACHEABLE_STATUS_CODES = [
55671
56093
  200,
55672
56094
  203,
@@ -55782,6 +56204,13 @@ var require_cache_handler = __commonJS({
55782
56204
  * @type {import('node:stream').Writable | undefined}
55783
56205
  */
55784
56206
  #writeStream;
56207
+ /**
56208
+ * The URLs visited while following redirects, shared by reference from the
56209
+ * redirect handler through the request context. Carries the suppressed hops'
56210
+ * cache-control under {@link kRedirectCacheControl}.
56211
+ * @type {URL[] | undefined}
56212
+ */
56213
+ #history;
55785
56214
  /**
55786
56215
  * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts
55787
56216
  * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey
@@ -55797,6 +56226,7 @@ var require_cache_handler = __commonJS({
55797
56226
  onRequestStart(controller, context) {
55798
56227
  this.#writeStream?.destroy();
55799
56228
  this.#writeStream = void 0;
56229
+ this.#history = context?.history;
55800
56230
  this.#handler.onRequestStart?.(controller, context);
55801
56231
  }
55802
56232
  onRequestUpgrade(controller, statusCode, headers, socket) {
@@ -55820,6 +56250,21 @@ var require_cache_handler = __commonJS({
55820
56250
  invalidateUnsafeRequest(this.#store, this.#cacheKey, resHeaders);
55821
56251
  return downstreamOnHeaders();
55822
56252
  }
56253
+ if (this.#history && this.#history.length > 0) {
56254
+ const finalUrl = this.#history[this.#history.length - 1];
56255
+ if (!sameOrigin(finalUrl.origin, this.#cacheKey.origin)) {
56256
+ return downstreamOnHeaders();
56257
+ }
56258
+ }
56259
+ const redirectCacheControl = this.#history?.[kRedirectCacheControl];
56260
+ if (redirectCacheControl) {
56261
+ for (const hopCacheControl of redirectCacheControl) {
56262
+ const hopDirectives = hopCacheControl ? parseCacheControlHeader(hopCacheControl) : {};
56263
+ if (hopDirectives["no-store"] === true || this.#cacheType === "shared" && hopDirectives.private === true) {
56264
+ return downstreamOnHeaders();
56265
+ }
56266
+ }
56267
+ }
55823
56268
  const cacheControlHeader = resHeaders["cache-control"];
55824
56269
  const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
55825
56270
  if (revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives)) {
@@ -56896,6 +57341,61 @@ var require_decompress = __commonJS({
56896
57341
  var { InvalidArgumentError, ResponseExceededMaxSizeError } = require_errors();
56897
57342
  var DecoratorHandler = require_decorator_handler();
56898
57343
  var { runtimeFeatures } = require_runtime_features();
57344
+ var DecompressController = class {
57345
+ #onPause;
57346
+ #onResume;
57347
+ #onAbort;
57348
+ #paused = false;
57349
+ constructor(onPause, onResume, onAbort) {
57350
+ this.#onPause = onPause;
57351
+ this.#onResume = onResume;
57352
+ this.#onAbort = onAbort;
57353
+ this.target = null;
57354
+ }
57355
+ pause() {
57356
+ if (this.#paused) {
57357
+ return;
57358
+ }
57359
+ this.#paused = true;
57360
+ this.#onPause();
57361
+ }
57362
+ resume() {
57363
+ if (!this.#paused) {
57364
+ return;
57365
+ }
57366
+ this.#paused = false;
57367
+ this.#onResume();
57368
+ }
57369
+ abort(reason) {
57370
+ this.target?.abort(reason);
57371
+ this.#onAbort(reason);
57372
+ }
57373
+ get paused() {
57374
+ return this.#paused;
57375
+ }
57376
+ get aborted() {
57377
+ return this.target?.aborted ?? false;
57378
+ }
57379
+ get reason() {
57380
+ return this.target?.reason ?? null;
57381
+ }
57382
+ get rawHeaders() {
57383
+ return this.target?.rawHeaders ?? null;
57384
+ }
57385
+ set rawHeaders(value) {
57386
+ if (this.target) {
57387
+ this.target.rawHeaders = value;
57388
+ }
57389
+ }
57390
+ get rawTrailers() {
57391
+ return this.target?.rawTrailers ?? null;
57392
+ }
57393
+ set rawTrailers(value) {
57394
+ if (this.target) {
57395
+ this.target.rawTrailers = value;
57396
+ }
57397
+ }
57398
+ };
56899
57399
  var supportedEncodings = {
56900
57400
  gzip: createGunzip,
56901
57401
  "x-gzip": createGunzip,
@@ -56909,7 +57409,7 @@ var require_decompress = __commonJS({
56909
57409
  /** @type {const} */
56910
57410
  [204, 304]
56911
57411
  );
56912
- var defaultMaxSize = 64 * 1024 * 1024;
57412
+ var defaultMaxSize = 0;
56913
57413
  function createMaxSizeLimiter(maxSize) {
56914
57414
  let size = 0;
56915
57415
  return new TransformStream2({
@@ -56947,14 +57447,124 @@ var require_decompress = __commonJS({
56947
57447
  #terminated = false;
56948
57448
  /** @type {boolean} */
56949
57449
  #inputEnded = false;
57450
+ /** @type {boolean} */
57451
+ #inputBackpressured = false;
57452
+ /** @type {boolean} */
57453
+ #upstreamPaused = false;
57454
+ /** @type {boolean} */
57455
+ #draining = false;
57456
+ /** @type {boolean} */
57457
+ #drainRequested = false;
57458
+ /** @type {boolean} */
57459
+ #completionPending = false;
57460
+ /** @type {DecompressorStream | undefined} */
57461
+ #finalDecompressor;
57462
+ /** @type {DecompressController} */
57463
+ #controller;
56950
57464
  constructor(handler, { skipStatusCodes = defaultSkipStatusCodes, skipErrorResponses = true, maxSize = defaultMaxSize } = {}) {
56951
- if (!Number.isSafeInteger(maxSize) || maxSize < 1) {
56952
- throw new InvalidArgumentError("maxSize must be a positive integer");
57465
+ if (!Number.isSafeInteger(maxSize) || maxSize < 0) {
57466
+ throw new InvalidArgumentError("maxSize must be a non-negative integer");
56953
57467
  }
56954
57468
  super(handler);
56955
57469
  this.#skipStatusCodes = skipStatusCodes;
56956
57470
  this.#skipErrorResponses = skipErrorResponses;
56957
57471
  this.#maxSize = maxSize;
57472
+ this.#controller = new DecompressController(
57473
+ () => this.#onDownstreamPause(),
57474
+ () => this.#onDownstreamResume(),
57475
+ (reason) => {
57476
+ if (this.#inputEnded && !this.#terminated) {
57477
+ this.onResponseError(this.#controller, reason);
57478
+ }
57479
+ }
57480
+ );
57481
+ }
57482
+ #onDownstreamPause() {
57483
+ this.#pauseUpstream();
57484
+ }
57485
+ #onDownstreamResume() {
57486
+ const drainWasDeferred = this.#draining;
57487
+ this.#drainOutput();
57488
+ if (!drainWasDeferred) {
57489
+ this.#resumeUpstreamIfNeeded();
57490
+ this.#finishIfReady();
57491
+ }
57492
+ }
57493
+ #pauseUpstream() {
57494
+ if (!this.#upstreamPaused && !this.#terminated) {
57495
+ this.#upstreamPaused = true;
57496
+ this.#controller.target?.pause();
57497
+ }
57498
+ }
57499
+ #resumeUpstreamIfNeeded() {
57500
+ if (this.#upstreamPaused && !this.#controller.paused && !this.#inputBackpressured) {
57501
+ this.#upstreamPaused = false;
57502
+ if (!this.#inputEnded) {
57503
+ this.#controller.target?.resume();
57504
+ }
57505
+ }
57506
+ }
57507
+ #drainOutput() {
57508
+ if (this.#terminated || this.#controller.paused || !this.#finalDecompressor) {
57509
+ return;
57510
+ }
57511
+ if (this.#draining) {
57512
+ this.#drainRequested = true;
57513
+ return;
57514
+ }
57515
+ this.#draining = true;
57516
+ try {
57517
+ do {
57518
+ this.#drainRequested = false;
57519
+ let chunk2;
57520
+ while (!this.#terminated && !this.#controller.paused && (chunk2 = this.#finalDecompressor.read()) !== null) {
57521
+ if (this.#maxSize > 0) {
57522
+ const decompressedSize = this.#decompressedSize + chunk2.length;
57523
+ if (decompressedSize > this.#maxSize) {
57524
+ this.#fail(new ResponseExceededMaxSizeError(
57525
+ `Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
57526
+ ));
57527
+ return;
57528
+ }
57529
+ this.#decompressedSize = decompressedSize;
57530
+ }
57531
+ try {
57532
+ const result = super.onResponseData(this.#controller, chunk2);
57533
+ if (result === false && !this.#controller.paused) {
57534
+ this.#controller.pause();
57535
+ }
57536
+ } catch (err2) {
57537
+ this.#fail(err2);
57538
+ return;
57539
+ }
57540
+ }
57541
+ } while (this.#drainRequested && !this.#terminated && !this.#controller.paused);
57542
+ } finally {
57543
+ this.#draining = false;
57544
+ }
57545
+ this.#resumeUpstreamIfNeeded();
57546
+ this.#finishIfReady();
57547
+ }
57548
+ #finishIfReady() {
57549
+ if (this.#terminated || !this.#completionPending || this.#controller.paused || this.#draining) {
57550
+ return;
57551
+ }
57552
+ this.#cleanupDecompressors();
57553
+ try {
57554
+ super.onResponseEnd(this.#controller, this.#trailers);
57555
+ } catch (err2) {
57556
+ this.#fail(err2);
57557
+ return;
57558
+ }
57559
+ this.#terminated = true;
57560
+ }
57561
+ #onDecompressionEnd() {
57562
+ if (this.#terminated) {
57563
+ return;
57564
+ }
57565
+ this.#completionPending = true;
57566
+ this.#drainOutput();
57567
+ this.#finishIfReady();
56958
57568
  }
56959
57569
  /**
56960
57570
  * Determines if decompression should be skipped based on encoding and status code
@@ -56997,7 +57607,7 @@ var require_decompress = __commonJS({
56997
57607
  const streams = [];
56998
57608
  for (let i = 0; i < decompressors.length; i++) {
56999
57609
  streams.push(decompressors[i]);
57000
- if (i < decompressors.length - 1) {
57610
+ if (i < decompressors.length - 1 && this.#maxSize > 0) {
57001
57611
  streams.push(createMaxSizeLimiter(this.#maxSize));
57002
57612
  }
57003
57613
  }
@@ -57005,87 +57615,67 @@ var require_decompress = __commonJS({
57005
57615
  }
57006
57616
  /**
57007
57617
  * Stops decompression and reports an error.
57008
- * @param {Controller} controller - The controller to coordinate with
57009
57618
  * @param {Error} error - The decompression error
57010
57619
  * @returns {void}
57011
57620
  */
57012
- #fail(controller, error) {
57621
+ #fail(error) {
57013
57622
  if (this.#terminated) {
57014
57623
  return;
57015
57624
  }
57016
57625
  if (this.#inputEnded) {
57017
- this.onResponseError(controller, error);
57626
+ this.onResponseError(this.#controller, error);
57018
57627
  } else {
57019
- controller.abort(error);
57628
+ this.#controller.abort(error);
57020
57629
  }
57021
57630
  }
57022
57631
  /**
57023
- * Sets up event handlers for a decompressor stream using readable events
57632
+ * Sets up event handlers for the final decompressor stream.
57024
57633
  * @param {DecompressorStream} decompressor - The decompressor stream
57025
- * @param {Controller} controller - The controller to coordinate with
57026
57634
  * @returns {void}
57027
57635
  */
57028
- #setupDecompressorEvents(decompressor, controller) {
57029
- decompressor.on("readable", () => {
57030
- if (this.#terminated) {
57031
- return;
57032
- }
57033
- let chunk2;
57034
- while ((chunk2 = decompressor.read()) !== null) {
57035
- const decompressedSize = this.#decompressedSize + chunk2.length;
57036
- if (decompressedSize > this.#maxSize) {
57037
- this.#fail(controller, new ResponseExceededMaxSizeError(
57038
- `Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`
57039
- ));
57040
- return;
57041
- }
57042
- this.#decompressedSize = decompressedSize;
57043
- const result = super.onResponseData(controller, chunk2);
57044
- if (result === false) {
57045
- break;
57046
- }
57047
- }
57048
- });
57049
- decompressor.on("error", (error) => {
57050
- this.#fail(controller, error);
57051
- });
57636
+ #setupDecompressorEvents(decompressor) {
57637
+ this.#finalDecompressor = decompressor;
57638
+ decompressor.on("readable", () => this.#drainOutput());
57639
+ decompressor.on("error", (error) => this.#fail(error));
57052
57640
  }
57053
57641
  /**
57054
57642
  * Sets up event handling for a single decompressor
57055
- * @param {Controller} controller - The controller to handle events
57056
57643
  * @returns {void}
57057
57644
  */
57058
- #setupSingleDecompressor(controller) {
57645
+ #setupSingleDecompressor() {
57059
57646
  const decompressor = this.#decompressors[0];
57060
- this.#setupDecompressorEvents(decompressor, controller);
57061
- decompressor.on("end", () => {
57062
- if (this.#terminated) {
57063
- return;
57064
- }
57065
- this.#terminated = true;
57066
- this.#cleanupDecompressors();
57067
- super.onResponseEnd(controller, this.#trailers);
57068
- });
57647
+ this.#setupDecompressorEvents(decompressor);
57648
+ decompressor.on("end", () => this.#onDecompressionEnd());
57069
57649
  }
57070
57650
  /**
57071
57651
  * Sets up event handling for multiple chained decompressors using pipeline
57072
- * @param {Controller} controller - The controller to handle events
57073
57652
  * @returns {void}
57074
57653
  */
57075
- #setupMultipleDecompressors(controller) {
57654
+ #setupMultipleDecompressors() {
57076
57655
  const lastDecompressor = this.#decompressors[this.#decompressors.length - 1];
57077
- this.#setupDecompressorEvents(lastDecompressor, controller);
57656
+ this.#setupDecompressorEvents(lastDecompressor);
57078
57657
  pipeline2(this.#decompressors, (err2) => {
57079
57658
  if (this.#terminated) {
57080
57659
  return;
57081
57660
  }
57082
57661
  if (err2) {
57083
- this.#fail(controller, err2);
57662
+ this.#fail(err2);
57084
57663
  return;
57085
57664
  }
57086
- this.#terminated = true;
57087
- this.#cleanupDecompressors();
57088
- super.onResponseEnd(controller, this.#trailers);
57665
+ this.#onDecompressionEnd();
57666
+ });
57667
+ }
57668
+ #setupInputBackpressure() {
57669
+ const decompressor = this.#decompressors[0];
57670
+ decompressor.on("drain", () => {
57671
+ if (this.#terminated) {
57672
+ return;
57673
+ }
57674
+ this.#inputBackpressured = false;
57675
+ if (!this.#controller.paused) {
57676
+ this.#drainOutput();
57677
+ this.#resumeUpstreamIfNeeded();
57678
+ }
57089
57679
  });
57090
57680
  }
57091
57681
  /**
@@ -57094,6 +57684,14 @@ var require_decompress = __commonJS({
57094
57684
  */
57095
57685
  #cleanupDecompressors() {
57096
57686
  this.#decompressors.length = 0;
57687
+ this.#finalDecompressor = void 0;
57688
+ }
57689
+ onRequestStart(controller, context) {
57690
+ this.#controller.target = controller;
57691
+ return super.onRequestStart(this.#controller, context);
57692
+ }
57693
+ onRequestUpgrade(controller, statusCode, headers, socket) {
57694
+ return super.onRequestUpgrade(this.#controller, statusCode, headers, socket);
57097
57695
  }
57098
57696
  /**
57099
57697
  * @param {Controller} controller
@@ -57105,17 +57703,17 @@ var require_decompress = __commonJS({
57105
57703
  onResponseStart(controller, statusCode, headers, statusMessage) {
57106
57704
  const contentEncoding = headers["content-encoding"];
57107
57705
  if (this.#shouldSkipDecompression(contentEncoding, statusCode)) {
57108
- return super.onResponseStart(controller, statusCode, headers, statusMessage);
57706
+ return super.onResponseStart(this.#controller, statusCode, headers, statusMessage);
57109
57707
  }
57110
57708
  const decompressors = this.#createDecompressionChain(contentEncoding.toLowerCase());
57111
57709
  if (decompressors.length === 0) {
57112
57710
  this.#cleanupDecompressors();
57113
- return super.onResponseStart(controller, statusCode, headers, statusMessage);
57711
+ return super.onResponseStart(this.#controller, statusCode, headers, statusMessage);
57114
57712
  }
57115
57713
  this.#decompressors = decompressors;
57116
57714
  const { "content-encoding": _, "content-length": __, ...newHeaders } = headers;
57117
- if (controller?.rawHeaders) {
57118
- const rawHeaders = controller.rawHeaders;
57715
+ if (this.#controller.rawHeaders) {
57716
+ const rawHeaders = this.#controller.rawHeaders;
57119
57717
  if (Array.isArray(rawHeaders)) {
57120
57718
  const filteredHeaders = [];
57121
57719
  for (let i = 0; i < rawHeaders.length; i += 2) {
@@ -57137,12 +57735,13 @@ var require_decompress = __commonJS({
57137
57735
  }
57138
57736
  }
57139
57737
  }
57738
+ this.#setupInputBackpressure();
57140
57739
  if (this.#decompressors.length === 1) {
57141
- this.#setupSingleDecompressor(controller);
57740
+ this.#setupSingleDecompressor();
57142
57741
  } else {
57143
- this.#setupMultipleDecompressors(controller);
57742
+ this.#setupMultipleDecompressors();
57144
57743
  }
57145
- return super.onResponseStart(controller, statusCode, newHeaders, statusMessage);
57744
+ return super.onResponseStart(this.#controller, statusCode, newHeaders, statusMessage);
57146
57745
  }
57147
57746
  /**
57148
57747
  * @param {Controller} controller
@@ -57151,10 +57750,13 @@ var require_decompress = __commonJS({
57151
57750
  */
57152
57751
  onResponseData(controller, chunk2) {
57153
57752
  if (this.#decompressors.length > 0) {
57154
- this.#decompressors[0].write(chunk2);
57753
+ if (!this.#decompressors[0].write(chunk2)) {
57754
+ this.#inputBackpressured = true;
57755
+ this.#pauseUpstream();
57756
+ }
57155
57757
  return;
57156
57758
  }
57157
- super.onResponseData(controller, chunk2);
57759
+ return super.onResponseData(this.#controller, chunk2);
57158
57760
  }
57159
57761
  /**
57160
57762
  * @param {Controller} controller
@@ -57168,7 +57770,7 @@ var require_decompress = __commonJS({
57168
57770
  this.#decompressors[0].end();
57169
57771
  return;
57170
57772
  }
57171
- super.onResponseEnd(controller, trailers);
57773
+ return super.onResponseEnd(this.#controller, trailers);
57172
57774
  }
57173
57775
  /**
57174
57776
  * @param {Controller} controller
@@ -57184,7 +57786,7 @@ var require_decompress = __commonJS({
57184
57786
  decompressor.destroy();
57185
57787
  }
57186
57788
  this.#cleanupDecompressors();
57187
- super.onResponseError(controller, err2);
57789
+ super.onResponseError(this.#controller, err2);
57188
57790
  }
57189
57791
  };
57190
57792
  function createDecompressInterceptor(options = {}) {
@@ -57217,6 +57819,18 @@ var require_deduplication_handler = __commonJS({
57217
57819
  * @type {DispatchHandler}
57218
57820
  */
57219
57821
  #primaryHandler;
57822
+ /**
57823
+ * Whether the primary request has started (onRequestStart received). Until
57824
+ * then the request context is unknown and cannot be given to waiting handlers.
57825
+ * @type {boolean}
57826
+ */
57827
+ #requestStarted = false;
57828
+ /**
57829
+ * The primary request context, replayed to waiting handlers so they observe
57830
+ * the same redirect history as the primary.
57831
+ * @type {any}
57832
+ */
57833
+ #context = null;
57220
57834
  /**
57221
57835
  * @type {WaitingHandler[]}
57222
57836
  */
@@ -57285,18 +57899,22 @@ var require_deduplication_handler = __commonJS({
57285
57899
  const waitingHandler = this.#createWaitingHandler(handler);
57286
57900
  const waitingController = waitingHandler.controller;
57287
57901
  try {
57288
- handler.onRequestStart?.(waitingController, null);
57289
- if (waitingController.aborted) {
57290
- waitingHandler.done = true;
57291
- return true;
57292
- }
57293
- if (this.#responseStarted) {
57294
- handler.onResponseStart?.(
57295
- waitingController,
57296
- this.#statusCode,
57297
- this.#headers,
57298
- this.#statusMessage
57299
- );
57902
+ if (this.#requestStarted) {
57903
+ handler.onRequestStart?.(waitingController, this.#context);
57904
+ if (waitingController.aborted) {
57905
+ waitingHandler.done = true;
57906
+ return true;
57907
+ }
57908
+ if (this.#responseStarted) {
57909
+ handler.onResponseStart?.(
57910
+ waitingController,
57911
+ this.#statusCode,
57912
+ this.#headers,
57913
+ this.#statusMessage
57914
+ );
57915
+ }
57916
+ } else {
57917
+ waitingHandler.pendingStart = true;
57300
57918
  }
57301
57919
  } catch {
57302
57920
  waitingHandler.done = true;
@@ -57313,6 +57931,21 @@ var require_deduplication_handler = __commonJS({
57313
57931
  */
57314
57932
  onRequestStart(controller, context) {
57315
57933
  this.#controller = controller;
57934
+ if (!this.#requestStarted) {
57935
+ this.#requestStarted = true;
57936
+ this.#context = context;
57937
+ for (const waitingHandler of this.#waitingHandlers) {
57938
+ if (waitingHandler.pendingStart && !waitingHandler.done && !waitingHandler.controller.aborted) {
57939
+ waitingHandler.pendingStart = false;
57940
+ try {
57941
+ waitingHandler.handler.onRequestStart?.(waitingHandler.controller, context);
57942
+ } catch {
57943
+ waitingHandler.done = true;
57944
+ }
57945
+ }
57946
+ }
57947
+ this.#pruneDoneWaitingHandlers();
57948
+ }
57316
57949
  this.#primaryHandler.onRequestStart?.(controller, context);
57317
57950
  }
57318
57951
  /**
@@ -57450,7 +58083,8 @@ var require_deduplication_handler = __commonJS({
57450
58083
  bufferedChunks: [],
57451
58084
  bufferedBytes: 0,
57452
58085
  pendingTrailers: null,
57453
- done: false
58086
+ done: false,
58087
+ pendingStart: false
57454
58088
  };
57455
58089
  const state = {
57456
58090
  aborted: false,
@@ -59659,6 +60293,7 @@ var require_subresource_integrity = __commonJS({
59659
60293
  "use strict";
59660
60294
  var assert = require("assert");
59661
60295
  var { runtimeFeatures } = require_runtime_features();
60296
+ var { asciiLowercase } = require_infra();
59662
60297
  var validSRIHashAlgorithmTokenSet = /* @__PURE__ */ new Map([["sha256", 0], ["sha384", 1], ["sha512", 2]]);
59663
60298
  var crypto12;
59664
60299
  if (runtimeFeatures.has("crypto")) {
@@ -59681,10 +60316,7 @@ var require_subresource_integrity = __commonJS({
59681
60316
  validSRIHashAlgorithmTokenSet
59682
60317
  )
59683
60318
  );
59684
- var isValidSRIHashAlgorithm = (
59685
- /** @type {IsValidSRIHashAlgorithm} */
59686
- Map.prototype.has.bind(validSRIHashAlgorithmTokenSet)
59687
- );
60319
+ var isValidSRIHashAlgorithm = (algorithm) => validSRIHashAlgorithmTokenSet.has(asciiLowercase(algorithm));
59688
60320
  var bytesMatch = runtimeFeatures.has("crypto") === false || validSRIHashAlgorithmTokenSet.size === 0 ? () => true : (bytes, metadataList) => {
59689
60321
  const parsedMetadata = parseMetadata(metadataList);
59690
60322
  if (parsedMetadata.length === 0) {
@@ -59745,7 +60377,8 @@ var require_subresource_integrity = __commonJS({
59745
60377
  base64Value = algorithmAndValue[1];
59746
60378
  }
59747
60379
  const metadata2 = {
59748
- alg: algorithm,
60380
+ // Possible spec bug?
60381
+ alg: asciiLowercase(algorithm),
59749
60382
  val: base64Value
59750
60383
  };
59751
60384
  result.push(metadata2);
@@ -60794,7 +61427,6 @@ var require_fetch = __commonJS({
60794
61427
  }
60795
61428
  }
60796
61429
  const location = headersList.get("location", true);
60797
- this.body = new Readable2({ read: resume });
60798
61430
  const willFollow = location && request2.redirect === "follow" && redirectStatusSet.has(status);
60799
61431
  const decoders = [];
60800
61432
  if (request2.method !== "HEAD" && request2.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) {
@@ -60802,7 +61434,7 @@ var require_fetch = __commonJS({
60802
61434
  const codings = contentEncoding ? contentEncoding.toLowerCase().split(",") : [];
60803
61435
  const maxContentEncodings = 5;
60804
61436
  if (codings.length > maxContentEncodings) {
60805
- reject(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`));
61437
+ this.abort(new Error(`too many content-encodings in response: ${codings.length}, maximum allowed is ${maxContentEncodings}`));
60806
61438
  return true;
60807
61439
  }
60808
61440
  for (let i = codings.length - 1; i >= 0; --i) {
@@ -60837,6 +61469,7 @@ var require_fetch = __commonJS({
60837
61469
  }
60838
61470
  }
60839
61471
  }
61472
+ this.body = new Readable2({ read: resume });
60840
61473
  const onError = this.onError.bind(this);
60841
61474
  resolve2({
60842
61475
  status,
@@ -61816,8 +62449,12 @@ var require_util4 = __commonJS({
61816
62449
  validateCookiePath(cookie.path);
61817
62450
  out.push(`Path=${cookie.path}`);
61818
62451
  }
61819
- if (cookie.expires && cookie.expires.toString() !== "Invalid Date") {
61820
- out.push(`Expires=${toIMFDate(cookie.expires)}`);
62452
+ if (cookie.expires != null) {
62453
+ const expiresMs = cookie.expires instanceof Date ? cookie.expires.getTime() : cookie.expires;
62454
+ const maxTimeValue = 864e13;
62455
+ if (typeof expiresMs === "number" && Number.isFinite(expiresMs) && Math.abs(expiresMs) <= maxTimeValue) {
62456
+ out.push(`Expires=${toIMFDate(cookie.expires)}`);
62457
+ }
61821
62458
  }
61822
62459
  if (cookie.sameSite) {
61823
62460
  out.push(`SameSite=${cookie.sameSite}`);
@@ -61892,88 +62529,89 @@ var require_parse = __commonJS({
61892
62529
  };
61893
62530
  }
61894
62531
  function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) {
61895
- if (unparsedAttributes.length === 0) {
61896
- return cookieAttributeList;
61897
- }
61898
- assert(unparsedAttributes[0] === ";");
61899
- unparsedAttributes = unparsedAttributes.slice(1);
61900
- let cookieAv = "";
61901
- if (unparsedAttributes.includes(";")) {
61902
- cookieAv = collectASequenceOfCodePointsFast(
61903
- ";",
61904
- unparsedAttributes,
61905
- { position: 0 }
61906
- );
61907
- unparsedAttributes = unparsedAttributes.slice(cookieAv.length);
61908
- } else {
61909
- cookieAv = unparsedAttributes;
61910
- unparsedAttributes = "";
61911
- }
61912
- let attributeName = "";
61913
- let attributeValue = "";
61914
- if (cookieAv.includes("=")) {
61915
- const position = { position: 0 };
61916
- attributeName = collectASequenceOfCodePointsFast(
61917
- "=",
61918
- cookieAv,
61919
- position
61920
- );
61921
- attributeValue = cookieAv.slice(position.position + 1);
61922
- } else {
61923
- attributeName = cookieAv;
61924
- }
61925
- attributeName = attributeName.trim();
61926
- attributeValue = attributeValue.trim();
61927
- if (attributeValue.length > maxAttributeValueSize) {
61928
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61929
- }
61930
- const attributeNameLowercase = attributeName.toLowerCase();
61931
- if (attributeNameLowercase === "expires") {
61932
- const expiryTime = new Date(attributeValue);
61933
- cookieAttributeList.expires = expiryTime;
61934
- } else if (attributeNameLowercase === "max-age") {
61935
- const charCode = attributeValue.charCodeAt(0);
61936
- if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") {
61937
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61938
- }
61939
- if (!/^\d+$/.test(attributeValue)) {
61940
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61941
- }
61942
- const deltaSeconds = Number(attributeValue);
61943
- cookieAttributeList.maxAge = deltaSeconds;
61944
- } else if (attributeNameLowercase === "domain") {
61945
- let cookieDomain = attributeValue;
61946
- if (cookieDomain[0] === ".") {
61947
- cookieDomain = cookieDomain.slice(1);
61948
- }
61949
- cookieDomain = cookieDomain.toLowerCase();
61950
- cookieAttributeList.domain = cookieDomain;
61951
- } else if (attributeNameLowercase === "path") {
61952
- let cookiePath = "";
61953
- if (attributeValue.length === 0 || attributeValue[0] !== "/") {
61954
- cookiePath = "/";
62532
+ while (true) {
62533
+ if (unparsedAttributes.length === 0) {
62534
+ return cookieAttributeList;
62535
+ }
62536
+ assert(unparsedAttributes[0] === ";");
62537
+ unparsedAttributes = unparsedAttributes.slice(1);
62538
+ let cookieAv = "";
62539
+ if (unparsedAttributes.includes(";")) {
62540
+ cookieAv = collectASequenceOfCodePointsFast(
62541
+ ";",
62542
+ unparsedAttributes,
62543
+ { position: 0 }
62544
+ );
62545
+ unparsedAttributes = unparsedAttributes.slice(cookieAv.length);
61955
62546
  } else {
61956
- cookiePath = attributeValue;
61957
- }
61958
- cookieAttributeList.path = cookiePath;
61959
- } else if (attributeNameLowercase === "secure") {
61960
- cookieAttributeList.secure = true;
61961
- } else if (attributeNameLowercase === "httponly") {
61962
- cookieAttributeList.httpOnly = true;
61963
- } else if (attributeNameLowercase === "samesite") {
61964
- const attributeValueLowercase = attributeValue.toLowerCase();
61965
- if (attributeValueLowercase === "none") {
61966
- cookieAttributeList.sameSite = "None";
61967
- } else if (attributeValueLowercase === "strict") {
61968
- cookieAttributeList.sameSite = "Strict";
61969
- } else if (attributeValueLowercase === "lax") {
61970
- cookieAttributeList.sameSite = "Lax";
62547
+ cookieAv = unparsedAttributes;
62548
+ unparsedAttributes = "";
62549
+ }
62550
+ let attributeName = "";
62551
+ let attributeValue = "";
62552
+ if (cookieAv.includes("=")) {
62553
+ const position = { position: 0 };
62554
+ attributeName = collectASequenceOfCodePointsFast(
62555
+ "=",
62556
+ cookieAv,
62557
+ position
62558
+ );
62559
+ attributeValue = cookieAv.slice(position.position + 1);
62560
+ } else {
62561
+ attributeName = cookieAv;
62562
+ }
62563
+ attributeName = attributeName.trim();
62564
+ attributeValue = attributeValue.trim();
62565
+ if (attributeValue.length > maxAttributeValueSize) {
62566
+ continue;
62567
+ }
62568
+ const attributeNameLowercase = attributeName.toLowerCase();
62569
+ if (attributeNameLowercase === "expires") {
62570
+ const expiryTime = new Date(attributeValue);
62571
+ cookieAttributeList.expires = expiryTime;
62572
+ } else if (attributeNameLowercase === "max-age") {
62573
+ const charCode = attributeValue.charCodeAt(0);
62574
+ if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") {
62575
+ continue;
62576
+ }
62577
+ if (!/^\d+$/.test(attributeValue)) {
62578
+ continue;
62579
+ }
62580
+ const deltaSeconds = Number(attributeValue);
62581
+ cookieAttributeList.maxAge = deltaSeconds;
62582
+ } else if (attributeNameLowercase === "domain") {
62583
+ let cookieDomain = attributeValue;
62584
+ if (cookieDomain[0] === ".") {
62585
+ cookieDomain = cookieDomain.slice(1);
62586
+ }
62587
+ cookieDomain = cookieDomain.toLowerCase();
62588
+ cookieAttributeList.domain = cookieDomain;
62589
+ } else if (attributeNameLowercase === "path") {
62590
+ let cookiePath = "";
62591
+ if (attributeValue.length === 0 || attributeValue[0] !== "/") {
62592
+ cookiePath = "/";
62593
+ } else {
62594
+ cookiePath = attributeValue;
62595
+ }
62596
+ cookieAttributeList.path = cookiePath;
62597
+ } else if (attributeNameLowercase === "secure") {
62598
+ cookieAttributeList.secure = true;
62599
+ } else if (attributeNameLowercase === "httponly") {
62600
+ cookieAttributeList.httpOnly = true;
62601
+ } else if (attributeNameLowercase === "samesite") {
62602
+ const attributeValueLowercase = attributeValue.toLowerCase();
62603
+ if (attributeValueLowercase === "none") {
62604
+ cookieAttributeList.sameSite = "None";
62605
+ } else if (attributeValueLowercase === "strict") {
62606
+ cookieAttributeList.sameSite = "Strict";
62607
+ } else if (attributeValueLowercase === "lax") {
62608
+ cookieAttributeList.sameSite = "Lax";
62609
+ }
62610
+ } else {
62611
+ cookieAttributeList.unparsed ??= [];
62612
+ cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`);
61971
62613
  }
61972
- } else {
61973
- cookieAttributeList.unparsed ??= [];
61974
- cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`);
61975
62614
  }
61976
- return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList);
61977
62615
  }
61978
62616
  module2.exports = {
61979
62617
  parseSetCookie,
@@ -61995,7 +62633,7 @@ var require_cookies = __commonJS({
61995
62633
  webidl.argumentLengthCheck(arguments, 1, "getCookies");
61996
62634
  brandChecks(headers);
61997
62635
  const cookie = headers.get("cookie");
61998
- const out = {};
62636
+ const out = { __proto__: null };
61999
62637
  if (!cookie) {
62000
62638
  return out;
62001
62639
  }
@@ -62771,11 +63409,11 @@ var require_connection = __commonJS({
62771
63409
  processResponse(response) {
62772
63410
  if (response.type === "error" || response.status !== 101) {
62773
63411
  if (response.socket?.session == null) {
62774
- failWebsocketConnection(handler, 1002, "Received network error or non-101 status code.", response.error);
63412
+ failHandshake(handler, response, 1002, "Received network error or non-101 status code.", response.error);
62775
63413
  return;
62776
63414
  }
62777
63415
  if (response.status !== 200) {
62778
- failWebsocketConnection(handler, 1002, "Received network error or non-200 status code.", response.error);
63416
+ failHandshake(handler, response, 1002, "Received network error or non-200 status code.", response.error);
62779
63417
  return;
62780
63418
  }
62781
63419
  }
@@ -62784,21 +63422,21 @@ var require_connection = __commonJS({
62784
63422
  warningEmitted = true;
62785
63423
  }
62786
63424
  if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) {
62787
- failWebsocketConnection(handler, 1002, "Server did not respond with sent protocols.");
63425
+ failHandshake(handler, response, 1002, "Server did not respond with sent protocols.");
62788
63426
  return;
62789
63427
  }
62790
63428
  if (response.socket.session == null && response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") {
62791
- failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".');
63429
+ failHandshake(handler, response, 1002, 'Server did not set Upgrade header to "websocket".');
62792
63430
  return;
62793
63431
  }
62794
63432
  if (response.socket.session == null && response.headersList.get("Connection")?.toLowerCase() !== "upgrade") {
62795
- failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".');
63433
+ failHandshake(handler, response, 1002, 'Server did not set Connection header to "upgrade".');
62796
63434
  return;
62797
63435
  }
62798
63436
  const secWSAccept = response.headersList.get("Sec-WebSocket-Accept");
62799
63437
  const digest = crypto12.hash("sha1", keyValue + uid, "base64");
62800
63438
  if (secWSAccept !== digest) {
62801
- failWebsocketConnection(handler, 1002, "Incorrect hash received in Sec-WebSocket-Accept header.");
63439
+ failHandshake(handler, response, 1002, "Incorrect hash received in Sec-WebSocket-Accept header.");
62802
63440
  return;
62803
63441
  }
62804
63442
  const secExtension = response.headersList.get("Sec-WebSocket-Extensions");
@@ -62806,7 +63444,7 @@ var require_connection = __commonJS({
62806
63444
  if (secExtension !== null) {
62807
63445
  extensions = parseExtensions(secExtension);
62808
63446
  if (!extensions.has("permessage-deflate")) {
62809
- failWebsocketConnection(handler, 1002, "Sec-WebSocket-Extensions header does not match.");
63447
+ failHandshake(handler, response, 1002, "Sec-WebSocket-Extensions header does not match.");
62810
63448
  return;
62811
63449
  }
62812
63450
  }
@@ -62814,7 +63452,7 @@ var require_connection = __commonJS({
62814
63452
  if (secProtocol !== null) {
62815
63453
  const requestProtocols = getDecodeSplit("sec-websocket-protocol", request2.headersList);
62816
63454
  if (requestProtocols === null || !requestProtocols.includes(secProtocol)) {
62817
- failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake.");
63455
+ failHandshake(handler, response, 1002, "Protocol was not set in the opening handshake.");
62818
63456
  return;
62819
63457
  }
62820
63458
  }
@@ -62860,6 +63498,12 @@ var require_connection = __commonJS({
62860
63498
  object.readyState = states.CLOSING;
62861
63499
  }
62862
63500
  }
63501
+ function failHandshake(handler, response, code2, reason, cause) {
63502
+ if (response.socket?.session != null && !response.socket.destroyed) {
63503
+ response.socket.destroy();
63504
+ }
63505
+ failWebsocketConnection(handler, code2, reason, cause);
63506
+ }
62863
63507
  function failWebsocketConnection(handler, code2, reason, cause) {
62864
63508
  if (isEstablished(handler.readyState)) {
62865
63509
  closeWebSocketConnection(handler, code2, reason, false);
@@ -63138,6 +63782,15 @@ var require_receiver = __commonJS({
63138
63782
  if (isControlFrame(this.#info.opcode)) {
63139
63783
  this.#loop = this.parseControlFrame(body);
63140
63784
  this.#state = parserStates.INFO;
63785
+ if (this.#loop && this.#handler.socket.writableNeedDrain) {
63786
+ this.#loop = false;
63787
+ this.#handler.socket.once("drain", () => {
63788
+ if (this.destroyed) return;
63789
+ this.#loop = true;
63790
+ this.run(callback);
63791
+ });
63792
+ return;
63793
+ }
63141
63794
  } else {
63142
63795
  if (!this.#info.compressed) {
63143
63796
  if (!this.writeFragments(body)) {
@@ -64313,6 +64966,7 @@ var require_util6 = __commonJS({
64313
64966
  var require_eventsource_stream = __commonJS({
64314
64967
  "node_modules/undici/lib/web/eventsource/eventsource-stream.js"(exports2, module2) {
64315
64968
  "use strict";
64969
+ var buffer = require("buffer");
64316
64970
  var { Transform } = require("stream");
64317
64971
  var { isASCIINumber, isValidLastEventId } = require_util6();
64318
64972
  var BOM = [239, 187, 191];
@@ -64320,24 +64974,28 @@ var require_eventsource_stream = __commonJS({
64320
64974
  var CR = 13;
64321
64975
  var COLON = 58;
64322
64976
  var SPACE = 32;
64977
+ var defaultMaxEventSize = buffer.kStringMaxLength;
64323
64978
  var DATA = Buffer.from("data");
64324
64979
  var EVENT = Buffer.from("event");
64325
64980
  var ID = Buffer.from("id");
64326
64981
  var RETRY = Buffer.from("retry");
64327
- function isASCIINumberBytes(buffer, start) {
64328
- if (start >= buffer.length) {
64982
+ var minParserItems = 1024;
64983
+ var maxParserItems = 131072;
64984
+ var bytesPerParserItem = 128;
64985
+ function isASCIINumberBytes(buffer2, start) {
64986
+ if (start >= buffer2.length) {
64329
64987
  return false;
64330
64988
  }
64331
- for (let i = start; i < buffer.length; i++) {
64332
- if (buffer[i] < 48 || buffer[i] > 57) {
64989
+ for (let i = start; i < buffer2.length; i++) {
64990
+ if (buffer2[i] < 48 || buffer2[i] > 57) {
64333
64991
  return false;
64334
64992
  }
64335
64993
  }
64336
64994
  return true;
64337
64995
  }
64338
- function isValidLastEventIdBytes(buffer, start) {
64339
- for (let i = start; i < buffer.length; i++) {
64340
- if (buffer[i] === 0) {
64996
+ function isValidLastEventIdBytes(buffer2, start) {
64997
+ for (let i = start; i < buffer2.length; i++) {
64998
+ if (buffer2[i] === 0) {
64341
64999
  return false;
64342
65000
  }
64343
65001
  }
@@ -64354,6 +65012,11 @@ var require_eventsource_stream = __commonJS({
64354
65012
  }
64355
65013
  return true;
64356
65014
  }
65015
+ function createMaxEventSizeExceededError() {
65016
+ const error = new Error("EventSource message size exceeded");
65017
+ error.aborted = false;
65018
+ return error;
65019
+ }
64357
65020
  var EventSourceStream = class extends Transform {
64358
65021
  /**
64359
65022
  * @type {eventSourceSettings}
@@ -64380,6 +65043,13 @@ var require_eventsource_stream = __commonJS({
64380
65043
  pos = 0;
64381
65044
  lineChunkIndex = 0;
64382
65045
  linePos = 0;
65046
+ lineLength = 0;
65047
+ eventSize = 0;
65048
+ eventFieldSizes = { data: 0, event: 0, id: 0, retry: 0 };
65049
+ dataLineCount = 0;
65050
+ maxEventSize;
65051
+ maxDataLines;
65052
+ maxBufferedChunks;
64383
65053
  event = {
64384
65054
  data: void 0,
64385
65055
  event: void 0,
@@ -64389,6 +65059,7 @@ var require_eventsource_stream = __commonJS({
64389
65059
  /**
64390
65060
  * @param {object} options
64391
65061
  * @param {boolean} [options.readableObjectMode]
65062
+ * @param {number} [options.maxEventSize]
64392
65063
  * @param {eventSourceSettings} [options.eventSourceSettings]
64393
65064
  * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push]
64394
65065
  */
@@ -64396,6 +65067,10 @@ var require_eventsource_stream = __commonJS({
64396
65067
  options.readableObjectMode = true;
64397
65068
  super(options);
64398
65069
  this.state = options.eventSourceSettings || {};
65070
+ this.maxEventSize = options.maxEventSize ?? defaultMaxEventSize;
65071
+ const parserItemLimit = this.maxEventSize > 0 ? Math.min(maxParserItems, Math.max(minParserItems, Math.floor(this.maxEventSize / bytesPerParserItem))) : 0;
65072
+ this.maxDataLines = parserItemLimit;
65073
+ this.maxBufferedChunks = parserItemLimit;
64399
65074
  if (options.push) {
64400
65075
  this.push = options.push;
64401
65076
  }
@@ -64411,6 +65086,10 @@ var require_eventsource_stream = __commonJS({
64411
65086
  callback();
64412
65087
  return;
64413
65088
  }
65089
+ if (this.maxEventSize > 0 && this.chunks.length >= this.maxBufferedChunks && chunk2[0] !== LF && chunk2[0] !== CR) {
65090
+ callback(createMaxEventSizeExceededError());
65091
+ return;
65092
+ }
64414
65093
  this.chunks.push(chunk2);
64415
65094
  if (this.checkBOM) {
64416
65095
  if (this.handleBOM()) {
@@ -64447,15 +65126,29 @@ var require_eventsource_stream = __commonJS({
64447
65126
  if (byte === CR) {
64448
65127
  this.crlfCheck = true;
64449
65128
  }
64450
- this.parseLine(this.readLine(), this.event);
65129
+ try {
65130
+ this.parseLine(this.readLine(), this.event);
65131
+ } catch (error) {
65132
+ callback(error);
65133
+ return;
65134
+ }
64451
65135
  this.consumeCurrentByte();
64452
65136
  this.eventEndCheck = true;
64453
65137
  continue;
64454
65138
  }
65139
+ if (this.maxEventSize > 0 && ++this.lineLength > this.maxEventSize + 7) {
65140
+ callback(createMaxEventSizeExceededError());
65141
+ return;
65142
+ }
64455
65143
  this.advanceCursor();
64456
65144
  }
64457
65145
  callback();
64458
65146
  }
65147
+ _destroy(error, callback) {
65148
+ this.chunks.length = 0;
65149
+ this.clearEvent();
65150
+ super._destroy(error, callback);
65151
+ }
64459
65152
  /**
64460
65153
  * @param {Buffer} line
64461
65154
  * @param {EventSourceStreamEvent} event
@@ -64478,6 +65171,12 @@ var require_eventsource_stream = __commonJS({
64478
65171
  }
64479
65172
  }
64480
65173
  if (isFieldName(line, fieldLength, DATA)) {
65174
+ if (this.maxEventSize > 0 && this.dataLineCount >= this.maxDataLines) {
65175
+ throw createMaxEventSizeExceededError();
65176
+ }
65177
+ const valueBytes = line.length - valueStart;
65178
+ const dataSize = this.eventFieldSizes.data + (event.data === void 0 ? 0 : 1) + valueBytes;
65179
+ this.setEventFieldSize("data", dataSize);
64481
65180
  const value = line.toString("utf8", valueStart);
64482
65181
  if (event.data === void 0) {
64483
65182
  event.data = value;
@@ -64485,27 +65184,38 @@ var require_eventsource_stream = __commonJS({
64485
65184
  event.data += `
64486
65185
  ${value}`;
64487
65186
  }
65187
+ this.dataLineCount++;
64488
65188
  return;
64489
65189
  }
64490
65190
  if (isFieldName(line, fieldLength, RETRY)) {
64491
65191
  if (isASCIINumberBytes(line, valueStart)) {
65192
+ this.setEventFieldSize("retry", line.length - valueStart);
64492
65193
  event.retry = line.toString("utf8", valueStart);
64493
65194
  }
64494
65195
  return;
64495
65196
  }
64496
65197
  if (isFieldName(line, fieldLength, ID)) {
64497
65198
  if (isValidLastEventIdBytes(line, valueStart)) {
65199
+ this.setEventFieldSize("id", line.length - valueStart);
64498
65200
  event.id = line.toString("utf8", valueStart);
64499
65201
  }
64500
65202
  return;
64501
65203
  }
64502
65204
  if (isFieldName(line, fieldLength, EVENT)) {
64503
- const value = line.toString("utf8", valueStart);
64504
- if (value.length > 0) {
64505
- event.event = value;
65205
+ if (valueStart < line.length) {
65206
+ this.setEventFieldSize("event", line.length - valueStart);
65207
+ event.event = line.toString("utf8", valueStart);
64506
65208
  }
64507
65209
  }
64508
65210
  }
65211
+ setEventFieldSize(field, size) {
65212
+ const eventSize = this.eventSize - this.eventFieldSizes[field] + size;
65213
+ if (this.maxEventSize > 0 && eventSize > this.maxEventSize) {
65214
+ throw createMaxEventSizeExceededError();
65215
+ }
65216
+ this.eventSize = eventSize;
65217
+ this.eventFieldSizes[field] = size;
65218
+ }
64509
65219
  /**
64510
65220
  * @param {EventSourceStreamEvent} event
64511
65221
  */
@@ -64532,6 +65242,12 @@ ${value}`;
64532
65242
  this.event.event = void 0;
64533
65243
  this.event.id = void 0;
64534
65244
  this.event.retry = void 0;
65245
+ this.eventSize = 0;
65246
+ this.dataLineCount = 0;
65247
+ this.eventFieldSizes.data = 0;
65248
+ this.eventFieldSizes.event = 0;
65249
+ this.eventFieldSizes.id = 0;
65250
+ this.eventFieldSizes.retry = 0;
64535
65251
  }
64536
65252
  hasPendingEvent() {
64537
65253
  return this.event.data !== void 0 || this.event.event !== void 0 || this.event.id !== void 0 || this.event.retry !== void 0;
@@ -64556,13 +65272,15 @@ ${value}`;
64556
65272
  syncLineStartToCursor() {
64557
65273
  this.lineChunkIndex = this.chunkIndex;
64558
65274
  this.linePos = this.pos;
65275
+ this.lineLength = 0;
64559
65276
  this.dropConsumedChunks();
64560
65277
  }
64561
65278
  dropConsumedChunks() {
64562
- while (this.lineChunkIndex > 0) {
64563
- this.chunks.shift();
64564
- this.lineChunkIndex--;
64565
- this.chunkIndex--;
65279
+ if (this.lineChunkIndex > 0) {
65280
+ const consumed = this.lineChunkIndex;
65281
+ this.chunks.splice(0, consumed);
65282
+ this.lineChunkIndex = 0;
65283
+ this.chunkIndex -= consumed;
64566
65284
  }
64567
65285
  if (this.chunkIndex === this.chunks.length) {
64568
65286
  this.chunks.length = 0;
@@ -64664,6 +65382,7 @@ var require_eventsource = __commonJS({
64664
65382
  var { isNetworkError } = require_response();
64665
65383
  var { kEnumerableProperty } = require_util();
64666
65384
  var { environmentSettingsObject } = require_util2();
65385
+ var { getGlobalDispatcher } = require_global2();
64667
65386
  var experimentalWarned = false;
64668
65387
  var defaultReconnectionTime = 3e3;
64669
65388
  var CONNECTING = 0;
@@ -64805,6 +65524,7 @@ var require_eventsource = __commonJS({
64805
65524
  this.#state.origin = response.urlList[response.urlList.length - 1].origin;
64806
65525
  const eventSourceStream = new EventSourceStream({
64807
65526
  eventSourceSettings: this.#state,
65527
+ maxEventSize: this.#dispatcher.eventSourceOptions?.maxEventSize,
64808
65528
  push: (event) => {
64809
65529
  this.dispatchEvent(createFastMessageEvent(
64810
65530
  event.type,
@@ -64941,7 +65661,8 @@ var require_eventsource = __commonJS({
64941
65661
  {
64942
65662
  key: "dispatcher",
64943
65663
  // undici only
64944
- converter: webidl.converters.any
65664
+ converter: webidl.converters.any,
65665
+ defaultValue: () => getGlobalDispatcher()
64945
65666
  },
64946
65667
  {
64947
65668
  key: "node",