Skip to content

Commit f9aaa81

Browse files
author
lleadbet
committed
websub deprecation
1 parent d628aaa commit f9aaa81

Some content is hidden

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

53 files changed

+54
-907
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
// Validate that the forward address is actually a URL
116126
if len(forwardAddress) > 0 {
117127
_, err := url.ParseRequestURI(forwardAddress)
@@ -149,6 +159,11 @@ func triggerCmdRun(cmd *cobra.Command, args []string) {
149159
}
150160

151161
func retriggerCmdRun(cmd *cobra.Command, args []string) {
162+
if transport == "websub" {
163+
fmt.Println(websubDeprecationNotice)
164+
return
165+
}
166+
152167
res, err := trigger.RefireEvent(eventID, trigger.TriggerParameters{
153168
ForwardAddress: forwardAddress,
154169
Secret: secret,
@@ -167,6 +182,11 @@ func verifyCmdRun(cmd *cobra.Command, args []string) {
167182
return
168183
}
169184

185+
if transport == "websub" {
186+
fmt.Println(websubDeprecationNotice)
187+
return
188+
}
189+
170190
// Validate that the forward address is actually a URL
171191
if len(forwardAddress) > 0 {
172192
_, err := url.ParseRequestURI(forwardAddress)

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
}

internal/events/types/ban/ban_test.go

-38
Original file line numberDiff line numberDiff line change
@@ -52,44 +52,6 @@ func TestEventSubBan(t *testing.T) {
5252
a.Equal(fromUser, body.Event.UserID, "Expected from user %v, got %v", fromUser, body.Event.UserID)
5353
}
5454

55-
func TestWebSubBan(t *testing.T) {
56-
a := test_setup.SetupTestEnv(t)
57-
58-
params := *&events.MockEventParameters{
59-
FromUserID: fromUser,
60-
ToUserID: toUser,
61-
Transport: models.TransportWebSub,
62-
Trigger: "ban",
63-
}
64-
65-
r, err := Event{}.GenerateEvent(params)
66-
a.Nil(err)
67-
68-
var body models.BanWebSubResponse
69-
err = json.Unmarshal(r.JSON, &body)
70-
a.Nil(err)
71-
72-
a.Equal(toUser, body.Data[0].EventData.BroadcasterID, "Expected to user %v, got %v", toUser, body.Data[0].EventData.BroadcasterID)
73-
a.Equal(fromUser, body.Data[0].EventData.UserID, "Expected from user %v, got %v", fromUser, body.Data[0].EventData.UserID)
74-
75-
params = *&events.MockEventParameters{
76-
FromUserID: fromUser,
77-
ToUserID: toUser,
78-
Transport: models.TransportWebSub,
79-
Trigger: "unban",
80-
}
81-
82-
r, err = Event{}.GenerateEvent(params)
83-
a.Nil(err)
84-
85-
err = json.Unmarshal(r.JSON, &body)
86-
a.Nil(err)
87-
88-
a.Equal(toUser, body.Data[0].EventData.BroadcasterID, "Expected to user %v, got %v", toUser, body.Data[0].EventData.BroadcasterID)
89-
a.Equal(fromUser, body.Data[0].EventData.UserID, "Expected from user %v, got %v", fromUser, body.Data[0].EventData.UserID)
90-
91-
}
92-
9355
func TestFakeTransport(t *testing.T) {
9456
a := test_setup.SetupTestEnv(t)
9557

internal/events/types/channel_points_redemption/redemption_event.go

-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ package channel_points_redemption
44

55
import (
66
"encoding/json"
7-
"errors"
87
"time"
98

109
"github.com/twitchdev/twitch-cli/internal/events"
@@ -13,7 +12,6 @@ import (
1312
)
1413

1514
var transportsSupported = map[string]bool{
16-
models.TransportWebSub: false,
1715
models.TransportEventSub: true,
1816
}
1917

@@ -91,9 +89,6 @@ func (e Event) GenerateEvent(params events.MockEventParameters) (events.MockEven
9189
if err != nil {
9290
return events.MockEventResponse{}, err
9391
}
94-
95-
case models.TransportWebSub:
96-
return events.MockEventResponse{}, errors.New("Websub is unsupported for channel points events")
9792
default:
9893
return events.MockEventResponse{}, nil
9994
}

0 commit comments

Comments
 (0)