From dd999f62d91ebc1bb0db8b9825d55dcab41e76b0 Mon Sep 17 00:00:00 2001 From: postscriptum Date: Fri, 13 Feb 2026 21:19:43 +0200 Subject: [PATCH] add http notes --- ...y-radicle-na-prykladi-overleynykh-merez.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/post/rozhortannia-veb-infrastruktury-radicle-na-prykladi-overleynykh-merez.md b/post/rozhortannia-veb-infrastruktury-radicle-na-prykladi-overleynykh-merez.md index f3d015f..0a2ddd1 100644 --- a/post/rozhortannia-veb-infrastruktury-radicle-na-prykladi-overleynykh-merez.md +++ b/post/rozhortannia-veb-infrastruktury-radicle-na-prykladi-overleynykh-merez.md @@ -194,6 +194,40 @@ $: portFragment = ``` * через що може не працювати внутрішня навігація по сідам а також приклади команд типу `git clone`, виключаючи з URL не типовий для HTTP/80 порт (`8788`) якщо той використовується +### Зауваження щодо HTTP + +Якщо відкрити Веб-інтерфейс Radicle на віддаленому (не `localhost`) сервері з протоколом HTTP, то при копіюванні адрес репозиторію до буферу - в консолі браузера буде помилка: + +> Uncaught (in promise) TypeError: can't access property "writeText", navigator.clipboard is undefined + +Вона означає, що сучасна політика браузера блокує функціональність буферу копіювання для не захищеного протоколу HTTP, за виключенням `localhost` або при ручному додаванні такого виключення через `about:config`. Звісно, для продакшну це не варіант, бо переважна більшість користувачів через захищену природу оверлейних мереж, не користуються HTTPs і вважають таке явище - швидше не правильно налаштованим Nginx, аніж фічею. + +Отже, якщо не плануєте "силою" заганяти юзерів на HTTPs (з само-підписаним сертифікатом) то рішення я знайшов тільки у застосуванні патчу `src/lib/utils.ts`, із заміною його функції `toClipboard` на *legacy-fallback* через `copyToClipboard`: + +``` src/lib/utils.ts +async function copyToClipboard(text: string) { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(text); + } else { + const textArea = document.createElement("textarea"); + textArea.value = text; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + } catch (err) { + console.error('Unable to copy', err); + } + document.body.removeChild(textArea); + } +} +export async function toClipboard(text: string): Promise { + await copyToClipboard(text); +} +``` +* Firefox 148 - все ще підтримує `document.execCommand('copy')` + ### Компіляція Після завершення конфігурації, на локальній машині збираємо оптимізовану статику і для зручності передачі на сервер, запаковуємо вміст `build` до архіву `radicle-explorer.tar.gz`: