@@ -1211,6 +1211,41 @@ void DetachArrayBuffer(const FunctionCallbackInfo<Value>& args) {
12111211 }
12121212}
12131213
1214+ static void Btoa (const FunctionCallbackInfo<Value>& args) {
1215+ CHECK_EQ (args.Length (), 1 );
1216+ Environment* env = Environment::GetCurrent (args);
1217+ THROW_AND_RETURN_IF_NOT_STRING (env, args[0 ], " argument" );
1218+
1219+ Local<String> input = args[0 ].As <String>();
1220+ MaybeStackBuffer<char > buffer;
1221+ size_t written;
1222+
1223+ if (input->IsExternalOneByte ()) { // 8-bit case
1224+ auto ext = input->GetExternalOneByteStringResource ();
1225+ size_t expected_length = simdutf::base64_length_from_binary (ext->length ());
1226+ buffer.AllocateSufficientStorage (expected_length + 1 );
1227+ buffer.SetLengthAndZeroTerminate (expected_length);
1228+ written = simdutf::binary_to_base64 (
1229+ ext->data (), ext->length (), buffer.out (), simdutf::base64_default);
1230+ } else { // 16-bit case
1231+ String::Value value (env->isolate (), input);
1232+ auto data = reinterpret_cast <const char *>(*value);
1233+ size_t expected_length = simdutf::base64_length_from_binary (value.length ());
1234+ buffer.AllocateSufficientStorage (expected_length + 1 );
1235+ buffer.SetLengthAndZeroTerminate (expected_length);
1236+ written = simdutf::binary_to_base64 (
1237+ data, value.length (), buffer.out (), simdutf::base64_default);
1238+ }
1239+
1240+ auto value =
1241+ String::NewFromOneByte (env->isolate (),
1242+ reinterpret_cast <const uint8_t *>(buffer.out ()),
1243+ NewStringType::kNormal ,
1244+ written)
1245+ .ToLocalChecked ();
1246+ return args.GetReturnValue ().Set (value);
1247+ }
1248+
12141249// In case of success, the decoded string is returned.
12151250// In case of error, a negative value is returned:
12161251// * -1 indicates a single character remained,
@@ -1329,6 +1364,7 @@ void Initialize(Local<Object> target,
13291364 Isolate* isolate = env->isolate ();
13301365
13311366 SetMethodNoSideEffect (context, target, " atob" , Atob);
1367+ SetMethodNoSideEffect (context, target, " btoa" , Btoa);
13321368
13331369 SetMethod (context, target, " setBufferPrototype" , SetBufferPrototype);
13341370 SetMethodNoSideEffect (context, target, " createFromString" , CreateFromString);
@@ -1433,6 +1469,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
14331469 registry->Register (CopyArrayBuffer);
14341470
14351471 registry->Register (Atob);
1472+ registry->Register (Btoa);
14361473}
14371474
14381475} // namespace Buffer
0 commit comments