88#include " buffer-string-search.h"
99#include < workerd/jsg/buffersource.h>
1010#include < kj/encoding.h>
11- #include < algorithm >
11+ #include < kj/array.h >
1212#include " simdutf.h"
13+ #include " i18n.h"
14+
15+ #include < algorithm>
1316
1417// These are defined by <sys/byteorder.h> or <netinet/in.h> on some systems.
1518// To avoid warnings, undefine them before redefining them.
@@ -85,34 +88,24 @@ void SwapBytes(kj::ArrayPtr<kj::byte> bytes) {
8588 }
8689}
8790
88- enum class Encoding {
89- ASCII,
90- LATIN1,
91- UTF8,
92- UTF16LE,
93- BASE64,
94- BASE64URL,
95- HEX,
96- };
97-
98- Encoding getEncoding (kj::StringPtr encoding) {
99- if (encoding == " utf8" _kj) {
91+ inline Encoding getEncoding (kj::StringPtr input) {
92+ if (input == " utf8" _kj) {
10093 return Encoding::UTF8;
101- } else if (encoding == " ascii" ) {
94+ } else if (input == " ascii" _kj ) {
10295 return Encoding::ASCII;
103- } else if (encoding == " latin1" ) {
96+ } else if (input == " latin1" _kj ) {
10497 return Encoding::LATIN1;
105- } else if (encoding == " utf16le" ) {
98+ } else if (input == " utf16le" _kj ) {
10699 return Encoding::UTF16LE;
107- } else if (encoding == " base64" ) {
100+ } else if (input == " base64" _kj ) {
108101 return Encoding::BASE64;
109- } else if (encoding == " base64url" ) {
102+ } else if (input == " base64url" _kj ) {
110103 return Encoding::BASE64URL;
111- } else if (encoding == " hex" ) {
104+ } else if (input == " hex" _kj ) {
112105 return Encoding::HEX;
113106 }
114107
115- KJ_UNREACHABLE ;
108+ JSG_FAIL_REQUIRE (Error, kj::str ( " Invalid encoding: " , input)) ;
116109}
117110
118111kj::Maybe<uint> tryFromHexDigit (char c) {
@@ -137,7 +130,7 @@ kj::Array<byte> decodeHexTruncated(kj::ArrayPtr<kj::byte> text, bool strict = fa
137130 }
138131 text = text.slice (0 , text.size () - 1 );
139132 }
140- kj::Vector vec = kj::Vector<kj::byte>(text.size () / 2 );
133+ auto vec = kj::Vector<kj::byte>(text.size () / 2 );
141134
142135 for (size_t i = 0 ; i < text.size (); i += 2 ) {
143136 byte b = 0 ;
@@ -216,8 +209,9 @@ uint32_t writeInto(
216209 dest.first (amountToCopy).copyFrom (bytes.first (amountToCopy));
217210 return amountToCopy;
218211 }
212+ default :
213+ KJ_UNREACHABLE;
219214 }
220- KJ_UNREACHABLE;
221215}
222216
223217kj::Array<kj::byte> decodeStringImpl (
@@ -272,8 +266,9 @@ kj::Array<kj::byte> decodeStringImpl(
272266 string.writeInto (js, buf, options);
273267 return decodeHexTruncated (buf, strict);
274268 }
269+ default :
270+ KJ_UNREACHABLE;
275271 }
276- KJ_UNREACHABLE;
277272}
278273} // namespace
279274
@@ -561,8 +556,9 @@ jsg::JsString toStringImpl(
561556 case Encoding::HEX: {
562557 return js.str (kj::encodeHex (slice));
563558 }
559+ default :
560+ KJ_UNREACHABLE;
564561 }
565- KJ_UNREACHABLE;
566562}
567563
568564} // namespace
@@ -876,5 +872,16 @@ bool BufferUtil::isUtf8(kj::Array<kj::byte> buffer) {
876872 return simdutf::validate_utf8 (buffer.asChars ().begin (), buffer.size ());
877873}
878874
875+ kj::Array<kj::byte> BufferUtil::transcode (kj::Array<kj::byte> source, kj::String rawFromEncoding, kj::String rawToEncoding) {
876+ auto fromEncoding = getEncoding (rawFromEncoding);
877+ auto toEncoding = getEncoding (rawToEncoding);
878+
879+ JSG_REQUIRE (i18n::canBeTranscoded (fromEncoding) &&
880+ i18n::canBeTranscoded (toEncoding), Error,
881+ " Unable to transcode buffer due to unsupported encoding" );
882+
883+ return i18n::transcode (source, fromEncoding, toEncoding);
884+ }
885+
879886} // namespace workerd::api::node {
880887
0 commit comments