@lowerdeck/rpc-client 1.1.0 → 1.1.1

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}}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;
1
+ var e=require("@lowerdeck/canonicalize"),r=require("@lowerdeck/error"),n=require("@lowerdeck/serialize"),t=require("@lowerdeck/id"),o=require("@lowerdeck/memo"),i=require("@opentelemetry/api"),a=require("@lowerdeck/proxy");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=o.memo(function(){return t.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(t){return Promise.resolve(function(t){try{var o,i=function(e){if(o)return e;if(y)throw y;throw new r.ServiceError(r.internalServerError({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint}))},a=function(){var e="call_"+s()+"_"+l;return l+=1,e}();w("[call:"+t.name.replace(":","-")+":"+a+"] Queued",t);var m=0,y=null;for(var g in t.headers)void 0===t.headers[g]&&delete t.headers[g];if(t.query)for(var j in t.query)void 0===t.query[j]&&delete t.query[j];var q="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,E=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<q},0,function(){function i(e){return o?e:(m+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,m*S)})).then(function(){}))}var l=function(i,l){try{var s=Promise.resolve(function(t){var o=""+e.canonicalize(t.headers)+e.canonicalize(t.query)+t.endpoint;b[o]||(b[o]={calls:[],to:null});var i=b[o],a=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=b[o].calls;b[o].calls=[],b[o].to=null;var i=new URL(t.endpoint);i.search=new URLSearchParams(t.query).toString(),fetch(i.toString(),{method:"POST",headers:c({"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,a,c=function(){var e=a.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 u=r.ServiceError.fromResponse(n.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.")}(e);!(a=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){v&&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:v?n instanceof Error?{message:n.message,stack:n.stack}:{error:n}:void 0})))})})},d?0:10),a}(c({},t,{id:a})).then(function(e){return d||w("[call:"+t.name.replace(":","-")+":"+a+"] Success",e),e},function(e){throw d&&w("[call:"+t.name.replace(":","-")+":"+a+"] Queued",t),w("[call:"+t.name.replace(":","-")+":"+a+"] Error",e),e})).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,r.isServiceError(e)&&e.data.status<500)throw e});return l&&l.then?l.then(i):i(l)});return Promise.resolve(E&&E.then?E.then(i):i(E))}catch(e){return Promise.reject(e)}}(t))},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(a){var u;function l(i){return u?i:Promise.resolve(m({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:s,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var s=c({},e.headers,a,null==t?void 0:t.headers);s=function(e){if("undefined"==typeof process||"true"!==(null==(r=process.env)?void 0:r.OTEL_ENABLED))return e;var r;if(!i.trace.getSpan(i.context.active()))return e;var n={};try{i.propagation.inject(i.context.active(),n)}catch(r){return e}if(!Object.keys(n).length)return e;for(var t=new Set(Object.keys(e).map(function(e){return e.toLowerCase()})),o=0,a=Object.entries(n);o<a.length;o++){var u=a[o],c=u[0],l=u[1];t.has(c.toLowerCase())||(e[c]=l)}return e}(s),null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:s,query:null==t?void 0:t.query});var d=function(){if("getFull"==r[r.length-1])return Promise.resolve(m({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:s,query:null==t?void 0:t.query,context:o})).then(function(e){return u=1,e})}();return d&&d.then?d.then(l):l(d)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});exports.createClient=g;
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 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
+ {"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 { context as otelContext, propagation, trace } from '@opentelemetry/api';\nimport { 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\nlet isTelemetryEnabled = () =>\n typeof process !== 'undefined' && process.env?.['OTEL_ENABLED'] === 'true';\n\nlet hasActiveSpan = () => !!trace.getSpan(otelContext.active());\n\nlet injectTraceHeaders = (headers: Record<string, string | undefined>) => {\n if (!isTelemetryEnabled()) return headers;\n if (!hasActiveSpan()) return headers;\n\n let carrier: Record<string, string> = {};\n\n try {\n propagation.inject(otelContext.active(), carrier);\n } catch {\n return headers;\n }\n\n if (!Object.keys(carrier).length) return headers;\n\n let existingHeaderNames = new Set(Object.keys(headers).map(h => h.toLowerCase()));\n\n for (let [name, value] of Object.entries(carrier)) {\n if (!existingHeaderNames.has(name.toLowerCase())) {\n headers[name] = value;\n }\n }\n\n return headers;\n};\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 headers = injectTraceHeaders(headers);\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","_process$env","trace","getSpan","otelContext","active","carrier","propagation","inject","_unused","Object","keys","length","existingHeaderNames","Set","h","toLowerCase","_i","_Object$entries","entries","_Object$entries$_i","has","injectTraceHeaders","onRequest","_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}}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};
1
+ import{canonicalize as e}from"@lowerdeck/canonicalize";import{ServiceError as r,internalServerError as n,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{propagation as u,context as c,trace as l}from"@opentelemetry/api";import{proxy as s}from"@lowerdeck/proxy";function f(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 d(){return d=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},d.apply(null,arguments)}var v=0,h=a(function(){return i(10)}),m="undefined"==typeof window;function p(e,r,n){if(!e.s){if(n instanceof w){if(!n.s)return void(n.o=p.bind(null,e,r));1&r&&(r=n.s),n=n.v}if(n&&n.then)return void n.then(p.bind(null,e,r),p.bind(null,e,2));e.s=r,e.v=n;var t=e.o;t&&t(e)}}var y="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,w=/*#__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{p(t,1,i(this.v))}catch(e){p(t,2,e)}return t}return this}return this.o=function(e){try{var o=e.v;1&e.s?p(t,1,r?r(o):o):n?p(t,1,n(o)):p(t,2,o)}catch(e){p(t,2,e)}},t},e}();function b(e){return e instanceof w&&1&e.s}var g,j,P=function(){var e;m||(e=console).log.apply(e,[].slice.call(arguments))},q={},k=function(e){if("undefined"==typeof process||"true"!==(null==(r=process.env)?void 0:r.OTEL_ENABLED))return e;var r;if(!l.getSpan(c.active()))return e;var n={};try{u.inject(c.active(),n)}catch(r){return e}if(!Object.keys(n).length)return e;for(var t=new Set(Object.keys(e).map(function(e){return e.toLowerCase()})),o=0,i=Object.entries(n);o<i.length;o++){var a=i[o],s=a[0],f=a[1];t.has(s.toLowerCase())||(e[s]=f)}return e},S=(g=function(i){return Promise.resolve(function(i){try{var a,u=function(e){if(a)return e;if(s)throw s;throw new r(n({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+i.endpoint}))},c=function(){var e="call_"+h()+"_"+v;return v+=1,e}();P("[call:"+i.name.replace(":","-")+":"+c+"] Queued",i);var l=0,s=null;for(var g in i.headers)void 0===i.headers[g]&&delete i.headers[g];if(i.query)for(var j in i.query)void 0===i.query[j]&&delete i.query[j];var k="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,E=function(e,r,n){for(var t;;){var o=e();if(b(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=n();if(i&&i.then){if(!b(i)){t=1;break}i=i.s}}var a=new w,u=p.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):p(a,1,i)})).then(void 0,u),a;function c(r){i=r;do{if(!(o=e())||b(o)&&!o.v)return void p(a,1,i);if(o.then)return void o.then(l).then(void 0,u);b(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):p(a,1,i)}}(function(){return!a&&l<k},0,function(){function u(e){return a?e:(l+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,l*S)})).then(function(){}))}var v=function(t,u){try{var l=Promise.resolve(function(t){var i=""+e(t.headers)+e(t.query)+t.endpoint;q[i]||(q[i]={calls:[],to:null});var a=q[i],u=new Promise(function(e,r){a.calls.push({call:t,resolve:e,reject:r})});return a.to&&clearTimeout(a.to),a.to=setTimeout(function(){var e=q[i].calls;q[i].calls=[],q[i].to=null;var a=new URL(t.endpoint);a.search=new URLSearchParams(t.query).toString(),fetch(a.toString(),{method:"POST",headers:d({"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,r){return e.name.localeCompare(r.name)})}),credentials:"include",keepalive:!1}).then(function(e){try{var r=o.decode;return Promise.resolve(e.json()).then(function(n){return{res:r.call(o,n),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,c=function(){var e=u.value,t=o.calls.find(function(r){return r.id==e.call.id});if(!t){var a=new r(n({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=r.fromResponse(t.result);e.reject(c)},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 f(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)?f(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!==(a=c())&&a)return a.v}else{var s=r.fromResponse(o);e.forEach(function(e){return e.reject(s)})}}).catch(function(o){y&&console.error(o),e.forEach(function(e){return e.reject(new r(n({message:"undefined"!=typeof window?"Unable to reach server":"Unable to reach server "+t.endpoint,inner:y?o instanceof Error?{message:o.message,stack:o.stack}:{error:o}:void 0})))})})},m?0:10),u}(d({},i,{id:c})).then(function(e){return m||P("[call:"+i.name.replace(":","-")+":"+c+"] Success",e),e},function(e){throw m&&P("[call:"+i.name.replace(":","-")+":"+c+"] Queued",i),P("[call:"+i.name.replace(":","-")+":"+c+"] Error",e),e})).then(function(e){return a=1,e})}catch(e){return u(e)}return l&&l.then?l.then(void 0,u):l}(0,function(e){if(s=e,t(e)&&e.data.status<500)throw e});return v&&v.then?v.then(u):u(v)});return Promise.resolve(E&&E.then?E.then(u):u(E))}catch(e){return Promise.reject(e)}}(i))},void 0===j&&(j=function(e){return e({})}),function(e){return s(function(r,n,t){try{return Promise.resolve(j(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(g({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:c,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var c=d({},e.headers,i,null==t?void 0:t.headers);c=k(c),null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:c,query:null==t?void 0:t.query});var l=function(){if("getFull"==r[r.length-1])return Promise.resolve(g({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:c,query:null==t?void 0:t.query,context:o})).then(function(e){return a=1,e})}();return l&&l.then?l.then(u):u(l)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});export{S 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 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
+ {"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 { context as otelContext, propagation, trace } from '@opentelemetry/api';\nimport { 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\nlet isTelemetryEnabled = () =>\n typeof process !== 'undefined' && process.env?.['OTEL_ENABLED'] === 'true';\n\nlet hasActiveSpan = () => !!trace.getSpan(otelContext.active());\n\nlet injectTraceHeaders = (headers: Record<string, string | undefined>) => {\n if (!isTelemetryEnabled()) return headers;\n if (!hasActiveSpan()) return headers;\n\n let carrier: Record<string, string> = {};\n\n try {\n propagation.inject(otelContext.active(), carrier);\n } catch {\n return headers;\n }\n\n if (!Object.keys(carrier).length) return headers;\n\n let existingHeaderNames = new Set(Object.keys(headers).map(h => h.toLowerCase()));\n\n for (let [name, value] of Object.entries(carrier)) {\n if (!existingHeaderNames.has(name.toLowerCase())) {\n headers[name] = value;\n }\n }\n\n return headers;\n};\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 headers = injectTraceHeaders(headers);\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","injectTraceHeaders","headers","_process$env","trace","getSpan","otelContext","active","carrier","propagation","inject","_unused","Object","keys","length","existingHeaderNames","Set","map","h","toLowerCase","_i","_Object$entries","entries","_Object$entries$_i","name","has","createClient","Promise","resolve","_temp4","_exit","_result2","error","ServiceError","internalServerError","message","endpoint","id","generateRequestId","replace","tries","header","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","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","_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}}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});
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("@opentelemetry/api"),require("@lowerdeck/proxy")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/canonicalize","@lowerdeck/error","@lowerdeck/serialize","@lowerdeck/id","@lowerdeck/memo","@opentelemetry/api","@lowerdeck/proxy"],r):r((e||self).rpcClient={},e.canonicalize,e.error,e.serialize,e.id,e.memo,e.api,e.proxy)}(this,function(e,r,n,t,o,i,a,c){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 l(){return l=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},l.apply(null,arguments)}var s=0,d=i.memo(function(){return o.generatePlainId(10)}),f="undefined"==typeof window;function v(e,r,n){if(!e.s){if(n instanceof p){if(!n.s)return void(n.o=v.bind(null,e,r));1&r&&(r=n.s),n=n.v}if(n&&n.then)return void n.then(v.bind(null,e,r),v.bind(null,e,2));e.s=r,e.v=n;var t=e.o;t&&t(e)}}var h="undefined"!=typeof window||"undefined"!=typeof process&&"production"!==process.env.NODE_ENV,p=/*#__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{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,r?r(o):o):n?v(t,1,n(o)):v(t,2,o)}catch(e){v(t,2,e)}},t},e}();function m(e){return e instanceof p&&1&e.s}var y,w,b=function(){var e;f||(e=console).log.apply(e,[].slice.call(arguments))},g={},j=(y=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_"+d()+"_"+s;return s+=1,e}();b("[call:"+e.name.replace(":","-")+":"+a+"] Queued",e);var c=0,y=null;for(var w in e.headers)void 0===e.headers[w]&&delete e.headers[w];if(e.query)for(var j in e.query)void 0===e.query[j]&&delete e.query[j];var q="undefined"==typeof window?6:3,S="undefined"==typeof window?20:1e3,k=function(e,r,n){for(var t;;){var o=e();if(m(o)&&(o=o.v),!o)return i;if(o.then){t=0;break}var i=n();if(i&&i.then){if(!m(i)){t=1;break}i=i.s}}var a=new p,c=v.bind(null,a,2);return(0===t?o.then(l):1===t?i.then(u):(void 0).then(function(){(o=e())?o.then?o.then(l).then(void 0,c):l(o):v(a,1,i)})).then(void 0,c),a;function u(r){i=r;do{if(!(o=e())||m(o)&&!o.v)return void v(a,1,i);if(o.then)return void o.then(l).then(void 0,c);m(i=n())&&(i=i.v)}while(!i||!i.then);i.then(u).then(void 0,c)}function l(e){e?(i=n())&&i.then?i.then(u).then(void 0,c):u(i):v(a,1,i)}}(function(){return!o&&c<q},0,function(){function i(e){return o?e:(c+=1,Promise.resolve(new Promise(function(e){return setTimeout(e,c*S)})).then(function(){}))}var s=function(i,c){try{var s=Promise.resolve(function(e){var o=""+r.canonicalize(e.headers)+r.canonicalize(e.query)+e.endpoint;g[o]||(g[o]={calls:[],to:null});var i=g[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=g[o].calls;g[o].calls=[],g[o].to=null;var i=new URL(e.endpoint);i.search=new URLSearchParams(e.query).toString(),fetch(i.toString(),{method:"POST",headers:l({"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 c=n.ServiceError.fromResponse(r.result);e.reject(c)},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){h&&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:h?t instanceof Error?{message:t.message,stack:t.stack}:{error:t}:void 0})))})})},f?0:10),a}(l({},e,{id:a})).then(function(r){return f||b("[call:"+e.name.replace(":","-")+":"+a+"] Success",r),r},function(r){throw f&&b("[call:"+e.name.replace(":","-")+":"+a+"] Queued",e),b("[call:"+e.name.replace(":","-")+":"+a+"] Error",r),r})).then(function(e){return o=1,e})}catch(e){return c(e)}return s&&s.then?s.then(void 0,c):s}(0,function(e){if(y=e,n.isServiceError(e)&&e.data.status<500)throw e});return s&&s.then?s.then(i):i(s)});return Promise.resolve(k&&k.then?k.then(i):i(k))}catch(e){return Promise.reject(e)}}(e))},void 0===w&&(w=function(e){return e({})}),function(e){return c.proxy(function(r,n,t){try{return Promise.resolve(w(function(o){try{return Promise.resolve(null==e.getHeaders?void 0:e.getHeaders()).then(function(i){var c;function u(i){return c?i:Promise.resolve(y({endpoint:e.endpoint,payload:n,name:r.join(":"),headers:s,query:null==t?void 0:t.query,context:o})).then(function(e){return e.data})}var s=l({},e.headers,i,null==t?void 0:t.headers);s=function(e){if("undefined"==typeof process||"true"!==(null==(r=process.env)?void 0:r.OTEL_ENABLED))return e;var r;if(!a.trace.getSpan(a.context.active()))return e;var n={};try{a.propagation.inject(a.context.active(),n)}catch(r){return e}if(!Object.keys(n).length)return e;for(var t=new Set(Object.keys(e).map(function(e){return e.toLowerCase()})),o=0,i=Object.entries(n);o<i.length;o++){var c=i[o],u=c[0],l=c[1];t.has(u.toLowerCase())||(e[u]=l)}return e}(s),null==e.onRequest||e.onRequest({endpoint:e.endpoint,name:r.join(":"),payload:n,headers:s,query:null==t?void 0:t.query});var d=function(){if("getFull"==r[r.length-1])return Promise.resolve(y({endpoint:e.endpoint,payload:n,name:r.slice(0,-1).join(":"),headers:s,query:null==t?void 0:t.query,context:o})).then(function(e){return c=1,e})}();return d&&d.then?d.then(u):u(d)})}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}})});e.createClient=j});
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 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
+ {"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 { context as otelContext, propagation, trace } from '@opentelemetry/api';\nimport { 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\nlet isTelemetryEnabled = () =>\n typeof process !== 'undefined' && process.env?.['OTEL_ENABLED'] === 'true';\n\nlet hasActiveSpan = () => !!trace.getSpan(otelContext.active());\n\nlet injectTraceHeaders = (headers: Record<string, string | undefined>) => {\n if (!isTelemetryEnabled()) return headers;\n if (!hasActiveSpan()) return headers;\n\n let carrier: Record<string, string> = {};\n\n try {\n propagation.inject(otelContext.active(), carrier);\n } catch {\n return headers;\n }\n\n if (!Object.keys(carrier).length) return headers;\n\n let existingHeaderNames = new Set(Object.keys(headers).map(h => h.toLowerCase()));\n\n for (let [name, value] of Object.entries(carrier)) {\n if (!existingHeaderNames.has(name.toLowerCase())) {\n headers[name] = value;\n }\n }\n\n return headers;\n};\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 headers = injectTraceHeaders(headers);\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","_process$env","trace","getSpan","otelContext","active","carrier","propagation","inject","_unused","Object","keys","length","existingHeaderNames","Set","h","toLowerCase","_i","_Object$entries","entries","_Object$entries$_i","has","injectTraceHeaders","onRequest","_await$request"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"clientBuilder.d.ts","sourceRoot":"","sources":["../../src/shared/clientBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5E,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,GAAG,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;KAC5C,KAAK,GAAG,CAAC;CACX;AAID,eAAO,IAAI,aAAa,GACrB,SAAS,SAAS,EAAE,cAAa,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAqB,MACjF,CAAC,SAAS,MAAM,EAAE,YAAY,UAAU,MA+CtC,CAAC"}
1
+ {"version":3,"file":"clientBuilder.d.ts","sourceRoot":"","sources":["../../src/shared/clientBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5E,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,GAAG,CAAC;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;KAC5C,KAAK,GAAG,CAAC;CACX;AAkCD,eAAO,IAAI,aAAa,GACrB,SAAS,SAAS,EAAE,cAAa,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAqB,MACjF,CAAC,SAAS,MAAM,EAAE,YAAY,UAAU,MAiDtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowerdeck/rpc-client",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -36,6 +36,7 @@
36
36
  "vitest": "^3.2.4"
37
37
  },
38
38
  "dependencies": {
39
+ "@opentelemetry/api": "^1.9.0",
39
40
  "@lowerdeck/canonicalize": "^1.0.4",
40
41
  "@lowerdeck/error": "^1.1.0",
41
42
  "@lowerdeck/id": "^1.0.6",
@@ -43,4 +44,4 @@
43
44
  "@lowerdeck/proxy": "^1.0.4",
44
45
  "@lowerdeck/serialize": "^1.0.4"
45
46
  }
46
- }
47
+ }
@@ -1,3 +1,4 @@
1
+ import { context as otelContext, propagation, trace } from '@opentelemetry/api';
1
2
  import { proxy } from '@lowerdeck/proxy';
2
3
  import { Requester } from './requester';
3
4
 
@@ -16,6 +17,36 @@ export interface ClientOpts {
16
17
 
17
18
  let noopWithContext = (cb: (ctx: any) => any) => cb({});
18
19
 
20
+ let isTelemetryEnabled = () =>
21
+ typeof process !== 'undefined' && process.env?.['OTEL_ENABLED'] === 'true';
22
+
23
+ let hasActiveSpan = () => !!trace.getSpan(otelContext.active());
24
+
25
+ let injectTraceHeaders = (headers: Record<string, string | undefined>) => {
26
+ if (!isTelemetryEnabled()) return headers;
27
+ if (!hasActiveSpan()) return headers;
28
+
29
+ let carrier: Record<string, string> = {};
30
+
31
+ try {
32
+ propagation.inject(otelContext.active(), carrier);
33
+ } catch {
34
+ return headers;
35
+ }
36
+
37
+ if (!Object.keys(carrier).length) return headers;
38
+
39
+ let existingHeaderNames = new Set(Object.keys(headers).map(h => h.toLowerCase()));
40
+
41
+ for (let [name, value] of Object.entries(carrier)) {
42
+ if (!existingHeaderNames.has(name.toLowerCase())) {
43
+ headers[name] = value;
44
+ }
45
+ }
46
+
47
+ return headers;
48
+ };
49
+
19
50
  export let clientBuilder =
20
51
  (request: Requester, withContext: (cb: (ctx: any) => any) => any = noopWithContext) =>
21
52
  <T extends object>(clientOpts: ClientOpts) =>
@@ -35,6 +66,8 @@ export let clientBuilder =
35
66
  ...requestOpts?.headers
36
67
  };
37
68
 
69
+ headers = injectTraceHeaders(headers);
70
+
38
71
  clientOpts.onRequest?.({
39
72
  endpoint: clientOpts.endpoint,
40
73
  name: path.join(':'),