ngx-kel-agent 0.5.1 → 0.5.5

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.
@@ -7,9 +7,9 @@ export class AgentMessageService {
7
7
  this.txMessage$ = new Subject();
8
8
  }
9
9
  }
10
- AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11
- AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, decorators: [{
10
+ AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11
+ AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, decorators: [{
13
13
  type: Injectable,
14
14
  args: [{
15
15
  providedIn: 'root',
@@ -168,9 +168,9 @@ export class AgentService {
168
168
  return WsjtxService.formatDecode(msg);
169
169
  }
170
170
  }
171
- AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [{ token: i1.AgentMessageService }, { token: i2.HamlibService }, { token: i3.WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
172
- AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, providedIn: 'root' });
173
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, decorators: [{
171
+ AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, deps: [{ token: i1.AgentMessageService }, { token: i2.HamlibService }, { token: i3.WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
172
+ AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, providedIn: 'root' });
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, decorators: [{
174
174
  type: Injectable,
175
175
  args: [{
176
176
  providedIn: 'root',
@@ -37,9 +37,9 @@ export class HamlibService {
37
37
  }
38
38
  }
39
39
  }
40
- HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, deps: [{ token: i1.AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
41
- HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, providedIn: 'root' });
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, decorators: [{
40
+ HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, deps: [{ token: i1.AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
41
+ HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, providedIn: 'root' });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, decorators: [{
43
43
  type: Injectable,
44
44
  args: [{
45
45
  providedIn: 'root',
@@ -214,7 +214,7 @@ export class WsjtxService {
214
214
  config.id = this.wsjtxId;
215
215
  const wsMsg = {
216
216
  wsjtx: {
217
- type: 'SwitchConfigurationMessage',
217
+ type: 'ConfigureMessage',
218
218
  payload: config,
219
219
  },
220
220
  };
@@ -223,25 +223,29 @@ export class WsjtxService {
223
223
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
224
224
  * Activity/Rx Frequency windows. */
225
225
  static formatDecode(msg) {
226
- const secondsSinceMidnight = Math.floor(msg.time / 1000);
226
+ const timeStr = this.formatTime(msg.time);
227
+ return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
228
+ .toFixed(1)
229
+ .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
230
+ }
231
+ /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */
232
+ static formatTime(time) {
233
+ const secondsSinceMidnight = Math.floor(time / 1000);
227
234
  const hours = Math.floor(secondsSinceMidnight / 3600);
228
235
  const secondsSinceHour = secondsSinceMidnight - hours * 3600;
229
236
  const minutes = Math.floor(secondsSinceHour / 60);
230
237
  const seconds = secondsSinceHour - minutes * 60;
231
- const timeStr = `${hours.toString().padStart(2, '0')}${minutes
238
+ return `${hours.toString().padStart(2, '0')}${minutes
232
239
  .toString()
233
240
  .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
234
- return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
235
- .toFixed(1)
236
- .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
237
241
  }
238
242
  }
239
- WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, deps: [{ token: i1.AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
240
- WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, providedIn: 'root' });
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, decorators: [{
243
+ WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, deps: [{ token: i1.AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
244
+ WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, providedIn: 'root' });
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, decorators: [{
242
246
  type: Injectable,
243
247
  args: [{
244
248
  providedIn: 'root',
245
249
  }]
246
250
  }], ctorParameters: function () { return [{ type: i1.AgentMessageService }]; } });
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NqdHguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi93c2p0eC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBbUIvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU05QyxNQUFNLE9BQU8sWUFBWTtJQXNCdkIsWUFBb0IsUUFBNkI7UUFBN0IsYUFBUSxHQUFSLFFBQVEsQ0FBcUI7UUFyQmpELHNEQUFzRDtRQUN0QyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakUsNERBQTREO1FBQzVDLGVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBd0IsQ0FBQyxDQUFDLENBQUM7UUFDekUseURBQXlEO1FBQ3pDLFlBQU8sR0FBRyxJQUFJLGFBQWEsQ0FBcUIsQ0FBQyxDQUFDLENBQUM7UUFDbkUseURBQXlEO1FBQ3pDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3JELHdEQUF3RDtRQUN4QyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUNuRCw0REFBNEQ7UUFDNUMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO1FBQzNELHdEQUF3RDtRQUN4QyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUNuRCw2REFBNkQ7UUFDN0MsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUM3RCw2REFBNkQ7UUFDN0MsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUVyRCxZQUFPLEdBQVcsUUFBUSxDQUFDO1FBR2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FB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R0FBRyxDQUFDLEVBQUUsQ0FBQztRQUU1RCxPQUFPLEdBQUcsT0FBTyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTO2FBQ2pFLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDVixRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQ3pELEdBQUcsQ0FBQyxPQUNOLEVBQUUsQ0FBQztJQUNMLENBQUM7O3lHQTFQVSxZQUFZOzZHQUFaLFlBQVksY0FGWCxNQUFNOzJGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBXc2p0eENsZWFyLFxuICBXc2p0eENsb3NlLFxuICBXc2p0eENvbmZpZ3VyZSxcbiAgV3NqdHhEZWNvZGUsXG4gIFdzanR4RnJlZVRleHQsXG4gIFdzanR4SGFsdFR4LFxuICBXc2p0eEhlYXJ0YmVhdCxcbiAgV3NqdHhIaWdobGlnaHRDYWxsc2lnbixcbiAgV3NqdHhMb2NhdGlvbixcbiAgV3NqdHhMb2dnZWRBZGlmLFxuICBXc2p0eFFzb0xvZ2dlZCxcbiAgV3NqdHhSZXBsYXksXG4gIFdzanR4UmVwbHksXG4gIFdzanR4U3RhdHVzLFxuICBXc2p0eFN3aXRjaENvbmZpZ3VyYXRpb24sXG4gIFdzanR4V3NwckRlY29kZSxcbn0gZnJvbSAnLi93c2p0eC1tZXNzYWdlcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBZ2VudE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9hZ2VudC1tZXNzYWdlLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgV3NqdHhTZXJ2aWNlIHtcbiAgLyoqIFdoZXRoZXIgd2UncmUgZ2V0dGluZyBhbnkgbWVzc2FnZXMgZnJvbSBXU0pULVguICovXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiSGVhcnRiZWF0XCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBoZWFydGJlYXQkID0gbmV3IFJlcGxheVN1YmplY3Q8V3NqdHhIZWFydGJlYXQgfCBudWxsPigxKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJTdGF0dXNcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1cyQgPSBuZXcgUmVwbGF5U3ViamVjdDxXc2p0eFN0YXR1cyB8IG51bGw+KDEpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkRlY29kZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVjb2RlJCA9IG5ldyBTdWJqZWN0PFdzanR4RGVjb2RlPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkNsZWFyXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBjbGVhciQgPSBuZXcgU3ViamVjdDxXc2p0eENsZWFyPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIlFzb0xvZ2dlZFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXNvTG9nZ2VkJCA9IG5ldyBTdWJqZWN0PFdzanR4UXNvTG9nZ2VkPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkNsb3NlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBjbG9zZSQgPSBuZXcgU3ViamVjdDxXc2p0eENsb3NlPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIldzcHJEZWNvZGVcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzcHJEZWNvZGUkID0gbmV3IFN1YmplY3Q8V3NqdHhXc3ByRGVjb2RlPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkxvZ2dlZEFkaWZcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlZEFkaWYkID0gbmV3IFN1YmplY3Q8V3NqdHhMb2dnZWRBZGlmPigpO1xuXG4gIHByaXZhdGUgd3NqdHhJZDogc3RyaW5nID0gJ1dTSlQtWCc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtZXNzYWdlczogQWdlbnRNZXNzYWdlU2VydmljZSkge1xuICAgIHRoaXMuc2V0dXBCZWhhdmlvcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBCZWhhdmlvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlcy5yeE1lc3NhZ2UkLnN1YnNjcmliZSgobXNnKSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UobXNnKSk7XG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBoZWFyZCBmcm9tIFdTSlQtWCBpbiAxNSBzZWNvbmRzLCBjb25zaWRlciBpdCBcImRvd25cIlxuICAgIHRoaXMuY29ubmVjdGVkJFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDE1MDAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb25uZWN0ZWQkLm5leHQoZmFsc2UpKTtcbiAgICAvLyBXaGVuIFdTSlQtWCBhbm5vdW5jZXMgaXQncyBjbG9zaW5nLCBzZXQgaXQgdG8gXCJkb3duXCIgaW1tZWRpYXRlbHlcbiAgICB0aGlzLmNsb3NlJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICAgIC8vIFdoZW4gV1NKVC1YIGdvZXMgZG93biwgY2xlYXIgaXRzIHBlcnNpc3RlbnQgbWVzc2FnZSBzdWJqZWN0c1xuICAgIHRoaXMuY29ubmVjdGVkJC5zdWJzY3JpYmUoKGlzVXApID0+IHtcbiAgICAgIGlmICghaXNVcCkge1xuICAgICAgICB0aGlzLmhlYXJ0YmVhdCQubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1lc3NhZ2UobXNnOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIW1zZy53c2p0eCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbm5lY3RlZCQubmV4dCh0cnVlKTtcbiAgICB0aGlzLndzanR4SWQgPSBtc2cud3NqdHgucGF5bG9hZC5pZDtcbiAgICBzd2l0Y2ggKG1zZy53c2p0eC50eXBlKSB7XG4gICAgICBjYXNlICdIZWFydGJlYXRNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5oZWFydGJlYXQkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhIZWFydGJlYXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdTdGF0dXNNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhTdGF0dXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdEZWNvZGVNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5kZWNvZGUkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhEZWNvZGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdDbGVhck1lc3NhZ2UnOlxuICAgICAgICB0aGlzLmNsZWFyJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4Q2xlYXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdRc29Mb2dnZWRNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5xc29Mb2dnZWQkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhRc29Mb2dnZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdDbG9zZU1lc3NhZ2UnOlxuICAgICAgICB0aGlzLmNsb3NlJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4Q2xvc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdXU1BSRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgIHRoaXMud3NwckRlY29kZSQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eFdzcHJEZWNvZGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdMb2dnZWRBZGlmTWVzc2FnZSc6XG4gICAgICAgIHRoaXMubG9nZ2VkQWRpZiQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eExvZ2dlZEFkaWYpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBjbGVhciB0aGUgQmFuZCBBY3Rpdml0eSB3aW5kb3cuICovXG4gIHB1YmxpYyBjbGVhckJhbmRBY3Rpdml0eSgpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdDbGVhck1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhDbGVhcj57IGlkOiB0aGlzLndzanR4SWQsIHdpbmRvdzogMCB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIFJ4IEZyZXF1ZW5jeSB3aW5kb3cuICovXG4gIHB1YmxpYyBjbGVhclJ4RnJlcVdpbmRvdygpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdDbGVhck1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhDbGVhcj57IGlkOiB0aGlzLndzanR4SWQsIHdpbmRvdzogMSB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgYW5kIFJ4IEZyZXF1ZW5jeSB3aW5kb3dzLiAqL1xuICBwdWJsaWMgY2xlYXJBbGwoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+eyBpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDIgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHJlcGxheSBtZXNzYWdlcy4gVXNlZnVsIGZvciBhIGZyZXNoIGNsaWVudCB0aGF0IHdhbnRzIHRvIGhlYXJcbiAgICogcHJldmlvdXMgV1NKVC1YIGRlY29kZXMuICovXG4gIHB1YmxpYyByZXBsYXkoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnUmVwbGF5TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eFJlcGxheT57IGlkOiB0aGlzLndzanR4SWQgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGhhbHQgYW55IHRyYW5zbWlzc2lvbnMgaW1tZWRpYXRlbHkuICovXG4gIHB1YmxpYyBoYWx0VHhOb3coKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnSGFsdFR4TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eEhhbHRUeD57IGlkOiB0aGlzLndzanR4SWQsIGF1dG9UeE9ubHk6IGZhbHNlIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBzdG9wIGF1dG8tdHJhbnNtaXR0aW5nIGFmdGVyIGZpbmlzaGluZyB0aGUgY3VycmVudCByb3VuZC4gKi9cbiAgcHVibGljIGhhbHRUeEFmdGVyQ3VycmVudCgpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIYWx0VHhNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4SGFsdFR4PnsgaWQ6IHRoaXMud3NqdHhJZCwgYXV0b1R4T25seTogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbHkgdG8gdGhlIGdpdmVuIGRlY29kZS4gVGhlIG1lc3NhZ2UgbXVzdCBpbmNsdWRlIENRIG9yIFFSWi4gKi9cbiAgcHVibGljIHJlcGx5KGRlY29kZTogV3NqdHhEZWNvZGUpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdSZXBseU1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhSZXBseT57XG4gICAgICAgICAgaWQ6IGRlY29kZS5pZCxcbiAgICAgICAgICB0aW1lOiBkZWNvZGUudGltZSxcbiAgICAgICAgICBzbnI6IGRlY29kZS5zbnIsXG4gICAgICAgICAgZGVsdGFUaW1lOiBkZWNvZGUuZGVsdGFUaW1lLFxuICAgICAgICAgIGRlbHRhRnJlcXVlbmN5OiBkZWNvZGUuZGVsdGFGcmVxdWVuY3ksXG4gICAgICAgICAgbW9kZTogZGVjb2RlLm1vZGUsXG4gICAgICAgICAgbWVzc2FnZTogZGVjb2RlLm1lc3NhZ2UsXG4gICAgICAgICAgbG93Q29uZmlkZW5jZTogZGVjb2RlLmxvd0NvbmZpZGVuY2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byByZXBseSB0byB0aGUgZ2l2ZW4gZGVjb2RlLiBUaGUgbWVzc2FnZSBtdXN0IGluY2x1ZGUgQ1Egb3IgUVJaLiAqL1xuICBwdWJsaWMgaGlnaGxpZ2h0Q2FsbHNpZ24oaGlnaGxpZ2h0TXNnOiBXc2p0eEhpZ2hsaWdodENhbGxzaWduKSB7XG4gICAgaGlnaGxpZ2h0TXNnLmlkID0gdGhpcy53c2p0eElkO1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0hpZ2hsaWdodENhbGxzaWduTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IGhpZ2hsaWdodE1zZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHRyYW5zbWl0IHRoZSBnaXZlbiBmcmVlIHRleHQuIElmIHRoZSB0ZXh0IGlzIHRvbyBsb25nIHRvIGJlXG4gICAqIGVuY29kZWQgaW4gYSBzaW5nbGUgbWVzc2FnZSwgaXQgbWF5IGJlIHNpbGVudGx5IHRydW5jYXRlZC4gKi9cbiAgcHVibGljIHNlbmRGcmVlVGV4dChmcmVlVGV4dDogV3NqdHhGcmVlVGV4dCkge1xuICAgIGZyZWVUZXh0LmlkID0gdGhpcy53c2p0eElkO1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0ZyZWVUZXh0TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IGZyZWVUZXh0LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gc2V0IHRoZSBsb2NhbCBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkLiBUaGlzIGlzIHRlbXBvcmFyeSxcbiAgICogbGFzdGluZyBvbmx5IGFzIGxvbmcgYXMgV1NKVC1YIGlzIHJ1bm5pbmcuICovXG4gIHB1YmxpYyBzZXRMb2NhdGlvbihncmlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdMb2NhdGlvbk1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhMb2NhdGlvbj57XG4gICAgICAgICAgaWQ6IHRoaXMud3NqdHhJZCxcbiAgICAgICAgICBsb2NhdGlvbjogZ3JpZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHN3aXRjaCB0byB0aGUgbmFtZWQgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHN3aXRjaENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnU3dpdGNoQ29uZmlndXJhdGlvbk1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhTd2l0Y2hDb25maWd1cmF0aW9uPntcbiAgICAgICAgICBpZDogdGhpcy53c2p0eElkLFxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25OYW1lOiBjb25maWdOYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gc2V0IHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICovXG4gIHB1YmxpYyBjb25maWd1cmUoY29uZmlnOiBXc2p0eENvbmZpZ3VyZSkge1xuICAgIGNvbmZpZy5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdTd2l0Y2hDb25maWd1cmF0aW9uTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IGNvbmZpZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogR2l2ZW4gYSBkZWNvZGUgbWVzc2FnZSwgZm9ybWF0IGEgc3RyaW5nIHRoZSBzYW1lIHdheSBhcyBkaXNwbGF5ZWQgaW4gdGhlIFdTSlQtWCBCYW5kXG4gICAqIEFjdGl2aXR5L1J4IEZyZXF1ZW5jeSB3aW5kb3dzLiAqL1xuICBwdWJsaWMgc3RhdGljIGZvcm1hdERlY29kZShtc2c6IFdzanR4RGVjb2RlKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWNvbmRzU2luY2VNaWRuaWdodCA9IE1hdGguZmxvb3IobXNnLnRpbWUgLyAxMDAwKTtcbiAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3Ioc2Vjb25kc1NpbmNlTWlkbmlnaHQgLyAzNjAwKTtcbiAgICBjb25zdCBzZWNvbmRzU2luY2VIb3VyID0gc2Vjb25kc1NpbmNlTWlkbmlnaHQgLSBob3VycyAqIDM2MDA7XG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kc1NpbmNlSG91ciAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gc2Vjb25kc1NpbmNlSG91ciAtIG1pbnV0ZXMgKiA2MDtcbiAgICBjb25zdCB0aW1lU3RyID0gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfSR7bWludXRlc1xuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC5wYWRTdGFydCgyLCAnMCcpfSR7c2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcblxuICAgIHJldHVybiBgJHt0aW1lU3RyfSAke21zZy5zbnIudG9TdHJpbmcoKS5wYWRTdGFydCgzKX0gJHttc2cuZGVsdGFUaW1lXG4gICAgICAudG9GaXhlZCgxKVxuICAgICAgLnBhZFN0YXJ0KDQpfSAke21zZy5kZWx0YUZyZXF1ZW5jeS50b1N0cmluZygpLnBhZFN0YXJ0KDQpfSB+ICAke1xuICAgICAgbXNnLm1lc3NhZ2VcbiAgICB9YDtcbiAgfVxufVxuIl19
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NqdHguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi93c2p0eC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBbUIvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQU05QyxNQUFNLE9BQU8sWUFBWTtJQXNCdkIsWUFBb0IsUUFBNkI7UUFBN0IsYUFBUSxHQUFSLFFBQVEsQ0FBcUI7UUFyQmpELHNEQUFzRDtRQUN0QyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakUsNERBQTREO1FBQzVDLGVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBd0IsQ0FBQyxDQUFDLENBQUM7UUFDekUseURBQXlEO1FBQ3pDLFlBQU8sR0FBRyxJQUFJLGFBQWEsQ0FBcUIsQ0FBQyxDQUFDLENBQUM7UUFDbkUseURBQXlEO1FBQ3pDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3JELHdEQUF3RDtRQUN4QyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUNuRCw0REFBNEQ7UUFDNUMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO1FBQzNELHdEQUF3RDtRQUN4QyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUNuRCw2REFBNkQ7UUFDN0MsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUM3RCw2REFBNkQ7UUFDN0MsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUVyRCxZQUFPLEdBQVcsUUFBUSxDQUFDO1FBR2pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FB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QixHQUFHLG9CQUFvQixHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2hELE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPO2FBQ2xELFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUM5RCxDQUFDOzt5R0E5UFUsWUFBWTs2R0FBWixZQUFZLGNBRlgsTUFBTTsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgV3NqdHhDbGVhcixcbiAgV3NqdHhDbG9zZSxcbiAgV3NqdHhDb25maWd1cmUsXG4gIFdzanR4RGVjb2RlLFxuICBXc2p0eEZyZWVUZXh0LFxuICBXc2p0eEhhbHRUeCxcbiAgV3NqdHhIZWFydGJlYXQsXG4gIFdzanR4SGlnaGxpZ2h0Q2FsbHNpZ24sXG4gIFdzanR4TG9jYXRpb24sXG4gIFdzanR4TG9nZ2VkQWRpZixcbiAgV3NqdHhRc29Mb2dnZWQsXG4gIFdzanR4UmVwbGF5LFxuICBXc2p0eFJlcGx5LFxuICBXc2p0eFN0YXR1cyxcbiAgV3NqdHhTd2l0Y2hDb25maWd1cmF0aW9uLFxuICBXc2p0eFdzcHJEZWNvZGUsXG59IGZyb20gJy4vd3NqdHgtbWVzc2FnZXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWdlbnRNZXNzYWdlU2VydmljZSB9IGZyb20gJy4vYWdlbnQtbWVzc2FnZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFdzanR4U2VydmljZSB7XG4gIC8qKiBXaGV0aGVyIHdlJ3JlIGdldHRpbmcgYW55IG1lc3NhZ2VzIGZyb20gV1NKVC1YLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkhlYXJ0YmVhdFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGVhcnRiZWF0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFdzanR4SGVhcnRiZWF0IHwgbnVsbD4oMSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiU3RhdHVzXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXMkID0gbmV3IFJlcGxheVN1YmplY3Q8V3NqdHhTdGF0dXMgfCBudWxsPigxKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJEZWNvZGVcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlY29kZSQgPSBuZXcgU3ViamVjdDxXc2p0eERlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJDbGVhclwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xlYXIkID0gbmV3IFN1YmplY3Q8V3NqdHhDbGVhcj4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJRc29Mb2dnZWRcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHFzb0xvZ2dlZCQgPSBuZXcgU3ViamVjdDxXc2p0eFFzb0xvZ2dlZD4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJDbG9zZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvc2UkID0gbmV3IFN1YmplY3Q8V3NqdHhDbG9zZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJXc3ByRGVjb2RlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c3ByRGVjb2RlJCA9IG5ldyBTdWJqZWN0PFdzanR4V3NwckRlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJMb2dnZWRBZGlmXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZWRBZGlmJCA9IG5ldyBTdWJqZWN0PFdzanR4TG9nZ2VkQWRpZj4oKTtcblxuICBwcml2YXRlIHdzanR4SWQ6IHN0cmluZyA9ICdXU0pULVgnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnZXM6IEFnZW50TWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLnNldHVwQmVoYXZpb3JzKCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQmVoYXZpb3JzKCk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZXMucnhNZXNzYWdlJC5zdWJzY3JpYmUoKG1zZykgPT4gdGhpcy5oYW5kbGVNZXNzYWdlKG1zZykpO1xuICAgIC8vIGlmIHdlIGhhdmVuJ3QgaGVhcmQgZnJvbSBXU0pULVggaW4gMTUgc2Vjb25kcywgY29uc2lkZXIgaXQgXCJkb3duXCJcbiAgICB0aGlzLmNvbm5lY3RlZCRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNTAwMCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY29ubmVjdGVkJC5uZXh0KGZhbHNlKSk7XG4gICAgLy8gV2hlbiBXU0pULVggYW5ub3VuY2VzIGl0J3MgY2xvc2luZywgc2V0IGl0IHRvIFwiZG93blwiIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5jbG9zZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGVkJC5uZXh0KGZhbHNlKTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIFdTSlQtWCBnb2VzIGRvd24sIGNsZWFyIGl0cyBwZXJzaXN0ZW50IG1lc3NhZ2Ugc3ViamVjdHNcbiAgICB0aGlzLmNvbm5lY3RlZCQuc3Vic2NyaWJlKChpc1VwKSA9PiB7XG4gICAgICBpZiAoIWlzVXApIHtcbiAgICAgICAgdGhpcy5oZWFydGJlYXQkLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKG1zZzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtc2cud3NqdHgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb25uZWN0ZWQkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy53c2p0eElkID0gbXNnLndzanR4LnBheWxvYWQuaWQ7XG4gICAgc3dpdGNoIChtc2cud3NqdHgudHlwZSkge1xuICAgICAgY2FzZSAnSGVhcnRiZWF0TWVzc2FnZSc6XG4gICAgICAgIHRoaXMuaGVhcnRiZWF0JC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4SGVhcnRiZWF0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnU3RhdHVzTWVzc2FnZSc6XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4U3RhdHVzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgIHRoaXMuZGVjb2RlJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4RGVjb2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnQ2xlYXJNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5jbGVhciQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eENsZWFyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnUXNvTG9nZ2VkTWVzc2FnZSc6XG4gICAgICAgIHRoaXMucXNvTG9nZ2VkJC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4UXNvTG9nZ2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnQ2xvc2VNZXNzYWdlJzpcbiAgICAgICAgdGhpcy5jbG9zZSQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eENsb3NlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnV1NQUkRlY29kZU1lc3NhZ2UnOlxuICAgICAgICB0aGlzLndzcHJEZWNvZGUkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhXc3ByRGVjb2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnTG9nZ2VkQWRpZk1lc3NhZ2UnOlxuICAgICAgICB0aGlzLmxvZ2dlZEFkaWYkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhMb2dnZWRBZGlmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgd2luZG93LiAqL1xuICBwdWJsaWMgY2xlYXJCYW5kQWN0aXZpdHkoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+eyBpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBSeCBGcmVxdWVuY3kgd2luZG93LiAqL1xuICBwdWJsaWMgY2xlYXJSeEZyZXFXaW5kb3coKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+eyBpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDEgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBCYW5kIEFjdGl2aXR5IGFuZCBSeCBGcmVxdWVuY3kgd2luZG93cy4gKi9cbiAgcHVibGljIGNsZWFyQWxsKCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0NsZWFyTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eENsZWFyPnsgaWQ6IHRoaXMud3NqdHhJZCwgd2luZG93OiAyIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byByZXBsYXkgbWVzc2FnZXMuIFVzZWZ1bCBmb3IgYSBmcmVzaCBjbGllbnQgdGhhdCB3YW50cyB0byBoZWFyXG4gICAqIHByZXZpb3VzIFdTSlQtWCBkZWNvZGVzLiAqL1xuICBwdWJsaWMgcmVwbGF5KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhSZXBsYXk+eyBpZDogdGhpcy53c2p0eElkIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBoYWx0IGFueSB0cmFuc21pc3Npb25zIGltbWVkaWF0ZWx5LiAqL1xuICBwdWJsaWMgaGFsdFR4Tm93KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0hhbHRUeE1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhIYWx0VHg+eyBpZDogdGhpcy53c2p0eElkLCBhdXRvVHhPbmx5OiBmYWxzZSB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gc3RvcCBhdXRvLXRyYW5zbWl0dGluZyBhZnRlciBmaW5pc2hpbmcgdGhlIGN1cnJlbnQgcm91bmQuICovXG4gIHB1YmxpYyBoYWx0VHhBZnRlckN1cnJlbnQoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnSGFsdFR4TWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eEhhbHRUeD57IGlkOiB0aGlzLndzanR4SWQsIGF1dG9UeE9ubHk6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHJlcGx5IHRvIHRoZSBnaXZlbiBkZWNvZGUuIFRoZSBtZXNzYWdlIG11c3QgaW5jbHVkZSBDUSBvciBRUlouICovXG4gIHB1YmxpYyByZXBseShkZWNvZGU6IFdzanR4RGVjb2RlKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnUmVwbHlNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4UmVwbHk+e1xuICAgICAgICAgIGlkOiBkZWNvZGUuaWQsXG4gICAgICAgICAgdGltZTogZGVjb2RlLnRpbWUsXG4gICAgICAgICAgc25yOiBkZWNvZGUuc25yLFxuICAgICAgICAgIGRlbHRhVGltZTogZGVjb2RlLmRlbHRhVGltZSxcbiAgICAgICAgICBkZWx0YUZyZXF1ZW5jeTogZGVjb2RlLmRlbHRhRnJlcXVlbmN5LFxuICAgICAgICAgIG1vZGU6IGRlY29kZS5tb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGRlY29kZS5tZXNzYWdlLFxuICAgICAgICAgIGxvd0NvbmZpZGVuY2U6IGRlY29kZS5sb3dDb25maWRlbmNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZXMudHhNZXNzYWdlJC5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbHkgdG8gdGhlIGdpdmVuIGRlY29kZS4gVGhlIG1lc3NhZ2UgbXVzdCBpbmNsdWRlIENRIG9yIFFSWi4gKi9cbiAgcHVibGljIGhpZ2hsaWdodENhbGxzaWduKGhpZ2hsaWdodE1zZzogV3NqdHhIaWdobGlnaHRDYWxsc2lnbikge1xuICAgIGhpZ2hsaWdodE1zZy5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIaWdobGlnaHRDYWxsc2lnbk1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiBoaWdobGlnaHRNc2csXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byB0cmFuc21pdCB0aGUgZ2l2ZW4gZnJlZSB0ZXh0LiBJZiB0aGUgdGV4dCBpcyB0b28gbG9uZyB0byBiZVxuICAgKiBlbmNvZGVkIGluIGEgc2luZ2xlIG1lc3NhZ2UsIGl0IG1heSBiZSBzaWxlbnRseSB0cnVuY2F0ZWQuICovXG4gIHB1YmxpYyBzZW5kRnJlZVRleHQoZnJlZVRleHQ6IFdzanR4RnJlZVRleHQpIHtcbiAgICBmcmVlVGV4dC5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdGcmVlVGV4dE1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiBmcmVlVGV4dCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHNldCB0aGUgbG9jYWwgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZC4gVGhpcyBpcyB0ZW1wb3JhcnksXG4gICAqIGxhc3Rpbmcgb25seSBhcyBsb25nIGFzIFdTSlQtWCBpcyBydW5uaW5nLiAqL1xuICBwdWJsaWMgc2V0TG9jYXRpb24oZ3JpZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnTG9jYXRpb25NZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4TG9jYXRpb24+e1xuICAgICAgICAgIGlkOiB0aGlzLndzanR4SWQsXG4gICAgICAgICAgbG9jYXRpb246IGdyaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlcy50eE1lc3NhZ2UkLm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBzd2l0Y2ggdG8gdGhlIG5hbWVkIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzd2l0Y2hDb25maWd1cmF0aW9uKGNvbmZpZ05hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ1N3aXRjaENvbmZpZ3VyYXRpb25NZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4U3dpdGNoQ29uZmlndXJhdGlvbj57XG4gICAgICAgICAgaWQ6IHRoaXMud3NqdHhJZCxcbiAgICAgICAgICBjb25maWd1cmF0aW9uTmFtZTogY29uZmlnTmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHNldCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAqL1xuICBwdWJsaWMgY29uZmlndXJlKGNvbmZpZzogV3NqdHhDb25maWd1cmUpIHtcbiAgICBjb25maWcuaWQgPSB0aGlzLndzanR4SWQ7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ29uZmlndXJlTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IGNvbmZpZyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogR2l2ZW4gYSBkZWNvZGUgbWVzc2FnZSwgZm9ybWF0IGEgc3RyaW5nIHRoZSBzYW1lIHdheSBhcyBkaXNwbGF5ZWQgaW4gdGhlIFdTSlQtWCBCYW5kXG4gICAqIEFjdGl2aXR5L1J4IEZyZXF1ZW5jeSB3aW5kb3dzLiAqL1xuICBwdWJsaWMgc3RhdGljIGZvcm1hdERlY29kZShtc2c6IFdzanR4RGVjb2RlKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lU3RyID0gdGhpcy5mb3JtYXRUaW1lKG1zZy50aW1lKTtcbiAgICByZXR1cm4gYCR7dGltZVN0cn0gJHttc2cuc25yLnRvU3RyaW5nKCkucGFkU3RhcnQoMyl9ICR7bXNnLmRlbHRhVGltZVxuICAgICAgLnRvRml4ZWQoMSlcbiAgICAgIC5wYWRTdGFydCg0KX0gJHttc2cuZGVsdGFGcmVxdWVuY3kudG9TdHJpbmcoKS5wYWRTdGFydCg0KX0gfiAgJHtcbiAgICAgIG1zZy5tZXNzYWdlXG4gICAgfWA7XG4gIH1cblxuICAvKiogR2l2ZW4gYSB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBVVEMsIGZvcm1hdCBhcyBISE1NU1MuICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0VGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWNvbmRzU2luY2VNaWRuaWdodCA9IE1hdGguZmxvb3IodGltZSAvIDEwMDApO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihzZWNvbmRzU2luY2VNaWRuaWdodCAvIDM2MDApO1xuICAgIGNvbnN0IHNlY29uZHNTaW5jZUhvdXIgPSBzZWNvbmRzU2luY2VNaWRuaWdodCAtIGhvdXJzICogMzYwMDtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzU2luY2VIb3VyIC8gNjApO1xuICAgIGNvbnN0IHNlY29uZHMgPSBzZWNvbmRzU2luY2VIb3VyIC0gbWludXRlcyAqIDYwO1xuICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9JHttaW51dGVzXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyl9JHtzZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICB9XG59XG4iXX0=
@@ -10,9 +10,9 @@ class AgentMessageService {
10
10
  this.txMessage$ = new Subject();
11
11
  }
12
12
  }
13
- AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14
- AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, decorators: [{
13
+ AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14
+ AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, decorators: [{
16
16
  type: Injectable,
17
17
  args: [{
18
18
  providedIn: 'root',
@@ -230,7 +230,7 @@ class WsjtxService {
230
230
  config.id = this.wsjtxId;
231
231
  const wsMsg = {
232
232
  wsjtx: {
233
- type: 'SwitchConfigurationMessage',
233
+ type: 'ConfigureMessage',
234
234
  payload: config,
235
235
  },
236
236
  };
@@ -239,22 +239,26 @@ class WsjtxService {
239
239
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
240
240
  * Activity/Rx Frequency windows. */
241
241
  static formatDecode(msg) {
242
- const secondsSinceMidnight = Math.floor(msg.time / 1000);
242
+ const timeStr = this.formatTime(msg.time);
243
+ return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
244
+ .toFixed(1)
245
+ .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
246
+ }
247
+ /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */
248
+ static formatTime(time) {
249
+ const secondsSinceMidnight = Math.floor(time / 1000);
243
250
  const hours = Math.floor(secondsSinceMidnight / 3600);
244
251
  const secondsSinceHour = secondsSinceMidnight - hours * 3600;
245
252
  const minutes = Math.floor(secondsSinceHour / 60);
246
253
  const seconds = secondsSinceHour - minutes * 60;
247
- const timeStr = `${hours.toString().padStart(2, '0')}${minutes
254
+ return `${hours.toString().padStart(2, '0')}${minutes
248
255
  .toString()
249
256
  .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
250
- return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
251
- .toFixed(1)
252
- .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
253
257
  }
254
258
  }
255
- WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
256
- WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, providedIn: 'root' });
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, decorators: [{
259
+ WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
260
+ WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, providedIn: 'root' });
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, decorators: [{
258
262
  type: Injectable,
259
263
  args: [{
260
264
  providedIn: 'root',
@@ -295,9 +299,9 @@ class HamlibService {
295
299
  }
296
300
  }
297
301
  }
298
- HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
299
- HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, providedIn: 'root' });
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, decorators: [{
302
+ HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
303
+ HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, providedIn: 'root' });
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, decorators: [{
301
305
  type: Injectable,
302
306
  args: [{
303
307
  providedIn: 'root',
@@ -466,9 +470,9 @@ class AgentService {
466
470
  return WsjtxService.formatDecode(msg);
467
471
  }
468
472
  }
469
- AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [{ token: AgentMessageService }, { token: HamlibService }, { token: WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
470
- AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, providedIn: 'root' });
471
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, decorators: [{
473
+ AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, deps: [{ token: AgentMessageService }, { token: HamlibService }, { token: WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
474
+ AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, providedIn: 'root' });
475
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, decorators: [{
472
476
  type: Injectable,
473
477
  args: [{
474
478
  providedIn: 'root',
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent-message.service.ts","../../../projects/ngx-kel-agent/src/lib/wsjtx.service.ts","../../../projects/ngx-kel-agent/src/lib/hamlib.service.ts","../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentMessageService {\n rxMessage$ = new Subject<any>();\n txMessage$ = new Subject<any>();\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxConfigure,\n WsjtxDecode,\n WsjtxFreeText,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLocation,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxSwitchConfiguration,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WsjtxService {\n /** Whether we're getting any messages from WSJT-X. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly heartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly status$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly decode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly clear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly qsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly close$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly loggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n private wsjtxId: string = 'WSJT-X';\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n private setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.connected$\n .pipe(debounceTime(15000))\n .subscribe(() => this.connected$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.close$.subscribe(() => {\n this.connected$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.heartbeat$.next(null);\n this.status$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.wsjtx) {\n return;\n }\n this.connected$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.heartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.status$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.decode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.clear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.qsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.close$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.loggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public clearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 0 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public clearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 1 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public clearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 2 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public replay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{ id: this.wsjtxId },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public haltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: false },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public haltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: true },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public reply(decode: WsjtxDecode) {\n const wsMsg = {\n wsjtx: {\n type: 'ReplyMessage',\n payload: <WsjtxReply>{\n id: decode.id,\n time: decode.time,\n snr: decode.snr,\n deltaTime: decode.deltaTime,\n deltaFrequency: decode.deltaFrequency,\n mode: decode.mode,\n message: decode.message,\n lowConfidence: decode.lowConfidence,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public highlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to transmit the given free text. If the text is too long to be\n * encoded in a single message, it may be silently truncated. */\n public sendFreeText(freeText: WsjtxFreeText) {\n freeText.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'FreeTextMessage',\n payload: freeText,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,\n * lasting only as long as WSJT-X is running. */\n public setLocation(grid: string) {\n const wsMsg = {\n wsjtx: {\n type: 'LocationMessage',\n payload: <WsjtxLocation>{\n id: this.wsjtxId,\n location: grid,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to switch to the named configuration. */\n public switchConfiguration(configName: string) {\n const wsMsg = {\n wsjtx: {\n type: 'SwitchConfigurationMessage',\n payload: <WsjtxSwitchConfiguration>{\n id: this.wsjtxId,\n configurationName: configName,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the given configuration parameters. */\n public configure(config: WsjtxConfigure) {\n config.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'SwitchConfigurationMessage',\n payload: config,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const secondsSinceMidnight = Math.floor(msg.time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n const timeStr = `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HamlibService {\n /** Whether we're getting any messages from Hamlib. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly rigState$ = new BehaviorSubject<HamlibRigState | null>(null);\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.connected$.pipe(debounceTime(15000)).subscribe(() => {\n this.connected$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.rigState$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.hamlib) {\n return;\n }\n this.connected$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.rigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n}\n","import { AgentMessageService } from './agent-message.service';\nimport { BehaviorSubject, ReplaySubject, Subject, Subscription } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { HamlibService } from './hamlib.service';\nimport { Injectable } from '@angular/core';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxStatus,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { WsjtxService } from './wsjtx.service';\nimport { delay, retryWhen, tap } from 'rxjs/operators';\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /**\n * Whether we're getting any messages from WSJT-X.\n *\n * @deprecated Use {@link WsjtxService.connected$} instead.\n */\n public readonly wsjtxState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to WSJT-X \"Heartbeat\" messages.\n *\n * @deprecated Use {@link WsjtxService.heartbeat$} instead.\n */\n public readonly wsjtxHeartbeat$: ReplaySubject<WsjtxHeartbeat | null>;\n /**\n * Subject for listening to WSJT-X \"Status\" messages.\n *\n * @deprecated Use {@link WsjtxService.status$} instead.\n */\n public readonly wsjtxStatus$: ReplaySubject<WsjtxStatus | null>;\n /**\n * Subject for listening to WSJT-X \"Decode\" messages.\n *\n * @deprecated Use {@link WsjtxService.decode$} instead.\n */\n public readonly wsjtxDecode$: Subject<WsjtxDecode>;\n /**\n * Subject for listening to WSJT-X \"Clear\" messages.\n *\n * @deprecated Use {@link WsjtxService.clear$} instead.\n */\n public readonly wsjtxClear$: Subject<WsjtxClear>;\n /**\n * Subject for listening to WSJT-X \"QsoLogged\" messages.\n *\n * @deprecated Use {@link WsjtxService.qsoLogged$} instead.\n */\n public readonly wsjtxQsoLogged$: Subject<WsjtxQsoLogged>;\n /**\n * Subject for listening to WSJT-X \"Close\" messages.\n *\n * @deprecated Use {@link WsjtxService.close$} instead.\n */\n public readonly wsjtxClose$: Subject<WsjtxClose>;\n /**\n * Subject for listening to WSJT-X \"WsprDecode\" messages.\n *\n * @deprecated Use {@link WsjtxService.wsprDecode$} instead.\n */\n public readonly wsjtxWsprDecode$: Subject<WsjtxWsprDecode>;\n /**\n * Subject for listening to WSJT-X \"LoggedAdif\" messages.\n *\n * @deprecated Use {@link WsjtxService.loggedAdif$} instead.\n */\n public readonly wsjtxLoggedAdif$: Subject<WsjtxLoggedAdif>;\n\n /* Hamlib */\n /**\n * Whether we're getting any messages from Hamlib.\n *\n * @deprecated Use {@link HamlibService.connected$} instead.\n */\n public readonly hamlibState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to Hamlib \"RigState\" messages.\n *\n * @deprecated Use {@link HamlibService.rigState$} instead.\n */\n public readonly hamlibRigState$: BehaviorSubject<HamlibRigState | null>;\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n\n constructor(\n private messages: AgentMessageService,\n private hamlibService: HamlibService,\n private wsjtxService: WsjtxService\n ) {\n this.hamlibState$ = this.hamlibService.connected$;\n this.hamlibRigState$ = this.hamlibService.rigState$;\n\n this.wsjtxState$ = this.wsjtxService.connected$;\n this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;\n this.wsjtxStatus$ = this.wsjtxService.status$;\n this.wsjtxDecode$ = this.wsjtxService.decode$;\n this.wsjtxClear$ = this.wsjtxService.clear$;\n this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;\n this.wsjtxClose$ = this.wsjtxService.close$;\n this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;\n this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;\n }\n\n public init(): void {\n this.messages.txMessage$.subscribe((msg) => this.send(msg));\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.connect();\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.messages.rxMessage$.next(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return (\n localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost\n );\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n private send(wsMsg: any) {\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity window.\n *\n * @deprecated Use {@link WsjtxService.clearBandActivity} instead.\n */\n public sendWsjtxClearBandActivity() {\n this.wsjtxService.clearBandActivity();\n }\n\n /**\n * Send a command to WSJT-X to clear the Rx Frequency window.\n *\n * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.\n */\n public sendWsjtxClearRxFreqWindow() {\n this.wsjtxService.clearRxFreqWindow();\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.clearAll} instead.\n */\n public sendWsjtxClearAll() {\n this.wsjtxService.clearAll();\n }\n\n /**\n * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes.\n *\n * @deprecated Use {@link WsjtxService.replay} instead.\n */\n public sendWsjtxReplay() {\n this.wsjtxService.replay();\n }\n\n /**\n * Send a command to WSJT-X to halt any transmissions immediately.\n *\n * @deprecated Use {@link WsjtxService.haltTxNow} instead.\n */\n public sendWsjtxHaltTxNow() {\n this.wsjtxService.haltTxNow();\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.\n *\n * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.\n */\n public sendWsjtxHaltTxAfterCurrent() {\n this.wsjtxService.haltTxAfterCurrent();\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.reply} instead.\n */\n public sendWsjtxReply(decode: WsjtxDecode) {\n this.wsjtxService.reply(decode);\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.highlightCallsign} instead.\n */\n public sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n this.wsjtxService.highlightCallsign(highlightMsg);\n }\n\n /**\n * Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.formatDecode} instead.\n */\n public static formatDecode(msg: WsjtxDecode): string {\n return WsjtxService.formatDecode(msg);\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/agent-message.service';\nexport * from './lib/hamlib-messages';\nexport * from './lib/hamlib.service';\nexport * from './lib/wsjtx-messages';\nexport * from './lib/wsjtx.service';\n// export * from './lib/ngx-kel-agent.component';\n// export * from './lib/ngx-kel-agent.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent-message.service.ts","../../../projects/ngx-kel-agent/src/lib/wsjtx.service.ts","../../../projects/ngx-kel-agent/src/lib/hamlib.service.ts","../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentMessageService {\n rxMessage$ = new Subject<any>();\n txMessage$ = new Subject<any>();\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxConfigure,\n WsjtxDecode,\n WsjtxFreeText,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLocation,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxSwitchConfiguration,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WsjtxService {\n /** Whether we're getting any messages from WSJT-X. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly heartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly status$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly decode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly clear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly qsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly close$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly loggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n private wsjtxId: string = 'WSJT-X';\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n private setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.connected$\n .pipe(debounceTime(15000))\n .subscribe(() => this.connected$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.close$.subscribe(() => {\n this.connected$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.heartbeat$.next(null);\n this.status$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.wsjtx) {\n return;\n }\n this.connected$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.heartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.status$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.decode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.clear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.qsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.close$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.loggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public clearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 0 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public clearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 1 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public clearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 2 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public replay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{ id: this.wsjtxId },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public haltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: false },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public haltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: true },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public reply(decode: WsjtxDecode) {\n const wsMsg = {\n wsjtx: {\n type: 'ReplyMessage',\n payload: <WsjtxReply>{\n id: decode.id,\n time: decode.time,\n snr: decode.snr,\n deltaTime: decode.deltaTime,\n deltaFrequency: decode.deltaFrequency,\n mode: decode.mode,\n message: decode.message,\n lowConfidence: decode.lowConfidence,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public highlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to transmit the given free text. If the text is too long to be\n * encoded in a single message, it may be silently truncated. */\n public sendFreeText(freeText: WsjtxFreeText) {\n freeText.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'FreeTextMessage',\n payload: freeText,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,\n * lasting only as long as WSJT-X is running. */\n public setLocation(grid: string) {\n const wsMsg = {\n wsjtx: {\n type: 'LocationMessage',\n payload: <WsjtxLocation>{\n id: this.wsjtxId,\n location: grid,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to switch to the named configuration. */\n public switchConfiguration(configName: string) {\n const wsMsg = {\n wsjtx: {\n type: 'SwitchConfigurationMessage',\n payload: <WsjtxSwitchConfiguration>{\n id: this.wsjtxId,\n configurationName: configName,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the given configuration parameters. */\n public configure(config: WsjtxConfigure) {\n config.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'ConfigureMessage',\n payload: config,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const timeStr = this.formatTime(msg.time);\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n\n /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */\n public static formatTime(time: number) {\n const secondsSinceMidnight = Math.floor(time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n return `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HamlibService {\n /** Whether we're getting any messages from Hamlib. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly rigState$ = new BehaviorSubject<HamlibRigState | null>(null);\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.connected$.pipe(debounceTime(15000)).subscribe(() => {\n this.connected$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.rigState$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.hamlib) {\n return;\n }\n this.connected$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.rigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n}\n","import { AgentMessageService } from './agent-message.service';\nimport { BehaviorSubject, ReplaySubject, Subject, Subscription } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { HamlibService } from './hamlib.service';\nimport { Injectable } from '@angular/core';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxStatus,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { WsjtxService } from './wsjtx.service';\nimport { delay, retryWhen, tap } from 'rxjs/operators';\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /**\n * Whether we're getting any messages from WSJT-X.\n *\n * @deprecated Use {@link WsjtxService.connected$} instead.\n */\n public readonly wsjtxState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to WSJT-X \"Heartbeat\" messages.\n *\n * @deprecated Use {@link WsjtxService.heartbeat$} instead.\n */\n public readonly wsjtxHeartbeat$: ReplaySubject<WsjtxHeartbeat | null>;\n /**\n * Subject for listening to WSJT-X \"Status\" messages.\n *\n * @deprecated Use {@link WsjtxService.status$} instead.\n */\n public readonly wsjtxStatus$: ReplaySubject<WsjtxStatus | null>;\n /**\n * Subject for listening to WSJT-X \"Decode\" messages.\n *\n * @deprecated Use {@link WsjtxService.decode$} instead.\n */\n public readonly wsjtxDecode$: Subject<WsjtxDecode>;\n /**\n * Subject for listening to WSJT-X \"Clear\" messages.\n *\n * @deprecated Use {@link WsjtxService.clear$} instead.\n */\n public readonly wsjtxClear$: Subject<WsjtxClear>;\n /**\n * Subject for listening to WSJT-X \"QsoLogged\" messages.\n *\n * @deprecated Use {@link WsjtxService.qsoLogged$} instead.\n */\n public readonly wsjtxQsoLogged$: Subject<WsjtxQsoLogged>;\n /**\n * Subject for listening to WSJT-X \"Close\" messages.\n *\n * @deprecated Use {@link WsjtxService.close$} instead.\n */\n public readonly wsjtxClose$: Subject<WsjtxClose>;\n /**\n * Subject for listening to WSJT-X \"WsprDecode\" messages.\n *\n * @deprecated Use {@link WsjtxService.wsprDecode$} instead.\n */\n public readonly wsjtxWsprDecode$: Subject<WsjtxWsprDecode>;\n /**\n * Subject for listening to WSJT-X \"LoggedAdif\" messages.\n *\n * @deprecated Use {@link WsjtxService.loggedAdif$} instead.\n */\n public readonly wsjtxLoggedAdif$: Subject<WsjtxLoggedAdif>;\n\n /* Hamlib */\n /**\n * Whether we're getting any messages from Hamlib.\n *\n * @deprecated Use {@link HamlibService.connected$} instead.\n */\n public readonly hamlibState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to Hamlib \"RigState\" messages.\n *\n * @deprecated Use {@link HamlibService.rigState$} instead.\n */\n public readonly hamlibRigState$: BehaviorSubject<HamlibRigState | null>;\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n\n constructor(\n private messages: AgentMessageService,\n private hamlibService: HamlibService,\n private wsjtxService: WsjtxService\n ) {\n this.hamlibState$ = this.hamlibService.connected$;\n this.hamlibRigState$ = this.hamlibService.rigState$;\n\n this.wsjtxState$ = this.wsjtxService.connected$;\n this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;\n this.wsjtxStatus$ = this.wsjtxService.status$;\n this.wsjtxDecode$ = this.wsjtxService.decode$;\n this.wsjtxClear$ = this.wsjtxService.clear$;\n this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;\n this.wsjtxClose$ = this.wsjtxService.close$;\n this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;\n this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;\n }\n\n public init(): void {\n this.messages.txMessage$.subscribe((msg) => this.send(msg));\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.connect();\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.messages.rxMessage$.next(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return (\n localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost\n );\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n private send(wsMsg: any) {\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity window.\n *\n * @deprecated Use {@link WsjtxService.clearBandActivity} instead.\n */\n public sendWsjtxClearBandActivity() {\n this.wsjtxService.clearBandActivity();\n }\n\n /**\n * Send a command to WSJT-X to clear the Rx Frequency window.\n *\n * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.\n */\n public sendWsjtxClearRxFreqWindow() {\n this.wsjtxService.clearRxFreqWindow();\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.clearAll} instead.\n */\n public sendWsjtxClearAll() {\n this.wsjtxService.clearAll();\n }\n\n /**\n * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes.\n *\n * @deprecated Use {@link WsjtxService.replay} instead.\n */\n public sendWsjtxReplay() {\n this.wsjtxService.replay();\n }\n\n /**\n * Send a command to WSJT-X to halt any transmissions immediately.\n *\n * @deprecated Use {@link WsjtxService.haltTxNow} instead.\n */\n public sendWsjtxHaltTxNow() {\n this.wsjtxService.haltTxNow();\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.\n *\n * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.\n */\n public sendWsjtxHaltTxAfterCurrent() {\n this.wsjtxService.haltTxAfterCurrent();\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.reply} instead.\n */\n public sendWsjtxReply(decode: WsjtxDecode) {\n this.wsjtxService.reply(decode);\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.highlightCallsign} instead.\n */\n public sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n this.wsjtxService.highlightCallsign(highlightMsg);\n }\n\n /**\n * Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.formatDecode} instead.\n */\n public static formatDecode(msg: WsjtxDecode): string {\n return WsjtxService.formatDecode(msg);\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/agent-message.service';\nexport * from './lib/hamlib-messages';\nexport * from './lib/hamlib.service';\nexport * from './lib/wsjtx-messages';\nexport * from './lib/wsjtx.service';\n// export * from './lib/ngx-kel-agent.component';\n// export * from './lib/ngx-kel-agent.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -10,9 +10,9 @@ class AgentMessageService {
10
10
  this.txMessage$ = new Subject();
11
11
  }
12
12
  }
13
- AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14
- AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, decorators: [{
13
+ AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
14
+ AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentMessageService, decorators: [{
16
16
  type: Injectable,
17
17
  args: [{
18
18
  providedIn: 'root',
@@ -230,7 +230,7 @@ class WsjtxService {
230
230
  config.id = this.wsjtxId;
231
231
  const wsMsg = {
232
232
  wsjtx: {
233
- type: 'SwitchConfigurationMessage',
233
+ type: 'ConfigureMessage',
234
234
  payload: config,
235
235
  },
236
236
  };
@@ -239,22 +239,26 @@ class WsjtxService {
239
239
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
240
240
  * Activity/Rx Frequency windows. */
241
241
  static formatDecode(msg) {
242
- const secondsSinceMidnight = Math.floor(msg.time / 1000);
242
+ const timeStr = this.formatTime(msg.time);
243
+ return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
244
+ .toFixed(1)
245
+ .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
246
+ }
247
+ /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */
248
+ static formatTime(time) {
249
+ const secondsSinceMidnight = Math.floor(time / 1000);
243
250
  const hours = Math.floor(secondsSinceMidnight / 3600);
244
251
  const secondsSinceHour = secondsSinceMidnight - hours * 3600;
245
252
  const minutes = Math.floor(secondsSinceHour / 60);
246
253
  const seconds = secondsSinceHour - minutes * 60;
247
- const timeStr = `${hours.toString().padStart(2, '0')}${minutes
254
+ return `${hours.toString().padStart(2, '0')}${minutes
248
255
  .toString()
249
256
  .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
250
- return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
251
- .toFixed(1)
252
- .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
253
257
  }
254
258
  }
255
- WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
256
- WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, providedIn: 'root' });
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: WsjtxService, decorators: [{
259
+ WsjtxService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
260
+ WsjtxService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, providedIn: 'root' });
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: WsjtxService, decorators: [{
258
262
  type: Injectable,
259
263
  args: [{
260
264
  providedIn: 'root',
@@ -295,9 +299,9 @@ class HamlibService {
295
299
  }
296
300
  }
297
301
  }
298
- HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
299
- HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, providedIn: 'root' });
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, decorators: [{
302
+ HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, deps: [{ token: AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
303
+ HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, providedIn: 'root' });
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: HamlibService, decorators: [{
301
305
  type: Injectable,
302
306
  args: [{
303
307
  providedIn: 'root',
@@ -465,9 +469,9 @@ class AgentService {
465
469
  return WsjtxService.formatDecode(msg);
466
470
  }
467
471
  }
468
- AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [{ token: AgentMessageService }, { token: HamlibService }, { token: WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
469
- AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, providedIn: 'root' });
470
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, decorators: [{
472
+ AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, deps: [{ token: AgentMessageService }, { token: HamlibService }, { token: WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
473
+ AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, providedIn: 'root' });
474
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: AgentService, decorators: [{
471
475
  type: Injectable,
472
476
  args: [{
473
477
  providedIn: 'root',
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent-message.service.ts","../../../projects/ngx-kel-agent/src/lib/wsjtx.service.ts","../../../projects/ngx-kel-agent/src/lib/hamlib.service.ts","../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentMessageService {\n rxMessage$ = new Subject<any>();\n txMessage$ = new Subject<any>();\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxConfigure,\n WsjtxDecode,\n WsjtxFreeText,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLocation,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxSwitchConfiguration,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WsjtxService {\n /** Whether we're getting any messages from WSJT-X. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly heartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly status$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly decode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly clear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly qsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly close$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly loggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n private wsjtxId: string = 'WSJT-X';\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n private setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.connected$\n .pipe(debounceTime(15000))\n .subscribe(() => this.connected$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.close$.subscribe(() => {\n this.connected$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.heartbeat$.next(null);\n this.status$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.wsjtx) {\n return;\n }\n this.connected$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.heartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.status$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.decode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.clear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.qsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.close$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.loggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public clearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 0 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public clearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 1 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public clearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 2 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public replay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{ id: this.wsjtxId },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public haltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: false },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public haltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: true },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public reply(decode: WsjtxDecode) {\n const wsMsg = {\n wsjtx: {\n type: 'ReplyMessage',\n payload: <WsjtxReply>{\n id: decode.id,\n time: decode.time,\n snr: decode.snr,\n deltaTime: decode.deltaTime,\n deltaFrequency: decode.deltaFrequency,\n mode: decode.mode,\n message: decode.message,\n lowConfidence: decode.lowConfidence,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public highlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to transmit the given free text. If the text is too long to be\n * encoded in a single message, it may be silently truncated. */\n public sendFreeText(freeText: WsjtxFreeText) {\n freeText.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'FreeTextMessage',\n payload: freeText,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,\n * lasting only as long as WSJT-X is running. */\n public setLocation(grid: string) {\n const wsMsg = {\n wsjtx: {\n type: 'LocationMessage',\n payload: <WsjtxLocation>{\n id: this.wsjtxId,\n location: grid,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to switch to the named configuration. */\n public switchConfiguration(configName: string) {\n const wsMsg = {\n wsjtx: {\n type: 'SwitchConfigurationMessage',\n payload: <WsjtxSwitchConfiguration>{\n id: this.wsjtxId,\n configurationName: configName,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the given configuration parameters. */\n public configure(config: WsjtxConfigure) {\n config.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'SwitchConfigurationMessage',\n payload: config,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const secondsSinceMidnight = Math.floor(msg.time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n const timeStr = `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HamlibService {\n /** Whether we're getting any messages from Hamlib. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly rigState$ = new BehaviorSubject<HamlibRigState | null>(null);\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.connected$.pipe(debounceTime(15000)).subscribe(() => {\n this.connected$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.rigState$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.hamlib) {\n return;\n }\n this.connected$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.rigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n}\n","import { AgentMessageService } from './agent-message.service';\nimport { BehaviorSubject, ReplaySubject, Subject, Subscription } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { HamlibService } from './hamlib.service';\nimport { Injectable } from '@angular/core';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxStatus,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { WsjtxService } from './wsjtx.service';\nimport { delay, retryWhen, tap } from 'rxjs/operators';\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /**\n * Whether we're getting any messages from WSJT-X.\n *\n * @deprecated Use {@link WsjtxService.connected$} instead.\n */\n public readonly wsjtxState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to WSJT-X \"Heartbeat\" messages.\n *\n * @deprecated Use {@link WsjtxService.heartbeat$} instead.\n */\n public readonly wsjtxHeartbeat$: ReplaySubject<WsjtxHeartbeat | null>;\n /**\n * Subject for listening to WSJT-X \"Status\" messages.\n *\n * @deprecated Use {@link WsjtxService.status$} instead.\n */\n public readonly wsjtxStatus$: ReplaySubject<WsjtxStatus | null>;\n /**\n * Subject for listening to WSJT-X \"Decode\" messages.\n *\n * @deprecated Use {@link WsjtxService.decode$} instead.\n */\n public readonly wsjtxDecode$: Subject<WsjtxDecode>;\n /**\n * Subject for listening to WSJT-X \"Clear\" messages.\n *\n * @deprecated Use {@link WsjtxService.clear$} instead.\n */\n public readonly wsjtxClear$: Subject<WsjtxClear>;\n /**\n * Subject for listening to WSJT-X \"QsoLogged\" messages.\n *\n * @deprecated Use {@link WsjtxService.qsoLogged$} instead.\n */\n public readonly wsjtxQsoLogged$: Subject<WsjtxQsoLogged>;\n /**\n * Subject for listening to WSJT-X \"Close\" messages.\n *\n * @deprecated Use {@link WsjtxService.close$} instead.\n */\n public readonly wsjtxClose$: Subject<WsjtxClose>;\n /**\n * Subject for listening to WSJT-X \"WsprDecode\" messages.\n *\n * @deprecated Use {@link WsjtxService.wsprDecode$} instead.\n */\n public readonly wsjtxWsprDecode$: Subject<WsjtxWsprDecode>;\n /**\n * Subject for listening to WSJT-X \"LoggedAdif\" messages.\n *\n * @deprecated Use {@link WsjtxService.loggedAdif$} instead.\n */\n public readonly wsjtxLoggedAdif$: Subject<WsjtxLoggedAdif>;\n\n /* Hamlib */\n /**\n * Whether we're getting any messages from Hamlib.\n *\n * @deprecated Use {@link HamlibService.connected$} instead.\n */\n public readonly hamlibState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to Hamlib \"RigState\" messages.\n *\n * @deprecated Use {@link HamlibService.rigState$} instead.\n */\n public readonly hamlibRigState$: BehaviorSubject<HamlibRigState | null>;\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n\n constructor(\n private messages: AgentMessageService,\n private hamlibService: HamlibService,\n private wsjtxService: WsjtxService\n ) {\n this.hamlibState$ = this.hamlibService.connected$;\n this.hamlibRigState$ = this.hamlibService.rigState$;\n\n this.wsjtxState$ = this.wsjtxService.connected$;\n this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;\n this.wsjtxStatus$ = this.wsjtxService.status$;\n this.wsjtxDecode$ = this.wsjtxService.decode$;\n this.wsjtxClear$ = this.wsjtxService.clear$;\n this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;\n this.wsjtxClose$ = this.wsjtxService.close$;\n this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;\n this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;\n }\n\n public init(): void {\n this.messages.txMessage$.subscribe((msg) => this.send(msg));\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.connect();\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.messages.rxMessage$.next(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return (\n localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost\n );\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n private send(wsMsg: any) {\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity window.\n *\n * @deprecated Use {@link WsjtxService.clearBandActivity} instead.\n */\n public sendWsjtxClearBandActivity() {\n this.wsjtxService.clearBandActivity();\n }\n\n /**\n * Send a command to WSJT-X to clear the Rx Frequency window.\n *\n * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.\n */\n public sendWsjtxClearRxFreqWindow() {\n this.wsjtxService.clearRxFreqWindow();\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.clearAll} instead.\n */\n public sendWsjtxClearAll() {\n this.wsjtxService.clearAll();\n }\n\n /**\n * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes.\n *\n * @deprecated Use {@link WsjtxService.replay} instead.\n */\n public sendWsjtxReplay() {\n this.wsjtxService.replay();\n }\n\n /**\n * Send a command to WSJT-X to halt any transmissions immediately.\n *\n * @deprecated Use {@link WsjtxService.haltTxNow} instead.\n */\n public sendWsjtxHaltTxNow() {\n this.wsjtxService.haltTxNow();\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.\n *\n * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.\n */\n public sendWsjtxHaltTxAfterCurrent() {\n this.wsjtxService.haltTxAfterCurrent();\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.reply} instead.\n */\n public sendWsjtxReply(decode: WsjtxDecode) {\n this.wsjtxService.reply(decode);\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.highlightCallsign} instead.\n */\n public sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n this.wsjtxService.highlightCallsign(highlightMsg);\n }\n\n /**\n * Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.formatDecode} instead.\n */\n public static formatDecode(msg: WsjtxDecode): string {\n return WsjtxService.formatDecode(msg);\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/agent-message.service';\nexport * from './lib/hamlib-messages';\nexport * from './lib/hamlib.service';\nexport * from './lib/wsjtx-messages';\nexport * from './lib/wsjtx.service';\n// export * from './lib/ngx-kel-agent.component';\n// export * from './lib/ngx-kel-agent.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../projects/ngx-kel-agent/src/lib/agent-message.service.ts","../../../projects/ngx-kel-agent/src/lib/wsjtx.service.ts","../../../projects/ngx-kel-agent/src/lib/hamlib.service.ts","../../../projects/ngx-kel-agent/src/lib/agent.service.ts","../../../projects/ngx-kel-agent/src/public-api.ts","../../../projects/ngx-kel-agent/src/ngx-kel-agent.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentMessageService {\n rxMessage$ = new Subject<any>();\n txMessage$ = new Subject<any>();\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxConfigure,\n WsjtxDecode,\n WsjtxFreeText,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLocation,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxSwitchConfiguration,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WsjtxService {\n /** Whether we're getting any messages from WSJT-X. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly heartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly status$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly decode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly clear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly qsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly close$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly loggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n private wsjtxId: string = 'WSJT-X';\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n private setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.connected$\n .pipe(debounceTime(15000))\n .subscribe(() => this.connected$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.close$.subscribe(() => {\n this.connected$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.heartbeat$.next(null);\n this.status$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.wsjtx) {\n return;\n }\n this.connected$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.heartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.status$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.decode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.clear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.qsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.close$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.loggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n\n /** Send a command to WSJT-X to clear the Band Activity window. */\n public clearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 0 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public clearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 1 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public clearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{ id: this.wsjtxId, window: 2 },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes. */\n public replay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{ id: this.wsjtxId },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public haltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: false },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public haltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{ id: this.wsjtxId, autoTxOnly: true },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public reply(decode: WsjtxDecode) {\n const wsMsg = {\n wsjtx: {\n type: 'ReplyMessage',\n payload: <WsjtxReply>{\n id: decode.id,\n time: decode.time,\n snr: decode.snr,\n deltaTime: decode.deltaTime,\n deltaFrequency: decode.deltaFrequency,\n mode: decode.mode,\n message: decode.message,\n lowConfidence: decode.lowConfidence,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */\n public highlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to transmit the given free text. If the text is too long to be\n * encoded in a single message, it may be silently truncated. */\n public sendFreeText(freeText: WsjtxFreeText) {\n freeText.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'FreeTextMessage',\n payload: freeText,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,\n * lasting only as long as WSJT-X is running. */\n public setLocation(grid: string) {\n const wsMsg = {\n wsjtx: {\n type: 'LocationMessage',\n payload: <WsjtxLocation>{\n id: this.wsjtxId,\n location: grid,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to switch to the named configuration. */\n public switchConfiguration(configName: string) {\n const wsMsg = {\n wsjtx: {\n type: 'SwitchConfigurationMessage',\n payload: <WsjtxSwitchConfiguration>{\n id: this.wsjtxId,\n configurationName: configName,\n },\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to set the given configuration parameters. */\n public configure(config: WsjtxConfigure) {\n config.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'ConfigureMessage',\n payload: config,\n },\n };\n this.messages.txMessage$.next(wsMsg);\n }\n\n /** Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows. */\n public static formatDecode(msg: WsjtxDecode): string {\n const timeStr = this.formatTime(msg.time);\n return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime\n .toFixed(1)\n .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${\n msg.message\n }`;\n }\n\n /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */\n public static formatTime(time: number) {\n const secondsSinceMidnight = Math.floor(time / 1000);\n const hours = Math.floor(secondsSinceMidnight / 3600);\n const secondsSinceHour = secondsSinceMidnight - hours * 3600;\n const minutes = Math.floor(secondsSinceHour / 60);\n const seconds = secondsSinceHour - minutes * 60;\n return `${hours.toString().padStart(2, '0')}${minutes\n .toString()\n .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { debounceTime } from 'rxjs/operators';\nimport { AgentMessageService } from './agent-message.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HamlibService {\n /** Whether we're getting any messages from Hamlib. */\n public readonly connected$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly rigState$ = new BehaviorSubject<HamlibRigState | null>(null);\n\n constructor(private messages: AgentMessageService) {\n this.setupBehaviors();\n }\n\n setupBehaviors(): void {\n this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.connected$.pipe(debounceTime(15000)).subscribe(() => {\n this.connected$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.connected$.subscribe((isUp) => {\n if (!isUp) {\n this.rigState$.next(null);\n }\n });\n }\n\n private handleMessage(msg: any): void {\n if (!msg.hamlib) {\n return;\n }\n this.connected$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.rigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n}\n","import { AgentMessageService } from './agent-message.service';\nimport { BehaviorSubject, ReplaySubject, Subject, Subscription } from 'rxjs';\nimport { HamlibRigState } from './hamlib-messages';\nimport { HamlibService } from './hamlib.service';\nimport { Injectable } from '@angular/core';\nimport {\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxStatus,\n WsjtxWsprDecode,\n} from './wsjtx-messages';\nimport { WsjtxService } from './wsjtx.service';\nimport { delay, retryWhen, tap } from 'rxjs/operators';\nimport { webSocket, WebSocketSubject } from 'rxjs/webSocket';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AgentService {\n /** Whether we're connected to the agent. */\n public readonly connectedState$ = new BehaviorSubject<boolean>(false);\n\n /* WSJT-X */\n /**\n * Whether we're getting any messages from WSJT-X.\n *\n * @deprecated Use {@link WsjtxService.connected$} instead.\n */\n public readonly wsjtxState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to WSJT-X \"Heartbeat\" messages.\n *\n * @deprecated Use {@link WsjtxService.heartbeat$} instead.\n */\n public readonly wsjtxHeartbeat$: ReplaySubject<WsjtxHeartbeat | null>;\n /**\n * Subject for listening to WSJT-X \"Status\" messages.\n *\n * @deprecated Use {@link WsjtxService.status$} instead.\n */\n public readonly wsjtxStatus$: ReplaySubject<WsjtxStatus | null>;\n /**\n * Subject for listening to WSJT-X \"Decode\" messages.\n *\n * @deprecated Use {@link WsjtxService.decode$} instead.\n */\n public readonly wsjtxDecode$: Subject<WsjtxDecode>;\n /**\n * Subject for listening to WSJT-X \"Clear\" messages.\n *\n * @deprecated Use {@link WsjtxService.clear$} instead.\n */\n public readonly wsjtxClear$: Subject<WsjtxClear>;\n /**\n * Subject for listening to WSJT-X \"QsoLogged\" messages.\n *\n * @deprecated Use {@link WsjtxService.qsoLogged$} instead.\n */\n public readonly wsjtxQsoLogged$: Subject<WsjtxQsoLogged>;\n /**\n * Subject for listening to WSJT-X \"Close\" messages.\n *\n * @deprecated Use {@link WsjtxService.close$} instead.\n */\n public readonly wsjtxClose$: Subject<WsjtxClose>;\n /**\n * Subject for listening to WSJT-X \"WsprDecode\" messages.\n *\n * @deprecated Use {@link WsjtxService.wsprDecode$} instead.\n */\n public readonly wsjtxWsprDecode$: Subject<WsjtxWsprDecode>;\n /**\n * Subject for listening to WSJT-X \"LoggedAdif\" messages.\n *\n * @deprecated Use {@link WsjtxService.loggedAdif$} instead.\n */\n public readonly wsjtxLoggedAdif$: Subject<WsjtxLoggedAdif>;\n\n /* Hamlib */\n /**\n * Whether we're getting any messages from Hamlib.\n *\n * @deprecated Use {@link HamlibService.connected$} instead.\n */\n public readonly hamlibState$: BehaviorSubject<boolean>;\n /**\n * Subject for listening to Hamlib \"RigState\" messages.\n *\n * @deprecated Use {@link HamlibService.rigState$} instead.\n */\n public readonly hamlibRigState$: BehaviorSubject<HamlibRigState | null>;\n\n private readonly defaultAgentHost = 'localhost';\n private readonly defaultAgentPort = 8081;\n private readonly localStorageHostKey = 'agent-host';\n private readonly localStoragePortKey = 'agent-port';\n\n private agentHost: string = this.defaultAgentHost;\n private agentPort: number = this.defaultAgentPort;\n private agentWebSocketSubject: WebSocketSubject<object> | null = null;\n private agentWebsocketSubscription: Subscription | null = null;\n\n constructor(\n private messages: AgentMessageService,\n private hamlibService: HamlibService,\n private wsjtxService: WsjtxService\n ) {\n this.hamlibState$ = this.hamlibService.connected$;\n this.hamlibRigState$ = this.hamlibService.rigState$;\n\n this.wsjtxState$ = this.wsjtxService.connected$;\n this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;\n this.wsjtxStatus$ = this.wsjtxService.status$;\n this.wsjtxDecode$ = this.wsjtxService.decode$;\n this.wsjtxClear$ = this.wsjtxService.clear$;\n this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;\n this.wsjtxClose$ = this.wsjtxService.close$;\n this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;\n this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;\n }\n\n public init(): void {\n this.messages.txMessage$.subscribe((msg) => this.send(msg));\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.connect();\n }\n\n /** Connect (or reconnect) the websocket to the kel-agent server. */\n public connect(): void {\n if (this.agentWebsocketSubscription) {\n this.agentWebsocketSubscription.unsubscribe();\n }\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n const protocol = this.agentHost === 'localhost' ? 'ws://' : 'wss://';\n this.agentWebSocketSubject = webSocket<object>({\n url: protocol + this.agentHost + ':' + this.agentPort + '/websocket',\n });\n this.connectedState$.next(true);\n this.agentWebsocketSubscription = this.agentWebSocketSubject\n .pipe(\n retryWhen((errors) =>\n // retry the websocket connection after 10 seconds\n errors.pipe(\n tap(() => this.connectedState$.next(false)),\n delay(10000)\n )\n )\n )\n .subscribe({\n next: (msg) => {\n this.connectedState$.next(true);\n this.messages.rxMessage$.next(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return (\n localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost\n );\n }\n\n /** Get the currently configured kel-agent port. */\n public getPort(): number {\n let portStr = localStorage.getItem(this.localStoragePortKey);\n if (portStr == null) {\n return this.defaultAgentPort;\n }\n let portNum = parseInt(portStr, 10);\n if (isNaN(portNum)) {\n return this.defaultAgentPort;\n }\n return portNum;\n }\n\n /** Set the kel-agent host. */\n public setHost(host: string): void {\n localStorage.setItem(this.localStorageHostKey, host);\n this.connect();\n }\n\n /** Set the kel-agent port. */\n public setPort(port: number): void {\n localStorage.setItem(this.localStoragePortKey, String(port));\n this.connect();\n }\n\n private send(wsMsg: any) {\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity window.\n *\n * @deprecated Use {@link WsjtxService.clearBandActivity} instead.\n */\n public sendWsjtxClearBandActivity() {\n this.wsjtxService.clearBandActivity();\n }\n\n /**\n * Send a command to WSJT-X to clear the Rx Frequency window.\n *\n * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.\n */\n public sendWsjtxClearRxFreqWindow() {\n this.wsjtxService.clearRxFreqWindow();\n }\n\n /**\n * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.clearAll} instead.\n */\n public sendWsjtxClearAll() {\n this.wsjtxService.clearAll();\n }\n\n /**\n * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear\n * previous WSJT-X decodes.\n *\n * @deprecated Use {@link WsjtxService.replay} instead.\n */\n public sendWsjtxReplay() {\n this.wsjtxService.replay();\n }\n\n /**\n * Send a command to WSJT-X to halt any transmissions immediately.\n *\n * @deprecated Use {@link WsjtxService.haltTxNow} instead.\n */\n public sendWsjtxHaltTxNow() {\n this.wsjtxService.haltTxNow();\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.\n *\n * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.\n */\n public sendWsjtxHaltTxAfterCurrent() {\n this.wsjtxService.haltTxAfterCurrent();\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.reply} instead.\n */\n public sendWsjtxReply(decode: WsjtxDecode) {\n this.wsjtxService.reply(decode);\n }\n\n /**\n * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.\n *\n * @deprecated Use {@link WsjtxService.highlightCallsign} instead.\n */\n public sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n this.wsjtxService.highlightCallsign(highlightMsg);\n }\n\n /**\n * Given a decode message, format a string the same way as displayed in the WSJT-X Band\n * Activity/Rx Frequency windows.\n *\n * @deprecated Use {@link WsjtxService.formatDecode} instead.\n */\n public static formatDecode(msg: WsjtxDecode): string {\n return WsjtxService.formatDecode(msg);\n }\n}\n","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/agent-message.service';\nexport * from './lib/hamlib-messages';\nexport * from './lib/hamlib.service';\nexport * from './lib/wsjtx-messages';\nexport * from './lib/wsjtx.service';\n// export * from './lib/ngx-kel-agent.component';\n// export * from './lib/ngx-kel-agent.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -57,6 +57,8 @@ export declare class WsjtxService {
57
57
  /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
58
58
  * Activity/Rx Frequency windows. */
59
59
  static formatDecode(msg: WsjtxDecode): string;
60
+ /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */
61
+ static formatTime(time: number): string;
60
62
  static ɵfac: i0.ɵɵFactoryDeclaration<WsjtxService, never>;
61
63
  static ɵprov: i0.ɵɵInjectableDeclaration<WsjtxService>;
62
64
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-kel-agent",
3
- "version": "0.5.1",
3
+ "version": "0.5.5",
4
4
  "license": "Apache-2.0",
5
5
  "homepage": "https://github.com/k0swe/ngx-kel-agent/tree/main/projects/ngx-kel-agent#readme",
6
6
  "repository": {