@@ -2,47 +2,53 @@ import { getRequestEvent } from "solid-js/web";
22import { provideRequestEvent } from "solid-js/web/storage" ;
33import { registerServerFunction } from "./manifest.ts" ;
44
5+ function enhanceServerFunction < T extends any [ ] , R > (
6+ id : string ,
7+ fn : ( ...args : T ) => Promise < R > ,
8+ ) {
9+ let baseURL = import . meta. env . BASE_URL ?? "/" ;
10+ if ( ! baseURL . endsWith ( "/" ) ) baseURL += "/" ;
11+
12+ return new Proxy ( fn , {
13+ get ( target , prop , receiver ) {
14+ if ( prop === "url" ) {
15+ return `${ baseURL } _server?id=${ encodeURIComponent ( id ) } ` ;
16+ }
17+ if ( prop === "GET" ) return receiver ;
18+ return ( target as any ) [ prop ] ;
19+ } ,
20+ apply ( target , thisArg , args : T ) {
21+ const ogEvt = getRequestEvent ( ) ;
22+ if ( ! ogEvt )
23+ throw new Error ( "Cannot call server function outside of a request" ) ;
24+ const evt = { ...ogEvt } ;
25+ evt . locals . serverFunctionMeta = {
26+ id,
27+ } ;
28+ evt . serverOnly = true ;
29+ return provideRequestEvent ( evt , ( ) => {
30+ return fn . apply ( thisArg , args ) ;
31+ } ) ;
32+ } ,
33+ } ) ;
34+ }
35+
536export function createServerReference < T extends any [ ] , R > (
637 id : string ,
738 fn : ( ...args : T ) => Promise < R > ,
839) {
940 let baseURL = import . meta. env . BASE_URL ?? "/" ;
1041 if ( ! baseURL . endsWith ( "/" ) ) baseURL += "/" ;
1142
12- return registerServerFunction (
13- id ,
14- new Proxy ( fn , {
15- get ( target , prop , receiver ) {
16- if ( prop === "url" ) {
17- return `${ baseURL } _server?id=${ encodeURIComponent ( id ) } ` ;
18- }
19- if ( prop === "GET" ) return receiver ;
20- return ( target as any ) [ prop ] ;
21- } ,
22- apply ( target , thisArg , args : T ) {
23- const ogEvt = getRequestEvent ( ) ;
24- if ( ! ogEvt )
25- throw new Error ( "Cannot call server function outside of a request" ) ;
26- const evt = { ...ogEvt } ;
27- evt . locals . serverFunctionMeta = {
28- id,
29- } ;
30- evt . serverOnly = true ;
31- return provideRequestEvent ( evt , ( ) => {
32- return fn . apply ( thisArg , args ) ;
33- } ) ;
34- } ,
35- } ) ,
36- ) ;
43+ return registerServerFunction ( id , enhanceServerFunction ( id , fn ) ) ;
3744}
3845
3946export function createServerFunction < T extends any [ ] , R > (
4047 id : string ,
4148 fn : ( ) => Promise < ( ...args : T ) => Promise < R > > ,
4249) {
43- let instance : ( ...args : T ) => Promise < R > ;
44- return createServerReference ( id , async ( ...args : T ) => {
45- instance = instance || ( await fn ( ) ) ;
46- return instance ( ...args ) ;
50+ let instance = fn ( ) ;
51+ return enhanceServerFunction ( id , async ( ...args : T ) => {
52+ return ( await instance ) ( ...args ) ;
4753 } ) ;
4854}
0 commit comments