@lowerdeck/rpc-client 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("@lowerdeck/canonicalize"),r=require("@lowerdeck/error"),n=require("@lowerdeck/serialize"),t=require("@lowerdeck/id"),o=require("@lowerdeck/memo"),i=require("@lowerdeck/proxy");function a(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}function u(){return u=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},u.apply(null,arguments)}var c=0,l=o.memo(function(){return t.generatePlainId(10)}),s="undefined"==typeof window;function d(e,r,n){if(!e.s){if(n instanceof v){if(!n.s)return void(n.o=d.bind(null,e,r));1&r&&(r=n.s),n=n.v}if(n&&n.then)return void n.then(d.bind(null,e,r),d.bind(null,e,2));e.s=r,e.v=n;var t=e.o;t&&t(e)}}var f="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,v=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,n){var t=new e,o=this.s;if(o){var i=1&o?r:n;if(i){try{d(t,1,i(this.v))}catch(e){d(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?d(t,1,r?r(o):o):n?d(t,1,n(o)):d(t,2,o)}catch(e){d(t,2,e)}},t},e}();function h(e){return e instanceof v&&1&e.s}var p,m,y=function(){var e;s||(e=console).log.apply(e,[].slice.call(arguments))},w={},b=(p=function(t){return Promise.resolve(function(t){try{var o,i=function(e){if(o)return e;if(b)throw b;throw new r.ServiceError(r.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint}))},p=function(){var e="call_"+l()+"_"+c;return c+=1,e}();y("[call:"+t.name.replace(":","-")+":"+p+"] Queued",t);var m=0,b=null;for(var g in t.headers)void 0===t.headers[g]&&delete t.headers[g];if(t.query)for(var q in t.query)void 0===t.query[q]&&delete t.query[q];var P="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,j=function(e,r,n){for(var t;;){var o=e();if(h(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=n();if(i&&i.then){if(!h(i)){t=1;break}i=i.s}}var a=new v,u=d.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(c):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,u):l(o):d(a,1,i)})).then(void 0,u),a;function c(r){i=r;do{if(!(o=e())||h(o)&&!o.v)return void d(a,1,i);if(o.then)return void o.then(l).then(void 0,u);h(i=n())&&(i=i.v)}while(!i||!i.then);i.then(c).then(void 0,u)}function l(e){e?(i=n())&&i.then?i.then(c).then(void 0,u):c(i):d(a,1,i)}}(function(){return!o&&m<P},0,function(){function i(e){return o?e:(m+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,m*S)})).then(function(){}))}var c=function(i,c){try{var l=Promise.resolve(function(t){var o=""+e.canonicalize(t.headers)+e.canonicalize(t.query)+t.endpoint;w[o]||(w[o]={calls:[],to:null});var i=w[o],c=new Promise(function(e,r){i.calls.push({call:t,resolve:e,reject:r})});return i.to&&clearTimeout(i.to),i.to=setTimeout(function(){var e=w[o].calls;w[o].calls=[],w[o].to=null;var i=new URL(t.endpoint);i.search=new URLSearchParams(t.query).toString(),fetch(i.toString(),{method:"POST",headers:u({"Content-Type":"application/rpc+json"},e[0].call.headers),body:n.serialize.encode({calls:e.map(function(e){return{id:e.call.id,name:e.call.name,payload:e.call.payload}}).sort(function(e,r){return e.name.localeCompare(r.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var r=n.serialize.decode;return Promise.resolve(e.json()).then(function(t){return{res:r.call(n.serialize,t),headers:e.headers}})}catch(e){return Promise.reject(e)}}).then(function(n){var t=n.res,o=n.headers;if("error"!=t.__typename){for(var i,u,c=function(){var e=u.value,n=t.calls.find(function(r){return r.id==e.call.id});if(!n){var i=new r.ServiceError(r.internalServerError({message:"Call not returned"}));return e.reject(i),{v:void 0}}n.status>=200&&n.status<300&&e.resolve({data:n.result,status:n.status,headers:o});var a=r.ServiceError.fromResponse(n.result);e.reject(a)},l=function(e){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,r){if(e){if("string"==typeof e)return a(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,r):void 0}}(e))){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(u=l()).done;)if(i=c())return i.v}else{var s=r.ServiceError.fromResponse(t);e.forEach(function(e){return e.reject(s)})}}).catch(function(n){f&&console.error(n),e.forEach(function(e){return e.reject(new r.ServiceError(r.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint,inner:f?n instanceof Error?{message:n.message,stack:n.stack}:{error:n}:void 0})))})})},s?0:10),c}(u({},t,{id:p})).then(function(e){return s||y("[call:"+t.name.replace(":","-")+":"+p+"] Success",e),e},function(e){throw s&&y("[call:"+t.name.replace(":","-")+":"+p+"] Queued",t),y("[call:"+t.name.replace(":","-")+":"+p+"] Error",e),e})).then(function(e){return o=1,e})}catch(e){return c(e)}return l&&l.then?l.then(void 0,c):l}(0,function(e){if(b=e,r.isServiceError(e)&&e.data.status<500)throw e});return c&&c.then?c.then(i):i(c)});return Promise.resolve(j&&j.then?j.then(i):i(j))}catch(e){return Promise.reject(e)}}(t))},void 0===m&&(m=function(e){return e({})}),function(e){return i.proxy(function(r,n,t){try{return Promise.resolve(m(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var a;function c(i){return a?i:Promise.resolve(p({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var l=u({},e.headers,i,null==t?void 0:t.headers);null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:l,query:null==t?void 0:t.query});var s=function(){if("getFull"==r[r.length-1])return Promise.resolve(p({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return s&&s.then?s.then(c):c(s)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});exports.createClient=b;
1
+ var e=require("@lowerdeck/canonicalize"),r=require("@lowerdeck/error"),n=require("@lowerdeck/serialize"),t=require("@lowerdeck/id"),o=require("@lowerdeck/memo"),i=require("@lowerdeck/proxy");function a(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}function u(){return u=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},u.apply(null,arguments)}var c=0,l=o.memo(function(){return t.generatePlainId(10)}),s="undefined"==typeof window;function d(e,r,n){if(!e.s){if(n instanceof v){if(!n.s)return void(n.o=d.bind(null,e,r));1&r&&(r=n.s),n=n.v}if(n&&n.then)return void n.then(d.bind(null,e,r),d.bind(null,e,2));e.s=r,e.v=n;var t=e.o;t&&t(e)}}var f="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,v=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,n){var t=new e,o=this.s;if(o){var i=1&o?r:n;if(i){try{d(t,1,i(this.v))}catch(e){d(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?d(t,1,r?r(o):o):n?d(t,1,n(o)):d(t,2,o)}catch(e){d(t,2,e)}},t},e}();function h(e){return e instanceof v&&1&e.s}var p,m,y=function(){var e;s||(e=console).log.apply(e,[].slice.call(arguments))},w={},b=(p=function(t){return Promise.resolve(function(t){try{var o,i=function(e){if(o)return e;if(b)throw b;throw new r.ServiceError(r.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint}))},p=function(){var e="call_"+l()+"_"+c;return c+=1,e}();y("[call:"+t.name.replace(":","-")+":"+p+"] Queued",t);var m=0,b=null;for(var g in t.headers)void 0===t.headers[g]&&delete t.headers[g];if(t.query)for(var q in t.query)void 0===t.query[q]&&delete t.query[q];var P="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,j=function(e,r,n){for(var t;;){var o=e();if(h(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=n();if(i&&i.then){if(!h(i)){t=1;break}i=i.s}}var a=new v,u=d.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(c):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,u):l(o):d(a,1,i)})).then(void 0,u),a;function c(r){i=r;do{if(!(o=e())||h(o)&&!o.v)return void d(a,1,i);if(o.then)return void o.then(l).then(void 0,u);h(i=n())&&(i=i.v)}while(!i||!i.then);i.then(c).then(void 0,u)}function l(e){e?(i=n())&&i.then?i.then(c).then(void 0,u):c(i):d(a,1,i)}}(function(){return!o&&m<P},0,function(){function i(e){return o?e:(m+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,m*S)})).then(function(){}))}var c=function(i,c){try{var l=Promise.resolve(function(t){var o=""+e.canonicalize(t.headers)+e.canonicalize(t.query)+t.endpoint;w[o]||(w[o]={calls:[],to:null});var i=w[o],c=new Promise(function(e,r){i.calls.push({call:t,resolve:e,reject:r})});return i.to&&clearTimeout(i.to),i.to=setTimeout(function(){var e=w[o].calls;w[o].calls=[],w[o].to=null;var i=new URL(t.endpoint);i.search=new URLSearchParams(t.query).toString(),fetch(i.toString(),{method:"POST",headers:u({"Content-Type":"application/rpc+json"},e[0].call.headers),body:n.serialize.encode({calls:e.map(function(e){return{id:e.call.id,name:e.call.name,payload:e.call.payload}}).sort(function(e,r){return e.name.localeCompare(r.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var r=n.serialize.decode;return Promise.resolve(e.json()).then(function(t){return{res:r.call(n.serialize,t),headers:e.headers}})}catch(e){return Promise.reject(e)}}).then(function(n){var t=n.res,o=n.headers;if("error"!=t.__typename){for(var i,u,c=function(){var e=u.value,n=t.calls.find(function(r){return r.id==e.call.id});if(!n){var i=new r.ServiceError(r.internalServerError({message:"Call not returned"}));return e.reject(i),{v:void 0}}if(n.status>=200&&n.status<300)return e.resolve({data:n.result,status:n.status,headers:o}),0;var a=r.ServiceError.fromResponse(n.result);e.reject(a)},l=function(e){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,r){if(e){if("string"==typeof e)return a(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,r):void 0}}(e))){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(u=l()).done;)if(0!==(i=c())&&i)return i.v}else{var s=r.ServiceError.fromResponse(t);e.forEach(function(e){return e.reject(s)})}}).catch(function(n){f&&console.error(n),e.forEach(function(e){return e.reject(new r.ServiceError(r.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint,inner:f?n instanceof Error?{message:n.message,stack:n.stack}:{error:n}:void 0})))})})},s?0:10),c}(u({},t,{id:p})).then(function(e){return s||y("[call:"+t.name.replace(":","-")+":"+p+"] Success",e),e},function(e){throw s&&y("[call:"+t.name.replace(":","-")+":"+p+"] Queued",t),y("[call:"+t.name.replace(":","-")+":"+p+"] Error",e),e})).then(function(e){return o=1,e})}catch(e){return c(e)}return l&&l.then?l.then(void 0,c):l}(0,function(e){if(b=e,r.isServiceError(e)&&e.data.status<500)throw e});return c&&c.then?c.then(i):i(c)});return Promise.resolve(j&&j.then?j.then(i):i(j))}catch(e){return Promise.reject(e)}}(t))},void 0===m&&(m=function(e){return e({})}),function(e){return i.proxy(function(r,n,t){try{return Promise.resolve(m(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var a;function c(i){return a?i:Promise.resolve(p({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var l=u({},e.headers,i,null==t?void 0:t.headers);null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:l,query:null==t?void 0:t.query});var s=function(){if("getFull"==r[r.length-1])return Promise.resolve(p({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return s&&s.then?s.then(c):c(s)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});exports.createClient=b;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/shared/requester.ts","../src/request.ts","../src/shared/clientBuilder.ts","../src/index.ts"],"sourcesContent":["import { generatePlainId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\n\nlet index = 0;\nlet rootId = memo(() => generatePlainId(10));\n\nexport let generateRequestId = () => {\n let id = `call_${rootId()}_${index}`;\n index += 1;\n return id;\n};\n\nexport interface Call {\n id: string;\n name: string;\n payload: any;\n endpoint: string;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}\n\nexport type Requester = (\n call: Omit<Call, 'id' | 'headers' | 'query'> & {\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n context: any;\n }\n) => Promise<{\n data: any;\n status: number;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}>;\n","import { canonicalize } from '@lowerdeck/canonicalize';\nimport { internalServerError, isServiceError, ServiceError } from '@lowerdeck/error';\nimport { serialize } from '@lowerdeck/serialize';\nimport { Call, generateRequestId, Requester } from './shared/requester';\n\n// @ts-ignore\nlet isServer = typeof window === 'undefined';\n\nlet verbose =\n typeof window != 'undefined' ||\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production');\n\nlet log = (...args: any[]) => {\n if (!isServer) console.log(...args);\n};\n\nlet calls: {\n [key: string]: {\n calls: {\n call: Call;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }[];\n to: any;\n };\n} = {};\n\nlet performRequest = (call: Call) => {\n let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`;\n\n if (!calls[key]) calls[key] = { calls: [], to: null };\n let current = calls[key];\n\n let promise = new Promise((resolve, reject) => {\n current.calls.push({ call, resolve, reject });\n });\n\n if (current.to) clearTimeout(current.to);\n\n current.to = setTimeout(\n () => {\n let c = calls[key].calls;\n calls[key].calls = [];\n calls[key].to = null;\n\n let url = new URL(call.endpoint);\n url.search = new URLSearchParams(call.query).toString();\n\n fetch(url.toString(), {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/rpc+json',\n ...c[0].call.headers\n },\n body: serialize.encode({\n calls: c\n .map(x => ({\n id: x.call.id,\n name: x.call.name,\n payload: x.call.payload\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n }),\n credentials: 'include',\n\n // @ts-ignore\n keepalive: false\n })\n .then(async res => ({\n res: serialize.decode(\n (await res.json()) as {\n calls: {\n id: string;\n status: number;\n result: any;\n }[];\n }\n ),\n\n headers: res.headers\n }))\n .then(({ res, headers }) => {\n if (res.__typename == 'error') {\n let err = ServiceError.fromResponse(res);\n c.forEach(x => x.reject(err));\n return;\n }\n\n for (let call of c) {\n let callRes = res.calls.find((x: any) => x.id == call.call.id);\n if (!callRes) {\n let err = new ServiceError(\n internalServerError({ message: 'Call not returned' })\n );\n call.reject(err);\n return;\n }\n\n if (callRes.status >= 200 && callRes.status < 300) {\n call.resolve({\n // data: O;\n // status: number;\n // headers: Record<string, string>;\n\n data: callRes.result,\n status: callRes.status,\n headers\n });\n }\n\n let err = ServiceError.fromResponse(callRes.result);\n call.reject(err);\n }\n })\n .catch(e => {\n if (verbose) {\n console.error(e);\n }\n\n c.forEach(x =>\n x.reject(\n new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`,\n\n inner: verbose\n ? e instanceof Error\n ? { message: e.message, stack: e.stack }\n : { error: e }\n : undefined\n })\n )\n )\n );\n });\n },\n isServer ? 0 : 10\n );\n\n return promise;\n};\n\nlet requesterInternal: Requester = async call => {\n let id = generateRequestId();\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n\n let tries = 0;\n let error: Error | null = null;\n\n for (let header in call.headers) {\n if (call.headers[header] === undefined) delete call.headers[header];\n }\n\n if (call.query) {\n for (let query in call.query) {\n if (call.query[query] === undefined) delete call.query[query];\n }\n }\n\n let maxTries = typeof window === 'undefined' ? 6 : 3;\n let retryDelay = typeof window === 'undefined' ? 20 : 1000;\n\n while (tries < maxTries) {\n try {\n return (await performRequest({\n ...(call as any),\n id\n }).then(\n res => {\n if (!isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Success`, res);\n }\n\n return res;\n },\n err => {\n if (isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n }\n\n log(`[call:${call.name.replace(':', '-')}:${id}] Error`, err);\n\n throw err;\n }\n )) as any;\n } catch (e: any) {\n error = e;\n\n if (isServiceError(e)) {\n // 400 errors are not retried\n if (e.data.status < 500) throw e;\n }\n }\n\n tries += 1;\n await new Promise(r => setTimeout(r, tries * retryDelay));\n }\n\n if (error) throw error;\n\n throw new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`\n })\n );\n};\n\nexport let request: Requester = async call => {\n // try {\n return await requesterInternal(call);\n // } catch (e: any) {\n // Sentry.captureException(e);\n // throw e;\n // }\n};\n","import { proxy } from '@lowerdeck/proxy';\nimport { Requester } from './requester';\n\nexport interface ClientOpts {\n endpoint: string;\n headers?: Record<string, string | undefined>;\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>;\n onRequest?: (d: {\n endpoint: string;\n name: string;\n payload: any;\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }) => any;\n}\n\nlet noopWithContext = (cb: (ctx: any) => any) => cb({});\n\nexport let clientBuilder =\n (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>\n <T extends object>(clientOpts: ClientOpts) =>\n proxy<T>(\n async (\n path,\n data,\n requestOpts?: {\n headers?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }\n ) =>\n await withContext(async context => {\n let headers = {\n ...clientOpts.headers,\n ...(await clientOpts.getHeaders?.()),\n ...requestOpts?.headers\n };\n\n clientOpts.onRequest?.({\n endpoint: clientOpts.endpoint,\n name: path.join(':'),\n payload: data,\n headers,\n query: requestOpts?.query\n });\n\n if (path[path.length - 1] == 'getFull') {\n return await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.slice(0, -1).join(':'),\n headers,\n query: requestOpts?.query,\n context\n });\n }\n\n return (\n await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.join(':'),\n headers,\n query: requestOpts?.query,\n context\n })\n ).data;\n })\n );\n","import { request } from './request';\nimport { clientBuilder } from './shared/clientBuilder';\n\nexport let createClient = clientBuilder(request);\n"],"names":["index","rootId","memo","generatePlainId","isServer","window","_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","verbose","process","env","NODE_ENV","prototype","onFulfilled","result","this","callback","onRejected","e","_this","_isSettledPact","thenable","request","withContext","log","_console","console","apply","slice","call","arguments","calls","createClient","Promise","resolve","_exit","_temp4","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","name","replace","tries","header","headers","undefined","query","maxTries","retryDelay","_temp3","_for","_temp2","_result","r","setTimeout","_temp","key","canonicalize","to","current","promise","reject","push","clearTimeout","c","url","URL","search","URLSearchParams","toString","fetch","method","_extends","body","serialize","encode","map","x","payload","sort","a","b","localeCompare","credentials","keepalive","res","_decode","decode","json","_res$json","_ref","__typename","_ret","_step","_loop","callRes","find","err","status","data","fromResponse","_iterator","_createForOfIteratorHelperLoose","done","forEach","inner","Error","stack","performRequest","_await$performRequest","_catch","isServiceError","requesterInternal","cb","clientOpts","proxy","path","requestOpts","context","getHeaders","_clientOpts$getHeader","join","_request","onRequest","length","_await$request"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/shared/requester.ts","../src/request.ts","../src/shared/clientBuilder.ts","../src/index.ts"],"sourcesContent":["import { generatePlainId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\n\nlet index = 0;\nlet rootId = memo(() => generatePlainId(10));\n\nexport let generateRequestId = () => {\n let id = `call_${rootId()}_${index}`;\n index += 1;\n return id;\n};\n\nexport interface Call {\n id: string;\n name: string;\n payload: any;\n endpoint: string;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}\n\nexport type Requester = (\n call: Omit<Call, 'id' | 'headers' | 'query'> & {\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n context: any;\n }\n) => Promise<{\n data: any;\n status: number;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}>;\n","import { canonicalize } from '@lowerdeck/canonicalize';\nimport { internalServerError, isServiceError, ServiceError } from '@lowerdeck/error';\nimport { serialize } from '@lowerdeck/serialize';\nimport { Call, generateRequestId, Requester } from './shared/requester';\n\n// @ts-ignore\nlet isServer = typeof window === 'undefined';\n\nlet verbose =\n typeof window != 'undefined' ||\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production');\n\nlet log = (...args: any[]) => {\n if (!isServer) console.log(...args);\n};\n\nlet calls: {\n [key: string]: {\n calls: {\n call: Call;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }[];\n to: any;\n };\n} = {};\n\nlet performRequest = (call: Call) => {\n let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`;\n\n if (!calls[key]) calls[key] = { calls: [], to: null };\n let current = calls[key];\n\n let promise = new Promise((resolve, reject) => {\n current.calls.push({ call, resolve, reject });\n });\n\n if (current.to) clearTimeout(current.to);\n\n current.to = setTimeout(\n () => {\n let c = calls[key].calls;\n calls[key].calls = [];\n calls[key].to = null;\n\n let url = new URL(call.endpoint);\n url.search = new URLSearchParams(call.query).toString();\n\n fetch(url.toString(), {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/rpc+json',\n ...c[0].call.headers\n },\n body: serialize.encode({\n calls: c\n .map(x => ({\n id: x.call.id,\n name: x.call.name,\n payload: x.call.payload\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n }),\n credentials: 'include',\n\n // @ts-ignore\n keepalive: false\n })\n .then(async res => ({\n res: serialize.decode(\n (await res.json()) as {\n calls: {\n id: string;\n status: number;\n result: any;\n }[];\n }\n ),\n\n headers: res.headers\n }))\n .then(({ res, headers }) => {\n if (res.__typename == 'error') {\n let err = ServiceError.fromResponse(res);\n c.forEach(x => x.reject(err));\n return;\n }\n\n for (let call of c) {\n let callRes = res.calls.find((x: any) => x.id == call.call.id);\n if (!callRes) {\n let err = new ServiceError(\n internalServerError({ message: 'Call not returned' })\n );\n call.reject(err);\n return;\n }\n\n if (callRes.status >= 200 && callRes.status < 300) {\n call.resolve({\n // data: O;\n // status: number;\n // headers: Record<string, string>;\n\n data: callRes.result,\n status: callRes.status,\n headers\n });\n continue;\n }\n\n let err = ServiceError.fromResponse(callRes.result);\n call.reject(err);\n }\n })\n .catch(e => {\n if (verbose) {\n console.error(e);\n }\n\n c.forEach(x =>\n x.reject(\n new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`,\n\n inner: verbose\n ? e instanceof Error\n ? { message: e.message, stack: e.stack }\n : { error: e }\n : undefined\n })\n )\n )\n );\n });\n },\n isServer ? 0 : 10\n );\n\n return promise;\n};\n\nlet requesterInternal: Requester = async call => {\n let id = generateRequestId();\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n\n let tries = 0;\n let error: Error | null = null;\n\n for (let header in call.headers) {\n if (call.headers[header] === undefined) delete call.headers[header];\n }\n\n if (call.query) {\n for (let query in call.query) {\n if (call.query[query] === undefined) delete call.query[query];\n }\n }\n\n let maxTries = typeof window === 'undefined' ? 6 : 3;\n let retryDelay = typeof window === 'undefined' ? 20 : 1000;\n\n while (tries < maxTries) {\n try {\n return (await performRequest({\n ...(call as any),\n id\n }).then(\n res => {\n if (!isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Success`, res);\n }\n\n return res;\n },\n err => {\n if (isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n }\n\n log(`[call:${call.name.replace(':', '-')}:${id}] Error`, err);\n\n throw err;\n }\n )) as any;\n } catch (e: any) {\n error = e;\n\n if (isServiceError(e)) {\n // 400 errors are not retried\n if (e.data.status < 500) throw e;\n }\n }\n\n tries += 1;\n await new Promise(r => setTimeout(r, tries * retryDelay));\n }\n\n if (error) throw error;\n\n throw new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`\n })\n );\n};\n\nexport let request: Requester = async call => {\n // try {\n return await requesterInternal(call);\n // } catch (e: any) {\n // Sentry.captureException(e);\n // throw e;\n // }\n};\n","import { proxy } from '@lowerdeck/proxy';\nimport { Requester } from './requester';\n\nexport interface ClientOpts {\n endpoint: string;\n headers?: Record<string, string | undefined>;\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>;\n onRequest?: (d: {\n endpoint: string;\n name: string;\n payload: any;\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }) => any;\n}\n\nlet noopWithContext = (cb: (ctx: any) => any) => cb({});\n\nexport let clientBuilder =\n (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>\n <T extends object>(clientOpts: ClientOpts) =>\n proxy<T>(\n async (\n path,\n data,\n requestOpts?: {\n headers?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }\n ) =>\n await withContext(async context => {\n let headers = {\n ...clientOpts.headers,\n ...(await clientOpts.getHeaders?.()),\n ...requestOpts?.headers\n };\n\n clientOpts.onRequest?.({\n endpoint: clientOpts.endpoint,\n name: path.join(':'),\n payload: data,\n headers,\n query: requestOpts?.query\n });\n\n if (path[path.length - 1] == 'getFull') {\n return await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.slice(0, -1).join(':'),\n headers,\n query: requestOpts?.query,\n context\n });\n }\n\n return (\n await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.join(':'),\n headers,\n query: requestOpts?.query,\n context\n })\n ).data;\n })\n );\n","import { request } from './request';\nimport { clientBuilder } from './shared/clientBuilder';\n\nexport let createClient = clientBuilder(request);\n"],"names":["index","rootId","memo","generatePlainId","isServer","window","_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","verbose","process","env","NODE_ENV","prototype","onFulfilled","result","this","callback","onRejected","e","_this","_isSettledPact","thenable","request","withContext","log","_console","console","apply","slice","call","arguments","calls","createClient","Promise","resolve","_temp4","_exit","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","name","replace","tries","header","headers","undefined","query","maxTries","retryDelay","_temp3","_for","_temp2","_result","r","setTimeout","_temp","key","canonicalize","to","current","promise","reject","push","clearTimeout","c","url","URL","search","URLSearchParams","toString","fetch","method","_extends","body","serialize","encode","map","x","payload","sort","a","b","localeCompare","credentials","keepalive","res","_decode","decode","json","_res$json","_ref","__typename","_ret","_step","_loop","callRes","find","err","status","data","fromResponse","_iterator","_createForOfIteratorHelperLoose","done","forEach","inner","Error","stack","performRequest","_await$performRequest","_catch","isServiceError","requesterInternal","cb","clientOpts","proxy","path","requestOpts","context","getHeaders","_clientOpts$getHeader","join","_request","onRequest","length","_await$request"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{canonicalize as e}from"@lowerdeck/canonicalize";import{ServiceError as n,internalServerError as r,isServiceError as t}from"@lowerdeck/error";import{serialize as o}from"@lowerdeck/serialize";import{generatePlainId as i}from"@lowerdeck/id";import{memo as a}from"@lowerdeck/memo";import{proxy as u}from"@lowerdeck/proxy";function c(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=Array(n);r<n;r++)t[r]=e[r];return t}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)({}).hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},l.apply(null,arguments)}var s=0,d=a(function(){return i(10)}),f="undefined"==typeof window;function v(e,n,r){if(!e.s){if(r instanceof m){if(!r.s)return void(r.o=v.bind(null,e,n));1&n&&(n=r.s),r=r.v}if(r&&r.then)return void r.then(v.bind(null,e,n),v.bind(null,e,2));e.s=n,e.v=r;var t=e.o;t&&t(e)}}var h="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,m=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(n,r){var t=new e,o=this.s;if(o){var i=1&o?n:r;if(i){try{v(t,1,i(this.v))}catch(e){v(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?v(t,1,n?n(o):o):r?v(t,1,r(o)):v(t,2,o)}catch(e){v(t,2,e)}},t},e}();function p(e){return e instanceof m&&1&e.s}var y,w,b=function(){var e;f||(e=console).log.apply(e,[].slice.call(arguments))},g={},j=(y=function(i){return Promise.resolve(function(i){try{var a,u=function(e){if(a)return e;if(j)throw j;throw new n(r({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+i.endpoint}))},y=function(){var e="call_"+d()+"_"+s;return s+=1,e}();b("[call:"+i.name.replace(":","-")+":"+y+"] Queued",i);var w=0,j=null;for(var P in i.headers)void 0===i.headers[P]&&delete i.headers[P];if(i.query)for(var q in i.query)void 0===i.query[q]&&delete i.query[q];var k="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,E=function(e,n,r){for(var t;;){var o=e();if(p(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=r();if(i&&i.then){if(!p(i)){t=1;break}i=i.s}}var a=new m,u=v.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(c):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,u):l(o):v(a,1,i)})).then(void 0,u),a;function c(n){i=n;do{if(!(o=e())||p(o)&&!o.v)return void v(a,1,i);if(o.then)return void o.then(l).then(void 0,u);p(i=r())&&(i=i.v)}while(!i||!i.then);i.then(c).then(void 0,u)}function l(e){e?(i=r())&&i.then?i.then(c).then(void 0,u):c(i):v(a,1,i)}}(function(){return!a&&w<k},0,function(){function u(e){return a?e:(w+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,w*S)})).then(function(){}))}var s=function(t,u){try{var s=Promise.resolve(function(t){var i=""+e(t.headers)+e(t.query)+t.endpoint;g[i]||(g[i]={calls:[],to:null});var a=g[i],u=new Promise(function(e,n){a.calls.push({call:t,resolve:e,reject:n})});return a.to&&clearTimeout(a.to),a.to=setTimeout(function(){var e=g[i].calls;g[i].calls=[],g[i].to=null;var a=new URL(t.endpoint);a.search=new URLSearchParams(t.query).toString(),fetch(a.toString(),{method:"POST",headers:l({"Content-Type":"application/rpc+json"},e[0].call.headers),body:o.encode({calls:e.map(function(e){return{id:e.call.id,name:e.call.name,payload:e.call.payload}}).sort(function(e,n){return e.name.localeCompare(n.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var n=o.decode;return Promise.resolve(e.json()).then(function(r){return{res:n.call(o,r),headers:e.headers}})}catch(e){return Promise.reject(e)}}).then(function(t){var o=t.res,i=t.headers;if("error"!=o.__typename){for(var a,u,l=function(){var e=u.value,t=o.calls.find(function(n){return n.id==e.call.id});if(!t){var a=new n(r({message:"Call not returned"}));return e.reject(a),{v:void 0}}t.status>=200&&t.status<300&&e.resolve({data:t.result,status:t.status,headers:i});var c=n.fromResponse(t.result);e.reject(c)},s=function(e){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,n){if(e){if("string"==typeof e)return c(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,n):void 0}}(e))){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(u=s()).done;)if(a=l())return a.v}else{var d=n.fromResponse(o);e.forEach(function(e){return e.reject(d)})}}).catch(function(o){h&&console.error(o),e.forEach(function(e){return e.reject(new n(r({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint,inner:h?o instanceof Error?{message:o.message,stack:o.stack}:{error:o}:void 0})))})})},f?0:10),u}(l({},i,{id:y})).then(function(e){return f||b("[call:"+i.name.replace(":","-")+":"+y+"] Success",e),e},function(e){throw f&&b("[call:"+i.name.replace(":","-")+":"+y+"] Queued",i),b("[call:"+i.name.replace(":","-")+":"+y+"] Error",e),e})).then(function(e){return a=1,e})}catch(e){return u(e)}return s&&s.then?s.then(void 0,u):s}(0,function(e){if(j=e,t(e)&&e.data.status<500)throw e});return s&&s.then?s.then(u):u(s)});return Promise.resolve(E&&E.then?E.then(u):u(E))}catch(e){return Promise.reject(e)}}(i))},void 0===w&&(w=function(e){return e({})}),function(e){return u(function(n,r,t){try{return Promise.resolve(w(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var a;function u(i){return a?i:Promise.resolve(y({endpoint:e.endpoint,payload:r,name:n.join(":"),headers:c,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var c=l({},e.headers,i,null==t?void 0:t.headers);null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:n.join(":"),payload:r,headers:c,query:null==t?void 0:t.query});var s=function(){if("getFull"==n[n.length-1])return Promise.resolve(y({endpoint:e.endpoint,payload:r,name:n.slice(0,-1).join(":"),headers:c,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return s&&s.then?s.then(u):u(s)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});export{j as createClient};
1
+ import{canonicalize as e}from"@lowerdeck/canonicalize";import{ServiceError as n,internalServerError as r,isServiceError as t}from"@lowerdeck/error";import{serialize as o}from"@lowerdeck/serialize";import{generatePlainId as i}from"@lowerdeck/id";import{memo as a}from"@lowerdeck/memo";import{proxy as u}from"@lowerdeck/proxy";function c(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=Array(n);r<n;r++)t[r]=e[r];return t}function l(){return l=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)({}).hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},l.apply(null,arguments)}var s=0,d=a(function(){return i(10)}),f="undefined"==typeof window;function v(e,n,r){if(!e.s){if(r instanceof m){if(!r.s)return void(r.o=v.bind(null,e,n));1&n&&(n=r.s),r=r.v}if(r&&r.then)return void r.then(v.bind(null,e,n),v.bind(null,e,2));e.s=n,e.v=r;var t=e.o;t&&t(e)}}var h="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,m=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(n,r){var t=new e,o=this.s;if(o){var i=1&o?n:r;if(i){try{v(t,1,i(this.v))}catch(e){v(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?v(t,1,n?n(o):o):r?v(t,1,r(o)):v(t,2,o)}catch(e){v(t,2,e)}},t},e}();function p(e){return e instanceof m&&1&e.s}var y,w,b=function(){var e;f||(e=console).log.apply(e,[].slice.call(arguments))},g={},j=(y=function(i){return Promise.resolve(function(i){try{var a,u=function(e){if(a)return e;if(j)throw j;throw new n(r({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+i.endpoint}))},y=function(){var e="call_"+d()+"_"+s;return s+=1,e}();b("[call:"+i.name.replace(":","-")+":"+y+"] Queued",i);var w=0,j=null;for(var P in i.headers)void 0===i.headers[P]&&delete i.headers[P];if(i.query)for(var q in i.query)void 0===i.query[q]&&delete i.query[q];var k="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,E=function(e,n,r){for(var t;;){var o=e();if(p(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=r();if(i&&i.then){if(!p(i)){t=1;break}i=i.s}}var a=new m,u=v.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(c):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,u):l(o):v(a,1,i)})).then(void 0,u),a;function c(n){i=n;do{if(!(o=e())||p(o)&&!o.v)return void v(a,1,i);if(o.then)return void o.then(l).then(void 0,u);p(i=r())&&(i=i.v)}while(!i||!i.then);i.then(c).then(void 0,u)}function l(e){e?(i=r())&&i.then?i.then(c).then(void 0,u):c(i):v(a,1,i)}}(function(){return!a&&w<k},0,function(){function u(e){return a?e:(w+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,w*S)})).then(function(){}))}var s=function(t,u){try{var s=Promise.resolve(function(t){var i=""+e(t.headers)+e(t.query)+t.endpoint;g[i]||(g[i]={calls:[],to:null});var a=g[i],u=new Promise(function(e,n){a.calls.push({call:t,resolve:e,reject:n})});return a.to&&clearTimeout(a.to),a.to=setTimeout(function(){var e=g[i].calls;g[i].calls=[],g[i].to=null;var a=new URL(t.endpoint);a.search=new URLSearchParams(t.query).toString(),fetch(a.toString(),{method:"POST",headers:l({"Content-Type":"application/rpc+json"},e[0].call.headers),body:o.encode({calls:e.map(function(e){return{id:e.call.id,name:e.call.name,payload:e.call.payload}}).sort(function(e,n){return e.name.localeCompare(n.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var n=o.decode;return Promise.resolve(e.json()).then(function(r){return{res:n.call(o,r),headers:e.headers}})}catch(e){return Promise.reject(e)}}).then(function(t){var o=t.res,i=t.headers;if("error"!=o.__typename){for(var a,u,l=function(){var e=u.value,t=o.calls.find(function(n){return n.id==e.call.id});if(!t){var a=new n(r({message:"Call not returned"}));return e.reject(a),{v:void 0}}if(t.status>=200&&t.status<300)return e.resolve({data:t.result,status:t.status,headers:i}),0;var c=n.fromResponse(t.result);e.reject(c)},s=function(e){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,n){if(e){if("string"==typeof e)return c(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,n):void 0}}(e))){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(u=s()).done;)if(0!==(a=l())&&a)return a.v}else{var d=n.fromResponse(o);e.forEach(function(e){return e.reject(d)})}}).catch(function(o){h&&console.error(o),e.forEach(function(e){return e.reject(new n(r({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint,inner:h?o instanceof Error?{message:o.message,stack:o.stack}:{error:o}:void 0})))})})},f?0:10),u}(l({},i,{id:y})).then(function(e){return f||b("[call:"+i.name.replace(":","-")+":"+y+"] Success",e),e},function(e){throw f&&b("[call:"+i.name.replace(":","-")+":"+y+"] Queued",i),b("[call:"+i.name.replace(":","-")+":"+y+"] Error",e),e})).then(function(e){return a=1,e})}catch(e){return u(e)}return s&&s.then?s.then(void 0,u):s}(0,function(e){if(j=e,t(e)&&e.data.status<500)throw e});return s&&s.then?s.then(u):u(s)});return Promise.resolve(E&&E.then?E.then(u):u(E))}catch(e){return Promise.reject(e)}}(i))},void 0===w&&(w=function(e){return e({})}),function(e){return u(function(n,r,t){try{return Promise.resolve(w(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var a;function u(i){return a?i:Promise.resolve(y({endpoint:e.endpoint,payload:r,name:n.join(":"),headers:c,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var c=l({},e.headers,i,null==t?void 0:t.headers);null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:n.join(":"),payload:r,headers:c,query:null==t?void 0:t.query});var s=function(){if("getFull"==n[n.length-1])return Promise.resolve(y({endpoint:e.endpoint,payload:r,name:n.slice(0,-1).join(":"),headers:c,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return s&&s.then?s.then(u):u(s)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});export{j as createClient};
2
2
  //# sourceMappingURL=index.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/shared/requester.ts","../src/request.ts","../src/shared/clientBuilder.ts","../src/index.ts"],"sourcesContent":["import { generatePlainId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\n\nlet index = 0;\nlet rootId = memo(() => generatePlainId(10));\n\nexport let generateRequestId = () => {\n let id = `call_${rootId()}_${index}`;\n index += 1;\n return id;\n};\n\nexport interface Call {\n id: string;\n name: string;\n payload: any;\n endpoint: string;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}\n\nexport type Requester = (\n call: Omit<Call, 'id' | 'headers' | 'query'> & {\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n context: any;\n }\n) => Promise<{\n data: any;\n status: number;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}>;\n","import { canonicalize } from '@lowerdeck/canonicalize';\nimport { internalServerError, isServiceError, ServiceError } from '@lowerdeck/error';\nimport { serialize } from '@lowerdeck/serialize';\nimport { Call, generateRequestId, Requester } from './shared/requester';\n\n// @ts-ignore\nlet isServer = typeof window === 'undefined';\n\nlet verbose =\n typeof window != 'undefined' ||\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production');\n\nlet log = (...args: any[]) => {\n if (!isServer) console.log(...args);\n};\n\nlet calls: {\n [key: string]: {\n calls: {\n call: Call;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }[];\n to: any;\n };\n} = {};\n\nlet performRequest = (call: Call) => {\n let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`;\n\n if (!calls[key]) calls[key] = { calls: [], to: null };\n let current = calls[key];\n\n let promise = new Promise((resolve, reject) => {\n current.calls.push({ call, resolve, reject });\n });\n\n if (current.to) clearTimeout(current.to);\n\n current.to = setTimeout(\n () => {\n let c = calls[key].calls;\n calls[key].calls = [];\n calls[key].to = null;\n\n let url = new URL(call.endpoint);\n url.search = new URLSearchParams(call.query).toString();\n\n fetch(url.toString(), {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/rpc+json',\n ...c[0].call.headers\n },\n body: serialize.encode({\n calls: c\n .map(x => ({\n id: x.call.id,\n name: x.call.name,\n payload: x.call.payload\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n }),\n credentials: 'include',\n\n // @ts-ignore\n keepalive: false\n })\n .then(async res => ({\n res: serialize.decode(\n (await res.json()) as {\n calls: {\n id: string;\n status: number;\n result: any;\n }[];\n }\n ),\n\n headers: res.headers\n }))\n .then(({ res, headers }) => {\n if (res.__typename == 'error') {\n let err = ServiceError.fromResponse(res);\n c.forEach(x => x.reject(err));\n return;\n }\n\n for (let call of c) {\n let callRes = res.calls.find((x: any) => x.id == call.call.id);\n if (!callRes) {\n let err = new ServiceError(\n internalServerError({ message: 'Call not returned' })\n );\n call.reject(err);\n return;\n }\n\n if (callRes.status >= 200 && callRes.status < 300) {\n call.resolve({\n // data: O;\n // status: number;\n // headers: Record<string, string>;\n\n data: callRes.result,\n status: callRes.status,\n headers\n });\n }\n\n let err = ServiceError.fromResponse(callRes.result);\n call.reject(err);\n }\n })\n .catch(e => {\n if (verbose) {\n console.error(e);\n }\n\n c.forEach(x =>\n x.reject(\n new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`,\n\n inner: verbose\n ? e instanceof Error\n ? { message: e.message, stack: e.stack }\n : { error: e }\n : undefined\n })\n )\n )\n );\n });\n },\n isServer ? 0 : 10\n );\n\n return promise;\n};\n\nlet requesterInternal: Requester = async call => {\n let id = generateRequestId();\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n\n let tries = 0;\n let error: Error | null = null;\n\n for (let header in call.headers) {\n if (call.headers[header] === undefined) delete call.headers[header];\n }\n\n if (call.query) {\n for (let query in call.query) {\n if (call.query[query] === undefined) delete call.query[query];\n }\n }\n\n let maxTries = typeof window === 'undefined' ? 6 : 3;\n let retryDelay = typeof window === 'undefined' ? 20 : 1000;\n\n while (tries < maxTries) {\n try {\n return (await performRequest({\n ...(call as any),\n id\n }).then(\n res => {\n if (!isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Success`, res);\n }\n\n return res;\n },\n err => {\n if (isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n }\n\n log(`[call:${call.name.replace(':', '-')}:${id}] Error`, err);\n\n throw err;\n }\n )) as any;\n } catch (e: any) {\n error = e;\n\n if (isServiceError(e)) {\n // 400 errors are not retried\n if (e.data.status < 500) throw e;\n }\n }\n\n tries += 1;\n await new Promise(r => setTimeout(r, tries * retryDelay));\n }\n\n if (error) throw error;\n\n throw new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`\n })\n );\n};\n\nexport let request: Requester = async call => {\n // try {\n return await requesterInternal(call);\n // } catch (e: any) {\n // Sentry.captureException(e);\n // throw e;\n // }\n};\n","import { proxy } from '@lowerdeck/proxy';\nimport { Requester } from './requester';\n\nexport interface ClientOpts {\n endpoint: string;\n headers?: Record<string, string | undefined>;\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>;\n onRequest?: (d: {\n endpoint: string;\n name: string;\n payload: any;\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }) => any;\n}\n\nlet noopWithContext = (cb: (ctx: any) => any) => cb({});\n\nexport let clientBuilder =\n (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>\n <T extends object>(clientOpts: ClientOpts) =>\n proxy<T>(\n async (\n path,\n data,\n requestOpts?: {\n headers?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }\n ) =>\n await withContext(async context => {\n let headers = {\n ...clientOpts.headers,\n ...(await clientOpts.getHeaders?.()),\n ...requestOpts?.headers\n };\n\n clientOpts.onRequest?.({\n endpoint: clientOpts.endpoint,\n name: path.join(':'),\n payload: data,\n headers,\n query: requestOpts?.query\n });\n\n if (path[path.length - 1] == 'getFull') {\n return await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.slice(0, -1).join(':'),\n headers,\n query: requestOpts?.query,\n context\n });\n }\n\n return (\n await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.join(':'),\n headers,\n query: requestOpts?.query,\n context\n })\n ).data;\n })\n );\n","import { request } from './request';\nimport { clientBuilder } from './shared/clientBuilder';\n\nexport let createClient = clientBuilder(request);\n"],"names":["index","rootId","memo","generatePlainId","isServer","window","_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","verbose","process","env","NODE_ENV","prototype","onFulfilled","result","this","callback","onRejected","e","_this","_isSettledPact","thenable","request","withContext","log","_console","console","apply","slice","call","arguments","calls","createClient","Promise","resolve","_exit","_temp4","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","name","replace","tries","header","headers","undefined","query","maxTries","retryDelay","_temp3","_for","_temp2","_result","r","setTimeout","_temp","key","canonicalize","to","current","promise","reject","push","clearTimeout","c","url","URL","search","URLSearchParams","toString","fetch","method","_extends","body","serialize","encode","map","x","payload","sort","a","b","localeCompare","credentials","keepalive","res","_decode","decode","json","_res$json","_ref","__typename","_ret","_step","_loop","callRes","find","err","status","data","fromResponse","_iterator","_createForOfIteratorHelperLoose","done","forEach","inner","Error","stack","performRequest","_await$performRequest","_catch","isServiceError","requesterInternal","cb","clientOpts","proxy","path","requestOpts","context","getHeaders","_clientOpts$getHeader","join","_request","onRequest","length","_await$request"],"mappings":"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"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/shared/requester.ts","../src/request.ts","../src/shared/clientBuilder.ts","../src/index.ts"],"sourcesContent":["import { generatePlainId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\n\nlet index = 0;\nlet rootId = memo(() => generatePlainId(10));\n\nexport let generateRequestId = () => {\n let id = `call_${rootId()}_${index}`;\n index += 1;\n return id;\n};\n\nexport interface Call {\n id: string;\n name: string;\n payload: any;\n endpoint: string;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}\n\nexport type Requester = (\n call: Omit<Call, 'id' | 'headers' | 'query'> & {\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n context: any;\n }\n) => Promise<{\n data: any;\n status: number;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}>;\n","import { canonicalize } from '@lowerdeck/canonicalize';\nimport { internalServerError, isServiceError, ServiceError } from '@lowerdeck/error';\nimport { serialize } from '@lowerdeck/serialize';\nimport { Call, generateRequestId, Requester } from './shared/requester';\n\n// @ts-ignore\nlet isServer = typeof window === 'undefined';\n\nlet verbose =\n typeof window != 'undefined' ||\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production');\n\nlet log = (...args: any[]) => {\n if (!isServer) console.log(...args);\n};\n\nlet calls: {\n [key: string]: {\n calls: {\n call: Call;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }[];\n to: any;\n };\n} = {};\n\nlet performRequest = (call: Call) => {\n let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`;\n\n if (!calls[key]) calls[key] = { calls: [], to: null };\n let current = calls[key];\n\n let promise = new Promise((resolve, reject) => {\n current.calls.push({ call, resolve, reject });\n });\n\n if (current.to) clearTimeout(current.to);\n\n current.to = setTimeout(\n () => {\n let c = calls[key].calls;\n calls[key].calls = [];\n calls[key].to = null;\n\n let url = new URL(call.endpoint);\n url.search = new URLSearchParams(call.query).toString();\n\n fetch(url.toString(), {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/rpc+json',\n ...c[0].call.headers\n },\n body: serialize.encode({\n calls: c\n .map(x => ({\n id: x.call.id,\n name: x.call.name,\n payload: x.call.payload\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n }),\n credentials: 'include',\n\n // @ts-ignore\n keepalive: false\n })\n .then(async res => ({\n res: serialize.decode(\n (await res.json()) as {\n calls: {\n id: string;\n status: number;\n result: any;\n }[];\n }\n ),\n\n headers: res.headers\n }))\n .then(({ res, headers }) => {\n if (res.__typename == 'error') {\n let err = ServiceError.fromResponse(res);\n c.forEach(x => x.reject(err));\n return;\n }\n\n for (let call of c) {\n let callRes = res.calls.find((x: any) => x.id == call.call.id);\n if (!callRes) {\n let err = new ServiceError(\n internalServerError({ message: 'Call not returned' })\n );\n call.reject(err);\n return;\n }\n\n if (callRes.status >= 200 && callRes.status < 300) {\n call.resolve({\n // data: O;\n // status: number;\n // headers: Record<string, string>;\n\n data: callRes.result,\n status: callRes.status,\n headers\n });\n continue;\n }\n\n let err = ServiceError.fromResponse(callRes.result);\n call.reject(err);\n }\n })\n .catch(e => {\n if (verbose) {\n console.error(e);\n }\n\n c.forEach(x =>\n x.reject(\n new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`,\n\n inner: verbose\n ? e instanceof Error\n ? { message: e.message, stack: e.stack }\n : { error: e }\n : undefined\n })\n )\n )\n );\n });\n },\n isServer ? 0 : 10\n );\n\n return promise;\n};\n\nlet requesterInternal: Requester = async call => {\n let id = generateRequestId();\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n\n let tries = 0;\n let error: Error | null = null;\n\n for (let header in call.headers) {\n if (call.headers[header] === undefined) delete call.headers[header];\n }\n\n if (call.query) {\n for (let query in call.query) {\n if (call.query[query] === undefined) delete call.query[query];\n }\n }\n\n let maxTries = typeof window === 'undefined' ? 6 : 3;\n let retryDelay = typeof window === 'undefined' ? 20 : 1000;\n\n while (tries < maxTries) {\n try {\n return (await performRequest({\n ...(call as any),\n id\n }).then(\n res => {\n if (!isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Success`, res);\n }\n\n return res;\n },\n err => {\n if (isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n }\n\n log(`[call:${call.name.replace(':', '-')}:${id}] Error`, err);\n\n throw err;\n }\n )) as any;\n } catch (e: any) {\n error = e;\n\n if (isServiceError(e)) {\n // 400 errors are not retried\n if (e.data.status < 500) throw e;\n }\n }\n\n tries += 1;\n await new Promise(r => setTimeout(r, tries * retryDelay));\n }\n\n if (error) throw error;\n\n throw new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`\n })\n );\n};\n\nexport let request: Requester = async call => {\n // try {\n return await requesterInternal(call);\n // } catch (e: any) {\n // Sentry.captureException(e);\n // throw e;\n // }\n};\n","import { proxy } from '@lowerdeck/proxy';\nimport { Requester } from './requester';\n\nexport interface ClientOpts {\n endpoint: string;\n headers?: Record<string, string | undefined>;\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>;\n onRequest?: (d: {\n endpoint: string;\n name: string;\n payload: any;\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }) => any;\n}\n\nlet noopWithContext = (cb: (ctx: any) => any) => cb({});\n\nexport let clientBuilder =\n (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>\n <T extends object>(clientOpts: ClientOpts) =>\n proxy<T>(\n async (\n path,\n data,\n requestOpts?: {\n headers?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }\n ) =>\n await withContext(async context => {\n let headers = {\n ...clientOpts.headers,\n ...(await clientOpts.getHeaders?.()),\n ...requestOpts?.headers\n };\n\n clientOpts.onRequest?.({\n endpoint: clientOpts.endpoint,\n name: path.join(':'),\n payload: data,\n headers,\n query: requestOpts?.query\n });\n\n if (path[path.length - 1] == 'getFull') {\n return await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.slice(0, -1).join(':'),\n headers,\n query: requestOpts?.query,\n context\n });\n }\n\n return (\n await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.join(':'),\n headers,\n query: requestOpts?.query,\n context\n })\n ).data;\n })\n );\n","import { request } from './request';\nimport { clientBuilder } from './shared/clientBuilder';\n\nexport let createClient = clientBuilder(request);\n"],"names":["index","rootId","memo","generatePlainId","isServer","window","_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","verbose","process","env","NODE_ENV","prototype","onFulfilled","result","this","callback","onRejected","e","_this","_isSettledPact","thenable","request","withContext","log","_console","console","apply","slice","call","arguments","calls","createClient","Promise","resolve","_temp4","_exit","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","name","replace","tries","header","headers","undefined","query","maxTries","retryDelay","_temp3","_for","_temp2","_result","r","setTimeout","_temp","key","canonicalize","to","current","promise","reject","push","clearTimeout","c","url","URL","search","URLSearchParams","toString","fetch","method","_extends","body","serialize","encode","map","x","payload","sort","a","b","localeCompare","credentials","keepalive","res","_decode","decode","json","_res$json","_ref","__typename","_ret","_step","_loop","callRes","find","err","status","data","fromResponse","_iterator","_createForOfIteratorHelperLoose","done","forEach","inner","Error","stack","performRequest","_await$performRequest","_catch","isServiceError","requesterInternal","cb","clientOpts","proxy","path","requestOpts","context","getHeaders","_clientOpts$getHeader","join","_request","onRequest","length","_await$request"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@lowerdeck/canonicalize"),require("@lowerdeck/error"),require("@lowerdeck/serialize"),require("@lowerdeck/id"),require("@lowerdeck/memo"),require("@lowerdeck/proxy")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/canonicalize","@lowerdeck/error","@lowerdeck/serialize","@lowerdeck/id","@lowerdeck/memo","@lowerdeck/proxy"],r):r((e||self).rpcClient={},e.canonicalize,e.error,e.serialize,e.id,e.memo,e.proxy)}(this,function(e,r,n,t,o,i,a){function u(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},c.apply(null,arguments)}var l=0,s=i.memo(function(){return o.generatePlainId(10)}),d="undefined"==typeof window;function f(e,r,n){if(!e.s){if(n instanceof h){if(!n.s)return void(n.o=f.bind(null,e,r));1&r&&(r=n.s),n=n.v}if(n&&n.then)return void n.then(f.bind(null,e,r),f.bind(null,e,2));e.s=r,e.v=n;var t=e.o;t&&t(e)}}var v="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,h=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,n){var t=new e,o=this.s;if(o){var i=1&o?r:n;if(i){try{f(t,1,i(this.v))}catch(e){f(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?f(t,1,r?r(o):o):n?f(t,1,n(o)):f(t,2,o)}catch(e){f(t,2,e)}},t},e}();function p(e){return e instanceof h&&1&e.s}var m,y,w=function(){var e;d||(e=console).log.apply(e,[].slice.call(arguments))},b={},g=(m=function(e){return Promise.resolve(function(e){try{var o,i=function(r){if(o)return r;if(y)throw y;throw new n.ServiceError(n.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+e.endpoint}))},a=function(){var e="call_"+s()+"_"+l;return l+=1,e}();w("[call:"+e.name.replace(":","-")+":"+a+"] Queued",e);var m=0,y=null;for(var g in e.headers)void 0===e.headers[g]&&delete e.headers[g];if(e.query)for(var q in e.query)void 0===e.query[q]&&delete e.query[q];var j="undefined"==typeof window?6:3,P="undefined"==typeof window?20:1e3,S=function(e,r,n){for(var t;;){var o=e();if(p(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=n();if(i&&i.then){if(!p(i)){t=1;break}i=i.s}}var a=new h,u=f.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(c):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,u):l(o):f(a,1,i)})).then(void 0,u),a;function c(r){i=r;do{if(!(o=e())||p(o)&&!o.v)return void f(a,1,i);if(o.then)return void o.then(l).then(void 0,u);p(i=n())&&(i=i.v)}while(!i||!i.then);i.then(c).then(void 0,u)}function l(e){e?(i=n())&&i.then?i.then(c).then(void 0,u):c(i):f(a,1,i)}}(function(){return!o&&m<j},0,function(){function i(e){return o?e:(m+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,m*P)})).then(function(){}))}var l=function(i,l){try{var s=Promise.resolve(function(e){var o=""+r.canonicalize(e.headers)+r.canonicalize(e.query)+e.endpoint;b[o]||(b[o]={calls:[],to:null});var i=b[o],a=new Promise(function(r,n){i.calls.push({call:e,resolve:r,reject:n})});return i.to&&clearTimeout(i.to),i.to=setTimeout(function(){var r=b[o].calls;b[o].calls=[],b[o].to=null;var i=new URL(e.endpoint);i.search=new URLSearchParams(e.query).toString(),fetch(i.toString(),{method:"POST",headers:c({"Content-Type":"application/rpc+json"},r[0].call.headers),body:t.serialize.encode({calls:r.map(function(e){return{id:e.call.id,name:e.call.name,payload:e.call.payload}}).sort(function(e,r){return e.name.localeCompare(r.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var r=t.serialize.decode;return Promise.resolve(e.json()).then(function(n){return{res:r.call(t.serialize,n),headers:e.headers}})}catch(e){return Promise.reject(e)}}).then(function(e){var t=e.res,o=e.headers;if("error"!=t.__typename){for(var i,a,c=function(){var e=a.value,r=t.calls.find(function(r){return r.id==e.call.id});if(!r){var i=new n.ServiceError(n.internalServerError({message:"Call not returned"}));return e.reject(i),{v:void 0}}r.status>=200&&r.status<300&&e.resolve({data:r.result,status:r.status,headers:o});var u=n.ServiceError.fromResponse(r.result);e.reject(u)},l=function(e){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,r){if(e){if("string"==typeof e)return u(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,r):void 0}}(e))){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(r);!(a=l()).done;)if(i=c())return i.v}else{var s=n.ServiceError.fromResponse(t);r.forEach(function(e){return e.reject(s)})}}).catch(function(t){v&&console.error(t),r.forEach(function(r){return r.reject(new n.ServiceError(n.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+e.endpoint,inner:v?t instanceof Error?{message:t.message,stack:t.stack}:{error:t}:void 0})))})})},d?0:10),a}(c({},e,{id:a})).then(function(r){return d||w("[call:"+e.name.replace(":","-")+":"+a+"] Success",r),r},function(r){throw d&&w("[call:"+e.name.replace(":","-")+":"+a+"] Queued",e),w("[call:"+e.name.replace(":","-")+":"+a+"] Error",r),r})).then(function(e){return o=1,e})}catch(e){return l(e)}return s&&s.then?s.then(void 0,l):s}(0,function(e){if(y=e,n.isServiceError(e)&&e.data.status<500)throw e});return l&&l.then?l.then(i):i(l)});return Promise.resolve(S&&S.then?S.then(i):i(S))}catch(e){return Promise.reject(e)}}(e))},void 0===y&&(y=function(e){return e({})}),function(e){return a.proxy(function(r,n,t){try{return Promise.resolve(y(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var a;function u(i){return a?i:Promise.resolve(m({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var l=c({},e.headers,i,null==t?void 0:t.headers);null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:l,query:null==t?void 0:t.query});var s=function(){if("getFull"==r[r.length-1])return Promise.resolve(m({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return s&&s.then?s.then(u):u(s)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});e.createClient=g});
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@lowerdeck/canonicalize"),require("@lowerdeck/error"),require("@lowerdeck/serialize"),require("@lowerdeck/id"),require("@lowerdeck/memo"),require("@lowerdeck/proxy")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/canonicalize","@lowerdeck/error","@lowerdeck/serialize","@lowerdeck/id","@lowerdeck/memo","@lowerdeck/proxy"],r):r((e||self).rpcClient={},e.canonicalize,e.error,e.serialize,e.id,e.memo,e.proxy)}(this,function(e,r,n,t,o,i,a){function u(e,r){(null==r||r>e.length)&&(r=e.length);for(var n=0,t=Array(r);n<r;n++)t[n]=e[n];return t}function c(){return c=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var n=arguments[r];for(var t in n)({}).hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},c.apply(null,arguments)}var l=0,s=i.memo(function(){return o.generatePlainId(10)}),d="undefined"==typeof window;function f(e,r,n){if(!e.s){if(n instanceof h){if(!n.s)return void(n.o=f.bind(null,e,r));1&r&&(r=n.s),n=n.v}if(n&&n.then)return void n.then(f.bind(null,e,r),f.bind(null,e,2));e.s=r,e.v=n;var t=e.o;t&&t(e)}}var v="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,h=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,n){var t=new e,o=this.s;if(o){var i=1&o?r:n;if(i){try{f(t,1,i(this.v))}catch(e){f(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?f(t,1,r?r(o):o):n?f(t,1,n(o)):f(t,2,o)}catch(e){f(t,2,e)}},t},e}();function p(e){return e instanceof h&&1&e.s}var m,y,w=function(){var e;d||(e=console).log.apply(e,[].slice.call(arguments))},b={},g=(m=function(e){return Promise.resolve(function(e){try{var o,i=function(r){if(o)return r;if(y)throw y;throw new n.ServiceError(n.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+e.endpoint}))},a=function(){var e="call_"+s()+"_"+l;return l+=1,e}();w("[call:"+e.name.replace(":","-")+":"+a+"] Queued",e);var m=0,y=null;for(var g in e.headers)void 0===e.headers[g]&&delete e.headers[g];if(e.query)for(var q in e.query)void 0===e.query[q]&&delete e.query[q];var j="undefined"==typeof window?6:3,P="undefined"==typeof window?20:1e3,S=function(e,r,n){for(var t;;){var o=e();if(p(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=n();if(i&&i.then){if(!p(i)){t=1;break}i=i.s}}var a=new h,u=f.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(c):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,u):l(o):f(a,1,i)})).then(void 0,u),a;function c(r){i=r;do{if(!(o=e())||p(o)&&!o.v)return void f(a,1,i);if(o.then)return void o.then(l).then(void 0,u);p(i=n())&&(i=i.v)}while(!i||!i.then);i.then(c).then(void 0,u)}function l(e){e?(i=n())&&i.then?i.then(c).then(void 0,u):c(i):f(a,1,i)}}(function(){return!o&&m<j},0,function(){function i(e){return o?e:(m+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,m*P)})).then(function(){}))}var l=function(i,l){try{var s=Promise.resolve(function(e){var o=""+r.canonicalize(e.headers)+r.canonicalize(e.query)+e.endpoint;b[o]||(b[o]={calls:[],to:null});var i=b[o],a=new Promise(function(r,n){i.calls.push({call:e,resolve:r,reject:n})});return i.to&&clearTimeout(i.to),i.to=setTimeout(function(){var r=b[o].calls;b[o].calls=[],b[o].to=null;var i=new URL(e.endpoint);i.search=new URLSearchParams(e.query).toString(),fetch(i.toString(),{method:"POST",headers:c({"Content-Type":"application/rpc+json"},r[0].call.headers),body:t.serialize.encode({calls:r.map(function(e){return{id:e.call.id,name:e.call.name,payload:e.call.payload}}).sort(function(e,r){return e.name.localeCompare(r.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var r=t.serialize.decode;return Promise.resolve(e.json()).then(function(n){return{res:r.call(t.serialize,n),headers:e.headers}})}catch(e){return Promise.reject(e)}}).then(function(e){var t=e.res,o=e.headers;if("error"!=t.__typename){for(var i,a,c=function(){var e=a.value,r=t.calls.find(function(r){return r.id==e.call.id});if(!r){var i=new n.ServiceError(n.internalServerError({message:"Call not returned"}));return e.reject(i),{v:void 0}}if(r.status>=200&&r.status<300)return e.resolve({data:r.result,status:r.status,headers:o}),0;var u=n.ServiceError.fromResponse(r.result);e.reject(u)},l=function(e){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,r){if(e){if("string"==typeof e)return u(e,r);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,r):void 0}}(e))){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(r);!(a=l()).done;)if(0!==(i=c())&&i)return i.v}else{var s=n.ServiceError.fromResponse(t);r.forEach(function(e){return e.reject(s)})}}).catch(function(t){v&&console.error(t),r.forEach(function(r){return r.reject(new n.ServiceError(n.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+e.endpoint,inner:v?t instanceof Error?{message:t.message,stack:t.stack}:{error:t}:void 0})))})})},d?0:10),a}(c({},e,{id:a})).then(function(r){return d||w("[call:"+e.name.replace(":","-")+":"+a+"] Success",r),r},function(r){throw d&&w("[call:"+e.name.replace(":","-")+":"+a+"] Queued",e),w("[call:"+e.name.replace(":","-")+":"+a+"] Error",r),r})).then(function(e){return o=1,e})}catch(e){return l(e)}return s&&s.then?s.then(void 0,l):s}(0,function(e){if(y=e,n.isServiceError(e)&&e.data.status<500)throw e});return l&&l.then?l.then(i):i(l)});return Promise.resolve(S&&S.then?S.then(i):i(S))}catch(e){return Promise.reject(e)}}(e))},void 0===y&&(y=function(e){return e({})}),function(e){return a.proxy(function(r,n,t){try{return Promise.resolve(y(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var a;function u(i){return a?i:Promise.resolve(m({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var l=c({},e.headers,i,null==t?void 0:t.headers);null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:l,query:null==t?void 0:t.query});var s=function(){if("getFull"==r[r.length-1])return Promise.resolve(m({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:l,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return s&&s.then?s.then(u):u(s)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});e.createClient=g});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/shared/requester.ts","../src/request.ts","../src/shared/clientBuilder.ts","../src/index.ts"],"sourcesContent":["import { generatePlainId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\n\nlet index = 0;\nlet rootId = memo(() => generatePlainId(10));\n\nexport let generateRequestId = () => {\n let id = `call_${rootId()}_${index}`;\n index += 1;\n return id;\n};\n\nexport interface Call {\n id: string;\n name: string;\n payload: any;\n endpoint: string;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}\n\nexport type Requester = (\n call: Omit<Call, 'id' | 'headers' | 'query'> & {\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n context: any;\n }\n) => Promise<{\n data: any;\n status: number;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}>;\n","import { canonicalize } from '@lowerdeck/canonicalize';\nimport { internalServerError, isServiceError, ServiceError } from '@lowerdeck/error';\nimport { serialize } from '@lowerdeck/serialize';\nimport { Call, generateRequestId, Requester } from './shared/requester';\n\n// @ts-ignore\nlet isServer = typeof window === 'undefined';\n\nlet verbose =\n typeof window != 'undefined' ||\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production');\n\nlet log = (...args: any[]) => {\n if (!isServer) console.log(...args);\n};\n\nlet calls: {\n [key: string]: {\n calls: {\n call: Call;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }[];\n to: any;\n };\n} = {};\n\nlet performRequest = (call: Call) => {\n let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`;\n\n if (!calls[key]) calls[key] = { calls: [], to: null };\n let current = calls[key];\n\n let promise = new Promise((resolve, reject) => {\n current.calls.push({ call, resolve, reject });\n });\n\n if (current.to) clearTimeout(current.to);\n\n current.to = setTimeout(\n () => {\n let c = calls[key].calls;\n calls[key].calls = [];\n calls[key].to = null;\n\n let url = new URL(call.endpoint);\n url.search = new URLSearchParams(call.query).toString();\n\n fetch(url.toString(), {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/rpc+json',\n ...c[0].call.headers\n },\n body: serialize.encode({\n calls: c\n .map(x => ({\n id: x.call.id,\n name: x.call.name,\n payload: x.call.payload\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n }),\n credentials: 'include',\n\n // @ts-ignore\n keepalive: false\n })\n .then(async res => ({\n res: serialize.decode(\n (await res.json()) as {\n calls: {\n id: string;\n status: number;\n result: any;\n }[];\n }\n ),\n\n headers: res.headers\n }))\n .then(({ res, headers }) => {\n if (res.__typename == 'error') {\n let err = ServiceError.fromResponse(res);\n c.forEach(x => x.reject(err));\n return;\n }\n\n for (let call of c) {\n let callRes = res.calls.find((x: any) => x.id == call.call.id);\n if (!callRes) {\n let err = new ServiceError(\n internalServerError({ message: 'Call not returned' })\n );\n call.reject(err);\n return;\n }\n\n if (callRes.status >= 200 && callRes.status < 300) {\n call.resolve({\n // data: O;\n // status: number;\n // headers: Record<string, string>;\n\n data: callRes.result,\n status: callRes.status,\n headers\n });\n }\n\n let err = ServiceError.fromResponse(callRes.result);\n call.reject(err);\n }\n })\n .catch(e => {\n if (verbose) {\n console.error(e);\n }\n\n c.forEach(x =>\n x.reject(\n new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`,\n\n inner: verbose\n ? e instanceof Error\n ? { message: e.message, stack: e.stack }\n : { error: e }\n : undefined\n })\n )\n )\n );\n });\n },\n isServer ? 0 : 10\n );\n\n return promise;\n};\n\nlet requesterInternal: Requester = async call => {\n let id = generateRequestId();\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n\n let tries = 0;\n let error: Error | null = null;\n\n for (let header in call.headers) {\n if (call.headers[header] === undefined) delete call.headers[header];\n }\n\n if (call.query) {\n for (let query in call.query) {\n if (call.query[query] === undefined) delete call.query[query];\n }\n }\n\n let maxTries = typeof window === 'undefined' ? 6 : 3;\n let retryDelay = typeof window === 'undefined' ? 20 : 1000;\n\n while (tries < maxTries) {\n try {\n return (await performRequest({\n ...(call as any),\n id\n }).then(\n res => {\n if (!isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Success`, res);\n }\n\n return res;\n },\n err => {\n if (isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n }\n\n log(`[call:${call.name.replace(':', '-')}:${id}] Error`, err);\n\n throw err;\n }\n )) as any;\n } catch (e: any) {\n error = e;\n\n if (isServiceError(e)) {\n // 400 errors are not retried\n if (e.data.status < 500) throw e;\n }\n }\n\n tries += 1;\n await new Promise(r => setTimeout(r, tries * retryDelay));\n }\n\n if (error) throw error;\n\n throw new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`\n })\n );\n};\n\nexport let request: Requester = async call => {\n // try {\n return await requesterInternal(call);\n // } catch (e: any) {\n // Sentry.captureException(e);\n // throw e;\n // }\n};\n","import { proxy } from '@lowerdeck/proxy';\nimport { Requester } from './requester';\n\nexport interface ClientOpts {\n endpoint: string;\n headers?: Record<string, string | undefined>;\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>;\n onRequest?: (d: {\n endpoint: string;\n name: string;\n payload: any;\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }) => any;\n}\n\nlet noopWithContext = (cb: (ctx: any) => any) => cb({});\n\nexport let clientBuilder =\n (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>\n <T extends object>(clientOpts: ClientOpts) =>\n proxy<T>(\n async (\n path,\n data,\n requestOpts?: {\n headers?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }\n ) =>\n await withContext(async context => {\n let headers = {\n ...clientOpts.headers,\n ...(await clientOpts.getHeaders?.()),\n ...requestOpts?.headers\n };\n\n clientOpts.onRequest?.({\n endpoint: clientOpts.endpoint,\n name: path.join(':'),\n payload: data,\n headers,\n query: requestOpts?.query\n });\n\n if (path[path.length - 1] == 'getFull') {\n return await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.slice(0, -1).join(':'),\n headers,\n query: requestOpts?.query,\n context\n });\n }\n\n return (\n await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.join(':'),\n headers,\n query: requestOpts?.query,\n context\n })\n ).data;\n })\n );\n","import { request } from './request';\nimport { clientBuilder } from './shared/clientBuilder';\n\nexport let createClient = clientBuilder(request);\n"],"names":["index","rootId","memo","generatePlainId","isServer","window","_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","verbose","process","env","NODE_ENV","prototype","onFulfilled","result","this","callback","onRejected","e","_this","_isSettledPact","thenable","request","withContext","log","_console","console","apply","slice","call","arguments","calls","createClient","Promise","resolve","_exit","_temp4","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","name","replace","tries","header","headers","undefined","query","maxTries","retryDelay","_temp3","_for","_temp2","_result","r","setTimeout","_temp","key","canonicalize","to","current","promise","reject","push","clearTimeout","c","url","URL","search","URLSearchParams","toString","fetch","method","_extends","body","serialize","encode","map","x","payload","sort","a","b","localeCompare","credentials","keepalive","res","_decode","decode","json","_res$json","_ref","__typename","_ret","_step","_loop","callRes","find","err","status","data","fromResponse","_iterator","_createForOfIteratorHelperLoose","done","forEach","inner","Error","stack","performRequest","_await$performRequest","_catch","isServiceError","requesterInternal","cb","clientOpts","proxy","path","requestOpts","context","getHeaders","_clientOpts$getHeader","join","_request","onRequest","length","_await$request"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/shared/requester.ts","../src/request.ts","../src/shared/clientBuilder.ts","../src/index.ts"],"sourcesContent":["import { generatePlainId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\n\nlet index = 0;\nlet rootId = memo(() => generatePlainId(10));\n\nexport let generateRequestId = () => {\n let id = `call_${rootId()}_${index}`;\n index += 1;\n return id;\n};\n\nexport interface Call {\n id: string;\n name: string;\n payload: any;\n endpoint: string;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}\n\nexport type Requester = (\n call: Omit<Call, 'id' | 'headers' | 'query'> & {\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n context: any;\n }\n) => Promise<{\n data: any;\n status: number;\n headers: Record<string, string>;\n query?: Record<string, string>;\n}>;\n","import { canonicalize } from '@lowerdeck/canonicalize';\nimport { internalServerError, isServiceError, ServiceError } from '@lowerdeck/error';\nimport { serialize } from '@lowerdeck/serialize';\nimport { Call, generateRequestId, Requester } from './shared/requester';\n\n// @ts-ignore\nlet isServer = typeof window === 'undefined';\n\nlet verbose =\n typeof window != 'undefined' ||\n (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production');\n\nlet log = (...args: any[]) => {\n if (!isServer) console.log(...args);\n};\n\nlet calls: {\n [key: string]: {\n calls: {\n call: Call;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }[];\n to: any;\n };\n} = {};\n\nlet performRequest = (call: Call) => {\n let key = `${canonicalize(call.headers)}${canonicalize(call.query)}${call.endpoint}`;\n\n if (!calls[key]) calls[key] = { calls: [], to: null };\n let current = calls[key];\n\n let promise = new Promise((resolve, reject) => {\n current.calls.push({ call, resolve, reject });\n });\n\n if (current.to) clearTimeout(current.to);\n\n current.to = setTimeout(\n () => {\n let c = calls[key].calls;\n calls[key].calls = [];\n calls[key].to = null;\n\n let url = new URL(call.endpoint);\n url.search = new URLSearchParams(call.query).toString();\n\n fetch(url.toString(), {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/rpc+json',\n ...c[0].call.headers\n },\n body: serialize.encode({\n calls: c\n .map(x => ({\n id: x.call.id,\n name: x.call.name,\n payload: x.call.payload\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n }),\n credentials: 'include',\n\n // @ts-ignore\n keepalive: false\n })\n .then(async res => ({\n res: serialize.decode(\n (await res.json()) as {\n calls: {\n id: string;\n status: number;\n result: any;\n }[];\n }\n ),\n\n headers: res.headers\n }))\n .then(({ res, headers }) => {\n if (res.__typename == 'error') {\n let err = ServiceError.fromResponse(res);\n c.forEach(x => x.reject(err));\n return;\n }\n\n for (let call of c) {\n let callRes = res.calls.find((x: any) => x.id == call.call.id);\n if (!callRes) {\n let err = new ServiceError(\n internalServerError({ message: 'Call not returned' })\n );\n call.reject(err);\n return;\n }\n\n if (callRes.status >= 200 && callRes.status < 300) {\n call.resolve({\n // data: O;\n // status: number;\n // headers: Record<string, string>;\n\n data: callRes.result,\n status: callRes.status,\n headers\n });\n continue;\n }\n\n let err = ServiceError.fromResponse(callRes.result);\n call.reject(err);\n }\n })\n .catch(e => {\n if (verbose) {\n console.error(e);\n }\n\n c.forEach(x =>\n x.reject(\n new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`,\n\n inner: verbose\n ? e instanceof Error\n ? { message: e.message, stack: e.stack }\n : { error: e }\n : undefined\n })\n )\n )\n );\n });\n },\n isServer ? 0 : 10\n );\n\n return promise;\n};\n\nlet requesterInternal: Requester = async call => {\n let id = generateRequestId();\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n\n let tries = 0;\n let error: Error | null = null;\n\n for (let header in call.headers) {\n if (call.headers[header] === undefined) delete call.headers[header];\n }\n\n if (call.query) {\n for (let query in call.query) {\n if (call.query[query] === undefined) delete call.query[query];\n }\n }\n\n let maxTries = typeof window === 'undefined' ? 6 : 3;\n let retryDelay = typeof window === 'undefined' ? 20 : 1000;\n\n while (tries < maxTries) {\n try {\n return (await performRequest({\n ...(call as any),\n id\n }).then(\n res => {\n if (!isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Success`, res);\n }\n\n return res;\n },\n err => {\n if (isServer) {\n log(`[call:${call.name.replace(':', '-')}:${id}] Queued`, call);\n }\n\n log(`[call:${call.name.replace(':', '-')}:${id}] Error`, err);\n\n throw err;\n }\n )) as any;\n } catch (e: any) {\n error = e;\n\n if (isServiceError(e)) {\n // 400 errors are not retried\n if (e.data.status < 500) throw e;\n }\n }\n\n tries += 1;\n await new Promise(r => setTimeout(r, tries * retryDelay));\n }\n\n if (error) throw error;\n\n throw new ServiceError(\n internalServerError({\n message:\n typeof window != 'undefined'\n ? 'Unable to reach server'\n : `Unable to reach server ${call.endpoint}`\n })\n );\n};\n\nexport let request: Requester = async call => {\n // try {\n return await requesterInternal(call);\n // } catch (e: any) {\n // Sentry.captureException(e);\n // throw e;\n // }\n};\n","import { proxy } from '@lowerdeck/proxy';\nimport { Requester } from './requester';\n\nexport interface ClientOpts {\n endpoint: string;\n headers?: Record<string, string | undefined>;\n getHeaders?: () => Promise<Record<string, string>> | Record<string, string>;\n onRequest?: (d: {\n endpoint: string;\n name: string;\n payload: any;\n headers: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }) => any;\n}\n\nlet noopWithContext = (cb: (ctx: any) => any) => cb({});\n\nexport let clientBuilder =\n (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>\n <T extends object>(clientOpts: ClientOpts) =>\n proxy<T>(\n async (\n path,\n data,\n requestOpts?: {\n headers?: Record<string, string | undefined>;\n query?: Record<string, string | undefined>;\n }\n ) =>\n await withContext(async context => {\n let headers = {\n ...clientOpts.headers,\n ...(await clientOpts.getHeaders?.()),\n ...requestOpts?.headers\n };\n\n clientOpts.onRequest?.({\n endpoint: clientOpts.endpoint,\n name: path.join(':'),\n payload: data,\n headers,\n query: requestOpts?.query\n });\n\n if (path[path.length - 1] == 'getFull') {\n return await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.slice(0, -1).join(':'),\n headers,\n query: requestOpts?.query,\n context\n });\n }\n\n return (\n await request({\n endpoint: clientOpts.endpoint,\n payload: data,\n name: path.join(':'),\n headers,\n query: requestOpts?.query,\n context\n })\n ).data;\n })\n );\n","import { request } from './request';\nimport { clientBuilder } from './shared/clientBuilder';\n\nexport let createClient = clientBuilder(request);\n"],"names":["index","rootId","memo","generatePlainId","isServer","window","_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","verbose","process","env","NODE_ENV","prototype","onFulfilled","result","this","callback","onRejected","e","_this","_isSettledPact","thenable","request","withContext","log","_console","console","apply","slice","call","arguments","calls","createClient","Promise","resolve","_temp4","_exit","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","name","replace","tries","header","headers","undefined","query","maxTries","retryDelay","_temp3","_for","_temp2","_result","r","setTimeout","_temp","key","canonicalize","to","current","promise","reject","push","clearTimeout","c","url","URL","search","URLSearchParams","toString","fetch","method","_extends","body","serialize","encode","map","x","payload","sort","a","b","localeCompare","credentials","keepalive","res","_decode","decode","json","_res$json","_ref","__typename","_ret","_step","_loop","callRes","find","err","status","data","fromResponse","_iterator","_createForOfIteratorHelperLoose","done","forEach","inner","Error","stack","performRequest","_await$performRequest","_catch","isServiceError","requesterInternal","cb","clientOpts","proxy","path","requestOpts","context","getHeaders","_clientOpts$getHeader","join","_request","onRequest","length","_await$request"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAmNxE,eAAO,IAAI,OAAO,EAAE,SAOnB,CAAC"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoNxE,eAAO,IAAI,OAAO,EAAE,SAOnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=request.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.test.d.ts","sourceRoot":"","sources":["../src/request.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowerdeck/rpc-client",
3
- "version": "1.0.6",
3
+ "version": "1.1.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@lowerdeck/canonicalize": "^1.0.4",
40
- "@lowerdeck/error": "^1.0.10",
40
+ "@lowerdeck/error": "^1.1.0",
41
41
  "@lowerdeck/id": "^1.0.6",
42
42
  "@lowerdeck/memo": "^1.0.4",
43
43
  "@lowerdeck/proxy": "^1.0.4",
@@ -0,0 +1,71 @@
1
+ import { afterEach, describe, expect, test, vi } from 'vitest';
2
+ import { request } from './request';
3
+
4
+ describe('request', () => {
5
+ afterEach(() => {
6
+ vi.restoreAllMocks();
7
+ });
8
+
9
+ test('resolves successful call with null payload', async () => {
10
+ vi.spyOn(globalThis, 'fetch').mockImplementation(async (_input, init) => {
11
+ let body = JSON.parse(init?.body as string);
12
+ let id = body.calls[0].id;
13
+
14
+ return new Response(
15
+ JSON.stringify({
16
+ __typename: 'rpc.response',
17
+ calls: [{ id, status: 200, result: null }]
18
+ }),
19
+ { status: 200, headers: { 'content-type': 'application/json' } }
20
+ );
21
+ });
22
+
23
+ await expect(
24
+ request({
25
+ endpoint: 'http://localhost/rpc',
26
+ name: 'health:check',
27
+ payload: {},
28
+ headers: {},
29
+ context: {}
30
+ })
31
+ ).resolves.toMatchObject({
32
+ data: null,
33
+ status: 200
34
+ });
35
+ });
36
+
37
+ test('does not mutate successful payload fields', async () => {
38
+ vi.spyOn(globalThis, 'fetch').mockImplementation(async (_input, init) => {
39
+ let body = JSON.parse(init?.body as string);
40
+ let id = body.calls[0].id;
41
+
42
+ return new Response(
43
+ JSON.stringify({
44
+ __typename: 'rpc.response',
45
+ calls: [
46
+ {
47
+ id,
48
+ status: 200,
49
+ result: { ok: true, object: 'custom', value: 1 }
50
+ }
51
+ ]
52
+ }),
53
+ { status: 200, headers: { 'content-type': 'application/json' } }
54
+ );
55
+ });
56
+
57
+ let res = await request({
58
+ endpoint: 'http://localhost/rpc',
59
+ name: 'health:check',
60
+ payload: {},
61
+ headers: {},
62
+ context: {}
63
+ });
64
+
65
+ expect(res.data).toEqual({
66
+ ok: true,
67
+ object: 'custom',
68
+ value: 1
69
+ });
70
+ });
71
+ });
package/src/request.ts CHANGED
@@ -107,6 +107,7 @@ let performRequest = (call: Call) => {
107
107
  status: callRes.status,
108
108
  headers
109
109
  });
110
+ continue;
110
111
  }
111
112
 
112
113
  let err = ServiceError.fromResponse(callRes.result);