@@ -30,6 +30,7 @@ using v8::String;
30
30
using v8::Value;
31
31
using v8::ValueDeserializer;
32
32
using v8::ValueSerializer;
33
+ using v8::WasmCompiledModule;
33
34
34
35
namespace node {
35
36
namespace worker {
@@ -43,13 +44,15 @@ namespace {
43
44
// `MessagePort`s and `SharedArrayBuffer`s, and make new JS objects out of them.
44
45
class DeserializerDelegate : public ValueDeserializer ::Delegate {
45
46
public:
46
- DeserializerDelegate (Message* m,
47
- Environment* env,
48
- const std::vector<MessagePort*>& message_ports,
49
- const std::vector<Local<SharedArrayBuffer>>&
50
- shared_array_buffers)
51
- : message_ports_(message_ports),
52
- shared_array_buffers_ (shared_array_buffers) {}
47
+ DeserializerDelegate (
48
+ Message* m,
49
+ Environment* env,
50
+ const std::vector<MessagePort*>& message_ports,
51
+ const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers,
52
+ const std::vector<WasmCompiledModule::TransferrableModule>& wasm_modules)
53
+ : message_ports_(message_ports),
54
+ shared_array_buffers_ (shared_array_buffers),
55
+ wasm_modules_(wasm_modules) {}
53
56
54
57
MaybeLocal<Object> ReadHostObject (Isolate* isolate) override {
55
58
// Currently, only MessagePort hosts objects are supported, so identifying
@@ -67,11 +70,19 @@ class DeserializerDelegate : public ValueDeserializer::Delegate {
67
70
return shared_array_buffers_[clone_id];
68
71
}
69
72
73
+ MaybeLocal<WasmCompiledModule> GetWasmModuleFromId (
74
+ Isolate* isolate, uint32_t transfer_id) override {
75
+ CHECK_LE (transfer_id, wasm_modules_.size ());
76
+ return WasmCompiledModule::FromTransferrableModule (
77
+ isolate, wasm_modules_[transfer_id]);
78
+ }
79
+
70
80
ValueDeserializer* deserializer = nullptr ;
71
81
72
82
private:
73
83
const std::vector<MessagePort*>& message_ports_;
74
84
const std::vector<Local<SharedArrayBuffer>>& shared_array_buffers_;
85
+ const std::vector<WasmCompiledModule::TransferrableModule>& wasm_modules_;
75
86
};
76
87
77
88
} // anonymous namespace
@@ -109,7 +120,8 @@ MaybeLocal<Value> Message::Deserialize(Environment* env,
109
120
}
110
121
shared_array_buffers_.clear ();
111
122
112
- DeserializerDelegate delegate (this , env, ports, shared_array_buffers);
123
+ DeserializerDelegate delegate (
124
+ this , env, ports, shared_array_buffers, wasm_modules_);
113
125
ValueDeserializer deserializer (
114
126
env->isolate (),
115
127
reinterpret_cast <const uint8_t *>(main_message_buf_.data ),
@@ -143,6 +155,11 @@ void Message::AddMessagePort(std::unique_ptr<MessagePortData>&& data) {
143
155
message_ports_.emplace_back (std::move (data));
144
156
}
145
157
158
+ uint32_t Message::AddWASMModule (WasmCompiledModule::TransferrableModule&& mod) {
159
+ wasm_modules_.emplace_back (std::move (mod));
160
+ return wasm_modules_.size () - 1 ;
161
+ }
162
+
146
163
namespace {
147
164
148
165
void ThrowDataCloneException (Environment* env, Local<String> message) {
@@ -202,6 +219,11 @@ class SerializerDelegate : public ValueSerializer::Delegate {
202
219
return Just (i);
203
220
}
204
221
222
+ Maybe<uint32_t > GetWasmModuleTransferId (
223
+ Isolate* isolate, Local<WasmCompiledModule> module) override {
224
+ return Just (msg_->AddWASMModule (module->GetTransferrableModule ()));
225
+ }
226
+
205
227
void Finish () {
206
228
// Only close the MessagePort handles and actually transfer them
207
229
// once we know that serialization succeeded.
0 commit comments