Class: Dommy::MessagePort
- Inherits:
-
Object
- Object
- Dommy::MessagePort
show all
- Includes:
- EventTarget
- Defined in:
- lib/dommy/message_channel.rb
Overview
‘MessagePort` — one end of a MessageChannel. `postMessage(value)` dispatches a `MessageEvent` on the entangled port asynchronously.
Instance Method Summary
collapse
#__deliver_event__, #add_event_listener, #dispatch_event, #invoke_listener, #remove_event_listener
Constructor Details
Returns a new instance of MessagePort.
34
35
36
37
38
39
40
|
# File 'lib/dommy/message_channel.rb', line 34
def initialize(window)
@window = window
@entangled = nil
@onmessage = nil
@started = false
@pending = []
end
|
Instance Method Details
#__enqueue__(event) ⇒ Object
83
84
85
|
# File 'lib/dommy/message_channel.rb', line 83
def __enqueue__(event)
@pending << event
end
|
#__entangle__(other) ⇒ Object
42
43
44
|
# File 'lib/dommy/message_channel.rb', line 42
def __entangle__(other)
@entangled = other
end
|
#__event_parent__ ⇒ Object
125
126
127
|
# File 'lib/dommy/message_channel.rb', line 125
def __event_parent__
nil
end
|
#__js_call__(method, args) ⇒ Object
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/dommy/message_channel.rb', line 108
def __js_call__(method, args)
case method
when "postMessage"
post_message(args[0])
when "start"
start
when "close"
close
when "addEventListener"
add_event_listener(args[0], args[1], args[2])
when "removeEventListener"
remove_event_listener(args[0], args[1])
when "dispatchEvent"
dispatch_event(args[0])
end
end
|
#__js_get__(key) ⇒ Object
87
88
89
90
91
92
|
# File 'lib/dommy/message_channel.rb', line 87
def __js_get__(key)
case key
when "onmessage"
@onmessage
end
end
|
#__js_set__(key, value) ⇒ Object
94
95
96
97
98
99
100
101
102
103
104
105
106
|
# File 'lib/dommy/message_channel.rb', line 94
def __js_set__(key, value)
case key
when "onmessage"
remove_event_listener("message", @onmessage) if @onmessage
@onmessage = value
@inline_message_handler = value
add_event_listener("message", value) if value
start if value
end
nil
end
|
#__started__? ⇒ Boolean
79
80
81
|
# File 'lib/dommy/message_channel.rb', line 79
def __started__?
@started || !@inline_message_handler.nil?
end
|
#close ⇒ Object
74
75
76
77
|
# File 'lib/dommy/message_channel.rb', line 74
def close
@entangled = nil
nil
end
|
#post_message(data) ⇒ Object
Also known as:
postMessage
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/dommy/message_channel.rb', line 46
def post_message(data)
port = @entangled
return unless port
@window.scheduler.queue_microtask(
proc do
evt = MessageEvent.new("message", "data" => Dommy.structured_clone(data))
if port.__started__?
port.dispatch_event(evt)
else
port.__enqueue__(evt)
end
end
)
nil
end
|
#start ⇒ Object
66
67
68
69
70
71
72
|
# File 'lib/dommy/message_channel.rb', line 66
def start
@started = true
flush = @pending
@pending = []
flush.each { |evt| dispatch_event(evt) }
nil
end
|