Repository navigation
btoa() and atob() #3462
Description
Activity
- addedfeature requestIssues requesting new Node.js features.Issues requesting new Node.js features.
on Oct 21, 2015 I'd be up for writing a bunch of tests if people want to see this happen
While I understand the desire on this, it could just as easily be implemented as a userland module that registers the globals. I'm -0 on adding it in to core.
Reacted by Frederic CharetteReacted by curt, Golo Roden, Evgeny Kochetkov, miller46, Braden Snell, Alex, Jordan Brennan, MythologicalEngineer, Luke Tanner, Manuel K and 25 moreI think I'm -1 on this for the same reason.
Reacted by curt, Golo Roden, miller46, MythologicalEngineer, Luke Tanner, Manuel K, Jimmy Wärting, Sylvie Fox, 2qx, Merlin Westphal and 11 morefunction btoa(str) { if (Buffer.byteLength(str) !== str.length) throw new Error('bad string!'); return Buffer(str, 'binary').toString('base64'); }
Think that will about cover it.
Update: actually, that's a bad length check and I'm too tired to work the correct one. we'd probably have to expose
v8::String::ContainsOnlyOneByte()for the fastest option.Reacted by Shyam, Christophe Marois, Avindra Goolcharan, Busticated, Akonwi Ngoh, Arkadiusz Wieczorek, Blas Rodriguez Irizar, Tripp Lyons, Ostap Skryshevskyi, Spencer Jones and 16 moreI'd rather not add more globals, ever if possible.
The fact that you are linking to a userland package that already gets over a 1000 downloads a week (via npm) is solid evidence that the need for this, in core at least, is very minimal
Reacted by curt, Golo Roden, Eric Newland, Kevin Stech, Matthew Ludwig, Miriam Vellacott, Almeida, Jon Telles and Nato BoramBy the way: Why doesn't v8 provide functions like these?
They're browser extensions, they're not part of the ECMAScript spec: https://html.spec.whatwg.org/multipage/webappapis.html#atob
Reacted by chpio, Steven Barnett, gcbw and Matthew LudwigFeel free to continue discussing, but given the -1's, I'm closing.
Reacted by Yves M., Kevin Stech and Frederic CharetteReacted by Nikolay Kuchumov, curt, Golo Roden, truelecter, miller46, Joshua Harms, Manuel K, Jeff Baranski, sliftist, Jędrzej Majko and 12 more- added 3 commits that reference this issue
on Nov 30, 2015 - added a commit that references this issue
on Dec 15, 2015 53 remaining items
looking at WHAT spec btoa/atob only handle strings with 8bits, so emoji etc. will throw errors, likely those APIs are not sufficient, but I do not see a web API that does universal base64 transformation except FileReader.prototype.readAsDataURL.
for base 64 there is https://en.wikipedia.org/wiki/Base64#RFC_4648
I have helped to maintain a library that has quite a bit of usage in this space
https://github.com/brianloveswords/base64url with 877k weekly downloads.
Could be worth looking at that for API inspiration
Opened a pr that implemented this and the immediate reaction was meh given that our current mechanisms for this are better and it's something that is easily handled by userland. Closing the issue as it's not something we're likely to land.
- added 2 commits that reference this issue
on Mar 18, 2021 - added 2 commits that reference this issue
on Mar 20, 2021 In nodejs/citgm#852 (comment) it was flagged that there are some new globals in node v16 including
atob()andbtoa()that our test suites should account for. If these are here to stay we'll ensure our test suites allow these globals, but based on what @jasnell mentioned above it seems like they may not land in node v16. Any clarity on this would be much appreciated!@devinivy these landed already, so I think it's safe for lab to start tracking them as allowed globals.
Reacted by devin ivy, Beth Griggs, Jon Telles and Charles Crossan- added 2 commits that reference this issue
on May 1, 2021 It's weird, so most people were against it but it landed anyway under the radar..
@Tofandel ... there is no "under the radar" here. All changes go through the same review and approval process before landing, and all discussions/reviews are public.
All major browsers expose the
btoaandatobglobals for encoding ASCII strings as base64 and vice versa. It'd be beneficial for the "isomorphic" javascript topic if we'd provide these too:As for the implementation, we can't
Buffer('string').toString('base64')because that would encode unicode whileatobandbtoamust per spec throw on charcodes > 255. https://github.com/mathiasbynens/base64 looks like a solid implemenation we could pretty much drop in.