bbgun 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/Logger.ts","../lib/Loggable.ts","../lib/auto-create-chat.ts","../modules/attachment.ts","../modules/chat.ts","../modules/contact.ts","../modules/facetime.ts","../modules/handle.ts","../modules/icloud.ts","../modules/message.ts","../modules/scheduled.ts","../modules/server.ts","../client.ts","../events.ts"],"names":["EventEmitter","path","os","fs","readFile","randomUUID","FormData","axios","io"],"mappings":"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","file":"index.cjs","sourcesContent":["import EventEmitter from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport class Logger extends EventEmitter {\n tag: string;\n private logLevel: LogLevel = \"info\";\n private logFile?: string;\n\n constructor(tag: string, level: LogLevel = \"info\", logToFile = true) {\n super();\n this.tag = tag;\n this.logLevel = level;\n\n if (logToFile) {\n try {\n const logDir = path.join(os.homedir(), \"Library\", \"Logs\", \"BBGun\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n this.logFile = path.join(logDir, \"sdk.log\");\n } catch {\n // Silently disable file logging if directory creation fails\n }\n }\n }\n\n setLogLevel(level: LogLevel) {\n this.logLevel = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = [\"debug\", \"info\", \"warn\", \"error\"];\n const currentIndex = levels.indexOf(this.logLevel);\n const messageIndex = levels.indexOf(level);\n return messageIndex >= currentIndex;\n }\n\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `[${timestamp}][${level.toUpperCase()}][${this.tag}] ${message}`;\n }\n\n private writeLog(level: LogLevel, message: string) {\n if (!this.shouldLog(level)) return;\n\n const formatted = this.formatMessage(level, message);\n\n switch (level) {\n case \"error\":\n console.error(formatted);\n break;\n case \"warn\":\n console.warn(formatted);\n break;\n case \"debug\":\n console.debug(formatted);\n break;\n default:\n console.log(formatted);\n }\n\n if (this.logFile) {\n try {\n fs.appendFileSync(this.logFile, `${formatted}\\n`);\n } catch {}\n }\n\n this.emit(\"log\", { level, message, tag: this.tag });\n }\n\n info(message: string) {\n this.writeLog(\"info\", message);\n }\n\n debug(message: string) {\n this.writeLog(\"debug\", message);\n }\n\n error(message: string | Error) {\n const msg = message instanceof Error ? message.message : message;\n this.writeLog(\"error\", msg);\n if (message instanceof Error && message.stack) {\n this.writeLog(\"error\", message.stack);\n }\n }\n\n warn(message: string) {\n this.writeLog(\"warn\", message);\n }\n\n log(message: string, level: LogLevel = \"info\") {\n this.writeLog(level, message);\n }\n}\n","import { EventEmitter as EventEmitterClass } from \"node:events\";\nimport type { LogLevel } from \"./Logger\";\nimport { Logger } from \"./Logger\";\n\nconst loggers: Record<string, Logger> = {};\nlet globalLogLevel: LogLevel = \"info\";\nlet globalLogToFile = true;\n\nexport const setGlobalLogLevel = (level: LogLevel) => {\n globalLogLevel = level;\n Object.values(loggers).forEach((logger) => {\n logger.setLogLevel(level);\n });\n};\n\nexport const setGlobalLogToFile = (logToFile: boolean) => {\n globalLogToFile = logToFile;\n};\n\nexport const getLogger = (tag: string) => {\n let logger = loggers[tag];\n if (!logger) {\n logger = new Logger(tag, globalLogLevel, globalLogToFile);\n loggers[tag] = logger;\n }\n\n return logger;\n};\n\nexport class Loggable extends EventEmitterClass {\n tag?: string;\n\n get log() {\n const name = this.tag ?? this.constructor.name;\n return getLogger(name);\n }\n\n constructor(tag?: string) {\n super();\n\n if (tag) {\n this.tag = tag;\n }\n }\n\n onLog(listener: (data: { level: string; message: string; tag: string }) => void) {\n this.log.on(\"log\", listener);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport function isChatNotExistError(error: unknown): boolean {\n const axiosError = error as { response?: { data?: { error?: { message?: string }; message?: string } } };\n const errorMsg = axiosError?.response?.data?.error?.message || axiosError?.response?.data?.message || \"\";\n const lowerMsg = errorMsg.toLowerCase();\n return lowerMsg.includes(\"chat does not exist\") || lowerMsg.includes(\"chat not found\");\n}\n\nexport function extractAddress(chatGuid: string): string | undefined {\n const parts = chatGuid.split(\";-;\");\n if (parts.length !== 2 || !parts[1]) {\n return undefined;\n }\n return parts[1];\n}\n\nexport function extractService(chatGuid: string): \"iMessage\" | \"SMS\" | undefined {\n if (!chatGuid) return undefined;\n const prefix = chatGuid.split(\";\")[0]?.toLowerCase();\n if (prefix === \"imessage\") return \"iMessage\";\n if (prefix === \"sms\") return \"SMS\";\n return undefined;\n}\n\nexport async function createChatWithMessage(options: {\n http: AxiosInstance;\n address: string;\n message: string;\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n service?: \"iMessage\" | \"SMS\";\n}): Promise<string> {\n const { http, address, message, tempGuid, subject, effectId, service } = options;\n try {\n const response = await http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n message,\n tempGuid,\n subject,\n effectId,\n ...(service && { service }),\n });\n return response.data.data?.guid;\n } catch (error) {\n throw new Error(\n `Failed to create chat with address \"${address}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport { extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { AttachmentResponse, MessageResponse, SendAttachmentOptions, SendStickerOptions } from \"../types\";\n\nexport class AttachmentModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async getAttachmentCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/attachment/count\");\n return response.data.data.total;\n }\n\n async getAttachment(guid: string): Promise<AttachmentResponse> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async downloadAttachment(\n guid: string,\n options?: {\n original?: boolean;\n force?: boolean;\n height?: number;\n width?: number;\n quality?: number;\n },\n ): Promise<Buffer> {\n const params: Record<string, unknown> = {};\n if (options?.original !== undefined) params.original = options.original;\n if (options?.force !== undefined) params.force = options.force;\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/download`, {\n params,\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async downloadAttachmentLive(guid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/live`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getAttachmentBlurhash(\n guid: string,\n options?: { height?: number; width?: number; quality?: number },\n ): Promise<string> {\n const params: Record<string, unknown> = {};\n if (options?.height !== undefined) params.height = options.height;\n if (options?.width !== undefined) params.width = options.width;\n if (options?.quality !== undefined) params.quality = options.quality;\n\n const response = await this.http.get(`/api/v1/attachment/${encodeURIComponent(guid)}/blurhash`, {\n params,\n });\n // BlueBubbles returns the blurhash string directly as data\n const data = response.data.data;\n return typeof data === \"string\" ? data : data.blurhash;\n }\n\n private async ensureChatExists(chatGuid: string): Promise<void> {\n const address = extractAddress(chatGuid);\n if (!address) return;\n\n const service = extractService(chatGuid);\n await this.http.post(\"/api/v1/chat/new\", {\n addresses: [address],\n ...(service && { service }),\n });\n }\n\n async sendAttachment(options: SendAttachmentOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileBuffer = await readFile(options.filePath);\n const fileName = options.fileName || path.basename(options.filePath);\n const tempGuid = randomUUID();\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"tempGuid\", tempGuid);\n if (options.isAudioMessage !== undefined) {\n form.append(\"isAudioMessage\", options.isAudioMessage.toString());\n if (options.isAudioMessage) {\n form.append(\"method\", \"private-api\");\n }\n }\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const response = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return response.data.data;\n }\n });\n }\n\n async sendSticker(options: SendStickerOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const fileName = options.fileName || path.basename(options.filePath);\n const fileBuffer = await readFile(options.filePath);\n\n const buildForm = () => {\n const form = new FormData();\n form.append(\"attachment\", fileBuffer, fileName);\n form.append(\"name\", fileName);\n form.append(\"chatGuid\", options.chatGuid);\n form.append(\"isSticker\", \"true\");\n form.append(\"method\", \"private-api\");\n if (options.selectedMessageGuid) {\n form.append(\"selectedMessageGuid\", options.selectedMessageGuid);\n form.append(\"partIndex\", \"0\");\n form.append(\"stickerX\", String(options.stickerX ?? 0.5));\n form.append(\"stickerY\", String(options.stickerY ?? 0.5));\n form.append(\"stickerScale\", String(options.stickerScale ?? 0.75));\n form.append(\"stickerRotation\", String(options.stickerRotation ?? 0));\n form.append(\"stickerWidth\", String(options.stickerWidth ?? 300));\n }\n return form;\n };\n\n try {\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n await this.ensureChatExists(options.chatGuid);\n\n const form = buildForm();\n const { data } = await this.http.post(\"/api/v1/message/attachment\", form, {\n headers: form.getHeaders(),\n });\n return data.data;\n }\n });\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AxiosInstance } from \"axios\";\nimport FormData from \"form-data\";\nimport type { ChatResponse, MessageResponse } from \"../types\";\n\nexport class ChatModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getChats(options?: {\n withLastMessage?: boolean;\n withArchived?: boolean;\n offset?: number;\n limit?: number;\n sort?: string;\n }): Promise<ChatResponse[]> {\n const payload: Record<string, unknown> = {};\n if (options?.offset !== undefined) payload.offset = options.offset;\n if (options?.limit !== undefined) payload.limit = options.limit;\n if (options?.sort) payload.sort = options.sort;\n if (options?.withLastMessage) {\n payload.with = [\"lastmessage\"];\n }\n const response = await this.http.post(\"/api/v1/chat/query\", payload);\n return response.data.data;\n }\n\n async createChat(options: {\n addresses: string[];\n message?: string;\n method?: \"apple-script\" | \"private-api\";\n service?: \"iMessage\" | \"SMS\";\n tempGuid?: string;\n subject?: string;\n effectId?: string;\n attributedBody?: Record<string, unknown>;\n }): Promise<ChatResponse> {\n const response = await this.http.post(\"/api/v1/chat/new\", options);\n return response.data.data;\n }\n\n async getChat(guid: string, options?: { with?: string[] }): Promise<ChatResponse> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async updateChat(guid: string, options: { displayName?: string }): Promise<ChatResponse> {\n const response = await this.http.put(`/api/v1/chat/${encodeURIComponent(guid)}`, options);\n return response.data.data;\n }\n\n async deleteChat(guid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(guid)}`);\n }\n\n async markChatRead(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/read`);\n }\n\n async markChatUnread(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/unread`);\n }\n\n async leaveChat(guid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(guid)}/leave`);\n }\n\n async addParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant`, {\n address,\n });\n return response.data.data;\n }\n\n async removeParticipant(chatGuid: string, address: string): Promise<ChatResponse> {\n const response = await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/participant/remove`, {\n address,\n });\n return response.data.data;\n }\n\n async getChatMessages(\n chatGuid: string,\n options?: {\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n },\n ): Promise<MessageResponse[]> {\n const params: Record<string, unknown> = {};\n if (options?.offset !== undefined) params.offset = options.offset;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.sort) params.sort = options.sort;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.after !== undefined) params.after = options.after;\n if (options?.with) params.with = options.with.join(\",\");\n\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/message`, {\n params,\n });\n return response.data.data;\n }\n\n async setGroupIcon(chatGuid: string, filePath: string): Promise<void> {\n const fileBuffer = await readFile(filePath);\n const fileName = path.basename(filePath);\n const form = new FormData();\n form.append(\"icon\", fileBuffer, fileName);\n\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, form, {\n headers: form.getHeaders(),\n });\n }\n\n async removeGroupIcon(chatGuid: string): Promise<void> {\n await this.http.delete(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`);\n }\n\n async getGroupIcon(chatGuid: string): Promise<Buffer> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/icon`, {\n responseType: \"arraybuffer\",\n });\n return Buffer.from(response.data);\n }\n\n async getChatCount(options?: { includeArchived?: boolean }): Promise<{\n total: number;\n breakdown: Record<string, number>;\n }> {\n const response = await this.http.get(\"/api/v1/chat/count\", {\n params: options?.includeArchived !== undefined ? { includeArchived: options.includeArchived } : {},\n });\n return response.data.data;\n }\n\n async startTyping(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/typing`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ContactModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getContacts(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/contact\");\n return response.data.data;\n }\n\n async getContactCard(address: string): Promise<any> {\n const response = await this.http.post(\"/api/v1/contact/query\", {\n addresses: [address],\n });\n const contacts = response.data.data;\n return contacts?.[0] ?? null;\n }\n\n async shareContactCard(chatGuid: string): Promise<void> {\n await this.http.post(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact`);\n }\n\n async shouldShareContact(chatGuid: string): Promise<boolean> {\n const response = await this.http.get(`/api/v1/chat/${encodeURIComponent(chatGuid)}/share/contact/status`);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class FaceTimeModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createFaceTimeLink(): Promise<string> {\n const response = await this.http.post(\"/api/v1/facetime/session\");\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class HandleModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getHandleCount(): Promise<number> {\n const response = await this.http.get(\"/api/v1/handle/count\");\n return response.data.data.total;\n }\n\n async queryHandles(options?: { address?: string; with?: string[]; offset?: number; limit?: number }): Promise<{\n data: any[];\n metadata: { total: number; offset: number; limit: number; count: number };\n }> {\n const body: Record<string, any> = { offset: 0 };\n if (options?.address) body.address = options.address;\n if (options?.with) body.with = options.with.join(\",\");\n if (options?.offset !== undefined) body.offset = options.offset;\n if (options?.limit !== undefined) body.limit = options.limit;\n\n const response = await this.http.post(\"/api/v1/handle/query\", body);\n return {\n data: response.data.data,\n metadata: response.data.metadata,\n };\n }\n\n async getHandle(guid: string): Promise<any> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}`);\n return response.data.data;\n }\n\n async getHandleAvailability(address: string, type: \"imessage\" | \"facetime\"): Promise<boolean> {\n const response = await this.http.get(`/api/v1/handle/availability/${type}`, {\n params: { address },\n });\n return response.data.data.available;\n }\n\n async getHandleFocusStatus(guid: string): Promise<string> {\n const response = await this.http.get(`/api/v1/handle/${encodeURIComponent(guid)}/focus`);\n return response.data.data.status;\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { FindMyLocationItem } from \"../types/findmy\";\n\nexport class ICloudModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getFindMyFriends(): Promise<FindMyLocationItem[]> {\n const response = await this.http.get(\"/api/v1/icloud/findmy/friends\");\n return response.data.data;\n }\n\n async refreshFindMyFriends(): Promise<FindMyLocationItem[]> {\n const response = await this.http.post(\"/api/v1/icloud/findmy/friends/refresh\");\n return response.data.data;\n }\n\n async getLocationForHandle(handle: string): Promise<FindMyLocationItem | null> {\n const friends = await this.getFindMyFriends();\n return friends.find((f) => f.handle === handle) ?? null;\n }\n\n async isHandleSharingLocation(handle: string): Promise<boolean> {\n const location = await this.getLocationForHandle(handle);\n return location !== null;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AxiosInstance } from \"axios\";\nimport { createChatWithMessage, extractAddress, extractService, isChatNotExistError } from \"../lib/auto-create-chat\";\nimport type { MessageResponse, SendMessageOptions } from \"../types\";\n\n// BlueBubbles' /message/text endpoint waits up to 2 minutes for delivery\n// confirmation by polling the iMessage database. The matching logic can fail\n// silently (text normalization, timestamp drift, chat GUID mismatches), causing\n// the HTTP response to never arrive even though the message was delivered.\n// We cap the wait and return a synthetic response on timeout.\nconst SEND_TIMEOUT_MS = 5000;\n\nasync function withSendTimeout<T>(promise: Promise<T>, fallback: () => T): Promise<T> {\n // Swallow late rejections — if the timeout wins and the HTTP request\n // eventually errors (e.g. BB's 2-minute timeout expires), the rejection\n // would otherwise be unhandled.\n const safe = promise.catch(() => fallback());\n\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<T>((resolve) => {\n timer = setTimeout(() => resolve(fallback()), SEND_TIMEOUT_MS);\n });\n try {\n // Race the raw promise (not safe) so fast errors still throw\n return await Promise.race([promise, timeout]);\n } finally {\n clearTimeout(timer!);\n // Keep the safe chain alive so late rejections don't crash the process\n void safe;\n }\n}\n\nexport class MessageModule {\n constructor(\n private readonly http: AxiosInstance,\n private readonly enqueueSend: <T>(task: () => Promise<T>) => Promise<T> = (task) => task(),\n ) {}\n\n async sendMessage(options: SendMessageOptions): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const tempGuid = options.tempGuid || randomUUID();\n const payload = {\n ...options,\n tempGuid,\n ...(options.selectedMessageGuid && { method: \"private-api\" }),\n };\n\n const doSend = async () => {\n const response = await this.http.post(\"/api/v1/message/text\", payload);\n return response.data.data as MessageResponse;\n };\n\n const fallback = () =>\n ({ guid: tempGuid, tempGuid, text: options.message, dateCreated: Date.now() }) as MessageResponse;\n\n try {\n return await withSendTimeout(doSend(), fallback);\n } catch (error: unknown) {\n if (!isChatNotExistError(error)) throw error;\n\n const address = extractAddress(options.chatGuid);\n if (!address) throw error;\n\n const service = extractService(options.chatGuid);\n\n await createChatWithMessage({\n http: this.http,\n address,\n message: options.message,\n tempGuid,\n subject: options.subject,\n effectId: options.effectId,\n service,\n });\n return fallback();\n }\n });\n }\n\n async getMessage(guid: string, options?: { with?: string[] }): Promise<MessageResponse> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}`, {\n params: options?.with ? { with: options.with.join(\",\") } : {},\n });\n return response.data.data;\n }\n\n async getMessages(options?: {\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n with?: string[];\n }): Promise<MessageResponse[]> {\n const response = await this.http.post(\"/api/v1/message/query\", options ?? {});\n return response.data.data;\n }\n\n async getMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count\", { params });\n return response.data.data.total;\n }\n\n async getUpdatedMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n params.after = options?.after ?? 0;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/updated\", {\n params,\n });\n return response.data.data.total;\n }\n\n async getSentMessageCount(options?: {\n after?: number;\n before?: number;\n chatGuid?: string;\n minRowId?: number;\n maxRowId?: number;\n }): Promise<number> {\n const params: Record<string, unknown> = {};\n if (options?.after !== undefined) params.after = options.after;\n if (options?.before !== undefined) params.before = options.before;\n if (options?.chatGuid) params.chatGuid = options.chatGuid;\n if (options?.minRowId !== undefined) params.minRowId = options.minRowId;\n if (options?.maxRowId !== undefined) params.maxRowId = options.maxRowId;\n\n const response = await this.http.get(\"/api/v1/message/count/me\", {\n params,\n });\n return response.data.data.total;\n }\n\n async editMessage(options: {\n messageGuid: string;\n editedMessage: string;\n backwardsCompatibilityMessage?: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const doEdit = async () => {\n const response = await this.http.post(\n `/api/v1/message/${encodeURIComponent(options.messageGuid)}/edit`,\n {\n editedMessage: options.editedMessage,\n backwardsCompatibilityMessage: options.backwardsCompatibilityMessage || options.editedMessage,\n partIndex: options.partIndex ?? 0,\n },\n );\n return response.data.data as MessageResponse;\n };\n\n return withSendTimeout(\n doEdit(),\n () =>\n ({\n guid: options.messageGuid,\n text: options.editedMessage,\n dateEdited: Date.now(),\n }) as MessageResponse,\n );\n });\n }\n\n async sendReaction(options: {\n chatGuid: string;\n messageGuid: string;\n reaction: string;\n partIndex?: number;\n }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const doReact = async () => {\n const response = await this.http.post(\"/api/v1/message/react\", {\n chatGuid: options.chatGuid,\n selectedMessageGuid: options.messageGuid,\n reaction: options.reaction,\n partIndex: options.partIndex ?? 0,\n });\n return response.data.data as MessageResponse;\n };\n\n return withSendTimeout(\n doReact(),\n () =>\n ({\n guid: randomUUID(),\n associatedMessageGuid: options.messageGuid,\n dateCreated: Date.now(),\n }) as MessageResponse,\n );\n });\n }\n\n async unsendMessage(options: { messageGuid: string; partIndex?: number }): Promise<MessageResponse> {\n return this.enqueueSend(async () => {\n const doUnsend = async () => {\n const response = await this.http.post(\n `/api/v1/message/${encodeURIComponent(options.messageGuid)}/unsend`,\n { partIndex: options.partIndex ?? 0 },\n );\n return response.data.data as MessageResponse;\n };\n\n return withSendTimeout(\n doUnsend(),\n () =>\n ({\n guid: options.messageGuid,\n dateRetracted: Date.now(),\n }) as MessageResponse,\n );\n });\n }\n\n async notifyMessage(guid: string): Promise<void> {\n await this.http.post(`/api/v1/message/${encodeURIComponent(guid)}/notify`);\n }\n\n async getEmbeddedMedia(guid: string): Promise<{\n path?: string;\n data?: string;\n }> {\n const response = await this.http.get(`/api/v1/message/${encodeURIComponent(guid)}/embedded-media`);\n return response.data.data;\n }\n\n async searchMessages(options: {\n query: string;\n chatGuid?: string;\n offset?: number;\n limit?: number;\n sort?: \"ASC\" | \"DESC\";\n before?: number;\n after?: number;\n }): Promise<MessageResponse[]> {\n const { query, chatGuid, offset, limit, sort, before, after } = options;\n\n if (!query || query.trim().length === 0) {\n throw new Error(\"Search query cannot be empty\");\n }\n\n const where = [\n {\n statement: \"message.text LIKE :text\",\n args: { text: `%${query}%` },\n },\n ];\n\n const payload: Record<string, unknown> = {\n where,\n };\n\n if (chatGuid) payload.chatGuid = chatGuid;\n if (offset !== undefined) payload.offset = offset;\n if (limit !== undefined) payload.limit = limit;\n if (sort) payload.sort = sort;\n if (before !== undefined) payload.before = before;\n if (after !== undefined) payload.after = after;\n\n const response = await this.http.post(\"/api/v1/message/query\", payload);\n return response.data.data;\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ScheduledMessageModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async createScheduledMessage(options: any): Promise<any> {\n const response = await this.http.post(\"/api/v1/message/schedule\", options);\n return response.data.data;\n }\n\n async getScheduledMessages(): Promise<any[]> {\n const response = await this.http.get(\"/api/v1/message/schedule\");\n return response.data.data;\n }\n\n async updateScheduledMessage(id: string, options: any): Promise<any> {\n const response = await this.http.put(`/api/v1/message/schedule/${encodeURIComponent(id)}`, options);\n return response.data.data;\n }\n\n async deleteScheduledMessage(id: string): Promise<void> {\n await this.http.delete(`/api/v1/message/schedule/${encodeURIComponent(id)}`);\n }\n}\n","import type { AxiosInstance } from \"axios\";\n\nexport class ServerModule {\n constructor(private readonly http: AxiosInstance) {}\n\n async getServerInfo(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/info\");\n return response.data.data;\n }\n\n async getMessageStats(): Promise<any> {\n const response = await this.http.get(\"/api/v1/server/statistics/totals\");\n return response.data.data;\n }\n\n async getServerLogs(count?: number): Promise<string[]> {\n const response = await this.http.get(\"/api/v1/server/logs\", {\n params: count !== undefined ? { count } : {},\n });\n return response.data.data;\n }\n\n async getMediaStatistics(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media\", {\n params,\n });\n return response.data.data;\n }\n\n async getMediaStatisticsByChat(options?: { only?: string[] }): Promise<any> {\n const params: Record<string, any> = {};\n if (options?.only) params.only = options.only.join(\",\");\n\n const response = await this.http.get(\"/api/v1/server/statistics/media/chat\", {\n params,\n });\n return response.data.data;\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport axios, { type AxiosInstance } from \"axios\";\nimport io from \"socket.io-client\";\nimport { getLogger, setGlobalLogLevel, setGlobalLogToFile } from \"./lib/Loggable\";\nimport type { LogLevel } from \"./lib/Logger\";\nimport {\n AttachmentModule,\n ChatModule,\n ContactModule,\n FaceTimeModule,\n HandleModule,\n ICloudModule,\n MessageModule,\n ScheduledMessageModule,\n ServerModule,\n} from \"./modules\";\nimport type { ClientConfig, PhotonEventMap, TypedEventEmitter } from \"./types\";\n\nexport class BBGun extends EventEmitter implements TypedEventEmitter {\n private static getGlobalSdk = (): BBGun | null => (globalThis as any).__BBGun__ ?? null;\n private static setGlobalSdk = (sdk: BBGun) => {\n (globalThis as any).__BBGun__ = sdk;\n };\n\n public static getInstance(config?: ClientConfig): BBGun {\n const existing = BBGun.getGlobalSdk();\n if (existing) return existing;\n\n const instance = new BBGun(config);\n BBGun.setGlobalSdk(instance);\n return instance;\n }\n\n public readonly config: ClientConfig;\n public readonly logger = getLogger(\"BBGun\");\n public readonly http: AxiosInstance;\n public readonly socket: ReturnType<typeof io>;\n\n public readonly attachments: AttachmentModule;\n public readonly messages: MessageModule;\n public readonly chats: ChatModule;\n\n public readonly contacts: ContactModule;\n public readonly handles: HandleModule;\n\n public readonly facetime: FaceTimeModule;\n public readonly icloud: ICloudModule;\n\n public readonly scheduledMessages: ScheduledMessageModule;\n public readonly server: ServerModule;\n\n private processedMessages = new Set<string>();\n private lastMessageTime = 0;\n private sendQueue: Promise<unknown> = Promise.resolve();\n private readyEmitted = false;\n private listenersAttached = false;\n\n constructor(config: ClientConfig = {}) {\n super();\n\n this.config = {\n serverUrl: \"http://localhost:1234\",\n logLevel: \"info\",\n logToFile: true,\n ...config,\n };\n\n if (this.config.logToFile === false) {\n setGlobalLogToFile(false);\n }\n\n if (this.config.logLevel) {\n setGlobalLogLevel(this.config.logLevel as LogLevel);\n }\n\n // BlueBubbles authenticates REST requests via a `password` query parameter\n this.http = axios.create({\n baseURL: this.config.serverUrl,\n params: this.config.apiKey ? { password: this.config.apiKey } : undefined,\n });\n\n // BlueBubbles authenticates sockets via query params, not the auth object\n this.socket = io(this.config.serverUrl, {\n query: this.config.apiKey ? { password: this.config.apiKey } : undefined,\n transports: [\"websocket\"],\n timeout: 10000,\n forceNew: true,\n reconnection: true,\n reconnectionAttempts: Number.POSITIVE_INFINITY,\n reconnectionDelay: 100,\n reconnectionDelayMax: 2000,\n randomizationFactor: 0.1,\n });\n\n const enqueueSend = this.enqueueSend.bind(this);\n\n this.attachments = new AttachmentModule(this.http, enqueueSend);\n this.messages = new MessageModule(this.http, enqueueSend);\n this.chats = new ChatModule(this.http);\n\n this.contacts = new ContactModule(this.http);\n this.handles = new HandleModule(this.http);\n\n this.facetime = new FaceTimeModule(this.http);\n this.icloud = new ICloudModule(this.http);\n\n this.scheduledMessages = new ScheduledMessageModule(this.http);\n this.server = new ServerModule(this.http);\n }\n\n override emit<K extends keyof PhotonEventMap>(\n event: K,\n ...args: PhotonEventMap[K] extends undefined ? [] : [PhotonEventMap[K]]\n ): boolean;\n override emit(event: string | symbol, ...args: unknown[]): boolean {\n return super.emit(event, ...(args as [unknown, ...unknown[]]));\n }\n\n override on<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override on(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.on(event, listener as (...args: unknown[]) => void);\n }\n\n override once<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override once(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.once(event, listener as (...args: unknown[]) => void);\n }\n\n override off<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override off(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.off(event, listener as (...args: unknown[]) => void);\n }\n\n override addListener<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override addListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.addListener(event, listener as (...args: unknown[]) => void);\n }\n\n override removeListener<K extends keyof PhotonEventMap>(\n event: K,\n listener: PhotonEventMap[K] extends undefined ? () => void : (data: PhotonEventMap[K]) => void,\n ): this;\n override removeListener(event: string | symbol, listener: (...args: unknown[]) => void): this {\n return super.removeListener(event, listener as (...args: unknown[]) => void);\n }\n\n async connect() {\n if (!this.listenersAttached) {\n this.listenersAttached = true;\n this.attachSocketListeners();\n }\n\n if (this.socket.connected) {\n this.logger.info(\"Already connected to BlueBubbles server\");\n return;\n }\n\n this.socket.connect();\n }\n\n private attachSocketListeners() {\n const serverEvents: (keyof PhotonEventMap)[] = [\n \"new-message\",\n \"message-updated\",\n \"updated-message\",\n \"chat-read-status-changed\",\n \"group-name-change\",\n \"participant-added\",\n \"participant-removed\",\n \"participant-left\",\n \"group-icon-changed\",\n \"group-icon-removed\",\n \"message-send-error\",\n \"typing-indicator\",\n \"new-server\",\n \"incoming-facetime\",\n \"ft-call-status-changed\",\n \"hello-world\",\n ];\n\n for (const eventName of serverEvents) {\n this.socket.on(eventName, (...args: unknown[]) => {\n if (eventName === \"new-message\" && args.length > 0) {\n const message = args[0] as { guid?: string; dateCreated?: number };\n if (message?.guid) {\n if (this.processedMessages.has(message.guid)) {\n this.logger.debug(`Message already processed, skipping duplicate: ${message.guid}`);\n return;\n }\n this.processedMessages.add(message.guid);\n if (message.dateCreated && message.dateCreated > this.lastMessageTime) {\n this.lastMessageTime = message.dateCreated;\n }\n }\n }\n\n if (args.length > 0) {\n super.emit(eventName, args[0]);\n } else {\n super.emit(eventName);\n }\n });\n }\n\n this.socket.on(\"disconnect\", (reason) => {\n this.logger.info(`Disconnected from BlueBubbles server (reason: ${reason})`);\n this.readyEmitted = false;\n this.emit(\"disconnect\");\n\n if (reason === \"io server disconnect\") {\n this.logger.info(\"Server disconnected, manually triggering reconnect...\");\n this.socket.connect();\n }\n });\n\n this.socket.io.on(\"reconnect_attempt\", (attempt) => {\n this.logger.info(`Reconnection attempt #${attempt}...`);\n });\n\n this.socket.io.on(\"reconnect\", (attempt) => {\n this.logger.info(`Reconnected successfully after ${attempt} attempt(s)`);\n });\n\n this.socket.io.on(\"reconnect_error\", (error) => {\n this.logger.warn(`Reconnection error: ${error.message}`);\n });\n\n this.socket.io.on(\"reconnect_failed\", () => {\n this.logger.error(\"All reconnection attempts failed\");\n });\n\n // BlueBubbles authenticates on connect via query params.\n // If auth fails, the server disconnects immediately — there are no\n // auth-ok/auth-error events. A successful connect means we're authenticated.\n this.socket.on(\"connect\", async () => {\n this.logger.info(\"Connected to BlueBubbles server\");\n if (!this.readyEmitted) {\n this.readyEmitted = true;\n await this.recoverMissedMessages();\n this.emit(\"ready\");\n }\n });\n\n this.socket.on(\"connect_error\", (error) => {\n this.logger.warn(`Connection error: ${error.message}`);\n });\n }\n\n async close() {\n this.socket.disconnect();\n }\n\n private async recoverMissedMessages() {\n if (this.lastMessageTime <= 0) return;\n\n try {\n const after = this.lastMessageTime;\n const messages = await this.messages.getMessages({\n after,\n sort: \"ASC\",\n limit: 100,\n });\n\n if (messages.length === 0) {\n this.logger.debug(\"No missed messages to recover\");\n return;\n }\n\n this.logger.info(`Recovering ${messages.length} missed message(s)`);\n for (const msg of messages) {\n if (msg.guid && !this.processedMessages.has(msg.guid)) {\n this.processedMessages.add(msg.guid);\n if (msg.dateCreated && msg.dateCreated > this.lastMessageTime) {\n this.lastMessageTime = msg.dateCreated;\n }\n super.emit(\"new-message\", msg);\n }\n }\n } catch (e) {\n this.logger.warn(`Failed to recover missed messages: ${e}`);\n }\n }\n\n public clearProcessedMessages(maxSize: number = 1000) {\n if (this.processedMessages.size > maxSize) {\n const messages = Array.from(this.processedMessages);\n this.processedMessages.clear();\n messages.slice(-Math.floor(maxSize / 2)).forEach((guid) => {\n this.processedMessages.add(guid);\n });\n this.logger.debug(`Cleared processed message records, retained ${this.processedMessages.size} messages`);\n }\n }\n\n public getProcessedMessageCount(): number {\n return this.processedMessages.size;\n }\n\n public enqueueSend<T>(task: () => Promise<T>): Promise<T> {\n const result = this.sendQueue.then(() => task());\n this.sendQueue = result.catch(() => {});\n return result;\n }\n}\n\nexport const SDK = BBGun.getInstance;\n","export const SCHEDULED_MESSAGE_ERROR = \"scheduled-message-error\";\nexport const SCHEDULED_MESSAGE_SENT = \"scheduled-message-sent\";\nexport const SCHEDULED_MESSAGE_DELETED = \"scheduled-message-deleted\";\nexport const SCHEDULED_MESSAGE_UPDATED = \"scheduled-message-updated\";\nexport const SCHEDULED_MESSAGE_CREATED = \"scheduled-message-created\";\nexport const NEW_MESSAGE = \"new-message\";\nexport const MESSAGE_SEND_ERROR = \"message-send-error\";\nexport const MESSAGE_UPDATED = \"updated-message\";\nexport const NEW_SERVER = \"new-server\";\nexport const PARTICIPANT_REMOVED = \"participant-removed\";\nexport const PARTICIPANT_ADDED = \"participant-added\";\nexport const PARTICIPANT_LEFT = \"participant-left\";\nexport const GROUP_ICON_CHANGED = \"group-icon-changed\";\nexport const GROUP_ICON_REMOVED = \"group-icon-removed\";\nexport const CHAT_READ_STATUS_CHANGED = \"chat-read-status-changed\";\nexport const HELLO_WORLD = \"hello-world\";\nexport const TYPING_INDICATOR = \"typing-indicator\";\nexport const SERVER_UPDATE = \"server-update\";\nexport const SERVER_UPDATE_DOWNLOADING = \"server-update-downloading\";\nexport const SERVER_UPDATE_INSTALLING = \"server-update-installing\";\nexport const GROUP_NAME_CHANGE = \"group-name-change\";\nexport const INCOMING_FACETIME = \"incoming-facetime\";\nexport const SETTINGS_BACKUP_CREATED = \"settings-backup-created\";\nexport const SETTINGS_BACKUP_DELETED = \"settings-backup-deleted\";\nexport const SETTINGS_BACKUP_UPDATED = \"settings-backup-updated\";\nexport const THEME_BACKUP_CREATED = \"theme-backup-created\";\nexport const THEME_BACKUP_DELETED = \"theme-backup-deleted\";\nexport const THEME_BACKUP_UPDATED = \"theme-backup-updated\";\nexport const IMESSAGE_ALIASES_REMOVED = \"imessage-aliases-removed\";\nexport const FT_CALL_STATUS_CHANGED = \"ft-call-status-changed\";\nexport const NEW_FINDMY_LOCATION = \"new-findmy-location\";\n"]}