OverviewFilesCommitsIssuesDocsReleasesPeers

holepunchto-deps / @holepunchto / keet-core / lib / core / contract / internal.js

1 lines · javascript ref:
const e=require("b4a"),t=require("./registration"),{KeetContractError:i}=require("./errors"),{isMemberActive:s,getMemberForDeviceKey:a}=require("./query"),{trackActivity:r}=require("./hooks"),{addDevice:n,addMember:o}=require("./members"),d=require("./roles"),{contract:{hyperschema:{getEnum:c}}}=require("../../../schema/spec"),m=c("@keet/room-type"),u=c("@keet/build-type"),l=["roomType","isExperimental","isJoiningDisabled","isAppendingDisabled","isCallingDisabled","isMembershipEventsDisabled","isAttachmentsDisabled","isLinksDisabled","isRoomInviteHidden"];async function g({header:t,digest:s,config:r,capabilities:d,identity:c,bootstrapDevice:u,initialMembers:l},g){const{db:y,writer:w,hostcalls:b,dryRun:k}=g;if(!b.genesis&&!k)throw i.GENESIS_NOT_FIRST();await y.insert("@keet/threads",{id:0,count:0,parent:null,stats:{devices:{total:0,active:0},members:{total:0,active:0,pending:0},chat:{clock:0,pinned:0,threads:0,timestamp:0},files:{clock:0},calls:{streams:0}}});const p=s.settings.roomType===m.DirectMessage;if(s.settings.roomType===m.Broadcast&&(s.settings.isCallingDisabled=!0),await y.insert("@keet/system-digest",s),d&&await y.insert("@keet/room-capabilities",d),c&&await y.insert("@keet-private-id/identity",c),r&&await y.insert("@keet/room-config",r),l)for(const i of l){const s=e.equals(i.attestation.memberKey,u.attestation.memberKey)||p?{isAdmin:!0,isModerator:!0}:{isAdmin:!1,isModerator:!0};await o(t,i.profile,i.attestation,s,g)}await n(t,w.key,u.profile,u.attestation,{isActive:!0,isIndexing:!0,isGenesis:!0},g);const f=await a(y,w.key);if(!u||!f)throw i.ABORT()}async function y({version:e},{db:t,writer:r,abi:n,hostcalls:o}){const[d,c]=await Promise.all([a(t,r.key),t.get("@keet/system-digest")]);if(9!==e||s(d)&&d.status.isModerator){if(!s(d)||!d.status.isModerator)throw i.ABORT();c.abi.version>=e||(e>(c.settings.isExperimental?n.max:n.production)&&o.interrupt({unsupportedABI:e,digest:c}),c.abi.version,c.abi.version=e,await Promise.resolve(),await t.insert("@keet/system-digest",c))}}async function w({key:e,settings:t},{db:r,writer:n}){const[o,d]=await Promise.all([a(r,n.key),r.get("@keet/system-digest")]);if(!s(o))throw i.INACTIVE_MEMBER();if(!o.status.isModerator)throw i.MODERATORS_ONLY();if(0===e||e>l.length)throw i.INVALID_SYSTEM_SETTING();const c=d?.settings,m=l[e-1],u={...c,[m]:t[m]};await r.insert("@keet/system-digest",{...d,settings:u})}async function b({header:e,head:t,legacyViewHead:i,dbViewHead:r,blobsViewHead:n},{db:o,writer:d}){const[c,m]=await Promise.all([a(o,d.key),o.get("@keet/autobee-migration")]);if(s(c)&&c.status.isAdmin)return m||await o.insert("@keet/autobee-migration",{autobeeMigrationHead:t,legacyViewHead:i,dbViewHead:r,blobsViewHead:n,createdAt:e.timestamp}),{writer:d,writerMember:c}}async function k({peer:e},{db:t,writer:i}){const r=await a(t,i.key);s(r)&&r.status.isModerator&&await t.insert("@keet/blind-peers",e)}async function p({key:e},{db:t,writer:i}){const r=await a(t,i.key);s(r)&&r.status.isModerator&&await t.delete("@keet/blind-peers",{key:e})}async function f({from:e,to:t,buildType:i},{db:r,writer:n,hostcalls:o}){const c=await a(r,n.key);s(c)&&c.status.isModerator&&(e<14&&t>=14&&(await async function(e){if(!await e.get("@keet-private-id/identity"))return;const t=[];for(const{memberKey:i,roomKey:s}of await e.find("@keet-private-id/contacts").toArray()){if(!s||!i)continue;const a=await e.get("@keet-private-id/rooms",{roomKey:s});a&&(a.contact=i,t.push(e.insert("@keet-private-id/rooms",a)))}await Promise.all(t)}(r),await async function(e){if(!await e.get("@keet-private-id/identity"))return;const t={isPending:!1,isAccepted:!1,isRejected:!1,isDiscarded:!1,isSeen:!1},i=[];for(const s of await e.find("@keet-private-id/contact-requests").toArray()){const{isSeen:a,isAccepted:r,isRejected:n,isDiscarded:o}=s.status;s.status.isAccepted&&(s.status={...t,isAccepted:r,isSeen:a}),s.status.isRejected&&(s.status={...t,isRejected:n,isSeen:a}),s.status.isDiscarded&&(s.status={...t,isDiscarded:o,isSeen:a}),i.push(e.insert("@keet-private-id/contact-requests-v2",s))}await Promise.all(i)}(r)),e<20&&t>=20&&await async function(e){const[t,i,s]=await Promise.all([e.get("@keet-private-id/identity"),e.get("@keet/threads",{id:0}),e.find("@keet/pinned-chat-messages").toArray()]);!t&&i&&(i.stats.chat.pinned=s.length,await e.insert("@keet/threads",i))}(r),e<24&&t>=24&&await async function(e){if((await e.get("@keet/system-digest")).settings.roomType===m.DirectMessage)for await(const t of e.find("@keet/members"))t.status.isModerator||(t.status.isModerator=!0,await e.insert("@keet/members",t))}(r),e<25&&t>=25&&await async function(e,t){const i=await e.get("@keet/system-digest");u[i.settings.buildType]||u[t]&&(i.settings.buildType=u[t],await e.insert("@keet/system-digest",i))}(r,i),e<37&&t>=37&&await async function(e,t,i){if((await e.get("@keet/system-digest")).settings.roomType!==m.DirectMessage)return;for await(const t of e.find("@keet/members"))t.status.isAdmin&&t.status.isModerator||(t.status.isAdmin=!0,t.status.isModerator=!0,await e.insert("@keet/members",t));const s=await e.get("@keet/devices",{key:t.key});s&&s.status.isActive&&!s.status.isIndexing&&(s.status.isIndexing=!0,await e.insert("@keet/devices",s),await i.addWriter(t.key,d.ADMIN))}(r,n,o))}module.exports={[t]:function(e){e.add("@keet/genesis",g),e.add("@keet/upgrade",y),e.add("@keet/add-blind-peer",k),e.add("@keet/remove-blind-peer",p),e.add("@keet/autobee-migration",r(b)),e.add("@keet/update-system-settings",w),e.add("@keet/migrate-abi",f)},Settings:{RoomType:1,IsExperimental:2,IsJoiningDisabled:3,IsAppendingDisabled:4,IsCallingDisabled:5,IsMembershipEventsDisabled:6,IsAttachmentsDisabled:7,IsLinksDisabled:8,IsRoomInviteHidden:9}};