UNPKG

sterfive-bonjour-service

Version:

A Bonjour/Zeroconf implementation in TypeScript

79 lines (74 loc) 1.88 kB
/** * Provide ServiceType */ export interface ServiceType { name?: string protocol?: 'tcp' | 'udp' | string | null | undefined subtypes?: Array<string> } /** * Provides underscore prefix to name * @param name * @returns */ const Prefix = (name: string): string => { return '_' + name } /** * Check if key is allowed * @param key * @returns */ const AllowedProp = (key: string): boolean => { let keys: Array<string> = ['name', 'protocol', 'subtypes'] return keys.includes(key) } /** * Format input ServiceType to string * @param data * @returns */ export const toString = (data: ServiceType): string => { // Format to correct order let formatted: ServiceType = { name: data.name, protocol: data.protocol, subtypes: data.subtypes } // Output as entries array let entries: Array<[string, string[] | string]> = Object.entries(formatted) return entries .filter(([key, val]) => AllowedProp(key) && val !== undefined) .reduce((prev, [key, val]) => { switch (typeof val) { case 'object': val.map((i: string) => prev.push(Prefix(i))) break default: prev.push(Prefix(val)) break } return prev }, [] as string[]) .join('.') } /** * Format input string to ServiceType * @param string * @returns */ export const toType = (string: string): ServiceType => { // Split string into parts by dot const parts: Array<string> = string.split('.') // Remove the prefix for (let i in parts) { if (parts[i][0] !== '_') continue parts[i] = parts[i].slice(1) } // Format the output return { name: parts.shift(), protocol: parts.shift() || null, subtypes: parts } }