René's URL Explorer Experiment


Title: Adding Core support for Promises by chrisdickinson · Pull Request #5020 · nodejs/node · GitHub

Open Graph Title: Adding Core support for Promises by chrisdickinson · Pull Request #5020 · nodejs/node

X Title: Adding Core support for Promises by chrisdickinson · Pull Request #5020 · nodejs/node

Description: Update 02/02/16 15:07:00 PST: Current state of the PR. Update 02/01/16 14:10:00 PST: Current state of the PR. Newcomers: As a heads up, GitHub has started clipping the thread down. I'm going to start cataloguing common questions tonight, and I'll include them under this notice so that you can quickly look to see if there's an answer to your issue without having to search through the entire thread. Thanks for taking a look & weighing in! Whether you're for this change or against it, your feedback is valuable and I'll respond to it as soon as I'm able. FAQ / TL;DR for newcomers What is the current proposal? If landed, this will land behind a flag, moving out from behind the flag in the next major version as an unsupported API, finally becoming fully supported one major version after that. It does not replace or supersede the callback API, which will continue to be the canonical Node interface. Promise-returning variants will be exposed for all "single-operation" Node methods — that is to say, Streams and EventEmitter-based APIs are not included in this discussion. To use promises: const fs = require('fs') fs.readFile.promise(__filename).then(data => { }) Using promises with destructuring assignment (where available): const {readFile} = require('fs').promise readFile(__filename).then(data => { }) As a prerequisite to this PR landing, domains must work as expected with native Promises (they currently do not.) AsyncWrap is not blocked on this PR, neither is this PR blocked on AsyncWrap. Both PRs are blocked on getting adequate instrumentation of the microtask queue from V8 (we need a callback for "microtask enqueued" events so we can track their creation, and ideally a way to step the microtask queue forward ourselves, running code between invocations.) Why use the promisify approach? Response summed up here. Why not fs.readFileAsync? @phpnode notes that it could break existing users of bluebird.promisifyAll. Plus, the naming is contentious. Why not return promises when callbacks are not given? @jasnell expresses deep discomfort with switching return types. We already have to provide alternate APIs in some places due to Should programmer errors throw, or reject? Summed up here. What is the value in adding them to core? @rvagg has been massively helpful in driving this conversation forward: What are the killer arguments for including this, what is the value in adding this vs. leaving it userland?, @domenic notes that async/await is spec'd and roadmapped. My response. @mikeal notes that promises are part of the platform already, and that adding support increases the base of folks willing to help fix bugs with in interoperation with them @rvagg asks for clarification on the value as a part of this comment. My (wordy, sorry) response. How do you address the need to keep core small while expanding the exposed API? Where do we draw the line in supporting language-level constructs? @yoshuawuyts, @rvagg, and @DonutEspresso have largely driven this conversation: @yoshuawuyts asks. @mikeal responds. @brianleroux responds. My response. @DonutEspresso raises concerns. My response. @rvagg asks as a part of this comment. My (wordy, sorry) response. Why are modules (like require('fs/promise')) not in scope for this discussion? @phpnode, @RReverser, @mikeal, @ktrott, (and others, I'm sure!) have brought this up, and I've been pushing to have this conversation in a different, later issue. The conversation has mainly revolved around consensus, and the difficulty in attaining it when adding modules to the mix. @ktrott does an excellent job of summing up the concern. My (again wordy, sorry!) response. This is the original text of the PR. It does not reflect the current state of the conversation. See above for common themes! This PR introduces Core support for Promises. Where possible, callbacks have been made optional; when omitted, a Promise is returned. For some APIs (like http.get and crypto.randomBytes) this approach is not feasible. In those cases promise-returning *Async versions have been added (crypto.randomBytesAsync). The naming there isn't set in stone, but it's based on how bluebird's promisifyAll method generates names. This PR allows users to swap the implementation of promises used by core. This helps in a few dimensions: Folks that prefer a particular flavor of Promises for sugar methods can set the promise implementation at app-level and forget about it. This should alleviate concerns about stifling ecosystem creativity — putting promises in Core doesn't mean Core needs to pick a winner. Folks who prefer a faster implementation of promises can swap in their preferred library; folks who want to use whatever native debugging is added at the V8 level for native promises can avoid swapping in promises. A world of benchmarks opens up for Promise library authors — any code in the ecosystem that uses promises generated by core and has a benchmarking suite is a potential benchmark for promise libraries. The API for swapping implementations is process.setPromiseImplementation(). It may be used many times, however after the first time deprecation warnings are logged with the origin of the first call. This way if a package misbehaves and sets the implementation for an application, it's easy to track down. Example: process.setPromiseImplementation(require('bluebird')); const fs = require('fs'); fs.readFile('/usr/share/dict/words', 'utf8') .then(words => console.log(`there are ${words.split('\n').length} words`)) .catch(err => console.error(`there are no words`)); Streams are notably missing from this PR – promisifying streams is more involved since the ecosystem already relies on a common (and more importantly, often pinned) definition of how that type works. Changing streams will take effort and attention from the @nodejs/streams WG. All other callback-exposing modules and methods have been promisified (or an alternative made available), though. Three new internal modules have been added: lib/internal/promises — tracks the original builtin Promise object, as well as the currently selected Promise implementation. All promises created by Node are initially native, and then passed to the selected implementation's .resolve function to cast them. lib/internal/promisify — turn a callback-accepting function into one that accepts callbacks or generates promises. Errors thrown on the same tick are still thrown, not returned as rejected promises — in other words, programmer errors, such as invalid encodings, are still eagerly thrown. lib/internal/callbackify — turn a synchronous or promise-returning function into a callback-accepting function. This is only used in lib/readline for the completer functionality. This could probably fall off this PR, but it would be useful for subsequent changes to streams. Breaking Changes In general: any API that would have thrown with no callback most likely does not throw now. fs APIs called without a callback will no longer crash the process with an exception. ChildProcess#send with no callback no longer returns Boolean, instead returns Promise that resolves when .send has completed. Wrapped APIs: child_process.ChildProcess#send cluster.disconnect dgram.Socket#bind dgram.Socket#close dgram.Socket#send dgram.Socket#sendto dns.lookupService dns.lookup dns.resolve fs.access fs.appendFile fs.chmod fs.chown fs.close fs.exists fs.fchmod fs.fchown fs.fdatasync fs.fstat fs.fsync fs.ftruncate fs.futimes fs.lchmod fs.lchown fs.link fs.lstat fs.mkdir fs.open fs.readFile fs.readdir fs.readlink fs.realpath fs.rename fs.rmdir fs.stat fs.symlink fs.unlink fs.utimes fs.writeFile net.Socket#setTimeout readline.Interface#question repl.REPLServer#complete zlib.deflateRaw zlib.deflate zlib.gunzip zlib.gzip zlib.inflateRaw zlib.inflate zlib.unzip New APIs process.setPromiseImplementation net.connectAsync tls.connectAsync crypto.randomBytesAsync crypto.pbkdf2Async crypto.pseudoRandomBytesAsync crypto.rngAsync crypto.prngAsync http.getAsync https.getAsync http.requestAsync https.requestAsync child_process.execAsync child_process.execFileAsync Next steps I haven't finished this PR yet: the primary missing piece is tests for the promise-based APIs, to ensure that they resolve to the correct values. Docs also need updated. I'll be working on this in my free time over the next week. Here are the bits that I'd like folks reading this to keep in mind: The code changes here are fairly cheap, time-wise — one evening's worth of work. Technical possibility has never been the primary blocker. We know async/await is coming down the pipe, and many devs are interested in it. With ChakraCore potentially coming in, this may happen sooner than anyone previously imagined. Even sans the ChakraCore PR, it's my understanding that V8 will be supporting async/await by EOY (Correct me if I'm wrong, here!) Promises may not be your cup of tea. This is okay. This is not an attempt to replace callbacks or streams with promises. They can co-exist. While Promises are complicated, much of that complication falls out of the problem space that both callbacks and promises abstract over. Give this a fair shake.

Open Graph Description: Update 02/02/16 15:07:00 PST: Current state of the PR. Update 02/01/16 14:10:00 PST: Current state of the PR. Newcomers: As a heads up, GitHub has started clipping the thread down. I'm going to...

X Description: Update 02/02/16 15:07:00 PST: Current state of the PR. Update 02/01/16 14:10:00 PST: Current state of the PR. Newcomers: As a heads up, GitHub has started clipping the thread down. I'm goin...

Opengraph URL: https://github.com/nodejs/node/pull/5020

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/commits/:range(.:format)
route-controllerpull_requests
route-actioncommits
fetch-noncev2:98d11dae-a3d5-f92d-371b-ee80be28af14
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idC27E:19EE8A:21ACC9E:2D6B8CA:6A6555E7
html-safe-nonce12b94709550603dcc9644d4b6d7c8d5534571653cb45aa58bc4271c69f546d69
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMjdFOjE5RUU4QToyMUFDQzlFOjJENkI4Q0E6NkE2NTU1RTciLCJ2aXNpdG9yX2lkIjoiNTYyODk0NjY0MDU2MzE2NDY0NyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmac3add040d87c01f13b9636d8538492c3881840b7658a9c2a9cfc2e2f01d1644a6
hovercard-subject-tagpull_request:57815240
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/commits
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
twitter:imagehttps://avatars.githubusercontent.com/u/37303?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/37303?s=400&v=4
og:image:altUpdate 02/02/16 15:07:00 PST: Current state of the PR. Update 02/01/16 14:10:00 PST: Current state of the PR. Newcomers: As a heads up, GitHub has started clipping the thread down. I'm going to...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None52c76df668885aaff23b50bdca1fa1ea44ac9c1553e888ebc70ff1e4daa4625b
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/nodejs/node git https://github.com/nodejs/node.git
octolytics-dimension-user_id9950313
octolytics-dimension-user_loginnodejs
octolytics-dimension-repository_id27193779
octolytics-dimension-repository_nwonodejs/node
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id27193779
octolytics-dimension-repository_network_root_nwonodejs/node
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release309153364422b3c499922d1a2a6404910a58ed8e
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fpull%2F5020%2Fcommits%2Fa8efd4fcc875d7548bdf84d281b0975dc3ea5173
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
Code QualityEnforce quality at mergehttps://github.com/features/code-quality
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fpull%2F5020%2Fcommits%2Fa8efd4fcc875d7548bdf84d281b0975dc3ea5173
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Fcommits&source=header-repo&source_repo=nodejs%2Fnode
Reloadhttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Reloadhttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Reloadhttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Please reload this pagehttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
nodejs https://github.com/nodejs
nodehttps://github.com/nodejs/node
Please reload this pagehttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Notifications https://github.com/login?return_to=%2Fnodejs%2Fnode
Fork 36.1k https://github.com/login?return_to=%2Fnodejs%2Fnode
Star 118k https://github.com/login?return_to=%2Fnodejs%2Fnode
Code https://github.com/nodejs/node
Issues 1.3k https://github.com/nodejs/node/issues
Pull requests 1.1k https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality 0 https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
Code https://github.com/nodejs/node
Issues https://github.com/nodejs/node/issues
Pull requests https://github.com/nodejs/node/pulls
Actions https://github.com/nodejs/node/actions
Projects https://github.com/nodejs/node/projects
Security and quality https://github.com/nodejs/node/security
Insights https://github.com/nodejs/node/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fnodejs%2Fnode%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fnodejs%2Fnode%2Fissues%2Fnew%2Fchoose
chrisdickinsonhttps://github.com/chrisdickinson
nodejs:masterhttps://github.com/nodejs/node/tree/master
chrisdickinson:promiseshttps://github.com/chrisdickinson/node-1/tree/promises
Conversation 548 https://github.com/nodejs/node/pull/5020
Commits 33 https://github.com/nodejs/node/pull/5020/commits
Checks 0 https://github.com/nodejs/node/pull/5020/checks
Files changed https://github.com/nodejs/node/pull/5020/files
Please reload this pagehttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Adding Core support for Promises https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#top
Show all changes 33 commits https://github.com/nodejs/node/pull/5020/files
c1613c0 internal: add {callback,promis}ify.js chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/c1613c01a0808b246e333fb846bb0d297e8622db
a8efd4f zlib: promisify chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
4af7ec2 repl: promisify chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/4af7ec24e92cc667faf45db0b7574919eb52330d
0e0a2d9 readline: promisify .question + callbackify completer chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/0e0a2d9554299c1ee96a866d86b3bfe8b55f1c3a
8798a26 build: add callbackify and promisify to node.gyp chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/8798a26f9843bd5fd57b6a3434789c9af1846e4c
355205b net: promisify socket.setTimeout; add connectAsync chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/355205b36de46c1bdfa9ababe98ce497c4607b31
7b8e57d internal: fixup promisify chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/7b8e57dd07d8f468c3cac6d75aaa84d72e90a2c8
3f2b0d8 http,https: add {request,get}Async chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/3f2b0d8a12a9ab3f58b13442c7610ca099725a17
23ba073 fs: no callback -> return promise chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/23ba07370d19e40b0548088e3d9b096c1227aebd
68837b8 dns: promisify chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/68837b87097d3ca814ecb38e4226d38b9324a957
3317652 dgram: promisify .{bind,close,send} chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/3317652505017eca3346500e57c4804a528f536e
846bd49 doc,dgram: add promise notes to dgram docs chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/846bd493bcb0e611b9dc10c2145457d84764c071
d90b42c internal: add hooks for specifying different promise resolver chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/d90b42c69fc0bad866f5f5e435b2dcbc5d7c7054
adbe352 crypto: promisify pbkdf2, add randomBytesAsync chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/adbe35210cd9bd82011a5eab65c615b66295b83d
697ce01 child_process,cluster: promisify .send(), add exec{File,}Async chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/697ce018bb1b73872b4f48872c7fec3b4fd71060
f36b62d add process.setPromiseImplementation chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/f36b62d848b864f172d31d02dfcf585ce47e003a
082fa08 process: add setPromiseImplementation API chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/082fa0801032e98650f8c67e113b701f8195508d
54e3001 tls,net: connectAsync should resolve to Socket chrisdickinson Feb 1, 2016 https://github.com/nodejs/node/pull/5020/commits/54e30012a579a434f3f1c474dc7b818c30d48ab8
014fb3e lib: repromisify chrisdickinson Feb 2, 2016 https://github.com/nodejs/node/pull/5020/commits/014fb3eddcea80b8be65318f304580127c1a1258
15a42c1 repromisify chrisdickinson Feb 2, 2016 https://github.com/nodejs/node/pull/5020/commits/15a42c17668eb79e1f09cc0959bd0763e218a54f
8586b10 src,lib: move back to native promises chrisdickinson Feb 2, 2016 https://github.com/nodejs/node/pull/5020/commits/8586b10cb5bc99a64d9c5d19e7fff2a90f50a96c
40ca55e domain,promise,src: add shim to make promises work with async_wrap + … chrisdickinson Feb 2, 2016 https://github.com/nodejs/node/pull/5020/commits/40ca55e54a27c21e11fa7cf7c7f49700e197f0fb
3928beb domain: promises capture process.domain at .then time chrisdickinson Feb 2, 2016 https://github.com/nodejs/node/pull/5020/commits/3928beb34d4fef169df2cf9ff32d2ed11627de19
fa725b3 src: back asyncwrap integration out of this pr chrisdickinson Feb 2, 2016 https://github.com/nodejs/node/pull/5020/commits/fa725b3fff5b714535094f50d80b7c4a26c54c4a
0528d74 internal: lint chrisdickinson Feb 3, 2016 https://github.com/nodejs/node/pull/5020/commits/0528d74b1bf1d2a549d0f72f6bc774f4b09ffe40
010224a http{,s}: getAsync only listens for error once chrisdickinson Feb 5, 2016 https://github.com/nodejs/node/pull/5020/commits/010224a18fb27a05870033fecae1632e96e2f1ad
6ae09c5 http{s,}: nix {request,get}Async chrisdickinson Feb 10, 2016 https://github.com/nodejs/node/pull/5020/commits/6ae09c50135b43f4e40aa4cb5104da39f1315d82
670a9c2 rework promisifier chrisdickinson Feb 10, 2016 https://github.com/nodejs/node/pull/5020/commits/670a9c2a9f743bc77b421e44397362889f532f60
240c72d src: add flag chrisdickinson Feb 10, 2016 https://github.com/nodejs/node/pull/5020/commits/240c72d0aa2c772eac602fdc10a97fedafb00fbe
565dfe2 fix handler chrisdickinson Feb 11, 2016 https://github.com/nodejs/node/pull/5020/commits/565dfe2720184413f94e74a3583f802142b7f31d
3384ab0 introduce .promised chrisdickinson Feb 11, 2016 https://github.com/nodejs/node/pull/5020/commits/3384ab05dbcabe3a8c9281481838409d5de58225
4e38057 bugfix: use outer arguments chrisdickinson Feb 11, 2016 https://github.com/nodejs/node/pull/5020/commits/4e38057a76b0ddc11ad5faabf6bacb295ad354a2
8c97549 wip: add recovery object chrisdickinson Feb 11, 2016 https://github.com/nodejs/node/pull/5020/commits/8c975499a951779c115dc2998d8df1b2976d22fa
Clear filters https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Please reload this pagehttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Please reload this pagehttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
Prev https://github.com/nodejs/node/pull/5020/commits/c1613c01a0808b246e333fb846bb0d297e8622db
Next https://github.com/nodejs/node/pull/5020/commits/4af7ec24e92cc667faf45db0b7574919eb52330d
Please reload this pagehttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173
https://github.com/chrisdickinson
chrisdickinsonhttps://github.com/nodejs/node/commits?author=chrisdickinson
lib/zlib.jshttps://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#diff-2386e2eaad6fb3c2f1de21d9594a6411b12910fc17e4b4f12d37e87ab3f547a4
View file https://github.com/chrisdickinson/node-1/blob/a8efd4fcc875d7548bdf84d281b0975dc3ea5173/lib/zlib.js
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/nodejs/node/pull/5020/commits/{{ revealButtonHref }}
https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#diff-2386e2eaad6fb3c2f1de21d9594a6411b12910fc17e4b4f12d37e87ab3f547a4
https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#diff-2386e2eaad6fb3c2f1de21d9594a6411b12910fc17e4b4f12d37e87ab3f547a4
https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#diff-2386e2eaad6fb3c2f1de21d9594a6411b12910fc17e4b4f12d37e87ab3f547a4
https://github.com/nodejs/node/pull/5020/commits/a8efd4fcc875d7548bdf84d281b0975dc3ea5173#diff-2386e2eaad6fb3c2f1de21d9594a6411b12910fc17e4b4f12d37e87ab3f547a4
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.