/* * Copyright (c) 2022, Daniel Ehrenberg * Copyright (c) 2022, Andrew Kaster * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include // Structured serialize is an entirely different format from IPC because: // - It contains representation of type information // - It may contain circularities // - It is restricted to JS values namespace Web::HTML { using SerializationRecord = Vector; using SerializationMemory = HashMap, u32>; using DeserializationMemory = JS::MarkedVector; struct TransferDataHolder { Vector data; Vector fds; }; struct SerializedTransferRecord { SerializationRecord serialized; Vector transfer_data_holders; }; struct DeserializedTransferRecord { JS::Value deserialized; Vector> transferred_values; }; enum class TransferType : u8 { MessagePort, }; WebIDL::ExceptionOr structured_serialize(JS::VM& vm, JS::Value); WebIDL::ExceptionOr structured_serialize_for_storage(JS::VM& vm, JS::Value); WebIDL::ExceptionOr structured_serialize_internal(JS::VM& vm, JS::Value, bool for_storage, SerializationMemory&); WebIDL::ExceptionOr structured_deserialize(JS::VM& vm, SerializationRecord const& serialized, JS::Realm& target_realm, Optional); WebIDL::ExceptionOr structured_serialize_with_transfer(JS::VM& vm, JS::Value value, Vector> const& transfer_list); WebIDL::ExceptionOr structured_deserialize_with_transfer(JS::VM& vm, SerializedTransferRecord&); } namespace IPC { template<> ErrorOr encode(Encoder&, ::Web::HTML::SerializedTransferRecord const&); template<> ErrorOr encode(Encoder&, ::Web::HTML::TransferDataHolder const&); template<> ErrorOr<::Web::HTML::SerializedTransferRecord> decode(Decoder&); template<> ErrorOr<::Web::HTML::TransferDataHolder> decode(Decoder&); }