Skip to content

make SharedStdIn visible to non-test code#2396

Open
jakemac53 wants to merge 6 commits into
mainfrom
visible-shared-stdin
Open

make SharedStdIn visible to non-test code#2396
jakemac53 wants to merge 6 commits into
mainfrom
visible-shared-stdin

Conversation

@jakemac53
Copy link
Copy Markdown
Contributor

Closes #2395

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

Package publishing

Package Version Status Publish tag (post-merge)
package:bazel_worker 1.1.5 already published at pub.dev
package:benchmark_harness 2.4.0 already published at pub.dev
package:boolean_selector 2.1.2 already published at pub.dev
package:browser_launcher 1.2.0-wip WIP (no publish necessary)
package:cli_config 0.2.1-wip WIP (no publish necessary)
package:cli_util 0.5.1 already published at pub.dev
package:clock 1.1.3-wip WIP (no publish necessary)
package:code_builder 4.12.0-wip WIP (no publish necessary)
package:coverage 1.15.0 already published at pub.dev
package:csslib 1.0.2 already published at pub.dev
package:extension_discovery 2.1.0 already published at pub.dev
package:file 7.0.2-wip WIP (no publish necessary)
package:file_testing 3.1.0-wip WIP (no publish necessary)
package:glob 2.1.3 already published at pub.dev
package:graphs 2.4.0-wip WIP (no publish necessary)
package:html 0.15.7-wip WIP (no publish necessary)
package:io 1.1.0-wip WIP (no publish necessary)
package:json_rpc_2 4.1.0 already published at pub.dev
package:markdown 7.4.0 ready to publish markdown-v7.4.0
package:mime 2.1.0-wip WIP (no publish necessary)
package:oauth2 2.0.5 already published at pub.dev
package:package_config 2.3.0-wip WIP (no publish necessary)
package:pool 1.5.3-wip WIP (no publish necessary)
package:process 5.0.5 (error) pubspec version (5.0.5) and changelog (5.0.6-wip) don't agree
package:pub_semver 2.2.0 already published at pub.dev
package:pubspec_parse 1.6.0-wip WIP (no publish necessary)
package:source_map_stack_trace 2.1.3-wip WIP (no publish necessary)
package:source_maps 0.10.14-wip WIP (no publish necessary)
package:source_span 1.10.2 already published at pub.dev
package:sse 4.2.0 already published at pub.dev
package:stack_trace 1.12.2-wip (error) pubspec version (1.12.2-wip) and changelog (1.12.2-dev) don't agree
package:stream_channel 2.1.4 already published at pub.dev
package:stream_transform 2.1.2-wip WIP (no publish necessary)
package:string_scanner 1.4.2-wip WIP (no publish necessary)
package:term_glyph 1.2.3-wip WIP (no publish necessary)
package:test_reflective_loader 0.6.0 ready to publish test_reflective_loader-v0.6.0
package:timing 1.0.2 already published at pub.dev
package:unified_analytics 8.0.15 ready to publish unified_analytics-v8.0.15
package:watcher 1.2.2-wip WIP (no publish necessary)
package:yaml 3.1.4-wip WIP (no publish necessary)
package:yaml_edit 2.2.4 already published at pub.dev

Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request promotes the SharedStdIn class to a public API by removing the @VisibleForTesting annotation. Feedback indicates that the implementation needs to be more robust by propagating onDone and onError events to avoid hanging subscribers. Furthermore, the class documentation is now outdated and should be updated to reflect its public status and include warnings about potential StateError usage.

Comment thread pkgs/io/lib/src/shared_stdin.dart
Comment thread pkgs/io/lib/src/shared_stdin.dart
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 4, 2026

PR Health

License Headers ✔️
// Copyright (c) 2026, 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.

Files
no missing headers

All source files should start with a license header.

Unrelated files missing license headers
Files
pkgs/bazel_worker/benchmark/benchmark.dart
pkgs/coverage/lib/src/coverage_options.dart
pkgs/html/example/main.dart
pkgs/pubspec_parse/test/git_uri_test.dart
pkgs/watcher/test/custom_watcher_factory_test.dart

This check can be disabled by tagging the PR with skip-license-check.

Breaking changes ✔️
Package Change Current Version New Version Needed Version Looking good?
io Breaking 1.0.5 1.1.0-wip 1.1.0-wip ✔️

This check can be disabled by tagging the PR with skip-breaking-check.

Coverage ✔️
File Coverage
pkgs/io/lib/src/shared_stdin.dart 💚 73 % ⬆️ 1 %

This check for test coverage is informational (issues shown here will not fail the PR).

This check can be disabled by tagging the PR with skip-coverage-check.

API leaks ✔️

The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.

Package Leaked API symbol Leaking sources

This check can be disabled by tagging the PR with skip-leaking-check.

Unused Dependencies ✔️
Package Status
io ✔️ All dependencies utilized correctly.

For details on how to fix these, see dependency_validator.

This check can be disabled by tagging the PR with skip-unused-dependencies-check.

Changelog Entry ✔️
Package Changed Files

Changes to files need to be accounted for in their respective changelogs.

This check can be disabled by tagging the PR with skip-changelog-check.

@jakemac53 jakemac53 requested a review from natebosch May 4, 2026 17:18
@jakemac53 jakemac53 marked this pull request as ready for review May 4, 2026 17:19
@jakemac53 jakemac53 requested a review from a team as a code owner May 4, 2026 17:19
Comment thread pkgs/io/lib/src/shared_stdin.dart
Comment thread pkgs/io/lib/src/shared_stdin.dart Outdated
Comment thread pkgs/io/lib/src/shared_stdin.dart Outdated
Comment thread pkgs/io/lib/src/shared_stdin.dart Outdated
Comment thread pkgs/io/lib/src/shared_stdin.dart Outdated
Comment thread pkgs/io/lib/src/shared_stdin.dart Outdated
final SharedStdIn sharedStdIn = SharedStdIn(stdin);

/// A singleton wrapper around `stdin` that allows new subscribers.
/// A wrapper around a stream that allows new subscribers, intended for use
Copy link
Copy Markdown
Member

@lrhn lrhn May 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the class is public and intended to be used (only!) on other streams than stdin, then the name is confusing.

Could just name it [SharedStream]. And move it to package:async.

Why restrict it to Stream<List<int>>?

Because it also has line-based operations, I assume.
Actually, that's a very, very flaky design. It multiplexes events between listeners.

If one listener reads a line, then cancels, if that event contained bytes beyond the first line,
those bytes are lost. They're not buffered and passed to the next listener.
Or if they read lines, and get an event that doesn't contain a line ending, and then they
cancel before the next event, the entire event is lost.

It might work for stdin, if we know that input events are always separated at line breaks,
and nobody cancels between receiving events. Very fragile API.
For any other input, it's really not a class I can recommend.
Which means it's not a class we should make public, or use for any class other than stdin.
(If even that. Could use some serious clean-up.)

If we want this to be shared, it should be improved so it is actually built for controlled-length reading of text or bytes, and does not rely on the input being split into events in any particular way. Could use StreamQueue, maybe the line reading is actually a match for the transaction API.
(And we should add good testing that this class actually works for stdin.)

Copy link
Copy Markdown
Contributor Author

@jakemac53 jakemac53 May 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The use case here really is for stdin, just using a version of it that actually works fully on windows for things like arrow keys.

While valid, I don't believe your concerns are relevant to this PR? All this does is expose the constructor, an instance of the class was already available, but regular stdin from dart:io is very limited on windows.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow usage of regular SharedStdIn constructor from non-test code

3 participants