@@ -31,6 +31,7 @@ using v8::MaybeLocal;
3131using v8::Nothing;
3232using v8::Object;
3333using v8::SharedArrayBuffer;
34+ using v8::SharedValueConveyor;
3435using v8::String;
3536using v8::Symbol;
3637using v8::Value;
@@ -92,10 +93,12 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
9293 Environment* env,
9394 const std::vector<BaseObjectPtr<BaseObject>>& host_objects,
9495 const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers,
95- const std::vector<CompiledWasmModule>& wasm_modules)
96+ const std::vector<CompiledWasmModule>& wasm_modules,
97+ const std::optional<SharedValueConveyor>& shared_value_conveyor)
9698 : host_objects_(host_objects),
9799 shared_array_buffers_(shared_array_buffers),
98- wasm_modules_(wasm_modules) {}
100+ wasm_modules_(wasm_modules),
101+ shared_value_conveyor_(shared_value_conveyor) {}
99102
100103 MaybeLocal<Object> ReadHostObject(Isolate* isolate) override {
101104 // Identifying the index in the message's BaseObject array is sufficient.
@@ -128,12 +131,18 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
128131 isolate, wasm_modules_[transfer_id]);
129132 }
130133
134+ const SharedValueConveyor* GetSharedValueConveyor(Isolate* isolate) override {
135+ CHECK(shared_value_conveyor_.has_value());
136+ return &shared_value_conveyor_.value();
137+ }
138+
131139 ValueDeserializer* deserializer = nullptr;
132140
133141 private:
134142 const std::vector<BaseObjectPtr<BaseObject>>& host_objects_;
135143 const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers_;
136144 const std::vector<CompiledWasmModule>& wasm_modules_;
145+ const std::optional<SharedValueConveyor>& shared_value_conveyor_;
137146};
138147
139148} // anonymous namespace
@@ -198,8 +207,12 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
198207 shared_array_buffers.push_back(sab);
199208 }
200209
201- DeserializerDelegate delegate(
202- this, env, host_objects, shared_array_buffers, wasm_modules_);
210+ DeserializerDelegate delegate(this,
211+ env,
212+ host_objects,
213+ shared_array_buffers,
214+ wasm_modules_,
215+ shared_value_conveyor_);
203216 ValueDeserializer deserializer(
204217 env->isolate(),
205218 reinterpret_cast<const uint8_t*>(main_message_buf_.data),
@@ -243,6 +256,10 @@ uint32_t Message::AddWASMModule(CompiledWasmModule&& mod) {
243256 return wasm_modules_.size() - 1;
244257}
245258
259+ void Message::AdoptSharedValueConveyor(SharedValueConveyor&& conveyor) {
260+ shared_value_conveyor_.emplace(std::move(conveyor));
261+ }
262+
246263namespace {
247264
248265MaybeLocal<Function> GetEmitMessageFunction(Local<Context> context) {
@@ -347,6 +364,12 @@ class SerializerDelegate : public ValueSerializer::Delegate {
347364 return Just(msg_->AddWASMModule(module->GetCompiledModule()));
348365 }
349366
367+ bool AdoptSharedValueConveyor(Isolate* isolate,
368+ SharedValueConveyor&& conveyor) override {
369+ msg_->AdoptSharedValueConveyor(std::move(conveyor));
370+ return true;
371+ }
372+
350373 Maybe<bool> Finish(Local<Context> context) {
351374 for (uint32_t i = 0; i < host_objects_.size(); i++) {
352375 BaseObjectPtr<BaseObject> host_object = std::move(host_objects_[i]);
0 commit comments