@@ -358,6 +358,8 @@ size_t StringBytes::Write(Isolate* isolate,
358358 break ;
359359 }
360360
361+ case BASE64URL:
362+ // Fall through
361363 case BASE64:
362364 if (str->IsExternalOneByte ()) {
363365 auto ext = str->GetExternalOneByteStringResource ();
@@ -425,6 +427,8 @@ Maybe<size_t> StringBytes::StorageSize(Isolate* isolate,
425427 data_size = str->Length () * sizeof (uint16_t );
426428 break ;
427429
430+ case BASE64URL:
431+ // Fall through
428432 case BASE64:
429433 data_size = base64_decoded_size_fast (str->Length ());
430434 break ;
@@ -466,6 +470,8 @@ Maybe<size_t> StringBytes::Size(Isolate* isolate,
466470 case UCS2:
467471 return Just (str->Length () * sizeof (uint16_t ));
468472
473+ case BASE64URL:
474+ // Fall through
469475 case BASE64: {
470476 String::Value value (isolate, str);
471477 return Just (base64_decoded_size (*value, value.length ()));
@@ -691,6 +697,20 @@ MaybeLocal<Value> StringBytes::Encode(Isolate* isolate,
691697 return ExternOneByteString::New (isolate, dst, dlen, error);
692698 }
693699
700+ case BASE64URL: {
701+ size_t dlen = base64_encoded_size (buflen, Base64Mode::URL);
702+ char * dst = node::UncheckedMalloc (dlen);
703+ if (dst == nullptr ) {
704+ *error = node::ERR_MEMORY_ALLOCATION_FAILED (isolate);
705+ return MaybeLocal<Value>();
706+ }
707+
708+ size_t written = base64_encode (buf, buflen, dst, dlen, Base64Mode::URL);
709+ CHECK_EQ (written, dlen);
710+
711+ return ExternOneByteString::New (isolate, dst, dlen, error);
712+ }
713+
694714 case HEX: {
695715 size_t dlen = buflen * 2 ;
696716 char * dst = node::UncheckedMalloc (dlen);
0 commit comments