@basmilius/apple-companion-link 0.0.13 → 0.0.15

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.js CHANGED
@@ -1,5 +1,5 @@
1
- import{randomInt as Rt}from"node:crypto";import{createCipher as ot,createDecipher as nt}from"chacha";import{randomBytes as ct}from"node:crypto";import{x25519 as Y}from"@noble/curves/ed25519.js";import{hkdfSync as _t}from"node:crypto";import rt from"node-dns-sd";import{createInterface as pt}from"node:readline";import{parse as it}from"@plist/binary.parse";import{serialize as Ft}from"@plist/binary.serialize";import{SRP as j,SrpClient as St}from"fast-srp-hap";import{v4 as yt}from"uuid";import E from"tweetnacl";import{v4 as Ht}from"uuid";var $=12;function I(t,s,i,n,o){s=z(s);let c=nt(t,s);i&&c.setAAD(i),c.setAuthTag(o);let a=c._update(n);return c._final(),a}function V(t,s,i,n){s=z(s);let o=ot(t,s);i&&o.setAAD(i);let c=o._update(n);o._final();let a=o.getAuthTag();return{ciphertext:c,authTag:a}}function z(t){if(t.length>=$)return t;return Buffer.concat([Buffer.alloc($-t.length,0),t])}function at(){let t=ct(32);return{publicKey:Y.getPublicKey(t),secretKey:t}}function mt(t,s){return Y.getSharedSecret(t,s)}function S(t){return Buffer.from(_t(t.hash,t.key,t.salt,t.info,t.length))}var Ut=pt({input:process.stdin,output:process.stdout});function A(...t){}async function d(t){return new Promise((s)=>setTimeout(s,t))}var ht="3939";var Ct="_airplay._tcp.local",kt="_companion-link._tcp.local",Pt="_raop._tcp.local";class L{#t;constructor(t){this.#t=t}async find(){return await rt.discover({name:this.#t})}async findUntil(t,s=10,i=1000){while(s>0){let n=await this.find(),o=n.find((c)=>c.fqdn===t);if(o)return o;if(console.log(),console.log(`Device not found, retrying in ${i}ms...`),console.log(n.map((c)=>` ● ${c.fqdn}`).join(`
2
- `)),s--,s===0)throw Error("Device not found after serveral tries, aborting.");await d(i)}}static airplay(){return new L(Ct)}static companionLink(){return new L(kt)}static raop(){return new L(Pt)}}class N extends Number{size;constructor(t,s){super(t);this.size=s}}function T(t,s){return new N(t,s)}class G{value;constructor(t){this.value=t}}function H(t){return new G(t)}class b{value;constructor(t){this.value=t}}function C(t){let s=t.reduce((o,c)=>o+c.length,0),i=new Uint8Array(s),n=0;for(let o of t)i.set(o,n),n+=o.length;return i}function _(t){return Uint8Array.of(t)}function k(t,s){let i=new Uint8Array(s),n=BigInt(t);for(let o=0;o<s;o++)i[o]=Number(n&0xffn),n>>=8n;return i}function g(t){let s=t.reduce((o,c)=>o+c.length,0),i=new Uint8Array(s),n=0;for(let o of t)i.set(o,n),n+=o.length;return i}function M(t){return x(t,[])}function x(t,s){let i=null;if(t===null||t===void 0)i=_(4);else if(typeof t==="boolean")i=_(t?1:2);else if(t instanceof G){let o=new ArrayBuffer(8);new DataView(o).setFloat64(0,t.value,!0),i=C([_(54),new Uint8Array(o)])}else if(t instanceof b){let o=t.value;if(o<40)i=_(8+o);else if(o<=255)i=g([_(48),k(o,1)]);else if(o<=65535)i=g([_(49),k(o,2)]);else if(o<=4294967295)i=g([_(50),k(o,4)]);else i=g([_(51),k(o,8)])}else if(typeof t==="number")if(!Number.isInteger(t)){let o=new ArrayBuffer(8);new DataView(o).setFloat64(0,t,!0),i=C([_(54),new Uint8Array(o)])}else if(t<40)i=_(8+t);else if(t<=255)i=C([_(48),k(t,1)]);else if(t<=65535)i=C([_(49),k(t,2)]);else if(t<=4294967295)i=C([_(50),k(t,4)]);else i=C([_(51),k(t,8)]);else if(t instanceof N)i=C([_(48+Math.log2(t.size)),k(t.valueOf(),t.size)]);else if(typeof t==="string"){let o=new TextEncoder().encode(t),c=o.length;if(c<=32)i=C([_(64+c),o]);else if(c<=255)i=C([_(97),k(c,1),o]);else if(c<=65535)i=C([_(98),k(c,2),o]);else if(c<=16777215)i=C([_(99),k(c,3),o]);else i=C([_(100),k(c,4),o])}else if(t instanceof Uint8Array||Buffer.isBuffer(t)){let o=t instanceof Uint8Array?t:new Uint8Array(t),c=o.length;if(c<=32)i=C([_(112+c),o]);else if(c<=255)i=C([_(145),k(c,1),o]);else if(c<=65535)i=C([_(146),k(c,2),o]);else i=C([_(147),k(c,4),o])}else if(Array.isArray(t)){let o=C(t.map((a)=>x(a,s))),c=t.length;if(c<=15){if(i=C([_(208+c),o]),c>=15)i=C([i,_(3)])}else i=C([_(223),o,_(3)])}else if(typeof t==="object"){let o=Object.keys(t),c=o.length,a=[];for(let h of o)a.push(x(h,s)),a.push(x(t[h],s));let m;if(c<=15)m=_(224+c);else m=_(239);if(i=g([m,g(a)]),c>=15||s.some((h)=>h===i))i=g([i,_(129)])}else throw TypeError(typeof t);let n=s.findIndex((o)=>o.length===i.length&&o.every((c,a)=>c===i[a]));if(n>=0)if(n<33)i=_(160+n);else if(n<=255)i=C([_(193),k(n,1)]);else if(n<=65535)i=C([_(194),k(n,2)]);else if(n<=4294967295)i=C([_(195),k(n,4)]);else i=C([_(196),k(n,8)]);else if(i.length>1)s.push(i);return i}function tt(t){return f(t,[])}function ut(t,s){if(t.length<s)throw TypeError(`Not enough data: need ${s} bytes, have ${t.length}`)}function v(t,s,i){ut(t.subarray(s),i);let n=0n;for(let o=i-1;o>=0;o--)n=n<<8n|BigInt(t[s+o]);return Number(n)}function f(t,s){if(t.length===0)throw TypeError("No data to unpack");let i=t[0],n=!0,o,c;if(i===1)o=!0,c=t.subarray(1);else if(i===2)o=!1,c=t.subarray(1);else if(i===4)o=null,c=t.subarray(1);else if(i===5)o=t.subarray(1,17),c=t.subarray(17);else if(i===6)o=v(t,1,8),c=t.subarray(9);else if(i>=8&&i<=47)o=i-8,c=t.subarray(1);else if(i===53)o=new DataView(t.buffer,t.byteOffset+1,4).getFloat32(0,!0),c=t.subarray(5);else if(i===54)o=new DataView(t.buffer,t.byteOffset+1,8).getFloat64(0,!0),c=t.subarray(9);else if((i&240)===48){let a=2**(i&15),m=v(t,1,a);o=T(m,a),c=t.subarray(1+a)}else if(i>=64&&i<=96){let a=i-64;o=new TextDecoder().decode(t.subarray(1,1+a)),c=t.subarray(1+a)}else if(i>=97&&i<=100){let a=i&15,m=v(t,1,a);o=new TextDecoder().decode(t.subarray(1+a,1+a+m)),c=t.subarray(1+a+m)}else if(i>=112&&i<=144){let a=i-112;o=t.subarray(1,1+a),c=t.subarray(1+a)}else if(i>=145&&i<=148){let a=1<<(i&15)-1,m=v(t,1,a),h=1+a;o=t.subarray(h,h+m),c=t.subarray(h+m)}else if((i&240)===208){let a=i&15,m=t.subarray(1),h=[];if(a===15){while(m[0]!==3){let[u,w]=f(m,s);h.push(u),m=w}m=m.subarray(1)}else for(let u=0;u<a;u++){let[w,l]=f(m,s);h.push(w),m=l}o=h,c=m,n=!1}else if((i&224)===224){let a=i&15,m=t.subarray(1),h={};if(a===15){while(m[0]!==3){let[u,w]=f(m,s),[l,F]=f(w,s);h[u]=l,m=F}m=m.subarray(1)}else for(let u=0;u<a;u++){let[w,l]=f(m,s),[F,st]=f(l,s);h[w]=F,m=st}o=h,c=m,n=!1}else if(i>=160&&i<=192){let a=i-160;if(a>=s.length)throw TypeError(`Reference index ${a} out of range`);o=s[a],c=t.subarray(1),n=!1}else if(i>=193&&i<=196){let a=i-192,m=v(t,1,a);if(m>=s.length)throw TypeError(`UID ${m} out of range`);o=s[m],c=t.subarray(1+a),n=!1}else throw TypeError(`Unknown tag 0x${i.toString(16)}`);if(n)s.push(o);return[o,c]}var At={TransientPairing:16},wt={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},R={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},p={Method:0,Identifier:1,Salt:2,PublicKey:3,Proof:4,EncryptedData:5,State:6,Error:7,BackOff:8,Certificate:9,Signature:10,Permissions:11,FragmentData:12,FragmentLast:13,Name:17,Flags:19};function lt(t){if(t.has(p.BackOff)){let s=t.get(p.BackOff),i=s.readUintLE(0,s.length);throw Error(`Device is busy, try again in ${i} seconds.`)}if(t.has(p.Error))throw Error(`Device returned an error code: ${t.get(p.Error).readUint8()}`);throw console.error(t),Error("Invalid response")}function e(t){let s=[];for(let[i,n]of t){let o;if(typeof n==="number")o=Buffer.from([n]);else o=n;let c=0;do{let a=Math.min(o.length-c,255);if(s.push(i,a),a>0)for(let m=0;m<a;m++)s.push(o[c+m]);c+=a}while(c<o.length)}return Buffer.from(s)}function Q(t){let s=new Map,i=0;while(i<t.length){let n=t[i++],o=t[i++],c=new Uint8Array(t).slice(i,i+o);i+=o;let a=s.get(n);if(a)s.set(n,Buffer.concat([a,c]));else s.set(n,Buffer.from(c))}return s}class W extends EventTarget{get address(){return this.#t}get port(){return this.#i}#t;#i;constructor(t,s){super();this.#t=t,this.#i=s}async connect(){}async disconnect(){}}class J{#t;#i;#s;#o;#n;#c;constructor(t){this.#t="basmilius/apple-protocols",this.#i=Buffer.from(yt().toUpperCase()),this.#s=t}async start(){let t=E.sign.keyPair();this.#o=Buffer.from(t.publicKey),this.#n=Buffer.from(t.secretKey)}async pin(t){let s=await this.m1(),i=await this.m2(s,await t()),n=await this.m3(i),o=await this.m4(n),c=await this.m5(o),a=await this.m6(o,c);if(!a)throw Error("Pairing failed, could not get accessory keys.");return a}async transient(){let t=await this.m1([[p.Flags,At.TransientPairing]]),s=await this.m2(t),i=await this.m3(s),n=await this.m4(i),o=S({hash:"sha512",key:n.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Read-Encryption-Key")}),c=S({hash:"sha512",key:n.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Write-Encryption-Key")});return{pairingId:this.#i,sharedSecret:n.sharedSecret,accessoryToControllerKey:o,controllerToAccessoryKey:c}}async m1(t=[]){let s=await this.#s("m1",e([[p.Method,wt.PairSetup],[p.State,R.M1],...t])),i=O(s),n=i.get(p.PublicKey),o=i.get(p.Salt);return{publicKey:n,salt:o}}async m2(t,s=ht){let i=await j.genKey(32);this.#c=new St(j.params.hap,t.salt,Buffer.from("Pair-Setup"),Buffer.from(s),i,!0),this.#c.setB(t.publicKey);let n=this.#c.computeA(),o=this.#c.computeM1();return{publicKey:n,proof:o}}async m3(t){let s=await this.#s("m3",e([[p.State,R.M3],[p.PublicKey,t.publicKey],[p.Proof,t.proof]]));return{serverProof:O(s).get(p.Proof)}}async m4(t){return this.#c.checkM2(t.serverProof),{sharedSecret:this.#c.computeK()}}async m5(t){let s=S({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Controller-Sign-Salt","utf8"),info:Buffer.from("Pair-Setup-Controller-Sign-Info","utf8")}),i=S({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Encrypt-Salt","utf8"),info:Buffer.from("Pair-Setup-Encrypt-Info","utf8")}),n=Buffer.concat([s,this.#i,this.#o]),o=E.sign.detached(n,this.#n),c=e([[p.Identifier,this.#i],[p.PublicKey,this.#o],[p.Signature,Buffer.from(o)],[p.Name,Buffer.from(M({name:this.#t}))]]),{authTag:a,ciphertext:m}=V(i,Buffer.from("PS-Msg05"),null,c),h=Buffer.concat([m,a]),u=await this.#s("m5",e([[p.State,R.M5],[p.EncryptedData,h]])),w=O(u).get(p.EncryptedData),l=w.subarray(0,-16);return{authTag:w.subarray(-16),data:l,sessionKey:i}}async m6(t,s){let i=I(s.sessionKey,Buffer.from("PS-Msg06"),null,s.data,s.authTag),n=Q(i),o=n.get(p.Identifier),c=n.get(p.PublicKey),a=n.get(p.Signature),m=S({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Accessory-Sign-Salt"),info:Buffer.from("Pair-Setup-Accessory-Sign-Info")}),h=Buffer.concat([m,o,c]);if(!E.sign.detached.verify(h,a,c))throw Error("Invalid accessory signature.");return{accessoryIdentifier:o.toString(),accessoryLongTermPublicKey:c,pairingId:this.#i,publicKey:this.#o,secretKey:this.#n}}}class X{#t;#i;constructor(t){this.#t=at(),this.#i=t}async start(t){let s=await this.#s(),i=await this.#o(t.accessoryIdentifier,t.accessoryLongTermPublicKey,s);return await this.#n(t.pairingId,t.secretKey,i),await this.#c(i,t.pairingId)}async#s(){let t=await this.#i("m1",e([[p.State,R.M1],[p.PublicKey,Buffer.from(this.#t.publicKey)]])),s=O(t),i=s.get(p.PublicKey);return{encryptedData:s.get(p.EncryptedData),serverPublicKey:i}}async#o(t,s,i){let n=Buffer.from(mt(this.#t.secretKey,i.serverPublicKey)),o=S({hash:"sha512",key:n,length:32,salt:Buffer.from("Pair-Verify-Encrypt-Salt"),info:Buffer.from("Pair-Verify-Encrypt-Info")}),c=i.encryptedData.subarray(0,-16),a=i.encryptedData.subarray(-16),m=I(o,Buffer.from("PV-Msg02"),null,c,a),h=Q(m),u=h.get(p.Identifier),w=h.get(p.Signature);if(u.toString()!==t)throw Error(`Invalid accessory identifier. Expected ${u.toString()} to be ${t}.`);let l=Buffer.concat([i.serverPublicKey,u,this.#t.publicKey]);if(!E.sign.detached.verify(l,w,s))throw Error("Invalid accessory signature.");return{serverEphemeralPublicKey:i.serverPublicKey,sessionKey:o,sharedSecret:n}}async#n(t,s,i){let n=Buffer.concat([this.#t.publicKey,t,i.serverEphemeralPublicKey]),o=Buffer.from(E.sign.detached(n,s)),c=e([[p.Identifier,t],[p.Signature,o]]),{authTag:a,ciphertext:m}=V(i.sessionKey,Buffer.from("PV-Msg03"),null,c),h=Buffer.concat([m,a]);return await this.#i("m3",e([[p.State,R.M3],[p.EncryptedData,h]])),{}}async#c(t,s){return{accessoryToControllerKey:Buffer.alloc(0),controllerToAccessoryKey:Buffer.alloc(0),pairingId:s,sharedSecret:t.sharedSecret}}}function O(t){let s=Q(t);if(s.has(p.Error))lt(s);return A("Decoded TLV",s),s}import{randomInt as gt}from"node:crypto";import{Socket as ft}from"node:net";var Z=4;class K extends W{get isEncrypted(){return!!this.#n&&!!this.#a}#t;#i={};#s=Buffer.alloc(0);#o;#n;#c;#a;#m;constructor(t,s){super(t,s);this.#m=gt(0,65536),this.onClose=this.onClose.bind(this),this.onConnect=this.onConnect.bind(this),this.onData=this.onData.bind(this),this.onEnd=this.onEnd.bind(this),this.onError=this.onError.bind(this),this.#t=new ft,this.#t.on("close",this.onClose),this.#t.on("connect",this.onConnect),this.#t.on("data",this.onData),this.#t.on("end",this.onEnd),this.#t.on("error",this.onError)}async connect(){return A(`Connecting to ${this.address}:${this.port}...`),await new Promise((t)=>{this.#t.connect({host:this.address,port:this.port,keepAlive:!0},t)})}async disconnect(){this.#t.destroy()}async enableEncryption(t,s){this.#n=t,this.#a=s,this.#o=0,this.#c=0}async exchange(t,s){let i=this.#m;return new Promise((n,o)=>{if(vt.includes(t))this.#i[-1]=n;else this.#i[i]=n;this.send(t,s).catch(o)})}async send(t,s){let i=this.#m++;s._x??=T(i,8);let n=Buffer.from(M(s)),o=n.byteLength;if(this.isEncrypted&&o>0)o+=16;let c=Buffer.alloc(4);c.writeUint8(t,0),c.writeUintBE(o,1,3);let a;if(this.isEncrypted){let m=Buffer.alloc(12);m.writeBigUInt64LE(BigInt(this.#c++),0);let h=V(this.#a,m,c,n);a=Buffer.concat([c,h.ciphertext,h.authTag])}else a=Buffer.concat([c,n]);return A("Send data frame",this.isEncrypted,Buffer.from(a).toString("hex"),s),new Promise((m,h)=>{this.#t.write(a,(u)=>u&&h(u)),m()})}async onClose(){A(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){A(`Connected to ${this.address}:${this.port}`)}async onData(t){this.#s=Buffer.concat([this.#s,t]);while(this.#s.byteLength>=Z){let s=this.#s.subarray(0,Z),i=s.readUintBE(1,3),n=Z+i;if(this.#s.byteLength<n){A(`Not enough data yet, waiting on the next frame.. needed=${n} available=${this.#s.byteLength} receivedLength=${t.byteLength}`);return}A(`Frame found length=${n} availableLength=${this.#s.byteLength} receivedLength=${t.byteLength}`);let o=Buffer.from(this.#s.subarray(0,n));this.#s=this.#s.subarray(n),A(`Handle frame, ${this.#s.byteLength} bytes left...`);let a=(await this.#_(o)).subarray(4,n);await this.#r(s,a)}}async onEnd(){A("Connection ended")}async onError(t){A("Error received",t)}async#_(t){if(!this.isEncrypted)return t;let s=t.subarray(0,4),i=s.readUintBE(1,3),n=t.subarray(4,4+i),o=n.subarray(n.byteLength-16),c=n.subarray(0,n.byteLength-16),a=Buffer.alloc(12);a.writeBigUint64LE(BigInt(this.#o++),0);let m=I(this.#n,a,s,c,o);return Buffer.concat([s,m,o])}async#r(t,s){let i=t.readInt8();if(!et.includes(i))A("Packet not handled, no opack frame.");if([s]=tt(s),A("Decoded OPACK",{header:t,payload:s}),"_x"in s){let n=s._x;if(n in this.#i)(this.#i[n]??null)?.([t,s]),delete this.#i[n];else if("_i"in s)this.dispatchEvent(new CustomEvent(s._i,{detail:s._c}));else{let o=s._c,c=Object.keys(o).map((a)=>a.substring(0,-3));for(let a of c)this.dispatchEvent(new CustomEvent(a,{detail:o[a]}))}}else if(this.#i[-1])(this.#i[-1]??null)?.([t,s]),delete this.#i[-1];else A("No handler for message",[t,s])}}var r={Unknown:0,Noop:1,PS_Start:3,PS_Next:4,PV_Start:5,PV_Next:6,U_OPACK:7,E_OPACK:8,P_OPACK:9,PA_Request:10,PA_Response:11,SessionStartRequest:16,SessionStartResponse:17,SessionData:18,FamilyIdentityRequest:32,FamilyIdentityResponse:33,FamilyIdentityUpdate:34},P={Event:1,Request:2,Response:3},et=[r.PS_Start,r.PS_Next,r.PV_Start,r.PV_Next,r.U_OPACK,r.E_OPACK,r.P_OPACK],vt=[r.PS_Start,r.PS_Next,r.PV_Start,r.PV_Next];class q{get socket(){return this.#t.socket}#t;constructor(t){this.#t=t}async fetchMediaControlStatus(){await this.socket.exchange(r.E_OPACK,{_i:"FetchMediaControlStatus",_t:P.Request,_c:{}})}async fetchNowPlayingInfo(){await this.socket.exchange(r.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:P.Request,_c:{}})}async fetchSupportedActions(){await this.socket.exchange(r.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:P.Request,_c:{}})}async getAttentionState(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchAttentionState",_t:P.Request,_c:{}}),{_c:s}=y(t);switch(s.state){case 1:return"asleep";case 2:return"screensaver";case 3:return"awake";case 4:return"idle";default:return"unknown"}}async getLaunchableApps(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchLaunchableApplicationsEvent",_t:P.Request,_c:{}}),{_c:s}=y(t);return Object.entries(s).map(([i,n])=>({bundleId:i,name:n}))}async getSiriRemoteInfo(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:P.Request,_c:{}});return it(Buffer.from(t._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchUserAccountsEvent",_t:P.Request,_c:{}}),{_c:s}=y(t);return Object.entries(s).map(([i,n])=>({accountId:i,name:n}))}async hidCommand(t,s=!1){await this.socket.exchange(r.E_OPACK,{_i:"_hidC",_t:P.Request,_c:{_hBtS:s?1:2,_hidC:Et[t]}})}async launchApp(t){await this.socket.exchange(r.E_OPACK,{_i:"_launchApp",_t:P.Request,_c:{_bundleID:t}})}async launchUrl(t){await this.socket.exchange(r.E_OPACK,{_i:"_launchApp",_t:P.Request,_c:{_urlS:t}})}async mediaControlCommand(t,s){let[,i]=await this.socket.exchange(r.E_OPACK,{_i:"_mcc",_t:P.Request,_c:{_mcc:Lt[t],...s||{}}});return y(i)}async pressButton(t,s="SingleTap",i=500){switch(s){case"DoubleTap":await this.hidCommand(t,!0),await this.hidCommand(t,!1),await this.hidCommand(t,!0),await this.hidCommand(t,!1);break;case"Hold":await this.hidCommand(t,!0),await d(i),await this.hidCommand(t,!1);break;case"SingleTap":await this.hidCommand(t,!0),await this.hidCommand(t,!1);break}}async switchUserAccount(t){await this.socket.exchange(r.E_OPACK,{_i:"SwitchUserAccountEvent",_t:P.Request,_c:{SwitchAccountID:t}})}async _subscribe(t,s){this.socket.addEventListener(t,s),await this.socket.send(r.E_OPACK,{_i:"_interest",_t:P.Event,_c:{_regEvents:[t]}})}async _unsubscribe(t,s){if(s)this.socket.removeEventListener(t,s);await this.socket.send(r.E_OPACK,{_i:"_interest",_t:P.Event,_c:{_deregEvents:[t]}})}async _sessionStart(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"_sessionStart",_t:P.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:Rt(0,4294967295)}});return y(t)}async _systemInfo(t){let[,s]=await this.socket.exchange(r.E_OPACK,{_i:"_systemInfo",_t:P.Request,_c:{_bf:0,_cf:512,_clFl:128,_i:"cafecafecafe",_idsID:t.toString(),_pubID:"FF:70:79:61:74:76",_sf:256,_sv:"170.18",model:"iPhone10,6",name:"Bas Companion Link"}});return y(s)}async _touchStart(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"_touchStart",_t:P.Request,_c:{_height:H(1000),_tFl:0,_width:H(1000)}});return y(t)}async _tvrcSessionStart(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"TVRCSessionStart",_t:P.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return y(t)}}var Et={Up:1,Down:2,Left:3,Right:4,Menu:5,Select:6,Home:7,VolumeUp:8,VolumeDown:9,Siri:10,Screensaver:11,Sleep:12,Wake:13,PlayPause:14,ChannelIncrement:15,ChannelDecrement:16,Guide:17,PageUp:18,PageDown:19},Lt={Play:1,Pause:2,NextTrack:3,PreviousTrack:4,GetVolume:5,SetVolume:6,SkipBy:7,FastForwardBegin:8,FastForwardEnd:9,RewindBegin:10,RewindEnd:11,GetCaptionSettings:12,SetCaptionSettings:13};function y(t){if(typeof t==="object")return t;throw A("Expected an object.",{obj:t}),Error("Expected an object.")}class U{get internal(){return this.#t}get socket(){return this.#i.socket}#t;#i;constructor(t){this.#t=new J(this.#s.bind(this)),this.#i=t}async start(){await this.#t.start()}async pin(t){return this.#t.pin(t)}async transient(){return this.#t.transient()}async#s(t,s){let i=t==="m1"?r.PS_Start:r.PS_Next,[,n]=await this.socket.exchange(i,{_pd:s,_pwTy:1});if(typeof n!=="object"||n===null)throw Error("Invalid response from receiver.");return n._pd}}class B{get socket(){return this.#i.socket}#t;#i;constructor(t){this.#t=new X(this.#s.bind(this)),this.#i=t}async start(t){let s=await this.#t.start(t),i=S({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),n=S({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:i,controllerToAccessoryKey:n,pairingId:s.pairingId,sharedSecret:s.sharedSecret}}async#s(t,s){let i=t==="m1"?r.PV_Start:r.PV_Next,[,n]=await this.socket.exchange(i,{_pd:s,_auTy:4});if(typeof n!=="object"||n===null)throw Error("Invalid response from receiver.");return n._pd}}class D{get api(){return this.#t}get device(){return this.#i}get socket(){return this.#s}get pairing(){return this.#o}get verify(){return this.#n}#t;#i;#s;#o;#n;constructor(t){this.#i=t,this.#s=new K(t.address,t.service.port),this.#t=new q(this),this.#o=new U(this),this.#n=new B(this)}async connect(){await this.#s.connect()}async disconnect(){await this.#s.disconnect()}}export{D as CompanionLink};
1
+ import{randomInt as Lt}from"node:crypto";import{createCipher as ot,createDecipher as nt}from"chacha";import{randomBytes as ct}from"node:crypto";import{x25519 as Y}from"@noble/curves/ed25519.js";import{hkdfSync as _t}from"node:crypto";import rt from"node-dns-sd";import{createInterface as pt}from"node:readline";import{parse as it}from"@plist/binary.parse";import{serialize as Ft}from"@plist/binary.serialize";import{EventEmitter as St}from"node:events";import{SRP as j,SrpClient as yt}from"fast-srp-hap";import{v4 as ft}from"uuid";import L from"tweetnacl";import{v4 as Qt}from"uuid";var $=12;function I(t,s,i,n,o){s=z(s);let c=nt(t,s);i&&c.setAAD(i),c.setAuthTag(o);let a=c._update(n);return c._final(),a}function V(t,s,i,n){s=z(s);let o=ot(t,s);i&&o.setAAD(i);let c=o._update(n);o._final();let a=o.getAuthTag();return{ciphertext:c,authTag:a}}function z(t){if(t.length>=$)return t;return Buffer.concat([Buffer.alloc($-t.length,0),t])}function at(){let t=ct(32);return{publicKey:Y.getPublicKey(t),secretKey:t}}function mt(t,s){return Y.getSharedSecret(t,s)}function S(t){return Buffer.from(_t(t.hash,t.key,t.salt,t.info,t.length))}var Ut=pt({input:process.stdin,output:process.stdout});function w(...t){}async function F(t){return new Promise((s)=>setTimeout(s,t))}var ht="3939";var Ct="_airplay._tcp.local",kt="_companion-link._tcp.local",ut="_raop._tcp.local";class x{#t;constructor(t){this.#t=t}async find(){return await rt.discover({name:this.#t})}async findUntil(t,s=10,i=1000){while(s>0){let n=await this.find(),o=n.find((c)=>c.fqdn===t);if(o)return o;if(console.log(),console.log(`Device not found, retrying in ${i}ms...`),console.log(n.map((c)=>` ● ${c.fqdn}`).join(`
2
+ `)),s--,s===0)throw Error("Device not found after serveral tries, aborting.");await F(i)}}static airplay(){return new x(Ct)}static companionLink(){return new x(kt)}static raop(){return new x(ut)}}class N extends Number{size;constructor(t,s){super(t);this.size=s}}function T(t,s){return new N(t,s)}class G{value;constructor(t){this.value=t}}function H(t){return new G(t)}class b{value;constructor(t){this.value=t}}function C(t){let s=t.reduce((o,c)=>o+c.length,0),i=new Uint8Array(s),n=0;for(let o of t)i.set(o,n),n+=o.length;return i}function _(t){return Uint8Array.of(t)}function k(t,s){let i=new Uint8Array(s),n=BigInt(t);for(let o=0;o<s;o++)i[o]=Number(n&0xffn),n>>=8n;return i}function f(t){let s=t.reduce((o,c)=>o+c.length,0),i=new Uint8Array(s),n=0;for(let o of t)i.set(o,n),n+=o.length;return i}function M(t){return e(t,[])}function e(t,s){let i=null;if(t===null||t===void 0)i=_(4);else if(typeof t==="boolean")i=_(t?1:2);else if(t instanceof G){let o=new ArrayBuffer(8);new DataView(o).setFloat64(0,t.value,!0),i=C([_(54),new Uint8Array(o)])}else if(t instanceof b){let o=t.value;if(o<40)i=_(8+o);else if(o<=255)i=f([_(48),k(o,1)]);else if(o<=65535)i=f([_(49),k(o,2)]);else if(o<=4294967295)i=f([_(50),k(o,4)]);else i=f([_(51),k(o,8)])}else if(typeof t==="number")if(!Number.isInteger(t)){let o=new ArrayBuffer(8);new DataView(o).setFloat64(0,t,!0),i=C([_(54),new Uint8Array(o)])}else if(t<40)i=_(8+t);else if(t<=255)i=C([_(48),k(t,1)]);else if(t<=65535)i=C([_(49),k(t,2)]);else if(t<=4294967295)i=C([_(50),k(t,4)]);else i=C([_(51),k(t,8)]);else if(t instanceof N)i=C([_(48+Math.log2(t.size)),k(t.valueOf(),t.size)]);else if(typeof t==="string"){let o=new TextEncoder().encode(t),c=o.length;if(c<=32)i=C([_(64+c),o]);else if(c<=255)i=C([_(97),k(c,1),o]);else if(c<=65535)i=C([_(98),k(c,2),o]);else if(c<=16777215)i=C([_(99),k(c,3),o]);else i=C([_(100),k(c,4),o])}else if(t instanceof Uint8Array||Buffer.isBuffer(t)){let o=t instanceof Uint8Array?t:new Uint8Array(t),c=o.length;if(c<=32)i=C([_(112+c),o]);else if(c<=255)i=C([_(145),k(c,1),o]);else if(c<=65535)i=C([_(146),k(c,2),o]);else i=C([_(147),k(c,4),o])}else if(Array.isArray(t)){let o=C(t.map((a)=>e(a,s))),c=t.length;if(c<=15){if(i=C([_(208+c),o]),c>=15)i=C([i,_(3)])}else i=C([_(223),o,_(3)])}else if(typeof t==="object"){let o=Object.keys(t),c=o.length,a=[];for(let h of o)a.push(e(h,s)),a.push(e(t[h],s));let m;if(c<=15)m=_(224+c);else m=_(239);if(i=f([m,f(a)]),c>=15||s.some((h)=>h===i))i=f([i,_(129)])}else throw TypeError(typeof t);let n=s.findIndex((o)=>o.length===i.length&&o.every((c,a)=>c===i[a]));if(n>=0)if(n<33)i=_(160+n);else if(n<=255)i=C([_(193),k(n,1)]);else if(n<=65535)i=C([_(194),k(n,2)]);else if(n<=4294967295)i=C([_(195),k(n,4)]);else i=C([_(196),k(n,8)]);else if(i.length>1)s.push(i);return i}function tt(t){return g(t,[])}function Pt(t,s){if(t.length<s)throw TypeError(`Not enough data: need ${s} bytes, have ${t.length}`)}function R(t,s,i){Pt(t.subarray(s),i);let n=0n;for(let o=i-1;o>=0;o--)n=n<<8n|BigInt(t[s+o]);return Number(n)}function g(t,s){if(t.length===0)throw TypeError("No data to unpack");let i=t[0],n=!0,o,c;if(i===1)o=!0,c=t.subarray(1);else if(i===2)o=!1,c=t.subarray(1);else if(i===4)o=null,c=t.subarray(1);else if(i===5)o=t.subarray(1,17),c=t.subarray(17);else if(i===6)o=R(t,1,8),c=t.subarray(9);else if(i>=8&&i<=47)o=i-8,c=t.subarray(1);else if(i===53)o=new DataView(t.buffer,t.byteOffset+1,4).getFloat32(0,!0),c=t.subarray(5);else if(i===54)o=new DataView(t.buffer,t.byteOffset+1,8).getFloat64(0,!0),c=t.subarray(9);else if((i&240)===48){let a=2**(i&15),m=R(t,1,a);o=T(m,a),c=t.subarray(1+a)}else if(i>=64&&i<=96){let a=i-64;o=new TextDecoder().decode(t.subarray(1,1+a)),c=t.subarray(1+a)}else if(i>=97&&i<=100){let a=i&15,m=R(t,1,a);o=new TextDecoder().decode(t.subarray(1+a,1+a+m)),c=t.subarray(1+a+m)}else if(i>=112&&i<=144){let a=i-112;o=t.subarray(1,1+a),c=t.subarray(1+a)}else if(i>=145&&i<=148){let a=1<<(i&15)-1,m=R(t,1,a),h=1+a;o=t.subarray(h,h+m),c=t.subarray(h+m)}else if((i&240)===208){let a=i&15,m=t.subarray(1),h=[];if(a===15){while(m[0]!==3){let[P,A]=g(m,s);h.push(P),m=A}m=m.subarray(1)}else for(let P=0;P<a;P++){let[A,l]=g(m,s);h.push(A),m=l}o=h,c=m,n=!1}else if((i&224)===224){let a=i&15,m=t.subarray(1),h={};if(a===15){while(m[0]!==3){let[P,A]=g(m,s),[l,D]=g(A,s);h[P]=l,m=D}m=m.subarray(1)}else for(let P=0;P<a;P++){let[A,l]=g(m,s),[D,st]=g(l,s);h[A]=D,m=st}o=h,c=m,n=!1}else if(i>=160&&i<=192){let a=i-160;if(a>=s.length)throw TypeError(`Reference index ${a} out of range`);o=s[a],c=t.subarray(1),n=!1}else if(i>=193&&i<=196){let a=i-192,m=R(t,1,a);if(m>=s.length)throw TypeError(`UID ${m} out of range`);o=s[m],c=t.subarray(1+a),n=!1}else throw TypeError(`Unknown tag 0x${i.toString(16)}`);if(n)s.push(o);return[o,c]}var wt={TransientPairing:16},At={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},E={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},p={Method:0,Identifier:1,Salt:2,PublicKey:3,Proof:4,EncryptedData:5,State:6,Error:7,BackOff:8,Certificate:9,Signature:10,Permissions:11,FragmentData:12,FragmentLast:13,Name:17,Flags:19};function lt(t){if(t.has(p.BackOff)){let s=t.get(p.BackOff),i=s.readUintLE(0,s.length);throw Error(`Device is busy, try again in ${i} seconds.`)}if(t.has(p.Error))throw Error(`Device returned an error code: ${t.get(p.Error).readUint8()}`);throw console.error(t),Error("Invalid response")}function v(t){let s=[];for(let[i,n]of t){let o;if(typeof n==="number")o=Buffer.from([n]);else o=n;let c=0;do{let a=Math.min(o.length-c,255);if(s.push(i,a),a>0)for(let m=0;m<a;m++)s.push(o[c+m]);c+=a}while(c<o.length)}return Buffer.from(s)}function Q(t){let s=new Map,i=0;while(i<t.length){let n=t[i++],o=t[i++],c=new Uint8Array(t).slice(i,i+o);i+=o;let a=s.get(n);if(a)s.set(n,Buffer.concat([a,c]));else s.set(n,Buffer.from(c))}return s}class W extends St{get address(){return this.#t}get port(){return this.#i}#t;#i;constructor(t,s){super();this.#t=t,this.#i=s}async connect(){}async disconnect(){}}class J{#t;#i;#s;#o;#n;#c;constructor(t){this.#t="basmilius/apple-protocols",this.#i=Buffer.from(ft().toUpperCase()),this.#s=t}async start(){let t=L.sign.keyPair();this.#o=Buffer.from(t.publicKey),this.#n=Buffer.from(t.secretKey)}async pin(t){let s=await this.m1(),i=await this.m2(s,await t()),n=await this.m3(i),o=await this.m4(n),c=await this.m5(o),a=await this.m6(o,c);if(!a)throw Error("Pairing failed, could not get accessory keys.");return a}async transient(){let t=await this.m1([[p.Flags,wt.TransientPairing]]),s=await this.m2(t),i=await this.m3(s),n=await this.m4(i),o=S({hash:"sha512",key:n.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Read-Encryption-Key")}),c=S({hash:"sha512",key:n.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Write-Encryption-Key")});return{pairingId:this.#i,sharedSecret:n.sharedSecret,accessoryToControllerKey:o,controllerToAccessoryKey:c}}async m1(t=[]){let s=await this.#s("m1",v([[p.Method,At.PairSetup],[p.State,E.M1],...t])),i=O(s),n=i.get(p.PublicKey),o=i.get(p.Salt);return{publicKey:n,salt:o}}async m2(t,s=ht){let i=await j.genKey(32);this.#c=new yt(j.params.hap,t.salt,Buffer.from("Pair-Setup"),Buffer.from(s),i,!0),this.#c.setB(t.publicKey);let n=this.#c.computeA(),o=this.#c.computeM1();return{publicKey:n,proof:o}}async m3(t){let s=await this.#s("m3",v([[p.State,E.M3],[p.PublicKey,t.publicKey],[p.Proof,t.proof]]));return{serverProof:O(s).get(p.Proof)}}async m4(t){return this.#c.checkM2(t.serverProof),{sharedSecret:this.#c.computeK()}}async m5(t){let s=S({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Controller-Sign-Salt","utf8"),info:Buffer.from("Pair-Setup-Controller-Sign-Info","utf8")}),i=S({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Encrypt-Salt","utf8"),info:Buffer.from("Pair-Setup-Encrypt-Info","utf8")}),n=Buffer.concat([s,this.#i,this.#o]),o=L.sign.detached(n,this.#n),c=v([[p.Identifier,this.#i],[p.PublicKey,this.#o],[p.Signature,Buffer.from(o)],[p.Name,Buffer.from(M({name:this.#t}))]]),{authTag:a,ciphertext:m}=V(i,Buffer.from("PS-Msg05"),null,c),h=Buffer.concat([m,a]),P=await this.#s("m5",v([[p.State,E.M5],[p.EncryptedData,h]])),A=O(P).get(p.EncryptedData),l=A.subarray(0,-16);return{authTag:A.subarray(-16),data:l,sessionKey:i}}async m6(t,s){let i=I(s.sessionKey,Buffer.from("PS-Msg06"),null,s.data,s.authTag),n=Q(i),o=n.get(p.Identifier),c=n.get(p.PublicKey),a=n.get(p.Signature),m=S({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Accessory-Sign-Salt"),info:Buffer.from("Pair-Setup-Accessory-Sign-Info")}),h=Buffer.concat([m,o,c]);if(!L.sign.detached.verify(h,a,c))throw Error("Invalid accessory signature.");return{accessoryIdentifier:o.toString(),accessoryLongTermPublicKey:c,pairingId:this.#i,publicKey:this.#o,secretKey:this.#n}}}class X{#t;#i;constructor(t){this.#t=at(),this.#i=t}async start(t){let s=await this.#s(),i=await this.#o(t.accessoryIdentifier,t.accessoryLongTermPublicKey,s);return await this.#n(t.pairingId,t.secretKey,i),await this.#c(i,t.pairingId)}async#s(){let t=await this.#i("m1",v([[p.State,E.M1],[p.PublicKey,Buffer.from(this.#t.publicKey)]])),s=O(t),i=s.get(p.PublicKey);return{encryptedData:s.get(p.EncryptedData),serverPublicKey:i}}async#o(t,s,i){let n=Buffer.from(mt(this.#t.secretKey,i.serverPublicKey)),o=S({hash:"sha512",key:n,length:32,salt:Buffer.from("Pair-Verify-Encrypt-Salt"),info:Buffer.from("Pair-Verify-Encrypt-Info")}),c=i.encryptedData.subarray(0,-16),a=i.encryptedData.subarray(-16),m=I(o,Buffer.from("PV-Msg02"),null,c,a),h=Q(m),P=h.get(p.Identifier),A=h.get(p.Signature);if(P.toString()!==t)throw Error(`Invalid accessory identifier. Expected ${P.toString()} to be ${t}.`);let l=Buffer.concat([i.serverPublicKey,P,this.#t.publicKey]);if(!L.sign.detached.verify(l,A,s))throw Error("Invalid accessory signature.");return{serverEphemeralPublicKey:i.serverPublicKey,sessionKey:o,sharedSecret:n}}async#n(t,s,i){let n=Buffer.concat([this.#t.publicKey,t,i.serverEphemeralPublicKey]),o=Buffer.from(L.sign.detached(n,s)),c=v([[p.Identifier,t],[p.Signature,o]]),{authTag:a,ciphertext:m}=V(i.sessionKey,Buffer.from("PV-Msg03"),null,c),h=Buffer.concat([m,a]);return await this.#i("m3",v([[p.State,E.M3],[p.EncryptedData,h]])),{}}async#c(t,s){return{accessoryToControllerKey:Buffer.alloc(0),controllerToAccessoryKey:Buffer.alloc(0),pairingId:s,sharedSecret:t.sharedSecret}}}function O(t){let s=Q(t);if(s.has(p.Error))lt(s);return w("Decoded TLV",s),s}import{randomInt as gt}from"node:crypto";import{Socket as vt}from"node:net";var Z=4;class K extends W{get isEncrypted(){return!!this.#n&&!!this.#a}#t;#i={};#s=Buffer.alloc(0);#o;#n;#c;#a;#m;constructor(t,s){super(t,s);this.#m=gt(0,65536),this.onClose=this.onClose.bind(this),this.onConnect=this.onConnect.bind(this),this.onData=this.onData.bind(this),this.onEnd=this.onEnd.bind(this),this.onError=this.onError.bind(this),this.#t=new vt,this.#t.on("close",this.onClose),this.#t.on("connect",this.onConnect),this.#t.on("data",this.onData),this.#t.on("end",this.onEnd),this.#t.on("error",this.onError)}async connect(){return w(`Connecting to ${this.address}:${this.port}...`),await new Promise((t)=>{this.#t.connect({host:this.address,port:this.port,keepAlive:!0},t)})}async disconnect(){this.#t.destroy()}async enableEncryption(t,s){this.#n=t,this.#a=s,this.#o=0,this.#c=0}async exchange(t,s){let i=this.#m;return new Promise((n,o)=>{if(Et.includes(t))this.#i[-1]=n;else this.#i[i]=n;this.send(t,s).catch(o)})}async send(t,s){let i=this.#m++;s._x??=T(i,8);let n=Buffer.from(M(s)),o=n.byteLength;if(this.isEncrypted&&o>0)o+=16;let c=Buffer.alloc(4);c.writeUint8(t,0),c.writeUintBE(o,1,3);let a;if(this.isEncrypted){let m=Buffer.alloc(12);m.writeBigUInt64LE(BigInt(this.#c++),0);let h=V(this.#a,m,c,n);a=Buffer.concat([c,h.ciphertext,h.authTag])}else a=Buffer.concat([c,n]);return w("Send data frame",this.isEncrypted,Buffer.from(a).toString("hex"),s),new Promise((m,h)=>{this.#t.write(a,(P)=>P&&h(P)),m()})}async onClose(){w(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){w(`Connected to ${this.address}:${this.port}`)}async onData(t){this.#s=Buffer.concat([this.#s,t]);while(this.#s.byteLength>=Z){let s=this.#s.subarray(0,Z),i=s.readUintBE(1,3),n=Z+i;if(this.#s.byteLength<n){w(`Not enough data yet, waiting on the next frame.. needed=${n} available=${this.#s.byteLength} receivedLength=${t.byteLength}`);return}w(`Frame found length=${n} availableLength=${this.#s.byteLength} receivedLength=${t.byteLength}`);let o=Buffer.from(this.#s.subarray(0,n));this.#s=this.#s.subarray(n),w(`Handle frame, ${this.#s.byteLength} bytes left...`);let a=(await this.#_(o)).subarray(4,n);await this.#r(s,a)}}async onEnd(){w("Connection ended")}async onError(t){w("Error received",t)}async#_(t){if(!this.isEncrypted)return t;let s=t.subarray(0,4),i=s.readUintBE(1,3),n=t.subarray(4,4+i),o=n.subarray(n.byteLength-16),c=n.subarray(0,n.byteLength-16),a=Buffer.alloc(12);a.writeBigUint64LE(BigInt(this.#o++),0);let m=I(this.#n,a,s,c,o);return Buffer.concat([s,m,o])}async#r(t,s){let i=t.readInt8();if(!Rt.includes(i))w("Packet not handled, no opack frame.");if([s]=tt(s),w("Decoded OPACK",{header:t,payload:s}),"_x"in s){let n=s._x;if(n in this.#i)(this.#i[n]??null)?.([t,s]),delete this.#i[n];else if("_i"in s)this.emit(s._i,s._c);else{let o=s._c,c=Object.keys(o).map((a)=>a.substring(0,-3));for(let a of c)this.emit(a,o[a])}}else if(this.#i[-1])(this.#i[-1]??null)?.([t,s]),delete this.#i[-1];else w("No handler for message",[t,s])}}var r={Unknown:0,Noop:1,PS_Start:3,PS_Next:4,PV_Start:5,PV_Next:6,U_OPACK:7,E_OPACK:8,P_OPACK:9,PA_Request:10,PA_Response:11,SessionStartRequest:16,SessionStartResponse:17,SessionData:18,FamilyIdentityRequest:32,FamilyIdentityResponse:33,FamilyIdentityUpdate:34},u={Event:1,Request:2,Response:3},Rt=[r.PS_Start,r.PS_Next,r.PV_Start,r.PV_Next,r.U_OPACK,r.E_OPACK,r.P_OPACK],Et=[r.PS_Start,r.PS_Next,r.PV_Start,r.PV_Next];class q{get socket(){return this.#t.socket}#t;constructor(t){this.#t=t}async fetchMediaControlStatus(){await this.socket.exchange(r.E_OPACK,{_i:"FetchMediaControlStatus",_t:u.Request,_c:{}})}async fetchNowPlayingInfo(){await this.socket.exchange(r.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:u.Request,_c:{}})}async fetchSupportedActions(){await this.socket.exchange(r.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:u.Request,_c:{}})}async getAttentionState(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchAttentionState",_t:u.Request,_c:{}}),{_c:s}=y(t);switch(s.state){case 1:return"asleep";case 2:return"screensaver";case 3:return"awake";case 4:return"idle";default:return"unknown"}}async getLaunchableApps(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchLaunchableApplicationsEvent",_t:u.Request,_c:{}}),{_c:s}=y(t);return Object.entries(s).map(([i,n])=>({bundleId:i,name:n}))}async getSiriRemoteInfo(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:u.Request,_c:{}});return it(Buffer.from(t._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"FetchUserAccountsEvent",_t:u.Request,_c:{}}),{_c:s}=y(t);return Object.entries(s).map(([i,n])=>({accountId:i,name:n}))}async hidCommand(t,s=!1){await this.socket.exchange(r.E_OPACK,{_i:"_hidC",_t:u.Request,_c:{_hBtS:s?1:2,_hidC:xt[t]}})}async launchApp(t){await this.socket.exchange(r.E_OPACK,{_i:"_launchApp",_t:u.Request,_c:{_bundleID:t}})}async launchUrl(t){await this.socket.exchange(r.E_OPACK,{_i:"_launchApp",_t:u.Request,_c:{_urlS:t}})}async mediaControlCommand(t,s){let[,i]=await this.socket.exchange(r.E_OPACK,{_i:"_mcc",_t:u.Request,_c:{_mcc:et[t],...s||{}}});return y(i)}async pressButton(t,s="SingleTap",i=500){switch(s){case"DoubleTap":await this.hidCommand(t,!0),await this.hidCommand(t,!1),await this.hidCommand(t,!0),await this.hidCommand(t,!1);break;case"Hold":await this.hidCommand(t,!0),await F(i),await this.hidCommand(t,!1);break;case"SingleTap":await this.hidCommand(t,!0),await this.hidCommand(t,!1);break}}async switchUserAccount(t){await this.socket.exchange(r.E_OPACK,{_i:"SwitchUserAccountEvent",_t:u.Request,_c:{SwitchAccountID:t}})}async _subscribe(t,s){this.socket.on(t,s),await this.socket.send(r.E_OPACK,{_i:"_interest",_t:u.Event,_c:{_regEvents:[t]}})}async _unsubscribe(t,s){if(s)this.socket.off(t,s);await this.socket.send(r.E_OPACK,{_i:"_interest",_t:u.Event,_c:{_deregEvents:[t]}})}async _sessionStart(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"_sessionStart",_t:u.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:Lt(0,4294967295)}});return y(t)}async _systemInfo(t){let[,s]=await this.socket.exchange(r.E_OPACK,{_i:"_systemInfo",_t:u.Request,_c:{_bf:0,_cf:512,_clFl:128,_i:"cafecafecafe",_idsID:t.toString(),_pubID:"FF:70:79:61:74:76",_sf:256,_sv:"170.18",model:"iPhone10,6",name:"Bas Companion Link"}});return y(s)}async _touchStart(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"_touchStart",_t:u.Request,_c:{_height:H(1000),_tFl:0,_width:H(1000)}});return y(t)}async _tvrcSessionStart(){let[,t]=await this.socket.exchange(r.E_OPACK,{_i:"TVRCSessionStart",_t:u.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return y(t)}}var xt={Up:1,Down:2,Left:3,Right:4,Menu:5,Select:6,Home:7,VolumeUp:8,VolumeDown:9,Siri:10,Screensaver:11,Sleep:12,Wake:13,PlayPause:14,ChannelIncrement:15,ChannelDecrement:16,Guide:17,PageUp:18,PageDown:19},et={Play:1,Pause:2,NextTrack:3,PreviousTrack:4,GetVolume:5,SetVolume:6,SkipBy:7,FastForwardBegin:8,FastForwardEnd:9,RewindBegin:10,RewindEnd:11,GetCaptionSettings:12,SetCaptionSettings:13};function y(t){if(typeof t==="object")return t;throw w("Expected an object.",{obj:t}),Error("Expected an object.")}class B{get internal(){return this.#t}get socket(){return this.#i.socket}#t;#i;constructor(t){this.#t=new J(this.#s.bind(this)),this.#i=t}async start(){await this.#t.start()}async pin(t){return this.#t.pin(t)}async transient(){return this.#t.transient()}async#s(t,s){let i=t==="m1"?r.PS_Start:r.PS_Next,[,n]=await this.socket.exchange(i,{_pd:s,_pwTy:1});if(typeof n!=="object"||n===null)throw Error("Invalid response from receiver.");return n._pd}}class U{get socket(){return this.#i.socket}#t;#i;constructor(t){this.#t=new X(this.#s.bind(this)),this.#i=t}async start(t){let s=await this.#t.start(t),i=S({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),n=S({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:i,controllerToAccessoryKey:n,pairingId:s.pairingId,sharedSecret:s.sharedSecret}}async#s(t,s){let i=t==="m1"?r.PV_Start:r.PV_Next,[,n]=await this.socket.exchange(i,{_pd:s,_auTy:4});if(typeof n!=="object"||n===null)throw Error("Invalid response from receiver.");return n._pd}}class d{get api(){return this.#t}get device(){return this.#i}get socket(){return this.#s}get pairing(){return this.#o}get verify(){return this.#n}#t;#i;#s;#o;#n;constructor(t){this.#i=t,this.#s=new K(t.address,t.service.port),this.#t=new q(this),this.#o=new B(this),this.#n=new U(this)}async connect(){await this.#s.connect()}async disconnect(){await this.#s.disconnect()}}export{d as CompanionLink};
3
3
 
4
- //# debugId=4B1DCB09002E1C1C64756E2164756E21
4
+ //# debugId=4F4051D7A01F524764756E2164756E21
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -2,14 +2,14 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/protocol/api.ts", "../../common/dist/index.js", "../src/protocol/socket.ts", "../src/protocol/pairing.ts", "../src/protocol/verify.ts", "../src/protocol/protocol.ts"],
4
4
  "sourcesContent": [
5
- "import { randomInt } from 'node:crypto';\nimport { debug, opackFloat, parseBinaryPlist, waitFor } from '@basmilius/apple-common';\nimport { type default as CompanionLinkSocket, FrameType, MessageType } from './socket';\nimport type CompanionLink from './protocol';\n\nexport default class CompanionLinkApi {\n get socket(): CompanionLinkSocket {\n return this.#protocol.socket;\n }\n\n readonly #protocol: CompanionLink;\n\n constructor(protocol: CompanionLink) {\n this.#protocol = protocol;\n }\n\n async fetchMediaControlStatus(): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchMediaControlStatus',\n _t: MessageType.Request,\n _c: {}\n });\n }\n\n async fetchNowPlayingInfo(): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchCurrentNowPlayingInfoEvent',\n _t: MessageType.Request,\n _c: {}\n });\n }\n\n async fetchSupportedActions(): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchSupportedActionsEvent',\n _t: MessageType.Request,\n _c: {}\n });\n }\n\n async getAttentionState(): Promise<AttentionState> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchAttentionState',\n _t: MessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<AttentionStateResponse>(payload);\n\n switch (_c.state) {\n case 0x01:\n return 'asleep';\n\n case 0x02:\n return 'screensaver';\n\n case 0x03:\n return 'awake';\n\n case 0x04:\n return 'idle';\n\n default:\n return 'unknown';\n }\n }\n\n async getLaunchableApps(): Promise<LaunchableApp[]> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchLaunchableApplicationsEvent',\n _t: MessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<LaunchableAppsResponse>(payload);\n\n return Object.entries(_c).map(([bundleId, name]) => ({\n bundleId,\n name\n }));\n }\n\n async getSiriRemoteInfo(): Promise<any> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchSiriRemoteInfo',\n _t: MessageType.Request,\n _c: {}\n });\n\n return parseBinaryPlist(Buffer.from(payload['_c']['SiriRemoteInfoKey']).buffer);\n }\n\n async getUserAccounts(): Promise<UserAccount[]> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchUserAccountsEvent',\n _t: MessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<UserAccountsResponse>(payload);\n\n return Object.entries(_c).map(([accountId, name]) => ({\n accountId,\n name\n }));\n }\n\n async hidCommand(command: keyof typeof HidCommand, down = false): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_hidC',\n _t: MessageType.Request,\n _c: {\n _hBtS: down ? 1 : 2,\n _hidC: HidCommand[command]\n }\n });\n }\n\n async launchApp(bundleId: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_launchApp',\n _t: MessageType.Request,\n _c: {\n _bundleID: bundleId\n }\n });\n }\n\n async launchUrl(url: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_launchApp',\n _t: MessageType.Request,\n _c: {\n _urlS: url\n }\n });\n }\n\n async mediaControlCommand(command: keyof typeof MediaControlCommand, content?: object): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_mcc',\n _t: MessageType.Request,\n _c: {\n _mcc: MediaControlCommand[command],\n ...(content || {})\n }\n });\n\n return objectOrFail(payload);\n }\n\n async pressButton(command: keyof typeof HidCommand, type: ButtonPressType = 'SingleTap', holdDelayMs = 500): Promise<void> {\n switch (type) {\n case 'DoubleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n\n case 'Hold':\n await this.hidCommand(command, true);\n await waitFor(holdDelayMs);\n await this.hidCommand(command, false);\n break;\n\n case 'SingleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n }\n }\n\n async switchUserAccount(accountId: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'SwitchUserAccountEvent',\n _t: MessageType.Request,\n _c: {\n SwitchAccountID: accountId\n }\n });\n }\n\n async _subscribe(event: string, fn: EventListener): Promise<void> {\n this.socket.addEventListener(event, fn);\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _regEvents: [event]\n }\n });\n }\n\n async _unsubscribe(event: string, fn?: EventListener): Promise<void> {\n if (fn) {\n this.socket.removeEventListener(event, fn);\n }\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _deregEvents: [event]\n }\n });\n }\n\n async _sessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_sessionStart',\n _t: MessageType.Request,\n _c: {\n _srvT: 'com.apple.tvremoteservices',\n _sid: randomInt(0, 2 ** 32 - 1)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _systemInfo(pairingId: Buffer): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_systemInfo',\n _t: MessageType.Request,\n _c: {\n _bf: 0,\n _cf: 512,\n _clFl: 128,\n _i: 'cafecafecafe',\n _idsID: pairingId.toString(),\n _pubID: 'FF:70:79:61:74:76',\n _sf: 256,\n _sv: '170.18',\n model: 'iPhone10,6',\n name: 'Bas Companion Link'\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _touchStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_touchStart',\n _t: MessageType.Request,\n _c: {\n _height: opackFloat(1000.0),\n _tFl: 0,\n _width: opackFloat(1000.0)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _tvrcSessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'TVRCSessionStart',\n _t: MessageType.Request,\n _btHP: false,\n _inUseProc: 'tvremoted',\n _c: {}\n });\n\n return objectOrFail(payload);\n }\n}\n\nconst HidCommand = {\n Up: 1,\n Down: 2,\n Left: 3,\n Right: 4,\n Menu: 5,\n Select: 6,\n Home: 7,\n VolumeUp: 8,\n VolumeDown: 9,\n Siri: 10,\n Screensaver: 11,\n Sleep: 12,\n Wake: 13,\n PlayPause: 14,\n ChannelIncrement: 15,\n ChannelDecrement: 16,\n Guide: 17,\n PageUp: 18,\n PageDown: 19\n} as const;\n\nconst MediaControlCommand = {\n Play: 1,\n Pause: 2,\n NextTrack: 3,\n PreviousTrack: 4,\n GetVolume: 5,\n SetVolume: 6,\n SkipBy: 7,\n FastForwardBegin: 8,\n FastForwardEnd: 9,\n RewindBegin: 10,\n RewindEnd: 11,\n GetCaptionSettings: 12,\n SetCaptionSettings: 13\n} as const;\n\ntype ButtonPressType =\n | 'DoubleTap'\n | 'Hold'\n | 'SingleTap';\n\nfunction objectOrFail<T = object>(obj: unknown): T {\n if (typeof obj === 'object') {\n return obj as T;\n }\n\n debug('Expected an object.', {obj});\n\n throw new Error('Expected an object.');\n}\n\ntype AttentionState =\n | 'unknown'\n | 'asleep'\n | 'screensaver'\n | 'awake'\n | 'idle';\n\ntype AttentionStateResponse = {\n readonly _c: {\n readonly state: number;\n };\n};\n\ntype LaunchableApp = {\n readonly bundleId: string;\n readonly name: string;\n};\n\ntype LaunchableAppsResponse = {\n readonly _c: Record<string, string>;\n};\n\ntype UserAccount = {\n readonly accountId: string;\n readonly name: string;\n};\n\ntype UserAccountsResponse = {\n readonly _c: Record<string, string>;\n};\n",
6
- "import{createCipher as te,createDecipher as ne}from\"chacha\";var q=12;function A(e,n,r,o,t){n=$(n);let s=ne(e,n);r&&s.setAAD(r),s.setAuthTag(t);let i=s._update(o);return s._final(),i}function I(e,n,r,o){n=$(n);let t=te(e,n);r&&t.setAAD(r);let s=t._update(o);t._final();let i=t.getAuthTag();return{ciphertext:s,authTag:i}}function $(e){if(e.length>=q)return e;return Buffer.concat([Buffer.alloc(q-e.length,0),e])}import{randomBytes as se}from\"node:crypto\";import{x25519 as z}from\"@noble/curves/ed25519.js\";function T(){let e=se(32);return{publicKey:z.getPublicKey(e),secretKey:e}}function k(e,n){return z.getSharedSecret(e,n)}import{hkdfSync as oe}from\"node:crypto\";function x(e){return Buffer.from(oe(e.hash,e.key,e.salt,e.info,e.length))}import ae from\"node-dns-sd\";import{createInterface as ie}from\"node:readline\";var fe=ie({input:process.stdin,output:process.stdout});function H(...e){console.debug(\"\\x1B[36m[debug]\\x1B[39m\",...e)}async function ke(e){return await new Promise((n)=>fe.question(`${e}: `,n))}async function Y(e){return new Promise((n)=>setTimeout(n,e))}var L=\"3939\",Ce=15000,W=\"_airplay._tcp.local\",X=\"_companion-link._tcp.local\",Z=\"_raop._tcp.local\";class B{#e;constructor(e){this.#e=e}async find(){return await ae.discover({name:this.#e})}async findUntil(e,n=10,r=1000){while(n>0){let o=await this.find(),t=o.find((s)=>s.fqdn===e);if(t)return t;if(console.log(),console.log(`Device not found, retrying in ${r}ms...`),console.log(o.map((s)=>` ● ${s.fqdn}`).join(`\n`)),n--,n===0)throw Error(\"Device not found after serveral tries, aborting.\");await Y(r)}}static airplay(){return new B(W)}static companionLink(){return new B(X)}static raop(){return new B(Z)}}class U extends Number{size;constructor(e,n){super(e);this.size=n}}function J(e,n){return new U(e,n)}class C{value;constructor(e){this.value=e}}function ce(e){return new C(e)}class D{value;constructor(e){this.value=e}}function ue(e){return new D(e)}function l(e){let n=e.reduce((t,s)=>t+s.length,0),r=new Uint8Array(n),o=0;for(let t of e)r.set(t,o),o+=t.length;return r}function a(e){return Uint8Array.of(e)}function y(e,n){let r=new Uint8Array(n),o=BigInt(e);for(let t=0;t<n;t++)r[t]=Number(o&0xffn),o>>=8n;return r}function g(e){let n=e.reduce((t,s)=>t+s.length,0),r=new Uint8Array(n),o=0;for(let t of e)r.set(t,o),o+=t.length;return r}function R(e){return M(e,[])}function M(e,n){let r=null;if(e===null||e===void 0)r=a(4);else if(typeof e===\"boolean\")r=a(e?1:2);else if(e instanceof C){let t=new ArrayBuffer(8);new DataView(t).setFloat64(0,e.value,!0),r=l([a(54),new Uint8Array(t)])}else if(e instanceof D){let t=e.value;if(t<40)r=a(8+t);else if(t<=255)r=g([a(48),y(t,1)]);else if(t<=65535)r=g([a(49),y(t,2)]);else if(t<=4294967295)r=g([a(50),y(t,4)]);else r=g([a(51),y(t,8)])}else if(typeof e===\"number\")if(!Number.isInteger(e)){let t=new ArrayBuffer(8);new DataView(t).setFloat64(0,e,!0),r=l([a(54),new Uint8Array(t)])}else if(e<40)r=a(8+e);else if(e<=255)r=l([a(48),y(e,1)]);else if(e<=65535)r=l([a(49),y(e,2)]);else if(e<=4294967295)r=l([a(50),y(e,4)]);else r=l([a(51),y(e,8)]);else if(e instanceof U)r=l([a(48+Math.log2(e.size)),y(e.valueOf(),e.size)]);else if(typeof e===\"string\"){let t=new TextEncoder().encode(e),s=t.length;if(s<=32)r=l([a(64+s),t]);else if(s<=255)r=l([a(97),y(s,1),t]);else if(s<=65535)r=l([a(98),y(s,2),t]);else if(s<=16777215)r=l([a(99),y(s,3),t]);else r=l([a(100),y(s,4),t])}else if(e instanceof Uint8Array||Buffer.isBuffer(e)){let t=e instanceof Uint8Array?e:new Uint8Array(e),s=t.length;if(s<=32)r=l([a(112+s),t]);else if(s<=255)r=l([a(145),y(s,1),t]);else if(s<=65535)r=l([a(146),y(s,2),t]);else r=l([a(147),y(s,4),t])}else if(Array.isArray(e)){let t=l(e.map((i)=>M(i,n))),s=e.length;if(s<=15){if(r=l([a(208+s),t]),s>=15)r=l([r,a(3)])}else r=l([a(223),t,a(3)])}else if(typeof e===\"object\"){let t=Object.keys(e),s=t.length,i=[];for(let u of t)i.push(M(u,n)),i.push(M(e[u],n));let f;if(s<=15)f=a(224+s);else f=a(239);if(r=g([f,g(i)]),s>=15||n.some((u)=>u===r))r=g([r,a(129)])}else throw TypeError(typeof e);let o=n.findIndex((t)=>t.length===r.length&&t.every((s,i)=>s===r[i]));if(o>=0)if(o<33)r=a(160+o);else if(o<=255)r=l([a(193),y(o,1)]);else if(o<=65535)r=l([a(194),y(o,2)]);else if(o<=4294967295)r=l([a(195),y(o,4)]);else r=l([a(196),y(o,8)]);else if(r.length>1)n.push(r);return r}function le(e){return P(e,[])}function ye(e,n){if(e.length<n)throw TypeError(`Not enough data: need ${n} bytes, have ${e.length}`)}function v(e,n,r){ye(e.subarray(n),r);let o=0n;for(let t=r-1;t>=0;t--)o=o<<8n|BigInt(e[n+t]);return Number(o)}function P(e,n){if(e.length===0)throw TypeError(\"No data to unpack\");let r=e[0],o=!0,t,s;if(r===1)t=!0,s=e.subarray(1);else if(r===2)t=!1,s=e.subarray(1);else if(r===4)t=null,s=e.subarray(1);else if(r===5)t=e.subarray(1,17),s=e.subarray(17);else if(r===6)t=v(e,1,8),s=e.subarray(9);else if(r>=8&&r<=47)t=r-8,s=e.subarray(1);else if(r===53)t=new DataView(e.buffer,e.byteOffset+1,4).getFloat32(0,!0),s=e.subarray(5);else if(r===54)t=new DataView(e.buffer,e.byteOffset+1,8).getFloat64(0,!0),s=e.subarray(9);else if((r&240)===48){let i=2**(r&15),f=v(e,1,i);t=J(f,i),s=e.subarray(1+i)}else if(r>=64&&r<=96){let i=r-64;t=new TextDecoder().decode(e.subarray(1,1+i)),s=e.subarray(1+i)}else if(r>=97&&r<=100){let i=r&15,f=v(e,1,i);t=new TextDecoder().decode(e.subarray(1+i,1+i+f)),s=e.subarray(1+i+f)}else if(r>=112&&r<=144){let i=r-112;t=e.subarray(1,1+i),s=e.subarray(1+i)}else if(r>=145&&r<=148){let i=1<<(r&15)-1,f=v(e,1,i),u=1+i;t=e.subarray(u,u+f),s=e.subarray(u+f)}else if((r&240)===208){let i=r&15,f=e.subarray(1),u=[];if(i===15){while(f[0]!==3){let[p,m]=P(f,n);u.push(p),f=m}f=f.subarray(1)}else for(let p=0;p<i;p++){let[m,d]=P(f,n);u.push(m),f=d}t=u,s=f,o=!1}else if((r&224)===224){let i=r&15,f=e.subarray(1),u={};if(i===15){while(f[0]!==3){let[p,m]=P(f,n),[d,w]=P(m,n);u[p]=d,f=w}f=f.subarray(1)}else for(let p=0;p<i;p++){let[m,d]=P(f,n),[w,N]=P(d,n);u[m]=w,f=N}t=u,s=f,o=!1}else if(r>=160&&r<=192){let i=r-160;if(i>=n.length)throw TypeError(`Reference index ${i} out of range`);t=n[i],s=e.subarray(1),o=!1}else if(r>=193&&r<=196){let i=r-192,f=v(e,1,i);if(f>=n.length)throw TypeError(`UID ${f} out of range`);t=n[f],s=e.subarray(1+i),o=!1}else throw TypeError(`Unknown tag 0x${r.toString(16)}`);if(o)n.push(t);return[t,s]}import{parse as pe}from\"@plist/binary.parse\";import{serialize as me}from\"@plist/binary.serialize\";var V={TransientPairing:16},F={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},b={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},c={Method:0,Identifier:1,Salt:2,PublicKey:3,Proof:4,EncryptedData:5,State:6,Error:7,BackOff:8,Certificate:9,Signature:10,Permissions:11,FragmentData:12,FragmentLast:13,Name:17,Flags:19};function O(e){if(e.has(c.BackOff)){let n=e.get(c.BackOff),r=n.readUintLE(0,n.length);throw Error(`Device is busy, try again in ${r} seconds.`)}if(e.has(c.Error))throw Error(`Device returned an error code: ${e.get(c.Error).readUint8()}`);throw console.error(e),Error(\"Invalid response\")}function h(e){let n=[];for(let[r,o]of e){let t;if(typeof o===\"number\")t=Buffer.from([o]);else t=o;let s=0;do{let i=Math.min(t.length-s,255);if(n.push(r,i),i>0)for(let f=0;f<i;f++)n.push(t[s+f]);s+=i}while(s<t.length)}return Buffer.from(n)}function S(e){let n=new Map,r=0;while(r<e.length){let o=e[r++],t=e[r++],s=new Uint8Array(e).slice(r,r+t);r+=t;let i=n.get(o);if(i)n.set(o,Buffer.concat([i,s]));else n.set(o,Buffer.from(s))}return n}import{networkInterfaces as de}from\"node:os\";function Q(){let e=de();for(let n of Object.keys(e)){let r=e[n];if(!r)continue;for(let o of r){if(o.internal||o.family!==\"IPv4\")continue;if(o.address&&o.address!==\"127.0.0.1\")return o.address}}return null}import{networkInterfaces as xe}from\"node:os\";function G(){let e=xe();for(let n of Object.keys(e)){let r=e[n];if(!r)continue;for(let o of r){if(o.internal||o.family!==\"IPv4\")continue;if(o.mac&&o.mac!==\"00:00:00:00:00:00\")return o.mac.toUpperCase()}}return null}class _ extends EventTarget{get address(){return this.#e}get port(){return this.#r}#e;#r;constructor(e,n){super();this.#e=e,this.#r=n}async connect(){}async disconnect(){}}import{SRP as j,SrpClient as he}from\"fast-srp-hap\";import{v4 as ge}from\"uuid\";import K from\"tweetnacl\";class ee{#e;#r;#n;#s;#o;#t;constructor(e){this.#e=\"basmilius/apple-protocols\",this.#r=Buffer.from(ge().toUpperCase()),this.#n=e}async start(){let e=K.sign.keyPair();this.#s=Buffer.from(e.publicKey),this.#o=Buffer.from(e.secretKey)}async pin(e){let n=await this.m1(),r=await this.m2(n,await e()),o=await this.m3(r),t=await this.m4(o),s=await this.m5(t),i=await this.m6(t,s);if(!i)throw Error(\"Pairing failed, could not get accessory keys.\");return i}async transient(){let e=await this.m1([[c.Flags,V.TransientPairing]]),n=await this.m2(e),r=await this.m3(n),o=await this.m4(r),t=x({hash:\"sha512\",key:o.sharedSecret,length:32,salt:Buffer.from(\"Control-Salt\"),info:Buffer.from(\"Control-Read-Encryption-Key\")}),s=x({hash:\"sha512\",key:o.sharedSecret,length:32,salt:Buffer.from(\"Control-Salt\"),info:Buffer.from(\"Control-Write-Encryption-Key\")});return{pairingId:this.#r,sharedSecret:o.sharedSecret,accessoryToControllerKey:t,controllerToAccessoryKey:s}}async m1(e=[]){let n=await this.#n(\"m1\",h([[c.Method,F.PairSetup],[c.State,b.M1],...e])),r=E(n),o=r.get(c.PublicKey),t=r.get(c.Salt);return{publicKey:o,salt:t}}async m2(e,n=L){let r=await j.genKey(32);this.#t=new he(j.params.hap,e.salt,Buffer.from(\"Pair-Setup\"),Buffer.from(n),r,!0),this.#t.setB(e.publicKey);let o=this.#t.computeA(),t=this.#t.computeM1();return{publicKey:o,proof:t}}async m3(e){let n=await this.#n(\"m3\",h([[c.State,b.M3],[c.PublicKey,e.publicKey],[c.Proof,e.proof]]));return{serverProof:E(n).get(c.Proof)}}async m4(e){return this.#t.checkM2(e.serverProof),{sharedSecret:this.#t.computeK()}}async m5(e){let n=x({hash:\"sha512\",key:e.sharedSecret,length:32,salt:Buffer.from(\"Pair-Setup-Controller-Sign-Salt\",\"utf8\"),info:Buffer.from(\"Pair-Setup-Controller-Sign-Info\",\"utf8\")}),r=x({hash:\"sha512\",key:e.sharedSecret,length:32,salt:Buffer.from(\"Pair-Setup-Encrypt-Salt\",\"utf8\"),info:Buffer.from(\"Pair-Setup-Encrypt-Info\",\"utf8\")}),o=Buffer.concat([n,this.#r,this.#s]),t=K.sign.detached(o,this.#o),s=h([[c.Identifier,this.#r],[c.PublicKey,this.#s],[c.Signature,Buffer.from(t)],[c.Name,Buffer.from(R({name:this.#e}))]]),{authTag:i,ciphertext:f}=I(r,Buffer.from(\"PS-Msg05\"),null,s),u=Buffer.concat([f,i]),p=await this.#n(\"m5\",h([[c.State,b.M5],[c.EncryptedData,u]])),d=E(p).get(c.EncryptedData),w=d.subarray(0,-16);return{authTag:d.subarray(-16),data:w,sessionKey:r}}async m6(e,n){let r=A(n.sessionKey,Buffer.from(\"PS-Msg06\"),null,n.data,n.authTag),o=S(r),t=o.get(c.Identifier),s=o.get(c.PublicKey),i=o.get(c.Signature),f=x({hash:\"sha512\",key:e.sharedSecret,length:32,salt:Buffer.from(\"Pair-Setup-Accessory-Sign-Salt\"),info:Buffer.from(\"Pair-Setup-Accessory-Sign-Info\")}),u=Buffer.concat([f,t,s]);if(!K.sign.detached.verify(u,i,s))throw Error(\"Invalid accessory signature.\");return{accessoryIdentifier:t.toString(),accessoryLongTermPublicKey:s,pairingId:this.#r,publicKey:this.#s,secretKey:this.#o}}}class re{#e;#r;constructor(e){this.#e=T(),this.#r=e}async start(e){let n=await this.#n(),r=await this.#s(e.accessoryIdentifier,e.accessoryLongTermPublicKey,n);return await this.#o(e.pairingId,e.secretKey,r),await this.#t(r,e.pairingId)}async#n(){let e=await this.#r(\"m1\",h([[c.State,b.M1],[c.PublicKey,Buffer.from(this.#e.publicKey)]])),n=E(e),r=n.get(c.PublicKey);return{encryptedData:n.get(c.EncryptedData),serverPublicKey:r}}async#s(e,n,r){let o=Buffer.from(k(this.#e.secretKey,r.serverPublicKey)),t=x({hash:\"sha512\",key:o,length:32,salt:Buffer.from(\"Pair-Verify-Encrypt-Salt\"),info:Buffer.from(\"Pair-Verify-Encrypt-Info\")}),s=r.encryptedData.subarray(0,-16),i=r.encryptedData.subarray(-16),f=A(t,Buffer.from(\"PV-Msg02\"),null,s,i),u=S(f),p=u.get(c.Identifier),m=u.get(c.Signature);if(p.toString()!==e)throw Error(`Invalid accessory identifier. Expected ${p.toString()} to be ${e}.`);let d=Buffer.concat([r.serverPublicKey,p,this.#e.publicKey]);if(!K.sign.detached.verify(d,m,n))throw Error(\"Invalid accessory signature.\");return{serverEphemeralPublicKey:r.serverPublicKey,sessionKey:t,sharedSecret:o}}async#o(e,n,r){let o=Buffer.concat([this.#e.publicKey,e,r.serverEphemeralPublicKey]),t=Buffer.from(K.sign.detached(o,n)),s=h([[c.Identifier,e],[c.Signature,t]]),{authTag:i,ciphertext:f}=I(r.sessionKey,Buffer.from(\"PV-Msg03\"),null,s),u=Buffer.concat([f,i]);return await this.#r(\"m3\",h([[c.State,b.M3],[c.EncryptedData,u]])),{}}async#t(e,n){return{accessoryToControllerKey:Buffer.alloc(0),controllerToAccessoryKey:Buffer.alloc(0),pairingId:n,sharedSecret:e.sharedSecret}}}function E(e){let n=S(e);if(n.has(c.Error))O(n);return H(\"Decoded TLV\",n),n}import{v4 as wr}from\"uuid\";export{Y as waitFor,wr as uuid,me as serializeBinaryPlist,ke as prompt,pe as parseBinaryPlist,J as opackSizedInt,ue as opackInt,ce as opackFloat,x as hkdf,G as getMacAddress,Q as getLocalIP,k as generateCurve25519SharedSecKey,T as generateCurve25519KeyPair,I as encryptChacha20,h as encodeTlv,R as encodeOPack,A as decryptChacha20,S as decodeTlv,le as decodeOPack,H as debug,O as bailTlv,c as TlvValue,b as TlvState,F as TlvMethod,V as TlvFlags,Z as RAOP_SERVICE,Ce as HTTP_TIMEOUT,B as Discovery,X as COMPANION_LINK_SERVICE,_ as BaseSocket,re as AccessoryVerify,ee as AccessoryPair,L as AIRPLAY_TRANSIENT_PIN,W as AIRPLAY_SERVICE};\n\n//# debugId=FD90C40C2E246C2F64756E2164756E21\n//# sourceMappingURL=index.js.map\n",
7
- "import { randomInt } from 'node:crypto';\nimport { Socket } from 'node:net';\nimport { BaseSocket, debug, decodeOPack, decryptChacha20, encodeOPack, encryptChacha20, opackSizedInt } from '@basmilius/apple-common';\n\nconst HEADER_BYTES = 4;\n\nexport default class CompanionLinkSocket extends BaseSocket {\n get isEncrypted(): boolean {\n return !!this.#readKey && !!this.#writeKey;\n }\n\n readonly #socket: Socket;\n readonly #queue: Record<number, Function> = {};\n #buffer: Buffer = Buffer.alloc(0);\n #readCount: number;\n #readKey?: Buffer;\n #writeCount: number;\n #writeKey?: Buffer;\n #xid: number;\n\n constructor(address: string, port: number) {\n super(address, port);\n\n this.#xid = randomInt(0, 2 ** 16);\n\n this.onClose = this.onClose.bind(this);\n this.onConnect = this.onConnect.bind(this);\n this.onData = this.onData.bind(this);\n this.onEnd = this.onEnd.bind(this);\n this.onError = this.onError.bind(this);\n\n this.#socket = new Socket();\n this.#socket.on('close', this.onClose);\n this.#socket.on('connect', this.onConnect);\n this.#socket.on('data', this.onData);\n this.#socket.on('end', this.onEnd);\n this.#socket.on('error', this.onError);\n }\n\n async connect(): Promise<void> {\n debug(`Connecting to ${this.address}:${this.port}...`);\n\n return await new Promise(resolve => {\n this.#socket.connect({\n host: this.address,\n port: this.port,\n keepAlive: true\n }, resolve);\n });\n }\n\n async disconnect(): Promise<void> {\n this.#socket.destroy();\n }\n\n async enableEncryption(readKey: Buffer, writeKey: Buffer): Promise<void> {\n this.#readKey = readKey;\n this.#writeKey = writeKey;\n this.#readCount = 0;\n this.#writeCount = 0;\n }\n\n async exchange(type: number, obj: Record<string, unknown>): Promise<[number, unknown]> {\n const _x = this.#xid;\n\n return new Promise<[number, number]>((resolve, reject) => {\n if (PairFrameTypes.includes(type)) {\n this.#queue[-1] = resolve;\n } else {\n this.#queue[_x] = resolve;\n }\n\n this.send(type, obj).catch(reject);\n });\n }\n\n async send(type: number, obj: Record<string, unknown>): Promise<void> {\n const _x = this.#xid++;\n obj._x ??= opackSizedInt(_x, 8);\n\n let payload = Buffer.from(encodeOPack(obj));\n let payloadLength = payload.byteLength;\n\n if (this.isEncrypted && payloadLength > 0) {\n payloadLength += 16;\n }\n\n const header = Buffer.alloc(4);\n header.writeUint8(type, 0);\n header.writeUintBE(payloadLength, 1, 3);\n\n let data: Buffer;\n\n if (this.isEncrypted) {\n const nonce = Buffer.alloc(12);\n nonce.writeBigUInt64LE(BigInt(this.#writeCount++), 0);\n\n const encrypted = encryptChacha20(this.#writeKey, nonce, header, payload);\n data = Buffer.concat([header, encrypted.ciphertext, encrypted.authTag]);\n } else {\n data = Buffer.concat([header, payload]);\n }\n\n debug('Send data frame', this.isEncrypted, Buffer.from(data).toString('hex'), obj);\n\n return new Promise((resolve, reject) => {\n this.#socket.write(data, err => err && reject(err));\n resolve();\n });\n }\n\n async onClose(): Promise<void> {\n debug(`Connection closed from ${this.address}:${this.port}`);\n }\n\n async onConnect(): Promise<void> {\n debug(`Connected to ${this.address}:${this.port}`);\n }\n\n async onData(buffer: Buffer): Promise<void> {\n // debug('Received data frame', buffer.toString('hex'));\n\n this.#buffer = Buffer.concat([this.#buffer, buffer]);\n\n while (this.#buffer.byteLength >= HEADER_BYTES) {\n const header = this.#buffer.subarray(0, HEADER_BYTES);\n const payloadLength = header.readUintBE(1, 3);\n const totalLength = HEADER_BYTES + payloadLength;\n\n if (this.#buffer.byteLength < totalLength) {\n debug(`Not enough data yet, waiting on the next frame.. needed=${totalLength} available=${this.#buffer.byteLength} receivedLength=${buffer.byteLength}`);\n return;\n }\n\n debug(`Frame found length=${totalLength} availableLength=${this.#buffer.byteLength} receivedLength=${buffer.byteLength}`);\n\n const frame = Buffer.from(this.#buffer.subarray(0, totalLength));\n this.#buffer = this.#buffer.subarray(totalLength);\n\n debug(`Handle frame, ${this.#buffer.byteLength} bytes left...`);\n\n const data = await this.#decrypt(frame);\n let payload = data.subarray(4, totalLength);\n\n await this.#handle(header, payload);\n }\n }\n\n async onEnd(): Promise<void> {\n debug('Connection ended');\n }\n\n async onError(err: Error): Promise<void> {\n debug('Error received', err);\n }\n\n async #decrypt(data: Buffer): Promise<Buffer> {\n if (!this.isEncrypted) {\n return data;\n }\n\n const header = data.subarray(0, 4);\n const payloadLength = header.readUintBE(1, 3);\n\n const payload = data.subarray(4, 4 + payloadLength);\n const authTag = payload.subarray(payload.byteLength - 16);\n const ciphertext = payload.subarray(0, payload.byteLength - 16);\n\n const nonce = Buffer.alloc(12);\n nonce.writeBigUint64LE(BigInt(this.#readCount++), 0);\n\n const decrypted = decryptChacha20(this.#readKey, nonce, header, ciphertext, authTag);\n\n return Buffer.concat([header, decrypted, authTag]);\n }\n\n async #handle(header: Buffer, payload: Buffer): Promise<void> {\n const type = header.readInt8();\n\n if (!OPackFrameTypes.includes(type)) {\n debug('Packet not handled, no opack frame.');\n }\n\n [payload] = decodeOPack(payload);\n\n debug('Decoded OPACK', {header, payload});\n\n if ('_x' in payload) {\n const _x = (payload as any)._x;\n\n if (_x in this.#queue) {\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else if ('_i' in payload) {\n this.dispatchEvent(new CustomEvent(payload['_i'] as string, {detail: payload['_c']}));\n } else {\n // probably an event\n const content = payload['_c'];\n const keys = Object.keys(content).map(k => k.substring(0, -3));\n\n for (const key of keys) {\n this.dispatchEvent(new CustomEvent(key, {detail: content[key]}));\n }\n }\n } else if (this.#queue[-1]) {\n const _x = -1;\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n debug('No handler for message', [header, payload]);\n }\n }\n}\n\nexport const FrameType = {\n Unknown: 0,\n Noop: 1,\n\n PS_Start: 3,\n PS_Next: 4,\n PV_Start: 5,\n PV_Next: 6,\n\n U_OPACK: 7,\n E_OPACK: 8,\n P_OPACK: 9,\n\n PA_Request: 10,\n PA_Response: 11,\n\n SessionStartRequest: 16,\n SessionStartResponse: 17,\n SessionData: 18,\n\n FamilyIdentityRequest: 32,\n FamilyIdentityResponse: 33,\n FamilyIdentityUpdate: 34\n} as const;\n\nexport const MessageType = {\n Event: 1,\n Request: 2,\n Response: 3\n} as const;\n\nexport const OPackFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next,\n\n FrameType.U_OPACK,\n FrameType.E_OPACK,\n FrameType.P_OPACK\n];\n\nconst PairFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next\n];\n",
5
+ "import { randomInt } from 'node:crypto';\nimport { debug, opackFloat, parseBinaryPlist, waitFor } from '@basmilius/apple-common';\nimport { type default as CompanionLinkSocket, FrameType, MessageType } from './socket';\nimport type CompanionLink from './protocol';\n\nexport default class CompanionLinkApi {\n get socket(): CompanionLinkSocket {\n return this.#protocol.socket;\n }\n\n readonly #protocol: CompanionLink;\n\n constructor(protocol: CompanionLink) {\n this.#protocol = protocol;\n }\n\n async fetchMediaControlStatus(): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchMediaControlStatus',\n _t: MessageType.Request,\n _c: {}\n });\n }\n\n async fetchNowPlayingInfo(): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchCurrentNowPlayingInfoEvent',\n _t: MessageType.Request,\n _c: {}\n });\n }\n\n async fetchSupportedActions(): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchSupportedActionsEvent',\n _t: MessageType.Request,\n _c: {}\n });\n }\n\n async getAttentionState(): Promise<AttentionState> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchAttentionState',\n _t: MessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<AttentionStateResponse>(payload);\n\n switch (_c.state) {\n case 0x01:\n return 'asleep';\n\n case 0x02:\n return 'screensaver';\n\n case 0x03:\n return 'awake';\n\n case 0x04:\n return 'idle';\n\n default:\n return 'unknown';\n }\n }\n\n async getLaunchableApps(): Promise<LaunchableApp[]> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchLaunchableApplicationsEvent',\n _t: MessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<LaunchableAppsResponse>(payload);\n\n return Object.entries(_c).map(([bundleId, name]) => ({\n bundleId,\n name\n }));\n }\n\n async getSiriRemoteInfo(): Promise<any> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchSiriRemoteInfo',\n _t: MessageType.Request,\n _c: {}\n });\n\n return parseBinaryPlist(Buffer.from(payload['_c']['SiriRemoteInfoKey']).buffer);\n }\n\n async getUserAccounts(): Promise<UserAccount[]> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'FetchUserAccountsEvent',\n _t: MessageType.Request,\n _c: {}\n });\n\n const {_c} = objectOrFail<UserAccountsResponse>(payload);\n\n return Object.entries(_c).map(([accountId, name]) => ({\n accountId,\n name\n }));\n }\n\n async hidCommand(command: keyof typeof HidCommand, down = false): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_hidC',\n _t: MessageType.Request,\n _c: {\n _hBtS: down ? 1 : 2,\n _hidC: HidCommand[command]\n }\n });\n }\n\n async launchApp(bundleId: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_launchApp',\n _t: MessageType.Request,\n _c: {\n _bundleID: bundleId\n }\n });\n }\n\n async launchUrl(url: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_launchApp',\n _t: MessageType.Request,\n _c: {\n _urlS: url\n }\n });\n }\n\n async mediaControlCommand(command: keyof typeof MediaControlCommand, content?: object): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_mcc',\n _t: MessageType.Request,\n _c: {\n _mcc: MediaControlCommand[command],\n ...(content || {})\n }\n });\n\n return objectOrFail(payload);\n }\n\n async pressButton(command: keyof typeof HidCommand, type: ButtonPressType = 'SingleTap', holdDelayMs = 500): Promise<void> {\n switch (type) {\n case 'DoubleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n\n case 'Hold':\n await this.hidCommand(command, true);\n await waitFor(holdDelayMs);\n await this.hidCommand(command, false);\n break;\n\n case 'SingleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n }\n }\n\n async switchUserAccount(accountId: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'SwitchUserAccountEvent',\n _t: MessageType.Request,\n _c: {\n SwitchAccountID: accountId\n }\n });\n }\n\n async _subscribe(event: string, fn: (data: unknown) => void): Promise<void> {\n this.socket.on(event, fn);\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _regEvents: [event]\n }\n });\n }\n\n async _unsubscribe(event: string, fn?: (data: unknown) => void): Promise<void> {\n if (fn) {\n this.socket.off(event, fn);\n }\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _deregEvents: [event]\n }\n });\n }\n\n async _sessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_sessionStart',\n _t: MessageType.Request,\n _c: {\n _srvT: 'com.apple.tvremoteservices',\n _sid: randomInt(0, 2 ** 32 - 1)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _systemInfo(pairingId: Buffer): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_systemInfo',\n _t: MessageType.Request,\n _c: {\n _bf: 0,\n _cf: 512,\n _clFl: 128,\n _i: 'cafecafecafe',\n _idsID: pairingId.toString(),\n _pubID: 'FF:70:79:61:74:76',\n _sf: 256,\n _sv: '170.18',\n model: 'iPhone10,6',\n name: 'Bas Companion Link'\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _touchStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_touchStart',\n _t: MessageType.Request,\n _c: {\n _height: opackFloat(1000.0),\n _tFl: 0,\n _width: opackFloat(1000.0)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _tvrcSessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'TVRCSessionStart',\n _t: MessageType.Request,\n _btHP: false,\n _inUseProc: 'tvremoted',\n _c: {}\n });\n\n return objectOrFail(payload);\n }\n}\n\nconst HidCommand = {\n Up: 1,\n Down: 2,\n Left: 3,\n Right: 4,\n Menu: 5,\n Select: 6,\n Home: 7,\n VolumeUp: 8,\n VolumeDown: 9,\n Siri: 10,\n Screensaver: 11,\n Sleep: 12,\n Wake: 13,\n PlayPause: 14,\n ChannelIncrement: 15,\n ChannelDecrement: 16,\n Guide: 17,\n PageUp: 18,\n PageDown: 19\n} as const;\n\nconst MediaControlCommand = {\n Play: 1,\n Pause: 2,\n NextTrack: 3,\n PreviousTrack: 4,\n GetVolume: 5,\n SetVolume: 6,\n SkipBy: 7,\n FastForwardBegin: 8,\n FastForwardEnd: 9,\n RewindBegin: 10,\n RewindEnd: 11,\n GetCaptionSettings: 12,\n SetCaptionSettings: 13\n} as const;\n\ntype ButtonPressType =\n | 'DoubleTap'\n | 'Hold'\n | 'SingleTap';\n\nfunction objectOrFail<T = object>(obj: unknown): T {\n if (typeof obj === 'object') {\n return obj as T;\n }\n\n debug('Expected an object.', {obj});\n\n throw new Error('Expected an object.');\n}\n\ntype AttentionState =\n | 'unknown'\n | 'asleep'\n | 'screensaver'\n | 'awake'\n | 'idle';\n\ntype AttentionStateResponse = {\n readonly _c: {\n readonly state: number;\n };\n};\n\ntype LaunchableApp = {\n readonly bundleId: string;\n readonly name: string;\n};\n\ntype LaunchableAppsResponse = {\n readonly _c: Record<string, string>;\n};\n\ntype UserAccount = {\n readonly accountId: string;\n readonly name: string;\n};\n\ntype UserAccountsResponse = {\n readonly _c: Record<string, string>;\n};\n",
6
+ "import{createCipher as te,createDecipher as ne}from\"chacha\";var q=12;function A(e,n,r,o,t){n=$(n);let s=ne(e,n);r&&s.setAAD(r),s.setAuthTag(t);let i=s._update(o);return s._final(),i}function I(e,n,r,o){n=$(n);let t=te(e,n);r&&t.setAAD(r);let s=t._update(o);t._final();let i=t.getAuthTag();return{ciphertext:s,authTag:i}}function $(e){if(e.length>=q)return e;return Buffer.concat([Buffer.alloc(q-e.length,0),e])}import{randomBytes as se}from\"node:crypto\";import{x25519 as z}from\"@noble/curves/ed25519.js\";function T(){let e=se(32);return{publicKey:z.getPublicKey(e),secretKey:e}}function k(e,n){return z.getSharedSecret(e,n)}import{hkdfSync as oe}from\"node:crypto\";function x(e){return Buffer.from(oe(e.hash,e.key,e.salt,e.info,e.length))}import ae from\"node-dns-sd\";import{createInterface as ie}from\"node:readline\";var fe=ie({input:process.stdin,output:process.stdout});function H(...e){console.debug(\"\\x1B[36m[debug]\\x1B[39m\",...e)}async function Ue(e){return await new Promise((n)=>fe.question(`${e}: `,n))}async function Y(e){return new Promise((n)=>setTimeout(n,e))}var L=\"3939\",De=15000,W=\"_airplay._tcp.local\",X=\"_companion-link._tcp.local\",Z=\"_raop._tcp.local\";class B{#e;constructor(e){this.#e=e}async find(){return await ae.discover({name:this.#e})}async findUntil(e,n=10,r=1000){while(n>0){let o=await this.find(),t=o.find((s)=>s.fqdn===e);if(t)return t;if(console.log(),console.log(`Device not found, retrying in ${r}ms...`),console.log(o.map((s)=>` ● ${s.fqdn}`).join(`\n`)),n--,n===0)throw Error(\"Device not found after serveral tries, aborting.\");await Y(r)}}static airplay(){return new B(W)}static companionLink(){return new B(X)}static raop(){return new B(Z)}}class U extends Number{size;constructor(e,n){super(e);this.size=n}}function J(e,n){return new U(e,n)}class C{value;constructor(e){this.value=e}}function ce(e){return new C(e)}class D{value;constructor(e){this.value=e}}function ue(e){return new D(e)}function l(e){let n=e.reduce((t,s)=>t+s.length,0),r=new Uint8Array(n),o=0;for(let t of e)r.set(t,o),o+=t.length;return r}function a(e){return Uint8Array.of(e)}function y(e,n){let r=new Uint8Array(n),o=BigInt(e);for(let t=0;t<n;t++)r[t]=Number(o&0xffn),o>>=8n;return r}function g(e){let n=e.reduce((t,s)=>t+s.length,0),r=new Uint8Array(n),o=0;for(let t of e)r.set(t,o),o+=t.length;return r}function R(e){return M(e,[])}function M(e,n){let r=null;if(e===null||e===void 0)r=a(4);else if(typeof e===\"boolean\")r=a(e?1:2);else if(e instanceof C){let t=new ArrayBuffer(8);new DataView(t).setFloat64(0,e.value,!0),r=l([a(54),new Uint8Array(t)])}else if(e instanceof D){let t=e.value;if(t<40)r=a(8+t);else if(t<=255)r=g([a(48),y(t,1)]);else if(t<=65535)r=g([a(49),y(t,2)]);else if(t<=4294967295)r=g([a(50),y(t,4)]);else r=g([a(51),y(t,8)])}else if(typeof e===\"number\")if(!Number.isInteger(e)){let t=new ArrayBuffer(8);new DataView(t).setFloat64(0,e,!0),r=l([a(54),new Uint8Array(t)])}else if(e<40)r=a(8+e);else if(e<=255)r=l([a(48),y(e,1)]);else if(e<=65535)r=l([a(49),y(e,2)]);else if(e<=4294967295)r=l([a(50),y(e,4)]);else r=l([a(51),y(e,8)]);else if(e instanceof U)r=l([a(48+Math.log2(e.size)),y(e.valueOf(),e.size)]);else if(typeof e===\"string\"){let t=new TextEncoder().encode(e),s=t.length;if(s<=32)r=l([a(64+s),t]);else if(s<=255)r=l([a(97),y(s,1),t]);else if(s<=65535)r=l([a(98),y(s,2),t]);else if(s<=16777215)r=l([a(99),y(s,3),t]);else r=l([a(100),y(s,4),t])}else if(e instanceof Uint8Array||Buffer.isBuffer(e)){let t=e instanceof Uint8Array?e:new Uint8Array(e),s=t.length;if(s<=32)r=l([a(112+s),t]);else if(s<=255)r=l([a(145),y(s,1),t]);else if(s<=65535)r=l([a(146),y(s,2),t]);else r=l([a(147),y(s,4),t])}else if(Array.isArray(e)){let t=l(e.map((i)=>M(i,n))),s=e.length;if(s<=15){if(r=l([a(208+s),t]),s>=15)r=l([r,a(3)])}else r=l([a(223),t,a(3)])}else if(typeof e===\"object\"){let t=Object.keys(e),s=t.length,i=[];for(let u of t)i.push(M(u,n)),i.push(M(e[u],n));let f;if(s<=15)f=a(224+s);else f=a(239);if(r=g([f,g(i)]),s>=15||n.some((u)=>u===r))r=g([r,a(129)])}else throw TypeError(typeof e);let o=n.findIndex((t)=>t.length===r.length&&t.every((s,i)=>s===r[i]));if(o>=0)if(o<33)r=a(160+o);else if(o<=255)r=l([a(193),y(o,1)]);else if(o<=65535)r=l([a(194),y(o,2)]);else if(o<=4294967295)r=l([a(195),y(o,4)]);else r=l([a(196),y(o,8)]);else if(r.length>1)n.push(r);return r}function le(e){return P(e,[])}function ye(e,n){if(e.length<n)throw TypeError(`Not enough data: need ${n} bytes, have ${e.length}`)}function v(e,n,r){ye(e.subarray(n),r);let o=0n;for(let t=r-1;t>=0;t--)o=o<<8n|BigInt(e[n+t]);return Number(o)}function P(e,n){if(e.length===0)throw TypeError(\"No data to unpack\");let r=e[0],o=!0,t,s;if(r===1)t=!0,s=e.subarray(1);else if(r===2)t=!1,s=e.subarray(1);else if(r===4)t=null,s=e.subarray(1);else if(r===5)t=e.subarray(1,17),s=e.subarray(17);else if(r===6)t=v(e,1,8),s=e.subarray(9);else if(r>=8&&r<=47)t=r-8,s=e.subarray(1);else if(r===53)t=new DataView(e.buffer,e.byteOffset+1,4).getFloat32(0,!0),s=e.subarray(5);else if(r===54)t=new DataView(e.buffer,e.byteOffset+1,8).getFloat64(0,!0),s=e.subarray(9);else if((r&240)===48){let i=2**(r&15),f=v(e,1,i);t=J(f,i),s=e.subarray(1+i)}else if(r>=64&&r<=96){let i=r-64;t=new TextDecoder().decode(e.subarray(1,1+i)),s=e.subarray(1+i)}else if(r>=97&&r<=100){let i=r&15,f=v(e,1,i);t=new TextDecoder().decode(e.subarray(1+i,1+i+f)),s=e.subarray(1+i+f)}else if(r>=112&&r<=144){let i=r-112;t=e.subarray(1,1+i),s=e.subarray(1+i)}else if(r>=145&&r<=148){let i=1<<(r&15)-1,f=v(e,1,i),u=1+i;t=e.subarray(u,u+f),s=e.subarray(u+f)}else if((r&240)===208){let i=r&15,f=e.subarray(1),u=[];if(i===15){while(f[0]!==3){let[p,m]=P(f,n);u.push(p),f=m}f=f.subarray(1)}else for(let p=0;p<i;p++){let[m,d]=P(f,n);u.push(m),f=d}t=u,s=f,o=!1}else if((r&224)===224){let i=r&15,f=e.subarray(1),u={};if(i===15){while(f[0]!==3){let[p,m]=P(f,n),[d,w]=P(m,n);u[p]=d,f=w}f=f.subarray(1)}else for(let p=0;p<i;p++){let[m,d]=P(f,n),[w,N]=P(d,n);u[m]=w,f=N}t=u,s=f,o=!1}else if(r>=160&&r<=192){let i=r-160;if(i>=n.length)throw TypeError(`Reference index ${i} out of range`);t=n[i],s=e.subarray(1),o=!1}else if(r>=193&&r<=196){let i=r-192,f=v(e,1,i);if(f>=n.length)throw TypeError(`UID ${f} out of range`);t=n[f],s=e.subarray(1+i),o=!1}else throw TypeError(`Unknown tag 0x${r.toString(16)}`);if(o)n.push(t);return[t,s]}import{parse as pe}from\"@plist/binary.parse\";import{serialize as me}from\"@plist/binary.serialize\";var V={TransientPairing:16},F={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},b={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},c={Method:0,Identifier:1,Salt:2,PublicKey:3,Proof:4,EncryptedData:5,State:6,Error:7,BackOff:8,Certificate:9,Signature:10,Permissions:11,FragmentData:12,FragmentLast:13,Name:17,Flags:19};function O(e){if(e.has(c.BackOff)){let n=e.get(c.BackOff),r=n.readUintLE(0,n.length);throw Error(`Device is busy, try again in ${r} seconds.`)}if(e.has(c.Error))throw Error(`Device returned an error code: ${e.get(c.Error).readUint8()}`);throw console.error(e),Error(\"Invalid response\")}function h(e){let n=[];for(let[r,o]of e){let t;if(typeof o===\"number\")t=Buffer.from([o]);else t=o;let s=0;do{let i=Math.min(t.length-s,255);if(n.push(r,i),i>0)for(let f=0;f<i;f++)n.push(t[s+f]);s+=i}while(s<t.length)}return Buffer.from(n)}function S(e){let n=new Map,r=0;while(r<e.length){let o=e[r++],t=e[r++],s=new Uint8Array(e).slice(r,r+t);r+=t;let i=n.get(o);if(i)n.set(o,Buffer.concat([i,s]));else n.set(o,Buffer.from(s))}return n}import{networkInterfaces as de}from\"node:os\";function Q(){let e=de();for(let n of Object.keys(e)){let r=e[n];if(!r)continue;for(let o of r){if(o.internal||o.family!==\"IPv4\")continue;if(o.address&&o.address!==\"127.0.0.1\")return o.address}}return null}import{networkInterfaces as xe}from\"node:os\";function G(){let e=xe();for(let n of Object.keys(e)){let r=e[n];if(!r)continue;for(let o of r){if(o.internal||o.family!==\"IPv4\")continue;if(o.mac&&o.mac!==\"00:00:00:00:00:00\")return o.mac.toUpperCase()}}return null}import{EventEmitter as he}from\"node:events\";class _ extends he{get address(){return this.#e}get port(){return this.#r}#e;#r;constructor(e,n){super();this.#e=e,this.#r=n}async connect(){}async disconnect(){}}import{SRP as j,SrpClient as ge}from\"fast-srp-hap\";import{v4 as Pe}from\"uuid\";import K from\"tweetnacl\";class ee{#e;#r;#n;#s;#o;#t;constructor(e){this.#e=\"basmilius/apple-protocols\",this.#r=Buffer.from(Pe().toUpperCase()),this.#n=e}async start(){let e=K.sign.keyPair();this.#s=Buffer.from(e.publicKey),this.#o=Buffer.from(e.secretKey)}async pin(e){let n=await this.m1(),r=await this.m2(n,await e()),o=await this.m3(r),t=await this.m4(o),s=await this.m5(t),i=await this.m6(t,s);if(!i)throw Error(\"Pairing failed, could not get accessory keys.\");return i}async transient(){let e=await this.m1([[c.Flags,V.TransientPairing]]),n=await this.m2(e),r=await this.m3(n),o=await this.m4(r),t=x({hash:\"sha512\",key:o.sharedSecret,length:32,salt:Buffer.from(\"Control-Salt\"),info:Buffer.from(\"Control-Read-Encryption-Key\")}),s=x({hash:\"sha512\",key:o.sharedSecret,length:32,salt:Buffer.from(\"Control-Salt\"),info:Buffer.from(\"Control-Write-Encryption-Key\")});return{pairingId:this.#r,sharedSecret:o.sharedSecret,accessoryToControllerKey:t,controllerToAccessoryKey:s}}async m1(e=[]){let n=await this.#n(\"m1\",h([[c.Method,F.PairSetup],[c.State,b.M1],...e])),r=E(n),o=r.get(c.PublicKey),t=r.get(c.Salt);return{publicKey:o,salt:t}}async m2(e,n=L){let r=await j.genKey(32);this.#t=new ge(j.params.hap,e.salt,Buffer.from(\"Pair-Setup\"),Buffer.from(n),r,!0),this.#t.setB(e.publicKey);let o=this.#t.computeA(),t=this.#t.computeM1();return{publicKey:o,proof:t}}async m3(e){let n=await this.#n(\"m3\",h([[c.State,b.M3],[c.PublicKey,e.publicKey],[c.Proof,e.proof]]));return{serverProof:E(n).get(c.Proof)}}async m4(e){return this.#t.checkM2(e.serverProof),{sharedSecret:this.#t.computeK()}}async m5(e){let n=x({hash:\"sha512\",key:e.sharedSecret,length:32,salt:Buffer.from(\"Pair-Setup-Controller-Sign-Salt\",\"utf8\"),info:Buffer.from(\"Pair-Setup-Controller-Sign-Info\",\"utf8\")}),r=x({hash:\"sha512\",key:e.sharedSecret,length:32,salt:Buffer.from(\"Pair-Setup-Encrypt-Salt\",\"utf8\"),info:Buffer.from(\"Pair-Setup-Encrypt-Info\",\"utf8\")}),o=Buffer.concat([n,this.#r,this.#s]),t=K.sign.detached(o,this.#o),s=h([[c.Identifier,this.#r],[c.PublicKey,this.#s],[c.Signature,Buffer.from(t)],[c.Name,Buffer.from(R({name:this.#e}))]]),{authTag:i,ciphertext:f}=I(r,Buffer.from(\"PS-Msg05\"),null,s),u=Buffer.concat([f,i]),p=await this.#n(\"m5\",h([[c.State,b.M5],[c.EncryptedData,u]])),d=E(p).get(c.EncryptedData),w=d.subarray(0,-16);return{authTag:d.subarray(-16),data:w,sessionKey:r}}async m6(e,n){let r=A(n.sessionKey,Buffer.from(\"PS-Msg06\"),null,n.data,n.authTag),o=S(r),t=o.get(c.Identifier),s=o.get(c.PublicKey),i=o.get(c.Signature),f=x({hash:\"sha512\",key:e.sharedSecret,length:32,salt:Buffer.from(\"Pair-Setup-Accessory-Sign-Salt\"),info:Buffer.from(\"Pair-Setup-Accessory-Sign-Info\")}),u=Buffer.concat([f,t,s]);if(!K.sign.detached.verify(u,i,s))throw Error(\"Invalid accessory signature.\");return{accessoryIdentifier:t.toString(),accessoryLongTermPublicKey:s,pairingId:this.#r,publicKey:this.#s,secretKey:this.#o}}}class re{#e;#r;constructor(e){this.#e=T(),this.#r=e}async start(e){let n=await this.#n(),r=await this.#s(e.accessoryIdentifier,e.accessoryLongTermPublicKey,n);return await this.#o(e.pairingId,e.secretKey,r),await this.#t(r,e.pairingId)}async#n(){let e=await this.#r(\"m1\",h([[c.State,b.M1],[c.PublicKey,Buffer.from(this.#e.publicKey)]])),n=E(e),r=n.get(c.PublicKey);return{encryptedData:n.get(c.EncryptedData),serverPublicKey:r}}async#s(e,n,r){let o=Buffer.from(k(this.#e.secretKey,r.serverPublicKey)),t=x({hash:\"sha512\",key:o,length:32,salt:Buffer.from(\"Pair-Verify-Encrypt-Salt\"),info:Buffer.from(\"Pair-Verify-Encrypt-Info\")}),s=r.encryptedData.subarray(0,-16),i=r.encryptedData.subarray(-16),f=A(t,Buffer.from(\"PV-Msg02\"),null,s,i),u=S(f),p=u.get(c.Identifier),m=u.get(c.Signature);if(p.toString()!==e)throw Error(`Invalid accessory identifier. Expected ${p.toString()} to be ${e}.`);let d=Buffer.concat([r.serverPublicKey,p,this.#e.publicKey]);if(!K.sign.detached.verify(d,m,n))throw Error(\"Invalid accessory signature.\");return{serverEphemeralPublicKey:r.serverPublicKey,sessionKey:t,sharedSecret:o}}async#o(e,n,r){let o=Buffer.concat([this.#e.publicKey,e,r.serverEphemeralPublicKey]),t=Buffer.from(K.sign.detached(o,n)),s=h([[c.Identifier,e],[c.Signature,t]]),{authTag:i,ciphertext:f}=I(r.sessionKey,Buffer.from(\"PV-Msg03\"),null,s),u=Buffer.concat([f,i]);return await this.#r(\"m3\",h([[c.State,b.M3],[c.EncryptedData,u]])),{}}async#t(e,n){return{accessoryToControllerKey:Buffer.alloc(0),controllerToAccessoryKey:Buffer.alloc(0),pairingId:n,sharedSecret:e.sharedSecret}}}function E(e){let n=S(e);if(n.has(c.Error))O(n);return H(\"Decoded TLV\",n),n}import{v4 as Sr}from\"uuid\";export{Y as waitFor,Sr as uuid,me as serializeBinaryPlist,Ue as prompt,pe as parseBinaryPlist,J as opackSizedInt,ue as opackInt,ce as opackFloat,x as hkdf,G as getMacAddress,Q as getLocalIP,k as generateCurve25519SharedSecKey,T as generateCurve25519KeyPair,I as encryptChacha20,h as encodeTlv,R as encodeOPack,A as decryptChacha20,S as decodeTlv,le as decodeOPack,H as debug,O as bailTlv,c as TlvValue,b as TlvState,F as TlvMethod,V as TlvFlags,Z as RAOP_SERVICE,De as HTTP_TIMEOUT,B as Discovery,X as COMPANION_LINK_SERVICE,_ as BaseSocket,re as AccessoryVerify,ee as AccessoryPair,L as AIRPLAY_TRANSIENT_PIN,W as AIRPLAY_SERVICE};\n\n//# debugId=55252E7F56BA2B8064756E2164756E21\n//# sourceMappingURL=index.js.map\n",
7
+ "import { randomInt } from 'node:crypto';\nimport { Socket } from 'node:net';\nimport { BaseSocket, debug, decodeOPack, decryptChacha20, encodeOPack, encryptChacha20, opackSizedInt } from '@basmilius/apple-common';\n\nconst HEADER_BYTES = 4;\n\nexport default class CompanionLinkSocket extends BaseSocket<Record<string, [unknown]>> {\n get isEncrypted(): boolean {\n return !!this.#readKey && !!this.#writeKey;\n }\n\n readonly #socket: Socket;\n readonly #queue: Record<number, Function> = {};\n #buffer: Buffer = Buffer.alloc(0);\n #readCount: number;\n #readKey?: Buffer;\n #writeCount: number;\n #writeKey?: Buffer;\n #xid: number;\n\n constructor(address: string, port: number) {\n super(address, port);\n\n this.#xid = randomInt(0, 2 ** 16);\n\n this.onClose = this.onClose.bind(this);\n this.onConnect = this.onConnect.bind(this);\n this.onData = this.onData.bind(this);\n this.onEnd = this.onEnd.bind(this);\n this.onError = this.onError.bind(this);\n\n this.#socket = new Socket();\n this.#socket.on('close', this.onClose);\n this.#socket.on('connect', this.onConnect);\n this.#socket.on('data', this.onData);\n this.#socket.on('end', this.onEnd);\n this.#socket.on('error', this.onError);\n }\n\n async connect(): Promise<void> {\n debug(`Connecting to ${this.address}:${this.port}...`);\n\n return await new Promise(resolve => {\n this.#socket.connect({\n host: this.address,\n port: this.port,\n keepAlive: true\n }, resolve);\n });\n }\n\n async disconnect(): Promise<void> {\n this.#socket.destroy();\n }\n\n async enableEncryption(readKey: Buffer, writeKey: Buffer): Promise<void> {\n this.#readKey = readKey;\n this.#writeKey = writeKey;\n this.#readCount = 0;\n this.#writeCount = 0;\n }\n\n async exchange(type: number, obj: Record<string, unknown>): Promise<[number, unknown]> {\n const _x = this.#xid;\n\n return new Promise<[number, number]>((resolve, reject) => {\n if (PairFrameTypes.includes(type)) {\n this.#queue[-1] = resolve;\n } else {\n this.#queue[_x] = resolve;\n }\n\n this.send(type, obj).catch(reject);\n });\n }\n\n async send(type: number, obj: Record<string, unknown>): Promise<void> {\n const _x = this.#xid++;\n obj._x ??= opackSizedInt(_x, 8);\n\n let payload = Buffer.from(encodeOPack(obj));\n let payloadLength = payload.byteLength;\n\n if (this.isEncrypted && payloadLength > 0) {\n payloadLength += 16;\n }\n\n const header = Buffer.alloc(4);\n header.writeUint8(type, 0);\n header.writeUintBE(payloadLength, 1, 3);\n\n let data: Buffer;\n\n if (this.isEncrypted) {\n const nonce = Buffer.alloc(12);\n nonce.writeBigUInt64LE(BigInt(this.#writeCount++), 0);\n\n const encrypted = encryptChacha20(this.#writeKey, nonce, header, payload);\n data = Buffer.concat([header, encrypted.ciphertext, encrypted.authTag]);\n } else {\n data = Buffer.concat([header, payload]);\n }\n\n debug('Send data frame', this.isEncrypted, Buffer.from(data).toString('hex'), obj);\n\n return new Promise((resolve, reject) => {\n this.#socket.write(data, err => err && reject(err));\n resolve();\n });\n }\n\n async onClose(): Promise<void> {\n debug(`Connection closed from ${this.address}:${this.port}`);\n }\n\n async onConnect(): Promise<void> {\n debug(`Connected to ${this.address}:${this.port}`);\n }\n\n async onData(buffer: Buffer): Promise<void> {\n // debug('Received data frame', buffer.toString('hex'));\n\n this.#buffer = Buffer.concat([this.#buffer, buffer]);\n\n while (this.#buffer.byteLength >= HEADER_BYTES) {\n const header = this.#buffer.subarray(0, HEADER_BYTES);\n const payloadLength = header.readUintBE(1, 3);\n const totalLength = HEADER_BYTES + payloadLength;\n\n if (this.#buffer.byteLength < totalLength) {\n debug(`Not enough data yet, waiting on the next frame.. needed=${totalLength} available=${this.#buffer.byteLength} receivedLength=${buffer.byteLength}`);\n return;\n }\n\n debug(`Frame found length=${totalLength} availableLength=${this.#buffer.byteLength} receivedLength=${buffer.byteLength}`);\n\n const frame = Buffer.from(this.#buffer.subarray(0, totalLength));\n this.#buffer = this.#buffer.subarray(totalLength);\n\n debug(`Handle frame, ${this.#buffer.byteLength} bytes left...`);\n\n const data = await this.#decrypt(frame);\n let payload = data.subarray(4, totalLength);\n\n await this.#handle(header, payload);\n }\n }\n\n async onEnd(): Promise<void> {\n debug('Connection ended');\n }\n\n async onError(err: Error): Promise<void> {\n debug('Error received', err);\n }\n\n async #decrypt(data: Buffer): Promise<Buffer> {\n if (!this.isEncrypted) {\n return data;\n }\n\n const header = data.subarray(0, 4);\n const payloadLength = header.readUintBE(1, 3);\n\n const payload = data.subarray(4, 4 + payloadLength);\n const authTag = payload.subarray(payload.byteLength - 16);\n const ciphertext = payload.subarray(0, payload.byteLength - 16);\n\n const nonce = Buffer.alloc(12);\n nonce.writeBigUint64LE(BigInt(this.#readCount++), 0);\n\n const decrypted = decryptChacha20(this.#readKey, nonce, header, ciphertext, authTag);\n\n return Buffer.concat([header, decrypted, authTag]);\n }\n\n async #handle(header: Buffer, payload: Buffer): Promise<void> {\n const type = header.readInt8();\n\n if (!OPackFrameTypes.includes(type)) {\n debug('Packet not handled, no opack frame.');\n }\n\n [payload] = decodeOPack(payload);\n\n debug('Decoded OPACK', {header, payload});\n\n if ('_x' in payload) {\n const _x = (payload as any)._x;\n\n if (_x in this.#queue) {\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else if ('_i' in payload) {\n this.emit(payload['_i'] as string, payload['_c']);\n } else {\n // probably an event\n const content = payload['_c'];\n const keys = Object.keys(content).map(k => k.substring(0, -3));\n\n for (const key of keys) {\n this.emit(key, content[key]);\n }\n }\n } else if (this.#queue[-1]) {\n const _x = -1;\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n debug('No handler for message', [header, payload]);\n }\n }\n}\n\nexport const FrameType = {\n Unknown: 0,\n Noop: 1,\n\n PS_Start: 3,\n PS_Next: 4,\n PV_Start: 5,\n PV_Next: 6,\n\n U_OPACK: 7,\n E_OPACK: 8,\n P_OPACK: 9,\n\n PA_Request: 10,\n PA_Response: 11,\n\n SessionStartRequest: 16,\n SessionStartResponse: 17,\n SessionData: 18,\n\n FamilyIdentityRequest: 32,\n FamilyIdentityResponse: 33,\n FamilyIdentityUpdate: 34\n} as const;\n\nexport const MessageType = {\n Event: 1,\n Request: 2,\n Response: 3\n} as const;\n\nexport const OPackFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next,\n\n FrameType.U_OPACK,\n FrameType.E_OPACK,\n FrameType.P_OPACK\n];\n\nconst PairFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next\n];\n",
8
8
  "import { type AccessoryCredentials, type AccessoryKeys, AccessoryPair } from '@basmilius/apple-common';\nimport { type default as CompanionLinkSocket, FrameType } from './socket';\nimport type CompanionLink from './protocol';\n\nexport default class CompanionLinkPairing {\n get internal(): AccessoryPair {\n return this.#internal;\n }\n\n get socket(): CompanionLinkSocket {\n return this.#protocol.socket;\n }\n\n readonly #internal: AccessoryPair;\n readonly #protocol: CompanionLink;\n\n constructor(protocol: CompanionLink) {\n this.#internal = new AccessoryPair(this.#request.bind(this));\n this.#protocol = protocol;\n }\n\n async start(): Promise<void> {\n await this.#internal.start();\n }\n\n async pin(askPin: () => Promise<string>): Promise<AccessoryCredentials> {\n return this.#internal.pin(askPin);\n }\n\n async transient(): Promise<AccessoryKeys> {\n return this.#internal.transient();\n }\n\n async #request(step: 'm1' | 'm3' | 'm5', data: Buffer): Promise<Buffer> {\n const frameType = step === 'm1' ? FrameType.PS_Start : FrameType.PS_Next;\n const [, response] = await this.socket.exchange(frameType, {\n _pd: data,\n _pwTy: 1\n });\n\n if (typeof response !== 'object' || response === null) {\n throw new Error('Invalid response from receiver.');\n }\n\n return response['_pd'];\n }\n}\n",
9
9
  "import { type AccessoryCredentials, type AccessoryKeys, AccessoryVerify, hkdf } from '@basmilius/apple-common';\nimport { type default as CompanionLinkSocket, FrameType } from './socket';\nimport type CompanionLink from './protocol';\n\nexport default class CompanionLinkVerify {\n get socket(): CompanionLinkSocket {\n return this.#protocol.socket;\n }\n\n readonly #internal: AccessoryVerify;\n readonly #protocol: CompanionLink;\n\n constructor(protocol: CompanionLink) {\n this.#internal = new AccessoryVerify(this.#request.bind(this));\n this.#protocol = protocol;\n }\n\n async start(credentials: AccessoryCredentials): Promise<AccessoryKeys> {\n const keys = await this.#internal.start(credentials);\n\n const accessoryToControllerKey = hkdf({\n hash: 'sha512',\n key: keys.sharedSecret,\n length: 32,\n salt: Buffer.alloc(0),\n info: Buffer.from('ServerEncrypt-main')\n });\n\n const controllerToAccessoryKey = hkdf({\n hash: 'sha512',\n key: keys.sharedSecret,\n length: 32,\n salt: Buffer.alloc(0),\n info: Buffer.from('ClientEncrypt-main')\n });\n\n return {\n accessoryToControllerKey,\n controllerToAccessoryKey,\n pairingId: keys.pairingId,\n sharedSecret: keys.sharedSecret\n };\n }\n\n async #request(step: 'm1' | 'm3' | 'm5', data: Buffer): Promise<Buffer> {\n const frameType = step === 'm1' ? FrameType.PV_Start : FrameType.PV_Next;\n const [, response] = await this.socket.exchange(frameType, {\n _pd: data,\n _auTy: 4\n });\n\n if (typeof response !== 'object' || response === null) {\n throw new Error('Invalid response from receiver.');\n }\n\n return response['_pd'];\n }\n}\n",
10
10
  "import type { DiscoveryResult } from '@basmilius/apple-common';\nimport Api from './api';\nimport Pairing from './pairing';\nimport Socket from './socket';\nimport Verify from './verify';\n\nexport default class CompanionLink {\n get api(): Api {\n return this.#api;\n }\n\n get device(): DiscoveryResult {\n return this.#device;\n }\n\n get socket(): Socket {\n return this.#socket;\n }\n\n get pairing(): Pairing {\n return this.#pairing;\n }\n\n get verify(): Verify {\n return this.#verify;\n }\n\n readonly #api: Api;\n readonly #device: DiscoveryResult;\n readonly #socket: Socket;\n readonly #pairing: Pairing;\n readonly #verify: Verify;\n\n constructor(device: DiscoveryResult) {\n this.#device = device;\n this.#socket = new Socket(device.address, device.service.port);\n this.#api = new Api(this);\n this.#pairing = new Pairing(this);\n this.#verify = new Verify(this);\n }\n\n async connect(): Promise<void> {\n await this.#socket.connect();\n }\n\n async disconnect(): Promise<void> {\n await this.#socket.disconnect();\n }\n}\n"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "4B1DCB09002E1C1C64756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "4F4051D7A01F524764756E2164756E21",
14
14
  "names": []
15
15
  }
@@ -17,8 +17,8 @@ export default class CompanionLinkApi {
17
17
  mediaControlCommand(command: keyof typeof MediaControlCommand, content?: object): Promise<object>;
18
18
  pressButton(command: keyof typeof HidCommand, type?: ButtonPressType, holdDelayMs?: number): Promise<void>;
19
19
  switchUserAccount(accountId: string): Promise<void>;
20
- _subscribe(event: string, fn: EventListener): Promise<void>;
21
- _unsubscribe(event: string, fn?: EventListener): Promise<void>;
20
+ _subscribe(event: string, fn: (data: unknown) => void): Promise<void>;
21
+ _unsubscribe(event: string, fn?: (data: unknown) => void): Promise<void>;
22
22
  _sessionStart(): Promise<object>;
23
23
  _systemInfo(pairingId: Buffer): Promise<object>;
24
24
  _touchStart(): Promise<object>;
@@ -1,5 +1,5 @@
1
1
  import { BaseSocket } from "@basmilius/apple-common";
2
- export default class CompanionLinkSocket extends BaseSocket {
2
+ export default class CompanionLinkSocket extends BaseSocket<Record<string, [unknown]>> {
3
3
  #private;
4
4
  get isEncrypted(): boolean;
5
5
  constructor(address: string, port: number);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@basmilius/apple-companion-link",
3
3
  "description": "Implementation of Apple's Companion Link in Node.js.",
4
- "version": "0.0.13",
4
+ "version": "0.0.15",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -40,7 +40,7 @@
40
40
  }
41
41
  },
42
42
  "dependencies": {
43
- "@basmilius/apple-common": "0.0.13"
43
+ "@basmilius/apple-common": "0.0.15"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@basmilius/tools": "^2.13.0",