@@ -5,6 +5,8 @@ import { get_request_store } from '@sveltejs/kit/internal/server';
55import { create_remote_key , stringify_remote_arg } from '../../../shared.js' ;
66import { prerendering } from '__sveltekit/environment' ;
77import { create_validator , get_cache , get_response , run_remote_function } from './shared.js' ;
8+ import { handle_error_and_jsonify } from '../../../server/utils.js' ;
9+ import { HttpError , SvelteKitError } from '@sveltejs/kit/internal' ;
810
911/**
1012 * Creates a remote query. When called from the browser, the function will be invoked on the server via a `fetch` call.
@@ -73,7 +75,7 @@ export function query(validate_or_fn, maybe_fn) {
7375 const { event, state } = get_request_store ( ) ;
7476
7577 const get_remote_function_result = ( ) =>
76- run_remote_function ( event , state , false , arg , validate , fn ) ;
78+ run_remote_function ( event , state , false , ( ) => validate ( arg ) , fn ) ;
7779
7880 /** @type {Promise<any> & Partial<RemoteQuery<any>> } */
7981 const promise = get_response ( __ , arg , state , get_remote_function_result ) ;
@@ -137,7 +139,7 @@ export function query(validate_or_fn, maybe_fn) {
137139 */
138140/*@__NO_SIDE_EFFECTS__ */
139141function batch ( validate_or_fn , maybe_fn ) {
140- /** @type {(args?: Input[]) => (arg: Input, idx: number) => Output } */
142+ /** @type {(args?: Input[]) => MaybePromise< (arg: Input, idx: number) => Output> } */
141143 const fn = maybe_fn ?? validate_or_fn ;
142144
143145 /** @type {(arg?: any) => MaybePromise<Input> } */
@@ -148,16 +150,34 @@ function batch(validate_or_fn, maybe_fn) {
148150 type : 'query_batch' ,
149151 id : '' ,
150152 name : '' ,
151- run : ( args ) => {
153+ run : async ( args , options ) => {
152154 const { event, state } = get_request_store ( ) ;
153155
154156 return run_remote_function (
155157 event ,
156158 state ,
157159 false ,
158- args ,
159- ( array ) => Promise . all ( array . map ( validate ) ) ,
160- fn
160+ async ( ) => Promise . all ( args . map ( validate ) ) ,
161+ async ( /** @type {any[] } */ input ) => {
162+ const get_result = await fn ( input ) ;
163+
164+ return Promise . all (
165+ input . map ( async ( arg , i ) => {
166+ try {
167+ return { type : 'result' , data : get_result ( arg , i ) } ;
168+ } catch ( error ) {
169+ return {
170+ type : 'error' ,
171+ error : await handle_error_and_jsonify ( event , state , options , error ) ,
172+ status :
173+ error instanceof HttpError || error instanceof SvelteKitError
174+ ? error . status
175+ : 500
176+ } ;
177+ }
178+ } )
179+ ) ;
180+ }
161181 ) ;
162182 }
163183 } ;
@@ -190,22 +210,23 @@ function batch(validate_or_fn, maybe_fn) {
190210 batching = { args : [ ] , resolvers : [ ] } ;
191211
192212 try {
193- const get_result = await run_remote_function (
213+ return await run_remote_function (
194214 event ,
195215 state ,
196216 false ,
197- batched . args ,
198- ( array ) => Promise . all ( array . map ( validate ) ) ,
199- fn
200- ) ;
201-
202- for ( let i = 0 ; i < batched . resolvers . length ; i ++ ) {
203- try {
204- batched . resolvers [ i ] . resolve ( get_result ( batched . args [ i ] , i ) ) ;
205- } catch ( error ) {
206- batched . resolvers [ i ] . reject ( error ) ;
217+ async ( ) => Promise . all ( batched . args . map ( validate ) ) ,
218+ async ( input ) => {
219+ const get_result = await fn ( input ) ;
220+
221+ for ( let i = 0 ; i < batched . resolvers . length ; i ++ ) {
222+ try {
223+ batched . resolvers [ i ] . resolve ( get_result ( input [ i ] , i ) ) ;
224+ } catch ( error ) {
225+ batched . resolvers [ i ] . reject ( error ) ;
226+ }
227+ }
207228 }
208- }
229+ ) ;
209230 } catch ( error ) {
210231 for ( const resolver of batched . resolvers ) {
211232 resolver . reject ( error ) ;
0 commit comments