@tanstack/solid-start
Version:
Modern and scalable routing for Solid applications
48 lines (39 loc) • 1.42 kB
text/typescript
import { getRequestEvent } from '@solidjs/web'
import { createServerReference } from '@solidjs/web/server-functions/server'
import { TSS_SERVER_FUNCTION } from '@tanstack/start-client-core'
import { SOLID_SERVER_REFERENCE } from './server-rpc'
import type { ClientFnMeta } from '@tanstack/start-client-core'
import type { SolidRegisteredServerFn } from './server-rpc'
import { getServerFnById } from '#tanstack-start-server-fn-resolver'
export const createSsrRpc = (functionId: string) => {
const url = process.env.TSS_SERVER_FN_BASE + functionId
const serverFnMeta: ClientFnMeta = { id: functionId }
let serverFnPromise:
| Promise<
((...args: Array<any>) => Promise<any>) | ((...args: Array<any>) => any)
>
| undefined
const getServerFn = async () => {
serverFnPromise ??= getServerFnById(functionId, {
origin: 'server',
}).then((serverFn) => {
const solidReference = (serverFn as SolidRegisteredServerFn)[
SOLID_SERVER_REFERENCE
]
if (solidReference && getRequestEvent()) {
return createServerReference(solidReference)
}
return serverFn
})
return await serverFnPromise
}
const fn = async (...args: Array<any>): Promise<any> => {
const serverFn = await getServerFn()
return await serverFn(...args)
}
return Object.assign(fn, {
url,
serverFnMeta,
[TSS_SERVER_FUNCTION]: true,
})
}