iOS 26: Camera video works but QR/barcode detection (zxing, html5-qrcode) silently fails in all browsers

My team has developed a web application that uses the device’s camera to decode QR codes and barcodes from labels. After the recent iOS 26 update, our application has completely stopped working on devices running this version of iOS. The camera feed works fine (video stream is visible), and we have confirmed that all necessary permissions are granted. However, the barcode/QR code detection engine fails silently, and we have been unable to identify a workaround so far.

Implementation Details:

  • Libraries Used: We are using the ZXing library and the html5-qrcode library for barcode/QR code scanning.

  • Affected Platform: The issue occurs only on iOS 26. Other iOS versions and Android devices work as expected.

  • Browsers Tested: We have tested the application on major browsers available on iOS, including Safari, Chrome, and Firefox. The issue persists across all browsers, so it does not appear to be specific to Safari.

  • Additional Testing: We attempted to disable QR code detection in the iPhone settings (Settings > Camera > Scan QR Codes), but this had no effect on the issue.

Problem:

  • The barcode/QR code detection fails without throwing any errors or logs, making it difficult to debug.
  • No workaround has been found yet.

Question:

Has anyone else encountered a similar issue with barcode/QR code detection on iOS 26 using ZXing or html5-qrcode libraries? If so, were you able to find a solution or workaround? Any insights or suggestions on how to debug or resolve this issue would be greatly appreciated.

Thank you!

*Cookies* sent by server is not Visible from frontEnd (CORS applicable)

The cookies created in server side(HTTP server) isnt visible to FrontEnd script
I have created an Array of Cookies using Set-Cookie inside createServer method

`res.setHeader('Set-Cookie',` [
        'sessionId=abc123; SameSite=None;Secure;',
        'username=ratul; SameSite=None;Secure;',
        'name=Ratul; SameSite=None;Secure;'
    `]);`

According to Cross Origin resource sharing if my domain or PORT is different then i have to used

`"Access-Control-Allow-Origin":'http://X.X.X.X:3000'
 "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
 'Access-Control-Allow-Headers': 'Content-Type,user-agent,X-Client-Header',
 'Access-Control-Allow-Credentials': `'true'`

YES I Have used it and Since my frontend sending CORS request hence i have also used

`'credentials':'include'`

STILL
whensoever i do on (FrontEnd Script)
document.cookie
this gives empty string
OR
res.headers.get('Set-Cookie')
gives
null

I have attached my repo below
HTML_CSS_JS_PRACTICE/HTML_CSS_JS_30/PS3

The cookies sent from the HTTP server:
null

But why? I have done acess-control-allow-credentials:'True'
as Well as credentials:'include'
also exposed that header of set-cookie using access-control-allow-headers

Sorry if i have any misconceptions about HTTP Server headers and cookies
Thank you in advance!

Compress wav size in the javascript client

I am currently recording audio in wav from the browser in my Next application using an extension of the MediaRecorder.
I need the audio to be in wav format in order to use Azure speech services. However, I’d like to also store the audio in a bucket (S3 most likely) for the user to see listen to the audio later. For this I need to have the audio in a compressed format: mp3, webm whatever, because the wav files are too heavy

I was thinking in compressing server side, either in the plain backend or maybe on a lambda function, but it looked like overengineering or heavy processing on the backend.
So I was thinking on doing this compression in the client. How can I do that? The other solutions I found are really old. The only one kinda recent was Lamejs, but I’m not too sure on the state of that package.

JavaScript Array Object, return a keys value in new array [duplicate]

I have an array that contains an object. (I’ve simplified to explain);

playerDB_1 = [];
for(n=0; n<=1000; n++){ 
    playerDB_1[n] = {};
    playerDB_1[n].code = 1000+n;
};

I want to be create a new array with the values of each .code key, thus creating something, result_1 = [1000, 1001, 1002, 1003, 1004 etc.];

I have found this small snippet of code that explains how to do so:

const map = new Map([['key1', 'value1'], ['key2', 'value2']])
const valuesArray = Array.from(map.values())

console.log(valuesArray) // Output: ['value1', 'value2']

But I can’t figure out how to implement it on.

How can I detect if a browser is blocking a new tab or popup when using `window.open` with `noopener`?

Like suggested in the question How can I detect if a browser is blocking a popup? (2008), the return value of the JavaScript function call

window.open("https://example.com/", "_blank", "")

can be used to determine if the popup was blocked; as stated on MDN

null is returned if the browser fails to open the new browsing context, for example because it was blocked by a browser popup blocker.

However, this solution breaks due to the method always returning null when you use noopener under windowFeatures, which is also what you are generally almost always supposed to do when your project is intended for production. noopener is suggested in the question Use window.open but block use of window.opener (2016) to address a security concern.

So how can you still determine if a popup (e.g., opening a new tab) was blocked when calling the following in JavaScript:

window.open("https://example.com/", "_blank", "noopener")`

given that it always returns null?
(Tested in Chrome and Firefox, year 2025)

The MDN documentation doesn’t cover this case, so I fear this might be a bug / design flaw.

Motivation

To clarify an expected use-case, it’s typical for a web app’s functionality to break if any attempts to navigate a user to a different page/domain fail. Critical parts of a user flow may require developers to handle any failure by displaying a warning to the user and teaching them how to allow popups for the current site in their browser.

Note: you can also find this question in the form of a comment in:

Workaround:

This answer suggests a workaround, similar to what an the article Overcoming popup blocking issues (2023) also describes:

function dynamicallyCreateAnchorAndNavigate(url) {
  let a = document.createElement('a');
  a.href = url;
  a.target = "_blank"
  // Note: target="_blank" implies rel="noopener" behavior as per https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#browser_compatibility
  a.rel = "noopener"
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
}

By not using the window.open API, but instead creating a temporary anchor to use its click API, we may avoid some popup blockers.

I don’t know if this is currently a consistent solution across all typical environments and guarantees that no popup blockers will ever block the new page. If so, I think it would indicate a negligence of browsers’ implementations of popup blockers. I welcome any contributions/comments to please update these statements to reflect the current situation.

That said, I believe the Window API provides more functionality than <a>, so the window.open (being the topic of this question) may still be necessary for some use-cases. For example, the popup feature from windowFeatures, i.e. a “minimal popup window”, probably can’t be achieved via <a>.

Chrome extension’s content script trying to use MutationObserver but fails to detect nodes that i want to find

this Chrome extension content script is supposed to run on youtube and try to find elements with tagName YT-THUMBNAIL-VIEW-MODEL.
The script is injected at document_start so that it is executed and i catch every new element

but this is not detecting even a single node.
pls someone help

Note that given code is not wrapped in kind of evenListeners like load, DOMContentLoaded

Code:


function processNodes(nodes) {
    nodes.forEach(node => {
        if (node.nodeType === Node.ELEMENT_NODE && node.tagName === "YT-THUMBNAIL-VIEW-MODEL") {
            console.log(node);
        }
    });
}
    const observer = new MutationObserver((mutationsList, observer) => {
        for (const mutation of mutationsList) {
            if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                processNodes(mutation.addedNodes);
            }
        }
    });


    const targetNode = document.documentElement;
    const config = { childList: true, subtree: true };

    observer.observe(targetNode, config);

I tried a bunch and also asked ais but no help.
was expecting to see new elements that are getting added initially and after I scroll.

React state don’t rerender the component on change?

I’m building a simple chat app in React with a custom hook that fetches chats from a service once a WebSocket client is connected.

The fetch succeeds and I can see the data in the console, but the component still renders chat as null. It only shows the data after I trigger another state update by clicking a button.

here is the useChat hook :

import { useEffect, useState } from "react";
import ChatService from "../services/chat-service";
import { Client } from "@stomp/stompjs";
import Conversation from "../entities/chat/Conversation";
import Account from "../entities/user/Account";
import Message from "../entities/chat/Message";

export default function useChat(){
  const [loading,setLoading] = useState(true)
  const [client,setClient] = useState<Client | null>(null)
  const [chat,setChat] = useState<Conversation[] | null>(null);
  
  useEffect(()=>{
    const initSocket = async ()=>{
      const client = await ChatService.initialSocketConnnection((message)=>{
        console.log(message);
      })
      setClient(client)
    }
    initSocket()
    
    return ()=>{
      client?.deactivate();
      setClient(null);
    }
  },[])
  
  useEffect(()=>{
    if (!client) return;
    
    
    const initChat = async ()=>{
      const chats = await ChatService.getChat()
      console.log('Fetched chats:', chats);
      setChat(chats);
      setLoading(false)
    }
    
    initChat()
    
    return ()=>{
      setChat(null);
      setLoading(true)
    }
  }, [client])
  
  const sendMessage = (destination:Account,message:Message) => {
    if(!client) return
    ChatService.sendMessage(destination.username,message,client);
  }
  
  return {sendMessage,loading,chat}
}

and here is the Chat component

import { useState } from "react"
import Card from "../components/ui/Card"
import useChat from "../hooks/useChat"

export default function Chat(){
    const {sendMessage,loading,chat} = useChat()
    const [test,setTest]= useState<number | undefined>(0);
    
    if(loading) return <>Loading</>
    return <div className="w-full h-full bg-background-light dark:bg-background-dark flex ">
                <div className="w-2/6 h-full min-w-100 max-w-140 border-r border-border-light dark:border-border-dark flex flex-col">
                    <div className="w-full border-b border-border-light dark:border-border-dark p-4 flex items-center justify-between">
                        <h1 className="text-xl font-semibold ">Messages</h1>
                        <Card className="px-2 py-1 shadow-none border-none *:cursor-pointer">
                            <button  className="text-xl ">
                                <i className="fa-solid fa-plus"></i>
                            </button>
                        </Card>
                    </div>
                    <div className="flex-1 overflow-scroll ">
                        {loading?"loading":"not Loading"}
                        {Array.isArray(chat) && chat.length > 0 ? (
                            chat.map((element, index) => (
                                <h1 key={index}>{JSON.stringify(element)}</h1>
                            ))
                            ) : (
                            <p>No chats yet</p>
                            )}
                        
                        {test}
                        <br></br>
                        <button onClick={()=>{setTest(chat?.length)}}>
                            Increment
                        </button>
                    </div>
                </div>
                <div className="flex-1 h-full">
                  
                </div>

        </div>
}

When using this with and redirect back to the page after successful operation the ckeditor is not loading

I Am using ckeditor 5 and here is my configuration. which is working good when i first load the page but i click on the submit button and server redirect me on same page this is no longer working here.

<script type="importmap">
    {
        "imports": {
            "ckeditor5": "{{ asset('assets/ckeditor5/ckeditor5.js') }}",
            "ckeditor5/": "{{ asset('assets/ckeditor5/') }}"
        }
    }
</script>
<script type="module">
    import {
        ClassicEditor,
        AccessibilityHelp,
        Alignment,
        AutoLink,
        Autosave,
        BlockQuote,
        Bold,
        CodeBlock,
        Essentials,
        Font,
        GeneralHtmlSupport,
        Heading,
        HorizontalLine,
        Indent,
        IndentBlock,
        Italic,
        Link,
        Paragraph,
        SelectAll,
        Style,
        Table,
        TableCaption,
        TableCellProperties,
        TableColumnResize,
        TableProperties,
        TableToolbar,
        Undo
    } from 'ckeditor5';

    let ckEditors = document.querySelectorAll(".ckeditor");

    ckEditors.forEach((editor) => {
        ClassicEditor
            .create(editor, {
                plugins: [AccessibilityHelp, Alignment,
                    AutoLink,
                    Autosave,
                    BlockQuote,
                    Bold,
                    CodeBlock,
                    Essentials,
                    Font,
                    GeneralHtmlSupport,
                    Heading,
                    HorizontalLine,
                    Indent,
                    IndentBlock,
                    Italic,
                    Link,
                    Paragraph,
                    SelectAll,
                    Style,
                    Table,
                    TableCaption,
                    TableCellProperties,
                    TableColumnResize,
                    TableProperties,
                    TableToolbar,
                    Undo
                ],
                toolbar: {
                    items: ['undo',
                        'redo',
                        '|',
                        'bold',
                        'italic',
                        '|',
                        '|',
                        'heading',
                        '|',
                        'fontSize',
                        'fontFamily',
                        'fontColor',
                        'fontBackgroundColor',
                        '|',
                        'indent',
                        'outdent',
                        'alignment',
                        '|',
                        'horizontalLine',
                        'link',
                        'insertTable',
                        'blockQuote',
                        '|',


                    ]

                }
            })
            .then(editor => {
                window.editor = editor;
            })
            .catch(error => {
                console.error(error);
            });
    });
</script>

When redirect back to the page it gives me error

Error

Uncaught TypeError: The specifier “ckeditor5” was a bare specifier, but was not remapped to anything. Relative module specifiers must start with “./”, “../” or “/”.

How to do custom plugin with custom parameters?

We have a TypeDoc custom plugin called CustomPlugin and I wish to pass custom parameters into that plugin, therefore it appears I cannot add its name as a string to the plugin option.

After running Appplication.bootstrapWithPlugins, I call the plugin as a function CustomPlugin(params). The issue I am having is my plugin requires that the JSON output has already been written and is accessible for use inside the plugin. The JSON output can only be called after convert is called and the project instance becomes available.

app.convert.addUnknownSymbolResolver has to be set before app.convert() is called or the plugin will fail to resolve these unknown symbols. I have set this inside the CustomPlugin.

This is a NX Monorepo with multiply projects inside and TypeDoc is called against many of them in the right order using dependsOn in nx.json.

const app = await Application.bootstrapWithPlugins({
  { ...options },
  [...readers]
});

// I need the generated **my-path.json** available in here to access the symbolIdMap
// We actually also use other projects **my-path.json** as well in here
// We build the projects in the right order using dependOn in the nx.json file
load(params); // CustomPlugin

const project = app.convert();

await app.generateJson(project, 'my-path.json');

I have implemented a double pass which works fine but was looking for other solutions.

Sound delay on the npm module node-wav-player

I’m using a typewriter effect and want to make a sound for every letter like the movie letter sound. I want to use the CMD program in Windows 11 to make a chatbot that runs with the command node chatbot.js. I don’t want it to run in the browser but in node.js. I have tryed to ask the ChatGPT but with no luck. I’m using the node-wav-player and it works; but the sound is delayed and not stabile. On the repo on GitHub they mention the require method; but I want the import method.

How to integrate N-Genius payment inline (on WooCommerce checkout) without redirecting to N-Genius page? [closed]

I am working on a custom integration of N-Genius payment gateway in my WordPress + WooCommerce site.

By default, the N-Genius flow redirects the customer to the N-Genius hosted payment page to enter card details.
But I want the payment form (card number, expiry, CVV) to appear inline / on-site / directly on my WooCommerce checkout page — without sending the user to the N-Genius page.

What I have tried:

I am already loading the N-Genius SDK on my checkout page.

I tried rendering the custom card fields, but WooCommerce checkout JavaScript interferes and prevents them from showing.

If I disable WooCommerce checkout scripts, the card fields work fine (but then checkout breaks).

I also attempted moving the N-Genius init script to wp_footer, but still no luck.

Support die/exit on FrankenPHP(Caddy) worker mode

My PHP app runs on a Caddy webserver, over a FrankenPHP container (Dunglas image). It runs in worker mode.

Unfortunately, it seems that workers prevent abrupted interruptions of the process. So is not possible to use die(); or exit();.
When using those to get debug output, FrankenPHP doesn’t stop but goes in an infinite loop of reloading the page (and re-logging the exception).

Is there any option/configuration to make the process effectively “die” or “exit” execution (and show me the debug data)?

PHP/Apache proxy somehow tells browser the content is mixed [closed]

I’ve been trying to make a proxy for a web-game I’ve been working on. The game’s engine demands all requests to the game’s server to be HTTPS, which I’m incapable of doing at the moment. To bypass that I’m using the proxy in the form of a php script on the web server the game’s client is hosted on. For some reason though, when the request to the proxy is made, proxy somehow tells browser that the resource it’s accessing is not on HTTPS. I’d like to avoid this behavior, but I don’t know whether it’s due to PHP or due to Apache. Proxy’s code is a basic cURL request to the game server ip, which is then simply echoed into the proxy’s page

Edit: here’s the proxy file’s code:

<?php
function curlPost($url, $data = NULL, $headers = []) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); //timeout in seconds
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_ENCODING, 'identity');

    
    if (!empty($data)) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    $response = curl_exec($ch);
    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}

echo curlPost("http://[server_ip]/" . ($_SERVER['REQUEST_METHOD'] == "POST" ? $_POST : $_GET)["resource"], json_encode($_SERVER['REQUEST_METHOD'] == "POST" ? $_POST : $_GET, JSON_FORCE_OBJECT));

Edit 2: The error browser throws is as follows:

The page at ‘https://[game_webpage]/’ was loaded over HTTPS, but
requested an insecure resource ‘http://[server_ip]’. This request has
been blocked; the content must be served over HTTPS.

Regex to only add missing quotes to HTML attributes?

The Missing Attribute Quotes Problem:

I have HTML emails with clearly copy/pasted code where the original… authors, failed to add double quotes around the values of some HTML attributes. This leads to the parser disregarding those attributes and breaking the emails.

Examples:

  • border=0
  • cellpadding=0
  • cellspacing=0
  • width=480

An example string to be fixed:

<table border=0 style="color: red;" title='Hello'></table>

An example of the string after being fixed:

<table border="0" style="color: red;" title='Hello'></table>

Determining the Regular Expression Logic

I know how to find and replace one or more consecutive characters. What I do not know is how to find and replace two sets of strings in a single regular expression and the whole grouping part:

$string = str_ireplace(array('_','--'),array('-','-'), '$string');

I believe the pattern logic should be:

  1. First if < been encountered but not >? (we are within an element).
  2. Second if the first space is encountered (the element name).
  3. Third if = has been encountered but also the next immediate character is not a quote.
  4. Fourth if after (.*?) (I think, for the value itself) is a space encountered?

Some Attempts:

I’ve been going through pages here on Stack and other websites for a few hours though no one, that I’ve come across, has even bothered to work out the logic forget about working on syntax. So with the logic worked out I have some small parts figured out:

  • preg_replace('/<(.*?)( )/u', '', $s) will replace the element (regardless of it’s tag name) but delete everything up to the first attribute. So I don’t know how to write “do nothing here but make sure it exists” so we’re only applying the expression to attributes assuming the HTML author at least got the < and > formatting correct.
  • preg_replace('/^=(.*?)( )$/u', '', $s) was my attempt to ^ start a match at = and end $ it with a space however this just deletes the entire string.

I can’t get the second part figured out. Then I presume there is a way to group the two individual expressions together.

Question:

How do I update my regular expression to append double quotes to HTML attributes only if they’re missing quotes?

Clarifications:

  1. I absolutely do not want to do anything else with regular expressions here. I believe my goal is reasonably simple (as opposed to something very expansive like this). I figured that the pattern is established enough and possibly not too complex for others with greater experience with regular expressions than I. If I can’t figure this out or get enough help I can just write my own parser just to resolve this issue.
  2. I attempted to use $dom = new DOMDocument; $dom->loadHTML($html); $xml = trim($dom->saveXml($dom)); and that did add the missing quotes, but this is HTML from email that triggered tons of errors from other malformed syntax problems so ultimately it was an interesting though non-viable approach.
  3. To keep it as simple as possible I’m content to ignore single quotes.
  4. If this gets figured out I should be able to easily adapt this to make a second version to replace single quotes with double quotes (or vice-versa) for parsing consistency.

Why Upon failure SQS does not place the failed message upon DLQ?

I am running this worker:

php -d memory_limit=-1 bin/console messenger:consume sqs_channel_manager -vv

And worker fails:

14:29:32 INFO      [messenger] Received message AppDomainEventChannelManagerChannelManagerEventHasReceived ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived"]
14:29:32 WARNING   [messenger] Error thrown while handling message AppDomainEventChannelManagerChannelManagerEventHasReceived. Sending for retry #1 using 922 ms delay. Error: "Handling "AppDomainEventChannelManagerChannelManagerEventHasReceived" failed: " ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived","message_id" => null,"retryCount" => 1,"delay" => 922,"error" => "Handling "AppDomainEventChannelManagerChannelManagerEventHasReceived" failed: ","exception" => SymfonyComponentMessengerExceptionHandlerFailedException^ { …}]
14:29:37 INFO      [messenger] Received message AppDomainEventChannelManagerChannelManagerEventHasReceived ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived"]
14:29:37 WARNING   [messenger] Error thrown while handling message AppDomainEventChannelManagerChannelManagerEventHasReceived. Sending for retry #3 using 3676 ms delay. Error: "Handling "AppDomainEventChannelManagerChannelManagerEventHasReceived" failed: " ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived","message_id" => null,"retryCount" => 3,"delay" => 3676,"error" => "Handling "AppDomainEventChannelManagerChannelManagerEventHasReceived" failed: ","exception" => SymfonyComponentMessengerExceptionHandlerFailedException^ { …}]
14:30:08 INFO      [messenger] Received message AppDomainEventChannelManagerChannelManagerEventHasReceived ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived"]
14:30:08 CRITICAL  [messenger] Error thrown while handling message AppDomainEventChannelManagerChannelManagerEventHasReceived. Removing from transport after 5 retries. Error: "Handling "AppDomainEventChannelManagerChannelManagerEventHasReceived" failed: " ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived","message_id" => null,"retryCount" => 5,"error" => "Handling "AppDomainEventChannelManagerChannelManagerEventHasReceived" failed: ","exception" => SymfonyComponentMessengerExceptionHandlerFailedException^ { …}]
14:30:08 INFO      [messenger] Rejected message AppDomainEventChannelManagerChannelManagerEventHasReceived will be sent to the failure transport SymfonyComponentMessengerBridgeDoctrineTransportDoctrineTransport. ["class" => "AppDomainEventChannelManagerChannelManagerEventHasReceived","transport" => "SymfonyComponentMessengerBridgeDoctrineTransportDoctrineTransport"]

The transports sqs_channel_manager is configured like this:

framework:
    messenger:
        failure_transport: failed
        transports:
            failed: 'doctrine://default?table_name=failed_messages'
            sqs_channel_manager:
              dsn: 'https://sqs.eu-north-1.amazonaws.com/XXXXXX/sqs_channel_manager_test'
              serializer: AppInfrastructureMessengerChannelManagerSerializer
              options:
                  access_key: '%env(AWS_ACCESS_KEY_ID)%'
                  secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
                  region: '%env(AWS_REGION)%'
                  queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'

And is an SQS queue The queue has a redrive policy:

aws sqs get-queue-attributes --queue-url https://sqs.eu-north-1.amazonaws.com/XXXXXX/sqs_channel_manager_test --attribute-names RedrivePolicy
{
    "Attributes": {
        "RedrivePolicy": "{"deadLetterTargetArn":"arn:aws:sqs:eu-north-1:XXXXX:sqs_channel_manager_test_dlq","maxReceiveCount":1}"
    }
}

But upon failure message is not placed upon Deal letter queue:

aws sqs get-queue-attributes --queue-url https://sqs.eu-north-1.amazonaws.com/XXXXXXXX/sqs_channel_manager_test_dlq  --attribute-names ApproximateNumberOfMessages
{
    "Attributes": {
        "ApproximateNumberOfMessages": "0"
    }
}

Does failure_transport prevents the message to be placed upon DLQ? Setting failure_transport has no effect:

            sqs_channel_manager:
              failure_transport: null
              dsn: '%env(SQS_CHANNEL_MANAGER_TRANSPORT_DSN)%'
              serializer: AppInfrastructureMessengerChannelManagerSerializer
              options:
                  access_key: '%env(AWS_ACCESS_KEY_ID)%'
                  secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
                  region: '%env(AWS_REGION)%'
                  queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'

Also I am using custom serializer:

<?php
declare(strict_types=1);

namespace AppInfrastructureMessenger;

use AppDomainEventChannelManagerChannelManagerEventHasReceived;
use SymfonyComponentMessengerEnvelope;
use SymfonyComponentMessengerStampRedeliveryStamp;
use SymfonyComponentMessengerStampTransportMessageIdStamp;
use SymfonyComponentMessengerTransportSerializationSerializerInterface;

class ChannelManagerSerializer implements SerializerInterface
{
    public function decode(array $encodedEnvelope): Envelope
    {
        $data = json_decode($encodedEnvelope['body'], true);

        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new InvalidArgumentException(
                'Invalid JSON received from SQS: ' . json_last_error_msg()
            );
        }

        $envelope = new Envelope(new ChannelManagerEventHasReceived($data));

        if (isset($encodedEnvelope['headers']['stamps'])) {
            $stamps = unserialize(base64_decode($encodedEnvelope['headers']['stamps']));
            foreach ($stamps as $stamp) {
                $envelope = $envelope->with($stamp);
            }
        }

        return $envelope;
    }

    public function encode(Envelope $envelope): array
    {
        $event = $envelope->getMessage();

        $stampsToSerialize = [];

        foreach ($envelope->all() as $stampArray) {
            foreach ($stampArray as $stamp) {
                if ($stamp instanceof RedeliveryStamp || $stamp instanceof TransportMessageIdStamp) {
                    $stampsToSerialize[] = $stamp;
                }
            }
        }

        return [
            'body' => json_encode($event->channelManagerData, JSON_THROW_ON_ERROR),
            'headers' => [
                'stamps' => base64_encode(serialize($stampsToSerialize)),
            ],
        ];
    }
}

Does it affect a message entering DLQ? I am using Symfony 7.2, it this a known issue?