@rdfc/js-runner 3.0.3 → 3.1.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.
- package/.idea/LNKD.tech Editor.xml +194 -0
- package/.idea/codeStyles/Project.xml +52 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/copilot.data.migration.agent.xml +6 -0
- package/.idea/copilot.data.migration.ask.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/copilot.data.migration.edit.xml +6 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/js-runner.iml +12 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/__tests__/channels.test.ts +70 -1
- package/lib/reader.d.ts +4 -0
- package/lib/reader.js +47 -1
- package/lib/runner.js +2 -2
- package/lib/testUtils/index.js +7 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/writer.d.ts +14 -3
- package/lib/writer.js +83 -26
- package/package.json +12 -12
- package/src/reader.ts +56 -0
- package/src/runner.ts +1 -1
- package/src/testUtils/index.ts +6 -2
- package/src/writer.ts +175 -42
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="http://lnkd.tech/editor#BuiltinGlobalGraphs">
|
|
4
|
+
<option name="disabled">
|
|
5
|
+
<set>
|
|
6
|
+
<option value="DC_AM" />
|
|
7
|
+
<option value="DC_E" />
|
|
8
|
+
<option value="DC_T" />
|
|
9
|
+
<option value="DC_TYPE" />
|
|
10
|
+
<option value="FOAF" />
|
|
11
|
+
<option value="FOAF_ORG" />
|
|
12
|
+
<option value="ML_XS" />
|
|
13
|
+
<option value="OWL2" />
|
|
14
|
+
<option value="RDF" />
|
|
15
|
+
<option value="RDFS" />
|
|
16
|
+
<option value="SHACL" />
|
|
17
|
+
<option value="SHACL_SHACL" />
|
|
18
|
+
<option value="SKOS" />
|
|
19
|
+
<option value="SKOS_ORG" />
|
|
20
|
+
<option value="SPIN_MODELING" />
|
|
21
|
+
<option value="SPIN_MODELING_ORG" />
|
|
22
|
+
<option value="SPIN_SPARQL" />
|
|
23
|
+
<option value="SPIN_SPARQL_ORG" />
|
|
24
|
+
<option value="SPIN_STD" />
|
|
25
|
+
<option value="SPIN_STD_ORG" />
|
|
26
|
+
<option value="VANN" />
|
|
27
|
+
<option value="VOAF" />
|
|
28
|
+
<option value="schemaorg_all_http" />
|
|
29
|
+
<option value="schemaorg_all_https" />
|
|
30
|
+
</set>
|
|
31
|
+
</option>
|
|
32
|
+
</component>
|
|
33
|
+
<component name="http://lnkd.tech/editor#GlobalGraphsAssignments">
|
|
34
|
+
<option name="assignments">
|
|
35
|
+
<map>
|
|
36
|
+
<entry key="urn:tag:lnslr.eu,2018:java:eu.lunisolar.lava.rdfvocab.get.lava.LavaCatalog">
|
|
37
|
+
<value>
|
|
38
|
+
<map>
|
|
39
|
+
<entry key="http://purl.org/dc/dcam">
|
|
40
|
+
<value>
|
|
41
|
+
<set>
|
|
42
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/58ABCE836B2D0022BF4C4C921A8C34C6E2F4B4AB015C4649FCAFD9572ED4DB47" />
|
|
43
|
+
</set>
|
|
44
|
+
</value>
|
|
45
|
+
</entry>
|
|
46
|
+
<entry key="http://purl.org/dc/dcmitype">
|
|
47
|
+
<value>
|
|
48
|
+
<set>
|
|
49
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/F987B11D556E556FEF95D7E9410C1C561FC1B7AC05CCD457128DC8962641B01E" />
|
|
50
|
+
</set>
|
|
51
|
+
</value>
|
|
52
|
+
</entry>
|
|
53
|
+
<entry key="http://purl.org/dc/elements/1.1">
|
|
54
|
+
<value>
|
|
55
|
+
<set>
|
|
56
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/FFB46B7A21E40344B93BC4AD2E6808B24DD53E261995EC3A926DF6BCD87BBFA5" />
|
|
57
|
+
</set>
|
|
58
|
+
</value>
|
|
59
|
+
</entry>
|
|
60
|
+
<entry key="http://purl.org/dc/terms">
|
|
61
|
+
<value>
|
|
62
|
+
<set>
|
|
63
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/13DF401072DD7015BF9D75162F3E41C8138075304B7B9CC1AA1E9C16DB976797" />
|
|
64
|
+
</set>
|
|
65
|
+
</value>
|
|
66
|
+
</entry>
|
|
67
|
+
<entry key="http://purl.org/vocab/vann">
|
|
68
|
+
<value>
|
|
69
|
+
<set>
|
|
70
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/96DE3675A0EAE0C2979D58A21FB808417E0C75DA18EFB9FEB050135BBAC790CA" />
|
|
71
|
+
</set>
|
|
72
|
+
</value>
|
|
73
|
+
</entry>
|
|
74
|
+
<entry key="http://purl.org/vocommons/voaf">
|
|
75
|
+
<value>
|
|
76
|
+
<set>
|
|
77
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/8FF39E5D8A3A8DBE88C790E499F2DAA0FC520CD825EBBE59E79A388361839150" />
|
|
78
|
+
</set>
|
|
79
|
+
</value>
|
|
80
|
+
</entry>
|
|
81
|
+
<entry key="http://schema.org">
|
|
82
|
+
<value>
|
|
83
|
+
<set>
|
|
84
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/62854C817CF24454C9FC1D9DDB605C7B6A4FDE0FF574960D40B0E150166997B6" />
|
|
85
|
+
</set>
|
|
86
|
+
</value>
|
|
87
|
+
</entry>
|
|
88
|
+
<entry key="http://spinrdf.org/sp">
|
|
89
|
+
<value>
|
|
90
|
+
<set>
|
|
91
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/FD2A599D1CE5D78A65896D5CE0A34553533715EE61388AD5F6E2AC75CF36FE94" />
|
|
92
|
+
</set>
|
|
93
|
+
</value>
|
|
94
|
+
</entry>
|
|
95
|
+
<entry key="http://spinrdf.org/spin">
|
|
96
|
+
<value>
|
|
97
|
+
<set>
|
|
98
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/CC3E56C1F2BC6D4213BAF662C0A1FEB97ED968FA21D6C0ED7E44887747C74BC3" />
|
|
99
|
+
</set>
|
|
100
|
+
</value>
|
|
101
|
+
</entry>
|
|
102
|
+
<entry key="http://spinrdf.org/spl">
|
|
103
|
+
<value>
|
|
104
|
+
<set>
|
|
105
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/EAD726323D0CC38A6FD1D332E1781E2601C32537102E82A0995E7FBA87BEF306" />
|
|
106
|
+
</set>
|
|
107
|
+
</value>
|
|
108
|
+
</entry>
|
|
109
|
+
<entry key="http://www.w3.org/1999/02/22-rdf-syntax-ns">
|
|
110
|
+
<value>
|
|
111
|
+
<set>
|
|
112
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/93D52B1A5824C7DD6504CA79C16205C0B740A0BA68B7A14952780F52561186A2" />
|
|
113
|
+
</set>
|
|
114
|
+
</value>
|
|
115
|
+
</entry>
|
|
116
|
+
<entry key="http://www.w3.org/2000/01/rdf-schema">
|
|
117
|
+
<value>
|
|
118
|
+
<set>
|
|
119
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/164A70B28D9AC4B828EEC7D9E4B548A9465A5E2C154D53A142CC5E18566E04EC" />
|
|
120
|
+
</set>
|
|
121
|
+
</value>
|
|
122
|
+
</entry>
|
|
123
|
+
<entry key="http://www.w3.org/2002/07/owl">
|
|
124
|
+
<value>
|
|
125
|
+
<set>
|
|
126
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/718FA1DB7840D3315BFCE94398543F91437EF6FE933054FD93F5471D19262FC5" />
|
|
127
|
+
</set>
|
|
128
|
+
</value>
|
|
129
|
+
</entry>
|
|
130
|
+
<entry key="http://www.w3.org/2004/02/skos/core">
|
|
131
|
+
<value>
|
|
132
|
+
<set>
|
|
133
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/2D0AC9174D7C53393C546802A19669534B44590EA00D807F4C149C6FFB4CF6BB" />
|
|
134
|
+
</set>
|
|
135
|
+
</value>
|
|
136
|
+
</entry>
|
|
137
|
+
<entry key="http://www.w3.org/ns/shacl">
|
|
138
|
+
<value>
|
|
139
|
+
<set>
|
|
140
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/0E5D8AEA0EAB98A072D4A02FAAEE1EE914EC99EAB2CA473429726FAED4A13F69" />
|
|
141
|
+
</set>
|
|
142
|
+
</value>
|
|
143
|
+
</entry>
|
|
144
|
+
<entry key="http://www.w3.org/ns/shacl-shacl">
|
|
145
|
+
<value>
|
|
146
|
+
<set>
|
|
147
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/250D6274CADC8FA5359D5DBC28BC943F1DE01ADB7FFC3369681216B583122E4A" />
|
|
148
|
+
</set>
|
|
149
|
+
</value>
|
|
150
|
+
</entry>
|
|
151
|
+
<entry key="http://xmlns.com/foaf/0.1">
|
|
152
|
+
<value>
|
|
153
|
+
<set>
|
|
154
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/630DAF410F3C34ED9FE7302E4A8A5439488B68375789E7CF5DD137892DAC6789" />
|
|
155
|
+
</set>
|
|
156
|
+
</value>
|
|
157
|
+
</entry>
|
|
158
|
+
<entry key="https://schema.org">
|
|
159
|
+
<value>
|
|
160
|
+
<set>
|
|
161
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/24D9BBA4119AA8C8708767B12B3BCACBC8BB8750CDB111F573996899AA29F089" />
|
|
162
|
+
</set>
|
|
163
|
+
</value>
|
|
164
|
+
</entry>
|
|
165
|
+
<entry key="urn:tag:lnkd.tech,2020:MissingLink:XMLDataTypes">
|
|
166
|
+
<value>
|
|
167
|
+
<set>
|
|
168
|
+
<option value="urn:tag:lnkd.tech,2023:digest:sha-256/E7430AD6C9345DEC6A8C7E0665607B34D1F6B6FDC47A30FAC3FB146179213174" />
|
|
169
|
+
</set>
|
|
170
|
+
</value>
|
|
171
|
+
</entry>
|
|
172
|
+
</map>
|
|
173
|
+
</value>
|
|
174
|
+
</entry>
|
|
175
|
+
</map>
|
|
176
|
+
</option>
|
|
177
|
+
</component>
|
|
178
|
+
<component name="http://lnkd.tech/editor#GraphVisibilityConfig">
|
|
179
|
+
<option name="visibility">
|
|
180
|
+
<map>
|
|
181
|
+
<entry key="DOCUMENTATION">
|
|
182
|
+
<value>
|
|
183
|
+
<Visibility />
|
|
184
|
+
</value>
|
|
185
|
+
</entry>
|
|
186
|
+
<entry key="GENERAL">
|
|
187
|
+
<value>
|
|
188
|
+
<Visibility />
|
|
189
|
+
</value>
|
|
190
|
+
</entry>
|
|
191
|
+
</map>
|
|
192
|
+
</option>
|
|
193
|
+
</component>
|
|
194
|
+
</project>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<component name="ProjectCodeStyleConfiguration">
|
|
2
|
+
<code_scheme name="Project" version="173">
|
|
3
|
+
<HTMLCodeStyleSettings>
|
|
4
|
+
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
|
|
5
|
+
</HTMLCodeStyleSettings>
|
|
6
|
+
<JSCodeStyleSettings version="0">
|
|
7
|
+
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
|
8
|
+
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
9
|
+
<option name="FORCE_QUOTE_STYlE" value="true" />
|
|
10
|
+
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
|
|
11
|
+
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
12
|
+
<option name="SPACES_WITHIN_IMPORTS" value="true" />
|
|
13
|
+
</JSCodeStyleSettings>
|
|
14
|
+
<TypeScriptCodeStyleSettings version="0">
|
|
15
|
+
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
|
16
|
+
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
17
|
+
<option name="FORCE_QUOTE_STYlE" value="true" />
|
|
18
|
+
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
|
|
19
|
+
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
20
|
+
<option name="SPACES_WITHIN_IMPORTS" value="true" />
|
|
21
|
+
</TypeScriptCodeStyleSettings>
|
|
22
|
+
<VueCodeStyleSettings>
|
|
23
|
+
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
|
|
24
|
+
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
|
|
25
|
+
</VueCodeStyleSettings>
|
|
26
|
+
<codeStyleSettings language="HTML">
|
|
27
|
+
<option name="SOFT_MARGINS" value="80" />
|
|
28
|
+
<indentOptions>
|
|
29
|
+
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
|
30
|
+
</indentOptions>
|
|
31
|
+
</codeStyleSettings>
|
|
32
|
+
<codeStyleSettings language="JavaScript">
|
|
33
|
+
<option name="INDENT_CASE_FROM_SWITCH" value="false" />
|
|
34
|
+
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
|
35
|
+
<option name="ALIGN_MULTILINE_FOR" value="false" />
|
|
36
|
+
<option name="SOFT_MARGINS" value="80" />
|
|
37
|
+
</codeStyleSettings>
|
|
38
|
+
<codeStyleSettings language="TypeScript">
|
|
39
|
+
<option name="INDENT_CASE_FROM_SWITCH" value="false" />
|
|
40
|
+
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
|
|
41
|
+
<option name="ALIGN_MULTILINE_FOR" value="false" />
|
|
42
|
+
<option name="SOFT_MARGINS" value="80" />
|
|
43
|
+
</codeStyleSettings>
|
|
44
|
+
<codeStyleSettings language="Vue">
|
|
45
|
+
<option name="SOFT_MARGINS" value="80" />
|
|
46
|
+
<indentOptions>
|
|
47
|
+
<option name="INDENT_SIZE" value="4" />
|
|
48
|
+
<option name="TAB_SIZE" value="4" />
|
|
49
|
+
</indentOptions>
|
|
50
|
+
</codeStyleSettings>
|
|
51
|
+
</code_scheme>
|
|
52
|
+
</component>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<module type="WEB_MODULE" version="4">
|
|
3
|
+
<component name="NewModuleRootManager">
|
|
4
|
+
<content url="file://$MODULE_DIR$">
|
|
5
|
+
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
|
6
|
+
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
|
7
|
+
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
|
8
|
+
</content>
|
|
9
|
+
<orderEntry type="inheritedJdk" />
|
|
10
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
|
11
|
+
</component>
|
|
12
|
+
</module>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project version="4">
|
|
3
|
+
<component name="ProjectModuleManager">
|
|
4
|
+
<modules>
|
|
5
|
+
<module fileurl="file://$PROJECT_DIR$/.idea/js-runner.iml" filepath="$PROJECT_DIR$/.idea/js-runner.iml" />
|
|
6
|
+
</modules>
|
|
7
|
+
</component>
|
|
8
|
+
</project>
|
package/.idea/vcs.xml
ADDED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test, vi } from 'vitest'
|
|
2
|
-
import { StreamMsgMock } from '../src/testUtils'
|
|
2
|
+
import { channel, createRunner, StreamMsgMock } from '../src/testUtils'
|
|
3
3
|
import { WriterInstance } from '../src/writer'
|
|
4
4
|
import { FromRunner, StreamIdentify } from '@rdfc/proto'
|
|
5
5
|
import { createLogger, transports } from 'winston'
|
|
@@ -109,6 +109,8 @@ describe('Writer', async () => {
|
|
|
109
109
|
|
|
110
110
|
await writer.close()
|
|
111
111
|
|
|
112
|
+
expect(writer.canceled).toBe(false)
|
|
113
|
+
|
|
112
114
|
expect(msgs.length).toBe(1)
|
|
113
115
|
expect(msgs.map((x) => x.close!.channel)).toEqual([uri])
|
|
114
116
|
|
|
@@ -150,4 +152,71 @@ describe('Writer', async () => {
|
|
|
150
152
|
'world',
|
|
151
153
|
])
|
|
152
154
|
})
|
|
155
|
+
|
|
156
|
+
test('is marked canceled when connected reader cancels', async () => {
|
|
157
|
+
const runner = createRunner()
|
|
158
|
+
const [writer, reader] = channel(runner, 'cancel-channel')
|
|
159
|
+
|
|
160
|
+
await reader.cancel()
|
|
161
|
+
|
|
162
|
+
expect(writer.canceled).toBe(true)
|
|
163
|
+
await expect(writer.string('hello')).rejects.toThrow(/canceled/i)
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
test('emits a cancel event when connected reader cancels', async () => {
|
|
167
|
+
const runner = createRunner()
|
|
168
|
+
const [writer, reader] = channel(runner, 'cancel-listener-channel')
|
|
169
|
+
const onCancel = vi.fn()
|
|
170
|
+
|
|
171
|
+
writer.on('cancel', onCancel)
|
|
172
|
+
await reader.cancel()
|
|
173
|
+
|
|
174
|
+
expect(onCancel).toHaveBeenCalledTimes(1)
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
test('does not emit a cancel event on a local close', async () => {
|
|
178
|
+
const uri = 'someUri'
|
|
179
|
+
const runner = 'myRunner'
|
|
180
|
+
const client = new StreamMsgMock(() => 1)
|
|
181
|
+
const write = async (_msg: FromRunner) => undefined
|
|
182
|
+
const writer = new WriterInstance(uri, client as any, write, runner, logger)
|
|
183
|
+
const onCancel = vi.fn()
|
|
184
|
+
|
|
185
|
+
writer.on('cancel', onCancel)
|
|
186
|
+
await writer.close()
|
|
187
|
+
|
|
188
|
+
expect(onCancel).not.toHaveBeenCalled()
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
test('throws when writing to a canceled writer', async () => {
|
|
192
|
+
const uri = 'someUri'
|
|
193
|
+
const runner = 'myRunner'
|
|
194
|
+
const client = new StreamMsgMock(() => 1)
|
|
195
|
+
const write = async (_msg: FromRunner) => undefined
|
|
196
|
+
const writer = new WriterInstance(uri, client as any, write, runner, logger)
|
|
197
|
+
|
|
198
|
+
await writer.close(true)
|
|
199
|
+
|
|
200
|
+
expect(writer.canceled).toBe(true)
|
|
201
|
+
await expect(writer.buffer(encoder.encode('x'))).rejects.toThrow(
|
|
202
|
+
/canceled/i,
|
|
203
|
+
)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
test('rejects in-flight writes when reader cancels', async () => {
|
|
207
|
+
const runner = createRunner()
|
|
208
|
+
const [writer, reader] = channel(runner, 'cancel-in-flight')
|
|
209
|
+
|
|
210
|
+
// Register a reader consumer without draining it so the writer waits for processed.
|
|
211
|
+
reader.strings()
|
|
212
|
+
|
|
213
|
+
// Set reader to canceled, without informing the writer of it, mimicking race condition where reader cancels while writer is writing, but before the writer receives the cancel message.
|
|
214
|
+
// @ts-ignore
|
|
215
|
+
reader['canceled'] = true
|
|
216
|
+
// @ts-ignore
|
|
217
|
+
reader['closed'] = true
|
|
218
|
+
|
|
219
|
+
const pendingWrite = writer.string('hello')
|
|
220
|
+
await expect(pendingWrite).rejects.toThrow(/canceled/i)
|
|
221
|
+
})
|
|
153
222
|
})
|
package/lib/reader.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export interface Reader {
|
|
|
14
14
|
streams(): AsyncIterable<AsyncGenerator<Uint8Array>>;
|
|
15
15
|
buffers(): AsyncIterable<Uint8Array>;
|
|
16
16
|
anys(): AsyncIterable<Any>;
|
|
17
|
+
cancel(): Promise<void>;
|
|
17
18
|
}
|
|
18
19
|
export declare class ReaderInstance implements Reader {
|
|
19
20
|
private client;
|
|
@@ -21,6 +22,8 @@ export declare class ReaderInstance implements Reader {
|
|
|
21
22
|
private logger;
|
|
22
23
|
private readonly notifyOrchestrator;
|
|
23
24
|
private consumers;
|
|
25
|
+
private closed;
|
|
26
|
+
private canceled;
|
|
24
27
|
constructor(uri: string, client: RunnerClient, notifyOrchestrator: Writable, logger: Logger);
|
|
25
28
|
anys(): AsyncIterable<Any>;
|
|
26
29
|
strings(): AsyncIterable<string>;
|
|
@@ -28,5 +31,6 @@ export declare class ReaderInstance implements Reader {
|
|
|
28
31
|
streams(): AsyncIterable<AsyncGenerator<Uint8Array>>;
|
|
29
32
|
handleMsg(msg: ReceivingMessage): void;
|
|
30
33
|
close(): void;
|
|
34
|
+
cancel(): Promise<void>;
|
|
31
35
|
handleStreamingMessage({ channel, globalSequenceNumber, }: ReceivingStreamMessage): Promise<void>;
|
|
32
36
|
}
|
package/lib/reader.js
CHANGED
|
@@ -4,10 +4,15 @@ class MyIter {
|
|
|
4
4
|
convertor;
|
|
5
5
|
queue = [];
|
|
6
6
|
resolveNext = null;
|
|
7
|
+
closed = false;
|
|
7
8
|
constructor(convertor) {
|
|
8
9
|
this.convertor = convertor;
|
|
9
10
|
}
|
|
10
11
|
push(buffer, onComplete) {
|
|
12
|
+
if (this.closed) {
|
|
13
|
+
onComplete();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
11
16
|
const item = this.convertor.from(buffer);
|
|
12
17
|
this.queue.push({ item, onComplete });
|
|
13
18
|
if (this.resolveNext) {
|
|
@@ -16,6 +21,11 @@ class MyIter {
|
|
|
16
21
|
}
|
|
17
22
|
}
|
|
18
23
|
close(onComplete) {
|
|
24
|
+
if (this.closed) {
|
|
25
|
+
onComplete();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.closed = true;
|
|
19
29
|
this.queue.push({ item: undefined, onComplete });
|
|
20
30
|
if (this.resolveNext) {
|
|
21
31
|
this.resolveNext(undefined);
|
|
@@ -23,6 +33,10 @@ class MyIter {
|
|
|
23
33
|
}
|
|
24
34
|
}
|
|
25
35
|
async pushStream(chunks, onComplete) {
|
|
36
|
+
if (this.closed) {
|
|
37
|
+
onComplete();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
26
40
|
const stream = (async function* (stream) {
|
|
27
41
|
for await (const chunk of stream) {
|
|
28
42
|
yield chunk.data;
|
|
@@ -58,6 +72,8 @@ export class ReaderInstance {
|
|
|
58
72
|
logger;
|
|
59
73
|
notifyOrchestrator;
|
|
60
74
|
consumers = [];
|
|
75
|
+
closed = false;
|
|
76
|
+
canceled = false;
|
|
61
77
|
constructor(uri, client, notifyOrchestrator, logger) {
|
|
62
78
|
this.uri = uri;
|
|
63
79
|
this.client = client;
|
|
@@ -86,6 +102,16 @@ export class ReaderInstance {
|
|
|
86
102
|
}
|
|
87
103
|
handleMsg(msg) {
|
|
88
104
|
this.logger.debug(`${this.uri} handling message`);
|
|
105
|
+
if (this.closed) {
|
|
106
|
+
this.notifyOrchestrator({
|
|
107
|
+
processed: {
|
|
108
|
+
globalSequenceNumber: msg.globalSequenceNumber,
|
|
109
|
+
channel: this.uri,
|
|
110
|
+
error: 'reader is canceled; message has not been processed by the processor',
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
89
115
|
const promises = [];
|
|
90
116
|
for (const iter of this.consumers) {
|
|
91
117
|
promises.push(new Promise((res) => iter.push(msg.data, () => res(null))));
|
|
@@ -98,12 +124,32 @@ export class ReaderInstance {
|
|
|
98
124
|
}));
|
|
99
125
|
}
|
|
100
126
|
close() {
|
|
127
|
+
if (this.closed) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.closed = true;
|
|
101
131
|
for (const iter of this.consumers) {
|
|
102
132
|
iter.close(() => { });
|
|
103
133
|
}
|
|
104
134
|
}
|
|
135
|
+
async cancel() {
|
|
136
|
+
if (this.canceled) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.canceled = true;
|
|
140
|
+
this.close();
|
|
141
|
+
await this.notifyOrchestrator({
|
|
142
|
+
close: { channel: this.uri },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
105
145
|
async handleStreamingMessage({ channel, globalSequenceNumber, }) {
|
|
106
146
|
this.logger.debug(`${this.uri} handling streaming message`);
|
|
147
|
+
if (this.closed) {
|
|
148
|
+
await this.notifyOrchestrator({
|
|
149
|
+
processed: { globalSequenceNumber, channel },
|
|
150
|
+
});
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
107
153
|
const chunks = this.client.receiveStreamMessage();
|
|
108
154
|
const writeControlMessage = promisify(chunks.write.bind(chunks));
|
|
109
155
|
const consumersConsumed = [];
|
|
@@ -208,4 +254,4 @@ function fanoutStream(stream, numConsumers, onAllHandled) {
|
|
|
208
254
|
const rawIterables = Array.from({ length: numConsumers }, makeIterable);
|
|
209
255
|
return rawIterables.map(wrap);
|
|
210
256
|
}
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLGFBQWEsQ0FBQTtBQUVwQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBMEJoQyxNQUFNLE1BQU07SUFDRixTQUFTLENBQWM7SUFDdkIsS0FBSyxHQUEwQixFQUFFLENBQUE7SUFDakMsV0FBVyxHQUF3QyxJQUFJLENBQUE7SUFFL0QsWUFBWSxTQUF1QjtRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUM1QixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQWtCLEVBQUUsVUFBc0I7UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXNCO1FBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7UUFDekIsQ0FBQztJQUNILENB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S0FBSyxDQUFDLE1BQU07d0JBQ1YsZUFBZSxFQUFFLENBQUE7d0JBQ2pCLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUMxQixHQUFHLEVBQUUsQ0FBQTt3QkFDUCxDQUFDO3dCQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtvQkFDekMsQ0FBQztpQkFDRixDQUFBO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxVQUFVLEdBQUc7UUFDaEIsV0FBVyxFQUFFLENBQUE7UUFDYixJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUV0QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDZCxNQUFNLFlBQVksRUFBRSxDQUFBO1lBQ3BCLEtBQUssRUFBRSxDQUFBO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFHRCxTQUFTLElBQUksQ0FBQyxRQUEwQjtRQUN0QyxPQUFPO1lBQ0wsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUMzQixJQUFJLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxJQUFJLENBQUE7b0JBQ1YsTUFBTSxHQUFHLEVBQUUsQ0FBQTtnQkFDYixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN2RSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaWVudFJlYWRhYmxlU3RyZWFtIH0gZnJvbSAnQGdycGMvZ3JwYy1qcydcbmltcG9ydCB7XG4gIERhdGFDaHVuayxcbiAgUmVjZWl2aW5nTWVzc2FnZSxcbiAgUmVjZWl2aW5nU3RyZWFtTWVzc2FnZSxcbiAgUnVubmVyQ2xpZW50LFxufSBmcm9tICdAcmRmYy9wcm90bydcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ3dpbnN0b24nXG5pbXBvcnQge1xuICBBbnlDb252ZXJ0b3IsXG4gIENvbnZlcnRvcixcbiAgTm9Db252ZXJ0b3IsXG4gIFN0cmVhbUNvbnZlcnRvcixcbiAgU3RyaW5nQ29udmVydG9yLFxufSBmcm9tICcuL2NvbnZlcnRvcidcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnLi9ydW5uZXInXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJ1xuXG5leHBvcnQgdHlwZSBBbnkgPVxuICB8IHtcbiAgICAgIHN0cmluZzogc3RyaW5nXG4gICAgfVxuICB8IHtcbiAgICAgIHN0cmVhbTogQXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT5cbiAgICB9XG4gIHwge1xuICAgICAgYnVmZmVyOiBVaW50OEFycmF5XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRlciB7XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+XG4gIHN0cmVhbXMoKTogQXN5bmNJdGVyYWJsZTxBc3luY0dlbmVyYXRvcjxVaW50OEFycmF5Pj5cbiAgYnVmZmVycygpOiBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+XG4gIGFueXMoKTogQXN5bmNJdGVyYWJsZTxBbnk+XG59XG5cbnR5cGUgVG9kbzxUPiA9IHtcbiAgaXRlbTogVFxuICBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkXG59XG5cbmNsYXNzIE15SXRlcjxUPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8VD4ge1xuICBwcml2YXRlIGNvbnZlcnRvcjogQ29udmVydG9yPFQ+XG4gIHByaXZhdGUgcXVldWU6IFRvZG88VCB8IHVuZGVmaW5lZD5bXSA9IFtdXG4gIHByaXZhdGUgcmVzb2x2ZU5leHQ6ICgodmFsdWU6IHVuZGVmaW5lZCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKGNvbnZlcnRvcjogQ29udmVydG9yPFQ+KSB7XG4gICAgdGhpcy5jb252ZXJ0b3IgPSBjb252ZXJ0b3JcbiAgfVxuXG4gIHB1c2goYnVmZmVyOiBVaW50OEFycmF5LCBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuY29udmVydG9yLmZyb20oYnVmZmVyKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNsb3NlKG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnF1ZXVlLnB1c2goeyBpdGVtOiB1bmRlZmluZWQsIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHB1c2hTdHJlYW0oY2h1bmtzOiBBc3luY0l0ZXJhYmxlPERhdGFDaHVuaz4sIG9uQ29tcGxldGU6ICgpID0+IHZvaWQpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIGdlbmVyYXRvciB0aGF0IHRyYW5zZm9ybXMgRGF0YUNodW5rcyB0byBCdWZmZXJzXG4gICAgY29uc3Qgc3RyZWFtID0gKGFzeW5jIGZ1bmN0aW9uKiAoc3RyZWFtKSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICB5aWVsZCBjaHVuay5kYXRhXG4gICAgICB9XG4gICAgfSkoY2h1bmtzKVxuXG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMuY29udmVydG9yLmZyb21TdHJlYW0oc3RyZWFtKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHsgaXRlbSwgb25Db21wbGV0ZSB9ID0gdGhpcy5xdWV1ZS5zaGlmdCgpIVxuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgIC8vIE5vdGU6IGV4ZWN1dGlvbiBwYXVzZXMgYXQgYHlpZWxkYCB1bnRpbCB0aGUgY29uc3VtZXIgY2FsbHMgYC5uZXh0KClgIGFnYWluLlxuICAgICAgICAvLyBXZSBjYWxsIG9uQ29tcGxldGUgKmFmdGVyKiByZXN1bWluZywgc28gdGhlIHByb2R1Y2VyIGtub3dzIHRoZSBpdGVtIHdhcyBhY3R1YWxseSBjb25zdW1lZC5cbiAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiAodGhpcy5yZXNvbHZlTmV4dCA9IHJlc29sdmUpKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVhZGVySW5zdGFuY2UgaW1wbGVtZW50cyBSZWFkZXIge1xuICBwcml2YXRlIGNsaWVudDogUnVubmVyQ2xpZW50XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlXG5cbiAgcHJpdmF0ZSBjb25zdW1lcnM6IE15SXRlcjx1bmtub3duPltdID0gW11cblxuICBjb25zdHJ1Y3RvcihcbiAgICB1cmk6IHN0cmluZyxcbiAgICBjbGllbnQ6IFJ1bm5lckNsaWVudCxcbiAgICBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLnVyaSA9IHVyaVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvciA9IG5vdGlmeU9yY2hlc3RyYXRvclxuICB9XG5cbiAgYW55cygpOiBBc3luY0l0ZXJhYmxlPEFueT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKEFueUNvbnZlcnRvcilcbiAgICB0aGlzLmNvbnN1bWVycy5wdXNoKGl0ZXIpXG4gICAgcmV0dXJuIGl0ZXJcbiAgfVxuXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpdGVyID0gbmV3IE15SXRlcihTdHJpbmdDb252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBidWZmZXJzKCk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKE5vQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgc3RyZWFtcygpOiBBc3luY0l0ZXJhYmxlPEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoU3RyZWFtQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgaGFuZGxlTXNnKG1zZzogUmVjZWl2aW5nTWVzc2FnZSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3RoaXMudXJpfSBoYW5kbGluZyBtZXNzYWdlYClcblxuICAgIGNvbnN0IHByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlcykgPT4gaXRlci5wdXNoKG1zZy5kYXRhLCAoKSA9PiByZXMobnVsbCkpKSlcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PlxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHtcbiAgICAgICAgICBnbG9iYWxTZXF1ZW5jZU51bWJlcjogbXNnLmdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMudXJpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgZm9yIChjb25zdCBpdGVyIG9mIHRoaXMuY29uc3VtZXJzKSB7XG4gICAgICBpdGVyLmNsb3NlKCgpID0+IHt9KVxuICAgIH1cbiAgfVxuXG4gIC8vIFRoZXJlIGlzIGEgc3RyZWFtIG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGlzIHJlYWRlclxuICBhc3luYyBoYW5kbGVTdHJlYW1pbmdNZXNzYWdlKHtcbiAgICBjaGFubmVsLFxuICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICB9OiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dGhpcy51cml9IGhhbmRsaW5nIHN0cmVhbWluZyBtZXNzYWdlYClcblxuICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuY2xpZW50LnJlY2VpdmVTdHJlYW1NZXNzYWdlKClcbiAgICBjb25zdCB3cml0ZUNvbnRyb2xNZXNzYWdlID0gcHJvbWlzaWZ5KGNodW5rcy53cml0ZS5iaW5kKGNodW5rcykpXG4gICAgY29uc3QgY29uc3VtZXJzQ29uc3VtZWQgPSBbXVxuXG4gICAgLy8gQWZ0ZXIgZWFjaCBjaHVuayBpcyBoYW5kbGVkIGJ5IGFsbCBjb25zdW1lciwgZW1pdCBhIHByb2Nlc3NlZCBtZXNzYWdlXG4gICAgbGV0IGlkeCA9IDBcbiAgICBjb25zdCBtZXNzYWdlSXRlcmF0b3JzID0gZmFub3V0U3RyZWFtKFxuICAgICAgY2h1bmtzLFxuICAgICAgdGhpcy5jb25zdW1lcnMubGVuZ3RoLFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUNvbnRyb2xNZXNzYWdlKHsgc3RyZWFtU2VxdWVuY2VOdW1iZXI6IGlkeCsrIH0pXG4gICAgICB9LFxuICAgIClcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGNvbnN1bWVyc0NvbnN1bWVkLnB1c2goXG4gICAgICAgIG5ldyBQcm9taXNlKChyZXMpID0+XG4gICAgICAgICAgY29uc3VtZXIucHVzaFN0cmVhbShtZXNzYWdlSXRlcmF0b3JzLnBvcCgpISwgKCkgPT4gcmVzKG51bGwpKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUNvbnRyb2xNZXNzYWdlKHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIgfSlcblxuICAgIFByb21pc2UuYWxsKGNvbnN1bWVyc0NvbnN1bWVkKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdXcml0aW5nIHByb2Nlc3NlZCBmb3Igc3RyZWFtaW5nIG1lc3NhZ2UnKVxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IoeyBwcm9jZXNzZWQ6IHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIsIGNoYW5uZWwgfSB9KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdGVlIGEgc3RyZWFtIGBudW1Db25zdW1lcnNgIHRpbWVzXG4gKiBXaGVuIGVhY2ggdGVlJ2Qgc3RyZWFtIGhhcyBoYW5kbGVkIGEgY2h1bmssIGNhbGwge0BsaW5rIG9uQWxsSGFuZGxlZH1cbiAqL1xuZnVuY3Rpb24gZmFub3V0U3RyZWFtPFQ+KFxuICBzdHJlYW06IENsaWVudFJlYWRhYmxlU3RyZWFtPFQ+LFxuICBudW1Db25zdW1lcnM6IG51bWJlcixcbiAgb25BbGxIYW5kbGVkOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbik6IEFzeW5jSXRlcmFibGU8VD5bXSB7XG4gIHR5cGUgV2FpdGVyID0gKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxUPikgPT4gdm9pZFxuXG4gIGxldCBlbmRlZCA9IGZhbHNlXG4gIGNvbnN0IGJ1ZmZlcjogVFtdID0gW11cbiAgY29uc3QgcGVuZGluZzogV2FpdGVyW10gPSBbXVxuICBsZXQgYWN0aXZlQ29uc3VtZXJzID0gbnVtQ29uc3VtZXJzXG5cbiAgLy8gY29uc3VtZXIgYm9va2tlZXBpbmdcbiAgbGV0IGF3YWl0aW5nQWNrID0gMFxuXG4gIGZ1bmN0aW9uIHB1c2hDaHVuayhjaHVuazogVCkge1xuICAgIGJ1ZmZlci5wdXNoKGNodW5rKVxuICAgIGZsdXNoKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChidWZmZXIubGVuZ3RoID4gMCAmJiBwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyWzBdIC8vIGtlZXAgdW50aWwgYWxsIGNvbnN1bWVycyBhY2tcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSlcbiAgICAgIGF3YWl0aW5nQWNrKytcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmQoKSB7XG4gICAgZW5kZWQgPSB0cnVlXG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogVCkgPT4ge1xuICAgIHB1c2hDaHVuayhjaHVuaylcbiAgfSlcblxuICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICBlbmQoKVxuICB9KVxuXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgd2FpdGVyID0gcGVuZGluZy5zaGlmdCgpIVxuICAgICAgd2FpdGVyKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfSlcblxuICBmdW5jdGlvbiBtYWtlSXRlcmFibGUoKTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBidWZmZXJbMF1cbiAgICAgICAgICAgICAgYXdhaXRpbmdBY2srK1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgcGVuZGluZy5wdXNoKHJlc29sdmUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAgICAgYWN0aXZlQ29uc3VtZXJzLS1cbiAgICAgICAgICAgIGlmIChhY3RpdmVDb25zdW1lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgZW5kKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWNrKCkge1xuICAgIGF3YWl0aW5nQWNrLS1cbiAgICBpZiAoYXdhaXRpbmdBY2sgPT09IDApIHtcbiAgICAgIC8vIGFsbCBjb25zdW1lcnMgZG9uZSB3aXRoIHRoZSBjdXJyZW50IGNodW5rXG4gICAgICBidWZmZXIuc2hpZnQoKSAvLyBkcm9wIGl0XG4gICAgICBhd2FpdCBvbkFsbEhhbmRsZWQoKVxuICAgICAgZmx1c2goKSAvLyBjb250aW51ZSB3aXRoIG5leHQgY2h1bmtcbiAgICB9XG4gIH1cblxuICAvLyB3cmFwIGNvbnN1bWVyIHNvIHRoZXkgKm11c3QqIGNhbGwgYWNrKCkgYWZ0ZXIgcHJvY2Vzc2luZ1xuICBmdW5jdGlvbiB3cmFwKGl0ZXJhYmxlOiBBc3luY0l0ZXJhYmxlPFQ+KTogQXN5bmNJdGVyYWJsZTxUPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgICAgYXdhaXQgYWNrKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBjb25zdCByYXdJdGVyYWJsZXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Db25zdW1lcnMgfSwgbWFrZUl0ZXJhYmxlKVxuICByZXR1cm4gcmF3SXRlcmFibGVzLm1hcCh3cmFwKVxufVxuIl19
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQ0wsWUFBWSxFQUVaLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLGFBQWEsQ0FBQTtBQUVwQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBMkJoQyxNQUFNLE1BQU07SUFDRixTQUFTLENBQWM7SUFDdkIsS0FBSyxHQUEwQixFQUFFLENBQUE7SUFDakMsV0FBVyxHQUF3QyxJQUFJLENBQUE7SUFDdkQsTUFBTSxHQUFHLEtBQUssQ0FBQTtJQUV0QixZQUFZLFNBQXVCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0lBQzVCLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBa0IsRUFBRSxVQUFzQjtRQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixVQUFVLEVBQUUsQ0FBQTtZQUNaLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXNCO1FBQzFCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLFVBQVUsRUFBRSxDQUFBO1lBQ1osT0FBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FB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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbGllbnRSZWFkYWJsZVN0cmVhbSB9IGZyb20gJ0BncnBjL2dycGMtanMnXG5pbXBvcnQge1xuICBEYXRhQ2h1bmssXG4gIFJlY2VpdmluZ01lc3NhZ2UsXG4gIFJlY2VpdmluZ1N0cmVhbU1lc3NhZ2UsXG4gIFJ1bm5lckNsaWVudCxcbn0gZnJvbSAnQHJkZmMvcHJvdG8nXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICd3aW5zdG9uJ1xuaW1wb3J0IHtcbiAgQW55Q29udmVydG9yLFxuICBDb252ZXJ0b3IsXG4gIE5vQ29udmVydG9yLFxuICBTdHJlYW1Db252ZXJ0b3IsXG4gIFN0cmluZ0NvbnZlcnRvcixcbn0gZnJvbSAnLi9jb252ZXJ0b3InXG5pbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJy4vcnVubmVyJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAndXRpbCdcblxuZXhwb3J0IHR5cGUgQW55ID1cbiAgfCB7XG4gICAgICBzdHJpbmc6IHN0cmluZ1xuICAgIH1cbiAgfCB7XG4gICAgICBzdHJlYW06IEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+XG4gICAgfVxuICB8IHtcbiAgICAgIGJ1ZmZlcjogVWludDhBcnJheVxuICAgIH1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFkZXIge1xuICByZWFkb25seSB1cmk6IHN0cmluZ1xuICBzdHJpbmdzKCk6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuICBzdHJlYW1zKCk6IEFzeW5jSXRlcmFibGU8QXN5bmNHZW5lcmF0b3I8VWludDhBcnJheT4+XG4gIGJ1ZmZlcnMoKTogQXN5bmNJdGVyYWJsZTxVaW50OEFycmF5PlxuICBhbnlzKCk6IEFzeW5jSXRlcmFibGU8QW55PlxuICBjYW5jZWwoKTogUHJvbWlzZTx2b2lkPlxufVxuXG50eXBlIFRvZG88VD4gPSB7XG4gIGl0ZW06IFRcbiAgb25Db21wbGV0ZTogKCkgPT4gdm9pZFxufVxuXG5jbGFzcyBNeUl0ZXI8VD4gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPFQ+IHtcbiAgcHJpdmF0ZSBjb252ZXJ0b3I6IENvbnZlcnRvcjxUPlxuICBwcml2YXRlIHF1ZXVlOiBUb2RvPFQgfCB1bmRlZmluZWQ+W10gPSBbXVxuICBwcml2YXRlIHJlc29sdmVOZXh0OiAoKHZhbHVlOiB1bmRlZmluZWQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKGNvbnZlcnRvcjogQ29udmVydG9yPFQ+KSB7XG4gICAgdGhpcy5jb252ZXJ0b3IgPSBjb252ZXJ0b3JcbiAgfVxuXG4gIHB1c2goYnVmZmVyOiBVaW50OEFycmF5LCBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICBvbkNvbXBsZXRlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNvbnZlcnRvci5mcm9tKGJ1ZmZlcilcbiAgICB0aGlzLnF1ZXVlLnB1c2goeyBpdGVtLCBvbkNvbXBsZXRlIH0pXG4gICAgaWYgKHRoaXMucmVzb2x2ZU5leHQpIHtcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQodW5kZWZpbmVkKVxuICAgICAgdGhpcy5yZXNvbHZlTmV4dCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBjbG9zZShvbkNvbXBsZXRlOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICBvbkNvbXBsZXRlKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW06IHVuZGVmaW5lZCwgb25Db21wbGV0ZSB9KVxuICAgIGlmICh0aGlzLnJlc29sdmVOZXh0KSB7XG4gICAgICB0aGlzLnJlc29sdmVOZXh0KHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVzb2x2ZU5leHQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHVzaFN0cmVhbShjaHVua3M6IEFzeW5jSXRlcmFibGU8RGF0YUNodW5rPiwgb25Db21wbGV0ZTogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgb25Db21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIGdlbmVyYXRvciB0aGF0IHRyYW5zZm9ybXMgRGF0YUNodW5rcyB0byBCdWZmZXJzXG4gICAgY29uc3Qgc3RyZWFtID0gKGFzeW5jIGZ1bmN0aW9uKiAoc3RyZWFtKSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICB5aWVsZCBjaHVuay5kYXRhXG4gICAgICB9XG4gICAgfSkoY2h1bmtzKVxuXG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMuY29udmVydG9yLmZyb21TdHJlYW0oc3RyZWFtKVxuICAgIHRoaXMucXVldWUucHVzaCh7IGl0ZW0sIG9uQ29tcGxldGUgfSlcbiAgICBpZiAodGhpcy5yZXNvbHZlTmV4dCkge1xuICAgICAgdGhpcy5yZXNvbHZlTmV4dCh1bmRlZmluZWQpXG4gICAgICB0aGlzLnJlc29sdmVOZXh0ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHsgaXRlbSwgb25Db21wbGV0ZSB9ID0gdGhpcy5xdWV1ZS5zaGlmdCgpIVxuICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBpdGVtXG4gICAgICAgIC8vIE5vdGU6IGV4ZWN1dGlvbiBwYXVzZXMgYXQgYHlpZWxkYCB1bnRpbCB0aGUgY29uc3VtZXIgY2FsbHMgYC5uZXh0KClgIGFnYWluLlxuICAgICAgICAvLyBXZSBjYWxsIG9uQ29tcGxldGUgKmFmdGVyKiByZXN1bWluZywgc28gdGhlIHByb2R1Y2VyIGtub3dzIHRoZSBpdGVtIHdhcyBhY3R1YWxseSBjb25zdW1lZC5cbiAgICAgICAgb25Db21wbGV0ZSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiAodGhpcy5yZXNvbHZlTmV4dCA9IHJlc29sdmUpKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVhZGVySW5zdGFuY2UgaW1wbGVtZW50cyBSZWFkZXIge1xuICBwcml2YXRlIGNsaWVudDogUnVubmVyQ2xpZW50XG4gIHJlYWRvbmx5IHVyaTogc3RyaW5nXG4gIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlXG5cbiAgcHJpdmF0ZSBjb25zdW1lcnM6IE15SXRlcjx1bmtub3duPltdID0gW11cbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZVxuICBwcml2YXRlIGNhbmNlbGVkID0gZmFsc2VcblxuICBjb25zdHJ1Y3RvcihcbiAgICB1cmk6IHN0cmluZyxcbiAgICBjbGllbnQ6IFJ1bm5lckNsaWVudCxcbiAgICBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLnVyaSA9IHVyaVxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB0aGlzLm5vdGlmeU9yY2hlc3RyYXRvciA9IG5vdGlmeU9yY2hlc3RyYXRvclxuICB9XG5cbiAgYW55cygpOiBBc3luY0l0ZXJhYmxlPEFueT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKEFueUNvbnZlcnRvcilcbiAgICB0aGlzLmNvbnN1bWVycy5wdXNoKGl0ZXIpXG4gICAgcmV0dXJuIGl0ZXJcbiAgfVxuXG4gIHN0cmluZ3MoKTogQXN5bmNJdGVyYWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpdGVyID0gbmV3IE15SXRlcihTdHJpbmdDb252ZXJ0b3IpXG4gICAgdGhpcy5jb25zdW1lcnMucHVzaChpdGVyKVxuICAgIHJldHVybiBpdGVyXG4gIH1cblxuICBidWZmZXJzKCk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGl0ZXIgPSBuZXcgTXlJdGVyKE5vQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgc3RyZWFtcygpOiBBc3luY0l0ZXJhYmxlPEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgaXRlciA9IG5ldyBNeUl0ZXIoU3RyZWFtQ29udmVydG9yKVxuICAgIHRoaXMuY29uc3VtZXJzLnB1c2goaXRlcilcbiAgICByZXR1cm4gaXRlclxuICB9XG5cbiAgaGFuZGxlTXNnKG1zZzogUmVjZWl2aW5nTWVzc2FnZSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke3RoaXMudXJpfSBoYW5kbGluZyBtZXNzYWdlYClcblxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHtcbiAgICAgICAgICBnbG9iYWxTZXF1ZW5jZU51bWJlcjogbXNnLmdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMudXJpLFxuICAgICAgICAgIGVycm9yOlxuICAgICAgICAgICAgJ3JlYWRlciBpcyBjYW5jZWxlZDsgbWVzc2FnZSBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBwcm9jZXNzb3InLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlcykgPT4gaXRlci5wdXNoKG1zZy5kYXRhLCAoKSA9PiByZXMobnVsbCkpKSlcbiAgICB9XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PlxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHtcbiAgICAgICAgICBnbG9iYWxTZXF1ZW5jZU51bWJlcjogbXNnLmdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIGNoYW5uZWw6IHRoaXMudXJpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlZCA9IHRydWVcbiAgICBmb3IgKGNvbnN0IGl0ZXIgb2YgdGhpcy5jb25zdW1lcnMpIHtcbiAgICAgIGl0ZXIuY2xvc2UoKCkgPT4ge30pXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2FuY2VsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZVxuICAgIHRoaXMuY2xvc2UoKVxuICAgIGF3YWl0IHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yKHtcbiAgICAgIGNsb3NlOiB7IGNoYW5uZWw6IHRoaXMudXJpIH0sXG4gICAgfSlcbiAgfVxuXG4gIC8vIFRoZXJlIGlzIGEgc3RyZWFtIG1lc3NhZ2UgYXZhaWxhYmxlIGZvciB0aGlzIHJlYWRlclxuICBhc3luYyBoYW5kbGVTdHJlYW1pbmdNZXNzYWdlKHtcbiAgICBjaGFubmVsLFxuICAgIGdsb2JhbFNlcXVlbmNlTnVtYmVyLFxuICB9OiBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7dGhpcy51cml9IGhhbmRsaW5nIHN0cmVhbWluZyBtZXNzYWdlYClcblxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgYXdhaXQgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3Ioe1xuICAgICAgICBwcm9jZXNzZWQ6IHsgZ2xvYmFsU2VxdWVuY2VOdW1iZXIsIGNoYW5uZWwgfSxcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaHVua3MgPSB0aGlzLmNsaWVudC5yZWNlaXZlU3RyZWFtTWVzc2FnZSgpXG4gICAgY29uc3Qgd3JpdGVDb250cm9sTWVzc2FnZSA9IHByb21pc2lmeShjaHVua3Mud3JpdGUuYmluZChjaHVua3MpKVxuICAgIGNvbnN0IGNvbnN1bWVyc0NvbnN1bWVkID0gW11cblxuICAgIC8vIEFmdGVyIGVhY2ggY2h1bmsgaXMgaGFuZGxlZCBieSBhbGwgY29uc3VtZXIsIGVtaXQgYSBwcm9jZXNzZWQgbWVzc2FnZVxuICAgIGxldCBpZHggPSAwXG4gICAgY29uc3QgbWVzc2FnZUl0ZXJhdG9ycyA9IGZhbm91dFN0cmVhbShcbiAgICAgIGNodW5rcyxcbiAgICAgIHRoaXMuY29uc3VtZXJzLmxlbmd0aCxcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVDb250cm9sTWVzc2FnZSh7IHN0cmVhbVNlcXVlbmNlTnVtYmVyOiBpZHgrKyB9KVxuICAgICAgfSxcbiAgICApXG5cbiAgICBmb3IgKGNvbnN0IGNvbnN1bWVyIG9mIHRoaXMuY29uc3VtZXJzKSB7XG4gICAgICBjb25zdW1lcnNDb25zdW1lZC5wdXNoKFxuICAgICAgICBuZXcgUHJvbWlzZSgocmVzKSA9PlxuICAgICAgICAgIGNvbnN1bWVyLnB1c2hTdHJlYW0obWVzc2FnZUl0ZXJhdG9ycy5wb3AoKSEsICgpID0+IHJlcyhudWxsKSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfVxuXG4gICAgYXdhaXQgd3JpdGVDb250cm9sTWVzc2FnZSh7IGdsb2JhbFNlcXVlbmNlTnVtYmVyIH0pXG5cbiAgICBQcm9taXNlLmFsbChjb25zdW1lcnNDb25zdW1lZCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnV3JpdGluZyBwcm9jZXNzZWQgZm9yIHN0cmVhbWluZyBtZXNzYWdlJylcbiAgICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yKHsgcHJvY2Vzc2VkOiB7IGdsb2JhbFNlcXVlbmNlTnVtYmVyLCBjaGFubmVsIH0gfSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHRlZSBhIHN0cmVhbSBgbnVtQ29uc3VtZXJzYCB0aW1lc1xuICogV2hlbiBlYWNoIHRlZSdkIHN0cmVhbSBoYXMgaGFuZGxlZCBhIGNodW5rLCBjYWxsIHtAbGluayBvbkFsbEhhbmRsZWR9XG4gKi9cbmZ1bmN0aW9uIGZhbm91dFN0cmVhbTxUPihcbiAgc3RyZWFtOiBDbGllbnRSZWFkYWJsZVN0cmVhbTxUPixcbiAgbnVtQ29uc3VtZXJzOiBudW1iZXIsXG4gIG9uQWxsSGFuZGxlZDogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sXG4pOiBBc3luY0l0ZXJhYmxlPFQ+W10ge1xuICB0eXBlIFdhaXRlciA9ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8VD4pID0+IHZvaWRcblxuICBsZXQgZW5kZWQgPSBmYWxzZVxuICBjb25zdCBidWZmZXI6IFRbXSA9IFtdXG4gIGNvbnN0IHBlbmRpbmc6IFdhaXRlcltdID0gW11cbiAgbGV0IGFjdGl2ZUNvbnN1bWVycyA9IG51bUNvbnN1bWVyc1xuXG4gIC8vIGNvbnN1bWVyIGJvb2trZWVwaW5nXG4gIGxldCBhd2FpdGluZ0FjayA9IDBcblxuICBmdW5jdGlvbiBwdXNoQ2h1bmsoY2h1bms6IFQpIHtcbiAgICBidWZmZXIucHVzaChjaHVuaylcbiAgICBmbHVzaCgpXG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCA+IDAgJiYgcGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGJ1ZmZlclswXSAvLyBrZWVwIHVudGlsIGFsbCBjb25zdW1lcnMgYWNrXG4gICAgICBjb25zdCB3YWl0ZXIgPSBwZW5kaW5nLnNoaWZ0KCkhXG4gICAgICB3YWl0ZXIoeyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0pXG4gICAgICBhd2FpdGluZ0FjaysrXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5kKCkge1xuICAgIGVuZGVkID0gdHJ1ZVxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bms6IFQpID0+IHtcbiAgICBwdXNoQ2h1bmsoY2h1bmspXG4gIH0pXG5cbiAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgZW5kKClcbiAgfSlcblxuICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHdhaXRlciA9IHBlbmRpbmcuc2hpZnQoKSFcbiAgICAgIHdhaXRlcih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICB9XG4gICAgdGhyb3cgZXJyXG4gIH0pXG5cbiAgZnVuY3Rpb24gbWFrZUl0ZXJhYmxlKCk6IEFzeW5jSXRlcmFibGU8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyWzBdXG4gICAgICAgICAgICAgIGF3YWl0aW5nQWNrKytcbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgIHBlbmRpbmcucHVzaChyZXNvbHZlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzeW5jIHJldHVybigpIHtcbiAgICAgICAgICAgIGFjdGl2ZUNvbnN1bWVycy0tXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29uc3VtZXJzID09PSAwKSB7XG4gICAgICAgICAgICAgIGVuZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFjaygpIHtcbiAgICBhd2FpdGluZ0Fjay0tXG4gICAgaWYgKGF3YWl0aW5nQWNrID09PSAwKSB7XG4gICAgICAvLyBhbGwgY29uc3VtZXJzIGRvbmUgd2l0aCB0aGUgY3VycmVudCBjaHVua1xuICAgICAgYnVmZmVyLnNoaWZ0KCkgLy8gZHJvcCBpdFxuICAgICAgYXdhaXQgb25BbGxIYW5kbGVkKClcbiAgICAgIGZsdXNoKCkgLy8gY29udGludWUgd2l0aCBuZXh0IGNodW5rXG4gICAgfVxuICB9XG5cbiAgLy8gd3JhcCBjb25zdW1lciBzbyB0aGV5ICptdXN0KiBjYWxsIGFjaygpIGFmdGVyIHByb2Nlc3NpbmdcbiAgZnVuY3Rpb24gd3JhcChpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxUPik6IEFzeW5jSXRlcmFibGU8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgeWllbGQgaXRlbVxuICAgICAgICAgIGF3YWl0IGFjaygpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmF3SXRlcmFibGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtQ29uc3VtZXJzIH0sIG1ha2VJdGVyYWJsZSlcbiAgcmV0dXJuIHJhd0l0ZXJhYmxlcy5tYXAod3JhcClcbn1cbiJdfQ==
|