@corvina/device-client 1.0.10

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 (51) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/CONTRIBUTING.md +31 -0
  3. package/LICENSE +21 -0
  4. package/README.md +138 -0
  5. package/dist/common/types.d.ts +89 -0
  6. package/dist/common/types.js +65 -0
  7. package/dist/common/types.js.map +1 -0
  8. package/dist/device.module.d.ts +2 -0
  9. package/dist/device.module.js +41 -0
  10. package/dist/device.module.js.map +1 -0
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.js +22 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/services/configparser.d.ts +232 -0
  15. package/dist/services/configparser.js +458 -0
  16. package/dist/services/configparser.js.map +1 -0
  17. package/dist/services/corvinadatainterface.d.ts +24 -0
  18. package/dist/services/corvinadatainterface.js +107 -0
  19. package/dist/services/corvinadatainterface.js.map +1 -0
  20. package/dist/services/device.service.d.ts +77 -0
  21. package/dist/services/device.service.js +464 -0
  22. package/dist/services/device.service.js.map +1 -0
  23. package/dist/services/devicerunner.interface.d.ts +3 -0
  24. package/dist/services/devicerunner.interface.js +3 -0
  25. package/dist/services/devicerunner.interface.js.map +1 -0
  26. package/dist/services/devicerunner.service.d.ts +8 -0
  27. package/dist/services/devicerunner.service.js +123 -0
  28. package/dist/services/devicerunner.service.js.map +1 -0
  29. package/dist/services/licensesaxiosinstance.d.ts +29 -0
  30. package/dist/services/licensesaxiosinstance.js +77 -0
  31. package/dist/services/licensesaxiosinstance.js.map +1 -0
  32. package/dist/services/logger.service.d.ts +8 -0
  33. package/dist/services/logger.service.js +9 -0
  34. package/dist/services/logger.service.js.map +1 -0
  35. package/dist/services/messagepublisher.d.ts +69 -0
  36. package/dist/services/messagepublisher.js +154 -0
  37. package/dist/services/messagepublisher.js.map +1 -0
  38. package/dist/services/messagepublisherpolicies.d.ts +222 -0
  39. package/dist/services/messagepublisherpolicies.js +499 -0
  40. package/dist/services/messagepublisherpolicies.js.map +1 -0
  41. package/dist/services/messagesender.d.ts +17 -0
  42. package/dist/services/messagesender.js +3 -0
  43. package/dist/services/messagesender.js.map +1 -0
  44. package/dist/services/messagesubscriber.d.ts +17 -0
  45. package/dist/services/messagesubscriber.js +32 -0
  46. package/dist/services/messagesubscriber.js.map +1 -0
  47. package/dist/services/simulation.d.ts +83 -0
  48. package/dist/services/simulation.js +610 -0
  49. package/dist/services/simulation.js.map +1 -0
  50. package/envs.md +67 -0
  51. package/package.json +105 -0
@@ -0,0 +1,458 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.indexTemplateApply = void 0;
4
+ const logger_service_1 = require("../services/logger.service");
5
+ const messagepublisher_1 = require("./messagepublisher");
6
+ const messagesubscriber_1 = require("./messagesubscriber");
7
+ const messagepublisherpolicies_1 = require("./messagepublisherpolicies");
8
+ class InvalidConfigurationError extends Error {
9
+ }
10
+ function parseConditions(condition) {
11
+ switch (condition.type) {
12
+ case "and":
13
+ {
14
+ const andConditions = condition.operands.map(parseConditions);
15
+ return new messagepublisherpolicies_1.MessagePublisher_AndPolicy(andConditions);
16
+ }
17
+ break;
18
+ case "or":
19
+ {
20
+ const orConditions = condition.operands.map(parseConditions);
21
+ return new messagepublisherpolicies_1.MessagePublisher_OrPolicy(orConditions);
22
+ }
23
+ break;
24
+ case "inband":
25
+ case "outband":
26
+ {
27
+ const inbandCondition = condition;
28
+ return new messagepublisherpolicies_1.MessagePublisher_AnalogBandPolicy({
29
+ tagName: inbandCondition.tagName,
30
+ min: inbandCondition.low,
31
+ max: inbandCondition.high,
32
+ inside: inbandCondition.type === "inband",
33
+ });
34
+ }
35
+ break;
36
+ }
37
+ }
38
+ function parsePolicy(policyData, namedPolicies) {
39
+ if (policyData.type !== "send") {
40
+ return;
41
+ }
42
+ if (policyData.instanceOf) {
43
+ const namedPolicy = namedPolicies.get(policyData.instanceOf);
44
+ if (!namedPolicy) {
45
+ throw new InvalidConfigurationError(`Could not find referred policy ${policyData.instanceOf}`);
46
+ }
47
+ return namedPolicy.clone();
48
+ }
49
+ let result = undefined;
50
+ const triggerOperands = [];
51
+ for (const trigger of policyData.triggers) {
52
+ switch (trigger.type) {
53
+ case "timer":
54
+ {
55
+ const timerTrigger = trigger;
56
+ triggerOperands.push(new messagepublisherpolicies_1.MessagePublisher_TimerPolicy(timerTrigger.intervalMs));
57
+ }
58
+ break;
59
+ case "onchange":
60
+ {
61
+ const onChangeTrigger = trigger;
62
+ const op1 = new messagepublisherpolicies_1.MessagePublisher_OnChangedPolicy({
63
+ tagName: onChangeTrigger.tagName,
64
+ skipFirstNChanges: onChangeTrigger.skipFirstNChanges,
65
+ deadband: onChangeTrigger.deadband != undefined
66
+ ? onChangeTrigger.deadband
67
+ : onChangeTrigger.deadbandPercent,
68
+ isPercent: onChangeTrigger.deadbandPercent != undefined,
69
+ });
70
+ if (onChangeTrigger.minIntervalMs != undefined) {
71
+ const op2 = new messagepublisherpolicies_1.MessagePublisher_TimerPolicy(onChangeTrigger.minIntervalMs);
72
+ triggerOperands.push(new messagepublisherpolicies_1.MessagePublisher_AndPolicy([op1, op2]));
73
+ }
74
+ else {
75
+ triggerOperands.push(op1);
76
+ }
77
+ }
78
+ break;
79
+ case "fieldchange":
80
+ {
81
+ const onFieldChangeTrigger = trigger;
82
+ const op1 = new messagepublisherpolicies_1.MessagePublisher_OnFieldChangedPolicy({
83
+ fieldName: onFieldChangeTrigger.fieldName,
84
+ skipFirstNChanges: onFieldChangeTrigger.skipFirstNChanges,
85
+ deadband: onFieldChangeTrigger.deadband != undefined
86
+ ? onFieldChangeTrigger.deadband
87
+ : onFieldChangeTrigger.deadbandPercent,
88
+ isPercent: onFieldChangeTrigger.deadbandPercent != undefined,
89
+ });
90
+ if (onFieldChangeTrigger.minIntervalMs != undefined) {
91
+ const op2 = new messagepublisherpolicies_1.MessagePublisher_TimerPolicy(onFieldChangeTrigger.minIntervalMs);
92
+ triggerOperands.push(new messagepublisherpolicies_1.MessagePublisher_AndPolicy([op1, op2]));
93
+ }
94
+ else {
95
+ triggerOperands.push(op1);
96
+ }
97
+ }
98
+ break;
99
+ case "onlevel":
100
+ {
101
+ const onLevelTrigger = trigger;
102
+ const op = new messagepublisherpolicies_1.MessagePublisher_OnLevelPolicy({
103
+ tagName: onLevelTrigger.tagName,
104
+ skipFirstNChanges: onLevelTrigger.skipFirstNChanges,
105
+ level: onLevelTrigger.levelString != undefined ? onLevelTrigger.levelString : onLevelTrigger.level,
106
+ levelMode: onLevelTrigger.mode,
107
+ deadband: onLevelTrigger.deadband != undefined
108
+ ? onLevelTrigger.deadband
109
+ : onLevelTrigger.deadbandPercent,
110
+ isPercent: onLevelTrigger.deadbandPercent != undefined,
111
+ });
112
+ if (onLevelTrigger.minIntervalMs != undefined) {
113
+ const op2 = new messagepublisherpolicies_1.MessagePublisher_TimerPolicy(onLevelTrigger.minIntervalMs);
114
+ triggerOperands.push(new messagepublisherpolicies_1.MessagePublisher_AndPolicy([op, op2]));
115
+ }
116
+ else {
117
+ triggerOperands.push(op);
118
+ }
119
+ }
120
+ break;
121
+ case "fieldLevel":
122
+ const onFieldLevelTrigger = trigger;
123
+ const op = new messagepublisherpolicies_1.MessagePublisher_OnFieldLevelPolicy({
124
+ fieldName: onFieldLevelTrigger.fieldName,
125
+ skipFirstNChanges: onFieldLevelTrigger.skipFirstNChanges,
126
+ level: onFieldLevelTrigger.levelString != undefined
127
+ ? onFieldLevelTrigger.levelString
128
+ : onFieldLevelTrigger.level,
129
+ levelMode: onFieldLevelTrigger.mode,
130
+ deadband: onFieldLevelTrigger.deadband != undefined
131
+ ? onFieldLevelTrigger.deadband
132
+ : onFieldLevelTrigger.deadbandPercent,
133
+ isPercent: onFieldLevelTrigger.deadbandPercent != undefined,
134
+ });
135
+ if (onFieldLevelTrigger.minIntervalMs != undefined) {
136
+ const op2 = new messagepublisherpolicies_1.MessagePublisher_TimerPolicy(onFieldLevelTrigger.minIntervalMs);
137
+ triggerOperands.push(new messagepublisherpolicies_1.MessagePublisher_AndPolicy([op, op2]));
138
+ }
139
+ else {
140
+ triggerOperands.push(op);
141
+ }
142
+ break;
143
+ }
144
+ }
145
+ if (triggerOperands.length > 1) {
146
+ result = new messagepublisherpolicies_1.MessagePublisher_OrPolicy(triggerOperands);
147
+ }
148
+ else if (triggerOperands.length === 1) {
149
+ result = triggerOperands[0].clone();
150
+ }
151
+ if (policyData.conditions) {
152
+ const conditions = parseConditions(policyData.conditions);
153
+ if (result == undefined) {
154
+ result = conditions;
155
+ }
156
+ else {
157
+ result = new messagepublisherpolicies_1.MessagePublisher_AndPolicy([result, conditions]);
158
+ }
159
+ }
160
+ return result;
161
+ }
162
+ function indexTemplateApply(templateString, values) {
163
+ let output = "";
164
+ let content = "";
165
+ let index = -1;
166
+ const ok = true;
167
+ let State;
168
+ (function (State) {
169
+ State[State["STRING"] = 0] = "STRING";
170
+ State[State["ESCAPING_STRING"] = 1] = "ESCAPING_STRING";
171
+ State[State["ESCAPING_CONTENT"] = 2] = "ESCAPING_CONTENT";
172
+ State[State["DOLLAR"] = 3] = "DOLLAR";
173
+ State[State["CONTENT"] = 4] = "CONTENT";
174
+ })(State || (State = {}));
175
+ let state;
176
+ state = State.STRING;
177
+ for (let i = 0; i < templateString.length; i++) {
178
+ if (state == State.ESCAPING_STRING) {
179
+ output += templateString[i];
180
+ state = State.STRING;
181
+ }
182
+ else if (state == State.ESCAPING_CONTENT) {
183
+ output += templateString.at(i);
184
+ state = State.CONTENT;
185
+ }
186
+ else {
187
+ switch (templateString[i]) {
188
+ case "\\":
189
+ state = state == State.CONTENT ? State.ESCAPING_CONTENT : State.ESCAPING_STRING;
190
+ break;
191
+ case "$":
192
+ switch (state) {
193
+ case State.STRING:
194
+ state = State.DOLLAR;
195
+ break;
196
+ case State.DOLLAR:
197
+ output += "$";
198
+ state = State.DOLLAR;
199
+ break;
200
+ case State.CONTENT:
201
+ content += "$";
202
+ break;
203
+ }
204
+ break;
205
+ case "{":
206
+ switch (state) {
207
+ case State.DOLLAR:
208
+ state = State.CONTENT;
209
+ break;
210
+ case State.CONTENT:
211
+ content += "{";
212
+ break;
213
+ case State.STRING:
214
+ output += "{";
215
+ break;
216
+ }
217
+ break;
218
+ case "}":
219
+ switch (state) {
220
+ case State.DOLLAR:
221
+ state = State.STRING;
222
+ output += "$}";
223
+ break;
224
+ case State.CONTENT:
225
+ state = State.STRING;
226
+ index = parseInt(content);
227
+ if (index >= 0 && index < values.length) {
228
+ output += values[index];
229
+ }
230
+ content = "";
231
+ break;
232
+ case State.STRING:
233
+ output += "}";
234
+ break;
235
+ }
236
+ break;
237
+ default:
238
+ switch (state) {
239
+ case State.CONTENT:
240
+ content += templateString[i];
241
+ break;
242
+ case State.DOLLAR:
243
+ output += "$";
244
+ output += templateString[i];
245
+ break;
246
+ case State.STRING:
247
+ output += templateString[i];
248
+ break;
249
+ }
250
+ break;
251
+ }
252
+ }
253
+ }
254
+ return output;
255
+ }
256
+ exports.indexTemplateApply = indexTemplateApply;
257
+ function initPublisher(publisher, sourceTag, sendPolicy, deviceConfig) {
258
+ logger_service_1.l.debug("Init publisher", sourceTag, sendPolicy);
259
+ const policy = parsePolicy({ type: "send", ...sendPolicy }, deviceConfig.namedPolicies);
260
+ if (!policy) {
261
+ return;
262
+ }
263
+ policy.setDefaultTagName(sourceTag);
264
+ publisher.setPolicy(policy);
265
+ const referencedTags = policy.referencedTags();
266
+ for (const i in referencedTags) {
267
+ const tag = referencedTags[i];
268
+ if (tag != sourceTag) {
269
+ let pubs = deviceConfig.tagPublishers.get(tag);
270
+ pubs = pubs == undefined ? new Set() : pubs;
271
+ pubs.add(publisher);
272
+ deviceConfig.tagPublishers.set(tag, pubs);
273
+ }
274
+ }
275
+ if (sourceTag != undefined) {
276
+ let pubs = deviceConfig.tagPublishers.get(sourceTag);
277
+ pubs = pubs == undefined ? new Set() : pubs;
278
+ pubs.add(publisher);
279
+ deviceConfig.tagPublishers.set(sourceTag, pubs);
280
+ }
281
+ }
282
+ function parseDeviceConfigurationNode({ node, deviceConfig, nodeName, nodePath, parentNode, arrayIndexes, parentPublisher, }) {
283
+ const sourceTag = node.datalink && node.datalink.source ? indexTemplateApply(node.datalink.source, arrayIndexes) : undefined;
284
+ const device_endpoint = node.mapping && node.mapping.device_endpoint
285
+ ? indexTemplateApply(node.mapping.device_endpoint, arrayIndexes)
286
+ : undefined;
287
+ const server_endpoint = node.mapping && node.mapping.server_endpoint
288
+ ? indexTemplateApply(node.mapping.server_endpoint, arrayIndexes)
289
+ : undefined;
290
+ switch (node.type) {
291
+ case "object":
292
+ for (const p of Object.keys(node.properties)) {
293
+ const childNode = node.properties[p];
294
+ parseDeviceConfigurationNode({
295
+ node: childNode,
296
+ deviceConfig,
297
+ nodeName: p,
298
+ nodePath: nodePath + "/" + p,
299
+ parentNode: node,
300
+ arrayIndexes,
301
+ parentPublisher: null,
302
+ });
303
+ }
304
+ break;
305
+ case "struct":
306
+ let publisher = undefined;
307
+ if (node.sendPolicy) {
308
+ publisher = new messagepublisher_1.AggregatedMessagePublisher({
309
+ sourceTag,
310
+ modelPath: nodePath,
311
+ topic: device_endpoint,
312
+ });
313
+ initPublisher(publisher, sourceTag, node.sendPolicy, deviceConfig);
314
+ }
315
+ else {
316
+ publisher = new messagepublisher_1.AggregatedMessagePublisher({
317
+ sourceTag: undefined,
318
+ modelPath: nodePath,
319
+ topic: undefined,
320
+ });
321
+ }
322
+ if (server_endpoint != undefined) {
323
+ deviceConfig.subscribedTopics.set(server_endpoint, new messagesubscriber_1.MessageSubscriber({
324
+ topic: server_endpoint,
325
+ modelPath: nodePath,
326
+ topicType: node.type,
327
+ }));
328
+ }
329
+ for (const p of Object.keys(node.properties)) {
330
+ const childNode = node.properties[p];
331
+ parseDeviceConfigurationNode({
332
+ node: childNode,
333
+ deviceConfig,
334
+ nodeName: p,
335
+ nodePath: nodePath + "/" + p,
336
+ parentNode: node,
337
+ arrayIndexes,
338
+ parentPublisher: publisher,
339
+ });
340
+ }
341
+ break;
342
+ case "array":
343
+ const len = node.length;
344
+ for (let i = 0; i < len; i++) {
345
+ const name = `${nodeName}[${i}]`;
346
+ parseDeviceConfigurationNode({
347
+ node: node.item,
348
+ deviceConfig,
349
+ nodeName: name,
350
+ nodePath: nodePath + "/" + name,
351
+ parentNode: node,
352
+ arrayIndexes: [...arrayIndexes, i],
353
+ parentPublisher: null,
354
+ });
355
+ }
356
+ break;
357
+ default:
358
+ if (parentNode.type == "object") {
359
+ if (node.sendPolicy) {
360
+ const publisher = new messagepublisher_1.MessagePublisher({
361
+ sourceTag,
362
+ modelPath: nodePath,
363
+ topic: device_endpoint,
364
+ topicType: node.type,
365
+ });
366
+ initPublisher(publisher, sourceTag, node.sendPolicy, deviceConfig);
367
+ }
368
+ if (server_endpoint != undefined) {
369
+ deviceConfig.subscribedTopics.set(server_endpoint, new messagesubscriber_1.MessageSubscriber({
370
+ topic: server_endpoint,
371
+ modelPath: nodePath,
372
+ topicType: node.type,
373
+ }));
374
+ }
375
+ }
376
+ else if (parentNode.type == "struct") {
377
+ if (node.sendPolicy) {
378
+ throw new InvalidConfigurationError(`Cannot specify send policy for struct properties`);
379
+ }
380
+ if (parentPublisher.tagName &&
381
+ sourceTag &&
382
+ sourceTag != parentPublisher.tagName) {
383
+ throw new InvalidConfigurationError(`Cannot mix field datalinks with whole structure datalinks`);
384
+ }
385
+ if (parentPublisher.tagName == undefined) {
386
+ const pub = parentPublisher;
387
+ pub.addField({
388
+ tagName: sourceTag,
389
+ fieldName: nodeName,
390
+ type: node.type,
391
+ });
392
+ if (sourceTag != undefined) {
393
+ let pubs = deviceConfig.tagPublishers.get(sourceTag);
394
+ pubs = pubs == undefined ? new Set() : pubs;
395
+ pubs.add(parentPublisher);
396
+ deviceConfig.tagPublishers.set(sourceTag, pubs);
397
+ }
398
+ }
399
+ else {
400
+ }
401
+ if (server_endpoint != undefined) {
402
+ deviceConfig.subscribedTopics.set(server_endpoint, new messagesubscriber_1.MessageSubscriber({
403
+ topic: server_endpoint,
404
+ modelPath: nodePath,
405
+ topicType: node.type,
406
+ fieldName: nodeName,
407
+ }));
408
+ }
409
+ }
410
+ break;
411
+ }
412
+ }
413
+ function simplifyInstanceOf(fullInstanceOf) {
414
+ return fullInstanceOf.slice(0, fullInstanceOf.indexOf("."));
415
+ }
416
+ function parseDeviceConfig(config) {
417
+ const result = {
418
+ interfaceNames: [],
419
+ tagPublishers: new Map(),
420
+ namedPolicies: new Map(),
421
+ subscribedTopics: new Map(),
422
+ };
423
+ if (!config.type || config.type !== "datamodel") {
424
+ throw new InvalidConfigurationError(`Invalid type "${config.type}"`);
425
+ }
426
+ if (!config.properties || Object.keys(config.properties).length <= 0) {
427
+ throw new InvalidConfigurationError(`Cannot find any configuration data`);
428
+ }
429
+ const configData = config.properties[Object.keys(config.properties)[0]];
430
+ logger_service_1.l.debug(`Parsing configuration data ${Object.keys(config.properties)[0]}`);
431
+ if (!configData.interfaces) {
432
+ throw new InvalidConfigurationError(`Missing interfaces node`);
433
+ }
434
+ result.interfaceNames = configData.interfaces.map((i) => `${i.interface_name}:${i.version_major}:${i.version_minor}`);
435
+ logger_service_1.l.log(`Found interfaces ${result.interfaceNames}`);
436
+ if (configData.policies) {
437
+ for (const p of Object.keys(configData.policies)) {
438
+ logger_service_1.l.log(`Parsing policy ${p}`);
439
+ const policyData = configData.policies[p];
440
+ const policy = parsePolicy(policyData, result.namedPolicies);
441
+ result.namedPolicies.set(p, policy);
442
+ }
443
+ }
444
+ for (const prop of Object.keys(configData.properties)) {
445
+ parseDeviceConfigurationNode({
446
+ node: configData.properties[prop],
447
+ deviceConfig: result,
448
+ nodeName: prop,
449
+ nodePath: simplifyInstanceOf(configData.instanceOf) + "/" + prop,
450
+ parentNode: configData,
451
+ arrayIndexes: [],
452
+ parentPublisher: null,
453
+ });
454
+ }
455
+ return result;
456
+ }
457
+ exports.default = parseDeviceConfig;
458
+ //# sourceMappingURL=configparser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configparser.js","sourceRoot":"","sources":["../../src/services/configparser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import { MessageSubscriber } from "./messagesubscriber";
3
+ import { EventEmitter } from "stream";
4
+ import { DeviceConfiguration, DeviceConfigurationData } from "./configparser";
5
+ import { State } from "./messagepublisherpolicies";
6
+ import { MessageSender, MessageSenderOptions } from "./messagesender";
7
+ export declare type PostCallback = (error: Error, tagName: string, modelPath: string) => any;
8
+ export declare type PacketPostCallback = (error?: Error, packet?: any) => any;
9
+ export default class CorvinaDataInterface extends EventEmitter implements MessageSender {
10
+ protected _config: DeviceConfiguration;
11
+ private CYCLE_TIME;
12
+ protected _nextTick: number;
13
+ protected _internalTimer: NodeJS.Timer;
14
+ constructor();
15
+ setCycleTime(cycleTime: number): void;
16
+ sendMessage(topic: string, payload: unknown, options?: unknown): Promise<any>;
17
+ protected monotonicTimer(): number;
18
+ start(): void;
19
+ stop(): void;
20
+ protected doPublish(): void;
21
+ applyConfig(config: DeviceConfigurationData): void;
22
+ notifyTag(tagName: string, newState: State, options?: MessageSenderOptions): void;
23
+ onWrite(subscriber: MessageSubscriber, message: any): void;
24
+ }
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const stream_1 = require("stream");
7
+ const configparser_1 = __importDefault(require("./configparser"));
8
+ const messagepublisherpolicies_1 = require("./messagepublisherpolicies");
9
+ const types_1 = require("../common/types");
10
+ const logger_service_1 = require("./logger.service");
11
+ class CorvinaDataInterface extends stream_1.EventEmitter {
12
+ _config;
13
+ CYCLE_TIME;
14
+ _nextTick;
15
+ _internalTimer;
16
+ constructor() {
17
+ super();
18
+ this.CYCLE_TIME = 1000;
19
+ }
20
+ setCycleTime(cycleTime) {
21
+ this.CYCLE_TIME = cycleTime;
22
+ }
23
+ sendMessage(topic, payload, options) {
24
+ return new Promise(undefined);
25
+ }
26
+ monotonicTimer() {
27
+ return Number(process.hrtime.bigint() / 1000000n);
28
+ }
29
+ start() {
30
+ this.doPublish();
31
+ this._internalTimer = setInterval(() => {
32
+ this.doPublish();
33
+ }, this.CYCLE_TIME);
34
+ }
35
+ stop() {
36
+ clearInterval(this._internalTimer);
37
+ this._internalTimer = null;
38
+ }
39
+ doPublish() {
40
+ if (!this._config) {
41
+ return;
42
+ }
43
+ this._nextTick = messagepublisherpolicies_1.INVALID_STATE_TS;
44
+ const now = this.monotonicTimer() + this.CYCLE_TIME / 2;
45
+ for (const p of this._config.tagPublishers.values()) {
46
+ for (const mp of p.values()) {
47
+ if (mp.nextTime(now) <= now) {
48
+ mp.publish(now, this);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ applyConfig(config) {
54
+ this._config = (0, configparser_1.default)(config);
55
+ }
56
+ notifyTag(tagName, newState, options) {
57
+ let nextTime = messagepublisherpolicies_1.INVALID_STATE_TS;
58
+ const currentTime = this.monotonicTimer();
59
+ const tagPublishers = this._config.tagPublishers.get(tagName);
60
+ if (!tagPublishers || tagPublishers.size == 0) {
61
+ const err = "Cannot publish unconfigured tag " + tagName;
62
+ if (options?.cb) {
63
+ options.cb(new Error(err), tagName, undefined);
64
+ }
65
+ logger_service_1.l.debug("Cannot publish unconfigured tag " + tagName);
66
+ return;
67
+ }
68
+ let nothingToPublish = true;
69
+ tagPublishers.forEach((publisher) => {
70
+ nextTime = Math.min(nextTime, publisher.update({ tagName, newState, currentTime }));
71
+ if (nextTime <= currentTime || options?.forceImmediateSend) {
72
+ nothingToPublish = false;
73
+ if (options?.cb) {
74
+ const internalOptions = { ...options };
75
+ internalOptions.cb = (err, pkt) => {
76
+ if (err) {
77
+ options.cb(err, tagName, publisher.modelPath);
78
+ }
79
+ else {
80
+ options.cb(undefined, tagName, publisher.modelPath);
81
+ }
82
+ };
83
+ publisher.publish(currentTime, this, internalOptions);
84
+ }
85
+ else {
86
+ publisher.publish(currentTime, this, options);
87
+ }
88
+ }
89
+ });
90
+ if (nothingToPublish) {
91
+ if (options?.cb) {
92
+ options.cb(undefined, undefined, undefined);
93
+ }
94
+ }
95
+ }
96
+ onWrite(subscriber, message) {
97
+ logger_service_1.l.debug("CorvinaDataInterface.onWrite", message);
98
+ this.emit("write", {
99
+ topic: subscriber.topic,
100
+ modelPath: subscriber.modelPath,
101
+ fieldName: subscriber.fieldName,
102
+ v: (0, types_1.castCorvinaType)(message.v, subscriber.topicType),
103
+ });
104
+ }
105
+ }
106
+ exports.default = CorvinaDataInterface;
107
+ //# sourceMappingURL=corvinadatainterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corvinadatainterface.js","sourceRoot":"","sources":["../../src/services/corvinadatainterface.ts"],"names":[],"mappings":"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"}