{"action":"closed","number":302,"pull_request":{"url":"https://api.github.com/repos/whatwg/streams/pulls/302","id":31421738,"html_url":"https://github.com/whatwg/streams/pull/302","diff_url":"https://github.com/whatwg/streams/pull/302.diff","patch_url":"https://github.com/whatwg/streams/pull/302.patch","issue_url":"https://api.github.com/repos/whatwg/streams/issues/302","number":302,"state":"closed","locked":false,"title":"First draft at tee algorithms, for critique","user":{"login":"domenic","id":617481,"avatar_url":"https://avatars.githubusercontent.com/u/617481?v=3","gravatar_id":"","url":"https://api.github.com/users/domenic","html_url":"https://github.com/domenic","followers_url":"https://api.github.com/users/domenic/followers","following_url":"https://api.github.com/users/domenic/following{/other_user}","gists_url":"https://api.github.com/users/domenic/gists{/gist_id}","starred_url":"https://api.github.com/users/domenic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/domenic/subscriptions","organizations_url":"https://api.github.com/users/domenic/orgs","repos_url":"https://api.github.com/users/domenic/repos","events_url":"https://api.github.com/users/domenic/events{/privacy}","received_events_url":"https://api.github.com/users/domenic/received_events","type":"User","site_admin":false},"body":"First shot at addressing #271. Want to get these up early for review before formalizing them.\r\n\r\n- TeeReadableStream: when a consumer pulls on `branch1` or `branch2` (triggering their underlying source's `pull` method), they in turn \"pull\" from `stream` (using `reader.read()`). Once a chunk has been pulled from `stream`, it gets enqueued in both branches---no matter which branch initiated the pull. This should preserve backpressure and also has the \"OOM\" property discussed in #271 such that if the consumer for branch1 is slow and the consumer for branch2 is fast, then branch1 ends up with a lot of unconsumed chunks in its queue.\r\n- SpeculativeTeeReadableByteStream is based on the vision outlined in https://github.com/whatwg/streams/issues/294#issuecomment-81557090 where byte streams also have internal queues, which can be used sometimes, whereas other times, a direct call through to the underlying source `read()` will happen. The underlying sources for `branch1` and `branch2` both have `pull` methods like in TeeReadableStream, which might be used if someone goes for an auto-reader on either of them. But they also have `read` methods, such that if someone does e.g. `reader1.read(view1)`, it will call through to `us1.read(view1)` which does two things: (1) `reader.read(view1)`, pulling a chunk from `stream` and using it to fulfill the direct read call; (2) enqueue the view into the queue for `branch2`. Thus, later, if someone does `reader2.read(view2)`, there will be a copy/transfer from `branch2`'s queue into `view2`.\r\n\r\nAll of these include a `clone` boolean argument, which if present, will result in structured clones happening for anything enqueued. This is important if we envision the two branches being consumed on different threads, e.g. as in #244 or #276.\r\n\r\nWould love a review to validate!","created_at":"2015-03-18T11:53:12Z","updated_at":"2015-04-06T21:07:06Z","closed_at":"2015-04-06T21:07:06Z","merged_at":null,"merge_commit_sha":"b7196afc4a270d0b6ad331eafa9977ad0377ec99","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/whatwg/streams/pulls/302/commits","review_comments_url":"https://api.github.com/repos/whatwg/streams/pulls/302/comments","review_comment_url":"https://api.github.com/repos/whatwg/streams/pulls/comments{/number}","comments_url":"https://api.github.com/repos/whatwg/streams/issues/302/comments","statuses_url":"https://api.github.com/repos/whatwg/streams/statuses/43ada8cb11cac12c92f5bcb1423445d00369532b","head":{"label":"whatwg:tee","ref":"tee","sha":"43ada8cb11cac12c92f5bcb1423445d00369532b","user":{"login":"whatwg","id":2226336,"avatar_url":"https://avatars.githubusercontent.com/u/2226336?v=3","gravatar_id":"","url":"https://api.github.com/users/whatwg","html_url":"https://github.com/whatwg","followers_url":"https://api.github.com/users/whatwg/followers","following_url":"https://api.github.com/users/whatwg/following{/other_user}","gists_url":"https://api.github.com/users/whatwg/gists{/gist_id}","starred_url":"https://api.github.com/users/whatwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whatwg/subscriptions","organizations_url":"https://api.github.com/users/whatwg/orgs","repos_url":"https://api.github.com/users/whatwg/repos","events_url":"https://api.github.com/users/whatwg/events{/privacy}","received_events_url":"https://api.github.com/users/whatwg/received_events","type":"Organization","site_admin":false},"repo":{"id":13962843,"name":"streams","full_name":"whatwg/streams","owner":{"login":"whatwg","id":2226336,"avatar_url":"https://avatars.githubusercontent.com/u/2226336?v=3","gravatar_id":"","url":"https://api.github.com/users/whatwg","html_url":"https://github.com/whatwg","followers_url":"https://api.github.com/users/whatwg/followers","following_url":"https://api.github.com/users/whatwg/following{/other_user}","gists_url":"https://api.github.com/users/whatwg/gists{/gist_id}","starred_url":"https://api.github.com/users/whatwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whatwg/subscriptions","organizations_url":"https://api.github.com/users/whatwg/orgs","repos_url":"https://api.github.com/users/whatwg/repos","events_url":"https://api.github.com/users/whatwg/events{/privacy}","received_events_url":"https://api.github.com/users/whatwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/whatwg/streams","description":"Streams Standard","fork":false,"url":"https://api.github.com/repos/whatwg/streams","forks_url":"https://api.github.com/repos/whatwg/streams/forks","keys_url":"https://api.github.com/repos/whatwg/streams/keys{/key_id}","collaborators_url":"https://api.github.com/repos/whatwg/streams/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/whatwg/streams/teams","hooks_url":"https://api.github.com/repos/whatwg/streams/hooks","issue_events_url":"https://api.github.com/repos/whatwg/streams/issues/events{/number}","events_url":"https://api.github.com/repos/whatwg/streams/events","assignees_url":"https://api.github.com/repos/whatwg/streams/assignees{/user}","branches_url":"https://api.github.com/repos/whatwg/streams/branches{/branch}","tags_url":"https://api.github.com/repos/whatwg/streams/tags","blobs_url":"https://api.github.com/repos/whatwg/streams/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/whatwg/streams/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/whatwg/streams/git/refs{/sha}","trees_url":"https://api.github.com/repos/whatwg/streams/git/trees{/sha}","statuses_url":"https://api.github.com/repos/whatwg/streams/statuses/{sha}","languages_url":"https://api.github.com/repos/whatwg/streams/languages","stargazers_url":"https://api.github.com/repos/whatwg/streams/stargazers","contributors_url":"https://api.github.com/repos/whatwg/streams/contributors","subscribers_url":"https://api.github.com/repos/whatwg/streams/subscribers","subscription_url":"https://api.github.com/repos/whatwg/streams/subscription","commits_url":"https://api.github.com/repos/whatwg/streams/commits{/sha}","git_commits_url":"https://api.github.com/repos/whatwg/streams/git/commits{/sha}","comments_url":"https://api.github.com/repos/whatwg/streams/comments{/number}","issue_comment_url":"https://api.github.com/repos/whatwg/streams/issues/comments{/number}","contents_url":"https://api.github.com/repos/whatwg/streams/contents/{+path}","compare_url":"https://api.github.com/repos/whatwg/streams/compare/{base}...{head}","merges_url":"https://api.github.com/repos/whatwg/streams/merges","archive_url":"https://api.github.com/repos/whatwg/streams/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/whatwg/streams/downloads","issues_url":"https://api.github.com/repos/whatwg/streams/issues{/number}","pulls_url":"https://api.github.com/repos/whatwg/streams/pulls{/number}","milestones_url":"https://api.github.com/repos/whatwg/streams/milestones{/number}","notifications_url":"https://api.github.com/repos/whatwg/streams/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/whatwg/streams/labels{/name}","releases_url":"https://api.github.com/repos/whatwg/streams/releases{/id}","created_at":"2013-10-29T17:16:58Z","updated_at":"2015-04-06T21:06:47Z","pushed_at":"2015-04-06T21:06:47Z","git_url":"git://github.com/whatwg/streams.git","ssh_url":"git@github.com:whatwg/streams.git","clone_url":"https://github.com/whatwg/streams.git","svn_url":"https://github.com/whatwg/streams","homepage":"https://streams.spec.whatwg.org/","size":5054,"stargazers_count":358,"watchers_count":358,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":31,"mirror_url":null,"open_issues_count":32,"forks":31,"open_issues":32,"watchers":358,"default_branch":"master"}},"base":{"label":"whatwg:master","ref":"master","sha":"ee2976b593bf4181b2a28719b6a5b6e98632c7d0","user":{"login":"whatwg","id":2226336,"avatar_url":"https://avatars.githubusercontent.com/u/2226336?v=3","gravatar_id":"","url":"https://api.github.com/users/whatwg","html_url":"https://github.com/whatwg","followers_url":"https://api.github.com/users/whatwg/followers","following_url":"https://api.github.com/users/whatwg/following{/other_user}","gists_url":"https://api.github.com/users/whatwg/gists{/gist_id}","starred_url":"https://api.github.com/users/whatwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whatwg/subscriptions","organizations_url":"https://api.github.com/users/whatwg/orgs","repos_url":"https://api.github.com/users/whatwg/repos","events_url":"https://api.github.com/users/whatwg/events{/privacy}","received_events_url":"https://api.github.com/users/whatwg/received_events","type":"Organization","site_admin":false},"repo":{"id":13962843,"name":"streams","full_name":"whatwg/streams","owner":{"login":"whatwg","id":2226336,"avatar_url":"https://avatars.githubusercontent.com/u/2226336?v=3","gravatar_id":"","url":"https://api.github.com/users/whatwg","html_url":"https://github.com/whatwg","followers_url":"https://api.github.com/users/whatwg/followers","following_url":"https://api.github.com/users/whatwg/following{/other_user}","gists_url":"https://api.github.com/users/whatwg/gists{/gist_id}","starred_url":"https://api.github.com/users/whatwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/whatwg/subscriptions","organizations_url":"https://api.github.com/users/whatwg/orgs","repos_url":"https://api.github.com/users/whatwg/repos","events_url":"https://api.github.com/users/whatwg/events{/privacy}","received_events_url":"https://api.github.com/users/whatwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/whatwg/streams","description":"Streams Standard","fork":false,"url":"https://api.github.com/repos/whatwg/streams","forks_url":"https://api.github.com/repos/whatwg/streams/forks","keys_url":"https://api.github.com/repos/whatwg/streams/keys{/key_id}","collaborators_url":"https://api.github.com/repos/whatwg/streams/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/whatwg/streams/teams","hooks_url":"https://api.github.com/repos/whatwg/streams/hooks","issue_events_url":"https://api.github.com/repos/whatwg/streams/issues/events{/number}","events_url":"https://api.github.com/repos/whatwg/streams/events","assignees_url":"https://api.github.com/repos/whatwg/streams/assignees{/user}","branches_url":"https://api.github.com/repos/whatwg/streams/branches{/branch}","tags_url":"https://api.github.com/repos/whatwg/streams/tags","blobs_url":"https://api.github.com/repos/whatwg/streams/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/whatwg/streams/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/whatwg/streams/git/refs{/sha}","trees_url":"https://api.github.com/repos/whatwg/streams/git/trees{/sha}","statuses_url":"https://api.github.com/repos/whatwg/streams/statuses/{sha}","languages_url":"https://api.github.com/repos/whatwg/streams/languages","stargazers_url":"https://api.github.com/repos/whatwg/streams/stargazers","contributors_url":"https://api.github.com/repos/whatwg/streams/contributors","subscribers_url":"https://api.github.com/repos/whatwg/streams/subscribers","subscription_url":"https://api.github.com/repos/whatwg/streams/subscription","commits_url":"https://api.github.com/repos/whatwg/streams/commits{/sha}","git_commits_url":"https://api.github.com/repos/whatwg/streams/git/commits{/sha}","comments_url":"https://api.github.com/repos/whatwg/streams/comments{/number}","issue_comment_url":"https://api.github.com/repos/whatwg/streams/issues/comments{/number}","contents_url":"https://api.github.com/repos/whatwg/streams/contents/{+path}","compare_url":"https://api.github.com/repos/whatwg/streams/compare/{base}...{head}","merges_url":"https://api.github.com/repos/whatwg/streams/merges","archive_url":"https://api.github.com/repos/whatwg/streams/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/whatwg/streams/downloads","issues_url":"https://api.github.com/repos/whatwg/streams/issues{/number}","pulls_url":"https://api.github.com/repos/whatwg/streams/pulls{/number}","milestones_url":"https://api.github.com/repos/whatwg/streams/milestones{/number}","notifications_url":"https://api.github.com/repos/whatwg/streams/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/whatwg/streams/labels{/name}","releases_url":"https://api.github.com/repos/whatwg/streams/releases{/id}","created_at":"2013-10-29T17:16:58Z","updated_at":"2015-04-06T21:06:47Z","pushed_at":"2015-04-06T21:06:47Z","git_url":"git://github.com/whatwg/streams.git","ssh_url":"git@github.com:whatwg/streams.git","clone_url":"https://github.com/whatwg/streams.git","svn_url":"https://github.com/whatwg/streams","homepage":"https://streams.spec.whatwg.org/","size":5054,"stargazers_count":358,"watchers_count":358,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":31,"mirror_url":null,"open_issues_count":32,"forks":31,"open_issues":32,"watchers":358,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/whatwg/streams/pulls/302"},"html":{"href":"https://github.com/whatwg/streams/pull/302"},"issue":{"href":"https://api.github.com/repos/whatwg/streams/issues/302"},"comments":{"href":"https://api.github.com/repos/whatwg/streams/issues/302/comments"},"review_comments":{"href":"https://api.github.com/repos/whatwg/streams/pulls/302/comments"},"review_comment":{"href":"https://api.github.com/repos/whatwg/streams/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/whatwg/streams/pulls/302/commits"},"statuses":{"href":"https://api.github.com/repos/whatwg/streams/statuses/43ada8cb11cac12c92f5bcb1423445d00369532b"}},"merged":false,"mergeable":false,"mergeable_state":"dirty","merged_by":null,"comments":34,"review_comments":6,"commits":7,"additions":435,"deletions":99,"changed_files":8}}