ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
client_frames.cpp
Go to the documentation of this file.
1#include <emscripten/bind.h>
2#include "client_bytes.h"
3extern "C" {
4#include "../client.h"
5}
6#include <cstdint>
7#include <vector>
8
9static ClientFrameResult validate_frame(ClientBytes encoded, unsigned width, unsigned height, unsigned checksum,
10 unsigned flags, ClientBytes contract, unsigned original_size) {
11 const size_t input_size = encoded["length"].as<size_t>();
12 const size_t metadata_size = contract["length"].as<size_t>();
13 const bool compressed = (flags & 2) != 0;
14 if (!input_size || input_size > 16 * 1024 * 1024 || !original_size || original_size > 16 * 1024 * 1024 ||
15 metadata_size > 275 || (!compressed && input_size != original_size)) {
16 emscripten::val result = emscripten::val::object();
17 result.set("code", static_cast<int>(SET_ERRNO(ERROR_INVALID_PARAM, "Invalid encoded frame or metadata size")));
18 result.set("decodeFailed", false);
19 result.set("bytes", binding_copy_output(nullptr, 0));
20 return ClientFrameResult(result);
21 }
22 auto input = binding_copy_input(encoded);
23 auto metadata = binding_copy_input(contract);
24 std::vector<uint8_t> decoded(compressed ? original_size : 0);
25 const uint8_t *text = compressed ? decoded.data() : input.data();
26 int code = compressed ? client_decode_frame_data(input.data(), input.size(), decoded.data(), decoded.size()) : 0;
27 const bool decode_failed = code != 0;
28 if (!code)
29 code = client_validate_frame(reinterpret_cast<const char *>(text), original_size, width, height, checksum, flags,
30 metadata.empty() ? nullptr : metadata.data(), metadata.size());
31 emscripten::val result = emscripten::val::object();
32 result.set("code", code);
33 result.set("decodeFailed", decode_failed);
34 result.set("bytes", binding_copy_output(text, code == 0 ? original_size : 0));
35 return ClientFrameResult(result);
36}
37
38EMSCRIPTEN_BINDINGS(ascii_chat_client_frames) {
39 emscripten::register_type<ClientFrameResult>("ClientFrameResult",
40 "{ code: number; decodeFailed: boolean; bytes: Uint8Array }");
41 emscripten::function("validateFrame", &validate_frame);
42}
#define SET_ERRNO(code,...)
emscripten::val binding_copy_output(const void *data, size_t length)
Definition byte_arrays.h:18
std::vector< uint8_t > binding_copy_input(emscripten::val bytes)
Definition byte_arrays.h:6
EMSCRIPTEN_BINDINGS(ascii_chat_client_frames)
unsigned int height
Definition fft.c:23
unsigned int width
Definition fft.c:23
unsigned char uint8_t
Definition common.h:60
@ ERROR_INVALID_PARAM
asciichat_error_t client_validate_frame(const char *text, size_t length, uint32_t width, uint32_t height, uint32_t checksum, uint32_t flags, const void *metadata, size_t metadata_length)
asciichat_error_t client_decode_frame_data(const void *encoded, size_t encoded_length, void *output, size_t output_length)