diff --git a/.gitignore b/.gitignore index d498422..4cf3662 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ coverage # build dist +.wrangler # nx .nx diff --git a/examples/benchmark/functions/assets/[[path]].ts b/examples/benchmark/functions/assets/[[path]].ts new file mode 100644 index 0000000..ec31694 --- /dev/null +++ b/examples/benchmark/functions/assets/[[path]].ts @@ -0,0 +1,22 @@ +export async function onRequest(context: { + request: Request + // @ts-expect-error + env: { WASM_BUCKET: R2Bucket } + next: () => Promise +}) { + const { request, env, next } = context + const url = new URL(request.url) + if (request.method !== 'GET' && request.method !== 'HEAD') return next() + if (!url.pathname.endsWith('.wasm')) return next() + + const key = url.pathname + const object = await env.WASM_BUCKET.get(key) + if (!object) return next() + + const headers = new Headers() + object.writeHttpMetadata(headers) + headers.set('etag', object.httpEtag) + headers.set('Cache-Control', 'public, max-age=31536000, immutable') + + return new Response(object.body, { headers }) +} diff --git a/examples/benchmark/package.json b/examples/benchmark/package.json index 7d168cd..f72fffd 100644 --- a/examples/benchmark/package.json +++ b/examples/benchmark/package.json @@ -9,7 +9,7 @@ "test:lint": "biome lint --write", "test:type": "tsgo --noEmit", "build": "pnpm vite build", - "wrangler:deploy": "wrangler pages deploy" + "wrangler:deploy": "tsx ./src/scripts/deployPages.ts" }, "dependencies": { "@codemirror/commands": "^6.10.2", @@ -25,7 +25,7 @@ "@tanstack/solid-virtual": "^3.10.8", "@tursodatabase/database-wasm": "^0.4.4", "codemirror": "^6.0.2", - "solid-js": "^1.9.10", + "solid-js": "^1.9.11", "sqlocal": "^0.17.0", "zod": "^4.3.6", "zod-schema-faker": "^2.1.0" diff --git a/examples/benchmark/public/_routes.json b/examples/benchmark/public/_routes.json new file mode 100644 index 0000000..e5284d6 --- /dev/null +++ b/examples/benchmark/public/_routes.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "include": ["/assets/*.wasm"], + "exclude": [] +} diff --git a/examples/benchmark/src/components/sqlTest.tsx b/examples/benchmark/src/components/sqlTest.tsx index fc18a14..663676b 100644 --- a/examples/benchmark/src/components/sqlTest.tsx +++ b/examples/benchmark/src/components/sqlTest.tsx @@ -1,6 +1,6 @@ import { createResource } from 'solid-js' -// import { DuckdbDB, duckdbFactory } from './database/duckdbDB.tsx' -// import { DuckdbSchemaMigrator } from './database/duckdbSchemaMigrator.tsx' +import { DuckdbDB, duckdbFactory } from './database/duckdbDB.tsx' +import { DuckdbSchemaMigrator } from './database/duckdbSchemaMigrator.tsx' import { PgliteDB, pgliteFactory } from './database/pgliteDB.tsx' import { PgliteSchemaMigrator } from './database/pgliteSchemaMigrator.tsx' import { SqliteDB, sqliteFactory } from './database/sqliteDB.tsx' @@ -10,7 +10,7 @@ import { StoolapSchemaMigrator } from './database/stoolapSchemaMigrator.tsx' import { TanstackDB, tanstackDbFactory } from './database/tanstackDB.tsx' import { TursoDB, tursoFactory } from './database/tursoDB.tsx' import { TursoSchemaMigrator } from './database/tursoSchemaMigrator.tsx' -// import { TestDuckdbQuery } from './test/testDuckdbQuery.tsx' +import { TestDuckdbQuery } from './test/testDuckdbQuery.tsx' import { TestPgliteDbIvm } from './test/testPgliteDbIvm.tsx' import { TestPgliteDbQuery } from './test/testPgliteDbQuery.tsx' import { TestSqliteQuery } from './test/testSqliteQuery.tsx' @@ -21,7 +21,7 @@ import { UsageMonitor } from './usageMonitor.tsx' export default function SqlTest(props: { query: string; rowCount: number }) { const [tursoQueryDb] = createResource(tursoFactory) - // const [duckdbQueryDb] = createResource(duckdbFactory) + const [duckdbQueryDb] = createResource(duckdbFactory) const [stoolapQueryDb] = createResource(stoolapFactory) return ( @@ -36,13 +36,13 @@ export default function SqlTest(props: { query: string; rowCount: number }) { - {/*
+
-
*/} +
diff --git a/examples/benchmark/src/scripts/deployPages.ts b/examples/benchmark/src/scripts/deployPages.ts new file mode 100644 index 0000000..b7b18c5 --- /dev/null +++ b/examples/benchmark/src/scripts/deployPages.ts @@ -0,0 +1,31 @@ +import { execSync } from 'node:child_process' +import { readdirSync, readFileSync, rmSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) + +const wranglerToml = join(__dirname, '../../wrangler.toml') +const readBucketName = () => { + const text = readFileSync(wranglerToml, 'utf8') + const match = text.match(/bucket_name\s*=\s*"([^"]+)"/) + if (match?.[1]) return match[1] + throw Error(`'bucket_name=BUCKET_NAME' cannot be found in wrangler.toml`) +} +const bucketName = readBucketName() + +const assetsDir = join(__dirname, '../../dist/assets') +readdirSync(assetsDir) + .filter((file) => file.endsWith('.wasm')) + .forEach((wasmFile) => { + const key = join('assets', wasmFile) + const filePath = join(assetsDir, wasmFile) + execSync( + `wrangler r2 object put --remote --file "${filePath}" --content-type application/wasm ${bucketName}/${key}`, + { stdio: 'inherit' }, + ) + rmSync(filePath) + }) + +execSync(`wrangler pages deploy`, { stdio: 'inherit' }) diff --git a/examples/benchmark/wrangler.toml b/examples/benchmark/wrangler.toml index 71e2b07..2330990 100644 --- a/examples/benchmark/wrangler.toml +++ b/examples/benchmark/wrangler.toml @@ -3,3 +3,10 @@ name = "tanstack-db-sql-interpreter-benchmark" pages_build_output_dir = "./dist" compatibility_date = "2025-02-28" + +[[r2_buckets]] +binding = "WASM_BUCKET" +bucket_name = "tanstack-db-interpreter-wasm" + +[vars] +WASM_PUBLIC_BASE = "https://" diff --git a/nx.json b/nx.json index 27d0b70..0e1e77b 100644 --- a/nx.json +++ b/nx.json @@ -7,6 +7,7 @@ "test:lint": { "inputs": [ "{projectRoot}/src/*", + "{projectRoot}/functions/*", "{projectRoot}/test/*", "{projectRoot}/package.json", "{workspaceRoot}/biome.json" @@ -17,6 +18,7 @@ "test:type": { "inputs": [ "{projectRoot}/src/*", + "{projectRoot}/functions/*", "{projectRoot}/test/*", "{projectRoot}/package.json", "{projectRoot}/tsconfig.json", @@ -28,6 +30,7 @@ "test:unit": { "inputs": [ "{projectRoot}/src/*", + "{projectRoot}/functions/*", "{projectRoot}/test/**/*", "{projectRoot}/package.json", "{projectRoot}/vitest.config.ts" @@ -37,6 +40,7 @@ "build": { "inputs": [ "{projectRoot}/src/**/*", + "{projectRoot}/functions/*", "{projectRoot}/esbuild.ts", "{projectRoot}/package.json", "{projectRoot}/vite.config.ts" diff --git a/package.json b/package.json index 0c060ec..63e7a80 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "devDependencies": { "@arethetypeswrong/cli": "^0.18.2", "@biomejs/biome": "2.4.4", - "@types/node": "^24.6.2", + "@types/node": "^24.11.0", "@typescript/native-preview": "7.0.0-dev.20260222.1", "@vitest/coverage-v8": "4.0.18", "esbuild": "^0.27.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6867a9..de33468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,7 @@ importers: specifier: 2.4.4 version: 2.4.4 '@types/node': - specifier: ^24.6.2 + specifier: ^24.11.0 version: 24.11.0 '@typescript/native-preview': specifier: 7.0.0-dev.20260222.1 @@ -93,7 +93,7 @@ importers: specifier: ^6.0.2 version: 6.0.2 solid-js: - specifier: ^1.9.10 + specifier: ^1.9.11 version: 1.9.11 sqlocal: specifier: ^0.17.0