UNPKG

@solufy/evolution-sdk

Version:

Unofficial SDK for the Evolution Whatsapp API v2

1,079 lines (1,046 loc) 32.1 kB
var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); // src/api/errors.ts import { z } from "zod"; var EvolutionApiError = class _EvolutionApiError extends Error { constructor(message, cause) { const error = getErrorMessage(cause); super(message, error ? void 0 : { cause }); this.name = _EvolutionApiError.name; this.message = error ?? message; } }; var ErrorMessages = [ ErrorMessage( z.object({ message: z.array( z.object({ exists: z.literal(false), jid: z.string(), number: z.string() }) ) }), "Provided number is not a valid WhatsApp number" ), ErrorMessage( z.object({ message: z.array(z.string().includes("Media upload failed on all hosts")) }), "Media upload failed on all hosts" ), ErrorMessage( z.object({ message: z.array(z.string().includes("AxiosError")) }), (response) => response.message[0] ), ErrorMessage( z.object({ message: z.array(z.string().includes("No session")) }), "No session found, try restarting your instance" ), ErrorMessage( z.object({ message: z.array(z.string().includes("AggregateError")) }), "AggregateError" ) ]; function getErrorMessage(response) { const error = ErrorMessages.find( (message) => message.schema.safeParse(response).success ); return error ? typeof error.message === "string" ? error.message : ( // biome-ignore lint/suspicious/noExplicitAny: Generic error.message(response) ) : void 0; } function ErrorMessage(schema, message) { return { schema, message }; } // src/api/service.ts var ApiService = class { constructor(options) { this.options = options; } async get(path, options = {}) { return this.request(path, { ...options, method: "GET" }); } async post(path, options = {}) { return this.request(path, { ...options, method: "POST" }); } async put(path, options = {}) { return this.request(path, { ...options, method: "PUT" }); } async patch(path, options = {}) { return this.request(path, { ...options, method: "PATCH" }); } async delete(path, options = {}) { return this.request(path, { ...options, method: "DELETE" }); } async request(path, options = {}) { const { init, params } = this.makeInit(options); const url = new URL( `/${path}/${this.options.instance}/?${params}`, this.options.serverUrl ); const response = await fetch(url, init); const data = await response.json(); if (!response.ok || "error" in data) { throw new EvolutionApiError( `${this.options.instance} ${data.error || "Unknown Error"}`, data.response ); } return data; } makeInit(options) { const { params: _, headers, body, ...rest } = options; const paramsInit = options.params && Object.entries(options.params).filter(([, value]) => Boolean(value)).map(([key, value]) => [key, String(value)]); const params = new URLSearchParams(paramsInit); const init = { ...rest, headers: { ...headers || {}, apikey: this.options.token } }; if (body) { init.headers["Content-Type"] = body instanceof FormData ? "multipart/form-data" : "application/json"; init.body = body instanceof FormData ? body : JSON.stringify(body); } return { init, params }; } }; // src/api/routes.ts var Routes = { Message: { SendText: "message/sendText", SendMedia: "message/sendMedia", SendVoice: "message/sendWhatsAppAudio", SendSticker: "message/sendSticker", SendLocation: "message/sendLocation", SendContact: "message/sendContact", SendPoll: "message/sendPoll" }, Chats: { Check: "chat/whatsappNumbers", FindAll: "chat/findChats", SendPresence: "chat/sendPresence" }, Groups: { FindAll: "group/fetchAllGroups", FindByJid: "group/findGroupInfos", FindByInviteCode: "group/inviteInfo" } }; // src/modules/chats/schemas/check.ts import { parsePhoneNumber as parsePhoneNumber2 } from "libphonenumber-js"; import { z as z3 } from "zod"; // src/schemas/common.ts import { isValidPhoneNumber, parsePhoneNumber } from "libphonenumber-js"; import { z as z2 } from "zod"; var PhoneNumberSchema = z2.custom((value) => isValidPhoneNumber(value), "Invalid phone number").transform((phoneNumber) => parsePhoneNumber(phoneNumber).number); var JidSchema = z2.string().endsWith( "@s.whatsapp.net", "Invalid remote JID, should end with @s.whatsapp.net" ); var GroupJidSchema = z2.string().endsWith( "@g.us", "Invalid group JID, should end with @g.us" ); var GroupInviteCodeSchema = z2.string().length(22).regex( /^[a-zA-Z0-9]{22}$/, "Invalid group invite code" ); var ApiNumberSchema = z2.union([ PhoneNumberSchema, JidSchema, GroupJidSchema ]); var mediaSchema = z2.union([z2.string().url(), z2.string().base64()]); // src/types/tags.ts var Jid = (jid) => jid; var GroupJid = (jid) => jid; var MessageId = (id) => id; var ChatId = (id) => id; // src/modules/chats/schemas/check.ts var CheckOptionsSchema = z3.array(PhoneNumberSchema); var CheckBodySchema = CheckOptionsSchema.transform((data) => ({ numbers: Array.isArray(data) ? data : [data] })); var CheckResponseSchema = z3.array( z3.object({ exists: z3.boolean(), jid: z3.string(), number: z3.string() }) ).transform( (numbers) => numbers.map((number) => ({ exists: number.exists, jid: Jid(number.jid), number: parsePhoneNumber2(number.number).number })) ); // src/modules/chats/schemas/find-all.ts import { z as z4 } from "zod"; // src/utils/phone-numer-from-jid.ts import { parsePhoneNumber as parsePhoneNumber3 } from "libphonenumber-js"; function phoneNumberFromJid(jid) { return parsePhoneNumber3(`+${jid.split("@")[0]}`).number; } // src/modules/chats/schemas/find-all.ts var FindAllChatsResponseSchema = z4.array( z4.object({ id: z4.string(), remoteJid: z4.string(), name: z4.string().nullish(), labels: z4.array(z4.string()).nullish(), createdAt: z4.coerce.date(), updatedAt: z4.coerce.date(), pushName: z4.string().nullish(), profilePicUrl: z4.string().url().nullish() }) ).transform( (chats) => chats.map((chat) => ({ id: ChatId(chat.id), jid: chat.remoteJid.endsWith("@g.us") ? GroupJid(chat.remoteJid) : Jid(chat.remoteJid), phoneNumber: phoneNumberFromJid(chat.remoteJid), name: chat.name || void 0, labels: chat.labels || void 0, createdAt: chat.createdAt, updatedAt: chat.updatedAt, pushName: chat.pushName || void 0, pictureUrl: chat.profilePicUrl || void 0 })) ); // src/modules/chats/schemas/presence.ts import { z as z5 } from "zod"; var PresenceOptionsSchema = z5.object({ /** * Chat number or JID to receve the presence */ number: ApiNumberSchema, /** * Duration of the presence in millisseconds */ duration: z5.number(), /** * Presence state * - `composing`: typing a message * - `recording`: recording an audio */ presence: z5.enum(["composing", "recording"]), /** * Whether to wait until the presence is finished (duration) */ waitUntilFinish: z5.boolean().optional() }); var PresenceBodySchema = PresenceOptionsSchema.transform( ({ waitUntilFinish, duration, ...data }) => ({ ...data, delay: duration }) ); // src/modules/chats/index.ts var ChatsModule = class { constructor(api) { this.api = api; } /** * Checks if a number has WhatsApp * @param numbers - Number(s) (with country code) to check */ async check(...numbers) { const body = CheckBodySchema.parse(numbers.flat()); const response = await this.api.post(Routes.Chats.Check, { body }); return CheckResponseSchema.parse(response); } /** * Gets all chats */ async findAll() { const response = await this.api.post(Routes.Chats.FindAll); return FindAllChatsResponseSchema.parse(response); } /** * Sends a presence to a certain chat * @param options - Presence options */ async sendPresence(options) { const body = PresenceBodySchema.parse(options); if (options.waitUntilFinish) { await this.api.post(Routes.Chats.SendPresence, { body }); } else { this.api.post(Routes.Chats.SendPresence, { body }); } } }; // src/modules/groups/index.ts import { z as z9 } from "zod"; // src/modules/groups/schemas/find-all.ts import { z as z7 } from "zod"; // src/modules/groups/schemas/common.ts import { z as z6 } from "zod"; var GroupResponseSchema = z6.object({ id: z6.string(), subject: z6.string(), subjectOwner: z6.string(), subjectTime: z6.coerce.date(), pictureUrl: z6.string().url().nullish(), size: z6.number(), creation: z6.coerce.date(), owner: z6.string(), restrict: z6.boolean(), announce: z6.boolean() }); var ParticipantResponseSchema = z6.object({ id: z6.string(), admin: z6.enum(["admin", "superadmin"]).nullish() }); var GroupWithParticipantsResponseSchema = GroupResponseSchema.extend({ participants: z6.array(ParticipantResponseSchema) }); var GroupResponseSchemaTransform = (group) => ({ jid: GroupJid(group.id), name: group.subject, pictureUrl: group.pictureUrl || void 0, size: group.size, subject: { owner: Jid(group.subjectOwner), time: group.subjectTime }, owner: { jid: Jid(group.owner), phoneNumber: phoneNumberFromJid(group.owner) }, createdAt: group.creation, restrict: group.restrict, announce: group.announce }); var ParticipantResponseSchemaTransform = (participant) => ({ id: participant.id, role: participant.admin || "member" }); var GroupWithParticipantsResponseSchemaTransform = (group) => ({ ...GroupResponseSchemaTransform(group), participants: group.participants.map(ParticipantResponseSchemaTransform) }); // src/modules/groups/schemas/find-all.ts var FindAllGroupsResponseSchema = z7.array(GroupResponseSchema).transform( (groups) => groups.map((group) => GroupResponseSchemaTransform(group)) ); var FindAllGroupsWithParticipantsResponseSchema = z7.array(GroupWithParticipantsResponseSchema).transform( (groups) => groups.map((group) => GroupWithParticipantsResponseSchemaTransform(group)) ); // src/modules/groups/schemas/find-by-invite-code.ts import { z as z8 } from "zod"; var FindGroupByInviteCodeResponseSchema = GroupWithParticipantsResponseSchema.extend({ isCommunity: z8.boolean(), isCommunityAnnounce: z8.boolean(), joinApprovalMode: z8.boolean(), memberAddMode: z8.boolean() }).omit({ pictureUrl: true }).transform((group) => ({ ...GroupWithParticipantsResponseSchemaTransform({ ...group, pictureUrl: null }), isCommunity: group.isCommunity, isCommunityAnnounce: group.isCommunityAnnounce, joinApprovalMode: group.joinApprovalMode, memberAddMode: group.memberAddMode })); // src/modules/groups/schemas/find-by-jid.ts var FindGroupByJidResponseSchema = GroupWithParticipantsResponseSchema.transform( GroupWithParticipantsResponseSchemaTransform ); // src/modules/groups/index.ts var GroupsModule = class { constructor(api) { this.api = api; } async findAll(getParticipants = false) { const response = await this.api.get(Routes.Groups.FindAll, { params: { getParticipants: z9.boolean().parse(getParticipants) } }); if (getParticipants) { return FindAllGroupsWithParticipantsResponseSchema.parse(response); } return FindAllGroupsResponseSchema.parse(response); } /** * Gets a group by invite code * @param inviteCode - The group invite code (not the URL) */ async findByInviteCode(inviteCode) { const response = await this.api.get(Routes.Groups.FindByInviteCode, { params: { inviteCode: GroupInviteCodeSchema.parse(inviteCode) } }); return FindGroupByInviteCodeResponseSchema.parse(response); } /** * Gets a group by JID * @param groupJid - The group JID terminated with \@g.us */ async findByJid(groupJid) { const response = await this.api.get(Routes.Groups.FindByJid, { params: { groupJid: GroupJidSchema.parse(groupJid) } }); return FindGroupByJidResponseSchema.parse(response); } }; // src/modules/messages/schemas/audio.ts import { z as z11 } from "zod"; // src/modules/messages/schemas/base.ts import { z as z10 } from "zod"; var BaseMessageOptionsSchema = z10.object({ /** * Number (with country code) or JID to receive the message */ number: ApiNumberSchema, /** * Time in milliseconds before sending message */ delay: z10.number().optional() }); // src/modules/messages/schemas/audio.ts var AudioMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Audio URL or file in base64 */ audio: mediaSchema, /** * Audio mimetype */ mimetype: z11.string().optional() }); var AudioMessageBodySchema = AudioMessageOptionsSchema.transform( ({ audio, ...data }) => ({ ...data, media: audio, mediatype: "audio" }) ); var AudioMessageResponseSchema = z11.object({ key: z11.object({ remoteJid: z11.string(), id: z11.string() }), message: z11.object({ audioMessage: z11.object({ url: z11.string().url(), mimetype: z11.string().optional(), fileSha256: z11.string().base64(), fileLength: z11.coerce.number(), seconds: z11.number(), mediaKey: z11.string().base64(), fileEncSha256: z11.string().base64(), directPath: z11.string(), mediaKeyTimestamp: z11.coerce.number().transform((value) => new Date(value)) }) }), messageTimestamp: z11.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, media: { url: data.message.audioMessage.url, mimetype: data.message.audioMessage.mimetype, length: data.message.audioMessage.fileLength, durationInSeconds: data.message.audioMessage.seconds, sha256: data.message.audioMessage.fileSha256, encryptedSha256: data.message.audioMessage.fileEncSha256, directPath: data.message.audioMessage.directPath, key: data.message.audioMessage.mediaKey, keyTimestamp: data.message.audioMessage.mediaKeyTimestamp }, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/contact.ts import { parsePhoneNumber as parsePhoneNumber4 } from "libphonenumber-js"; import { z as z12 } from "zod"; var ContactMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Contact list */ contacts: z12.array( z12.object({ /** * Contact display name */ fullName: z12.string(), /** * Contact phone number */ phoneNumber: PhoneNumberSchema, /** * Contact organization */ organization: z12.string().optional(), /** * Contact email */ email: z12.string().email().optional(), /** * Contact website url */ url: z12.string().url().optional() }) ) }); var ContactMessageBodySchema = ContactMessageOptionsSchema.transform( ({ contacts, ...data }) => ({ ...data, contact: contacts.map((contact) => ({ ...contact, phoneNumber: parsePhoneNumber4(contact.phoneNumber).formatInternational(), wuid: contact.phoneNumber.replace(/\D/g, "") })) }) ); var ContactMessageResponseSchema = z12.object({ key: z12.object({ remoteJid: z12.string(), id: z12.string() }), message: z12.union([ z12.object({ contactMessage: z12.object({ displayName: z12.string(), vcard: z12.string() }) }), z12.object({ contactsArrayMessage: z12.object({ contacts: z12.array( z12.object({ displayName: z12.string(), vcard: z12.string() }) ) }) }) ]), messageTimestamp: z12.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, contacts: "contactMessage" in data.message ? [data.message.contactMessage] : data.message.contactsArrayMessage.contacts, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/document.ts import { z as z13 } from "zod"; var DocumentMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Document URL or file in base64 */ document: mediaSchema, /** * Caption to send with document */ caption: z13.string().optional(), /** * Document mimetype */ mimetype: z13.string().optional(), /** * Name of the file */ fileName: z13.string().optional() }).refine( (data) => URL.canParse(data.document) ? true : Boolean(data.fileName), { message: "fileName must be provided when document is not an URL", path: ["fileName"] } ); var DocumentMessageBodySchema = DocumentMessageOptionsSchema.transform( ({ document, ...data }) => ({ ...data, media: document, mediatype: "document" }) ); var DocumentMessageResponseSchema = z13.object({ key: z13.object({ remoteJid: z13.string(), id: z13.string() }), message: z13.object({ documentMessage: z13.object({ url: z13.string().url(), mimetype: z13.string().optional(), fileSha256: z13.string().base64(), fileLength: z13.coerce.number(), mediaKey: z13.string().base64(), caption: z13.string().optional(), fileName: z13.string(), fileEncSha256: z13.string().base64(), directPath: z13.string(), mediaKeyTimestamp: z13.coerce.number().transform((value) => new Date(value)) }) }), messageTimestamp: z13.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, media: { url: data.message.documentMessage.url, caption: data.message.documentMessage.caption, mimetype: data.message.documentMessage.mimetype, length: data.message.documentMessage.fileLength, sha256: data.message.documentMessage.fileSha256, fileName: data.message.documentMessage.fileName, encryptedSha256: data.message.documentMessage.fileEncSha256, directPath: data.message.documentMessage.directPath, key: data.message.documentMessage.mediaKey, keyTimestamp: data.message.documentMessage.mediaKeyTimestamp }, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/image.ts import { z as z14 } from "zod"; var ImageMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Image URL or file in base64 */ image: mediaSchema, /** * Caption to send with image */ caption: z14.string().optional(), /** * Image mimetype */ mimetype: z14.string().optional() }); var ImageMessageBodySchema = ImageMessageOptionsSchema.transform( ({ image, ...data }) => ({ ...data, media: image, mediatype: "image" }) ); var ImageMessageResponseSchema = z14.object({ key: z14.object({ remoteJid: z14.string(), id: z14.string() }), message: z14.object({ imageMessage: z14.object({ url: z14.string().url(), mimetype: z14.string().optional(), fileSha256: z14.string().base64(), fileLength: z14.coerce.number(), height: z14.number(), width: z14.number(), mediaKey: z14.string().base64(), caption: z14.string().optional(), fileEncSha256: z14.string().base64(), directPath: z14.string(), mediaKeyTimestamp: z14.coerce.number().transform((value) => new Date(value)) }) }), messageTimestamp: z14.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, media: { url: data.message.imageMessage.url, caption: data.message.imageMessage.caption, mimetype: data.message.imageMessage.mimetype, length: data.message.imageMessage.fileLength, height: data.message.imageMessage.height, width: data.message.imageMessage.width, sha256: data.message.imageMessage.fileSha256, encryptedSha256: data.message.imageMessage.fileEncSha256, directPath: data.message.imageMessage.directPath, key: data.message.imageMessage.mediaKey, keyTimestamp: data.message.imageMessage.mediaKeyTimestamp }, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/location.ts import { z as z15 } from "zod"; var LocationMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Location name */ name: z15.string(), /** * Location address */ address: z15.string(), /** * Location latitude */ latitude: z15.number(), /** * Location longitude */ longitude: z15.number() }); var LocationMessageBodySchema = LocationMessageOptionsSchema; var LocationMessageResponseSchema = z15.object({ key: z15.object({ remoteJid: z15.string(), id: z15.string() }), message: z15.object({ locationMessage: z15.object({ degreesLatitude: z15.number(), degreesLongitude: z15.number(), name: z15.string(), address: z15.string() }) }), messageTimestamp: z15.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, location: { latitude: data.message.locationMessage.degreesLatitude, longitude: data.message.locationMessage.degreesLongitude, name: data.message.locationMessage.name, address: data.message.locationMessage.address }, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/sticker.ts import { z as z16 } from "zod"; var StickerMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Image URL or file in base64 */ sticker: mediaSchema }); var StickerMessageBodySchema = StickerMessageOptionsSchema; var StickerMessageResponseSchema = z16.object({ key: z16.object({ remoteJid: z16.string(), id: z16.string() }), message: z16.object({ stickerMessage: z16.object({ url: z16.string().url(), fileSha256: z16.string().base64(), fileEncSha256: z16.string().base64(), mediaKey: z16.string().base64(), mimetype: z16.string().optional(), directPath: z16.string(), fileLength: z16.coerce.number(), mediaKeyTimestamp: z16.coerce.number().transform((value) => new Date(value)) }) }), messageTimestamp: z16.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, media: { url: data.message.stickerMessage.url, mimetype: data.message.stickerMessage.mimetype, length: data.message.stickerMessage.fileLength, sha256: data.message.stickerMessage.fileSha256, encryptedSha256: data.message.stickerMessage.fileEncSha256, directPath: data.message.stickerMessage.directPath, key: data.message.stickerMessage.mediaKey, keyTimestamp: data.message.stickerMessage.mediaKeyTimestamp }, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/text.ts import { z as z17 } from "zod"; var TextMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Message text content */ text: z17.string(), /** * Whether link preview should be shown */ linkPreview: z17.boolean().optional() }); var TextMessageBodySchema = TextMessageOptionsSchema; var TextMessageResponseSchema = z17.object({ key: z17.object({ remoteJid: z17.string(), id: z17.string() }), messageTimestamp: z17.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, messageId: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/video.ts import { z as z18 } from "zod"; var VideoMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Video URL or file in base64 */ video: mediaSchema, /** * Caption to send with video */ caption: z18.string().optional(), /** * Video mimetype */ mimetype: z18.string().optional() }); var VideoMessageBodySchema = VideoMessageOptionsSchema.transform( ({ video, ...data }) => ({ ...data, media: video, mediatype: "video" }) ); var VideoMessageResponseSchema = z18.object({ key: z18.object({ remoteJid: z18.string(), id: z18.string() }), message: z18.object({ videoMessage: z18.object({ url: z18.string().url(), mimetype: z18.string().optional(), fileSha256: z18.string().base64(), fileLength: z18.coerce.number(), mediaKey: z18.string().base64(), caption: z18.string().optional(), gifPlayback: z18.boolean(), fileEncSha256: z18.string().base64(), directPath: z18.string(), mediaKeyTimestamp: z18.coerce.number().transform((value) => new Date(value)) }) }), messageTimestamp: z18.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, media: { url: data.message.videoMessage.url, caption: data.message.videoMessage.caption, mimetype: data.message.videoMessage.mimetype, gifPlayback: data.message.videoMessage.gifPlayback, length: data.message.videoMessage.fileLength, sha256: data.message.videoMessage.fileSha256, encryptedSha256: data.message.videoMessage.fileEncSha256, directPath: data.message.videoMessage.directPath, key: data.message.videoMessage.mediaKey, keyTimestamp: data.message.videoMessage.mediaKeyTimestamp }, id: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/schemas/voice.ts import { z as z19 } from "zod"; var VoiceMessageOptionsSchema = BaseMessageOptionsSchema.extend({ /** * Audio URL or file in base64 */ audio: mediaSchema, /** * Encode audio into WhatsApp default format (allows audio to be sped up) * @default true */ encoding: z19.boolean().optional().default(true) }); var VoiceMessageBodySchema = VoiceMessageOptionsSchema; var VoiceMessageResponseSchema = z19.object({ key: z19.object({ remoteJid: z19.string(), id: z19.string() }), message: z19.object({ audioMessage: z19.object({ url: z19.string().url(), mimetype: z19.string(), fileSha256: z19.string().base64(), fileLength: z19.coerce.number(), seconds: z19.number(), ptt: z19.boolean().optional(), mediaKey: z19.string().base64(), fileEncSha256: z19.string().base64(), directPath: z19.string(), mediaKeyTimestamp: z19.coerce.number().transform((value) => new Date(value)), waveform: z19.string().base64().nullish() }) }), messageTimestamp: z19.coerce.date() }).transform((data) => ({ receiver: { phoneNumber: phoneNumberFromJid(data.key.remoteJid), jid: Jid(data.key.remoteJid) }, media: { url: data.message.audioMessage.url, mimetype: data.message.audioMessage.mimetype, length: data.message.audioMessage.fileLength, durationInSeconds: data.message.audioMessage.seconds, sha256: data.message.audioMessage.fileSha256, encryptedSha256: data.message.audioMessage.fileEncSha256, directPath: data.message.audioMessage.directPath, /** * Indicates whether the audio message is a push-to-talk (PTT) message */ isPtt: data.message.audioMessage.ptt, key: data.message.audioMessage.mediaKey, keyTimestamp: data.message.audioMessage.mediaKeyTimestamp, waveform: data.message.audioMessage.waveform }, messageId: MessageId(data.key.id), timestamp: data.messageTimestamp })); // src/modules/messages/index.ts var MessagesModule = class { constructor(api) { this.api = api; } /** * Sends a text message * @param options - Text message options */ async sendText(options) { const body = TextMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendText, { body }); return TextMessageResponseSchema.parse(response); } /** * Sends an image * @param options - Image message options */ async sendImage(options) { const body = ImageMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendMedia, { body }); return ImageMessageResponseSchema.parse(response); } /** * Sends a video * @param options - Video message options */ async sendVideo(options) { const body = VideoMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendMedia, { body }); return VideoMessageResponseSchema.parse(response); } /** * Sends a document * @param options - Document message options */ async sendDocument(options) { const body = DocumentMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendMedia, { body }); return DocumentMessageResponseSchema.parse(response); } /** * Sends an audio * @param options - Audio message options */ async sendAudio(options) { const body = AudioMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendMedia, { body }); return AudioMessageResponseSchema.parse(response); } /** * Sends a voice message * @param options - Voice message options */ async sendVoice(options) { const body = VoiceMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendVoice, { body }); return VoiceMessageResponseSchema.parse(response); } /** * Sends a sticker * @param options - Sticker message options */ async sendSticker(options) { const body = StickerMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendSticker, { body }); return StickerMessageResponseSchema.parse(response); } /** * Sends a location * @param options - Location message options */ async sendLocation(options) { const body = LocationMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendLocation, { body }); return LocationMessageResponseSchema.parse(response); } /** * Sends a contact * @param options - Contact message options */ async sendContact(options) { const body = ContactMessageBodySchema.parse(options); const response = await this.api.post(Routes.Message.SendContact, { body }); return ContactMessageResponseSchema.parse(response); } }; // src/schemas/client.ts import { z as z20 } from "zod"; var ClientOptionsSchema = z20.object({ /** * Your server URL */ serverUrl: z20.string().url(), /** * Your instance token or global API key */ token: z20.string(), /** * Your instance name */ instance: z20.string() }); // src/index.ts var EvolutionClient = class { /** * Evolution Client - API client for interacting with the Evolution API * @param options - Client options */ constructor(options) { this.options = options; /** * API service for directly interacting with the Evolution API (no specific typings) */ __publicField(this, "api"); /** * Find and manage chats, send presences and check numbers */ __publicField(this, "chats"); /** * Find and manage groups */ __publicField(this, "groups"); /** * Send messages */ __publicField(this, "messages"); ClientOptionsSchema.parse(options); this.api = new ApiService(options); this.chats = new ChatsModule(this.api); this.groups = new GroupsModule(this.api); this.messages = new MessagesModule(this.api); } }; export { ChatId, EvolutionApiError, EvolutionClient, GroupJid, Jid, MessageId, phoneNumberFromJid }; //# sourceMappingURL=index.mjs.map