sass-embedded 0.1.0 → 0.2.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.
@@ -1,147 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "open3"
4
- require "observer"
5
- require_relative "../../../ext/sass_embedded/embedded_sass_pb.rb"
6
-
7
- module Sass
8
- module Embedded
9
- class Transport
10
-
11
- include Observable
12
-
13
- DART_SASS_EMBEDDED = File.absolute_path("../../../ext/sass_embedded/sass_embedded/dart-sass-embedded#{Sass::Platform::OS == 'windows' ? '.bat' : ''}", __dir__)
14
-
15
- PROTOCOL_ERROR_ID = 4294967295
16
-
17
- def initialize
18
- @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(DART_SASS_EMBEDDED)
19
- @stdin_semaphore = Mutex.new
20
- @observerable_semaphore = Mutex.new
21
-
22
- Thread.new do
23
- loop do
24
- begin
25
- bits = length = 0
26
- loop do
27
- byte = @stdout.readbyte
28
- length += (byte & 0x7f) << bits
29
- bits += 7
30
- break if byte <= 0x7f
31
- end
32
- changed
33
- payload = @stdout.read length
34
- @observerable_semaphore.synchronize {
35
- notify_observers nil, Sass::EmbeddedProtocol::OutboundMessage.decode(payload)
36
- }
37
- rescue Interrupt
38
- break
39
- rescue IOError, EOFError => error
40
- notify_observers error, nil
41
- close
42
- break
43
- end
44
- end
45
- end
46
-
47
- Thread.new do
48
- loop do
49
- begin
50
- $stderr.puts @stderr.read
51
- rescue Interrupt
52
- break
53
- rescue IOError, EOFErrorr => error
54
- @observerable_semaphore.synchronize {
55
- notify_observers error, nil
56
- }
57
- close
58
- break
59
- end
60
- end
61
- end
62
- end
63
-
64
- def send req, id
65
- mutex = Mutex.new
66
- resource = ConditionVariable.new
67
-
68
- req_name = req.class.name.split('::').last.gsub(/\B(?=[A-Z])/, "_").downcase
69
-
70
- message = Sass::EmbeddedProtocol::InboundMessage.new(req_name.to_sym => req)
71
-
72
- error = nil
73
- res = nil
74
-
75
- @observerable_semaphore.synchronize {
76
- MessageObserver.new self, id do |_error, _res|
77
- mutex.synchronize {
78
- error = _error
79
- res = _res
80
-
81
- resource.signal
82
- }
83
- end
84
- }
85
-
86
- mutex.synchronize {
87
- write message.to_proto
88
-
89
- resource.wait(mutex)
90
- }
91
-
92
- raise error if error
93
- res
94
- end
95
-
96
- def close
97
- begin
98
- delete_observers
99
- @stdin.close
100
- @stdout.close
101
- @stderr.close
102
- rescue
103
- end
104
- end
105
-
106
- private
107
-
108
- def write proto
109
- @stdin_semaphore.synchronize {
110
- length = proto.length
111
- while length > 0
112
- @stdin.write ((length > 0x7f ? 0x80 : 0) | (length & 0x7f)).chr
113
- length >>= 7
114
- end
115
- @stdin.write proto
116
- }
117
- end
118
- end
119
-
120
- private
121
-
122
- class MessageObserver
123
- def initialize obs, id, &block
124
- @obs = obs
125
- @id = id
126
- @block = block
127
- @obs.add_observer self
128
- end
129
-
130
- def update error, message
131
- if error
132
- @obs.delete_observer self
133
- @block.call error, nil
134
- elsif message.error&.id == Sass::Embedded::Transport::PROTOCOL_ERROR_ID
135
- @obs.delete_observer self
136
- @block.call Sass::ProtocolError.new(message.error.message), nil
137
- else
138
- res = message[message.message.to_s]
139
- if (res['compilation_id'] == @id || res['id'] == @id)
140
- @obs.delete_observer self
141
- @block.call error, res
142
- end
143
- end
144
- end
145
- end
146
- end
147
- end