Forwarded from Daily Coding 🔥
🛠 Acra обеспечивает шифрование полей данных на уровне приложений, многоуровневый контроль доступа, защиту от утечки данных из баз и возможности обнаружения вторжений в рамках одного пакета. Acra была специально разработана для распределенных приложений (веб-приложений, серверных и мобильных), которые хранят данные в одной или нескольких базах данных / хранилищах данных.
🌍 Сайт
Daily Coding #инструменты #SQL & Max
🌍 Сайт
Daily Coding #инструменты #SQL & Max
Forwarded from Dezzigners
This media is not supported in your browser
VIEW IN TELEGRAM
🧰 Dominant Color Toolk — создаёт цветовые палитры на основе доминирующих оттенков изображения и автоматически применяет их к слоям
Dezzigners
Dezzigners
Forwarded from Node.JS [ru] | Серверный JavaScript
AbortController в Node.js production: сквозные дедлайны, cleanup ресурсов и защита от «висящих» операций
AbortController важен не как таймаут для
Сквозной дедлайн
У HTTP-запроса, джобы или RPC должен быть один бюджет, который прокидывается вниз: handler - сервис - БД - внешний API - stream - timer.
Типичная ошибка
Не ставьте независимые
Abort кооперативен
Он работает только там, где API принимает
Cleanup обязателен
Вывод:
Сильный production-паттерн - один сквозной
AbortController важен не как таймаут для
fetch, а как контракт жизненного цикла операции. В production частая ошибка - клиент уже ушел, SLA истек, а сокеты, стримы и временные файлы продолжают жить.Сквозной дедлайн
У HTTP-запроса, джобы или RPC должен быть один бюджет, который прокидывается вниз: handler - сервис - БД - внешний API - stream - timer.
const client = new AbortController();
req.on('close', () => {
client.abort(new Error('client disconnected'));
});
const signal = AbortSignal.any([
client.signal,
AbortSignal.timeout(1500)
]);
try {
const r = await fetch(reportUrl, { signal });
await pipeline(r.body, createWriteStream(file), { signal });
} finally {
await rm(tmpDir, {
recursive: true,
force: true
}).catch(() => {});
}
Типичная ошибка
Не ставьте независимые
timeout: 1000 в каждом слое. Так запрос легко живет 3+ секунды, хотя общий SLA был 1 секунда. Практический совет: передавайте сверху signal, а локальный меньший бюджет делайте через AbortSignal.any().Abort кооперативен
Он работает только там, где API принимает
signal: fetch, timers/promises, stream.pipeline, часть fs, http, child_process, клиенты БД. Предупреждение: Promise.race() с таймаутом не отменяет реальную работу, он только перестает ждать результат.Cleanup обязателен
abort() не удалит временные файлы, не вернет connection в pool и не снимет listeners. Освобождайте ресурсы в finally и прокидывайте внутрь signal, а не controller.Вывод:
Сильный production-паттерн - один сквозной
AbortSignal, понятный signal.reason и гарантированный cleanup каждой операции.Forwarded from Designdealer
This media is not supported in your browser
VIEW IN TELEGRAM
HONOR представила MagicOS 11.
Если вам показалось, вам не показалось.
Если вам показалось, вам не показалось.
Forwarded from Node.JS [ru] | Серверный JavaScript
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from ai.dot(ufna, dev)
Сисьадмин — это врач-маммолог.
А у вас какие гениальные идеи при температуре в 39?
А у вас какие гениальные идеи при температуре в 39?
Forwarded from PSD | Дизайн-пространство
Media is too big
VIEW IN TELEGRAM
Forwarded from Daily Coding 🔥
🛠 Birdview.js - JavaScript-плагин, который позволяет вам уменьшать масштаб страницы и просматривать весь документ в одном окне, после чего вы можете щелкнуть в любом месте, чтобы снова увеличить масштаб и прокрутить вниз прямо до того места, где вы щелкнули.
🌍 Сайт
Daily Coding #инструменты #JavaScript & Max
🌍 Сайт
Daily Coding #инструменты #JavaScript & Max
Forwarded from Node.JS [ru] | Серверный JavaScript
WeakRef, FinalizationRegistry и утечки в нативных коллбэках: ловушки памяти в V8
Node.js и GC V8 делают много работы за нас, но есть сценарии, где автоматическое управление памятью отключается. Особенно когда в дело входят нативные аддоны на C++ с N-API и коллбэки, которые живут дольше, чем само JS-окружение. WeakRef и FinalizationRegistry часто подают как спасение, но на практике это западня, если не понимать деталей.
WeakRef: иллюзия безопасности
WeakRef хранит слабую ссылку на объект и не мешает GC. Выглядит удобно для кэширования, но deref() может вернуть undefined в любой момент:
* Практический совет: никогда не рассчитывай на то, что объект жив после deref().
* Типичная ошибка: думать, что WeakRef продлевает жизнь объекту. Нет, GC может уничтожить его сразу.
FinalizationRegistry: не деструктор
FinalizationRegistry вызывает коллбэк после сборки мусора, но это не гарантированный cleanup:
* Подводный камень: время вызова не определено, и если процесс завершился, коллбэк может не случиться.
* Практический совет: используй FinalizationRegistry только для логирования или диагностики, а не как основной механизм освобождения ресурсов.
Утечки в нативных коллбэках: скрытый убийца
Нативные аддоны с N-API могут захватить JS-коллбэк через napi_ref и забыть его освободить. В результате объект зависает навсегда:
* Production-oriented пример: обработчик событий в long-running процессе, где каждый вызов on создает новую ссылку без очистки.
* Решение: в аддонах используй napi_create_reference с 0 — это слабая ссылка, и явно удаляй ссылку при завершении работы.
Вывод:
Утечки в нативных коллбэках проще предотвратить на этапе проектирования, чем отлавливать с помощью слабых ссылок — дисциплина и явные cleanup-паттерны остаются единственной надежной защитой.
Node.js и GC V8 делают много работы за нас, но есть сценарии, где автоматическое управление памятью отключается. Особенно когда в дело входят нативные аддоны на C++ с N-API и коллбэки, которые живут дольше, чем само JS-окружение. WeakRef и FinalizationRegistry часто подают как спасение, но на практике это западня, если не понимать деталей.
WeakRef: иллюзия безопасности
WeakRef хранит слабую ссылку на объект и не мешает GC. Выглядит удобно для кэширования, но deref() может вернуть undefined в любой момент:
const cache = new Map();
function cachedGet(key, factory) {
let ref = cache.get(key);
if (ref && ref.deref()) return ref.deref();
const obj = factory();
cache.set(key, new WeakRef(obj));
return obj;
}
* Практический совет: никогда не рассчитывай на то, что объект жив после deref().
* Типичная ошибка: думать, что WeakRef продлевает жизнь объекту. Нет, GC может уничтожить его сразу.
FinalizationRegistry: не деструктор
FinalizationRegistry вызывает коллбэк после сборки мусора, но это не гарантированный cleanup:
const registry = new FinalizationRegistry((heldValue) => {
console.log(Cleanup for ${heldValue});
});
registry.register(obj, 'some-id');* Подводный камень: время вызова не определено, и если процесс завершился, коллбэк может не случиться.
* Практический совет: используй FinalizationRegistry только для логирования или диагностики, а не как основной механизм освобождения ресурсов.
Утечки в нативных коллбэках: скрытый убийца
Нативные аддоны с N-API могут захватить JS-коллбэк через napi_ref и забыть его освободить. В результате объект зависает навсегда:
nativeModule.on('data', (msg) => console.log(msg));
// В C++: napi_create_reference(env, callback, 1, &ref);
// И никогда не вызывается napi_delete_reference(ref);* Production-oriented пример: обработчик событий в long-running процессе, где каждый вызов on создает новую ссылку без очистки.
* Решение: в аддонах используй napi_create_reference с 0 — это слабая ссылка, и явно удаляй ссылку при завершении работы.
Вывод:
Утечки в нативных коллбэках проще предотвратить на этапе проектирования, чем отлавливать с помощью слабых ссылок — дисциплина и явные cleanup-паттерны остаются единственной надежной защитой.
Forwarded from PSD | Дизайн-пространство
Media is too big
VIEW IN TELEGRAM