@@ -76,37 +76,49 @@ static ObjectRef* InstantiateMessageEvent(ExecutionStateRef* state,
7676
7777 // Create a new MessageEvent
7878 auto option = ObjectRef::create (state);
79- option->setExtraData ((void *)(event));
79+
80+ struct MessageEventExtraData : public gc {
81+ std::shared_ptr<MessageEventSync::HandleData> handle;
82+ };
83+
84+ if (event->IsSync ()) {
85+ auto * data = new MessageEventExtraData ();
86+ auto * event_sync =
87+ reinterpret_cast <MessageEventSync*>(const_cast <MessageEvent*>(event));
88+ data->handle = event_sync->handle_data ();
89+ option->setExtraData (data);
90+ }
91+
8092 // TODO: Use atomic string
8193 option->set (state, OneByteString (" data" ), OneByteString (event->data ()));
8294 option->set (state, OneByteString (" origin" ), OneByteString (event->origin ()));
8395
84- SetMethod (state,
85- option ,
86- " setResult " ,
87- [](ExecutionStateRef* state ,
88- ValueRef* this_value ,
89- size_t argc ,
90- ValueRef** argv ,
91- bool is_construct) -> ValueRef* {
92- if (argc < 1 || !argv[ 0 ]-> isString ()) {
93- state-> throwException ( TypeErrorObjectRef::create (
94- state, OneByteString ( " Invalid argument " )));
95- }
96-
97- auto event = GetExtraData<MessageEvent>(this_value);
98- if (!event-> IsSync ()) {
99- state->throwException (ErrorObjectRef::create (
100- state,
101- ErrorObjectRef::Code::None,
102- OneByteString (" only support MessageEventSync" )));
103- }
104-
105- reinterpret_cast <MessageEventSync*>(event)-> SetResult (
106- argv[0 ]->asString ()->toStdUTF8String ());
107-
108- return ValueRef::createUndefined ();
109- });
96+ SetMethod (
97+ state ,
98+ option ,
99+ " setResult " ,
100+ [](ExecutionStateRef* state ,
101+ ValueRef* this_value ,
102+ size_t argc ,
103+ ValueRef** argv,
104+ bool is_construct) -> ValueRef* {
105+ if (argc < 1 || !argv[ 0 ]-> isString ()) {
106+ state-> throwException ( TypeErrorObjectRef::create (
107+ state, OneByteString ( " Invalid argument " )));
108+ }
109+
110+ if (!this_value-> asObject ()-> extraData ()) {
111+ state->throwException (ErrorObjectRef::create (
112+ state,
113+ ErrorObjectRef::Code::None,
114+ OneByteString (" only support MessageEventSync" )));
115+ }
116+
117+ auto * data = GetExtraData<MessageEventExtraData>(this_value);
118+ data-> handle -> promise . set_value ( argv[0 ]->asString ()->toStdUTF8String ());
119+
120+ return ValueRef::createUndefined ();
121+ });
110122
111123 ValueRef* argv[] = {OneByteString (" message" ), option};
112124 return klass->construct (state, COUNT_OF (argv), argv)->asObject ();
0 commit comments