sass-embedded 0.1.3 → 0.3.0

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