mpc-js
Version:
A javascript client library for the Music Player Daemon
70 lines (59 loc) • 2.52 kB
text/typescript
import type { MPDError, MPDInitialResponse, MPDResponse } from "./protocol.js";
export function getOptionalNumber(valueMap: Map<string, string>, key: string): number | undefined {
return valueMap.has(key) ? Number(valueMap.get(key)) : undefined;
}
export function getOptionalDate(valueMap: Map<string, string>, key: string): Date | undefined {
return valueMap.has(key) ? new Date(valueMap.get(key)!) : undefined;
}
export function getOptionalBoolean(valueMap: Map<string, string>, key: string): boolean | undefined {
return valueMap.has(key) ? Boolean(Number(valueMap.get(key))) : undefined;
}
export function parseOptionalNumber(num: string | undefined): number | undefined {
return (num !== undefined) ? Number(num) : undefined;
}
export function isInitialResponse(response: MPDInitialResponse | MPDResponse | MPDError): response is MPDInitialResponse {
return 'version' in response;
}
export function isError(response: MPDInitialResponse | MPDResponse | MPDError): response is MPDError {
return 'errorMessage' in response;
}
/**
* Helper function for parsing a response from the daemon into an array of objects
* @param lines The daemon response
* @param markers Markers are keys denoting the start of a new object within the response
* @param convert Converts a key-value Map from the response into the desired target object
*/
export function parse<T>(lines: string[], markers: string[], convert: (valueMap: Map<string, string>) => T): T[] {
const result = new Array<T>();
let currentValueMap = new Map<string, string>();
let lineCount = 0;
lines.forEach(line => {
const colonIndex = line.indexOf(':');
if (colonIndex > 0) {
const key = line.substring(0, colonIndex);
const value = line.substring(colonIndex + 2);
if ((lineCount > 0) && markers.some(marker => (marker == key))) {
result.push(convert(currentValueMap));
currentValueMap = new Map<string, string>();
}
if (currentValueMap.has(key)) {
const multiValue = [currentValueMap.get(key), value].join(';');
currentValueMap.set(key, multiValue);
}
else {
currentValueMap.set(key, value);
}
lineCount++;
}
});
if (lineCount > 0) {
result.push(convert(currentValueMap));
}
return result;
}
export function concatUint8Arrays(src1: Uint8Array, src2: Uint8Array): Uint8Array {
const result = new Uint8Array(src1.length + src2.length);
result.set(src1, 0);
result.set(src2, src1.length);
return result;
}