Уведомления
deno desktop доступен начиная с Deno v2.9.0. Если у вас более ранняя версия, обновите Deno, чтобы использовать его.
deno desktop реализует стандартный API веб-уведомлений. Тот же конструктор Notification, который вы использовали бы в браузере, отображает системное уведомление ОС (уведомления macOS, всплывающие уведомления Windows или службу уведомлений рабочего стола Linux) из кода на стороне Deno.
const n = new Notification("Build complete", {
body: "Your binary is ready.",
});
n.addEventListener("click", () => win.focus()); // bring the app to front
Notification определён только в приложениях, скомпилированных с помощью deno desktop. В обычном скрипте deno run он отсутствует.
Разрешения
Для уведомлений требуется разрешение на уровне ОС, как и в вебе. Проверьте текущее состояние с помощью Notification.permission и запросите разрешение с помощью Notification.requestPermission():
if (Notification.permission !== "granted") {
const permission = await Notification.requestPermission();
if (permission !== "granted") {
// The user declined, don't try to notify.
return;
}
}
new Notification("All set", { body: "Notifications are enabled." });
Notification.permission — это синхронный кэшированный геттер, содержащий результат последнего запроса или проверки. requestPermission() при первом вызове, если пользователь ещё не принял решение, вызывает системный запрос и возвращает "granted", "denied" или "default".
Чтобы получить актуальное состояние ОС, включая информацию о том, есть ли у платформы модель разрешений, используйте API Permissions:
const status = await navigator.permissions.query({ name: "notifications" });
console.log(status.state); // "granted" | "denied" | "prompt"
На платформе или в серверной части, где отсутствует понятие разрешений (отдельный процесс macOS, некоторые службы уведомлений Linux), запрос возвращает "prompt", и уведомления отображаются без явного разрешения.
macOS предоставляет разрешение на уведомления только приложению со стабильной идентичностью кода. deno desktop выполняет временную подпись каждого создаваемого пакета (и повторно подписывает кэшированную среду выполнения в режиме --hmr), поэтому всё работает сразу. Инструкции по настройке настоящей идентичности подписи см. в разделе Распространение.
Параметры
Конструктор принимает стандартные NotificationOptions:
new Notification("New message", {
body: "Alice: are we still on for 3pm?",
icon: "data:image/png;base64,iVBORw0KGgo…",
tag: "chat-alice",
requireInteraction: true,
silent: false,
});
| Параметр | Тип | Примечания |
|---|---|---|
body | string | Текст уведомления. |
icon | string | URL значка. Отображаются только URL data: (см. ниже). |
tag | string | Заменяет существующее уведомление с тем же тегом, а не добавляет новое. |
requireInteraction | boolean | Оставляет уведомление видимым, пока пользователь его не закроет. |
silent | boolean | null | Отключает звук уведомления. |
badge | string | URL значка (зависит от платформы). |
dir | "auto" | "ltr" | "rtl" | Направление текста. |
lang | string | Тег языка BCP 47. |
data | any | Произвольные данные, прикреплённые к уведомлению; получить их можно через data. |
Значки
В спецификации Web Notifications тип icon — строка URL. Среда выполнения на настольном компьютере может синхронно обрабатывать только URL data:, поэтому отображается встроенный значок data:image/png;base64,…. Другие схемы URL (https:, file:) принимаются и сохраняются в свойстве icon, но системное уведомление отображается без значка. Чтобы использовать файл на диске, прочитайте его и закодируйте как URL data::
import { encodeBase64 } from "jsr:@std/encoding/base64";
const bytes = await Deno.readFile("./icons/alert.png");
const dataUrl = "data:image/png;base64," + encodeBase64(bytes);
new Notification("Heads up", { icon: dataUrl });
События
Notification — это EventTarget. Подписывайтесь на события с помощью addEventListener или свойств on<event>:
const n = new Notification("Download finished");
n.onshow = () => console.log("shown");
n.onclick = () => openDownloadsFolder();
n.onclose = () => console.log("dismissed");
n.onerror = () => console.warn("the OS rejected the notification");
| Событие | Когда возникает |
|---|---|
show | ОС отобразила уведомление. |
click | Пользователь нажал на текст уведомления. |
close | Пользователь закрыл уведомление или истёк срок его действия. |
error | ОС не смогла отобразить уведомление (например, из-за отказа в разрешении). |
Закрытие
Вызовите close(), чтобы программно закрыть уведомление:
const n = new Notification("Connecting…");
// later, once connected:
n.close();
В остальных случаях уведомления отправляются без ожидания результата. После отображения ими управляет ОС, а close() — это лишь запрос, который может не сработать.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/notifications