$now + 300 || $event['occurred_at'] <= $now - self::MAX_AGE || ! is_string( $event['plugin_version'] ) || strlen( $event['plugin_version'] ) > 32 || 1 !== preg_match( '/^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$/D', $event['plugin_version'] ) || ! is_string( $event['event_name'] ) || ! is_array( $event['payload'] ) ) { return $invalid; } $site_events = array( 'onboarding_started', 'onboarding_completed', 'plugin_deactivated' ); $experiment_states = array( 'experiment_baseline' => array( 'draft', 'running', 'paused', 'winner', 'complete' ), 'experiment_created' => array( 'draft', 'running' ), 'experiment_launched' => array( 'running' ), 'experiment_paused' => array( 'paused' ), 'experiment_resumed' => array( 'running' ), 'experiment_completed' => array( 'complete' ), 'experiment_deleted' => array( 'draft', 'running', 'paused', 'winner', 'complete' ), 'winner_declared' => array( 'winner' ), 'first_impression_recorded' => array( 'running', 'paused', 'winner', 'complete' ), 'both_variants_recorded' => array( 'running', 'paused', 'winner', 'complete' ), 'first_conversion_recorded' => array( 'running', 'paused', 'winner', 'complete' ), 'first_order_attributed' => array( 'running', 'paused', 'winner', 'complete' ), 'first_revenue_attributed' => array( 'running', 'paused', 'winner', 'complete' ), ); $payload = $event['payload']; if ( 'wizard_step_reached' === $event['event_name'] ) { if ( null !== $event['test_ref'] || ! self::exact_keys( $payload, array( 'evidence', 'goal', 'kind', 'session_ref', 'step' ) ) || 'observed' !== $payload['evidence'] || ! in_array( $payload['step'], array( 'select_type', 'select_custom_code_type', 'select_control', 'version_b_source', 'review_versions', 'choose_conversion_type', 'set_destination_url', 'set_scroll_depth', 'select_click_targets', 'summary' ), true ) || ! in_array( $payload['kind'], array( 'unknown', 'page', 'post', 'product', 'reusable_section', 'custom_css', 'custom_html', 'custom_javascript' ), true ) || ! in_array( $payload['goal'], array( 'unknown', 'clicks', 'form', 'destination_url', 'scroll_depth', 'add_to_cart', 'purchase' ), true ) || ! is_string( $payload['session_ref'] ) || 1 !== preg_match( '/^wizard_[a-f0-9]{32}$/D', $payload['session_ref'] ) ) { return $invalid; } } elseif ( in_array( $event['event_name'], $site_events, true ) ) { if ( null !== $event['test_ref'] || ! self::exact_keys( $payload, array( 'evidence' ) ) || 'observed' !== $payload['evidence'] ) { return $invalid; } } else { $keys = array( 'kind', 'goal', 'status', 'evidence' ); if ( 'winner_declared' === $event['event_name'] ) { $keys = array_merge( $keys, array( 'winner', 'winner_basis' ) ); } if ( ! isset( $experiment_states[ $event['event_name'] ] ) || ! is_string( $event['test_ref'] ) || 1 !== preg_match( '/^test_[A-Za-z0-9_-]{43}$/D', $event['test_ref'] ) || ! self::exact_keys( $payload, $keys ) ) { return $invalid; } if ( ! in_array( $payload['kind'], array( 'page', 'post', 'product', 'reusable_section', 'custom_css', 'custom_html', 'custom_javascript' ), true ) || ! in_array( $payload['goal'], array( 'clicks', 'form', 'destination_url', 'scroll_depth', 'add_to_cart', 'purchase' ), true ) || ! in_array( $payload['status'], $experiment_states[ $event['event_name'] ], true ) || ( 'experiment_baseline' === $event['event_name'] ? 'baseline' : 'observed' ) !== $payload['evidence'] ) { return $invalid; } if ( 'winner_declared' === $event['event_name'] && ( ! in_array( $payload['winner'], array( 'A', 'B' ), true ) || 'statistical_decision' !== $payload['winner_basis'] ) ) { return $invalid; } if ( in_array( $event['event_name'], array( 'first_order_attributed', 'first_revenue_attributed' ), true ) && 'purchase' !== $payload['goal'] ) { return $invalid; } } // Canonical ordering makes replay identity independent of JSON key order. ksort( $payload ); $event['payload'] = $payload; ksort( $event ); $json = wp_json_encode( $event, JSON_UNESCAPED_SLASHES ); return is_string( $json ) && strlen( $json ) <= self::MAX_BYTES ? $event : $invalid; } }