ngx-kel-agent
Version:
This is a client library for Angular applications to integrate with [`kel-agent`](https://github.com/k0swe/kel-agent). It provides an Angular service that creates and manages the websocket connection, and exposes incoming messages as `Observable`s and out
1 lines • 33.8 kB
Source Map (JSON)
{"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 || !msg.wsjtx.type) {\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 || !msg.hamlib.type) {\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":["i1.AgentMessageService","i2.HamlibService","i3.WsjtxService"],"mappings":"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"}