GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — streams: implement TransformStream cleanup using "transformer.cancel" by debadree25 · Pull Request #50126 · nodejs/node

Conversation

@debadree25

@debadree25 debadree25 commented Oct 10, 2023

Copy link
Copy Markdown
Contributor

Fixes: #49971

This is a draft implementation of the spec change but it fails two WPTs a description of the failure is given below if anyone can provide any insight on it would be great

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@debadree25

debadree25 commented Oct 10, 2023

Copy link
Copy Markdown
Contributor Author

consider the code here https://gist.github.com/debadree25/c54931a99e493baaf9314a903cd52e12 now when we create a transform stream we have one promise created on the writable side the "startPromise" as noted in https://streams.spec.whatwg.org/#set-up-writable-stream-default-controller and when we called the cancel method on the readable we get a cancellation promise as noted in https://streams.spec.whatwg.org/#transform-stream-default-source-cancel now in the code after this we call on controller.terminate which causes the writable side to go into the "erroring" stage, now comes the interesting part the "startPromise" gets resolved and causes the writable part to go into "errored" mode after which the close promise resolves rejecting the cancellation promise we received I think this is expected behaviour? since promises are executed in a queue manner? strangely this issue doesnt seem to affect the reference implementation here https://github.com/whatwg/streams and the promises get executed in the order:
-created start promise
-cancel promise created
-cancel promise resolving
-start promise resolving.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@nodejs-github-bot nodejs-github-bot added needs-ci PRs that need a full CI run. web streams Issues and PRs related to the Web Streams API. labels Oct 10, 2023
@debadree25

debadree25 commented Oct 10, 2023 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

a ping to @nodejs/whatwg-stream

(have scratched my head on #50126 (comment) for quite sometime incase someone might have a insight 😅)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25 debadree25 mentioned this pull request Oct 15, 2023
Test or specification problem with TransformStream readable.cancel and calling controller.error whatwg/streams#1296
Open
@debadree25
debadree25 force-pushed the ft/transform-cancel-impl branch 2 times, most recently from 9391f66 to 744bd9f Compare October 23, 2023 13:34
@debadree25

debadree25 commented Oct 23, 2023

Copy link
Copy Markdown
Contributor Author

Okay it so appears that there can be much larger issue see whatwg/streams#1298 not sure if we should address that everywhere before this PR or could we skip the tests and go ahead with this PR!

a ping to @nodejs/whatwg-stream again 😅

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@saschanaz

saschanaz commented Oct 24, 2023

Copy link
Copy Markdown

Your mention of @nodejs/whatwg-stream is rendered as plaintext to me, does it work as a link to you? Just curious.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25

debadree25 commented Oct 25, 2023

Copy link
Copy Markdown
Contributor Author

Your mention of @nodejs/whatwg-stream is rendered as plaintext to me, does it work as a link to you? Just curious.

Oh afaik the different github teams are only visible to the members of nodejs org thats why

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@MattiasBuelens MattiasBuelens mentioned this pull request Nov 23, 2023
streams: implement min option for ReadableStreamBYOBReader.read(view) #50888
Merged
1 task done
@MattiasBuelens

MattiasBuelens commented Nov 23, 2023

Copy link
Copy Markdown
Contributor

If I understand whatwg/streams#1298 correctly, the issue is in these two lines:

node/lib/internal/webstreams/readablestream.js

Line 2447 in 83df02c

PromiseResolve(startResult),

node/lib/internal/webstreams/readablestream.js

Line 3246 in 83df02c

PromiseResolve(startResult),

We're using Promise.resolve(x), whereas WebIDL expects new Promise(resolve => resolve(x)). The difference is that Promise.resolve(x) is allowed to return the original x (in case it's already a Promise), whereas new Promise() always creates a new promise and thus takes an extra microtask to resolve.

I'll try this change out on your branch, and see if that fixes the problem.

debadree25 reacted with rocket emoji
All reactions
  • 🚀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25

debadree25 commented Nov 24, 2023

Copy link
Copy Markdown
Contributor Author

Thank you so much @MattiasBuelens for taking a look, I remember having done your method once but it resulted in some new failures but yes do let me know what you find!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

debadree25 added 2 commits November 26, 2023 19:50
@debadree25
stream: implement TransformStream cleanup using "transformer.cancel"
ee89ba1
Fixes: nodejs#49971
@debadree25
test: update wpts
867f64e
@debadree25
debadree25 force-pushed the ft/transform-cancel-impl branch from 744bd9f to 867f64e Compare November 26, 2023 14:21
debadree25 added 2 commits November 26, 2023 20:03
@debadree25
fixup! replace promise resolve
02205e7
@debadree25
fixup! useless import
67b0944
@debadree25

debadree25 commented Nov 26, 2023

Copy link
Copy Markdown
Contributor Author

Hey @MattiasBuelens so in the latest patches I have updated to remove the PromiseResolve(startResult) with new Promise((r) => r(startResult)) in both readable and writable stream so number of errors have reduced to 1 this single test:
readable.cancel() and a parallel writable.close() should reject if a transformer.cancel() calls controller.error() i am investigating it right now, but any insight you might have here?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

MattiasBuelens
MattiasBuelens reviewed Nov 28, 2023
View reviewed changes
Comment thread lib/internal/webstreams/transformstream.js Resolved

Uh oh!

There was an error while loading. Please reload this page.

@debadree25
fixup! wrong import remove
c627596
@MattiasBuelens

MattiasBuelens commented Dec 4, 2023

Copy link
Copy Markdown
Contributor

@debadree25 Apologies for the delay. I did some digging, and it turns out it's yet another case for Promise.resolve() versus new Promise().

The specification of TransformStreamDefaultSourceCancelAlgorithm says:

  1. Let cancelPromise be the result of performing controller.[[cancelAlgorithm]], passing reason.

You've implemented this step like this:

node/lib/internal/webstreams/transformstream.js

Lines 665 to 668 in c627596

const cancelPromise = ensureIsPromise(
controller[kState].cancelAlgorithm,
controller,
reason);

which uses Promise.resolve():

node/lib/internal/webstreams/util.js

Lines 183 to 190 in c627596

function ensureIsPromise(fn, thisArg, ...args) {
try {
const value = FunctionPrototypeCall(fn, thisArg, ...args);
return isPromise(value) ? value : PromiseResolve(value);
} catch (error) {
return PromiseReject(error);
}
}

On the other hand, the reference implementation generates the following helper function for the TransformerCancelCallback IDL type (see reference-implementation/generated/TransformerCancelCallback.js after running npm test):

  function invokeTheCallbackFunction(reason) {
    if (new.target !== undefined) {
      throw new Error("Internal error: invokeTheCallbackFunction is not a constructor");
    }

    const thisArg = utils.tryWrapperForImpl(this);
    let callResult;

    try {
      callResult = Reflect.apply(value, thisArg, [reason]);

      callResult = new Promise(resolve => resolve(callResult));
      return callResult;
    } catch (err) {
      return Promise.reject(err);
    }
  }

which uses new Promise().

If I change ensureIsPromise() to do this, the failure disappears:

return new Promise((r) => r(value));

Unfortunately, this leads to other unexpected failures. Hang on while I investigate those... 😅

saschanaz and debadree25 reacted with eyes emoji
All reactions
  • 👀 2 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25

debadree25 commented Dec 5, 2023

Copy link
Copy Markdown
Contributor Author

wohoo this seems like a game of whack a mole haha, thank you so much for finding that out let me too investigate along it same lines, i wonder would it be ok to implement this with some of these tests not passing or would that be too much of a deviation.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@MattiasBuelens

MattiasBuelens commented Dec 5, 2023

Copy link
Copy Markdown
Contributor

Yes, it's quite finnicky. 😛 I did some more digging last night, and I think I got all tests passing now. But it required quite a few changes, see the diff against your branch.

The main thing is that ensureIsPromise should only be used when constructing a stream from a user-land source/sink/transformer. Whenever we create an stream ourselves (like TransformStream.readable or ReadableStream.from(asyncIterable) or ReadableStream.tee()), the spec uses CreateReadableStream (and CreateReadableByteStream) instead. So it skips the whole new Promise() dance from Web IDL's "convert callback result to promise" steps, which means it runs one microtask "faster". And unfortunately, there are some WPT tests that are affected by this... 🙄

It's a bit of a sidetrack though, so maybe we can mark the current test failures as "expected" for this PR and we land my changes in a separate PR?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25
expect a failure
23e6183
@debadree25

debadree25 commented Dec 5, 2023

Copy link
Copy Markdown
Contributor Author

@MattiasBuelens i think that makes sense i have pushed a change to mark the one test as skipped we can do a spearate PR with your changes!

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25
debadree25 marked this pull request as ready for review December 5, 2023 11:02
@debadree25 debadree25 added the request-ci Add this label to start a Jenkins CI on a PR. Only starts once the PR has an approving review. label Dec 5, 2023
@debadree25

debadree25 commented Dec 5, 2023

Copy link
Copy Markdown
Contributor Author

Requesting @nodejs/whatwg-stream to please review this, things to note:

  • One of the test fails and that shall be fixed by @MattiasBuelens 's PR ref: streams: implement TransformStream cleanup using "transformer.cancel"  #50126 (comment)
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25
debadree25 requested a review from mcollina December 5, 2023 11:03
@nodejs-github-bot

nodejs-github-bot commented Dec 15, 2023

Copy link
Copy Markdown
Collaborator

CI: https://ci.nodejs.org/job/node-test-pull-request/56302/

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25 debadree25 added the commit-queue PRs queued for automated landing through the Commit Queue. label Dec 15, 2023
@nodejs-github-bot nodejs-github-bot added commit-queue-failed PRs whose Commit Queue landing failed and need manual intervention before retrying. and removed commit-queue PRs queued for automated landing through the Commit Queue. labels Dec 15, 2023
@nodejs-github-bot

nodejs-github-bot commented Dec 15, 2023

Copy link
Copy Markdown
Collaborator
Commit Queue failed
- Loading data for nodejs/node/pull/50126
✔  Done loading data for nodejs/node/pull/50126
----------------------------------- PR info ------------------------------------
Title      streams: implement TransformStream cleanup using "transformer.cancel"  (#50126)
Author     Debadree Chatterjee  (@debadree25)
Branch     debadree25:ft/transform-cancel-impl -> nodejs:main
Labels     author ready, needs-ci, web streams
Commits    7
 - stream: implement TransformStream cleanup using "transformer.cancel"
 - test: update wpts
 - fixup! replace promise resolve
 - fixup! useless import
 - fixup! wrong import remove
 - expect a failure
 - linting
Committers 1
 - Debadree Chatterjee 
PR-URL: https://github.com/nodejs/node/pull/50126
Fixes: https://github.com/nodejs/node/issues/49971
Reviewed-By: Matteo Collina 
------------------------------ Generated metadata ------------------------------
PR-URL: https://github.com/nodejs/node/pull/50126
Fixes: https://github.com/nodejs/node/issues/49971
Reviewed-By: Matteo Collina 
--------------------------------------------------------------------------------
   ℹ  This PR was created on Tue, 10 Oct 2023 18:02:35 GMT
   ✔  Approvals: 1
   ✔  - Matteo Collina (@mcollina) (TSC): https://github.com/nodejs/node/pull/50126#pullrequestreview-1778034957
   ✔  Last GitHub CI successful
   ℹ  Last Full PR CI on 2023-12-15T05:51:27Z: https://ci.nodejs.org/job/node-test-pull-request/56302/
- Querying data for job/node-test-pull-request/56302/
   ✔  Last Jenkins CI successful
--------------------------------------------------------------------------------
   ✔  No git cherry-pick in progress
   ✔  No git am in progress
   ✔  No git rebase in progress
--------------------------------------------------------------------------------
- Bringing origin/main up to date...
From https://github.com/nodejs/node
 * branch                  main       -> FETCH_HEAD
✔  origin/main is now up-to-date
- Downloading patch for 50126
From https://github.com/nodejs/node
 * branch                  refs/pull/50126/merge -> FETCH_HEAD
✔  Fetched commits as 5ac658102d8f..2557e8523dc4
--------------------------------------------------------------------------------
[main 49038c9224] stream: implement TransformStream cleanup using "transformer.cancel"
 Author: Debadree Chatterjee 
 Date: Sun Oct 1 18:22:42 2023 +0530
 1 file changed, 105 insertions(+), 10 deletions(-)
[main 3f5df10706] test: update wpts
 Author: Debadree Chatterjee 
 Date: Sun Oct 1 18:28:33 2023 +0530
 68 files changed, 301 insertions(+), 80 deletions(-)
 create mode 100644 test/fixtures/wpt/streams/piping/crashtests/cross-piping.html
 create mode 100644 test/fixtures/wpt/streams/transform-streams/cancel.any.js
Auto-merging lib/internal/webstreams/readablestream.js
[main 32bb27144f] fixup! replace promise resolve
 Author: Debadree Chatterjee 
 Date: Sun Nov 26 20:03:18 2023 +0530
 2 files changed, 5 insertions(+), 3 deletions(-)
[main e0f3339a27] fixup! useless import
 Author: Debadree Chatterjee 
 Date: Sun Nov 26 20:04:55 2023 +0530
 1 file changed, 2 deletions(-)
[main a3deac72aa] fixup! wrong import remove
 Author: Debadree Chatterjee 
 Date: Wed Nov 29 11:34:40 2023 +0530
 1 file changed, 1 insertion(+)
Auto-merging test/wpt/status/streams.json
[main 8a28e049eb] expect a failure
 Author: Debadree Chatterjee 
 Date: Tue Dec 5 16:31:19 2023 +0530
 1 file changed, 7 insertions(+)
[main b247e0c2e3] linting
 Author: Debadree Chatterjee 
 Date: Tue Dec 5 16:42:34 2023 +0530
 1 file changed, 22 insertions(+), 22 deletions(-)
   ✔  Patches applied
There are 7 commits in the PR. Attempting autorebase.
Rebasing (2/14)

Executing: git node land --amend --yes
⚠ Found Fixes: #49971, skipping..
--------------------------------- New Message ----------------------------------
stream: implement TransformStream cleanup using "transformer.cancel"

Fixes: #49971
PR-URL: #50126
Reviewed-By: Matteo Collina [email protected]

[detached HEAD ca8b3fdc3e] stream: implement TransformStream cleanup using "transformer.cancel"
Author: Debadree Chatterjee [email protected]
Date: Sun Oct 1 18:22:42 2023 +0530
1 file changed, 105 insertions(+), 10 deletions(-)
Rebasing (3/14)
Rebasing (4/14)

Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
test: update wpts

PR-URL: #50126
Fixes: #49971
Reviewed-By: Matteo Collina [email protected]

[detached HEAD e5f8ec4916] test: update wpts
Author: Debadree Chatterjee [email protected]
Date: Sun Oct 1 18:28:33 2023 +0530
68 files changed, 301 insertions(+), 80 deletions(-)
create mode 100644 test/fixtures/wpt/streams/piping/crashtests/cross-piping.html
create mode 100644 test/fixtures/wpt/streams/transform-streams/cancel.any.js
Rebasing (5/14)
Rebasing (6/14)

Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
fixup! replace promise resolve

PR-URL: #50126
Fixes: #49971
Reviewed-By: Matteo Collina [email protected]

[detached HEAD 1e893e258d] fixup! replace promise resolve
Author: Debadree Chatterjee [email protected]
Date: Sun Nov 26 20:03:18 2023 +0530
2 files changed, 5 insertions(+), 3 deletions(-)
Rebasing (7/14)
Rebasing (8/14)

Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
fixup! useless import

PR-URL: #50126
Fixes: #49971
Reviewed-By: Matteo Collina [email protected]

[detached HEAD 93a6ef04b7] fixup! useless import
Author: Debadree Chatterjee [email protected]
Date: Sun Nov 26 20:04:55 2023 +0530
1 file changed, 2 deletions(-)
Rebasing (9/14)
Rebasing (10/14)

Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
fixup! wrong import remove

PR-URL: #50126
Fixes: #49971
Reviewed-By: Matteo Collina [email protected]

[detached HEAD 96d8e2ad2b] fixup! wrong import remove
Author: Debadree Chatterjee [email protected]
Date: Wed Nov 29 11:34:40 2023 +0530
1 file changed, 1 insertion(+)
Rebasing (11/14)
Rebasing (12/14)

Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
expect a failure

PR-URL: #50126
Fixes: #49971
Reviewed-By: Matteo Collina [email protected]

[detached HEAD 678fdc7e63] expect a failure
Author: Debadree Chatterjee [email protected]
Date: Tue Dec 5 16:31:19 2023 +0530
1 file changed, 7 insertions(+)
Rebasing (13/14)
Rebasing (14/14)

Executing: git node land --amend --yes
--------------------------------- New Message ----------------------------------
linting

PR-URL: #50126
Fixes: #49971
Reviewed-By: Matteo Collina [email protected]

[detached HEAD 16dac7d711] linting
Author: Debadree Chatterjee [email protected]
Date: Tue Dec 5 16:42:34 2023 +0530
1 file changed, 22 insertions(+), 22 deletions(-)

Successfully rebased and updated refs/heads/main.

ℹ Add commit-queue-squash label to land the PR as one commit, or commit-queue-rebase to land as separate commits.

https://github.com/nodejs/node/actions/runs/7218936024

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25 debadree25 added commit-queue PRs queued for automated landing through the Commit Queue. commit-queue-squash PRs the Commit Queue should land as one squashed commit. and removed commit-queue-failed PRs whose Commit Queue landing failed and need manual intervention before retrying. labels Dec 15, 2023
@nodejs-github-bot nodejs-github-bot removed the commit-queue PRs queued for automated landing through the Commit Queue. label Dec 15, 2023
@nodejs-github-bot
nodejs-github-bot merged commit 7a2a4d0 into nodejs:main Dec 15, 2023
@nodejs-github-bot

nodejs-github-bot commented Dec 15, 2023

Copy link
Copy Markdown
Collaborator

Landed in 7a2a4d0

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@debadree25

debadree25 commented Dec 15, 2023

Copy link
Copy Markdown
Contributor Author

@MattiasBuelens you can now open a PR for the internal stream changes and also rebase the { min } implementation PR too!

MattiasBuelens reacted with hooray emoji
All reactions
  • 🎉 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

RafaelGSS pushed a commit that referenced this pull request Dec 15, 2023
@debadree25 @RafaelGSS
stream: implement TransformStream cleanup using "transformer.cancel"
71acd36
Fixes: #49971
PR-URL: #50126
Reviewed-By: Matteo Collina <[email protected]>
@RafaelGSS RafaelGSS mentioned this pull request Dec 15, 2023
v21.5.0 proposal #51166
Merged
@MattiasBuelens MattiasBuelens mentioned this pull request Dec 15, 2023
streams: fixes for webstreams #51168
Merged
@richardlau richardlau added the backport-requested-v20.x label Mar 25, 2024
@richardlau

richardlau commented Mar 25, 2024

Copy link
Copy Markdown
Member

This doesn't land cleanly on v20.x-staging and would need a manual backport.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@MattiasBuelens MattiasBuelens mentioned this pull request May 1, 2024
[v20.x backport] streams: implement TransformStream cleanup using "transformer.cancel" #52772
Closed
MattiasBuelens pushed a commit to MattiasBuelens/node that referenced this pull request May 1, 2024
@debadree25 @MattiasBuelens
stream: implement TransformStream cleanup using "transformer.cancel"
d36fbc3
Fixes: nodejs#49971
PR-URL: nodejs#50126
Backport-PR-URL: nodejs#52772
Reviewed-By: Matteo Collina <[email protected]>
@marco-ippolito marco-ippolito added backport-open-v20.x and removed backport-requested-v20.x labels May 1, 2024
marco-ippolito pushed a commit that referenced this pull request May 16, 2024
@debadree25 @marco-ippolito
stream: implement TransformStream cleanup using "transformer.cancel"
3dd96f1
Fixes: #49971
PR-URL: #50126
Backport-PR-URL: #52772
Reviewed-By: Matteo Collina <[email protected]>
@marco-ippolito marco-ippolito mentioned this pull request May 23, 2024
v20.14.0 proposal #53120
Merged
@targos targos added backported-to-v20.x and removed backport-open-v20.x labels Sep 30, 2024
@skyclouds2001 skyclouds2001 mentioned this pull request Dec 29, 2024
Add transformer.cancel method to TransformStream constructor mdn/browser-compat-data#25519
Merged
@hexchain hexchain mentioned this pull request Jun 28, 2025
node: add missing Transformer.cancel method DefinitelyTyped/DefinitelyTyped#73140
Merged
7 of 8 tasks
@alii alii mentioned this pull request Jun 22, 2026
streams: implement transformer.cancel for TransformStream oven-sh/bun#32595
Closed
@coderabbitai coderabbitai Bot mentioned this pull request Sep 12, 2026
Jakes cats site ImArtisann/artisann-port#11
Merged
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@MattiasBuelens MattiasBuelens MattiasBuelens left review comments
@mcollina mcollina mcollina approved these changes
@benjamingr benjamingr Awaiting requested review from benjamingr
@jasnell jasnell Awaiting requested review from jasnell

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

author ready PRs with CI started, the required approvals, and no outstanding review comments. commit-queue-squash PRs the Commit Queue should land as one squashed commit. needs-ci PRs that need a full CI run. web streams Issues and PRs related to the Web Streams API.

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Implement TransformStream cleanup using "transformer.cancel"

Uh oh!

There was an error while loading. Please reload this page.

8 participants

@debadree25 @saschanaz @MattiasBuelens @nodejs-github-bot @richardlau @mcollina @targos @marco-ippolito
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.