Skip to content

Commit b53c296

Browse files
authored
Eventsub websocket update (#217)
* EventSub WebSocket rework * Built basic RPC system for communicating to EventSub WebSocket server, but is flexible for future use * Updated event docs
1 parent 83245ad commit b53c296

File tree

80 files changed

+2757
-1056
lines changed

Some content is hidden

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

80 files changed

+2757
-1056
lines changed

cmd/events.go

+77-34
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import (
1010

1111
"github.com/spf13/cobra"
1212
"github.com/twitchdev/twitch-cli/internal/events"
13-
"github.com/twitchdev/twitch-cli/internal/events/mock_wss_server"
1413
"github.com/twitchdev/twitch-cli/internal/events/trigger"
1514
"github.com/twitchdev/twitch-cli/internal/events/types"
1615
"github.com/twitchdev/twitch-cli/internal/events/verify"
16+
"github.com/twitchdev/twitch-cli/internal/events/websocket"
17+
"github.com/twitchdev/twitch-cli/internal/events/websocket/mock_server"
1718
"github.com/twitchdev/twitch-cli/internal/util"
1819
)
1920

@@ -41,9 +42,18 @@ var (
4142
timestamp string
4243
charityCurrentValue int
4344
charityTargetValue int
44-
debug bool
45-
wssReconnectTest int
46-
sslEnabled bool
45+
clientId string
46+
websocketClient string
47+
)
48+
49+
// websocketCmd-specific flags
50+
var (
51+
wsDebug bool
52+
wsStrict bool
53+
wsClient string
54+
wsSubscription string
55+
wsStatus string
56+
wsReason string
4757
)
4858

4959
var eventCmd = &cobra.Command{
@@ -56,9 +66,9 @@ var triggerCmd = &cobra.Command{
5666
Short: "Creates mock events that can be forwarded to a local webserver for event testing.",
5767
Long: fmt.Sprintf(`Creates mock events that can be forwarded to a local webserver for event testing.
5868
Supported:
59-
%s`, types.AllEventTopics()),
69+
%s`, types.AllWebhookTopics()),
6070
Args: cobra.MaximumNArgs(1),
61-
ValidArgs: types.AllEventTopics(),
71+
ValidArgs: types.AllWebhookTopics(),
6272
Run: triggerCmdRun,
6373
Example: `twitch event trigger subscribe`,
6474
Aliases: []string{
@@ -71,16 +81,34 @@ var verifyCmd = &cobra.Command{
7181
Short: "Mocks the subscription verification event. Can be forwarded to a local webserver for testing.",
7282
Long: fmt.Sprintf(`Mocks the subscription verification event that can be forwarded to a local webserver for testing.
7383
Supported:
74-
%s`, types.AllEventTopics()),
84+
%s`, types.AllWebhookTopics()),
7585
Args: cobra.MaximumNArgs(1),
76-
ValidArgs: types.AllEventTopics(),
86+
ValidArgs: types.AllWebhookTopics(),
7787
Run: verifyCmdRun,
7888
Example: `twitch event verify-subscription subscribe`,
7989
Aliases: []string{
8090
"verify",
8191
},
8292
}
8393

94+
var websocketCmd = &cobra.Command{
95+
Use: "websocket [action]",
96+
Short: `Executes actions regarding the mock EventSub WebSocket server. See "twitch event websocket --help" for usage info.`,
97+
Long: fmt.Sprintf(`Executes actions regarding the mock EventSub WebSocket server.`),
98+
Args: cobra.MaximumNArgs(1),
99+
Run: websocketCmdRun,
100+
Example: fmt.Sprintf(` twitch event websocket start-server
101+
twitch event websocket reconnect
102+
twitch event websocket close --session=e411cc1e_a2613d4e --reason=4006
103+
twitch event websocket subscription --status=user_removed --subscription=82a855-fae8-93bff0`,
104+
),
105+
Aliases: []string{
106+
"websockets",
107+
"ws",
108+
"wss",
109+
},
110+
}
111+
84112
var retriggerCmd = &cobra.Command{
85113
Use: "retrigger",
86114
Short: "Refires events based on the event ID. Can be forwarded to the local webserver for event testing.",
@@ -89,24 +117,19 @@ var retriggerCmd = &cobra.Command{
89117
}
90118

91119
var startWebsocketServerCmd = &cobra.Command{
92-
Use: "start-websocket-server",
93-
Short: `Starts a local websocket server at "ws://localhost:8080/eventsub" or at another preferred port.`,
94-
Run: startWebsocketServerCmdRun,
95-
Example: `twitch event start-websocket-server`,
96-
Aliases: []string{
97-
"ws",
98-
"wss",
99-
},
120+
Use: "start-websocket-server",
121+
Deprecated: `use "twitch event websocket start-server" instead.`,
100122
}
101123

102124
func init() {
103125
rootCmd.AddCommand(eventCmd)
104-
eventCmd.AddCommand(triggerCmd, retriggerCmd, verifyCmd, startWebsocketServerCmd)
126+
127+
eventCmd.AddCommand(triggerCmd, retriggerCmd, verifyCmd, websocketCmd, startWebsocketServerCmd)
105128

106129
// trigger flags
107130
//// flags for forwarding functionality/changing payloads
108-
triggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event.")
109-
triggerCmd.Flags().StringVarP(&transport, "transport", "T", "eventsub", fmt.Sprintf("Preferred transport method for event. Defaults to /EventSub.\nSupported values: %s", events.ValidTransports()))
131+
triggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event (webhook only).")
132+
triggerCmd.Flags().StringVarP(&transport, "transport", "T", "webhook", fmt.Sprintf("Preferred transport method for event. Defaults to /EventSub.\nSupported values: %s", events.ValidTransports()))
110133
triggerCmd.Flags().StringVarP(&secret, "secret", "s", "", "Webhook secret. If defined, signs all forwarded events with the SHA256 HMAC and must be 10-100 characters in length.")
111134

112135
// trigger flags
@@ -128,26 +151,35 @@ func init() {
128151
triggerCmd.Flags().StringVar(&timestamp, "timestamp", "", "Sets the timestamp to be used in payloads and headers. Must be in RFC3339Nano format.")
129152
triggerCmd.Flags().IntVar(&charityCurrentValue, "charity-current-value", 0, "Only used for \"charity-*\" events. Manually set the current dollar value for charity events.")
130153
triggerCmd.Flags().IntVar(&charityTargetValue, "charity-target-value", 1500000, "Only used for \"charity-*\" events. Manually set the target dollar value for charity events.")
154+
triggerCmd.Flags().StringVar(&clientId, "client-id", "", "Manually set the Client ID used in revoke, grant, and bits transaction events.")
155+
triggerCmd.Flags().StringVar(&websocketClient, "session", "", "Defines a specific websocket client/session to forward an event to. Used only with \"websocket\" transport.")
131156

132157
// retrigger flags
133-
retriggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event.")
158+
retriggerCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event (webhook only).")
134159
retriggerCmd.Flags().StringVarP(&eventID, "id", "i", "", "ID of the event to be refired.")
135160
retriggerCmd.Flags().StringVarP(&secret, "secret", "s", "", "Webhook secret. If defined, signs all forwarded events with the SHA256 HMAC and must be 10-100 characters in length.")
136161
retriggerCmd.MarkFlagRequired("id")
137162

138163
// verify-subscription flags
139-
verifyCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event.")
140-
verifyCmd.Flags().StringVarP(&transport, "transport", "T", "eventsub", fmt.Sprintf("Preferred transport method for event. Defaults to EventSub.\nSupported values: %s", events.ValidTransports()))
164+
verifyCmd.Flags().StringVarP(&forwardAddress, "forward-address", "F", "", "Forward address for mock event (webhook only).")
165+
verifyCmd.Flags().StringVarP(&transport, "transport", "T", "webhook", fmt.Sprintf("Preferred transport method for event. Defaults to EventSub.\nSupported values: %s", events.ValidTransports()))
141166
verifyCmd.Flags().StringVarP(&secret, "secret", "s", "", "Webhook secret. If defined, signs all forwarded events with the SHA256 HMAC and must be 10-100 characters in length.")
142167
verifyCmd.Flags().StringVar(&timestamp, "timestamp", "", "Sets the timestamp to be used in payloads and headers. Must be in RFC3339Nano format.")
143168
verifyCmd.Flags().StringVarP(&eventID, "subscription-id", "u", "", "Manually set the subscription/event ID of the event itself.") // TODO: This description will need to change with https://github.com/twitchdev/twitch-cli/issues/184
144169
verifyCmd.MarkFlagRequired("forward-address")
145170

146-
// start-websocket-server flags
147-
startWebsocketServerCmd.Flags().IntVarP(&port, "port", "p", 8080, "Defines the port that the mock EventSub websocket server will run on.")
148-
startWebsocketServerCmd.Flags().BoolVar(&debug, "debug", false, "Set on/off for debug messages for the EventSub WebSocket server.")
149-
startWebsocketServerCmd.Flags().BoolVar(&sslEnabled, "ssl", false, "Sets on/off for SSL. Recommended to keep 'false', as most testing does not require this.")
150-
startWebsocketServerCmd.Flags().IntVarP(&wssReconnectTest, "reconnect", "r", -1, "Used to test WebSocket Reconnect message. Sets delay (in seconds) from first client connection until the reconnect occurs.")
171+
// websocket flags
172+
/// flags for start-server
173+
websocketCmd.Flags().IntVarP(&port, "port", "p", 8080, "Defines the port that the mock EventSub websocket server will run on.")
174+
websocketCmd.Flags().BoolVar(&wsDebug, "debug", false, "Set on/off for debug messages for the EventSub WebSocket server.")
175+
websocketCmd.Flags().BoolVarP(&wsStrict, "require-subscription", "S", false, "Requires subscriptions for all events, and activates 10 second subscription requirement.")
176+
177+
// websocket flags
178+
/// flags for everything else
179+
websocketCmd.Flags().StringVarP(&wsClient, "session", "s", "", "WebSocket client/session to target with your server command. Used in multiple commands.")
180+
websocketCmd.Flags().StringVar(&wsSubscription, "subscription", "", `Subscription to target with your server command. Used with "websocket subscription".`)
181+
websocketCmd.Flags().StringVar(&wsStatus, "status", "", `Changes the status of an existing subscription. Used with "websocket subscription".`)
182+
websocketCmd.Flags().StringVar(&wsReason, "reason", "", `Sets the close reason when sending a Close message to the client. Used with "websocket close".`)
151183
}
152184

153185
func triggerCmdRun(cmd *cobra.Command, args []string) {
@@ -197,6 +229,8 @@ func triggerCmdRun(cmd *cobra.Command, args []string) {
197229
Timestamp: timestamp,
198230
CharityCurrentValue: charityCurrentValue,
199231
CharityTargetValue: charityTargetValue,
232+
ClientID: clientId,
233+
WebSocketClient: websocketClient,
200234
})
201235

202236
if err != nil {
@@ -286,13 +320,22 @@ https://dev.twitch.tv/docs/eventsub/handling-webhook-events#processing-an-event`
286320
}
287321
}
288322

289-
func startWebsocketServerCmdRun(cmd *cobra.Command, args []string) {
290-
wsStr := "ws"
291-
if sslEnabled {
292-
wsStr = "wss"
323+
func websocketCmdRun(cmd *cobra.Command, args []string) {
324+
if len(args) == 0 {
325+
cmd.Help()
326+
return
293327
}
294328

295-
log.Printf("Starting mock EventSub WebSocket servers on %v://localhost:%v/eventsub (alternate on port %v)", wsStr, port, port+1)
296-
log.Printf("`Ctrl + C` to exit mock servers.")
297-
mock_wss_server.StartServer(port, debug, wssReconnectTest, sslEnabled)
329+
if args[0] == "start-server" || args[0] == "start" {
330+
log.Printf("`Ctrl + C` to exit mock WebSocket servers.")
331+
mock_server.StartWebsocketServer(wsDebug, port, wsStrict)
332+
} else {
333+
// Forward all other commands via RPC
334+
websocket.ForwardWebsocketCommand(args[0], websocket.WebsocketCommandParameters{
335+
Client: wsClient,
336+
Subscription: wsSubscription,
337+
SubscriptionStatus: wsStatus,
338+
CloseReason: wsReason,
339+
})
340+
}
298341
}

0 commit comments

Comments
 (0)