diff --git a/CHANGELOG.md b/CHANGELOG.md
index b0d0877..a0982c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,14 @@
 * `LinkedList` made it explicit that elements are compared by identity,
   and updated `contains` to take advantage of this.
 
+#### `dart:html`
+
+* `EventStreamSubscription.cancel` has been updated to retain its synchronous
+  timing when running in both sound and unsound null safety modes. See issue
+  [#44157][] for more details.
+
+[#44157]: https://github.com/dart-lang/sdk/issues/44157
+
 ### Dart VM
 
 *   **Breaking Change** [#42312][]: `Dart_WeakPersistentHandle`s will no longer
diff --git a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
index e66c221..3e2a88f 100644
--- a/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/available_suggestion_sets_test.dart
@@ -111,6 +111,72 @@
 ''');
   }
 
+  Future<void> test_suggestion_class_part() async {
+    var a_path = convertPath('/home/test/lib/a.dart');
+    var b_path = convertPath('/home/test/lib/b.dart');
+    var a_uriStr = 'package:test/a.dart';
+
+    newFile(a_path, content: r'''
+part 'b.dart';
+class A {}
+''');
+
+    newFile(b_path, content: r'''
+part of 'a.dart';
+class B {}
+''');
+
+    var set = await waitForSetWithUri(a_uriStr);
+    assertJsonText(_getSuggestion(set, 'A', kind: ElementKind.CLASS), '''
+{
+  "label": "A",
+  "declaringLibraryUri": "package:test/a.dart",
+  "element": {
+    "kind": "CLASS",
+    "name": "A",
+    "location": {
+      "file": ${jsonOfPath(a_path)},
+      "offset": 21,
+      "length": 0,
+      "startLine": 2,
+      "startColumn": 7
+    },
+    "flags": 0
+  },
+  "relevanceTags": [
+    "ElementKind.CLASS",
+    "package:test/a.dart::A",
+    "A"
+  ]
+}
+''');
+
+    // We should not get duplicate relevance tags.
+    assertJsonText(_getSuggestion(set, 'B', kind: ElementKind.CLASS), '''
+{
+  "label": "B",
+  "declaringLibraryUri": "package:test/a.dart",
+  "element": {
+    "kind": "CLASS",
+    "name": "B",
+    "location": {
+      "file": ${jsonOfPath(b_path)},
+      "offset": 24,
+      "length": 0,
+      "startLine": 2,
+      "startColumn": 7
+    },
+    "flags": 0
+  },
+  "relevanceTags": [
+    "ElementKind.CLASS",
+    "package:test/a.dart::B",
+    "B"
+  ]
+}
+''');
+  }
+
   Future<void> test_suggestion_enum() async {
     var path = convertPath('/home/test/lib/a.dart');
     var uriStr = 'package:test/a.dart';
@@ -307,7 +373,9 @@
   }
 
   static AvailableSuggestion _getSuggestion(
-      AvailableSuggestionSet set, String label) {
-    return set.items.singleWhere((s) => s.label == label);
+      AvailableSuggestionSet set, String label,
+      {ElementKind kind}) {
+    return set.items.singleWhere(
+        (s) => s.label == label && (kind == null || s.element.kind == kind));
   }
 }
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 5227a27..e0f631d 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -58,7 +58,8 @@
   final String returnType;
   final String typeParameters;
 
-  List<String> _relevanceTags;
+  final List<String> _relevanceTagsInFile;
+  List<String> _relevanceTagsInLibrary = const [];
   Uri _locationLibraryUri;
 
   Declaration({
@@ -85,15 +86,18 @@
     @required this.parameterNames,
     @required this.parameterTypes,
     @required this.parent,
-    @required List<String> relevanceTags,
+    @required List<String> relevanceTagsInFile,
     @required this.requiredParameterCount,
     @required this.returnType,
     @required this.typeParameters,
-  }) : _relevanceTags = relevanceTags;
+  }) : _relevanceTagsInFile = relevanceTagsInFile;
 
   Uri get locationLibraryUri => _locationLibraryUri;
 
-  List<String> get relevanceTags => _relevanceTags;
+  List<String> get relevanceTags => [
+        ..._relevanceTagsInFile,
+        ..._relevanceTagsInLibrary,
+      ];
 
   @override
   String toString() {
@@ -927,9 +931,6 @@
     var kind = kindFromIdl(d.kind);
 
     var relevanceTags = d.relevanceTags.toList();
-    if (relevanceTags.isEmpty) {
-      relevanceTags = null;
-    }
 
     var children = <Declaration>[];
     var declaration = Declaration(
@@ -960,7 +961,7 @@
       parameterNames: hasParameters ? d.parameterNames.toList() : null,
       parameterTypes: hasParameters ? d.parameterTypes.toList() : null,
       parent: parent,
-      relevanceTags: relevanceTags,
+      relevanceTagsInFile: relevanceTags,
       requiredParameterCount: hasParameters ? d.requiredParameterCount : null,
       returnType: hasReturnType ? d.returnType : null,
       typeParameters: hasTypeParameters ? d.typeParameters : null,
@@ -1082,7 +1083,7 @@
       parameters: d.parameters,
       parameterNames: d.parameterNames,
       parameterTypes: d.parameterTypes,
-      relevanceTags: d.relevanceTags,
+      relevanceTags: d._relevanceTagsInFile,
       requiredParameterCount: d.requiredParameterCount,
       returnType: d.returnType,
       typeParameters: d.typeParameters,
@@ -1130,7 +1131,7 @@
 
 class _File {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 15;
+  static const int DATA_VERSION = 16;
 
   /// The next value for [id].
   static int _nextId = 0;
@@ -1385,7 +1386,7 @@
         parameterNames: parameterNames,
         parameterTypes: parameterTypes,
         parent: parent,
-        relevanceTags: relevanceTags,
+        relevanceTagsInFile: relevanceTags,
         requiredParameterCount: requiredParameterCount,
         returnType: returnType,
         typeParameters: typeParameters,
@@ -1557,7 +1558,7 @@
             parameterNames: [],
             parameterTypes: [],
             parent: classDeclaration,
-            relevanceTags: ['ElementKind.CONSTRUCTOR'],
+            relevanceTagsInFile: ['ElementKind.CONSTRUCTOR'],
             requiredParameterCount: 0,
             returnType: node.name.name,
             typeParameters: null,
@@ -1711,10 +1712,7 @@
   void _computeRelevanceTags(List<Declaration> declarations) {
     for (var declaration in declarations) {
       var tags = RelevanceTags._forDeclaration(uriStr, declaration);
-      if (tags != null) {
-        declaration._relevanceTags ??= [];
-        declaration._relevanceTags.addAll(tags);
-      }
+      declaration._relevanceTagsInLibrary = tags ?? const [];
       _computeRelevanceTags(declaration.children);
     }
   }
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 3e2aa12..b155619 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -955,6 +955,60 @@
     ]);
   }
 
+  /// https://github.com/dart-lang/sdk/issues/44353
+  test_updated_library_hasPart() async {
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+
+    newFile(a, content: r'''
+part 'b.dart';
+class A {}
+''');
+    newFile(b, content: r'''
+part of 'a.dart';
+class B {}
+''');
+    tracker.addContext(testAnalysisContext);
+
+    await _doAllTrackerWork();
+
+    var library = _getLibrary('package:test/a.dart');
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'A'),
+      'A',
+      DeclarationKind.CLASS,
+      relevanceTags: ['ElementKind.CLASS', 'package:test/a.dart::A'],
+    );
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'B'),
+      'B',
+      DeclarationKind.CLASS,
+      relevanceTags: ['ElementKind.CLASS', 'package:test/a.dart::B'],
+    );
+
+    newFile(a, content: r'''
+part 'b.dart';
+class A2 {}
+''');
+    tracker.changeFile(a);
+    await _doAllTrackerWork();
+
+    // We should not get duplicate relevance tags, specifically in the part.
+    library = _getLibrary('package:test/a.dart');
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'A2'),
+      'A2',
+      DeclarationKind.CLASS,
+      relevanceTags: ['ElementKind.CLASS', 'package:test/a.dart::A2'],
+    );
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'B'),
+      'B',
+      DeclarationKind.CLASS,
+      relevanceTags: ['ElementKind.CLASS', 'package:test/a.dart::B'],
+    );
+  }
+
   test_updated_library_to_part() async {
     var a = convertPath('/home/test/lib/a.dart');
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index db85b79..d3f637a 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -345,7 +345,7 @@
 
     // Visit each library and emit its code.
     //
-    // NOTE: clases are not necessarily emitted in this order.
+    // NOTE: classes are not necessarily emitted in this order.
     // Order will be changed as needed so the resulting code can execute.
     // This is done by forward declaring items.
     libraries.forEach(_emitLibrary);
@@ -375,6 +375,30 @@
     // Declare imports and extension symbols
     emitImportsAndExtensionSymbols(items);
 
+    // Insert a check that runs when loading this module to verify that the null
+    // safety mode it was compiled in matches the mode used when compiling the
+    // dart sdk module.
+    //
+    // This serves as a sanity check at runtime that we don't have an
+    // infrastructure issue that loaded js files compiled with different modes
+    // into the same application.
+    js_ast.LiteralBool soundNullSafety;
+    switch (component.mode) {
+      case NonNullableByDefaultCompiledMode.Strong:
+        soundNullSafety = js_ast.LiteralBool(true);
+        break;
+      case NonNullableByDefaultCompiledMode.Weak:
+        soundNullSafety = js_ast.LiteralBool(false);
+        break;
+      default:
+        throw StateError('Unsupported Null Safety mode ${component.mode}, '
+            'in ${component?.location?.file}.');
+    }
+    if (!isBuildingSdk) {
+      items.add(
+          runtimeStatement('_checkModuleNullSafetyMode(#)', [soundNullSafety]));
+    }
+
     // Discharge the type table cache variables and
     // hoisted definitions.
     items.addAll(_typeTable.discharge());
@@ -5487,27 +5511,6 @@
   js_ast.Expression visitAsExpression(AsExpression node) {
     var fromExpr = node.operand;
     var jsFrom = _visitExpression(fromExpr);
-
-    // The `_EventStreamSubscription.cancel()` method dart:html returns null in
-    // weak mode. This causes unwanted warnings/failures when you turn on the
-    // weak mode warnings/errors so we remove these specific runtime casts.
-    // TODO(44157) Remove this workaround once it returns a consistent type.
-    if (_isWebLibrary(currentLibraryUri) && node.parent is ReturnStatement) {
-      var parent = node.parent;
-      while (parent != null && parent is! FunctionNode) {
-        parent = parent?.parent;
-      }
-      parent = parent?.parent;
-      if (parent is Procedure) {
-        if (parent.enclosingClass != null &&
-            parent.enclosingClass.name == '_EventStreamSubscription' &&
-            parent.name.name == 'cancel') {
-          // Ignore these casts and just emit the expression.
-          return jsFrom;
-        }
-      }
-    }
-
     var to = node.type;
     var from = fromExpr.getStaticType(_staticTypeContext);
 
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
index 236a3ef..1209475 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_test.dart
@@ -65,7 +65,8 @@
       ..omitPlatform = true
       ..sdkSummary = sdkRoot.resolve(
           soundNullSafety ? sdkSoundSummaryPath : sdkUnsoundSummaryPath)
-      ..environmentDefines = const {};
+      ..environmentDefines = const {}
+      ..nnbdMode = soundNullSafety ? NnbdMode.Strong : NnbdMode.Weak;
     return options;
   }
 
diff --git a/pkg/frontend_server/lib/src/javascript_bundle.dart b/pkg/frontend_server/lib/src/javascript_bundle.dart
index d67f9bc..924c551 100644
--- a/pkg/frontend_server/lib/src/javascript_bundle.dart
+++ b/pkg/frontend_server/lib/src/javascript_bundle.dart
@@ -19,7 +19,7 @@
 /// JavaScript modules concatenated together, and a second containing the byte
 /// offsets by module name for each JavaScript module in JSON format.
 ///
-/// Ths format is analgous to the dill and .incremental.dill in that during
+/// Ths format is analogous to the dill and .incremental.dill in that during
 /// an incremental build, a different file is written for each which contains
 /// only the updated libraries.
 class JavaScriptBundler {
@@ -42,6 +42,8 @@
         nameRoot: _originalComponent.root,
         uriToSource: _originalComponent.uriToSource,
       );
+      summaryComponent.setMainMethodAndMode(
+          null, false, _originalComponent.mode);
       _summaries.add(summaryComponent);
       _summaryUris.add(uri);
 
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index 9715fb6..ea7932f 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -1938,7 +1938,8 @@
         CompilationResult result =
             CompilationResult.parse(compiledResult.status);
         count++;
-        // Request to 'compile', which results in full JavaScript and no metadata
+        // Request to 'compile', which results in full JavaScript and no
+        // metadata.
         expect(result.errorsCount, equals(0));
         expect(sourceFile.existsSync(), equals(true));
         expect(manifestFile.existsSync(), equals(true));
@@ -2018,7 +2019,7 @@
         CompilationResult result =
             CompilationResult.parse(compiledResult.status);
         count++;
-        // Request to 'compile', which results in full JavaScript and no metadata
+        // Request to 'compile', which results in full JavaScript and metadata.
         expect(result.errorsCount, equals(0));
         expect(sourceFile.existsSync(), equals(true));
         expect(manifestFile.existsSync(), equals(true));
@@ -2034,6 +2035,178 @@
       expect(count, 1);
     });
 
+    test('compile to JavaScript all modules with unsound null safety',
+        () async {
+      var file = File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync("import 'bar.dart'; "
+          "typedef myType = void Function(int); main() { fn is myType; }\n");
+      file = File('${tempDir.path}/bar.dart')..createSync();
+      file.writeAsStringSync("void Function(int) fn = (int i) => null;\n");
+      var library = 'package:hello/foo.dart';
+
+      var dillFile = File('${tempDir.path}/app.dill');
+      var sourceFile = File('${dillFile.path}.sources');
+
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+    {
+      "configVersion": 2,
+      "packages": [
+        {
+          "name": "hello",
+          "rootUri": "../",
+          "packageUri": "./",
+          "languageVersion": "2.9"
+        }
+      ]
+    }
+    ''');
+
+      final List<String> args = <String>[
+        '--verbose',
+        '--no-sound-null-safety',
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--incremental',
+        '--platform=${ddcPlatformKernelWeak.path}',
+        '--output-dill=${dillFile.path}',
+        '--target=dartdevc',
+        '--packages=${package_config.path}'
+      ];
+
+      final StreamController<List<int>> streamController =
+          StreamController<List<int>>();
+      final StreamController<List<int>> stdoutStreamController =
+          StreamController<List<int>>();
+      final IOSink ioSink = IOSink(stdoutStreamController.sink);
+      StreamController<Result> receivedResults = StreamController<Result>();
+      final outputParser = OutputParser(receivedResults);
+      stdoutStreamController.stream
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .listen(outputParser.listener);
+
+      Future<int> result =
+          starter(args, input: streamController.stream, output: ioSink);
+      streamController.add('compile $library\n'.codeUnits);
+      var count = 0;
+      var expectationCompleter = Completer<bool>();
+      receivedResults.stream.listen((Result compiledResult) {
+        CompilationResult result =
+            CompilationResult.parse(compiledResult.status);
+        count++;
+        // Request to 'compile', which results in full JavaScript and no
+        // metadata.
+        expect(result.errorsCount, equals(0));
+        expect(sourceFile.existsSync(), equals(true));
+        expect(result.filename, dillFile.path);
+
+        var source = sourceFile.readAsStringSync();
+        // Split on the comment at the end of each module.
+        var jsModules = source.split(RegExp("\/\/# sourceMappingURL=.*\.map"));
+
+        // Both modules should include the unsound null safety check.
+        expect(
+            jsModules[0], contains('dart._checkModuleNullSafetyMode(false);'));
+        expect(
+            jsModules[1], contains('dart._checkModuleNullSafetyMode(false);'));
+        streamController.add('accept\n'.codeUnits);
+        outputParser.expectSources = false;
+        streamController.add('quit\n'.codeUnits);
+        expectationCompleter.complete(true);
+      });
+
+      await expectationCompleter.future;
+      expect(await result, 0);
+      expect(count, 1);
+    }, timeout: Timeout.none);
+
+    test('compile to JavaScript, all modules with sound null safety', () async {
+      var file = File('${tempDir.path}/foo.dart')..createSync();
+      file.writeAsStringSync(
+          "import 'bar.dart'; typedef myType = void Function(int); "
+          "main() { fn is myType; }\n");
+      file = File('${tempDir.path}/bar.dart')..createSync();
+      file.writeAsStringSync("void Function(int) fn = (int i) => null;\n");
+
+      var package_config =
+          File('${tempDir.path}/.dart_tool/package_config.json')
+            ..createSync(recursive: true)
+            ..writeAsStringSync('''
+    {
+      "configVersion": 2,
+      "packages": [
+        {
+          "name": "hello",
+          "rootUri": "../",
+          "packageUri": "./"
+        }
+      ]
+    }
+    ''');
+
+      var library = 'package:hello/foo.dart';
+
+      var dillFile = File('${tempDir.path}/app.dill');
+      var sourceFile = File('${dillFile.path}.sources');
+
+      final List<String> args = <String>[
+        '--sdk-root=${sdkRoot.toFilePath()}',
+        '--incremental',
+        '--platform=${ddcPlatformKernel.path}',
+        '--output-dill=${dillFile.path}',
+        '--target=dartdevc',
+        '--packages=${package_config.path}',
+      ];
+
+      final StreamController<List<int>> streamController =
+          StreamController<List<int>>();
+      final StreamController<List<int>> stdoutStreamController =
+          StreamController<List<int>>();
+      final IOSink ioSink = IOSink(stdoutStreamController.sink);
+      StreamController<Result> receivedResults = StreamController<Result>();
+      final outputParser = OutputParser(receivedResults);
+      stdoutStreamController.stream
+          .transform(utf8.decoder)
+          .transform(const LineSplitter())
+          .listen(outputParser.listener);
+
+      Future<int> result =
+          starter(args, input: streamController.stream, output: ioSink);
+      streamController.add('compile $library\n'.codeUnits);
+      var count = 0;
+      var expectationCompleter = Completer<bool>();
+      receivedResults.stream.listen((Result compiledResult) {
+        CompilationResult result =
+            CompilationResult.parse(compiledResult.status);
+        count++;
+        // Request to 'compile', which results in full JavaScript and no
+        // metadata.
+        expect(result.errorsCount, equals(0));
+        expect(sourceFile.existsSync(), equals(true));
+        expect(result.filename, dillFile.path);
+
+        var source = sourceFile.readAsStringSync();
+        // Split on the comment at the end of each module.
+        var jsModules = source.split(RegExp("\/\/# sourceMappingURL=.*\.map"));
+
+        // Both modules should include the sound null safety validation.
+        expect(
+            jsModules[0], contains('dart._checkModuleNullSafetyMode(true);'));
+        expect(
+            jsModules[1], contains('dart._checkModuleNullSafetyMode(true);'));
+        streamController.add('accept\n'.codeUnits);
+        outputParser.expectSources = false;
+        streamController.add('quit\n'.codeUnits);
+        expectationCompleter.complete(true);
+      });
+
+      await expectationCompleter.future;
+      expect(await result, 0);
+      expect(count, 1);
+    });
+
     test('compile expression to Javascript', () async {
       var file = File('${tempDir.path}/foo.dart')..createSync();
       file.writeAsStringSync("main() {\n}\n");
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 3ec1689..fd80d9c 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -24,6 +24,21 @@
   throw AssertionErrorImpl(message, fileUri, line, column, conditionSource);
 }
 
+/// Throws if [isModuleSound] does not match the null safety mode of this SDK.
+///
+/// The call to this method is inserted into every module at compile time when
+/// the compile time null safety mode for the module is known.
+void _checkModuleNullSafetyMode(@notNull bool isModuleSound) {
+  if (isModuleSound != compileTimeFlag('soundNullSafety')) {
+    var sdkMode = compileTimeFlag('soundNullSafety') ? 'sound' : 'unsound';
+    var moduleMode = isModuleSound ? 'sound' : 'unsound';
+
+    throw AssertionError('The null safety mode of the Dart SDK module '
+        '($sdkMode) does not match the null safety mode of this module '
+        '($moduleMode).');
+  }
+}
+
 final _nullFailedSet = JS('!', 'new Set()');
 
 String _nullFailedMessage(variableName) =>
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a79aff6..bc7bdfb 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -37285,18 +37285,13 @@
   }
 
   Future cancel() {
-    // Check for strong mode. This function can no longer return null in strong
-    // mode, so only return null in weak mode to preserve synchronous timing.
-    // See issue 41653 for more details.
-    dynamic emptyFuture =
-        typeAcceptsNull<Event>() ? null : Future<void>.value();
-    if (_canceled) return emptyFuture as Future;
+    if (_canceled) return nullFuture;
 
     _unlisten();
     // Clear out the target to indicate this is complete.
     _target = null;
     _onData = null;
-    return emptyFuture as Future;
+    return nullFuture;
   }
 
   bool get _canceled => _target == null;
diff --git a/tools/VERSION b/tools/VERSION
index 028a34a..4b12615 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 12
 PATCH 0
 PRERELEASE 133
-PRERELEASE_PATCH 2
\ No newline at end of file
+PRERELEASE_PATCH 6
\ No newline at end of file
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index fe01be9..feadc26 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -248,18 +248,13 @@
   }
 
   Future cancel() {
-    // Check for strong mode. This function can no longer return null in strong
-    // mode, so only return null in weak mode to preserve synchronous timing.
-    // See issue 41653 for more details.
-    dynamic emptyFuture =
-        typeAcceptsNull<Event>() ? null : Future<void>.value();
-    if (_canceled) return emptyFuture as Future;
+    if (_canceled) return nullFuture;
 
     _unlisten();
     // Clear out the target to indicate this is complete.
     _target = null;
     _onData = null;
-    return emptyFuture as Future;
+    return nullFuture;
   }
 
   bool get _canceled => _target == null;
