@basmilius/apple-common 0.9.2 → 0.9.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.
- package/dist/index.d.mts +1 -2
- package/dist/index.mjs +1 -2
- package/package.json +3 -3
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -401,5 +401,4 @@ interface AudioSource {
|
|
|
401
401
|
stop(): Promise<void>;
|
|
402
402
|
}
|
|
403
403
|
//#endregion
|
|
404
|
-
export { AIRPLAY_SERVICE, AIRPLAY_TRANSIENT_PIN, type AccessoryCredentials, type AccessoryKeys, AccessoryPair, AccessoryVerify, type AirPlayFeatureFlagName, AirPlayFeatureFlags, type AudioSource, COMPANION_LINK_SERVICE, type CombinedDiscoveryResult, Connection, type ConnectionState, Context, Discovery, type DiscoveryResult, ENCRYPTION, EncryptionAwareConnection, EncryptionState, type EventMap, HTTP_TIMEOUT, JsonStorage, type Logger, type MdnsService, MemoryStorage, type PairingRequirement, type ProtocolType, RAOP_SERVICE, type Reporter, Storage, type StorageData, type StoredDevice, TimingServer, describeFlags, generateActiveRemoteId, generateDacpId, generateSessionId, getLocalIP, getMacAddress, getPairingRequirement, getProtocolVersion, hasFeatureFlag, isPasswordRequired, isRemoteControlSupported, multicast as mdnsMulticast, unicast as mdnsUnicast, parseFeatures, prompt, randomInt32, randomInt64, reporter, uint16ToBE, uint53ToLE, v4 as uuid, waitFor };
|
|
405
|
-
//# sourceMappingURL=index.d.mts.map
|
|
404
|
+
export { AIRPLAY_SERVICE, AIRPLAY_TRANSIENT_PIN, type AccessoryCredentials, type AccessoryKeys, AccessoryPair, AccessoryVerify, type AirPlayFeatureFlagName, AirPlayFeatureFlags, type AudioSource, COMPANION_LINK_SERVICE, type CombinedDiscoveryResult, Connection, type ConnectionState, Context, Discovery, type DiscoveryResult, ENCRYPTION, EncryptionAwareConnection, EncryptionState, type EventMap, HTTP_TIMEOUT, JsonStorage, type Logger, type MdnsService, MemoryStorage, type PairingRequirement, type ProtocolType, RAOP_SERVICE, type Reporter, Storage, type StorageData, type StoredDevice, TimingServer, describeFlags, generateActiveRemoteId, generateDacpId, generateSessionId, getLocalIP, getMacAddress, getPairingRequirement, getProtocolVersion, hasFeatureFlag, isPasswordRequired, isRemoteControlSupported, multicast as mdnsMulticast, unicast as mdnsUnicast, parseFeatures, prompt, randomInt32, randomInt64, reporter, uint16ToBE, uint53ToLE, v4 as uuid, waitFor };
|
package/dist/index.mjs
CHANGED
|
@@ -1475,5 +1475,4 @@ function splitUInt53(number) {
|
|
|
1475
1475
|
}
|
|
1476
1476
|
|
|
1477
1477
|
//#endregion
|
|
1478
|
-
export { AIRPLAY_SERVICE, AIRPLAY_TRANSIENT_PIN, AccessoryPair, AccessoryVerify, AirPlayFeatureFlags, COMPANION_LINK_SERVICE, Connection, Context, Discovery, ENCRYPTION, EncryptionAwareConnection, EncryptionState, HTTP_TIMEOUT, JsonStorage, MemoryStorage, RAOP_SERVICE, Storage, TimingServer, describeFlags, generateActiveRemoteId, generateDacpId, generateSessionId, getLocalIP, getMacAddress, getPairingRequirement, getProtocolVersion, hasFeatureFlag, isPasswordRequired, isRemoteControlSupported, multicast as mdnsMulticast, unicast as mdnsUnicast, parseFeatures, prompt, randomInt32, randomInt64, reporter, uint16ToBE, uint53ToLE, v4 as uuid, waitFor };
|
|
1479
|
-
//# sourceMappingURL=index.mjs.map
|
|
1478
|
+
export { AIRPLAY_SERVICE, AIRPLAY_TRANSIENT_PIN, AccessoryPair, AccessoryVerify, AirPlayFeatureFlags, COMPANION_LINK_SERVICE, Connection, Context, Discovery, ENCRYPTION, EncryptionAwareConnection, EncryptionState, HTTP_TIMEOUT, JsonStorage, MemoryStorage, RAOP_SERVICE, Storage, TimingServer, describeFlags, generateActiveRemoteId, generateDacpId, generateSessionId, getLocalIP, getMacAddress, getPairingRequirement, getProtocolVersion, hasFeatureFlag, isPasswordRequired, isRemoteControlSupported, multicast as mdnsMulticast, unicast as mdnsUnicast, parseFeatures, prompt, randomInt32, randomInt64, reporter, uint16ToBE, uint53ToLE, v4 as uuid, waitFor };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basmilius/apple-common",
|
|
3
3
|
"description": "Common features shared across various apple protocol packages.",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": {
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@basmilius/apple-encoding": "0.9.
|
|
49
|
-
"@basmilius/apple-encryption": "0.9.
|
|
48
|
+
"@basmilius/apple-encoding": "0.9.3",
|
|
49
|
+
"@basmilius/apple-encryption": "0.9.3",
|
|
50
50
|
"fast-srp-hap": "^2.0.4"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
package/dist/index.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":["UUIDTypes","TBuf","Uint8Array","Version1Options","node","clockseq","random","rng","msecs","nsecs","_v6","Version4Options","Version6Options","Version7Options","seq","Version4Options","v4","options","buf","offset","TBuf","Uint8Array","default","AirPlayFeatureFlags","SupportsAirPlayVideoV1","SupportsAirPlayPhoto","SupportsAirPlayVideoFairPlay","SupportsAirPlayVideoVolumeControl","SupportsAirPlayVideoHTTPLiveStreams","SupportsAirPlaySlideShow","SupportsAirPlayScreen","SupportsAirPlayAudio","AudioRedundant","Authentication_4","MetadataFeatures_0","MetadataFeatures_1","MetadataFeatures_2","AudioFormats_0","AudioFormats_1","AudioFormats_2","AudioFormats_3","Authentication_1","Authentication_8","SupportsLegacyPairing","HasUnifiedAdvertiserInfo","IsCarPlay","SupportsAirPlayVideoPlayQueue","SupportsAirPlayFromCloud","SupportsTLS_PSK","SupportsUnifiedMediaControl","SupportsBufferedAudio","SupportsPTP","SupportsScreenMultiCodec","SupportsSystemPairing","IsAPValeriaScreenSender","SupportsHKPairingAndAccessControl","SupportsCoreUtilsPairingAndEncryption","SupportsAirPlayVideoV2","MetadataFeatures_3","SupportsUnifiedPairSetupAndMFi","SupportsSetPeersExtendedMessage","SupportsAPSync","SupportsWoL","SupportsWoL2","SupportsHangdogRemoteControl","SupportsAudioStreamConnectionSetup","SupportsAudioMetadataControl","SupportsRFC2198Redundancy","AirPlayFeatureFlagName","PairingRequirement","parseFeatures","features","hasFeatureFlag","flag","describeFlags","getProtocolVersion","Record","txt","getPairingRequirement","isPasswordRequired","isRemoteControlSupported","DebugGroup","Logger","private","id","label","constructor","debug","data","error","info","net","raw","warn","Reporter","all","disable","group","enable","isEnabled","reporter","Logger","Context","private","deviceId","logger","constructor","Context","BasePairing","Buffer","Map","private","context","constructor","tlv","buffer","AccessoryPair","RequestHandler","Promise","AccessoryCredentials","AccessoryKeys","PairM1","PairM2","PairM3","PairM4","PairM5","requestHandler","start","pin","askPin","transient","m1","additionalTlv","m2","m3","m4","m5","m6","AccessoryVerify","credentials","step","data","publicKey","salt","proof","serverProof","sharedSecret","authTag","sessionKey","accessoryIdentifier","accessoryLongTermPublicKey","pairingId","secretKey","accessoryToControllerKey","controllerToAccessoryKey","AccessoryCredentials","ProtocolType","StoredDevice","identifier","name","StorageData","Record","SerializedCredentials","version","devices","credentials","accessoryIdentifier","accessoryLongTermPublicKey","pairingId","publicKey","secretKey","Storage","Promise","private","data","load","save","setData","getDevice","setDevice","device","removeDevice","listDevices","getCredentials","deviceId","protocol","setCredentials","removeCredentials","JsonStorage","constructor","path","MemoryStorage","ConnectionState","EventMap","Record","DnsRecordClass","DnsRecordType","DnsRecordBase","name","type","class","flash","ttl","DnsRecordA","rdata","DnsRecordAAAA","DnsRecordPTR","DnsRecordTXT","Buffer","rdata_buffer","DnsRecordSRV","priority","weight","port","target","DnsRecordNSEC","DnsRecord","DnsPacketHeader","id","qr","op","aa","tc","rd","ra","z","ad","cd","rc","questions","answers","authorities","additionals","DnsPacket","address","header","Result","fqdn","modelName","familyName","service","protocol","packet","key","DiscoveryResult","txt","features","CombinedDiscoveryResult","airplay","companionLink","raop","CombinedDiscoveryResult","DiscoveryResult","Discovery","Promise","private","constructor","service","find","useCache","findUntil","id","tries","timeout","clearCache","wake","address","discoverAll","airplay","companionLink","raop","MdnsService","Record","name","type","address","port","properties","DnsHeader","id","flags","qdcount","ancount","nscount","arcount","DnsResource","qname","qtype","qclass","ttl","rdata","createQueryPackets","Buffer","services","unicastResponse","decodeDnsResponse","buf","header","answers","resources","unicast","Promise","hosts","timeout","multicast","prompt","Promise","message","waitFor","ms","ENCRYPTION","EventEmitter","Context","ENCRYPTION","ConnectionState","EventMap","ConnectionEventMap","Buffer","Error","close","hadError","connect","data","end","error","err","timeout","Connection","TEventMap","Promise","Uint8Array","private","address","context","port","isConnected","state","constructor","destroy","disconnect","debug","enabled","retry","attempts","interval","write","EncryptionAwareConnection","EncryptionState","isEncrypted","enableEncryption","readKey","writeKey","readCount","writeCount","AIRPLAY_TRANSIENT_PIN","HTTP_TIMEOUT","SOCKET_TIMEOUT","AIRPLAY_SERVICE","COMPANION_LINK_SERVICE","RAOP_SERVICE","TimingServer","Promise","private","port","constructor","close","listen","generateActiveRemoteId","generateDacpId","generateSessionId","getLocalIP","getMacAddress","randomInt32","randomInt64","uint16ToBE","Buffer","value","uint53ToLE","AudioSource","Buffer","Promise","duration","readFrames","count","reset","start","stop"],"sources":["../../../node_modules/.bun/uuid@13.0.0/node_modules/uuid/dist/types.d.ts","../../../node_modules/.bun/uuid@13.0.0/node_modules/uuid/dist/v4.d.ts","../src/airplayFeatures.d.ts","../src/reporter.d.ts","../src/context.d.ts","../src/pairing.d.ts","../src/storage.d.ts","../src/types.d.ts","../src/discovery.d.ts","../src/mdns.d.ts","../src/cli.d.ts","../src/symbols.d.ts","../src/connection.d.ts","../src/const.d.ts","../src/timing.d.ts","../src/utils.d.ts","../src/audioSource.d.ts"],"x_google_ignoreList":[0,1],"mappings":"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"}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["native","#data","#path","#ptrMap","#srvMap","#txtMap","#addressMap","WAKE_PORTS","#cache","#service","#address","#context","#port","#state","#socket","#retryEnabled","#retryAttempt","#attemptConnect","#retryTimeout","#cleanup","#debug","#retryAttempts","#retryInterval","#connectPromise","#onClose","#onConnect","#onData","#onEnd","#onError","#onTimeout","#scheduleRetry","#id","#label","#enabled","#deviceId","#logger","#context","#name","#pairingId","#requestHandler","uuid","#publicKey","#secretKey","#srp","#ephemeralKeyPair","#m1","#m2","#m3","#m4","#port","#logger","#socket","#onConnect","#onError","#onMessage","#onListening"],"sources":["../../../node_modules/.bun/uuid@13.0.0/node_modules/uuid/dist-node/stringify.js","../../../node_modules/.bun/uuid@13.0.0/node_modules/uuid/dist-node/rng.js","../../../node_modules/.bun/uuid@13.0.0/node_modules/uuid/dist-node/native.js","../../../node_modules/.bun/uuid@13.0.0/node_modules/uuid/dist-node/v4.js","../src/airplayFeatures.ts","../src/storage.ts","../src/cli.ts","../src/const.ts","../src/mdns.ts","../src/discovery.ts","../src/symbols.ts","../src/connection.ts","../src/reporter.ts","../src/context.ts","../src/pairing.ts","../src/timing.ts","../src/utils.ts"],"sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","import { randomFillSync } from 'node:crypto';\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nexport default function rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n randomFillSync(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\n","import { randomUUID } from 'node:crypto';\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","export const AirPlayFeatureFlags = {\n SupportsAirPlayVideoV1: 1n << 0n,\n SupportsAirPlayPhoto: 1n << 1n,\n SupportsAirPlayVideoFairPlay: 1n << 2n,\n SupportsAirPlayVideoVolumeControl: 1n << 3n,\n SupportsAirPlayVideoHTTPLiveStreams: 1n << 4n,\n SupportsAirPlaySlideShow: 1n << 5n,\n SupportsAirPlayScreen: 1n << 7n,\n SupportsAirPlayAudio: 1n << 9n,\n AudioRedundant: 1n << 11n,\n Authentication_4: 1n << 14n,\n MetadataFeatures_0: 1n << 15n,\n MetadataFeatures_1: 1n << 16n,\n MetadataFeatures_2: 1n << 17n,\n AudioFormats_0: 1n << 18n,\n AudioFormats_1: 1n << 19n,\n AudioFormats_2: 1n << 20n,\n AudioFormats_3: 1n << 21n,\n Authentication_1: 1n << 23n,\n Authentication_8: 1n << 26n,\n SupportsLegacyPairing: 1n << 27n,\n HasUnifiedAdvertiserInfo: 1n << 30n,\n IsCarPlay: 1n << 32n,\n SupportsAirPlayVideoPlayQueue: 1n << 33n,\n SupportsAirPlayFromCloud: 1n << 34n,\n SupportsTLS_PSK: 1n << 35n,\n SupportsUnifiedMediaControl: 1n << 38n,\n SupportsBufferedAudio: 1n << 40n,\n SupportsPTP: 1n << 41n,\n SupportsScreenMultiCodec: 1n << 42n,\n SupportsSystemPairing: 1n << 43n,\n IsAPValeriaScreenSender: 1n << 44n,\n SupportsHKPairingAndAccessControl: 1n << 46n,\n SupportsCoreUtilsPairingAndEncryption: 1n << 48n,\n SupportsAirPlayVideoV2: 1n << 49n,\n MetadataFeatures_3: 1n << 50n,\n SupportsUnifiedPairSetupAndMFi: 1n << 51n,\n SupportsSetPeersExtendedMessage: 1n << 52n,\n SupportsAPSync: 1n << 54n,\n SupportsWoL: 1n << 55n,\n SupportsWoL2: 1n << 56n,\n SupportsHangdogRemoteControl: 1n << 58n,\n SupportsAudioStreamConnectionSetup: 1n << 59n,\n SupportsAudioMetadataControl: 1n << 60n,\n SupportsRFC2198Redundancy: 1n << 61n\n} as const;\n\nexport type AirPlayFeatureFlagName = keyof typeof AirPlayFeatureFlags;\n\nexport type PairingRequirement = 'none' | 'pin' | 'transient' | 'homekit';\n\nconst PASSWORD_BIT = 0x80n;\nconst LEGACY_PAIRING_BIT = 0x200n;\nconst PIN_REQUIRED_BIT = 0x8n;\n\nexport const parseFeatures = (features: string): bigint => {\n const parts = features.split(',').map(part => part.trim());\n\n if (parts.length === 1) {\n return BigInt(parts[0]);\n }\n\n if (parts.length === 2) {\n const low = BigInt(parts[0]);\n const high = BigInt(parts[1]);\n\n return (high << 32n) | low;\n }\n\n throw new Error(`Invalid features format: ${features}`);\n};\n\nexport const hasFeatureFlag = (features: bigint, flag: bigint): boolean =>\n (features & flag) !== 0n;\n\nexport const describeFlags = (features: bigint): AirPlayFeatureFlagName[] => {\n const result: AirPlayFeatureFlagName[] = [];\n\n for (const [name, flag] of Object.entries(AirPlayFeatureFlags)) {\n if (hasFeatureFlag(features, flag)) {\n result.push(name as AirPlayFeatureFlagName);\n }\n }\n\n return result;\n};\n\nexport const getProtocolVersion = (txt: Record<string, string>): 1 | 2 => {\n const featuresStr = txt.features ?? txt.ft;\n\n if (!featuresStr) {\n return 1;\n }\n\n const features = parseFeatures(featuresStr);\n\n if (hasFeatureFlag(features, AirPlayFeatureFlags.SupportsUnifiedMediaControl)) {\n return 2;\n }\n\n if (hasFeatureFlag(features, AirPlayFeatureFlags.SupportsCoreUtilsPairingAndEncryption)) {\n return 2;\n }\n\n return 1;\n};\n\nexport const getPairingRequirement = (txt: Record<string, string>): PairingRequirement => {\n const featuresStr = txt.features ?? txt.ft;\n\n if (!featuresStr) {\n return 'none';\n }\n\n const features = parseFeatures(featuresStr);\n const sf = txt.sf ? BigInt(txt.sf) : 0n;\n\n if (hasFeatureFlag(features, AirPlayFeatureFlags.SupportsHKPairingAndAccessControl)) {\n return 'homekit';\n }\n\n if ((sf & PIN_REQUIRED_BIT) !== 0n) {\n return 'pin';\n }\n\n if (hasFeatureFlag(features, AirPlayFeatureFlags.SupportsSystemPairing)) {\n return 'transient';\n }\n\n if ((sf & LEGACY_PAIRING_BIT) !== 0n) {\n return 'pin';\n }\n\n return 'none';\n};\n\nexport const isPasswordRequired = (txt: Record<string, string>): boolean => {\n if (txt.pw === 'true') {\n return true;\n }\n\n const sf = txt.sf ? BigInt(txt.sf) : 0n;\n\n return (sf & PASSWORD_BIT) !== 0n;\n};\n\nexport const isRemoteControlSupported = (txt: Record<string, string>): boolean => {\n const featuresStr = txt.features ?? txt.ft;\n\n if (!featuresStr) {\n return false;\n }\n\n const features = parseFeatures(featuresStr);\n\n return hasFeatureFlag(features, AirPlayFeatureFlags.SupportsHangdogRemoteControl);\n};\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { type AccessoryCredentials } from './pairing';\n\nexport type ProtocolType = 'airplay' | 'companionLink' | 'raop';\n\nexport type StoredDevice = {\n readonly identifier: string;\n readonly name: string;\n};\n\nexport type StorageData = {\n version: 1;\n devices: Record<string, StoredDevice>;\n credentials: Record<string, SerializedCredentials>;\n};\n\ntype SerializedCredentials = {\n readonly accessoryIdentifier: string;\n readonly accessoryLongTermPublicKey: string;\n readonly pairingId: string;\n readonly publicKey: string;\n readonly secretKey: string;\n};\n\nconst credentialKey = (deviceId: string, protocol: ProtocolType): string =>\n `${deviceId}:${protocol}`;\n\nconst serializeCredentials = (credentials: AccessoryCredentials): SerializedCredentials => ({\n accessoryIdentifier: credentials.accessoryIdentifier,\n accessoryLongTermPublicKey: credentials.accessoryLongTermPublicKey.toString('base64'),\n pairingId: credentials.pairingId.toString('base64'),\n publicKey: credentials.publicKey.toString('base64'),\n secretKey: credentials.secretKey.toString('base64')\n});\n\nconst deserializeCredentials = (stored: SerializedCredentials): AccessoryCredentials => ({\n accessoryIdentifier: stored.accessoryIdentifier,\n accessoryLongTermPublicKey: Buffer.from(stored.accessoryLongTermPublicKey, 'base64'),\n pairingId: Buffer.from(stored.pairingId, 'base64'),\n publicKey: Buffer.from(stored.publicKey, 'base64'),\n secretKey: Buffer.from(stored.secretKey, 'base64')\n});\n\nconst createEmptyData = (): StorageData => ({\n version: 1,\n devices: {},\n credentials: {}\n});\n\nexport abstract class Storage {\n #data: StorageData = createEmptyData();\n\n get data(): StorageData {\n return this.#data;\n }\n\n abstract load(): Promise<void>;\n\n abstract save(): Promise<void>;\n\n protected setData(data: StorageData): void {\n this.#data = data;\n }\n\n getDevice(identifier: string): StoredDevice | undefined {\n return this.#data.devices[identifier];\n }\n\n setDevice(identifier: string, device: StoredDevice): void {\n this.#data.devices[identifier] = device;\n }\n\n removeDevice(identifier: string): void {\n delete this.#data.devices[identifier];\n\n for (const key of Object.keys(this.#data.credentials)) {\n if (key.startsWith(`${identifier}:`)) {\n delete this.#data.credentials[key];\n }\n }\n }\n\n listDevices(): StoredDevice[] {\n return Object.values(this.#data.devices);\n }\n\n getCredentials(deviceId: string, protocol: ProtocolType): AccessoryCredentials | undefined {\n const stored = this.#data.credentials[credentialKey(deviceId, protocol)];\n\n if (!stored) {\n return undefined;\n }\n\n return deserializeCredentials(stored);\n }\n\n setCredentials(deviceId: string, protocol: ProtocolType, credentials: AccessoryCredentials): void {\n this.#data.credentials[credentialKey(deviceId, protocol)] = serializeCredentials(credentials);\n }\n\n removeCredentials(deviceId: string, protocol: ProtocolType): void {\n delete this.#data.credentials[credentialKey(deviceId, protocol)];\n }\n}\n\nexport class JsonStorage extends Storage {\n readonly #path: string;\n\n constructor(path?: string) {\n super();\n\n this.#path = path ?? join(process.env.HOME ?? process.env.USERPROFILE ?? '.', '.config', 'apple-protocols', 'storage.json');\n }\n\n async load(): Promise<void> {\n if (!existsSync(this.#path)) {\n return;\n }\n\n const raw = readFileSync(this.#path, 'utf-8');\n const json = JSON.parse(raw);\n\n if (json.version === 1) {\n this.setData(json);\n }\n }\n\n async save(): Promise<void> {\n mkdirSync(dirname(this.#path), { recursive: true });\n writeFileSync(this.#path, JSON.stringify(this.data, null, 2), 'utf-8');\n }\n}\n\nexport class MemoryStorage extends Storage {\n async load(): Promise<void> {}\n\n async save(): Promise<void> {}\n}\n","import { createInterface } from 'node:readline';\n\nexport async function prompt(message: string): Promise<string> {\n const cli = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n const answer = await new Promise<string>(resolve => cli.question(`${message}: `, resolve));\n\n cli.close();\n\n return answer;\n}\n\nexport async function waitFor(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","export const AIRPLAY_TRANSIENT_PIN = '3939';\n\nexport const HTTP_TIMEOUT = 6000;\nexport const SOCKET_TIMEOUT = 10000;\n\nexport const AIRPLAY_SERVICE = '_airplay._tcp.local';\nexport const COMPANION_LINK_SERVICE = '_companion-link._tcp.local';\nexport const RAOP_SERVICE = '_raop._tcp.local';\n","import { createSocket, type Socket as UdpSocket } from 'node:dgram';\nimport { createConnection } from 'node:net';\n\nconst MDNS_ADDRESS = '224.0.0.251';\nconst MDNS_PORT = 5353;\nconst QUERY_ID = 0x35FF;\nconst QUERY_FLAGS = 0x0120;\nconst SERVICES_PER_MSG = 3;\n\nconst QueryType = {\n A: 0x01,\n PTR: 0x0C,\n TXT: 0x10,\n AAAA: 0x1C,\n SRV: 0x21,\n ANY: 0xFF\n} as const;\n\nexport type MdnsService = {\n readonly name: string;\n readonly type: string;\n readonly address: string;\n readonly port: number;\n readonly properties: Record<string, string>;\n};\n\ntype DnsHeader = {\n id: number;\n flags: number;\n qdcount: number;\n ancount: number;\n nscount: number;\n arcount: number;\n};\n\ntype DnsResource = {\n qname: string;\n qtype: number;\n qclass: number;\n ttl: number;\n rdata: unknown;\n};\n\ntype SrvRecord = {\n priority: number;\n weight: number;\n port: number;\n target: string;\n};\n\n// --- DNS Packet Encoding ---\n\nconst encodeQName = (name: string): Buffer => {\n const parts = [];\n const labels = splitServiceName(name);\n\n for (const label of labels) {\n const encoded = Buffer.from(label, 'utf-8');\n\n if (encoded.byteLength > 63) {\n parts.push(Buffer.from([63]), encoded.subarray(0, 63));\n } else {\n parts.push(Buffer.from([encoded.byteLength]), encoded);\n }\n }\n\n parts.push(Buffer.from([0x00]));\n\n return Buffer.concat(parts);\n};\n\nconst splitServiceName = (name: string): string[] => {\n // Handle service instance names like \"Living Room._airplay._tcp.local\"\n // The instance name can contain dots, so we need to find the service type part\n const servicePattern = /\\._[a-z]+\\._(?:tcp|udp)\\.local$/;\n const match = name.match(servicePattern);\n\n if (match) {\n const instanceName = name.substring(0, match.index);\n const servicePart = match[0].substring(1); // remove leading dot\n\n return [instanceName, ...servicePart.split('.')];\n }\n\n return name.split('.');\n};\n\nconst encodeDnsHeader = (header: DnsHeader): Buffer => {\n const buf = Buffer.allocUnsafe(12);\n buf.writeUInt16BE(header.id, 0);\n buf.writeUInt16BE(header.flags, 2);\n buf.writeUInt16BE(header.qdcount, 4);\n buf.writeUInt16BE(header.ancount, 6);\n buf.writeUInt16BE(header.nscount, 8);\n buf.writeUInt16BE(header.arcount, 10);\n\n return buf;\n};\n\nconst encodeDnsQuestion = (name: string, qtype: number, unicastResponse: boolean = false): Buffer => {\n const qname = encodeQName(name);\n const suffix = Buffer.allocUnsafe(4);\n suffix.writeUInt16BE(qtype, 0);\n suffix.writeUInt16BE(unicastResponse ? 0x8001 : 0x0001, 2);\n\n return Buffer.concat([qname, suffix]);\n};\n\nexport const createQueryPackets = (services: string[], qtype: number = QueryType.PTR, unicastResponse: boolean = false): Buffer[] => {\n const packets: Buffer[] = [];\n\n for (let i = 0; i < services.length; i += SERVICES_PER_MSG) {\n const chunk = services.slice(i, i + SERVICES_PER_MSG);\n const questions = chunk.map(s => encodeDnsQuestion(s, qtype, unicastResponse));\n const header = encodeDnsHeader({\n id: QUERY_ID,\n flags: 0x0000,\n qdcount: chunk.length,\n ancount: 0,\n nscount: 0,\n arcount: 0\n });\n\n packets.push(Buffer.concat([header, ...questions]));\n }\n\n return packets;\n};\n\n// --- DNS Packet Decoding ---\n\nconst decodeQName = (buf: Buffer, offset: number): [string, number] => {\n const labels: string[] = [];\n let currentOffset = offset;\n let jumped = false;\n let returnOffset = offset;\n\n while (currentOffset < buf.byteLength) {\n const length = buf[currentOffset];\n\n if (length === 0) {\n if (!jumped) {\n returnOffset = currentOffset + 1;\n }\n\n break;\n }\n\n // Name compression pointer (upper 2 bits = 11)\n if ((length & 0xC0) === 0xC0) {\n const pointer = ((length & 0x3F) << 8) | buf[currentOffset + 1];\n\n if (!jumped) {\n returnOffset = currentOffset + 2;\n }\n\n currentOffset = pointer;\n jumped = true;\n continue;\n }\n\n currentOffset++;\n labels.push(buf.toString('utf-8', currentOffset, currentOffset + length));\n currentOffset += length;\n\n if (!jumped) {\n returnOffset = currentOffset;\n }\n }\n\n return [labels.join('.'), returnOffset];\n};\n\nconst decodeDnsHeader = (buf: Buffer): DnsHeader => ({\n id: buf.readUInt16BE(0),\n flags: buf.readUInt16BE(2),\n qdcount: buf.readUInt16BE(4),\n ancount: buf.readUInt16BE(6),\n nscount: buf.readUInt16BE(8),\n arcount: buf.readUInt16BE(10)\n});\n\nconst decodeQuestion = (buf: Buffer, offset: number): [{ qname: string; qtype: number; qclass: number }, number] => {\n const [qname, newOffset] = decodeQName(buf, offset);\n const qtype = buf.readUInt16BE(newOffset);\n const qclass = buf.readUInt16BE(newOffset + 2);\n\n return [{ qname, qtype, qclass }, newOffset + 4];\n};\n\nconst decodeTxtRecord = (buf: Buffer, offset: number, length: number): Record<string, string> => {\n const properties: Record<string, string> = {};\n let pos = offset;\n const end = offset + length;\n\n while (pos < end) {\n const strLen = buf[pos];\n pos++;\n\n if (strLen === 0 || pos + strLen > end) {\n break;\n }\n\n const str = buf.toString('utf-8', pos, pos + strLen);\n pos += strLen;\n\n const eqIndex = str.indexOf('=');\n\n if (eqIndex >= 0) {\n properties[str.substring(0, eqIndex)] = str.substring(eqIndex + 1);\n } else {\n properties[str] = '';\n }\n }\n\n return properties;\n};\n\nconst decodeSrvRecord = (buf: Buffer, offset: number): SrvRecord => {\n const priority = buf.readUInt16BE(offset);\n const weight = buf.readUInt16BE(offset + 2);\n const port = buf.readUInt16BE(offset + 4);\n const [target] = decodeQName(buf, offset + 6);\n\n return { priority, weight, port, target };\n};\n\nconst decodeResource = (buf: Buffer, offset: number): [DnsResource, number] => {\n const [qname, nameEnd] = decodeQName(buf, offset);\n const qtype = buf.readUInt16BE(nameEnd);\n const qclass = buf.readUInt16BE(nameEnd + 2);\n const ttl = buf.readUInt32BE(nameEnd + 4);\n const rdLength = buf.readUInt16BE(nameEnd + 8);\n const rdOffset = nameEnd + 10;\n\n let rdata: unknown;\n\n switch (qtype) {\n case QueryType.A:\n rdata = `${buf[rdOffset]}.${buf[rdOffset + 1]}.${buf[rdOffset + 2]}.${buf[rdOffset + 3]}`;\n break;\n\n case QueryType.AAAA: {\n const parts: string[] = [];\n\n for (let i = 0; i < 8; i++) {\n parts.push(buf.readUInt16BE(rdOffset + i * 2).toString(16));\n }\n\n rdata = parts.join(':');\n break;\n }\n\n case QueryType.PTR: {\n const [name] = decodeQName(buf, rdOffset);\n rdata = name;\n break;\n }\n\n case QueryType.SRV:\n rdata = decodeSrvRecord(buf, rdOffset);\n break;\n\n case QueryType.TXT:\n rdata = decodeTxtRecord(buf, rdOffset, rdLength);\n break;\n\n default:\n rdata = buf.subarray(rdOffset, rdOffset + rdLength);\n }\n\n return [{ qname, qtype, qclass, ttl, rdata }, rdOffset + rdLength];\n};\n\nexport const decodeDnsResponse = (buf: Buffer): { header: DnsHeader; answers: DnsResource[]; resources: DnsResource[] } => {\n const header = decodeDnsHeader(buf);\n let offset = 12;\n\n // Skip questions\n for (let i = 0; i < header.qdcount; i++) {\n const [, newOffset] = decodeQuestion(buf, offset);\n offset = newOffset;\n }\n\n // Parse answers\n const answers: DnsResource[] = [];\n\n for (let i = 0; i < header.ancount; i++) {\n const [record, newOffset] = decodeResource(buf, offset);\n answers.push(record);\n offset = newOffset;\n }\n\n // Skip authorities\n for (let i = 0; i < header.nscount; i++) {\n const [, newOffset] = decodeResource(buf, offset);\n offset = newOffset;\n }\n\n // Parse additional resources\n const resources: DnsResource[] = [];\n\n for (let i = 0; i < header.arcount; i++) {\n const [record, newOffset] = decodeResource(buf, offset);\n resources.push(record);\n offset = newOffset;\n }\n\n return { header, answers, resources };\n};\n\n// --- Service Collector (aggregates records across multiple responses) ---\n\nclass ServiceCollector {\n readonly #ptrMap = new Map<string, Set<string>>();\n readonly #srvMap = new Map<string, SrvRecord>();\n readonly #txtMap = new Map<string, Record<string, string>>();\n readonly #addressMap = new Map<string, string>();\n\n addRecords(answers: DnsResource[], resources: DnsResource[]): void {\n for (const record of [...answers, ...resources]) {\n switch (record.qtype) {\n case QueryType.PTR: {\n const existing = this.#ptrMap.get(record.qname);\n\n if (existing) {\n existing.add(record.rdata as string);\n } else {\n this.#ptrMap.set(record.qname, new Set([record.rdata as string]));\n }\n\n break;\n }\n\n case QueryType.SRV:\n this.#srvMap.set(record.qname, record.rdata as SrvRecord);\n break;\n\n case QueryType.TXT:\n this.#txtMap.set(record.qname, record.rdata as Record<string, string>);\n break;\n\n case QueryType.A:\n this.#addressMap.set(record.qname, record.rdata as string);\n break;\n }\n }\n }\n\n get services(): MdnsService[] {\n const results: MdnsService[] = [];\n\n for (const [serviceType, instanceNames] of this.#ptrMap) {\n for (const instanceQName of instanceNames) {\n const srv = this.#srvMap.get(instanceQName);\n\n if (!srv || srv.port === 0) {\n continue;\n }\n\n const address = this.#addressMap.get(srv.target);\n\n if (!address) {\n continue;\n }\n\n const txt = this.#txtMap.get(instanceQName) ?? {};\n const typeIndex = instanceQName.indexOf('._');\n const name = typeIndex >= 0 ? instanceQName.substring(0, typeIndex) : instanceQName;\n\n if (!results.some(s => s.name === name && s.type === serviceType)) {\n results.push({ name, type: serviceType, address, port: srv.port, properties: txt });\n }\n }\n }\n\n return results;\n }\n}\n\n// --- Scanners ---\n\nconst WAKE_PORTS = [7000, 3689, 49152, 32498];\n\nconst knock = (address: string): Promise<void> => {\n const promises = WAKE_PORTS.map(port => new Promise<void>((resolve) => {\n const socket = createConnection({ host: address, port, timeout: 500 });\n socket.on('connect', () => { socket.destroy(); resolve(); });\n socket.on('error', () => { socket.destroy(); resolve(); });\n socket.on('timeout', () => { socket.destroy(); resolve(); });\n }));\n\n return Promise.all(promises).then(() => {});\n};\n\nexport const unicast = (hosts: string[], services: string[], timeout: number = 4): Promise<MdnsService[]> => {\n return new Promise((resolve) => {\n const queries = createQueryPackets(services);\n const collector = new ServiceCollector();\n const sockets: UdpSocket[] = [];\n let resolved = false;\n\n const finish = () => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n clearInterval(interval);\n\n for (const socket of sockets) {\n try {\n socket.close();\n } catch {}\n }\n\n resolve(collector.services);\n };\n\n for (const host of hosts) {\n const socket = createSocket('udp4');\n sockets.push(socket);\n\n socket.on('message', (data) => {\n try {\n const response = decodeDnsResponse(data);\n collector.addRecords(response.answers, response.resources);\n } catch {}\n });\n\n socket.on('error', () => {});\n }\n\n let interval: NodeJS.Timeout;\n\n // Wake devices first, then start querying\n Promise.all(hosts.map(h => knock(h))).then(() => {\n const sendQueries = () => {\n for (let i = 0; i < hosts.length; i++) {\n for (const query of queries) {\n sockets[i]?.send(query, MDNS_PORT, hosts[i]);\n }\n }\n };\n\n sendQueries();\n interval = setInterval(sendQueries, 1000);\n setTimeout(finish, timeout * 1000);\n });\n });\n};\n\nexport const multicast = (services: string[], timeout: number = 4): Promise<MdnsService[]> => {\n return new Promise((resolve) => {\n const collector = new ServiceCollector();\n const queries = createQueryPackets(services);\n const sockets: UdpSocket[] = [];\n let resolved = false;\n let interval: NodeJS.Timeout;\n\n const finish = () => {\n if (resolved) {\n return;\n }\n\n resolved = true;\n clearInterval(interval);\n\n for (const socket of sockets) {\n try {\n socket.close();\n } catch {}\n }\n\n resolve(collector.services);\n };\n\n const onMessage = (data: Buffer) => {\n try {\n const response = decodeDnsResponse(data);\n collector.addRecords(response.answers, response.resources);\n } catch {}\n };\n\n const addSocket = (address: string | null, port: number): Promise<UdpSocket | null> => {\n return new Promise((resolveSocket) => {\n const socket = createSocket({ type: 'udp4', reuseAddr: true });\n socket.on('message', onMessage);\n\n socket.on('error', () => {\n resolveSocket(null);\n });\n\n socket.bind(port, address ?? '', () => {\n if (address) {\n try {\n socket.setMulticastInterface(address);\n socket.addMembership(MDNS_ADDRESS, address);\n } catch {}\n } else {\n try {\n socket.addMembership(MDNS_ADDRESS);\n } catch {}\n }\n\n sockets.push(socket);\n resolveSocket(socket);\n });\n });\n };\n\n const getPrivateAddresses = (): string[] => {\n try {\n const { networkInterfaces } = require('node:os');\n const interfaces = networkInterfaces();\n const addresses: string[] = [];\n\n for (const nets of Object.values(interfaces)) {\n for (const net of (nets as any[])) {\n if (net.family === 'IPv4' && net.internal === false) {\n addresses.push(net.address);\n }\n }\n }\n\n return addresses;\n } catch {\n return [];\n }\n };\n\n const setup = async () => {\n // Socket on 0.0.0.0:5353 to receive multicast responses (may fail on Homey)\n await addSocket(null, MDNS_PORT);\n\n // One socket per local interface on random port, with multicast membership\n for (const address of getPrivateAddresses()) {\n await addSocket(address, 0);\n }\n\n if (sockets.length === 0) {\n resolve([]);\n return;\n }\n\n const sendQueries = () => {\n for (const socket of sockets) {\n for (const query of queries) {\n try {\n socket.send(query, MDNS_PORT, MDNS_ADDRESS);\n } catch {}\n }\n }\n };\n\n sendQueries();\n interval = setInterval(sendQueries, 1000);\n setTimeout(finish, timeout * 1000);\n };\n\n setup();\n });\n};\n","import { createConnection } from 'node:net';\nimport { parseFeatures } from './airplayFeatures';\nimport { waitFor } from './cli';\nimport { AIRPLAY_SERVICE, COMPANION_LINK_SERVICE, RAOP_SERVICE } from './const';\nimport { multicast, type MdnsService } from './mdns';\nimport type { CombinedDiscoveryResult, DiscoveryResult } from './types';\n\ntype CacheEntry = {\n results: DiscoveryResult[];\n expiresAt: number;\n};\n\nconst CACHE_TTL = 30_000;\nconst WAKE_PORTS = [7000, 3689, 49152, 32498];\n\nconst toDiscoveryResult = (service: MdnsService): DiscoveryResult => {\n const txt = service.properties;\n const featuresStr = txt.features ?? txt.ft;\n const model = txt.model ?? txt.am ?? '';\n const protocol = service.type.includes('._tcp') ? 'tcp' as const : 'udp' as const;\n\n const hostname = service.name.replace(/\\s+/g, '-');\n\n return {\n id: `${hostname}.local`,\n fqdn: `${hostname}.local`,\n address: service.address,\n modelName: model,\n familyName: null,\n txt,\n features: featuresStr ? tryParseFeatures(featuresStr) : undefined,\n service: {\n port: service.port,\n protocol,\n type: service.type\n },\n packet: null as any\n };\n};\n\nconst tryParseFeatures = (features: string): bigint | undefined => {\n try {\n return parseFeatures(features);\n } catch {\n return undefined;\n }\n};\n\nexport class Discovery {\n static #cache: Map<string, CacheEntry> = new Map();\n\n readonly #service: string;\n\n constructor(service: string) {\n this.#service = service;\n }\n\n async find(useCache: boolean = true): Promise<DiscoveryResult[]> {\n if (useCache) {\n const cached = Discovery.#cache.get(this.#service);\n\n if (cached && cached.expiresAt > Date.now()) {\n return cached.results;\n }\n }\n\n const services = await multicast([this.#service], 4);\n const mapped = services.map(toDiscoveryResult);\n\n Discovery.#cache.set(this.#service, {\n results: mapped,\n expiresAt: Date.now() + CACHE_TTL\n });\n\n return mapped;\n }\n\n async findUntil(id: string, tries: number = 10, timeout: number = 1000): Promise<DiscoveryResult> {\n while (tries > 0) {\n const devices = await this.find(false);\n const device = devices.find(device => device.id === id);\n\n if (device) {\n return device;\n }\n\n console.log();\n console.log(`Device not found, retrying in ${timeout}ms...`);\n console.log(devices.map(d => ` ● ${d.id} (${d.fqdn})`).join('\\n'));\n\n tries--;\n\n await waitFor(timeout);\n }\n\n throw new Error('Device not found after several tries, aborting.');\n }\n\n static clearCache(): void {\n Discovery.#cache.clear();\n }\n\n static async wake(address: string): Promise<void> {\n const promises = WAKE_PORTS.map(port => new Promise<void>((resolve) => {\n const socket = createConnection({ host: address, port, timeout: 500 });\n socket.on('connect', () => { socket.destroy(); resolve(); });\n socket.on('error', () => { socket.destroy(); resolve(); });\n socket.on('timeout', () => { socket.destroy(); resolve(); });\n }));\n\n await Promise.all(promises);\n }\n\n static async discoverAll(): Promise<CombinedDiscoveryResult[]> {\n const allServices = await multicast([AIRPLAY_SERVICE, COMPANION_LINK_SERVICE, RAOP_SERVICE], 4);\n const devices = new Map<string, CombinedDiscoveryResult>();\n\n for (const service of allServices) {\n const result = toDiscoveryResult(service);\n const existing = devices.get(result.id);\n\n if (existing) {\n if (service.type === AIRPLAY_SERVICE) {\n existing.airplay = result;\n } else if (service.type === COMPANION_LINK_SERVICE) {\n existing.companionLink = result;\n } else if (service.type === RAOP_SERVICE) {\n existing.raop = result;\n }\n } else {\n devices.set(result.id, {\n id: result.id,\n name: result.fqdn,\n address: result.address,\n airplay: service.type === AIRPLAY_SERVICE ? result : undefined,\n companionLink: service.type === COMPANION_LINK_SERVICE ? result : undefined,\n raop: service.type === RAOP_SERVICE ? result : undefined\n });\n }\n }\n\n return [...devices.values()];\n }\n\n static airplay(): Discovery {\n return new Discovery(AIRPLAY_SERVICE);\n }\n\n static companionLink(): Discovery {\n return new Discovery(COMPANION_LINK_SERVICE);\n }\n\n static raop(): Discovery {\n return new Discovery(RAOP_SERVICE);\n }\n}\n","export const ENCRYPTION: unique symbol = Symbol();\n","import { EventEmitter } from 'node:events';\nimport { Socket } from 'node:net';\nimport { SOCKET_TIMEOUT } from './const';\nimport type { Context } from './context';\nimport { ENCRYPTION } from './symbols';\nimport type { ConnectionState, EventMap } from './types';\n\nconst NOOP_PROMISE_HANDLER = {\n resolve: () => {\n },\n reject: (_: Error) => {\n }\n} as const;\n\ntype ConnectionEventMap = {\n close: [hadError: boolean];\n connect: [];\n data: [data: Buffer];\n end: [];\n error: [err: Error];\n timeout: [];\n};\n\nexport class Connection<TEventMap extends EventMap> extends EventEmitter<ConnectionEventMap | TEventMap> {\n get address(): string {\n return this.#address;\n }\n\n get context(): Context {\n return this.#context;\n }\n\n get port(): number {\n return this.#port;\n }\n\n get isConnected(): boolean {\n return this.#state === 'connected';\n }\n\n get state(): ConnectionState {\n if (this.#state === 'closing' || this.#state === 'failed') {\n return this.#state;\n }\n\n if (!this.#socket) {\n return 'disconnected';\n }\n\n switch (this.#socket.readyState) {\n case 'opening':\n return 'connecting';\n\n case 'open':\n return 'connected';\n\n default:\n return this.#state;\n }\n }\n\n readonly #address: string;\n readonly #port: number;\n readonly #context: Context;\n #debug: boolean = false;\n #retryAttempt: number = 0;\n #retryAttempts: number = 3;\n #retryEnabled: boolean = true;\n #retryInterval: number = 3000;\n #retryTimeout?: NodeJS.Timeout;\n #socket?: Socket;\n #state: ConnectionState;\n\n #connectPromise?: {\n resolve: () => void;\n reject: (err: Error) => void;\n };\n\n constructor(context: Context, address: string, port: number) {\n super();\n\n this.#address = address;\n this.#port = port;\n this.#context = context;\n\n this.#state = 'disconnected';\n }\n\n async connect(): Promise<void> {\n if (this.#state === 'connected') {\n return;\n }\n\n if (this.#state === 'connecting') {\n throw new Error('A connection is already being established.');\n }\n\n this.#retryEnabled = true;\n this.#retryAttempt = 0;\n\n return this.#attemptConnect();\n }\n\n destroy(): void {\n this.#socket?.destroy();\n }\n\n async disconnect(): Promise<void> {\n if (this.#retryTimeout) {\n clearTimeout(this.#retryTimeout);\n this.#retryTimeout = undefined;\n }\n\n this.#retryEnabled = false;\n\n if (!this.#socket || this.#state === 'disconnected') {\n return;\n }\n\n return new Promise(resolve => {\n this.#state = 'closing';\n this.#socket.once('close', () => {\n this.#cleanup();\n resolve();\n });\n this.#socket.end();\n });\n }\n\n debug(enabled: boolean): this {\n this.#debug = enabled;\n\n return this;\n }\n\n retry(attempts: number, interval: number = 3000): this {\n this.#retryAttempts = attempts;\n this.#retryInterval = interval;\n\n return this;\n }\n\n write(data: Buffer | Uint8Array): void {\n if (!this.#socket || this.state !== 'connected' || !this.#socket.writable) {\n this.emit('error', new Error('Cannot write to a disconnected connection.'));\n return;\n }\n\n this.#socket.write(data, err => {\n if (!err) {\n return;\n }\n\n this.#context.logger.error('Failed to write data to socket.');\n this.emit('error', err);\n });\n }\n\n async #attemptConnect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.#state = 'connecting';\n this.#connectPromise = {resolve, reject};\n\n this.#socket?.removeAllListeners();\n this.#socket = undefined;\n\n this.#socket = new Socket();\n this.#socket.setNoDelay(true);\n this.#socket.setTimeout(SOCKET_TIMEOUT);\n\n this.#socket.on('close', this.#onClose.bind(this));\n this.#socket.on('connect', this.#onConnect.bind(this));\n this.#socket.on('data', this.#onData.bind(this));\n this.#socket.on('end', this.#onEnd.bind(this));\n this.#socket.on('error', this.#onError.bind(this));\n this.#socket.on('timeout', this.#onTimeout.bind(this));\n\n this.#context.logger.net(`Connecting to ${this.#address}:${this.#port}...`);\n\n this.#socket.connect({\n host: this.#address,\n port: this.#port,\n keepAlive: true\n });\n });\n }\n\n #cleanup(): void {\n if (this.#retryTimeout) {\n clearTimeout(this.#retryTimeout);\n this.#retryTimeout = undefined;\n }\n\n if (this.#socket) {\n this.#socket.removeAllListeners();\n this.#socket.destroy();\n this.#socket = undefined;\n }\n\n this.#state = 'disconnected';\n this.#connectPromise = undefined;\n }\n\n #scheduleRetry(err: Error): void {\n if (!this.#retryEnabled || this.#retryAttempt >= this.#retryAttempts) {\n this.#state = 'failed';\n this.#connectPromise?.reject(err);\n this.#connectPromise = undefined;\n return;\n }\n\n if (this.#retryTimeout) {\n clearTimeout(this.#retryTimeout);\n this.#retryTimeout = undefined;\n }\n\n this.#retryAttempt++;\n this.#context.logger.net(`Retry attempt ${this.#retryAttempt} / ${this.#retryAttempts} in ${this.#retryInterval}ms...`);\n\n const {resolve, reject} = this.#connectPromise ?? NOOP_PROMISE_HANDLER;\n this.#cleanup();\n\n this.#retryTimeout = setTimeout(async () => {\n this.#retryTimeout = undefined;\n\n try {\n // Re-assign the stored handlers\n this.#connectPromise = {resolve, reject};\n await this.#attemptConnect();\n resolve();\n } catch (retryErr) {\n // Error handling is done in #onError/#onTimeout\n }\n }, this.#retryInterval);\n }\n\n #onClose(hadError: boolean): void {\n const wasConnected = this.#state === 'connected';\n\n if (this.#state !== 'closing') {\n this.#state = 'disconnected';\n this.#context.logger.net(`Connection closed (${hadError ? 'with error' : 'normally'}).`);\n }\n\n this.emit('close', hadError);\n\n if (wasConnected && this.#retryEnabled && hadError) {\n this.#scheduleRetry(new Error('Connection closed unexpectedly.'));\n }\n }\n\n #onConnect(): void {\n this.#state = 'connected';\n this.#retryAttempt = 0;\n\n this.#socket.setKeepAlive(true, 10000);\n this.#socket.setTimeout(0);\n\n this.emit('connect');\n this.#connectPromise?.resolve();\n this.#connectPromise = undefined;\n }\n\n #onData(data: Buffer): void {\n if (this.#debug) {\n const cutoff = Math.min(data.byteLength, 64);\n this.#context.logger.debug(`Received ${data.byteLength} bytes of data.`);\n this.#context.logger.debug(`hex=${data.subarray(0, cutoff).toString('hex')}`);\n this.#context.logger.debug(`ascii=${data.toString('ascii').replace(/[^\\x20-\\x7E]/g, '.').substring(0, cutoff)}`);\n }\n\n this.emit('data', data);\n }\n\n #onEnd(): void {\n this.emit('end');\n }\n\n #onError(err: Error): void {\n this.#context.logger.error(`Connection error: ${err.message}`);\n\n if (this.listenerCount('error') > 0) {\n this.emit('error', err);\n } else {\n this.#context.logger.warn('No error handler registered. This is likely a bug.', this.constructor.name, '#onError');\n }\n\n if (this.#state === 'connecting') {\n this.#scheduleRetry(err);\n } else {\n this.#state = 'failed';\n }\n }\n\n #onTimeout(): void {\n this.#context.logger.error('Connection timed out.');\n\n const err = new Error('Connection timed out.');\n\n this.emit('timeout');\n\n if (this.#state === 'connecting') {\n this.#scheduleRetry(err);\n } else {\n this.#state = 'failed';\n this.#socket?.destroy();\n }\n }\n}\n\nexport class EncryptionAwareConnection<TEventMap extends EventMap> extends Connection<TEventMap> {\n get isEncrypted(): boolean {\n return !!this[ENCRYPTION];\n }\n\n [ENCRYPTION]?: EncryptionState;\n\n enableEncryption(readKey: Buffer, writeKey: Buffer): void {\n this[ENCRYPTION] = new EncryptionState(readKey, writeKey);\n }\n}\n\nexport class EncryptionState {\n readKey: Buffer;\n readCount: number;\n writeKey: Buffer;\n writeCount: number;\n\n constructor(readKey: Buffer, writeKey: Buffer) {\n this.readCount = 0;\n this.readKey = readKey;\n this.writeCount = 0;\n this.writeKey = writeKey;\n }\n}\n","type DebugGroup =\n | 'debug'\n | 'error'\n | 'info'\n | 'net'\n | 'raw'\n | 'warn';\n\nexport class Logger {\n get id(): string {\n return this.#id;\n }\n\n get label(): string {\n return this.#label;\n }\n\n readonly #id: string;\n readonly #label: string;\n\n constructor(id: string) {\n this.#id = id;\n this.#label = `\\u001b[36m[${id}]\\u001b[39m`;\n }\n\n debug(...data: any[]): void {\n debug(this.#label, ...data);\n }\n\n error(...data: any[]): void {\n error(this.#label, ...data);\n }\n\n info(...data: any[]): void {\n info(this.#label, ...data);\n }\n\n net(...data: any[]): void {\n net(this.#label, ...data);\n }\n\n raw(...data: any[]): void {\n raw(this.#label, ...data);\n }\n\n warn(...data: any[]): void {\n warn(this.#label, ...data);\n }\n}\n\nexport class Reporter {\n #enabled: DebugGroup[] = [];\n\n all(): void {\n this.#enabled = ['debug', 'error', 'info', 'net', 'raw', 'warn'] as DebugGroup[];\n }\n\n disable(group: DebugGroup): void {\n if (this.#enabled.includes(group)) {\n this.#enabled.splice(this.#enabled.indexOf(group), 1);\n }\n }\n\n enable(group: DebugGroup): void {\n if (!this.#enabled.includes(group)) {\n this.#enabled.push(group);\n }\n }\n\n isEnabled(group: DebugGroup): boolean {\n return this.#enabled.includes(group);\n }\n}\n\nfunction debug(...data: any[]): void {\n reporter.isEnabled('debug') && console.debug(`\\u001b[36m[debug]\\u001b[39m`, ...data);\n}\n\nfunction error(...data: any[]): void {\n reporter.isEnabled('error') && console.error(`\\u001b[31m[error]\\u001b[39m`, ...data);\n}\n\nfunction info(...data: any[]): void {\n reporter.isEnabled('info') && console.info(`\\u001b[32m[info]\\u001b[39m`, ...data);\n}\n\nfunction net(...data: any[]): void {\n reporter.isEnabled('net') && console.info(`\\u001b[33m[net]\\u001b[39m`, ...data);\n}\n\nfunction raw(...data: any[]): void {\n reporter.isEnabled('raw') && console.log(`\\u001b[34m[raw]\\u001b[39m`, ...data);\n}\n\nfunction warn(...data: any[]): void {\n reporter.isEnabled('warn') && console.warn(`\\u001b[33m[warn]\\u001b[39m`, ...data);\n}\n\nexport const reporter: Reporter = new Reporter();\n","import { Logger } from './reporter';\n\nexport class Context {\n get deviceId(): string {\n return this.#deviceId;\n }\n\n get logger(): Logger {\n return this.#logger;\n }\n\n readonly #deviceId: string;\n readonly #logger: Logger;\n\n constructor(deviceId: string) {\n this.#deviceId = deviceId;\n this.#logger = new Logger(deviceId);\n }\n}\n","import { OPack, TLV8 } from '@basmilius/apple-encoding';\nimport { Chacha20, Curve25519, Ed25519, hkdf, type KeyPair } from '@basmilius/apple-encryption';\nimport { SRP, SrpClient } from 'fast-srp-hap';\nimport { v4 as uuid } from 'uuid';\nimport { AIRPLAY_TRANSIENT_PIN } from './const';\nimport type { Context } from './context';\n\nabstract class BasePairing {\n get context(): Context {\n return this.#context;\n }\n\n readonly #context: Context;\n\n constructor(context: Context) {\n this.#context = context;\n }\n\n tlv(buffer: Buffer): Map<number, Buffer> {\n const data = TLV8.decode(buffer);\n\n if (data.has(TLV8.Value.Error)) {\n TLV8.bail(data);\n }\n\n this.#context.logger.raw('Decoded TLV', data);\n\n return data;\n }\n}\n\nexport class AccessoryPair extends BasePairing {\n readonly #name: string;\n readonly #pairingId: Buffer;\n readonly #requestHandler: RequestHandler;\n #publicKey: Buffer;\n #secretKey: Buffer;\n #srp: SrpClient;\n\n constructor(context: Context, requestHandler: RequestHandler) {\n super(context);\n\n this.#name = 'basmilius/apple-protocols';\n this.#pairingId = Buffer.from(uuid().toUpperCase());\n this.#requestHandler = requestHandler;\n }\n\n async start(): Promise<void> {\n const keyPair = Ed25519.generateKeyPair();\n this.#publicKey = Buffer.from(keyPair.publicKey);\n this.#secretKey = Buffer.from(keyPair.secretKey);\n }\n\n async pin(askPin: () => Promise<string>): Promise<AccessoryCredentials> {\n const m1 = await this.m1();\n const m2 = await this.m2(m1, await askPin());\n const m3 = await this.m3(m2);\n const m4 = await this.m4(m3);\n const m5 = await this.m5(m4);\n const m6 = await this.m6(m4, m5);\n\n if (!m6) {\n throw new Error('Pairing failed, could not get accessory keys.');\n }\n\n return m6;\n }\n\n async transient(): Promise<AccessoryKeys> {\n const m1 = await this.m1([[TLV8.Value.Flags, TLV8.Flags.TransientPairing]]);\n const m2 = await this.m2(m1);\n const m3 = await this.m3(m2);\n const m4 = await this.m4(m3);\n\n const accessoryToControllerKey = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Control-Salt'),\n info: Buffer.from('Control-Read-Encryption-Key')\n });\n\n const controllerToAccessoryKey = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Control-Salt'),\n info: Buffer.from('Control-Write-Encryption-Key')\n });\n\n return {\n pairingId: this.#pairingId,\n sharedSecret: m4.sharedSecret,\n accessoryToControllerKey,\n controllerToAccessoryKey\n };\n }\n\n async m1(additionalTlv: [number, number | Buffer][] = []): Promise<PairM1> {\n const response = await this.#requestHandler('m1', TLV8.encode([\n [TLV8.Value.Method, TLV8.Method.PairSetup],\n [TLV8.Value.State, TLV8.State.M1],\n ...additionalTlv\n ]));\n\n const data = this.tlv(response);\n const publicKey = data.get(TLV8.Value.PublicKey);\n const salt = data.get(TLV8.Value.Salt);\n\n return {publicKey, salt};\n }\n\n async m2(m1: PairM1, pin: string = AIRPLAY_TRANSIENT_PIN): Promise<PairM2> {\n const srpKey = await SRP.genKey(32);\n\n this.#srp = new SrpClient(SRP.params.hap, m1.salt, Buffer.from('Pair-Setup'), Buffer.from(pin), srpKey, true);\n this.#srp.setB(m1.publicKey);\n\n const publicKey = this.#srp.computeA();\n const proof = this.#srp.computeM1();\n\n return {publicKey, proof};\n }\n\n async m3(m2: PairM2): Promise<PairM3> {\n const response = await this.#requestHandler('m3', TLV8.encode([\n [TLV8.Value.State, TLV8.State.M3],\n [TLV8.Value.PublicKey, m2.publicKey],\n [TLV8.Value.Proof, m2.proof]\n ]));\n\n const data = this.tlv(response);\n const serverProof = data.get(TLV8.Value.Proof);\n\n return {serverProof};\n }\n\n async m4(m3: PairM3): Promise<PairM4> {\n this.#srp.checkM2(m3.serverProof);\n\n const sharedSecret = this.#srp.computeK();\n\n return {sharedSecret};\n }\n\n async m5(m4: PairM4): Promise<PairM5> {\n const iosDeviceX = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Setup-Controller-Sign-Salt', 'utf8'),\n info: Buffer.from('Pair-Setup-Controller-Sign-Info', 'utf8')\n });\n\n const sessionKey = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Setup-Encrypt-Salt', 'utf8'),\n info: Buffer.from('Pair-Setup-Encrypt-Info', 'utf8')\n });\n\n const deviceInfo = Buffer.concat([\n iosDeviceX,\n this.#pairingId,\n this.#publicKey\n ]);\n\n const signature = Ed25519.sign(deviceInfo, this.#secretKey);\n\n const innerTlv = TLV8.encode([\n [TLV8.Value.Identifier, this.#pairingId],\n [TLV8.Value.PublicKey, this.#publicKey],\n [TLV8.Value.Signature, Buffer.from(signature)],\n [TLV8.Value.Name, OPack.encode({\n name: this.#name\n })]\n ]);\n\n const {authTag, ciphertext} = Chacha20.encrypt(sessionKey, Buffer.from('PS-Msg05'), null, innerTlv);\n const encrypted = Buffer.concat([ciphertext, authTag]);\n\n const response = await this.#requestHandler('m5', TLV8.encode([\n [TLV8.Value.State, TLV8.State.M5],\n [TLV8.Value.EncryptedData, encrypted]\n ]));\n\n const data = this.tlv(response);\n const encryptedDataRaw = data.get(TLV8.Value.EncryptedData);\n const encryptedData = encryptedDataRaw.subarray(0, -16);\n const encryptedTag = encryptedDataRaw.subarray(-16);\n\n return {\n authTag: encryptedTag,\n data: encryptedData,\n sessionKey\n };\n }\n\n async m6(m4: PairM4, m5: PairM5): Promise<AccessoryCredentials> {\n const data = Chacha20.decrypt(m5.sessionKey, Buffer.from('PS-Msg06'), null, m5.data, m5.authTag);\n const tlv = TLV8.decode(data);\n\n const accessoryIdentifier = tlv.get(TLV8.Value.Identifier);\n const accessoryLongTermPublicKey = tlv.get(TLV8.Value.PublicKey);\n const accessorySignature = tlv.get(TLV8.Value.Signature);\n\n const accessoryX = hkdf({\n hash: 'sha512',\n key: m4.sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Setup-Accessory-Sign-Salt'),\n info: Buffer.from('Pair-Setup-Accessory-Sign-Info')\n });\n\n const accessoryInfo = Buffer.concat([\n accessoryX,\n accessoryIdentifier,\n accessoryLongTermPublicKey\n ]);\n\n if (!Ed25519.verify(accessoryInfo, accessorySignature, accessoryLongTermPublicKey)) {\n throw new Error('Invalid accessory signature.');\n }\n\n return {\n accessoryIdentifier: accessoryIdentifier.toString(),\n accessoryLongTermPublicKey: accessoryLongTermPublicKey,\n pairingId: this.#pairingId,\n publicKey: this.#publicKey,\n secretKey: this.#secretKey\n };\n }\n}\n\nexport class AccessoryVerify extends BasePairing {\n readonly #ephemeralKeyPair: KeyPair;\n readonly #requestHandler: RequestHandler;\n\n constructor(context: Context, requestHandler: RequestHandler) {\n super(context);\n\n this.#ephemeralKeyPair = Curve25519.generateKeyPair();\n this.#requestHandler = requestHandler;\n }\n\n async start(credentials: AccessoryCredentials): Promise<AccessoryKeys> {\n const m1 = await this.#m1();\n const m2 = await this.#m2(credentials.accessoryIdentifier, credentials.accessoryLongTermPublicKey, m1);\n\n await this.#m3(credentials.pairingId, credentials.secretKey, m2);\n\n return await this.#m4(m2, credentials.pairingId);\n }\n\n async #m1(): Promise<VerifyM1> {\n const response = await this.#requestHandler('m1', TLV8.encode([\n [TLV8.Value.State, TLV8.State.M1],\n [TLV8.Value.PublicKey, Buffer.from(this.#ephemeralKeyPair.publicKey)]\n ]));\n\n const data = this.tlv(response);\n const serverPublicKey = data.get(TLV8.Value.PublicKey);\n const encryptedData = data.get(TLV8.Value.EncryptedData);\n\n return {\n encryptedData,\n serverPublicKey\n };\n }\n\n async #m2(localAccessoryIdentifier: string, longTermPublicKey: Buffer, m1: VerifyM1): Promise<VerifyM2> {\n const sharedSecret = Buffer.from(Curve25519.generateSharedSecKey(\n this.#ephemeralKeyPair.secretKey,\n m1.serverPublicKey\n ));\n\n const sessionKey = hkdf({\n hash: 'sha512',\n key: sharedSecret,\n length: 32,\n salt: Buffer.from('Pair-Verify-Encrypt-Salt'),\n info: Buffer.from('Pair-Verify-Encrypt-Info')\n });\n\n const encryptedData = m1.encryptedData.subarray(0, -16);\n const encryptedTag = m1.encryptedData.subarray(-16);\n\n const data = Chacha20.decrypt(sessionKey, Buffer.from('PV-Msg02'), null, encryptedData, encryptedTag);\n const tlv = TLV8.decode(data);\n\n const accessoryIdentifier = tlv.get(TLV8.Value.Identifier);\n const accessorySignature = tlv.get(TLV8.Value.Signature);\n\n if (accessoryIdentifier.toString() !== localAccessoryIdentifier) {\n throw new Error(`Invalid accessory identifier. Expected ${accessoryIdentifier.toString()} to be ${localAccessoryIdentifier}.`);\n }\n\n const accessoryInfo = Buffer.concat([\n m1.serverPublicKey,\n accessoryIdentifier,\n this.#ephemeralKeyPair.publicKey\n ]);\n\n if (!Ed25519.verify(accessoryInfo, accessorySignature, longTermPublicKey)) {\n throw new Error('Invalid accessory signature.');\n }\n\n return {\n serverEphemeralPublicKey: m1.serverPublicKey,\n sessionKey,\n sharedSecret\n };\n }\n\n async #m3(pairingId: Buffer, secretKey: Buffer, m2: VerifyM2): Promise<VerifyM3> {\n const iosDeviceInfo = Buffer.concat([\n this.#ephemeralKeyPair.publicKey,\n pairingId,\n m2.serverEphemeralPublicKey\n ]);\n\n const iosDeviceSignature = Buffer.from(Ed25519.sign(iosDeviceInfo, secretKey));\n\n const innerTlv = TLV8.encode([\n [TLV8.Value.Identifier, pairingId],\n [TLV8.Value.Signature, iosDeviceSignature]\n ]);\n\n const {authTag, ciphertext} = Chacha20.encrypt(m2.sessionKey, Buffer.from('PV-Msg03'), null, innerTlv);\n const encrypted = Buffer.concat([ciphertext, authTag]);\n\n await this.#requestHandler('m3', TLV8.encode([\n [TLV8.Value.State, TLV8.State.M3],\n [TLV8.Value.EncryptedData, encrypted]\n ]));\n\n return {};\n }\n\n async #m4(m2: VerifyM2, pairingId: Buffer): Promise<AccessoryKeys> {\n return {\n accessoryToControllerKey: Buffer.alloc(0),\n controllerToAccessoryKey: Buffer.alloc(0),\n pairingId,\n sharedSecret: m2.sharedSecret\n };\n }\n}\n\ntype RequestHandler = (step: 'm1' | 'm3' | 'm5', data: Buffer) => Promise<Buffer>;\n\ntype PairM1 = {\n readonly publicKey: Buffer;\n readonly salt: Buffer;\n}\n\ntype PairM2 = {\n readonly publicKey: Buffer;\n readonly proof: Buffer;\n};\n\ntype PairM3 = {\n readonly serverProof: Buffer;\n};\n\ntype PairM4 = {\n readonly sharedSecret: Buffer;\n};\n\ntype PairM5 = {\n readonly authTag: Buffer;\n readonly data: Buffer;\n readonly sessionKey: Buffer;\n};\n\ntype VerifyM1 = {\n readonly encryptedData: Buffer;\n readonly serverPublicKey: Buffer;\n};\n\ntype VerifyM2 = {\n readonly serverEphemeralPublicKey: Buffer;\n readonly sessionKey: Buffer;\n readonly sharedSecret: Buffer;\n};\n\ntype VerifyM3 = {};\n\nexport type AccessoryCredentials = {\n readonly accessoryIdentifier: string;\n readonly accessoryLongTermPublicKey: Buffer;\n readonly pairingId: Buffer;\n readonly publicKey: Buffer;\n readonly secretKey: Buffer;\n};\n\nexport type AccessoryKeys = {\n readonly pairingId: Buffer;\n readonly sharedSecret: Buffer;\n readonly accessoryToControllerKey: Buffer;\n readonly controllerToAccessoryKey: Buffer;\n};\n","import { createSocket, RemoteInfo, Socket } from 'node:dgram';\nimport { NTP } from '@basmilius/apple-encoding';\nimport { Logger } from './reporter';\n\nexport class TimingServer {\n get port(): number {\n return this.#port;\n }\n\n readonly #logger: Logger;\n readonly #socket: Socket;\n #port: number = 0;\n\n constructor() {\n this.#logger = new Logger('timing-server');\n this.#socket = createSocket('udp4');\n\n this.#socket.on('connect', this.#onConnect.bind(this));\n this.#socket.on('error', this.#onError.bind(this));\n this.#socket.on('message', this.#onMessage.bind(this));\n }\n\n close(): void {\n this.#socket.close();\n this.#port = 0;\n }\n\n listen(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.#socket.once('error', reject);\n this.#socket.once('listening', () => {\n this.#socket.removeListener('error', reject);\n this.#onListening();\n resolve();\n });\n this.#socket.bind(0, resolve);\n });\n }\n\n #onConnect(): void {\n this.#socket.setRecvBufferSize(16384);\n this.#socket.setSendBufferSize(16384);\n }\n\n #onError(err: Error): void {\n this.#logger.error('Timing server error', err);\n }\n\n #onListening(): void {\n const {port} = this.#socket.address();\n this.#port = port;\n }\n\n #onMessage(data: Buffer, info: RemoteInfo): void {\n try {\n const request = NTP.decode(data);\n const ntp = NTP.now();\n const [receivedSeconds, receivedFraction] = NTP.parts(ntp);\n\n this.#logger.info(`Timing server ntp=${ntp} receivedSeconds=${receivedSeconds} receivedFraction=${receivedFraction}`);\n\n const response = NTP.encode({\n proto: request.proto,\n type: 0x53 | 0x80,\n seqno: request.seqno,\n padding: 0,\n reftime_sec: request.sendtime_sec,\n reftime_frac: request.sendtime_frac,\n recvtime_sec: receivedSeconds,\n recvtime_frac: receivedFraction,\n sendtime_sec: receivedSeconds,\n sendtime_frac: receivedFraction\n });\n\n this.#socket.send(response, info.port, info.address, err => {\n if (!err) {\n return;\n }\n\n this.#logger.warn(`Timing server failed to send response to ${info.address}:${info.port}`, err);\n });\n } catch (err) {\n this.#logger.warn(`Timing server received malformed packet (${data.length} bytes) from ${info.address}:${info.port}`, err);\n }\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { networkInterfaces } from 'node:os';\n\nexport function generateActiveRemoteId(): string {\n return Math.floor(Math.random() * 2 ** 32).toString(10);\n}\n\nexport function generateDacpId(): string {\n return Math.floor(Math.random() * 2 ** 64).toString(16).toUpperCase();\n}\n\nexport function generateSessionId(): string {\n return Math.floor(Math.random() * 2 ** 32).toString(10);\n}\n\nexport function getLocalIP(): string | null {\n const interfaces = networkInterfaces();\n\n for (const iface of Object.values(interfaces)) {\n if (!iface) {\n continue;\n }\n\n for (const net of iface) {\n if (net.internal || net.family !== 'IPv4') {\n continue;\n }\n\n if (net.address && net.address !== '127.0.0.1') {\n return net.address;\n }\n }\n }\n\n return null;\n}\n\nexport function getMacAddress(): string {\n const interfaces = networkInterfaces();\n\n for (const iface of Object.values(interfaces)) {\n if (!iface) {\n continue;\n }\n\n for (const net of iface) {\n if (net.internal || net.family !== 'IPv4') {\n continue;\n }\n\n if (net.mac && net.mac !== '00:00:00:00:00:00') {\n return net.mac.toUpperCase();\n }\n }\n }\n\n return '00:00:00:00:00:00';\n}\n\nexport function randomInt32(): number {\n return randomBytes(4).readUInt32BE(0);\n}\n\nexport function randomInt64(): bigint {\n return randomBytes(8).readBigUint64LE(0);\n}\n\nexport function uint16ToBE(value: number): Buffer {\n const buffer = Buffer.allocUnsafe(2);\n buffer.writeUInt16BE(value, 0);\n\n return buffer;\n}\n\nexport function uint53ToLE(value: number): Buffer {\n const [upper, lower] = splitUInt53(value);\n const buffer = Buffer.allocUnsafe(8);\n buffer.writeUInt32LE(lower, 0);\n buffer.writeUInt32LE(upper, 4);\n\n return buffer;\n}\n\nfunction splitUInt53(number: number): [number, number] {\n const MAX_UINT32 = 0x00000000FFFFFFFF;\n const MAX_INT53 = 0x001FFFFFFFFFFFFF;\n\n if (number <= -1 || number > MAX_INT53) {\n throw new Error('Number out of range.');\n }\n\n if (Math.floor(number) !== number) {\n throw new Error('Number is not an integer.');\n }\n\n let upper: number = 0;\n const signbit = number & 0xFFFFFFFF;\n const lower = signbit < 0 ? (number & 0x7FFFFFFF) + 0x80000000 : signbit;\n\n if (number > MAX_UINT32) {\n upper = (number - lower) / (MAX_UINT32 + 1);\n }\n\n return [upper, lower];\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}
|