Skip to content

Commit

Permalink
feat(client): Add TextEncoder + TextDecoder (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
xLuxy committed Apr 7, 2024
1 parent 817bf6b commit 65fe62d
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
5 changes: 5 additions & 0 deletions client/src/classes/TextDecoder.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#include "Class.h"

extern js::Class textDecoderClass("TextDecoder", [](js::ClassTemplate& tpl)
{
});
57 changes: 57 additions & 0 deletions client/src/classes/TextEncoder.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#include "Class.h"

static void EncodingGetter(js::LazyPropertyContext& ctx)
{
ctx.Return(std::string("utf-8"));
}


static void Encode(js::FunctionContext& ctx)
{
if (!ctx.CheckArgCount(1)) return;

std::string str;
if (!ctx.GetArg(0, str)) return;

size_t size = str.size();
v8::Local<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New(ctx.GetIsolate(), size);
std::shared_ptr<v8::BackingStore> backingStore = buffer->GetBackingStore();
memcpy(backingStore->Data(), str.data(), size);

ctx.Return(v8::Uint8Array::New(buffer, 0, size));
}

static void EncodeInto(js::FunctionContext& ctx)
{
if (!ctx.CheckArgCount(2)) return;

v8::Local<v8::String> value;
if (!ctx.GetArg(0, value)) return;
if (!ctx.Check(value->IsString(), "Argument 0 must be a string")) return;

v8::Local<v8::Uint8Array> arr;
if (!ctx.GetArg(1, arr)) return;
if (!ctx.Check(arr->IsUint8Array(), "Argument 1 must be a Uint8Array")) return;

v8::Local<v8::String> str = value.As<v8::String>();
v8::Local<v8::Uint8Array> uint8Array = arr.As<v8::Uint8Array>();

v8::Local<v8::ArrayBuffer> buffer = uint8Array->Buffer();
char* data = (char*)((uintptr_t)buffer->GetBackingStore()->Data() + uint8Array->ByteOffset());

size_t length = uint8Array->ByteLength();
size_t writeSize = str->WriteUtf8(ctx.GetIsolate(), data, length, nullptr, v8::String::NO_NULL_TERMINATION | v8::String::REPLACE_INVALID_UTF8);

js::Object result;
result.Set("read", writeSize);
result.Set("written", writeSize);
ctx.Return(result);
}

extern js::Class textEncoderClass("TextEncoder", [](js::ClassTemplate& tpl)
{
tpl.LazyProperty("encoding", EncodingGetter);

tpl.Method("encode", Encode);
tpl.Method("encodeInto", EncodeInto);
});
5 changes: 3 additions & 2 deletions client/src/modules/AltModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -500,15 +500,16 @@ extern js::Class playerClass, localPlayerClass, vehicleClass, pedClass, objectCl
audioClass, audioFilterClass, blipClass, markerClass, textLabelClass, checkpointClass, webViewClass, fontClass,
localPedClass, localVehicleClass, rmlDocumentClass, rmlElementClass, localObjectClass, webSocketClientClass,
mapZoomDataClass, virtualEntityClass, virtualEntityGroupClass, weaponDataClass, handlingClass, handlingDataClass,
httpClientClass, audioOutputClass, audioOutputAttachedClass, audioOutputFrontendClass, audioOutputWorldClass, audioCategoryClass;
httpClientClass, audioOutputClass, audioOutputAttachedClass, audioOutputFrontendClass, audioOutputWorldClass, audioCategoryClass,
textEncoderClass, textDecoderClass;
extern js::Namespace eventsNamespace, discordNamespace, voiceNamespace, localStorageNamespace, statsNamespace, focusDataNamespace,
gxtNamespace, cursorNamespace, camNamespace, streamingNamespace, configFlagNamespace;
static js::Module altModule("@altv/client", "@altv/shared",
{ &playerClass, &localPlayerClass, &vehicleClass, &pedClass, &objectClass,
&audioClass, &audioFilterClass, &blipClass, &markerClass, &textLabelClass, &checkpointClass, &webViewClass, &fontClass,
&localPedClass, &localVehicleClass, &rmlDocumentClass, &rmlElementClass, &localObjectClass, &webSocketClientClass,
&mapZoomDataClass, &virtualEntityClass, &virtualEntityGroupClass, &weaponDataClass, &handlingClass, &handlingDataClass,
&httpClientClass, &audioOutputClass, &audioOutputAttachedClass, &audioOutputFrontendClass, &audioOutputWorldClass, &audioCategoryClass },
&httpClientClass, &audioOutputClass, &audioOutputAttachedClass, &audioOutputFrontendClass, &audioOutputWorldClass, &audioCategoryClass, &textEncoderClass/*, &textDecoderClass*/ },
[](js::ModuleTemplate& module) {
module.StaticProperty("isClient", true);
module.StaticProperty("isServer", false);
Expand Down

0 comments on commit 65fe62d

Please sign in to comment.