@xmtp/browser-sdk 0.0.20 → 0.0.21

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 CHANGED
@@ -1073,16 +1073,17 @@ type SignMessage = (message: string) => Promise<Uint8Array> | Uint8Array;
1073
1073
  type GetAddress = () => Promise<string> | string;
1074
1074
  type GetChainId = () => bigint;
1075
1075
  type GetBlockNumber = () => bigint;
1076
- type WalletType = () => "EOA" | "SCW";
1077
1076
  type Signer = {
1077
+ walletType: "EOA";
1078
+ getAddress: GetAddress;
1079
+ signMessage: SignMessage;
1080
+ } | {
1081
+ walletType: "SCW";
1078
1082
  getAddress: GetAddress;
1079
1083
  signMessage: SignMessage;
1080
- walletType?: WalletType;
1081
1084
  getBlockNumber?: GetBlockNumber;
1082
- getChainId?: GetChainId;
1085
+ getChainId: GetChainId;
1083
1086
  };
1084
- type SmartContractSigner = Required<Signer>;
1085
- declare const isSmartContractSigner: (signer: Signer) => signer is SmartContractSigner;
1086
1087
 
1087
1088
  declare class Client extends ClientWorkerClass {
1088
1089
  #private;
@@ -1132,4 +1133,4 @@ declare class Utils extends UtilsWorkerClass {
1132
1133
  getInboxIdForAddress(address: string, env?: XmtpEnv): Promise<string | undefined>;
1133
1134
  }
1134
1135
 
1135
- export { ApiUrls, Client, type ClientEvents, type ClientEventsActions, type ClientEventsClientMessageData, type ClientEventsClientPostMessageData, type ClientEventsErrorData, type ClientEventsResult, type ClientEventsWorkerMessageData, type ClientEventsWorkerPostMessageData, type ClientOptions, type ClientSendMessageData, type ContentOptions, Conversation, Conversations, DecodedMessage, type EventsClientMessageData, type EventsClientPostMessageData, type EventsErrorData, type EventsResult, type EventsWorkerMessageData, type EventsWorkerPostMessageData, type GenericEvent, type GenericStreamEvent, HistorySyncUrls, type HmacKeys, type MessageDeliveryStatus, type MessageKind, type NetworkOptions, type OtherOptions, type SafeConsent, type SafeContentTypeId, type SafeConversation, type SafeCreateDmOptions, type SafeCreateGroupOptions, type SafeEncodedContent, type SafeGroupMember, type SafeHmacKey, type SafeHmacKeys, type SafeInboxState, type SafeInstallation, type SafeListConversationsOptions, type SafeListMessagesOptions, type SafeMessage, type SafeMessageDisappearingSettings, type SafePermissionPolicySet, type SendMessageData, type Signer, type SmartContractSigner, type StorageOptions, type StreamEventsClientMessageData, type StreamEventsClientPostMessageData, type StreamEventsErrorData, type StreamEventsResult, Utils, type UtilsEvents, type UtilsEventsActions, type UtilsEventsClientMessageData, type UtilsEventsClientPostMessageData, type UtilsEventsErrorData, type UtilsEventsResult, type UtilsEventsWorkerMessageData, type UtilsEventsWorkerPostMessageData, type UtilsSendMessageData, type XmtpEnv, fromContentTypeId, fromEncodedContent, fromSafeConsent, fromSafeContentTypeId, fromSafeCreateDmOptions, fromSafeCreateGroupOptions, fromSafeEncodedContent, fromSafeGroupMember, fromSafeListConversationsOptions, fromSafeListMessagesOptions, fromSafeMessageDisappearingSettings, fromSafePermissionPolicySet, isSmartContractSigner, toContentTypeId, toEncodedContent, toSafeConsent, toSafeContentTypeId, toSafeConversation, toSafeCreateDmOptions, toSafeCreateGroupOptions, toSafeEncodedContent, toSafeGroupMember, toSafeHmacKey, toSafeInboxState, toSafeInstallation, toSafeListConversationsOptions, toSafeListMessagesOptions, toSafeMessage, toSafeMessageDisappearingSettings, toSafePermissionPolicySet };
1136
+ export { ApiUrls, Client, type ClientEvents, type ClientEventsActions, type ClientEventsClientMessageData, type ClientEventsClientPostMessageData, type ClientEventsErrorData, type ClientEventsResult, type ClientEventsWorkerMessageData, type ClientEventsWorkerPostMessageData, type ClientOptions, type ClientSendMessageData, type ContentOptions, Conversation, Conversations, DecodedMessage, type EventsClientMessageData, type EventsClientPostMessageData, type EventsErrorData, type EventsResult, type EventsWorkerMessageData, type EventsWorkerPostMessageData, type GenericEvent, type GenericStreamEvent, HistorySyncUrls, type HmacKeys, type MessageDeliveryStatus, type MessageKind, type NetworkOptions, type OtherOptions, type SafeConsent, type SafeContentTypeId, type SafeConversation, type SafeCreateDmOptions, type SafeCreateGroupOptions, type SafeEncodedContent, type SafeGroupMember, type SafeHmacKey, type SafeHmacKeys, type SafeInboxState, type SafeInstallation, type SafeListConversationsOptions, type SafeListMessagesOptions, type SafeMessage, type SafeMessageDisappearingSettings, type SafePermissionPolicySet, type SendMessageData, type Signer, type StorageOptions, type StreamEventsClientMessageData, type StreamEventsClientPostMessageData, type StreamEventsErrorData, type StreamEventsResult, Utils, type UtilsEvents, type UtilsEventsActions, type UtilsEventsClientMessageData, type UtilsEventsClientPostMessageData, type UtilsEventsErrorData, type UtilsEventsResult, type UtilsEventsWorkerMessageData, type UtilsEventsWorkerPostMessageData, type UtilsSendMessageData, type XmtpEnv, fromContentTypeId, fromEncodedContent, fromSafeConsent, fromSafeContentTypeId, fromSafeCreateDmOptions, fromSafeCreateGroupOptions, fromSafeEncodedContent, fromSafeGroupMember, fromSafeListConversationsOptions, fromSafeListMessagesOptions, fromSafeMessageDisappearingSettings, fromSafePermissionPolicySet, toContentTypeId, toEncodedContent, toSafeConsent, toSafeContentTypeId, toSafeConversation, toSafeCreateDmOptions, toSafeCreateGroupOptions, toSafeEncodedContent, toSafeGroupMember, toSafeHmacKey, toSafeInboxState, toSafeInstallation, toSafeListConversationsOptions, toSafeListMessagesOptions, toSafeMessage, toSafeMessageDisappearingSettings, toSafePermissionPolicySet };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{GroupUpdatedCodec as e,ContentTypeGroupUpdated as t}from"@xmtp/content-type-group-updated";import{ContentTypeText as s,TextCodec as n}from"@xmtp/content-type-text";import{ContentTypeId as i,EncodedContent as r,ListMessagesOptions as a,ListConversationsOptions as o,PermissionPolicySet as d,CreateGroupOptions as c,GroupPermissionsOptions as l,CreateDMOptions as u,Consent as p,GroupMember as g,MessageDisappearingSettings as h,GroupMessageKind as m,DeliveryStatus as y,ConversationType as v,SignatureRequestType as w}from"@xmtp/wasm-bindings";export{Consent,ConsentEntityType,ConsentState,ContentTypeId,ConversationType,CreateGroupOptions,DeliveryStatus,EncodedContent,GroupMember,GroupMembershipState,GroupMessageKind,GroupMetadata,GroupPermissions,GroupPermissionsOptions,HmacKey,InboxState,Installation,ListConversationsOptions,ListMessagesOptions,Message,MetadataField,PermissionLevel,PermissionPolicy,PermissionPolicySet,PermissionUpdateType,SignatureRequestType,SortDirection}from"@xmtp/wasm-bindings";import{v4 as M}from"uuid";import{ContentTypeId as I}from"@xmtp/content-type-primitives";const b=e=>{console.error(`Worker error on line ${e.lineno} in "${e.filename}"`),console.error(e.message)};class S{#e;#t;#s=new Map;constructor(e,t){this.#e=e,this.#e.addEventListener("message",this.handleMessage),this.#e.addEventListener("error",b),this.#t=t}sendMessage(e,t){const s=M();this.#e.postMessage({action:e,id:s,data:t});return new Promise(((e,t)=>{this.#s.set(s,{resolve:e,reject:t})}))}handleMessage=e=>{const t=e.data;this.#t&&console.log("client received event data",t);const s=this.#s.get(t.id);s&&(this.#s.delete(t.id),"error"in t?s.reject(new Error(t.error)):s.resolve(t.result))};handleStreamMessage=(e,t)=>{const s=s=>{const n=s.data;n.streamId===e&&("error"in n?t(new Error(n.error),null):t(null,n.result))};return this.#e.addEventListener("message",s),()=>{this.#e.removeEventListener("message",s)}};close(){this.#e.removeEventListener("message",this.handleMessage),this.#e.removeEventListener("error",b),this.#e.terminate()}}class A{#n=!1;#i;#r;onReturn=void 0;constructor(){this.#r=[],this.#i=null,this.#n=!1}get isDone(){return this.#n}callback=(e,t)=>{if(e)throw e;this.#n||(this.#i?(this.#i({done:!1,value:t}),this.#i=null):this.#r.push(t))};next=()=>this.#r.length>0?Promise.resolve({done:!1,value:this.#r.shift()}):this.#n?Promise.resolve({done:!0,value:void 0}):new Promise((e=>{this.#i=e}));return=e=>(this.#n=!0,this.onReturn?.(),Promise.resolve({done:!0,value:e}));[Symbol.asyncIterator](){return this}}const x=e=>new I({authorityId:e.authorityId,typeId:e.typeId,versionMajor:e.versionMajor,versionMinor:e.versionMinor}),k=e=>new i(e.authorityId,e.typeId,e.versionMajor,e.versionMinor),P=e=>({authorityId:e.authorityId,typeId:e.typeId,versionMajor:e.versionMajor,versionMinor:e.versionMinor}),f=e=>new I({authorityId:e.authorityId,typeId:e.typeId,versionMajor:e.versionMajor,versionMinor:e.versionMinor}),G=e=>({type:x(e.type),parameters:Object.fromEntries(e.parameters),fallback:e.fallback,compression:e.compression,content:e.content}),D=e=>new r(k(e.type),new Map(Object.entries(e.parameters)),e.fallback,e.compression,e.content),N=e=>({type:P(e.type),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content}),T=e=>({type:f(e.type),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content}),C=e=>({content:N(G(e.content)),convoId:e.convoId,deliveryStatus:e.deliveryStatus,id:e.id,kind:e.kind,senderInboxId:e.senderInboxId,sentAtNs:e.sentAtNs}),B=e=>({deliveryStatus:e.deliveryStatus,direction:e.direction,limit:e.limit,sentAfterNs:e.sentAfterNs,sentBeforeNs:e.sentBeforeNs}),L=e=>new a(e.sentBeforeNs,e.sentAfterNs,e.limit,e.deliveryStatus,e.direction),U=e=>({allowedStates:e.allowedStates,consentStates:e.consentStates,conversationType:e.conversationType,createdAfterNs:e.createdAfterNs,createdBeforeNs:e.createdBeforeNs,includeDuplicateDms:e.includeDuplicateDms,includeSyncGroups:e.includeSyncGroups,limit:e.limit}),E=e=>new o(e.allowedStates,e.consentStates,e.conversationType,e.createdAfterNs,e.createdBeforeNs,e.includeDuplicateDms??!1,e.includeSyncGroups??!1,e.limit),R=e=>({addAdminPolicy:e.addAdminPolicy,addMemberPolicy:e.addMemberPolicy,removeAdminPolicy:e.removeAdminPolicy,removeMemberPolicy:e.removeMemberPolicy,updateGroupDescriptionPolicy:e.updateGroupDescriptionPolicy,updateGroupImageUrlSquarePolicy:e.updateGroupImageUrlSquarePolicy,updateGroupNamePolicy:e.updateGroupNamePolicy,updateMessageDisappearingPolicy:e.updateMessageDisappearingPolicy}),q=e=>new d(e.addMemberPolicy,e.removeMemberPolicy,e.addAdminPolicy,e.removeAdminPolicy,e.updateGroupNamePolicy,e.updateGroupDescriptionPolicy,e.updateGroupImageUrlSquarePolicy,e.updateMessageDisappearingPolicy),K=e=>({customPermissionPolicySet:e.customPermissionPolicySet,description:e.groupDescription,imageUrlSquare:e.groupImageUrlSquare,messageDisappearingSettings:e.messageDisappearingSettings?X(e.messageDisappearingSettings):void 0,name:e.groupName,permissions:e.permissions}),j=e=>new c(e.permissions,e.name,e.imageUrlSquare,e.description,e.customPermissionPolicySet&&e.permissions===l.CustomPolicy?q(e.customPermissionPolicySet):void 0,e.messageDisappearingSettings?Y(e.messageDisappearingSettings):void 0),O=e=>({messageDisappearingSettings:e.messageDisappearingSettings?X(e.messageDisappearingSettings):void 0}),W=e=>new u(e.messageDisappearingSettings?Y(e.messageDisappearingSettings):void 0),F=async e=>{const t=e.id,s=e.name,n=e.imageUrl,i=e.description,r=e.permissions,a=e.isActive,o=e.addedByInboxId,d=await e.metadata(),c=e.admins,l=e.superAdmins,u=e.createdAtNs,p=r.policyType,g=r.policySet;return{id:t,name:s,imageUrl:n,description:i,permissions:{policyType:p,policySet:{addAdminPolicy:g.addAdminPolicy,addMemberPolicy:g.addMemberPolicy,removeAdminPolicy:g.removeAdminPolicy,removeMemberPolicy:g.removeMemberPolicy,updateGroupDescriptionPolicy:g.updateGroupDescriptionPolicy,updateGroupImageUrlSquarePolicy:g.updateGroupImageUrlSquarePolicy,updateGroupNamePolicy:g.updateGroupNamePolicy,updateMessageDisappearingPolicy:g.updateMessageDisappearingPolicy}},isActive:a,addedByInboxId:o,metadata:d,admins:c,superAdmins:l,createdAtNs:u}},$=e=>({bytes:e.bytes,clientTimestampNs:e.clientTimestampNs,id:e.id}),H=e=>({accountAddresses:e.accountAddresses,inboxId:e.inboxId,installations:e.installations.map($),recoveryAddress:e.recoveryAddress}),V=e=>({entity:e.entity,entityType:e.entityType,state:e.state}),_=e=>new p(e.entityType,e.state,e.entity),z=e=>({accountAddresses:e.accountAddresses,consentState:e.consentState,inboxId:e.inboxId,installationIds:e.installationIds,permissionLevel:e.permissionLevel}),J=e=>new g(e.inboxId,e.accountAddresses,e.installationIds,e.permissionLevel,e.consentState),Q=e=>({key:e.key,epoch:e.epoch}),X=e=>({fromNs:e.fromNs,inNs:e.inNs}),Y=e=>new h(e.fromNs,e.inNs);class Z{#a;content;contentType;conversationId;deliveryStatus;fallback;compression;id;kind;parameters;encodedContent;senderInboxId;sentAtNs;constructor(e,t){switch(this.#a=e,this.id=t.id,this.sentAtNs=t.sentAtNs,this.conversationId=t.convoId,this.senderInboxId=t.senderInboxId,this.encodedContent=t.content,t.kind){case m.Application:this.kind="application";break;case m.MembershipChange:this.kind="membership_change"}switch(t.deliveryStatus){case y.Unpublished:this.deliveryStatus="unpublished";break;case y.Published:this.deliveryStatus="published";break;case y.Failed:this.deliveryStatus="failed"}this.contentType=f(t.content.type),this.parameters=new Map(Object.entries(t.content.parameters)),this.fallback=t.content.fallback,this.compression=t.content.compression,this.content=this.#a.decodeContent(t,this.contentType)}}class ee{#a;#o;#d;#c;#l;#u;#p;#g;#h;#m=[];#y=[];constructor(e,t,s){this.#a=e,this.#o=t,this.#v(s)}#v(e){this.#d=e?.name??"",this.#c=e?.imageUrl??"",this.#l=e?.description??"",this.#u=e?.isActive??void 0,this.#p=e?.addedByInboxId??"",this.#g=e?.metadata??void 0,this.#h=e?.createdAtNs??void 0,this.#m=e?.admins??[],this.#y=e?.superAdmins??[]}get id(){return this.#o}get name(){return this.#d}async updateName(e){await this.#a.sendMessage("updateGroupName",{id:this.#o,name:e}),this.#d=e}get imageUrl(){return this.#c}async updateImageUrl(e){await this.#a.sendMessage("updateGroupImageUrlSquare",{id:this.#o,imageUrl:e}),this.#c=e}get description(){return this.#l}async updateDescription(e){await this.#a.sendMessage("updateGroupDescription",{id:this.#o,description:e}),this.#l=e}get isActive(){return this.#u}get addedByInboxId(){return this.#p}get createdAtNs(){return this.#h}get createdAt(){return this.#h?(e=this.#h,new Date(Number(e/1000000n))):void 0;var e}get metadata(){return this.#g}async members(){return this.#a.sendMessage("getGroupMembers",{id:this.#o})}get admins(){return this.#m}get superAdmins(){return this.#y}async syncAdmins(){const e=await this.#a.sendMessage("getGroupAdmins",{id:this.#o});this.#m=e}async syncSuperAdmins(){const e=await this.#a.sendMessage("getGroupSuperAdmins",{id:this.#o});this.#y=e}async permissions(){return this.#a.sendMessage("getGroupPermissions",{id:this.#o})}async updatePermission(e,t,s){return this.#a.sendMessage("updateGroupPermissionPolicy",{id:this.#o,permissionType:e,policy:t,metadataField:s})}async isAdmin(e){return await this.syncAdmins(),this.#m.includes(e)}async isSuperAdmin(e){return await this.syncSuperAdmins(),this.#y.includes(e)}async sync(){const e=await this.#a.sendMessage("syncGroup",{id:this.#o});this.#v(e)}async addMembers(e){return this.#a.sendMessage("addGroupMembers",{id:this.#o,accountAddresses:e})}async addMembersByInboxId(e){return this.#a.sendMessage("addGroupMembersByInboxId",{id:this.#o,inboxIds:e})}async removeMembers(e){return this.#a.sendMessage("removeGroupMembers",{id:this.#o,accountAddresses:e})}async removeMembersByInboxId(e){return this.#a.sendMessage("removeGroupMembersByInboxId",{id:this.#o,inboxIds:e})}async addAdmin(e){return this.#a.sendMessage("addGroupAdmin",{id:this.#o,inboxId:e})}async removeAdmin(e){return this.#a.sendMessage("removeGroupAdmin",{id:this.#o,inboxId:e})}async addSuperAdmin(e){return this.#a.sendMessage("addGroupSuperAdmin",{id:this.#o,inboxId:e})}async removeSuperAdmin(e){return this.#a.sendMessage("removeGroupSuperAdmin",{id:this.#o,inboxId:e})}async publishMessages(){return this.#a.sendMessage("publishGroupMessages",{id:this.#o})}async sendOptimistic(e,t){if("string"!=typeof e&&!t)throw new Error("Content type is required when sending content other than text");const n="string"==typeof e?this.#a.encodeContent(e,t??s):this.#a.encodeContent(e,t);return this.#a.sendMessage("sendOptimisticGroupMessage",{id:this.#o,content:n})}async send(e,t){if("string"!=typeof e&&!t)throw new Error("Content type is required when sending content other than text");const n="string"==typeof e?this.#a.encodeContent(e,t??s):this.#a.encodeContent(e,t);return this.#a.sendMessage("sendGroupMessage",{id:this.#o,content:n})}async messages(e){return(await this.#a.sendMessage("getGroupMessages",{id:this.#o,options:e})).map((e=>new Z(this.#a,e)))}async consentState(){return this.#a.sendMessage("getGroupConsentState",{id:this.#o})}async updateConsentState(e){return this.#a.sendMessage("updateGroupConsentState",{id:this.#o,state:e})}async dmPeerInboxId(){return this.#a.sendMessage("getDmPeerInboxId",{id:this.#o})}async messageDisappearingSettings(){return this.#a.sendMessage("getGroupMessageDisappearingSettings",{id:this.#o})}async updateMessageDisappearingSettings(e,t){return this.#a.sendMessage("updateGroupMessageDisappearingSettings",{id:this.#o,fromNs:e,inNs:t})}async removeMessageDisappearingSettings(){return this.#a.sendMessage("removeGroupMessageDisappearingSettings",{id:this.#o})}async isMessageDisappearingEnabled(){return this.#a.sendMessage("isGroupMessageDisappearingEnabled",{id:this.#o})}async stream(e){const t=M(),s=new A,n=this.#a.handleStreamMessage(t,((t,n)=>{const i=n?new Z(this.#a,n):void 0;s.callback(t,i),e?.(t,i)}));return await this.#a.sendMessage("streamGroupMessages",{groupId:this.#o,streamId:t}),s.onReturn=()=>{this.#a.sendMessage("endStream",{streamId:t}),n()},s}}class te{#a;constructor(e){this.#a=e}async sync(){return this.#a.sendMessage("syncConversations",void 0)}async syncAll(e){return this.#a.sendMessage("syncAllConversations",{consentStates:e})}async getConversationById(e){const t=await this.#a.sendMessage("getConversationById",{id:e});return t?new ee(this.#a,e,t):void 0}async getMessageById(e){const t=await this.#a.sendMessage("getMessageById",{id:e});return t?new Z(this.#a,t):void 0}async getDmByInboxId(e){const t=await this.#a.sendMessage("getDmByInboxId",{inboxId:e});return t?new ee(this.#a,t.id,t):void 0}async list(e){return(await this.#a.sendMessage("getConversations",{options:e})).map((e=>new ee(this.#a,e.id,e)))}async listGroups(e){return(await this.#a.sendMessage("getGroups",{options:e})).map((e=>new ee(this.#a,e.id,e)))}async listDms(e){return(await this.#a.sendMessage("getDms",{options:e})).map((e=>new ee(this.#a,e.id,e)))}async newGroup(e,t){const s=await this.#a.sendMessage("newGroup",{accountAddresses:e,options:t});return new ee(this.#a,s.id,s)}async newGroupByInboxIds(e,t){const s=await this.#a.sendMessage("newGroupByInboxIds",{inboxIds:e,options:t});return new ee(this.#a,s.id,s)}async newDm(e,t){const s=await this.#a.sendMessage("newDm",{accountAddress:e,options:t});return new ee(this.#a,s.id,s)}async newDmByInboxId(e,t){const s=await this.#a.sendMessage("newDmByInboxId",{inboxId:e,options:t});return new ee(this.#a,s.id,s)}async getHmacKeys(){return this.#a.sendMessage("getHmacKeys",void 0)}async stream(e,t){const s=M(),n=new A,i=this.#a.handleStreamMessage(s,((t,s)=>{const i=s?new ee(this.#a,s.id,s):void 0;n.callback(t,i),e?.(t,i)}));return await this.#a.sendMessage("streamAllGroups",{streamId:s,conversationType:t}),n.onReturn=()=>{this.#a.sendMessage("endStream",{streamId:s}),i()},n}async streamGroups(e){return this.stream(e,v.Group)}async streamDms(e){return this.stream(e,v.Dm)}async streamAllMessages(e,t){const s=M(),n=new A,i=this.#a.handleStreamMessage(s,((t,s)=>{const i=s?new Z(this.#a,s):void 0;n.callback(t,i),e?.(t,i)}));return await this.#a.sendMessage("streamAllMessages",{streamId:s,conversationType:t}),n.onReturn=()=>{this.#a.sendMessage("endStream",{streamId:s}),i()},n}async streamAllGroupMessages(e){return this.streamAllMessages(e,v.Group)}async streamAllDmMessages(e){return this.streamAllMessages(e,v.Dm)}}const se=e=>"SCW"===e.walletType?.();class ne extends S{#w;#M;#I;#b;#S;#A;#x;#k=!1;#P;options;constructor(t,s,i,r){super(new Worker(new URL("./workers/client",import.meta.url),{type:"module"}),void 0!==r?.loggingLevel&&"off"!==r.loggingLevel),this.#w=s,this.options=r,this.#b=i,this.#P=t,this.#I=new te(this);const a=[new e,new n,...r?.codecs??[]];this.#M=new Map(a.map((e=>[e.contentType.toString(),e])))}get accountAddress(){return this.#w}async init(){const e=await this.sendMessage("init",{address:this.accountAddress,encryptionKey:this.#b,options:this.options});this.#S=e.inboxId,this.#A=e.installationId,this.#x=e.installationIdBytes,this.#k=!0}static async create(e,t,s){const n=await e.getAddress(),i=new ne(e,n,t,s);return await i.init(),s?.disableAutoRegister||await i.register(),i}get isReady(){return this.#k}get inboxId(){return this.#S}get installationId(){return this.#A}get installationIdBytes(){return this.#x}async#f(){return this.sendMessage("createInboxSignatureText",void 0)}async#G(e){return this.sendMessage("addAccountSignatureText",{newAccountAddress:e})}async#D(e){return this.sendMessage("removeAccountSignatureText",{accountAddress:e})}async#N(){return this.sendMessage("revokeAllOtherInstallationsSignatureText",void 0)}async#T(e){return this.sendMessage("revokeInstallationsSignatureText",{installationIds:e})}async#C(e,t,s){const n=await s.signMessage(t);se(s)?await this.sendMessage("addScwSignature",{type:e,bytes:n,chainId:s.getChainId(),blockNumber:s.getBlockNumber()}):await this.sendMessage("addSignature",{type:e,bytes:n})}async#B(){return this.sendMessage("applySignatures",void 0)}async register(){const e=await this.#f();if(e)return await this.#C(w.CreateInbox,e,this.#P),this.sendMessage("registerIdentity",void 0)}async addAccount(e){const t=await this.#G(await e.getAddress());if(!t)throw new Error("Unable to generate add account signature text");await this.#C(w.AddWallet,t,e),await this.#B()}async removeAccount(e){const t=await this.#D(e);if(!t)throw new Error("Unable to generate remove account signature text");await this.#C(w.RevokeWallet,t,this.#P),await this.#B()}async revokeAllOtherInstallations(){const e=await this.#N();if(!e)throw new Error("Unable to generate revoke all other installations signature text");await this.#C(w.RevokeInstallations,e,this.#P),await this.#B()}async revokeInstallations(e){const t=await this.#T(e);if(!t)throw new Error("Unable to generate revoke installations signature text");await this.#C(w.RevokeInstallations,t,this.#P),await this.#B()}async isRegistered(){return this.sendMessage("isRegistered",void 0)}async canMessage(e){return this.sendMessage("canMessage",{accountAddresses:e})}static async canMessage(e,t){const s={getAddress:()=>"0x0000000000000000000000000000000000000000",signMessage:()=>new Uint8Array};return(await ne.create(s,window.crypto.getRandomValues(new Uint8Array(32)),{disableAutoRegister:!0,env:t})).canMessage(e)}async findInboxIdByAddress(e){return this.sendMessage("findInboxIdByAddress",{address:e})}async inboxState(e){return this.sendMessage("inboxState",{refreshFromNetwork:e??!1})}async getLatestInboxState(e){return this.sendMessage("getLatestInboxState",{inboxId:e})}async setConsentStates(e){return this.sendMessage("setConsentStates",{records:e})}async getConsentState(e,t){return this.sendMessage("getConsentState",{entityType:e,entity:t})}get conversations(){return this.#I}codecFor(e){return this.#M.get(e.toString())}encodeContent(e,t){const s=this.codecFor(t);if(!s)throw new Error(`Codec not found for "${t.toString()}" content type`);const n=s.encode(e,this),i=s.fallback(e);return i&&(n.fallback=i),N(n)}decodeContent(e,s){const n=this.codecFor(s);if(!n)throw new Error(`Codec not found for "${s.toString()}" content type`);if(s.sameAs(t)&&e.kind!==m.MembershipChange)throw new Error("Error decoding group membership change");const i=T(e.content);return n.decode(i,this)}signWithInstallationKey(e){return this.sendMessage("signWithInstallationKey",{signatureText:e})}verifySignedWithInstallationKey(e,t){return this.sendMessage("verifySignedWithInstallationKey",{signatureText:e,signatureBytes:t})}verifySignedWithPublicKey(e,t,s){return this.sendMessage("verifySignedWithPublicKey",{signatureText:e,signatureBytes:t,publicKey:s})}}const ie=e=>{console.error(`Worker error on line ${e.lineno} in "${e.filename}"`),console.error(e.message)};class re{#e;#t;#s=new Map;constructor(e,t){this.#e=e,this.#e.addEventListener("message",this.handleMessage),this.#e.addEventListener("error",ie),this.#t=t}sendMessage(e,t){const s=M();this.#e.postMessage({action:e,id:s,data:t});return new Promise(((e,t)=>{this.#s.set(s,{resolve:e,reject:t})}))}handleMessage=e=>{const t=e.data;this.#t&&console.log("utils received event data",t);const s=this.#s.get(t.id);s&&(this.#s.delete(t.id),"error"in t?s.reject(new Error(t.error)):s.resolve(t.result))};close(){this.#e.removeEventListener("message",this.handleMessage),this.#e.removeEventListener("error",ie),this.#e.terminate()}}class ae extends re{#t;constructor(e){super(new Worker(new URL("./workers/utils",import.meta.url),{type:"module"}),e??!1),this.#t=e??!1}async generateInboxId(e){return this.sendMessage("generateInboxId",{address:e,enableLogging:this.#t})}async getInboxIdForAddress(e,t){return this.sendMessage("getInboxIdForAddress",{address:e,env:t,enableLogging:this.#t})}}const oe={local:"http://localhost:5555",dev:"https://dev.xmtp.network",production:"https://production.xmtp.network"},de={local:"http://localhost:5558",dev:"https://message-history.dev.ephemera.network",production:"https://message-history.production.ephemera.network"};export{oe as ApiUrls,ne as Client,ee as Conversation,te as Conversations,Z as DecodedMessage,de as HistorySyncUrls,ae as Utils,k as fromContentTypeId,D as fromEncodedContent,_ as fromSafeConsent,f as fromSafeContentTypeId,W as fromSafeCreateDmOptions,j as fromSafeCreateGroupOptions,T as fromSafeEncodedContent,J as fromSafeGroupMember,E as fromSafeListConversationsOptions,L as fromSafeListMessagesOptions,Y as fromSafeMessageDisappearingSettings,q as fromSafePermissionPolicySet,se as isSmartContractSigner,x as toContentTypeId,G as toEncodedContent,V as toSafeConsent,P as toSafeContentTypeId,F as toSafeConversation,O as toSafeCreateDmOptions,K as toSafeCreateGroupOptions,N as toSafeEncodedContent,z as toSafeGroupMember,Q as toSafeHmacKey,H as toSafeInboxState,$ as toSafeInstallation,U as toSafeListConversationsOptions,B as toSafeListMessagesOptions,C as toSafeMessage,X as toSafeMessageDisappearingSettings,R as toSafePermissionPolicySet};
1
+ import{GroupUpdatedCodec as e,ContentTypeGroupUpdated as t}from"@xmtp/content-type-group-updated";import{ContentTypeText as s,TextCodec as n}from"@xmtp/content-type-text";import{ContentTypeId as i,EncodedContent as r,ListMessagesOptions as a,ListConversationsOptions as o,PermissionPolicySet as d,CreateGroupOptions as c,GroupPermissionsOptions as l,CreateDMOptions as u,Consent as p,GroupMember as g,MessageDisappearingSettings as h,GroupMessageKind as m,DeliveryStatus as y,ConversationType as v,SignatureRequestType as w}from"@xmtp/wasm-bindings";export{Consent,ConsentEntityType,ConsentState,ContentTypeId,ConversationType,CreateGroupOptions,DeliveryStatus,EncodedContent,GroupMember,GroupMembershipState,GroupMessageKind,GroupMetadata,GroupPermissions,GroupPermissionsOptions,HmacKey,InboxState,Installation,ListConversationsOptions,ListMessagesOptions,Message,MetadataField,PermissionLevel,PermissionPolicy,PermissionPolicySet,PermissionUpdateType,SignatureRequestType,SortDirection}from"@xmtp/wasm-bindings";import{v4 as M}from"uuid";import{ContentTypeId as I}from"@xmtp/content-type-primitives";const b=e=>{console.error(`Worker error on line ${e.lineno} in "${e.filename}"`),console.error(e.message)};class S{#e;#t;#s=new Map;constructor(e,t){this.#e=e,this.#e.addEventListener("message",this.handleMessage),this.#e.addEventListener("error",b),this.#t=t}sendMessage(e,t){const s=M();this.#e.postMessage({action:e,id:s,data:t});return new Promise(((e,t)=>{this.#s.set(s,{resolve:e,reject:t})}))}handleMessage=e=>{const t=e.data;this.#t&&console.log("client received event data",t);const s=this.#s.get(t.id);s&&(this.#s.delete(t.id),"error"in t?s.reject(new Error(t.error)):s.resolve(t.result))};handleStreamMessage=(e,t)=>{const s=s=>{const n=s.data;n.streamId===e&&("error"in n?t(new Error(n.error),null):t(null,n.result))};return this.#e.addEventListener("message",s),()=>{this.#e.removeEventListener("message",s)}};close(){this.#e.removeEventListener("message",this.handleMessage),this.#e.removeEventListener("error",b),this.#e.terminate()}}class A{#n=!1;#i;#r;onReturn=void 0;constructor(){this.#r=[],this.#i=null,this.#n=!1}get isDone(){return this.#n}callback=(e,t)=>{if(e)throw e;this.#n||(this.#i?(this.#i({done:!1,value:t}),this.#i=null):this.#r.push(t))};next=()=>this.#r.length>0?Promise.resolve({done:!1,value:this.#r.shift()}):this.#n?Promise.resolve({done:!0,value:void 0}):new Promise((e=>{this.#i=e}));return=e=>(this.#n=!0,this.onReturn?.(),Promise.resolve({done:!0,value:e}));[Symbol.asyncIterator](){return this}}const x=e=>new I({authorityId:e.authorityId,typeId:e.typeId,versionMajor:e.versionMajor,versionMinor:e.versionMinor}),k=e=>new i(e.authorityId,e.typeId,e.versionMajor,e.versionMinor),P=e=>({authorityId:e.authorityId,typeId:e.typeId,versionMajor:e.versionMajor,versionMinor:e.versionMinor}),f=e=>new I({authorityId:e.authorityId,typeId:e.typeId,versionMajor:e.versionMajor,versionMinor:e.versionMinor}),G=e=>({type:x(e.type),parameters:Object.fromEntries(e.parameters),fallback:e.fallback,compression:e.compression,content:e.content}),D=e=>new r(k(e.type),new Map(Object.entries(e.parameters)),e.fallback,e.compression,e.content),N=e=>({type:P(e.type),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content}),T=e=>({type:f(e.type),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content}),C=e=>({content:N(G(e.content)),convoId:e.convoId,deliveryStatus:e.deliveryStatus,id:e.id,kind:e.kind,senderInboxId:e.senderInboxId,sentAtNs:e.sentAtNs}),B=e=>({deliveryStatus:e.deliveryStatus,direction:e.direction,limit:e.limit,sentAfterNs:e.sentAfterNs,sentBeforeNs:e.sentBeforeNs}),L=e=>new a(e.sentBeforeNs,e.sentAfterNs,e.limit,e.deliveryStatus,e.direction),E=e=>({allowedStates:e.allowedStates,consentStates:e.consentStates,conversationType:e.conversationType,createdAfterNs:e.createdAfterNs,createdBeforeNs:e.createdBeforeNs,includeDuplicateDms:e.includeDuplicateDms,includeSyncGroups:e.includeSyncGroups,limit:e.limit}),U=e=>new o(e.allowedStates,e.consentStates,e.conversationType,e.createdAfterNs,e.createdBeforeNs,e.includeDuplicateDms??!1,e.includeSyncGroups??!1,e.limit),R=e=>({addAdminPolicy:e.addAdminPolicy,addMemberPolicy:e.addMemberPolicy,removeAdminPolicy:e.removeAdminPolicy,removeMemberPolicy:e.removeMemberPolicy,updateGroupDescriptionPolicy:e.updateGroupDescriptionPolicy,updateGroupImageUrlSquarePolicy:e.updateGroupImageUrlSquarePolicy,updateGroupNamePolicy:e.updateGroupNamePolicy,updateMessageDisappearingPolicy:e.updateMessageDisappearingPolicy}),q=e=>new d(e.addMemberPolicy,e.removeMemberPolicy,e.addAdminPolicy,e.removeAdminPolicy,e.updateGroupNamePolicy,e.updateGroupDescriptionPolicy,e.updateGroupImageUrlSquarePolicy,e.updateMessageDisappearingPolicy),K=e=>({customPermissionPolicySet:e.customPermissionPolicySet,description:e.groupDescription,imageUrlSquare:e.groupImageUrlSquare,messageDisappearingSettings:e.messageDisappearingSettings?X(e.messageDisappearingSettings):void 0,name:e.groupName,permissions:e.permissions}),j=e=>new c(e.permissions,e.name,e.imageUrlSquare,e.description,e.customPermissionPolicySet&&e.permissions===l.CustomPolicy?q(e.customPermissionPolicySet):void 0,e.messageDisappearingSettings?Y(e.messageDisappearingSettings):void 0),O=e=>({messageDisappearingSettings:e.messageDisappearingSettings?X(e.messageDisappearingSettings):void 0}),W=e=>new u(e.messageDisappearingSettings?Y(e.messageDisappearingSettings):void 0),F=async e=>{const t=e.id,s=e.name,n=e.imageUrl,i=e.description,r=e.permissions,a=e.isActive,o=e.addedByInboxId,d=await e.metadata(),c=e.admins,l=e.superAdmins,u=e.createdAtNs,p=r.policyType,g=r.policySet;return{id:t,name:s,imageUrl:n,description:i,permissions:{policyType:p,policySet:{addAdminPolicy:g.addAdminPolicy,addMemberPolicy:g.addMemberPolicy,removeAdminPolicy:g.removeAdminPolicy,removeMemberPolicy:g.removeMemberPolicy,updateGroupDescriptionPolicy:g.updateGroupDescriptionPolicy,updateGroupImageUrlSquarePolicy:g.updateGroupImageUrlSquarePolicy,updateGroupNamePolicy:g.updateGroupNamePolicy,updateMessageDisappearingPolicy:g.updateMessageDisappearingPolicy}},isActive:a,addedByInboxId:o,metadata:d,admins:c,superAdmins:l,createdAtNs:u}},$=e=>({bytes:e.bytes,clientTimestampNs:e.clientTimestampNs,id:e.id}),H=e=>({accountAddresses:e.accountAddresses,inboxId:e.inboxId,installations:e.installations.map($),recoveryAddress:e.recoveryAddress}),V=e=>({entity:e.entity,entityType:e.entityType,state:e.state}),_=e=>new p(e.entityType,e.state,e.entity),z=e=>({accountAddresses:e.accountAddresses,consentState:e.consentState,inboxId:e.inboxId,installationIds:e.installationIds,permissionLevel:e.permissionLevel}),J=e=>new g(e.inboxId,e.accountAddresses,e.installationIds,e.permissionLevel,e.consentState),Q=e=>({key:e.key,epoch:e.epoch}),X=e=>({fromNs:e.fromNs,inNs:e.inNs}),Y=e=>new h(e.fromNs,e.inNs);class Z{#a;content;contentType;conversationId;deliveryStatus;fallback;compression;id;kind;parameters;encodedContent;senderInboxId;sentAtNs;constructor(e,t){switch(this.#a=e,this.id=t.id,this.sentAtNs=t.sentAtNs,this.conversationId=t.convoId,this.senderInboxId=t.senderInboxId,this.encodedContent=t.content,t.kind){case m.Application:this.kind="application";break;case m.MembershipChange:this.kind="membership_change"}switch(t.deliveryStatus){case y.Unpublished:this.deliveryStatus="unpublished";break;case y.Published:this.deliveryStatus="published";break;case y.Failed:this.deliveryStatus="failed"}this.contentType=f(t.content.type),this.parameters=new Map(Object.entries(t.content.parameters)),this.fallback=t.content.fallback,this.compression=t.content.compression,this.content=this.#a.decodeContent(t,this.contentType)}}class ee{#a;#o;#d;#c;#l;#u;#p;#g;#h;#m=[];#y=[];constructor(e,t,s){this.#a=e,this.#o=t,this.#v(s)}#v(e){this.#d=e?.name??"",this.#c=e?.imageUrl??"",this.#l=e?.description??"",this.#u=e?.isActive??void 0,this.#p=e?.addedByInboxId??"",this.#g=e?.metadata??void 0,this.#h=e?.createdAtNs??void 0,this.#m=e?.admins??[],this.#y=e?.superAdmins??[]}get id(){return this.#o}get name(){return this.#d}async updateName(e){await this.#a.sendMessage("updateGroupName",{id:this.#o,name:e}),this.#d=e}get imageUrl(){return this.#c}async updateImageUrl(e){await this.#a.sendMessage("updateGroupImageUrlSquare",{id:this.#o,imageUrl:e}),this.#c=e}get description(){return this.#l}async updateDescription(e){await this.#a.sendMessage("updateGroupDescription",{id:this.#o,description:e}),this.#l=e}get isActive(){return this.#u}get addedByInboxId(){return this.#p}get createdAtNs(){return this.#h}get createdAt(){return this.#h?(e=this.#h,new Date(Number(e/1000000n))):void 0;var e}get metadata(){return this.#g}async members(){return this.#a.sendMessage("getGroupMembers",{id:this.#o})}get admins(){return this.#m}get superAdmins(){return this.#y}async syncAdmins(){const e=await this.#a.sendMessage("getGroupAdmins",{id:this.#o});this.#m=e}async syncSuperAdmins(){const e=await this.#a.sendMessage("getGroupSuperAdmins",{id:this.#o});this.#y=e}async permissions(){return this.#a.sendMessage("getGroupPermissions",{id:this.#o})}async updatePermission(e,t,s){return this.#a.sendMessage("updateGroupPermissionPolicy",{id:this.#o,permissionType:e,policy:t,metadataField:s})}async isAdmin(e){return await this.syncAdmins(),this.#m.includes(e)}async isSuperAdmin(e){return await this.syncSuperAdmins(),this.#y.includes(e)}async sync(){const e=await this.#a.sendMessage("syncGroup",{id:this.#o});this.#v(e)}async addMembers(e){return this.#a.sendMessage("addGroupMembers",{id:this.#o,accountAddresses:e})}async addMembersByInboxId(e){return this.#a.sendMessage("addGroupMembersByInboxId",{id:this.#o,inboxIds:e})}async removeMembers(e){return this.#a.sendMessage("removeGroupMembers",{id:this.#o,accountAddresses:e})}async removeMembersByInboxId(e){return this.#a.sendMessage("removeGroupMembersByInboxId",{id:this.#o,inboxIds:e})}async addAdmin(e){return this.#a.sendMessage("addGroupAdmin",{id:this.#o,inboxId:e})}async removeAdmin(e){return this.#a.sendMessage("removeGroupAdmin",{id:this.#o,inboxId:e})}async addSuperAdmin(e){return this.#a.sendMessage("addGroupSuperAdmin",{id:this.#o,inboxId:e})}async removeSuperAdmin(e){return this.#a.sendMessage("removeGroupSuperAdmin",{id:this.#o,inboxId:e})}async publishMessages(){return this.#a.sendMessage("publishGroupMessages",{id:this.#o})}async sendOptimistic(e,t){if("string"!=typeof e&&!t)throw new Error("Content type is required when sending content other than text");const n="string"==typeof e?this.#a.encodeContent(e,t??s):this.#a.encodeContent(e,t);return this.#a.sendMessage("sendOptimisticGroupMessage",{id:this.#o,content:n})}async send(e,t){if("string"!=typeof e&&!t)throw new Error("Content type is required when sending content other than text");const n="string"==typeof e?this.#a.encodeContent(e,t??s):this.#a.encodeContent(e,t);return this.#a.sendMessage("sendGroupMessage",{id:this.#o,content:n})}async messages(e){return(await this.#a.sendMessage("getGroupMessages",{id:this.#o,options:e})).map((e=>new Z(this.#a,e)))}async consentState(){return this.#a.sendMessage("getGroupConsentState",{id:this.#o})}async updateConsentState(e){return this.#a.sendMessage("updateGroupConsentState",{id:this.#o,state:e})}async dmPeerInboxId(){return this.#a.sendMessage("getDmPeerInboxId",{id:this.#o})}async messageDisappearingSettings(){return this.#a.sendMessage("getGroupMessageDisappearingSettings",{id:this.#o})}async updateMessageDisappearingSettings(e,t){return this.#a.sendMessage("updateGroupMessageDisappearingSettings",{id:this.#o,fromNs:e,inNs:t})}async removeMessageDisappearingSettings(){return this.#a.sendMessage("removeGroupMessageDisappearingSettings",{id:this.#o})}async isMessageDisappearingEnabled(){return this.#a.sendMessage("isGroupMessageDisappearingEnabled",{id:this.#o})}async stream(e){const t=M(),s=new A,n=this.#a.handleStreamMessage(t,((t,n)=>{const i=n?new Z(this.#a,n):void 0;s.callback(t,i),e?.(t,i)}));return await this.#a.sendMessage("streamGroupMessages",{groupId:this.#o,streamId:t}),s.onReturn=()=>{this.#a.sendMessage("endStream",{streamId:t}),n()},s}}class te{#a;constructor(e){this.#a=e}async sync(){return this.#a.sendMessage("syncConversations",void 0)}async syncAll(e){return this.#a.sendMessage("syncAllConversations",{consentStates:e})}async getConversationById(e){const t=await this.#a.sendMessage("getConversationById",{id:e});return t?new ee(this.#a,e,t):void 0}async getMessageById(e){const t=await this.#a.sendMessage("getMessageById",{id:e});return t?new Z(this.#a,t):void 0}async getDmByInboxId(e){const t=await this.#a.sendMessage("getDmByInboxId",{inboxId:e});return t?new ee(this.#a,t.id,t):void 0}async list(e){return(await this.#a.sendMessage("getConversations",{options:e})).map((e=>new ee(this.#a,e.id,e)))}async listGroups(e){return(await this.#a.sendMessage("getGroups",{options:e})).map((e=>new ee(this.#a,e.id,e)))}async listDms(e){return(await this.#a.sendMessage("getDms",{options:e})).map((e=>new ee(this.#a,e.id,e)))}async newGroup(e,t){const s=await this.#a.sendMessage("newGroup",{accountAddresses:e,options:t});return new ee(this.#a,s.id,s)}async newGroupByInboxIds(e,t){const s=await this.#a.sendMessage("newGroupByInboxIds",{inboxIds:e,options:t});return new ee(this.#a,s.id,s)}async newDm(e,t){const s=await this.#a.sendMessage("newDm",{accountAddress:e,options:t});return new ee(this.#a,s.id,s)}async newDmByInboxId(e,t){const s=await this.#a.sendMessage("newDmByInboxId",{inboxId:e,options:t});return new ee(this.#a,s.id,s)}async getHmacKeys(){return this.#a.sendMessage("getHmacKeys",void 0)}async stream(e,t){const s=M(),n=new A,i=this.#a.handleStreamMessage(s,((t,s)=>{const i=s?new ee(this.#a,s.id,s):void 0;n.callback(t,i),e?.(t,i)}));return await this.#a.sendMessage("streamAllGroups",{streamId:s,conversationType:t}),n.onReturn=()=>{this.#a.sendMessage("endStream",{streamId:s}),i()},n}async streamGroups(e){return this.stream(e,v.Group)}async streamDms(e){return this.stream(e,v.Dm)}async streamAllMessages(e,t){const s=M(),n=new A,i=this.#a.handleStreamMessage(s,((t,s)=>{const i=s?new Z(this.#a,s):void 0;n.callback(t,i),e?.(t,i)}));return await this.#a.sendMessage("streamAllMessages",{streamId:s,conversationType:t}),n.onReturn=()=>{this.#a.sendMessage("endStream",{streamId:s}),i()},n}async streamAllGroupMessages(e){return this.streamAllMessages(e,v.Group)}async streamAllDmMessages(e){return this.streamAllMessages(e,v.Dm)}}class se extends S{#w;#M;#I;#b;#S;#A;#x;#k=!1;#P;options;constructor(t,s,i,r){super(new Worker(new URL("./workers/client",import.meta.url),{type:"module"}),void 0!==r?.loggingLevel&&"off"!==r.loggingLevel),this.#w=s,this.options=r,this.#b=i,this.#P=t,this.#I=new te(this);const a=[new e,new n,...r?.codecs??[]];this.#M=new Map(a.map((e=>[e.contentType.toString(),e])))}get accountAddress(){return this.#w}async init(){const e=await this.sendMessage("init",{address:this.accountAddress,encryptionKey:this.#b,options:this.options});this.#S=e.inboxId,this.#A=e.installationId,this.#x=e.installationIdBytes,this.#k=!0}static async create(e,t,s){const n=await e.getAddress(),i=new se(e,n,t,s);return await i.init(),s?.disableAutoRegister||await i.register(),i}get isReady(){return this.#k}get inboxId(){return this.#S}get installationId(){return this.#A}get installationIdBytes(){return this.#x}async#f(){return this.sendMessage("createInboxSignatureText",void 0)}async#G(e){return this.sendMessage("addAccountSignatureText",{newAccountAddress:e})}async#D(e){return this.sendMessage("removeAccountSignatureText",{accountAddress:e})}async#N(){return this.sendMessage("revokeAllOtherInstallationsSignatureText",void 0)}async#T(e){return this.sendMessage("revokeInstallationsSignatureText",{installationIds:e})}async#C(e,t,s){const n=await s.signMessage(t);"SCW"===s.walletType?await this.sendMessage("addScwSignature",{type:e,bytes:n,chainId:s.getChainId(),blockNumber:s.getBlockNumber?.()}):await this.sendMessage("addSignature",{type:e,bytes:n})}async#B(){return this.sendMessage("applySignatures",void 0)}async register(){const e=await this.#f();if(e)return await this.#C(w.CreateInbox,e,this.#P),this.sendMessage("registerIdentity",void 0)}async addAccount(e){const t=await this.#G(await e.getAddress());if(!t)throw new Error("Unable to generate add account signature text");await this.#C(w.AddWallet,t,e),await this.#B()}async removeAccount(e){const t=await this.#D(e);if(!t)throw new Error("Unable to generate remove account signature text");await this.#C(w.RevokeWallet,t,this.#P),await this.#B()}async revokeAllOtherInstallations(){const e=await this.#N();if(!e)throw new Error("Unable to generate revoke all other installations signature text");await this.#C(w.RevokeInstallations,e,this.#P),await this.#B()}async revokeInstallations(e){const t=await this.#T(e);if(!t)throw new Error("Unable to generate revoke installations signature text");await this.#C(w.RevokeInstallations,t,this.#P),await this.#B()}async isRegistered(){return this.sendMessage("isRegistered",void 0)}async canMessage(e){return this.sendMessage("canMessage",{accountAddresses:e})}static async canMessage(e,t){const s={walletType:"EOA",getAddress:()=>"0x0000000000000000000000000000000000000000",signMessage:()=>new Uint8Array};return(await se.create(s,window.crypto.getRandomValues(new Uint8Array(32)),{disableAutoRegister:!0,env:t})).canMessage(e)}async findInboxIdByAddress(e){return this.sendMessage("findInboxIdByAddress",{address:e})}async inboxState(e){return this.sendMessage("inboxState",{refreshFromNetwork:e??!1})}async getLatestInboxState(e){return this.sendMessage("getLatestInboxState",{inboxId:e})}async setConsentStates(e){return this.sendMessage("setConsentStates",{records:e})}async getConsentState(e,t){return this.sendMessage("getConsentState",{entityType:e,entity:t})}get conversations(){return this.#I}codecFor(e){return this.#M.get(e.toString())}encodeContent(e,t){const s=this.codecFor(t);if(!s)throw new Error(`Codec not found for "${t.toString()}" content type`);const n=s.encode(e,this),i=s.fallback(e);return i&&(n.fallback=i),N(n)}decodeContent(e,s){const n=this.codecFor(s);if(!n)throw new Error(`Codec not found for "${s.toString()}" content type`);if(s.sameAs(t)&&e.kind!==m.MembershipChange)throw new Error("Error decoding group membership change");const i=T(e.content);return n.decode(i,this)}signWithInstallationKey(e){return this.sendMessage("signWithInstallationKey",{signatureText:e})}verifySignedWithInstallationKey(e,t){return this.sendMessage("verifySignedWithInstallationKey",{signatureText:e,signatureBytes:t})}verifySignedWithPublicKey(e,t,s){return this.sendMessage("verifySignedWithPublicKey",{signatureText:e,signatureBytes:t,publicKey:s})}}const ne=e=>{console.error(`Worker error on line ${e.lineno} in "${e.filename}"`),console.error(e.message)};class ie{#e;#t;#s=new Map;constructor(e,t){this.#e=e,this.#e.addEventListener("message",this.handleMessage),this.#e.addEventListener("error",ne),this.#t=t}sendMessage(e,t){const s=M();this.#e.postMessage({action:e,id:s,data:t});return new Promise(((e,t)=>{this.#s.set(s,{resolve:e,reject:t})}))}handleMessage=e=>{const t=e.data;this.#t&&console.log("utils received event data",t);const s=this.#s.get(t.id);s&&(this.#s.delete(t.id),"error"in t?s.reject(new Error(t.error)):s.resolve(t.result))};close(){this.#e.removeEventListener("message",this.handleMessage),this.#e.removeEventListener("error",ne),this.#e.terminate()}}class re extends ie{#t;constructor(e){super(new Worker(new URL("./workers/utils",import.meta.url),{type:"module"}),e??!1),this.#t=e??!1}async generateInboxId(e){return this.sendMessage("generateInboxId",{address:e,enableLogging:this.#t})}async getInboxIdForAddress(e,t){return this.sendMessage("getInboxIdForAddress",{address:e,env:t,enableLogging:this.#t})}}const ae={local:"http://localhost:5555",dev:"https://dev.xmtp.network",production:"https://production.xmtp.network"},oe={local:"http://localhost:5558",dev:"https://message-history.dev.ephemera.network",production:"https://message-history.production.ephemera.network"};export{ae as ApiUrls,se as Client,ee as Conversation,te as Conversations,Z as DecodedMessage,oe as HistorySyncUrls,re as Utils,k as fromContentTypeId,D as fromEncodedContent,_ as fromSafeConsent,f as fromSafeContentTypeId,W as fromSafeCreateDmOptions,j as fromSafeCreateGroupOptions,T as fromSafeEncodedContent,J as fromSafeGroupMember,U as fromSafeListConversationsOptions,L as fromSafeListMessagesOptions,Y as fromSafeMessageDisappearingSettings,q as fromSafePermissionPolicySet,x as toContentTypeId,G as toEncodedContent,V as toSafeConsent,P as toSafeContentTypeId,F as toSafeConversation,O as toSafeCreateDmOptions,K as toSafeCreateGroupOptions,N as toSafeEncodedContent,z as toSafeGroupMember,Q as toSafeHmacKey,H as toSafeInboxState,$ as toSafeInstallation,E as toSafeListConversationsOptions,B as toSafeListMessagesOptions,C as toSafeMessage,X as toSafeMessageDisappearingSettings,R as toSafePermissionPolicySet};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/ClientWorkerClass.ts","../src/AsyncStream.ts","../src/utils/conversions.ts","../src/DecodedMessage.ts","../src/Conversation.ts","../src/utils/date.ts","../src/Conversations.ts","../src/utils/signer.ts","../src/Client.ts","../src/UtilsWorkerClass.ts","../src/Utils.ts","../src/constants.ts"],"sourcesContent":["import { v4 } from \"uuid\";\nimport type {\n ClientEventsActions,\n ClientEventsErrorData,\n ClientEventsResult,\n ClientEventsWorkerMessageData,\n ClientSendMessageData,\n} from \"@/types\";\nimport type {\n ClientStreamEvents,\n ClientStreamEventsErrorData,\n} from \"@/types/clientStreamEvents\";\n\nconst handleError = (event: ErrorEvent) => {\n console.error(`Worker error on line ${event.lineno} in \"${event.filename}\"`);\n console.error(event.message);\n};\n\nexport class ClientWorkerClass {\n #worker: Worker;\n\n #enableLogging: boolean;\n\n #promises = new Map<\n string,\n { resolve: (value: any) => void; reject: (reason?: any) => void }\n >();\n\n constructor(worker: Worker, enableLogging: boolean) {\n this.#worker = worker;\n this.#worker.addEventListener(\"message\", this.handleMessage);\n this.#worker.addEventListener(\"error\", handleError);\n this.#enableLogging = enableLogging;\n }\n\n sendMessage<A extends ClientEventsActions>(\n action: A,\n data: ClientSendMessageData<A>,\n ) {\n const promiseId = v4();\n this.#worker.postMessage({\n action,\n id: promiseId,\n data,\n });\n const promise = new Promise<ClientEventsResult<A>>((resolve, reject) => {\n this.#promises.set(promiseId, { resolve, reject });\n });\n return promise;\n }\n\n handleMessage = (\n event: MessageEvent<ClientEventsWorkerMessageData | ClientEventsErrorData>,\n ) => {\n const eventData = event.data;\n if (this.#enableLogging) {\n console.log(\"client received event data\", eventData);\n }\n const promise = this.#promises.get(eventData.id);\n if (promise) {\n this.#promises.delete(eventData.id);\n if (\"error\" in eventData) {\n promise.reject(new Error(eventData.error));\n } else {\n promise.resolve(eventData.result);\n }\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n handleStreamMessage = <T extends ClientStreamEvents[\"result\"]>(\n streamId: string,\n callback: (error: Error | null, value: T | null) => void,\n ) => {\n const streamHandler = (\n event: MessageEvent<ClientStreamEvents | ClientStreamEventsErrorData>,\n ) => {\n const eventData = event.data;\n if (eventData.streamId === streamId) {\n if (\"error\" in eventData) {\n callback(new Error(eventData.error), null);\n } else {\n callback(null, eventData.result as T);\n }\n }\n };\n this.#worker.addEventListener(\"message\", streamHandler);\n\n return () => {\n this.#worker.removeEventListener(\"message\", streamHandler);\n };\n };\n\n close() {\n this.#worker.removeEventListener(\"message\", this.handleMessage);\n this.#worker.removeEventListener(\"error\", handleError);\n this.#worker.terminate();\n }\n}\n","type ResolveValue<T> = {\n value: T | undefined;\n done: boolean;\n};\n\ntype ResolveNext<T> = (resolveValue: ResolveValue<T>) => void;\n\nexport type StreamCallback<T> = (\n err: Error | null,\n value: T | undefined,\n) => void | Promise<void>;\n\nexport class AsyncStream<T> {\n #done = false;\n #resolveNext: ResolveNext<T> | null;\n #queue: (T | undefined)[];\n\n onReturn: (() => void) | undefined = undefined;\n\n constructor() {\n this.#queue = [];\n this.#resolveNext = null;\n this.#done = false;\n }\n\n get isDone() {\n return this.#done;\n }\n\n callback: StreamCallback<T> = (error, value) => {\n if (error) {\n throw error;\n }\n\n if (this.#done) {\n return;\n }\n\n if (this.#resolveNext) {\n this.#resolveNext({\n done: false,\n value,\n });\n this.#resolveNext = null;\n } else {\n this.#queue.push(value);\n }\n };\n\n next = (): Promise<ResolveValue<T>> => {\n if (this.#queue.length > 0) {\n return Promise.resolve({\n done: false,\n value: this.#queue.shift(),\n });\n } else if (this.#done) {\n return Promise.resolve({\n done: true,\n value: undefined,\n });\n } else {\n return new Promise((resolve) => {\n this.#resolveNext = resolve;\n });\n }\n };\n\n return = (value: T | undefined) => {\n this.#done = true;\n this.onReturn?.();\n return Promise.resolve({\n done: true,\n value,\n });\n };\n\n [Symbol.asyncIterator]() {\n return this;\n }\n}\n","import {\n ContentTypeId,\n type EncodedContent,\n} from \"@xmtp/content-type-primitives\";\nimport {\n Consent,\n CreateDMOptions,\n CreateGroupOptions,\n GroupMember,\n GroupPermissionsOptions,\n ListConversationsOptions,\n ListMessagesOptions,\n MessageDisappearingSettings,\n PermissionPolicySet,\n ContentTypeId as WasmContentTypeId,\n EncodedContent as WasmEncodedContent,\n type ConsentEntityType,\n type ConsentState,\n type ConversationType,\n type DeliveryStatus,\n type GroupMembershipState,\n type GroupMessageKind,\n type HmacKey,\n type InboxState,\n type Installation,\n type Message,\n type PermissionLevel,\n type PermissionPolicy,\n type SortDirection,\n} from \"@xmtp/wasm-bindings\";\nimport type { WorkerConversation } from \"@/WorkerConversation\";\n\nexport const toContentTypeId = (\n contentTypeId: WasmContentTypeId,\n): ContentTypeId =>\n new ContentTypeId({\n authorityId: contentTypeId.authorityId,\n typeId: contentTypeId.typeId,\n versionMajor: contentTypeId.versionMajor,\n versionMinor: contentTypeId.versionMinor,\n });\n\nexport const fromContentTypeId = (\n contentTypeId: ContentTypeId,\n): WasmContentTypeId =>\n new WasmContentTypeId(\n contentTypeId.authorityId,\n contentTypeId.typeId,\n contentTypeId.versionMajor,\n contentTypeId.versionMinor,\n );\n\nexport type SafeContentTypeId = {\n authorityId: string;\n typeId: string;\n versionMajor: number;\n versionMinor: number;\n};\n\nexport const toSafeContentTypeId = (\n contentTypeId: ContentTypeId,\n): SafeContentTypeId => ({\n authorityId: contentTypeId.authorityId,\n typeId: contentTypeId.typeId,\n versionMajor: contentTypeId.versionMajor,\n versionMinor: contentTypeId.versionMinor,\n});\n\nexport const fromSafeContentTypeId = (\n contentTypeId: SafeContentTypeId,\n): ContentTypeId =>\n new ContentTypeId({\n authorityId: contentTypeId.authorityId,\n typeId: contentTypeId.typeId,\n versionMajor: contentTypeId.versionMajor,\n versionMinor: contentTypeId.versionMinor,\n });\n\nexport const toEncodedContent = (\n content: WasmEncodedContent,\n): EncodedContent => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n type: toContentTypeId(content.type!),\n parameters: Object.fromEntries(content.parameters as Map<string, string>),\n fallback: content.fallback,\n compression: content.compression,\n content: content.content,\n});\n\nexport const fromEncodedContent = (\n content: EncodedContent,\n): WasmEncodedContent =>\n new WasmEncodedContent(\n fromContentTypeId(content.type),\n new Map(Object.entries(content.parameters)),\n content.fallback,\n content.compression,\n content.content,\n );\n\nexport type SafeEncodedContent = {\n type: SafeContentTypeId;\n parameters: Record<string, string>;\n fallback?: string;\n compression?: number;\n content: Uint8Array;\n};\n\nexport const toSafeEncodedContent = (\n content: EncodedContent,\n): SafeEncodedContent => ({\n type: toSafeContentTypeId(content.type),\n parameters: content.parameters,\n fallback: content.fallback,\n compression: content.compression,\n content: content.content,\n});\n\nexport const fromSafeEncodedContent = (\n content: SafeEncodedContent,\n): EncodedContent => ({\n type: fromSafeContentTypeId(content.type),\n parameters: content.parameters,\n fallback: content.fallback,\n compression: content.compression,\n content: content.content,\n});\n\nexport type SafeMessage = {\n content: SafeEncodedContent;\n convoId: string;\n deliveryStatus: DeliveryStatus;\n id: string;\n kind: GroupMessageKind;\n senderInboxId: string;\n sentAtNs: bigint;\n};\n\nexport const toSafeMessage = (message: Message): SafeMessage => ({\n content: toSafeEncodedContent(toEncodedContent(message.content)),\n convoId: message.convoId,\n deliveryStatus: message.deliveryStatus,\n id: message.id,\n kind: message.kind,\n senderInboxId: message.senderInboxId,\n sentAtNs: message.sentAtNs,\n});\n\nexport type SafeListMessagesOptions = {\n deliveryStatus?: DeliveryStatus;\n direction?: SortDirection;\n limit?: bigint;\n sentAfterNs?: bigint;\n sentBeforeNs?: bigint;\n};\n\nexport const toSafeListMessagesOptions = (\n options: ListMessagesOptions,\n): SafeListMessagesOptions => ({\n deliveryStatus: options.deliveryStatus,\n direction: options.direction,\n limit: options.limit,\n sentAfterNs: options.sentAfterNs,\n sentBeforeNs: options.sentBeforeNs,\n});\n\nexport const fromSafeListMessagesOptions = (\n options: SafeListMessagesOptions,\n): ListMessagesOptions =>\n new ListMessagesOptions(\n options.sentBeforeNs,\n options.sentAfterNs,\n options.limit,\n options.deliveryStatus,\n options.direction,\n );\n\nexport type SafeListConversationsOptions = {\n allowedStates?: GroupMembershipState[];\n consentStates?: ConsentState[];\n conversationType?: ConversationType;\n createdAfterNs?: bigint;\n createdBeforeNs?: bigint;\n includeDuplicateDms?: boolean;\n includeSyncGroups?: boolean;\n limit?: bigint;\n};\n\nexport const toSafeListConversationsOptions = (\n options: ListConversationsOptions,\n): SafeListConversationsOptions => ({\n allowedStates: options.allowedStates,\n consentStates: options.consentStates,\n conversationType: options.conversationType,\n createdAfterNs: options.createdAfterNs,\n createdBeforeNs: options.createdBeforeNs,\n includeDuplicateDms: options.includeDuplicateDms,\n includeSyncGroups: options.includeSyncGroups,\n limit: options.limit,\n});\n\nexport const fromSafeListConversationsOptions = (\n options: SafeListConversationsOptions,\n): ListConversationsOptions =>\n new ListConversationsOptions(\n options.allowedStates,\n options.consentStates,\n options.conversationType,\n options.createdAfterNs,\n options.createdBeforeNs,\n options.includeDuplicateDms ?? false,\n options.includeSyncGroups ?? false,\n options.limit,\n );\n\nexport type SafePermissionPolicySet = {\n addAdminPolicy: PermissionPolicy;\n addMemberPolicy: PermissionPolicy;\n removeAdminPolicy: PermissionPolicy;\n removeMemberPolicy: PermissionPolicy;\n updateGroupDescriptionPolicy: PermissionPolicy;\n updateGroupImageUrlSquarePolicy: PermissionPolicy;\n updateGroupNamePolicy: PermissionPolicy;\n updateMessageDisappearingPolicy: PermissionPolicy;\n};\n\nexport const toSafePermissionPolicySet = (\n policySet: PermissionPolicySet,\n): SafePermissionPolicySet => ({\n addAdminPolicy: policySet.addAdminPolicy,\n addMemberPolicy: policySet.addMemberPolicy,\n removeAdminPolicy: policySet.removeAdminPolicy,\n removeMemberPolicy: policySet.removeMemberPolicy,\n updateGroupDescriptionPolicy: policySet.updateGroupDescriptionPolicy,\n updateGroupImageUrlSquarePolicy: policySet.updateGroupImageUrlSquarePolicy,\n updateGroupNamePolicy: policySet.updateGroupNamePolicy,\n updateMessageDisappearingPolicy: policySet.updateMessageDisappearingPolicy,\n});\n\nexport const fromSafePermissionPolicySet = (\n policySet: SafePermissionPolicySet,\n): PermissionPolicySet =>\n new PermissionPolicySet(\n policySet.addMemberPolicy,\n policySet.removeMemberPolicy,\n policySet.addAdminPolicy,\n policySet.removeAdminPolicy,\n policySet.updateGroupNamePolicy,\n policySet.updateGroupDescriptionPolicy,\n policySet.updateGroupImageUrlSquarePolicy,\n policySet.updateMessageDisappearingPolicy,\n );\n\nexport type SafeCreateGroupOptions = {\n customPermissionPolicySet?: SafePermissionPolicySet;\n description?: string;\n imageUrlSquare?: string;\n messageDisappearingSettings?: SafeMessageDisappearingSettings;\n name?: string;\n permissions?: GroupPermissionsOptions;\n};\n\nexport const toSafeCreateGroupOptions = (\n options: CreateGroupOptions,\n): SafeCreateGroupOptions => ({\n customPermissionPolicySet: options.customPermissionPolicySet,\n description: options.groupDescription,\n imageUrlSquare: options.groupImageUrlSquare,\n messageDisappearingSettings: options.messageDisappearingSettings\n ? toSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n name: options.groupName,\n permissions: options.permissions,\n});\n\nexport const fromSafeCreateGroupOptions = (\n options: SafeCreateGroupOptions,\n): CreateGroupOptions =>\n new CreateGroupOptions(\n options.permissions,\n options.name,\n options.imageUrlSquare,\n options.description,\n // only include custom policy set if permissions are set to CustomPolicy\n options.customPermissionPolicySet &&\n options.permissions === GroupPermissionsOptions.CustomPolicy\n ? fromSafePermissionPolicySet(options.customPermissionPolicySet)\n : undefined,\n options.messageDisappearingSettings\n ? fromSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n );\n\nexport type SafeCreateDmOptions = {\n messageDisappearingSettings?: SafeMessageDisappearingSettings;\n};\n\nexport const toSafeCreateDmOptions = (\n options: CreateDMOptions,\n): SafeCreateDmOptions => ({\n messageDisappearingSettings: options.messageDisappearingSettings\n ? toSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n});\n\nexport const fromSafeCreateDmOptions = (\n options: SafeCreateDmOptions,\n): CreateDMOptions =>\n new CreateDMOptions(\n options.messageDisappearingSettings\n ? fromSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n );\n\nexport type SafeConversation = {\n id: string;\n name: string;\n imageUrl: string;\n description: string;\n permissions: {\n policyType: GroupPermissionsOptions;\n policySet: {\n addAdminPolicy: PermissionPolicy;\n addMemberPolicy: PermissionPolicy;\n removeAdminPolicy: PermissionPolicy;\n removeMemberPolicy: PermissionPolicy;\n updateGroupDescriptionPolicy: PermissionPolicy;\n updateGroupImageUrlSquarePolicy: PermissionPolicy;\n updateGroupNamePolicy: PermissionPolicy;\n updateMessageDisappearingPolicy: PermissionPolicy;\n };\n };\n isActive: boolean;\n addedByInboxId: string;\n metadata: {\n creatorInboxId: string;\n conversationType: string;\n };\n admins: string[];\n superAdmins: string[];\n createdAtNs: bigint;\n};\n\nexport const toSafeConversation = async (\n conversation: WorkerConversation,\n): Promise<SafeConversation> => {\n const id = conversation.id;\n const name = conversation.name;\n const imageUrl = conversation.imageUrl;\n const description = conversation.description;\n const permissions = conversation.permissions;\n const isActive = conversation.isActive;\n const addedByInboxId = conversation.addedByInboxId;\n const metadata = await conversation.metadata();\n const admins = conversation.admins;\n const superAdmins = conversation.superAdmins;\n const createdAtNs = conversation.createdAtNs;\n const policyType = permissions.policyType;\n const policySet = permissions.policySet;\n return {\n id,\n name,\n imageUrl,\n description,\n permissions: {\n policyType,\n policySet: {\n addAdminPolicy: policySet.addAdminPolicy,\n addMemberPolicy: policySet.addMemberPolicy,\n removeAdminPolicy: policySet.removeAdminPolicy,\n removeMemberPolicy: policySet.removeMemberPolicy,\n updateGroupDescriptionPolicy: policySet.updateGroupDescriptionPolicy,\n updateGroupImageUrlSquarePolicy:\n policySet.updateGroupImageUrlSquarePolicy,\n updateGroupNamePolicy: policySet.updateGroupNamePolicy,\n updateMessageDisappearingPolicy:\n policySet.updateMessageDisappearingPolicy,\n },\n },\n isActive,\n addedByInboxId,\n metadata,\n admins,\n superAdmins,\n createdAtNs,\n };\n};\n\nexport type SafeInstallation = {\n bytes: Uint8Array;\n clientTimestampNs?: bigint;\n id: string;\n};\n\nexport const toSafeInstallation = (\n installation: Installation,\n): SafeInstallation => ({\n bytes: installation.bytes,\n clientTimestampNs: installation.clientTimestampNs,\n id: installation.id,\n});\n\nexport type SafeInboxState = {\n accountAddresses: string[];\n inboxId: string;\n installations: SafeInstallation[];\n recoveryAddress: string;\n};\n\nexport const toSafeInboxState = (inboxState: InboxState): SafeInboxState => ({\n accountAddresses: inboxState.accountAddresses,\n inboxId: inboxState.inboxId,\n installations: inboxState.installations.map(toSafeInstallation),\n recoveryAddress: inboxState.recoveryAddress,\n});\n\nexport type SafeConsent = {\n entity: string;\n entityType: ConsentEntityType;\n state: ConsentState;\n};\n\nexport const toSafeConsent = (consent: Consent): SafeConsent => ({\n entity: consent.entity,\n entityType: consent.entityType,\n state: consent.state,\n});\n\nexport const fromSafeConsent = (consent: SafeConsent): Consent =>\n new Consent(consent.entityType, consent.state, consent.entity);\n\nexport type SafeGroupMember = {\n accountAddresses: string[];\n consentState: ConsentState;\n inboxId: string;\n installationIds: string[];\n permissionLevel: PermissionLevel;\n};\n\nexport const toSafeGroupMember = (member: GroupMember): SafeGroupMember => ({\n accountAddresses: member.accountAddresses,\n consentState: member.consentState,\n inboxId: member.inboxId,\n installationIds: member.installationIds,\n permissionLevel: member.permissionLevel,\n});\n\nexport const fromSafeGroupMember = (member: SafeGroupMember): GroupMember =>\n new GroupMember(\n member.inboxId,\n member.accountAddresses,\n member.installationIds,\n member.permissionLevel,\n member.consentState,\n );\n\nexport type SafeHmacKey = {\n key: Uint8Array;\n epoch: bigint;\n};\n\nexport const toSafeHmacKey = (hmacKey: HmacKey): SafeHmacKey => ({\n key: hmacKey.key,\n epoch: hmacKey.epoch,\n});\n\nexport type HmacKeys = Map<string, HmacKey[]>;\nexport type SafeHmacKeys = Record<string, SafeHmacKey[]>;\n\nexport type SafeMessageDisappearingSettings = {\n fromNs: bigint;\n inNs: bigint;\n};\n\nexport const toSafeMessageDisappearingSettings = (\n settings: MessageDisappearingSettings,\n): SafeMessageDisappearingSettings => ({\n fromNs: settings.fromNs,\n inNs: settings.inNs,\n});\n\nexport const fromSafeMessageDisappearingSettings = (\n settings: SafeMessageDisappearingSettings,\n): MessageDisappearingSettings =>\n new MessageDisappearingSettings(settings.fromNs, settings.inNs);\n","import type { ContentTypeId } from \"@xmtp/content-type-primitives\";\nimport { DeliveryStatus, GroupMessageKind } from \"@xmtp/wasm-bindings\";\nimport type { Client } from \"@/Client\";\nimport { fromSafeContentTypeId, type SafeMessage } from \"@/utils/conversions\";\n\nexport type MessageKind = \"application\" | \"membership_change\";\nexport type MessageDeliveryStatus = \"unpublished\" | \"published\" | \"failed\";\n\nexport class DecodedMessage {\n #client: Client;\n\n content: any;\n\n contentType: ContentTypeId;\n\n conversationId: string;\n\n deliveryStatus: MessageDeliveryStatus;\n\n fallback?: string;\n\n compression?: number;\n\n id: string;\n\n kind: MessageKind;\n\n parameters: Map<string, string>;\n\n encodedContent: SafeMessage[\"content\"];\n\n senderInboxId: string;\n\n sentAtNs: bigint;\n\n constructor(client: Client, message: SafeMessage) {\n this.#client = client;\n this.id = message.id;\n this.sentAtNs = message.sentAtNs;\n this.conversationId = message.convoId;\n this.senderInboxId = message.senderInboxId;\n this.encodedContent = message.content;\n\n switch (message.kind) {\n case GroupMessageKind.Application:\n this.kind = \"application\";\n break;\n case GroupMessageKind.MembershipChange:\n this.kind = \"membership_change\";\n break;\n // no default\n }\n\n switch (message.deliveryStatus) {\n case DeliveryStatus.Unpublished:\n this.deliveryStatus = \"unpublished\";\n break;\n case DeliveryStatus.Published:\n this.deliveryStatus = \"published\";\n break;\n case DeliveryStatus.Failed:\n this.deliveryStatus = \"failed\";\n break;\n // no default\n }\n\n this.contentType = fromSafeContentTypeId(message.content.type);\n this.parameters = new Map(Object.entries(message.content.parameters));\n this.fallback = message.content.fallback;\n this.compression = message.content.compression;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this.content = this.#client.decodeContent(message, this.contentType);\n }\n}\n","import type { ContentTypeId } from \"@xmtp/content-type-primitives\";\nimport { ContentTypeText } from \"@xmtp/content-type-text\";\nimport type {\n ConsentState,\n MetadataField,\n PermissionPolicy,\n PermissionUpdateType,\n} from \"@xmtp/wasm-bindings\";\nimport { v4 } from \"uuid\";\nimport { AsyncStream, type StreamCallback } from \"@/AsyncStream\";\nimport type { Client } from \"@/Client\";\nimport { DecodedMessage } from \"@/DecodedMessage\";\nimport type {\n SafeConversation,\n SafeListMessagesOptions,\n SafeMessage,\n} from \"@/utils/conversions\";\nimport { nsToDate } from \"@/utils/date\";\n\nexport class Conversation {\n #client: Client;\n\n #id: string;\n\n #name?: SafeConversation[\"name\"];\n\n #imageUrl?: SafeConversation[\"imageUrl\"];\n\n #description?: SafeConversation[\"description\"];\n\n #isActive?: SafeConversation[\"isActive\"];\n\n #addedByInboxId?: SafeConversation[\"addedByInboxId\"];\n\n #metadata?: SafeConversation[\"metadata\"];\n\n #createdAtNs?: SafeConversation[\"createdAtNs\"];\n\n #admins: SafeConversation[\"admins\"] = [];\n\n #superAdmins: SafeConversation[\"superAdmins\"] = [];\n\n constructor(client: Client, id: string, data?: SafeConversation) {\n this.#client = client;\n this.#id = id;\n this.#syncData(data);\n }\n\n #syncData(data?: SafeConversation) {\n this.#name = data?.name ?? \"\";\n this.#imageUrl = data?.imageUrl ?? \"\";\n this.#description = data?.description ?? \"\";\n this.#isActive = data?.isActive ?? undefined;\n this.#addedByInboxId = data?.addedByInboxId ?? \"\";\n this.#metadata = data?.metadata ?? undefined;\n this.#createdAtNs = data?.createdAtNs ?? undefined;\n this.#admins = data?.admins ?? [];\n this.#superAdmins = data?.superAdmins ?? [];\n }\n\n get id() {\n return this.#id;\n }\n\n get name() {\n return this.#name;\n }\n\n async updateName(name: string) {\n await this.#client.sendMessage(\"updateGroupName\", {\n id: this.#id,\n name,\n });\n this.#name = name;\n }\n\n get imageUrl() {\n return this.#imageUrl;\n }\n\n async updateImageUrl(imageUrl: string) {\n await this.#client.sendMessage(\"updateGroupImageUrlSquare\", {\n id: this.#id,\n imageUrl,\n });\n this.#imageUrl = imageUrl;\n }\n\n get description() {\n return this.#description;\n }\n\n async updateDescription(description: string) {\n await this.#client.sendMessage(\"updateGroupDescription\", {\n id: this.#id,\n description,\n });\n this.#description = description;\n }\n\n get isActive() {\n return this.#isActive;\n }\n\n get addedByInboxId() {\n return this.#addedByInboxId;\n }\n\n get createdAtNs() {\n return this.#createdAtNs;\n }\n\n get createdAt() {\n return this.#createdAtNs ? nsToDate(this.#createdAtNs) : undefined;\n }\n\n get metadata() {\n return this.#metadata;\n }\n\n async members() {\n return this.#client.sendMessage(\"getGroupMembers\", {\n id: this.#id,\n });\n }\n\n get admins() {\n return this.#admins;\n }\n\n get superAdmins() {\n return this.#superAdmins;\n }\n\n async syncAdmins() {\n const admins = await this.#client.sendMessage(\"getGroupAdmins\", {\n id: this.#id,\n });\n this.#admins = admins;\n }\n\n async syncSuperAdmins() {\n const superAdmins = await this.#client.sendMessage(\"getGroupSuperAdmins\", {\n id: this.#id,\n });\n this.#superAdmins = superAdmins;\n }\n\n async permissions() {\n return this.#client.sendMessage(\"getGroupPermissions\", {\n id: this.#id,\n });\n }\n\n async updatePermission(\n permissionType: PermissionUpdateType,\n policy: PermissionPolicy,\n metadataField?: MetadataField,\n ) {\n return this.#client.sendMessage(\"updateGroupPermissionPolicy\", {\n id: this.#id,\n permissionType,\n policy,\n metadataField,\n });\n }\n\n async isAdmin(inboxId: string) {\n await this.syncAdmins();\n return this.#admins.includes(inboxId);\n }\n\n async isSuperAdmin(inboxId: string) {\n await this.syncSuperAdmins();\n return this.#superAdmins.includes(inboxId);\n }\n\n async sync() {\n const data = await this.#client.sendMessage(\"syncGroup\", {\n id: this.#id,\n });\n this.#syncData(data);\n }\n\n async addMembers(accountAddresses: string[]) {\n return this.#client.sendMessage(\"addGroupMembers\", {\n id: this.#id,\n accountAddresses,\n });\n }\n\n async addMembersByInboxId(inboxIds: string[]) {\n return this.#client.sendMessage(\"addGroupMembersByInboxId\", {\n id: this.#id,\n inboxIds,\n });\n }\n\n async removeMembers(accountAddresses: string[]) {\n return this.#client.sendMessage(\"removeGroupMembers\", {\n id: this.#id,\n accountAddresses,\n });\n }\n\n async removeMembersByInboxId(inboxIds: string[]) {\n return this.#client.sendMessage(\"removeGroupMembersByInboxId\", {\n id: this.#id,\n inboxIds,\n });\n }\n\n async addAdmin(inboxId: string) {\n return this.#client.sendMessage(\"addGroupAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async removeAdmin(inboxId: string) {\n return this.#client.sendMessage(\"removeGroupAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async addSuperAdmin(inboxId: string) {\n return this.#client.sendMessage(\"addGroupSuperAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async removeSuperAdmin(inboxId: string) {\n return this.#client.sendMessage(\"removeGroupSuperAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async publishMessages() {\n return this.#client.sendMessage(\"publishGroupMessages\", {\n id: this.#id,\n });\n }\n\n async sendOptimistic(content: any, contentType?: ContentTypeId) {\n if (typeof content !== \"string\" && !contentType) {\n throw new Error(\n \"Content type is required when sending content other than text\",\n );\n }\n\n const safeEncodedContent =\n typeof content === \"string\"\n ? this.#client.encodeContent(content, contentType ?? ContentTypeText)\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#client.encodeContent(content, contentType!);\n\n return this.#client.sendMessage(\"sendOptimisticGroupMessage\", {\n id: this.#id,\n content: safeEncodedContent,\n });\n }\n\n async send(content: any, contentType?: ContentTypeId) {\n if (typeof content !== \"string\" && !contentType) {\n throw new Error(\n \"Content type is required when sending content other than text\",\n );\n }\n\n const safeEncodedContent =\n typeof content === \"string\"\n ? this.#client.encodeContent(content, contentType ?? ContentTypeText)\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#client.encodeContent(content, contentType!);\n\n return this.#client.sendMessage(\"sendGroupMessage\", {\n id: this.#id,\n content: safeEncodedContent,\n });\n }\n\n async messages(options?: SafeListMessagesOptions) {\n const messages = await this.#client.sendMessage(\"getGroupMessages\", {\n id: this.#id,\n options,\n });\n\n return messages.map((message) => new DecodedMessage(this.#client, message));\n }\n\n async consentState() {\n return this.#client.sendMessage(\"getGroupConsentState\", {\n id: this.#id,\n });\n }\n\n async updateConsentState(state: ConsentState) {\n return this.#client.sendMessage(\"updateGroupConsentState\", {\n id: this.#id,\n state,\n });\n }\n\n async dmPeerInboxId() {\n return this.#client.sendMessage(\"getDmPeerInboxId\", {\n id: this.#id,\n });\n }\n\n async messageDisappearingSettings() {\n return this.#client.sendMessage(\"getGroupMessageDisappearingSettings\", {\n id: this.#id,\n });\n }\n\n async updateMessageDisappearingSettings(fromNs: bigint, inNs: bigint) {\n return this.#client.sendMessage(\"updateGroupMessageDisappearingSettings\", {\n id: this.#id,\n fromNs,\n inNs,\n });\n }\n\n async removeMessageDisappearingSettings() {\n return this.#client.sendMessage(\"removeGroupMessageDisappearingSettings\", {\n id: this.#id,\n });\n }\n\n async isMessageDisappearingEnabled() {\n return this.#client.sendMessage(\"isGroupMessageDisappearingEnabled\", {\n id: this.#id,\n });\n }\n\n async stream(callback?: StreamCallback<DecodedMessage>) {\n const streamId = v4();\n const asyncStream = new AsyncStream<DecodedMessage>();\n const endStream = this.#client.handleStreamMessage<SafeMessage>(\n streamId,\n (error, value) => {\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(error, decodedMessage);\n void callback?.(error, decodedMessage);\n },\n );\n await this.#client.sendMessage(\"streamGroupMessages\", {\n groupId: this.#id,\n streamId,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n}\n","export function nsToDate(ns: bigint): Date {\n return new Date(Number(ns / 1_000_000n));\n}\n","import { ConversationType, type ConsentState } from \"@xmtp/wasm-bindings\";\nimport { v4 } from \"uuid\";\nimport { AsyncStream, type StreamCallback } from \"@/AsyncStream\";\nimport type { Client } from \"@/Client\";\nimport { Conversation } from \"@/Conversation\";\nimport { DecodedMessage } from \"@/DecodedMessage\";\nimport type {\n SafeConversation,\n SafeCreateDmOptions,\n SafeCreateGroupOptions,\n SafeListConversationsOptions,\n SafeMessage,\n} from \"@/utils/conversions\";\n\nexport class Conversations {\n #client: Client;\n\n constructor(client: Client) {\n this.#client = client;\n }\n\n async sync() {\n return this.#client.sendMessage(\"syncConversations\", undefined);\n }\n\n async syncAll(consentStates?: ConsentState[]) {\n return this.#client.sendMessage(\"syncAllConversations\", {\n consentStates,\n });\n }\n\n async getConversationById(id: string) {\n const data = await this.#client.sendMessage(\"getConversationById\", {\n id,\n });\n return data ? new Conversation(this.#client, id, data) : undefined;\n }\n\n async getMessageById(id: string) {\n const data = await this.#client.sendMessage(\"getMessageById\", {\n id,\n });\n return data ? new DecodedMessage(this.#client, data) : undefined;\n }\n\n async getDmByInboxId(inboxId: string) {\n const data = await this.#client.sendMessage(\"getDmByInboxId\", {\n inboxId,\n });\n return data ? new Conversation(this.#client, data.id, data) : undefined;\n }\n\n async list(options?: SafeListConversationsOptions) {\n const conversations = await this.#client.sendMessage(\"getConversations\", {\n options,\n });\n\n return conversations.map(\n (conversation) =>\n new Conversation(this.#client, conversation.id, conversation),\n );\n }\n\n async listGroups(\n options?: Omit<SafeListConversationsOptions, \"conversation_type\">,\n ) {\n const conversations = await this.#client.sendMessage(\"getGroups\", {\n options,\n });\n\n return conversations.map(\n (conversation) =>\n new Conversation(this.#client, conversation.id, conversation),\n );\n }\n\n async listDms(\n options?: Omit<SafeListConversationsOptions, \"conversation_type\">,\n ) {\n const conversations = await this.#client.sendMessage(\"getDms\", {\n options,\n });\n\n return conversations.map(\n (conversation) =>\n new Conversation(this.#client, conversation.id, conversation),\n );\n }\n\n async newGroup(accountAddresses: string[], options?: SafeCreateGroupOptions) {\n const conversation = await this.#client.sendMessage(\"newGroup\", {\n accountAddresses,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async newGroupByInboxIds(\n inboxIds: string[],\n options?: SafeCreateGroupOptions,\n ) {\n const conversation = await this.#client.sendMessage(\"newGroupByInboxIds\", {\n inboxIds,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async newDm(accountAddress: string, options?: SafeCreateDmOptions) {\n const conversation = await this.#client.sendMessage(\"newDm\", {\n accountAddress,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async newDmByInboxId(inboxId: string, options?: SafeCreateDmOptions) {\n const conversation = await this.#client.sendMessage(\"newDmByInboxId\", {\n inboxId,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async getHmacKeys() {\n return this.#client.sendMessage(\"getHmacKeys\", undefined);\n }\n\n async stream(\n callback?: StreamCallback<Conversation>,\n conversationType?: ConversationType,\n ) {\n const streamId = v4();\n const asyncStream = new AsyncStream<Conversation>();\n const endStream = this.#client.handleStreamMessage<SafeConversation>(\n streamId,\n (error, value) => {\n const conversation = value\n ? new Conversation(this.#client, value.id, value)\n : undefined;\n void asyncStream.callback(error, conversation);\n void callback?.(error, conversation);\n },\n );\n await this.#client.sendMessage(\"streamAllGroups\", {\n streamId,\n conversationType,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n\n async streamGroups(callback?: StreamCallback<Conversation>) {\n return this.stream(callback, ConversationType.Group);\n }\n\n async streamDms(callback?: StreamCallback<Conversation>) {\n return this.stream(callback, ConversationType.Dm);\n }\n\n async streamAllMessages(\n callback?: StreamCallback<DecodedMessage>,\n conversationType?: ConversationType,\n ) {\n const streamId = v4();\n const asyncStream = new AsyncStream<DecodedMessage>();\n const endStream = this.#client.handleStreamMessage<SafeMessage>(\n streamId,\n (error, value) => {\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(error, decodedMessage);\n void callback?.(error, decodedMessage);\n },\n );\n await this.#client.sendMessage(\"streamAllMessages\", {\n streamId,\n conversationType,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n\n async streamAllGroupMessages(callback?: StreamCallback<DecodedMessage>) {\n return this.streamAllMessages(callback, ConversationType.Group);\n }\n\n async streamAllDmMessages(callback?: StreamCallback<DecodedMessage>) {\n return this.streamAllMessages(callback, ConversationType.Dm);\n }\n}\n","export type SignMessage = (message: string) => Promise<Uint8Array> | Uint8Array;\nexport type GetAddress = () => Promise<string> | string;\nexport type GetChainId = () => bigint;\nexport type GetBlockNumber = () => bigint;\nexport type WalletType = () => \"EOA\" | \"SCW\";\n\nexport type Signer = {\n getAddress: GetAddress;\n signMessage: SignMessage;\n walletType?: WalletType;\n getBlockNumber?: GetBlockNumber;\n getChainId?: GetChainId;\n};\n\nexport type SmartContractSigner = Required<Signer>;\n\nexport const isSmartContractSigner = (\n signer: Signer,\n): signer is SmartContractSigner => signer.walletType?.() === \"SCW\";\n","import {\n ContentTypeGroupUpdated,\n GroupUpdatedCodec,\n} from \"@xmtp/content-type-group-updated\";\nimport type {\n ContentCodec,\n ContentTypeId,\n} from \"@xmtp/content-type-primitives\";\nimport { TextCodec } from \"@xmtp/content-type-text\";\nimport {\n GroupMessageKind,\n SignatureRequestType,\n type ConsentEntityType,\n} from \"@xmtp/wasm-bindings\";\nimport { ClientWorkerClass } from \"@/ClientWorkerClass\";\nimport { Conversations } from \"@/Conversations\";\nimport type { ClientOptions, XmtpEnv } from \"@/types\";\nimport {\n fromSafeEncodedContent,\n toSafeEncodedContent,\n type SafeConsent,\n type SafeMessage,\n} from \"@/utils/conversions\";\nimport { isSmartContractSigner, type Signer } from \"@/utils/signer\";\n\nexport class Client extends ClientWorkerClass {\n #accountAddress: string;\n #codecs: Map<string, ContentCodec>;\n #conversations: Conversations;\n #encryptionKey: Uint8Array;\n #inboxId: string | undefined;\n #installationId: string | undefined;\n #installationIdBytes: Uint8Array | undefined;\n #isReady = false;\n #signer: Signer;\n options?: ClientOptions;\n\n constructor(\n signer: Signer,\n accountAddress: string,\n encryptionKey: Uint8Array,\n options?: ClientOptions,\n ) {\n const worker = new Worker(new URL(\"./workers/client\", import.meta.url), {\n type: \"module\",\n });\n super(\n worker,\n options?.loggingLevel !== undefined && options.loggingLevel !== \"off\",\n );\n this.#accountAddress = accountAddress;\n this.options = options;\n this.#encryptionKey = encryptionKey;\n this.#signer = signer;\n this.#conversations = new Conversations(this);\n const codecs = [\n new GroupUpdatedCodec(),\n new TextCodec(),\n ...(options?.codecs ?? []),\n ];\n this.#codecs = new Map(\n codecs.map((codec) => [codec.contentType.toString(), codec]),\n );\n }\n\n get accountAddress() {\n return this.#accountAddress;\n }\n\n async init() {\n const result = await this.sendMessage(\"init\", {\n address: this.accountAddress,\n encryptionKey: this.#encryptionKey,\n options: this.options,\n });\n this.#inboxId = result.inboxId;\n this.#installationId = result.installationId;\n this.#installationIdBytes = result.installationIdBytes;\n this.#isReady = true;\n }\n\n static async create(\n signer: Signer,\n encryptionKey: Uint8Array,\n options?: ClientOptions,\n ) {\n const address = await signer.getAddress();\n const client = new Client(signer, address, encryptionKey, options);\n\n await client.init();\n\n if (!options?.disableAutoRegister) {\n await client.register();\n }\n\n return client;\n }\n\n get isReady() {\n return this.#isReady;\n }\n\n get inboxId() {\n return this.#inboxId;\n }\n\n get installationId() {\n return this.#installationId;\n }\n\n get installationIdBytes() {\n return this.#installationIdBytes;\n }\n\n async #createInboxSignatureText() {\n return this.sendMessage(\"createInboxSignatureText\", undefined);\n }\n\n async #addAccountSignatureText(newAccountAddress: string) {\n return this.sendMessage(\"addAccountSignatureText\", {\n newAccountAddress,\n });\n }\n\n async #removeAccountSignatureText(accountAddress: string) {\n return this.sendMessage(\"removeAccountSignatureText\", { accountAddress });\n }\n\n async #revokeAllOtherInstallationsSignatureText() {\n return this.sendMessage(\n \"revokeAllOtherInstallationsSignatureText\",\n undefined,\n );\n }\n\n async #revokeInstallationsSignatureText(installationIds: Uint8Array[]) {\n return this.sendMessage(\"revokeInstallationsSignatureText\", {\n installationIds,\n });\n }\n\n async #addSignature(\n signatureType: SignatureRequestType,\n signatureText: string,\n signer: Signer,\n ) {\n const signature = await signer.signMessage(signatureText);\n\n if (isSmartContractSigner(signer)) {\n await this.sendMessage(\"addScwSignature\", {\n type: signatureType,\n bytes: signature,\n chainId: signer.getChainId(),\n blockNumber: signer.getBlockNumber(),\n });\n } else {\n await this.sendMessage(\"addSignature\", {\n type: signatureType,\n bytes: signature,\n });\n }\n }\n\n async #applySignatures() {\n return this.sendMessage(\"applySignatures\", undefined);\n }\n\n async register() {\n const signatureText = await this.#createInboxSignatureText();\n\n // if the signature text is not available, the client is already registered\n if (!signatureText) {\n return;\n }\n\n await this.#addSignature(\n SignatureRequestType.CreateInbox,\n signatureText,\n this.#signer,\n );\n\n return this.sendMessage(\"registerIdentity\", undefined);\n }\n\n async addAccount(newAccountSigner: Signer) {\n const signatureText = await this.#addAccountSignatureText(\n await newAccountSigner.getAddress(),\n );\n\n if (!signatureText) {\n throw new Error(\"Unable to generate add account signature text\");\n }\n\n await this.#addSignature(\n SignatureRequestType.AddWallet,\n signatureText,\n newAccountSigner,\n );\n\n await this.#applySignatures();\n }\n\n async removeAccount(accountAddress: string) {\n const signatureText =\n await this.#removeAccountSignatureText(accountAddress);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate remove account signature text\");\n }\n\n await this.#addSignature(\n SignatureRequestType.RevokeWallet,\n signatureText,\n this.#signer,\n );\n\n await this.#applySignatures();\n }\n\n async revokeAllOtherInstallations() {\n const signatureText =\n await this.#revokeAllOtherInstallationsSignatureText();\n\n if (!signatureText) {\n throw new Error(\n \"Unable to generate revoke all other installations signature text\",\n );\n }\n\n await this.#addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.#applySignatures();\n }\n\n async revokeInstallations(installationIds: Uint8Array[]) {\n const signatureText =\n await this.#revokeInstallationsSignatureText(installationIds);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate revoke installations signature text\");\n }\n\n await this.#addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.#applySignatures();\n }\n\n async isRegistered() {\n return this.sendMessage(\"isRegistered\", undefined);\n }\n\n async canMessage(accountAddresses: string[]) {\n return this.sendMessage(\"canMessage\", { accountAddresses });\n }\n\n static async canMessage(accountAddresses: string[], env?: XmtpEnv) {\n const accountAddress = \"0x0000000000000000000000000000000000000000\";\n const signer: Signer = {\n getAddress: () => accountAddress,\n signMessage: () => new Uint8Array(),\n };\n const client = await Client.create(\n signer,\n window.crypto.getRandomValues(new Uint8Array(32)),\n {\n disableAutoRegister: true,\n env,\n },\n );\n return client.canMessage(accountAddresses);\n }\n\n async findInboxIdByAddress(address: string) {\n return this.sendMessage(\"findInboxIdByAddress\", { address });\n }\n\n async inboxState(refreshFromNetwork?: boolean) {\n return this.sendMessage(\"inboxState\", {\n refreshFromNetwork: refreshFromNetwork ?? false,\n });\n }\n\n async getLatestInboxState(inboxId: string) {\n return this.sendMessage(\"getLatestInboxState\", { inboxId });\n }\n\n async setConsentStates(records: SafeConsent[]) {\n return this.sendMessage(\"setConsentStates\", { records });\n }\n\n async getConsentState(entityType: ConsentEntityType, entity: string) {\n return this.sendMessage(\"getConsentState\", { entityType, entity });\n }\n\n get conversations() {\n return this.#conversations;\n }\n\n codecFor(contentType: ContentTypeId) {\n return this.#codecs.get(contentType.toString());\n }\n\n encodeContent(content: any, contentType: ContentTypeId) {\n const codec = this.codecFor(contentType);\n if (!codec) {\n throw new Error(\n `Codec not found for \"${contentType.toString()}\" content type`,\n );\n }\n const encoded = codec.encode(content, this);\n const fallback = codec.fallback(content);\n if (fallback) {\n encoded.fallback = fallback;\n }\n return toSafeEncodedContent(encoded);\n }\n\n decodeContent(message: SafeMessage, contentType: ContentTypeId) {\n const codec = this.codecFor(contentType);\n if (!codec) {\n throw new Error(\n `Codec not found for \"${contentType.toString()}\" content type`,\n );\n }\n\n // throw an error if there's an invalid group membership change message\n if (\n contentType.sameAs(ContentTypeGroupUpdated) &&\n message.kind !== GroupMessageKind.MembershipChange\n ) {\n throw new Error(\"Error decoding group membership change\");\n }\n\n const encodedContent = fromSafeEncodedContent(message.content);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return codec.decode(encodedContent, this);\n }\n\n signWithInstallationKey(signatureText: string) {\n return this.sendMessage(\"signWithInstallationKey\", { signatureText });\n }\n\n verifySignedWithInstallationKey(\n signatureText: string,\n signatureBytes: Uint8Array,\n ) {\n return this.sendMessage(\"verifySignedWithInstallationKey\", {\n signatureText,\n signatureBytes,\n });\n }\n\n verifySignedWithPublicKey(\n signatureText: string,\n signatureBytes: Uint8Array,\n publicKey: Uint8Array,\n ) {\n return this.sendMessage(\"verifySignedWithPublicKey\", {\n signatureText,\n signatureBytes,\n publicKey,\n });\n }\n}\n","import { v4 } from \"uuid\";\nimport type {\n UtilsEventsActions,\n UtilsEventsErrorData,\n UtilsEventsResult,\n UtilsEventsWorkerMessageData,\n UtilsSendMessageData,\n} from \"@/types\";\n\nconst handleError = (event: ErrorEvent) => {\n console.error(`Worker error on line ${event.lineno} in \"${event.filename}\"`);\n console.error(event.message);\n};\n\nexport class UtilsWorkerClass {\n #worker: Worker;\n\n #enableLogging: boolean;\n\n #promises = new Map<\n string,\n { resolve: (value: any) => void; reject: (reason?: any) => void }\n >();\n\n constructor(worker: Worker, enableLogging: boolean) {\n this.#worker = worker;\n this.#worker.addEventListener(\"message\", this.handleMessage);\n this.#worker.addEventListener(\"error\", handleError);\n this.#enableLogging = enableLogging;\n }\n\n sendMessage<A extends UtilsEventsActions>(\n action: A,\n data: UtilsSendMessageData<A>,\n ) {\n const promiseId = v4();\n this.#worker.postMessage({\n action,\n id: promiseId,\n data,\n });\n const promise = new Promise<UtilsEventsResult<A>>((resolve, reject) => {\n this.#promises.set(promiseId, { resolve, reject });\n });\n return promise;\n }\n\n handleMessage = (\n event: MessageEvent<UtilsEventsWorkerMessageData | UtilsEventsErrorData>,\n ) => {\n const eventData = event.data;\n if (this.#enableLogging) {\n console.log(\"utils received event data\", eventData);\n }\n const promise = this.#promises.get(eventData.id);\n if (promise) {\n this.#promises.delete(eventData.id);\n if (\"error\" in eventData) {\n promise.reject(new Error(eventData.error));\n } else {\n promise.resolve(eventData.result);\n }\n }\n };\n\n close() {\n this.#worker.removeEventListener(\"message\", this.handleMessage);\n this.#worker.removeEventListener(\"error\", handleError);\n this.#worker.terminate();\n }\n}\n","import type { XmtpEnv } from \"@/types/options\";\nimport { UtilsWorkerClass } from \"@/UtilsWorkerClass\";\n\nexport class Utils extends UtilsWorkerClass {\n #enableLogging: boolean;\n constructor(enableLogging?: boolean) {\n const worker = new Worker(new URL(\"./workers/utils\", import.meta.url), {\n type: \"module\",\n });\n super(worker, enableLogging ?? false);\n this.#enableLogging = enableLogging ?? false;\n }\n\n async generateInboxId(address: string) {\n return this.sendMessage(\"generateInboxId\", {\n address,\n enableLogging: this.#enableLogging,\n });\n }\n\n async getInboxIdForAddress(address: string, env?: XmtpEnv) {\n return this.sendMessage(\"getInboxIdForAddress\", {\n address,\n env,\n enableLogging: this.#enableLogging,\n });\n }\n}\n","export const ApiUrls = {\n local: \"http://localhost:5555\",\n dev: \"https://dev.xmtp.network\",\n production: \"https://production.xmtp.network\",\n} as const;\n\nexport const HistorySyncUrls = {\n local: \"http://localhost:5558\",\n dev: \"https://message-history.dev.ephemera.network\",\n production: \"https://message-history.production.ephemera.network\",\n} as const;\n"],"names":["handleError","event","console","error","lineno","filename","message","ClientWorkerClass","worker","enableLogging","promises","Map","constructor","this","addEventListener","handleMessage","sendMessage","action","data","promiseId","v4","postMessage","id","Promise","resolve","reject","set","eventData","log","promise","get","delete","Error","result","handleStreamMessage","streamId","callback","streamHandler","removeEventListener","close","terminate","AsyncStream","done","resolveNext","queue","onReturn","undefined","isDone","value","push","next","length","shift","return","Symbol","asyncIterator","toContentTypeId","contentTypeId","ContentTypeId","authorityId","typeId","versionMajor","versionMinor","fromContentTypeId","WasmContentTypeId","toSafeContentTypeId","fromSafeContentTypeId","toEncodedContent","content","type","parameters","Object","fromEntries","fallback","compression","fromEncodedContent","WasmEncodedContent","entries","toSafeEncodedContent","fromSafeEncodedContent","toSafeMessage","convoId","deliveryStatus","kind","senderInboxId","sentAtNs","toSafeListMessagesOptions","options","direction","limit","sentAfterNs","sentBeforeNs","fromSafeListMessagesOptions","ListMessagesOptions","toSafeListConversationsOptions","allowedStates","consentStates","conversationType","createdAfterNs","createdBeforeNs","includeDuplicateDms","includeSyncGroups","fromSafeListConversationsOptions","ListConversationsOptions","toSafePermissionPolicySet","policySet","addAdminPolicy","addMemberPolicy","removeAdminPolicy","removeMemberPolicy","updateGroupDescriptionPolicy","updateGroupImageUrlSquarePolicy","updateGroupNamePolicy","updateMessageDisappearingPolicy","fromSafePermissionPolicySet","PermissionPolicySet","toSafeCreateGroupOptions","customPermissionPolicySet","description","groupDescription","imageUrlSquare","groupImageUrlSquare","messageDisappearingSettings","toSafeMessageDisappearingSettings","name","groupName","permissions","fromSafeCreateGroupOptions","CreateGroupOptions","GroupPermissionsOptions","CustomPolicy","fromSafeMessageDisappearingSettings","toSafeCreateDmOptions","fromSafeCreateDmOptions","CreateDMOptions","toSafeConversation","async","conversation","imageUrl","isActive","addedByInboxId","metadata","admins","superAdmins","createdAtNs","policyType","toSafeInstallation","installation","bytes","clientTimestampNs","toSafeInboxState","inboxState","accountAddresses","inboxId","installations","map","recoveryAddress","toSafeConsent","consent","entity","entityType","state","fromSafeConsent","Consent","toSafeGroupMember","member","consentState","installationIds","permissionLevel","fromSafeGroupMember","GroupMember","toSafeHmacKey","hmacKey","key","epoch","settings","fromNs","inNs","MessageDisappearingSettings","DecodedMessage","client","contentType","conversationId","encodedContent","GroupMessageKind","Application","MembershipChange","DeliveryStatus","Unpublished","Published","Failed","decodeContent","Conversation","syncData","updateName","updateImageUrl","updateDescription","createdAt","ns","Date","Number","members","syncAdmins","syncSuperAdmins","updatePermission","permissionType","policy","metadataField","isAdmin","includes","isSuperAdmin","sync","addMembers","addMembersByInboxId","inboxIds","removeMembers","removeMembersByInboxId","addAdmin","removeAdmin","addSuperAdmin","removeSuperAdmin","publishMessages","sendOptimistic","safeEncodedContent","encodeContent","ContentTypeText","send","messages","updateConsentState","dmPeerInboxId","updateMessageDisappearingSettings","removeMessageDisappearingSettings","isMessageDisappearingEnabled","stream","asyncStream","endStream","decodedMessage","groupId","Conversations","syncAll","getConversationById","getMessageById","getDmByInboxId","list","listGroups","listDms","newGroup","newGroupByInboxIds","newDm","accountAddress","newDmByInboxId","getHmacKeys","streamGroups","ConversationType","Group","streamDms","Dm","streamAllMessages","streamAllGroupMessages","streamAllDmMessages","isSmartContractSigner","signer","walletType","Client","codecs","conversations","encryptionKey","installationId","installationIdBytes","isReady","super","Worker","URL","url","loggingLevel","GroupUpdatedCodec","TextCodec","codec","toString","init","address","create","getAddress","disableAutoRegister","register","createInboxSignatureText","addAccountSignatureText","newAccountAddress","removeAccountSignatureText","revokeAllOtherInstallationsSignatureText","revokeInstallationsSignatureText","addSignature","signatureType","signatureText","signature","signMessage","chainId","getChainId","blockNumber","getBlockNumber","applySignatures","SignatureRequestType","CreateInbox","addAccount","newAccountSigner","AddWallet","removeAccount","RevokeWallet","revokeAllOtherInstallations","RevokeInstallations","revokeInstallations","isRegistered","canMessage","env","Uint8Array","window","crypto","getRandomValues","findInboxIdByAddress","refreshFromNetwork","getLatestInboxState","setConsentStates","records","getConsentState","codecFor","encoded","encode","sameAs","ContentTypeGroupUpdated","decode","signWithInstallationKey","verifySignedWithInstallationKey","signatureBytes","verifySignedWithPublicKey","publicKey","UtilsWorkerClass","Utils","generateInboxId","getInboxIdForAddress","ApiUrls","local","dev","production","HistorySyncUrls"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/ClientWorkerClass.ts","../src/AsyncStream.ts","../src/utils/conversions.ts","../src/DecodedMessage.ts","../src/Conversation.ts","../src/utils/date.ts","../src/Conversations.ts","../src/Client.ts","../src/UtilsWorkerClass.ts","../src/Utils.ts","../src/constants.ts"],"sourcesContent":["import { v4 } from \"uuid\";\nimport type {\n ClientEventsActions,\n ClientEventsErrorData,\n ClientEventsResult,\n ClientEventsWorkerMessageData,\n ClientSendMessageData,\n} from \"@/types\";\nimport type {\n ClientStreamEvents,\n ClientStreamEventsErrorData,\n} from \"@/types/clientStreamEvents\";\n\nconst handleError = (event: ErrorEvent) => {\n console.error(`Worker error on line ${event.lineno} in \"${event.filename}\"`);\n console.error(event.message);\n};\n\nexport class ClientWorkerClass {\n #worker: Worker;\n\n #enableLogging: boolean;\n\n #promises = new Map<\n string,\n { resolve: (value: any) => void; reject: (reason?: any) => void }\n >();\n\n constructor(worker: Worker, enableLogging: boolean) {\n this.#worker = worker;\n this.#worker.addEventListener(\"message\", this.handleMessage);\n this.#worker.addEventListener(\"error\", handleError);\n this.#enableLogging = enableLogging;\n }\n\n sendMessage<A extends ClientEventsActions>(\n action: A,\n data: ClientSendMessageData<A>,\n ) {\n const promiseId = v4();\n this.#worker.postMessage({\n action,\n id: promiseId,\n data,\n });\n const promise = new Promise<ClientEventsResult<A>>((resolve, reject) => {\n this.#promises.set(promiseId, { resolve, reject });\n });\n return promise;\n }\n\n handleMessage = (\n event: MessageEvent<ClientEventsWorkerMessageData | ClientEventsErrorData>,\n ) => {\n const eventData = event.data;\n if (this.#enableLogging) {\n console.log(\"client received event data\", eventData);\n }\n const promise = this.#promises.get(eventData.id);\n if (promise) {\n this.#promises.delete(eventData.id);\n if (\"error\" in eventData) {\n promise.reject(new Error(eventData.error));\n } else {\n promise.resolve(eventData.result);\n }\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n handleStreamMessage = <T extends ClientStreamEvents[\"result\"]>(\n streamId: string,\n callback: (error: Error | null, value: T | null) => void,\n ) => {\n const streamHandler = (\n event: MessageEvent<ClientStreamEvents | ClientStreamEventsErrorData>,\n ) => {\n const eventData = event.data;\n if (eventData.streamId === streamId) {\n if (\"error\" in eventData) {\n callback(new Error(eventData.error), null);\n } else {\n callback(null, eventData.result as T);\n }\n }\n };\n this.#worker.addEventListener(\"message\", streamHandler);\n\n return () => {\n this.#worker.removeEventListener(\"message\", streamHandler);\n };\n };\n\n close() {\n this.#worker.removeEventListener(\"message\", this.handleMessage);\n this.#worker.removeEventListener(\"error\", handleError);\n this.#worker.terminate();\n }\n}\n","type ResolveValue<T> = {\n value: T | undefined;\n done: boolean;\n};\n\ntype ResolveNext<T> = (resolveValue: ResolveValue<T>) => void;\n\nexport type StreamCallback<T> = (\n err: Error | null,\n value: T | undefined,\n) => void | Promise<void>;\n\nexport class AsyncStream<T> {\n #done = false;\n #resolveNext: ResolveNext<T> | null;\n #queue: (T | undefined)[];\n\n onReturn: (() => void) | undefined = undefined;\n\n constructor() {\n this.#queue = [];\n this.#resolveNext = null;\n this.#done = false;\n }\n\n get isDone() {\n return this.#done;\n }\n\n callback: StreamCallback<T> = (error, value) => {\n if (error) {\n throw error;\n }\n\n if (this.#done) {\n return;\n }\n\n if (this.#resolveNext) {\n this.#resolveNext({\n done: false,\n value,\n });\n this.#resolveNext = null;\n } else {\n this.#queue.push(value);\n }\n };\n\n next = (): Promise<ResolveValue<T>> => {\n if (this.#queue.length > 0) {\n return Promise.resolve({\n done: false,\n value: this.#queue.shift(),\n });\n } else if (this.#done) {\n return Promise.resolve({\n done: true,\n value: undefined,\n });\n } else {\n return new Promise((resolve) => {\n this.#resolveNext = resolve;\n });\n }\n };\n\n return = (value: T | undefined) => {\n this.#done = true;\n this.onReturn?.();\n return Promise.resolve({\n done: true,\n value,\n });\n };\n\n [Symbol.asyncIterator]() {\n return this;\n }\n}\n","import {\n ContentTypeId,\n type EncodedContent,\n} from \"@xmtp/content-type-primitives\";\nimport {\n Consent,\n CreateDMOptions,\n CreateGroupOptions,\n GroupMember,\n GroupPermissionsOptions,\n ListConversationsOptions,\n ListMessagesOptions,\n MessageDisappearingSettings,\n PermissionPolicySet,\n ContentTypeId as WasmContentTypeId,\n EncodedContent as WasmEncodedContent,\n type ConsentEntityType,\n type ConsentState,\n type ConversationType,\n type DeliveryStatus,\n type GroupMembershipState,\n type GroupMessageKind,\n type HmacKey,\n type InboxState,\n type Installation,\n type Message,\n type PermissionLevel,\n type PermissionPolicy,\n type SortDirection,\n} from \"@xmtp/wasm-bindings\";\nimport type { WorkerConversation } from \"@/WorkerConversation\";\n\nexport const toContentTypeId = (\n contentTypeId: WasmContentTypeId,\n): ContentTypeId =>\n new ContentTypeId({\n authorityId: contentTypeId.authorityId,\n typeId: contentTypeId.typeId,\n versionMajor: contentTypeId.versionMajor,\n versionMinor: contentTypeId.versionMinor,\n });\n\nexport const fromContentTypeId = (\n contentTypeId: ContentTypeId,\n): WasmContentTypeId =>\n new WasmContentTypeId(\n contentTypeId.authorityId,\n contentTypeId.typeId,\n contentTypeId.versionMajor,\n contentTypeId.versionMinor,\n );\n\nexport type SafeContentTypeId = {\n authorityId: string;\n typeId: string;\n versionMajor: number;\n versionMinor: number;\n};\n\nexport const toSafeContentTypeId = (\n contentTypeId: ContentTypeId,\n): SafeContentTypeId => ({\n authorityId: contentTypeId.authorityId,\n typeId: contentTypeId.typeId,\n versionMajor: contentTypeId.versionMajor,\n versionMinor: contentTypeId.versionMinor,\n});\n\nexport const fromSafeContentTypeId = (\n contentTypeId: SafeContentTypeId,\n): ContentTypeId =>\n new ContentTypeId({\n authorityId: contentTypeId.authorityId,\n typeId: contentTypeId.typeId,\n versionMajor: contentTypeId.versionMajor,\n versionMinor: contentTypeId.versionMinor,\n });\n\nexport const toEncodedContent = (\n content: WasmEncodedContent,\n): EncodedContent => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n type: toContentTypeId(content.type!),\n parameters: Object.fromEntries(content.parameters as Map<string, string>),\n fallback: content.fallback,\n compression: content.compression,\n content: content.content,\n});\n\nexport const fromEncodedContent = (\n content: EncodedContent,\n): WasmEncodedContent =>\n new WasmEncodedContent(\n fromContentTypeId(content.type),\n new Map(Object.entries(content.parameters)),\n content.fallback,\n content.compression,\n content.content,\n );\n\nexport type SafeEncodedContent = {\n type: SafeContentTypeId;\n parameters: Record<string, string>;\n fallback?: string;\n compression?: number;\n content: Uint8Array;\n};\n\nexport const toSafeEncodedContent = (\n content: EncodedContent,\n): SafeEncodedContent => ({\n type: toSafeContentTypeId(content.type),\n parameters: content.parameters,\n fallback: content.fallback,\n compression: content.compression,\n content: content.content,\n});\n\nexport const fromSafeEncodedContent = (\n content: SafeEncodedContent,\n): EncodedContent => ({\n type: fromSafeContentTypeId(content.type),\n parameters: content.parameters,\n fallback: content.fallback,\n compression: content.compression,\n content: content.content,\n});\n\nexport type SafeMessage = {\n content: SafeEncodedContent;\n convoId: string;\n deliveryStatus: DeliveryStatus;\n id: string;\n kind: GroupMessageKind;\n senderInboxId: string;\n sentAtNs: bigint;\n};\n\nexport const toSafeMessage = (message: Message): SafeMessage => ({\n content: toSafeEncodedContent(toEncodedContent(message.content)),\n convoId: message.convoId,\n deliveryStatus: message.deliveryStatus,\n id: message.id,\n kind: message.kind,\n senderInboxId: message.senderInboxId,\n sentAtNs: message.sentAtNs,\n});\n\nexport type SafeListMessagesOptions = {\n deliveryStatus?: DeliveryStatus;\n direction?: SortDirection;\n limit?: bigint;\n sentAfterNs?: bigint;\n sentBeforeNs?: bigint;\n};\n\nexport const toSafeListMessagesOptions = (\n options: ListMessagesOptions,\n): SafeListMessagesOptions => ({\n deliveryStatus: options.deliveryStatus,\n direction: options.direction,\n limit: options.limit,\n sentAfterNs: options.sentAfterNs,\n sentBeforeNs: options.sentBeforeNs,\n});\n\nexport const fromSafeListMessagesOptions = (\n options: SafeListMessagesOptions,\n): ListMessagesOptions =>\n new ListMessagesOptions(\n options.sentBeforeNs,\n options.sentAfterNs,\n options.limit,\n options.deliveryStatus,\n options.direction,\n );\n\nexport type SafeListConversationsOptions = {\n allowedStates?: GroupMembershipState[];\n consentStates?: ConsentState[];\n conversationType?: ConversationType;\n createdAfterNs?: bigint;\n createdBeforeNs?: bigint;\n includeDuplicateDms?: boolean;\n includeSyncGroups?: boolean;\n limit?: bigint;\n};\n\nexport const toSafeListConversationsOptions = (\n options: ListConversationsOptions,\n): SafeListConversationsOptions => ({\n allowedStates: options.allowedStates,\n consentStates: options.consentStates,\n conversationType: options.conversationType,\n createdAfterNs: options.createdAfterNs,\n createdBeforeNs: options.createdBeforeNs,\n includeDuplicateDms: options.includeDuplicateDms,\n includeSyncGroups: options.includeSyncGroups,\n limit: options.limit,\n});\n\nexport const fromSafeListConversationsOptions = (\n options: SafeListConversationsOptions,\n): ListConversationsOptions =>\n new ListConversationsOptions(\n options.allowedStates,\n options.consentStates,\n options.conversationType,\n options.createdAfterNs,\n options.createdBeforeNs,\n options.includeDuplicateDms ?? false,\n options.includeSyncGroups ?? false,\n options.limit,\n );\n\nexport type SafePermissionPolicySet = {\n addAdminPolicy: PermissionPolicy;\n addMemberPolicy: PermissionPolicy;\n removeAdminPolicy: PermissionPolicy;\n removeMemberPolicy: PermissionPolicy;\n updateGroupDescriptionPolicy: PermissionPolicy;\n updateGroupImageUrlSquarePolicy: PermissionPolicy;\n updateGroupNamePolicy: PermissionPolicy;\n updateMessageDisappearingPolicy: PermissionPolicy;\n};\n\nexport const toSafePermissionPolicySet = (\n policySet: PermissionPolicySet,\n): SafePermissionPolicySet => ({\n addAdminPolicy: policySet.addAdminPolicy,\n addMemberPolicy: policySet.addMemberPolicy,\n removeAdminPolicy: policySet.removeAdminPolicy,\n removeMemberPolicy: policySet.removeMemberPolicy,\n updateGroupDescriptionPolicy: policySet.updateGroupDescriptionPolicy,\n updateGroupImageUrlSquarePolicy: policySet.updateGroupImageUrlSquarePolicy,\n updateGroupNamePolicy: policySet.updateGroupNamePolicy,\n updateMessageDisappearingPolicy: policySet.updateMessageDisappearingPolicy,\n});\n\nexport const fromSafePermissionPolicySet = (\n policySet: SafePermissionPolicySet,\n): PermissionPolicySet =>\n new PermissionPolicySet(\n policySet.addMemberPolicy,\n policySet.removeMemberPolicy,\n policySet.addAdminPolicy,\n policySet.removeAdminPolicy,\n policySet.updateGroupNamePolicy,\n policySet.updateGroupDescriptionPolicy,\n policySet.updateGroupImageUrlSquarePolicy,\n policySet.updateMessageDisappearingPolicy,\n );\n\nexport type SafeCreateGroupOptions = {\n customPermissionPolicySet?: SafePermissionPolicySet;\n description?: string;\n imageUrlSquare?: string;\n messageDisappearingSettings?: SafeMessageDisappearingSettings;\n name?: string;\n permissions?: GroupPermissionsOptions;\n};\n\nexport const toSafeCreateGroupOptions = (\n options: CreateGroupOptions,\n): SafeCreateGroupOptions => ({\n customPermissionPolicySet: options.customPermissionPolicySet,\n description: options.groupDescription,\n imageUrlSquare: options.groupImageUrlSquare,\n messageDisappearingSettings: options.messageDisappearingSettings\n ? toSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n name: options.groupName,\n permissions: options.permissions,\n});\n\nexport const fromSafeCreateGroupOptions = (\n options: SafeCreateGroupOptions,\n): CreateGroupOptions =>\n new CreateGroupOptions(\n options.permissions,\n options.name,\n options.imageUrlSquare,\n options.description,\n // only include custom policy set if permissions are set to CustomPolicy\n options.customPermissionPolicySet &&\n options.permissions === GroupPermissionsOptions.CustomPolicy\n ? fromSafePermissionPolicySet(options.customPermissionPolicySet)\n : undefined,\n options.messageDisappearingSettings\n ? fromSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n );\n\nexport type SafeCreateDmOptions = {\n messageDisappearingSettings?: SafeMessageDisappearingSettings;\n};\n\nexport const toSafeCreateDmOptions = (\n options: CreateDMOptions,\n): SafeCreateDmOptions => ({\n messageDisappearingSettings: options.messageDisappearingSettings\n ? toSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n});\n\nexport const fromSafeCreateDmOptions = (\n options: SafeCreateDmOptions,\n): CreateDMOptions =>\n new CreateDMOptions(\n options.messageDisappearingSettings\n ? fromSafeMessageDisappearingSettings(options.messageDisappearingSettings)\n : undefined,\n );\n\nexport type SafeConversation = {\n id: string;\n name: string;\n imageUrl: string;\n description: string;\n permissions: {\n policyType: GroupPermissionsOptions;\n policySet: {\n addAdminPolicy: PermissionPolicy;\n addMemberPolicy: PermissionPolicy;\n removeAdminPolicy: PermissionPolicy;\n removeMemberPolicy: PermissionPolicy;\n updateGroupDescriptionPolicy: PermissionPolicy;\n updateGroupImageUrlSquarePolicy: PermissionPolicy;\n updateGroupNamePolicy: PermissionPolicy;\n updateMessageDisappearingPolicy: PermissionPolicy;\n };\n };\n isActive: boolean;\n addedByInboxId: string;\n metadata: {\n creatorInboxId: string;\n conversationType: string;\n };\n admins: string[];\n superAdmins: string[];\n createdAtNs: bigint;\n};\n\nexport const toSafeConversation = async (\n conversation: WorkerConversation,\n): Promise<SafeConversation> => {\n const id = conversation.id;\n const name = conversation.name;\n const imageUrl = conversation.imageUrl;\n const description = conversation.description;\n const permissions = conversation.permissions;\n const isActive = conversation.isActive;\n const addedByInboxId = conversation.addedByInboxId;\n const metadata = await conversation.metadata();\n const admins = conversation.admins;\n const superAdmins = conversation.superAdmins;\n const createdAtNs = conversation.createdAtNs;\n const policyType = permissions.policyType;\n const policySet = permissions.policySet;\n return {\n id,\n name,\n imageUrl,\n description,\n permissions: {\n policyType,\n policySet: {\n addAdminPolicy: policySet.addAdminPolicy,\n addMemberPolicy: policySet.addMemberPolicy,\n removeAdminPolicy: policySet.removeAdminPolicy,\n removeMemberPolicy: policySet.removeMemberPolicy,\n updateGroupDescriptionPolicy: policySet.updateGroupDescriptionPolicy,\n updateGroupImageUrlSquarePolicy:\n policySet.updateGroupImageUrlSquarePolicy,\n updateGroupNamePolicy: policySet.updateGroupNamePolicy,\n updateMessageDisappearingPolicy:\n policySet.updateMessageDisappearingPolicy,\n },\n },\n isActive,\n addedByInboxId,\n metadata,\n admins,\n superAdmins,\n createdAtNs,\n };\n};\n\nexport type SafeInstallation = {\n bytes: Uint8Array;\n clientTimestampNs?: bigint;\n id: string;\n};\n\nexport const toSafeInstallation = (\n installation: Installation,\n): SafeInstallation => ({\n bytes: installation.bytes,\n clientTimestampNs: installation.clientTimestampNs,\n id: installation.id,\n});\n\nexport type SafeInboxState = {\n accountAddresses: string[];\n inboxId: string;\n installations: SafeInstallation[];\n recoveryAddress: string;\n};\n\nexport const toSafeInboxState = (inboxState: InboxState): SafeInboxState => ({\n accountAddresses: inboxState.accountAddresses,\n inboxId: inboxState.inboxId,\n installations: inboxState.installations.map(toSafeInstallation),\n recoveryAddress: inboxState.recoveryAddress,\n});\n\nexport type SafeConsent = {\n entity: string;\n entityType: ConsentEntityType;\n state: ConsentState;\n};\n\nexport const toSafeConsent = (consent: Consent): SafeConsent => ({\n entity: consent.entity,\n entityType: consent.entityType,\n state: consent.state,\n});\n\nexport const fromSafeConsent = (consent: SafeConsent): Consent =>\n new Consent(consent.entityType, consent.state, consent.entity);\n\nexport type SafeGroupMember = {\n accountAddresses: string[];\n consentState: ConsentState;\n inboxId: string;\n installationIds: string[];\n permissionLevel: PermissionLevel;\n};\n\nexport const toSafeGroupMember = (member: GroupMember): SafeGroupMember => ({\n accountAddresses: member.accountAddresses,\n consentState: member.consentState,\n inboxId: member.inboxId,\n installationIds: member.installationIds,\n permissionLevel: member.permissionLevel,\n});\n\nexport const fromSafeGroupMember = (member: SafeGroupMember): GroupMember =>\n new GroupMember(\n member.inboxId,\n member.accountAddresses,\n member.installationIds,\n member.permissionLevel,\n member.consentState,\n );\n\nexport type SafeHmacKey = {\n key: Uint8Array;\n epoch: bigint;\n};\n\nexport const toSafeHmacKey = (hmacKey: HmacKey): SafeHmacKey => ({\n key: hmacKey.key,\n epoch: hmacKey.epoch,\n});\n\nexport type HmacKeys = Map<string, HmacKey[]>;\nexport type SafeHmacKeys = Record<string, SafeHmacKey[]>;\n\nexport type SafeMessageDisappearingSettings = {\n fromNs: bigint;\n inNs: bigint;\n};\n\nexport const toSafeMessageDisappearingSettings = (\n settings: MessageDisappearingSettings,\n): SafeMessageDisappearingSettings => ({\n fromNs: settings.fromNs,\n inNs: settings.inNs,\n});\n\nexport const fromSafeMessageDisappearingSettings = (\n settings: SafeMessageDisappearingSettings,\n): MessageDisappearingSettings =>\n new MessageDisappearingSettings(settings.fromNs, settings.inNs);\n","import type { ContentTypeId } from \"@xmtp/content-type-primitives\";\nimport { DeliveryStatus, GroupMessageKind } from \"@xmtp/wasm-bindings\";\nimport type { Client } from \"@/Client\";\nimport { fromSafeContentTypeId, type SafeMessage } from \"@/utils/conversions\";\n\nexport type MessageKind = \"application\" | \"membership_change\";\nexport type MessageDeliveryStatus = \"unpublished\" | \"published\" | \"failed\";\n\nexport class DecodedMessage {\n #client: Client;\n\n content: any;\n\n contentType: ContentTypeId;\n\n conversationId: string;\n\n deliveryStatus: MessageDeliveryStatus;\n\n fallback?: string;\n\n compression?: number;\n\n id: string;\n\n kind: MessageKind;\n\n parameters: Map<string, string>;\n\n encodedContent: SafeMessage[\"content\"];\n\n senderInboxId: string;\n\n sentAtNs: bigint;\n\n constructor(client: Client, message: SafeMessage) {\n this.#client = client;\n this.id = message.id;\n this.sentAtNs = message.sentAtNs;\n this.conversationId = message.convoId;\n this.senderInboxId = message.senderInboxId;\n this.encodedContent = message.content;\n\n switch (message.kind) {\n case GroupMessageKind.Application:\n this.kind = \"application\";\n break;\n case GroupMessageKind.MembershipChange:\n this.kind = \"membership_change\";\n break;\n // no default\n }\n\n switch (message.deliveryStatus) {\n case DeliveryStatus.Unpublished:\n this.deliveryStatus = \"unpublished\";\n break;\n case DeliveryStatus.Published:\n this.deliveryStatus = \"published\";\n break;\n case DeliveryStatus.Failed:\n this.deliveryStatus = \"failed\";\n break;\n // no default\n }\n\n this.contentType = fromSafeContentTypeId(message.content.type);\n this.parameters = new Map(Object.entries(message.content.parameters));\n this.fallback = message.content.fallback;\n this.compression = message.content.compression;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n this.content = this.#client.decodeContent(message, this.contentType);\n }\n}\n","import type { ContentTypeId } from \"@xmtp/content-type-primitives\";\nimport { ContentTypeText } from \"@xmtp/content-type-text\";\nimport type {\n ConsentState,\n MetadataField,\n PermissionPolicy,\n PermissionUpdateType,\n} from \"@xmtp/wasm-bindings\";\nimport { v4 } from \"uuid\";\nimport { AsyncStream, type StreamCallback } from \"@/AsyncStream\";\nimport type { Client } from \"@/Client\";\nimport { DecodedMessage } from \"@/DecodedMessage\";\nimport type {\n SafeConversation,\n SafeListMessagesOptions,\n SafeMessage,\n} from \"@/utils/conversions\";\nimport { nsToDate } from \"@/utils/date\";\n\nexport class Conversation {\n #client: Client;\n\n #id: string;\n\n #name?: SafeConversation[\"name\"];\n\n #imageUrl?: SafeConversation[\"imageUrl\"];\n\n #description?: SafeConversation[\"description\"];\n\n #isActive?: SafeConversation[\"isActive\"];\n\n #addedByInboxId?: SafeConversation[\"addedByInboxId\"];\n\n #metadata?: SafeConversation[\"metadata\"];\n\n #createdAtNs?: SafeConversation[\"createdAtNs\"];\n\n #admins: SafeConversation[\"admins\"] = [];\n\n #superAdmins: SafeConversation[\"superAdmins\"] = [];\n\n constructor(client: Client, id: string, data?: SafeConversation) {\n this.#client = client;\n this.#id = id;\n this.#syncData(data);\n }\n\n #syncData(data?: SafeConversation) {\n this.#name = data?.name ?? \"\";\n this.#imageUrl = data?.imageUrl ?? \"\";\n this.#description = data?.description ?? \"\";\n this.#isActive = data?.isActive ?? undefined;\n this.#addedByInboxId = data?.addedByInboxId ?? \"\";\n this.#metadata = data?.metadata ?? undefined;\n this.#createdAtNs = data?.createdAtNs ?? undefined;\n this.#admins = data?.admins ?? [];\n this.#superAdmins = data?.superAdmins ?? [];\n }\n\n get id() {\n return this.#id;\n }\n\n get name() {\n return this.#name;\n }\n\n async updateName(name: string) {\n await this.#client.sendMessage(\"updateGroupName\", {\n id: this.#id,\n name,\n });\n this.#name = name;\n }\n\n get imageUrl() {\n return this.#imageUrl;\n }\n\n async updateImageUrl(imageUrl: string) {\n await this.#client.sendMessage(\"updateGroupImageUrlSquare\", {\n id: this.#id,\n imageUrl,\n });\n this.#imageUrl = imageUrl;\n }\n\n get description() {\n return this.#description;\n }\n\n async updateDescription(description: string) {\n await this.#client.sendMessage(\"updateGroupDescription\", {\n id: this.#id,\n description,\n });\n this.#description = description;\n }\n\n get isActive() {\n return this.#isActive;\n }\n\n get addedByInboxId() {\n return this.#addedByInboxId;\n }\n\n get createdAtNs() {\n return this.#createdAtNs;\n }\n\n get createdAt() {\n return this.#createdAtNs ? nsToDate(this.#createdAtNs) : undefined;\n }\n\n get metadata() {\n return this.#metadata;\n }\n\n async members() {\n return this.#client.sendMessage(\"getGroupMembers\", {\n id: this.#id,\n });\n }\n\n get admins() {\n return this.#admins;\n }\n\n get superAdmins() {\n return this.#superAdmins;\n }\n\n async syncAdmins() {\n const admins = await this.#client.sendMessage(\"getGroupAdmins\", {\n id: this.#id,\n });\n this.#admins = admins;\n }\n\n async syncSuperAdmins() {\n const superAdmins = await this.#client.sendMessage(\"getGroupSuperAdmins\", {\n id: this.#id,\n });\n this.#superAdmins = superAdmins;\n }\n\n async permissions() {\n return this.#client.sendMessage(\"getGroupPermissions\", {\n id: this.#id,\n });\n }\n\n async updatePermission(\n permissionType: PermissionUpdateType,\n policy: PermissionPolicy,\n metadataField?: MetadataField,\n ) {\n return this.#client.sendMessage(\"updateGroupPermissionPolicy\", {\n id: this.#id,\n permissionType,\n policy,\n metadataField,\n });\n }\n\n async isAdmin(inboxId: string) {\n await this.syncAdmins();\n return this.#admins.includes(inboxId);\n }\n\n async isSuperAdmin(inboxId: string) {\n await this.syncSuperAdmins();\n return this.#superAdmins.includes(inboxId);\n }\n\n async sync() {\n const data = await this.#client.sendMessage(\"syncGroup\", {\n id: this.#id,\n });\n this.#syncData(data);\n }\n\n async addMembers(accountAddresses: string[]) {\n return this.#client.sendMessage(\"addGroupMembers\", {\n id: this.#id,\n accountAddresses,\n });\n }\n\n async addMembersByInboxId(inboxIds: string[]) {\n return this.#client.sendMessage(\"addGroupMembersByInboxId\", {\n id: this.#id,\n inboxIds,\n });\n }\n\n async removeMembers(accountAddresses: string[]) {\n return this.#client.sendMessage(\"removeGroupMembers\", {\n id: this.#id,\n accountAddresses,\n });\n }\n\n async removeMembersByInboxId(inboxIds: string[]) {\n return this.#client.sendMessage(\"removeGroupMembersByInboxId\", {\n id: this.#id,\n inboxIds,\n });\n }\n\n async addAdmin(inboxId: string) {\n return this.#client.sendMessage(\"addGroupAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async removeAdmin(inboxId: string) {\n return this.#client.sendMessage(\"removeGroupAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async addSuperAdmin(inboxId: string) {\n return this.#client.sendMessage(\"addGroupSuperAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async removeSuperAdmin(inboxId: string) {\n return this.#client.sendMessage(\"removeGroupSuperAdmin\", {\n id: this.#id,\n inboxId,\n });\n }\n\n async publishMessages() {\n return this.#client.sendMessage(\"publishGroupMessages\", {\n id: this.#id,\n });\n }\n\n async sendOptimistic(content: any, contentType?: ContentTypeId) {\n if (typeof content !== \"string\" && !contentType) {\n throw new Error(\n \"Content type is required when sending content other than text\",\n );\n }\n\n const safeEncodedContent =\n typeof content === \"string\"\n ? this.#client.encodeContent(content, contentType ?? ContentTypeText)\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#client.encodeContent(content, contentType!);\n\n return this.#client.sendMessage(\"sendOptimisticGroupMessage\", {\n id: this.#id,\n content: safeEncodedContent,\n });\n }\n\n async send(content: any, contentType?: ContentTypeId) {\n if (typeof content !== \"string\" && !contentType) {\n throw new Error(\n \"Content type is required when sending content other than text\",\n );\n }\n\n const safeEncodedContent =\n typeof content === \"string\"\n ? this.#client.encodeContent(content, contentType ?? ContentTypeText)\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.#client.encodeContent(content, contentType!);\n\n return this.#client.sendMessage(\"sendGroupMessage\", {\n id: this.#id,\n content: safeEncodedContent,\n });\n }\n\n async messages(options?: SafeListMessagesOptions) {\n const messages = await this.#client.sendMessage(\"getGroupMessages\", {\n id: this.#id,\n options,\n });\n\n return messages.map((message) => new DecodedMessage(this.#client, message));\n }\n\n async consentState() {\n return this.#client.sendMessage(\"getGroupConsentState\", {\n id: this.#id,\n });\n }\n\n async updateConsentState(state: ConsentState) {\n return this.#client.sendMessage(\"updateGroupConsentState\", {\n id: this.#id,\n state,\n });\n }\n\n async dmPeerInboxId() {\n return this.#client.sendMessage(\"getDmPeerInboxId\", {\n id: this.#id,\n });\n }\n\n async messageDisappearingSettings() {\n return this.#client.sendMessage(\"getGroupMessageDisappearingSettings\", {\n id: this.#id,\n });\n }\n\n async updateMessageDisappearingSettings(fromNs: bigint, inNs: bigint) {\n return this.#client.sendMessage(\"updateGroupMessageDisappearingSettings\", {\n id: this.#id,\n fromNs,\n inNs,\n });\n }\n\n async removeMessageDisappearingSettings() {\n return this.#client.sendMessage(\"removeGroupMessageDisappearingSettings\", {\n id: this.#id,\n });\n }\n\n async isMessageDisappearingEnabled() {\n return this.#client.sendMessage(\"isGroupMessageDisappearingEnabled\", {\n id: this.#id,\n });\n }\n\n async stream(callback?: StreamCallback<DecodedMessage>) {\n const streamId = v4();\n const asyncStream = new AsyncStream<DecodedMessage>();\n const endStream = this.#client.handleStreamMessage<SafeMessage>(\n streamId,\n (error, value) => {\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(error, decodedMessage);\n void callback?.(error, decodedMessage);\n },\n );\n await this.#client.sendMessage(\"streamGroupMessages\", {\n groupId: this.#id,\n streamId,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n}\n","export function nsToDate(ns: bigint): Date {\n return new Date(Number(ns / 1_000_000n));\n}\n","import { ConversationType, type ConsentState } from \"@xmtp/wasm-bindings\";\nimport { v4 } from \"uuid\";\nimport { AsyncStream, type StreamCallback } from \"@/AsyncStream\";\nimport type { Client } from \"@/Client\";\nimport { Conversation } from \"@/Conversation\";\nimport { DecodedMessage } from \"@/DecodedMessage\";\nimport type {\n SafeConversation,\n SafeCreateDmOptions,\n SafeCreateGroupOptions,\n SafeListConversationsOptions,\n SafeMessage,\n} from \"@/utils/conversions\";\n\nexport class Conversations {\n #client: Client;\n\n constructor(client: Client) {\n this.#client = client;\n }\n\n async sync() {\n return this.#client.sendMessage(\"syncConversations\", undefined);\n }\n\n async syncAll(consentStates?: ConsentState[]) {\n return this.#client.sendMessage(\"syncAllConversations\", {\n consentStates,\n });\n }\n\n async getConversationById(id: string) {\n const data = await this.#client.sendMessage(\"getConversationById\", {\n id,\n });\n return data ? new Conversation(this.#client, id, data) : undefined;\n }\n\n async getMessageById(id: string) {\n const data = await this.#client.sendMessage(\"getMessageById\", {\n id,\n });\n return data ? new DecodedMessage(this.#client, data) : undefined;\n }\n\n async getDmByInboxId(inboxId: string) {\n const data = await this.#client.sendMessage(\"getDmByInboxId\", {\n inboxId,\n });\n return data ? new Conversation(this.#client, data.id, data) : undefined;\n }\n\n async list(options?: SafeListConversationsOptions) {\n const conversations = await this.#client.sendMessage(\"getConversations\", {\n options,\n });\n\n return conversations.map(\n (conversation) =>\n new Conversation(this.#client, conversation.id, conversation),\n );\n }\n\n async listGroups(\n options?: Omit<SafeListConversationsOptions, \"conversation_type\">,\n ) {\n const conversations = await this.#client.sendMessage(\"getGroups\", {\n options,\n });\n\n return conversations.map(\n (conversation) =>\n new Conversation(this.#client, conversation.id, conversation),\n );\n }\n\n async listDms(\n options?: Omit<SafeListConversationsOptions, \"conversation_type\">,\n ) {\n const conversations = await this.#client.sendMessage(\"getDms\", {\n options,\n });\n\n return conversations.map(\n (conversation) =>\n new Conversation(this.#client, conversation.id, conversation),\n );\n }\n\n async newGroup(accountAddresses: string[], options?: SafeCreateGroupOptions) {\n const conversation = await this.#client.sendMessage(\"newGroup\", {\n accountAddresses,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async newGroupByInboxIds(\n inboxIds: string[],\n options?: SafeCreateGroupOptions,\n ) {\n const conversation = await this.#client.sendMessage(\"newGroupByInboxIds\", {\n inboxIds,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async newDm(accountAddress: string, options?: SafeCreateDmOptions) {\n const conversation = await this.#client.sendMessage(\"newDm\", {\n accountAddress,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async newDmByInboxId(inboxId: string, options?: SafeCreateDmOptions) {\n const conversation = await this.#client.sendMessage(\"newDmByInboxId\", {\n inboxId,\n options,\n });\n\n return new Conversation(this.#client, conversation.id, conversation);\n }\n\n async getHmacKeys() {\n return this.#client.sendMessage(\"getHmacKeys\", undefined);\n }\n\n async stream(\n callback?: StreamCallback<Conversation>,\n conversationType?: ConversationType,\n ) {\n const streamId = v4();\n const asyncStream = new AsyncStream<Conversation>();\n const endStream = this.#client.handleStreamMessage<SafeConversation>(\n streamId,\n (error, value) => {\n const conversation = value\n ? new Conversation(this.#client, value.id, value)\n : undefined;\n void asyncStream.callback(error, conversation);\n void callback?.(error, conversation);\n },\n );\n await this.#client.sendMessage(\"streamAllGroups\", {\n streamId,\n conversationType,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n\n async streamGroups(callback?: StreamCallback<Conversation>) {\n return this.stream(callback, ConversationType.Group);\n }\n\n async streamDms(callback?: StreamCallback<Conversation>) {\n return this.stream(callback, ConversationType.Dm);\n }\n\n async streamAllMessages(\n callback?: StreamCallback<DecodedMessage>,\n conversationType?: ConversationType,\n ) {\n const streamId = v4();\n const asyncStream = new AsyncStream<DecodedMessage>();\n const endStream = this.#client.handleStreamMessage<SafeMessage>(\n streamId,\n (error, value) => {\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(error, decodedMessage);\n void callback?.(error, decodedMessage);\n },\n );\n await this.#client.sendMessage(\"streamAllMessages\", {\n streamId,\n conversationType,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n\n async streamAllGroupMessages(callback?: StreamCallback<DecodedMessage>) {\n return this.streamAllMessages(callback, ConversationType.Group);\n }\n\n async streamAllDmMessages(callback?: StreamCallback<DecodedMessage>) {\n return this.streamAllMessages(callback, ConversationType.Dm);\n }\n}\n","import {\n ContentTypeGroupUpdated,\n GroupUpdatedCodec,\n} from \"@xmtp/content-type-group-updated\";\nimport type {\n ContentCodec,\n ContentTypeId,\n} from \"@xmtp/content-type-primitives\";\nimport { TextCodec } from \"@xmtp/content-type-text\";\nimport {\n GroupMessageKind,\n SignatureRequestType,\n type ConsentEntityType,\n} from \"@xmtp/wasm-bindings\";\nimport { ClientWorkerClass } from \"@/ClientWorkerClass\";\nimport { Conversations } from \"@/Conversations\";\nimport type { ClientOptions, XmtpEnv } from \"@/types\";\nimport {\n fromSafeEncodedContent,\n toSafeEncodedContent,\n type SafeConsent,\n type SafeMessage,\n} from \"@/utils/conversions\";\nimport { type Signer } from \"@/utils/signer\";\n\nexport class Client extends ClientWorkerClass {\n #accountAddress: string;\n #codecs: Map<string, ContentCodec>;\n #conversations: Conversations;\n #encryptionKey: Uint8Array;\n #inboxId: string | undefined;\n #installationId: string | undefined;\n #installationIdBytes: Uint8Array | undefined;\n #isReady = false;\n #signer: Signer;\n options?: ClientOptions;\n\n constructor(\n signer: Signer,\n accountAddress: string,\n encryptionKey: Uint8Array,\n options?: ClientOptions,\n ) {\n const worker = new Worker(new URL(\"./workers/client\", import.meta.url), {\n type: \"module\",\n });\n super(\n worker,\n options?.loggingLevel !== undefined && options.loggingLevel !== \"off\",\n );\n this.#accountAddress = accountAddress;\n this.options = options;\n this.#encryptionKey = encryptionKey;\n this.#signer = signer;\n this.#conversations = new Conversations(this);\n const codecs = [\n new GroupUpdatedCodec(),\n new TextCodec(),\n ...(options?.codecs ?? []),\n ];\n this.#codecs = new Map(\n codecs.map((codec) => [codec.contentType.toString(), codec]),\n );\n }\n\n get accountAddress() {\n return this.#accountAddress;\n }\n\n async init() {\n const result = await this.sendMessage(\"init\", {\n address: this.accountAddress,\n encryptionKey: this.#encryptionKey,\n options: this.options,\n });\n this.#inboxId = result.inboxId;\n this.#installationId = result.installationId;\n this.#installationIdBytes = result.installationIdBytes;\n this.#isReady = true;\n }\n\n static async create(\n signer: Signer,\n encryptionKey: Uint8Array,\n options?: ClientOptions,\n ) {\n const address = await signer.getAddress();\n const client = new Client(signer, address, encryptionKey, options);\n\n await client.init();\n\n if (!options?.disableAutoRegister) {\n await client.register();\n }\n\n return client;\n }\n\n get isReady() {\n return this.#isReady;\n }\n\n get inboxId() {\n return this.#inboxId;\n }\n\n get installationId() {\n return this.#installationId;\n }\n\n get installationIdBytes() {\n return this.#installationIdBytes;\n }\n\n async #createInboxSignatureText() {\n return this.sendMessage(\"createInboxSignatureText\", undefined);\n }\n\n async #addAccountSignatureText(newAccountAddress: string) {\n return this.sendMessage(\"addAccountSignatureText\", {\n newAccountAddress,\n });\n }\n\n async #removeAccountSignatureText(accountAddress: string) {\n return this.sendMessage(\"removeAccountSignatureText\", { accountAddress });\n }\n\n async #revokeAllOtherInstallationsSignatureText() {\n return this.sendMessage(\n \"revokeAllOtherInstallationsSignatureText\",\n undefined,\n );\n }\n\n async #revokeInstallationsSignatureText(installationIds: Uint8Array[]) {\n return this.sendMessage(\"revokeInstallationsSignatureText\", {\n installationIds,\n });\n }\n\n async #addSignature(\n signatureType: SignatureRequestType,\n signatureText: string,\n signer: Signer,\n ) {\n const signature = await signer.signMessage(signatureText);\n\n if (signer.walletType === \"SCW\") {\n await this.sendMessage(\"addScwSignature\", {\n type: signatureType,\n bytes: signature,\n chainId: signer.getChainId(),\n blockNumber: signer.getBlockNumber?.(),\n });\n } else {\n await this.sendMessage(\"addSignature\", {\n type: signatureType,\n bytes: signature,\n });\n }\n }\n\n async #applySignatures() {\n return this.sendMessage(\"applySignatures\", undefined);\n }\n\n async register() {\n const signatureText = await this.#createInboxSignatureText();\n\n // if the signature text is not available, the client is already registered\n if (!signatureText) {\n return;\n }\n\n await this.#addSignature(\n SignatureRequestType.CreateInbox,\n signatureText,\n this.#signer,\n );\n\n return this.sendMessage(\"registerIdentity\", undefined);\n }\n\n async addAccount(newAccountSigner: Signer) {\n const signatureText = await this.#addAccountSignatureText(\n await newAccountSigner.getAddress(),\n );\n\n if (!signatureText) {\n throw new Error(\"Unable to generate add account signature text\");\n }\n\n await this.#addSignature(\n SignatureRequestType.AddWallet,\n signatureText,\n newAccountSigner,\n );\n\n await this.#applySignatures();\n }\n\n async removeAccount(accountAddress: string) {\n const signatureText =\n await this.#removeAccountSignatureText(accountAddress);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate remove account signature text\");\n }\n\n await this.#addSignature(\n SignatureRequestType.RevokeWallet,\n signatureText,\n this.#signer,\n );\n\n await this.#applySignatures();\n }\n\n async revokeAllOtherInstallations() {\n const signatureText =\n await this.#revokeAllOtherInstallationsSignatureText();\n\n if (!signatureText) {\n throw new Error(\n \"Unable to generate revoke all other installations signature text\",\n );\n }\n\n await this.#addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.#applySignatures();\n }\n\n async revokeInstallations(installationIds: Uint8Array[]) {\n const signatureText =\n await this.#revokeInstallationsSignatureText(installationIds);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate revoke installations signature text\");\n }\n\n await this.#addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.#applySignatures();\n }\n\n async isRegistered() {\n return this.sendMessage(\"isRegistered\", undefined);\n }\n\n async canMessage(accountAddresses: string[]) {\n return this.sendMessage(\"canMessage\", { accountAddresses });\n }\n\n static async canMessage(accountAddresses: string[], env?: XmtpEnv) {\n const accountAddress = \"0x0000000000000000000000000000000000000000\";\n const signer: Signer = {\n walletType: \"EOA\",\n getAddress: () => accountAddress,\n signMessage: () => new Uint8Array(),\n };\n const client = await Client.create(\n signer,\n window.crypto.getRandomValues(new Uint8Array(32)),\n {\n disableAutoRegister: true,\n env,\n },\n );\n return client.canMessage(accountAddresses);\n }\n\n async findInboxIdByAddress(address: string) {\n return this.sendMessage(\"findInboxIdByAddress\", { address });\n }\n\n async inboxState(refreshFromNetwork?: boolean) {\n return this.sendMessage(\"inboxState\", {\n refreshFromNetwork: refreshFromNetwork ?? false,\n });\n }\n\n async getLatestInboxState(inboxId: string) {\n return this.sendMessage(\"getLatestInboxState\", { inboxId });\n }\n\n async setConsentStates(records: SafeConsent[]) {\n return this.sendMessage(\"setConsentStates\", { records });\n }\n\n async getConsentState(entityType: ConsentEntityType, entity: string) {\n return this.sendMessage(\"getConsentState\", { entityType, entity });\n }\n\n get conversations() {\n return this.#conversations;\n }\n\n codecFor(contentType: ContentTypeId) {\n return this.#codecs.get(contentType.toString());\n }\n\n encodeContent(content: any, contentType: ContentTypeId) {\n const codec = this.codecFor(contentType);\n if (!codec) {\n throw new Error(\n `Codec not found for \"${contentType.toString()}\" content type`,\n );\n }\n const encoded = codec.encode(content, this);\n const fallback = codec.fallback(content);\n if (fallback) {\n encoded.fallback = fallback;\n }\n return toSafeEncodedContent(encoded);\n }\n\n decodeContent(message: SafeMessage, contentType: ContentTypeId) {\n const codec = this.codecFor(contentType);\n if (!codec) {\n throw new Error(\n `Codec not found for \"${contentType.toString()}\" content type`,\n );\n }\n\n // throw an error if there's an invalid group membership change message\n if (\n contentType.sameAs(ContentTypeGroupUpdated) &&\n message.kind !== GroupMessageKind.MembershipChange\n ) {\n throw new Error(\"Error decoding group membership change\");\n }\n\n const encodedContent = fromSafeEncodedContent(message.content);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return codec.decode(encodedContent, this);\n }\n\n signWithInstallationKey(signatureText: string) {\n return this.sendMessage(\"signWithInstallationKey\", { signatureText });\n }\n\n verifySignedWithInstallationKey(\n signatureText: string,\n signatureBytes: Uint8Array,\n ) {\n return this.sendMessage(\"verifySignedWithInstallationKey\", {\n signatureText,\n signatureBytes,\n });\n }\n\n verifySignedWithPublicKey(\n signatureText: string,\n signatureBytes: Uint8Array,\n publicKey: Uint8Array,\n ) {\n return this.sendMessage(\"verifySignedWithPublicKey\", {\n signatureText,\n signatureBytes,\n publicKey,\n });\n }\n}\n","import { v4 } from \"uuid\";\nimport type {\n UtilsEventsActions,\n UtilsEventsErrorData,\n UtilsEventsResult,\n UtilsEventsWorkerMessageData,\n UtilsSendMessageData,\n} from \"@/types\";\n\nconst handleError = (event: ErrorEvent) => {\n console.error(`Worker error on line ${event.lineno} in \"${event.filename}\"`);\n console.error(event.message);\n};\n\nexport class UtilsWorkerClass {\n #worker: Worker;\n\n #enableLogging: boolean;\n\n #promises = new Map<\n string,\n { resolve: (value: any) => void; reject: (reason?: any) => void }\n >();\n\n constructor(worker: Worker, enableLogging: boolean) {\n this.#worker = worker;\n this.#worker.addEventListener(\"message\", this.handleMessage);\n this.#worker.addEventListener(\"error\", handleError);\n this.#enableLogging = enableLogging;\n }\n\n sendMessage<A extends UtilsEventsActions>(\n action: A,\n data: UtilsSendMessageData<A>,\n ) {\n const promiseId = v4();\n this.#worker.postMessage({\n action,\n id: promiseId,\n data,\n });\n const promise = new Promise<UtilsEventsResult<A>>((resolve, reject) => {\n this.#promises.set(promiseId, { resolve, reject });\n });\n return promise;\n }\n\n handleMessage = (\n event: MessageEvent<UtilsEventsWorkerMessageData | UtilsEventsErrorData>,\n ) => {\n const eventData = event.data;\n if (this.#enableLogging) {\n console.log(\"utils received event data\", eventData);\n }\n const promise = this.#promises.get(eventData.id);\n if (promise) {\n this.#promises.delete(eventData.id);\n if (\"error\" in eventData) {\n promise.reject(new Error(eventData.error));\n } else {\n promise.resolve(eventData.result);\n }\n }\n };\n\n close() {\n this.#worker.removeEventListener(\"message\", this.handleMessage);\n this.#worker.removeEventListener(\"error\", handleError);\n this.#worker.terminate();\n }\n}\n","import type { XmtpEnv } from \"@/types/options\";\nimport { UtilsWorkerClass } from \"@/UtilsWorkerClass\";\n\nexport class Utils extends UtilsWorkerClass {\n #enableLogging: boolean;\n constructor(enableLogging?: boolean) {\n const worker = new Worker(new URL(\"./workers/utils\", import.meta.url), {\n type: \"module\",\n });\n super(worker, enableLogging ?? false);\n this.#enableLogging = enableLogging ?? false;\n }\n\n async generateInboxId(address: string) {\n return this.sendMessage(\"generateInboxId\", {\n address,\n enableLogging: this.#enableLogging,\n });\n }\n\n async getInboxIdForAddress(address: string, env?: XmtpEnv) {\n return this.sendMessage(\"getInboxIdForAddress\", {\n address,\n env,\n enableLogging: this.#enableLogging,\n });\n }\n}\n","export const ApiUrls = {\n local: \"http://localhost:5555\",\n dev: \"https://dev.xmtp.network\",\n production: \"https://production.xmtp.network\",\n} as const;\n\nexport const HistorySyncUrls = {\n local: \"http://localhost:5558\",\n dev: \"https://message-history.dev.ephemera.network\",\n production: \"https://message-history.production.ephemera.network\",\n} as const;\n"],"names":["handleError","event","console","error","lineno","filename","message","ClientWorkerClass","worker","enableLogging","promises","Map","constructor","this","addEventListener","handleMessage","sendMessage","action","data","promiseId","v4","postMessage","id","Promise","resolve","reject","set","eventData","log","promise","get","delete","Error","result","handleStreamMessage","streamId","callback","streamHandler","removeEventListener","close","terminate","AsyncStream","done","resolveNext","queue","onReturn","undefined","isDone","value","push","next","length","shift","return","Symbol","asyncIterator","toContentTypeId","contentTypeId","ContentTypeId","authorityId","typeId","versionMajor","versionMinor","fromContentTypeId","WasmContentTypeId","toSafeContentTypeId","fromSafeContentTypeId","toEncodedContent","content","type","parameters","Object","fromEntries","fallback","compression","fromEncodedContent","WasmEncodedContent","entries","toSafeEncodedContent","fromSafeEncodedContent","toSafeMessage","convoId","deliveryStatus","kind","senderInboxId","sentAtNs","toSafeListMessagesOptions","options","direction","limit","sentAfterNs","sentBeforeNs","fromSafeListMessagesOptions","ListMessagesOptions","toSafeListConversationsOptions","allowedStates","consentStates","conversationType","createdAfterNs","createdBeforeNs","includeDuplicateDms","includeSyncGroups","fromSafeListConversationsOptions","ListConversationsOptions","toSafePermissionPolicySet","policySet","addAdminPolicy","addMemberPolicy","removeAdminPolicy","removeMemberPolicy","updateGroupDescriptionPolicy","updateGroupImageUrlSquarePolicy","updateGroupNamePolicy","updateMessageDisappearingPolicy","fromSafePermissionPolicySet","PermissionPolicySet","toSafeCreateGroupOptions","customPermissionPolicySet","description","groupDescription","imageUrlSquare","groupImageUrlSquare","messageDisappearingSettings","toSafeMessageDisappearingSettings","name","groupName","permissions","fromSafeCreateGroupOptions","CreateGroupOptions","GroupPermissionsOptions","CustomPolicy","fromSafeMessageDisappearingSettings","toSafeCreateDmOptions","fromSafeCreateDmOptions","CreateDMOptions","toSafeConversation","async","conversation","imageUrl","isActive","addedByInboxId","metadata","admins","superAdmins","createdAtNs","policyType","toSafeInstallation","installation","bytes","clientTimestampNs","toSafeInboxState","inboxState","accountAddresses","inboxId","installations","map","recoveryAddress","toSafeConsent","consent","entity","entityType","state","fromSafeConsent","Consent","toSafeGroupMember","member","consentState","installationIds","permissionLevel","fromSafeGroupMember","GroupMember","toSafeHmacKey","hmacKey","key","epoch","settings","fromNs","inNs","MessageDisappearingSettings","DecodedMessage","client","contentType","conversationId","encodedContent","GroupMessageKind","Application","MembershipChange","DeliveryStatus","Unpublished","Published","Failed","decodeContent","Conversation","syncData","updateName","updateImageUrl","updateDescription","createdAt","ns","Date","Number","members","syncAdmins","syncSuperAdmins","updatePermission","permissionType","policy","metadataField","isAdmin","includes","isSuperAdmin","sync","addMembers","addMembersByInboxId","inboxIds","removeMembers","removeMembersByInboxId","addAdmin","removeAdmin","addSuperAdmin","removeSuperAdmin","publishMessages","sendOptimistic","safeEncodedContent","encodeContent","ContentTypeText","send","messages","updateConsentState","dmPeerInboxId","updateMessageDisappearingSettings","removeMessageDisappearingSettings","isMessageDisappearingEnabled","stream","asyncStream","endStream","decodedMessage","groupId","Conversations","syncAll","getConversationById","getMessageById","getDmByInboxId","list","listGroups","listDms","newGroup","newGroupByInboxIds","newDm","accountAddress","newDmByInboxId","getHmacKeys","streamGroups","ConversationType","Group","streamDms","Dm","streamAllMessages","streamAllGroupMessages","streamAllDmMessages","Client","codecs","conversations","encryptionKey","installationId","installationIdBytes","isReady","signer","super","Worker","URL","url","loggingLevel","GroupUpdatedCodec","TextCodec","codec","toString","init","address","create","getAddress","disableAutoRegister","register","createInboxSignatureText","addAccountSignatureText","newAccountAddress","removeAccountSignatureText","revokeAllOtherInstallationsSignatureText","revokeInstallationsSignatureText","addSignature","signatureType","signatureText","signature","signMessage","walletType","chainId","getChainId","blockNumber","getBlockNumber","applySignatures","SignatureRequestType","CreateInbox","addAccount","newAccountSigner","AddWallet","removeAccount","RevokeWallet","revokeAllOtherInstallations","RevokeInstallations","revokeInstallations","isRegistered","canMessage","env","Uint8Array","window","crypto","getRandomValues","findInboxIdByAddress","refreshFromNetwork","getLatestInboxState","setConsentStates","records","getConsentState","codecFor","encoded","encode","sameAs","ContentTypeGroupUpdated","decode","signWithInstallationKey","verifySignedWithInstallationKey","signatureBytes","verifySignedWithPublicKey","publicKey","UtilsWorkerClass","Utils","generateInboxId","getInboxIdForAddress","ApiUrls","local","dev","production","HistorySyncUrls"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmtp/browser-sdk",
3
- "version": "0.0.20",
3
+ "version": "0.0.21",
4
4
  "description": "XMTP client SDK for browsers written in TypeScript",
5
5
  "keywords": [
6
6
  "xmtp",
package/src/Client.ts CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  type SafeConsent,
22
22
  type SafeMessage,
23
23
  } from "@/utils/conversions";
24
- import { isSmartContractSigner, type Signer } from "@/utils/signer";
24
+ import { type Signer } from "@/utils/signer";
25
25
 
26
26
  export class Client extends ClientWorkerClass {
27
27
  #accountAddress: string;
@@ -146,12 +146,12 @@ export class Client extends ClientWorkerClass {
146
146
  ) {
147
147
  const signature = await signer.signMessage(signatureText);
148
148
 
149
- if (isSmartContractSigner(signer)) {
149
+ if (signer.walletType === "SCW") {
150
150
  await this.sendMessage("addScwSignature", {
151
151
  type: signatureType,
152
152
  bytes: signature,
153
153
  chainId: signer.getChainId(),
154
- blockNumber: signer.getBlockNumber(),
154
+ blockNumber: signer.getBlockNumber?.(),
155
155
  });
156
156
  } else {
157
157
  await this.sendMessage("addSignature", {
@@ -264,6 +264,7 @@ export class Client extends ClientWorkerClass {
264
264
  static async canMessage(accountAddresses: string[], env?: XmtpEnv) {
265
265
  const accountAddress = "0x0000000000000000000000000000000000000000";
266
266
  const signer: Signer = {
267
+ walletType: "EOA",
267
268
  getAddress: () => accountAddress,
268
269
  signMessage: () => new Uint8Array(),
269
270
  };
package/src/index.ts CHANGED
@@ -36,8 +36,4 @@ export {
36
36
  ContentTypeId,
37
37
  HmacKey,
38
38
  } from "@xmtp/wasm-bindings";
39
- export {
40
- isSmartContractSigner,
41
- type Signer,
42
- type SmartContractSigner,
43
- } from "./utils/signer";
39
+ export type { Signer } from "./utils/signer";
@@ -2,18 +2,17 @@ export type SignMessage = (message: string) => Promise<Uint8Array> | Uint8Array;
2
2
  export type GetAddress = () => Promise<string> | string;
3
3
  export type GetChainId = () => bigint;
4
4
  export type GetBlockNumber = () => bigint;
5
- export type WalletType = () => "EOA" | "SCW";
6
5
 
7
- export type Signer = {
8
- getAddress: GetAddress;
9
- signMessage: SignMessage;
10
- walletType?: WalletType;
11
- getBlockNumber?: GetBlockNumber;
12
- getChainId?: GetChainId;
13
- };
14
-
15
- export type SmartContractSigner = Required<Signer>;
16
-
17
- export const isSmartContractSigner = (
18
- signer: Signer,
19
- ): signer is SmartContractSigner => signer.walletType?.() === "SCW";
6
+ export type Signer =
7
+ | {
8
+ walletType: "EOA";
9
+ getAddress: GetAddress;
10
+ signMessage: SignMessage;
11
+ }
12
+ | {
13
+ walletType: "SCW";
14
+ getAddress: GetAddress;
15
+ signMessage: SignMessage;
16
+ getBlockNumber?: GetBlockNumber;
17
+ getChainId: GetChainId;
18
+ };