diff --git a/packages/cron/package.json b/packages/cron/package.json index 92bc4e6..b180b61 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,6 +1,6 @@ { "name": "@lowerdeck/cron", - "version": "1.1.1", + "version": "1.1.3", "publishConfig": { "access": "public" }, @@ -43,4 +43,4 @@ "microbundle": "^0.15.1", "vitest": "^3.1.2" } -} +} \ No newline at end of file diff --git a/packages/rpc-client/package.json b/packages/rpc-client/package.json index 4225e3f..6d32b84 100644 --- a/packages/rpc-client/package.json +++ b/packages/rpc-client/package.json @@ -1,6 +1,6 @@ { "name": "@lowerdeck/rpc-client", - "version": "1.1.3", + "version": "1.1.4", "publishConfig": { "access": "public" }, @@ -44,4 +44,4 @@ "@lowerdeck/proxy": "^1.0.4", "@lowerdeck/serialize": "^1.0.4" } -} +} \ No newline at end of file diff --git a/packages/rpc-client/src/request.ts b/packages/rpc-client/src/request.ts index ac884a3..4415ba6 100644 --- a/packages/rpc-client/src/request.ts +++ b/packages/rpc-client/src/request.ts @@ -25,7 +25,112 @@ let calls: { }; } = {}; +let runCalls = ( + call: Call, + c: { + call: Call; + resolve: (value: any) => void; + reject: (error: any) => void; + }[] +) => { + let url = new URL(call.endpoint); + url.search = new URLSearchParams(call.query).toString(); + + fetch(url.toString(), { + method: 'POST', + + headers: { + 'Content-Type': 'application/rpc+json', + ...c[0].call.headers + }, + body: serialize.encode({ + calls: c + .map(x => ({ + id: x.call.id, + name: x.call.name, + payload: x.call.payload + })) + .sort((a, b) => a.name.localeCompare(b.name)) + }), + credentials: 'include', + + // @ts-ignore + keepalive: false + }) + .then(async res => ({ + res: serialize.decode( + (await res.json()) as { + calls: { + id: string; + status: number; + result: any; + }[]; + } + ), + + headers: res.headers + })) + .then(({ res, headers }) => { + if (res.__typename == 'error') { + let err = ServiceError.fromResponse(res); + c.forEach(x => x.reject(err)); + return; + } + + for (let call of c) { + let callRes = res.calls.find((x: any) => x.id == call.call.id); + if (!callRes) { + let err = new ServiceError(internalServerError({ message: 'Call not returned' })); + call.reject(err); + return; + } + + if (callRes.status >= 200 && callRes.status < 300) { + call.resolve({ + data: callRes.result, + status: callRes.status, + headers + }); + continue; + } + + let err = ServiceError.fromResponse(callRes.result); + call.reject(err); + } + }) + .catch(e => { + if (verbose) { + console.error(e); + } + + c.forEach(x => + x.reject( + new ServiceError( + internalServerError({ + message: + typeof window != 'undefined' + ? 'Unable to reach server' + : `Unable to reach server ${call.endpoint}`, + + inner: verbose + ? e instanceof Error + ? { message: e.message, stack: e.stack } + : { error: e } + : undefined + }) + ) + ) + ); + }); +}; + let performRequest = (call: Call) => { + if (isServer) { + return new Promise((resolve, reject) => { + runCalls(call, [{ call, resolve, reject }]); + }); + } + let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`; if (!calls[key]) calls[key] = { calls: [], to: null }; @@ -43,103 +148,9 @@ let performRequest = (call: Call) => { calls[key].calls = []; calls[key].to = null; - let url = new URL(call.endpoint); - url.search = new URLSearchParams(call.query).toString(); - - fetch(url.toString(), { - method: 'POST', - - headers: { - 'Content-Type': 'application/rpc+json', - ...c[0].call.headers - }, - body: serialize.encode({ - calls: c - .map(x => ({ - id: x.call.id, - name: x.call.name, - payload: x.call.payload - })) - .sort((a, b) => a.name.localeCompare(b.name)) - }), - credentials: 'include', - - // @ts-ignore - keepalive: false - }) - .then(async res => ({ - res: serialize.decode( - (await res.json()) as { - calls: { - id: string; - status: number; - result: any; - }[]; - } - ), - - headers: res.headers - })) - .then(({ res, headers }) => { - if (res.__typename == 'error') { - let err = ServiceError.fromResponse(res); - c.forEach(x => x.reject(err)); - return; - } - - for (let call of c) { - let callRes = res.calls.find((x: any) => x.id == call.call.id); - if (!callRes) { - let err = new ServiceError( - internalServerError({ message: 'Call not returned' }) - ); - call.reject(err); - return; - } - - if (callRes.status >= 200 && callRes.status < 300) { - call.resolve({ - // data: O; - // status: number; - // headers: Record; - - data: callRes.result, - status: callRes.status, - headers - }); - continue; - } - - let err = ServiceError.fromResponse(callRes.result); - call.reject(err); - } - }) - .catch(e => { - if (verbose) { - console.error(e); - } - - c.forEach(x => - x.reject( - new ServiceError( - internalServerError({ - message: - typeof window != 'undefined' - ? 'Unable to reach server' - : `Unable to reach server ${call.endpoint}`, - - inner: verbose - ? e instanceof Error - ? { message: e.message, stack: e.stack } - : { error: e } - : undefined - }) - ) - ) - ); - }); + runCalls(call, c); }, - isServer ? 0 : 10 + 10 ); return promise;