const e=require("autobee"),t=require("hypercore"),n=require("deterministic-sealed-box"),r=require("keet-identity-key"),i=require("hypercore-crypto"),{contract:{hyperschema:{encode:o,decode:c},hyperdispatch:{encode:a}}}=require("../../../schema/spec"),{KeetContractError:s}=require("./../contract/errors"),u=require("@holepunchto/keet-registry"),[y,d,p,f,v,l,m,K,h]=i.namespace("@holepunchto/keet-core/invitations",9);function b(e,t,n){const c=o("@keet-private-id/contact-request-body",n),a=r.attestData(c,t.deviceKeyPair,t.deviceProof),s={memberKey:t.publicKey,proof:a},u=k(c,e),y=r.attestData(u,t.deviceKeyPair,t.deviceProof),d=o("@keet-private-id/contact-request",{body:n,attestation:s,recipientProof:y});return i.encrypt(d,e)}function k(e,t){return i.hash([h,e,t])}function q(t,{heads:n}={}){const r=a("@keet/add-device",{header:{timestamp:Date.now()},blindRequest:t});return e.encodeValue(r,{optimistic:!0,encrypted:!0,links:n})}function P(e,{device:t,member:n}){const r=o("@keet/device-request",{withMemberProof:{device:t,member:n}});return{blindRequest:i.encrypt(r,e)}}function g(e,t,n,r,{device:c,member:a},s){const u=R(r),y=u.publicKey,p={deviceKey:e,identity:s?.identity,keyPair:n,device:c,member:a,link:s?.link},f=o("@keet/device-request-with-invitation",p),v=i.sign(i.hash([d,f]),u.secretKey),l=o("@keet/device-request",{withInvitation:{id:y,request:p,signature:v}});return{blindRequest:i.encrypt(l,t)}}function R(e){return i.keyPair(i.hash([y,e]))}function w(e){return{version:2,signers:[{publicKey:e,namespace:K}]}}function I(e,t){return i.encryptionKeyPair(i.hash([f,e,t]))}function D(e){return i.keyPair(e)}function x(e){return i.discoveryKey(e)}function C(e){return i.discoveryKey(e)}module.exports={generateIdentityPairingName:function(e){return i.hash([l,e])},generateRoomPairingName:function(e){return i.hash([m,e])},generateSwarmTopic:C,generateWakeupTopic:x,generateMailboxKeyPair:I,generateDiscoveryKeyPair:D,generateRoomCapabilities:function(e,t){const n=I(e,t),r=D(n.publicKey),i=x(n.publicKey);return{mailboxKeyPair:n,discoveryKeyPair:r,swarmTopic:C(r.publicKey),wakeupTopic:i}},generatePairingCapabilities:function(e){const t=D(e),n=x(e);return{discoveryKeyPair:t,swarmTopic:C(t.publicKey),wakeupTopic:n}},getWakeup:function(e){return{key:e,discoveryKey:i.discoveryKey(e)}},getWriterKey:function(e){return t.key({version:2,signers:[{publicKey:e}]})},getResponseCoreManifest:w,getResponseCoreKey:function(e){return t.key(w(e))},getInvitationId:function(e){return R(e).publicKey},createInvitation:function(e,t={}){const{canModerate:n=!1,canAdmin:r=!1,expiration:c=0}=t,a=i.randomBytes(32),s=R(a),u=s.publicKey,y=o("@keet/room-keys",e);return{invitation:{id:u,metadata:{canModerate:n,canAdmin:r,expiration:c},anchor:null,response:{id:u,data:y,signature:i.sign(i.hash([p,y]),s.secretKey)}},seed:a}},createDeviceResponse:function(e,t,r){const c=o("@keet/device-response",{signedKeys:r.response}),a=i.hash([v,t]);return{blindResponse:n.encrypt(c,e,a)}},decryptDeviceRequest:function(e,t){const r=n.decrypt(t,e);return r?c("@keet/device-request",r):null},decryptContactRequest:function(e,t){const n=i.decrypt(t,e);return n?c("@keet-private-id/contact-request",n):null},verifyAttestation:function(e,t,n){let i=null;try{i=r.verify(e.proof,t,{expectedIdentity:e.memberKey})}catch{throw s.ABORT()}if(!i)throw s.ABORT();return i.receipt},verifyDeviceResponse:function(e,t){const n=i.decrypt(t,e);if(!n)return null;const r=c("@keet/device-response",n),{signedKeys:{id:o,data:a,signature:s},identity:u}=r;return i.verify(i.hash([p,a]),s,o)?{id:o,response:{roomKeys:c("@keet/room-keys",a),identity:u}}:null},verifyIdentityProofs:function(e,t){const n=t?.deviceProof,i=t?.privateProfileIdentity,o=e.writerKey,c=e.publicKey,a=e.devicePublicKey;if(!n||!i)return null;if(!i.memberKey||!i.proof)return null;const s=r.verify(n,null,{expectedIdentity:c,expectedDevice:a}),u=r.verify(i.proof,o,{expectedIdentity:c});return s&&u},verifyInvitationDeviceRequest:function({id:e,request:t,signature:n}){const r=o("@keet/device-request-with-invitation",t);return i.verify(i.hash([d,r]),n,e)?{id:e,request:t}:null},createMailboxKeyPair:function(){return i.encryptionKeyPair()},createDiscoveryKeyPair:function(){return i.keyPair()},createInvitationJoinRequest:g,createInvitationJoinOperation:function(e,t,n,r,i,o){const{blindRequest:c}=g(e,t,n,r,i,o);return q(c,o)},createMemberProofJoinRequest:P,createMemberProofJoinOperation:function(e,t,n){const{blindRequest:r}=P(e,t);return q(r,n)},createBlindContactRequest:b,contactRecipientPayload:k,createContactRequestOperation:function(t,n,r){const i=b(t,n,r),o=a("@keet-private-id/add-contact-request",{header:{timestamp:Date.now()},blindRequest:i});return e.encodeValue(o,{optimistic:!0,encrypted:!0})},createUsernameReservationRequest:function(e,{publicKey:t,deviceKeyPair:n,deviceProof:i}){const o=u.encodeReservation({username:e});return{username:e,attestation:{memberKey:t,proof:r.attestData(o,n,i)}}}};