@xmtp/browser-sdk 1.0.0-rc1 → 1.0.0
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 +25 -13
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/workers/client.js +1 -1
- package/dist/workers/client.js.map +1 -1
- package/package.json +3 -2
- package/src/Client.ts +11 -24
- package/src/Conversations.ts +0 -46
- package/src/Preferences.ts +75 -0
- package/src/WorkerClient.ts +13 -24
- package/src/WorkerConversations.ts +0 -25
- package/src/WorkerPreferences.ts +58 -0
- package/src/index.ts +1 -0
- package/src/workers/client.ts +10 -6
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/Dm.ts","../src/Group.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 ContentType,\n type DeliveryStatus,\n type GroupMessageKind,\n type HmacKey,\n type Identifier,\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 contentTypes?: ContentType[];\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 contentTypes: options.contentTypes,\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 options.contentTypes,\n );\n\nexport type SafeListConversationsOptions = {\n consentStates?: ConsentState[];\n createdAfterNs?: bigint;\n createdBeforeNs?: bigint;\n includeDuplicateDms?: boolean;\n limit?: bigint;\n};\n\nexport const toSafeListConversationsOptions = (\n options: ListConversationsOptions,\n): SafeListConversationsOptions => ({\n consentStates: options.consentStates,\n createdAfterNs: options.createdAfterNs,\n createdBeforeNs: options.createdBeforeNs,\n includeDuplicateDms: options.includeDuplicateDms,\n limit: options.limit,\n});\n\nexport const fromSafeListConversationsOptions = (\n options: SafeListConversationsOptions,\n): ListConversationsOptions =>\n new ListConversationsOptions(\n options.consentStates,\n options.createdAfterNs,\n options.createdBeforeNs,\n options.includeDuplicateDms ?? 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 accountIdentifiers: Identifier[];\n inboxId: string;\n installations: SafeInstallation[];\n recoveryIdentifier: Identifier;\n};\n\nexport const toSafeInboxState = (inboxState: InboxState): SafeInboxState => ({\n accountIdentifiers: inboxState.accountIdentifiers,\n inboxId: inboxState.inboxId,\n installations: inboxState.installations.map(toSafeInstallation),\n recoveryIdentifier: inboxState.recoveryIdentifier,\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 accountIdentifiers: Identifier[];\n consentState: ConsentState;\n inboxId: string;\n installationIds: string[];\n permissionLevel: PermissionLevel;\n};\n\nexport const toSafeGroupMember = (member: GroupMember): SafeGroupMember => ({\n accountIdentifiers: member.accountIdentifiers,\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.accountIdentifiers,\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 { ConsentState } 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 #isActive?: SafeConversation[\"isActive\"];\n\n #addedByInboxId?: SafeConversation[\"addedByInboxId\"];\n\n #metadata?: SafeConversation[\"metadata\"];\n\n #createdAtNs?: SafeConversation[\"createdAtNs\"];\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.#isActive = data?.isActive ?? undefined;\n this.#addedByInboxId = data?.addedByInboxId ?? \"\";\n this.#metadata = data?.metadata ?? undefined;\n this.#createdAtNs = data?.createdAtNs ?? undefined;\n }\n\n get id() {\n return this.#id;\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 async sync() {\n const data = await this.#client.sendMessage(\"syncGroup\", {\n id: this.#id,\n });\n this.#syncData(data);\n return data;\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 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 if (error) {\n void asyncStream.callback(error, undefined);\n void callback?.(error, undefined);\n return;\n }\n\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(null, decodedMessage);\n void callback?.(null, 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 async pausedForVersion() {\n return this.#client.sendMessage(\"getGroupPausedForVersion\", {\n id: this.#id,\n });\n }\n}\n","export function nsToDate(ns: bigint): Date {\n return new Date(Number(ns / 1_000_000n));\n}\n","import type { Client } from \"@/Client\";\nimport { Conversation } from \"@/Conversation\";\nimport type { SafeConversation } from \"@/utils/conversions\";\n\nexport class Dm extends Conversation {\n #client: Client;\n\n #id: string;\n\n constructor(client: Client, id: string, data?: SafeConversation) {\n super(client, id, data);\n this.#client = client;\n this.#id = id;\n }\n\n async peerInboxId() {\n return this.#client.sendMessage(\"getDmPeerInboxId\", {\n id: this.#id,\n });\n }\n}\n","import type {\n Identifier,\n MetadataField,\n PermissionPolicy,\n PermissionUpdateType,\n} from \"@xmtp/wasm-bindings\";\nimport type { Client } from \"@/Client\";\nimport { Conversation } from \"@/Conversation\";\nimport type { SafeConversation } from \"@/utils/conversions\";\n\nexport class Group extends 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 #admins: SafeConversation[\"admins\"] = [];\n\n #superAdmins: SafeConversation[\"superAdmins\"] = [];\n\n #syncData(data?: SafeConversation) {\n this.#name = data?.name ?? \"\";\n this.#imageUrl = data?.imageUrl ?? \"\";\n this.#description = data?.description ?? \"\";\n this.#admins = data?.admins ?? [];\n this.#superAdmins = data?.superAdmins ?? [];\n }\n\n constructor(client: Client, id: string, data?: SafeConversation) {\n super(client, id, data);\n this.#client = client;\n this.#id = id;\n this.#syncData(data);\n }\n\n async sync() {\n const data = await super.sync();\n this.#syncData(data);\n return data;\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 admins() {\n return this.#admins;\n }\n\n get superAdmins() {\n return this.#superAdmins;\n }\n\n async listAdmins() {\n const admins = await this.#client.sendMessage(\"getGroupAdmins\", {\n id: this.#id,\n });\n this.#admins = admins;\n return admins;\n }\n\n async listSuperAdmins() {\n const superAdmins = await this.#client.sendMessage(\"getGroupSuperAdmins\", {\n id: this.#id,\n });\n this.#superAdmins = superAdmins;\n return 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 const admins = await this.listAdmins();\n return admins.includes(inboxId);\n }\n\n async isSuperAdmin(inboxId: string) {\n const superAdmins = await this.listSuperAdmins();\n return superAdmins.includes(inboxId);\n }\n\n async addMembersByIdentifiers(identifiers: Identifier[]) {\n return this.#client.sendMessage(\"addGroupMembers\", {\n id: this.#id,\n identifiers,\n });\n }\n\n async addMembers(inboxIds: string[]) {\n return this.#client.sendMessage(\"addGroupMembersByInboxId\", {\n id: this.#id,\n inboxIds,\n });\n }\n\n async removeMembersByIdentifiers(identifiers: Identifier[]) {\n return this.#client.sendMessage(\"removeGroupMembers\", {\n id: this.#id,\n identifiers,\n });\n }\n\n async removeMembers(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","import {\n ConversationType,\n type ConsentState,\n type Identifier,\n type UserPreference,\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 { Dm } from \"@/Dm\";\nimport { Group } from \"@/Group\";\nimport type {\n SafeConsent,\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 if (data) {\n return data.metadata.conversationType === \"group\"\n ? new Group(this.#client, data.id, data)\n : new Dm(this.#client, data.id, data);\n }\n return 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 Dm(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((conversation) =>\n conversation.metadata.conversationType === \"group\"\n ? new Group(this.#client, conversation.id, conversation)\n : new Dm(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) => new Group(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) => new Dm(this.#client, conversation.id, conversation),\n );\n }\n\n async newGroupWithIdentifiers(\n identifiers: Identifier[],\n options?: SafeCreateGroupOptions,\n ) {\n const conversation = await this.#client.sendMessage(\n \"newGroupWithIdentifiers\",\n {\n identifiers,\n options,\n },\n );\n\n return new Group(this.#client, conversation.id, conversation);\n }\n\n async newGroup(inboxIds: string[], options?: SafeCreateGroupOptions) {\n const conversation = await this.#client.sendMessage(\n \"newGroupWithInboxIds\",\n {\n inboxIds,\n options,\n },\n );\n\n return new Group(this.#client, conversation.id, conversation);\n }\n\n async newDmWithIdentifier(\n identifier: Identifier,\n options?: SafeCreateDmOptions,\n ) {\n const conversation = await this.#client.sendMessage(\"newDmWithIdentifier\", {\n identifier,\n options,\n });\n\n return new Dm(this.#client, conversation.id, conversation);\n }\n\n async newDm(inboxId: string, options?: SafeCreateDmOptions) {\n const conversation = await this.#client.sendMessage(\"newDmWithInboxId\", {\n inboxId,\n options,\n });\n\n return new Dm(this.#client, conversation.id, conversation);\n }\n\n async getHmacKeys() {\n return this.#client.sendMessage(\"getHmacKeys\", undefined);\n }\n\n async stream<T extends Group | Dm = Group | Dm>(\n callback?: StreamCallback<T>,\n conversationType?: ConversationType,\n ) {\n const streamId = v4();\n const asyncStream = new AsyncStream<T>();\n const endStream = this.#client.handleStreamMessage<SafeConversation>(\n streamId,\n (error, value) => {\n if (error) {\n void asyncStream.callback(error, undefined);\n void callback?.(error, undefined);\n return;\n }\n\n let streamValue: T | undefined = undefined;\n\n if (value) {\n streamValue =\n value.metadata.conversationType === \"group\"\n ? (new Group(this.#client, value.id, value) as T)\n : (new Dm(this.#client, value.id, value) as T);\n }\n\n void asyncStream.callback(null, streamValue);\n void callback?.(null, streamValue);\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<Group>) {\n return this.stream<Group>(callback, ConversationType.Group);\n }\n\n async streamDms(callback?: StreamCallback<Dm>) {\n return this.stream<Dm>(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 if (error) {\n void asyncStream.callback(error, undefined);\n void callback?.(error, undefined);\n return;\n }\n\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(null, decodedMessage);\n void callback?.(null, 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 async streamConsent(callback?: StreamCallback<SafeConsent[]>) {\n const streamId = v4();\n const asyncStream = new AsyncStream<SafeConsent[]>();\n const endStream = this.#client.handleStreamMessage<SafeConsent[]>(\n streamId,\n (error, value) => {\n void asyncStream.callback(error, value ?? undefined);\n void callback?.(error, value ?? undefined);\n },\n );\n await this.#client.sendMessage(\"streamConsent\", {\n streamId,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n\n async streamPreferences(callback?: StreamCallback<UserPreference[]>) {\n const streamId = v4();\n const asyncStream = new AsyncStream<UserPreference[]>();\n const endStream = this.#client.handleStreamMessage<UserPreference[]>(\n streamId,\n (error, value) => {\n void asyncStream.callback(error, value ?? undefined);\n void callback?.(error, value ?? undefined);\n },\n );\n await this.#client.sendMessage(\"streamPreferences\", {\n streamId,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\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 type Identifier,\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 #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 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.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 async init() {\n const result = await this.sendMessage(\"init\", {\n identifier: await this.#signer.getIdentifier(),\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 client = new Client(signer, 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 async accountIdentifier() {\n return this.#signer.getIdentifier();\n }\n\n get installationId() {\n return this.#installationId;\n }\n\n get installationIdBytes() {\n return this.#installationIdBytes;\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `register` function instead.\n */\n async unsafe_createInboxSignatureText() {\n return this.sendMessage(\"createInboxSignatureText\", undefined);\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `unsafe_addAccount` function instead.\n *\n * The `allowInboxReassign` parameter must be true or this function will\n * throw an error.\n */\n async unsafe_addAccountSignatureText(\n newIdentifier: Identifier,\n allowInboxReassign: boolean = false,\n ) {\n if (!allowInboxReassign) {\n throw new Error(\n \"Unable to create add account signature text, `allowInboxReassign` must be true\",\n );\n }\n\n return this.sendMessage(\"addAccountSignatureText\", {\n newIdentifier,\n });\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `removeAccount` function instead.\n */\n async unsafe_removeAccountSignatureText(identifier: Identifier) {\n return this.sendMessage(\"removeAccountSignatureText\", {\n identifier,\n });\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `revokeAllOtherInstallations` function\n * instead.\n */\n async unsafe_revokeAllOtherInstallationsSignatureText() {\n return this.sendMessage(\n \"revokeAllOtherInstallationsSignatureText\",\n undefined,\n );\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `revokeInstallations` function instead.\n */\n async unsafe_revokeInstallationsSignatureText(installationIds: Uint8Array[]) {\n return this.sendMessage(\"revokeInstallationsSignatureText\", {\n installationIds,\n });\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `register`, `addAccount`,\n * `removeAccount`, `revokeAllOtherInstallations`, or `revokeInstallations`\n * functions instead.\n */\n async unsafe_addSignature(\n signatureType: SignatureRequestType,\n signatureText: string,\n signer: Signer,\n ) {\n const signature = await signer.signMessage(signatureText);\n\n switch (signer.type) {\n case \"SCW\":\n await this.sendMessage(\"addScwSignature\", {\n type: signatureType,\n bytes: signature,\n chainId: signer.getChainId(),\n blockNumber: signer.getBlockNumber?.(),\n });\n break;\n case \"EOA\":\n await this.sendMessage(\"addEcdsaSignature\", {\n type: signatureType,\n bytes: signature,\n });\n break;\n }\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `register`, `addAccount`,\n * `removeAccount`, `revokeAllOtherInstallations`, or `revokeInstallations`\n * functions instead.\n */\n async unsafe_applySignatures() {\n return this.sendMessage(\"applySignatures\", undefined);\n }\n\n async register() {\n const signatureText = await this.unsafe_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.unsafe_addSignature(\n SignatureRequestType.CreateInbox,\n signatureText,\n this.#signer,\n );\n\n return this.sendMessage(\"registerIdentity\", undefined);\n }\n\n /**\n * WARNING: This function should be used with caution. Adding a wallet already\n * associated with an inboxId will cause the wallet to lose access to\n * that inbox.\n *\n * The `allowInboxReassign` parameter must be true to reassign an inbox\n * already associated with a different account.\n */\n async unsafe_addAccount(\n newAccountSigner: Signer,\n allowInboxReassign: boolean = false,\n ) {\n // check for existing inbox id\n const existingInboxId = await this.findInboxIdByIdentifier(\n await newAccountSigner.getIdentifier(),\n );\n\n if (existingInboxId && !allowInboxReassign) {\n throw new Error(\n `Signer address already associated with inbox ${existingInboxId}`,\n );\n }\n\n const signatureText = await this.unsafe_addAccountSignatureText(\n await newAccountSigner.getIdentifier(),\n true,\n );\n\n if (!signatureText) {\n throw new Error(\"Unable to generate add account signature text\");\n }\n\n await this.unsafe_addSignature(\n SignatureRequestType.AddWallet,\n signatureText,\n newAccountSigner,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async removeAccount(accountIdentifier: Identifier) {\n const signatureText =\n await this.unsafe_removeAccountSignatureText(accountIdentifier);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate remove account signature text\");\n }\n\n await this.unsafe_addSignature(\n SignatureRequestType.RevokeWallet,\n signatureText,\n this.#signer,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async revokeAllOtherInstallations() {\n const signatureText =\n await this.unsafe_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.unsafe_addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async revokeInstallations(installationIds: Uint8Array[]) {\n const signatureText =\n await this.unsafe_revokeInstallationsSignatureText(installationIds);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate revoke installations signature text\");\n }\n\n await this.unsafe_addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async isRegistered() {\n return this.sendMessage(\"isRegistered\", undefined);\n }\n\n async canMessage(identifiers: Identifier[]) {\n return this.sendMessage(\"canMessage\", { identifiers });\n }\n\n static async canMessage(identifiers: Identifier[], env?: XmtpEnv) {\n const signer: Signer = {\n type: \"EOA\",\n getIdentifier: () => ({\n identifier: \"0x0000000000000000000000000000000000000000\",\n identifierKind: \"Ethereum\",\n }),\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(identifiers);\n }\n\n async findInboxIdByIdentifier(identifier: Identifier) {\n return this.sendMessage(\"findInboxIdByIdentifier\", { identifier });\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 { Identifier } from \"@xmtp/wasm-bindings\";\nimport 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(identifier: Identifier) {\n return this.sendMessage(\"generateInboxId\", {\n identifier,\n enableLogging: this.#enableLogging,\n });\n }\n\n async getInboxIdForIdentifier(identifier: Identifier, env?: XmtpEnv) {\n return this.sendMessage(\"getInboxIdForIdentifier\", {\n identifier,\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","contentTypes","direction","limit","sentAfterNs","sentBeforeNs","fromSafeListMessagesOptions","ListMessagesOptions","toSafeListConversationsOptions","consentStates","createdAfterNs","createdBeforeNs","includeDuplicateDms","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","accountIdentifiers","inboxId","installations","map","recoveryIdentifier","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","createdAt","ns","Date","Number","members","sync","publishMessages","sendOptimistic","safeEncodedContent","encodeContent","ContentTypeText","send","messages","updateConsentState","updateMessageDisappearingSettings","removeMessageDisappearingSettings","isMessageDisappearingEnabled","stream","asyncStream","endStream","decodedMessage","groupId","pausedForVersion","Dm","super","peerInboxId","Group","updateName","updateImageUrl","updateDescription","listAdmins","listSuperAdmins","updatePermission","permissionType","policy","metadataField","isAdmin","includes","isSuperAdmin","addMembersByIdentifiers","identifiers","addMembers","inboxIds","removeMembersByIdentifiers","removeMembers","addAdmin","removeAdmin","addSuperAdmin","removeSuperAdmin","Conversations","syncAll","getConversationById","conversationType","getMessageById","getDmByInboxId","list","listGroups","listDms","newGroupWithIdentifiers","newGroup","newDmWithIdentifier","identifier","newDm","getHmacKeys","streamValue","streamGroups","ConversationType","streamDms","streamAllMessages","streamAllGroupMessages","streamAllDmMessages","streamConsent","streamPreferences","Client","codecs","conversations","encryptionKey","installationId","installationIdBytes","isReady","signer","Worker","URL","url","loggingLevel","GroupUpdatedCodec","TextCodec","codec","toString","init","getIdentifier","create","disableAutoRegister","register","accountIdentifier","unsafe_createInboxSignatureText","unsafe_addAccountSignatureText","newIdentifier","allowInboxReassign","unsafe_removeAccountSignatureText","unsafe_revokeAllOtherInstallationsSignatureText","unsafe_revokeInstallationsSignatureText","unsafe_addSignature","signatureType","signatureText","signature","signMessage","chainId","getChainId","blockNumber","getBlockNumber","unsafe_applySignatures","SignatureRequestType","CreateInbox","unsafe_addAccount","newAccountSigner","existingInboxId","findInboxIdByIdentifier","AddWallet","removeAccount","RevokeWallet","revokeAllOtherInstallations","RevokeInstallations","revokeInstallations","isRegistered","canMessage","env","identifierKind","Uint8Array","window","crypto","getRandomValues","refreshFromNetwork","getLatestInboxState","setConsentStates","records","getConsentState","codecFor","encoded","encode","sameAs","ContentTypeGroupUpdated","decode","signWithInstallationKey","verifySignedWithInstallationKey","signatureBytes","verifySignedWithPublicKey","publicKey","UtilsWorkerClass","Utils","generateInboxId","getInboxIdForIdentifier","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/Dm.ts","../src/Group.ts","../src/Conversations.ts","../src/Preferences.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 ContentType,\n type DeliveryStatus,\n type GroupMessageKind,\n type HmacKey,\n type Identifier,\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 contentTypes?: ContentType[];\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 contentTypes: options.contentTypes,\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 options.contentTypes,\n );\n\nexport type SafeListConversationsOptions = {\n consentStates?: ConsentState[];\n createdAfterNs?: bigint;\n createdBeforeNs?: bigint;\n includeDuplicateDms?: boolean;\n limit?: bigint;\n};\n\nexport const toSafeListConversationsOptions = (\n options: ListConversationsOptions,\n): SafeListConversationsOptions => ({\n consentStates: options.consentStates,\n createdAfterNs: options.createdAfterNs,\n createdBeforeNs: options.createdBeforeNs,\n includeDuplicateDms: options.includeDuplicateDms,\n limit: options.limit,\n});\n\nexport const fromSafeListConversationsOptions = (\n options: SafeListConversationsOptions,\n): ListConversationsOptions =>\n new ListConversationsOptions(\n options.consentStates,\n options.createdAfterNs,\n options.createdBeforeNs,\n options.includeDuplicateDms ?? 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 accountIdentifiers: Identifier[];\n inboxId: string;\n installations: SafeInstallation[];\n recoveryIdentifier: Identifier;\n};\n\nexport const toSafeInboxState = (inboxState: InboxState): SafeInboxState => ({\n accountIdentifiers: inboxState.accountIdentifiers,\n inboxId: inboxState.inboxId,\n installations: inboxState.installations.map(toSafeInstallation),\n recoveryIdentifier: inboxState.recoveryIdentifier,\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 accountIdentifiers: Identifier[];\n consentState: ConsentState;\n inboxId: string;\n installationIds: string[];\n permissionLevel: PermissionLevel;\n};\n\nexport const toSafeGroupMember = (member: GroupMember): SafeGroupMember => ({\n accountIdentifiers: member.accountIdentifiers,\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.accountIdentifiers,\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 { ConsentState } 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 #isActive?: SafeConversation[\"isActive\"];\n\n #addedByInboxId?: SafeConversation[\"addedByInboxId\"];\n\n #metadata?: SafeConversation[\"metadata\"];\n\n #createdAtNs?: SafeConversation[\"createdAtNs\"];\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.#isActive = data?.isActive ?? undefined;\n this.#addedByInboxId = data?.addedByInboxId ?? \"\";\n this.#metadata = data?.metadata ?? undefined;\n this.#createdAtNs = data?.createdAtNs ?? undefined;\n }\n\n get id() {\n return this.#id;\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 async sync() {\n const data = await this.#client.sendMessage(\"syncGroup\", {\n id: this.#id,\n });\n this.#syncData(data);\n return data;\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 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 if (error) {\n void asyncStream.callback(error, undefined);\n void callback?.(error, undefined);\n return;\n }\n\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(null, decodedMessage);\n void callback?.(null, 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 async pausedForVersion() {\n return this.#client.sendMessage(\"getGroupPausedForVersion\", {\n id: this.#id,\n });\n }\n}\n","export function nsToDate(ns: bigint): Date {\n return new Date(Number(ns / 1_000_000n));\n}\n","import type { Client } from \"@/Client\";\nimport { Conversation } from \"@/Conversation\";\nimport type { SafeConversation } from \"@/utils/conversions\";\n\nexport class Dm extends Conversation {\n #client: Client;\n\n #id: string;\n\n constructor(client: Client, id: string, data?: SafeConversation) {\n super(client, id, data);\n this.#client = client;\n this.#id = id;\n }\n\n async peerInboxId() {\n return this.#client.sendMessage(\"getDmPeerInboxId\", {\n id: this.#id,\n });\n }\n}\n","import type {\n Identifier,\n MetadataField,\n PermissionPolicy,\n PermissionUpdateType,\n} from \"@xmtp/wasm-bindings\";\nimport type { Client } from \"@/Client\";\nimport { Conversation } from \"@/Conversation\";\nimport type { SafeConversation } from \"@/utils/conversions\";\n\nexport class Group extends 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 #admins: SafeConversation[\"admins\"] = [];\n\n #superAdmins: SafeConversation[\"superAdmins\"] = [];\n\n #syncData(data?: SafeConversation) {\n this.#name = data?.name ?? \"\";\n this.#imageUrl = data?.imageUrl ?? \"\";\n this.#description = data?.description ?? \"\";\n this.#admins = data?.admins ?? [];\n this.#superAdmins = data?.superAdmins ?? [];\n }\n\n constructor(client: Client, id: string, data?: SafeConversation) {\n super(client, id, data);\n this.#client = client;\n this.#id = id;\n this.#syncData(data);\n }\n\n async sync() {\n const data = await super.sync();\n this.#syncData(data);\n return data;\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 admins() {\n return this.#admins;\n }\n\n get superAdmins() {\n return this.#superAdmins;\n }\n\n async listAdmins() {\n const admins = await this.#client.sendMessage(\"getGroupAdmins\", {\n id: this.#id,\n });\n this.#admins = admins;\n return admins;\n }\n\n async listSuperAdmins() {\n const superAdmins = await this.#client.sendMessage(\"getGroupSuperAdmins\", {\n id: this.#id,\n });\n this.#superAdmins = superAdmins;\n return 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 const admins = await this.listAdmins();\n return admins.includes(inboxId);\n }\n\n async isSuperAdmin(inboxId: string) {\n const superAdmins = await this.listSuperAdmins();\n return superAdmins.includes(inboxId);\n }\n\n async addMembersByIdentifiers(identifiers: Identifier[]) {\n return this.#client.sendMessage(\"addGroupMembers\", {\n id: this.#id,\n identifiers,\n });\n }\n\n async addMembers(inboxIds: string[]) {\n return this.#client.sendMessage(\"addGroupMembersByInboxId\", {\n id: this.#id,\n inboxIds,\n });\n }\n\n async removeMembersByIdentifiers(identifiers: Identifier[]) {\n return this.#client.sendMessage(\"removeGroupMembers\", {\n id: this.#id,\n identifiers,\n });\n }\n\n async removeMembers(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","import {\n ConversationType,\n type ConsentState,\n type Identifier,\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 { Dm } from \"@/Dm\";\nimport { Group } from \"@/Group\";\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 if (data) {\n return data.metadata.conversationType === \"group\"\n ? new Group(this.#client, data.id, data)\n : new Dm(this.#client, data.id, data);\n }\n return 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 Dm(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((conversation) =>\n conversation.metadata.conversationType === \"group\"\n ? new Group(this.#client, conversation.id, conversation)\n : new Dm(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) => new Group(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) => new Dm(this.#client, conversation.id, conversation),\n );\n }\n\n async newGroupWithIdentifiers(\n identifiers: Identifier[],\n options?: SafeCreateGroupOptions,\n ) {\n const conversation = await this.#client.sendMessage(\n \"newGroupWithIdentifiers\",\n {\n identifiers,\n options,\n },\n );\n\n return new Group(this.#client, conversation.id, conversation);\n }\n\n async newGroup(inboxIds: string[], options?: SafeCreateGroupOptions) {\n const conversation = await this.#client.sendMessage(\n \"newGroupWithInboxIds\",\n {\n inboxIds,\n options,\n },\n );\n\n return new Group(this.#client, conversation.id, conversation);\n }\n\n async newDmWithIdentifier(\n identifier: Identifier,\n options?: SafeCreateDmOptions,\n ) {\n const conversation = await this.#client.sendMessage(\"newDmWithIdentifier\", {\n identifier,\n options,\n });\n\n return new Dm(this.#client, conversation.id, conversation);\n }\n\n async newDm(inboxId: string, options?: SafeCreateDmOptions) {\n const conversation = await this.#client.sendMessage(\"newDmWithInboxId\", {\n inboxId,\n options,\n });\n\n return new Dm(this.#client, conversation.id, conversation);\n }\n\n async getHmacKeys() {\n return this.#client.sendMessage(\"getHmacKeys\", undefined);\n }\n\n async stream<T extends Group | Dm = Group | Dm>(\n callback?: StreamCallback<T>,\n conversationType?: ConversationType,\n ) {\n const streamId = v4();\n const asyncStream = new AsyncStream<T>();\n const endStream = this.#client.handleStreamMessage<SafeConversation>(\n streamId,\n (error, value) => {\n if (error) {\n void asyncStream.callback(error, undefined);\n void callback?.(error, undefined);\n return;\n }\n\n let streamValue: T | undefined = undefined;\n\n if (value) {\n streamValue =\n value.metadata.conversationType === \"group\"\n ? (new Group(this.#client, value.id, value) as T)\n : (new Dm(this.#client, value.id, value) as T);\n }\n\n void asyncStream.callback(null, streamValue);\n void callback?.(null, streamValue);\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<Group>) {\n return this.stream<Group>(callback, ConversationType.Group);\n }\n\n async streamDms(callback?: StreamCallback<Dm>) {\n return this.stream<Dm>(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 if (error) {\n void asyncStream.callback(error, undefined);\n void callback?.(error, undefined);\n return;\n }\n\n const decodedMessage = value\n ? new DecodedMessage(this.#client, value)\n : undefined;\n void asyncStream.callback(null, decodedMessage);\n void callback?.(null, 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 type { ConsentEntityType, UserPreference } from \"@xmtp/wasm-bindings\";\nimport { v4 } from \"uuid\";\nimport { AsyncStream, type StreamCallback } from \"@/AsyncStream\";\nimport type { SafeConsent } from \"@/utils/conversions\";\nimport type { Client } from \"./Client\";\n\nexport class Preferences {\n #client: Client;\n\n constructor(client: Client) {\n this.#client = client;\n }\n\n async inboxState(refreshFromNetwork?: boolean) {\n return this.#client.sendMessage(\"inboxState\", {\n refreshFromNetwork: refreshFromNetwork ?? false,\n });\n }\n\n async getLatestInboxState(inboxId: string) {\n return this.#client.sendMessage(\"getLatestInboxState\", { inboxId });\n }\n\n async setConsentStates(records: SafeConsent[]) {\n return this.#client.sendMessage(\"setConsentStates\", { records });\n }\n\n async getConsentState(entityType: ConsentEntityType, entity: string) {\n return this.#client.sendMessage(\"getConsentState\", { entityType, entity });\n }\n\n async streamConsent(callback?: StreamCallback<SafeConsent[]>) {\n const streamId = v4();\n const asyncStream = new AsyncStream<SafeConsent[]>();\n const endStream = this.#client.handleStreamMessage<SafeConsent[]>(\n streamId,\n (error, value) => {\n void asyncStream.callback(error, value ?? undefined);\n void callback?.(error, value ?? undefined);\n },\n );\n await this.#client.sendMessage(\"streamConsent\", {\n streamId,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\n }\n\n async streamPreferences(callback?: StreamCallback<UserPreference[]>) {\n const streamId = v4();\n const asyncStream = new AsyncStream<UserPreference[]>();\n const endStream = this.#client.handleStreamMessage<UserPreference[]>(\n streamId,\n (error, value) => {\n void asyncStream.callback(error, value ?? undefined);\n void callback?.(error, value ?? undefined);\n },\n );\n await this.#client.sendMessage(\"streamPreferences\", {\n streamId,\n });\n asyncStream.onReturn = () => {\n void this.#client.sendMessage(\"endStream\", {\n streamId,\n });\n endStream();\n };\n return asyncStream;\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 Identifier,\n} from \"@xmtp/wasm-bindings\";\nimport { ClientWorkerClass } from \"@/ClientWorkerClass\";\nimport { Conversations } from \"@/Conversations\";\nimport { Preferences } from \"@/Preferences\";\nimport type { ClientOptions, XmtpEnv } from \"@/types\";\nimport {\n fromSafeEncodedContent,\n toSafeEncodedContent,\n type SafeMessage,\n} from \"@/utils/conversions\";\nimport { type Signer } from \"@/utils/signer\";\n\nexport class Client extends ClientWorkerClass {\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 #preferences: Preferences;\n #signer: Signer;\n options?: ClientOptions;\n\n constructor(\n signer: Signer,\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.options = options;\n this.#encryptionKey = encryptionKey;\n this.#signer = signer;\n this.#conversations = new Conversations(this);\n this.#preferences = new Preferences(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 async init() {\n const result = await this.sendMessage(\"init\", {\n identifier: await this.#signer.getIdentifier(),\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 client = new Client(signer, 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 async accountIdentifier() {\n return this.#signer.getIdentifier();\n }\n\n get installationId() {\n return this.#installationId;\n }\n\n get installationIdBytes() {\n return this.#installationIdBytes;\n }\n\n get conversations() {\n return this.#conversations;\n }\n\n get preferences() {\n return this.#preferences;\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `register` function instead.\n */\n async unsafe_createInboxSignatureText() {\n return this.sendMessage(\"createInboxSignatureText\", undefined);\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `unsafe_addAccount` function instead.\n *\n * The `allowInboxReassign` parameter must be true or this function will\n * throw an error.\n */\n async unsafe_addAccountSignatureText(\n newIdentifier: Identifier,\n allowInboxReassign: boolean = false,\n ) {\n if (!allowInboxReassign) {\n throw new Error(\n \"Unable to create add account signature text, `allowInboxReassign` must be true\",\n );\n }\n\n return this.sendMessage(\"addAccountSignatureText\", {\n newIdentifier,\n });\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `removeAccount` function instead.\n */\n async unsafe_removeAccountSignatureText(identifier: Identifier) {\n return this.sendMessage(\"removeAccountSignatureText\", {\n identifier,\n });\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `revokeAllOtherInstallations` function\n * instead.\n */\n async unsafe_revokeAllOtherInstallationsSignatureText() {\n return this.sendMessage(\n \"revokeAllOtherInstallationsSignatureText\",\n undefined,\n );\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `revokeInstallations` function instead.\n */\n async unsafe_revokeInstallationsSignatureText(installationIds: Uint8Array[]) {\n return this.sendMessage(\"revokeInstallationsSignatureText\", {\n installationIds,\n });\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `register`, `addAccount`,\n * `removeAccount`, `revokeAllOtherInstallations`, or `revokeInstallations`\n * functions instead.\n */\n async unsafe_addSignature(\n signatureType: SignatureRequestType,\n signatureText: string,\n signer: Signer,\n ) {\n const signature = await signer.signMessage(signatureText);\n\n switch (signer.type) {\n case \"SCW\":\n await this.sendMessage(\"addScwSignature\", {\n type: signatureType,\n bytes: signature,\n chainId: signer.getChainId(),\n blockNumber: signer.getBlockNumber?.(),\n });\n break;\n case \"EOA\":\n await this.sendMessage(\"addEcdsaSignature\", {\n type: signatureType,\n bytes: signature,\n });\n break;\n }\n }\n\n /**\n * WARNING: This function should be used with caution. It is only provided\n * for use in special cases where the provided workflows do not meet the\n * requirements of an application.\n *\n * It is highly recommended to use the `register`, `addAccount`,\n * `removeAccount`, `revokeAllOtherInstallations`, or `revokeInstallations`\n * functions instead.\n */\n async unsafe_applySignatures() {\n return this.sendMessage(\"applySignatures\", undefined);\n }\n\n async register() {\n const signatureText = await this.unsafe_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.unsafe_addSignature(\n SignatureRequestType.CreateInbox,\n signatureText,\n this.#signer,\n );\n\n return this.sendMessage(\"registerIdentity\", undefined);\n }\n\n /**\n * WARNING: This function should be used with caution. Adding a wallet already\n * associated with an inboxId will cause the wallet to lose access to\n * that inbox.\n *\n * The `allowInboxReassign` parameter must be true to reassign an inbox\n * already associated with a different account.\n */\n async unsafe_addAccount(\n newAccountSigner: Signer,\n allowInboxReassign: boolean = false,\n ) {\n // check for existing inbox id\n const existingInboxId = await this.findInboxIdByIdentifier(\n await newAccountSigner.getIdentifier(),\n );\n\n if (existingInboxId && !allowInboxReassign) {\n throw new Error(\n `Signer address already associated with inbox ${existingInboxId}`,\n );\n }\n\n const signatureText = await this.unsafe_addAccountSignatureText(\n await newAccountSigner.getIdentifier(),\n true,\n );\n\n if (!signatureText) {\n throw new Error(\"Unable to generate add account signature text\");\n }\n\n await this.unsafe_addSignature(\n SignatureRequestType.AddWallet,\n signatureText,\n newAccountSigner,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async removeAccount(accountIdentifier: Identifier) {\n const signatureText =\n await this.unsafe_removeAccountSignatureText(accountIdentifier);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate remove account signature text\");\n }\n\n await this.unsafe_addSignature(\n SignatureRequestType.RevokeWallet,\n signatureText,\n this.#signer,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async revokeAllOtherInstallations() {\n const signatureText =\n await this.unsafe_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.unsafe_addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async revokeInstallations(installationIds: Uint8Array[]) {\n const signatureText =\n await this.unsafe_revokeInstallationsSignatureText(installationIds);\n\n if (!signatureText) {\n throw new Error(\"Unable to generate revoke installations signature text\");\n }\n\n await this.unsafe_addSignature(\n SignatureRequestType.RevokeInstallations,\n signatureText,\n this.#signer,\n );\n\n await this.unsafe_applySignatures();\n }\n\n async isRegistered() {\n return this.sendMessage(\"isRegistered\", undefined);\n }\n\n async canMessage(identifiers: Identifier[]) {\n return this.sendMessage(\"canMessage\", { identifiers });\n }\n\n static async canMessage(identifiers: Identifier[], env?: XmtpEnv) {\n const signer: Signer = {\n type: \"EOA\",\n getIdentifier: () => ({\n identifier: \"0x0000000000000000000000000000000000000000\",\n identifierKind: \"Ethereum\",\n }),\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(identifiers);\n }\n\n async findInboxIdByIdentifier(identifier: Identifier) {\n return this.sendMessage(\"findInboxIdByIdentifier\", { identifier });\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 { Identifier } from \"@xmtp/wasm-bindings\";\nimport 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(identifier: Identifier) {\n return this.sendMessage(\"generateInboxId\", {\n identifier,\n enableLogging: this.#enableLogging,\n });\n }\n\n async getInboxIdForIdentifier(identifier: Identifier, env?: XmtpEnv) {\n return this.sendMessage(\"getInboxIdForIdentifier\", {\n identifier,\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","contentTypes","direction","limit","sentAfterNs","sentBeforeNs","fromSafeListMessagesOptions","ListMessagesOptions","toSafeListConversationsOptions","consentStates","createdAfterNs","createdBeforeNs","includeDuplicateDms","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","accountIdentifiers","inboxId","installations","map","recoveryIdentifier","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","createdAt","ns","Date","Number","members","sync","publishMessages","sendOptimistic","safeEncodedContent","encodeContent","ContentTypeText","send","messages","updateConsentState","updateMessageDisappearingSettings","removeMessageDisappearingSettings","isMessageDisappearingEnabled","stream","asyncStream","endStream","decodedMessage","groupId","pausedForVersion","Dm","super","peerInboxId","Group","updateName","updateImageUrl","updateDescription","listAdmins","listSuperAdmins","updatePermission","permissionType","policy","metadataField","isAdmin","includes","isSuperAdmin","addMembersByIdentifiers","identifiers","addMembers","inboxIds","removeMembersByIdentifiers","removeMembers","addAdmin","removeAdmin","addSuperAdmin","removeSuperAdmin","Conversations","syncAll","getConversationById","conversationType","getMessageById","getDmByInboxId","list","listGroups","listDms","newGroupWithIdentifiers","newGroup","newDmWithIdentifier","identifier","newDm","getHmacKeys","streamValue","streamGroups","ConversationType","streamDms","streamAllMessages","streamAllGroupMessages","streamAllDmMessages","Preferences","refreshFromNetwork","getLatestInboxState","setConsentStates","records","getConsentState","streamConsent","streamPreferences","Client","codecs","conversations","encryptionKey","installationId","installationIdBytes","isReady","preferences","signer","Worker","URL","url","loggingLevel","GroupUpdatedCodec","TextCodec","codec","toString","init","getIdentifier","create","disableAutoRegister","register","accountIdentifier","unsafe_createInboxSignatureText","unsafe_addAccountSignatureText","newIdentifier","allowInboxReassign","unsafe_removeAccountSignatureText","unsafe_revokeAllOtherInstallationsSignatureText","unsafe_revokeInstallationsSignatureText","unsafe_addSignature","signatureType","signatureText","signature","signMessage","chainId","getChainId","blockNumber","getBlockNumber","unsafe_applySignatures","SignatureRequestType","CreateInbox","unsafe_addAccount","newAccountSigner","existingInboxId","findInboxIdByIdentifier","AddWallet","removeAccount","RevokeWallet","revokeAllOtherInstallations","RevokeInstallations","revokeInstallations","isRegistered","canMessage","env","identifierKind","Uint8Array","window","crypto","getRandomValues","codecFor","encoded","encode","sameAs","ContentTypeGroupUpdated","decode","signWithInstallationKey","verifySignedWithInstallationKey","signatureBytes","verifySignedWithPublicKey","publicKey","UtilsWorkerClass","Utils","generateInboxId","getInboxIdForIdentifier","ApiUrls","local","dev","production","HistorySyncUrls"],"mappings":"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"}
|
package/dist/workers/client.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e,{EncodedContent as t,Consent as s,ContentTypeId as i,ListMessagesOptions as n,ListConversationsOptions as r,CreateGroupOptions as a,CreateDMOptions as o,PermissionPolicySet as c,GroupPermissionsOptions as d,MessageDisappearingSettings as u,getInboxIdForIdentifier as p,generateInboxId as l,createClient as m,LogOptions as g,ConversationType as y,verifySignedWithPublicKey as v}from"@xmtp/wasm-bindings";import{ContentTypeId as I}from"@xmtp/content-type-primitives";const b=e=>{return new t((s=e.type,new i(s.authorityId,s.typeId,s.versionMajor,s.versionMinor)),new Map(Object.entries(e.parameters)),e.fallback,e.compression,e.content);var s},h=e=>{return{type:(t=e.type,{authorityId:t.authorityId,typeId:t.typeId,versionMajor:t.versionMajor,versionMinor:t.versionMinor}),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content};var t},w=e=>{return{type:(t=e.type,new I({authorityId:t.authorityId,typeId:t.typeId,versionMajor:t.versionMajor,versionMinor:t.versionMinor})),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content};var t},S=e=>{return{content:h((t=e.content,{type:(s=t.type,new I({authorityId:s.authorityId,typeId:s.typeId,versionMajor:s.versionMajor,versionMinor:s.versionMinor})),parameters:Object.fromEntries(t.parameters),fallback:t.fallback,compression:t.compression,content:t.content})),convoId:e.convoId,deliveryStatus:e.deliveryStatus,id:e.id,kind:e.kind,senderInboxId:e.senderInboxId,sentAtNs:e.sentAtNs};var t,s},k=e=>new r(e.consentStates,e.createdAfterNs,e.createdBeforeNs,e.includeDuplicateDms??!1,e.limit),f=e=>{return new a(e.permissions,e.name,e.imageUrlSquare,e.description,e.customPermissionPolicySet&&e.permissions===d.CustomPolicy?(t=e.customPermissionPolicySet,new c(t.addMemberPolicy,t.removeMemberPolicy,t.addAdminPolicy,t.removeAdminPolicy,t.updateGroupNamePolicy,t.updateGroupDescriptionPolicy,t.updateGroupImageUrlSquarePolicy,t.updateMessageDisappearingPolicy)):void 0,e.messageDisappearingSettings?B(e.messageDisappearingSettings):void 0);var t},x=e=>new o(e.messageDisappearingSettings?B(e.messageDisappearingSettings):void 0),M=async e=>{const t=e.id,s=e.name,i=e.imageUrl,n=e.description,r=e.permissions,a=e.isActive,o=e.addedByInboxId,c=await e.metadata(),d=e.admins,u=e.superAdmins,p=e.createdAtNs,l=r.policyType,m=r.policySet;return{id:t,name:s,imageUrl:i,description:n,permissions:{policyType:l,policySet:{addAdminPolicy:m.addAdminPolicy,addMemberPolicy:m.addMemberPolicy,removeAdminPolicy:m.removeAdminPolicy,removeMemberPolicy:m.removeMemberPolicy,updateGroupDescriptionPolicy:m.updateGroupDescriptionPolicy,updateGroupImageUrlSquarePolicy:m.updateGroupImageUrlSquarePolicy,updateGroupNamePolicy:m.updateGroupNamePolicy,updateMessageDisappearingPolicy:m.updateMessageDisappearingPolicy}},isActive:a,addedByInboxId:o,metadata:c,admins:d,superAdmins:u,createdAtNs:p}},A=e=>({bytes:e.bytes,clientTimestampNs:e.clientTimestampNs,id:e.id}),G=e=>({accountIdentifiers:e.accountIdentifiers,inboxId:e.inboxId,installations:e.installations.map(A),recoveryIdentifier:e.recoveryIdentifier}),P=e=>({entity:e.entity,entityType:e.entityType,state:e.state}),D=e=>new s(e.entityType,e.state,e.entity),T=e=>({key:e.key,epoch:e.epoch}),B=e=>new u(e.fromNs,e.inNs),N={local:"http://localhost:5555",dev:"https://dev.xmtp.network",production:"https://production.xmtp.network"},C={local:"http://localhost:5558",dev:"https://message-history.dev.ephemera.network",production:"https://message-history.production.ephemera.network"};class W{#e;#t;constructor(e,t){this.#e=e,this.#t=t}get id(){return this.#t.id()}get name(){return this.#t.groupName()}async updateName(e){return this.#t.updateGroupName(e)}get imageUrl(){return this.#t.groupImageUrlSquare()}async updateImageUrl(e){return this.#t.updateGroupImageUrlSquare(e)}get description(){return this.#t.groupDescription()}async updateDescription(e){return this.#t.updateGroupDescription(e)}get isActive(){return this.#t.isActive()}get addedByInboxId(){return this.#t.addedByInboxId()}get createdAtNs(){return this.#t.createdAtNs()}async metadata(){const e=await this.#t.groupMetadata();return{creatorInboxId:e.creatorInboxId(),conversationType:e.conversationType()}}async members(){return(await this.#t.listMembers()).map((e=>(e=>({accountIdentifiers:e.accountIdentifiers,consentState:e.consentState,inboxId:e.inboxId,installationIds:e.installationIds,permissionLevel:e.permissionLevel}))(e)))}get admins(){return this.#t.adminList()}get superAdmins(){return this.#t.superAdminList()}get permissions(){const e=this.#t.groupPermissions();return{policyType:e.policyType(),policySet:e.policySet()}}async updatePermission(e,t,s){return this.#t.updatePermissionPolicy(e,t,s)}isAdmin(e){return this.#t.isAdmin(e)}isSuperAdmin(e){return this.#t.isSuperAdmin(e)}async sync(){return this.#t.sync()}async addMembersByIdentifiers(e){return this.#t.addMembers(e)}async addMembers(e){return this.#t.addMembersByInboxId(e)}async removeMembersByIdentifiers(e){return this.#t.removeMembers(e)}async removeMembers(e){return this.#t.removeMembersByInboxId(e)}async addAdmin(e){return this.#t.addAdmin(e)}async removeAdmin(e){return this.#t.removeAdmin(e)}async addSuperAdmin(e){return this.#t.addSuperAdmin(e)}async removeSuperAdmin(e){return this.#t.removeSuperAdmin(e)}async publishMessages(){return this.#t.publishMessages()}sendOptimistic(e){return this.#t.sendOptimistic(e)}async send(e){return this.#t.send(e)}async messages(e){return this.#t.findMessages(e?(e=>new n(e.sentBeforeNs,e.sentAfterNs,e.limit,e.deliveryStatus,e.direction,e.contentTypes))(e):void 0)}get consentState(){return this.#t.consentState()}updateConsentState(e){this.#t.updateConsentState(e)}dmPeerInboxId(){return this.#t.dmPeerInboxId()}messageDisappearingSettings(){return this.#t.messageDisappearingSettings()}async updateMessageDisappearingSettings(e,t){const s=new u(e,t);return this.#t.updateMessageDisappearingSettings(s)}async removeMessageDisappearingSettings(){return this.#t.removeMessageDisappearingSettings()}isMessageDisappearingEnabled(){return this.#t.isMessageDisappearingEnabled()}stream(e){return this.#t.stream({on_message:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}})}pausedForVersion(){return this.#t.pausedForVersion()}}class K{#e;#s;constructor(e,t){this.#e=e,this.#s=t}async sync(){return this.#s.sync()}async syncAll(e){return this.#s.syncAllConversations(e)}getConversationById(e){try{const t=this.#s.findGroupById(e);return new W(this.#e,t)}catch{return}}getMessageById(e){try{return this.#s.findMessageById(e)}catch{return}}getDmByInboxId(e){try{const t=this.#s.findDmByTargetInboxId(e);return new W(this.#e,t)}catch{return}}list(e){return this.#s.list(e?k(e):void 0).map((e=>new W(this.#e,e.conversation)))}listGroups(e){return this.#s.listGroups(e?k(e):void 0).map((e=>new W(this.#e,e.conversation)))}listDms(e){return this.#s.listDms(e?k(e):void 0).map((e=>new W(this.#e,e.conversation)))}async newGroupWithIdentifiers(e,t){const s=await this.#s.createGroup(e,t?f(t):void 0);return new W(this.#e,s)}async newGroup(e,t){const s=await this.#s.createGroupByInboxIds(e,t?f(t):void 0);return new W(this.#e,s)}async newDmWithIdentifier(e,t){const s=await this.#s.createDm(e,t?x(t):void 0);return new W(this.#e,s)}async newDm(e,t){const s=await this.#s.createDmByInboxId(e,t?x(t):void 0);return new W(this.#e,s)}getHmacKeys(){return this.#s.getHmacKeys()}stream(e,t){return this.#s.stream({on_conversation:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}},t)}streamGroups(e){return this.#s.stream(e,y.Group)}streamDms(e){return this.#s.stream(e,y.Dm)}streamAllMessages(e,t){return this.#s.streamAllMessages({on_message:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}},t)}streamConsent(e){return this.#s.streamConsent({on_consent_update:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}})}streamPreferences(e){return this.#s.streamPreferences({on_user_preference_update:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}})}}class L{#e;#s;constructor(e){this.#e=e,this.#s=new K(this,e.conversations())}static async create(e,t,s){const i=await(async(e,t,s)=>{const i=s?.apiUrl||N[s?.env||"dev"],n=await p(i,e)||l(e),r=s?.dbPath||`xmtp-${s?.env||"dev"}-${n}.db3`,a=s&&(void 0!==s.loggingLevel||s.structuredLogging||s.performanceLogging);return m(i,n,e,r,t,s?.historySyncUrl||C[s?.env||"dev"],a?new g(s.structuredLogging??!1,s.performanceLogging??!1,s.loggingLevel):void 0)})(e,t,s);return new L(i)}get accountIdentifier(){return this.#e.accountIdentifier}get inboxId(){return this.#e.inboxId}get installationId(){return this.#e.installationId}get installationIdBytes(){return this.#e.installationIdBytes}get isRegistered(){return this.#e.isRegistered}createInboxSignatureText(){try{return this.#e.createInboxSignatureText()}catch{return}}async addAccountSignatureText(e){try{return await this.#e.addWalletSignatureText(e)}catch{return}}async removeAccountSignatureText(e){try{return await this.#e.revokeWalletSignatureText(e)}catch{return}}async revokeAllAOtherInstallationsSignatureText(){try{return await this.#e.revokeAllOtherInstallationsSignatureText()}catch{return}}async revokeInstallationsSignatureText(e){try{return await this.#e.revokeInstallationsSignatureText(e)}catch{return}}async addEcdsaSignature(e,t){return this.#e.addEcdsaSignature(e,t)}async addScwSignature(e,t,s,i){return this.#e.addScwSignature(e,t,s,i)}async applySignatures(){return this.#e.applySignatureRequests()}async canMessage(e){return this.#e.canMessage(e)}async registerIdentity(){return this.#e.registerIdentity()}async findInboxIdByIdentifier(e){return this.#e.findInboxIdByIdentifier(e)}async inboxState(e){return this.#e.inboxState(e)}async getLatestInboxState(e){return this.#e.getLatestInboxState(e)}async setConsentStates(e){return this.#e.setConsentStates(e.map(D))}async getConsentState(e,t){return this.#e.getConsentState(e,t)}get conversations(){return this.#s}signWithInstallationKey(e){return this.#e.signWithInstallationKey(e)}verifySignedWithInstallationKey(e,t){try{return this.#e.verifySignedWithInstallationKey(e,t),!0}catch{return!1}}verifySignedWithPublicKey(e,t,s){try{return v(e,t,s),!0}catch{return!1}}}let U,E=!1;const _=new Map,O=e=>{self.postMessage(e)},j=e=>{self.postMessage(e)},q=e=>{self.postMessage(e)};self.onmessage=async t=>{const{action:s,id:i,data:n}=t.data;E&&console.log("client worker received event data",t.data),await e();try{if("init"===s&&!U)return U=await L.create(n.identifier,n.encryptionKey,n.options),E=void 0!==n.options?.loggingLevel&&"off"!==n.options.loggingLevel,void O({id:i,action:s,result:{inboxId:U.inboxId,installationId:U.installationId,installationIdBytes:U.installationIdBytes}});if(!U)throw new Error("Client not initialized");const e=U,t=t=>{const s=e.conversations.getConversationById(t);if(!s)throw new Error(`Group "${t}" not found`);return s};switch(s){case"endStream":{const e=_.get(n.streamId);if(!e)throw new Error(`Stream "${n.streamId}" not found`);e.end(),_.delete(n.streamId),O({id:i,action:s,result:void 0});break}case"createInboxSignatureText":{const t=e.createInboxSignatureText();O({id:i,action:s,result:t});break}case"addAccountSignatureText":{const t=await e.addAccountSignatureText(n.newIdentifier);O({id:i,action:s,result:t});break}case"removeAccountSignatureText":{const t=await e.removeAccountSignatureText(n.identifier);O({id:i,action:s,result:t});break}case"revokeAllOtherInstallationsSignatureText":{const t=await e.revokeAllAOtherInstallationsSignatureText();O({id:i,action:s,result:t});break}case"revokeInstallationsSignatureText":{const t=await e.revokeInstallationsSignatureText(n.installationIds);O({id:i,action:s,result:t});break}case"addEcdsaSignature":await e.addEcdsaSignature(n.type,n.bytes),O({id:i,action:s,result:void 0});break;case"addScwSignature":await e.addScwSignature(n.type,n.bytes,n.chainId,n.blockNumber),O({id:i,action:s,result:void 0});break;case"applySignatures":await e.applySignatures(),O({id:i,action:s,result:void 0});break;case"registerIdentity":await e.registerIdentity(),O({id:i,action:s,result:void 0});break;case"isRegistered":{const t=e.isRegistered;O({id:i,action:s,result:t});break}case"canMessage":{const t=await e.canMessage(n.identifiers);O({id:i,action:s,result:t});break}case"inboxState":{const t=await e.inboxState(n.refreshFromNetwork),r=G(t);O({id:i,action:s,result:r});break}case"getLatestInboxState":{const t=await e.getLatestInboxState(n.inboxId),r=G(t);O({id:i,action:s,result:r});break}case"setConsentStates":await e.setConsentStates(n.records),O({id:i,action:s,result:void 0});break;case"getConsentState":{const t=await e.getConsentState(n.entityType,n.entity);O({id:i,action:s,result:t});break}case"findInboxIdByIdentifier":{const t=await e.findInboxIdByIdentifier(n.identifier);O({id:i,action:s,result:t});break}case"signWithInstallationKey":{const t=e.signWithInstallationKey(n.signatureText);O({id:i,action:s,result:t});break}case"verifySignedWithInstallationKey":{const t=e.verifySignedWithInstallationKey(n.signatureText,n.signatureBytes);O({id:i,action:s,result:t});break}case"verifySignedWithPublicKey":{const t=e.verifySignedWithPublicKey(n.signatureText,n.signatureBytes,n.publicKey);O({id:i,action:s,result:t});break}case"streamAllGroups":{const t=async(t,s)=>{t?q({type:"group",streamId:n.streamId,error:t.message}):j({type:"group",streamId:n.streamId,result:s?await M(new W(e,s)):void 0})},r=e.conversations.stream(t,n.conversationType);_.set(n.streamId,r),O({id:i,action:s,result:void 0});break}case"streamAllMessages":{const t=(e,t)=>{e?q({type:"message",streamId:n.streamId,error:e.message}):j({type:"message",streamId:n.streamId,result:t?S(t):void 0})},r=e.conversations.streamAllMessages(t,n.conversationType);_.set(n.streamId,r),O({id:i,action:s,result:void 0});break}case"streamConsent":{const t=(e,t)=>{e?q({type:"consent",streamId:n.streamId,error:e.message}):j({type:"consent",streamId:n.streamId,result:t?.map(P)??[]})},r=e.conversations.streamConsent(t);_.set(n.streamId,r),O({id:i,action:s,result:void 0});break}case"streamPreferences":{const t=(e,t)=>{e?q({type:"preferences",streamId:n.streamId,error:e.message}):j({type:"preferences",streamId:n.streamId,result:t??void 0})},r=e.conversations.streamPreferences(t);_.set(n.streamId,r),O({id:i,action:s,result:void 0});break}case"getConversations":{const t=e.conversations.list(n.options),r=await Promise.all(t.map((e=>M(e))));O({id:i,action:s,result:r});break}case"getGroups":{const t=e.conversations.listGroups(n.options),r=await Promise.all(t.map((e=>M(e))));O({id:i,action:s,result:r});break}case"getDms":{const t=e.conversations.listDms(n.options),r=await Promise.all(t.map((e=>M(e))));O({id:i,action:s,result:r});break}case"newGroupWithIdentifiers":{const t=await e.conversations.newGroupWithIdentifiers(n.identifiers,n.options),r=await M(t);O({id:i,action:s,result:r});break}case"newGroupWithInboxIds":{const t=await e.conversations.newGroup(n.inboxIds,n.options),r=await M(t);O({id:i,action:s,result:r});break}case"newDmWithIdentifier":{const t=await e.conversations.newDmWithIdentifier(n.identifier,n.options),r=await M(t);O({id:i,action:s,result:r});break}case"newDmWithInboxId":{const t=await e.conversations.newDm(n.inboxId,n.options),r=await M(t);O({id:i,action:s,result:r});break}case"syncConversations":await e.conversations.sync(),O({id:i,action:s,result:void 0});break;case"syncAllConversations":await e.conversations.syncAll(n.consentStates),O({id:i,action:s,result:void 0});break;case"getConversationById":{const t=e.conversations.getConversationById(n.id),r=t?await M(t):void 0;O({id:i,action:s,result:r});break}case"getMessageById":{const t=e.conversations.getMessageById(n.id),r=t?S(t):void 0;O({id:i,action:s,result:r});break}case"getDmByInboxId":{const t=e.conversations.getDmByInboxId(n.inboxId),r=t?await M(t):void 0;O({id:i,action:s,result:r});break}case"getHmacKeys":{const t=e.conversations.getHmacKeys(),n=Object.fromEntries(Array.from(t.entries()).map((([e,t])=>[e,t.map(T)])));O({id:i,action:s,result:n});break}case"syncGroup":{const e=t(n.id);await e.sync();const r=await M(e);O({id:i,action:s,result:r});break}case"updateGroupName":{const e=t(n.id);await e.updateName(n.name),O({id:i,action:s,result:void 0});break}case"updateGroupDescription":{const e=t(n.id);await e.updateDescription(n.description),O({id:i,action:s,result:void 0});break}case"updateGroupImageUrlSquare":{const e=t(n.id);await e.updateImageUrl(n.imageUrl),O({id:i,action:s,result:void 0});break}case"sendGroupMessage":{const e=t(n.id),r=await e.send(b(w(n.content)));O({id:i,action:s,result:r});break}case"sendOptimisticGroupMessage":{const e=t(n.id).sendOptimistic(b(w(n.content)));O({id:i,action:s,result:e});break}case"publishGroupMessages":{const e=t(n.id);await e.publishMessages(),O({id:i,action:s,result:void 0});break}case"getGroupMessages":{const e=t(n.id),r=(await e.messages(n.options)).map((e=>S(e)));O({id:i,action:s,result:r});break}case"getGroupMembers":{const e=t(n.id),r=await e.members();O({id:i,action:s,result:r});break}case"getGroupAdmins":{const e=t(n.id).admins;O({id:i,action:s,result:e});break}case"getGroupSuperAdmins":{const e=t(n.id).superAdmins;O({id:i,action:s,result:e});break}case"getGroupConsentState":{const e=t(n.id).consentState;O({id:i,action:s,result:e});break}case"updateGroupConsentState":t(n.id).updateConsentState(n.state),O({id:i,action:s,result:void 0});break;case"addGroupAdmin":{const e=t(n.id);await e.addAdmin(n.inboxId),O({id:i,action:s,result:void 0});break}case"removeGroupAdmin":{const e=t(n.id);await e.removeAdmin(n.inboxId),O({id:i,action:s,result:void 0});break}case"addGroupSuperAdmin":{const e=t(n.id);await e.addSuperAdmin(n.inboxId),O({id:i,action:s,result:void 0});break}case"removeGroupSuperAdmin":{const e=t(n.id);await e.removeSuperAdmin(n.inboxId),O({id:i,action:s,result:void 0});break}case"addGroupMembers":{const e=t(n.id);await e.addMembersByIdentifiers(n.identifiers),O({id:i,action:s,result:void 0});break}case"removeGroupMembers":{const e=t(n.id);await e.removeMembersByIdentifiers(n.identifiers),O({id:i,action:s,result:void 0});break}case"addGroupMembersByInboxId":{const e=t(n.id);await e.addMembers(n.inboxIds),O({id:i,action:s,result:void 0});break}case"removeGroupMembersByInboxId":{const e=t(n.id);await e.removeMembers(n.inboxIds),O({id:i,action:s,result:void 0});break}case"isGroupAdmin":{const e=t(n.id).isAdmin(n.inboxId);O({id:i,action:s,result:e});break}case"isGroupSuperAdmin":{const e=t(n.id).isSuperAdmin(n.inboxId);O({id:i,action:s,result:e});break}case"getDmPeerInboxId":{const e=t(n.id).dmPeerInboxId();O({id:i,action:s,result:e});break}case"updateGroupPermissionPolicy":{const e=t(n.id);await e.updatePermission(n.permissionType,n.policy,n.metadataField),O({id:i,action:s,result:void 0});break}case"getGroupPermissions":{const e=t(n.id),r=(await M(e)).permissions;O({id:i,action:s,result:r});break}case"getGroupMessageDisappearingSettings":{const e=t(n.id).messageDisappearingSettings(),r=e?(e=>({fromNs:e.fromNs,inNs:e.inNs}))(e):void 0;O({id:i,action:s,result:r});break}case"updateGroupMessageDisappearingSettings":{const e=t(n.id);await e.updateMessageDisappearingSettings(n.fromNs,n.inNs),O({id:i,action:s,result:void 0});break}case"removeGroupMessageDisappearingSettings":{const e=t(n.id);await e.removeMessageDisappearingSettings(),O({id:i,action:s,result:void 0});break}case"isGroupMessageDisappearingEnabled":{const e=t(n.id).isMessageDisappearingEnabled();O({id:i,action:s,result:e});break}case"streamGroupMessages":{const e=t(n.groupId),r=(e,t)=>{e?q({type:"message",streamId:n.streamId,error:e.message}):j({type:"message",streamId:n.streamId,result:t?S(t):void 0})},a=e.stream(r);_.set(n.streamId,a),O({id:i,action:s,result:void 0});break}case"getGroupPausedForVersion":{const e=t(n.id).pausedForVersion();O({id:i,action:s,result:e});break}}}catch(e){(e=>{self.postMessage(e)})({id:i,action:s,error:e.message})}};
|
|
1
|
+
import e,{EncodedContent as t,ContentTypeId as s,ListMessagesOptions as i,ListConversationsOptions as n,CreateGroupOptions as r,CreateDMOptions as a,Consent as o,PermissionPolicySet as c,GroupPermissionsOptions as d,MessageDisappearingSettings as u,getInboxIdForIdentifier as p,generateInboxId as l,createClient as m,LogOptions as g,ConversationType as y,verifySignedWithPublicKey as v}from"@xmtp/wasm-bindings";import{ContentTypeId as I}from"@xmtp/content-type-primitives";const b=e=>{return new t((i=e.type,new s(i.authorityId,i.typeId,i.versionMajor,i.versionMinor)),new Map(Object.entries(e.parameters)),e.fallback,e.compression,e.content);var i},h=e=>{return{type:(t=e.type,{authorityId:t.authorityId,typeId:t.typeId,versionMajor:t.versionMajor,versionMinor:t.versionMinor}),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content};var t},w=e=>{return{type:(t=e.type,new I({authorityId:t.authorityId,typeId:t.typeId,versionMajor:t.versionMajor,versionMinor:t.versionMinor})),parameters:e.parameters,fallback:e.fallback,compression:e.compression,content:e.content};var t},S=e=>{return{content:h((t=e.content,{type:(s=t.type,new I({authorityId:s.authorityId,typeId:s.typeId,versionMajor:s.versionMajor,versionMinor:s.versionMinor})),parameters:Object.fromEntries(t.parameters),fallback:t.fallback,compression:t.compression,content:t.content})),convoId:e.convoId,deliveryStatus:e.deliveryStatus,id:e.id,kind:e.kind,senderInboxId:e.senderInboxId,sentAtNs:e.sentAtNs};var t,s},f=e=>new n(e.consentStates,e.createdAfterNs,e.createdBeforeNs,e.includeDuplicateDms??!1,e.limit),k=e=>{return new r(e.permissions,e.name,e.imageUrlSquare,e.description,e.customPermissionPolicySet&&e.permissions===d.CustomPolicy?(t=e.customPermissionPolicySet,new c(t.addMemberPolicy,t.removeMemberPolicy,t.addAdminPolicy,t.removeAdminPolicy,t.updateGroupNamePolicy,t.updateGroupDescriptionPolicy,t.updateGroupImageUrlSquarePolicy,t.updateMessageDisappearingPolicy)):void 0,e.messageDisappearingSettings?B(e.messageDisappearingSettings):void 0);var t},x=e=>new a(e.messageDisappearingSettings?B(e.messageDisappearingSettings):void 0),M=async e=>{const t=e.id,s=e.name,i=e.imageUrl,n=e.description,r=e.permissions,a=e.isActive,o=e.addedByInboxId,c=await e.metadata(),d=e.admins,u=e.superAdmins,p=e.createdAtNs,l=r.policyType,m=r.policySet;return{id:t,name:s,imageUrl:i,description:n,permissions:{policyType:l,policySet:{addAdminPolicy:m.addAdminPolicy,addMemberPolicy:m.addMemberPolicy,removeAdminPolicy:m.removeAdminPolicy,removeMemberPolicy:m.removeMemberPolicy,updateGroupDescriptionPolicy:m.updateGroupDescriptionPolicy,updateGroupImageUrlSquarePolicy:m.updateGroupImageUrlSquarePolicy,updateGroupNamePolicy:m.updateGroupNamePolicy,updateMessageDisappearingPolicy:m.updateMessageDisappearingPolicy}},isActive:a,addedByInboxId:o,metadata:c,admins:d,superAdmins:u,createdAtNs:p}},A=e=>({bytes:e.bytes,clientTimestampNs:e.clientTimestampNs,id:e.id}),G=e=>({accountIdentifiers:e.accountIdentifiers,inboxId:e.inboxId,installations:e.installations.map(A),recoveryIdentifier:e.recoveryIdentifier}),P=e=>({entity:e.entity,entityType:e.entityType,state:e.state}),D=e=>new o(e.entityType,e.state,e.entity),T=e=>({key:e.key,epoch:e.epoch}),B=e=>new u(e.fromNs,e.inNs),N={local:"http://localhost:5555",dev:"https://dev.xmtp.network",production:"https://production.xmtp.network"},C={local:"http://localhost:5558",dev:"https://message-history.dev.ephemera.network",production:"https://message-history.production.ephemera.network"};class W{#e;#t;constructor(e,t){this.#e=e,this.#t=t}get id(){return this.#t.id()}get name(){return this.#t.groupName()}async updateName(e){return this.#t.updateGroupName(e)}get imageUrl(){return this.#t.groupImageUrlSquare()}async updateImageUrl(e){return this.#t.updateGroupImageUrlSquare(e)}get description(){return this.#t.groupDescription()}async updateDescription(e){return this.#t.updateGroupDescription(e)}get isActive(){return this.#t.isActive()}get addedByInboxId(){return this.#t.addedByInboxId()}get createdAtNs(){return this.#t.createdAtNs()}async metadata(){const e=await this.#t.groupMetadata();return{creatorInboxId:e.creatorInboxId(),conversationType:e.conversationType()}}async members(){return(await this.#t.listMembers()).map((e=>(e=>({accountIdentifiers:e.accountIdentifiers,consentState:e.consentState,inboxId:e.inboxId,installationIds:e.installationIds,permissionLevel:e.permissionLevel}))(e)))}get admins(){return this.#t.adminList()}get superAdmins(){return this.#t.superAdminList()}get permissions(){const e=this.#t.groupPermissions();return{policyType:e.policyType(),policySet:e.policySet()}}async updatePermission(e,t,s){return this.#t.updatePermissionPolicy(e,t,s)}isAdmin(e){return this.#t.isAdmin(e)}isSuperAdmin(e){return this.#t.isSuperAdmin(e)}async sync(){return this.#t.sync()}async addMembersByIdentifiers(e){return this.#t.addMembers(e)}async addMembers(e){return this.#t.addMembersByInboxId(e)}async removeMembersByIdentifiers(e){return this.#t.removeMembers(e)}async removeMembers(e){return this.#t.removeMembersByInboxId(e)}async addAdmin(e){return this.#t.addAdmin(e)}async removeAdmin(e){return this.#t.removeAdmin(e)}async addSuperAdmin(e){return this.#t.addSuperAdmin(e)}async removeSuperAdmin(e){return this.#t.removeSuperAdmin(e)}async publishMessages(){return this.#t.publishMessages()}sendOptimistic(e){return this.#t.sendOptimistic(e)}async send(e){return this.#t.send(e)}async messages(e){return this.#t.findMessages(e?(e=>new i(e.sentBeforeNs,e.sentAfterNs,e.limit,e.deliveryStatus,e.direction,e.contentTypes))(e):void 0)}get consentState(){return this.#t.consentState()}updateConsentState(e){this.#t.updateConsentState(e)}dmPeerInboxId(){return this.#t.dmPeerInboxId()}messageDisappearingSettings(){return this.#t.messageDisappearingSettings()}async updateMessageDisappearingSettings(e,t){const s=new u(e,t);return this.#t.updateMessageDisappearingSettings(s)}async removeMessageDisappearingSettings(){return this.#t.removeMessageDisappearingSettings()}isMessageDisappearingEnabled(){return this.#t.isMessageDisappearingEnabled()}stream(e){return this.#t.stream({on_message:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}})}pausedForVersion(){return this.#t.pausedForVersion()}}class K{#e;#s;constructor(e,t){this.#e=e,this.#s=t}async sync(){return this.#s.sync()}async syncAll(e){return this.#s.syncAllConversations(e)}getConversationById(e){try{const t=this.#s.findGroupById(e);return new W(this.#e,t)}catch{return}}getMessageById(e){try{return this.#s.findMessageById(e)}catch{return}}getDmByInboxId(e){try{const t=this.#s.findDmByTargetInboxId(e);return new W(this.#e,t)}catch{return}}list(e){return this.#s.list(e?f(e):void 0).map((e=>new W(this.#e,e.conversation)))}listGroups(e){return this.#s.listGroups(e?f(e):void 0).map((e=>new W(this.#e,e.conversation)))}listDms(e){return this.#s.listDms(e?f(e):void 0).map((e=>new W(this.#e,e.conversation)))}async newGroupWithIdentifiers(e,t){const s=await this.#s.createGroup(e,t?k(t):void 0);return new W(this.#e,s)}async newGroup(e,t){const s=await this.#s.createGroupByInboxIds(e,t?k(t):void 0);return new W(this.#e,s)}async newDmWithIdentifier(e,t){const s=await this.#s.createDm(e,t?x(t):void 0);return new W(this.#e,s)}async newDm(e,t){const s=await this.#s.createDmByInboxId(e,t?x(t):void 0);return new W(this.#e,s)}getHmacKeys(){return this.#s.getHmacKeys()}stream(e,t){return this.#s.stream({on_conversation:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}},t)}streamGroups(e){return this.#s.stream(e,y.Group)}streamDms(e){return this.#s.stream(e,y.Dm)}streamAllMessages(e,t){return this.#s.streamAllMessages({on_message:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}},t)}}class L{#e;#s;constructor(e,t){this.#e=e,this.#s=t}async inboxState(e){return this.#e.inboxState(e)}async getLatestInboxState(e){return this.#e.getLatestInboxState(e)}async setConsentStates(e){return this.#e.setConsentStates(e.map(D))}async getConsentState(e,t){return this.#e.getConsentState(e,t)}streamConsent(e){return this.#s.streamConsent({on_consent_update:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}})}streamPreferences(e){return this.#s.streamPreferences({on_user_preference_update:t=>{e?.(null,t)},on_error:t=>{e?.(t,void 0)}})}}class U{#e;#s;#i;constructor(e){this.#e=e;const t=e.conversations();this.#s=new K(this,t),this.#i=new L(e,t)}static async create(e,t,s){const i=await(async(e,t,s)=>{const i=s?.apiUrl||N[s?.env||"dev"],n=await p(i,e)||l(e),r=s?.dbPath||`xmtp-${s?.env||"dev"}-${n}.db3`,a=s&&(void 0!==s.loggingLevel||s.structuredLogging||s.performanceLogging);return m(i,n,e,r,t,s?.historySyncUrl||C[s?.env||"dev"],a?new g(s.structuredLogging??!1,s.performanceLogging??!1,s.loggingLevel):void 0)})(e,t,s);return new U(i)}get accountIdentifier(){return this.#e.accountIdentifier}get inboxId(){return this.#e.inboxId}get installationId(){return this.#e.installationId}get installationIdBytes(){return this.#e.installationIdBytes}get isRegistered(){return this.#e.isRegistered}get conversations(){return this.#s}get preferences(){return this.#i}createInboxSignatureText(){try{return this.#e.createInboxSignatureText()}catch{return}}async addAccountSignatureText(e){try{return await this.#e.addWalletSignatureText(e)}catch{return}}async removeAccountSignatureText(e){try{return await this.#e.revokeWalletSignatureText(e)}catch{return}}async revokeAllAOtherInstallationsSignatureText(){try{return await this.#e.revokeAllOtherInstallationsSignatureText()}catch{return}}async revokeInstallationsSignatureText(e){try{return await this.#e.revokeInstallationsSignatureText(e)}catch{return}}async addEcdsaSignature(e,t){return this.#e.addEcdsaSignature(e,t)}async addScwSignature(e,t,s,i){return this.#e.addScwSignature(e,t,s,i)}async applySignatures(){return this.#e.applySignatureRequests()}async canMessage(e){return this.#e.canMessage(e)}async registerIdentity(){return this.#e.registerIdentity()}async findInboxIdByIdentifier(e){return this.#e.findInboxIdByIdentifier(e)}signWithInstallationKey(e){return this.#e.signWithInstallationKey(e)}verifySignedWithInstallationKey(e,t){try{return this.#e.verifySignedWithInstallationKey(e,t),!0}catch{return!1}}verifySignedWithPublicKey(e,t,s){try{return v(e,t,s),!0}catch{return!1}}}let E,_=!1;const O=new Map,j=e=>{self.postMessage(e)},q=e=>{self.postMessage(e)},F=e=>{self.postMessage(e)};self.onmessage=async t=>{const{action:s,id:i,data:n}=t.data;_&&console.log("client worker received event data",t.data),await e();try{if("init"===s&&!E)return E=await U.create(n.identifier,n.encryptionKey,n.options),_=void 0!==n.options?.loggingLevel&&"off"!==n.options.loggingLevel,void j({id:i,action:s,result:{inboxId:E.inboxId,installationId:E.installationId,installationIdBytes:E.installationIdBytes}});if(!E)throw new Error("Client not initialized");const e=E,t=t=>{const s=e.conversations.getConversationById(t);if(!s)throw new Error(`Group "${t}" not found`);return s};switch(s){case"endStream":{const e=O.get(n.streamId);if(!e)throw new Error(`Stream "${n.streamId}" not found`);e.end(),O.delete(n.streamId),j({id:i,action:s,result:void 0});break}case"createInboxSignatureText":{const t=e.createInboxSignatureText();j({id:i,action:s,result:t});break}case"addAccountSignatureText":{const t=await e.addAccountSignatureText(n.newIdentifier);j({id:i,action:s,result:t});break}case"removeAccountSignatureText":{const t=await e.removeAccountSignatureText(n.identifier);j({id:i,action:s,result:t});break}case"revokeAllOtherInstallationsSignatureText":{const t=await e.revokeAllAOtherInstallationsSignatureText();j({id:i,action:s,result:t});break}case"revokeInstallationsSignatureText":{const t=await e.revokeInstallationsSignatureText(n.installationIds);j({id:i,action:s,result:t});break}case"addEcdsaSignature":await e.addEcdsaSignature(n.type,n.bytes),j({id:i,action:s,result:void 0});break;case"addScwSignature":await e.addScwSignature(n.type,n.bytes,n.chainId,n.blockNumber),j({id:i,action:s,result:void 0});break;case"applySignatures":await e.applySignatures(),j({id:i,action:s,result:void 0});break;case"registerIdentity":await e.registerIdentity(),j({id:i,action:s,result:void 0});break;case"isRegistered":{const t=e.isRegistered;j({id:i,action:s,result:t});break}case"canMessage":{const t=await e.canMessage(n.identifiers);j({id:i,action:s,result:t});break}case"inboxState":{const t=await e.preferences.inboxState(n.refreshFromNetwork),r=G(t);j({id:i,action:s,result:r});break}case"getLatestInboxState":{const t=await e.preferences.getLatestInboxState(n.inboxId),r=G(t);j({id:i,action:s,result:r});break}case"setConsentStates":await e.preferences.setConsentStates(n.records),j({id:i,action:s,result:void 0});break;case"getConsentState":{const t=await e.preferences.getConsentState(n.entityType,n.entity);j({id:i,action:s,result:t});break}case"findInboxIdByIdentifier":{const t=await e.findInboxIdByIdentifier(n.identifier);j({id:i,action:s,result:t});break}case"signWithInstallationKey":{const t=e.signWithInstallationKey(n.signatureText);j({id:i,action:s,result:t});break}case"verifySignedWithInstallationKey":{const t=e.verifySignedWithInstallationKey(n.signatureText,n.signatureBytes);j({id:i,action:s,result:t});break}case"verifySignedWithPublicKey":{const t=e.verifySignedWithPublicKey(n.signatureText,n.signatureBytes,n.publicKey);j({id:i,action:s,result:t});break}case"streamAllGroups":{const t=async(t,s)=>{t?F({type:"group",streamId:n.streamId,error:t.message}):q({type:"group",streamId:n.streamId,result:s?await M(new W(e,s)):void 0})},r=e.conversations.stream(t,n.conversationType);O.set(n.streamId,r),j({id:i,action:s,result:void 0});break}case"streamAllMessages":{const t=(e,t)=>{e?F({type:"message",streamId:n.streamId,error:e.message}):q({type:"message",streamId:n.streamId,result:t?S(t):void 0})},r=e.conversations.streamAllMessages(t,n.conversationType);O.set(n.streamId,r),j({id:i,action:s,result:void 0});break}case"streamConsent":{const t=(e,t)=>{e?F({type:"consent",streamId:n.streamId,error:e.message}):q({type:"consent",streamId:n.streamId,result:t?.map(P)??[]})},r=e.preferences.streamConsent(t);O.set(n.streamId,r),j({id:i,action:s,result:void 0});break}case"streamPreferences":{const t=(e,t)=>{e?F({type:"preferences",streamId:n.streamId,error:e.message}):q({type:"preferences",streamId:n.streamId,result:t??void 0})},r=e.preferences.streamPreferences(t);O.set(n.streamId,r),j({id:i,action:s,result:void 0});break}case"getConversations":{const t=e.conversations.list(n.options),r=await Promise.all(t.map((e=>M(e))));j({id:i,action:s,result:r});break}case"getGroups":{const t=e.conversations.listGroups(n.options),r=await Promise.all(t.map((e=>M(e))));j({id:i,action:s,result:r});break}case"getDms":{const t=e.conversations.listDms(n.options),r=await Promise.all(t.map((e=>M(e))));j({id:i,action:s,result:r});break}case"newGroupWithIdentifiers":{const t=await e.conversations.newGroupWithIdentifiers(n.identifiers,n.options),r=await M(t);j({id:i,action:s,result:r});break}case"newGroupWithInboxIds":{const t=await e.conversations.newGroup(n.inboxIds,n.options),r=await M(t);j({id:i,action:s,result:r});break}case"newDmWithIdentifier":{const t=await e.conversations.newDmWithIdentifier(n.identifier,n.options),r=await M(t);j({id:i,action:s,result:r});break}case"newDmWithInboxId":{const t=await e.conversations.newDm(n.inboxId,n.options),r=await M(t);j({id:i,action:s,result:r});break}case"syncConversations":await e.conversations.sync(),j({id:i,action:s,result:void 0});break;case"syncAllConversations":await e.conversations.syncAll(n.consentStates),j({id:i,action:s,result:void 0});break;case"getConversationById":{const t=e.conversations.getConversationById(n.id),r=t?await M(t):void 0;j({id:i,action:s,result:r});break}case"getMessageById":{const t=e.conversations.getMessageById(n.id),r=t?S(t):void 0;j({id:i,action:s,result:r});break}case"getDmByInboxId":{const t=e.conversations.getDmByInboxId(n.inboxId),r=t?await M(t):void 0;j({id:i,action:s,result:r});break}case"getHmacKeys":{const t=e.conversations.getHmacKeys(),n=Object.fromEntries(Array.from(t.entries()).map((([e,t])=>[e,t.map(T)])));j({id:i,action:s,result:n});break}case"syncGroup":{const e=t(n.id);await e.sync();const r=await M(e);j({id:i,action:s,result:r});break}case"updateGroupName":{const e=t(n.id);await e.updateName(n.name),j({id:i,action:s,result:void 0});break}case"updateGroupDescription":{const e=t(n.id);await e.updateDescription(n.description),j({id:i,action:s,result:void 0});break}case"updateGroupImageUrlSquare":{const e=t(n.id);await e.updateImageUrl(n.imageUrl),j({id:i,action:s,result:void 0});break}case"sendGroupMessage":{const e=t(n.id),r=await e.send(b(w(n.content)));j({id:i,action:s,result:r});break}case"sendOptimisticGroupMessage":{const e=t(n.id).sendOptimistic(b(w(n.content)));j({id:i,action:s,result:e});break}case"publishGroupMessages":{const e=t(n.id);await e.publishMessages(),j({id:i,action:s,result:void 0});break}case"getGroupMessages":{const e=t(n.id),r=(await e.messages(n.options)).map((e=>S(e)));j({id:i,action:s,result:r});break}case"getGroupMembers":{const e=t(n.id),r=await e.members();j({id:i,action:s,result:r});break}case"getGroupAdmins":{const e=t(n.id).admins;j({id:i,action:s,result:e});break}case"getGroupSuperAdmins":{const e=t(n.id).superAdmins;j({id:i,action:s,result:e});break}case"getGroupConsentState":{const e=t(n.id).consentState;j({id:i,action:s,result:e});break}case"updateGroupConsentState":t(n.id).updateConsentState(n.state),j({id:i,action:s,result:void 0});break;case"addGroupAdmin":{const e=t(n.id);await e.addAdmin(n.inboxId),j({id:i,action:s,result:void 0});break}case"removeGroupAdmin":{const e=t(n.id);await e.removeAdmin(n.inboxId),j({id:i,action:s,result:void 0});break}case"addGroupSuperAdmin":{const e=t(n.id);await e.addSuperAdmin(n.inboxId),j({id:i,action:s,result:void 0});break}case"removeGroupSuperAdmin":{const e=t(n.id);await e.removeSuperAdmin(n.inboxId),j({id:i,action:s,result:void 0});break}case"addGroupMembers":{const e=t(n.id);await e.addMembersByIdentifiers(n.identifiers),j({id:i,action:s,result:void 0});break}case"removeGroupMembers":{const e=t(n.id);await e.removeMembersByIdentifiers(n.identifiers),j({id:i,action:s,result:void 0});break}case"addGroupMembersByInboxId":{const e=t(n.id);await e.addMembers(n.inboxIds),j({id:i,action:s,result:void 0});break}case"removeGroupMembersByInboxId":{const e=t(n.id);await e.removeMembers(n.inboxIds),j({id:i,action:s,result:void 0});break}case"isGroupAdmin":{const e=t(n.id).isAdmin(n.inboxId);j({id:i,action:s,result:e});break}case"isGroupSuperAdmin":{const e=t(n.id).isSuperAdmin(n.inboxId);j({id:i,action:s,result:e});break}case"getDmPeerInboxId":{const e=t(n.id).dmPeerInboxId();j({id:i,action:s,result:e});break}case"updateGroupPermissionPolicy":{const e=t(n.id);await e.updatePermission(n.permissionType,n.policy,n.metadataField),j({id:i,action:s,result:void 0});break}case"getGroupPermissions":{const e=t(n.id),r=(await M(e)).permissions;j({id:i,action:s,result:r});break}case"getGroupMessageDisappearingSettings":{const e=t(n.id).messageDisappearingSettings(),r=e?(e=>({fromNs:e.fromNs,inNs:e.inNs}))(e):void 0;j({id:i,action:s,result:r});break}case"updateGroupMessageDisappearingSettings":{const e=t(n.id);await e.updateMessageDisappearingSettings(n.fromNs,n.inNs),j({id:i,action:s,result:void 0});break}case"removeGroupMessageDisappearingSettings":{const e=t(n.id);await e.removeMessageDisappearingSettings(),j({id:i,action:s,result:void 0});break}case"isGroupMessageDisappearingEnabled":{const e=t(n.id).isMessageDisappearingEnabled();j({id:i,action:s,result:e});break}case"streamGroupMessages":{const e=t(n.groupId),r=(e,t)=>{e?F({type:"message",streamId:n.streamId,error:e.message}):q({type:"message",streamId:n.streamId,result:t?S(t):void 0})},a=e.stream(r);O.set(n.streamId,a),j({id:i,action:s,result:void 0});break}case"getGroupPausedForVersion":{const e=t(n.id).pausedForVersion();j({id:i,action:s,result:e});break}}}catch(e){(e=>{self.postMessage(e)})({id:i,action:s,error:e.message})}};
|
|
2
2
|
//# sourceMappingURL=client.js.map
|