Skip to content

Commit be0c569

Browse files
authored
Merge pull request #113 from twitchdev/enhancement/websub-deprecation
websub deprecation
2 parents e42e618 + e7d3e5e commit be0c569

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+59
-913
lines changed

cmd/events.go

+21-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"github.com/twitchdev/twitch-cli/internal/events/verify"
1313
)
1414

15+
const websubDeprecationNotice = "Halt! It appears you are trying to use WebSub, which has been deprecated. For more information, see: https://discuss.dev.twitch.tv/t/deprecation-of-websub-based-webhooks/32152"
16+
1517
var (
1618
isAnonymous bool
1719
forwardAddress string
@@ -33,7 +35,7 @@ var (
3335

3436
var eventCmd = &cobra.Command{
3537
Use: "event",
36-
Short: "Used to interface with Event services, such as Eventsub and Websub.",
38+
Short: "Used to interface with EventSub topics.",
3739
}
3840

3941
var triggerCmd = &cobra.Command{
@@ -61,6 +63,9 @@ var verifyCmd = &cobra.Command{
6163
ValidArgs: events.ValidTriggers(),
6264
Run: verifyCmdRun,
6365
Example: `twitch event verify-subscription subscribe`,
66+
Aliases: []string{
67+
"verify",
68+
},
6469
}
6570

6671
var retriggerCmd = &cobra.Command{
@@ -112,6 +117,11 @@ func triggerCmdRun(cmd *cobra.Command, args []string) {
112117
return
113118
}
114119

120+
if transport == "websub" {
121+
fmt.Println(websubDeprecationNotice)
122+
return
123+
}
124+
115125
if secret != "" && (len(secret) < 10 || len(secret) > 100) {
116126
fmt.Println("Invalid secret provided. Secrets must be between 10-100 characters")
117127
return
@@ -154,6 +164,11 @@ func triggerCmdRun(cmd *cobra.Command, args []string) {
154164
}
155165

156166
func retriggerCmdRun(cmd *cobra.Command, args []string) {
167+
if transport == "websub" {
168+
fmt.Println(websubDeprecationNotice)
169+
return
170+
}
171+
157172
if secret != "" && (len(secret) < 10 || len(secret) > 100) {
158173
fmt.Println("Invalid secret provided. Secrets must be between 10-100 characters")
159174
return
@@ -177,6 +192,11 @@ func verifyCmdRun(cmd *cobra.Command, args []string) {
177192
return
178193
}
179194

195+
if transport == "websub" {
196+
fmt.Println(websubDeprecationNotice)
197+
return
198+
}
199+
180200
if secret != "" && (len(secret) < 10 || len(secret) > 100) {
181201
fmt.Println("Invalid secret provided. Secrets must be between 10-100 characters")
182202
return

docs/event.md

+8-9
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Used to either create or send mock events for use with local webhooks testing.
6060
| Flag | Shorthand | Description | Example | Required? (Y/N) |
6161
|---------------------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|-----------------|
6262
| `--forward-address` | `-F` | Web server address for where to send mock events. | `-F https://localhost:8080` | N |
63-
| `--transport` | `-T` | The method used to send events. Default is `eventsub`, but can send using `websub`. | `-T websub` | N |
63+
| `--transport` | `-T` | The method used to send events. Default is `eventsub`. | `-T eventsub` | N |
6464
| `--to-user` | `-t` | Denotes the receiver's TUID of the event, usually the broadcaster. | `-t 44635596` | N |
6565
| `--from-user` | `-f` | Denotes the sender's TUID of the event, for example the user that follows another user or the subscriber to a broadcaster. | `-f 44635596` | N |
6666
| `--gift-user` | `-g` | Used only for subcription-based events, denotes the gifting user ID | `-g 44635596` | N |
@@ -75,9 +75,6 @@ Used to either create or send mock events for use with local webhooks testing.
7575
| `--game-id` | `-G` | Game ID for Drop or other relevant events. | `-G 1234` | N |
7676

7777

78-
79-
**Examples**
80-
8178
```sh
8279
twitch event trigger subscribe -F https://localhost:8080/ // triggers a randomly generated subscribe event and forwards to the localhost:8080 server
8380
twitch event trigger cheer -f 1234 -t 4567 // generates JSON for a cheer event from user 1234 to user 4567
@@ -163,11 +160,13 @@ Allows you to test if your webserver responds to subscription requests properly.
163160

164161
**Flags**
165162

166-
| Flag | Shorthand | Description | Example | Required? (Y/N) |
167-
|---------------------|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------|-----------------|
168-
| `--forward-address` | `-F` | Web server address for where to send mock subscription. | `-F https://localhost:8080` | Y |
169-
| `--secret` | `-s` | Webhook secret. If defined, signs all forwarded events with the SHA256 HMAC and must be 10-100 characters in length. | `-s testsecret` | N |
170-
| `--transport` | `-T` | The method used to send events. Default is eventsub, but can send using websub. | `-T websub` | N |
163+
| Flag | Shorthand | Description | Example | Required? (Y/N) |
164+
|---------------------|-----------|----------------------------------------------------------------------------------------------------------------------|-----------------------------|-----------------|
165+
| `--forward-address` | `-F` | Web server address for where to send mock subscription. | `-F https://localhost:8080` | Y |
166+
| `--secret` | `-s` | Webhook secret. If defined, signs all forwarded events with the SHA256 HMAC and must be 10-100 characters in length. | `-s testsecret` | N |
167+
| `--transport` | `-T` | The method used to send events. Default is `eventsub`. | `-T eventsub` | N |
168+
169+
171170

172171
**Examples**
173172

internal/events/event.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,8 @@ type MockEventResponse struct {
3131
Timestamp string
3232
}
3333

34-
// MockEvent represents an event to be triggered using the `twitch event trigger <event>` command. Given that
35-
// both WebSub and EventSub need to be supported, it's required to have logic for both currently.
34+
// MockEvent represents an event to be triggered using the `twitch event trigger <event>` command.
3635
type MockEvent interface {
37-
3836
// Returns the Mock Response for the given transport
3937
GenerateEvent(p MockEventParameters) (MockEventResponse, error)
4038

internal/events/models.go

+19-19
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@
33
package events
44

55
var triggerSupported = map[string]bool{
6-
"subscribe": true,
7-
"unsubscribe": true,
8-
"gift": true,
9-
"cheer": true,
10-
"transaction": true,
11-
"follow": true,
12-
"add-redemption": true,
13-
"update-redemption": true,
14-
"add-reward": true,
15-
"update-reward": true,
16-
"remove-reward": true,
17-
"add-moderator": true,
18-
"remove-moderator": true,
19-
"ban": true,
20-
"unban": true,
21-
"hype-train-begin": true,
22-
"hype-train-progress": true,
23-
"hype-train-end": true,
6+
"subscribe": true,
7+
"unsubscribe": true,
8+
"gift": true,
9+
"cheer": true,
10+
"transaction": true,
11+
"follow": true,
12+
"add-redemption": true,
13+
"update-redemption": true,
14+
"add-reward": true,
15+
"update-reward": true,
16+
"remove-reward": true,
17+
"add-moderator": true,
18+
"remove-moderator": true,
19+
"ban": true,
20+
"unban": true,
21+
"hype-train-begin": true,
22+
"hype-train-progress": true,
23+
"hype-train-end": true,
2424
}
2525

2626
var transportSupported = map[string]bool{
27-
"websub": true,
27+
"websub": false,
2828
"eventsub": true,
2929
"websockets": false,
3030
}

internal/events/trigger/forward_event.go

-15
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,6 @@ var notificationHeaders = map[string][]header{
4747
HeaderValue: `test`,
4848
},
4949
},
50-
models.TransportWebSub: {
51-
{
52-
HeaderName: `Twitch-Notification-Timestamp`,
53-
HeaderValue: util.GetTimestamp().Format(time.RFC3339Nano),
54-
},
55-
{
56-
HeaderName: `Twitch-Notification-Retry`,
57-
HeaderValue: `0`,
58-
},
59-
},
6050
}
6151

6252
func ForwardEvent(p ForwardParamters) (*http.Response, error) {
@@ -85,8 +75,6 @@ func ForwardEvent(p ForwardParamters) (*http.Response, error) {
8575
case EventSubMessageTypeVerification:
8676
req.Header.Add("Twitch-Eventsub-Message-Type", EventSubMessageTypeVerification)
8777
}
88-
case models.TransportWebSub:
89-
req.Header.Set("Twitch-Notification-Id", p.ID)
9078
}
9179

9280
if p.Secret != "" {
@@ -117,8 +105,5 @@ func getSignatureHeader(req *http.Request, id string, secret string, transport s
117105
mac.Write(prefix)
118106
mac.Write(payload)
119107
req.Header.Set("Twitch-Eventsub-Message-Signature", fmt.Sprintf("sha256=%x", mac.Sum(nil)))
120-
case models.TransportWebSub:
121-
mac.Write(payload)
122-
req.Header.Set("X-Hub-Signature", fmt.Sprintf("sha256=%x", mac.Sum(nil)))
123108
}
124109
}

internal/events/trigger/forward_event_test.go

-25
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,3 @@ func TestForwardEventEventsub(t *testing.T) {
4949

5050
// TODO update test
5151
}
52-
53-
func TestForwardEventWebsub(t *testing.T) {
54-
a := test_setup.SetupTestEnv(t)
55-
56-
secret := "potaytoes"
57-
58-
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
59-
w.WriteHeader(http.StatusAccepted)
60-
61-
body, err := ioutil.ReadAll(r.Body)
62-
a.Nil(err)
63-
a.NotNil(body)
64-
65-
mac := hmac.New(sha256.New, []byte(secret))
66-
67-
mac.Write(body)
68-
69-
hash := fmt.Sprintf("sha256=%x", mac.Sum(nil))
70-
a.Equal(hash, r.Header.Get("X-Hub-Signature"))
71-
}))
72-
defer ts.Close()
73-
74-
// TODO update test
75-
76-
}

internal/events/trigger/trigger_event_test.go

-19
Original file line numberDiff line numberDiff line change
@@ -137,25 +137,6 @@ func TestFire(t *testing.T) {
137137
a.Nil(err)
138138
a.NotEmpty(res)
139139

140-
params = *&TriggerParameters{
141-
Event: "transaction",
142-
Transport: models.TransportWebSub,
143-
IsAnonymous: false,
144-
FromUser: "",
145-
ToUser: "",
146-
GiftUser: "",
147-
Status: "",
148-
ItemID: "",
149-
Cost: 0,
150-
ForwardAddress: ts.URL,
151-
Secret: "potato",
152-
Verbose: false,
153-
Count: 0,
154-
}
155-
res, err = Fire(params)
156-
a.Nil(err)
157-
a.NotEmpty(res)
158-
159140
params = *&TriggerParameters{
160141
Event: "transaction",
161142
Transport: models.TransportEventSub,

internal/events/types/_template/_event_name.go

-10
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,12 @@ import (
1010
)
1111

1212
var transportsSupported = map[string]bool{
13-
models.TransportWebSub: true,
1413
models.TransportEventSub: true,
1514
}
1615

1716
var triggerSupported = []string{"trigger_keyword"}
1817

1918
var triggerMapping = map[string]map[string]string{
20-
models.TransportWebSub: {
21-
"trigger_keyword": "topic_name_ws",
22-
},
2319
models.TransportEventSub: {
2420
"trigger_keyword": "topic_name_es",
2521
},
@@ -40,12 +36,6 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven
4036
if err != nil {
4137
return events.MockEventResponse{}, err
4238
}
43-
case models.TransportWebSub:
44-
body := models.FollowWebSubResponse{} // replace with actual model in internal/models
45-
event, err = json.Marshal(body)
46-
if err != nil {
47-
return events.MockEventResponse{}, err
48-
}
4939
default:
5040
return events.MockEventResponse{}, nil
5141
}

internal/events/types/_template/_event_name_test.go

-20
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,6 @@ func TestEventSub(t *testing.T) {
3333

3434
// write actual tests here (making sure you set appropriate values and the like) for eventsub
3535
}
36-
37-
func TestWebSub(t *testing.T) {
38-
a := test_setup.SetupTestEnv(t)
39-
40-
params := *&events.MockEventParameters{
41-
FromUserID: fromUser,
42-
ToUserID: toUser,
43-
Transport: models.TransportWebSub,
44-
Trigger: "unsubscribe",
45-
}
46-
47-
r, err := Event{}.GenerateEvent(params)
48-
a.Nil(err)
49-
50-
var body models.SubWebSubResponse // replace with actual value
51-
err = json.Unmarshal(r.JSON, &body)
52-
a.Nil(err)
53-
54-
// write tests here for websub
55-
}
5636
func TestFakeTransport(t *testing.T) {
5737
a := test_setup.SetupTestEnv(t)
5838

internal/events/types/authorization/authorization.go

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
)
1414

1515
var transportsSupported = map[string]bool{
16-
models.TransportWebSub: false,
1716
models.TransportEventSub: true,
1817
}
1918

internal/events/types/ban/ban.go

-30
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,12 @@ import (
1212
)
1313

1414
var transportsSupported = map[string]bool{
15-
models.TransportWebSub: true,
1615
models.TransportEventSub: true,
1716
}
1817

1918
var triggerSupported = []string{"ban", "unban"}
2019

2120
var triggerMapping = map[string]map[string]string{
22-
models.TransportWebSub: {
23-
"ban": "moderation.user.ban",
24-
"unban": "moderation.user.unban",
25-
},
2621
models.TransportEventSub: {
2722
"ban": "channel.ban",
2823
"unban": "channel.unban",
@@ -80,31 +75,6 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven
8075
if err != nil {
8176
return events.MockEventResponse{}, err
8277
}
83-
84-
case models.TransportWebSub:
85-
body := *&models.BanWebSubResponse{
86-
Data: []models.BanWebSubResponseData{
87-
{
88-
ID: params.ID,
89-
EventType: triggerMapping[params.Transport][params.Trigger],
90-
EventTimestamp: util.GetTimestamp().Format(time.RFC3339),
91-
Version: "v1",
92-
EventData: models.BanWebSubEventData{
93-
BroadcasterID: params.ToUserID,
94-
BroadcasterUserLogin: params.ToUserName,
95-
BroadcasterName: params.ToUserName,
96-
UserID: params.FromUserID,
97-
UserLogin: params.FromUserName,
98-
UserName: params.FromUserName,
99-
ExpiresAt: util.GetTimestamp().Add(1 * time.Hour).Format(time.RFC3339),
100-
},
101-
},
102-
}}
103-
104-
event, err = json.Marshal(body)
105-
if err != nil {
106-
return events.MockEventResponse{}, err
107-
}
10878
default:
10979
return events.MockEventResponse{}, nil
11080
}

0 commit comments

Comments
 (0)