Require Dart 3.3 and the latest pkg:web (#326)

diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
index 288c206..60d99a3 100644
--- a/.github/workflows/test-package.yml
+++ b/.github/workflows/test-package.yml
@@ -42,7 +42,7 @@
       fail-fast: false
       matrix:
         os: [ubuntu-latest]
-        sdk: [3.2, dev]
+        sdk: [3.3, dev]
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
       - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d476216..3d75aaf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.4.4
+
+* Require Dart `^3.3`
+* Require `package:web` `^0.5.0`.
+
 ## 2.4.3
 
 - `HtmlWebSocketChannel`: Relax the type of the websocket parameter to the
diff --git a/lib/html.dart b/lib/html.dart
index 5212e20..a96076f 100644
--- a/lib/html.dart
+++ b/lib/html.dart
@@ -8,11 +8,10 @@
 
 import 'package:async/async.dart';
 import 'package:stream_channel/stream_channel.dart';
-import 'package:web/helpers.dart';
+import 'package:web/web.dart';
 
 import 'src/channel.dart';
 import 'src/exception.dart';
-import 'src/web_helpers.dart';
 
 /// A [WebSocketChannel] that communicates using a `dart:html` [WebSocket].
 class HtmlWebSocketChannel extends StreamChannelMixin
@@ -100,7 +99,7 @@
       }
       // The socket API guarantees that only a single open event will be
       // emitted.
-      innerWebSocket.onOpenX.first.then((_) {
+      innerWebSocket.onOpen.first.then((_) {
         _readyCompleter.complete();
         _listen();
       });
@@ -108,7 +107,7 @@
 
     // The socket API guarantees that only a single error event will be emitted,
     // and that once it is no open or message events will be emitted.
-    innerWebSocket.onErrorX.first.then((_) {
+    innerWebSocket.onError.first.then((_) {
       // Unfortunately, the underlying WebSocket API doesn't expose any
       // specific information about the error itself.
       final error = WebSocketChannelException('WebSocket connection failed.');
@@ -119,11 +118,11 @@
       _controller.local.sink.close();
     });
 
-    innerWebSocket.onMessageX.listen(_innerListen);
+    innerWebSocket.onMessage.listen(_innerListen);
 
     // The socket API guarantees that only a single error event will be emitted,
     // and that once it is no other events will be emitted.
-    innerWebSocket.onCloseX.first.then((event) {
+    innerWebSocket.onClose.first.then((event) {
       _closeCode = event.code;
       _closeReason = event.reason;
       _controller.local.sink.close();
diff --git a/lib/src/web_helpers.dart b/lib/src/web_helpers.dart
deleted file mode 100644
index 32b475a..0000000
--- a/lib/src/web_helpers.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:web/helpers.dart';
-
-// TODO(kevmoo): remove when https://github.com/dart-lang/web/commit/4cb5811ed06
-// is in a published release and the min constraint on pkg:web is updated
-extension WebSocketEvents on WebSocket {
-  Stream<Event> get onOpenX => EventStreamProviders.openEvent.forTarget(this);
-  Stream<MessageEvent> get onMessageX =>
-      EventStreamProviders.messageEvent.forTarget(this);
-  Stream<CloseEvent> get onCloseX =>
-      EventStreamProviders.closeEvent.forTarget(this);
-  Stream<Event> get onErrorX =>
-      EventStreamProviders.errorEventSourceEvent.forTarget(this);
-}
diff --git a/pubspec.yaml b/pubspec.yaml
index 2f77f96..99301cb 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_socket_channel
-version: 2.4.3
+version: 2.4.4
 description: >-
   StreamChannel wrappers for WebSockets. Provides a cross-platform
   WebSocketChannel API, a cross-platform implementation of that API that
@@ -7,13 +7,13 @@
 repository: https://github.com/dart-lang/web_socket_channel
 
 environment:
-  sdk: ^3.2.0
+  sdk: ^3.3.0
 
 dependencies:
   async: ^2.5.0
   crypto: ^3.0.0
   stream_channel: ^2.1.0
-  web: ^0.4.0
+  web: ^0.5.0
 
 dev_dependencies:
   dart_flutter_team_lints: ^2.0.0
diff --git a/test/html_test.dart b/test/html_test.dart
index 908e370..98fe43f 100644
--- a/test/html_test.dart
+++ b/test/html_test.dart
@@ -12,9 +12,8 @@
 import 'package:async/async.dart';
 import 'package:stream_channel/stream_channel.dart';
 import 'package:test/test.dart';
-import 'package:web/helpers.dart' hide BinaryType;
+import 'package:web/web.dart' hide BinaryType;
 import 'package:web_socket_channel/html.dart';
-import 'package:web_socket_channel/src/web_helpers.dart';
 import 'package:web_socket_channel/web_socket_channel.dart';
 
 extension on StreamChannel {
@@ -70,7 +69,7 @@
 
   test('communicates using an existing open WebSocket', () async {
     final webSocket = WebSocket('ws://localhost:$port');
-    await webSocket.onOpenX.first;
+    await webSocket.onOpen.first;
 
     final channel = HtmlWebSocketChannel(webSocket);