Added
- Native WhatsApp polls via
POST /api/sessions/:sessionId/messages/send-poll: question, 2–12 options and an optionalallowMultipleAnswersflag (default single choice), implemented on both engines (whatsapp-web.jsPoll, Baileyspollcontent withselectableCount1/0). The message history stores the poll question as the body so the log stays readable. Polls are a first-classpollmessage type end to end — both engines map incoming poll messages to it, so the websocket/webhook events, persisted rows, and dashboard all reportpollconsistently. Thanks @alejo117.
Changed
- Corrected the Italian login-footer wording. Thanks @albanobattistella.
Fixed
GET /api/sessions/:sessionId/channels/:channelId/messagesalways returned an empty array on the whatsapp-web.js engine (#625). The adapter calledclient.getChannelById(), which does not exist in whatsapp-web.js 1.34.x, so every call threw and the error was swallowed into[]. Channel messages are now read from the subscribedChannelinstance (viagetChannels()), and an unknown/unsubscribed channel returns a404(ChannelNotFoundError) instead of a silent empty200— matchingGET /channels/:channelId. Thanks @Header9968.- A session whose
engine.initialize()fails no longer orphans its browser process. The crash-recovery path inSessionService.start()was tearing down the half-built engine with a gracefuldestroy(), but a failedinitialize()usually means the underlying browser/CDP connection is already broken (e.g. aTargetCloseError: Target closedmid-injection) —destroy()has nothing live to talk to, so it could only time out after 10s viateardownEngineSafely's race, leaving the Chromium process alive and orphaned. Every such crash left one more orphaned process behind, eventually starving the host of memory. It now usesforceDestroy()(the same SIGKILL-the-process recoveryPOST /:id/force-killuses), since a failed initialize is the same "possibly-unreachable engine" state that exists for. - Authenticated HTTP/HTTPS proxies now work on the whatsapp-web.js engine (#628). Credentials were passed inside
--proxy-server, which Chromium ignores, so a proxy with a username/password never authenticated (only IP-authorized proxies worked). The username/password are now handed to whatsapp-web.js'sproxyAuthentication(which drives Chromium'spage.authenticate) while--proxy-servergets a credential-less URL. SOCKS proxies still cannot be authenticated — Chromium does not support SOCKS proxy authentication at all — so a SOCKS proxy carrying credentials now logs a clear warning instead of failing with an opaque navigation timeout. Thanks @gudge25.