@springfield/ham-radio-utils 3.2.6 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/radio-protocol-schema.json +129 -295
- package/dist/utils/band-plan.d.ts +11 -0
- package/dist/utils/band-plan.d.ts.map +1 -1
- package/dist/utils/band-plan.js +17 -0
- package/dist/utils/band-plan.js.map +1 -1
- package/dist/utils/operator-class-mapper.d.ts +11 -0
- package/dist/utils/operator-class-mapper.d.ts.map +1 -0
- package/dist/utils/operator-class-mapper.js +39 -0
- package/dist/utils/operator-class-mapper.js.map +1 -0
- package/dist/utils/ui-logger.d.ts +0 -14
- package/dist/utils/ui-logger.d.ts.map +1 -1
- package/dist/utils/ui-logger.js +19 -65
- package/dist/utils/ui-logger.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -0
- package/src/schemas/radio-protocol-schema.json +129 -295
- package/src/utils/band-plan.ts +20 -0
- package/src/utils/operator-class-mapper.ts +48 -0
- package/src/utils/ui-logger.ts +19 -85
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-class-mapper.js","sourceRoot":"","sources":["../../src/utils/operator-class-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAOlF,MAAM,eAAe,GAAG,kBAAoC,CAAC;AAE7D,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,YAAY,CAAE,CAAC,EAAE,CAAC;AACrG,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,SAAS,CAAE,CAAC,EAAE,CAAC;AAC/F,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,eAAe,CAAE,CAAC,EAAE,CAAC;AACnG,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,0BAA0B,CAAE,CAAC,EAAE,CAAC;AACjH,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,wBAAwB,CAAE,CAAC,EAAE,CAAC;AAE7G;;;;;;;;GAQG;AACH,MAAM,UAAU,6BAA6B,CAAC,SAAiB;IAC7D,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB;YACpB,OAAO,aAAa,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC;QACpB,KAAK,OAAO,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,QAAQ,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC","sourcesContent":["import licenseClassesData from '../db/license-classes.json' with { type: 'json' };\n\ninterface LicenseClass {\n id: string;\n name: string;\n}\n\nconst LICENSE_CLASSES = licenseClassesData as LicenseClass[];\n\nconst TECHNICIAN_ID = LICENSE_CLASSES.find((licenseClass) => licenseClass.name === 'Technician')!.id;\nconst GENERAL_ID = LICENSE_CLASSES.find((licenseClass) => licenseClass.name === 'General')!.id;\nconst EXTRA_ID = LICENSE_CLASSES.find((licenseClass) => licenseClass.name === 'Amateur Extra')!.id;\nconst ADVANCED_ID = LICENSE_CLASSES.find((licenseClass) => licenseClass.name === 'Advanced (Grandfathered)')!.id;\nconst NOVICE_ID = LICENSE_CLASSES.find((licenseClass) => licenseClass.name === 'Novice (Grandfathered)')!.id;\n\n/**\n * Maps a Callook.info / FCC operator-class name to a Springfield license-class ID.\n *\n * Callook returns values such as TECHNICIAN, GENERAL, and EXTRA. Club, military,\n * and RACES records often have an empty operator class and map to undefined.\n *\n * @param operClass - Operator class string from Callook or an equivalent FCC source\n * @returns The matching license-class ID, or undefined when no personal class applies\n */\nexport function operatorClassToLicenseClassId(operClass: string): string | undefined {\n const normalized = operClass.trim().toUpperCase().replace(/\\s+/g, ' ');\n\n if (normalized.length === 0) {\n return undefined;\n }\n\n switch (normalized) {\n case 'TECHNICIAN':\n case 'TECHNICIAN PLUS':\n return TECHNICIAN_ID;\n case 'GENERAL':\n return GENERAL_ID;\n case 'EXTRA':\n case 'AMATEUR EXTRA':\n return EXTRA_ID;\n case 'ADVANCED':\n return ADVANCED_ID;\n case 'NOVICE':\n return NOVICE_ID;\n default:\n return undefined;\n }\n}\n"]}
|
|
@@ -5,20 +5,6 @@ import type { ILogLayer } from 'loglayer';
|
|
|
5
5
|
* This module provides a specialized logger for capturing command-level information
|
|
6
6
|
* that can be easily parsed and displayed in a UI. It captures details about
|
|
7
7
|
* commands, data sent, data expected, and data received in a structured format.
|
|
8
|
-
*
|
|
9
|
-
* Purpose:
|
|
10
|
-
* - Captures command-level information for UI display
|
|
11
|
-
* - Provides structured JSON logging for easy parsing
|
|
12
|
-
* - Tracks command execution details including timing
|
|
13
|
-
* - Supports protocol debugging in UI environments
|
|
14
|
-
* - Maintains separation from debug logging
|
|
15
|
-
*
|
|
16
|
-
* Design Rationale:
|
|
17
|
-
* - Single log entry per command provides clean UI display
|
|
18
|
-
* - JSON structure enables easy parsing and filtering
|
|
19
|
-
* - Command-level granularity is appropriate for UI debugging
|
|
20
|
-
* - Structured data supports rich UI representations
|
|
21
|
-
* - Separate from debug logging avoids UI noise
|
|
22
8
|
*/
|
|
23
9
|
interface ProtocolContext {
|
|
24
10
|
variables?: Map<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-logger.d.ts","sourceRoot":"","sources":["../../src/utils/ui-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"ui-logger.d.ts","sourceRoot":"","sources":["../../src/utils/ui-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;;;GAMG;AAEH,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAKrD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,YAAY,MAAM,EAAE,SAAS,EAE5B;IAGD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAmBjG;IAGD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAoChI;IAGD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CA+B9I;IAED,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,eAAe;CAgBxB"}
|
package/dist/utils/ui-logger.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type guards for protocol step properties
|
|
3
|
-
*/
|
|
4
1
|
const hasDescription = (obj) => typeof obj === 'object' && obj !== null && 'description' in obj && typeof obj.description === 'string';
|
|
5
|
-
const hasReceive = (obj) => typeof obj === 'object' && obj !== null && 'receive' in obj;
|
|
6
|
-
const hasEndChunk = (obj) => typeof obj === 'object' &&
|
|
7
|
-
obj !== null &&
|
|
8
|
-
'endChunk' in obj &&
|
|
9
|
-
typeof obj.endChunk === 'object' &&
|
|
10
|
-
obj.endChunk !== null &&
|
|
11
|
-
'receive' in obj.endChunk;
|
|
12
|
-
const hasStartChunk = (obj) => typeof obj === 'object' &&
|
|
13
|
-
obj !== null &&
|
|
14
|
-
'startChunk' in obj &&
|
|
15
|
-
typeof obj.startChunk === 'object' &&
|
|
16
|
-
obj.startChunk !== null &&
|
|
17
|
-
'receive' in obj.startChunk;
|
|
18
2
|
/**
|
|
19
3
|
* UI Logger for capturing command-level information for UI display
|
|
20
4
|
*/
|
|
@@ -51,13 +35,10 @@ export class UILogger {
|
|
|
51
35
|
const duration = endTime - startTime;
|
|
52
36
|
const commandType = this.getCommandType(step);
|
|
53
37
|
const description = this.getStepDescription(step);
|
|
54
|
-
// Extract sent and received data from context
|
|
55
38
|
const dataSent = context.variables && context.variables.get('lastSentData');
|
|
56
39
|
const dataReceived = context.variables && context.variables.get('lastReceivedData');
|
|
57
40
|
const dataExpected = this.getExpectedData(step);
|
|
58
|
-
|
|
59
|
-
const dataChunks = commandType === 'readSegment' && context.variables && context.variables.get('lastReadSegmentChunks');
|
|
60
|
-
// Convert dataSent and dataReceived to byte array format if they exist
|
|
41
|
+
const dataChunks = commandType === 'read' && context.variables && context.variables.get('lastReadSegmentChunks');
|
|
61
42
|
// eslint-disable-next-line unicorn/prefer-spread
|
|
62
43
|
const dataSentArray = dataSent && Array.from(dataSent);
|
|
63
44
|
// eslint-disable-next-line unicorn/prefer-spread
|
|
@@ -88,10 +69,8 @@ export class UILogger {
|
|
|
88
69
|
const duration = endTime - startTime;
|
|
89
70
|
const commandType = this.getCommandType(step);
|
|
90
71
|
const description = this.getStepDescription(step);
|
|
91
|
-
// Extract sent data from context
|
|
92
72
|
const dataSent = context.variables && context.variables.get('lastSentData');
|
|
93
73
|
const dataExpected = this.getExpectedData(step);
|
|
94
|
-
// Convert dataSent to byte array format if it exists
|
|
95
74
|
// eslint-disable-next-line unicorn/prefer-spread
|
|
96
75
|
const dataSentArray = dataSent && Array.from(dataSent);
|
|
97
76
|
this.logger
|
|
@@ -112,61 +91,36 @@ export class UILogger {
|
|
|
112
91
|
.info('Command failed');
|
|
113
92
|
}
|
|
114
93
|
getCommandType(step) {
|
|
115
|
-
if ('
|
|
116
|
-
return '
|
|
117
|
-
}
|
|
118
|
-
if ('send' in step) {
|
|
119
|
-
return 'send';
|
|
120
|
-
}
|
|
121
|
-
if ('receive' in step) {
|
|
122
|
-
return 'receive';
|
|
123
|
-
}
|
|
124
|
-
if ('readSegment' in step) {
|
|
125
|
-
return 'readSegment';
|
|
94
|
+
if ('read' in step) {
|
|
95
|
+
return 'read';
|
|
126
96
|
}
|
|
127
|
-
if ('
|
|
128
|
-
return '
|
|
97
|
+
if ('write' in step) {
|
|
98
|
+
return 'write';
|
|
129
99
|
}
|
|
130
|
-
if ('
|
|
131
|
-
return '
|
|
100
|
+
if ('send' in step || 'expect' in step) {
|
|
101
|
+
return 'exchange';
|
|
132
102
|
}
|
|
133
103
|
return 'unknown';
|
|
134
104
|
}
|
|
135
105
|
getStepDescription(step) {
|
|
136
|
-
if (
|
|
137
|
-
return step.
|
|
138
|
-
}
|
|
139
|
-
if ('send' in step && hasDescription(step.send)) {
|
|
140
|
-
return step.send.description;
|
|
141
|
-
}
|
|
142
|
-
if ('receive' in step && hasDescription(step.receive)) {
|
|
143
|
-
return step.receive.description;
|
|
144
|
-
}
|
|
145
|
-
if ('readSegment' in step && hasDescription(step.readSegment)) {
|
|
146
|
-
return step.readSegment.description;
|
|
147
|
-
}
|
|
148
|
-
if ('writeSegment' in step && hasDescription(step.writeSegment)) {
|
|
149
|
-
return step.writeSegment.description;
|
|
106
|
+
if (hasDescription(step)) {
|
|
107
|
+
return step.description;
|
|
150
108
|
}
|
|
151
109
|
return 'No description';
|
|
152
110
|
}
|
|
153
111
|
getExpectedData(step) {
|
|
154
|
-
if ('
|
|
155
|
-
|
|
112
|
+
if ('read' in step && typeof step.read === 'object' && step.read !== null && 'expect' in step.read) {
|
|
113
|
+
const read = step.read;
|
|
114
|
+
return {
|
|
115
|
+
expect: read.expect,
|
|
116
|
+
ack: read.ack?.expect,
|
|
117
|
+
};
|
|
156
118
|
}
|
|
157
|
-
if ('
|
|
158
|
-
return step.
|
|
119
|
+
if ('write' in step && typeof step.write === 'object' && step.write !== null && 'expect' in step.write) {
|
|
120
|
+
return step.write.expect;
|
|
159
121
|
}
|
|
160
|
-
if ('
|
|
161
|
-
|
|
162
|
-
const { readSegment } = step;
|
|
163
|
-
if (hasEndChunk(readSegment) && hasStartChunk(readSegment)) {
|
|
164
|
-
return {
|
|
165
|
-
endChunk: readSegment.endChunk.receive,
|
|
166
|
-
startChunk: readSegment.startChunk.receive,
|
|
167
|
-
type: 'readSegment',
|
|
168
|
-
};
|
|
169
|
-
}
|
|
122
|
+
if ('expect' in step) {
|
|
123
|
+
return step.expect;
|
|
170
124
|
}
|
|
171
125
|
return {};
|
|
172
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-logger.js","sourceRoot":"","sources":["../../src/utils/ui-logger.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ILogLayer } from 'loglayer';\n\n/**\n * UI Logger: Command-Level Logging for UI Display\n *\n * This module provides a specialized logger for capturing command-level information\n * that can be easily parsed and displayed in a UI. It captures details about\n * commands, data sent, data expected, and data received in a structured format.\n *\n * Purpose:\n * - Captures command-level information for UI display\n * - Provides structured JSON logging for easy parsing\n * - Tracks command execution details including timing\n * - Supports protocol debugging in UI environments\n * - Maintains separation from debug logging\n *\n * Design Rationale:\n * - Single log entry per command provides clean UI display\n * - JSON structure enables easy parsing and filtering\n * - Command-level granularity is appropriate for UI debugging\n * - Structured data supports rich UI representations\n * - Separate from debug logging avoids UI noise\n */\n\ninterface ProtocolContext {\n variables?: Map<string, unknown>;\n}\n\n/**\n * Generic protocol step interface for UI logging\n */\nexport type UIProtocolStep = Record<string, unknown>;\n\n/**\n * Type guards for protocol step properties\n */\nconst hasDescription = (obj: unknown): obj is { description: string } =>\n typeof obj === 'object' && obj !== null && 'description' in obj && typeof (obj as Record<string, unknown>).description === 'string';\n\nconst hasReceive = (obj: unknown): obj is { receive: unknown } => typeof obj === 'object' && obj !== null && 'receive' in obj;\n\nconst hasEndChunk = (obj: unknown): obj is { endChunk: { receive: unknown } } =>\n typeof obj === 'object' &&\n obj !== null &&\n 'endChunk' in obj &&\n typeof (obj as Record<string, unknown>).endChunk === 'object' &&\n (obj as Record<string, unknown>).endChunk !== null &&\n 'receive' in ((obj as Record<string, unknown>).endChunk as Record<string, unknown>);\n\nconst hasStartChunk = (obj: unknown): obj is { startChunk: { receive: unknown } } =>\n typeof obj === 'object' &&\n obj !== null &&\n 'startChunk' in obj &&\n typeof (obj as Record<string, unknown>).startChunk === 'object' &&\n (obj as Record<string, unknown>).startChunk !== null &&\n 'receive' in ((obj as Record<string, unknown>).startChunk as Record<string, unknown>);\n\n/**\n * UI Logger for capturing command-level information for UI display\n */\nexport class UILogger {\n private logger: ILogLayer;\n private commandStartTimes = new Map<string, number>();\n\n constructor(logger: ILogLayer) {\n this.logger = logger;\n }\n\n // eslint-disable-next-line max-params\n startCommand(stepIndex: number, totalSteps: number, operation: string, step: UIProtocolStep): void {\n const commandId = `${operation}-${stepIndex}`;\n const startTime = Date.now();\n this.commandStartTimes.set(commandId, startTime);\n\n const commandType = this.getCommandType(step);\n const description = this.getStepDescription(step);\n\n this.logger\n .withMetadata({\n commandId,\n commandType,\n description,\n operation,\n startTime,\n stepIndex,\n totalSteps,\n })\n .info('Command started');\n }\n\n // eslint-disable-next-line max-params\n logCommandSuccess(stepIndex: number, totalSteps: number, operation: string, step: UIProtocolStep, context: ProtocolContext): void {\n const commandId = `${operation}-${stepIndex}`;\n const startTime = this.commandStartTimes.get(commandId) || Date.now();\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n const commandType = this.getCommandType(step);\n const description = this.getStepDescription(step);\n\n // Extract sent and received data from context\n const dataSent = context.variables && context.variables.get('lastSentData');\n const dataReceived = context.variables && context.variables.get('lastReceivedData');\n const dataExpected = this.getExpectedData(step);\n\n // For readSegment, also extract chunk logs if present\n const dataChunks = commandType === 'readSegment' && context.variables && context.variables.get('lastReadSegmentChunks');\n\n // Convert dataSent and dataReceived to byte array format if they exist\n // eslint-disable-next-line unicorn/prefer-spread\n const dataSentArray = dataSent && Array.from(dataSent as Uint8Array);\n // eslint-disable-next-line unicorn/prefer-spread\n const dataReceivedArray = dataReceived && Array.from(dataReceived as Uint8Array);\n\n this.logger\n .withMetadata({\n commandType,\n dataChunks,\n dataExpected,\n dataReceived: dataReceivedArray,\n dataSent: dataSentArray,\n description,\n duration,\n endTime,\n operation,\n startTime,\n stepIndex,\n success: true,\n totalSteps,\n })\n .info('Command completed successfully');\n }\n\n // eslint-disable-next-line max-params\n logCommandFailure(stepIndex: number, totalSteps: number, operation: string, step: UIProtocolStep, error: Error, context: ProtocolContext): void {\n const commandId = `${operation}-${stepIndex}`;\n const startTime = this.commandStartTimes.get(commandId) || Date.now();\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n const commandType = this.getCommandType(step);\n const description = this.getStepDescription(step);\n\n // Extract sent data from context\n const dataSent = context.variables && context.variables.get('lastSentData');\n const dataExpected = this.getExpectedData(step);\n\n // Convert dataSent to byte array format if it exists\n // eslint-disable-next-line unicorn/prefer-spread\n const dataSentArray = dataSent && Array.from(dataSent as Uint8Array);\n\n this.logger\n .withMetadata({\n commandType,\n dataExpected,\n dataSent: dataSentArray,\n description,\n duration,\n endTime,\n error: error.message,\n operation,\n startTime,\n stepIndex,\n success: false,\n totalSteps,\n })\n .info('Command failed');\n }\n\n private getCommandType(step: UIProtocolStep): string {\n if ('sendReceive' in step) {\n return 'sendReceive';\n }\n if ('send' in step) {\n return 'send';\n }\n if ('receive' in step) {\n return 'receive';\n }\n if ('readSegment' in step) {\n return 'readSegment';\n }\n if ('writeSegment' in step) {\n return 'writeSegment';\n }\n if ('setVariable' in step) {\n return 'setVariable';\n }\n return 'unknown';\n }\n\n private getStepDescription(step: UIProtocolStep): string {\n if ('sendReceive' in step && hasDescription(step.sendReceive)) {\n return step.sendReceive.description;\n }\n if ('send' in step && hasDescription(step.send)) {\n return step.send.description;\n }\n if ('receive' in step && hasDescription(step.receive)) {\n return step.receive.description;\n }\n if ('readSegment' in step && hasDescription(step.readSegment)) {\n return step.readSegment.description;\n }\n if ('writeSegment' in step && hasDescription(step.writeSegment)) {\n return step.writeSegment.description;\n }\n return 'No description';\n }\n\n private getExpectedData(step: UIProtocolStep): unknown {\n if ('sendReceive' in step && hasReceive(step.sendReceive)) {\n return step.sendReceive.receive;\n }\n if ('receive' in step) {\n return step.receive;\n }\n if ('readSegment' in step) {\n // For readSegment, return both start and end chunk receive patterns\n const { readSegment } = step;\n if (hasEndChunk(readSegment) && hasStartChunk(readSegment)) {\n return {\n endChunk: readSegment.endChunk.receive,\n startChunk: readSegment.startChunk.receive,\n type: 'readSegment',\n };\n }\n }\n return {};\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ui-logger.js","sourceRoot":"","sources":["../../src/utils/ui-logger.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ILogLayer } from 'loglayer';\n\n/**\n * UI Logger: Command-Level Logging for UI Display\n *\n * This module provides a specialized logger for capturing command-level information\n * that can be easily parsed and displayed in a UI. It captures details about\n * commands, data sent, data expected, and data received in a structured format.\n */\n\ninterface ProtocolContext {\n variables?: Map<string, unknown>;\n}\n\n/**\n * Generic protocol step interface for UI logging\n */\nexport type UIProtocolStep = Record<string, unknown>;\n\nconst hasDescription = (obj: unknown): obj is { description: string } =>\n typeof obj === 'object' && obj !== null && 'description' in obj && typeof (obj as Record<string, unknown>).description === 'string';\n\n/**\n * UI Logger for capturing command-level information for UI display\n */\nexport class UILogger {\n private logger: ILogLayer;\n private commandStartTimes = new Map<string, number>();\n\n constructor(logger: ILogLayer) {\n this.logger = logger;\n }\n\n // eslint-disable-next-line max-params\n startCommand(stepIndex: number, totalSteps: number, operation: string, step: UIProtocolStep): void {\n const commandId = `${operation}-${stepIndex}`;\n const startTime = Date.now();\n this.commandStartTimes.set(commandId, startTime);\n\n const commandType = this.getCommandType(step);\n const description = this.getStepDescription(step);\n\n this.logger\n .withMetadata({\n commandId,\n commandType,\n description,\n operation,\n startTime,\n stepIndex,\n totalSteps,\n })\n .info('Command started');\n }\n\n // eslint-disable-next-line max-params\n logCommandSuccess(stepIndex: number, totalSteps: number, operation: string, step: UIProtocolStep, context: ProtocolContext): void {\n const commandId = `${operation}-${stepIndex}`;\n const startTime = this.commandStartTimes.get(commandId) || Date.now();\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n const commandType = this.getCommandType(step);\n const description = this.getStepDescription(step);\n\n const dataSent = context.variables && context.variables.get('lastSentData');\n const dataReceived = context.variables && context.variables.get('lastReceivedData');\n const dataExpected = this.getExpectedData(step);\n const dataChunks = commandType === 'read' && context.variables && context.variables.get('lastReadSegmentChunks');\n\n // eslint-disable-next-line unicorn/prefer-spread\n const dataSentArray = dataSent && Array.from(dataSent as Uint8Array);\n // eslint-disable-next-line unicorn/prefer-spread\n const dataReceivedArray = dataReceived && Array.from(dataReceived as Uint8Array);\n\n this.logger\n .withMetadata({\n commandType,\n dataChunks,\n dataExpected,\n dataReceived: dataReceivedArray,\n dataSent: dataSentArray,\n description,\n duration,\n endTime,\n operation,\n startTime,\n stepIndex,\n success: true,\n totalSteps,\n })\n .info('Command completed successfully');\n }\n\n // eslint-disable-next-line max-params\n logCommandFailure(stepIndex: number, totalSteps: number, operation: string, step: UIProtocolStep, error: Error, context: ProtocolContext): void {\n const commandId = `${operation}-${stepIndex}`;\n const startTime = this.commandStartTimes.get(commandId) || Date.now();\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n const commandType = this.getCommandType(step);\n const description = this.getStepDescription(step);\n\n const dataSent = context.variables && context.variables.get('lastSentData');\n const dataExpected = this.getExpectedData(step);\n\n // eslint-disable-next-line unicorn/prefer-spread\n const dataSentArray = dataSent && Array.from(dataSent as Uint8Array);\n\n this.logger\n .withMetadata({\n commandType,\n dataExpected,\n dataSent: dataSentArray,\n description,\n duration,\n endTime,\n error: error.message,\n operation,\n startTime,\n stepIndex,\n success: false,\n totalSteps,\n })\n .info('Command failed');\n }\n\n private getCommandType(step: UIProtocolStep): string {\n if ('read' in step) {\n return 'read';\n }\n if ('write' in step) {\n return 'write';\n }\n if ('send' in step || 'expect' in step) {\n return 'exchange';\n }\n return 'unknown';\n }\n\n private getStepDescription(step: UIProtocolStep): string {\n if (hasDescription(step)) {\n return step.description;\n }\n return 'No description';\n }\n\n private getExpectedData(step: UIProtocolStep): unknown {\n if ('read' in step && typeof step.read === 'object' && step.read !== null && 'expect' in step.read) {\n const read = step.read as { expect: unknown; ack?: { expect?: unknown } };\n return {\n expect: read.expect,\n ack: read.ack?.expect,\n };\n }\n if ('write' in step && typeof step.write === 'object' && step.write !== null && 'expect' in step.write) {\n return (step.write as { expect: unknown }).expect;\n }\n if ('expect' in step) {\n return step.expect;\n }\n return {};\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@springfield/ham-radio-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"author": "Bryan Hunt",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"readme": "README.md",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"prepare": "husky"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@springfield/ham-radio-api": "^
|
|
31
|
+
"@springfield/ham-radio-api": "^17.0.0",
|
|
32
32
|
"ajv": "^8.20.0",
|
|
33
33
|
"ajv-formats": "^3.0.1",
|
|
34
34
|
"fishery": "^2.4.0",
|
package/src/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './utils/band-plan.js';
|
|
|
7
7
|
export * from './utils/frequency-display.js';
|
|
8
8
|
export * from './utils/memory-channel-utils.js';
|
|
9
9
|
export * from './utils/memory-data-utils.js';
|
|
10
|
+
export * from './utils/operator-class-mapper.js';
|
|
10
11
|
export * from './utils/schema-validator.js';
|
|
11
12
|
export * from './utils/to-hex-words.js';
|
|
12
13
|
export * from './utils/ui-logger.js';
|