@basmilius/apple-companion-link 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +9 -10
- package/dist/protocol/{api/companionLink.d.ts → api.d.ts} +5 -4
- package/dist/protocol/index.d.ts +4 -1
- package/dist/protocol/pairing.d.ts +12 -0
- package/dist/protocol/{companionLink.d.ts → protocol.d.ts} +7 -5
- package/dist/{socket/companionLink.d.ts → protocol/socket.d.ts} +2 -2
- package/dist/protocol/verify.d.ts +9 -0
- package/package.json +3 -6
- package/dist/protocol/pairing/companionLink.d.ts +0 -49
- package/dist/protocol/verify/companionLink.d.ts +0 -18
- package/dist/socket/base.d.ts +0 -7
- package/dist/socket/index.d.ts +0 -2
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{randomInt as
|
|
2
|
-
`)),e--,e===0)throw Error("Device not found after serveral tries, aborting.");await O(n)}}static airplay(){return new M(ht)}static companionLink(){return new M(pt)}static raop(){return new M(lt)}}class V extends Number{size;constructor(t,e){super(t);this.size=e}}function F(t,e){return new V(t,e)}class N{value;constructor(t){this.value=t}}function U(t){return new N(t)}class z{value;constructor(t){this.value=t}}function m(t){let e=t.reduce((i,r)=>i+r.length,0),n=new Uint8Array(e),s=0;for(let i of t)n.set(i,s),s+=i.length;return n}function y(t){return Uint8Array.of(t)}function h(t,e){let n=new Uint8Array(e),s=BigInt(t);for(let i=0;i<e;i++)n[i]=Number(s&0xffn),s>>=8n;return n}function B(t){let e=t.reduce((i,r)=>i+r.length,0),n=new Uint8Array(e),s=0;for(let i of t)n.set(i,s),s+=i.length;return n}function L(t){return I(t,[])}function I(t,e){let n=null;if(t===null||t===void 0)n=y(4);else if(typeof t==="boolean")n=y(t?1:2);else if(t instanceof N){let i=new ArrayBuffer(8);new DataView(i).setFloat64(0,t.value,!0),n=m([y(54),new Uint8Array(i)])}else if(t instanceof z){let i=t.value;if(i<40)n=y(8+i);else if(i<=255)n=B([y(48),h(i,1)]);else if(i<=65535)n=B([y(49),h(i,2)]);else if(i<=4294967295)n=B([y(50),h(i,4)]);else n=B([y(51),h(i,8)])}else if(typeof t==="number")if(!Number.isInteger(t)){let i=new ArrayBuffer(8);new DataView(i).setFloat64(0,t,!0),n=m([y(54),new Uint8Array(i)])}else if(t<40)n=y(8+t);else if(t<=255)n=m([y(48),h(t,1)]);else if(t<=65535)n=m([y(49),h(t,2)]);else if(t<=4294967295)n=m([y(50),h(t,4)]);else n=m([y(51),h(t,8)]);else if(t instanceof V)n=m([y(48+Math.log2(t.size)),h(t.valueOf(),t.size)]);else if(typeof t==="string"){let i=new TextEncoder().encode(t),r=i.length;if(r<=32)n=m([y(64+r),i]);else if(r<=255)n=m([y(97),h(r,1),i]);else if(r<=65535)n=m([y(98),h(r,2),i]);else if(r<=16777215)n=m([y(99),h(r,3),i]);else n=m([y(100),h(r,4),i])}else if(t instanceof Uint8Array||Buffer.isBuffer(t)){let i=t instanceof Uint8Array?t:new Uint8Array(t),r=i.length;if(r<=32)n=m([y(112+r),i]);else if(r<=255)n=m([y(145),h(r,1),i]);else if(r<=65535)n=m([y(146),h(r,2),i]);else n=m([y(147),h(r,4),i])}else if(Array.isArray(t)){let i=m(t.map((o)=>I(o,e))),r=t.length;if(r<=15){if(n=m([y(208+r),i]),r>=15)n=m([n,y(3)])}else n=m([y(223),i,y(3)])}else if(typeof t==="object"){let i=Object.keys(t),r=i.length,o=[];for(let u of i)o.push(I(u,e)),o.push(I(t[u],e));let a;if(r<=15)a=y(224+r);else a=y(239);if(n=B([a,B(o)]),r>=15||e.some((u)=>u===n))n=B([n,y(129)])}else throw TypeError(typeof t);let s=e.findIndex((i)=>i.length===n.length&&i.every((r,o)=>r===n[o]));if(s>=0)if(s<33)n=y(160+s);else if(s<=255)n=m([y(193),h(s,1)]);else if(s<=65535)n=m([y(194),h(s,2)]);else if(s<=4294967295)n=m([y(195),h(s,4)]);else n=m([y(196),h(s,8)]);else if(n.length>1)e.push(n);return n}function Y(t){return w(t,[])}function dt(t,e){if(t.length<e)throw TypeError(`Not enough data: need ${e} bytes, have ${t.length}`)}function T(t,e,n){dt(t.subarray(e),n);let s=0n;for(let i=n-1;i>=0;i--)s=s<<8n|BigInt(t[e+i]);return Number(s)}function w(t,e){if(t.length===0)throw TypeError("No data to unpack");let n=t[0],s=!0,i,r;if(n===1)i=!0,r=t.subarray(1);else if(n===2)i=!1,r=t.subarray(1);else if(n===4)i=null,r=t.subarray(1);else if(n===5)i=t.subarray(1,17),r=t.subarray(17);else if(n===6)i=T(t,1,8),r=t.subarray(9);else if(n>=8&&n<=47)i=n-8,r=t.subarray(1);else if(n===53)i=new DataView(t.buffer,t.byteOffset+1,4).getFloat32(0,!0),r=t.subarray(5);else if(n===54)i=new DataView(t.buffer,t.byteOffset+1,8).getFloat64(0,!0),r=t.subarray(9);else if((n&240)===48){let o=2**(n&15),a=T(t,1,o);i=F(a,o),r=t.subarray(1+o)}else if(n>=64&&n<=96){let o=n-64;i=new TextDecoder().decode(t.subarray(1,1+o)),r=t.subarray(1+o)}else if(n>=97&&n<=100){let o=n&15,a=T(t,1,o);i=new TextDecoder().decode(t.subarray(1+o,1+o+a)),r=t.subarray(1+o+a)}else if(n>=112&&n<=144){let o=n-112;i=t.subarray(1,1+o),r=t.subarray(1+o)}else if(n>=145&&n<=148){let o=1<<(n&15)-1,a=T(t,1,o),u=1+o;i=t.subarray(u,u+a),r=t.subarray(u+a)}else if((n&240)===208){let o=n&15,a=t.subarray(1),u=[];if(o===15){while(a[0]!==3){let[l,g]=w(a,e);u.push(l),a=g}a=a.subarray(1)}else for(let l=0;l<o;l++){let[g,P]=w(a,e);u.push(g),a=P}i=u,r=a,s=!1}else if((n&224)===224){let o=n&15,a=t.subarray(1),u={};if(o===15){while(a[0]!==3){let[l,g]=w(a,e),[P,E]=w(g,e);u[l]=P,a=E}a=a.subarray(1)}else for(let l=0;l<o;l++){let[g,P]=w(a,e),[E,W]=w(P,e);u[g]=E,a=W}i=u,r=a,s=!1}else if(n>=160&&n<=192){let o=n-160;if(o>=e.length)throw TypeError(`Reference index ${o} out of range`);i=e[o],r=t.subarray(1),s=!1}else if(n>=193&&n<=196){let o=n-192,a=T(t,1,o);if(a>=e.length)throw TypeError(`UID ${a} out of range`);i=e[a],r=t.subarray(1+o),s=!1}else throw TypeError(`Unknown tag 0x${n.toString(16)}`);if(s)e.push(i);return[i,r]}var nt={TransientPairing:16},et={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},K={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},f={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 b(t){if(t.has(f.BackOff)){let e=t.get(f.BackOff),n=e.readUintLE(0,e.length);throw Error(`Device is busy, try again in ${n} seconds.`)}if(t.has(f.Error))throw Error(`Device returned an error code: ${t.get(f.Error).readUint8()}`);throw console.error(t),Error("Invalid response")}function S(t){let e=[];for(let[n,s]of t){let i;if(typeof s==="number")i=Buffer.from([s]);else i=s;let r=0;do{let o=Math.min(i.length-r,255);if(e.push(n,o),o>0)for(let a=0;a<o;a++)e.push(i[r+a]);r+=o}while(r<i.length)}return Buffer.from(e)}function A(t){let e=new Map,n=0;while(n<t.length){let s=t[n++],i=t[n++],r=new Uint8Array(t).slice(n,n+i);n+=i;let o=e.get(s);if(o)e.set(s,Buffer.concat([o,r]));else e.set(s,Buffer.from(r))}return e}class R extends EventTarget{get address(){return this.#n}get port(){return this.#t}#n;#t;constructor(t,e){super();this.#n=t,this.#t=e}async connect(){}}var q=4;class H extends R{get isEncrypted(){return!!this.#i&&!!this.#r}#n;#t={};#e=Buffer.alloc(0);#s;#i;#a;#r;#o;constructor(t,e){super(t,e);this.#o=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.#n=new Pt,this.#n.on("close",this.onClose),this.#n.on("connect",this.onConnect),this.#n.on("data",this.onData),this.#n.on("end",this.onEnd),this.#n.on("error",this.onError)}async connect(){return d(`Connecting to ${this.address}:${this.port}...`),await new Promise((t)=>{this.#n.connect({host:this.address,port:this.port,keepAlive:!0},t)})}async disconnect(){this.#n.destroy()}async enableEncryption(t,e){this.#i=t,this.#r=e,this.#s=0,this.#a=0}async exchange(t,e){let n=this.#o;return new Promise((s,i)=>{if(St.includes(t))this.#t[-1]=s;else this.#t[n]=s;this.send(t,e).catch(i)})}async send(t,e){let n=this.#o++;e._x??=F(n,8);let s=Buffer.from(L(e)),i=s.byteLength;if(this.isEncrypted&&i>0)i+=16;let r=Buffer.alloc(4);r.writeUint8(t,0),r.writeUintBE(i,1,3);let o;if(this.isEncrypted){let a=Buffer.alloc(12);a.writeBigUInt64LE(BigInt(this.#a++),0);let u=k(this.#r,a,r,s);o=Buffer.concat([r,u.ciphertext,u.authTag])}else o=Buffer.concat([r,s]);return d("Send data frame",this.isEncrypted,Buffer.from(o).toString("hex"),e),new Promise((a,u)=>{this.#n.write(o,(l)=>l&&u(l)),a()})}async onClose(){d(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){d(`Connected to ${this.address}:${this.port}`)}async onData(t){this.#e=Buffer.concat([this.#e,t]);while(this.#e.byteLength>=q){let e=this.#e.subarray(0,q),n=e.readUintBE(1,3),s=q+n;if(this.#e.byteLength<s){d(`Not enough data yet, waiting on the next frame.. needed=${s} available=${this.#e.byteLength} receivedLength=${t.byteLength}`);return}d(`Frame found length=${s} availableLength=${this.#e.byteLength} receivedLength=${t.byteLength}`);let i=Buffer.from(this.#e.subarray(0,s));this.#e=this.#e.subarray(s),d(`Handle frame, ${this.#e.byteLength} bytes left...`);let o=(await this.#c(i)).subarray(4,s);await this.#f(e,o)}}async onEnd(){d("Connection ended")}async onError(t){d("Error received",t)}async#c(t){if(!this.isEncrypted)return t;let e=t.subarray(0,4),n=e.readUintBE(1,3),s=t.subarray(4,4+n),i=s.subarray(s.byteLength-16),r=s.subarray(0,s.byteLength-16),o=Buffer.alloc(12);o.writeBigUint64LE(BigInt(this.#s++),0);let a=v(this.#i,o,e,r,i);return Buffer.concat([e,a,i])}async#f(t,e){let n=t.readInt8();if(!_t.includes(n))d("Packet not handled, no opack frame.");if([e]=Y(e),d("Decoded OPACK",{header:t,payload:e}),"_x"in e){let s=e._x;if(s in this.#t)(this.#t[s]??null)?.([t,e]),delete this.#t[s];else if("_i"in e)this.dispatchEvent(new CustomEvent(e._i,{detail:e._c}));else{let i=e._c,r=Object.keys(i).map((o)=>o.substring(0,-3));for(let o of r)this.dispatchEvent(new CustomEvent(o,{detail:i[o]}))}}else if(this.#t[-1])(this.#t[-1]??null)?.([t,e]),delete this.#t[-1];else d("No handler for message",[t,e])}}var c={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},_t=[c.PS_Start,c.PS_Next,c.PV_Start,c.PV_Next,c.U_OPACK,c.E_OPACK,c.P_OPACK],St=[c.PS_Start,c.PS_Next,c.PV_Start,c.PV_Next];import{randomInt as Ct}from"node:crypto";class x{#n;#t;constructor(t,e){this.#n=t,this.#t=e}async fetchMediaControlStatus(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"FetchMediaControlStatus",_t:p.Request,_c:{}})}async fetchNowPlayingInfo(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:p.Request,_c:{}})}async fetchSupportedActions(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:p.Request,_c:{}})}async getAttentionState(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"FetchAttentionState",_t:p.Request,_c:{}}),{_c:e}=C(t);switch(e.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.#t.exchange(c.E_OPACK,{_i:"FetchLaunchableApplicationsEvent",_t:p.Request,_c:{}}),{_c:e}=C(t);return Object.entries(e).map(([n,s])=>({bundleId:n,name:s}))}async getSiriRemoteInfo(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:p.Request,_c:{}});return tt(Buffer.from(t._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"FetchUserAccountsEvent",_t:p.Request,_c:{}}),{_c:e}=C(t);return Object.entries(e).map(([n,s])=>({accountId:n,name:s}))}async hidCommand(t,e=!1){await this.#t.exchange(c.E_OPACK,{_i:"_hidC",_t:p.Request,_c:{_hBtS:e?1:2,_hidC:Bt[t]}})}async launchApp(t){await this.#t.exchange(c.E_OPACK,{_i:"_launchApp",_t:p.Request,_c:{_bundleID:t}})}async launchUrl(t){await this.#t.exchange(c.E_OPACK,{_i:"_launchApp",_t:p.Request,_c:{_urlS:t}})}async mediaControlCommand(t,e){let[,n]=await this.#t.exchange(c.E_OPACK,{_i:"_mcc",_t:p.Request,_c:{_mcc:wt[t],...e||{}}});return C(n)}async pressButton(t,e="SingleTap",n=500){switch(e){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 O(n),await this.hidCommand(t,!1);break;case"SingleTap":await this.hidCommand(t,!0),await this.hidCommand(t,!1);break}}async switchUserAccount(t){await this.#t.exchange(c.E_OPACK,{_i:"SwitchUserAccountEvent",_t:p.Request,_c:{SwitchAccountID:t}})}async _subscribe(t,e){this.#t.addEventListener(t,e),await this.#t.send(c.E_OPACK,{_i:"_interest",_t:p.Event,_c:{_regEvents:[t]}})}async _unsubscribe(t,e){if(e)this.#t.removeEventListener(t,e);await this.#t.send(c.E_OPACK,{_i:"_interest",_t:p.Event,_c:{_deregEvents:[t]}})}async _sessionStart(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"_sessionStart",_t:p.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:Ct(0,4294967295)}});return C(t)}async _systemInfo(t){let[,e]=await this.#t.exchange(c.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 C(e)}async _touchStart(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"_touchStart",_t:p.Request,_c:{_height:U(1000),_tFl:0,_width:U(1000)}});return C(t)}async _tvrcSessionStart(){let[,t]=await this.#t.exchange(c.E_OPACK,{_i:"TVRCSessionStart",_t:p.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return C(t)}}var Bt={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},wt={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 C(t){if(typeof t==="object")return t;throw d("Expected an object.",{obj:t}),Error("Expected an object.")}import{SRP as it,SrpClient as Kt}from"fast-srp-hap";import G from"tweetnacl";import{v4 as vt}from"uuid";class st{get name(){return this.#n}get pairingId(){return this.#t}#n;#t;#e;#s;#i;#a;#r;constructor(t,e){this.#e=t,this.#s=e,this.#n="Bas Companion Link",this.#t=Buffer.from(vt().toUpperCase())}async start(){let t=G.sign.keyPair();this.#i=Buffer.from(t.publicKey),this.#a=Buffer.from(t.secretKey)}async pin(t){let e=await this.m1(),n=await this.m2(e,await t()),s=await this.m3(n),i=await this.m4(s),r=await this.m5(i),o=await this.m6(i,r);if(!o)throw Error("Pairing failed, could not get accessory keys.");return o}async transient(){let t=await this.m1([[f.Flags,nt.TransientPairing]]),e=await this.m2(t),n=await this.m3(e),s=await this.m4(n),i=_({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Read-Encryption-Key")}),r=_({hash:"sha512",key:s.sharedSecret,length:32,salt:Buffer.from("Control-Salt"),info:Buffer.from("Control-Write-Encryption-Key")});return{pairingId:this.#t,sharedSecret:s.sharedSecret,accessoryToControllerKey:i,controllerToAccessoryKey:r}}async m1(t=[]){let[,e]=await this.#s.exchange(c.PS_Start,{_pd:S([[f.Method,et.PairSetup],[f.State,K.M1],...t]),_pwTy:1}),n=this.#o(e),s=n.get(f.PublicKey),i=n.get(f.Salt);return{publicKey:s,salt:i}}async m2(t,e=j){let n=await it.genKey(32);this.#r=new Kt(it.params.hap,t.salt,Buffer.from("Pair-Setup"),Buffer.from(e),n,!0),this.#r.setB(t.publicKey);let s=this.#r.computeA(),i=this.#r.computeM1();return{publicKey:s,proof:i}}async m3(t){let[,e]=await this.#s.exchange(c.PS_Next,{_pd:S([[f.State,K.M3],[f.PublicKey,t.publicKey],[f.Proof,t.proof]]),_pwTy:1});return{serverProof:this.#o(e).get(f.Proof)}}async m4(t){return this.#r.checkM2(t.serverProof),{sharedSecret:this.#r.computeK()}}async m5(t){let e=_({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")}),n=_({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Encrypt-Salt","utf8"),info:Buffer.from("Pair-Setup-Encrypt-Info","utf8")}),s=Buffer.concat([e,this.#t,this.#i]),i=G.sign.detached(s,this.#a),r=S([[f.Identifier,this.#t],[f.PublicKey,this.#i],[f.Signature,Buffer.from(i)],[f.Name,Buffer.from(L({name:this.#n}))]]),{authTag:o,ciphertext:a}=k(n,Buffer.from("PS-Msg05"),null,r),u=Buffer.concat([a,o]),[,l]=await this.#s.exchange(c.PS_Next,{_pd:S([[f.State,K.M5],[f.EncryptedData,u]]),_pwTy:1}),P=this.#o(l).get(f.EncryptedData),E=P.subarray(0,-16);return{authTag:P.subarray(-16),data:E,sessionKey:n}}async m6(t,e){let n=v(e.sessionKey,Buffer.from("PS-Msg06"),null,e.data,e.authTag),s=A(n),i=s.get(f.Identifier),r=s.get(f.PublicKey),o=s.get(f.Signature),a=_({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.from("Pair-Setup-Accessory-Sign-Salt"),info:Buffer.from("Pair-Setup-Accessory-Sign-Info")}),u=Buffer.concat([a,i,r]);if(!G.sign.detached.verify(u,o,r))throw Error("Invalid accessory signature.");return{accessoryIdentifier:i.toString(),accessoryLongTermPublicKey:r,pairingId:this.#t,publicKey:this.#i,secretKey:this.#a}}#o(t){if(typeof t!=="object"||t===null)throw Error("Invalid response from receiver.");let e=A(t._pd);if(e.has(f.Error))b(e);return d("Decoded TLV",e),e}}import rt from"tweetnacl";class ot{#n;#t;#e;constructor(t,e){this.#n=t,this.#t=e,this.#e=Q()}async start(t){let e=await this.#s(),n=await this.#i(t.accessoryIdentifier,t.accessoryLongTermPublicKey,e);return await this.#a(t.pairingId,t.secretKey,n),await this.#r(n)}async#s(){let[,t]=await this.#t.exchange(c.PV_Start,{_pd:S([[f.State,K.M1],[f.PublicKey,Buffer.from(this.#e.publicKey)]]),_auTy:4}),e=this.#o(t),n=e.get(f.PublicKey);return{encryptedData:e.get(f.EncryptedData),serverPublicKey:n}}async#i(t,e,n){let s=Buffer.from(Z(this.#e.secretKey,n.serverPublicKey)),i=_({hash:"sha512",key:s,length:32,salt:Buffer.from("Pair-Verify-Encrypt-Salt"),info:Buffer.from("Pair-Verify-Encrypt-Info")}),r=n.encryptedData.subarray(0,-16),o=n.encryptedData.subarray(-16),a=v(i,Buffer.from("PV-Msg02"),null,r,o),u=A(a),l=u.get(f.Identifier),g=u.get(f.Signature);if(l.toString()!==t)throw Error(`Invalid accessory identifier. Expected ${l.toString()} to be ${t}.`);let P=Buffer.concat([n.serverPublicKey,l,this.#e.publicKey]);if(!rt.sign.detached.verify(P,g,e))throw Error("Invalid accessory signature.");return{serverEphemeralPublicKey:n.serverPublicKey,sessionKey:i,sharedSecret:s}}async#a(t,e,n){let s=Buffer.concat([this.#e.publicKey,t,n.serverEphemeralPublicKey]),i=Buffer.from(rt.sign.detached(s,e)),r=S([[f.Identifier,t],[f.Signature,i]]),{authTag:o,ciphertext:a}=k(n.sessionKey,Buffer.from("PV-Msg03"),null,r),u=Buffer.concat([a,o]),[,l]=await this.#t.exchange(c.PV_Next,{_pd:S([[f.State,K.M3],[f.EncryptedData,u]]),_auTy:4});return{}}async#r(t){let e=_({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),n=_({hash:"sha512",key:t.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:e,controllerToAccessoryKey:n}}#o(t){if(typeof t!=="object"||t===null)throw Error("Invalid response from receiver.");let e=A(t._pd);if(e.has(f.Error))b(e);return d("Decoded TLV",e),e}}class D{get api(){return this.#n}get socket(){return this.#e}get pairing(){return this.#s}get verify(){return this.#i}#n;#t;#e;#s;#i;constructor(t){this.#t=t,this.#e=new H(t.address,t.service.port),this.#n=new x(this,this.#e),this.#s=new st(this,this.#e),this.#i=new ot(this,this.#e)}async connect(){await this.#e.connect()}}export{D as CompanionLink};
|
|
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};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=4B1DCB09002E1C1C64756E2164756E21
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/
|
|
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 {
|
|
6
|
-
"import{createCipher as K,createDecipher as _}from\"chacha\";var I=12;function V(e,t,r,s,n){t=k(t);let o=_(e,t);r&&o.setAAD(r),o.setAuthTag(n);let f=o._update(s);return o._final(),f}function z(e,t,r,s){t=k(t);let n=K(e,t);r&&n.setAAD(r);let o=n._update(s);n._final();let f=n.getAuthTag();return{ciphertext:o,authTag:f}}function k(e){if(e.length>=I)return e;return Buffer.concat([Buffer.alloc(I-e.length,0),e])}import{randomBytes as N}from\"node:crypto\";import{x25519 as E}from\"@noble/curves/ed25519.js\";function $(){let e=N(32);return{publicKey:E.getPublicKey(e),secretKey:e}}function q(e,t){return E.getSharedSecret(e,t)}import{hkdfSync as Y}from\"node:crypto\";function B(e){return Buffer.from(Y(e.hash,e.key,e.salt,e.info,e.length))}import Z from\"node-dns-sd\";import{createInterface as H}from\"node:readline\";var W=H({input:process.stdin,output:process.stdout});function ve(...e){console.debug(\"\\x1B[36m[debug]\\x1B[39m\",...e)}async function de(e){return await new Promise((t)=>W.question(`${e}: `,t))}async function S(e){return new Promise((t)=>setTimeout(t,e))}var Pe=\"3939\",Ie=15000,F=\"_airplay._tcp.local\",D=\"_companion-link._tcp.local\",R=\"_raop._tcp.local\";class g{#e;constructor(e){this.#e=e}async find(){return await Z.discover({name:this.#e})}async findUntil(e,t=10,r=1000){while(t>0){let s=await this.find(),n=s.find((o)=>o.fqdn===e);if(n)return n;if(console.log(),console.log(`Device not found, retrying in ${r}ms...`),console.log(s.map((o)=>` ● ${o.fqdn}`).join(`\n`)),t--,t===0)throw Error(\"Device not found after serveral tries, aborting.\");await S(r)}}static airplay(){return new g(F)}static companionLink(){return new g(D)}static raop(){return new g(R)}}class d extends Number{size;constructor(e,t){super(e);this.size=t}}function O(e,t){return new d(e,t)}class U{value;constructor(e){this.value=e}}function J(e){return new U(e)}class P{value;constructor(e){this.value=e}}function Q(e){return new P(e)}function u(e){let t=e.reduce((n,o)=>n+o.length,0),r=new Uint8Array(t),s=0;for(let n of e)r.set(n,s),s+=n.length;return r}function l(e){return Uint8Array.of(e)}function a(e,t){let r=new Uint8Array(t),s=BigInt(e);for(let n=0;n<t;n++)r[n]=Number(s&0xffn),s>>=8n;return r}function p(e){let t=e.reduce((n,o)=>n+o.length,0),r=new Uint8Array(t),s=0;for(let n of e)r.set(n,s),s+=n.length;return r}function X(e){return A(e,[])}function A(e,t){let r=null;if(e===null||e===void 0)r=l(4);else if(typeof e===\"boolean\")r=l(e?1:2);else if(e instanceof U){let n=new ArrayBuffer(8);new DataView(n).setFloat64(0,e.value,!0),r=u([l(54),new Uint8Array(n)])}else if(e instanceof P){let n=e.value;if(n<40)r=l(8+n);else if(n<=255)r=p([l(48),a(n,1)]);else if(n<=65535)r=p([l(49),a(n,2)]);else if(n<=4294967295)r=p([l(50),a(n,4)]);else r=p([l(51),a(n,8)])}else if(typeof e===\"number\")if(!Number.isInteger(e)){let n=new ArrayBuffer(8);new DataView(n).setFloat64(0,e,!0),r=u([l(54),new Uint8Array(n)])}else if(e<40)r=l(8+e);else if(e<=255)r=u([l(48),a(e,1)]);else if(e<=65535)r=u([l(49),a(e,2)]);else if(e<=4294967295)r=u([l(50),a(e,4)]);else r=u([l(51),a(e,8)]);else if(e instanceof d)r=u([l(48+Math.log2(e.size)),a(e.valueOf(),e.size)]);else if(typeof e===\"string\"){let n=new TextEncoder().encode(e),o=n.length;if(o<=32)r=u([l(64+o),n]);else if(o<=255)r=u([l(97),a(o,1),n]);else if(o<=65535)r=u([l(98),a(o,2),n]);else if(o<=16777215)r=u([l(99),a(o,3),n]);else r=u([l(100),a(o,4),n])}else if(e instanceof Uint8Array||Buffer.isBuffer(e)){let n=e instanceof Uint8Array?e:new Uint8Array(e),o=n.length;if(o<=32)r=u([l(112+o),n]);else if(o<=255)r=u([l(145),a(o,1),n]);else if(o<=65535)r=u([l(146),a(o,2),n]);else r=u([l(147),a(o,4),n])}else if(Array.isArray(e)){let n=u(e.map((f)=>A(f,t))),o=e.length;if(o<=15){if(r=u([l(208+o),n]),o>=15)r=u([r,l(3)])}else r=u([l(223),n,l(3)])}else if(typeof e===\"object\"){let n=Object.keys(e),o=n.length,f=[];for(let c of n)f.push(A(c,t)),f.push(A(e[c],t));let i;if(o<=15)i=l(224+o);else i=l(239);if(r=p([i,p(f)]),o>=15||t.some((c)=>c===r))r=p([r,l(129)])}else throw TypeError(typeof e);let s=t.findIndex((n)=>n.length===r.length&&n.every((o,f)=>o===r[f]));if(s>=0)if(s<33)r=l(160+s);else if(s<=255)r=u([l(193),a(s,1)]);else if(s<=65535)r=u([l(194),a(s,2)]);else if(s<=4294967295)r=u([l(195),a(s,4)]);else r=u([l(196),a(s,8)]);else if(r.length>1)t.push(r);return r}function G(e){return m(e,[])}function L(e,t){if(e.length<t)throw TypeError(`Not enough data: need ${t} bytes, have ${e.length}`)}function w(e,t,r){L(e.subarray(t),r);let s=0n;for(let n=r-1;n>=0;n--)s=s<<8n|BigInt(e[t+n]);return Number(s)}function m(e,t){if(e.length===0)throw TypeError(\"No data to unpack\");let r=e[0],s=!0,n,o;if(r===1)n=!0,o=e.subarray(1);else if(r===2)n=!1,o=e.subarray(1);else if(r===4)n=null,o=e.subarray(1);else if(r===5)n=e.subarray(1,17),o=e.subarray(17);else if(r===6)n=w(e,1,8),o=e.subarray(9);else if(r>=8&&r<=47)n=r-8,o=e.subarray(1);else if(r===53)n=new DataView(e.buffer,e.byteOffset+1,4).getFloat32(0,!0),o=e.subarray(5);else if(r===54)n=new DataView(e.buffer,e.byteOffset+1,8).getFloat64(0,!0),o=e.subarray(9);else if((r&240)===48){let f=2**(r&15),i=w(e,1,f);n=O(i,f),o=e.subarray(1+f)}else if(r>=64&&r<=96){let f=r-64;n=new TextDecoder().decode(e.subarray(1,1+f)),o=e.subarray(1+f)}else if(r>=97&&r<=100){let f=r&15,i=w(e,1,f);n=new TextDecoder().decode(e.subarray(1+f,1+f+i)),o=e.subarray(1+f+i)}else if(r>=112&&r<=144){let f=r-112;n=e.subarray(1,1+f),o=e.subarray(1+f)}else if(r>=145&&r<=148){let f=1<<(r&15)-1,i=w(e,1,f),c=1+f;n=e.subarray(c,c+i),o=e.subarray(c+i)}else if((r&240)===208){let f=r&15,i=e.subarray(1),c=[];if(f===15){while(i[0]!==3){let[x,y]=m(i,t);c.push(x),i=y}i=i.subarray(1)}else for(let x=0;x<f;x++){let[y,b]=m(i,t);c.push(y),i=b}n=c,o=i,s=!1}else if((r&224)===224){let f=r&15,i=e.subarray(1),c={};if(f===15){while(i[0]!==3){let[x,y]=m(i,t),[b,v]=m(y,t);c[x]=b,i=v}i=i.subarray(1)}else for(let x=0;x<f;x++){let[y,b]=m(i,t),[v,C]=m(b,t);c[y]=v,i=C}n=c,o=i,s=!1}else if(r>=160&&r<=192){let f=r-160;if(f>=t.length)throw TypeError(`Reference index ${f} out of range`);n=t[f],o=e.subarray(1),s=!1}else if(r>=193&&r<=196){let f=r-192,i=w(e,1,f);if(i>=t.length)throw TypeError(`UID ${i} out of range`);n=t[i],o=e.subarray(1+f),s=!1}else throw TypeError(`Unknown tag 0x${r.toString(16)}`);if(s)t.push(n);return[n,o]}import{parse as j}from\"@plist/binary.parse\";import{serialize as ee}from\"@plist/binary.serialize\";var re={TransientPairing:16},ne={PairSetup:0,PairSetupWithAuth:1,PairVerify:2,AddPairing:3,RemovePairing:4,ListPairing:5},te={M1:1,M2:2,M3:3,M4:4,M5:5,M6:6},h={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 oe(e){if(e.has(h.BackOff)){let t=e.get(h.BackOff),r=t.readUintLE(0,t.length);throw Error(`Device is busy, try again in ${r} seconds.`)}if(e.has(h.Error))throw Error(`Device returned an error code: ${e.get(h.Error).readUint8()}`);throw console.error(e),Error(\"Invalid response\")}function se(e){let t=[];for(let[r,s]of e){let n;if(typeof s===\"number\")n=Buffer.from([s]);else n=s;let o=0;do{let f=Math.min(n.length-o,255);if(t.push(r,f),f>0)for(let i=0;i<f;i++)t.push(n[o+i]);o+=f}while(o<n.length)}return Buffer.from(t)}function fe(e){let t=new Map,r=0;while(r<e.length){let s=e[r++],n=e[r++],o=new Uint8Array(e).slice(r,r+n);r+=n;let f=t.get(s);if(f)t.set(s,Buffer.concat([f,o]));else t.set(s,Buffer.from(o))}return t}import{networkInterfaces as ie}from\"node:os\";function T(){let e=ie();for(let t of Object.keys(e)){let r=e[t];if(!r)continue;for(let s of r){if(s.internal||s.family!==\"IPv4\")continue;if(s.address&&s.address!==\"127.0.0.1\")return s.address}}return null}import{networkInterfaces as le}from\"node:os\";function M(){let e=le();for(let t of Object.keys(e)){let r=e[t];if(!r)continue;for(let s of r){if(s.internal||s.family!==\"IPv4\")continue;if(s.mac&&s.mac!==\"00:00:00:00:00:00\")return s.mac.toUpperCase()}}return null}export{S as waitFor,ee as serializeBinaryPlist,de as prompt,j as parseBinaryPlist,O as opackSizedInt,Q as opackInt,J as opackFloat,B as hkdf,M as getMacAddress,T as getLocalIP,q as generateCurve25519SharedSecKey,$ as generateCurve25519KeyPair,z as encryptChacha20,se as encodeTlv,X as encodeOPack,V as decryptChacha20,fe as decodeTlv,G as decodeOPack,ve as debug,oe as bailTlv,h as TlvValue,te as TlvState,ne as TlvMethod,re as TlvFlags,R as RAOP_SERVICE,Ie as HTTP_TIMEOUT,g as Discovery,D as COMPANION_LINK_SERVICE,Pe as AIRPLAY_TRANSIENT_PIN,F as AIRPLAY_SERVICE};\n\n//# debugId=353A68D846F3DD8264756E2164756E21\n//# sourceMappingURL=index.js.map\n",
|
|
7
|
-
"
|
|
8
|
-
"import { randomInt } from 'node:crypto';\nimport { debug, opackFloat, parseBinaryPlist, waitFor } from '@basmilius/apple-common';\nimport { CompanionLinkFrameType, CompanionLinkMessageType, type CompanionLinkSocket } from '@/socket';\nimport type CompanionLink from '../companionLink';\n\nexport default class Api {\n readonly #protocol: CompanionLink;\n readonly #socket: CompanionLinkSocket;\n\n constructor(protocol: CompanionLink, socket: CompanionLinkSocket) {\n this.#protocol = protocol;\n this.#socket = socket;\n }\n\n async fetchMediaControlStatus(): Promise<void> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchMediaControlStatus',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n }\n\n async fetchNowPlayingInfo(): Promise<void> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchCurrentNowPlayingInfoEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n }\n\n async fetchSupportedActions(): Promise<void> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchSupportedActionsEvent',\n _t: CompanionLinkMessageType.Request,\n _c: {}\n });\n }\n\n async getAttentionState(): Promise<AttentionState> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchAttentionState',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchLaunchableApplicationsEvent',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchSiriRemoteInfo',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: 'FetchUserAccountsEvent',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_hidC',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_launchApp',\n _t: CompanionLinkMessageType.Request,\n _c: {\n _bundleID: bundleId\n }\n });\n }\n\n async launchUrl(url: string): Promise<void> {\n await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_launchApp',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_mcc',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: 'SwitchUserAccountEvent',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_interest',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_interest',\n _t: CompanionLinkMessageType.Event,\n _c: {\n _deregEvents: [event]\n }\n });\n }\n\n async _sessionStart(): Promise<object> {\n const [, payload] = await this.#socket.exchange(CompanionLinkFrameType.E_OPACK, {\n _i: '_sessionStart',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_systemInfo',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: '_touchStart',\n _t: CompanionLinkMessageType.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(CompanionLinkFrameType.E_OPACK, {\n _i: 'TVRCSessionStart',\n _t: CompanionLinkMessageType.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",
|
|
9
|
-
"import {
|
|
10
|
-
"import {
|
|
11
|
-
"import type { DiscoveryResult } from '@basmilius/apple-common';\nimport { CompanionLinkSocket } from '@/socket';\nimport Api from './api/companionLink';\nimport Pairing from './pairing/companionLink';\nimport Verify from './verify/companionLink';\n\nexport default class CompanionLink {\n get api(): Api {\n return this.#api;\n }\n\n get socket(): CompanionLinkSocket {\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: CompanionLinkSocket;\n readonly #pairing: Pairing;\n readonly #verify: Verify;\n\n constructor(device: DiscoveryResult) {\n this.#device = device;\n this.#socket = new CompanionLinkSocket(device.address, device.service.port);\n this.#api = new Api(this, this.#socket);\n this.#pairing = new Pairing(this, this.#socket);\n this.#verify = new Verify(this, this.#socket);\n }\n\n async connect(): Promise<void> {\n await this.#socket.connect();\n }\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: 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",
|
|
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
|
+
"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
|
+
"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"
|
|
12
11
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "4B1DCB09002E1C1C64756E2164756E21",
|
|
15
14
|
"names": []
|
|
16
15
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { type CompanionLinkSocket } from "
|
|
2
|
-
import type CompanionLink from "
|
|
3
|
-
export default class
|
|
1
|
+
import { type default as CompanionLinkSocket } from "./socket";
|
|
2
|
+
import type CompanionLink from "./protocol";
|
|
3
|
+
export default class CompanionLinkApi {
|
|
4
4
|
#private;
|
|
5
|
-
|
|
5
|
+
get socket(): CompanionLinkSocket;
|
|
6
|
+
constructor(protocol: CompanionLink);
|
|
6
7
|
fetchMediaControlStatus(): Promise<void>;
|
|
7
8
|
fetchNowPlayingInfo(): Promise<void>;
|
|
8
9
|
fetchSupportedActions(): Promise<void>;
|
package/dist/protocol/index.d.ts
CHANGED
|
@@ -1 +1,4 @@
|
|
|
1
|
-
export { default as
|
|
1
|
+
export type { default as CompanionLinkApi } from "./api";
|
|
2
|
+
export type { default as CompanionLinkPairing } from "./pairing";
|
|
3
|
+
export type { default as CompanionLinkVerify } from "./verify";
|
|
4
|
+
export { default as CompanionLink } from "./protocol";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type AccessoryCredentials, type AccessoryKeys, AccessoryPair } from "@basmilius/apple-common";
|
|
2
|
+
import { type default as CompanionLinkSocket } from "./socket";
|
|
3
|
+
import type CompanionLink from "./protocol";
|
|
4
|
+
export default class CompanionLinkPairing {
|
|
5
|
+
#private;
|
|
6
|
+
get internal(): AccessoryPair;
|
|
7
|
+
get socket(): CompanionLinkSocket;
|
|
8
|
+
constructor(protocol: CompanionLink);
|
|
9
|
+
start(): Promise<void>;
|
|
10
|
+
pin(askPin: () => Promise<string>): Promise<AccessoryCredentials>;
|
|
11
|
+
transient(): Promise<AccessoryKeys>;
|
|
12
|
+
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { DiscoveryResult } from "@basmilius/apple-common";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import Verify from "./verify
|
|
2
|
+
import Api from "./api";
|
|
3
|
+
import Pairing from "./pairing";
|
|
4
|
+
import Socket from "./socket";
|
|
5
|
+
import Verify from "./verify";
|
|
6
6
|
export default class CompanionLink {
|
|
7
7
|
#private;
|
|
8
8
|
get api(): Api;
|
|
9
|
-
get
|
|
9
|
+
get device(): DiscoveryResult;
|
|
10
|
+
get socket(): Socket;
|
|
10
11
|
get pairing(): Pairing;
|
|
11
12
|
get verify(): Verify;
|
|
12
13
|
constructor(device: DiscoveryResult);
|
|
13
14
|
connect(): Promise<void>;
|
|
15
|
+
disconnect(): Promise<void>;
|
|
14
16
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import BaseSocket from "
|
|
2
|
-
export default class extends BaseSocket {
|
|
1
|
+
import { BaseSocket } from "@basmilius/apple-common";
|
|
2
|
+
export default class CompanionLinkSocket extends BaseSocket {
|
|
3
3
|
#private;
|
|
4
4
|
get isEncrypted(): boolean;
|
|
5
5
|
constructor(address: string, port: number);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AccessoryCredentials, type AccessoryKeys } from "@basmilius/apple-common";
|
|
2
|
+
import { type default as CompanionLinkSocket } from "./socket";
|
|
3
|
+
import type CompanionLink from "./protocol";
|
|
4
|
+
export default class CompanionLinkVerify {
|
|
5
|
+
#private;
|
|
6
|
+
get socket(): CompanionLinkSocket;
|
|
7
|
+
constructor(protocol: CompanionLink);
|
|
8
|
+
start(credentials: AccessoryCredentials): Promise<AccessoryKeys>;
|
|
9
|
+
}
|
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.
|
|
4
|
+
"version": "0.0.12",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"keywords": [
|
|
13
13
|
"apple",
|
|
14
|
-
"
|
|
14
|
+
"companion link",
|
|
15
15
|
"tv",
|
|
16
16
|
"apple tv",
|
|
17
17
|
"homekit"
|
|
@@ -40,10 +40,7 @@
|
|
|
40
40
|
}
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@basmilius/apple-common": "0.0.
|
|
44
|
-
"fast-srp-hap": "^2.0.4",
|
|
45
|
-
"tweetnacl": "^1.0.3",
|
|
46
|
-
"uuid": "^13.0.0"
|
|
43
|
+
"@basmilius/apple-common": "0.0.12"
|
|
47
44
|
},
|
|
48
45
|
"devDependencies": {
|
|
49
46
|
"@basmilius/tools": "^2.13.0",
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { type CompanionLinkSocket } from "@/socket";
|
|
2
|
-
import CompanionLink from "../companionLink";
|
|
3
|
-
export default class {
|
|
4
|
-
#private;
|
|
5
|
-
get name(): string;
|
|
6
|
-
get pairingId(): Buffer;
|
|
7
|
-
constructor(protocol: CompanionLink, socket: CompanionLinkSocket);
|
|
8
|
-
start(): Promise<void>;
|
|
9
|
-
pin(askPin: () => Promise<string>): Promise<PairingCredentials>;
|
|
10
|
-
transient(): Promise<TransientPairingCredentials>;
|
|
11
|
-
m1(additionalTlv?: [number, number | Buffer][]): Promise<M1>;
|
|
12
|
-
m2(m1: M1, pin?: string): Promise<M2>;
|
|
13
|
-
m3(m2: M2): Promise<M3>;
|
|
14
|
-
m4(m3: M3): Promise<M4>;
|
|
15
|
-
m5(m4: M4): Promise<M5>;
|
|
16
|
-
m6(m4: M4, m5: M5): Promise<PairingCredentials>;
|
|
17
|
-
}
|
|
18
|
-
type M1 = {
|
|
19
|
-
readonly publicKey: Buffer;
|
|
20
|
-
readonly salt: Buffer;
|
|
21
|
-
};
|
|
22
|
-
type M2 = {
|
|
23
|
-
readonly publicKey: Buffer;
|
|
24
|
-
readonly proof: Buffer;
|
|
25
|
-
};
|
|
26
|
-
type M3 = {
|
|
27
|
-
readonly serverProof: Buffer;
|
|
28
|
-
};
|
|
29
|
-
type M4 = {
|
|
30
|
-
readonly sharedSecret: Buffer;
|
|
31
|
-
};
|
|
32
|
-
type M5 = {
|
|
33
|
-
readonly authTag: Buffer;
|
|
34
|
-
readonly data: Buffer;
|
|
35
|
-
readonly sessionKey: Buffer;
|
|
36
|
-
};
|
|
37
|
-
type PairingCredentials = {
|
|
38
|
-
readonly accessoryIdentifier: string;
|
|
39
|
-
readonly accessoryLongTermPublicKey: Buffer;
|
|
40
|
-
readonly pairingId: Buffer;
|
|
41
|
-
readonly publicKey: Buffer;
|
|
42
|
-
readonly secretKey: Buffer;
|
|
43
|
-
};
|
|
44
|
-
type TransientPairingCredentials = {
|
|
45
|
-
readonly pairingId: Buffer;
|
|
46
|
-
readonly sharedSecret: Buffer;
|
|
47
|
-
readonly accessoryToControllerKey: Buffer;
|
|
48
|
-
readonly controllerToAccessoryKey: Buffer;
|
|
49
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { CompanionLinkSocket } from "@/socket";
|
|
2
|
-
import CompanionLink from "../companionLink";
|
|
3
|
-
export default class {
|
|
4
|
-
#private;
|
|
5
|
-
constructor(protocol: CompanionLink, socket: CompanionLinkSocket);
|
|
6
|
-
start(credentials: Credentials): Promise<AccessoryKeys>;
|
|
7
|
-
}
|
|
8
|
-
type Credentials = {
|
|
9
|
-
readonly accessoryIdentifier: string;
|
|
10
|
-
readonly accessoryLongTermPublicKey: Buffer;
|
|
11
|
-
readonly pairingId: Buffer;
|
|
12
|
-
readonly publicKey: Buffer;
|
|
13
|
-
readonly secretKey: Buffer;
|
|
14
|
-
};
|
|
15
|
-
type AccessoryKeys = {
|
|
16
|
-
readonly accessoryToControllerKey: Buffer;
|
|
17
|
-
readonly controllerToAccessoryKey: Buffer;
|
|
18
|
-
};
|
package/dist/socket/base.d.ts
DELETED
package/dist/socket/index.d.ts
DELETED