OverviewFilesCommitsIssuesDocsReleasesPeers

holepunchto-deps / @holepunchto / keet-core / lib / api / v1 / encode.js

1 lines · javascript ref:
const e=require("hypercore-id-encoding"),{getCapabilitiesForRole:t,MemberRoles:n,DISPLAY_TYPES:a,GENERIC_EVENTS:s}=require("@holepunchto/keet-core-api"),r=require("b4a"),i=require("z32"),o=require("../../core/call/ghost.js"),{contract:{hyperschema:{encode:l,getEnum:d}}}=require("../../../schema/spec"),c=d("@keet/room-type"),m=d("@keet/label-type");function u({key:t,seq:n}){return{deviceId:e.encode(t),seq:n}}function p(t){if(!t)return null;const{key:n,blob:a}=t;return{id:e.encode(n),blob:a}}function y(t){if(!t)return null;const{key:n,path:a,version:s,size:r}=t;return{id:e.encode(n),path:a,version:s,size:r}}function f(e){if(!e)return null;const{inlined:t,blob:n,externalBlob:a,externalDrive:s,bee:i}=e;return{blob:n,bee:i?{hash:r.toString(i.hash,"base64")}:null,inlined:t?r.toString(t,"base64"):null,externalBlob:p(a),externalDrive:y(s)}}function g(e){return e?(e.metadata?.userdata&&(e.metadata.userdata=r.toString(e.metadata.userdata,"base64")),{hash:e.hash,entry:e.entry,metadata:e.metadata,pointer:f(e.pointer),preview:b(e.preview)}):null}function b(e){return e?{small:g(e.small),medium:g(e.medium),large:g(e.large)}:null}function v(t){if(!t?.memberKey)return t;const{memberKey:n,...a}=t;return{...a,memberId:e.encode(n)}}function I({record:t,labels:n,member:r,memberId:i,localRoom:o}){const{event:l,message:d,reactions:c={}}=t,m=function(e){return e?{...e,memberJoined:v(e.memberJoined),memberLeft:v(e.memberLeft),memberRemoved:v(e.memberRemoved)}:null}(l),p=function(e){if(e)return e.memberJoined?{type:s.MEMBER_JOINED,value:e.memberJoined.memberId}:e.memberLeft?{type:s.MEMBER_LEFT,value:e.memberLeft.memberId}:e.titleChanged?{type:s.ROOM_TITLE_CHANGED,value:e.titleChanged}:e.callStarted?{type:s.CALL_STARTED,value:null}:e.callHangup?{type:s.CALL_HANGUP,value:null}:e.callMissed?{type:s.CALL_MISSED,value:null}:void 0}(m),y=function(t){if(!t?.message?.display)return[];let n=[];var s,r;return t.message.display.mention&&(t.message.display.mention=(s=t.message.display.mention,Array.isArray(s)?s.map(t=>({type:a.MENTION,start:t.range.start,length:t.range.length,memberId:e.encode(t.memberKey)})):[]),n=n.concat(t.message.display.mention)),t.message.display.translation&&(t.message.display.translation=(r=t.message.display.translation,Array.isArray(r)?r.map(e=>({type:a.TRANSLATION,start:e.range.start,length:e.range.length,language:e.language,text:e.text})):[]),n=n.concat(t.message.display.translation)),t.message.display.httpLink&&(t.message.display.httpLink=t.message.display.httpLink.map(N),n=n.concat(t.message.display.httpLink)),t.message.display.pearLink&&(t.message.display.pearLink=t.message.display.pearLink.map(C),n=n.concat(t.message.display.pearLink)),t.message.display.bold&&(t.message.display.bold=t.message.display.bold.map(e=>({...e,type:a.BOLD})),n=n.concat(t.message.display.bold)),t.message.display.italic&&(t.message.display.italic=t.message.display.italic.map(e=>({...e,type:a.ITALIC})),n=n.concat(t.message.display.italic)),t.message.display.code&&(t.message.display.code=t.message.display.code.map(e=>({...e,type:a.CODE})),n=n.concat(t.message.display.code)),t.message.display.emoji&&(t.message.display.emoji=t.message.display.emoji.map(e=>({...e.range,content:e.content,type:a.EMOJI})),n=n.concat(t.message.display.emoji)),t.message.display.codeBlock&&(t.message.display.codeBlock=t.message.display.codeBlock.map(e=>({...e,type:a.CODE_BLOCK})),n=n.concat(t.message.display.codeBlock)),t.message.display.strike&&(t.message.display.strike=t.message.display.strike.map(e=>({...e,type:a.STRIKE_THROUGH})),n=n.concat(t.message.display.strike)),n}(t);return d?.replyTo&&(d.replyTo=u(d.replyTo)),d?.files&&(d.files=d.files.map(g)),{timestamp:t.timestamp,editedAt:t.editedAt,memberId:i||e.encode(r?.key||t.oplog.key),member:r?K(r,o?.selfMember?.key):null,id:u(t.oplog),deleted:t.status.isDeleted,thread:t.id.thread,clock:t.id.index,message:{...d,generic:m},reactions:c,labels:h(n),read:t.read,seq:t.id.index,event:p,replyTo:d&&d.replyTo?d.replyTo:null,forwarded:!0===d?.forwarded,chat:{text:d?d.text:null,edited:t.status.isEdited,display:y,mentions:y.filter(e=>e.type===a.MENTION)},files:d&&d.files?d.files:[],file:d&&d.files?d.files[0]:null}}function h(e){return e?{flags:e.digest?.labels?.find(e=>e.label===m.Flag)?.count??0,flagsClock:e.digest?.flagsClock??0,editedAt:e.digest?.editedAt??0,flagged:!!e.mine?.find(e=>e.label===m.Flag)}:{flags:0,flagsClock:0,editedAt:0,flagged:!1}}function k(t){return t?{callId:e.encode(t.callKey),selfDeviceId:t.selfDeviceKey?e.encode(t.selfDeviceKey):null,createdAt:t.createdAt||0}:null}function A(e){return e?r.toString(l("@keet/member-contact-info",e),"base64"):null}function K(t,n,a=!1){if(!t)return null;const s=t.proofs?{profile:t.profile,attestation:{memberKey:t.proofs.key,proof:t.proofs.profileAttestation}}:null;return{memberId:e.encode(t.key),anonymous:!1,name:t.profile.displayName?t.profile.displayName.toLowerCase():null,status:t.status,displayName:t.profile.displayName,contactInfo:A(s),inactive:!t.status.isActive,capabilities:S(t.status),avatar:b(t.profile.avatar),local:!!n&&r.equals(t.key,n),pushNotifications:!0,username:t.profile.username,canDM:!!t.profile.mailbox,isContact:a}}function M(t,n){return{id:{memberId:e.encode(t.memberKey),roomId:e.encode(t.keys.key)},roomId:e.encode(t.keys.key),senderContactInfo:{displayName:t.sender.displayName,avatar:t.sender.avatar?b(t.sender.avatar):null,memberId:e.encode(t.memberKey),isContact:!!n&&n.status.isActive&&!n.status.isBlocked},clock:t.clock,message:t.message,status:t.status,sentAt:t.sentAt}}function R(e){return{...e}}function T(t,n,a=[]){return t?{...t,avatar:b(t.avatar),roomType:w(n.settings.roomType),experimental:n.settings.isExperimental,locked:n.settings.isJoiningDisabled,frozen:n.settings.isAppendingDisabled,isMembershipEventsDisabled:n.settings.isMembershipEventsDisabled,pinnedMessages:a,canCall:String(!n.settings.isCallingDisabled),blindPeers:(s=t.blindPeers,s?s.map(e.encode):null)}:{};var s}function D(t){return{callId:e.encode(t.callKey),memberId:e.encode(t.memberKey),createdAt:t.createdAt,devices:t.devices?t.devices.map(E):[]}}function E(t){return{callId:e.encode(t.callKey),memberId:e.encode(t.memberKey),deviceId:e.encode(t.deviceKey),swarmId:e.encode(t.swarmKey),createdAt:t.createdAt,lastHeartbeatAt:t.lastHeartbeatAt,isRecording:t.isRecording,streams:t.streams?t.streams.map(L):[]}}function L(t){return{callId:e.encode(t.callKey),streamId:e.encode(t.streamKey),deviceId:e.encode(t.deviceKey),createdAt:t.createdAt,mediaStreamId:t.mediaStreamId,type:t.type,muted:t.muted}}function C(e){return{...N(e),type:a.PEAR_LINK}}function N(e){return e?.preview?.file&&(e.preview.file=g(e.preview.file)),{content:e.url,start:e.range.start,length:e.range.length,type:a.HTTP_LINK,preview:e.preview}}function S(e){const a=e.isAdmin?n.ADMIN:e.isModerator?n.MODERATOR:n.PEER;return t(a)}function w(e){switch(e){case c.Default:return"0";case c.Broadcast:return"1";case c.DirectMessage:return"2";default:throw new Error("Incompatible legacy room type:",e)}}function x(e){switch(e){case"0":default:return c.Default;case"1":return c.Broadcast;case"2":return c.DirectMessage}}module.exports={encodeReaction:function(t){return{sender:e.encode(t.sender),clock:t.clock,reaction:t.reaction}},encodeIdentityPairingRequest:function(t){if(!t)return null;const n=t.request,a=n.deviceKey,s=n.device.profile.name,r=n.identity.devicePublicKey;return{deviceName:s,deviceId:e.encode(a),identityDeviceId:e.encode(r)}},encodePrivateRoomRecord:function(t){return{roomId:e.encode(t.roomKey),discoveryId:e.encode(t.discoveryKey),dmMemberId:t.dm?e.encode(t.dm):null,recipient:t.dm?e.encode(t.dm):null}},encodeDmRequest:M,encodeRoomRecord:function({roomInfo:t,preferences:n,lastMessageMember:a,storageInfo:s,fileStats:r}){const i=t.dm?.length?e.encode(t.dm[0]):null;let o=null;return t.lastMessage&&(o={chat:I({record:t.lastMessage,labels:t.lastMessageLabels,memberId:a?.memberId}),member:a}),{roomId:e.encode(t.roomKey),discoveryId:e.encode(t.discoveryKey),status:t.status,stats:t.stats,fork:t.fork,self:{sentLength:s?s.hints.remoteContiguousLength:0,deviceId:t.selfDevice?e.encode(t.selfDevice.key):null,member:t.selfMember?K(t.selfMember,t.selfMember.key):null},digest:R(t.digest),config:T(t.config,t.digest),preferences:n,lastMessage:o,dmMemberId:i,fileStats:r?{total:r.total}:null,activeCall:k(t.activeCall)}},encodePublicRoom:function(t,n){return t?{id:e.encode(t.roomKey),title:t.title??null,avatar:b(t.avatar),invitation:t.invitation?i.encode(t.invitation):null,verified:t.verified??!1,joined:n}:null},encodeMemberRecord:K,encodeInvitationRecord:function(t){const n=e.encode(t.id);return{id:n,seedId:e.encode(t.invitationSeed),discoveryId:n,identityDeviceId:t.identity?e.encode(t.identity.devicePublicKey):null,expires:-1}},encodeChatMessage:I,encodeImageFile:b,encodeFile:g,encodeFileEntry:function t(n){return n?n.cleared?{cleared:!0}:{roomId:e.encode(n.roomKey),httpLink:n.httpLink,cleared:!1,preview:n.preview?{small:t(n.preview.small),medium:t(n.preview.medium),large:t(n.preview.large)}:null}:null},encodeReactionsDigest:function(e){return e?{total:e.total,reactions:e.reactions.map(e=>({text:e.text,count:e.count,latest:[]})),editedAt:e.editedAt}:{total:0,reactions:[]}},encodeMyReactions:function(e){return e.map(e=>e.reaction)},encodeDigest:R,encodeConfig:T,encodeUserSettings:function(e){return{disableReadReceipts:e?.disableReadReceipts||!1,stripAttachmentMetadata:e?.stripAttachmentMetadata||!1,profileSnoozeTime:e?.profileSnoozeTime}},encodeMessageId:u,encodeDevice:function(t){return{id:e.encode(t.key),deviceId:e.encode(t.key),swarmId:e.encode(t.profile.swarmKey),isMobile:t.profile.isMobile,name:t.profile.name,status:t.status}},encodeUser:function(t){if(!t)return null;let n=null;return t.contactInfo&&(n=r.toString(t.contactInfo,"base64")),{memberId:e.encode(t.attestation.memberKey),displayName:t.profile.displayName,username:t.profile.username,avatar:b(t.profile.avatar),count:t.count,contactInfo:n}},encodeContactInfo:function(t,n,a,s){let r=null;return a&&(r={id:e.encode(a.roomKey),status:{isAccepted:!!a&&0===a.stats.members.pending,isWritable:!!a&&a.status.isWritable}}),{memberId:t,activeRoom:r,pendingRequest:s?M(s,n):null,contactStatus:{isBlocked:!!n?.status?.isBlocked,isActive:!!n?.status?.isActive}}},encodeContact:function(t,n){if(!t)return null;const a=n?.profile??t.contactInfo?.profile??null;return{memberId:e.encode(t.memberKey),displayName:a?.displayName,alias:t.alias,username:a?.username,avatar:b(a?.avatar),contactInfo:A(t.contactInfo)}},encodeReservation:function(t){return t?{username:t.username,memberId:t.memberKey?e.encode(t.memberKey):null}:null},encodeErrorRecord:function(t){return{code:t.code,message:t.message,stack:t.stack,timestamp:t.timestamp,isContractError:!0===t.isContractError,isKeetError:!0===t.isKeetError,roomId:t.roomKey?e.encode(t.roomKey):null,details:(n=t.details,n?{roomId:n.roomKey?e.encode(n.roomKey):null,coreId:n.coreKey?e.encode(n.coreKey):null}:{})};var n},encodeNotification:function(e,t,n){const a=n?.displayName||"";return{id:e.messageId,roomId:e.roomId,avatar:e.avatar??"",sender:{name:a},config:{title:t.title,roomType:t.roomType},message:{type:e.messageType,chatText:e.messageText,fileType:e.fileType,location:e.location},userInfo:{roomKey:e.roomId,messageType:e.messageType,isDmRoom:x(t.roomType)===c.DirectMessage,isBroadcast:x(t.roomType)===c.Broadcast,profileName:a}}},encodeHyperDHTSettings:function(e){return{concurrency:e.concurrency,maxWindow:e.maxWindow,randomPunchInterval:e.randomPunchInterval,connectionKeepAlive:e.connectionKeepAlive}},encodeSwarmSettings:function(e){return{maxPeers:e.maxPeers}},encodeCallRecord:function(t,n={}){if(!t)return null;const a=n.deviceKey||null,s=n.ghostThreshold,r=Date.now(),i=[],l=[];for(const n of t.members??[]){const t=D(n),d=[];for(const n of t.devices)n.isSelf=!!a&&e.encode(a)===n.deviceId,o(r,n,s)&&(l.push(n),d.push(n));d.length&&(t.devices=d,i.push(t))}const d=1===t.version;return{version:t.version,callId:e.encode(t.callKey),discoveryId:d?e.encode(t.discoveryKey):null,createdAt:t.createdAt,endedAt:t.endedAt,members:i,activeDevices:l}},encodeLocalActiveCall:k};