From d67a2de835885ac642343ab9265f4a019b540c96 Mon Sep 17 00:00:00 2001 From: Andrew Kaiser Date: Thu, 2 Oct 2025 16:01:14 -0400 Subject: [PATCH 1/2] replace logic --- packages/web/src/hooks.server.ts | 37 +------------- packages/web/src/lib/api/backend.ts | 50 +++++++++++++++++++ packages/web/src/lib/api/client.ts | 27 ++++++++++ .../lib/api/remote_functions/media.remote.ts | 9 ++++ .../lib/api/remote_functions/tag.remote.ts | 3 ++ .../lib/api/remote_functions/views.remote.ts | 4 ++ packages/web/src/lib/base_controller.ts | 5 -- .../components/TagAutoCompleteInput.svelte | 3 +- .../src/lib/runes/media_list_rune.svelte.ts | 15 ++++-- .../src/lib/runes/media_view_rune.svelte.ts | 27 +++++----- packages/web/src/lib/runes/rune.ts | 4 +- .../web/src/lib/runes/settings_rune.svelte.ts | 5 +- packages/web/src/routes/browse/controller.ts | 8 +-- .../browse/runes/media_selections.svelte.ts | 4 +- .../routes/browse/runes/queryparams.svelte.ts | 6 +-- 15 files changed, 131 insertions(+), 76 deletions(-) create mode 100644 packages/web/src/lib/api/backend.ts create mode 100644 packages/web/src/lib/api/client.ts create mode 100644 packages/web/src/lib/api/remote_functions/media.remote.ts create mode 100644 packages/web/src/lib/api/remote_functions/tag.remote.ts create mode 100644 packages/web/src/lib/api/remote_functions/views.remote.ts diff --git a/packages/web/src/hooks.server.ts b/packages/web/src/hooks.server.ts index 582e97d4..7beb0008 100644 --- a/packages/web/src/hooks.server.ts +++ b/packages/web/src/hooks.server.ts @@ -1,41 +1,6 @@ import * as sveltekit from '@sveltejs/kit' -import { Forager } from '@forager/core' -import { env } from '$env/dynamic/private' -import { dev, building } from '$app/environment' -import { type Config, load_config, PackagesConfig } from '$lib/server/config.ts' import { trace } from "@opentelemetry/api" - - -let forager: Forager -let config: Config - -if (!building) { - if (dev) { - if (env.FORAGER_CONFIG) { - // TODO make this dev-only - config = await load_config(env.FORAGER_CONFIG) - if (config.web.editing) { - config.core.editing = config.web.editing - } - forager = new Forager(config.core) - } else { - config = PackagesConfig.parse({ - core: {database: {folder: 'database'}, thumbnail_folder: 'thumbnails', logger: {level: 'INFO'}}, - web: {asset_folder: 'static_assets', logger: {level: 'INFO'}} - }) - forager = new Forager(config.core) - } - - forager.init() - } else { - if (env.FORAGER_INSTANCE) { - forager = env.FORAGER_INSTANCE - config = env.FORAGER_CONFIG - } else { - throw new Error(`FORAGER_INSTANCE must be passed to sveltekit hooks`) - } - } -} +import {forager, config} from '$lib/api/backend.ts' export const handle: sveltekit.Handle = async ({ event, resolve }) => { const span = trace.getActiveSpan() diff --git a/packages/web/src/lib/api/backend.ts b/packages/web/src/lib/api/backend.ts new file mode 100644 index 00000000..75a2502d --- /dev/null +++ b/packages/web/src/lib/api/backend.ts @@ -0,0 +1,50 @@ +import * as svelte_server from '$app/server'; +import { Forager } from '@forager/core' +import { env } from '$env/dynamic/private' +import { dev, building } from '$app/environment' +import { type Config, load_config, PackagesConfig } from '$lib/server/config.ts' + + +let forager: Forager +let config: Config + +if (!building) { + if (dev) { + if (env.FORAGER_CONFIG) { + // TODO make this dev-only + config = await load_config(env.FORAGER_CONFIG) + if (config.web.editing) { + config.core.editing = config.web.editing + } + forager = new Forager(config.core) + } else { + config = PackagesConfig.parse({ + core: {database: {folder: 'database'}, thumbnail_folder: 'thumbnails', logger: {level: 'INFO'}}, + web: {asset_folder: 'static_assets', logger: {level: 'INFO'}} + }) + forager = new Forager(config.core) + } + + forager.init() + } else { + if (env.FORAGER_INSTANCE) { + forager = (env.FORAGER_INSTANCE as unknown) as Forager + config = (env.FORAGER_CONFIG as unknown) as Config + } else { + throw new Error(`FORAGER_INSTANCE must be passed to sveltekit hooks`) + } + } +} + +export const query = (fn: (...args: Params) => Return) => { + const fn_wrappped = (arg_list: Params): Return => { + return fn(...arg_list) + } + return svelte_server.query('unchecked', fn_wrappped) +} + + +export { + forager, + config +} diff --git a/packages/web/src/lib/api/client.ts b/packages/web/src/lib/api/client.ts new file mode 100644 index 00000000..6ce23e8b --- /dev/null +++ b/packages/web/src/lib/api/client.ts @@ -0,0 +1,27 @@ +import * as media from '$lib/api/remote_functions/media.remote.ts' +import * as tag from '$lib/api/remote_functions/tag.remote.ts' +import * as views from '$lib/api/remote_functions/views.remote.ts' + +const wrap_args = (fn: (params: Params) => Return): (...args: Params) => Return => { + return (...args: Params): Return => { + return fn(args) + } +} + +export const forager = { + media: { + search: wrap_args(media.search), + group: wrap_args(media.group), + update: wrap_args(media.update), + get: wrap_args(media.get), + create: wrap_args(media.create), + upsert: wrap_args(media.upsert), + }, + tag: { + search: wrap_args(tag.search), + }, + views: { + start: wrap_args(views.start), + update: wrap_args(views.update), + }, +} diff --git a/packages/web/src/lib/api/remote_functions/media.remote.ts b/packages/web/src/lib/api/remote_functions/media.remote.ts new file mode 100644 index 00000000..20d1d702 --- /dev/null +++ b/packages/web/src/lib/api/remote_functions/media.remote.ts @@ -0,0 +1,9 @@ +import {forager, query} from '$lib/api/backend.ts' + +export const search = query(forager.media.search) +export const group = query(forager.media.group) +export const update = query(forager.media.update) +export const get = query(forager.media.get) +export const create = query(forager.media.create) +export const upsert = query(forager.media.upsert) +// export delete = query(forager.media.delete) // NOTE we cannot name functions delete :( diff --git a/packages/web/src/lib/api/remote_functions/tag.remote.ts b/packages/web/src/lib/api/remote_functions/tag.remote.ts new file mode 100644 index 00000000..4c012af3 --- /dev/null +++ b/packages/web/src/lib/api/remote_functions/tag.remote.ts @@ -0,0 +1,3 @@ +import {forager, query} from '$lib/api/backend.ts' + +export const search = query(forager.tag.search) diff --git a/packages/web/src/lib/api/remote_functions/views.remote.ts b/packages/web/src/lib/api/remote_functions/views.remote.ts new file mode 100644 index 00000000..2fd2b97a --- /dev/null +++ b/packages/web/src/lib/api/remote_functions/views.remote.ts @@ -0,0 +1,4 @@ +import {forager, query} from '$lib/api/backend.ts' + +export const start = query(forager.views.start) +export const update = query(forager.views.update) diff --git a/packages/web/src/lib/base_controller.ts b/packages/web/src/lib/base_controller.ts index b221163e..a0b19b00 100644 --- a/packages/web/src/lib/base_controller.ts +++ b/packages/web/src/lib/base_controller.ts @@ -1,13 +1,9 @@ -import * as svelte from 'svelte' -import type {ApiSpec} from '$lib/api.ts' -import * as rpc from '@andykais/ts-rpc/client.ts' import type { Config } from '$lib/server/config.ts' import {create_focuser, SettingsRune} from '$lib/runes/index.ts' import {Keybinds} from '$lib/keybinds.ts' abstract class BaseController { - client: ReturnType> keybinds: Keybinds #config: Config | undefined @@ -18,7 +14,6 @@ abstract class BaseController { constructor(config: Config) { this.#config = config - this.client = rpc.create(`${window.location.protocol}${window.location.host}/rpc/:signature`) this.keybinds = new Keybinds(config) } diff --git a/packages/web/src/lib/components/TagAutoCompleteInput.svelte b/packages/web/src/lib/components/TagAutoCompleteInput.svelte index 2f489350..88f29463 100644 --- a/packages/web/src/lib/components/TagAutoCompleteInput.svelte +++ b/packages/web/src/lib/components/TagAutoCompleteInput.svelte @@ -1,5 +1,6 @@