@basmilius/apple-companion-link 0.0.73 → 0.0.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var f={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},C={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 A(t){switch(t){case 1:return"asleep";case 2:return"screensaver";case 3:return"awake";case 4:return"idle";default:return"unknown"}}import{randomInt as v}from"node:crypto";import{opackFloat as x,parseBinaryPlist as E,reporter as K,waitFor as F}from"@basmilius/apple-common";var o={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},n={Event:1,Request:2,Response:3},g=[o.PS_Start,o.PS_Next,o.PV_Start,o.PV_Next,o.U_OPACK,o.E_OPACK,o.P_OPACK],k=[o.PS_Start,o.PS_Next,o.PV_Start,o.PV_Next];class h{get socket(){return this.#t.socket}#t;constructor(t){this.#t=t}async fetchMediaControlStatus(){await this.socket.exchange(o.E_OPACK,{_i:"FetchMediaControlStatus",_t:n.Request,_c:{}})}async fetchNowPlayingInfo(){await this.socket.exchange(o.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:n.Request,_c:{}})}async fetchSupportedActions(){await this.socket.exchange(o.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:n.Request,_c:{}})}async getAttentionState(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchAttentionState",_t:n.Request,_c:{}}),{_c:e}=_(t);return A(e.state)}async getLaunchableApps(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchLaunchableApplicationsEvent",_t:n.Request,_c:{}}),{_c:e}=_(t);return Object.entries(e).map(([i,s])=>({bundleId:i,name:s}))}async getSiriRemoteInfo(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:n.Request,_c:{}});return E(Buffer.from(t._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchUserAccountsEvent",_t:n.Request,_c:{}}),{_c:e}=_(t);return Object.entries(e).map(([i,s])=>({accountId:i,name:s}))}async hidCommand(t,e=!1){await this.socket.exchange(o.E_OPACK,{_i:"_hidC",_t:n.Request,_c:{_hBtS:e?1:2,_hidC:f[t]}})}async launchApp(t){await this.socket.exchange(o.E_OPACK,{_i:"_launchApp",_t:n.Request,_c:{_bundleID:t}})}async launchUrl(t){await this.socket.exchange(o.E_OPACK,{_i:"_launchApp",_t:n.Request,_c:{_urlS:t}})}async mediaControlCommand(t,e){let[,i]=await this.socket.exchange(o.E_OPACK,{_i:"_mcc",_t:n.Request,_c:{_mcc:C[t],...e||{}}});return _(i)}async pressButton(t,e="SingleTap",i=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 F(i),await this.hidCommand(t,!1);break;case"SingleTap":await this.hidCommand(t,!0),await this.hidCommand(t,!1);break}}async switchUserAccount(t){await this.socket.exchange(o.E_OPACK,{_i:"SwitchUserAccountEvent",_t:n.Request,_c:{SwitchAccountID:t}})}async _subscribe(t,e){this.socket.on(t,e),await this.socket.send(o.E_OPACK,{_i:"_interest",_t:n.Event,_c:{_regEvents:[t]}})}async _unsubscribe(t,e){if(e)this.socket.off(t,e);await this.socket.send(o.E_OPACK,{_i:"_interest",_t:n.Event,_c:{_deregEvents:[t]}})}async _sessionStart(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"_sessionStart",_t:n.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:v(0,4294967295)}});return _(t)}async _systemInfo(t){let[,e]=await this.socket.exchange(o.E_OPACK,{_i:"_systemInfo",_t:n.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 _(e)}async _touchStart(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"_touchStart",_t:n.Request,_c:{_height:x(1000),_tFl:0,_width:x(1000)}});return _(t)}async _tvrcSessionStart(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"TVRCSessionStart",_t:n.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return _(t)}}function _(t){if(typeof t==="object")return t;throw K.error("Expected an object.",{obj:t}),Error("Expected an object.")}import{AccessoryPair as O}from"@basmilius/apple-common";class P{get internal(){return this.#t}get socket(){return this.#s.socket}#t;#s;constructor(t){this.#t=new O(this.#e.bind(this)),this.#s=t}async start(){await this.#t.start()}async pin(t){return this.#t.pin(t)}async transient(){return this.#t.transient()}async#e(t,e){let i=t==="m1"?o.PS_Start:o.PS_Next,[,s]=await this.socket.exchange(i,{_pd:e,_pwTy:1});if(typeof s!=="object"||s===null)throw Error("Invalid response from receiver.");return s._pd}}import{randomInt as T}from"node:crypto";import{Socket as V}from"node:net";import{BaseSocket as I,decodeOPack as U,decryptChacha20 as B,encodeOPack as q,encryptChacha20 as M,opackSizedInt as N,reporter as a}from"@basmilius/apple-common";var S=4;class y extends I{get isConnected(){return this.#t.readyState==="open"}get isEncrypted(){return!!this.#o&&!!this.#n}#t;#s={};#e=Buffer.alloc(0);#i;#o;#c;#n;#r;constructor(t,e){super(t,e);this.#r=T(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 V,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.net(`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,e){this.#o=t,this.#n=e,this.#i=0,this.#c=0}async exchange(t,e){let i=this.#r;return new Promise((s,r)=>{if(k.includes(t))this.#s[-1]=s;else this.#s[i]=s;this.send(t,e).catch(r)})}async send(t,e){let i=this.#r++;e._x??=N(i,8);let s=Buffer.from(q(e)),r=s.byteLength;if(this.isEncrypted&&r>0)r+=16;let m=Buffer.alloc(4);m.writeUint8(t,0),m.writeUintBE(r,1,3);let c;if(this.isEncrypted){let p=Buffer.alloc(12);p.writeBigUInt64LE(BigInt(this.#c++),0);let u=M(this.#n,p,m,s);c=Buffer.concat([m,u.ciphertext,u.authTag])}else c=Buffer.concat([m,s]);return a.raw("Send data frame",this.isEncrypted,Buffer.from(c).toString("hex"),e),new Promise((p,u)=>{this.#t.write(c,(d)=>d&&u(d)),p()})}async onClose(){await super.onClose(),a.net(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){await super.onConnect(),a.net(`Connected to ${this.address}:${this.port}`)}async onData(t){this.#e=Buffer.concat([this.#e,t]);while(this.#e.byteLength>=S){let e=this.#e.subarray(0,S),i=e.readUintBE(1,3),s=S+i;if(this.#e.byteLength<s){a.warn(`Not enough data yet, waiting on the next frame.. needed=${s} available=${this.#e.byteLength} receivedLength=${t.byteLength}`);return}a.raw(`Frame found length=${s} availableLength=${this.#e.byteLength} receivedLength=${t.byteLength}`);let r=Buffer.from(this.#e.subarray(0,s));this.#e=this.#e.subarray(s),a.raw(`Handle frame, ${this.#e.byteLength} bytes left...`);let c=(await this.#a(r)).subarray(4,s);await this.#m(e,c)}}async onEnd(){a.net("Connection ended")}async onError(t){await super.onError(t),a.error("Error received",t)}async#a(t){if(!this.isEncrypted)return t;let e=t.subarray(0,4),i=e.readUintBE(1,3),s=t.subarray(4,4+i),r=s.subarray(s.byteLength-16),m=s.subarray(0,s.byteLength-16),c=Buffer.alloc(12);c.writeBigUint64LE(BigInt(this.#i++),0);let p=B(this.#o,c,e,m,r);return Buffer.concat([e,p,r])}async#m(t,e){let i=t.readInt8();if(!g.includes(i)){a.warn("Packet not handled, no opack frame.");return}if([e]=U(e),a.raw("Decoded OPACK",{header:t,payload:e}),"_x"in e){let s=e._x;if(s in this.#s)(this.#s[s]??null)?.([t,e]),delete this.#s[s];else if("_i"in e)this.emit(e._i,e._c);else{let r=e._c,m=Object.keys(r).map((c)=>c.substring(0,-3));for(let c of m)this.emit(c,r[c])}}else if(this.#s[-1])(this.#s[-1]??null)?.([t,e]),delete this.#s[-1];else a.warn("No handler for message",[t,e])}}import{AccessoryVerify as b,hkdf as R}from"@basmilius/apple-common";class l{get socket(){return this.#s.socket}#t;#s;constructor(t){this.#t=new b(this.#e.bind(this)),this.#s=t}async start(t){let e=await this.#t.start(t),i=R({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),s=R({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:i,controllerToAccessoryKey:s,pairingId:e.pairingId,sharedSecret:e.sharedSecret}}async#e(t,e){let i=t==="m1"?o.PV_Start:o.PV_Next,[,s]=await this.socket.exchange(i,{_pd:e,_auTy:4});if(typeof s!=="object"||s===null)throw Error("Invalid response from receiver.");return s._pd}}class w{get api(){return this.#t}get device(){return this.#s}get socket(){return this.#e}get pairing(){return this.#i}get verify(){return this.#o}#t;#s;#e;#i;#o;constructor(t){this.#s=t,this.#e=new y(t.address,t.service.port),this.#t=new h(this),this.#i=new P(this),this.#o=new l(this)}async connect(){await this.#e.connect()}async disconnect(){await this.#e.disconnect()}}export{A as convertAttentionState,C as MediaControlCommand,f as HidCommand,w as CompanionLink};
1
+ var f={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},C={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 A(t){switch(t){case 1:return"asleep";case 2:return"screensaver";case 3:return"awake";case 4:return"idle";default:return"unknown"}}import{randomInt as K}from"node:crypto";import{OPack as R,Plist as O,reporter as F,waitFor as T}from"@basmilius/apple-common";var o={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},n={Event:1,Request:2,Response:3},k=[o.PS_Start,o.PS_Next,o.PV_Start,o.PV_Next,o.U_OPACK,o.E_OPACK,o.P_OPACK],x=[o.PS_Start,o.PS_Next,o.PV_Start,o.PV_Next];class h{get socket(){return this.#t.socket}#t;constructor(t){this.#t=t}async fetchMediaControlStatus(){await this.socket.exchange(o.E_OPACK,{_i:"FetchMediaControlStatus",_t:n.Request,_c:{}})}async fetchNowPlayingInfo(){await this.socket.exchange(o.E_OPACK,{_i:"FetchCurrentNowPlayingInfoEvent",_t:n.Request,_c:{}})}async fetchSupportedActions(){await this.socket.exchange(o.E_OPACK,{_i:"FetchSupportedActionsEvent",_t:n.Request,_c:{}})}async getAttentionState(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchAttentionState",_t:n.Request,_c:{}}),{_c:e}=_(t);return A(e.state)}async getLaunchableApps(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchLaunchableApplicationsEvent",_t:n.Request,_c:{}}),{_c:e}=_(t);return Object.entries(e).map(([i,s])=>({bundleId:i,name:s}))}async getSiriRemoteInfo(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchSiriRemoteInfo",_t:n.Request,_c:{}});return O.parse(Buffer.from(t._c.SiriRemoteInfoKey).buffer)}async getUserAccounts(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"FetchUserAccountsEvent",_t:n.Request,_c:{}}),{_c:e}=_(t);return Object.entries(e).map(([i,s])=>({accountId:i,name:s}))}async hidCommand(t,e=!1){await this.socket.exchange(o.E_OPACK,{_i:"_hidC",_t:n.Request,_c:{_hBtS:e?1:2,_hidC:f[t]}})}async launchApp(t){await this.socket.exchange(o.E_OPACK,{_i:"_launchApp",_t:n.Request,_c:{_bundleID:t}})}async launchUrl(t){await this.socket.exchange(o.E_OPACK,{_i:"_launchApp",_t:n.Request,_c:{_urlS:t}})}async mediaControlCommand(t,e){let[,i]=await this.socket.exchange(o.E_OPACK,{_i:"_mcc",_t:n.Request,_c:{_mcc:C[t],...e||{}}});return _(i)}async pressButton(t,e="SingleTap",i=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 T(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(o.E_OPACK,{_i:"SwitchUserAccountEvent",_t:n.Request,_c:{SwitchAccountID:t}})}async _subscribe(t,e){this.socket.on(t,e),await this.socket.send(o.E_OPACK,{_i:"_interest",_t:n.Event,_c:{_regEvents:[t]}})}async _unsubscribe(t,e){if(e)this.socket.off(t,e);await this.socket.send(o.E_OPACK,{_i:"_interest",_t:n.Event,_c:{_deregEvents:[t]}})}async _sessionStart(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"_sessionStart",_t:n.Request,_c:{_srvT:"com.apple.tvremoteservices",_sid:K(0,4294967295)}});return _(t)}async _systemInfo(t){let[,e]=await this.socket.exchange(o.E_OPACK,{_i:"_systemInfo",_t:n.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 _(e)}async _touchStart(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"_touchStart",_t:n.Request,_c:{_height:R.float(1000),_tFl:0,_width:R.float(1000)}});return _(t)}async _tvrcSessionStart(){let[,t]=await this.socket.exchange(o.E_OPACK,{_i:"TVRCSessionStart",_t:n.Request,_btHP:!1,_inUseProc:"tvremoted",_c:{}});return _(t)}}function _(t){if(typeof t==="object")return t;throw F.error("Expected an object.",{obj:t}),Error("Expected an object.")}import{AccessoryPair as V}from"@basmilius/apple-common";class P{get internal(){return this.#t}get socket(){return this.#s.socket}#t;#s;constructor(t){this.#t=new V(this.#e.bind(this)),this.#s=t}async start(){await this.#t.start()}async pin(t){return this.#t.pin(t)}async transient(){return this.#t.transient()}async#e(t,e){let i=t==="m1"?o.PS_Start:o.PS_Next,[,s]=await this.socket.exchange(i,{_pd:e,_pwTy:1});if(typeof s!=="object"||s===null)throw Error("Invalid response from receiver.");return s._pd}}import{randomInt as I}from"node:crypto";import{Socket as U}from"node:net";import{BaseSocket as B,Chacha20 as v,OPack as S,reporter as a}from"@basmilius/apple-common";var d=4;class y extends B{get isConnected(){return this.#t.readyState==="open"}get isEncrypted(){return!!this.#o&&!!this.#n}#t;#s={};#e=Buffer.alloc(0);#i;#o;#c;#n;#r;constructor(t,e){super(t,e);this.#r=I(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 U,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.net(`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,e){this.#o=t,this.#n=e,this.#i=0,this.#c=0}async exchange(t,e){let i=this.#r;return new Promise((s,r)=>{if(x.includes(t))this.#s[-1]=s;else this.#s[i]=s;this.send(t,e).catch(r)})}async send(t,e){let i=this.#r++;e._x??=S.sizedInt(i,8);let s=Buffer.from(S.encode(e)),r=s.byteLength;if(this.isEncrypted&&r>0)r+=16;let m=Buffer.alloc(4);m.writeUint8(t,0),m.writeUintBE(r,1,3);let c;if(this.isEncrypted){let p=Buffer.alloc(12);p.writeBigUInt64LE(BigInt(this.#c++),0);let u=v.encrypt(this.#n,p,m,s);c=Buffer.concat([m,u.ciphertext,u.authTag])}else c=Buffer.concat([m,s]);return a.raw("Send data frame",this.isEncrypted,Buffer.from(c).toString("hex"),e),new Promise((p,u)=>{this.#t.write(c,(g)=>g&&u(g)),p()})}async onClose(){await super.onClose(),a.net(`Connection closed from ${this.address}:${this.port}`)}async onConnect(){await super.onConnect(),a.net(`Connected to ${this.address}:${this.port}`)}async onData(t){this.#e=Buffer.concat([this.#e,t]);while(this.#e.byteLength>=d){let e=this.#e.subarray(0,d),i=e.readUintBE(1,3),s=d+i;if(this.#e.byteLength<s){a.warn(`Not enough data yet, waiting on the next frame.. needed=${s} available=${this.#e.byteLength} receivedLength=${t.byteLength}`);return}a.raw(`Frame found length=${s} availableLength=${this.#e.byteLength} receivedLength=${t.byteLength}`);let r=Buffer.from(this.#e.subarray(0,s));this.#e=this.#e.subarray(s),a.raw(`Handle frame, ${this.#e.byteLength} bytes left...`);let c=(await this.#a(r)).subarray(4,s);await this.#m(e,c)}}async onEnd(){a.net("Connection ended")}async onError(t){await super.onError(t),a.error("Error received",t)}async#a(t){if(!this.isEncrypted)return t;let e=t.subarray(0,4),i=e.readUintBE(1,3),s=t.subarray(4,4+i),r=s.subarray(s.byteLength-16),m=s.subarray(0,s.byteLength-16),c=Buffer.alloc(12);c.writeBigUint64LE(BigInt(this.#i++),0);let p=v.decrypt(this.#o,c,e,m,r);return Buffer.concat([e,p,r])}async#m(t,e){let i=t.readInt8();if(!k.includes(i)){a.warn("Packet not handled, no opack frame.");return}if(e=S.decode(e),a.raw("Decoded OPACK",{header:t,payload:e}),"_x"in e){let s=e._x;if(s in this.#s)(this.#s[s]??null)?.([t,e]),delete this.#s[s];else if("_i"in e)this.emit(e._i,e._c);else{let r=e._c,m=Object.keys(r).map((c)=>c.substring(0,-3));for(let c of m)this.emit(c,r[c])}}else if(this.#s[-1])(this.#s[-1]??null)?.([t,e]),delete this.#s[-1];else a.warn("No handler for message",[t,e])}}import{AccessoryVerify as q,hkdf as E}from"@basmilius/apple-common";class l{get socket(){return this.#s.socket}#t;#s;constructor(t){this.#t=new q(this.#e.bind(this)),this.#s=t}async start(t){let e=await this.#t.start(t),i=E({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ServerEncrypt-main")}),s=E({hash:"sha512",key:e.sharedSecret,length:32,salt:Buffer.alloc(0),info:Buffer.from("ClientEncrypt-main")});return{accessoryToControllerKey:i,controllerToAccessoryKey:s,pairingId:e.pairingId,sharedSecret:e.sharedSecret}}async#e(t,e){let i=t==="m1"?o.PV_Start:o.PV_Next,[,s]=await this.socket.exchange(i,{_pd:e,_auTy:4});if(typeof s!=="object"||s===null)throw Error("Invalid response from receiver.");return s._pd}}class w{get api(){return this.#t}get device(){return this.#s}get socket(){return this.#e}get pairing(){return this.#i}get verify(){return this.#o}#t;#s;#e;#i;#o;constructor(t){this.#s=t,this.#e=new y(t.address,t.service.port),this.#t=new h(this),this.#i=new P(this),this.#o=new l(this)}async connect(){await this.#e.connect()}async disconnect(){await this.#e.disconnect()}}export{A as convertAttentionState,C as MediaControlCommand,f as HidCommand,w as CompanionLink};
2
2
 
3
- //# debugId=833289E21DFDB55564756E2164756E21
3
+ //# debugId=E00B066B0AF3EB3A64756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -4,14 +4,14 @@
4
4
  "sourcesContent": [
5
5
  "export const 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\nexport const 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\nexport type HidCommandKey = keyof typeof HidCommand;\nexport type MediaControlCommandKey = keyof typeof MediaControlCommand;\n",
6
6
  "import type { AttentionState } from './types';\n\nexport function convertAttentionState(state: number): AttentionState {\n switch (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",
7
- "import { randomInt } from 'node:crypto';\nimport { opackFloat, parseBinaryPlist, reporter, waitFor } from '@basmilius/apple-common';\nimport { HidCommand, type HidCommandKey, MediaControlCommand, type MediaControlCommandKey } from './const';\nimport { FrameType, MessageType } from './messages';\nimport type { AttentionState, ButtonPressType, LaunchableApp, UserAccount } from './types';\nimport { convertAttentionState } from './utils';\nimport type Protocol from './protocol';\nimport type Socket from './socket';\n\nexport default class CompanionLinkApi {\n get socket(): Socket {\n return this.#protocol.socket;\n }\n\n readonly #protocol: Protocol;\n\n constructor(protocol: Protocol) {\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 return convertAttentionState(_c.state);\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: HidCommandKey, 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: MediaControlCommandKey, 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: HidCommandKey, type: ButtonPressType = 'SingleTap', holdDelayMs = 500): Promise<void> {\n switch (type) {\n case 'DoubleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n\n case 'Hold':\n await this.hidCommand(command, true);\n await waitFor(holdDelayMs);\n await this.hidCommand(command, false);\n break;\n\n case 'SingleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n }\n }\n\n async switchUserAccount(accountId: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'SwitchUserAccountEvent',\n _t: MessageType.Request,\n _c: {\n SwitchAccountID: accountId\n }\n });\n }\n\n async _subscribe(event: string, fn: (data: unknown) => void): Promise<void> {\n this.socket.on(event, fn);\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _regEvents: [event]\n }\n });\n }\n\n async _unsubscribe(event: string, fn?: (data: unknown) => void): Promise<void> {\n if (fn) {\n this.socket.off(event, fn);\n }\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _deregEvents: [event]\n }\n });\n }\n\n async _sessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_sessionStart',\n _t: MessageType.Request,\n _c: {\n _srvT: 'com.apple.tvremoteservices',\n _sid: randomInt(0, 2 ** 32 - 1)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _systemInfo(pairingId: Buffer): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_systemInfo',\n _t: MessageType.Request,\n _c: {\n _bf: 0,\n _cf: 512,\n _clFl: 128,\n _i: 'cafecafecafe',\n _idsID: pairingId.toString(),\n _pubID: 'FF:70:79:61:74:76',\n _sf: 256,\n _sv: '170.18',\n model: 'iPhone10,6',\n name: 'Bas Companion Link'\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _touchStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_touchStart',\n _t: MessageType.Request,\n _c: {\n _height: opackFloat(1000.0),\n _tFl: 0,\n _width: opackFloat(1000.0)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _tvrcSessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'TVRCSessionStart',\n _t: MessageType.Request,\n _btHP: false,\n _inUseProc: 'tvremoted',\n _c: {}\n });\n\n return objectOrFail(payload);\n }\n}\n\nfunction objectOrFail<T = object>(obj: unknown): T {\n if (typeof obj === 'object') {\n return obj as T;\n }\n\n reporter.error('Expected an object.', {obj});\n\n throw new Error('Expected an object.');\n}\n\ntype AttentionStateResponse = {\n readonly _c: {\n readonly state: number;\n };\n};\n\ntype LaunchableAppsResponse = {\n readonly _c: Record<string, string>;\n};\n\ntype UserAccountsResponse = {\n readonly _c: Record<string, string>;\n};\n",
7
+ "import { randomInt } from 'node:crypto';\nimport { OPack, Plist, reporter, waitFor } from '@basmilius/apple-common';\nimport { HidCommand, type HidCommandKey, MediaControlCommand, type MediaControlCommandKey } from './const';\nimport { FrameType, MessageType } from './messages';\nimport type { AttentionState, ButtonPressType, LaunchableApp, UserAccount } from './types';\nimport { convertAttentionState } from './utils';\nimport type Protocol from './protocol';\nimport type Socket from './socket';\n\nexport default class CompanionLinkApi {\n get socket(): Socket {\n return this.#protocol.socket;\n }\n\n readonly #protocol: Protocol;\n\n constructor(protocol: Protocol) {\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 return convertAttentionState(_c.state);\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 Plist.parse(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: HidCommandKey, 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: MediaControlCommandKey, 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: HidCommandKey, type: ButtonPressType = 'SingleTap', holdDelayMs = 500): Promise<void> {\n switch (type) {\n case 'DoubleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n\n case 'Hold':\n await this.hidCommand(command, true);\n await waitFor(holdDelayMs);\n await this.hidCommand(command, false);\n break;\n\n case 'SingleTap':\n await this.hidCommand(command, true);\n await this.hidCommand(command, false);\n break;\n }\n }\n\n async switchUserAccount(accountId: string): Promise<void> {\n await this.socket.exchange(FrameType.E_OPACK, {\n _i: 'SwitchUserAccountEvent',\n _t: MessageType.Request,\n _c: {\n SwitchAccountID: accountId\n }\n });\n }\n\n async _subscribe(event: string, fn: (data: unknown) => void): Promise<void> {\n this.socket.on(event, fn);\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _regEvents: [event]\n }\n });\n }\n\n async _unsubscribe(event: string, fn?: (data: unknown) => void): Promise<void> {\n if (fn) {\n this.socket.off(event, fn);\n }\n\n await this.socket.send(FrameType.E_OPACK, {\n _i: '_interest',\n _t: MessageType.Event,\n _c: {\n _deregEvents: [event]\n }\n });\n }\n\n async _sessionStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_sessionStart',\n _t: MessageType.Request,\n _c: {\n _srvT: 'com.apple.tvremoteservices',\n _sid: randomInt(0, 2 ** 32 - 1)\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _systemInfo(pairingId: Buffer): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_systemInfo',\n _t: MessageType.Request,\n _c: {\n _bf: 0,\n _cf: 512,\n _clFl: 128,\n _i: 'cafecafecafe',\n _idsID: pairingId.toString(),\n _pubID: 'FF:70:79:61:74:76',\n _sf: 256,\n _sv: '170.18',\n model: 'iPhone10,6',\n name: 'Bas Companion Link'\n }\n });\n\n return objectOrFail(payload);\n }\n\n async _touchStart(): Promise<object> {\n const [, payload] = await this.socket.exchange(FrameType.E_OPACK, {\n _i: '_touchStart',\n _t: MessageType.Request,\n _c: {\n _height: OPack.float(1000.0),\n _tFl: 0,\n _width: OPack.float(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\nfunction objectOrFail<T = object>(obj: unknown): T {\n if (typeof obj === 'object') {\n return obj as T;\n }\n\n reporter.error('Expected an object.', {obj});\n\n throw new Error('Expected an object.');\n}\n\ntype AttentionStateResponse = {\n readonly _c: {\n readonly state: number;\n };\n};\n\ntype LaunchableAppsResponse = {\n readonly _c: Record<string, string>;\n};\n\ntype UserAccountsResponse = {\n readonly _c: Record<string, string>;\n};\n",
8
8
  "export 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\nexport const PairFrameTypes: number[] = [\n FrameType.PS_Start,\n FrameType.PS_Next,\n FrameType.PV_Start,\n FrameType.PV_Next\n];\n",
9
9
  "import { type AccessoryCredentials, type AccessoryKeys, AccessoryPair } from '@basmilius/apple-common';\nimport { FrameType } from './messages';\nimport type Socket from './socket';\nimport type Protocol from './protocol';\n\nexport default class CompanionLinkPairing {\n get internal(): AccessoryPair {\n return this.#internal;\n }\n\n get socket(): Socket {\n return this.#protocol.socket;\n }\n\n readonly #internal: AccessoryPair;\n readonly #protocol: Protocol;\n\n constructor(protocol: Protocol) {\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",
10
- "import { randomInt } from 'node:crypto';\nimport { Socket } from 'node:net';\nimport { BaseSocket, decodeOPack, decryptChacha20, encodeOPack, encryptChacha20, opackSizedInt, reporter } from '@basmilius/apple-common';\nimport { OPackFrameTypes, PairFrameTypes } from './messages';\n\nconst HEADER_BYTES = 4;\n\nexport default class CompanionLinkSocket extends BaseSocket<Record<string, [unknown]>> {\n get isConnected(): boolean {\n return this.#socket.readyState === 'open';\n }\n\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 reporter.net(`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 reporter.raw('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 await super.onClose();\n reporter.net(`Connection closed from ${this.address}:${this.port}`);\n }\n\n async onConnect(): Promise<void> {\n await super.onConnect();\n reporter.net(`Connected to ${this.address}:${this.port}`);\n }\n\n async onData(buffer: Buffer): Promise<void> {\n // reporter.raw('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 reporter.warn(`Not enough data yet, waiting on the next frame.. needed=${totalLength} available=${this.#buffer.byteLength} receivedLength=${buffer.byteLength}`);\n return;\n }\n\n reporter.raw(`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 reporter.raw(`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 reporter.net('Connection ended');\n }\n\n async onError(err: Error): Promise<void> {\n await super.onError(err);\n reporter.error('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 reporter.warn('Packet not handled, no opack frame.');\n return;\n }\n\n [payload] = decodeOPack(payload);\n\n reporter.raw('Decoded OPACK', {header, payload});\n\n if ('_x' in payload) {\n const _x = (payload as any)._x;\n\n if (_x in this.#queue) {\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else if ('_i' in payload) {\n this.emit(payload['_i'] as string, payload['_c']);\n } else {\n // probably an event\n const content = payload['_c'];\n const keys = Object.keys(content).map(k => k.substring(0, -3));\n\n for (const key of keys) {\n this.emit(key, content[key]);\n }\n }\n } else if (this.#queue[-1]) {\n const _x = -1;\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n reporter.warn('No handler for message', [header, payload]);\n }\n }\n}\n",
10
+ "import { randomInt } from 'node:crypto';\nimport { Socket } from 'node:net';\nimport { BaseSocket, Chacha20, OPack, reporter } from '@basmilius/apple-common';\nimport { OPackFrameTypes, PairFrameTypes } from './messages';\n\nconst HEADER_BYTES = 4;\n\nexport default class CompanionLinkSocket extends BaseSocket<Record<string, [unknown]>> {\n get isConnected(): boolean {\n return this.#socket.readyState === 'open';\n }\n\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 reporter.net(`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 ??= OPack.sizedInt(_x, 8);\n\n let payload = Buffer.from(OPack.encode(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 = Chacha20.encrypt(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 reporter.raw('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 await super.onClose();\n reporter.net(`Connection closed from ${this.address}:${this.port}`);\n }\n\n async onConnect(): Promise<void> {\n await super.onConnect();\n reporter.net(`Connected to ${this.address}:${this.port}`);\n }\n\n async onData(buffer: Buffer): Promise<void> {\n // reporter.raw('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 reporter.warn(`Not enough data yet, waiting on the next frame.. needed=${totalLength} available=${this.#buffer.byteLength} receivedLength=${buffer.byteLength}`);\n return;\n }\n\n reporter.raw(`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 reporter.raw(`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 reporter.net('Connection ended');\n }\n\n async onError(err: Error): Promise<void> {\n await super.onError(err);\n reporter.error('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 = Chacha20.decrypt(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 reporter.warn('Packet not handled, no opack frame.');\n return;\n }\n\n payload = OPack.decode(payload);\n\n reporter.raw('Decoded OPACK', {header, payload});\n\n if ('_x' in payload) {\n const _x = (payload as any)._x;\n\n if (_x in this.#queue) {\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else if ('_i' in payload) {\n this.emit(payload['_i'] as string, payload['_c']);\n } else {\n // probably an event\n const content = payload['_c'];\n const keys = Object.keys(content).map(k => k.substring(0, -3));\n\n for (const key of keys) {\n this.emit(key, content[key]);\n }\n }\n } else if (this.#queue[-1]) {\n const _x = -1;\n const resolve = this.#queue[_x] ?? null;\n resolve?.([header, payload]);\n\n delete this.#queue[_x];\n } else {\n reporter.warn('No handler for message', [header, payload]);\n }\n }\n}\n",
11
11
  "import { type AccessoryCredentials, type AccessoryKeys, AccessoryVerify, hkdf } from '@basmilius/apple-common';\nimport { FrameType } from './messages';\nimport type Protocol from './protocol';\nimport type Socket from './socket';\n\nexport default class CompanionLinkVerify {\n get socket(): Socket {\n return this.#protocol.socket;\n }\n\n readonly #internal: AccessoryVerify;\n readonly #protocol: Protocol;\n\n constructor(protocol: Protocol) {\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",
12
12
  "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"
13
13
  ],
14
- "mappings": "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",
15
- "debugId": "833289E21DFDB55564756E2164756E21",
14
+ "mappings": "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",
15
+ "debugId": "E00B066B0AF3EB3A64756E2164756E21",
16
16
  "names": []
17
17
  }
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.73",
4
+ "version": "0.0.75",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -40,7 +40,7 @@
40
40
  }
41
41
  },
42
42
  "dependencies": {
43
- "@basmilius/apple-common": "0.0.73"
43
+ "@basmilius/apple-common": "0.0.75"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@basmilius/tools": "^2.23.0",