@rdfc/js-runner 3.0.3 → 3.1.0-alpha.1
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 +66 -1
- package/dist/args.d.ts +4 -0
- package/dist/args.js +58 -0
- package/dist/connectors/file.d.ts +15 -0
- package/dist/connectors/file.js +89 -0
- package/dist/connectors/http.d.ts +14 -0
- package/dist/connectors/http.js +82 -0
- package/dist/connectors/kafka.d.ts +48 -0
- package/dist/connectors/kafka.js +68 -0
- package/dist/connectors/ws.d.ts +10 -0
- package/dist/connectors/ws.js +72 -0
- package/dist/connectors.d.ts +73 -0
- package/dist/connectors.js +168 -0
- package/dist/index.cjs +732 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +83 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/util.d.ts +71 -0
- package/dist/util.js +92 -0
- package/lib/reader.d.ts +4 -0
- package/lib/reader.js +46 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/writer.d.ts +14 -0
- package/lib/writer.js +120 -30
- package/package.json +11 -11
- package/src/reader.ts +54 -0
- package/src/writer.ts +172 -32
|
@@ -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 { StreamMsgMock, channel, createRunner } 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,67 @@ 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).toBeCalledTimes(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.toBeCalled()
|
|
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
|
+
const pendingWrite = writer.string('hello')
|
|
214
|
+
await reader.cancel()
|
|
215
|
+
|
|
216
|
+
await expect(pendingWrite).rejects.toThrow(/canceled/i)
|
|
217
|
+
})
|
|
153
218
|
})
|
package/dist/args.d.ts
ADDED
package/dist/args.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import commandLineArgs from 'command-line-args'
|
|
2
|
+
import commandLineUsage from 'command-line-usage'
|
|
3
|
+
const optionDefinitions = [
|
|
4
|
+
{
|
|
5
|
+
name: 'input',
|
|
6
|
+
type: String,
|
|
7
|
+
defaultOption: true,
|
|
8
|
+
summary: 'Specify what input file to start up',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: 'help',
|
|
12
|
+
alias: 'h',
|
|
13
|
+
type: Boolean,
|
|
14
|
+
description: 'Display this help message',
|
|
15
|
+
},
|
|
16
|
+
]
|
|
17
|
+
const sections = [
|
|
18
|
+
{
|
|
19
|
+
header: 'Js-runner',
|
|
20
|
+
content:
|
|
21
|
+
'JS-runner is part of the {italic connector architecture}. Starting from an input file start up all JsProcessors that are defined. Please do not use blank nodes, skolemize your data somewhere else!',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
header: 'Synopsis',
|
|
25
|
+
content: '$ js-runner <input>',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
header: 'Command List',
|
|
29
|
+
content: [
|
|
30
|
+
{ name: 'input', summary: 'Specify what input file to start up' },
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
optionList: [optionDefinitions[1]],
|
|
35
|
+
},
|
|
36
|
+
]
|
|
37
|
+
function validArgs(args) {
|
|
38
|
+
if (!args.input) return false
|
|
39
|
+
return true
|
|
40
|
+
}
|
|
41
|
+
function printUsage() {
|
|
42
|
+
const usage = commandLineUsage(sections)
|
|
43
|
+
console.log(usage)
|
|
44
|
+
process.exit(0)
|
|
45
|
+
}
|
|
46
|
+
export function getArgs() {
|
|
47
|
+
let args
|
|
48
|
+
try {
|
|
49
|
+
args = commandLineArgs(optionDefinitions)
|
|
50
|
+
} catch (e) {
|
|
51
|
+
console.error(e)
|
|
52
|
+
printUsage()
|
|
53
|
+
}
|
|
54
|
+
if (args.help || !validArgs(args)) {
|
|
55
|
+
printUsage()
|
|
56
|
+
}
|
|
57
|
+
return args
|
|
58
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReaderConstructor, WriterConstructor } from '../connectors.js'
|
|
2
|
+
export interface FileReaderConfig {
|
|
3
|
+
path: string
|
|
4
|
+
onReplace: boolean
|
|
5
|
+
readFirstContent?: boolean
|
|
6
|
+
encoding?: string
|
|
7
|
+
}
|
|
8
|
+
export interface FileWriterConfig {
|
|
9
|
+
path: string
|
|
10
|
+
onReplace: boolean
|
|
11
|
+
readFirstContent?: boolean
|
|
12
|
+
encoding?: string
|
|
13
|
+
}
|
|
14
|
+
export declare const startFileStreamReader: ReaderConstructor<FileReaderConfig>
|
|
15
|
+
export declare const startFileStreamWriter: WriterConstructor<FileWriterConfig>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createReadStream, openSync } from 'fs'
|
|
2
|
+
import { appendFile, readFile, stat, writeFile } from 'fs/promises'
|
|
3
|
+
import { isAbsolute } from 'path'
|
|
4
|
+
import { watch } from 'node:fs'
|
|
5
|
+
import { SimpleStream } from '../connectors.js'
|
|
6
|
+
async function getFileSize(path) {
|
|
7
|
+
return (await stat(path)).size
|
|
8
|
+
}
|
|
9
|
+
function readPart(path, start, end, encoding) {
|
|
10
|
+
return new Promise((res) => {
|
|
11
|
+
const stream = createReadStream(path, { encoding, start, end })
|
|
12
|
+
let buffer = ''
|
|
13
|
+
stream.on('data', (chunk) => {
|
|
14
|
+
buffer += chunk
|
|
15
|
+
})
|
|
16
|
+
stream.on('close', () => res(buffer))
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
function debounce(func, timeout = 100) {
|
|
20
|
+
let timer
|
|
21
|
+
return (...args) => {
|
|
22
|
+
clearTimeout(timer)
|
|
23
|
+
timer = setTimeout(() => {
|
|
24
|
+
func(...args)
|
|
25
|
+
}, timeout)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const startFileStreamReader = (config) => {
|
|
29
|
+
const path = isAbsolute(config.path)
|
|
30
|
+
? config.path
|
|
31
|
+
: `${process.cwd()}/${config.path}`
|
|
32
|
+
openSync(path, 'a+')
|
|
33
|
+
const encoding = config.encoding || 'utf-8'
|
|
34
|
+
const reader = new SimpleStream()
|
|
35
|
+
const init = async () => {
|
|
36
|
+
let currentPos = await getFileSize(path)
|
|
37
|
+
const watcher = watch(path, { encoding: 'utf-8' })
|
|
38
|
+
watcher.on(
|
|
39
|
+
'change',
|
|
40
|
+
debounce(async () => {
|
|
41
|
+
try {
|
|
42
|
+
let content
|
|
43
|
+
if (config.onReplace) {
|
|
44
|
+
content = await readFile(path, { encoding })
|
|
45
|
+
} else {
|
|
46
|
+
const newSize = await getFileSize(path)
|
|
47
|
+
if (newSize <= currentPos) {
|
|
48
|
+
currentPos = newSize
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
content = await readPart(path, currentPos, newSize, encoding)
|
|
52
|
+
currentPos = newSize
|
|
53
|
+
}
|
|
54
|
+
await reader.push(content)
|
|
55
|
+
} catch (error) {
|
|
56
|
+
if (error.code === 'ENOENT') {
|
|
57
|
+
return
|
|
58
|
+
}
|
|
59
|
+
throw error
|
|
60
|
+
}
|
|
61
|
+
}),
|
|
62
|
+
)
|
|
63
|
+
if (config.onReplace && config.readFirstContent) {
|
|
64
|
+
const content = await readFile(path, { encoding })
|
|
65
|
+
await reader.push(content)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { reader, init }
|
|
69
|
+
}
|
|
70
|
+
export const startFileStreamWriter = (config) => {
|
|
71
|
+
const path = isAbsolute(config.path)
|
|
72
|
+
? config.path
|
|
73
|
+
: `${process.cwd()}/${config.path}`
|
|
74
|
+
const encoding = config.encoding || 'utf-8'
|
|
75
|
+
const writer = new SimpleStream()
|
|
76
|
+
const init = async () => {
|
|
77
|
+
if (!config.onReplace) {
|
|
78
|
+
await writeFile(path, '', { encoding })
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
writer.push = async (item) => {
|
|
82
|
+
if (config.onReplace) {
|
|
83
|
+
await writeFile(path, item, { encoding })
|
|
84
|
+
} else {
|
|
85
|
+
await appendFile(path, item, { encoding })
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { writer, init }
|
|
89
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ReaderConstructor, WriterConstructor } from '../connectors.js'
|
|
2
|
+
export interface HttpReaderConfig {
|
|
3
|
+
endpoint: string
|
|
4
|
+
port: number
|
|
5
|
+
binary: boolean
|
|
6
|
+
waitHandled?: boolean
|
|
7
|
+
responseCode?: number
|
|
8
|
+
}
|
|
9
|
+
export declare const startHttpStreamReader: ReaderConstructor<HttpReaderConfig>
|
|
10
|
+
export interface HttpWriterConfig {
|
|
11
|
+
endpoint: string
|
|
12
|
+
method: string
|
|
13
|
+
}
|
|
14
|
+
export declare const startHttpStreamWriter: WriterConstructor<HttpWriterConfig>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as http from 'http'
|
|
2
|
+
import { createServer } from 'http'
|
|
3
|
+
import { SimpleStream } from '../connectors.js'
|
|
4
|
+
function streamToString(stream, binary) {
|
|
5
|
+
const datas = []
|
|
6
|
+
return new Promise((res) => {
|
|
7
|
+
stream.on('data', (data) => {
|
|
8
|
+
datas.push(data)
|
|
9
|
+
})
|
|
10
|
+
stream.on('end', () => {
|
|
11
|
+
const streamData = Buffer.concat(datas)
|
|
12
|
+
res(binary ? streamData : streamData.toString())
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
}
|
|
16
|
+
export const startHttpStreamReader = (config) => {
|
|
17
|
+
let server = undefined
|
|
18
|
+
const stream = new SimpleStream(
|
|
19
|
+
() =>
|
|
20
|
+
new Promise((res) => {
|
|
21
|
+
if (server !== undefined) {
|
|
22
|
+
server.close(() => {
|
|
23
|
+
res()
|
|
24
|
+
})
|
|
25
|
+
} else {
|
|
26
|
+
res()
|
|
27
|
+
}
|
|
28
|
+
}),
|
|
29
|
+
)
|
|
30
|
+
const requestListener = async function (req, res) {
|
|
31
|
+
try {
|
|
32
|
+
const content = await streamToString(req, config.binary)
|
|
33
|
+
const promise = stream.push(content).catch((error) => {
|
|
34
|
+
throw error
|
|
35
|
+
})
|
|
36
|
+
if (config.waitHandled) {
|
|
37
|
+
await promise
|
|
38
|
+
}
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error('Failed', error)
|
|
41
|
+
}
|
|
42
|
+
res.writeHead(config.responseCode || 200)
|
|
43
|
+
res.end('OK')
|
|
44
|
+
}
|
|
45
|
+
server = createServer(requestListener)
|
|
46
|
+
const init = () => {
|
|
47
|
+
return new Promise((res) => {
|
|
48
|
+
const cb = () => res(undefined)
|
|
49
|
+
if (server) {
|
|
50
|
+
server.listen(config.port, config.endpoint, cb)
|
|
51
|
+
} else {
|
|
52
|
+
cb()
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
return { reader: stream, init }
|
|
57
|
+
}
|
|
58
|
+
export const startHttpStreamWriter = (config) => {
|
|
59
|
+
const requestConfig = new URL(config.endpoint)
|
|
60
|
+
const writer = new SimpleStream()
|
|
61
|
+
writer.push = async (item) => {
|
|
62
|
+
await new Promise((resolve) => {
|
|
63
|
+
const options = {
|
|
64
|
+
hostname: requestConfig.hostname,
|
|
65
|
+
path: requestConfig.path,
|
|
66
|
+
method: config.method,
|
|
67
|
+
port: requestConfig.port,
|
|
68
|
+
}
|
|
69
|
+
const cb = (response) => {
|
|
70
|
+
response.on('data', () => {})
|
|
71
|
+
response.on('end', () => {
|
|
72
|
+
resolve(null)
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
const req = http.request(options, cb)
|
|
76
|
+
req.write(item, () => {
|
|
77
|
+
req.end()
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
return { writer, init: async () => {} }
|
|
82
|
+
}
|