@rdfc/js-runner 3.0.0 → 3.0.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.
Files changed (61) hide show
  1. package/.github/workflows/build-test.yml +24 -0
  2. package/.idea/LNKD.tech Editor.xml +194 -0
  3. package/.idea/codeStyles/Project.xml +52 -0
  4. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  5. package/.idea/copilot.data.migration.agent.xml +6 -0
  6. package/.idea/copilot.data.migration.ask.xml +6 -0
  7. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  8. package/.idea/copilot.data.migration.edit.xml +6 -0
  9. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  10. package/.idea/js-runner.iml +12 -0
  11. package/{examples/echo/.idea → .idea}/modules.xml +1 -1
  12. package/.idea/vcs.xml +6 -0
  13. package/__tests__/echoProcessor.test.ts +12 -11
  14. package/dist/args.d.ts +4 -0
  15. package/dist/args.js +58 -0
  16. package/dist/connectors/file.d.ts +15 -0
  17. package/dist/connectors/file.js +89 -0
  18. package/dist/connectors/http.d.ts +14 -0
  19. package/dist/connectors/http.js +82 -0
  20. package/dist/connectors/kafka.d.ts +48 -0
  21. package/dist/connectors/kafka.js +68 -0
  22. package/dist/connectors/ws.d.ts +10 -0
  23. package/dist/connectors/ws.js +72 -0
  24. package/dist/connectors.d.ts +73 -0
  25. package/dist/connectors.js +168 -0
  26. package/dist/index.cjs +732 -0
  27. package/dist/index.d.ts +42 -0
  28. package/dist/index.js +83 -0
  29. package/dist/tsconfig.tsbuildinfo +1 -0
  30. package/dist/util.d.ts +71 -0
  31. package/dist/util.js +92 -0
  32. package/lib/reader.js +1 -1
  33. package/lib/runner.d.ts +2 -1
  34. package/lib/runner.js +8 -4
  35. package/lib/testUtils/duplex.d.ts +2 -2
  36. package/lib/testUtils/duplex.js +1 -1
  37. package/lib/testUtils/index.d.ts +9 -9
  38. package/lib/testUtils/index.js +10 -11
  39. package/lib/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +25 -25
  41. package/src/reader.ts +8 -8
  42. package/src/runner.ts +13 -5
  43. package/src/testUtils/duplex.ts +2 -2
  44. package/src/testUtils/index.ts +21 -27
  45. package/examples/echo/.idea/echo.iml +0 -9
  46. package/examples/echo/.idea/misc.xml +0 -6
  47. package/examples/echo/.idea/vcs.xml +0 -7
  48. package/examples/echo/.swls/config.json +0 -1
  49. package/examples/echo/index.ttl +0 -3
  50. package/examples/echo/minimal.ttl +0 -90
  51. package/examples/echo/shacl.ttl +0 -9
  52. package/examples/echo/shape.ttl +0 -1339
  53. package/examples/echo/test.ttl +0 -11
  54. package/examples/echo/untitled:/types/MyType.ttl +0 -0
  55. package/file:/home/silvius/Projects/mumo-pipeline/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +0 -3
  56. package/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +0 -3
  57. package/lib/jsonld.d.ts +0 -17
  58. package/lib/jsonld.js +0 -135
  59. package/lib/testUtils.d.ts +0 -24
  60. package/lib/testUtils.js +0 -150
  61. package/minimal.ttl +0 -99
@@ -0,0 +1,24 @@
1
+ name: Build and tests with Node.js
2
+
3
+ on:
4
+ push:
5
+ branches: [main, renovate/**]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ build-and-test:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v5
15
+
16
+ - name: Setup Node.js
17
+ uses: actions/setup-node@v6
18
+ with:
19
+ node-version: 24.x
20
+ cache: 'npm'
21
+
22
+ - run: npm i
23
+ - run: npm run build
24
+ - run: npm run test
@@ -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,5 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <state>
3
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
+ </state>
5
+ </component>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AskMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Ask2AgentMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="EditMigrationStateService">
4
+ <option name="migrationStatus" value="COMPLETED" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </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>
@@ -2,7 +2,7 @@
2
2
  <project version="4">
3
3
  <component name="ProjectModuleManager">
4
4
  <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/echo.iml" filepath="$PROJECT_DIR$/.idea/echo.iml" />
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/js-runner.iml" filepath="$PROJECT_DIR$/.idea/js-runner.iml" />
6
6
  </modules>
7
7
  </component>
8
8
  </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -70,11 +70,12 @@ describe('EchoProcessor', () => {
70
70
 
71
71
  const msgs: string[] = []
72
72
 
73
- ;(async () => {
74
- for await (const m of outputReader.strings()) {
75
- msgs.push(m)
76
- }
77
- })()
73
+ ; (async () => {
74
+ for await (const m of outputReader.strings()) {
75
+ msgs.push(m)
76
+ }
77
+ })()
78
+
78
79
 
79
80
  await inputWriter.string('Hello')
80
81
  expect(msgs).toEqual(['Hello'])
@@ -106,13 +107,13 @@ describe('EchoProcessor', () => {
106
107
 
107
108
  const msgs: string[] = []
108
109
 
109
- ;(async () => {
110
- for await (const m of outputReader.strings()) {
111
- msgs.push(m)
112
- }
113
- })()
110
+ ; (async () => {
111
+ for await (const m of outputReader.strings()) {
112
+ msgs.push(m)
113
+ }
114
+ })()
114
115
 
115
- const gen = async function* () {
116
+ const gen = async function*() {
116
117
  yield encoder.encode('Hello')
117
118
  yield encoder.encode('World')
118
119
  }
package/dist/args.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export type Args = {
2
+ input: string
3
+ }
4
+ export declare function getArgs(): Args
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
+ }