opal-webpack-loader 0.11.1 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1a1b24301ed05a439abf847ae77a460919a227d250432d0c769d3080d100dec
4
- data.tar.gz: 48f48641c277ecbf2fd50a7c274bdcf94b960dc28bf5103da70555815b70112f
3
+ metadata.gz: 72bce8591ed4cf66ed4e64c958097d4bddcc6b4f80d88be3b5c8214c943a4d1d
4
+ data.tar.gz: d6a8ce887e177e69eda71dc4ef25f85d4a0e6556e181fa9d90eae1d61cbd1595
5
5
  SHA512:
6
- metadata.gz: 7ef00f2c1e57f71eadaae2a3b2edc6c47745c980a1f85921b0ca9e6e0b092e960c9c3971826ffec3ca22b42e56d45a9b36bd6d692b794b97f23c2343f043e25d
7
- data.tar.gz: a5ebdd0518490d0eea2e78de43f1527f333b32ab778603fd24cc8052c3870aa4e5408a631c6a0a676185d7355f488c4cc605f5b8a793418a2072ed3c09174b85
6
+ metadata.gz: '0438b5c05ad48d5a13975df55efe3bf8c2191264146aa2f76829f46a098dbd1209fdb46b4e90a1be9e3553ced638aa82f092babdc24aa98360c7a3319ba347bd'
7
+ data.tar.gz: 13a44603a84954f7789147856ef20682080c3d0b2719c638a72b42b737d55d935080e5cd4480c21f6ef51732ab76c8e74925697a3c5b7e7bc12458b17a5d0368
File without changes
File without changes
data/bin/owl-compiler CHANGED
File without changes
File without changes
data/bin/owl-install CHANGED
File without changes
@@ -1,219 +1,219 @@
1
- require 'ffi'
2
-
3
- module OpalWebpackLoader
4
- module WindowsyThings
5
- extend FFI::Library
6
-
7
- ffi_lib :kernel32, :user32
8
-
9
- ERROR_IO_PENDING = 997
10
- ERROR_PIPE_CONNECTED = 535
11
- ERROR_SUCCESS = 0
12
-
13
- FILE_FLAG_OVERLAPPED = 0x40000000
14
-
15
- INFINITE = 0xFFFFFFFF
16
- INVALID_HANDLE_VALUE = FFI::Pointer.new(-1).address
17
-
18
- PIPE_ACCESS_DUPLEX = 0x00000003
19
- PIPE_READMODE_BYTE = 0x00000000
20
- PIPE_READMODE_MESSAGE = 0x00000002
21
- PIPE_TYPE_BYTE = 0x00000000
22
- PIPE_TYPE_MESSAGE = 0x00000004
23
- PIPE_WAIT = 0x00000000
24
-
25
- QS_ALLINPUT = 0x04FF
26
-
27
- typedef :uintptr_t, :handle
28
-
29
- attach_function :ConnectNamedPipe, [:handle, :pointer], :ulong
30
- attach_function :CreateEvent, :CreateEventA, [:pointer, :ulong, :ulong, :string], :handle
31
- attach_function :CreateNamedPipe, :CreateNamedPipeA, [:string, :ulong, :ulong, :ulong, :ulong, :ulong, :ulong, :pointer], :handle
32
- attach_function :DisconnectNamedPipe, [:handle], :bool
33
- attach_function :FlushFileBuffers, [:handle], :bool
34
- attach_function :GetLastError, [], :ulong
35
- attach_function :GetOverlappedResult, [:handle, :pointer, :pointer, :bool], :bool
36
- attach_function :MsgWaitForMultipleObjects, [:ulong, :pointer, :ulong, :ulong, :ulong], :ulong
37
- attach_function :ReadFile, [:handle, :buffer_out, :ulong, :pointer, :pointer], :bool
38
- attach_function :SetEvent, [:handle], :bool
39
- attach_function :WaitForMultipleObjects, [:ulong, :pointer, :ulong, :ulong], :ulong
40
- attach_function :WriteFile, [:handle, :buffer_in, :ulong, :pointer, :pointer], :bool
41
- end
42
-
43
- class PipeServer
44
- include OpalWebpackLoader::WindowsyThings
45
-
46
- CONNECTING_STATE = 0
47
- READING_STATE = 1
48
- WRITING_STATE = 2
49
- INSTANCES = 4
50
- PIPE_TIMEOUT = 5000
51
- BUFFER_SIZE = 65536
52
-
53
- class Overlapped < FFI::Struct
54
- layout(
55
- :Internal, :uintptr_t,
56
- :InternalHigh, :uintptr_t,
57
- :Offset, :ulong,
58
- :OffsetHigh, :ulong,
59
- :hEvent, :uintptr_t
60
- )
61
- end
62
-
63
- def initialize(pipe_name, instances = 4, &block)
64
- @run_block = block
65
- @full_pipe_name = "\\\\.\\pipe\\#{pipe_name}"
66
- @instances = instances
67
- @events = []
68
- @events_pointer = FFI::MemoryPointer.new(:uintptr_t, @instances)
69
- @pipes = []
70
- end
71
-
72
- def run
73
- create_instances
74
- while_loop
75
- end
76
-
77
- private
78
-
79
- def create_instances
80
- (0...@instances).each do |i|
81
- @events[i] = CreateEvent(nil, 1, 1, nil)
82
- raise "CreateEvent failed with #{GetLastError()}" unless @events[i]
83
-
84
- overlap = Overlapped.new
85
- overlap[:hEvent] = @events[i]
86
-
87
- @pipes[i] = { overlap: overlap, instance: nil, request: FFI::Buffer.new(1, BUFFER_SIZE), bytes_read: 0, reply: FFI::Buffer.new(1, BUFFER_SIZE), bytes_to_write: 0, state: nil, pending_io: false }
88
- @pipes[i][:instance] = CreateNamedPipe(@full_pipe_name,
89
- PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
90
- PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
91
- @instances,
92
- BUFFER_SIZE,
93
- BUFFER_SIZE,
94
- PIPE_TIMEOUT,
95
- nil)
96
-
97
- raise "CreateNamedPipe failed with #{GetLastError()}" if @pipes[i][:instance] == INVALID_HANDLE_VALUE
98
- @pipes[i][:pending_io] = connect_to_new_client(i)
99
- @pipes[i][:state] = @pipes[i][:pending_io] ? CONNECTING_STATE : READING_STATE
100
- end
101
- @events_pointer.write_array_of_ulong_long(@events)
102
- nil
103
- end
104
-
105
- def while_loop
106
- while true
107
- i = MsgWaitForMultipleObjects(@instances, @events_pointer, 0, INFINITE, QS_ALLINPUT)
108
- # Having this STDOUT.putc is essential, otherwise there is a tendency to block within MsgWaitForMultipleObjects ...
109
- STDOUT.putc "."
110
- # ... because the ruby interpreter is waiting for objects too on Windows. Thats why we wait for QS_ALLINPUT and
111
- # with STDOUT.putc give back control to the ruby interpreter that it can handle its things.
112
- if i < 0 || i > (@instances - 1)
113
- STDERR.puts "Pipe index out of range. Maybe a error occured."
114
- next
115
- end
116
-
117
- if @pipes[i][:pending_io]
118
- bytes_transferred = FFI::MemoryPointer.new(:ulong)
119
- success = GetOverlappedResult(@pipes[i][:instance], @pipes[i][:overlap], bytes_transferred, false)
120
-
121
- case @pipes[i][:state]
122
- when CONNECTING_STATE
123
- raise "Error #{GetLastError()}" unless success
124
- @pipes[i][:state] = READING_STATE
125
- when READING_STATE
126
- if !success || bytes_transferred.read_ulong == 0
127
- disconnect_and_reconnect(i)
128
- next
129
- else
130
- @pipes[i][:bytes_read] = bytes_transferred.read_ulong
131
- @pipes[i][:state] = WRITING_STATE
132
- end
133
- when WRITING_STATE
134
- if !success || bytes_transferred.read_ulong != @pipes[i][:bytes_to_write]
135
- disconnect_and_reconnect(i)
136
- next
137
- else
138
- @pipes[i][:state] = READING_STATE
139
- end
140
- else
141
- raise "Invalid pipe state."
142
- end
143
- end
144
-
145
- case @pipes[i][:state]
146
- when READING_STATE
147
- bytes_read = FFI::MemoryPointer.new(:ulong)
148
- success = ReadFile(@pipes[i][:instance], @pipes[i][:request], BUFFER_SIZE, bytes_read, @pipes[i][:overlap].to_ptr)
149
- if success && bytes_read.read_ulong != 0
150
- @pipes[i][:pending_io] = false
151
- @pipes[i][:state] = WRITING_STATE
152
- next
153
- end
154
-
155
- err = GetLastError()
156
- if !success && err == ERROR_IO_PENDING
157
- @pipes[i][:pending_io] = true
158
- next
159
- end
160
-
161
- disconnect_and_reconnect(i)
162
- when WRITING_STATE
163
- @pipes[i][:reply] = @run_block.call(@pipes[i][:request].get_string(0))
164
- @pipes[i][:bytes_to_write] = @pipes[i][:reply].bytesize
165
- bytes_written = FFI::MemoryPointer.new(:ulong)
166
- success = WriteFile(@pipes[i][:instance], @pipes[i][:reply], @pipes[i][:bytes_to_write], bytes_written, @pipes[i][:overlap].to_ptr)
167
-
168
- if success && bytes_written.read_ulong == @pipes[i][:bytes_to_write]
169
- @pipes[i][:pending_io] = false
170
- @pipes[i][:state] = READING_STATE
171
- next
172
- end
173
-
174
- err = GetLastError()
175
-
176
- if !success && err == ERROR_IO_PENDING
177
- @pipes[i][:pending_io] = true
178
- next
179
- end
180
-
181
- disconnect_and_reconnect(i)
182
- else
183
- raise "Invalid pipe state."
184
- end
185
- end
186
- end
187
-
188
- def disconnect_and_reconnect(i)
189
- FlushFileBuffers(@pipes[i][:instance])
190
- STDERR.puts("DisconnectNamedPipe failed with #{GetLastError()}") if !DisconnectNamedPipe(@pipes[i][:instance])
191
-
192
- @pipes[i][:pending_io] = connect_to_new_client(i)
193
-
194
- @pipes[i][:state] = @pipes[i][:pending_io] ? CONNECTING_STATE : READING_STATE
195
- end
196
-
197
- def connect_to_new_client(i)
198
- pending_io = false
199
- @pipes[i][:request].clear
200
- @pipes[i][:reply].clear
201
- connected = ConnectNamedPipe(@pipes[i][:instance], @pipes[i][:overlap].to_ptr)
202
- last_error = GetLastError()
203
- raise "ConnectNamedPipe failed with #{last_error} - #{connected}" if connected != 0
204
-
205
- case last_error
206
- when ERROR_IO_PENDING
207
- pending_io = true
208
- when ERROR_PIPE_CONNECTED
209
- SetEvent(@pipes[i][:overlap][:hEvent])
210
- when ERROR_SUCCESS
211
- pending_io = true
212
- else
213
- raise "ConnectNamedPipe failed with error #{last_error}"
214
- end
215
-
216
- pending_io
217
- end
218
- end
219
- end
1
+ require 'ffi'
2
+
3
+ module OpalWebpackLoader
4
+ module WindowsyThings
5
+ extend FFI::Library
6
+
7
+ ffi_lib :kernel32, :user32
8
+
9
+ ERROR_IO_PENDING = 997
10
+ ERROR_PIPE_CONNECTED = 535
11
+ ERROR_SUCCESS = 0
12
+
13
+ FILE_FLAG_OVERLAPPED = 0x40000000
14
+
15
+ INFINITE = 0xFFFFFFFF
16
+ INVALID_HANDLE_VALUE = FFI::Pointer.new(-1).address
17
+
18
+ PIPE_ACCESS_DUPLEX = 0x00000003
19
+ PIPE_READMODE_BYTE = 0x00000000
20
+ PIPE_READMODE_MESSAGE = 0x00000002
21
+ PIPE_TYPE_BYTE = 0x00000000
22
+ PIPE_TYPE_MESSAGE = 0x00000004
23
+ PIPE_WAIT = 0x00000000
24
+
25
+ QS_ALLINPUT = 0x04FF
26
+
27
+ typedef :uintptr_t, :handle
28
+
29
+ attach_function :ConnectNamedPipe, [:handle, :pointer], :ulong
30
+ attach_function :CreateEvent, :CreateEventA, [:pointer, :ulong, :ulong, :string], :handle
31
+ attach_function :CreateNamedPipe, :CreateNamedPipeA, [:string, :ulong, :ulong, :ulong, :ulong, :ulong, :ulong, :pointer], :handle
32
+ attach_function :DisconnectNamedPipe, [:handle], :bool
33
+ attach_function :FlushFileBuffers, [:handle], :bool
34
+ attach_function :GetLastError, [], :ulong
35
+ attach_function :GetOverlappedResult, [:handle, :pointer, :pointer, :bool], :bool
36
+ attach_function :MsgWaitForMultipleObjects, [:ulong, :pointer, :ulong, :ulong, :ulong], :ulong
37
+ attach_function :ReadFile, [:handle, :buffer_out, :ulong, :pointer, :pointer], :bool
38
+ attach_function :SetEvent, [:handle], :bool
39
+ attach_function :WaitForMultipleObjects, [:ulong, :pointer, :ulong, :ulong], :ulong
40
+ attach_function :WriteFile, [:handle, :buffer_in, :ulong, :pointer, :pointer], :bool
41
+ end
42
+
43
+ class PipeServer
44
+ include OpalWebpackLoader::WindowsyThings
45
+
46
+ CONNECTING_STATE = 0
47
+ READING_STATE = 1
48
+ WRITING_STATE = 2
49
+ INSTANCES = 4
50
+ PIPE_TIMEOUT = 5000
51
+ BUFFER_SIZE = 65536
52
+
53
+ class Overlapped < FFI::Struct
54
+ layout(
55
+ :Internal, :uintptr_t,
56
+ :InternalHigh, :uintptr_t,
57
+ :Offset, :ulong,
58
+ :OffsetHigh, :ulong,
59
+ :hEvent, :uintptr_t
60
+ )
61
+ end
62
+
63
+ def initialize(pipe_name, instances = 4, &block)
64
+ @run_block = block
65
+ @full_pipe_name = "\\\\.\\pipe\\#{pipe_name}"
66
+ @instances = instances
67
+ @events = []
68
+ @events_pointer = FFI::MemoryPointer.new(:uintptr_t, @instances)
69
+ @pipes = []
70
+ end
71
+
72
+ def run
73
+ create_instances
74
+ while_loop
75
+ end
76
+
77
+ private
78
+
79
+ def create_instances
80
+ (0...@instances).each do |i|
81
+ @events[i] = CreateEvent(nil, 1, 1, nil)
82
+ raise "CreateEvent failed with #{GetLastError()}" unless @events[i]
83
+
84
+ overlap = Overlapped.new
85
+ overlap[:hEvent] = @events[i]
86
+
87
+ @pipes[i] = { overlap: overlap, instance: nil, request: FFI::Buffer.new(1, BUFFER_SIZE), bytes_read: 0, reply: FFI::Buffer.new(1, BUFFER_SIZE), bytes_to_write: 0, state: nil, pending_io: false }
88
+ @pipes[i][:instance] = CreateNamedPipe(@full_pipe_name,
89
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
90
+ PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
91
+ @instances,
92
+ BUFFER_SIZE,
93
+ BUFFER_SIZE,
94
+ PIPE_TIMEOUT,
95
+ nil)
96
+
97
+ raise "CreateNamedPipe failed with #{GetLastError()}" if @pipes[i][:instance] == INVALID_HANDLE_VALUE
98
+ @pipes[i][:pending_io] = connect_to_new_client(i)
99
+ @pipes[i][:state] = @pipes[i][:pending_io] ? CONNECTING_STATE : READING_STATE
100
+ end
101
+ @events_pointer.write_array_of_ulong_long(@events)
102
+ nil
103
+ end
104
+
105
+ def while_loop
106
+ while true
107
+ i = MsgWaitForMultipleObjects(@instances, @events_pointer, 0, INFINITE, QS_ALLINPUT)
108
+ # Having this STDOUT.putc is essential, otherwise there is a tendency to block within MsgWaitForMultipleObjects ...
109
+ STDOUT.putc "."
110
+ # ... because the ruby interpreter is waiting for objects too on Windows. Thats why we wait for QS_ALLINPUT and
111
+ # with STDOUT.putc give back control to the ruby interpreter that it can handle its things.
112
+ if i < 0 || i > (@instances - 1)
113
+ STDERR.puts "Pipe index out of range. Maybe a error occured."
114
+ next
115
+ end
116
+
117
+ if @pipes[i][:pending_io]
118
+ bytes_transferred = FFI::MemoryPointer.new(:ulong)
119
+ success = GetOverlappedResult(@pipes[i][:instance], @pipes[i][:overlap], bytes_transferred, false)
120
+
121
+ case @pipes[i][:state]
122
+ when CONNECTING_STATE
123
+ raise "Error #{GetLastError()}" unless success
124
+ @pipes[i][:state] = READING_STATE
125
+ when READING_STATE
126
+ if !success || bytes_transferred.read_ulong == 0
127
+ disconnect_and_reconnect(i)
128
+ next
129
+ else
130
+ @pipes[i][:bytes_read] = bytes_transferred.read_ulong
131
+ @pipes[i][:state] = WRITING_STATE
132
+ end
133
+ when WRITING_STATE
134
+ if !success || bytes_transferred.read_ulong != @pipes[i][:bytes_to_write]
135
+ disconnect_and_reconnect(i)
136
+ next
137
+ else
138
+ @pipes[i][:state] = READING_STATE
139
+ end
140
+ else
141
+ raise "Invalid pipe state."
142
+ end
143
+ end
144
+
145
+ case @pipes[i][:state]
146
+ when READING_STATE
147
+ bytes_read = FFI::MemoryPointer.new(:ulong)
148
+ success = ReadFile(@pipes[i][:instance], @pipes[i][:request], BUFFER_SIZE, bytes_read, @pipes[i][:overlap].to_ptr)
149
+ if success && bytes_read.read_ulong != 0
150
+ @pipes[i][:pending_io] = false
151
+ @pipes[i][:state] = WRITING_STATE
152
+ next
153
+ end
154
+
155
+ err = GetLastError()
156
+ if !success && err == ERROR_IO_PENDING
157
+ @pipes[i][:pending_io] = true
158
+ next
159
+ end
160
+
161
+ disconnect_and_reconnect(i)
162
+ when WRITING_STATE
163
+ @pipes[i][:reply] = @run_block.call(@pipes[i][:request].get_string(0))
164
+ @pipes[i][:bytes_to_write] = @pipes[i][:reply].bytesize
165
+ bytes_written = FFI::MemoryPointer.new(:ulong)
166
+ success = WriteFile(@pipes[i][:instance], @pipes[i][:reply], @pipes[i][:bytes_to_write], bytes_written, @pipes[i][:overlap].to_ptr)
167
+
168
+ if success && bytes_written.read_ulong == @pipes[i][:bytes_to_write]
169
+ @pipes[i][:pending_io] = false
170
+ @pipes[i][:state] = READING_STATE
171
+ next
172
+ end
173
+
174
+ err = GetLastError()
175
+
176
+ if !success && err == ERROR_IO_PENDING
177
+ @pipes[i][:pending_io] = true
178
+ next
179
+ end
180
+
181
+ disconnect_and_reconnect(i)
182
+ else
183
+ raise "Invalid pipe state."
184
+ end
185
+ end
186
+ end
187
+
188
+ def disconnect_and_reconnect(i)
189
+ FlushFileBuffers(@pipes[i][:instance])
190
+ STDERR.puts("DisconnectNamedPipe failed with #{GetLastError()}") if !DisconnectNamedPipe(@pipes[i][:instance])
191
+
192
+ @pipes[i][:pending_io] = connect_to_new_client(i)
193
+
194
+ @pipes[i][:state] = @pipes[i][:pending_io] ? CONNECTING_STATE : READING_STATE
195
+ end
196
+
197
+ def connect_to_new_client(i)
198
+ pending_io = false
199
+ @pipes[i][:request].clear
200
+ @pipes[i][:reply].clear
201
+ connected = ConnectNamedPipe(@pipes[i][:instance], @pipes[i][:overlap].to_ptr)
202
+ last_error = GetLastError()
203
+ raise "ConnectNamedPipe failed with #{last_error} - #{connected}" if connected != 0
204
+
205
+ case last_error
206
+ when ERROR_IO_PENDING
207
+ pending_io = true
208
+ when ERROR_PIPE_CONNECTED
209
+ SetEvent(@pipes[i][:overlap][:hEvent])
210
+ when ERROR_SUCCESS
211
+ pending_io = true
212
+ else
213
+ raise "ConnectNamedPipe failed with error #{last_error}"
214
+ end
215
+
216
+ pending_io
217
+ end
218
+ end
219
+ end
@@ -21,6 +21,6 @@
21
21
  "webpack": "^4.46.0",
22
22
  "webpack-assets-manifest": "^4.0.6",
23
23
  "webpack-cli": "^4.7.0",
24
- "webpack-dev-server": "^3.11.2"
24
+ "webpack-dev-server": "^4.0.0-rc.0"
25
25
  }
26
26
  }
@@ -1,3 +1,3 @@
1
- module OpalWebpackLoader
2
- VERSION="0.11.1"
3
- end
1
+ module OpalWebpackLoader
2
+ VERSION="0.11.2"
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal-webpack-loader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.1
4
+ version: 0.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-26 00:00:00.000000000 Z
11
+ date: 2021-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opal
@@ -257,7 +257,7 @@ licenses:
257
257
  - MIT
258
258
  metadata:
259
259
  github_repo: ssh://github.com/isomorfeus/gems
260
- post_install_message:
260
+ post_install_message:
261
261
  rdoc_options: []
262
262
  require_paths:
263
263
  - lib
@@ -273,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
273
273
  version: '0'
274
274
  requirements: []
275
275
  rubygems_version: 3.2.15
276
- signing_key:
276
+ signing_key:
277
277
  specification_version: 4
278
278
  summary: Bundle assets with webpack, resolve and compile opal ruby files and import
279
279
  them in the bundle.