Skip to content

Commit 6cacc6a

Browse files
committed
feat: upgrade to Mercure 1.0 alpha 3
Publish-side validation is part of the protocol now: report what Update.Validate() rejects (reserved topics and event types, forbidden event IDs, invalid UTF-8 data) as a ValueError carrying the reason, and the dispatch failures as a RuntimeException. The subscribe query parameter becomes "match", so hot reloading advertises its topic with it. The publisher_jwt and subscriber_jwt directives now require the compatibility mode, which drops the audience, expiration and issuer checks: bind the keys to a trusted issuer instead.
1 parent 3122341 commit 6cacc6a

17 files changed

Lines changed: 275 additions & 60 deletions

caddy/caddy_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,6 @@ func TestMetrics(t *testing.T) {
693693
mercure {
694694
transport local
695695
anonymous
696-
publisher_jwt !ChangeMe!
697696
}
698697
699698
php {
@@ -707,7 +706,6 @@ func TestMetrics(t *testing.T) {
707706
mercure {
708707
transport local
709708
anonymous
710-
publisher_jwt !ChangeMe!
711709
}
712710
713711
php {

caddy/frankenphp/Caddyfile

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,20 @@
3030

3131
# Uncomment the following lines to enable Mercure and Vulcain modules
3232
#mercure {
33-
# # Publisher JWT key
34-
# publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG}
35-
# # Subscriber JWT key
36-
# subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG}
33+
# # Trusted issuer: binds the iss claim access tokens must carry to its keys.
34+
# # The localhost default suits local development only: in production, set
35+
# # MERCURE_TRUSTED_ISSUERS to the stable identifier of your token issuer
36+
# # (your app's URL for self-issued tokens).
37+
# issuer {$MERCURE_TRUSTED_ISSUERS:https://localhost} {
38+
# # Publisher JWT key
39+
# publisher {
40+
# jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG}
41+
# }
42+
# # Subscriber JWT key
43+
# subscriber {
44+
# jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG}
45+
# }
46+
# }
3747
# # Allow anonymous subscribers (double-check that it's what you want)
3848
# anonymous
3949
# # Enable the subscription API (double-check that it's what you want)

caddy/go.mod

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ require (
1111
github.com/caddyserver/certmagic v0.25.4
1212
github.com/dunglas/caddy-cbrotli v1.0.1
1313
github.com/dunglas/frankenphp v1.12.7
14-
github.com/dunglas/mercure v0.24.2
15-
github.com/dunglas/mercure/caddy v0.24.2
14+
github.com/dunglas/mercure v1.0.0-alpha.3
15+
github.com/dunglas/mercure/caddy v1.0.0-alpha.3
1616
github.com/dunglas/vulcain/caddy v1.4.2
1717
github.com/prometheus/client_golang v1.24.1
1818
github.com/spf13/cobra v1.10.2
@@ -60,6 +60,7 @@ require (
6060
github.com/dgraph-io/ristretto v0.2.0 // indirect
6161
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da // indirect
6262
github.com/dlclark/regexp2/v2 v2.1.1 // indirect
63+
github.com/dunglas/go-urlpattern v0.0.0-20260716093037-fb05c4998526 // indirect
6364
github.com/dunglas/httpsfv v1.1.0 // indirect
6465
github.com/dunglas/skipfilter v1.0.0 // indirect
6566
github.com/dunglas/vulcain v1.4.2 // indirect
@@ -117,6 +118,7 @@ require (
117118
github.com/mitchellh/reflectwalk v1.0.2 // indirect
118119
github.com/mschoch/smat v0.2.0 // indirect
119120
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
121+
github.com/nlnwa/whatwg-url v0.6.2 // indirect
120122
github.com/oasdiff/yaml v0.1.0 // indirect
121123
github.com/oasdiff/yaml3 v0.0.13 // indirect
122124
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect
@@ -214,7 +216,7 @@ require (
214216
google.golang.org/api v0.283.0 // indirect
215217
google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect
216218
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect
217-
google.golang.org/grpc v1.81.1 // indirect
219+
google.golang.org/grpc v1.82.1 // indirect
218220
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 // indirect
219221
google.golang.org/protobuf v1.36.11 // indirect
220222
gopkg.in/yaml.v3 v3.0.1 // indirect

caddy/go.sum

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ github.com/aws/smithy-go v1.25.1 h1:J8ERsGSU7d+aCmdQur5Txg6bVoYelvQJgtZehD12GkI=
9393
github.com/aws/smithy-go v1.25.1/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
9494
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
9595
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
96+
github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
9697
github.com/bits-and-blooms/bitset v1.24.6 h1:qcrftZUVBIwfs+m+nhoCBAPT+ZPZZjti8SbHbDQQkZ4=
9798
github.com/bits-and-blooms/bitset v1.24.6/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
9899
github.com/caddyserver/caddy/v2 v2.11.4 h1:XKxkMTgNSizEvKG6QHue6cAsFOteU2qA61w2tKkCWi0=
@@ -152,12 +153,18 @@ github.com/dlclark/regexp2/v2 v2.1.1 h1:LCUGyd9Wf+r+VVOl8Ny38JTpWJcAsdVnCIuhhtth
152153
github.com/dlclark/regexp2/v2 v2.1.1/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU=
153154
github.com/dunglas/caddy-cbrotli v1.0.1 h1:mkg7EB1GmoyfBt3kY3mq4o/0bfnBeq7ZLQjmVmdBE3Y=
154155
github.com/dunglas/caddy-cbrotli v1.0.1/go.mod h1:uXABy3tjy1FABF+3JWKVh1ajFvIO/kfpwHaeZGSBaAY=
156+
github.com/dunglas/go-urlpattern v0.0.0-20260716093037-fb05c4998526 h1:biCci7wlx/ChMqOkoUw6FPrhEZYRpulBZ+fO4Geo5Xs=
157+
github.com/dunglas/go-urlpattern v0.0.0-20260716093037-fb05c4998526/go.mod h1:9qyjDljBPOWyWCGz7vo3Ek7cdnoG/DVk0Ucle7gWVS8=
155158
github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54=
156159
github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
157160
github.com/dunglas/mercure v0.24.2 h1:0uKT5XR/tkaGWhwUlXqjWek/0w+dY1n8HEY9Q8YB0hw=
158161
github.com/dunglas/mercure v0.24.2/go.mod h1:BAaiHFKr5+rS5SUP1tJBRXlCjPWZmzy1n0BDlVJnWzY=
162+
github.com/dunglas/mercure v1.0.0-alpha.3 h1:e+u4JpBTMNv0sd3igwSo5RzqSVWuo3E6HOMonhfTP94=
163+
github.com/dunglas/mercure v1.0.0-alpha.3/go.mod h1:7i/xv2fXgCRgoJe/Yj+FYY7YV4VdMGkCpFNJEfFfqCo=
159164
github.com/dunglas/mercure/caddy v0.24.2 h1:QjdJXvyJQaOtrt/LSk4QoCdFmRbyTVMl72bqmAGFPxw=
160165
github.com/dunglas/mercure/caddy v0.24.2/go.mod h1:9e8vEukfn1eq0iHCsBwWWSsHBlNt660L2wUsisnOOWM=
166+
github.com/dunglas/mercure/caddy v1.0.0-alpha.3 h1:l5cfLXIjKsZqNsMYYnYUwk3QYFMxDWb06P9HOn/HL64=
167+
github.com/dunglas/mercure/caddy v1.0.0-alpha.3/go.mod h1:jm1xTnsY4vY20Rc4dDYZI2MNY+IaVQmi5opHWOiuUgs=
161168
github.com/dunglas/skipfilter v1.0.0 h1:JG9SgGg4n6BlFwuTYzb9RIqjH7PfwszvWehanrYWPF4=
162169
github.com/dunglas/skipfilter v1.0.0/go.mod h1:ryhr8j7CAHSjzeN7wI6YEuwoArQ3OQmRqWWVCEAfb9w=
163170
github.com/dunglas/vulcain v1.4.2 h1:Y5iOA/wq8TJuxBPg9tIbTjgoaCrK0hqOETOb3WN1a8U=
@@ -313,6 +320,8 @@ github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
313320
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
314321
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
315322
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
323+
github.com/nlnwa/whatwg-url v0.6.2 h1:jU61lU2ig4LANydbEJmA2nPrtCGiKdtgT0rmMd2VZ/Q=
324+
github.com/nlnwa/whatwg-url v0.6.2/go.mod h1:x0FPXJzzOEieQtsBT/AKvbiBbQ46YlL6Xa7m02M1ECk=
316325
github.com/oasdiff/yaml v0.1.0 h1:0bqZjfKc/8S9urj4JuwepX41WX9EoA6ifhU3SV06cXg=
317326
github.com/oasdiff/yaml v0.1.0/go.mod h1:kOlRmMdL2X3vucLCEQO5u61SU22RysnfXvcttrZA1O0=
318327
github.com/oasdiff/yaml3 v0.0.13 h1:06svmvOHOVBqF81+sY2EUScvUI/iS/vl2VIeUUxZQwg=
@@ -551,6 +560,7 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
551560
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
552561
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
553562
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
563+
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
554564
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
555565
golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw=
556566
golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk=
@@ -573,6 +583,7 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
573583
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
574584
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
575585
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
586+
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
576587
golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE=
577588
golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU=
578589
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
@@ -583,6 +594,7 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
583594
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
584595
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
585596
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
597+
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
586598
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
587599
golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=
588600
golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
@@ -600,6 +612,7 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
600612
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
601613
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
602614
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
615+
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
603616
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
604617
golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
605618
golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
@@ -611,6 +624,7 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
611624
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
612625
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
613626
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
627+
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
614628
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
615629
golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0=
616630
golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w=
@@ -622,6 +636,7 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
622636
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
623637
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
624638
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
639+
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
625640
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
626641
golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs=
627642
golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY=
@@ -648,6 +663,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:
648663
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
649664
google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
650665
google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
666+
google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE=
667+
google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
651668
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 h1:rgSNvqscFZ1JgV/4wH5GOsZFSFkR2Eua9As3KIr2LlM=
652669
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2/go.mod h1:iMEtFwDlAhjDU9L5mY6U1XLwlIId/G3h+QcBHDIvrJ8=
653670
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=

caddy/hotreload.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ func (f *FrankenPHPModule) configureHotReload(app *FrankenPHPApp) error {
4949
}
5050

5151
app.opts = append(app.opts, frankenphp.WithHotReload(f.HotReload.Topic, f.mercureHub, f.HotReload.Watch))
52-
f.preparedEnv["FRANKENPHP_HOT_RELOAD\x00"] = "/.well-known/mercure?topic=" + url.QueryEscape(f.HotReload.Topic)
52+
// "match" is the exact topic matcher of the Mercure protocol, the "topic"
53+
// parameter it replaces is only honored in compatibility mode.
54+
f.preparedEnv["FRANKENPHP_HOT_RELOAD\x00"] = "/.well-known/mercure?match=" + url.QueryEscape(f.HotReload.Topic)
5355

5456
return nil
5557
}

caddy/hotreload_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
func TestHotReload(t *testing.T) {
2121
const topic = "https://frankenphp.dev/hot-reload/test"
2222

23-
u := "/.well-known/mercure?topic=" + url.QueryEscape(topic)
23+
u := "/.well-known/mercure?match=" + url.QueryEscape(topic)
2424

2525
tmpDir := t.TempDir()
2626
indexFile := filepath.Join(tmpDir, "index.php")
@@ -40,7 +40,6 @@ func TestHotReload(t *testing.T) {
4040
http://localhost:`+testPort+` {
4141
mercure {
4242
transport local
43-
subscriber_jwt TestKey
4443
anonymous
4544
}
4645

caddy/mercure.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,32 @@ func createMercureRoute() (caddyhttp.Route, error) {
4848
return caddyhttp.Route{}, errors.New(`the "MERCURE_SUBSCRIBER_JWT_KEY" environment variable must be set to use the Mercure.rocks hub`)
4949
}
5050

51+
// The protocol requires access tokens to name their issuer, so the keys are
52+
// bound to one trusted issuer instead of being set globally.
53+
issuer := os.Getenv("MERCURE_TRUSTED_ISSUERS")
54+
if issuer == "" {
55+
issuer = "https://localhost"
56+
}
57+
5158
mercureRoute := caddyhttp.Route{
5259
HandlersRaw: []json.RawMessage{caddyconfig.JSONModuleObject(
5360
mercureCaddy.Mercure{
54-
PublisherJWT: mercureCaddy.JWTConfig{
55-
Alg: os.Getenv("MERCURE_PUBLISHER_JWT_ALG"),
56-
Key: mercurePublisherJwtKey,
57-
},
58-
SubscriberJWT: mercureCaddy.JWTConfig{
59-
Alg: os.Getenv("MERCURE_SUBSCRIBER_JWT_ALG"),
60-
Key: mercureSubscriberJwtKey,
61+
Issuers: []mercureCaddy.IssuerConfig{
62+
{
63+
Identifier: issuer,
64+
Publisher: mercureCaddy.VerifierConfig{
65+
JWT: mercureCaddy.JWTConfig{
66+
Alg: os.Getenv("MERCURE_PUBLISHER_JWT_ALG"),
67+
Key: mercurePublisherJwtKey,
68+
},
69+
},
70+
Subscriber: mercureCaddy.VerifierConfig{
71+
JWT: mercureCaddy.JWTConfig{
72+
Alg: os.Getenv("MERCURE_SUBSCRIBER_JWT_ALG"),
73+
Key: mercureSubscriberJwtKey,
74+
},
75+
},
76+
},
6177
},
6278
},
6379
"handler",

0 commit comments

Comments
 (0)