Better join node?

I’m looking for a better way to join messages than the standard join node.

I’m trying to make my software multi press be more responsive.
When I use the join node I set it up like this:

I expect a maximum of three button presses and you get a total of two seconds (I have a two, five and thirty-two year old that can’t press faster) to do these three button presses.
This also means if I only press once, it takes two seconds for it to react.

What I would want is something like the trigger node where you can extend the delay with each message that arrives.
That would mean I could probably set it to 0.5 or 0.7 seconds and it would be much more responsive.
Does this dream join node exist? Or does anyone have a way to make it more responsive?

I found a post on node red forum that is exactly what I need:

[{"id":"3d20d166.20e64e","type":"function","z":"18c83e13.bcdd42","name":"Count clicks","func":"var count = context.get(\"count\") || 0;\n\nif(msg.count === count && count !== 0){\n context.set(\"count\",0);\n return [null,msg];\n}\n\nif(count < 3){\n if(msg.delay === undefined){\n count++\n context.set(\"count\",count);\n }\n msg.delay = true;\n msg.count = count;\n return [msg,null];\n}\n\n","outputs":2,"noerr":0,"x":430,"y":520,"wires":[["e24258f7.cf6408"],["91d1cd16.daa69"]]},{"id":"27f0311a.6bd7de","type":"inject","z":"18c83e13.bcdd42","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":240,"y":520,"wires":[["3d20d166.20e64e"]]},{"id":"e24258f7.cf6408","type":"delay","z":"18c83e13.bcdd42","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":430,"y":420,"wires":[["3d20d166.20e64e"]]},{"id":"91d1cd16.daa69","type":"debug","z":"18c83e13.bcdd42","name":"output","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":610,"y":540,"wires":[]}]

Now that I’m home I have tried this method for real and it works really well.
Made a slight adjustment to the code to get the count as separate outputs.

Single or double click:

[{"id":"369f09d5301f8e12","type":"function","z":"a787a77.9c16458","name":"Count clicks","func":"var count = context.get(\"count\") || 0;\n\nif(msg.count === count && count !== 0){\n    context.set(\"count\",0);\n    if(msg.count == 1){\n        return [null,msg];\n    }else if(msg.count == 2){\n        return [null,null,msg];\n    }\n}\n\nif(count < 3){\n     if(msg.delay === undefined){\n        count++\n        context.set(\"count\",count);\n     }\n     msg.delay = true;\n     msg.count = count;\n     return [msg,null];\n}\n\n","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":980,"wires":[["ae82c7370bb69a8d"],["e3cccd4158d914d9"],["d2fcd6e1a6abc0ec"]]},{"id":"ae82c7370bb69a8d","type":"delay","z":"a787a77.9c16458","name":"","pauseType":"delay","timeout":"800","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":390,"y":920,"wires":[["369f09d5301f8e12"]]}]

Single, double and triple click:

[{"id":"f71f676548319823","type":"function","z":"a787a77.9c16458","name":"Count clicks","func":"var count = context.get(\"count\") || 0;\n\nif(msg.count === count && count !== 0){\n    context.set(\"count\",0);\n    if(msg.count == 1){\n        return [null,msg];\n    }else if(msg.count == 2){\n        return [null,null,msg];\n    }else{\n        return [null,null,null,msg];\n    }\n}\n\nif(count < 3){\n     if(msg.delay === undefined){\n        count++\n        context.set(\"count\",count);\n     }\n     msg.delay = true;\n     msg.count = count;\n     return [msg,null];\n}\n\n","outputs":4,"noerr":0,"initialize":"","finalize":"","libs":[],"x":830,"y":1820,"wires":[["5d15cc8ae8b271fd"],["26968a0272f131d6","9d887b9008446eb7"],["ebf74253e126824f","9d3b8e0ad4bcd6c2"],["f297e66f233737d1","56d9e798c123ed30"]]},{"id":"5d15cc8ae8b271fd","type":"delay","z":"a787a77.9c16458","name":"","pauseType":"delay","timeout":"800","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":830,"y":1720,"wires":[["f71f676548319823"]]}]