@rdfc/js-runner 2.0.0 → 3.0.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.
Files changed (70) hide show
  1. package/.editorconfig +9 -0
  2. package/.github/renovate.json +3 -0
  3. package/README.md +127 -3
  4. package/__tests__/channels.test.ts +131 -74
  5. package/__tests__/echoProcessor.test.ts +131 -0
  6. package/__tests__/testProcessor.test.ts +69 -0
  7. package/eslint.config.mjs +1 -1
  8. package/examples/echo/.idea/echo.iml +9 -0
  9. package/examples/echo/.idea/misc.xml +6 -0
  10. package/{.idea → examples/echo/.idea}/modules.xml +1 -1
  11. package/examples/echo/.idea/vcs.xml +7 -0
  12. package/examples/echo/.swls/config.json +1 -0
  13. package/examples/echo/index.ttl +3 -0
  14. package/examples/echo/minimal.ttl +90 -0
  15. package/examples/echo/shacl.ttl +9 -0
  16. package/examples/echo/shape.ttl +1339 -0
  17. package/examples/echo/test.ttl +11 -0
  18. package/examples/echo/untitled:/types/MyType.ttl +0 -0
  19. package/file:/home/silvius/Projects/mumo-pipeline/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +3 -0
  20. package/index.ttl +3 -31
  21. package/ldes/http_3A_2F_2Fdata.mumo.be_2Fstreams_2Fnodes_2Fdefault/root/index.trig +3 -0
  22. package/lib/client.js +6 -9
  23. package/lib/logger.d.ts +2 -2
  24. package/lib/logger.js +3 -3
  25. package/lib/reader.d.ts +8 -6
  26. package/lib/reader.js +135 -25
  27. package/lib/runner.d.ts +10 -5
  28. package/lib/runner.js +86 -46
  29. package/lib/testUtils/duplex.d.ts +25 -0
  30. package/lib/testUtils/duplex.js +70 -0
  31. package/lib/testUtils/index.d.ts +51 -0
  32. package/lib/testUtils/index.js +243 -0
  33. package/lib/tsconfig.tsbuildinfo +1 -1
  34. package/lib/writer.d.ts +12 -5
  35. package/lib/writer.js +66 -13
  36. package/minimal.ttl +99 -0
  37. package/package.json +3 -3
  38. package/src/client.ts +8 -11
  39. package/src/logger.ts +3 -3
  40. package/src/reader.ts +207 -29
  41. package/src/runner.ts +128 -65
  42. package/src/testUtils/duplex.ts +112 -0
  43. package/src/testUtils/index.ts +430 -0
  44. package/src/writer.ts +106 -16
  45. package/.idea/LNKD.tech Editor.xml +0 -194
  46. package/.idea/codeStyles/Project.xml +0 -52
  47. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  48. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  49. package/.idea/js-runner.iml +0 -12
  50. package/.idea/vcs.xml +0 -6
  51. package/dist/args.d.ts +0 -4
  52. package/dist/args.js +0 -58
  53. package/dist/connectors/file.d.ts +0 -15
  54. package/dist/connectors/file.js +0 -89
  55. package/dist/connectors/http.d.ts +0 -14
  56. package/dist/connectors/http.js +0 -82
  57. package/dist/connectors/kafka.d.ts +0 -48
  58. package/dist/connectors/kafka.js +0 -68
  59. package/dist/connectors/ws.d.ts +0 -10
  60. package/dist/connectors/ws.js +0 -72
  61. package/dist/connectors.d.ts +0 -73
  62. package/dist/connectors.js +0 -168
  63. package/dist/index.cjs +0 -732
  64. package/dist/index.d.ts +0 -42
  65. package/dist/index.js +0 -83
  66. package/dist/tsconfig.tsbuildinfo +0 -1
  67. package/dist/util.d.ts +0 -71
  68. package/dist/util.js +0 -92
  69. package/src/jsonld.ts +0 -220
  70. package/src/testUtils.ts +0 -196
package/lib/runner.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ReaderInstance } from './reader.js';
2
2
  import { WriterInstance } from './writer.js';
3
- import winston from 'winston';
3
+ import { createLogger } from 'winston';
4
4
  import { RpcTransport } from './logger.js';
5
5
  import { empty, extractShapes } from 'rdf-lens';
6
6
  import { NamedNode, Parser } from 'n3';
@@ -11,21 +11,21 @@ export class Runner {
11
11
  readers = {};
12
12
  writers = {};
13
13
  client;
14
- write;
14
+ notifyOrchestrator;
15
15
  logger;
16
16
  shapes;
17
17
  quads = [];
18
18
  uri;
19
19
  processors = [];
20
20
  processorTransforms = [];
21
- constructor(client, write, uri, logger) {
21
+ constructor(client, notifyOrchestrator, uri, logger) {
22
22
  this.client = client;
23
- this.write = write;
23
+ this.notifyOrchestrator = notifyOrchestrator;
24
24
  this.uri = uri;
25
25
  this.logger = logger;
26
26
  }
27
27
  async addProcessor(proc) {
28
- const procLogger = winston.createLogger({
28
+ const procLogger = createLogger({
29
29
  transports: [
30
30
  new RpcTransport({
31
31
  entities: [proc.uri, this.uri],
@@ -33,9 +33,9 @@ export class Runner {
33
33
  }),
34
34
  ],
35
35
  });
36
- const ty = JSON.stringify(this.quads
36
+ const ty = this.quads
37
37
  .filter((x) => x.subject.value === proc.uri && x.predicate.equals(RDF.terms.type))
38
- .map((x) => x.object.value));
38
+ .map((x) => x.object.value);
39
39
  this.logger.info('parsing ' + proc.uri + ' type ' + ty);
40
40
  const args = this.shapes.lenses[RDFL.TypedExtract].execute({
41
41
  id: new NamedNode(proc.uri),
@@ -49,7 +49,7 @@ export class Runner {
49
49
  this.logger.info('inited ' + proc.uri + ' type ' + ty);
50
50
  this.processors.push(instance);
51
51
  this.processorTransforms.push(instance.transform());
52
- await this.write({ init: { uri: proc.uri } });
52
+ await this.notifyOrchestrator({ initialized: { uri: proc.uri } });
53
53
  return instance;
54
54
  }
55
55
  async start() {
@@ -62,60 +62,100 @@ export class Runner {
62
62
  }
63
63
  }
64
64
  createWriter(uri) {
65
- const ids = uri.value;
66
- if (this.writers[ids] === undefined) {
67
- this.writers[ids] = [];
65
+ const id = uri.value;
66
+ if (this.writers[id] !== undefined) {
67
+ return this.writers[id];
68
68
  }
69
- const writer = new WriterInstance(ids, this.client, this.write, this.logger);
70
- this.writers[ids].push(writer);
69
+ const writer = new WriterInstance(id, this.client, this.notifyOrchestrator, this.uri, this.logger);
70
+ this.writers[id] = writer;
71
71
  return writer;
72
72
  }
73
73
  createReader(uri) {
74
74
  const ids = uri.value;
75
- if (this.readers[ids] === undefined) {
76
- this.readers[ids] = [];
75
+ if (this.readers[ids] !== undefined) {
76
+ return this.readers[ids];
77
77
  }
78
- const reader = new ReaderInstance(ids, this.client, this.logger);
79
- this.readers[ids].push(reader);
78
+ const reader = new ReaderInstance(ids, this.client, this.notifyOrchestrator, this.logger);
79
+ this.readers[ids] = reader;
80
80
  return reader;
81
81
  }
82
82
  async handleOrchMessage(msg) {
83
83
  if (msg.msg) {
84
- this.logger.debug('Handling data msg for ' + msg.msg.channel);
85
- for (const reader of this.readers[msg.msg.channel] || []) {
86
- reader.handleMsg(msg.msg);
87
- }
84
+ this.handleMsg(msg.msg);
88
85
  }
89
86
  if (msg.streamMsg) {
90
- for (const reader of this.readers[msg.streamMsg.channel] || []) {
91
- reader.handleStreamingMessage(msg.streamMsg);
92
- }
87
+ await this.handleStreamMsg(msg.streamMsg);
93
88
  }
94
89
  if (msg.close) {
95
- const uri = msg.close.channel;
96
- for (const reader of this.readers[uri] || []) {
97
- reader.close();
98
- }
99
- for (const writer of this.writers[uri] || []) {
100
- await writer.close(true);
101
- }
90
+ await this.handleClose(msg.close);
102
91
  }
103
92
  if (msg.pipeline) {
104
- try {
105
- const quads = new Parser().parse(msg.pipeline);
106
- this.shapes = extractShapes(quads, {
107
- [RDFC.Reader]: (x) => this.createReader(x.id),
108
- [RDFC.Writer]: (x) => this.createWriter(x.id),
109
- }, {
110
- [RDFC.Reader]: empty(),
111
- [RDFC.Writer]: empty(),
112
- });
113
- this.quads = quads;
114
- }
115
- catch (ex) {
116
- this.logger.error('Pipeline failed: ' + JSON.stringify(ex));
117
- }
93
+ this.handlePipeline(msg.pipeline);
94
+ }
95
+ if (msg.processed) {
96
+ this.handleProcessed(msg.processed);
97
+ }
98
+ }
99
+ async handleClose(close) {
100
+ const uri = close.channel;
101
+ const r = this.readers[uri];
102
+ let closed = false;
103
+ if (r) {
104
+ r.close();
105
+ closed = true;
106
+ }
107
+ const w = this.writers[uri];
108
+ if (w) {
109
+ closed = true;
110
+ await w.close(true);
111
+ }
112
+ if (!closed) {
113
+ this.logger.error(`Received a close event for channel ${uri}, but neither reader nor writer is present.`);
114
+ }
115
+ }
116
+ handlePipeline(pipeline) {
117
+ try {
118
+ const quads = new Parser().parse(pipeline);
119
+ this.shapes = extractShapes(quads, {
120
+ [RDFC.Reader]: (x) => this.createReader(x.id),
121
+ [RDFC.Writer]: (x) => this.createWriter(x.id),
122
+ }, {
123
+ [RDFC.Reader]: empty(),
124
+ [RDFC.Writer]: empty(),
125
+ });
126
+ this.quads = quads;
127
+ }
128
+ catch (ex) {
129
+ this.logger.error('Pipeline failed: ' + JSON.stringify(ex));
130
+ }
131
+ }
132
+ handleMsg(msg) {
133
+ this.logger.debug('Handling data msg for ' + msg.channel);
134
+ const r = this.readers[msg.channel];
135
+ if (r) {
136
+ r.handleMsg(msg);
137
+ }
138
+ else {
139
+ this.logger.error(`Received message for channel ${msg.channel}, but no reader was present.`);
140
+ }
141
+ }
142
+ async handleStreamMsg(streamMsg) {
143
+ const r = this.readers[streamMsg.channel];
144
+ if (r) {
145
+ await r.handleStreamingMessage(streamMsg);
146
+ }
147
+ else {
148
+ this.logger.error(`Received stream message for channel ${streamMsg.channel}, but no reader was present.`);
149
+ }
150
+ }
151
+ handleProcessed(processed) {
152
+ const writer = this.writers[processed.channel];
153
+ if (writer) {
154
+ writer.handled();
155
+ }
156
+ else {
157
+ this.logger.error(`Received processed message for channel ${processed.channel}, but no writer was present.`);
118
158
  }
119
159
  }
120
160
  }
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQVUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ2pELE9BQU8sRUFBVSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFJakQsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFBO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDdkMsT0FBTyxFQUFRLEtBQUssRUFBRSxhQUFhLEVBQVUsTUFBTSxVQUFVLENBQUE7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHL0UsTUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQ3BDLHFDQUFxQyxFQUNyQyxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixRQUFRLEVBQ1IsWUFBWSxFQUNaLFVBQVUsQ0FDWCxDQUFBO0FBRUQsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUMxQiwrQkFBK0IsRUFDL0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDUixRQUFRLEVBQ1IsUUFBUSxDQUNULENBQUE7QUFZRCxNQUFNLE9BQU8sTUFBTTtJQUNBLE9BQU8sR0FBd0MsRUFBRSxDQUFBO0lBQ2pELE9BQU8sR0FBd0MsRUFBRSxDQUFBO0lBQ2pELE1BQU0sQ0FBYztJQUNwQixLQUFLLENBQVU7SUFDZixNQUFNLENBQVE7SUFDdkIsTUFBTSxDQUFRO0lBQ2QsS0FBSyxHQUFXLEVBQUUsQ0FBQTtJQUVULEdBQUcsQ0FBUTtJQUVYLFVBQVUsR0FBb0IsRUFBRSxDQUFBO0lBQ2hDLG1CQUFtQixHQUF1QixFQUFFLENBQUE7SUFF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TUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDO2dCQUVILE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQ3pCLEtBQUssRUFDTDtvQkFDRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuRCxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNwRCxFQUNEO29CQUNFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBUTtvQkFDNUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFRO2lCQUM3QixDQUNGLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7WUFDcEIsQ0FBQztZQUFDLE9BQU8sRUFBVyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUM3RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE9yY2hlc3RyYXRvck1lc3NhZ2UsXG4gIFByb2Nlc3NvcixcbiAgUnVubmVyQ2xpZW50LFxuICBSdW5uZXJNZXNzYWdlLFxufSBmcm9tICdAcmRmYy9wcm90bydcbmltcG9ydCB7IFJlYWRlciwgUmVhZGVySW5zdGFuY2UgfSBmcm9tICcuL3JlYWRlcidcbmltcG9ydCB7IFdyaXRlciwgV3JpdGVySW5zdGFuY2UgfSBmcm9tICcuL3dyaXRlcidcbmltcG9ydCB7IFByb2Nlc3NvciBhcyBQcm9jIH0gZnJvbSAnLi9wcm9jZXNzb3InXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICd3aW5zdG9uJ1xuXG5pbXBvcnQgd2luc3RvbiBmcm9tICd3aW5zdG9uJ1xuaW1wb3J0IHsgUnBjVHJhbnNwb3J0IH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQgeyBDb250LCBlbXB0eSwgZXh0cmFjdFNoYXBlcywgU2hhcGVzIH0gZnJvbSAncmRmLWxlbnMnXG5pbXBvcnQgeyBOYW1lZE5vZGUsIFBhcnNlciB9IGZyb20gJ24zJ1xuaW1wb3J0IHsgY3JlYXRlTmFtZXNwYWNlLCBjcmVhdGVVcmlBbmRUZXJtTmFtZXNwYWNlLCBSREYgfSBmcm9tICdAdHJlZWNnL3R5cGVzJ1xuaW1wb3J0IHsgUXVhZCwgVGVybSB9IGZyb20gJ0ByZGZqcy90eXBlcydcblxuY29uc3QgUkRGTCA9IGNyZWF0ZVVyaUFuZFRlcm1OYW1lc3BhY2UoXG4gICdodHRwczovL3czaWQub3JnL3JkZi1sZW5zL29udG9sb2d5IycsXG4gICdDQkQnLFxuICAnUGF0aCcsXG4gICdQYXRoTGVucycsXG4gICdDb250ZXh0JyxcbiAgJ1R5cGVkRXh0cmFjdCcsXG4gICdFbnZWYXJpYWJsZScsXG4gICdlbnZLZXknLFxuICAnZW52RGVmYXVsdCcsXG4gICdkYXRhdHlwZScsXG4pXG5cbmNvbnN0IFJERkMgPSBjcmVhdGVOYW1lc3BhY2UoXG4gICdodHRwczovL3czaWQub3JnL3JkZi1jb25uZWN0IycsXG4gICh4KSA9PiB4LFxuICAnUmVhZGVyJyxcbiAgJ1dyaXRlcicsXG4pXG5cbmV4cG9ydCB0eXBlIFdyaXRhYmxlID0gKG1zZzogT3JjaGVzdHJhdG9yTWVzc2FnZSkgPT4gUHJvbWlzZTx1bmtub3duPlxuXG50eXBlIFByb2Nlc3NvckNvbmZpZyA9IHtcbiAgbG9jYXRpb246IHN0cmluZ1xuICBmaWxlOiBzdHJpbmdcbiAgY2xheno/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRnVsbFByb2M8QyBleHRlbmRzIFByb2M8dW5rbm93bj4+ID1cbiAgQyBleHRlbmRzIFByb2M8aW5mZXIgVD4gPyBUICYgQyA6IHVua25vd25cbmV4cG9ydCBjbGFzcyBSdW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRlcnM6IHsgW3VyaTogc3RyaW5nXTogUmVhZGVySW5zdGFuY2VbXSB9ID0ge31cbiAgcHJpdmF0ZSByZWFkb25seSB3cml0ZXJzOiB7IFt1cmk6IHN0cmluZ106IFdyaXRlckluc3RhbmNlW10gfSA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBSdW5uZXJDbGllbnRcbiAgcHJpdmF0ZSByZWFkb25seSB3cml0ZTogV3JpdGFibGVcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlclxuICBwcml2YXRlIHNoYXBlczogU2hhcGVzXG4gIHByaXZhdGUgcXVhZHM6IFF1YWRbXSA9IFtdXG5cbiAgcHJpdmF0ZSByZWFkb25seSB1cmk6IHN0cmluZ1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc29yczogUHJvYzx1bmtub3duPltdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9jZXNzb3JUcmFuc2Zvcm1zOiBQcm9taXNlPHVua25vd24+W10gPSBbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogUnVubmVyQ2xpZW50LFxuICAgIHdyaXRlOiBXcml0YWJsZSxcbiAgICB1cmk6IHN0cmluZyxcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLndyaXRlID0gd3JpdGVcbiAgICB0aGlzLnVyaSA9IHVyaVxuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gIH1cblxuICBhc3luYyBhZGRQcm9jZXNzb3I8UCBleHRlbmRzIFByb2M8dW5rbm93bj4+KFxuICAgIHByb2M6IFByb2Nlc3NvcixcbiAgKTogUHJvbWlzZTxGdWxsUHJvYzxQPj4ge1xuICAgIGNvbnN0IHByb2NMb2dnZXIgPSB3aW5zdG9uLmNyZWF0ZUxvZ2dlcih7XG4gICAgICB0cmFuc3BvcnRzOiBbXG4gICAgICAgIG5ldyBScGNUcmFuc3BvcnQoe1xuICAgICAgICAgIGVudGl0aWVzOiBbcHJvYy51cmksIHRoaXMudXJpXSxcbiAgICAgICAgICBzdHJlYW06IHRoaXMuY2xpZW50LmxvZ1N0cmVhbSgoKSA9PiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgY29uc3QgdHkgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgIHRoaXMucXVhZHNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgIHguc3ViamVjdC52YWx1ZSA9PT0gcHJvYy51cmkgJiYgeC5wcmVkaWNhdGUuZXF1YWxzKFJERi50ZXJtcy50eXBlKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKCh4KSA9PiB4Lm9iamVjdC52YWx1ZSksXG4gICAgKVxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ3BhcnNpbmcgJyArIHByb2MudXJpICsgJyB0eXBlICcgKyB0eSlcbiAgICBjb25zdCBhcmdzID0gdGhpcy5zaGFwZXMubGVuc2VzW1JERkwuVHlwZWRFeHRyYWN0XS5leGVjdXRlKHtcbiAgICAgIGlkOiBuZXcgTmFtZWROb2RlKHByb2MudXJpKSxcbiAgICAgIHF1YWRzOiB0aGlzLnF1YWRzLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb25maWc6IFByb2Nlc3NvckNvbmZpZyA9IEpTT04ucGFyc2UocHJvYy5jb25maWcpXG4gICAgLy8gY29uc3QgdXJsID0gbmV3IFVSTChjb25maWcubG9jYXRpb24pXG4gICAgLy8gcHJvY2Vzcy5jaGRpcih1cmwucGF0aG5hbWUpXG4gICAgY29uc3QganNQcm9ncmFtID0gYXdhaXQgaW1wb3J0KGNvbmZpZy5maWxlKVxuICAgIGNvbnN0IGNsYXp6ID0ganNQcm9ncmFtW2NvbmZpZy5jbGF6eiB8fCAnZGVmYXVsdCddXG4gICAgY29uc3QgaW5zdGFuY2U6IFByb2M8dW5rbm93bj4gPSBuZXcgY2xhenooYXJncywgcHJvY0xvZ2dlcilcbiAgICBhd2FpdCBpbnN0YW5jZS5pbml0KClcblxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ2luaXRlZCAnICsgcHJvYy51cmkgKyAnIHR5cGUgJyArIHR5KVxuXG4gICAgdGhpcy5wcm9jZXNzb3JzLnB1c2goaW5zdGFuY2UpXG4gICAgdGhpcy5wcm9jZXNzb3JUcmFuc2Zvcm1zLnB1c2goaW5zdGFuY2UudHJhbnNmb3JtKCkpXG5cbiAgICBhd2FpdCB0aGlzLndyaXRlKHsgaW5pdDogeyB1cmk6IHByb2MudXJpIH0gfSlcblxuICAgIHJldHVybiA8RnVsbFByb2M8UD4+aW5zdGFuY2VcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvcnMubWFwKCh4KSA9PiB4LnByb2R1Y2UoKSkpXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvclRyYW5zZm9ybXMpXG4gICAgfSBjYXRjaCAoZXg6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdTdGFydCBmYWlsZWQ6ICcgKyBKU09OLnN0cmluZ2lmeShleCkpXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlV3JpdGVyKHVyaTogVGVybSk6IFdyaXRlciB7XG4gICAgY29uc3QgaWRzID0gdXJpLnZhbHVlXG5cbiAgICBpZiAodGhpcy53cml0ZXJzW2lkc10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy53cml0ZXJzW2lkc10gPSBbXVxuICAgIH1cbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV3JpdGVySW5zdGFuY2UoaWRzLCB0aGlzLmNsaWVudCwgdGhpcy53cml0ZSwgdGhpcy5sb2dnZXIpXG4gICAgdGhpcy53cml0ZXJzW2lkc10ucHVzaCh3cml0ZXIpXG4gICAgcmV0dXJuIHdyaXRlclxuICB9XG5cbiAgY3JlYXRlUmVhZGVyKHVyaTogVGVybSk6IFJlYWRlciB7XG4gICAgY29uc3QgaWRzID0gdXJpLnZhbHVlXG5cbiAgICBpZiAodGhpcy5yZWFkZXJzW2lkc10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZWFkZXJzW2lkc10gPSBbXVxuICAgIH1cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVySW5zdGFuY2UoaWRzLCB0aGlzLmNsaWVudCwgdGhpcy5sb2dnZXIpXG4gICAgdGhpcy5yZWFkZXJzW2lkc10ucHVzaChyZWFkZXIpXG4gICAgcmV0dXJuIHJlYWRlclxuICB9XG5cbiAgYXN5bmMgaGFuZGxlT3JjaE1lc3NhZ2UobXNnOiBSdW5uZXJNZXNzYWdlKSB7XG4gICAgaWYgKG1zZy5tc2cpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdIYW5kbGluZyBkYXRhIG1zZyBmb3IgJyArIG1zZy5tc2cuY2hhbm5lbClcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMucmVhZGVyc1ttc2cubXNnLmNoYW5uZWxdIHx8IFtdKSB7XG4gICAgICAgIHJlYWRlci5oYW5kbGVNc2cobXNnLm1zZylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLnN0cmVhbU1zZykge1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5yZWFkZXJzW21zZy5zdHJlYW1Nc2cuY2hhbm5lbF0gfHwgW10pIHtcbiAgICAgICAgcmVhZGVyLmhhbmRsZVN0cmVhbWluZ01lc3NhZ2UobXNnLnN0cmVhbU1zZylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLmNsb3NlKSB7XG4gICAgICBjb25zdCB1cmkgPSBtc2cuY2xvc2UuY2hhbm5lbFxuXG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLnJlYWRlcnNbdXJpXSB8fCBbXSkge1xuICAgICAgICByZWFkZXIuY2xvc2UoKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHdyaXRlciBvZiB0aGlzLndyaXRlcnNbdXJpXSB8fCBbXSkge1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UodHJ1ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobXNnLnBpcGVsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBoZXJlXG4gICAgICAgIGNvbnN0IHF1YWRzID0gbmV3IFBhcnNlcigpLnBhcnNlKG1zZy5waXBlbGluZSlcbiAgICAgICAgdGhpcy5zaGFwZXMgPSBleHRyYWN0U2hhcGVzKFxuICAgICAgICAgIHF1YWRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFtSREZDLlJlYWRlcl06ICh4OiBDb250KSA9PiB0aGlzLmNyZWF0ZVJlYWRlcih4LmlkKSxcbiAgICAgICAgICAgIFtSREZDLldyaXRlcl06ICh4OiBDb250KSA9PiB0aGlzLmNyZWF0ZVdyaXRlcih4LmlkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFtSREZDLlJlYWRlcl06IGVtcHR5PENvbnQ+KCksXG4gICAgICAgICAgICBbUkRGQy5Xcml0ZXJdOiBlbXB0eTxDb250PigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5xdWFkcyA9IHF1YWRzXG4gICAgICB9IGNhdGNoIChleDogdW5rbm93bikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignUGlwZWxpbmUgZmFpbGVkOiAnICsgSlNPTi5zdHJpbmdpZnkoZXgpKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQVUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ2pELE9BQU8sRUFBVSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFakQsT0FBTyxFQUFFLFlBQVksRUFBVSxNQUFNLFNBQVMsQ0FBQTtBQUU5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3ZDLE9BQU8sRUFBUSxLQUFLLEVBQUUsYUFBYSxFQUFVLE1BQU0sVUFBVSxDQUFBO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRy9FLE1BQU0sSUFBSSxHQUFHLHlCQUF5QixDQUNwQyxxQ0FBcUMsRUFDckMsS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxFQUNULGNBQWMsRUFDZCxhQUFhLEVBQ2IsUUFBUSxFQUNSLFlBQVksRUFDWixVQUFVLENBQ1gsQ0FBQTtBQUVELE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FDMUIsK0JBQStCLEVBQy9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQ1IsUUFBUSxFQUNSLFFBQVEsQ0FDVCxDQUFBO0FBWUQsTUFBTSxPQUFPLE1BQU07SUFDQSxPQUFPLEdBQXNDLEVBQUUsQ0FBQTtJQUMvQyxPQUFPLEdBQXNDLEVBQUUsQ0FBQTtJQUMvQyxNQUFNLENBQWM7SUFDcEIsa0JBQWtCLENBQVU7SUFDNUIsTUFBTSxDQUFRO0lBQ3ZCLE1BQU0sQ0FBUTtJQUNkLEtBQUssR0FBVyxFQUFFLENBQUE7SUFFVCxHQUFHLENBQVE7SUFFWCxVQUFVLEdBQW9CLEVBQUUsQ0FBQTtJQUNoQyxtQkFBbUIsR0FBdUIs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ZW50IjpbImltcG9ydCB7XG4gIENsb3NlLFxuICBGcm9tUnVubmVyLFxuICBQcm9jZXNzb3IsXG4gIFJ1bm5lckNsaWVudCxcbiAgVG9SdW5uZXIsXG4gIExvY2FsQWNrLFxuICBSZWNlaXZpbmdNZXNzYWdlLFxuICBSZWNlaXZpbmdTdHJlYW1NZXNzYWdlLFxufSBmcm9tICdAcmRmYy9wcm90bydcbmltcG9ydCB7IFJlYWRlciwgUmVhZGVySW5zdGFuY2UgfSBmcm9tICcuL3JlYWRlcidcbmltcG9ydCB7IFdyaXRlciwgV3JpdGVySW5zdGFuY2UgfSBmcm9tICcuL3dyaXRlcidcbmltcG9ydCB7IFByb2Nlc3NvciBhcyBQcm9jIH0gZnJvbSAnLi9wcm9jZXNzb3InXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIExvZ2dlciB9IGZyb20gJ3dpbnN0b24nXG5cbmltcG9ydCB7IFJwY1RyYW5zcG9ydCB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgQ29udCwgZW1wdHksIGV4dHJhY3RTaGFwZXMsIFNoYXBlcyB9IGZyb20gJ3JkZi1sZW5zJ1xuaW1wb3J0IHsgTmFtZWROb2RlLCBQYXJzZXIgfSBmcm9tICduMydcbmltcG9ydCB7IGNyZWF0ZU5hbWVzcGFjZSwgY3JlYXRlVXJpQW5kVGVybU5hbWVzcGFjZSwgUkRGIH0gZnJvbSAnQHRyZWVjZy90eXBlcydcbmltcG9ydCB7IFF1YWQsIFRlcm0gfSBmcm9tICdAcmRmanMvdHlwZXMnXG5cbmNvbnN0IFJERkwgPSBjcmVhdGVVcmlBbmRUZXJtTmFtZXNwYWNlKFxuICAnaHR0cHM6Ly93M2lkLm9yZy9yZGYtbGVucy9vbnRvbG9neSMnLFxuICAnQ0JEJyxcbiAgJ1BhdGgnLFxuICAnUGF0aExlbnMnLFxuICAnQ29udGV4dCcsXG4gICdUeXBlZEV4dHJhY3QnLFxuICAnRW52VmFyaWFibGUnLFxuICAnZW52S2V5JyxcbiAgJ2VudkRlZmF1bHQnLFxuICAnZGF0YXR5cGUnLFxuKVxuXG5jb25zdCBSREZDID0gY3JlYXRlTmFtZXNwYWNlKFxuICAnaHR0cHM6Ly93M2lkLm9yZy9yZGYtY29ubmVjdCMnLFxuICAoeCkgPT4geCxcbiAgJ1JlYWRlcicsXG4gICdXcml0ZXInLFxuKVxuXG5leHBvcnQgdHlwZSBXcml0YWJsZSA9IChtc2c6IEZyb21SdW5uZXIpID0+IFByb21pc2U8dW5rbm93bj5cblxudHlwZSBQcm9jZXNzb3JDb25maWcgPSB7XG4gIGxvY2F0aW9uOiBzdHJpbmdcbiAgZmlsZTogc3RyaW5nXG4gIGNsYXp6Pzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEZ1bGxQcm9jPEMgZXh0ZW5kcyBQcm9jPHVua25vd24+PiA9XG4gIEMgZXh0ZW5kcyBQcm9jPGluZmVyIFQ+ID8gVCAmIEMgOiB1bmtub3duXG5leHBvcnQgY2xhc3MgUnVubmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWFkZXJzOiB7IFt1cmk6IHN0cmluZ106IFJlYWRlckluc3RhbmNlIH0gPSB7fVxuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnM6IHsgW3VyaTogc3RyaW5nXTogV3JpdGVySW5zdGFuY2UgfSA9IHt9XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBSdW5uZXJDbGllbnRcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJcbiAgcHJpdmF0ZSBzaGFwZXM6IFNoYXBlc1xuICBwcml2YXRlIHF1YWRzOiBRdWFkW10gPSBbXVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXJpOiBzdHJpbmdcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NvcnM6IFByb2M8dW5rbm93bj5bXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc29yVHJhbnNmb3JtczogUHJvbWlzZTx1bmtub3duPltdID0gW11cblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IFJ1bm5lckNsaWVudCxcbiAgICBub3RpZnlPcmNoZXN0cmF0b3I6IFdyaXRhYmxlLFxuICAgIHVyaTogc3RyaW5nLFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yID0gbm90aWZ5T3JjaGVzdHJhdG9yXG4gICAgdGhpcy51cmkgPSB1cmlcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICB9XG5cbiAgYXN5bmMgYWRkUHJvY2Vzc29yPFAgZXh0ZW5kcyBQcm9jPHVua25vd24+PihcbiAgICBwcm9jOiBQcm9jZXNzb3IsXG4gICk6IFByb21pc2U8RnVsbFByb2M8UD4+IHtcbiAgICBjb25zdCBwcm9jTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHtcbiAgICAgIHRyYW5zcG9ydHM6IFtcbiAgICAgICAgbmV3IFJwY1RyYW5zcG9ydCh7XG4gICAgICAgICAgZW50aXRpZXM6IFtwcm9jLnVyaSwgdGhpcy51cmldLFxuICAgICAgICAgIHN0cmVhbTogdGhpcy5jbGllbnQubG9nU3RyZWFtKCgpID0+IHt9KSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pXG5cbiAgICBjb25zdCB0eSA9IHRoaXMucXVhZHNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh4KSA9PlxuICAgICAgICAgIHguc3ViamVjdC52YWx1ZSA9PT0gcHJvYy51cmkgJiYgeC5wcmVkaWNhdGUuZXF1YWxzKFJERi50ZXJtcy50eXBlKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHgpID0+IHgub2JqZWN0LnZhbHVlKVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygncGFyc2luZyAnICsgcHJvYy51cmkgKyAnIHR5cGUgJyArIHR5KVxuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLnNoYXBlcy5sZW5zZXNbUkRGTC5UeXBlZEV4dHJhY3RdLmV4ZWN1dGUoe1xuICAgICAgaWQ6IG5ldyBOYW1lZE5vZGUocHJvYy51cmkpLFxuICAgICAgcXVhZHM6IHRoaXMucXVhZHMsXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbmZpZzogUHJvY2Vzc29yQ29uZmlnID0gSlNPTi5wYXJzZShwcm9jLmNvbmZpZylcbiAgICBjb25zdCBqc1Byb2dyYW0gPSBhd2FpdCBpbXBvcnQoY29uZmlnLmZpbGUpXG4gICAgY29uc3QgY2xhenogPSBqc1Byb2dyYW1bY29uZmlnLmNsYXp6IHx8ICdkZWZhdWx0J11cbiAgICBjb25zdCBpbnN0YW5jZTogUHJvYzx1bmtub3duPiA9IG5ldyBjbGF6eihhcmdzLCBwcm9jTG9nZ2VyKVxuICAgIGF3YWl0IGluc3RhbmNlLmluaXQoKVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygnaW5pdGVkICcgKyBwcm9jLnVyaSArICcgdHlwZSAnICsgdHkpXG5cbiAgICB0aGlzLnByb2Nlc3NvcnMucHVzaChpbnN0YW5jZSlcbiAgICB0aGlzLnByb2Nlc3NvclRyYW5zZm9ybXMucHVzaChpbnN0YW5jZS50cmFuc2Zvcm0oKSlcblxuICAgIGF3YWl0IHRoaXMubm90aWZ5T3JjaGVzdHJhdG9yKHsgaW5pdGlhbGl6ZWQ6IHsgdXJpOiBwcm9jLnVyaSB9IH0pXG5cbiAgICByZXR1cm4gPEZ1bGxQcm9jPFA+Pmluc3RhbmNlXG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wcm9jZXNzb3JzLm1hcCgoeCkgPT4geC5wcm9kdWNlKCkpKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wcm9jZXNzb3JUcmFuc2Zvcm1zKVxuICAgIH0gY2F0Y2ggKGV4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignU3RhcnQgZmFpbGVkOiAnICsgSlNPTi5zdHJpbmdpZnkoZXgpKVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVdyaXRlcih1cmk6IFRlcm0pOiBXcml0ZXIge1xuICAgIGNvbnN0IGlkID0gdXJpLnZhbHVlXG5cbiAgICBpZiAodGhpcy53cml0ZXJzW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy53cml0ZXJzW2lkXVxuICAgIH1cbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV3JpdGVySW5zdGFuY2UoXG4gICAgICBpZCxcbiAgICAgIHRoaXMuY2xpZW50LFxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IsXG4gICAgICB0aGlzLnVyaSxcbiAgICAgIHRoaXMubG9nZ2VyLFxuICAgIClcbiAgICB0aGlzLndyaXRlcnNbaWRdID0gd3JpdGVyXG4gICAgcmV0dXJuIHdyaXRlclxuICB9XG5cbiAgY3JlYXRlUmVhZGVyKHVyaTogVGVybSk6IFJlYWRlciB7XG4gICAgY29uc3QgaWRzID0gdXJpLnZhbHVlXG5cbiAgICBpZiAodGhpcy5yZWFkZXJzW2lkc10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZGVyc1tpZHNdXG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXJJbnN0YW5jZShcbiAgICAgIGlkcyxcbiAgICAgIHRoaXMuY2xpZW50LFxuICAgICAgdGhpcy5ub3RpZnlPcmNoZXN0cmF0b3IsXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICApXG4gICAgdGhpcy5yZWFkZXJzW2lkc10gPSByZWFkZXJcbiAgICByZXR1cm4gcmVhZGVyXG4gIH1cblxuICBhc3luYyBoYW5kbGVPcmNoTWVzc2FnZShtc2c6IFRvUnVubmVyKSB7XG4gICAgaWYgKG1zZy5tc2cpIHtcbiAgICAgIHRoaXMuaGFuZGxlTXNnKG1zZy5tc2cpXG4gICAgfVxuXG4gICAgaWYgKG1zZy5zdHJlYW1Nc2cpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU3RyZWFtTXNnKG1zZy5zdHJlYW1Nc2cpXG4gICAgfVxuXG4gICAgaWYgKG1zZy5jbG9zZSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVDbG9zZShtc2cuY2xvc2UpXG4gICAgfVxuXG4gICAgaWYgKG1zZy5waXBlbGluZSkge1xuICAgICAgdGhpcy5oYW5kbGVQaXBlbGluZShtc2cucGlwZWxpbmUpXG4gICAgfVxuXG4gICAgaWYgKG1zZy5wcm9jZXNzZWQpIHtcbiAgICAgIHRoaXMuaGFuZGxlUHJvY2Vzc2VkKG1zZy5wcm9jZXNzZWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogQ2xvc2UpIHtcbiAgICBjb25zdCB1cmkgPSBjbG9zZS5jaGFubmVsXG4gICAgY29uc3QgciA9IHRoaXMucmVhZGVyc1t1cmldXG5cbiAgICBsZXQgY2xvc2VkID0gZmFsc2VcbiAgICBpZiAocikge1xuICAgICAgci5jbG9zZSgpXG4gICAgICBjbG9zZWQgPSB0cnVlXG4gICAgfVxuICAgIGNvbnN0IHcgPSB0aGlzLndyaXRlcnNbdXJpXVxuICAgIGlmICh3KSB7XG4gICAgICBjbG9zZWQgPSB0cnVlXG4gICAgICBhd2FpdCB3LmNsb3NlKHRydWUpXG4gICAgfVxuXG4gICAgaWYgKCFjbG9zZWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgYSBjbG9zZSBldmVudCBmb3IgY2hhbm5lbCAke3VyaX0sIGJ1dCBuZWl0aGVyIHJlYWRlciBub3Igd3JpdGVyIGlzIHByZXNlbnQuYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBpcGVsaW5lKHBpcGVsaW5lOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVhZHMgPSBuZXcgUGFyc2VyKCkucGFyc2UocGlwZWxpbmUpXG4gICAgICB0aGlzLnNoYXBlcyA9IGV4dHJhY3RTaGFwZXMoXG4gICAgICAgIHF1YWRzLFxuICAgICAgICB7XG4gICAgICAgICAgW1JERkMuUmVhZGVyXTogKHg6IENvbnQpID0+IHRoaXMuY3JlYXRlUmVhZGVyKHguaWQpLFxuICAgICAgICAgIFtSREZDLldyaXRlcl06ICh4OiBDb250KSA9PiB0aGlzLmNyZWF0ZVdyaXRlcih4LmlkKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFtSREZDLlJlYWRlcl06IGVtcHR5PENvbnQ+KCksXG4gICAgICAgICAgW1JERkMuV3JpdGVyXTogZW1wdHk8Q29udD4oKSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHRoaXMucXVhZHMgPSBxdWFkc1xuICAgIH0gY2F0Y2ggKGV4OiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignUGlwZWxpbmUgZmFpbGVkOiAnICsgSlNPTi5zdHJpbmdpZnkoZXgpKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTXNnKG1zZzogUmVjZWl2aW5nTWVzc2FnZSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdIYW5kbGluZyBkYXRhIG1zZyBmb3IgJyArIG1zZy5jaGFubmVsKVxuICAgIGNvbnN0IHIgPSB0aGlzLnJlYWRlcnNbbXNnLmNoYW5uZWxdXG5cbiAgICBpZiAocikge1xuICAgICAgci5oYW5kbGVNc2cobXNnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFJlY2VpdmVkIG1lc3NhZ2UgZm9yIGNoYW5uZWwgJHttc2cuY2hhbm5lbH0sIGJ1dCBubyByZWFkZXIgd2FzIHByZXNlbnQuYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVN0cmVhbU1zZyhzdHJlYW1Nc2c6IFJlY2VpdmluZ1N0cmVhbU1lc3NhZ2UpIHtcbiAgICBjb25zdCByID0gdGhpcy5yZWFkZXJzW3N0cmVhbU1zZy5jaGFubmVsXVxuXG4gICAgaWYgKHIpIHtcbiAgICAgIGF3YWl0IHIuaGFuZGxlU3RyZWFtaW5nTWVzc2FnZShzdHJlYW1Nc2cpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgc3RyZWFtIG1lc3NhZ2UgZm9yIGNoYW5uZWwgJHtzdHJlYW1Nc2cuY2hhbm5lbH0sIGJ1dCBubyByZWFkZXIgd2FzIHByZXNlbnQuYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVByb2Nlc3NlZChwcm9jZXNzZWQ6IExvY2FsQWNrKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gdGhpcy53cml0ZXJzW3Byb2Nlc3NlZC5jaGFubmVsXVxuICAgIGlmICh3cml0ZXIpIHtcbiAgICAgIHdyaXRlci5oYW5kbGVkKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBwcm9jZXNzZWQgbWVzc2FnZSBmb3IgY2hhbm5lbCAke3Byb2Nlc3NlZC5jaGFubmVsfSwgYnV0IG5vIHdyaXRlciB3YXMgcHJlc2VudC5gLFxuICAgICAgKVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,25 @@
1
+ import { Duplex } from 'stream';
2
+ import type { ClientDuplexStream, InterceptingCallInterface } from '@grpc/grpc-js';
3
+ import { AuthContext } from '@grpc/grpc-js/build/src/auth-context';
4
+ type Matcher<Req, T> = (req: Req) => T | undefined;
5
+ type Handler<Req, Res> = (req: Req, send: (res: Res) => void) => void;
6
+ export declare class MockClientDuplexStream<Req, Res> extends Duplex implements ClientDuplexStream<Req, Res> {
7
+ private capabilities;
8
+ private onceCapabilities;
9
+ readonly id: number;
10
+ call?: InterceptingCallInterface | undefined;
11
+ constructor();
12
+ getAuthContext(): AuthContext | null;
13
+ cancel(): void;
14
+ getPeer(): string;
15
+ _write(chunk: Req, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
16
+ _read(): void;
17
+ serialize(value: Req): Buffer;
18
+ deserialize(chunk: Buffer): Res;
19
+ send(response: Res): void;
20
+ end(): this;
21
+ register<T>(matcher: Matcher<Req, T>, handler: Handler<T, Res>): void;
22
+ registerOnce<T>(matcher: Matcher<Req, T>, handler: Handler<T, Res>): void;
23
+ awaitMsg<T>(matcher: Matcher<Req, T>): Promise<T>;
24
+ }
25
+ export {};
@@ -0,0 +1,70 @@
1
+ import { Duplex } from 'stream';
2
+ let count = 0;
3
+ export class MockClientDuplexStream extends Duplex {
4
+ capabilities = [];
5
+ onceCapabilities = [];
6
+ id;
7
+ call;
8
+ constructor() {
9
+ super({ objectMode: true });
10
+ this.id = count++;
11
+ }
12
+ getAuthContext() {
13
+ return null;
14
+ }
15
+ cancel() { }
16
+ getPeer() {
17
+ return 'mock-peer';
18
+ }
19
+ _write(chunk, _encoding, callback) {
20
+ let handled = false;
21
+ for (const { matcher, handler } of this.capabilities) {
22
+ const o = matcher(chunk);
23
+ if (o !== undefined) {
24
+ handled = true;
25
+ handler(o, (res) => this.send(res));
26
+ }
27
+ }
28
+ const newOnce = [];
29
+ for (const { matcher, handler } of this.onceCapabilities) {
30
+ const o = matcher(chunk);
31
+ if (o !== undefined) {
32
+ handled = true;
33
+ handler(o, (res) => this.send(res));
34
+ }
35
+ else {
36
+ newOnce.push({ matcher, handler });
37
+ }
38
+ }
39
+ this.onceCapabilities = newOnce;
40
+ if (!handled) {
41
+ console.error('Unhandled!', Object.keys(chunk));
42
+ }
43
+ callback();
44
+ }
45
+ _read() {
46
+ }
47
+ serialize(value) {
48
+ return Buffer.from(JSON.stringify(value));
49
+ }
50
+ deserialize(chunk) {
51
+ return JSON.parse(chunk.toString());
52
+ }
53
+ send(response) {
54
+ this.push(response);
55
+ }
56
+ end() {
57
+ this.push(null);
58
+ return this;
59
+ }
60
+ register(matcher, handler) {
61
+ this.capabilities.push({ matcher, handler });
62
+ }
63
+ registerOnce(matcher, handler) {
64
+ this.onceCapabilities.push({ matcher, handler });
65
+ }
66
+ awaitMsg(matcher) {
67
+ return new Promise((res) => this.registerOnce(matcher, res));
68
+ }
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RVdGlscy9kdXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQWUvQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7QUFDYixNQUFNLE9BQU8sc0JBQ1gsU0FBUSxNQUFNO0lBR04sWUFBWSxHQUEwQyxFQUFFLENBQUE7SUFDeEQsZ0JBQWdCLEdBQTBDLEVBQUUsQ0FBQTtJQUVwRCxFQUFFLENBQVE7SUFFMUIsSUFBSSxDQUF3QztJQUM1QztRQUNFLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFHRCxNQUFNLEtBQVUsQ0FBQztJQUNqQixPQUFPO1FBQ0wsT0FBTyxXQUFXLENBQUE7SUFDcEIsQ0FBQztJQUdELE1BQU0sQ0FDSixLQUFVLEVBQ1YsU0FBeUIsRUFDekIsUUFBd0M7UUFFeEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFBO1FBRW5CLEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDckQsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3hCLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUNkLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFpQyxFQUFFLENBQUE7UUFDaEQsS0FBSyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN4QixJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQTtnQkFDZCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUNwQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUE7UUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFlLENBQUMsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFFRCxRQUFRLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFHRCxLQUFLO0lBRUwsQ0FBQztJQUdELFNBQVMsQ0FBQyxLQUFVO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQWE7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBRUQsR0FBRztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDZixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFHRCxRQUFRLENBQUksT0FBd0IsRUFBRSxPQUF3QjtRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQzlDLENBQUM7SUFFRCxZQUFZLENBQUksT0FBd0IsRUFBRSxPQUF3QjtRQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVELFFBQVEsQ0FBSSxPQUF3QjtRQUNsQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cGxleCB9IGZyb20gJ3N0cmVhbSdcbmltcG9ydCB0eXBlIHtcbiAgQ2xpZW50RHVwbGV4U3RyZWFtLFxuICBJbnRlcmNlcHRpbmdDYWxsSW50ZXJmYWNlLFxufSBmcm9tICdAZ3JwYy9ncnBjLWpzJ1xuaW1wb3J0IHsgQXV0aENvbnRleHQgfSBmcm9tICdAZ3JwYy9ncnBjLWpzL2J1aWxkL3NyYy9hdXRoLWNvbnRleHQnXG5cbnR5cGUgTWF0Y2hlcjxSZXEsIFQ+ID0gKHJlcTogUmVxKSA9PiBUIHwgdW5kZWZpbmVkXG50eXBlIEhhbmRsZXI8UmVxLCBSZXM+ID0gKHJlcTogUmVxLCBzZW5kOiAocmVzOiBSZXMpID0+IHZvaWQpID0+IHZvaWRcblxudHlwZSBNYXRjaE9iamVjdDxSZXEsIFJlcywgVD4gPSB7XG4gIG1hdGNoZXI6IE1hdGNoZXI8UmVxLCBUPlxuICBoYW5kbGVyOiBIYW5kbGVyPFQsIFJlcz5cbn1cblxubGV0IGNvdW50ID0gMFxuZXhwb3J0IGNsYXNzIE1vY2tDbGllbnREdXBsZXhTdHJlYW08UmVxLCBSZXM+XG4gIGV4dGVuZHMgRHVwbGV4XG4gIGltcGxlbWVudHMgQ2xpZW50RHVwbGV4U3RyZWFtPFJlcSwgUmVzPlxue1xuICBwcml2YXRlIGNhcGFiaWxpdGllczogQXJyYXk8TWF0Y2hPYmplY3Q8UmVxLCBSZXMsIHVua25vd24+PiA9IFtdXG4gIHByaXZhdGUgb25jZUNhcGFiaWxpdGllczogQXJyYXk8TWF0Y2hPYmplY3Q8UmVxLCBSZXMsIHVua25vd24+PiA9IFtdXG5cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXJcblxuICBjYWxsPzogSW50ZXJjZXB0aW5nQ2FsbEludGVyZmFjZSB8IHVuZGVmaW5lZFxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IG9iamVjdE1vZGU6IHRydWUgfSlcbiAgICB0aGlzLmlkID0gY291bnQrK1xuICB9XG5cbiAgZ2V0QXV0aENvbnRleHQoKTogQXV0aENvbnRleHQgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gLS0tLSBTdXJmYWNlQ2FsbCBzdHVicyAtLS0tXG4gIGNhbmNlbCgpOiB2b2lkIHt9XG4gIGdldFBlZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ21vY2stcGVlcidcbiAgfVxuXG4gIC8vIC0tLS0gT2JqZWN0V3JpdGFibGU8UmVxPiAtLS0tXG4gIF93cml0ZShcbiAgICBjaHVuazogUmVxLFxuICAgIF9lbmNvZGluZzogQnVmZmVyRW5jb2RpbmcsXG4gICAgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgbGV0IGhhbmRsZWQgPSBmYWxzZVxuICAgIC8vIGNoZWNrIHJlZ2lzdGVyZWQgY2FwYWJpbGl0aWVzXG4gICAgZm9yIChjb25zdCB7IG1hdGNoZXIsIGhhbmRsZXIgfSBvZiB0aGlzLmNhcGFiaWxpdGllcykge1xuICAgICAgY29uc3QgbyA9IG1hdGNoZXIoY2h1bmspXG4gICAgICBpZiAobyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhhbmRsZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIobywgKHJlcykgPT4gdGhpcy5zZW5kKHJlcykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV3T25jZTogdHlwZW9mIHRoaXMub25jZUNhcGFiaWxpdGllcyA9IFtdXG4gICAgZm9yIChjb25zdCB7IG1hdGNoZXIsIGhhbmRsZXIgfSBvZiB0aGlzLm9uY2VDYXBhYmlsaXRpZXMpIHtcbiAgICAgIGNvbnN0IG8gPSBtYXRjaGVyKGNodW5rKVxuICAgICAgaWYgKG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoYW5kbGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKG8sIChyZXMpID0+IHRoaXMuc2VuZChyZXMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T25jZS5wdXNoKHsgbWF0Y2hlciwgaGFuZGxlciB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25jZUNhcGFiaWxpdGllcyA9IG5ld09uY2VcbiAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCEnLCBPYmplY3Qua2V5cyhjaHVuayBhcyBvYmplY3QpKVxuICAgIH1cblxuICAgIGNhbGxiYWNrKClcbiAgfVxuXG4gIC8vIC0tLS0gT2JqZWN0UmVhZGFibGU8UmVzPiAtLS0tXG4gIF9yZWFkKCk6IHZvaWQge1xuICAgIC8vIG5vLW9wOiB3ZSBwdXNoIG1hbnVhbGx5IHdpdGggc2VuZCgpXG4gIH1cblxuICAvLyAtLS0tIGdSUEMtc3R5bGUgaGVscGVycyAtLS0tXG4gIHNlcmlhbGl6ZSh2YWx1ZTogUmVxKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICB9XG5cbiAgZGVzZXJpYWxpemUoY2h1bms6IEJ1ZmZlcik6IFJlcyB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY2h1bmsudG9TdHJpbmcoKSlcbiAgfVxuXG4gIHNlbmQocmVzcG9uc2U6IFJlcyk6IHZvaWQge1xuICAgIHRoaXMucHVzaChyZXNwb25zZSlcbiAgfVxuXG4gIGVuZCgpOiB0aGlzIHtcbiAgICB0aGlzLnB1c2gobnVsbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gLS0tLSBDYXBhYmlsaXR5IHJlZ2lzdHJhdGlvbiAtLS0tXG4gIHJlZ2lzdGVyPFQ+KG1hdGNoZXI6IE1hdGNoZXI8UmVxLCBUPiwgaGFuZGxlcjogSGFuZGxlcjxULCBSZXM+KTogdm9pZCB7XG4gICAgdGhpcy5jYXBhYmlsaXRpZXMucHVzaCh7IG1hdGNoZXIsIGhhbmRsZXIgfSlcbiAgfVxuXG4gIHJlZ2lzdGVyT25jZTxUPihtYXRjaGVyOiBNYXRjaGVyPFJlcSwgVD4sIGhhbmRsZXI6IEhhbmRsZXI8VCwgUmVzPik6IHZvaWQge1xuICAgIHRoaXMub25jZUNhcGFiaWxpdGllcy5wdXNoKHsgbWF0Y2hlciwgaGFuZGxlciB9KVxuICB9XG5cbiAgYXdhaXRNc2c8VD4obWF0Y2hlcjogTWF0Y2hlcjxSZXEsIFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMpID0+IHRoaXMucmVnaXN0ZXJPbmNlKG1hdGNoZXIsIHJlcykpXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,51 @@
1
+ import { DataChunk, FromRunner, LogMessage, ToRunner } from '@rdfc/proto';
2
+ import { NamedNode } from 'n3';
3
+ import { Processor } from '../processor.js';
4
+ import { FullProc, Runner } from '../runner.js';
5
+ import { Quad } from '@rdfjs/types';
6
+ import { ReceivingStreamControl, SendingStreamControl, StreamChunk, StreamIdentify } from '@rdfc/proto/lib/generated/common';
7
+ import { MockClientDuplexStream } from './duplex.js';
8
+ import { Reader } from '../reader.js';
9
+ import { Writer } from '../writer.js';
10
+ export declare function channel(runner: Runner, name: string): [Writer, Reader];
11
+ export declare class StreamMsgMock {
12
+ data: DataChunk[];
13
+ private readonly resolveId;
14
+ constructor(resolveId: (id: StreamIdentify) => number);
15
+ sendStreamMessage(): MockClientDuplexStream<StreamChunk, ReceivingStreamControl>;
16
+ }
17
+ export declare class OrchestratorMock {
18
+ connectStream: MockClientDuplexStream<FromRunner, ToRunner>;
19
+ streamMsgs: {
20
+ [id: string]: {
21
+ toProducingStream: (id: ReceivingStreamControl) => void;
22
+ receivingStream?: MockClientDuplexStream<SendingStreamControl, DataChunk>;
23
+ };
24
+ };
25
+ streamMsgCount: number;
26
+ connect(): MockClientDuplexStream<FromRunner, ToRunner>;
27
+ sendStreamMessage(): MockClientDuplexStream<StreamChunk, ReceivingStreamControl>;
28
+ receiveStreamMessage(): MockClientDuplexStream<SendingStreamControl, DataChunk>;
29
+ logStream(): MockClientDuplexStream<LogMessage, null>;
30
+ }
31
+ export declare function createRunner(uri?: string): Runner;
32
+ export declare function one<T>(iter: AsyncIterable<T>): Promise<T | undefined>;
33
+ export type ConfigType = {
34
+ location: string;
35
+ file: string;
36
+ clazz: string;
37
+ };
38
+ export declare function importFile(file: string, content?: string): Promise<Quad[]>;
39
+ export declare class ProcHelper<T extends Processor<unknown>> {
40
+ runner: Runner;
41
+ quads: Quad[];
42
+ config: ConfigType;
43
+ proc: FullProc<T>;
44
+ constructor(uri?: string);
45
+ importInline(baseIRI: string, config: string): Promise<void>;
46
+ importFile(file: string): Promise<void>;
47
+ getConfig(ty: string | NamedNode): ConfigType;
48
+ getProcessor(uri?: string): Promise<FullProc<T>>;
49
+ }
50
+ export declare function getProcInline<T extends Processor<unknown>>(config: string, ty: string, runner: Runner, baseIRI: string, uri?: string): Promise<FullProc<T>>;
51
+ export declare function getProc<T extends Processor<unknown>>(config: string, ty: string, runner: Runner, configLocation: string, uri?: string): Promise<FullProc<T>>;