3.5 KiB
title
| title |
|---|
| Rozwiązywanie runtime SQLite |
Rozwiązywanie runtime SQLite
OmniRoute wybiera sterownik SQLite przy starcie w 5-stopniowym łańcuchu fallback:
-
Dołączony
better-sqlite3(przezdependencieswpackage.json) — najszybszy, natywny binariusz, instalowany przeznpm install, gdy dostępne są narzędzia do budowania. -
better-sqlite3zainstalowany w runtime (w~/.omniroute/runtime/) — instalowany leniwie przy pierwszym uruchomieniu LUB przezscripts/build/postinstall.mjs → scripts/postinstall.mjs. Przed załadowaniem waliduje magiczne bajty natywnego pliku.node(ELF / Mach-O / PE), aby chronić przed uszkodzonymi lub niepasującymi do platformy binariuszami. -
node:sqlite(Node ≥22.5 stdlib) — bez natywnej kompilacji; używany, gdy obie ścieżki better-sqlite3 zawiodą. Ograniczony zestaw funkcji. -
sql.js(WASM) — ostateczny fallback. Działa wszędzie, ale jest wolniejszy i zapisuje dane w interwałach, a nie synchronicznie.
Po co ta złożoność?
- Windows EBUSY:
npm install -g omniroute@latestmoże się nie udać, jeślibetter_sqlite3.nodepoprzedniej wersji jest zablokowany przez działający proces. Instalacja runtime w~/.omniroute/runtime/omija globalną pamięć podręczną npm. - Brak narzędzi do budowania: Niektóre środowiska (korporacyjny Windows bez VS Build
Tools, minimalne obrazy Docker) nie mogą skompilować
better-sqlite3. Instalator runtime pobiera gotowy binariusz z rejestru npm; sterowniki fallback gwarantują, że OmniRoute i tak się uruchomi, nawet gdy to się nie uda. - Systemy air-gapped: Gdy rejestr npm jest niedostępny,
node:sqlitelubsql.jszapewniają podstawową funkcjonalność.
Walidacja magicznych bajtów
Przed załadowaniem pliku .node zainstalowanego w runtime OmniRoute odczytuje pierwsze 8
bajtów i porównuje je ze znanymi magicznymi sekwencjami platform:
| Platform | Bytes (hex) | Label |
|---|---|---|
| Linux | 7F 45 4C 46 |
elf |
| macOS 64-bit BE | FE ED FA CF |
macho |
| macOS 64-bit LE | CF FA ED FE |
macho-le |
| macOS fat (universal) | CA FE BA BE |
macho-fat |
| Windows | 4D 5A (MZ) |
pe |
Niezgodna magiczna sekwencja → plik jest ignorowany, fallback przechodzi do następnego kroku.
Sprawdzanie aktywnego sterownika
import { getDriverInfo } from "@/lib/db/core";
const info = getDriverInfo();
// { source: "bundled" | "runtime" | "runtime-installed-now" | "node-sqlite" | "sql-js",
// kind: "better-sqlite3" | "node-sqlite" | "sql-js" }
Sterowanie ręczne
# Skip postinstall warm-up (for fast CI installs)
OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute
# Force-reinstall runtime better-sqlite3
rm -rf ~/.omniroute/runtime
omniroute # will reinstall on next start
# Check what driver is active
omniroute config db-info # (if CLI command exists)
Odnośniki
Implementacja:
bin/cli/runtime/magicBytes.mjs— pomocnicze funkcje walidacji magicznych bajtów binariuszówbin/cli/runtime/sqliteRuntime.mjs— 5-stopniowy resolver runtime + leniwy instalatorbin/cli/runtime/index.mjs— orkiestrator startu (warmUpRuntimes())scripts/postinstall.mjs— hak npm post-install (niekrytyczny warm-up)src/lib/db/core.ts— eksportyensureDbInitialized()/getDriverInfo()