evolution-api-sdk
Version:
Unofficial SDK for the Evolution Whatsapp API v2
1 lines • 75.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/types/webhooks.ts","../src/api/errors.ts","../src/api/service.ts","../src/api/routes.ts","../src/schemas/common.ts","../src/modules/chats/index.ts","../src/modules/groups/index.ts","../src/modules/instance/index.ts","../src/modules/messages/index.ts","../src/modules/profile/index.ts","../src/modules/settings/index.ts","../src/modules/webhook/index.ts","../src/types/tags.ts","../src/utils/phone-numer-from-jid.ts","../src/index.ts"],"sourcesContent":["export interface DeviceListMetadata {\n senderKeyHash: string;\n senderTimestamp: string;\n recipientKeyHash: string;\n recipientTimestamp: string;\n}\n\nexport interface MessageContextInfo {\n deviceListMetadata?: DeviceListMetadata | Record<string, unknown>;\n deviceListMetadataVersion: number;\n messageSecret: string;\n}\n\nexport interface DisappearingMode {\n initiator: string;\n trigger: string;\n initiatedByMe: boolean;\n}\n\nexport interface ContextInfo {\n expiration?: number;\n ephemeralSettingTimestamp?: string;\n disappearingMode?: DisappearingMode;\n stanzaId?: string;\n participant?: string;\n quotedMessage?: {\n conversation?: string;\n };\n statusSourceType?: string;\n}\n\nexport interface ImageMessage {\n url: string;\n mimetype: string;\n fileSha256: string;\n fileLength: string;\n height: number;\n width: number;\n mediaKey: string;\n fileEncSha256: string;\n directPath: string;\n mediaKeyTimestamp: string;\n jpegThumbnail: string;\n contextInfo?: ContextInfo;\n firstScanSidecar: string;\n firstScanLength: number;\n scansSidecar: string;\n scanLengths: number[];\n midQualityFileSha256: string;\n imageSourceType: string;\n}\n\nexport interface AudioMessage {\n url: string;\n mimetype: string;\n fileSha256: string;\n fileLength: string;\n seconds: number;\n ptt: boolean;\n mediaKey: string;\n fileEncSha256: string;\n directPath: string;\n mediaKeyTimestamp: string;\n waveform: string;\n}\n\nexport interface StickerMessage {\n url: string;\n width: number;\n height: number;\n isAvatar: boolean;\n isLottie: boolean;\n mediaKey: string;\n mimetype: string;\n directPath: string;\n fileLength: string;\n fileSha256: string;\n isAnimated: boolean;\n isAiSticker: boolean;\n fileEncSha256: string;\n stickerSentTs: string;\n mediaKeyTimestamp: string;\n}\n\nexport interface ExtendedTextMessage {\n text: string;\n contextInfo?: ContextInfo;\n}\n\nexport type MessageContent = {\n messageContextInfo?: MessageContextInfo;\n conversation?: string;\n extendedTextMessage?: ExtendedTextMessage;\n imageMessage?: ImageMessage;\n audioMessage?: AudioMessage;\n stickerMessage?: StickerMessage;\n};\n\nexport interface MessageUpdate {\n status: string;\n}\n\nexport interface ConnectionUpdatePayload {\n instance: string;\n wuid?: string;\n profileName?: string;\n profilePictureUrl?: string | null;\n state: string;\n statusReason: number;\n}\n\nexport interface ContactPayload {\n remoteJid: string;\n pushName: string;\n profilePicUrl: string | null;\n instanceId: string;\n}\n\nexport interface MessagePayload {\n key: {\n remoteJid: string;\n fromMe: boolean;\n id: string;\n senderLid?: string;\n };\n pushName?: string;\n message?: MessageContent;\n messageType?: string;\n messageTimestamp?: number;\n status?: string;\n participant?: string;\n contextInfo?: ContextInfo;\n instanceId?: string;\n source?: string;\n}\n\nexport interface WebhookData {\n event: string;\n instance: string;\n data:\n | MessagePayload\n | ContactPayload\n | ContactPayload[]\n | ConnectionUpdatePayload;\n sender: string;\n date?: number;\n instanceName?: string;\n destination?: string;\n date_time?: string;\n server_url?: string;\n apikey?: string;\n}\n\nexport interface Instance {\n instanceName: string;\n status: string;\n qrcode?: string;\n}\n\nexport interface Message {\n key: {\n remoteJid: string;\n fromMe: boolean;\n id: string;\n };\n message: Record<string, unknown>;\n messageTimestamp: number;\n pushName?: string;\n}\n\nexport enum WebhookEvent {\n APPLICATION_STARTUP = \"application.startup\",\n QRCODE_UPDATED = \"qrcode.updated\",\n CONNECTION_UPDATE = \"connection.update\",\n MESSAGES_SET = \"messages.set\",\n MESSAGES_UPSERT = \"messages.upsert\",\n MESSAGES_UPDATE = \"messages.update\",\n MESSAGES_DELETE = \"messages.delete\",\n SEND_MESSAGE = \"send.message\",\n CONTACTS_SET = \"contacts.set\",\n CONTACTS_UPSERT = \"contacts.upsert\",\n CONTACTS_UPDATE = \"contacts.update\",\n PRESENCE_UPDATE = \"presence.update\",\n CHATS_SET = \"chats.set\",\n CHATS_UPDATE = \"chats.update\",\n CHATS_UPSERT = \"chats.upsert\",\n CHATS_DELETE = \"chats.delete\",\n GROUPS_UPSERT = \"groups.upsert\",\n GROUPS_UPDATE = \"groups.update\",\n GROUP_PARTICIPANTS_UPDATE = \"group.participants.update\",\n NEW_TOKEN = \"new.jwt\",\n}\n\nexport enum WebhookEventSetup {\n APPLICATION_STARTUP = \"APPLICATION_STARTUP\",\n QRCODE_UPDATED = \"QRCODE_UPDATED\",\n CONNECTION_UPDATE = \"CONNECTION_UPDATE\",\n MESSAGES_SET = \"MESSAGES_SET\",\n MESSAGES_UPSERT = \"MESSAGES_UPSERT\",\n MESSAGES_UPDATE = \"MESSAGES_UPDATE\",\n MESSAGES_DELETE = \"MESSAGES_DELETE\",\n SEND_MESSAGE = \"SEND_MESSAGE\",\n CONTACTS_SET = \"CONTACTS_SET\",\n CONTACTS_UPSERT = \"CONTACTS_UPSERT\",\n CONTACTS_UPDATE = \"CONTACTS_UPDATE\",\n PRESENCE_UPDATE = \"PRESENCE_UPDATE\",\n CHATS_SET = \"CHATS_SET\",\n CHATS_UPDATE = \"CHATS_UPDATE\",\n CHATS_UPSERT = \"CHATS_UPSERT\",\n CHATS_DELETE = \"CHATS_DELETE\",\n GROUPS_UPSERT = \"GROUPS_UPSERT\",\n GROUPS_UPDATE = \"GROUPS_UPDATE\",\n GROUP_PARTICIPANTS_UPDATE = \"GROUP_PARTICIPANTS_UPDATE\",\n NEW_TOKEN = \"NEW_TOKEN\",\n}\n","export class EvolutionApiError extends Error {\n\tpublic readonly statusCode?: number;\n\tpublic readonly details?: unknown;\n\n\tconstructor(message: string, cause?: unknown, statusCode?: number) {\n\t\tconst extractedMessage = extractErrorMessage(cause);\n\t\tconst finalMessage = extractedMessage || message || \"Unknown error occurred\";\n\n\t\tsuper(finalMessage);\n\n\t\tthis.name = EvolutionApiError.name;\n\t\tthis.message = finalMessage;\n\t\tthis.statusCode = statusCode;\n\t\tthis.details = cause;\n\n\t\t// Maintain proper stack trace\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, EvolutionApiError);\n\t\t}\n\t}\n\n\t/**\n\t * Returns a user-friendly string representation of the error\n\t */\n\ttoString(): string {\n\t\tlet result = `${this.name}: ${this.message}`;\n\t\t\n\t\tif (this.statusCode) {\n\t\t\tresult += ` (${this.statusCode})`;\n\t\t}\n\t\t\n\t\t// Add relevant details without showing [Object ...]\n\t\tif (this.details && typeof this.details === 'object') {\n\t\t\tconst details = this.details as Record<string, any>;\n\t\t\tconst relevantDetails: string[] = [];\n\t\t\t\n\t\t\tif (details.url) {\n\t\t\t\trelevantDetails.push(`URL: ${details.url}`);\n\t\t\t}\n\t\t\t\n\t\t\tif (details.method) {\n\t\t\t\trelevantDetails.push(`Method: ${details.method}`);\n\t\t\t}\n\t\t\t\n\t\t\t// Show response details if they exist and are meaningful\n\t\t\tif (details.response && typeof details.response === 'object') {\n\t\t\t\tconst response = details.response as Record<string, any>;\n\t\t\t\tif (response.error && response.error !== this.message) {\n\t\t\t\t\trelevantDetails.push(`Server Error: ${response.error}`);\n\t\t\t\t}\n\t\t\t\tif (response.message && response.message !== this.message) {\n\t\t\t\t\trelevantDetails.push(`Server Message: ${response.message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (relevantDetails.length > 0) {\n\t\t\t\tresult += `\\n ${relevantDetails.join('\\n ')}`;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\n\t/**\n\t * Returns a JSON representation suitable for logging\n\t */\n\ttoJSON(): object {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tstatusCode: this.statusCode,\n\t\t\tdetails: this.details,\n\t\t\tstack: this.stack,\n\t\t};\n\t}\n}\n\n/**\n * Extracts error message from various Evolution API error response formats\n */\nexport function extractErrorMessage(response: unknown): string | null {\n\tif (!response) {\n\t\treturn null;\n\t}\n\n\t// Handle string responses\n\tif (typeof response === \"string\") {\n\t\treturn response;\n\t}\n\n\t// Handle object responses\n\tif (typeof response === \"object\" && response !== null) {\n\t\tconst errorObj = response as Record<string, any>;\n\n\t\t// Try different common error message paths, prioritizing Evolution API format\n\t\tconst messagePaths = [\n\t\t\t// Evolution API specific nested structure (most common)\n\t\t\terrorObj.response?.response?.message?.[0],\n\t\t\terrorObj.response?.response?.error,\n\t\t\terrorObj.response?.response?.description,\n\t\t\t\n\t\t\t// Evolution API first level nested\n\t\t\tArray.isArray(errorObj.response?.message) ? errorObj.response.message[0] : null,\n\t\t\terrorObj.response?.error,\n\t\t\terrorObj.response?.description,\n\t\t\t\n\t\t\t// Direct error message\n\t\t\tArray.isArray(errorObj.message) ? errorObj.message[0] : errorObj.message,\n\t\t\terrorObj.error,\n\t\t\terrorObj.description,\n\t\t\terrorObj.detail,\n\t\t\t\n\t\t\t// Other nested error messages\n\t\t\terrorObj.data?.error,\n\t\t\terrorObj.data?.message,\n\t\t\t\n\t\t\t// Array format messages (fallback)\n\t\t\tArray.isArray(errorObj.error) ? errorObj.error[0] : null,\n\t\t\tArray.isArray(errorObj.errors) ? errorObj.errors[0] : null,\n\t\t];\n\n\t\tfor (const path of messagePaths) {\n\t\t\tif (typeof path === \"string\" && path.trim()) {\n\t\t\t\treturn path.trim();\n\t\t\t}\n\t\t\t// Handle nested objects in arrays\n\t\t\tif (typeof path === \"object\" && path !== null) {\n\t\t\t\tconst nestedMessage = extractErrorMessage(path);\n\t\t\t\tif (nestedMessage) {\n\t\t\t\t\treturn nestedMessage;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle validation errors (common format)\n\t\tif (errorObj.validation && Array.isArray(errorObj.validation)) {\n\t\t\tconst validationErrors = errorObj.validation\n\t\t\t\t.map((v: any) => v.message || v.error || String(v))\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\", \");\n\t\t\tif (validationErrors) {\n\t\t\t\treturn `Validation error: ${validationErrors}`;\n\t\t\t}\n\t\t}\n\n\t\t// Handle specific Evolution API error patterns\n\t\tif (errorObj.statusCode && errorObj.statusText) {\n\t\t\treturn `${errorObj.statusCode}: ${errorObj.statusText}`;\n\t\t}\n\n\t\t// Last resort: try to stringify the object meaningfully\n\t\tif (Object.keys(errorObj).length > 0) {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(errorObj);\n\t\t\t} catch {\n\t\t\t\treturn \"[Complex error object]\";\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Legacy error message patterns for specific Evolution API errors\n * Kept for backward compatibility\n */\nconst SpecificErrorPatterns = [\n\t{\n\t\tpattern: (obj: any) => \n\t\t\tobj?.message?.some?.((m: any) => m?.exists === false && m?.jid && m?.number),\n\t\tmessage: \"Provided number is not a valid WhatsApp number\"\n\t},\n\t{\n\t\tpattern: (obj: any) => \n\t\t\tobj?.message?.some?.((m: string) => typeof m === \"string\" && m.includes(\"Media upload failed\")),\n\t\tmessage: \"Media upload failed on all hosts\"\n\t},\n\t{\n\t\tpattern: (obj: any) => \n\t\t\tobj?.message?.some?.((m: string) => typeof m === \"string\" && m.includes(\"No session\")),\n\t\tmessage: \"No session found, try restarting your instance\"\n\t},\n\t{\n\t\tpattern: (obj: any) => \n\t\t\tobj?.message?.some?.((m: string) => typeof m === \"string\" && m.includes(\"AggregateError\")),\n\t\tmessage: \"Connection error occurred\"\n\t},\n\t{\n\t\tpattern: (obj: any) => \n\t\t\tobj?.message?.some?.((m: string) => typeof m === \"string\" && m.includes(\"AxiosError\")),\n\t\tmessage: (obj: any) => obj.message[0] || \"Network error occurred\"\n\t},\n];\n\n/**\n * Enhanced error message extraction with specific pattern matching\n */\nfunction getErrorMessage(response: unknown): string | null {\n\t// First try the general extraction\n\tconst generalMessage = extractErrorMessage(response);\n\tif (generalMessage) {\n\t\treturn generalMessage;\n\t}\n\n\t// Then try specific patterns\n\tif (typeof response === \"object\" && response !== null) {\n\t\tfor (const { pattern, message } of SpecificErrorPatterns) {\n\t\t\ttry {\n\t\t\t\tif (pattern(response)) {\n\t\t\t\t\treturn typeof message === \"string\" ? message : message(response);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Continue to next pattern if this one fails\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n","import type { ClientOptions } from \"@/schemas/client\";\nimport type { APIRequestInit } from \"@/types/api\";\n\nimport { EvolutionApiError, extractErrorMessage } from \"./errors\";\n\nexport class ApiService {\n constructor(private options: ClientOptions) {}\n\n setInstance(instance: string) {\n this.options.instance = instance;\n }\n\n async request<T = unknown>(\n path: string,\n options: APIRequestInit = {}\n ): Promise<T> {\n const { isInstanceUrl = true } = options;\n let instance = this.options.instance;\n\n // Priority: options.instance > this.options.instance\n if (options.instance) {\n instance = options.instance;\n delete options.instance;\n }\n\n if (isInstanceUrl && !instance) {\n throw new EvolutionApiError(\"Instance not set\", {\n message:\n \"Please set the instance before making a request or pass instance in the method options.\",\n });\n }\n\n const { init, params } = this.makeInit(options);\n\n const urlPath = isInstanceUrl ? `/${path}/${instance}/` : `/${path}/`;\n const url = new URL(urlPath, this.options.serverUrl);\n\n // Add query parameters if any\n if (params.toString()) {\n url.search = params.toString();\n }\n\n let response: Response;\n let data: any;\n\n try {\n response = await fetch(url, init);\n data = await response.json();\n } catch (error) {\n // Handle network errors or JSON parsing errors\n throw new EvolutionApiError(\"Network or parsing error\", error);\n }\n\n if (!response.ok) {\n // Extract meaningful error message from the response\n const errorMessage =\n extractErrorMessage(data) ||\n `Request failed with status ${response.status}: ${response.statusText}`;\n\n throw new EvolutionApiError(\n errorMessage,\n {\n message: errorMessage,\n response: JSON.stringify(data),\n url: url.toString(),\n params: params.toString(),\n body: JSON.stringify(options.body),\n } as unknown as Record<string, any>,\n response.status\n );\n }\n\n return data;\n }\n\n private makeInit(options: APIRequestInit): {\n init: RequestInit;\n params: URLSearchParams;\n } {\n const init: RequestInit = {\n method: options.method || \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n apikey: this.options.token, // Evolution API uses apikey header\n ...this.options.headers,\n ...options.headers,\n },\n };\n\n if (options.body) {\n init.body = JSON.stringify(options.body);\n }\n\n const params = new URLSearchParams();\n if (options.params) {\n // Convert any object to URLSearchParams\n Object.entries(options.params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n params.append(key, String(value));\n }\n });\n }\n\n return { init, params };\n }\n\n async get<T = unknown>(\n path: string,\n options: Omit<APIRequestInit, \"method\"> = {}\n ): Promise<T> {\n return this.request<T>(path, { ...options, method: \"GET\" });\n }\n\n async post<T = unknown>(\n path: string,\n options: Omit<APIRequestInit, \"method\"> = {}\n ): Promise<T> {\n return this.request<T>(path, { ...options, method: \"POST\" });\n }\n\n async put<T = unknown>(\n path: string,\n options: Omit<APIRequestInit, \"method\"> = {}\n ): Promise<T> {\n return this.request<T>(path, { ...options, method: \"PUT\" });\n }\n\n async patch<T = unknown>(\n path: string,\n options: Omit<APIRequestInit, \"method\"> = {}\n ): Promise<T> {\n return this.request<T>(path, { ...options, method: \"PATCH\" });\n }\n\n async delete<T = unknown>(\n path: string,\n options: Omit<APIRequestInit, \"method\"> = {}\n ): Promise<T> {\n return this.request<T>(path, { ...options, method: \"DELETE\" });\n }\n}\n","export const Routes = {\n Message: {\n SendText: \"message/sendText\",\n SendMedia: \"message/sendMedia\",\n SendVoice: \"message/sendWhatsAppAudio\",\n SendSticker: \"message/sendSticker\",\n SendLocation: \"message/sendLocation\",\n SendContact: \"message/sendContact\",\n SendPoll: \"message/sendPoll\",\n SendReaction: \"message/sendReaction\",\n SendTemplate: \"message/sendTemplate\",\n SendStatus: \"message/sendStatus\",\n SendList: \"message/sendList\",\n },\n Chats: {\n Check: \"chat/whatsappNumbers\",\n FindAll: \"chat/findChats\",\n SendPresence: \"chat/sendPresence\",\n MarkAsRead: \"chat/markMessageAsRead\",\n MarkAsUnread: \"chat/markChatUnread\",\n Archive: \"chat/archive\",\n DeleteMessage: \"chat/deleteMessageForEveryone\",\n FetchProfilePicture: \"chat/fetchProfilePictureUrl\",\n FindContacts: \"chat/findContacts\",\n FindMessages: \"chat/findMessages\",\n FindStatusMessage: \"chat/findStatusMessage\",\n UpdateMessage: \"chat/updateMessage\",\n },\n Groups: {\n FindAll: \"group/fetchAllGroups\",\n FindByJid: \"group/findGroupInfos\",\n FindByInviteCode: \"group/inviteInfo\",\n Create: \"group/create\",\n UpdatePicture: \"group/updateGroupPicture\",\n UpdateSubject: \"group/updateGroupSubject\",\n UpdateDescription: \"group/updateGroupDescription\",\n FetchInviteCode: \"group/fetchInviteCode\",\n AcceptInviteCode: \"group/acceptInviteCode\",\n RevokeInviteCode: \"group/revokeInviteCode\",\n SendGroupInvite: \"group/sendGroupInvite\",\n FindMembers: \"group/findGroupMembers\",\n UpdateMembers: \"group/updateGroupMembers\",\n UpdateSetting: \"group/updateGroupSetting\",\n ToggleEphemeral: \"group/toggleEphemeral\",\n Leave: \"group/leaveGroup\",\n },\n Profile: {\n FetchBusinessProfile: \"chat/fetchBusinessProfile\",\n FetchProfile: \"chat/fetchProfile\",\n UpdateName: \"chat/updateProfileName\",\n UpdateStatus: \"chat/updateProfileStatus\",\n UpdatePicture: \"chat/updateProfilePicture\",\n RemovePicture: \"chat/removeProfilePicture\",\n FetchPrivacySettings: \"chat/fetchPrivacySettings\",\n UpdatePrivacySettings: \"chat/updatePrivacySettings\",\n },\n Webhook: {\n Set: \"webhook/set\",\n Find: \"webhook/find\",\n },\n Settings: {\n Set: \"settings/set\",\n Find: \"settings/find\",\n },\n Instance: {\n Create: \"instance/create\",\n FetchAll: \"instance/fetchInstances\",\n Connect: \"instance/connect\",\n Restart: \"instance/restart\",\n ConnectionState: \"instance/connectionState\",\n Logout: \"instance/logout\",\n Delete: \"instance/delete\",\n SetPresence: \"instance/setPresence\",\n },\n};\n","// Pure TypeScript types and utility functions for better IDE support and performance\nimport { isValidPhoneNumber, parsePhoneNumber } from \"libphonenumber-js\";\nimport type { GroupInviteCode, GroupJid, Jid } from \"@/types/tags\";\n\n// Type definitions\nexport type PhoneNumber = string;\nexport type MessageId = string;\nexport type ChatId = PhoneNumber | Jid | GroupJid;\nexport type ApiNumber = PhoneNumber | Jid | GroupJid;\nexport type Media = string; // URL or base64 string\n\n// Utility functions\nexport const validatePhoneNumber = (value: string): boolean => isValidPhoneNumber(value);\nexport const parsePhoneNumberUtil = (phoneNumber: string): string => parsePhoneNumber(phoneNumber).number;\n\nexport const validateJid = (value: string): boolean => value.endsWith(\"@s.whatsapp.net\");\nexport const validateGroupJid = (value: string): boolean => value.endsWith(\"@g.us\");\nexport const validateGroupInviteCode = (value: string): boolean => \n value.length === 22 && /^[a-zA-Z0-9]{22}$/.test(value);\n\nexport const validateMedia = (value: string): boolean => {\n // Check if it's a URL or base64 string\n try {\n new URL(value);\n return true;\n } catch {\n // Check if it's a valid base64 string\n try {\n return btoa(atob(value)) === value;\n } catch {\n return false;\n }\n }\n};\n\n// Backward compatibility - keeping the schema names but as type aliases\nexport type PhoneNumberSchema = PhoneNumber;\nexport type JidSchema = Jid;\nexport type GroupJidSchema = GroupJid;\nexport type GroupInviteCodeSchema = GroupInviteCode;\nexport type MessageIdSchema = MessageId;\nexport type ChatIdSchema = ChatId;\nexport type ApiNumberSchema = ApiNumber;\nexport type mediaSchema = Media;\n","import { Routes } from \"@/api/routes\";\nimport type { ApiService } from \"@/api/service\";\nimport { validateGroupJid, validateJid } from \"@/schemas/common\";\nimport type { MethodOptions } from \"@/types/api\";\n\nimport type * as Archive from \"./schemas/archive\";\nimport type * as Check from \"./schemas/check\";\nimport type * as DeleteMessage from \"./schemas/delete-message\";\nimport type * as FetchProfilePicture from \"./schemas/fetch-profile-picture\";\nimport type * as FindAll from \"./schemas/find-all\";\nimport type * as FindContacts from \"./schemas/find-contacts\";\nimport type * as FindMessages from \"./schemas/find-messages\";\nimport type * as FindStatusMessage from \"./schemas/find-status-message\";\nimport type * as MarkAsRead from \"./schemas/mark-as-read\";\nimport type * as MarkAsUnread from \"./schemas/mark-as-unread\";\nimport type * as Presence from \"./schemas/presence\";\nimport type * as UpdateMessage from \"./schemas/update-message\";\n\nexport class ChatsModule {\n constructor(private readonly api: ApiService) {}\n\n /**\n * Checks if phone numbers are registered on WhatsApp\n * @param numbers - Array of phone numbers to check\n * @param methodOptions - Method-specific options (instance override)\n */\n async check(\n numbers: Check.CheckOptions,\n methodOptions?: MethodOptions\n ): Promise<Check.CheckResponse> {\n const body = {\n numbers: Array.isArray(numbers) ? numbers : [numbers],\n };\n const response = await this.api.post(Routes.Chats.Check, {\n body,\n ...methodOptions,\n });\n\n return response as Check.CheckResponse;\n }\n\n /**\n * Gets all chats\n * @param methodOptions - Method-specific options (instance override)\n */\n async findAll(\n methodOptions?: MethodOptions\n ): Promise<FindAll.FindAllChatsResponse> {\n const response = await this.api.get(Routes.Chats.FindAll, methodOptions);\n\n return response as FindAll.FindAllChatsResponse;\n }\n\n /**\n * Updates presence status\n * @param params - Presence parameters\n * @param methodOptions - Method-specific options (instance override)\n */\n async updatePresence(\n options: Presence.PresenceOptions,\n methodOptions?: MethodOptions\n ): Promise<void> {\n if (!options.number) {\n throw new Error(\"Number is required\");\n }\n\n if (!validateJid(options.number) && !validateGroupJid(options.number)) {\n options.number = `${options.number}@s.whatsapp.net`;\n }\n\n await this.api.post(Routes.Chats.SendPresence, {\n body: options,\n ...methodOptions,\n });\n }\n\n /**\n * Marks messages as read\n * @param options - Mark as read options\n * @param methodOptions - Method-specific options (instance override)\n */\n async markAsRead(\n options: MarkAsRead.MarkAsReadRequest,\n methodOptions?: MethodOptions\n ): Promise<MarkAsRead.MarkAsReadResponse> {\n const response = await this.api.post(Routes.Chats.MarkAsRead, {\n body: options,\n ...methodOptions,\n });\n\n return response as MarkAsRead.MarkAsReadResponse;\n }\n\n /**\n * Marks messages as unread\n * @param options - Mark as unread options\n * @param methodOptions - Method-specific options (instance override)\n */\n async markAsUnread(\n options: MarkAsUnread.MarkAsUnreadRequest,\n methodOptions?: MethodOptions\n ): Promise<MarkAsUnread.MarkAsUnreadResponse> {\n const response = await this.api.post(Routes.Chats.MarkAsUnread, {\n body: options,\n ...methodOptions,\n });\n\n return response as MarkAsUnread.MarkAsUnreadResponse;\n }\n\n /**\n * Archives a chat\n * @param options - Archive options\n * @param methodOptions - Method-specific options (instance override)\n */\n async archive(\n options: Archive.ArchiveRequest,\n methodOptions?: MethodOptions\n ): Promise<Archive.ArchiveResponse> {\n const response = await this.api.post(Routes.Chats.Archive, {\n body: options,\n ...methodOptions,\n });\n\n return response as Archive.ArchiveResponse;\n }\n\n /**\n * Deletes a message\n * @param options - Delete message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async deleteMessage(\n options: DeleteMessage.DeleteMessageRequest,\n methodOptions?: MethodOptions\n ): Promise<DeleteMessage.DeleteMessageResponse> {\n const response = await this.api.delete(Routes.Chats.DeleteMessage, {\n body: options,\n ...methodOptions,\n });\n\n return response as DeleteMessage.DeleteMessageResponse;\n }\n\n /**\n * Fetches profile picture\n * @param options - Fetch profile picture options\n * @param methodOptions - Method-specific options (instance override)\n */\n async fetchProfilePicture(\n options: FetchProfilePicture.FetchProfilePictureRequest,\n methodOptions?: MethodOptions\n ): Promise<FetchProfilePicture.FetchProfilePictureResponse> {\n const response = await this.api.post(Routes.Chats.FetchProfilePicture, {\n body: options,\n ...methodOptions,\n });\n\n return response as FetchProfilePicture.FetchProfilePictureResponse;\n }\n\n /**\n * Finds contacts\n * @param options - Find contacts options\n * @param methodOptions - Method-specific options (instance override)\n */\n async findContacts(\n options: FindContacts.FindContactsRequest,\n methodOptions?: MethodOptions\n ): Promise<FindContacts.FindContactsResponse> {\n const response = await this.api.post(Routes.Chats.FindContacts, {\n body: options,\n ...methodOptions,\n });\n\n return response as FindContacts.FindContactsResponse;\n }\n\n /**\n * Finds messages\n * @param options - Find messages options\n * @param methodOptions - Method-specific options (instance override)\n */\n async findMessages(\n options: FindMessages.FindMessagesRequest,\n methodOptions?: MethodOptions\n ): Promise<FindMessages.FindMessagesResponse> {\n const response = await this.api.post(Routes.Chats.FindMessages, {\n body: options,\n ...methodOptions,\n });\n\n return response as FindMessages.FindMessagesResponse;\n }\n\n /**\n * Finds status messages\n * @param options - Find status message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async findStatusMessage(\n options: FindStatusMessage.FindStatusMessageRequest,\n methodOptions?: MethodOptions\n ): Promise<FindStatusMessage.FindStatusMessageResponse> {\n const response = await this.api.post(Routes.Chats.FindStatusMessage, {\n body: options,\n ...methodOptions,\n });\n\n return response as FindStatusMessage.FindStatusMessageResponse;\n }\n\n /**\n * Updates a message\n * @param options - Update message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async updateMessage(\n options: UpdateMessage.UpdateMessageRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdateMessage.UpdateMessageResponse> {\n const response = await this.api.put(Routes.Chats.UpdateMessage, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdateMessage.UpdateMessageResponse;\n }\n}\n","import { Routes } from \"@/api/routes\";\nimport type { ApiService } from \"@/api/service\";\nimport type { MethodOptions } from \"@/types/api\";\nimport type { GroupInviteCode, GroupJid } from \"@/types/tags\";\n\nimport type * as AcceptInviteCode from \"./schemas/accept-invite-code\";\nimport type * as Create from \"./schemas/create\";\nimport type * as FetchInviteCode from \"./schemas/fetch-invite-code\";\nimport type * as FindAll from \"./schemas/find-all\";\nimport type * as FindByInviteCode from \"./schemas/find-by-invite-code\";\nimport type * as FindByJid from \"./schemas/find-by-jid\";\nimport type * as FindMembers from \"./schemas/find-members\";\nimport type * as Leave from \"./schemas/leave\";\nimport type * as RevokeInviteCode from \"./schemas/revoke-invite-code\";\nimport type * as SendGroupInvite from \"./schemas/send-group-invite\";\nimport type * as ToggleEphemeral from \"./schemas/toggle-ephemeral\";\nimport type * as UpdateDescription from \"./schemas/update-description\";\nimport type * as UpdateMembers from \"./schemas/update-members\";\nimport type * as UpdatePicture from \"./schemas/update-picture\";\nimport type * as UpdateSetting from \"./schemas/update-setting\";\nimport type * as UpdateSubject from \"./schemas/update-subject\";\n\nexport class GroupsModule {\n constructor(private readonly api: ApiService) {}\n\n /**\n * Gets all groups\n * @param getParticipants - Whether to get participants\n * @param methodOptions - Method-specific options (instance override)\n */\n async findAll(\n getParticipants: false,\n methodOptions?: MethodOptions\n ): Promise<FindAll.FindAllGroupsResponse>;\n async findAll(\n getParticipants: true,\n methodOptions?: MethodOptions\n ): Promise<FindAll.FindAllGroupsWithParticipantsResponse>;\n async findAll(\n getParticipants = false,\n methodOptions?: MethodOptions\n ): Promise<\n | FindAll.FindAllGroupsResponse\n | FindAll.FindAllGroupsWithParticipantsResponse\n > {\n const response = await this.api.get(Routes.Groups.FindAll, {\n params: { getParticipants },\n ...methodOptions,\n });\n\n if (getParticipants) {\n return response as FindAll.FindAllGroupsWithParticipantsResponse;\n }\n return response as FindAll.FindAllGroupsResponse;\n }\n\n /**\n * Gets a group by invite code\n * @param inviteCode - The group invite code (not the URL)\n * @param methodOptions - Method-specific options (instance override)\n */\n async findByInviteCode(\n inviteCode: string | GroupInviteCode,\n methodOptions?: MethodOptions\n ): Promise<FindByInviteCode.FindGroupByInviteCodeResponse> {\n const response = await this.api.get(Routes.Groups.FindByInviteCode, {\n params: { inviteCode: inviteCode as GroupInviteCode },\n ...methodOptions,\n });\n\n return response as FindByInviteCode.FindGroupByInviteCodeResponse;\n }\n\n /**\n * Gets a group by JID\n * @param groupJid - The group JID terminated with \\@g.us\n * @param methodOptions - Method-specific options (instance override)\n */\n async findByJid(\n groupJid: string | GroupJid,\n methodOptions?: MethodOptions\n ): Promise<FindByJid.FindGroupByJidResponse> {\n const response = await this.api.get(Routes.Groups.FindByJid, {\n params: { groupJid: groupJid as GroupJid },\n ...methodOptions,\n });\n\n return response as FindByJid.FindGroupByJidResponse;\n }\n\n async create(\n options: Create.CreateGroupRequest,\n methodOptions?: MethodOptions\n ): Promise<Create.CreateGroupResponse> {\n const response = await this.api.post(Routes.Groups.Create, {\n body: options,\n ...methodOptions,\n });\n\n return response as Create.CreateGroupResponse;\n }\n\n async updatePicture(\n options: UpdatePicture.UpdatePictureRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdatePicture.UpdatePictureResponse> {\n const response = await this.api.post(Routes.Groups.UpdatePicture, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdatePicture.UpdatePictureResponse;\n }\n\n async updateSubject(\n options: UpdateSubject.UpdateSubjectRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdateSubject.UpdateSubjectResponse> {\n const response = await this.api.post(Routes.Groups.UpdateSubject, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdateSubject.UpdateSubjectResponse;\n }\n\n async updateDescription(\n options: UpdateDescription.UpdateDescriptionRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdateDescription.UpdateDescriptionResponse> {\n const response = await this.api.post(Routes.Groups.UpdateDescription, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdateDescription.UpdateDescriptionResponse;\n }\n\n async fetchInviteCode(\n options: FetchInviteCode.FetchInviteCodeRequest,\n methodOptions?: MethodOptions\n ): Promise<FetchInviteCode.FetchInviteCodeResponse> {\n const response = await this.api.get(Routes.Groups.FetchInviteCode, {\n params: options,\n ...methodOptions,\n });\n\n return response as FetchInviteCode.FetchInviteCodeResponse;\n }\n\n async acceptInviteCode(\n options: AcceptInviteCode.AcceptInviteCodeRequest,\n methodOptions?: MethodOptions\n ): Promise<AcceptInviteCode.AcceptInviteCodeResponse> {\n const response = await this.api.post(Routes.Groups.AcceptInviteCode, {\n body: options,\n ...methodOptions,\n });\n\n return response as AcceptInviteCode.AcceptInviteCodeResponse;\n }\n\n async revokeInviteCode(\n options: RevokeInviteCode.RevokeInviteCodeRequest,\n methodOptions?: MethodOptions\n ): Promise<RevokeInviteCode.RevokeInviteCodeResponse> {\n const response = await this.api.post(Routes.Groups.RevokeInviteCode, {\n body: options,\n ...methodOptions,\n });\n\n return response as RevokeInviteCode.RevokeInviteCodeResponse;\n }\n\n async sendGroupInvite(\n options: SendGroupInvite.SendGroupInviteRequest,\n methodOptions?: MethodOptions\n ): Promise<SendGroupInvite.SendGroupInviteResponse> {\n const response = await this.api.post(Routes.Groups.SendGroupInvite, {\n body: options,\n ...methodOptions,\n });\n\n return response as SendGroupInvite.SendGroupInviteResponse;\n }\n\n async findMembers(\n options: FindMembers.FindMembersRequest,\n methodOptions?: MethodOptions\n ): Promise<FindMembers.FindMembersResponse> {\n const response = await this.api.get(Routes.Groups.FindMembers, {\n params: options,\n ...methodOptions,\n });\n\n return response as FindMembers.FindMembersResponse;\n }\n\n async updateMembers(\n options: UpdateMembers.UpdateMembersRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdateMembers.UpdateMembersResponse> {\n const response = await this.api.post(Routes.Groups.UpdateMembers, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdateMembers.UpdateMembersResponse;\n }\n\n async updateSetting(\n options: UpdateSetting.UpdateSettingRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdateSetting.UpdateSettingResponse> {\n const response = await this.api.post(Routes.Groups.UpdateSetting, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdateSetting.UpdateSettingResponse;\n }\n\n async toggleEphemeral(\n options: ToggleEphemeral.ToggleEphemeralRequest,\n methodOptions?: MethodOptions\n ): Promise<ToggleEphemeral.ToggleEphemeralResponse> {\n const response = await this.api.post(Routes.Groups.ToggleEphemeral, {\n body: options,\n ...methodOptions,\n });\n\n return response as ToggleEphemeral.ToggleEphemeralResponse;\n }\n\n async leave(\n options: Leave.LeaveRequest,\n methodOptions?: MethodOptions\n ): Promise<Leave.LeaveResponse> {\n const response = await this.api.post(Routes.Groups.Leave, {\n body: options,\n ...methodOptions,\n });\n\n return response as Leave.LeaveResponse;\n }\n}\n","import { Routes } from \"@/api/routes\";\nimport type { ApiService } from \"@/api/service\";\n\nimport type * as Connect from \"./schemas/connect\";\nimport type * as ConnectionState from \"./schemas/connection-state\";\nimport type * as Create from \"./schemas/create\";\nimport type * as Delete from \"./schemas/delete\";\nimport type * as FetchAll from \"./schemas/fetch-all\";\nimport type * as Logout from \"./schemas/logout\";\nimport type * as Restart from \"./schemas/restart\";\nimport type * as SetPresence from \"./schemas/set-presence\";\n\nimport type { MethodOptions } from \"@/types/api\";\n\nexport class InstanceModule {\n constructor(private readonly api: ApiService) {}\n\n async create(\n options: Create.CreateInstanceRequest\n ): Promise<Create.CreateInstanceResponse> {\n const response = await this.api.post(Routes.Instance.Create, {\n body: options,\n isInstanceUrl: false,\n });\n return response as Create.CreateInstanceResponse;\n }\n\n async connect(\n options: Connect.ConnectRequest,\n methodOptions?: MethodOptions\n ): Promise<Connect.ConnectResponse> {\n const { instanceName } = options;\n const instance = methodOptions?.instance ?? instanceName;\n if (!instance) {\n throw new Error(\"Instance name is required\");\n }\n const response = await this.api.get(Routes.Instance.Connect, {\n instance,\n isInstanceUrl: true,\n });\n return response as Connect.ConnectResponse;\n }\n\n async connectionState(\n options: ConnectionState.ConnectionStateRequest,\n methodOptions?: MethodOptions\n ): Promise<ConnectionState.ConnectionStateResponse> {\n const { instanceName } = options;\n const instance = methodOptions?.instance ?? instanceName;\n if (!instance) {\n throw new Error(\"Instance name is required\");\n }\n const response = await this.api.get(Routes.Instance.ConnectionState, {\n instance,\n isInstanceUrl: true,\n });\n return response as ConnectionState.ConnectionStateResponse;\n }\n\n async logout(\n options: Logout.LogoutRequest,\n methodOptions?: MethodOptions\n ): Promise<Logout.LogoutResponse> {\n const { instanceName } = options;\n const instance = methodOptions?.instance ?? instanceName;\n if (!instance) {\n throw new Error(\"Instance name is required\");\n }\n const response = await this.api.delete(Routes.Instance.Logout, {\n instance,\n isInstanceUrl: true,\n });\n return response as Logout.LogoutResponse;\n }\n\n async delete(options: Delete.DeleteRequest): Promise<Delete.DeleteResponse> {\n const response = await this.api.delete(Routes.Instance.Delete, {\n instance: options.instanceName,\n isInstanceUrl: true,\n });\n return response as Delete.DeleteResponse;\n }\n\n async restart(\n options: Restart.RestartRequest,\n methodOptions?: MethodOptions\n ): Promise<Restart.RestartResponse> {\n const { instanceName } = options;\n const instance = methodOptions?.instance ?? instanceName;\n if (!instance) {\n throw new Error(\"Instance name is required\");\n }\n const response = await this.api.post(Routes.Instance.Restart, {\n instance,\n isInstanceUrl: true,\n });\n return response as Restart.RestartResponse;\n }\n\n async fetchAll(\n options?: FetchAll.FetchAllRequest\n ): Promise<FetchAll.FetchAllResponse> {\n const response = await this.api.get(Routes.Instance.FetchAll, {\n params: options,\n isInstanceUrl: false,\n });\n return response as FetchAll.FetchAllResponse;\n }\n\n async setPresence(\n options: SetPresence.SetPresenceRequest,\n methodOptions?: MethodOptions\n ): Promise<SetPresence.SetPresenceResponse> {\n const { instanceName, ...rest } = options;\n const instance = methodOptions?.instance ?? instanceName;\n if (!instance) {\n throw new Error(\"Instance name is required\");\n }\n const response = await this.api.post(Routes.Instance.SetPresence, {\n body: rest,\n instance,\n isInstanceUrl: true,\n });\n return response as SetPresence.SetPresenceResponse;\n }\n}\n","import { Routes } from \"@/api/routes\";\nimport type { ApiService } from \"@/api/service\";\nimport type { MethodOptions } from \"@/types/api\";\n\nimport type * as Audio from \"./schemas/audio\";\nimport type * as Contact from \"./schemas/contact\";\nimport type * as Document from \"./schemas/document\";\nimport type * as Image from \"./schemas/image\";\nimport type * as List from \"./schemas/list\";\nimport type * as Location from \"./schemas/location\";\nimport type * as Reaction from \"./schemas/reaction\";\nimport type * as Status from \"./schemas/status\";\nimport type * as Sticker from \"./schemas/sticker\";\nimport type * as Template from \"./schemas/template\";\nimport type * as Text from \"./schemas/text\";\nimport type * as Video from \"./schemas/video\";\nimport type * as Voice from \"./schemas/voice\";\n\nexport class MessagesModule {\n constructor(private readonly api: ApiService) {}\n\n /**\n * Sends a text message\n * @param options - Text message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendText(\n options: Text.TextMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Text.TextMessageResponse> {\n const response = await this.api.post(Routes.Message.SendText, {\n body: options,\n ...methodOptions,\n });\n\n return response as Text.TextMessageResponse;\n }\n\n /**\n * Sends an image\n * @param options - Image message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendImage(\n options: Image.ImageMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Image.ImageMessageResponse> {\n options.mediatype = \"image\";\n const response = await this.api.post(Routes.Message.SendMedia, {\n body: options,\n ...methodOptions,\n });\n\n return response as Image.ImageMessageResponse;\n }\n\n /**\n * Sends a video\n * @param options - Video message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendVideo(\n options: Video.VideoMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Video.VideoMessageResponse> {\n options.mediatype = \"video\";\n const response = await this.api.post(Routes.Message.SendMedia, {\n body: options,\n ...methodOptions,\n });\n\n return response as Video.VideoMessageResponse;\n }\n\n /**\n * Sends a document\n * @param options - Document message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendDocument(\n options: Document.DocumentMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Document.DocumentMessageResponse> {\n options.mediatype = \"document\";\n const response = await this.api.post(Routes.Message.SendMedia, {\n body: options,\n ...methodOptions,\n });\n\n return response as Document.DocumentMessageResponse;\n }\n\n /**\n * Sends an audio\n * @param options - Audio message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendAudio(\n options: Audio.AudioMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Audio.AudioMessageResponse> {\n options.mediatype = \"audio\";\n const response = await this.api.post(Routes.Message.SendMedia, {\n body: options,\n ...methodOptions,\n });\n\n return response as Audio.AudioMessageResponse;\n }\n\n /**\n * Sends a voice message\n * @param options - Voice message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendVoice(\n options: Voice.VoiceMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Voice.VoiceMessageResponse> {\n const response = await this.api.post(Routes.Message.SendVoice, {\n body: options,\n ...methodOptions,\n });\n\n return response as Voice.VoiceMessageResponse;\n }\n\n /**\n * Sends a sticker\n * @param options - Sticker message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendSticker(\n options: Sticker.StickerMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Sticker.StickerMessageResponse> {\n const response = await this.api.post(Routes.Message.SendSticker, {\n body: options,\n ...methodOptions,\n });\n\n return response as Sticker.StickerMessageResponse;\n }\n\n /**\n * Sends a location\n * @param options - Location message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendLocation(\n options: Location.LocationMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Location.LocationMessageResponse> {\n const response = await this.api.post(Routes.Message.SendLocation, {\n body: options,\n ...methodOptions,\n });\n\n return response as Location.LocationMessageResponse;\n }\n\n /**\n * Sends a contact\n * @param options - Contact message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendContact(\n options: Contact.ContactMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Contact.ContactMessageResponse> {\n const response = await this.api.post(Routes.Message.SendContact, {\n body: options,\n ...methodOptions,\n });\n\n return response as Contact.ContactMessageResponse;\n }\n\n /**\n * Sends a reaction\n * @param options - Reaction message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendReaction(\n options: Reaction.ReactionMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Reaction.ReactionMessageResponse> {\n const response = await this.api.post(Routes.Message.SendReaction, {\n body: options,\n ...methodOptions,\n });\n\n return response as Reaction.ReactionMessageResponse;\n }\n\n /**\n * Sends a template\n * @param options - Template message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendTemplate(\n options: Template.TemplateMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Template.TemplateMessageResponse> {\n const response = await this.api.post(Routes.Message.SendTemplate, {\n body: options,\n ...methodOptions,\n });\n\n return response as Template.TemplateMessageResponse;\n }\n\n /**\n * Sends a status\n * @param options - Status message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendStatus(\n options: Status.StatusMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<Status.StatusMessageResponse> {\n const response = await this.api.post(Routes.Message.SendStatus, {\n body: options,\n ...methodOptions,\n });\n\n return response as Status.StatusMessageResponse;\n }\n\n /**\n * Sends a list\n * @param options - List message options\n * @param methodOptions - Method-specific options (instance override)\n */\n async sendList(\n options: List.ListMessageOptions,\n methodOptions?: MethodOptions\n ): Promise<List.ListMessageResponse> {\n const response = await this.api.post(Routes.Message.SendList, {\n body: options,\n ...methodOptions,\n });\n\n return response as List.ListMessageResponse;\n }\n}\n","import { Routes } from \"@/api/routes\";\nimport type { ApiService } from \"@/api/service\";\nimport type { MethodOptions } from \"@/types/api\";\n\nimport type * as FetchBusinessProfile from \"./schemas/fetch-business-profile\";\nimport type * as FetchPrivacySettings from \"./schemas/fetch-privacy-settings\";\nimport type * as FetchProfile from \"./schemas/fetch-profile\";\nimport type * as RemovePicture from \"./schemas/remove-picture\";\nimport type * as UpdateName from \"./schemas/update-name\";\nimport type * as UpdatePicture from \"./schemas/update-picture\";\nimport type * as UpdatePrivacySettings from \"./schemas/update-privacy-settings\";\nimport type * as UpdateStatus from \"./schemas/update-status\";\n\nexport class ProfileModule {\n constructor(private readonly api: ApiService) {}\n\n async fetchBusinessProfile(\n options: FetchBusinessProfile.FetchBusinessProfileRequest,\n methodOptions?: MethodOptions\n ): Promise<FetchBusinessProfile.FetchBusinessProfileResponse> {\n const response = await this.api.post(Routes.Profile.FetchBusinessProfile, {\n body: options,\n ...methodOptions,\n });\n\n return response as FetchBusinessProfile.FetchBusinessProfileResponse;\n }\n\n async fetchProfile(\n options: FetchProfile.FetchProfileRequest,\n methodOptions?: MethodOptions\n ): Promise<FetchProfile.FetchProfileResponse> {\n const response = await this.api.post(Routes.Profile.FetchProfile, {\n body: options,\n ...methodOptions,\n });\n\n return response as FetchProfile.FetchProfileResponse;\n }\n\n async updateName(\n options: UpdateName.UpdateNameRequest,\n methodOptions?: MethodOptions\n ): Promise<UpdateName.UpdateNameResponse> {\n const response = await this.api.post(Routes.Profile.UpdateName, {\n body: options,\n ...methodOptions,\n });\n\n return response as UpdateNam