From 5eda681ab0939d04b352b379208356fced426631 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Sat, 13 Jun 2026 18:10:05 +0300 Subject: [PATCH] Works on iphone and android --- package-lock.json | 14 ++++++++++++++ package.json | 1 + src/db-worker.ts | 13 ++++++------- src/sqlite-manager.ts | 7 +++++-- vite.config.ts | 5 ++++- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c4e0a8..b40bb47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "wa-sqlite": "^1.0.0" }, "devDependencies": { + "@vitejs/plugin-basic-ssl": "^2.3.0", "typescript": "~6.0.2", "vite": "^8.0.12" } @@ -360,6 +361,19 @@ "tslib": "^2.4.0" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.3.0.tgz", + "integrity": "sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", diff --git a/package.json b/package.json index 9820884..cabc6ed 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "preview": "vite preview" }, "devDependencies": { + "@vitejs/plugin-basic-ssl": "^2.3.0", "typescript": "~6.0.2", "vite": "^8.0.12" }, diff --git a/src/db-worker.ts b/src/db-worker.ts index 057d0ae..e7c39d7 100644 --- a/src/db-worker.ts +++ b/src/db-worker.ts @@ -3,6 +3,10 @@ * Воркер необходим, так как createSyncAccessHandle() доступен только в Worker'ах. */ +import { Factory } from 'wa-sqlite/src/sqlite-api.js'; +import { OriginPrivateFileSystemVFS } from 'wa-sqlite/src/examples/OriginPrivateFileSystemVFS.js'; +import ModuleConstructor from 'wa-sqlite/dist/wa-sqlite-async.mjs'; + let sqlite: any = null; let db: number | null = null; let vfs: any = null; @@ -16,19 +20,13 @@ const OPEN_FLAGS = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; async function init() { if (initialized) return; - const { Factory } = await import('wa-sqlite/src/sqlite-api.js'); - const { OriginPrivateFileSystemVFS } = await import( - 'wa-sqlite/src/examples/OriginPrivateFileSystemVFS.js' - ); - const ModuleConstructor = (await import('wa-sqlite/dist/wa-sqlite-async.mjs')).default; - const module = await ModuleConstructor(); const api = Factory(module); sqlite = api; const opfsVfs = new OriginPrivateFileSystemVFS(); - vfs = opfsVfs; + vfs = opfsVfs; const rc = api.vfs_register(opfsVfs, true); if (rc) { throw new Error(`Не удалось зарегистрировать OPFS VFS, код ${rc}`); @@ -39,6 +37,7 @@ async function init() { initialized = true; self.postMessage({ type: 'ready', ok: true }); + } async function execSchema() { diff --git a/src/sqlite-manager.ts b/src/sqlite-manager.ts index 08129cc..ddaa93b 100644 --- a/src/sqlite-manager.ts +++ b/src/sqlite-manager.ts @@ -31,7 +31,10 @@ function initWorker(): Promise { if (initPromise) return initPromise; initPromise = new Promise((resolve, reject) => { - worker = new DbWorker(); + worker = new Worker( + new URL('./db-worker.ts', import.meta.url), + { type: 'module' } // <--- ЭТО КЛЮЧЕВОЙ ПАРАМЕТР, КОТОРЫЙ ЛЕЧИТ SAFAFI/iOS + ); worker.onmessage = (e: MessageEvent) => { const msg = e.data; @@ -49,7 +52,7 @@ function initWorker(): Promise { if (msg.ok) { pendingReq.resolve(msg.data); } else { - console.log(msg); + console.log(msg) pendingReq.reject(new Error(msg.error || 'Неизвестная ошибка Worker')); } } diff --git a/vite.config.ts b/vite.config.ts index 3fd053e..94a4026 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,11 @@ import { defineConfig } from 'vite'; +import basicSsl from '@vitejs/plugin-basic-ssl'; // npm i -D @vitejs/plugin-basic-ssl export default defineConfig({ + plugins: [basicSsl()], // Добавит локальный HTTPS + build: { - target: 'es2020', + target: 'esnext', }, optimizeDeps: { exclude: ['wa-sqlite'],