ngx-kel-agent 0.4.10 → 0.5.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kel-agent.mjs","sources":["../../../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 {BehaviorSubject, ReplaySubject, Subject, Subscription,} from \"rxjs\";\nimport {debounceTime, delay, retryWhen, tap} from \"rxjs/operators\";\nimport {webSocket, WebSocketSubject} from \"rxjs/webSocket\";\nimport {\n HamlibRigState,\n WsjtxClear,\n WsjtxClose,\n WsjtxDecode,\n WsjtxHaltTx,\n WsjtxHeartbeat,\n WsjtxHighlightCallsign,\n WsjtxLoggedAdif,\n WsjtxQsoLogged,\n WsjtxReplay,\n WsjtxReply,\n WsjtxStatus,\n WsjtxWsprDecode\n} from \"./messages\";\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 /** Whether we're getting any messages from WSJT-X. */\n public readonly wsjtxState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to WSJT-X \"Heartbeat\" messages. */\n public readonly wsjtxHeartbeat$ = new ReplaySubject<WsjtxHeartbeat | null>(1);\n /** Subject for listening to WSJT-X \"Status\" messages. */\n public readonly wsjtxStatus$ = new ReplaySubject<WsjtxStatus | null>(1);\n /** Subject for listening to WSJT-X \"Decode\" messages. */\n public readonly wsjtxDecode$ = new Subject<WsjtxDecode>();\n /** Subject for listening to WSJT-X \"Clear\" messages. */\n public readonly wsjtxClear$ = new Subject<WsjtxClear>();\n /** Subject for listening to WSJT-X \"QsoLogged\" messages. */\n public readonly wsjtxQsoLogged$ = new Subject<WsjtxQsoLogged>();\n /** Subject for listening to WSJT-X \"Close\" messages. */\n public readonly wsjtxClose$ = new Subject<WsjtxClose>();\n /** Subject for listening to WSJT-X \"WsprDecode\" messages. */\n public readonly wsjtxWsprDecode$ = new Subject<WsjtxWsprDecode>();\n /** Subject for listening to WSJT-X \"LoggedAdif\" messages. */\n public readonly wsjtxLoggedAdif$ = new Subject<WsjtxLoggedAdif>();\n\n /* Hamlib */\n /** Whether we're getting any messages from Hamlib. */\n public readonly hamlibState$ = new BehaviorSubject<boolean>(false);\n /** Subject for listening to Hamlib \"RigState\" messages. */\n public readonly hamlibRigState$ = new BehaviorSubject<HamlibRigState | null>(\n null\n );\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 private wsjtxId: string = 'WSJT-X';\n\n constructor() {\n }\n\n public init(): void {\n this.agentHost = this.getHost();\n this.agentPort = this.getPort();\n this.setupWsjtxBehaviors();\n this.setupHamlibBehaviors();\n this.connect();\n }\n\n private setupWsjtxBehaviors(): void {\n // if we haven't heard from WSJT-X in 15 seconds, consider it \"down\"\n this.wsjtxState$\n .pipe(debounceTime(15000))\n .subscribe(() => this.wsjtxState$.next(false));\n // When WSJT-X announces it's closing, set it to \"down\" immediately\n this.wsjtxClose$.subscribe(() => {\n this.wsjtxState$.next(false);\n });\n // When WSJT-X goes down, clear its persistent message subjects\n this.wsjtxState$.subscribe((isUp) => {\n if (!isUp) {\n this.wsjtxHeartbeat$.next(null);\n this.wsjtxStatus$.next(null);\n }\n });\n }\n\n private setupHamlibBehaviors(): void {\n // if we haven't heard from Hamlib in 15 seconds, consider it down\n this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {\n this.hamlibState$.next(false);\n });\n // When Hamlib goes down, clear its persistent message subjects\n this.hamlibState$.subscribe((isUp) => {\n if (!isUp) {\n this.hamlibRigState$.next(null);\n }\n });\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.handleMessage(msg);\n },\n error: () => this.connectedState$.next(false),\n complete: () => this.connectedState$.next(false),\n });\n }\n\n private handleMessage(msg: any): void {\n if (msg.wsjtx != null && msg.wsjtx.type != null) {\n this.wsjtxState$.next(true);\n this.wsjtxId = msg.wsjtx.payload.id;\n switch (msg.wsjtx.type) {\n case 'HeartbeatMessage':\n this.wsjtxHeartbeat$.next(msg.wsjtx.payload as WsjtxHeartbeat);\n return;\n case 'StatusMessage':\n this.wsjtxStatus$.next(msg.wsjtx.payload as WsjtxStatus);\n return;\n case 'DecodeMessage':\n this.wsjtxDecode$.next(msg.wsjtx.payload as WsjtxDecode);\n return;\n case 'ClearMessage':\n this.wsjtxClear$.next(msg.wsjtx.payload as WsjtxClear);\n return;\n case 'QsoLoggedMessage':\n this.wsjtxQsoLogged$.next(msg.wsjtx.payload as WsjtxQsoLogged);\n return;\n case 'CloseMessage':\n this.wsjtxClose$.next(msg.wsjtx.payload as WsjtxClose);\n return;\n case 'WSPRDecodeMessage':\n this.wsjtxWsprDecode$.next(msg.wsjtx.payload as WsjtxWsprDecode);\n return;\n case 'LoggedAdifMessage':\n this.wsjtxLoggedAdif$.next(msg.wsjtx.payload as WsjtxLoggedAdif);\n return;\n }\n }\n if (msg.hamlib !== null) {\n this.hamlibState$.next(true);\n switch (msg.hamlib.type) {\n case 'RigState':\n this.hamlibRigState$.next(msg.hamlib.payload as HamlibRigState);\n return;\n }\n }\n }\n\n /** Get the currently configured kel-agent host. */\n public getHost(): string {\n return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;\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 /** Send a command to WSJT-X to clear the Band Activity window. */\n public sendWsjtxClearBandActivity() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 0},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Rx Frequency window. */\n public sendWsjtxClearRxFreqWindow() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 1},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */\n public sendWsjtxClearAll() {\n const wsMsg = {\n wsjtx: {\n type: 'ClearMessage',\n payload: <WsjtxClear>{id: this.wsjtxId, window: 2},\n },\n };\n this.agentWebSocketSubject?.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 sendWsjtxReplay() {\n const wsMsg = {\n wsjtx: {\n type: 'ReplayMessage',\n payload: <WsjtxReplay>{id: this.wsjtxId},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to halt any transmissions immediately. */\n public sendWsjtxHaltTxNow() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: false},\n },\n };\n this.agentWebSocketSubject?.next(wsMsg);\n }\n\n /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */\n public sendWsjtxHaltTxAfterCurrent() {\n const wsMsg = {\n wsjtx: {\n type: 'HaltTxMessage',\n payload: <WsjtxHaltTx>{id: this.wsjtxId, autoTxOnly: true},\n },\n };\n this.agentWebSocketSubject?.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 sendWsjtxReply(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.agentWebSocketSubject?.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 sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign) {\n highlightMsg.id = this.wsjtxId;\n const wsMsg = {\n wsjtx: {\n type: 'HighlightCallsignMessage',\n payload: highlightMsg,\n },\n };\n this.agentWebSocketSubject?.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","/*\n * Public API Surface of ngx-kel-agent\n */\n\nexport * from './lib/agent.service';\nexport * from './lib/messages';\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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"}
@@ -0,0 +1,9 @@
1
+ import { Subject } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ export declare class AgentMessageService {
4
+ rxMessage$: Subject<any>;
5
+ txMessage$: Subject<any>;
6
+ constructor();
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentMessageService, never>;
8
+ static ɵprov: i0.ɵɵInjectableDeclaration<AgentMessageService>;
9
+ }
@@ -1,30 +1,81 @@
1
- import { BehaviorSubject, ReplaySubject, Subject } from "rxjs";
2
- import { HamlibRigState, WsjtxClear, WsjtxClose, WsjtxDecode, WsjtxHeartbeat, WsjtxHighlightCallsign, WsjtxLoggedAdif, WsjtxQsoLogged, WsjtxStatus, WsjtxWsprDecode } from "./messages";
1
+ import { AgentMessageService } from './agent-message.service';
2
+ import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';
3
+ import { HamlibRigState } from './hamlib-messages';
4
+ import { HamlibService } from './hamlib.service';
5
+ import { WsjtxClear, WsjtxClose, WsjtxDecode, WsjtxHeartbeat, WsjtxHighlightCallsign, WsjtxLoggedAdif, WsjtxQsoLogged, WsjtxStatus, WsjtxWsprDecode } from './wsjtx-messages';
6
+ import { WsjtxService } from './wsjtx.service';
3
7
  import * as i0 from "@angular/core";
4
8
  export declare class AgentService {
9
+ private messages;
10
+ private hamlibService;
11
+ private wsjtxService;
5
12
  /** Whether we're connected to the agent. */
6
13
  readonly connectedState$: BehaviorSubject<boolean>;
7
- /** Whether we're getting any messages from WSJT-X. */
14
+ /**
15
+ * Whether we're getting any messages from WSJT-X.
16
+ *
17
+ * @deprecated Use {@link WsjtxService.connected$} instead.
18
+ */
8
19
  readonly wsjtxState$: BehaviorSubject<boolean>;
9
- /** Subject for listening to WSJT-X "Heartbeat" messages. */
20
+ /**
21
+ * Subject for listening to WSJT-X "Heartbeat" messages.
22
+ *
23
+ * @deprecated Use {@link WsjtxService.heartbeat$} instead.
24
+ */
10
25
  readonly wsjtxHeartbeat$: ReplaySubject<WsjtxHeartbeat | null>;
11
- /** Subject for listening to WSJT-X "Status" messages. */
26
+ /**
27
+ * Subject for listening to WSJT-X "Status" messages.
28
+ *
29
+ * @deprecated Use {@link WsjtxService.status$} instead.
30
+ */
12
31
  readonly wsjtxStatus$: ReplaySubject<WsjtxStatus | null>;
13
- /** Subject for listening to WSJT-X "Decode" messages. */
32
+ /**
33
+ * Subject for listening to WSJT-X "Decode" messages.
34
+ *
35
+ * @deprecated Use {@link WsjtxService.decode$} instead.
36
+ */
14
37
  readonly wsjtxDecode$: Subject<WsjtxDecode>;
15
- /** Subject for listening to WSJT-X "Clear" messages. */
38
+ /**
39
+ * Subject for listening to WSJT-X "Clear" messages.
40
+ *
41
+ * @deprecated Use {@link WsjtxService.clear$} instead.
42
+ */
16
43
  readonly wsjtxClear$: Subject<WsjtxClear>;
17
- /** Subject for listening to WSJT-X "QsoLogged" messages. */
44
+ /**
45
+ * Subject for listening to WSJT-X "QsoLogged" messages.
46
+ *
47
+ * @deprecated Use {@link WsjtxService.qsoLogged$} instead.
48
+ */
18
49
  readonly wsjtxQsoLogged$: Subject<WsjtxQsoLogged>;
19
- /** Subject for listening to WSJT-X "Close" messages. */
50
+ /**
51
+ * Subject for listening to WSJT-X "Close" messages.
52
+ *
53
+ * @deprecated Use {@link WsjtxService.close$} instead.
54
+ */
20
55
  readonly wsjtxClose$: Subject<WsjtxClose>;
21
- /** Subject for listening to WSJT-X "WsprDecode" messages. */
56
+ /**
57
+ * Subject for listening to WSJT-X "WsprDecode" messages.
58
+ *
59
+ * @deprecated Use {@link WsjtxService.wsprDecode$} instead.
60
+ */
22
61
  readonly wsjtxWsprDecode$: Subject<WsjtxWsprDecode>;
23
- /** Subject for listening to WSJT-X "LoggedAdif" messages. */
62
+ /**
63
+ * Subject for listening to WSJT-X "LoggedAdif" messages.
64
+ *
65
+ * @deprecated Use {@link WsjtxService.loggedAdif$} instead.
66
+ */
24
67
  readonly wsjtxLoggedAdif$: Subject<WsjtxLoggedAdif>;
25
- /** Whether we're getting any messages from Hamlib. */
68
+ /**
69
+ * Whether we're getting any messages from Hamlib.
70
+ *
71
+ * @deprecated Use {@link HamlibService.connected$} instead.
72
+ */
26
73
  readonly hamlibState$: BehaviorSubject<boolean>;
27
- /** Subject for listening to Hamlib "RigState" messages. */
74
+ /**
75
+ * Subject for listening to Hamlib "RigState" messages.
76
+ *
77
+ * @deprecated Use {@link HamlibService.rigState$} instead.
78
+ */
28
79
  readonly hamlibRigState$: BehaviorSubject<HamlibRigState | null>;
29
80
  private readonly defaultAgentHost;
30
81
  private readonly defaultAgentPort;
@@ -34,14 +85,10 @@ export declare class AgentService {
34
85
  private agentPort;
35
86
  private agentWebSocketSubject;
36
87
  private agentWebsocketSubscription;
37
- private wsjtxId;
38
- constructor();
88
+ constructor(messages: AgentMessageService, hamlibService: HamlibService, wsjtxService: WsjtxService);
39
89
  init(): void;
40
- private setupWsjtxBehaviors;
41
- private setupHamlibBehaviors;
42
90
  /** Connect (or reconnect) the websocket to the kel-agent server. */
43
91
  connect(): void;
44
- private handleMessage;
45
92
  /** Get the currently configured kel-agent host. */
46
93
  getHost(): string;
47
94
  /** Get the currently configured kel-agent port. */
@@ -50,25 +97,61 @@ export declare class AgentService {
50
97
  setHost(host: string): void;
51
98
  /** Set the kel-agent port. */
52
99
  setPort(port: number): void;
53
- /** Send a command to WSJT-X to clear the Band Activity window. */
100
+ private send;
101
+ /**
102
+ * Send a command to WSJT-X to clear the Band Activity window.
103
+ *
104
+ * @deprecated Use {@link WsjtxService.clearBandActivity} instead.
105
+ */
54
106
  sendWsjtxClearBandActivity(): void;
55
- /** Send a command to WSJT-X to clear the Rx Frequency window. */
107
+ /**
108
+ * Send a command to WSJT-X to clear the Rx Frequency window.
109
+ *
110
+ * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.
111
+ */
56
112
  sendWsjtxClearRxFreqWindow(): void;
57
- /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
113
+ /**
114
+ * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.
115
+ *
116
+ * @deprecated Use {@link WsjtxService.clearAll} instead.
117
+ */
58
118
  sendWsjtxClearAll(): void;
59
- /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
60
- * previous WSJT-X decodes. */
119
+ /**
120
+ * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
121
+ * previous WSJT-X decodes.
122
+ *
123
+ * @deprecated Use {@link WsjtxService.replay} instead.
124
+ */
61
125
  sendWsjtxReplay(): void;
62
- /** Send a command to WSJT-X to halt any transmissions immediately. */
126
+ /**
127
+ * Send a command to WSJT-X to halt any transmissions immediately.
128
+ *
129
+ * @deprecated Use {@link WsjtxService.haltTxNow} instead.
130
+ */
63
131
  sendWsjtxHaltTxNow(): void;
64
- /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
132
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.
133
+ *
134
+ * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.
135
+ */
65
136
  sendWsjtxHaltTxAfterCurrent(): void;
66
- /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
137
+ /**
138
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
139
+ *
140
+ * @deprecated Use {@link WsjtxService.reply} instead.
141
+ */
67
142
  sendWsjtxReply(decode: WsjtxDecode): void;
68
- /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
143
+ /**
144
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
145
+ *
146
+ * @deprecated Use {@link WsjtxService.highlightCallsign} instead.
147
+ */
69
148
  sendWsjtxHighlightCallsign(highlightMsg: WsjtxHighlightCallsign): void;
70
- /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
71
- * Activity/Rx Frequency windows. */
149
+ /**
150
+ * Given a decode message, format a string the same way as displayed in the WSJT-X Band
151
+ * Activity/Rx Frequency windows.
152
+ *
153
+ * @deprecated Use {@link WsjtxService.formatDecode} instead.
154
+ */
72
155
  static formatDecode(msg: WsjtxDecode): string;
73
156
  static ɵfac: i0.ɵɵFactoryDeclaration<AgentService, never>;
74
157
  static ɵprov: i0.ɵɵInjectableDeclaration<AgentService>;
@@ -0,0 +1,10 @@
1
+ export interface HamlibRigState {
2
+ /** Transceiver model name */
3
+ model: string;
4
+ /** Dial frequency of the "current" VFO in Hz */
5
+ frequency: number;
6
+ /** Mode name of the "current" VFO */
7
+ mode: string;
8
+ /** Width of the current passband filter in Hz */
9
+ passbandWidthHz: number;
10
+ }
@@ -0,0 +1,16 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { HamlibRigState } from './hamlib-messages';
3
+ import { AgentMessageService } from './agent-message.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class HamlibService {
6
+ private messages;
7
+ /** Whether we're getting any messages from Hamlib. */
8
+ readonly connected$: BehaviorSubject<boolean>;
9
+ /** Subject for listening to Hamlib "RigState" messages. */
10
+ readonly rigState$: BehaviorSubject<HamlibRigState | null>;
11
+ constructor(messages: AgentMessageService);
12
+ setupBehaviors(): void;
13
+ private handleMessage;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<HamlibService, never>;
15
+ static ɵprov: i0.ɵɵInjectableDeclaration<HamlibService>;
16
+ }
@@ -385,13 +385,3 @@ export interface WsjtxConfigure {
385
385
  /** Regenerate the standard messages */
386
386
  generateMessages: boolean;
387
387
  }
388
- export interface HamlibRigState {
389
- /** Transceiver model name */
390
- model: string;
391
- /** Dial frequency of the "current" VFO in Hz */
392
- frequency: number;
393
- /** Mode name of the "current" VFO */
394
- mode: string;
395
- /** Width of the current passband filter in Hz */
396
- passbandWidthHz: number;
397
- }
@@ -0,0 +1,64 @@
1
+ import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';
2
+ import { WsjtxClear, WsjtxClose, WsjtxConfigure, WsjtxDecode, WsjtxFreeText, WsjtxHeartbeat, WsjtxHighlightCallsign, WsjtxLoggedAdif, WsjtxQsoLogged, WsjtxStatus, WsjtxWsprDecode } from './wsjtx-messages';
3
+ import { AgentMessageService } from './agent-message.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class WsjtxService {
6
+ private messages;
7
+ /** Whether we're getting any messages from WSJT-X. */
8
+ readonly connected$: BehaviorSubject<boolean>;
9
+ /** Subject for listening to WSJT-X "Heartbeat" messages. */
10
+ readonly heartbeat$: ReplaySubject<WsjtxHeartbeat | null>;
11
+ /** Subject for listening to WSJT-X "Status" messages. */
12
+ readonly status$: ReplaySubject<WsjtxStatus | null>;
13
+ /** Subject for listening to WSJT-X "Decode" messages. */
14
+ readonly decode$: Subject<WsjtxDecode>;
15
+ /** Subject for listening to WSJT-X "Clear" messages. */
16
+ readonly clear$: Subject<WsjtxClear>;
17
+ /** Subject for listening to WSJT-X "QsoLogged" messages. */
18
+ readonly qsoLogged$: Subject<WsjtxQsoLogged>;
19
+ /** Subject for listening to WSJT-X "Close" messages. */
20
+ readonly close$: Subject<WsjtxClose>;
21
+ /** Subject for listening to WSJT-X "WsprDecode" messages. */
22
+ readonly wsprDecode$: Subject<WsjtxWsprDecode>;
23
+ /** Subject for listening to WSJT-X "LoggedAdif" messages. */
24
+ readonly loggedAdif$: Subject<WsjtxLoggedAdif>;
25
+ private wsjtxId;
26
+ constructor(messages: AgentMessageService);
27
+ private setupBehaviors;
28
+ private handleMessage;
29
+ /** Send a command to WSJT-X to clear the Band Activity window. */
30
+ clearBandActivity(): void;
31
+ /** Send a command to WSJT-X to clear the Rx Frequency window. */
32
+ clearRxFreqWindow(): void;
33
+ /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
34
+ clearAll(): void;
35
+ /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
36
+ * previous WSJT-X decodes. */
37
+ replay(): void;
38
+ /** Send a command to WSJT-X to halt any transmissions immediately. */
39
+ haltTxNow(): void;
40
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
41
+ haltTxAfterCurrent(): void;
42
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
43
+ reply(decode: WsjtxDecode): void;
44
+ /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
45
+ highlightCallsign(highlightMsg: WsjtxHighlightCallsign): void;
46
+ /**
47
+ * Send a command to WSJT-X to transmit the given free text. If the text is too long to be
48
+ * encoded in a single message, it may be silently truncated. */
49
+ sendFreeText(freeText: WsjtxFreeText): void;
50
+ /** Send a command to WSJT-X to set the local station's Maidenhead grid. This is temporary,
51
+ * lasting only as long as WSJT-X is running. */
52
+ setLocation(grid: string): void;
53
+ /** Send a command to WSJT-X to switch to the named configuration. */
54
+ switchConfiguration(configName: string): void;
55
+ /** Send a command to WSJT-X to set the given configuration parameters. */
56
+ configure(config: WsjtxConfigure): void;
57
+ /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
58
+ * Activity/Rx Frequency windows. */
59
+ static formatDecode(msg: WsjtxDecode): string;
60
+ /** Given a time in milliseconds since midnight UTC, format as HHMMSS. */
61
+ static formatTime(time: number): string;
62
+ static ɵfac: i0.ɵɵFactoryDeclaration<WsjtxService, never>;
63
+ static ɵprov: i0.ɵɵInjectableDeclaration<WsjtxService>;
64
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-kel-agent",
3
- "version": "0.4.10",
3
+ "version": "0.5.3",
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": {
@@ -15,9 +15,9 @@
15
15
  "wsjtx"
16
16
  ],
17
17
  "peerDependencies": {
18
- "@angular/common": "^12",
19
- "@angular/core": "^12",
20
- "rxjs": "~6.x"
18
+ "@angular/common": ">=12 <14",
19
+ "@angular/core": ">=12 <14",
20
+ "rxjs": ">=6 <8"
21
21
  },
22
22
  "dependencies": {
23
23
  "tslib": "2.3.1"
package/public-api.d.ts CHANGED
@@ -1,2 +1,6 @@
1
1
  export * from './lib/agent.service';
2
- export * from './lib/messages';
2
+ export * from './lib/agent-message.service';
3
+ export * from './lib/hamlib-messages';
4
+ export * from './lib/hamlib.service';
5
+ export * from './lib/wsjtx-messages';
6
+ export * from './lib/wsjtx.service';
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gta2VsLWFnZW50L3NyYy9saWIvbWVzc2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGhlYXJ0YmVhdCAgbWVzc2FnZSBzaGFsbCBiZSAgc2VudCBvbiBhIHBlcmlvZGljICBiYXNpcyBldmVyeVxuICogICAgMTUgICBzZWNvbmRzLiAgVGhpc1xuICogICAgbWVzc2FnZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZlcnMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZVxuICogICAgb2YgYSAgY2xpZW50IGFuZCBhbHNvICB0aGUgdW5leHBlY3RlZCBkaXNhcHBlYXJhbmNlIG9mICBhIGNsaWVudFxuICogICAgYW5kICBieSBjbGllbnRzICB0byBsZWFybiAgdGhlIHNjaGVtYSAgbmVnb3RpYXRlZCBieSAgdGhlIHNlcnZlclxuICogICAgYWZ0ZXIgaXQgcmVjZWl2ZXMgIHRoZSBpbml0aWFsIGhlYXJ0YmVhdCBtZXNzYWdlICBmcm9tIGEgY2xpZW50LlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wxMTApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4SGVhcnRiZWF0IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV1NKVC1YIGNsaWVudCdzIHN1cHBvcnRlZCBzY2hlbWEgdmVyc2lvbiAqL1xuICBtYXhTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50J3MgY29tbWl0IGhhc2ggKi9cbiAgcmV2aXNpb246IHN0cmluZztcbiAgLyoqIFdTSlQtWCBjbGllbnQncyBzZW1hbnRpYyB2ZXJzaW9uICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBXU0pULVggIHNlbmRzIHRoaXMgIHN0YXR1cyBtZXNzYWdlICB3aGVuIHZhcmlvdXMgIGludGVybmFsIHN0YXRlXG4gKiBjaGFuZ2VzIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gIHRyYWNrIHRoZSByZWxldmFudCBzdGF0ZSBvZiBlYWNoXG4gKiBjbGllbnQgd2l0aG91dCB0aGUgbmVlZCBmb3IgIHBvbGxpbmcgY29tbWFuZHMuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDE0MSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhTdGF0dXMge1xuICBjb25maWdOYW1lOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZGVDYWxsOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGRlR3JpZDogc3RyaW5nO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgY3VycmVudGx5IGRlY29kaW5nICovXG4gIGRlY29kaW5nOiBib29sZWFuO1xuICAvKiogVGhlIGNvbm5lY3RlZCB0cmFuc2NlaXZlcidzIGRpYWwgZnJlcXVlbmN5IGluIGhlcnR6ICovXG4gIGRpYWxGcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIFJlbW90ZSBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZHhDYWxsOiBzdHJpbmc7XG4gIC8qKiBSZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkeEdyaWQ6IHN0cmluZztcbiAgZmFzdE1vZGU6IGJvb2xlYW47XG4gIGZyZXF1ZW5jeVRvbGVyYW5jZTogbnVtYmVyO1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVjZWl2ZSBwcm90b2NvbCB0aGF0IFdTSlQtWCBpcyBkZWNvZGluZyAqL1xuICBtb2RlOiBzdHJpbmc7XG4gIC8qKiBUaGUgbG9jYWwgc3RhdGlvbidzIHNpZ25hbCByZXBvcnQgZm9yIHRoZSByZW1vdGUgc3RhdGlvbiAqL1xuICByZXBvcnQ6IHN0cmluZztcbiAgLyoqIFRoZSBsaXN0ZW5pbmcgZnJlcXVlbmN5IGluIGhlcnR6IGFib3ZlIHRoZSBkaWFsIGZyZXF1ZW5jeSAqL1xuICByeERlbHRhRnJlcTogbnVtYmVyO1xuICAvKiogSWYgbm9uLXplcm8sIFdTSlQtWCBpcyBpbiBhIHNwZWNpYWwgbW9kZSBsaWtlIEZveC9Ib3VuZCBvciBGaWVsZCBEYXkgKi9cbiAgc3BlY2lhbE1vZGU6IG51bWJlcjtcbiAgc3VibW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgdHJhbnNtaXR0aW5nICovXG4gIHRyYW5zbWl0dGluZzogYm9vbGVhbjtcbiAgLyoqIFRoZSB0cmFuc21pdCBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIHR4RGVsdGFGcmVxOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIFdTSlQtWCBpcyBhbGxvd2VkIHRvIHRyYW5zbWl0IGR1cmluZyB0aGUgbmV4dCB3aW5kb3cgKi9cbiAgdHhFbmFibGVkOiBib29sZWFuO1xuICB0eE1vZGU6IHN0cmluZztcbiAgdHhSeFBlcmlvZDogbnVtYmVyO1xuICB0eFdhdGNoZG9nOiBib29sZWFuO1xuICAvKiogVGhlIG1lc3NhZ2UgYmVpbmcgdHJhbnNtaXR0ZWQgKi9cbiAgdHhNZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlY29kZSBtZXNzYWdlIGlzIHNlbnQgd2hlbiAgYSBuZXcgZGVjb2RlIGlzIGNvbXBsZXRlZCwgaW5cbiAqIHRoaXMgY2FzZSB0aGUgJ05ldycgZmllbGQgaXMgdHJ1ZS4gSXQgaXMgYWxzbyB1c2VkIGluIHJlc3BvbnNlXG4gKiB0byAgYSBcIlJlcGxheVwiICBtZXNzYWdlIHdoZXJlICBlYWNoICBvbGQgZGVjb2RlICBpbiB0aGUgIFwiQmFuZFxuICogYWN0aXZpdHlcIiB3aW5kb3csIHRoYXQgIGhhcyBub3QgYmVlbiBlcmFzZWQsIGlzICBzZW50IGluIG9yZGVyXG4gKiBhcyBhIG9uZSBvZiB0aGVzZSBtZXNzYWdlcyAgd2l0aCB0aGUgJ05ldycgZmllbGQgc2V0IHRvIGZhbHNlLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wyMDgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4RGVjb2RlIHtcbiAgLyoqIFRoZSBkZWNvZGUncyBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIGRlbHRhRnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBUaGUgcGVyY2VpdmVkIGNsb2NrIGRpZmZlcmVudGlhbCBiZXR3ZWVuIHRoZSBsb2NhbCBzdGF0aW9uIGFuZCByZW1vdGUgc3RhdGlvbiwgaW4gc2Vjb25kcy4gKi9cbiAgZGVsdGFUaW1lOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgbG93Q29uZmlkZW5jZTogYm9vbGVhbjtcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVGhlIHByb3RvY29sIG9mIHRoZSBkZWNvZGVkIG1lc3NhZ2UgKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBkZWNvZGUgY2FtZSBmcm9tIHBsYXliYWNrIG9mIGEgcmVjb3JkaW5nICovXG4gIG9mZkFpcjogYm9vbGVhbjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogQ2xvY2sgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgKi9cbiAgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyAgc2VuZCB3aGVuIGFsbCBwcmlvciBcIkRlY29kZVwiICBtZXNzYWdlcyBpbiB0aGVcbiAqIFwiQmFuZCBBY3Rpdml0eVwiICB3aW5kb3cgaGF2ZSBiZWVuIGRpc2NhcmRlZCAgYW5kIHRoZXJlZm9yZSBhcmVcbiAqIG5vIGxvbmcgYXZhaWxhYmxlIGZvciBhY3Rpb25pbmcgIHdpdGggYSBcIlJlcGx5XCIgbWVzc2FnZS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMjM0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENsZWFyIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hpY2ggd2luZG93IHRvIGNsZWFyIChzZW5kIG9ubHkpLiBTZW5kIDAgdG8gY2xlYXIgQmFuZCBBY3Rpdml0eSwgMSB0byBjbGVhciBSeCBGcmVxdWVuY3ksICovXG4gIC8qKiBvciAyIHRvIGNsZWFyIGJvdGguICovXG4gIHdpbmRvdzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluIG9yZGVyIGZvciBhIHNlcnZlciAgdG8gcHJvdmlkZSBhIHVzZWZ1bCBjb29wZXJhdGl2ZSBzZXJ2aWNlXG4gKiB0byBXU0pULVggaXQgIGlzIHBvc3NpYmxlIGZvciBpdCB0byBpbml0aWF0ZSAgYSBRU08gYnkgc2VuZGluZ1xuICogdGhpcyBtZXNzYWdlIHRvIGEgY2xpZW50LiBXU0pULVggZmlsdGVycyB0aGlzIG1lc3NhZ2UgYW5kIG9ubHlcbiAqIGFjdHMgdXBvbiBpdCAgaWYgdGhlIG1lc3NhZ2UgZXhhY3RseSBkZXNjcmliZXMgIGEgcHJpb3IgZGVjb2RlXG4gKiBhbmQgdGhhdCBkZWNvZGUgIGlzIGEgQ1Egb3IgUVJaIG1lc3NhZ2UuICAgVGhlIGFjdGlvbiB0YWtlbiBpc1xuICogZXhhY3RseSBlcXVpdmFsZW50IHRvIHRoZSB1c2VyICBkb3VibGUgY2xpY2tpbmcgdGhlIG1lc3NhZ2UgaW5cbiAqIHRoZSBcIkJhbmQgYWN0aXZpdHlcIiB3aW5kb3cuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDI1NSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhSZXBseSB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIENsb2NrIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0ICovXG4gIHRpbWU6IG51bWJlcjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogVGhlIHBlcmNlaXZlZCBjbG9jayBkaWZmZXJlbnRpYWwgYmV0d2VlbiB0aGUgbG9jYWwgc3RhdGlvbiBhbmQgcmVtb3RlIHN0YXRpb24sIGluIHNlY29uZHMuICovXG4gIGRlbHRhVGltZTogbnVtYmVyO1xuICAvKiogVGhlIGRlY29kZSdzIGZyZXF1ZW5jeSBpbiBoZXJ0eiBhYm92ZSB0aGUgZGlhbCBmcmVxdWVuY3kgKi9cbiAgZGVsdGFGcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIFRoZSBwcm90b2NvbCBvZiB0aGUgZGVjb2RlZCBtZXNzYWdlICovXG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICBsb3dDb25maWRlbmNlOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlICBNb2RpZmllcnMgICBmaWVsZCAgYWxsb3dzICB0aGUgIGVxdWl2YWxlbnQgICBvZiAga2V5Ym9hcmRcbiAgICogbW9kaWZpZXJzIHRvIGJlIHNlbnQgXCJhcyBpZlwiIHRob3NlIG1vZGlmaWVyIGtleXMgd2hlcmUgcHJlc3NlZFxuICAgKiB3aGlsZSAgZG91YmxlLWNsaWNraW5nICB0aGUgIHNwZWNpZmllZCAgZGVjb2RlZCAgbWVzc2FnZS4gU2VlXG4gICAqIHRoZSBXU0pULVggc291cmNlIGxpbmsgYWJvdmUuICovXG4gIG1vZGlmaWVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBRU08gbG9nZ2VkIG1lc3NhZ2UgaXMgc2VudCB3aGVuIHRoZSBXU0pULVggdXNlciBhY2NlcHRzIHRoZSBcIkxvZyAgUVNPXCIgZGlhbG9nIGJ5IGNsaWNraW5nXG4gKiB0aGUgXCJPS1wiIGJ1dHRvbi5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMjk1KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eFFzb0xvZ2dlZCB7XG4gIGNvbW1lbnRzOiBzdHJpbmc7XG4gIGRhdGVUaW1lT2ZmOiBEYXRlO1xuICBkYXRlVGltZU9uOiBEYXRlO1xuICAvKiogcmVtb3RlIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBkeENhbGw6IHN0cmluZztcbiAgLyoqIHJlbW90ZSBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGR4R3JpZDogc3RyaW5nO1xuICAvKiogY29udGVzdCBleGNoYW5nZSByZWNlaXZlZCAqL1xuICBleGNoYW5nZVJlY2VpdmVkOiBzdHJpbmc7XG4gIC8qKiBjb250ZXN0IGV4Y2hhbmdlIHNlbnQgKi9cbiAgZXhjaGFuZ2VTZW50OiBzdHJpbmc7XG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIGxvY2FsIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBteUNhbGw6IHN0cmluZztcbiAgLyoqIGxvY2FsIHN0YXRpb24ncyBNYWlkZW5oZWFkIGdyaWQgKi9cbiAgbXlHcmlkOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIG9wZXJhdG9yJ3MgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbnMgb3BlcmF0b3IncyBjYWxsc2lnbiAoaWYgZGlmZmVyZW50IGZyb20gc3RhdGlvbikgKi9cbiAgb3BlcmF0b3JDYWxsOiBzdHJpbmc7XG4gIC8qKiBzaWduYWwgcmVwb3J0IHJlY2VpdmVkICovXG4gIHJlcG9ydFJlY2VpdmVkOiBzdHJpbmc7XG4gIC8qKiBzaWduYWwgcmVwb3J0IHNlbnQgKi9cbiAgcmVwb3J0U2VudDogc3RyaW5nO1xuICAvKiogZnJlcXVlbmN5IGluIGhlcnR6ICovXG4gIHR4RnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBwb3dlciBpbiB3YXR0cyAqL1xuICB0eFBvd2VyOiBzdHJpbmc7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFByb3BhZ2F0aW9uIG1vZGUgdXNpbmcgQURJRiBlbnVtZXJhdGlvbnMgKi9cbiAgcHJvcGFnYXRpb25Nb2RlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xvc2UgaXMgIHNlbnQgYnkgIGEgY2xpZW50IGltbWVkaWF0ZWx5ICBwcmlvciB0byAgaXQgc2h1dHRpbmdcbiAqIGRvd24gZ3JhY2VmdWxseS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzIwKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENsb3NlIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZW4gYSBzZXJ2ZXIgc3RhcnRzIGl0IG1heSAgYmUgdXNlZnVsIGZvciBpdCB0byBkZXRlcm1pbmUgdGhlXG4gKiBzdGF0ZSAgb2YgcHJlZXhpc3RpbmcgIGNsaWVudHMuIFNlbmRpbmcgIHRoaXMgbWVzc2FnZSAgdG8gZWFjaFxuICogY2xpZW50IGFzIGl0IGlzIGRpc2NvdmVyZWQgIHdpbGwgY2F1c2UgdGhhdCBjbGllbnQgKFdTSlQtWCkgdG9cbiAqIHNlbmQgYSBcIkRlY29kZVwiIG1lc3NhZ2UgZm9yIGVhY2ggZGVjb2RlIGN1cnJlbnRseSBpbiBpdHMgXCJCYW5kXG4gKiBhY3Rpdml0eVwiICB3aW5kb3cuIEVhY2ggIFwiRGVjb2RlXCIgbWVzc2FnZSAgc2VudCB3aWxsICBoYXZlIHRoZVxuICogXCJOZXdcIiBmbGFnIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbVxuICogbmV3IGRlY29kZXMuIEFmdGVyICBhbGwgdGhlIG9sZCBkZWNvZGVzIGhhdmUgIGJlZW4gYnJvYWRjYXN0IGFcbiAqIFwiU3RhdHVzXCIgbWVzc2FnZSAgaXMgYWxzbyBicm9hZGNhc3QuICBJZiB0aGUgc2VydmVyICB3aXNoZXMgdG9cbiAqIGRldGVybWluZSAgdGhlICBzdGF0dXMgIG9mICBhIG5ld2x5ICBkaXNjb3ZlcmVkICBjbGllbnQ7ICB0aGlzXG4gKiBtZXNzYWdlIHNob3VsZCBiZSB1c2VkLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzMjgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4UmVwbGF5IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgbWF5IHN0b3AgYSBjbGllbnQgZnJvbSB0cmFuc21pdHRpbmcgbWVzc2FnZXMgZWl0aGVyXG4gKiBpbW1lZGlhdGVseSBvciBhdCAgdGhlIGVuZCBvZiB0aGUgIGN1cnJlbnQgdHJhbnNtaXNzaW9uIHBlcmlvZFxuICogdXNpbmcgdGhpcyBtZXNzYWdlLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzNDMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4SGFsdFR4IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSWYgYGZhbHNlYCwgc3RvcCB0aGUgb25nb2luZyB0cmFuc21pc3Npb24gaW1tZWRpYXRlbHkuIElmIGB0cnVlYCwgdGhpcyBkb2Vzbid0IGhhbHQgdGhlXG4gICAqIGN1cnJlbnQgdHJhbnNtaXNzaW9uLCBpdCBqdXN0IGRpc2FibGVzIFdTSlQtWCBmcm9tIHRyYW5zbWl0dGluZyBhZnRlciB0aGUgY3VycmVudCByb3VuZC4gKi9cbiAgYXV0b1R4T25seTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgIGFsbG93cyB0aGUgc2VydmVyICB0byBzZXQgdGhlIGN1cnJlbnQgIGZyZWUgdGV4dFxuICogbWVzc2FnZSBjb250ZW50LiBTZW5kaW5nIHRoaXMgIG1lc3NhZ2Ugd2l0aCBhIG5vbi1lbXB0eSBcIlRleHRcIlxuICogZmllbGQgaXMgZXF1aXZhbGVudCB0byB0eXBpbmcgIGEgbmV3IG1lc3NhZ2UgKG9sZCBjb250ZW50cyBhcmVcbiAqIGRpc2NhcmRlZCkgaW4gdG8gIHRoZSBXU0pULVggZnJlZSB0ZXh0IG1lc3NhZ2UgIGZpZWxkIG9yIFwiVHg1XCJcbiAqIGZpZWxkIChib3RoICBhcmUgdXBkYXRlZCkgYW5kIGlmICB0aGUgXCJTZW5kXCIgZmxhZyBpcyAgc2V0IHRoZW5cbiAqIGNsaWNraW5nIHRoZSBcIk5vd1wiIHJhZGlvIGJ1dHRvbiBmb3IgdGhlIFwiVHg1XCIgZmllbGQgaWYgdGFiIG9uZVxuICogaXMgY3VycmVudCBvciBjbGlja2luZyB0aGUgXCJGcmVlICBtc2dcIiByYWRpbyBidXR0b24gaWYgdGFiIHR3b1xuICogaXMgY3VycmVudC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzUyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eEZyZWVUZXh0IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogQ3VzdG9tIHRleHQgdG8gc2VuZC4gTWF5IGJlIHRydW5jYXRlZCBpZiB0b28gbG9uZyAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIGFsc28gY2xpY2sgXCJOb3dcIiB0byBiZWdpbiB0cmFuc21pdHRpbmcgd2hlbiBhcHByb3ByaWF0ZSAqL1xuICBzZW5kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBkZWNvZGUgbWVzc2FnZSBpcyBzZW50IHdoZW4gIGEgbmV3IGRlY29kZSBpcyBjb21wbGV0ZWQsIGluXG4gKiB0aGlzIGNhc2UgdGhlICdOZXcnIGZpZWxkIGlzIHRydWUuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDM4MykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhXc3ByRGVjb2RlIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBDbG9jayB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCAqL1xuICB0aW1lOiBudW1iZXI7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgcGVyY2VpdmVkIHNpZ25hbCB0byBub2lzZSByYXRpbyAqL1xuICBzbnI6IG51bWJlcjtcbiAgLyoqIFRoZSBwZXJjZWl2ZWQgY2xvY2sgZGlmZmVyZW50aWFsIGJldHdlZW4gdGhlIGxvY2FsIHN0YXRpb24gYW5kIHJlbW90ZSBzdGF0aW9uLCBpbiBzZWNvbmRzLiAqL1xuICBkZWx0YVRpbWU6IG51bWJlcjtcbiAgZnJlcXVlbmN5OiBudW1iZXI7XG4gIGRyaWZ0OiBudW1iZXI7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIGNhbGxzaWduICovXG4gIGNhbGxzaWduOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBncmlkOiBzdHJpbmc7XG4gIC8qKiBwb3dlciBpbiBkQm0gKi9cbiAgcG93ZXI6IG51bWJlcjtcbiAgLyoqIHdoZXRoZXIgdGhlIGRlY29kZSBjYW1lIGZyb20gcGxheWJhY2sgb2YgYSByZWNvcmRpbmcgKi9cbiAgb2ZmQWlyOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoaXMgIG1lc3NhZ2UgYWxsb3dzICB0aGUgc2VydmVyICB0byBzZXQgIHRoZSBjdXJyZW50ICBjdXJyZW50XG4gKiBnZW9ncmFwaGljYWwgbG9jYXRpb24gIG9mIG9wZXJhdGlvbi4gVGhlIHN1cHBsaWVkICBsb2NhdGlvbiBpc1xuICogbm90IHBlcnNpc3RlbnQgYnV0ICBpcyB1c2VkIGFzIGEgIHNlc3Npb24gbGlmZXRpbWUgcmVwbGFjZW1lbnRcbiAqIGxvY3Rpb24gdGhhdCBvdmVycmlkZXMgdGhlIE1haWRlbmhlYWQgIGdyaWQgbG9jYXRlciBzZXQgaW4gdGhlXG4gKiBhcHBsaWNhdGlvbiAgc2V0dGluZ3MuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQwNikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhMb2NhdGlvbiB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIE1haWRlbmhlYWQgZ3JpZCB0byBzZXQgYXMgdGhlIGxvY2FsIHN0YXRpb24ncyBwb3NpdGlvbiAqL1xuICBsb2NhdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSAgbG9nZ2VkIEFESUYgIG1lc3NhZ2UgaXMgIHNlbnQgdG8gIHRoZSBzZXJ2ZXIocykgIHdoZW4gdGhlXG4gKiBXU0pULVggdXNlciBhY2NlcHRzIHRoZSBcIkxvZyAgUVNPXCIgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSBcIk9LXCJcbiAqIGJ1dHRvbi5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDIzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eExvZ2dlZEFkaWYge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBBRElGIGVuY29kZWQgUVNPIGRhdGEgKi9cbiAgYWRpZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgIG1heSBzZW5kICB0aGlzIG1lc3NhZ2UgYXQgIGFueSB0aW1lLiAgIFRoZSBtZXNzYWdlXG4gKiBzcGVjaWZpZXMgIHRoZSBiYWNrZ3JvdW5kICBhbmQgZm9yZWdyb3VuZCAgY29sb3IgdGhhdCAgd2lsbCBiZVxuICogdXNlZCAgdG8gIGhpZ2hsaWdodCAgdGhlICBzcGVjaWZpZWQgY2FsbHNpZ24gIGluICB0aGUgIGRlY29kZWRcbiAqIG1lc3NhZ2VzICBwcmludGVkICBpbiB0aGUgIEJhbmQgIEFjdGl2aXR5ICBwYW5lbC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDQ0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eEhpZ2hsaWdodENhbGxzaWduIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hpY2ggY2FsbHNpZ24gdG8gaGlnaGxpZ2h0ICovXG4gIGNhbGxzaWduOiBzdHJpbmc7XG4gIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLiBBbGwgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCA0IGZvcm1hdHMgc2hvdWxkIGJlIHZhbGlkLlxuICAgKiBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci00LyAqL1xuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgLyoqIEZvcmVncm91bmQgY29sb3IuIEFsbCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDQgZm9ybWF0cyBzaG91bGQgYmUgdmFsaWQuXG4gICAqIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTQvICovXG4gIGZvcmVncm91bmRDb2xvcjogc3RyaW5nO1xuICAvKiogVGhlIFwiSGlnaGxpZ2h0IGxhc3RcIiAgZmllbGQgYWxsb3dzIHRoZSBzZW5kZXIgIHRvIHJlcXVlc3QgdGhhdFxuICAgKiBhbGwgaW5zdGFuY2VzIG9mICBcIkNhbGxzaWduXCIgaW4gdGhlIGxhc3QgIHBlcmlvZCBvbmx5LCBpbnN0ZWFkXG4gICAqIG9mIGFsbCBpbnN0YW5jZXMgaW4gYWxsIHBlcmlvZHMsIGJlIGhpZ2hsaWdodGVkLiAqL1xuICBoaWdobGlnaHRMYXN0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byByZXNldCB0aGUgaGlnaGxpZ2h0aW5nIHRvIGRlZmF1bHQgKG92ZXJyaWRlcyBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycykgKi9cbiAgcmVzZXQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNlcnZlciAgbWF5IHNlbmQgIHRoaXMgbWVzc2FnZSBhdCAgYW55IHRpbWUuICAgVGhlIG1lc3NhZ2VcbiAqIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgIGNvbmZpZ3VyYXRpb24gdG8gc3dpdGNoIHRvLiBUaGUgbmV3XG4gKiBjb25maWd1cmF0aW9uIG11c3QgZXhpc3QuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQ0NSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhTd2l0Y2hDb25maWd1cmF0aW9uIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogTmV3IGNvbmZpZ3VyYXRpb24gc2V0IHRvIHVzZSAobXVzdCBhbHJlYWR5IGV4aXN0KSAqL1xuICBjb25maWd1cmF0aW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgIG1heSBzZW5kICB0aGlzIG1lc3NhZ2UgYXQgIGFueSB0aW1lLiAgIFRoZSBtZXNzYWdlXG4gKiBzcGVjaWZpZXMgIHZhcmlvdXMgIGNvbmZpZ3VyYXRpb24gIG9wdGlvbnMuICBGb3IgIHV0ZjggIHN0cmluZ1xuICogZmllbGRzIGFuIGVtcHR5IHZhbHVlIGltcGxpZXMgbm8gY2hhbmdlLCBmb3IgdGhlIHF1aW50MzIgUnggREZcbiAqIGFuZCAgRnJlcXVlbmN5ICBUb2xlcmFuY2UgIGZpZWxkcyB0aGUgIG1heGltdW0gIHF1aW50MzIgIHZhbHVlXG4gKiBpbXBsaWVzICBubyBjaGFuZ2UuICAgSW52YWxpZCBvciAgdW5yZWNvZ25pemVkIHZhbHVlcyAgd2lsbCBiZVxuICogc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDc5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENvbmZpZ3VyZSB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFdoaWNoIHByb3RvY29sIHRvIGRlY29kZSBhbmQgc2VuZCAqL1xuICBtb2RlOiBzdHJpbmc7XG4gIGZyZXF1ZW5jeVRvbGVyYW5jZTogbnVtYmVyO1xuICAvKiogV2hpY2ggc3ViLXByb3RvY29sIHRvIGRlY29kZSBhbmQgc2VuZCAqL1xuICBzdWJtb2RlOiBzdHJpbmc7XG4gIGZhc3RNb2RlOiBib29sZWFuO1xuICAvKiogV2hpY2ggcHJvdG9jb2wgdG8gZGVjb2RlIGFuZCBzZW5kICovXG4gIHRyUGVyaW9kOiBudW1iZXI7XG4gIC8qKiBSZWNlaXZlIGRlbHRhIChhYm92ZSBkaWFsKSBmcmVxdWVuY3kgaW4gaGVydHooPykgKi9cbiAgcnhERjogbnVtYmVyXG4gIC8qKiBUaGUgcmVtb3RlIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBkeENhbGw6IHN0cmluZztcbiAgLyoqIFRoZSByZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkeEdyaWQ6IHN0cmluZztcbiAgLyoqIFJlZ2VuZXJhdGUgdGhlIHN0YW5kYXJkIG1lc3NhZ2VzICovXG4gIGdlbmVyYXRlTWVzc2FnZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFtbGliUmlnU3RhdGUge1xuICAvKiogVHJhbnNjZWl2ZXIgbW9kZWwgbmFtZSAqL1xuICBtb2RlbDogc3RyaW5nO1xuICAvKiogRGlhbCBmcmVxdWVuY3kgb2YgdGhlIFwiY3VycmVudFwiIFZGTyBpbiBIeiAqL1xuICBmcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIE1vZGUgbmFtZSBvZiB0aGUgXCJjdXJyZW50XCIgVkZPICovXG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIFdpZHRoIG9mIHRoZSBjdXJyZW50IHBhc3NiYW5kIGZpbHRlciBpbiBIeiAqL1xuICBwYXNzYmFuZFdpZHRoSHo6IG51bWJlcjtcbn1cbiJdfQ==