@lowerdeck/rpc-server 1.0.2 → 1.0.3
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 +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/rpcMux.d.ts.map +1 -1
- package/package.json +16 -10
- package/.turbo/turbo-build.log +0 -18
- package/.turbo/turbo-test.log +0 -35
- package/CHANGELOG.md +0 -16
- package/dist/anonymizeIp.d.ts +0 -10
- package/dist/anonymizeIp.d.ts.map +0 -1
- package/dist/anonymizeIp.test.d.ts +0 -2
- package/dist/anonymizeIp.test.d.ts.map +0 -1
- package/dist/index.modern.js +0 -2
- package/dist/index.modern.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsup.config.js +0 -11
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("@lowerdeck/error"),r=require("@lowerdeck/execution-context"),t=require("@lowerdeck/id"),n=require("@lowerdeck/memo"),o=require("@lowerdeck/sentry"),a=require("@lowerdeck/serialize"),i=require("@lowerdeck/validation");function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var u=/*#__PURE__*/s(require("cookie"));function c(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function l(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return c(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?c(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);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.")}function d(){return d=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},d.apply(null,arguments)}const f="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function h(e,r,t){if(!e.s){if(t instanceof p){if(!t.s)return void(t.o=h.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(h.bind(null,e,r),h.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var p=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var a=1&o?r:t;if(a){try{h(n,1,a(this.v))}catch(e){h(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?h(n,1,r?r(o):o):t?h(n,1,t(o)):h(n,2,o)}catch(e){h(n,2,e)}},n},e}();function v(e){return e instanceof p&&1&e.s}var m=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._middleware=e}var r=e.prototype;return r.use=function(r,t){return new e([].concat(this._middleware,[function(e){try{var n,o=function(t){if(n)return t;var o=r(e);return a&&e.sharedMiddlewareMemo.set(a,o),Promise.resolve(o)},a=null==t||null==t.getSharedMemoKey?void 0:t.getSharedMemoKey(e),i=function(){if(a&&e.sharedMiddlewareMemo.has(a))return Promise.resolve(e.sharedMiddlewareMemo.get(a)).then(function(e){return n=1,e})}();return Promise.resolve(i&&i.then?i.then(o):o(i))}catch(e){return Promise.reject(e)}}]))},r.createMiddleware=function(e,r){return function(t){return function(n){try{var o,a=function(r){if(o)return r;var a=e(n,t);return i&&n.sharedMiddlewareMemo.set(i,a),Promise.resolve(a)},i=null==r||null==r.getSharedMemoKey?void 0:r.getSharedMemoKey(n,t),s=function(){if(i&&n.sharedMiddlewareMemo.has(i))return Promise.resolve(n.sharedMiddlewareMemo.get(i)).then(function(e){return o=1,e})}();return Promise.resolve(s&&s.then?s.then(a):a(s))}catch(e){return Promise.reject(e)}}}},r.handler=function(){return new y([].concat(this._middleware))},r.controller=function(e){return e},e}(),y=/*#__PURE__*/function(){function r(e){void 0===e&&(e=[]),this._middleware=void 0,this._handler=void 0,this._validation=void 0,this._middleware=e}var t=r.prototype;return t.do=function(e){if(null!=this._handler)throw new Error("Handler already defined");return this._handler=e,this},t.use=function(e){return this._middleware.push(e),this},t.input=function(e){if(null!=this._validation)throw new Error("Input validation already defined");return this._validation=e,this},t.run=function(r,t){try{var n=function(){return Promise.resolve(o._handler(d({},s,{input:a,body:void 0}))).then(function(e){return{response:e}})},o=this;if(!o._handler)throw new Error("Handler not defined");var a=r.body;if(o._validation){var i=o._validation.validate(r.body);if(!i.success)throw new e.ServiceError(e.validationError({errors:i.errors,entity:"call_data"}));a=i.value}var s=d({},t,r,{body:a}),u=function(e,r){if("function"==typeof e[f]){var t,n,o,a=function(e){try{for(;!(t=i.next()).done;)if((e=r(t.value))&&e.then){if(!v(e))return void e.then(a,o||(o=h.bind(null,n=new p,2)));e=e.v}n?h(n,1,e):n=e}catch(e){h(n||(n=new p),2,e)}},i=e[f]();if(a(),i.return){var s=function(e){try{t.done||i.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,r){var t,n,o=-1;return function a(i){try{for(;++o<e.length;)if((i=r(o))&&i.then){if(!v(i))return void i.then(a,n||(n=h.bind(null,t=new p,2)));i=i.v}t?h(t,1,i):t=i}catch(e){h(t||(t=new p),2,e)}}(),t}(u,function(e){return r(u[e])})}(o._middleware,function(e){return Promise.resolve(e(s)).then(function(e){e&&(s=d({},s,e))})});return Promise.resolve(u&&u.then?u.then(n):n())}catch(e){return Promise.reject(e)}},r}(),g=o.getSentry(),w=i.v.object({calls:i.v.array(i.v.object({id:i.v.string(),name:i.v.string(),payload:i.v.any()}))}),b=o.getSentry();exports.Group=m,exports.Handler=y,exports.createServer=function(r){return function(t){var n=function(e){return Object.entries(e).flatMap(function(e){var r=e[0],t=e[1];return t instanceof y?[r]:"object"==typeof t?n(t).map(function(e){return r+":"+e}):[]})};return{handlerNames:n(t),runMany:function(n,o){try{return Promise.resolve(Promise.all(o.calls.map(function(a,i){try{return Promise.resolve(function(n,o,a){try{var i=d({},n,{body:o.payload});return Promise.resolve(function(r,a){try{var s=(u=function(e){for(var r=e.split(":"),n=t;n&&r.length>0;)if(!(n=n[r.shift()]))return null;return n&&n instanceof y?n:null}(o.name))?Promise.resolve(u.run(i,{})).then(function(e){return{status:200,request:n,response:e.response}}):{request:i,status:404,response:e.notFoundError({entity:"handler"}).toResponse()}}catch(e){return a(e)}var u;return s&&s.then?s.then(void 0,a):s}(0,function(t){return console.error(t),e.isServiceError(t)?(t.data.status>=500&&b.captureException(t,{tags:{reqId:a}}),{request:i,status:t.data.status,response:t.toResponse()}):(b.captureException(t,{tags:{reqId:a}}),null==r.onError||r.onError({callName:o.name,callId:o.id,request:n,error:t,reqId:a}),{request:i,status:500,response:e.internalServerError().toResponse()})}))}catch(e){return Promise.reject(e)}}(n,a,o.requestId)).then(function(e){try{null==r.onRequest||r.onRequest({reqId:o.requestId,callId:a.id,callName:a.name,request:e.request,response:{status:e.status,body:e.response}})}catch(e){b.captureException(e),console.error(e)}return{__typename:"rpc.response.call",id:a.id,name:a.name,status:e.status,result:e.response}})}catch(e){return Promise.reject(e)}}))).then(function(e){return{status:Math.max.apply(Math,e.map(function(e){return e.status})),body:{__typename:"rpc.response",calls:e}}})}catch(e){return Promise.reject(e)}}}}},exports.rpcMux=function(o,i){var s=new Map(i.flatMap(function(e,r){return e.handlerNames.map(function(e){return[e,r]})}));return{path:o.path,fetch:function(c){try{var d,f,h,p=function(o){var d,f,p,v;if(h)return o;var y=c.headers.get("sentry-trace"),P=null!=(d=Array.isArray(y)?y.join(","):y)?d:void 0,q=c.headers.get("baggage"),M=function(e){if("string"==typeof e){var r=e.split(",").map(function(e){return e.trim()}).filter(Boolean);return r.length>0?r[0]:void 0}}(null!=(f=null!=(p=null!=(v=c.headers.get("lowerdeck-connecting-ip"))?v:c.headers.get("cf-connecting-ip"))?p:c.headers.get("x-forwarded-for"))?f:c.headers.get("x-real-ip")),_=new Headers;if(m)for(var x=0,E=Object.entries(S);x<E.length;x++){var O=E[x];_.append(O[0],O[1])}return Promise.resolve(g.withIsolationScope(function(){try{return Promise.resolve(g.continueTrace({sentryTrace:P,baggage:q},function(){try{var o,d;return Promise.resolve(g.startSpan({name:"rpc request",op:"rpc.server",attributes:{ip:M,transport:"http",ua:null!=(o=c.headers.get("user-agent"))?o:"",origin:null!=(d=c.headers.get("origin"))?d:""}},function(){try{try{var o,d=[],f=t.generateCustomId("req_"),h=n.memo(function(){var e;return u.parse(null!=(e=c.headers.get("cookie"))?e:"")}),p={url:c.url,headers:c.headers,query:b.searchParams,body:j,rawBody:j,ip:M,requestId:f,getCookies:function(){return h()},getCookie:function(e){return h()[e]},setCookie:function(e,r,t){var n=u.serialize(e,r,t);_.append("Set-Cookie",n)},beforeSend:function(e){d.push(e)},sharedMiddlewareMemo:new Map,appendHeaders:function(e){for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],a=n[1];if(Array.isArray(a))for(var i,s=l(a);!(i=s()).done;)_.append(o,i.value);else _.append(o,a)}}};g.getCurrentScope().setContext("rpc.request",{url:c.url,query:Object.fromEntries(b.searchParams.entries())}),g.getCurrentScope().addAttachment({filename:"rpc.request.body.json",data:j,contentType:"application/json"});var v=w.validate(j);return Promise.resolve(v.success?r.provideExecutionContext(r.createExecutionContext({type:"request",contextId:f,ip:null!=M?M:"0.0.0.0",userAgent:null!=(o=c.headers.get("user-agent"))?o:""}),function(){try{for(var r,t=new Map,n=l(j.calls);!(r=n()).done;){var o,u=r.value,c=s.get(u.name);if(null==c)return Promise.resolve(new Response(JSON.stringify(e.notFoundError({entity:"handler"}).toResponse()),{status:404,headers:_}));var h=null!=(o=t.get(c))?o:[];h.push(u),t.set(c,h)}var v={body:{__typename:"rpc.response",calls:[]},status:200};return Promise.resolve(Promise.all(Array.from(t.entries()).map(function(e){var r=e[0],t=e[1];try{return Promise.resolve(i[r].runMany(p,{requestId:f,calls:t})).then(function(e){var r;v.status=Math.max(v.status,e.status),(r=v.body.calls).push.apply(r,e.body.calls)})}catch(e){return Promise.reject(e)}}))).then(function(){return _.append("x-req-id",f),_.append("content-type","application/rpc+json"),_.append("x-powered-by","lowerdeck RPC"),Promise.resolve(Promise.all(d.map(function(e){return e()}))).then(function(){return new Response(a.serialize.encode(v.body),{status:v.status,headers:_})})})}catch(e){return Promise.reject(e)}}):new Response(JSON.stringify(e.validationError({errors:v.errors,entity:"request_data"}).toResponse()),{status:406,headers:_}))}catch(r){return console.error(r),g.captureException(r),Promise.resolve(new Response(JSON.stringify(e.internalServerError().toResponse()),{status:500,headers:_}))}}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))},v=null!=(d=c.headers.get("origin"))?d:"",m=!1;if(o.cors&&"domains"in o.cors)try{var y=new URL(v).hostname.split(".").slice(-2).join(".");m=o.cors.domains.includes(y)}catch(e){}else o.cors&&"check"in o.cors&&(m=o.cors.check(v));var b=new URL(c.url),P=null==(f=o.cors)||null==(f=f.headers)?void 0:f.join(", ");P&&(P=(", "+P).trim());var S=m?{"access-control-allow-origin":v,"access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"Content-Type, Authorization, Baggage, Sentry-Trace"+(null!=P?P:""),"access-control-max-age":"604800","access-control-allow-credentials":"true"}:{};if("OPTIONS"==c.method)return Promise.resolve(m?new Response(null,{status:204,headers:S}):new Response(null,{status:403}));var j=null,q=function(e,r){try{var t=e()}catch(e){return r()}return t&&t.then?t.then(void 0,r):t}(function(){var e=a.serialize.decode;return Promise.resolve(c.text()).then(function(r){j=e.call(a.serialize,r)})},function(){var r=new Response(JSON.stringify(e.notAcceptableError({message:"Invalid JSON"}).toResponse()),{status:406});return h=1,r});return Promise.resolve(q&&q.then?q.then(p):p(q))}catch(e){return Promise.reject(e)}}}};
|
|
1
|
+
var e=require("@lowerdeck/error"),r=require("@lowerdeck/execution-context"),t=require("@lowerdeck/id"),n=require("@lowerdeck/memo"),o=require("@lowerdeck/sentry"),a=require("@lowerdeck/serialize"),i=require("@lowerdeck/validation");function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var u=/*#__PURE__*/s(require("cookie"));function c(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function l(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return c(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?c(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);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.")}function d(){return d=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},d.apply(null,arguments)}const f="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function h(e,r,t){if(!e.s){if(t instanceof p){if(!t.s)return void(t.o=h.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(h.bind(null,e,r),h.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var p=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var a=1&o?r:t;if(a){try{h(n,1,a(this.v))}catch(e){h(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?h(n,1,r?r(o):o):t?h(n,1,t(o)):h(n,2,o)}catch(e){h(n,2,e)}},n},e}();function v(e){return e instanceof p&&1&e.s}var m=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._middleware=e}var r=e.prototype;return r.use=function(r,t){return new e([].concat(this._middleware,[function(e){try{var n,o=function(t){if(n)return t;var o=r(e);return a&&e.sharedMiddlewareMemo.set(a,o),Promise.resolve(o)},a=null==t||null==t.getSharedMemoKey?void 0:t.getSharedMemoKey(e),i=function(){if(a&&e.sharedMiddlewareMemo.has(a))return Promise.resolve(e.sharedMiddlewareMemo.get(a)).then(function(e){return n=1,e})}();return Promise.resolve(i&&i.then?i.then(o):o(i))}catch(e){return Promise.reject(e)}}]))},r.createMiddleware=function(e,r){return function(t){return function(n){try{var o,a=function(r){if(o)return r;var a=e(n,t);return i&&n.sharedMiddlewareMemo.set(i,a),Promise.resolve(a)},i=null==r||null==r.getSharedMemoKey?void 0:r.getSharedMemoKey(n,t),s=function(){if(i&&n.sharedMiddlewareMemo.has(i))return Promise.resolve(n.sharedMiddlewareMemo.get(i)).then(function(e){return o=1,e})}();return Promise.resolve(s&&s.then?s.then(a):a(s))}catch(e){return Promise.reject(e)}}}},r.handler=function(){return new y([].concat(this._middleware))},r.controller=function(e){return e},e}(),y=/*#__PURE__*/function(){function r(e){void 0===e&&(e=[]),this._middleware=void 0,this._handler=void 0,this._validation=void 0,this._middleware=e}var t=r.prototype;return t.do=function(e){if(null!=this._handler)throw new Error("Handler already defined");return this._handler=e,this},t.use=function(e){return this._middleware.push(e),this},t.input=function(e){if(null!=this._validation)throw new Error("Input validation already defined");return this._validation=e,this},t.run=function(r,t){try{var n=function(){return Promise.resolve(o._handler(d({},s,{input:a,body:void 0}))).then(function(e){return{response:e}})},o=this;if(!o._handler)throw new Error("Handler not defined");var a=r.body;if(o._validation){var i=o._validation.validate(r.body);if(!i.success)throw new e.ServiceError(e.validationError({errors:i.errors,entity:"call_data"}));a=i.value}var s=d({},t,r,{body:a}),u=function(e,r){if("function"==typeof e[f]){var t,n,o,a=function(e){try{for(;!(t=i.next()).done;)if((e=r(t.value))&&e.then){if(!v(e))return void e.then(a,o||(o=h.bind(null,n=new p,2)));e=e.v}n?h(n,1,e):n=e}catch(e){h(n||(n=new p),2,e)}},i=e[f]();if(a(),i.return){var s=function(e){try{t.done||i.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,r){var t,n,o=-1;return function a(i){try{for(;++o<e.length;)if((i=r(o))&&i.then){if(!v(i))return void i.then(a,n||(n=h.bind(null,t=new p,2)));i=i.v}t?h(t,1,i):t=i}catch(e){h(t||(t=new p),2,e)}}(),t}(u,function(e){return r(u[e])})}(o._middleware,function(e){return Promise.resolve(e(s)).then(function(e){e&&(s=d({},s,e))})});return Promise.resolve(u&&u.then?u.then(n):n())}catch(e){return Promise.reject(e)}},r}(),g=o.getSentry(),w=i.v.object({calls:i.v.array(i.v.object({id:i.v.string(),name:i.v.string(),payload:i.v.any()}))}),b=o.getSentry();exports.Group=m,exports.Handler=y,exports.createServer=function(r){return function(t){var n=function(e){return Object.entries(e).flatMap(function(e){var r=e[0],t=e[1];return t instanceof y?[r]:"object"==typeof t?n(t).map(function(e){return r+":"+e}):[]})};return{handlerNames:n(t),runMany:function(n,o){try{return Promise.resolve(Promise.all(o.calls.map(function(a,i){try{return Promise.resolve(function(n,o,a){try{var i=d({},n,{body:o.payload});return Promise.resolve(function(r,a){try{var s=(u=function(e){for(var r=e.split(":"),n=t;n&&r.length>0;)if(!(n=n[r.shift()]))return null;return n&&n instanceof y?n:null}(o.name))?Promise.resolve(u.run(i,{})).then(function(e){return{status:200,request:n,response:e.response}}):{request:i,status:404,response:e.notFoundError({entity:"handler"}).toResponse()}}catch(e){return a(e)}var u;return s&&s.then?s.then(void 0,a):s}(0,function(t){return console.error(t),e.isServiceError(t)?(t.data.status>=500&&b.captureException(t,{tags:{reqId:a}}),{request:i,status:t.data.status,response:t.toResponse()}):(b.captureException(t,{tags:{reqId:a}}),null==r.onError||r.onError({callName:o.name,callId:o.id,request:n,error:t,reqId:a}),{request:i,status:500,response:e.internalServerError().toResponse()})}))}catch(e){return Promise.reject(e)}}(n,a,o.requestId)).then(function(e){try{null==r.onRequest||r.onRequest({reqId:o.requestId,callId:a.id,callName:a.name,request:e.request,response:{status:e.status,body:e.response}})}catch(e){b.captureException(e),console.error(e)}return{__typename:"rpc.response.call",id:a.id,name:a.name,status:e.status,result:e.response}})}catch(e){return Promise.reject(e)}}))).then(function(e){return{status:Math.max.apply(Math,e.map(function(e){return e.status})),body:{__typename:"rpc.response",calls:e}}})}catch(e){return Promise.reject(e)}}}}},exports.rpcMux=function(o,i){var s=new Map(i.flatMap(function(e,r){return e.handlerNames.map(function(e){return[e,r]})}));return{path:o.path,fetch:function(c){try{var d,f,h,p=function(o){var d,f,p,v;if(h)return o;var y=c.headers.get("sentry-trace"),P=null!=(d=Array.isArray(y)?y.join(","):y)?d:void 0,q=c.headers.get("baggage"),M=function(e){if("string"==typeof e){var r=e.split(",").map(function(e){return e.trim()}).filter(Boolean);return r.length>0?r[0]:void 0}}(null!=(f=null!=(p=null!=(v=c.headers.get("lowerdeck-connecting-ip"))?v:c.headers.get("cf-connecting-ip"))?p:c.headers.get("x-forwarded-for"))?f:c.headers.get("x-real-ip")),_=new Headers;if(m)for(var x=0,E=Object.entries(S);x<E.length;x++){var O=E[x];_.append(O[0],O[1])}return Promise.resolve(g.withIsolationScope(function(){try{return Promise.resolve(g.continueTrace({sentryTrace:P,baggage:q},function(){try{var o,d;return Promise.resolve(g.startSpan({name:"rpc request",op:"rpc.server",attributes:{ip:M,transport:"http",ua:null!=(o=c.headers.get("user-agent"))?o:"",origin:null!=(d=c.headers.get("origin"))?d:""}},function(){try{try{var o,d=[],f=t.generateCustomId("req_"),h=n.memo(function(){var e;return u.parse(null!=(e=c.headers.get("cookie"))?e:"")}),p={url:c.url,headers:c.headers,query:b.searchParams,body:j,rawBody:j,ip:M,requestId:f,getCookies:function(){return h()},getCookie:function(e){return h()[e]},setCookie:function(e,r,t){var n=u.serialize(e,r,t);_.append("Set-Cookie",n)},beforeSend:function(e){d.push(e)},sharedMiddlewareMemo:new Map,appendHeaders:function(e){for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],a=n[1];if(Array.isArray(a))for(var i,s=l(a);!(i=s()).done;)_.append(o,i.value);else _.append(o,a)}}};return g.getCurrentScope().setContext("rpc.request",{url:c.url,query:Object.fromEntries(b.searchParams.entries())}),g.getCurrentScope().addAttachment({filename:"rpc.request.body.json",data:j,contentType:"application/json"}),Promise.resolve(r.provideExecutionContext(r.createExecutionContext({type:"request",contextId:f,ip:null!=M?M:"0.0.0.0",userAgent:null!=(o=c.headers.get("user-agent"))?o:""}),function(){try{var r=new Map,n={body:{__typename:"rpc.response",calls:[]},status:200},o=b.pathname.split("/").filter(Boolean),u=o[o.length-1];if("$"==u[0]){var c,h=u.slice(1),v=s.get(h);if(null==v)return Promise.resolve(new Response(JSON.stringify(e.notFoundError({entity:"handler"}).toResponse()),{status:404,headers:_}));var m=null!=(c=r.get(v))?c:[];m.push({id:t.generateCustomId("call_"),name:h,payload:j}),r.set(v,m)}else{var y=w.validate(j);if(!y.success)return Promise.resolve(new Response(JSON.stringify(e.validationError({errors:y.errors,entity:"request_data"}).toResponse()),{status:406,headers:_}));for(var g,P=l(y.value.calls);!(g=P()).done;){var S,q=g.value,M=s.get(q.name);if(null==M)return Promise.resolve(new Response(JSON.stringify(e.notFoundError({entity:"handler"}).toResponse()),{status:404,headers:_}));var x=null!=(S=r.get(M))?S:[];x.push(q),r.set(M,x)}}return Promise.resolve(Promise.all(Array.from(r.entries()).map(function(e){var r=e[0],t=e[1];try{return Promise.resolve(i[r].runMany(p,{requestId:f,calls:t})).then(function(e){var r;n.status=Math.max(n.status,e.status),(r=n.body.calls).push.apply(r,e.body.calls)})}catch(e){return Promise.reject(e)}}))).then(function(){return _.append("x-req-id",f),_.append("content-type","application/rpc+json"),_.append("x-powered-by","lowerdeck RPC"),Promise.resolve(Promise.all(d.map(function(e){return e()}))).then(function(){return new Response(a.serialize.encode(n.body),{status:n.status,headers:_})})})}catch(e){return Promise.reject(e)}}))}catch(r){return console.error(r),g.captureException(r),Promise.resolve(new Response(JSON.stringify(e.internalServerError().toResponse()),{status:500,headers:_}))}}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))},v=null!=(d=c.headers.get("origin"))?d:"",m=!1;if(o.cors&&"domains"in o.cors)try{var y=new URL(v).hostname.split(".").slice(-2).join(".");m=o.cors.domains.includes(y)}catch(e){}else o.cors&&"check"in o.cors&&(m=o.cors.check(v));var b=new URL(c.url),P=null==(f=o.cors)||null==(f=f.headers)?void 0:f.join(", ");P&&(P=(", "+P).trim());var S=m?{"access-control-allow-origin":v,"access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"Content-Type, Authorization, Baggage, Sentry-Trace"+(null!=P?P:""),"access-control-max-age":"604800","access-control-allow-credentials":"true"}:{};if("OPTIONS"==c.method)return Promise.resolve(m?new Response(null,{status:204,headers:S}):new Response(null,{status:403}));var j=null,q=function(e,r){try{var t=e()}catch(e){return r()}return t&&t.then?t.then(void 0,r):t}(function(){var e=a.serialize.decode;return Promise.resolve(c.text()).then(function(r){j=e.call(a.serialize,r)})},function(){var r=new Response(JSON.stringify(e.notAcceptableError({message:"Invalid JSON"}).toResponse()),{status:406});return h=1,r});return Promise.resolve(q&&q.then?q.then(p):p(q))}catch(e){return Promise.reject(e)}}}};
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/controller.ts","../src/rpcMux.ts","../src/server.ts","../src/extractIp.ts"],"sourcesContent":["import { ServiceError, validationError } from '@lowerdeck/error';\nimport { ValidationType } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\n\nexport type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface ServiceRequest {\n query: URLSearchParams;\n headers: Headers;\n url: string;\n ip?: string;\n body: any;\n rawBody: any;\n requestId: string;\n\n getCookies: () => Record<string, string | undefined>;\n getCookie: (name: string) => string | undefined;\n setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;\n\n sharedMiddlewareMemo: Map<string, Promise<any>>;\n beforeSend: (handler: () => Promise<any>) => void;\n appendHeaders: (headers: Record<string, string | string[]>) => void;\n}\n\nexport type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\nexport type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;\n\nexport class Group<Context extends { [key: string]: any } = {}> {\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n use<T extends { [key: string]: any } | undefined | void>(\n handler: (ctx: Context & ServiceRequest) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;\n }\n ) {\n let middleware = async (ctx: Parameters<typeof handler>[0]): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n\n return new Group<Simplify<Context & T>>([...this._middleware, middleware]);\n }\n\n createMiddleware<T extends { [key: string]: any }, P = void>(\n handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;\n }\n ) {\n return (input: P) =>\n async (ctx: Context & ServiceRequest): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx, input);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx, input);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n }\n\n handler() {\n return new Handler([...this._middleware]);\n }\n\n controller<\n HandlersAndSubControllers extends {\n [key: string]: Handler<any, any, any> | Controller<any>;\n }\n >(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers> {\n return handlers;\n }\n}\n\nexport type Controller<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = HandlersAndSubControllers;\n\nexport type InferControllerType<T> = T extends Controller<infer U> ? U : never;\n\nexport type InferClient<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = {\n [K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<\n infer I,\n infer O,\n infer C\n >\n ? ((\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<O>) & {\n getFull: (\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<{\n data: O;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n : HandlersAndSubControllers[K] extends Controller<infer U>\n ? InferClient<U>\n : never;\n};\n\nexport class Handler<Input, Output, Context extends { [key: string]: any } = {}> {\n private _handler!: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<Output>;\n private _validation: ValidationType<Input> | undefined;\n\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n do<HandlerOutput>(\n handler: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<HandlerOutput>\n ) {\n if (this._handler != undefined) throw new Error('Handler already defined');\n\n // @ts-ignore\n this._handler = handler;\n\n return this as any as Handler<Input, HandlerOutput, Context>;\n }\n\n use<T extends { [key: string]: any } = {}>(\n handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>\n ) {\n this._middleware.push(handler);\n return this as any as Handler<Input, Output, ExtendContext<Context, T>>;\n }\n\n input<HandlerInput>(validation: ValidationType<HandlerInput>) {\n if (this._validation != undefined) throw new Error('Input validation already defined');\n\n // @ts-ignore\n this._validation = validation;\n\n return this as any as Handler<HandlerInput, Output, Context>;\n }\n\n async run(\n req: ServiceRequest,\n initialContext: any\n ): Promise<{\n response: Output;\n }> {\n if (!this._handler) throw new Error('Handler not defined');\n\n let input = req.body as Input;\n\n if (this._validation) {\n let valRes = this._validation.validate(req.body);\n\n if (!valRes.success) {\n throw new ServiceError(\n validationError({ errors: valRes.errors, entity: 'call_data' })\n );\n }\n\n input = valRes.value;\n }\n\n let ctx = {\n ...initialContext,\n ...req,\n\n // Always use the sanitized input\n body: input\n };\n\n for (let mw of this._middleware) {\n let res = await mw(ctx);\n if (res) ctx = { ...ctx, ...res };\n }\n\n let res = await this._handler({\n ...ctx,\n input,\n body: undefined\n });\n\n return {\n response: res\n };\n }\n}\n","import {\n internalServerError,\n notAcceptableError,\n notFoundError,\n validationError\n} from '@lowerdeck/error';\nimport { createExecutionContext, provideExecutionContext } from '@lowerdeck/execution-context';\nimport { generateCustomId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { serialize } from '@lowerdeck/serialize';\nimport { v } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\nimport { ServiceRequest } from './controller';\nimport { parseForwardedFor } from './extractIp';\n\nlet Sentry = getSentry();\n\nlet validation = v.object({\n calls: v.array(\n v.object({\n id: v.string(),\n name: v.string(),\n payload: v.any()\n })\n )\n});\n\nexport let rpcMux = (\n opts: {\n path: string;\n cors?: {\n headers?: string[];\n } & ({ domains: string[] } | { check: (origin: string) => boolean });\n },\n rpcs: {\n handlerNames: string[];\n runMany: (\n req: ServiceRequest,\n body: {\n requestId: string;\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n }\n ) => Promise<{\n status: number;\n body: {\n calls: any[];\n };\n }>;\n }[]\n) => {\n let handlerNameToRpcMap = new Map<string, number>(\n rpcs.flatMap((rpc, i) => rpc.handlerNames.map(name => [name, i]))\n );\n\n return {\n path: opts.path,\n\n fetch: async (req: any): Promise<any> => {\n let origin = req.headers.get('origin') ?? '';\n let corsOk = false;\n\n if (opts.cors && 'domains' in opts.cors) {\n try {\n let url = new URL(origin);\n let rootDomain = url.hostname.split('.').slice(-2).join('.');\n corsOk = opts.cors.domains.includes(rootDomain);\n } catch (e) {\n // Ignore -> no cors\n }\n } else if (opts.cors && 'check' in opts.cors) {\n corsOk = opts.cors.check(origin);\n }\n\n let url = new URL(req.url);\n\n let additionalCorsHeaders = opts.cors?.headers?.join(', ');\n if (additionalCorsHeaders) additionalCorsHeaders = `, ${additionalCorsHeaders}`.trim();\n\n let corsHeaders: Record<string, string> = corsOk\n ? {\n 'access-control-allow-origin': origin,\n 'access-control-allow-methods': 'POST, OPTIONS',\n 'access-control-allow-headers': `Content-Type, Authorization, Baggage, Sentry-Trace${\n additionalCorsHeaders ?? ''\n }`,\n 'access-control-max-age': '604800',\n 'access-control-allow-credentials': 'true'\n }\n : {};\n\n if (req.method == 'OPTIONS') {\n if (corsOk) {\n return new Response(null, {\n status: 204,\n headers: corsHeaders\n });\n }\n\n return new Response(null, { status: 403 });\n }\n\n let body: any = null;\n\n try {\n body = serialize.decode(await req.text());\n } catch (e) {\n return new Response(\n JSON.stringify(notAcceptableError({ message: 'Invalid JSON' }).toResponse()),\n { status: 406 }\n );\n }\n\n let sentryTraceHeaders = req.headers.get('sentry-trace');\n let sentryTrace =\n (Array.isArray(sentryTraceHeaders)\n ? sentryTraceHeaders.join(',')\n : sentryTraceHeaders) ?? undefined;\n let baggage = req.headers.get('baggage');\n\n let ip = parseForwardedFor(\n req.headers.get('lowerdeck-connecting-ip') ??\n req.headers.get('cf-connecting-ip') ??\n req.headers.get('x-forwarded-for') ??\n req.headers.get('x-real-ip')\n );\n\n let headers = new Headers();\n\n if (corsOk) {\n for (let [key, value] of Object.entries(corsHeaders)) {\n headers.append(key, value);\n }\n }\n\n return await Sentry.withIsolationScope(\n async () =>\n await Sentry.continueTrace(\n { sentryTrace, baggage },\n async () =>\n await Sentry.startSpan(\n {\n name: 'rpc request',\n op: 'rpc.server',\n attributes: {\n ip,\n transport: 'http',\n ua: req.headers.get('user-agent') ?? '',\n origin: req.headers.get('origin') ?? ''\n }\n },\n async () => {\n try {\n let beforeSends: Array<() => Promise<any>> = [];\n let id = generateCustomId('req_');\n\n let parseCookies = memo(() =>\n Cookie.parse(req.headers.get('cookie') ?? '')\n );\n\n let request: ServiceRequest = {\n url: req.url,\n headers: req.headers,\n query: url.searchParams,\n body,\n rawBody: body,\n ip,\n requestId: id,\n\n getCookies: () => parseCookies(),\n getCookie: (name: string) => parseCookies()[name],\n setCookie: (name: string, value: string, opts?: any) => {\n let cookie = Cookie.serialize(name, value, opts);\n // @ts-ignore\n headers.append('Set-Cookie', cookie);\n },\n\n beforeSend: (handler: () => Promise<any>) => {\n beforeSends.push(handler);\n },\n\n sharedMiddlewareMemo: new Map<string, Promise<any>>(),\n\n appendHeaders: (newHeaders: Record<string, string | string[]>) => {\n for (let [key, value] of Object.entries(newHeaders)) {\n if (Array.isArray(value)) {\n for (let v of value) headers.append(key, v);\n } else {\n headers.append(key, value);\n }\n }\n }\n };\n\n Sentry.getCurrentScope().setContext('rpc.request', {\n url: req.url,\n query: Object.fromEntries(url.searchParams.entries())\n });\n\n Sentry.getCurrentScope().addAttachment({\n filename: 'rpc.request.body.json',\n data: body,\n contentType: 'application/json'\n });\n\n let valRes = validation.validate(body);\n if (!valRes.success) {\n return new Response(\n JSON.stringify(\n validationError({\n errors: valRes.errors,\n entity: 'request_data'\n }).toResponse()\n ),\n { status: 406, headers }\n );\n }\n\n return provideExecutionContext(\n createExecutionContext({\n type: 'request',\n contextId: id,\n ip: ip ?? '0.0.0.0',\n userAgent: req.headers.get('user-agent') ?? ''\n }),\n async () => {\n let callsByRpc = new Map<\n number,\n { id: string; name: string; payload: any }[]\n >();\n\n for (let call of body.calls) {\n let rpcIndex = handlerNameToRpcMap.get(call.name);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push(call);\n callsByRpc.set(rpcIndex, calls);\n }\n\n // let res = await runMany(request);\n\n let resRef = {\n body: {\n __typename: 'rpc.response',\n calls: [] as any[]\n },\n status: 200\n };\n\n await Promise.all(\n Array.from(callsByRpc.entries()).map(async ([rpcIndex, calls]) => {\n let rpc = rpcs[rpcIndex];\n let res = await rpc.runMany(request, {\n requestId: id,\n calls\n });\n\n resRef.status = Math.max(resRef.status, res.status);\n resRef.body.calls.push(...res.body.calls);\n })\n );\n\n headers.append('x-req-id', id);\n headers.append('content-type', 'application/rpc+json');\n headers.append('x-powered-by', 'lowerdeck RPC');\n\n await Promise.all(beforeSends.map(s => s()));\n\n return new Response(serialize.encode(resRef.body), {\n status: resRef.status,\n headers\n });\n }\n );\n } catch (e) {\n console.error(e);\n\n Sentry.captureException(e);\n\n return new Response(JSON.stringify(internalServerError().toResponse()), {\n status: 500,\n headers\n });\n }\n }\n )\n )\n );\n }\n };\n};\n","import { internalServerError, isServiceError, notFoundError } from '@lowerdeck/error';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { Controller, Handler, ServiceRequest } from './controller';\n\nlet Sentry = getSentry();\n\nexport let createServer =\n (opts: {\n onError?: (opts: {\n request: ServiceRequest;\n error: any;\n reqId: string;\n callId: string;\n callName: string;\n }) => void;\n onRequest?: (opts: {\n reqId: string;\n callId: string;\n callName: string;\n request: ServiceRequest;\n response: { status: number; body: any };\n }) => void;\n }) =>\n (controller: Controller<any>) => {\n let findHandler = (name: string): Handler<any, any, any> | null => {\n let parts = name.split(':');\n let current = controller;\n\n while (current && parts.length > 0) {\n current = current[parts.shift()!];\n if (!current) return null;\n }\n\n if (current && current instanceof Handler) return current;\n\n return null;\n };\n\n let getSupportedHandlerNames = (controller: Controller<any>): string[] =>\n Object.entries(controller).flatMap(([key, value]) => {\n if (value instanceof Handler) return [key];\n if (typeof value == 'object')\n return getSupportedHandlerNames(value).map(name => `${key}:${name}`);\n return [];\n });\n\n let handlerNames = getSupportedHandlerNames(controller);\n\n let run = async (\n req: ServiceRequest,\n call: { id: string; name: string; payload: any },\n reqId: string\n ): Promise<{\n response: any;\n status: number;\n request: ServiceRequest;\n }> => {\n let request = { ...req, body: call.payload };\n\n try {\n let handler = findHandler(call.name);\n\n if (!handler) {\n return {\n request,\n status: 404,\n response: notFoundError({ entity: 'handler' }).toResponse()\n };\n }\n\n let response = await handler.run(request, {});\n\n return {\n status: 200,\n request: req,\n response: response.response\n };\n } catch (e) {\n console.error(e);\n\n if (isServiceError(e)) {\n if (e.data.status >= 500) {\n Sentry.captureException(e, {\n tags: { reqId }\n });\n }\n\n return {\n request,\n status: e.data.status,\n response: e.toResponse()\n };\n }\n\n Sentry.captureException(e, {\n tags: { reqId }\n });\n\n opts.onError?.({\n callName: call.name,\n callId: call.id,\n request: req,\n error: e,\n reqId\n });\n\n return {\n request,\n status: 500,\n response: internalServerError().toResponse()\n };\n }\n };\n\n let runMany = async (\n req: ServiceRequest,\n body: {\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n requestId: string;\n }\n ): Promise<{\n status: number;\n body: any;\n }> => {\n let callRes = await Promise.all(\n body.calls.map(async (call, i) => {\n let res = await run(req, call as any, body.requestId);\n\n try {\n opts.onRequest?.({\n reqId: body.requestId,\n callId: call.id,\n callName: call.name,\n request: res.request,\n response: { status: res.status, body: res.response }\n });\n } catch (e) {\n Sentry.captureException(e);\n console.error(e);\n }\n\n return {\n __typename: 'rpc.response.call',\n id: call.id,\n name: call.name,\n status: res.status,\n result: res.response\n };\n })\n );\n\n return {\n status: Math.max(...callRes.map(c => c.status)),\n body: {\n __typename: 'rpc.response',\n calls: callRes\n }\n };\n };\n\n return {\n handlerNames,\n runMany\n\n // fetch,\n\n // http: async (\n // req: IncomingMessage & {\n // body: any;\n // },\n // res: ServerResponse & { send: (body: any) => void }\n // ) => {\n // let headers = new Headers(\n // Object.fromEntries(\n // Object.entries(req.headers).map(([key, value]) => [\n // key,\n // value === undefined ? '' : String(value)\n // ])\n // )\n // );\n // let url = new URL(req.url ?? '', `http://${req.headers.host}`);\n\n // let request = new Request(url.toString(), {\n // method: req.method,\n // headers,\n // body: JSON.stringify(req.body)\n // });\n\n // let response = await fetch(request);\n\n // res.statusCode = response.status;\n\n // for (let [key, value] of response.headers.entries()) {\n // res.setHeader(key, value);\n // }\n\n // res.send(response.body);\n // }\n };\n };\n","export let parseForwardedFor = (xForwardedForHeader?: string | null | undefined) => {\n if (typeof xForwardedForHeader != 'string') return undefined;\n\n let ips = xForwardedForHeader\n .split(',')\n .map(ip => ip.trim())\n .filter(Boolean);\n return ips.length > 0 ? ips[0] : undefined;\n};\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","Group","_middleware","_proto","use","handler","opts","concat","ctx","_exit","_temp2","_result","res","key","sharedMiddlewareMemo","set","Promise","resolve","getSharedMemoKey","_temp","has","get","_await$ctx$sharedMidd","reject","createMiddleware","input","_exit2","_temp4","_result2","_temp3","_await$ctx$sharedMidd2","Handler","controller","handlers","_handler","_validation","_proto2","undefined","Error","push","validation","run","req","initialContext","_temp6","_extends","body","response","valRes","validate","success","ServiceError","validationError","errors","entity","_temp5","_forOf","mw","Sentry","getSentry","object","calls","array","id","string","name","payload","any","getSupportedHandlerNames","Object","entries","flatMap","_ref","map","handlerNames","runMany","all","call","i","reqId","request","parts","split","current","length","shift","findHandler","status","notFoundError","toResponse","_catch","console","error","isServiceError","data","captureException","tags","onError","callName","callId","internalServerError","requestId","onRequest","__typename","callRes","Math","max","apply","c","rpcs","handlerNameToRpcMap","Map","rpc","path","fetch","_req$headers$get6","_opts$cors","_ref2","_ref3","_req$headers$get","sentryTraceHeaders","headers","sentryTrace","Array","isArray","join","baggage","ip","xForwardedForHeader","ips","trim","filter","Boolean","parseForwardedFor","Headers","corsOk","_i","_Object$entries","corsHeaders","_Object$entries$_i","append","withIsolationScope","continueTrace","_req$headers$get2","_req$headers$get3","startSpan","op","attributes","transport","ua","origin","_req$headers$get5","beforeSends","generateCustomId","parseCookies","memo","_req$headers$get4","Cookie","parse","url","query","searchParams","rawBody","getCookies","getCookie","setCookie","cookie","serialize","beforeSend","appendHeaders","newHeaders","_i2","_Object$entries2","_Object$entries2$_i","_iterator","_step","_createForOfIteratorHelperLoose","done","getCurrentScope","setContext","fromEntries","addAttachment","filename","contentType","provideExecutionContext","createExecutionContext","type","contextId","userAgent","_step2","callsByRpc","_iterator2","_callsByRpc$get","rpcIndex","Response","JSON","stringify","resRef","from","_ref4","_resRef$body$calls","encode","cors","rootDomain","URL","hostname","slice","domains","includes","check","additionalCorsHeaders","method","_decode","decode","text","_req$text","_Response","notAcceptableError","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/controller.ts","../src/rpcMux.ts","../src/server.ts","../src/extractIp.ts"],"sourcesContent":["import { ServiceError, validationError } from '@lowerdeck/error';\nimport { ValidationType } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\n\nexport type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface ServiceRequest {\n query: URLSearchParams;\n headers: Headers;\n url: string;\n ip?: string;\n body: any;\n rawBody: any;\n requestId: string;\n\n getCookies: () => Record<string, string | undefined>;\n getCookie: (name: string) => string | undefined;\n setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;\n\n sharedMiddlewareMemo: Map<string, Promise<any>>;\n beforeSend: (handler: () => Promise<any>) => void;\n appendHeaders: (headers: Record<string, string | string[]>) => void;\n}\n\nexport type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\nexport type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;\n\nexport class Group<Context extends { [key: string]: any } = {}> {\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n use<T extends { [key: string]: any } | undefined | void>(\n handler: (ctx: Context & ServiceRequest) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;\n }\n ) {\n let middleware = async (ctx: Parameters<typeof handler>[0]): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n\n return new Group<Simplify<Context & T>>([...this._middleware, middleware]);\n }\n\n createMiddleware<T extends { [key: string]: any }, P = void>(\n handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;\n }\n ) {\n return (input: P) =>\n async (ctx: Context & ServiceRequest): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx, input);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx, input);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n }\n\n handler() {\n return new Handler([...this._middleware]);\n }\n\n controller<\n HandlersAndSubControllers extends {\n [key: string]: Handler<any, any, any> | Controller<any>;\n }\n >(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers> {\n return handlers;\n }\n}\n\nexport type Controller<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = HandlersAndSubControllers;\n\nexport type InferControllerType<T> = T extends Controller<infer U> ? U : never;\n\nexport type InferClient<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = {\n [K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<\n infer I,\n infer O,\n infer C\n >\n ? ((\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<O>) & {\n getFull: (\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<{\n data: O;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n : HandlersAndSubControllers[K] extends Controller<infer U>\n ? InferClient<U>\n : never;\n};\n\nexport class Handler<Input, Output, Context extends { [key: string]: any } = {}> {\n private _handler!: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<Output>;\n private _validation: ValidationType<Input> | undefined;\n\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n do<HandlerOutput>(\n handler: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<HandlerOutput>\n ) {\n if (this._handler != undefined) throw new Error('Handler already defined');\n\n // @ts-ignore\n this._handler = handler;\n\n return this as any as Handler<Input, HandlerOutput, Context>;\n }\n\n use<T extends { [key: string]: any } = {}>(\n handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>\n ) {\n this._middleware.push(handler);\n return this as any as Handler<Input, Output, ExtendContext<Context, T>>;\n }\n\n input<HandlerInput>(validation: ValidationType<HandlerInput>) {\n if (this._validation != undefined) throw new Error('Input validation already defined');\n\n // @ts-ignore\n this._validation = validation;\n\n return this as any as Handler<HandlerInput, Output, Context>;\n }\n\n async run(\n req: ServiceRequest,\n initialContext: any\n ): Promise<{\n response: Output;\n }> {\n if (!this._handler) throw new Error('Handler not defined');\n\n let input = req.body as Input;\n\n if (this._validation) {\n let valRes = this._validation.validate(req.body);\n\n if (!valRes.success) {\n throw new ServiceError(\n validationError({ errors: valRes.errors, entity: 'call_data' })\n );\n }\n\n input = valRes.value;\n }\n\n let ctx = {\n ...initialContext,\n ...req,\n\n // Always use the sanitized input\n body: input\n };\n\n for (let mw of this._middleware) {\n let res = await mw(ctx);\n if (res) ctx = { ...ctx, ...res };\n }\n\n let res = await this._handler({\n ...ctx,\n input,\n body: undefined\n });\n\n return {\n response: res\n };\n }\n}\n","import {\n internalServerError,\n notAcceptableError,\n notFoundError,\n validationError\n} from '@lowerdeck/error';\nimport { createExecutionContext, provideExecutionContext } from '@lowerdeck/execution-context';\nimport { generateCustomId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { serialize } from '@lowerdeck/serialize';\nimport { v } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\nimport { ServiceRequest } from './controller';\nimport { parseForwardedFor } from './extractIp';\n\nlet Sentry = getSentry();\n\nlet validation = v.object({\n calls: v.array(\n v.object({\n id: v.string(),\n name: v.string(),\n payload: v.any()\n })\n )\n});\n\nexport let rpcMux = (\n opts: {\n path: string;\n cors?: {\n headers?: string[];\n } & ({ domains: string[] } | { check: (origin: string) => boolean });\n },\n rpcs: {\n handlerNames: string[];\n runMany: (\n req: ServiceRequest,\n body: {\n requestId: string;\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n }\n ) => Promise<{\n status: number;\n body: {\n calls: any[];\n };\n }>;\n }[]\n) => {\n let handlerNameToRpcMap = new Map<string, number>(\n rpcs.flatMap((rpc, i) => rpc.handlerNames.map(name => [name, i]))\n );\n\n return {\n path: opts.path,\n\n fetch: async (req: any): Promise<any> => {\n let origin = req.headers.get('origin') ?? '';\n let corsOk = false;\n\n if (opts.cors && 'domains' in opts.cors) {\n try {\n let url = new URL(origin);\n let rootDomain = url.hostname.split('.').slice(-2).join('.');\n corsOk = opts.cors.domains.includes(rootDomain);\n } catch (e) {\n // Ignore -> no cors\n }\n } else if (opts.cors && 'check' in opts.cors) {\n corsOk = opts.cors.check(origin);\n }\n\n let url = new URL(req.url);\n\n let additionalCorsHeaders = opts.cors?.headers?.join(', ');\n if (additionalCorsHeaders) additionalCorsHeaders = `, ${additionalCorsHeaders}`.trim();\n\n let corsHeaders: Record<string, string> = corsOk\n ? {\n 'access-control-allow-origin': origin,\n 'access-control-allow-methods': 'POST, OPTIONS',\n 'access-control-allow-headers': `Content-Type, Authorization, Baggage, Sentry-Trace${\n additionalCorsHeaders ?? ''\n }`,\n 'access-control-max-age': '604800',\n 'access-control-allow-credentials': 'true'\n }\n : {};\n\n if (req.method == 'OPTIONS') {\n if (corsOk) {\n return new Response(null, {\n status: 204,\n headers: corsHeaders\n });\n }\n\n return new Response(null, { status: 403 });\n }\n\n let body: any = null;\n\n try {\n body = serialize.decode(await req.text());\n } catch (e) {\n return new Response(\n JSON.stringify(notAcceptableError({ message: 'Invalid JSON' }).toResponse()),\n { status: 406 }\n );\n }\n\n let sentryTraceHeaders = req.headers.get('sentry-trace');\n let sentryTrace =\n (Array.isArray(sentryTraceHeaders)\n ? sentryTraceHeaders.join(',')\n : sentryTraceHeaders) ?? undefined;\n let baggage = req.headers.get('baggage');\n\n let ip = parseForwardedFor(\n req.headers.get('lowerdeck-connecting-ip') ??\n req.headers.get('cf-connecting-ip') ??\n req.headers.get('x-forwarded-for') ??\n req.headers.get('x-real-ip')\n );\n\n let headers = new Headers();\n\n if (corsOk) {\n for (let [key, value] of Object.entries(corsHeaders)) {\n headers.append(key, value);\n }\n }\n\n return await Sentry.withIsolationScope(\n async () =>\n await Sentry.continueTrace(\n { sentryTrace, baggage },\n async () =>\n await Sentry.startSpan(\n {\n name: 'rpc request',\n op: 'rpc.server',\n attributes: {\n ip,\n transport: 'http',\n ua: req.headers.get('user-agent') ?? '',\n origin: req.headers.get('origin') ?? ''\n }\n },\n async () => {\n try {\n let beforeSends: Array<() => Promise<any>> = [];\n let id = generateCustomId('req_');\n\n let parseCookies = memo(() =>\n Cookie.parse(req.headers.get('cookie') ?? '')\n );\n\n let request: ServiceRequest = {\n url: req.url,\n headers: req.headers,\n query: url.searchParams,\n body,\n rawBody: body,\n ip,\n requestId: id,\n\n getCookies: () => parseCookies(),\n getCookie: (name: string) => parseCookies()[name],\n setCookie: (name: string, value: string, opts?: any) => {\n let cookie = Cookie.serialize(name, value, opts);\n // @ts-ignore\n headers.append('Set-Cookie', cookie);\n },\n\n beforeSend: (handler: () => Promise<any>) => {\n beforeSends.push(handler);\n },\n\n sharedMiddlewareMemo: new Map<string, Promise<any>>(),\n\n appendHeaders: (newHeaders: Record<string, string | string[]>) => {\n for (let [key, value] of Object.entries(newHeaders)) {\n if (Array.isArray(value)) {\n for (let v of value) headers.append(key, v);\n } else {\n headers.append(key, value);\n }\n }\n }\n };\n\n Sentry.getCurrentScope().setContext('rpc.request', {\n url: req.url,\n query: Object.fromEntries(url.searchParams.entries())\n });\n\n Sentry.getCurrentScope().addAttachment({\n filename: 'rpc.request.body.json',\n data: body,\n contentType: 'application/json'\n });\n\n return provideExecutionContext(\n createExecutionContext({\n type: 'request',\n contextId: id,\n ip: ip ?? '0.0.0.0',\n userAgent: req.headers.get('user-agent') ?? ''\n }),\n async () => {\n let callsByRpc = new Map<\n number,\n { id: string; name: string; payload: any }[]\n >();\n\n let resRef = {\n body: {\n __typename: 'rpc.response',\n calls: [] as any[]\n },\n status: 200\n };\n\n let pathParts = url.pathname.split('/').filter(Boolean);\n let lastPart = pathParts[pathParts.length - 1];\n\n if (lastPart[0] == '$') {\n let id = lastPart.slice(1);\n let rpcIndex = handlerNameToRpcMap.get(id);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push({\n id: generateCustomId('call_'),\n name: id,\n payload: body\n });\n callsByRpc.set(rpcIndex, calls);\n } else {\n let valRes = validation.validate(body);\n if (!valRes.success) {\n return new Response(\n JSON.stringify(\n validationError({\n errors: valRes.errors,\n entity: 'request_data'\n }).toResponse()\n ),\n { status: 406, headers }\n );\n }\n\n for (let call of valRes.value.calls) {\n let rpcIndex = handlerNameToRpcMap.get(call.name);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push(call as any);\n callsByRpc.set(rpcIndex, calls);\n }\n }\n\n await Promise.all(\n Array.from(callsByRpc.entries()).map(async ([rpcIndex, calls]) => {\n let rpc = rpcs[rpcIndex];\n let res = await rpc.runMany(request, {\n requestId: id,\n calls\n });\n\n resRef.status = Math.max(resRef.status, res.status);\n resRef.body.calls.push(...res.body.calls);\n })\n );\n\n headers.append('x-req-id', id);\n headers.append('content-type', 'application/rpc+json');\n headers.append('x-powered-by', 'lowerdeck RPC');\n\n await Promise.all(beforeSends.map(s => s()));\n\n return new Response(serialize.encode(resRef.body), {\n status: resRef.status,\n headers\n });\n }\n );\n } catch (e) {\n console.error(e);\n\n Sentry.captureException(e);\n\n return new Response(JSON.stringify(internalServerError().toResponse()), {\n status: 500,\n headers\n });\n }\n }\n )\n )\n );\n }\n };\n};\n","import { internalServerError, isServiceError, notFoundError } from '@lowerdeck/error';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { Controller, Handler, ServiceRequest } from './controller';\n\nlet Sentry = getSentry();\n\nexport let createServer =\n (opts: {\n onError?: (opts: {\n request: ServiceRequest;\n error: any;\n reqId: string;\n callId: string;\n callName: string;\n }) => void;\n onRequest?: (opts: {\n reqId: string;\n callId: string;\n callName: string;\n request: ServiceRequest;\n response: { status: number; body: any };\n }) => void;\n }) =>\n (controller: Controller<any>) => {\n let findHandler = (name: string): Handler<any, any, any> | null => {\n let parts = name.split(':');\n let current = controller;\n\n while (current && parts.length > 0) {\n current = current[parts.shift()!];\n if (!current) return null;\n }\n\n if (current && current instanceof Handler) return current;\n\n return null;\n };\n\n let getSupportedHandlerNames = (controller: Controller<any>): string[] =>\n Object.entries(controller).flatMap(([key, value]) => {\n if (value instanceof Handler) return [key];\n if (typeof value == 'object')\n return getSupportedHandlerNames(value).map(name => `${key}:${name}`);\n return [];\n });\n\n let handlerNames = getSupportedHandlerNames(controller);\n\n let run = async (\n req: ServiceRequest,\n call: { id: string; name: string; payload: any },\n reqId: string\n ): Promise<{\n response: any;\n status: number;\n request: ServiceRequest;\n }> => {\n let request = { ...req, body: call.payload };\n\n try {\n let handler = findHandler(call.name);\n\n if (!handler) {\n return {\n request,\n status: 404,\n response: notFoundError({ entity: 'handler' }).toResponse()\n };\n }\n\n let response = await handler.run(request, {});\n\n return {\n status: 200,\n request: req,\n response: response.response\n };\n } catch (e) {\n console.error(e);\n\n if (isServiceError(e)) {\n if (e.data.status >= 500) {\n Sentry.captureException(e, {\n tags: { reqId }\n });\n }\n\n return {\n request,\n status: e.data.status,\n response: e.toResponse()\n };\n }\n\n Sentry.captureException(e, {\n tags: { reqId }\n });\n\n opts.onError?.({\n callName: call.name,\n callId: call.id,\n request: req,\n error: e,\n reqId\n });\n\n return {\n request,\n status: 500,\n response: internalServerError().toResponse()\n };\n }\n };\n\n let runMany = async (\n req: ServiceRequest,\n body: {\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n requestId: string;\n }\n ): Promise<{\n status: number;\n body: any;\n }> => {\n let callRes = await Promise.all(\n body.calls.map(async (call, i) => {\n let res = await run(req, call as any, body.requestId);\n\n try {\n opts.onRequest?.({\n reqId: body.requestId,\n callId: call.id,\n callName: call.name,\n request: res.request,\n response: { status: res.status, body: res.response }\n });\n } catch (e) {\n Sentry.captureException(e);\n console.error(e);\n }\n\n return {\n __typename: 'rpc.response.call',\n id: call.id,\n name: call.name,\n status: res.status,\n result: res.response\n };\n })\n );\n\n return {\n status: Math.max(...callRes.map(c => c.status)),\n body: {\n __typename: 'rpc.response',\n calls: callRes\n }\n };\n };\n\n return {\n handlerNames,\n runMany\n\n // fetch,\n\n // http: async (\n // req: IncomingMessage & {\n // body: any;\n // },\n // res: ServerResponse & { send: (body: any) => void }\n // ) => {\n // let headers = new Headers(\n // Object.fromEntries(\n // Object.entries(req.headers).map(([key, value]) => [\n // key,\n // value === undefined ? '' : String(value)\n // ])\n // )\n // );\n // let url = new URL(req.url ?? '', `http://${req.headers.host}`);\n\n // let request = new Request(url.toString(), {\n // method: req.method,\n // headers,\n // body: JSON.stringify(req.body)\n // });\n\n // let response = await fetch(request);\n\n // res.statusCode = response.status;\n\n // for (let [key, value] of response.headers.entries()) {\n // res.setHeader(key, value);\n // }\n\n // res.send(response.body);\n // }\n };\n };\n","export let parseForwardedFor = (xForwardedForHeader?: string | null | undefined) => {\n if (typeof xForwardedForHeader != 'string') return undefined;\n\n let ips = xForwardedForHeader\n .split(',')\n .map(ip => ip.trim())\n .filter(Boolean);\n return ips.length > 0 ? ips[0] : undefined;\n};\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","Group","_middleware","_proto","use","handler","opts","concat","ctx","_exit","_temp2","_result","res","key","sharedMiddlewareMemo","set","Promise","resolve","getSharedMemoKey","_temp","has","get","_await$ctx$sharedMidd","reject","createMiddleware","input","_exit2","_temp4","_result2","_temp3","_await$ctx$sharedMidd2","Handler","controller","handlers","_handler","_validation","_proto2","undefined","Error","push","validation","run","req","initialContext","_temp6","_extends","body","response","valRes","validate","success","ServiceError","validationError","errors","entity","_temp5","_forOf","mw","Sentry","getSentry","object","calls","array","id","string","name","payload","any","getSupportedHandlerNames","Object","entries","flatMap","_ref","map","handlerNames","runMany","all","call","i","reqId","request","parts","split","current","length","shift","findHandler","status","notFoundError","toResponse","_catch","console","error","isServiceError","data","captureException","tags","onError","callName","callId","internalServerError","requestId","onRequest","__typename","callRes","Math","max","apply","c","rpcs","handlerNameToRpcMap","Map","rpc","path","fetch","_req$headers$get6","_opts$cors","_ref2","_ref3","_req$headers$get","sentryTraceHeaders","headers","sentryTrace","Array","isArray","join","baggage","ip","xForwardedForHeader","ips","trim","filter","Boolean","parseForwardedFor","Headers","corsOk","_i","_Object$entries","corsHeaders","_Object$entries$_i","append","withIsolationScope","continueTrace","_req$headers$get2","_req$headers$get3","startSpan","op","attributes","transport","ua","origin","_req$headers$get5","beforeSends","generateCustomId","parseCookies","memo","_req$headers$get4","Cookie","parse","url","query","searchParams","rawBody","getCookies","getCookie","setCookie","cookie","serialize","beforeSend","appendHeaders","newHeaders","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","getCurrentScope","setContext","fromEntries","addAttachment","filename","contentType","provideExecutionContext","createExecutionContext","type","contextId","userAgent","callsByRpc","resRef","pathParts","pathname","lastPart","_callsByRpc$get","slice","rpcIndex","Response","JSON","stringify","_iterator2","_step2","_callsByRpc$get2","from","_ref4","_resRef$body$calls","encode","cors","rootDomain","URL","hostname","domains","includes","check","additionalCorsHeaders","method","_decode","decode","text","_req$text","_Response","notAcceptableError","message"],"mappings":"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"}
|
package/dist/index.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceError as e,validationError as r,notFoundError as t,internalServerError as n,notAcceptableError as o,isServiceError as a}from"@lowerdeck/error";import{provideExecutionContext as i,createExecutionContext as s}from"@lowerdeck/execution-context";import{generateCustomId as u}from"@lowerdeck/id";import{memo as c}from"@lowerdeck/memo";import{getSentry as l}from"@lowerdeck/sentry";import{serialize as d}from"@lowerdeck/serialize";import{v as f}from"@lowerdeck/validation";import*as h from"cookie";function p(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function m(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return p(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?p(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);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.")}function v(){return v=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},v.apply(null,arguments)}const y="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function g(e,r,t){if(!e.s){if(t instanceof w){if(!t.s)return void(t.o=g.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(g.bind(null,e,r),g.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var w=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var a=1&o?r:t;if(a){try{g(n,1,a(this.v))}catch(e){g(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?g(n,1,r?r(o):o):t?g(n,1,t(o)):g(n,2,o)}catch(e){g(n,2,e)}},n},e}();function b(e){return e instanceof w&&1&e.s}var P=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._middleware=e}var r=e.prototype;return r.use=function(r,t){return new e([].concat(this._middleware,[function(e){try{var n,o=function(t){if(n)return t;var o=r(e);return a&&e.sharedMiddlewareMemo.set(a,o),Promise.resolve(o)},a=null==t||null==t.getSharedMemoKey?void 0:t.getSharedMemoKey(e),i=function(){if(a&&e.sharedMiddlewareMemo.has(a))return Promise.resolve(e.sharedMiddlewareMemo.get(a)).then(function(e){return n=1,e})}();return Promise.resolve(i&&i.then?i.then(o):o(i))}catch(e){return Promise.reject(e)}}]))},r.createMiddleware=function(e,r){return function(t){return function(n){try{var o,a=function(r){if(o)return r;var a=e(n,t);return i&&n.sharedMiddlewareMemo.set(i,a),Promise.resolve(a)},i=null==r||null==r.getSharedMemoKey?void 0:r.getSharedMemoKey(n,t),s=function(){if(i&&n.sharedMiddlewareMemo.has(i))return Promise.resolve(n.sharedMiddlewareMemo.get(i)).then(function(e){return o=1,e})}();return Promise.resolve(s&&s.then?s.then(a):a(s))}catch(e){return Promise.reject(e)}}}},r.handler=function(){return new j([].concat(this._middleware))},r.controller=function(e){return e},e}(),j=/*#__PURE__*/function(){function t(e){void 0===e&&(e=[]),this._middleware=void 0,this._handler=void 0,this._validation=void 0,this._middleware=e}var n=t.prototype;return n.do=function(e){if(null!=this._handler)throw new Error("Handler already defined");return this._handler=e,this},n.use=function(e){return this._middleware.push(e),this},n.input=function(e){if(null!=this._validation)throw new Error("Input validation already defined");return this._validation=e,this},n.run=function(t,n){try{var o=function(){return Promise.resolve(a._handler(v({},u,{input:i,body:void 0}))).then(function(e){return{response:e}})},a=this;if(!a._handler)throw new Error("Handler not defined");var i=t.body;if(a._validation){var s=a._validation.validate(t.body);if(!s.success)throw new e(r({errors:s.errors,entity:"call_data"}));i=s.value}var u=v({},n,t,{body:i}),c=function(e,r){if("function"==typeof e[y]){var t,n,o,a=function(e){try{for(;!(t=i.next()).done;)if((e=r(t.value))&&e.then){if(!b(e))return void e.then(a,o||(o=g.bind(null,n=new w,2)));e=e.v}n?g(n,1,e):n=e}catch(e){g(n||(n=new w),2,e)}},i=e[y]();if(a(),i.return){var s=function(e){try{t.done||i.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,r){var t,n,o=-1;return function a(i){try{for(;++o<e.length;)if((i=r(o))&&i.then){if(!b(i))return void i.then(a,n||(n=g.bind(null,t=new w,2)));i=i.v}t?g(t,1,i):t=i}catch(e){g(t||(t=new w),2,e)}}(),t}(u,function(e){return r(u[e])})}(a._middleware,function(e){return Promise.resolve(e(u)).then(function(e){e&&(u=v({},u,e))})});return Promise.resolve(c&&c.then?c.then(o):o())}catch(e){return Promise.reject(e)}},t}(),M=l(),S=f.object({calls:f.array(f.object({id:f.string(),name:f.string(),payload:f.any()}))}),_=function(e,a){var l=new Map(a.flatMap(function(e,r){return e.handlerNames.map(function(e){return[e,r]})}));return{path:e.path,fetch:function(f){try{var p,v,y,g=function(e){var o,p,v,g;if(y)return e;var w=f.headers.get("sentry-trace"),P=null!=(o=Array.isArray(w)?w.join(","):w)?o:void 0,_=f.headers.get("baggage"),I=function(e){if("string"==typeof e){var r=e.split(",").map(function(e){return e.trim()}).filter(Boolean);return r.length>0?r[0]:void 0}}(null!=(p=null!=(v=null!=(g=f.headers.get("lowerdeck-connecting-ip"))?g:f.headers.get("cf-connecting-ip"))?v:f.headers.get("x-forwarded-for"))?p:f.headers.get("x-real-ip")),O=new Headers;if(b)for(var R=0,k=Object.entries(q);R<k.length;R++){var A=k[R];O.append(A[0],A[1])}return Promise.resolve(M.withIsolationScope(function(){try{return Promise.resolve(M.continueTrace({sentryTrace:P,baggage:_},function(){try{var e,o;return Promise.resolve(M.startSpan({name:"rpc request",op:"rpc.server",attributes:{ip:I,transport:"http",ua:null!=(e=f.headers.get("user-agent"))?e:"",origin:null!=(o=f.headers.get("origin"))?o:""}},function(){try{try{var e,o=[],p=u("req_"),v=c(function(){var e;return h.parse(null!=(e=f.headers.get("cookie"))?e:"")}),y={url:f.url,headers:f.headers,query:j.searchParams,body:x,rawBody:x,ip:I,requestId:p,getCookies:function(){return v()},getCookie:function(e){return v()[e]},setCookie:function(e,r,t){var n=h.serialize(e,r,t);O.append("Set-Cookie",n)},beforeSend:function(e){o.push(e)},sharedMiddlewareMemo:new Map,appendHeaders:function(e){for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],a=n[1];if(Array.isArray(a))for(var i,s=m(a);!(i=s()).done;)O.append(o,i.value);else O.append(o,a)}}};M.getCurrentScope().setContext("rpc.request",{url:f.url,query:Object.fromEntries(j.searchParams.entries())}),M.getCurrentScope().addAttachment({filename:"rpc.request.body.json",data:x,contentType:"application/json"});var g=S.validate(x);return Promise.resolve(g.success?i(s({type:"request",contextId:p,ip:null!=I?I:"0.0.0.0",userAgent:null!=(e=f.headers.get("user-agent"))?e:""}),function(){try{for(var e,r=new Map,n=m(x.calls);!(e=n()).done;){var i,s=e.value,u=l.get(s.name);if(null==u)return Promise.resolve(new Response(JSON.stringify(t({entity:"handler"}).toResponse()),{status:404,headers:O}));var c=null!=(i=r.get(u))?i:[];c.push(s),r.set(u,c)}var f={body:{__typename:"rpc.response",calls:[]},status:200};return Promise.resolve(Promise.all(Array.from(r.entries()).map(function(e){var r=e[0],t=e[1];try{return Promise.resolve(a[r].runMany(y,{requestId:p,calls:t})).then(function(e){var r;f.status=Math.max(f.status,e.status),(r=f.body.calls).push.apply(r,e.body.calls)})}catch(e){return Promise.reject(e)}}))).then(function(){return O.append("x-req-id",p),O.append("content-type","application/rpc+json"),O.append("x-powered-by","lowerdeck RPC"),Promise.resolve(Promise.all(o.map(function(e){return e()}))).then(function(){return new Response(d.encode(f.body),{status:f.status,headers:O})})})}catch(e){return Promise.reject(e)}}):new Response(JSON.stringify(r({errors:g.errors,entity:"request_data"}).toResponse()),{status:406,headers:O}))}catch(e){return console.error(e),M.captureException(e),Promise.resolve(new Response(JSON.stringify(n().toResponse()),{status:500,headers:O}))}}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))},w=null!=(p=f.headers.get("origin"))?p:"",b=!1;if(e.cors&&"domains"in e.cors)try{var P=new URL(w).hostname.split(".").slice(-2).join(".");b=e.cors.domains.includes(P)}catch(e){}else e.cors&&"check"in e.cors&&(b=e.cors.check(w));var j=new URL(f.url),_=null==(v=e.cors)||null==(v=v.headers)?void 0:v.join(", ");_&&(_=(", "+_).trim());var q=b?{"access-control-allow-origin":w,"access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"Content-Type, Authorization, Baggage, Sentry-Trace"+(null!=_?_:""),"access-control-max-age":"604800","access-control-allow-credentials":"true"}:{};if("OPTIONS"==f.method)return Promise.resolve(b?new Response(null,{status:204,headers:q}):new Response(null,{status:403}));var x=null,I=function(e,r){try{var t=e()}catch(e){return r()}return t&&t.then?t.then(void 0,r):t}(function(){var e=d.decode;return Promise.resolve(f.text()).then(function(r){x=e.call(d,r)})},function(){var e=new Response(JSON.stringify(o({message:"Invalid JSON"}).toResponse()),{status:406});return y=1,e});return Promise.resolve(I&&I.then?I.then(g):g(I))}catch(e){return Promise.reject(e)}}}},q=l(),x=function(e){return function(r){var o=function(e){return Object.entries(e).flatMap(function(e){var r=e[0],t=e[1];return t instanceof j?[r]:"object"==typeof t?o(t).map(function(e){return r+":"+e}):[]})};return{handlerNames:o(r),runMany:function(o,i){try{return Promise.resolve(Promise.all(i.calls.map(function(s,u){try{return Promise.resolve(function(o,i,s){try{var u=v({},o,{body:i.payload});return Promise.resolve(function(e,n){try{var a=(s=function(e){for(var t=e.split(":"),n=r;n&&t.length>0;)if(!(n=n[t.shift()]))return null;return n&&n instanceof j?n:null}(i.name))?Promise.resolve(s.run(u,{})).then(function(e){return{status:200,request:o,response:e.response}}):{request:u,status:404,response:t({entity:"handler"}).toResponse()}}catch(e){return n(e)}var s;return a&&a.then?a.then(void 0,n):a}(0,function(r){return console.error(r),a(r)?(r.data.status>=500&&q.captureException(r,{tags:{reqId:s}}),{request:u,status:r.data.status,response:r.toResponse()}):(q.captureException(r,{tags:{reqId:s}}),null==e.onError||e.onError({callName:i.name,callId:i.id,request:o,error:r,reqId:s}),{request:u,status:500,response:n().toResponse()})}))}catch(e){return Promise.reject(e)}}(o,s,i.requestId)).then(function(r){try{null==e.onRequest||e.onRequest({reqId:i.requestId,callId:s.id,callName:s.name,request:r.request,response:{status:r.status,body:r.response}})}catch(e){q.captureException(e),console.error(e)}return{__typename:"rpc.response.call",id:s.id,name:s.name,status:r.status,result:r.response}})}catch(e){return Promise.reject(e)}}))).then(function(e){return{status:Math.max.apply(Math,e.map(function(e){return e.status})),body:{__typename:"rpc.response",calls:e}}})}catch(e){return Promise.reject(e)}}}}};export{P as Group,j as Handler,x as createServer,_ as rpcMux};
|
|
1
|
+
import{ServiceError as e,validationError as r,notFoundError as t,internalServerError as n,notAcceptableError as o,isServiceError as a}from"@lowerdeck/error";import{provideExecutionContext as s,createExecutionContext as i}from"@lowerdeck/execution-context";import{generateCustomId as u}from"@lowerdeck/id";import{memo as l}from"@lowerdeck/memo";import{getSentry as c}from"@lowerdeck/sentry";import{serialize as d}from"@lowerdeck/serialize";import{v as f}from"@lowerdeck/validation";import*as h from"cookie";function p(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function m(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return p(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?p(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);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.")}function v(){return v=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},v.apply(null,arguments)}const y="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function g(e,r,t){if(!e.s){if(t instanceof w){if(!t.s)return void(t.o=g.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(g.bind(null,e,r),g.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var w=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var a=1&o?r:t;if(a){try{g(n,1,a(this.v))}catch(e){g(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?g(n,1,r?r(o):o):t?g(n,1,t(o)):g(n,2,o)}catch(e){g(n,2,e)}},n},e}();function b(e){return e instanceof w&&1&e.s}var P=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._middleware=e}var r=e.prototype;return r.use=function(r,t){return new e([].concat(this._middleware,[function(e){try{var n,o=function(t){if(n)return t;var o=r(e);return a&&e.sharedMiddlewareMemo.set(a,o),Promise.resolve(o)},a=null==t||null==t.getSharedMemoKey?void 0:t.getSharedMemoKey(e),s=function(){if(a&&e.sharedMiddlewareMemo.has(a))return Promise.resolve(e.sharedMiddlewareMemo.get(a)).then(function(e){return n=1,e})}();return Promise.resolve(s&&s.then?s.then(o):o(s))}catch(e){return Promise.reject(e)}}]))},r.createMiddleware=function(e,r){return function(t){return function(n){try{var o,a=function(r){if(o)return r;var a=e(n,t);return s&&n.sharedMiddlewareMemo.set(s,a),Promise.resolve(a)},s=null==r||null==r.getSharedMemoKey?void 0:r.getSharedMemoKey(n,t),i=function(){if(s&&n.sharedMiddlewareMemo.has(s))return Promise.resolve(n.sharedMiddlewareMemo.get(s)).then(function(e){return o=1,e})}();return Promise.resolve(i&&i.then?i.then(a):a(i))}catch(e){return Promise.reject(e)}}}},r.handler=function(){return new j([].concat(this._middleware))},r.controller=function(e){return e},e}(),j=/*#__PURE__*/function(){function t(e){void 0===e&&(e=[]),this._middleware=void 0,this._handler=void 0,this._validation=void 0,this._middleware=e}var n=t.prototype;return n.do=function(e){if(null!=this._handler)throw new Error("Handler already defined");return this._handler=e,this},n.use=function(e){return this._middleware.push(e),this},n.input=function(e){if(null!=this._validation)throw new Error("Input validation already defined");return this._validation=e,this},n.run=function(t,n){try{var o=function(){return Promise.resolve(a._handler(v({},u,{input:s,body:void 0}))).then(function(e){return{response:e}})},a=this;if(!a._handler)throw new Error("Handler not defined");var s=t.body;if(a._validation){var i=a._validation.validate(t.body);if(!i.success)throw new e(r({errors:i.errors,entity:"call_data"}));s=i.value}var u=v({},n,t,{body:s}),l=function(e,r){if("function"==typeof e[y]){var t,n,o,a=function(e){try{for(;!(t=s.next()).done;)if((e=r(t.value))&&e.then){if(!b(e))return void e.then(a,o||(o=g.bind(null,n=new w,2)));e=e.v}n?g(n,1,e):n=e}catch(e){g(n||(n=new w),2,e)}},s=e[y]();if(a(),s.return){var i=function(e){try{t.done||s.return()}catch(e){}return e};if(n&&n.then)return n.then(i,function(e){throw i(e)});i()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var u=[],l=0;l<e.length;l++)u.push(e[l]);return function(e,r){var t,n,o=-1;return function a(s){try{for(;++o<e.length;)if((s=r(o))&&s.then){if(!b(s))return void s.then(a,n||(n=g.bind(null,t=new w,2)));s=s.v}t?g(t,1,s):t=s}catch(e){g(t||(t=new w),2,e)}}(),t}(u,function(e){return r(u[e])})}(a._middleware,function(e){return Promise.resolve(e(u)).then(function(e){e&&(u=v({},u,e))})});return Promise.resolve(l&&l.then?l.then(o):o())}catch(e){return Promise.reject(e)}},t}(),M=c(),S=f.object({calls:f.array(f.object({id:f.string(),name:f.string(),payload:f.any()}))}),_=function(e,a){var c=new Map(a.flatMap(function(e,r){return e.handlerNames.map(function(e){return[e,r]})}));return{path:e.path,fetch:function(f){try{var p,v,y,g=function(e){var o,p,v,g;if(y)return e;var w=f.headers.get("sentry-trace"),P=null!=(o=Array.isArray(w)?w.join(","):w)?o:void 0,_=f.headers.get("baggage"),O=function(e){if("string"==typeof e){var r=e.split(",").map(function(e){return e.trim()}).filter(Boolean);return r.length>0?r[0]:void 0}}(null!=(p=null!=(v=null!=(g=f.headers.get("lowerdeck-connecting-ip"))?g:f.headers.get("cf-connecting-ip"))?v:f.headers.get("x-forwarded-for"))?p:f.headers.get("x-real-ip")),x=new Headers;if(b)for(var I=0,k=Object.entries(q);I<k.length;I++){var A=k[I];x.append(A[0],A[1])}return Promise.resolve(M.withIsolationScope(function(){try{return Promise.resolve(M.continueTrace({sentryTrace:P,baggage:_},function(){try{var e,o;return Promise.resolve(M.startSpan({name:"rpc request",op:"rpc.server",attributes:{ip:O,transport:"http",ua:null!=(e=f.headers.get("user-agent"))?e:"",origin:null!=(o=f.headers.get("origin"))?o:""}},function(){try{try{var e,o=[],p=u("req_"),v=l(function(){var e;return h.parse(null!=(e=f.headers.get("cookie"))?e:"")}),y={url:f.url,headers:f.headers,query:j.searchParams,body:R,rawBody:R,ip:O,requestId:p,getCookies:function(){return v()},getCookie:function(e){return v()[e]},setCookie:function(e,r,t){var n=h.serialize(e,r,t);x.append("Set-Cookie",n)},beforeSend:function(e){o.push(e)},sharedMiddlewareMemo:new Map,appendHeaders:function(e){for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],a=n[1];if(Array.isArray(a))for(var s,i=m(a);!(s=i()).done;)x.append(o,s.value);else x.append(o,a)}}};return M.getCurrentScope().setContext("rpc.request",{url:f.url,query:Object.fromEntries(j.searchParams.entries())}),M.getCurrentScope().addAttachment({filename:"rpc.request.body.json",data:R,contentType:"application/json"}),Promise.resolve(s(i({type:"request",contextId:p,ip:null!=O?O:"0.0.0.0",userAgent:null!=(e=f.headers.get("user-agent"))?e:""}),function(){try{var e=new Map,n={body:{__typename:"rpc.response",calls:[]},status:200},s=j.pathname.split("/").filter(Boolean),i=s[s.length-1];if("$"==i[0]){var l,f=i.slice(1),h=c.get(f);if(null==h)return Promise.resolve(new Response(JSON.stringify(t({entity:"handler"}).toResponse()),{status:404,headers:x}));var v=null!=(l=e.get(h))?l:[];v.push({id:u("call_"),name:f,payload:R}),e.set(h,v)}else{var g=S.validate(R);if(!g.success)return Promise.resolve(new Response(JSON.stringify(r({errors:g.errors,entity:"request_data"}).toResponse()),{status:406,headers:x}));for(var w,b=m(g.value.calls);!(w=b()).done;){var P,M=w.value,_=c.get(M.name);if(null==_)return Promise.resolve(new Response(JSON.stringify(t({entity:"handler"}).toResponse()),{status:404,headers:x}));var q=null!=(P=e.get(_))?P:[];q.push(M),e.set(_,q)}}return Promise.resolve(Promise.all(Array.from(e.entries()).map(function(e){var r=e[0],t=e[1];try{return Promise.resolve(a[r].runMany(y,{requestId:p,calls:t})).then(function(e){var r;n.status=Math.max(n.status,e.status),(r=n.body.calls).push.apply(r,e.body.calls)})}catch(e){return Promise.reject(e)}}))).then(function(){return x.append("x-req-id",p),x.append("content-type","application/rpc+json"),x.append("x-powered-by","lowerdeck RPC"),Promise.resolve(Promise.all(o.map(function(e){return e()}))).then(function(){return new Response(d.encode(n.body),{status:n.status,headers:x})})})}catch(e){return Promise.reject(e)}}))}catch(e){return console.error(e),M.captureException(e),Promise.resolve(new Response(JSON.stringify(n().toResponse()),{status:500,headers:x}))}}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))},w=null!=(p=f.headers.get("origin"))?p:"",b=!1;if(e.cors&&"domains"in e.cors)try{var P=new URL(w).hostname.split(".").slice(-2).join(".");b=e.cors.domains.includes(P)}catch(e){}else e.cors&&"check"in e.cors&&(b=e.cors.check(w));var j=new URL(f.url),_=null==(v=e.cors)||null==(v=v.headers)?void 0:v.join(", ");_&&(_=(", "+_).trim());var q=b?{"access-control-allow-origin":w,"access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"Content-Type, Authorization, Baggage, Sentry-Trace"+(null!=_?_:""),"access-control-max-age":"604800","access-control-allow-credentials":"true"}:{};if("OPTIONS"==f.method)return Promise.resolve(b?new Response(null,{status:204,headers:q}):new Response(null,{status:403}));var R=null,O=function(e,r){try{var t=e()}catch(e){return r()}return t&&t.then?t.then(void 0,r):t}(function(){var e=d.decode;return Promise.resolve(f.text()).then(function(r){R=e.call(d,r)})},function(){var e=new Response(JSON.stringify(o({message:"Invalid JSON"}).toResponse()),{status:406});return y=1,e});return Promise.resolve(O&&O.then?O.then(g):g(O))}catch(e){return Promise.reject(e)}}}},q=c(),R=function(e){return function(r){var o=function(e){return Object.entries(e).flatMap(function(e){var r=e[0],t=e[1];return t instanceof j?[r]:"object"==typeof t?o(t).map(function(e){return r+":"+e}):[]})};return{handlerNames:o(r),runMany:function(o,s){try{return Promise.resolve(Promise.all(s.calls.map(function(i,u){try{return Promise.resolve(function(o,s,i){try{var u=v({},o,{body:s.payload});return Promise.resolve(function(e,n){try{var a=(i=function(e){for(var t=e.split(":"),n=r;n&&t.length>0;)if(!(n=n[t.shift()]))return null;return n&&n instanceof j?n:null}(s.name))?Promise.resolve(i.run(u,{})).then(function(e){return{status:200,request:o,response:e.response}}):{request:u,status:404,response:t({entity:"handler"}).toResponse()}}catch(e){return n(e)}var i;return a&&a.then?a.then(void 0,n):a}(0,function(r){return console.error(r),a(r)?(r.data.status>=500&&q.captureException(r,{tags:{reqId:i}}),{request:u,status:r.data.status,response:r.toResponse()}):(q.captureException(r,{tags:{reqId:i}}),null==e.onError||e.onError({callName:s.name,callId:s.id,request:o,error:r,reqId:i}),{request:u,status:500,response:n().toResponse()})}))}catch(e){return Promise.reject(e)}}(o,i,s.requestId)).then(function(r){try{null==e.onRequest||e.onRequest({reqId:s.requestId,callId:i.id,callName:i.name,request:r.request,response:{status:r.status,body:r.response}})}catch(e){q.captureException(e),console.error(e)}return{__typename:"rpc.response.call",id:i.id,name:i.name,status:r.status,result:r.response}})}catch(e){return Promise.reject(e)}}))).then(function(e){return{status:Math.max.apply(Math,e.map(function(e){return e.status})),body:{__typename:"rpc.response",calls:e}}})}catch(e){return Promise.reject(e)}}}}};export{P as Group,j as Handler,R as createServer,_ as rpcMux};
|
|
2
2
|
//# sourceMappingURL=index.module.js.map
|
package/dist/index.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.module.js","sources":["../src/controller.ts","../src/rpcMux.ts","../src/extractIp.ts","../src/server.ts"],"sourcesContent":["import { ServiceError, validationError } from '@lowerdeck/error';\nimport { ValidationType } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\n\nexport type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface ServiceRequest {\n query: URLSearchParams;\n headers: Headers;\n url: string;\n ip?: string;\n body: any;\n rawBody: any;\n requestId: string;\n\n getCookies: () => Record<string, string | undefined>;\n getCookie: (name: string) => string | undefined;\n setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;\n\n sharedMiddlewareMemo: Map<string, Promise<any>>;\n beforeSend: (handler: () => Promise<any>) => void;\n appendHeaders: (headers: Record<string, string | string[]>) => void;\n}\n\nexport type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\nexport type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;\n\nexport class Group<Context extends { [key: string]: any } = {}> {\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n use<T extends { [key: string]: any } | undefined | void>(\n handler: (ctx: Context & ServiceRequest) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;\n }\n ) {\n let middleware = async (ctx: Parameters<typeof handler>[0]): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n\n return new Group<Simplify<Context & T>>([...this._middleware, middleware]);\n }\n\n createMiddleware<T extends { [key: string]: any }, P = void>(\n handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;\n }\n ) {\n return (input: P) =>\n async (ctx: Context & ServiceRequest): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx, input);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx, input);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n }\n\n handler() {\n return new Handler([...this._middleware]);\n }\n\n controller<\n HandlersAndSubControllers extends {\n [key: string]: Handler<any, any, any> | Controller<any>;\n }\n >(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers> {\n return handlers;\n }\n}\n\nexport type Controller<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = HandlersAndSubControllers;\n\nexport type InferControllerType<T> = T extends Controller<infer U> ? U : never;\n\nexport type InferClient<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = {\n [K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<\n infer I,\n infer O,\n infer C\n >\n ? ((\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<O>) & {\n getFull: (\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<{\n data: O;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n : HandlersAndSubControllers[K] extends Controller<infer U>\n ? InferClient<U>\n : never;\n};\n\nexport class Handler<Input, Output, Context extends { [key: string]: any } = {}> {\n private _handler!: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<Output>;\n private _validation: ValidationType<Input> | undefined;\n\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n do<HandlerOutput>(\n handler: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<HandlerOutput>\n ) {\n if (this._handler != undefined) throw new Error('Handler already defined');\n\n // @ts-ignore\n this._handler = handler;\n\n return this as any as Handler<Input, HandlerOutput, Context>;\n }\n\n use<T extends { [key: string]: any } = {}>(\n handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>\n ) {\n this._middleware.push(handler);\n return this as any as Handler<Input, Output, ExtendContext<Context, T>>;\n }\n\n input<HandlerInput>(validation: ValidationType<HandlerInput>) {\n if (this._validation != undefined) throw new Error('Input validation already defined');\n\n // @ts-ignore\n this._validation = validation;\n\n return this as any as Handler<HandlerInput, Output, Context>;\n }\n\n async run(\n req: ServiceRequest,\n initialContext: any\n ): Promise<{\n response: Output;\n }> {\n if (!this._handler) throw new Error('Handler not defined');\n\n let input = req.body as Input;\n\n if (this._validation) {\n let valRes = this._validation.validate(req.body);\n\n if (!valRes.success) {\n throw new ServiceError(\n validationError({ errors: valRes.errors, entity: 'call_data' })\n );\n }\n\n input = valRes.value;\n }\n\n let ctx = {\n ...initialContext,\n ...req,\n\n // Always use the sanitized input\n body: input\n };\n\n for (let mw of this._middleware) {\n let res = await mw(ctx);\n if (res) ctx = { ...ctx, ...res };\n }\n\n let res = await this._handler({\n ...ctx,\n input,\n body: undefined\n });\n\n return {\n response: res\n };\n }\n}\n","import {\n internalServerError,\n notAcceptableError,\n notFoundError,\n validationError\n} from '@lowerdeck/error';\nimport { createExecutionContext, provideExecutionContext } from '@lowerdeck/execution-context';\nimport { generateCustomId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { serialize } from '@lowerdeck/serialize';\nimport { v } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\nimport { ServiceRequest } from './controller';\nimport { parseForwardedFor } from './extractIp';\n\nlet Sentry = getSentry();\n\nlet validation = v.object({\n calls: v.array(\n v.object({\n id: v.string(),\n name: v.string(),\n payload: v.any()\n })\n )\n});\n\nexport let rpcMux = (\n opts: {\n path: string;\n cors?: {\n headers?: string[];\n } & ({ domains: string[] } | { check: (origin: string) => boolean });\n },\n rpcs: {\n handlerNames: string[];\n runMany: (\n req: ServiceRequest,\n body: {\n requestId: string;\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n }\n ) => Promise<{\n status: number;\n body: {\n calls: any[];\n };\n }>;\n }[]\n) => {\n let handlerNameToRpcMap = new Map<string, number>(\n rpcs.flatMap((rpc, i) => rpc.handlerNames.map(name => [name, i]))\n );\n\n return {\n path: opts.path,\n\n fetch: async (req: any): Promise<any> => {\n let origin = req.headers.get('origin') ?? '';\n let corsOk = false;\n\n if (opts.cors && 'domains' in opts.cors) {\n try {\n let url = new URL(origin);\n let rootDomain = url.hostname.split('.').slice(-2).join('.');\n corsOk = opts.cors.domains.includes(rootDomain);\n } catch (e) {\n // Ignore -> no cors\n }\n } else if (opts.cors && 'check' in opts.cors) {\n corsOk = opts.cors.check(origin);\n }\n\n let url = new URL(req.url);\n\n let additionalCorsHeaders = opts.cors?.headers?.join(', ');\n if (additionalCorsHeaders) additionalCorsHeaders = `, ${additionalCorsHeaders}`.trim();\n\n let corsHeaders: Record<string, string> = corsOk\n ? {\n 'access-control-allow-origin': origin,\n 'access-control-allow-methods': 'POST, OPTIONS',\n 'access-control-allow-headers': `Content-Type, Authorization, Baggage, Sentry-Trace${\n additionalCorsHeaders ?? ''\n }`,\n 'access-control-max-age': '604800',\n 'access-control-allow-credentials': 'true'\n }\n : {};\n\n if (req.method == 'OPTIONS') {\n if (corsOk) {\n return new Response(null, {\n status: 204,\n headers: corsHeaders\n });\n }\n\n return new Response(null, { status: 403 });\n }\n\n let body: any = null;\n\n try {\n body = serialize.decode(await req.text());\n } catch (e) {\n return new Response(\n JSON.stringify(notAcceptableError({ message: 'Invalid JSON' }).toResponse()),\n { status: 406 }\n );\n }\n\n let sentryTraceHeaders = req.headers.get('sentry-trace');\n let sentryTrace =\n (Array.isArray(sentryTraceHeaders)\n ? sentryTraceHeaders.join(',')\n : sentryTraceHeaders) ?? undefined;\n let baggage = req.headers.get('baggage');\n\n let ip = parseForwardedFor(\n req.headers.get('lowerdeck-connecting-ip') ??\n req.headers.get('cf-connecting-ip') ??\n req.headers.get('x-forwarded-for') ??\n req.headers.get('x-real-ip')\n );\n\n let headers = new Headers();\n\n if (corsOk) {\n for (let [key, value] of Object.entries(corsHeaders)) {\n headers.append(key, value);\n }\n }\n\n return await Sentry.withIsolationScope(\n async () =>\n await Sentry.continueTrace(\n { sentryTrace, baggage },\n async () =>\n await Sentry.startSpan(\n {\n name: 'rpc request',\n op: 'rpc.server',\n attributes: {\n ip,\n transport: 'http',\n ua: req.headers.get('user-agent') ?? '',\n origin: req.headers.get('origin') ?? ''\n }\n },\n async () => {\n try {\n let beforeSends: Array<() => Promise<any>> = [];\n let id = generateCustomId('req_');\n\n let parseCookies = memo(() =>\n Cookie.parse(req.headers.get('cookie') ?? '')\n );\n\n let request: ServiceRequest = {\n url: req.url,\n headers: req.headers,\n query: url.searchParams,\n body,\n rawBody: body,\n ip,\n requestId: id,\n\n getCookies: () => parseCookies(),\n getCookie: (name: string) => parseCookies()[name],\n setCookie: (name: string, value: string, opts?: any) => {\n let cookie = Cookie.serialize(name, value, opts);\n // @ts-ignore\n headers.append('Set-Cookie', cookie);\n },\n\n beforeSend: (handler: () => Promise<any>) => {\n beforeSends.push(handler);\n },\n\n sharedMiddlewareMemo: new Map<string, Promise<any>>(),\n\n appendHeaders: (newHeaders: Record<string, string | string[]>) => {\n for (let [key, value] of Object.entries(newHeaders)) {\n if (Array.isArray(value)) {\n for (let v of value) headers.append(key, v);\n } else {\n headers.append(key, value);\n }\n }\n }\n };\n\n Sentry.getCurrentScope().setContext('rpc.request', {\n url: req.url,\n query: Object.fromEntries(url.searchParams.entries())\n });\n\n Sentry.getCurrentScope().addAttachment({\n filename: 'rpc.request.body.json',\n data: body,\n contentType: 'application/json'\n });\n\n let valRes = validation.validate(body);\n if (!valRes.success) {\n return new Response(\n JSON.stringify(\n validationError({\n errors: valRes.errors,\n entity: 'request_data'\n }).toResponse()\n ),\n { status: 406, headers }\n );\n }\n\n return provideExecutionContext(\n createExecutionContext({\n type: 'request',\n contextId: id,\n ip: ip ?? '0.0.0.0',\n userAgent: req.headers.get('user-agent') ?? ''\n }),\n async () => {\n let callsByRpc = new Map<\n number,\n { id: string; name: string; payload: any }[]\n >();\n\n for (let call of body.calls) {\n let rpcIndex = handlerNameToRpcMap.get(call.name);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push(call);\n callsByRpc.set(rpcIndex, calls);\n }\n\n // let res = await runMany(request);\n\n let resRef = {\n body: {\n __typename: 'rpc.response',\n calls: [] as any[]\n },\n status: 200\n };\n\n await Promise.all(\n Array.from(callsByRpc.entries()).map(async ([rpcIndex, calls]) => {\n let rpc = rpcs[rpcIndex];\n let res = await rpc.runMany(request, {\n requestId: id,\n calls\n });\n\n resRef.status = Math.max(resRef.status, res.status);\n resRef.body.calls.push(...res.body.calls);\n })\n );\n\n headers.append('x-req-id', id);\n headers.append('content-type', 'application/rpc+json');\n headers.append('x-powered-by', 'lowerdeck RPC');\n\n await Promise.all(beforeSends.map(s => s()));\n\n return new Response(serialize.encode(resRef.body), {\n status: resRef.status,\n headers\n });\n }\n );\n } catch (e) {\n console.error(e);\n\n Sentry.captureException(e);\n\n return new Response(JSON.stringify(internalServerError().toResponse()), {\n status: 500,\n headers\n });\n }\n }\n )\n )\n );\n }\n };\n};\n","export let parseForwardedFor = (xForwardedForHeader?: string | null | undefined) => {\n if (typeof xForwardedForHeader != 'string') return undefined;\n\n let ips = xForwardedForHeader\n .split(',')\n .map(ip => ip.trim())\n .filter(Boolean);\n return ips.length > 0 ? ips[0] : undefined;\n};\n","import { internalServerError, isServiceError, notFoundError } from '@lowerdeck/error';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { Controller, Handler, ServiceRequest } from './controller';\n\nlet Sentry = getSentry();\n\nexport let createServer =\n (opts: {\n onError?: (opts: {\n request: ServiceRequest;\n error: any;\n reqId: string;\n callId: string;\n callName: string;\n }) => void;\n onRequest?: (opts: {\n reqId: string;\n callId: string;\n callName: string;\n request: ServiceRequest;\n response: { status: number; body: any };\n }) => void;\n }) =>\n (controller: Controller<any>) => {\n let findHandler = (name: string): Handler<any, any, any> | null => {\n let parts = name.split(':');\n let current = controller;\n\n while (current && parts.length > 0) {\n current = current[parts.shift()!];\n if (!current) return null;\n }\n\n if (current && current instanceof Handler) return current;\n\n return null;\n };\n\n let getSupportedHandlerNames = (controller: Controller<any>): string[] =>\n Object.entries(controller).flatMap(([key, value]) => {\n if (value instanceof Handler) return [key];\n if (typeof value == 'object')\n return getSupportedHandlerNames(value).map(name => `${key}:${name}`);\n return [];\n });\n\n let handlerNames = getSupportedHandlerNames(controller);\n\n let run = async (\n req: ServiceRequest,\n call: { id: string; name: string; payload: any },\n reqId: string\n ): Promise<{\n response: any;\n status: number;\n request: ServiceRequest;\n }> => {\n let request = { ...req, body: call.payload };\n\n try {\n let handler = findHandler(call.name);\n\n if (!handler) {\n return {\n request,\n status: 404,\n response: notFoundError({ entity: 'handler' }).toResponse()\n };\n }\n\n let response = await handler.run(request, {});\n\n return {\n status: 200,\n request: req,\n response: response.response\n };\n } catch (e) {\n console.error(e);\n\n if (isServiceError(e)) {\n if (e.data.status >= 500) {\n Sentry.captureException(e, {\n tags: { reqId }\n });\n }\n\n return {\n request,\n status: e.data.status,\n response: e.toResponse()\n };\n }\n\n Sentry.captureException(e, {\n tags: { reqId }\n });\n\n opts.onError?.({\n callName: call.name,\n callId: call.id,\n request: req,\n error: e,\n reqId\n });\n\n return {\n request,\n status: 500,\n response: internalServerError().toResponse()\n };\n }\n };\n\n let runMany = async (\n req: ServiceRequest,\n body: {\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n requestId: string;\n }\n ): Promise<{\n status: number;\n body: any;\n }> => {\n let callRes = await Promise.all(\n body.calls.map(async (call, i) => {\n let res = await run(req, call as any, body.requestId);\n\n try {\n opts.onRequest?.({\n reqId: body.requestId,\n callId: call.id,\n callName: call.name,\n request: res.request,\n response: { status: res.status, body: res.response }\n });\n } catch (e) {\n Sentry.captureException(e);\n console.error(e);\n }\n\n return {\n __typename: 'rpc.response.call',\n id: call.id,\n name: call.name,\n status: res.status,\n result: res.response\n };\n })\n );\n\n return {\n status: Math.max(...callRes.map(c => c.status)),\n body: {\n __typename: 'rpc.response',\n calls: callRes\n }\n };\n };\n\n return {\n handlerNames,\n runMany\n\n // fetch,\n\n // http: async (\n // req: IncomingMessage & {\n // body: any;\n // },\n // res: ServerResponse & { send: (body: any) => void }\n // ) => {\n // let headers = new Headers(\n // Object.fromEntries(\n // Object.entries(req.headers).map(([key, value]) => [\n // key,\n // value === undefined ? '' : String(value)\n // ])\n // )\n // );\n // let url = new URL(req.url ?? '', `http://${req.headers.host}`);\n\n // let request = new Request(url.toString(), {\n // method: req.method,\n // headers,\n // body: JSON.stringify(req.body)\n // });\n\n // let response = await fetch(request);\n\n // res.statusCode = response.status;\n\n // for (let [key, value] of response.headers.entries()) {\n // res.setHeader(key, value);\n // }\n\n // res.send(response.body);\n // }\n };\n };\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","Group","_middleware","_proto","use","handler","opts","concat","ctx","_exit","_temp2","_result","res","key","sharedMiddlewareMemo","set","Promise","resolve","getSharedMemoKey","_temp","has","get","_await$ctx$sharedMidd","reject","createMiddleware","input","_exit2","_temp4","_result2","_temp3","_await$ctx$sharedMidd2","Handler","controller","handlers","_handler","_validation","_proto2","undefined","Error","push","validation","run","req","initialContext","_temp6","_extends","body","response","valRes","validate","success","ServiceError","validationError","errors","entity","_temp5","_forOf","mw","Sentry","getSentry","object","calls","array","id","string","name","payload","any","rpcMux","rpcs","handlerNameToRpcMap","Map","flatMap","rpc","i","handlerNames","map","path","fetch","_req$headers$get6","_opts$cors","_ref","_ref2","_ref3","_req$headers$get","sentryTraceHeaders","headers","sentryTrace","Array","isArray","join","baggage","ip","xForwardedForHeader","ips","split","trim","filter","Boolean","length","parseForwardedFor","Headers","corsOk","_i","_Object$entries","Object","entries","corsHeaders","_Object$entries$_i","append","withIsolationScope","continueTrace","_req$headers$get2","_req$headers$get3","startSpan","op","attributes","transport","ua","origin","_req$headers$get5","beforeSends","generateCustomId","parseCookies","memo","_req$headers$get4","Cookie","parse","request","url","query","searchParams","rawBody","requestId","getCookies","getCookie","setCookie","cookie","serialize","beforeSend","appendHeaders","newHeaders","_i2","_Object$entries2","_Object$entries2$_i","_iterator","_step","_createForOfIteratorHelperLoose","done","getCurrentScope","setContext","fromEntries","addAttachment","filename","data","contentType","provideExecutionContext","createExecutionContext","type","contextId","userAgent","_step2","callsByRpc","_iterator2","_callsByRpc$get","call","rpcIndex","Response","JSON","stringify","notFoundError","toResponse","status","resRef","__typename","all","from","_ref4","runMany","_resRef$body$calls","Math","max","apply","encode","console","error","captureException","internalServerError","cors","rootDomain","URL","hostname","slice","domains","includes","check","additionalCorsHeaders","method","_catch","_decode","decode","text","_req$text","_Response","notAcceptableError","message","createServer","getSupportedHandlerNames","reqId","parts","current","shift","findHandler","isServiceError","tags","onError","callName","callId","onRequest","callRes","c"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.module.js","sources":["../src/controller.ts","../src/rpcMux.ts","../src/extractIp.ts","../src/server.ts"],"sourcesContent":["import { ServiceError, validationError } from '@lowerdeck/error';\nimport { ValidationType } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\n\nexport type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface ServiceRequest {\n query: URLSearchParams;\n headers: Headers;\n url: string;\n ip?: string;\n body: any;\n rawBody: any;\n requestId: string;\n\n getCookies: () => Record<string, string | undefined>;\n getCookie: (name: string) => string | undefined;\n setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;\n\n sharedMiddlewareMemo: Map<string, Promise<any>>;\n beforeSend: (handler: () => Promise<any>) => void;\n appendHeaders: (headers: Record<string, string | string[]>) => void;\n}\n\nexport type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\nexport type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;\n\nexport class Group<Context extends { [key: string]: any } = {}> {\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n use<T extends { [key: string]: any } | undefined | void>(\n handler: (ctx: Context & ServiceRequest) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;\n }\n ) {\n let middleware = async (ctx: Parameters<typeof handler>[0]): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n\n return new Group<Simplify<Context & T>>([...this._middleware, middleware]);\n }\n\n createMiddleware<T extends { [key: string]: any }, P = void>(\n handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;\n }\n ) {\n return (input: P) =>\n async (ctx: Context & ServiceRequest): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx, input);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx, input);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n }\n\n handler() {\n return new Handler([...this._middleware]);\n }\n\n controller<\n HandlersAndSubControllers extends {\n [key: string]: Handler<any, any, any> | Controller<any>;\n }\n >(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers> {\n return handlers;\n }\n}\n\nexport type Controller<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = HandlersAndSubControllers;\n\nexport type InferControllerType<T> = T extends Controller<infer U> ? U : never;\n\nexport type InferClient<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = {\n [K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<\n infer I,\n infer O,\n infer C\n >\n ? ((\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<O>) & {\n getFull: (\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<{\n data: O;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n : HandlersAndSubControllers[K] extends Controller<infer U>\n ? InferClient<U>\n : never;\n};\n\nexport class Handler<Input, Output, Context extends { [key: string]: any } = {}> {\n private _handler!: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<Output>;\n private _validation: ValidationType<Input> | undefined;\n\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n do<HandlerOutput>(\n handler: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<HandlerOutput>\n ) {\n if (this._handler != undefined) throw new Error('Handler already defined');\n\n // @ts-ignore\n this._handler = handler;\n\n return this as any as Handler<Input, HandlerOutput, Context>;\n }\n\n use<T extends { [key: string]: any } = {}>(\n handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>\n ) {\n this._middleware.push(handler);\n return this as any as Handler<Input, Output, ExtendContext<Context, T>>;\n }\n\n input<HandlerInput>(validation: ValidationType<HandlerInput>) {\n if (this._validation != undefined) throw new Error('Input validation already defined');\n\n // @ts-ignore\n this._validation = validation;\n\n return this as any as Handler<HandlerInput, Output, Context>;\n }\n\n async run(\n req: ServiceRequest,\n initialContext: any\n ): Promise<{\n response: Output;\n }> {\n if (!this._handler) throw new Error('Handler not defined');\n\n let input = req.body as Input;\n\n if (this._validation) {\n let valRes = this._validation.validate(req.body);\n\n if (!valRes.success) {\n throw new ServiceError(\n validationError({ errors: valRes.errors, entity: 'call_data' })\n );\n }\n\n input = valRes.value;\n }\n\n let ctx = {\n ...initialContext,\n ...req,\n\n // Always use the sanitized input\n body: input\n };\n\n for (let mw of this._middleware) {\n let res = await mw(ctx);\n if (res) ctx = { ...ctx, ...res };\n }\n\n let res = await this._handler({\n ...ctx,\n input,\n body: undefined\n });\n\n return {\n response: res\n };\n }\n}\n","import {\n internalServerError,\n notAcceptableError,\n notFoundError,\n validationError\n} from '@lowerdeck/error';\nimport { createExecutionContext, provideExecutionContext } from '@lowerdeck/execution-context';\nimport { generateCustomId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { serialize } from '@lowerdeck/serialize';\nimport { v } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\nimport { ServiceRequest } from './controller';\nimport { parseForwardedFor } from './extractIp';\n\nlet Sentry = getSentry();\n\nlet validation = v.object({\n calls: v.array(\n v.object({\n id: v.string(),\n name: v.string(),\n payload: v.any()\n })\n )\n});\n\nexport let rpcMux = (\n opts: {\n path: string;\n cors?: {\n headers?: string[];\n } & ({ domains: string[] } | { check: (origin: string) => boolean });\n },\n rpcs: {\n handlerNames: string[];\n runMany: (\n req: ServiceRequest,\n body: {\n requestId: string;\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n }\n ) => Promise<{\n status: number;\n body: {\n calls: any[];\n };\n }>;\n }[]\n) => {\n let handlerNameToRpcMap = new Map<string, number>(\n rpcs.flatMap((rpc, i) => rpc.handlerNames.map(name => [name, i]))\n );\n\n return {\n path: opts.path,\n\n fetch: async (req: any): Promise<any> => {\n let origin = req.headers.get('origin') ?? '';\n let corsOk = false;\n\n if (opts.cors && 'domains' in opts.cors) {\n try {\n let url = new URL(origin);\n let rootDomain = url.hostname.split('.').slice(-2).join('.');\n corsOk = opts.cors.domains.includes(rootDomain);\n } catch (e) {\n // Ignore -> no cors\n }\n } else if (opts.cors && 'check' in opts.cors) {\n corsOk = opts.cors.check(origin);\n }\n\n let url = new URL(req.url);\n\n let additionalCorsHeaders = opts.cors?.headers?.join(', ');\n if (additionalCorsHeaders) additionalCorsHeaders = `, ${additionalCorsHeaders}`.trim();\n\n let corsHeaders: Record<string, string> = corsOk\n ? {\n 'access-control-allow-origin': origin,\n 'access-control-allow-methods': 'POST, OPTIONS',\n 'access-control-allow-headers': `Content-Type, Authorization, Baggage, Sentry-Trace${\n additionalCorsHeaders ?? ''\n }`,\n 'access-control-max-age': '604800',\n 'access-control-allow-credentials': 'true'\n }\n : {};\n\n if (req.method == 'OPTIONS') {\n if (corsOk) {\n return new Response(null, {\n status: 204,\n headers: corsHeaders\n });\n }\n\n return new Response(null, { status: 403 });\n }\n\n let body: any = null;\n\n try {\n body = serialize.decode(await req.text());\n } catch (e) {\n return new Response(\n JSON.stringify(notAcceptableError({ message: 'Invalid JSON' }).toResponse()),\n { status: 406 }\n );\n }\n\n let sentryTraceHeaders = req.headers.get('sentry-trace');\n let sentryTrace =\n (Array.isArray(sentryTraceHeaders)\n ? sentryTraceHeaders.join(',')\n : sentryTraceHeaders) ?? undefined;\n let baggage = req.headers.get('baggage');\n\n let ip = parseForwardedFor(\n req.headers.get('lowerdeck-connecting-ip') ??\n req.headers.get('cf-connecting-ip') ??\n req.headers.get('x-forwarded-for') ??\n req.headers.get('x-real-ip')\n );\n\n let headers = new Headers();\n\n if (corsOk) {\n for (let [key, value] of Object.entries(corsHeaders)) {\n headers.append(key, value);\n }\n }\n\n return await Sentry.withIsolationScope(\n async () =>\n await Sentry.continueTrace(\n { sentryTrace, baggage },\n async () =>\n await Sentry.startSpan(\n {\n name: 'rpc request',\n op: 'rpc.server',\n attributes: {\n ip,\n transport: 'http',\n ua: req.headers.get('user-agent') ?? '',\n origin: req.headers.get('origin') ?? ''\n }\n },\n async () => {\n try {\n let beforeSends: Array<() => Promise<any>> = [];\n let id = generateCustomId('req_');\n\n let parseCookies = memo(() =>\n Cookie.parse(req.headers.get('cookie') ?? '')\n );\n\n let request: ServiceRequest = {\n url: req.url,\n headers: req.headers,\n query: url.searchParams,\n body,\n rawBody: body,\n ip,\n requestId: id,\n\n getCookies: () => parseCookies(),\n getCookie: (name: string) => parseCookies()[name],\n setCookie: (name: string, value: string, opts?: any) => {\n let cookie = Cookie.serialize(name, value, opts);\n // @ts-ignore\n headers.append('Set-Cookie', cookie);\n },\n\n beforeSend: (handler: () => Promise<any>) => {\n beforeSends.push(handler);\n },\n\n sharedMiddlewareMemo: new Map<string, Promise<any>>(),\n\n appendHeaders: (newHeaders: Record<string, string | string[]>) => {\n for (let [key, value] of Object.entries(newHeaders)) {\n if (Array.isArray(value)) {\n for (let v of value) headers.append(key, v);\n } else {\n headers.append(key, value);\n }\n }\n }\n };\n\n Sentry.getCurrentScope().setContext('rpc.request', {\n url: req.url,\n query: Object.fromEntries(url.searchParams.entries())\n });\n\n Sentry.getCurrentScope().addAttachment({\n filename: 'rpc.request.body.json',\n data: body,\n contentType: 'application/json'\n });\n\n return provideExecutionContext(\n createExecutionContext({\n type: 'request',\n contextId: id,\n ip: ip ?? '0.0.0.0',\n userAgent: req.headers.get('user-agent') ?? ''\n }),\n async () => {\n let callsByRpc = new Map<\n number,\n { id: string; name: string; payload: any }[]\n >();\n\n let resRef = {\n body: {\n __typename: 'rpc.response',\n calls: [] as any[]\n },\n status: 200\n };\n\n let pathParts = url.pathname.split('/').filter(Boolean);\n let lastPart = pathParts[pathParts.length - 1];\n\n if (lastPart[0] == '$') {\n let id = lastPart.slice(1);\n let rpcIndex = handlerNameToRpcMap.get(id);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push({\n id: generateCustomId('call_'),\n name: id,\n payload: body\n });\n callsByRpc.set(rpcIndex, calls);\n } else {\n let valRes = validation.validate(body);\n if (!valRes.success) {\n return new Response(\n JSON.stringify(\n validationError({\n errors: valRes.errors,\n entity: 'request_data'\n }).toResponse()\n ),\n { status: 406, headers }\n );\n }\n\n for (let call of valRes.value.calls) {\n let rpcIndex = handlerNameToRpcMap.get(call.name);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push(call as any);\n callsByRpc.set(rpcIndex, calls);\n }\n }\n\n await Promise.all(\n Array.from(callsByRpc.entries()).map(async ([rpcIndex, calls]) => {\n let rpc = rpcs[rpcIndex];\n let res = await rpc.runMany(request, {\n requestId: id,\n calls\n });\n\n resRef.status = Math.max(resRef.status, res.status);\n resRef.body.calls.push(...res.body.calls);\n })\n );\n\n headers.append('x-req-id', id);\n headers.append('content-type', 'application/rpc+json');\n headers.append('x-powered-by', 'lowerdeck RPC');\n\n await Promise.all(beforeSends.map(s => s()));\n\n return new Response(serialize.encode(resRef.body), {\n status: resRef.status,\n headers\n });\n }\n );\n } catch (e) {\n console.error(e);\n\n Sentry.captureException(e);\n\n return new Response(JSON.stringify(internalServerError().toResponse()), {\n status: 500,\n headers\n });\n }\n }\n )\n )\n );\n }\n };\n};\n","export let parseForwardedFor = (xForwardedForHeader?: string | null | undefined) => {\n if (typeof xForwardedForHeader != 'string') return undefined;\n\n let ips = xForwardedForHeader\n .split(',')\n .map(ip => ip.trim())\n .filter(Boolean);\n return ips.length > 0 ? ips[0] : undefined;\n};\n","import { internalServerError, isServiceError, notFoundError } from '@lowerdeck/error';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { Controller, Handler, ServiceRequest } from './controller';\n\nlet Sentry = getSentry();\n\nexport let createServer =\n (opts: {\n onError?: (opts: {\n request: ServiceRequest;\n error: any;\n reqId: string;\n callId: string;\n callName: string;\n }) => void;\n onRequest?: (opts: {\n reqId: string;\n callId: string;\n callName: string;\n request: ServiceRequest;\n response: { status: number; body: any };\n }) => void;\n }) =>\n (controller: Controller<any>) => {\n let findHandler = (name: string): Handler<any, any, any> | null => {\n let parts = name.split(':');\n let current = controller;\n\n while (current && parts.length > 0) {\n current = current[parts.shift()!];\n if (!current) return null;\n }\n\n if (current && current instanceof Handler) return current;\n\n return null;\n };\n\n let getSupportedHandlerNames = (controller: Controller<any>): string[] =>\n Object.entries(controller).flatMap(([key, value]) => {\n if (value instanceof Handler) return [key];\n if (typeof value == 'object')\n return getSupportedHandlerNames(value).map(name => `${key}:${name}`);\n return [];\n });\n\n let handlerNames = getSupportedHandlerNames(controller);\n\n let run = async (\n req: ServiceRequest,\n call: { id: string; name: string; payload: any },\n reqId: string\n ): Promise<{\n response: any;\n status: number;\n request: ServiceRequest;\n }> => {\n let request = { ...req, body: call.payload };\n\n try {\n let handler = findHandler(call.name);\n\n if (!handler) {\n return {\n request,\n status: 404,\n response: notFoundError({ entity: 'handler' }).toResponse()\n };\n }\n\n let response = await handler.run(request, {});\n\n return {\n status: 200,\n request: req,\n response: response.response\n };\n } catch (e) {\n console.error(e);\n\n if (isServiceError(e)) {\n if (e.data.status >= 500) {\n Sentry.captureException(e, {\n tags: { reqId }\n });\n }\n\n return {\n request,\n status: e.data.status,\n response: e.toResponse()\n };\n }\n\n Sentry.captureException(e, {\n tags: { reqId }\n });\n\n opts.onError?.({\n callName: call.name,\n callId: call.id,\n request: req,\n error: e,\n reqId\n });\n\n return {\n request,\n status: 500,\n response: internalServerError().toResponse()\n };\n }\n };\n\n let runMany = async (\n req: ServiceRequest,\n body: {\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n requestId: string;\n }\n ): Promise<{\n status: number;\n body: any;\n }> => {\n let callRes = await Promise.all(\n body.calls.map(async (call, i) => {\n let res = await run(req, call as any, body.requestId);\n\n try {\n opts.onRequest?.({\n reqId: body.requestId,\n callId: call.id,\n callName: call.name,\n request: res.request,\n response: { status: res.status, body: res.response }\n });\n } catch (e) {\n Sentry.captureException(e);\n console.error(e);\n }\n\n return {\n __typename: 'rpc.response.call',\n id: call.id,\n name: call.name,\n status: res.status,\n result: res.response\n };\n })\n );\n\n return {\n status: Math.max(...callRes.map(c => c.status)),\n body: {\n __typename: 'rpc.response',\n calls: callRes\n }\n };\n };\n\n return {\n handlerNames,\n runMany\n\n // fetch,\n\n // http: async (\n // req: IncomingMessage & {\n // body: any;\n // },\n // res: ServerResponse & { send: (body: any) => void }\n // ) => {\n // let headers = new Headers(\n // Object.fromEntries(\n // Object.entries(req.headers).map(([key, value]) => [\n // key,\n // value === undefined ? '' : String(value)\n // ])\n // )\n // );\n // let url = new URL(req.url ?? '', `http://${req.headers.host}`);\n\n // let request = new Request(url.toString(), {\n // method: req.method,\n // headers,\n // body: JSON.stringify(req.body)\n // });\n\n // let response = await fetch(request);\n\n // res.statusCode = response.status;\n\n // for (let [key, value] of response.headers.entries()) {\n // res.setHeader(key, value);\n // }\n\n // res.send(response.body);\n // }\n };\n };\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","Group","_middleware","_proto","use","handler","opts","concat","ctx","_exit","_temp2","_result","res","key","sharedMiddlewareMemo","set","Promise","resolve","getSharedMemoKey","_temp","has","get","_await$ctx$sharedMidd","reject","createMiddleware","input","_exit2","_temp4","_result2","_temp3","_await$ctx$sharedMidd2","Handler","controller","handlers","_handler","_validation","_proto2","undefined","Error","push","validation","run","req","initialContext","_temp6","_extends","body","response","valRes","validate","success","ServiceError","validationError","errors","entity","_temp5","_forOf","mw","Sentry","getSentry","object","calls","array","id","string","name","payload","any","rpcMux","rpcs","handlerNameToRpcMap","Map","flatMap","rpc","i","handlerNames","map","path","fetch","_req$headers$get6","_opts$cors","_ref","_ref2","_ref3","_req$headers$get","sentryTraceHeaders","headers","sentryTrace","Array","isArray","join","baggage","ip","xForwardedForHeader","ips","split","trim","filter","Boolean","length","parseForwardedFor","Headers","corsOk","_i","_Object$entries","Object","entries","corsHeaders","_Object$entries$_i","append","withIsolationScope","continueTrace","_req$headers$get2","_req$headers$get3","startSpan","op","attributes","transport","ua","origin","_req$headers$get5","beforeSends","generateCustomId","parseCookies","memo","_req$headers$get4","Cookie","parse","request","url","query","searchParams","rawBody","requestId","getCookies","getCookie","setCookie","cookie","serialize","beforeSend","appendHeaders","newHeaders","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","getCurrentScope","setContext","fromEntries","addAttachment","filename","data","contentType","provideExecutionContext","createExecutionContext","type","contextId","userAgent","callsByRpc","resRef","__typename","status","pathParts","pathname","lastPart","_callsByRpc$get","slice","rpcIndex","Response","JSON","stringify","notFoundError","toResponse","_iterator2","_step2","_callsByRpc$get2","call","all","from","_ref4","runMany","_resRef$body$calls","Math","max","apply","encode","console","error","captureException","internalServerError","cors","rootDomain","URL","hostname","domains","includes","check","additionalCorsHeaders","method","_catch","_decode","decode","text","_req$text","_Response","notAcceptableError","message","createServer","getSupportedHandlerNames","reqId","parts","current","shift","findHandler","isServiceError","tags","onError","callName","callId","onRequest","callRes","c"],"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/error"),require("@lowerdeck/execution-context"),require("@lowerdeck/id"),require("@lowerdeck/memo"),require("@lowerdeck/sentry"),require("@lowerdeck/serialize"),require("@lowerdeck/validation"),require("cookie")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/error","@lowerdeck/execution-context","@lowerdeck/id","@lowerdeck/memo","@lowerdeck/sentry","@lowerdeck/serialize","@lowerdeck/validation","cookie"],r):r((e||self).rpcServer={},e.error,e.executionContext,e.id,e.memo,e.sentry,e.serialize,e.validation$1,e.cookie)}(this,function(e,r,t,n,o,i,a,s,u){function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var l=/*#__PURE__*/c(u);function d(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function f(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return d(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?d(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);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.")}function h(){return h=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},h.apply(null,arguments)}const p="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function v(e,r,t){if(!e.s){if(t instanceof m){if(!t.s)return void(t.o=v.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(v.bind(null,e,r),v.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var m=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var i=1&o?r:t;if(i){try{v(n,1,i(this.v))}catch(e){v(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?v(n,1,r?r(o):o):t?v(n,1,t(o)):v(n,2,o)}catch(e){v(n,2,e)}},n},e}();function y(e){return e instanceof m&&1&e.s}var g=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._middleware=e}var r=e.prototype;return r.use=function(r,t){return new e([].concat(this._middleware,[function(e){try{var n,o=function(t){if(n)return t;var o=r(e);return i&&e.sharedMiddlewareMemo.set(i,o),Promise.resolve(o)},i=null==t||null==t.getSharedMemoKey?void 0:t.getSharedMemoKey(e),a=function(){if(i&&e.sharedMiddlewareMemo.has(i))return Promise.resolve(e.sharedMiddlewareMemo.get(i)).then(function(e){return n=1,e})}();return Promise.resolve(a&&a.then?a.then(o):o(a))}catch(e){return Promise.reject(e)}}]))},r.createMiddleware=function(e,r){return function(t){return function(n){try{var o,i=function(r){if(o)return r;var i=e(n,t);return a&&n.sharedMiddlewareMemo.set(a,i),Promise.resolve(i)},a=null==r||null==r.getSharedMemoKey?void 0:r.getSharedMemoKey(n,t),s=function(){if(a&&n.sharedMiddlewareMemo.has(a))return Promise.resolve(n.sharedMiddlewareMemo.get(a)).then(function(e){return o=1,e})}();return Promise.resolve(s&&s.then?s.then(i):i(s))}catch(e){return Promise.reject(e)}}}},r.handler=function(){return new w([].concat(this._middleware))},r.controller=function(e){return e},e}(),w=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._handler=void 0,this._validation=void 0,this._middleware=e}var t=e.prototype;return t.do=function(e){if(null!=this._handler)throw new Error("Handler already defined");return this._handler=e,this},t.use=function(e){return this._middleware.push(e),this},t.input=function(e){if(null!=this._validation)throw new Error("Input validation already defined");return this._validation=e,this},t.run=function(e,t){try{var n=function(){return Promise.resolve(o._handler(h({},s,{input:i,body:void 0}))).then(function(e){return{response:e}})},o=this;if(!o._handler)throw new Error("Handler not defined");var i=e.body;if(o._validation){var a=o._validation.validate(e.body);if(!a.success)throw new r.ServiceError(r.validationError({errors:a.errors,entity:"call_data"}));i=a.value}var s=h({},t,e,{body:i}),u=function(e,r){if("function"==typeof e[p]){var t,n,o,i=function(e){try{for(;!(t=a.next()).done;)if((e=r(t.value))&&e.then){if(!y(e))return void e.then(i,o||(o=v.bind(null,n=new m,2)));e=e.v}n?v(n,1,e):n=e}catch(e){v(n||(n=new m),2,e)}},a=e[p]();if(i(),a.return){var s=function(e){try{t.done||a.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,r){var t,n,o=-1;return function i(a){try{for(;++o<e.length;)if((a=r(o))&&a.then){if(!y(a))return void a.then(i,n||(n=v.bind(null,t=new m,2)));a=a.v}t?v(t,1,a):t=a}catch(e){v(t||(t=new m),2,e)}}(),t}(u,function(e){return r(u[e])})}(o._middleware,function(e){return Promise.resolve(e(s)).then(function(e){e&&(s=h({},s,e))})});return Promise.resolve(u&&u.then?u.then(n):n())}catch(e){return Promise.reject(e)}},e}(),b=i.getSentry(),P=s.v.object({calls:s.v.array(s.v.object({id:s.v.string(),name:s.v.string(),payload:s.v.any()}))}),S=i.getSentry();e.Group=g,e.Handler=w,e.createServer=function(e){return function(t){var n=function(e){return Object.entries(e).flatMap(function(e){var r=e[0],t=e[1];return t instanceof w?[r]:"object"==typeof t?n(t).map(function(e){return r+":"+e}):[]})};return{handlerNames:n(t),runMany:function(n,o){try{return Promise.resolve(Promise.all(o.calls.map(function(i,a){try{return Promise.resolve(function(n,o,i){try{var a=h({},n,{body:o.payload});return Promise.resolve(function(e,i){try{var s=(u=function(e){for(var r=e.split(":"),n=t;n&&r.length>0;)if(!(n=n[r.shift()]))return null;return n&&n instanceof w?n:null}(o.name))?Promise.resolve(u.run(a,{})).then(function(e){return{status:200,request:n,response:e.response}}):{request:a,status:404,response:r.notFoundError({entity:"handler"}).toResponse()}}catch(e){return i(e)}var u;return s&&s.then?s.then(void 0,i):s}(0,function(t){return console.error(t),r.isServiceError(t)?(t.data.status>=500&&S.captureException(t,{tags:{reqId:i}}),{request:a,status:t.data.status,response:t.toResponse()}):(S.captureException(t,{tags:{reqId:i}}),null==e.onError||e.onError({callName:o.name,callId:o.id,request:n,error:t,reqId:i}),{request:a,status:500,response:r.internalServerError().toResponse()})}))}catch(e){return Promise.reject(e)}}(n,i,o.requestId)).then(function(r){try{null==e.onRequest||e.onRequest({reqId:o.requestId,callId:i.id,callName:i.name,request:r.request,response:{status:r.status,body:r.response}})}catch(e){S.captureException(e),console.error(e)}return{__typename:"rpc.response.call",id:i.id,name:i.name,status:r.status,result:r.response}})}catch(e){return Promise.reject(e)}}))).then(function(e){return{status:Math.max.apply(Math,e.map(function(e){return e.status})),body:{__typename:"rpc.response",calls:e}}})}catch(e){return Promise.reject(e)}}}}},e.rpcMux=function(e,i){var s=new Map(i.flatMap(function(e,r){return e.handlerNames.map(function(e){return[e,r]})}));return{path:e.path,fetch:function(u){try{var c,d,h,p=function(e){var c,d,p,v;if(h)return e;var y=u.headers.get("sentry-trace"),w=null!=(c=Array.isArray(y)?y.join(","):y)?c:void 0,q=u.headers.get("baggage"),M=function(e){if("string"==typeof e){var r=e.split(",").map(function(e){return e.trim()}).filter(Boolean);return r.length>0?r[0]:void 0}}(null!=(d=null!=(p=null!=(v=u.headers.get("lowerdeck-connecting-ip"))?v:u.headers.get("cf-connecting-ip"))?p:u.headers.get("x-forwarded-for"))?d:u.headers.get("x-real-ip")),x=new Headers;if(m)for(var _=0,k=Object.entries(S);_<k.length;_++){var E=k[_];x.append(E[0],E[1])}return Promise.resolve(b.withIsolationScope(function(){try{return Promise.resolve(b.continueTrace({sentryTrace:w,baggage:q},function(){try{var e,c;return Promise.resolve(b.startSpan({name:"rpc request",op:"rpc.server",attributes:{ip:M,transport:"http",ua:null!=(e=u.headers.get("user-agent"))?e:"",origin:null!=(c=u.headers.get("origin"))?c:""}},function(){try{try{var e,c=[],d=n.generateCustomId("req_"),h=o.memo(function(){var e;return l.parse(null!=(e=u.headers.get("cookie"))?e:"")}),p={url:u.url,headers:u.headers,query:g.searchParams,body:j,rawBody:j,ip:M,requestId:d,getCookies:function(){return h()},getCookie:function(e){return h()[e]},setCookie:function(e,r,t){var n=l.serialize(e,r,t);x.append("Set-Cookie",n)},beforeSend:function(e){c.push(e)},sharedMiddlewareMemo:new Map,appendHeaders:function(e){for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],i=n[1];if(Array.isArray(i))for(var a,s=f(i);!(a=s()).done;)x.append(o,a.value);else x.append(o,i)}}};b.getCurrentScope().setContext("rpc.request",{url:u.url,query:Object.fromEntries(g.searchParams.entries())}),b.getCurrentScope().addAttachment({filename:"rpc.request.body.json",data:j,contentType:"application/json"});var v=P.validate(j);return Promise.resolve(v.success?t.provideExecutionContext(t.createExecutionContext({type:"request",contextId:d,ip:null!=M?M:"0.0.0.0",userAgent:null!=(e=u.headers.get("user-agent"))?e:""}),function(){try{for(var e,t=new Map,n=f(j.calls);!(e=n()).done;){var o,u=e.value,l=s.get(u.name);if(null==l)return Promise.resolve(new Response(JSON.stringify(r.notFoundError({entity:"handler"}).toResponse()),{status:404,headers:x}));var h=null!=(o=t.get(l))?o:[];h.push(u),t.set(l,h)}var v={body:{__typename:"rpc.response",calls:[]},status:200};return Promise.resolve(Promise.all(Array.from(t.entries()).map(function(e){var r=e[0],t=e[1];try{return Promise.resolve(i[r].runMany(p,{requestId:d,calls:t})).then(function(e){var r;v.status=Math.max(v.status,e.status),(r=v.body.calls).push.apply(r,e.body.calls)})}catch(e){return Promise.reject(e)}}))).then(function(){return x.append("x-req-id",d),x.append("content-type","application/rpc+json"),x.append("x-powered-by","lowerdeck RPC"),Promise.resolve(Promise.all(c.map(function(e){return e()}))).then(function(){return new Response(a.serialize.encode(v.body),{status:v.status,headers:x})})})}catch(e){return Promise.reject(e)}}):new Response(JSON.stringify(r.validationError({errors:v.errors,entity:"request_data"}).toResponse()),{status:406,headers:x}))}catch(e){return console.error(e),b.captureException(e),Promise.resolve(new Response(JSON.stringify(r.internalServerError().toResponse()),{status:500,headers:x}))}}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))},v=null!=(c=u.headers.get("origin"))?c:"",m=!1;if(e.cors&&"domains"in e.cors)try{var y=new URL(v).hostname.split(".").slice(-2).join(".");m=e.cors.domains.includes(y)}catch(e){}else e.cors&&"check"in e.cors&&(m=e.cors.check(v));var g=new URL(u.url),w=null==(d=e.cors)||null==(d=d.headers)?void 0:d.join(", ");w&&(w=(", "+w).trim());var S=m?{"access-control-allow-origin":v,"access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"Content-Type, Authorization, Baggage, Sentry-Trace"+(null!=w?w:""),"access-control-max-age":"604800","access-control-allow-credentials":"true"}:{};if("OPTIONS"==u.method)return Promise.resolve(m?new Response(null,{status:204,headers:S}):new Response(null,{status:403}));var j=null,q=function(e,r){try{var t=e()}catch(e){return r()}return t&&t.then?t.then(void 0,r):t}(function(){var e=a.serialize.decode;return Promise.resolve(u.text()).then(function(r){j=e.call(a.serialize,r)})},function(){var e=new Response(JSON.stringify(r.notAcceptableError({message:"Invalid JSON"}).toResponse()),{status:406});return h=1,e});return Promise.resolve(q&&q.then?q.then(p):p(q))}catch(e){return Promise.reject(e)}}}}});
|
|
1
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@lowerdeck/error"),require("@lowerdeck/execution-context"),require("@lowerdeck/id"),require("@lowerdeck/memo"),require("@lowerdeck/sentry"),require("@lowerdeck/serialize"),require("@lowerdeck/validation"),require("cookie")):"function"==typeof define&&define.amd?define(["exports","@lowerdeck/error","@lowerdeck/execution-context","@lowerdeck/id","@lowerdeck/memo","@lowerdeck/sentry","@lowerdeck/serialize","@lowerdeck/validation","cookie"],r):r((e||self).rpcServer={},e.error,e.executionContext,e.id,e.memo,e.sentry,e.serialize,e.validation$1,e.cookie)}(this,function(e,r,t,n,o,i,a,s,u){function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}}),r.default=e,r}var l=/*#__PURE__*/c(u);function d(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function f(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return d(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?d(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);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.")}function h(){return h=Object.assign?Object.assign.bind():function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},h.apply(null,arguments)}const p="undefined"!=typeof Symbol?Symbol.iterator||(Symbol.iterator=Symbol("Symbol.iterator")):"@@iterator";function v(e,r,t){if(!e.s){if(t instanceof m){if(!t.s)return void(t.o=v.bind(null,e,r));1&r&&(r=t.s),t=t.v}if(t&&t.then)return void t.then(v.bind(null,e,r),v.bind(null,e,2));e.s=r,e.v=t;var n=e.o;n&&n(e)}}var m=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(r,t){var n=new e,o=this.s;if(o){var i=1&o?r:t;if(i){try{v(n,1,i(this.v))}catch(e){v(n,2,e)}return n}return this}return this.o=function(e){try{var o=e.v;1&e.s?v(n,1,r?r(o):o):t?v(n,1,t(o)):v(n,2,o)}catch(e){v(n,2,e)}},n},e}();function y(e){return e instanceof m&&1&e.s}var g=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._middleware=e}var r=e.prototype;return r.use=function(r,t){return new e([].concat(this._middleware,[function(e){try{var n,o=function(t){if(n)return t;var o=r(e);return i&&e.sharedMiddlewareMemo.set(i,o),Promise.resolve(o)},i=null==t||null==t.getSharedMemoKey?void 0:t.getSharedMemoKey(e),a=function(){if(i&&e.sharedMiddlewareMemo.has(i))return Promise.resolve(e.sharedMiddlewareMemo.get(i)).then(function(e){return n=1,e})}();return Promise.resolve(a&&a.then?a.then(o):o(a))}catch(e){return Promise.reject(e)}}]))},r.createMiddleware=function(e,r){return function(t){return function(n){try{var o,i=function(r){if(o)return r;var i=e(n,t);return a&&n.sharedMiddlewareMemo.set(a,i),Promise.resolve(i)},a=null==r||null==r.getSharedMemoKey?void 0:r.getSharedMemoKey(n,t),s=function(){if(a&&n.sharedMiddlewareMemo.has(a))return Promise.resolve(n.sharedMiddlewareMemo.get(a)).then(function(e){return o=1,e})}();return Promise.resolve(s&&s.then?s.then(i):i(s))}catch(e){return Promise.reject(e)}}}},r.handler=function(){return new w([].concat(this._middleware))},r.controller=function(e){return e},e}(),w=/*#__PURE__*/function(){function e(e){void 0===e&&(e=[]),this._middleware=void 0,this._handler=void 0,this._validation=void 0,this._middleware=e}var t=e.prototype;return t.do=function(e){if(null!=this._handler)throw new Error("Handler already defined");return this._handler=e,this},t.use=function(e){return this._middleware.push(e),this},t.input=function(e){if(null!=this._validation)throw new Error("Input validation already defined");return this._validation=e,this},t.run=function(e,t){try{var n=function(){return Promise.resolve(o._handler(h({},s,{input:i,body:void 0}))).then(function(e){return{response:e}})},o=this;if(!o._handler)throw new Error("Handler not defined");var i=e.body;if(o._validation){var a=o._validation.validate(e.body);if(!a.success)throw new r.ServiceError(r.validationError({errors:a.errors,entity:"call_data"}));i=a.value}var s=h({},t,e,{body:i}),u=function(e,r){if("function"==typeof e[p]){var t,n,o,i=function(e){try{for(;!(t=a.next()).done;)if((e=r(t.value))&&e.then){if(!y(e))return void e.then(i,o||(o=v.bind(null,n=new m,2)));e=e.v}n?v(n,1,e):n=e}catch(e){v(n||(n=new m),2,e)}},a=e[p]();if(i(),a.return){var s=function(e){try{t.done||a.return()}catch(e){}return e};if(n&&n.then)return n.then(s,function(e){throw s(e)});s()}return n}if(!("length"in e))throw new TypeError("Object is not iterable");for(var u=[],c=0;c<e.length;c++)u.push(e[c]);return function(e,r){var t,n,o=-1;return function i(a){try{for(;++o<e.length;)if((a=r(o))&&a.then){if(!y(a))return void a.then(i,n||(n=v.bind(null,t=new m,2)));a=a.v}t?v(t,1,a):t=a}catch(e){v(t||(t=new m),2,e)}}(),t}(u,function(e){return r(u[e])})}(o._middleware,function(e){return Promise.resolve(e(s)).then(function(e){e&&(s=h({},s,e))})});return Promise.resolve(u&&u.then?u.then(n):n())}catch(e){return Promise.reject(e)}},e}(),b=i.getSentry(),P=s.v.object({calls:s.v.array(s.v.object({id:s.v.string(),name:s.v.string(),payload:s.v.any()}))}),S=i.getSentry();e.Group=g,e.Handler=w,e.createServer=function(e){return function(t){var n=function(e){return Object.entries(e).flatMap(function(e){var r=e[0],t=e[1];return t instanceof w?[r]:"object"==typeof t?n(t).map(function(e){return r+":"+e}):[]})};return{handlerNames:n(t),runMany:function(n,o){try{return Promise.resolve(Promise.all(o.calls.map(function(i,a){try{return Promise.resolve(function(n,o,i){try{var a=h({},n,{body:o.payload});return Promise.resolve(function(e,i){try{var s=(u=function(e){for(var r=e.split(":"),n=t;n&&r.length>0;)if(!(n=n[r.shift()]))return null;return n&&n instanceof w?n:null}(o.name))?Promise.resolve(u.run(a,{})).then(function(e){return{status:200,request:n,response:e.response}}):{request:a,status:404,response:r.notFoundError({entity:"handler"}).toResponse()}}catch(e){return i(e)}var u;return s&&s.then?s.then(void 0,i):s}(0,function(t){return console.error(t),r.isServiceError(t)?(t.data.status>=500&&S.captureException(t,{tags:{reqId:i}}),{request:a,status:t.data.status,response:t.toResponse()}):(S.captureException(t,{tags:{reqId:i}}),null==e.onError||e.onError({callName:o.name,callId:o.id,request:n,error:t,reqId:i}),{request:a,status:500,response:r.internalServerError().toResponse()})}))}catch(e){return Promise.reject(e)}}(n,i,o.requestId)).then(function(r){try{null==e.onRequest||e.onRequest({reqId:o.requestId,callId:i.id,callName:i.name,request:r.request,response:{status:r.status,body:r.response}})}catch(e){S.captureException(e),console.error(e)}return{__typename:"rpc.response.call",id:i.id,name:i.name,status:r.status,result:r.response}})}catch(e){return Promise.reject(e)}}))).then(function(e){return{status:Math.max.apply(Math,e.map(function(e){return e.status})),body:{__typename:"rpc.response",calls:e}}})}catch(e){return Promise.reject(e)}}}}},e.rpcMux=function(e,i){var s=new Map(i.flatMap(function(e,r){return e.handlerNames.map(function(e){return[e,r]})}));return{path:e.path,fetch:function(u){try{var c,d,h,p=function(e){var c,d,p,v;if(h)return e;var y=u.headers.get("sentry-trace"),w=null!=(c=Array.isArray(y)?y.join(","):y)?c:void 0,q=u.headers.get("baggage"),M=function(e){if("string"==typeof e){var r=e.split(",").map(function(e){return e.trim()}).filter(Boolean);return r.length>0?r[0]:void 0}}(null!=(d=null!=(p=null!=(v=u.headers.get("lowerdeck-connecting-ip"))?v:u.headers.get("cf-connecting-ip"))?p:u.headers.get("x-forwarded-for"))?d:u.headers.get("x-real-ip")),x=new Headers;if(m)for(var _=0,k=Object.entries(S);_<k.length;_++){var E=k[_];x.append(E[0],E[1])}return Promise.resolve(b.withIsolationScope(function(){try{return Promise.resolve(b.continueTrace({sentryTrace:w,baggage:q},function(){try{var e,c;return Promise.resolve(b.startSpan({name:"rpc request",op:"rpc.server",attributes:{ip:M,transport:"http",ua:null!=(e=u.headers.get("user-agent"))?e:"",origin:null!=(c=u.headers.get("origin"))?c:""}},function(){try{try{var e,c=[],d=n.generateCustomId("req_"),h=o.memo(function(){var e;return l.parse(null!=(e=u.headers.get("cookie"))?e:"")}),p={url:u.url,headers:u.headers,query:g.searchParams,body:j,rawBody:j,ip:M,requestId:d,getCookies:function(){return h()},getCookie:function(e){return h()[e]},setCookie:function(e,r,t){var n=l.serialize(e,r,t);x.append("Set-Cookie",n)},beforeSend:function(e){c.push(e)},sharedMiddlewareMemo:new Map,appendHeaders:function(e){for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],i=n[1];if(Array.isArray(i))for(var a,s=f(i);!(a=s()).done;)x.append(o,a.value);else x.append(o,i)}}};return b.getCurrentScope().setContext("rpc.request",{url:u.url,query:Object.fromEntries(g.searchParams.entries())}),b.getCurrentScope().addAttachment({filename:"rpc.request.body.json",data:j,contentType:"application/json"}),Promise.resolve(t.provideExecutionContext(t.createExecutionContext({type:"request",contextId:d,ip:null!=M?M:"0.0.0.0",userAgent:null!=(e=u.headers.get("user-agent"))?e:""}),function(){try{var e=new Map,t={body:{__typename:"rpc.response",calls:[]},status:200},o=g.pathname.split("/").filter(Boolean),u=o[o.length-1];if("$"==u[0]){var l,h=u.slice(1),v=s.get(h);if(null==v)return Promise.resolve(new Response(JSON.stringify(r.notFoundError({entity:"handler"}).toResponse()),{status:404,headers:x}));var m=null!=(l=e.get(v))?l:[];m.push({id:n.generateCustomId("call_"),name:h,payload:j}),e.set(v,m)}else{var y=P.validate(j);if(!y.success)return Promise.resolve(new Response(JSON.stringify(r.validationError({errors:y.errors,entity:"request_data"}).toResponse()),{status:406,headers:x}));for(var w,b=f(y.value.calls);!(w=b()).done;){var S,q=w.value,M=s.get(q.name);if(null==M)return Promise.resolve(new Response(JSON.stringify(r.notFoundError({entity:"handler"}).toResponse()),{status:404,headers:x}));var _=null!=(S=e.get(M))?S:[];_.push(q),e.set(M,_)}}return Promise.resolve(Promise.all(Array.from(e.entries()).map(function(e){var r=e[0],n=e[1];try{return Promise.resolve(i[r].runMany(p,{requestId:d,calls:n})).then(function(e){var r;t.status=Math.max(t.status,e.status),(r=t.body.calls).push.apply(r,e.body.calls)})}catch(e){return Promise.reject(e)}}))).then(function(){return x.append("x-req-id",d),x.append("content-type","application/rpc+json"),x.append("x-powered-by","lowerdeck RPC"),Promise.resolve(Promise.all(c.map(function(e){return e()}))).then(function(){return new Response(a.serialize.encode(t.body),{status:t.status,headers:x})})})}catch(e){return Promise.reject(e)}}))}catch(e){return console.error(e),b.captureException(e),Promise.resolve(new Response(JSON.stringify(r.internalServerError().toResponse()),{status:500,headers:x}))}}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))}catch(e){return Promise.reject(e)}}))},v=null!=(c=u.headers.get("origin"))?c:"",m=!1;if(e.cors&&"domains"in e.cors)try{var y=new URL(v).hostname.split(".").slice(-2).join(".");m=e.cors.domains.includes(y)}catch(e){}else e.cors&&"check"in e.cors&&(m=e.cors.check(v));var g=new URL(u.url),w=null==(d=e.cors)||null==(d=d.headers)?void 0:d.join(", ");w&&(w=(", "+w).trim());var S=m?{"access-control-allow-origin":v,"access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"Content-Type, Authorization, Baggage, Sentry-Trace"+(null!=w?w:""),"access-control-max-age":"604800","access-control-allow-credentials":"true"}:{};if("OPTIONS"==u.method)return Promise.resolve(m?new Response(null,{status:204,headers:S}):new Response(null,{status:403}));var j=null,q=function(e,r){try{var t=e()}catch(e){return r()}return t&&t.then?t.then(void 0,r):t}(function(){var e=a.serialize.decode;return Promise.resolve(u.text()).then(function(r){j=e.call(a.serialize,r)})},function(){var e=new Response(JSON.stringify(r.notAcceptableError({message:"Invalid JSON"}).toResponse()),{status:406});return h=1,e});return Promise.resolve(q&&q.then?q.then(p):p(q))}catch(e){return Promise.reject(e)}}}}});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/controller.ts","../src/rpcMux.ts","../src/server.ts","../src/extractIp.ts"],"sourcesContent":["import { ServiceError, validationError } from '@lowerdeck/error';\nimport { ValidationType } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\n\nexport type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface ServiceRequest {\n query: URLSearchParams;\n headers: Headers;\n url: string;\n ip?: string;\n body: any;\n rawBody: any;\n requestId: string;\n\n getCookies: () => Record<string, string | undefined>;\n getCookie: (name: string) => string | undefined;\n setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;\n\n sharedMiddlewareMemo: Map<string, Promise<any>>;\n beforeSend: (handler: () => Promise<any>) => void;\n appendHeaders: (headers: Record<string, string | string[]>) => void;\n}\n\nexport type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\nexport type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;\n\nexport class Group<Context extends { [key: string]: any } = {}> {\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n use<T extends { [key: string]: any } | undefined | void>(\n handler: (ctx: Context & ServiceRequest) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;\n }\n ) {\n let middleware = async (ctx: Parameters<typeof handler>[0]): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n\n return new Group<Simplify<Context & T>>([...this._middleware, middleware]);\n }\n\n createMiddleware<T extends { [key: string]: any }, P = void>(\n handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;\n }\n ) {\n return (input: P) =>\n async (ctx: Context & ServiceRequest): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx, input);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx, input);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n }\n\n handler() {\n return new Handler([...this._middleware]);\n }\n\n controller<\n HandlersAndSubControllers extends {\n [key: string]: Handler<any, any, any> | Controller<any>;\n }\n >(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers> {\n return handlers;\n }\n}\n\nexport type Controller<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = HandlersAndSubControllers;\n\nexport type InferControllerType<T> = T extends Controller<infer U> ? U : never;\n\nexport type InferClient<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = {\n [K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<\n infer I,\n infer O,\n infer C\n >\n ? ((\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<O>) & {\n getFull: (\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<{\n data: O;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n : HandlersAndSubControllers[K] extends Controller<infer U>\n ? InferClient<U>\n : never;\n};\n\nexport class Handler<Input, Output, Context extends { [key: string]: any } = {}> {\n private _handler!: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<Output>;\n private _validation: ValidationType<Input> | undefined;\n\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n do<HandlerOutput>(\n handler: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<HandlerOutput>\n ) {\n if (this._handler != undefined) throw new Error('Handler already defined');\n\n // @ts-ignore\n this._handler = handler;\n\n return this as any as Handler<Input, HandlerOutput, Context>;\n }\n\n use<T extends { [key: string]: any } = {}>(\n handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>\n ) {\n this._middleware.push(handler);\n return this as any as Handler<Input, Output, ExtendContext<Context, T>>;\n }\n\n input<HandlerInput>(validation: ValidationType<HandlerInput>) {\n if (this._validation != undefined) throw new Error('Input validation already defined');\n\n // @ts-ignore\n this._validation = validation;\n\n return this as any as Handler<HandlerInput, Output, Context>;\n }\n\n async run(\n req: ServiceRequest,\n initialContext: any\n ): Promise<{\n response: Output;\n }> {\n if (!this._handler) throw new Error('Handler not defined');\n\n let input = req.body as Input;\n\n if (this._validation) {\n let valRes = this._validation.validate(req.body);\n\n if (!valRes.success) {\n throw new ServiceError(\n validationError({ errors: valRes.errors, entity: 'call_data' })\n );\n }\n\n input = valRes.value;\n }\n\n let ctx = {\n ...initialContext,\n ...req,\n\n // Always use the sanitized input\n body: input\n };\n\n for (let mw of this._middleware) {\n let res = await mw(ctx);\n if (res) ctx = { ...ctx, ...res };\n }\n\n let res = await this._handler({\n ...ctx,\n input,\n body: undefined\n });\n\n return {\n response: res\n };\n }\n}\n","import {\n internalServerError,\n notAcceptableError,\n notFoundError,\n validationError\n} from '@lowerdeck/error';\nimport { createExecutionContext, provideExecutionContext } from '@lowerdeck/execution-context';\nimport { generateCustomId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { serialize } from '@lowerdeck/serialize';\nimport { v } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\nimport { ServiceRequest } from './controller';\nimport { parseForwardedFor } from './extractIp';\n\nlet Sentry = getSentry();\n\nlet validation = v.object({\n calls: v.array(\n v.object({\n id: v.string(),\n name: v.string(),\n payload: v.any()\n })\n )\n});\n\nexport let rpcMux = (\n opts: {\n path: string;\n cors?: {\n headers?: string[];\n } & ({ domains: string[] } | { check: (origin: string) => boolean });\n },\n rpcs: {\n handlerNames: string[];\n runMany: (\n req: ServiceRequest,\n body: {\n requestId: string;\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n }\n ) => Promise<{\n status: number;\n body: {\n calls: any[];\n };\n }>;\n }[]\n) => {\n let handlerNameToRpcMap = new Map<string, number>(\n rpcs.flatMap((rpc, i) => rpc.handlerNames.map(name => [name, i]))\n );\n\n return {\n path: opts.path,\n\n fetch: async (req: any): Promise<any> => {\n let origin = req.headers.get('origin') ?? '';\n let corsOk = false;\n\n if (opts.cors && 'domains' in opts.cors) {\n try {\n let url = new URL(origin);\n let rootDomain = url.hostname.split('.').slice(-2).join('.');\n corsOk = opts.cors.domains.includes(rootDomain);\n } catch (e) {\n // Ignore -> no cors\n }\n } else if (opts.cors && 'check' in opts.cors) {\n corsOk = opts.cors.check(origin);\n }\n\n let url = new URL(req.url);\n\n let additionalCorsHeaders = opts.cors?.headers?.join(', ');\n if (additionalCorsHeaders) additionalCorsHeaders = `, ${additionalCorsHeaders}`.trim();\n\n let corsHeaders: Record<string, string> = corsOk\n ? {\n 'access-control-allow-origin': origin,\n 'access-control-allow-methods': 'POST, OPTIONS',\n 'access-control-allow-headers': `Content-Type, Authorization, Baggage, Sentry-Trace${\n additionalCorsHeaders ?? ''\n }`,\n 'access-control-max-age': '604800',\n 'access-control-allow-credentials': 'true'\n }\n : {};\n\n if (req.method == 'OPTIONS') {\n if (corsOk) {\n return new Response(null, {\n status: 204,\n headers: corsHeaders\n });\n }\n\n return new Response(null, { status: 403 });\n }\n\n let body: any = null;\n\n try {\n body = serialize.decode(await req.text());\n } catch (e) {\n return new Response(\n JSON.stringify(notAcceptableError({ message: 'Invalid JSON' }).toResponse()),\n { status: 406 }\n );\n }\n\n let sentryTraceHeaders = req.headers.get('sentry-trace');\n let sentryTrace =\n (Array.isArray(sentryTraceHeaders)\n ? sentryTraceHeaders.join(',')\n : sentryTraceHeaders) ?? undefined;\n let baggage = req.headers.get('baggage');\n\n let ip = parseForwardedFor(\n req.headers.get('lowerdeck-connecting-ip') ??\n req.headers.get('cf-connecting-ip') ??\n req.headers.get('x-forwarded-for') ??\n req.headers.get('x-real-ip')\n );\n\n let headers = new Headers();\n\n if (corsOk) {\n for (let [key, value] of Object.entries(corsHeaders)) {\n headers.append(key, value);\n }\n }\n\n return await Sentry.withIsolationScope(\n async () =>\n await Sentry.continueTrace(\n { sentryTrace, baggage },\n async () =>\n await Sentry.startSpan(\n {\n name: 'rpc request',\n op: 'rpc.server',\n attributes: {\n ip,\n transport: 'http',\n ua: req.headers.get('user-agent') ?? '',\n origin: req.headers.get('origin') ?? ''\n }\n },\n async () => {\n try {\n let beforeSends: Array<() => Promise<any>> = [];\n let id = generateCustomId('req_');\n\n let parseCookies = memo(() =>\n Cookie.parse(req.headers.get('cookie') ?? '')\n );\n\n let request: ServiceRequest = {\n url: req.url,\n headers: req.headers,\n query: url.searchParams,\n body,\n rawBody: body,\n ip,\n requestId: id,\n\n getCookies: () => parseCookies(),\n getCookie: (name: string) => parseCookies()[name],\n setCookie: (name: string, value: string, opts?: any) => {\n let cookie = Cookie.serialize(name, value, opts);\n // @ts-ignore\n headers.append('Set-Cookie', cookie);\n },\n\n beforeSend: (handler: () => Promise<any>) => {\n beforeSends.push(handler);\n },\n\n sharedMiddlewareMemo: new Map<string, Promise<any>>(),\n\n appendHeaders: (newHeaders: Record<string, string | string[]>) => {\n for (let [key, value] of Object.entries(newHeaders)) {\n if (Array.isArray(value)) {\n for (let v of value) headers.append(key, v);\n } else {\n headers.append(key, value);\n }\n }\n }\n };\n\n Sentry.getCurrentScope().setContext('rpc.request', {\n url: req.url,\n query: Object.fromEntries(url.searchParams.entries())\n });\n\n Sentry.getCurrentScope().addAttachment({\n filename: 'rpc.request.body.json',\n data: body,\n contentType: 'application/json'\n });\n\n let valRes = validation.validate(body);\n if (!valRes.success) {\n return new Response(\n JSON.stringify(\n validationError({\n errors: valRes.errors,\n entity: 'request_data'\n }).toResponse()\n ),\n { status: 406, headers }\n );\n }\n\n return provideExecutionContext(\n createExecutionContext({\n type: 'request',\n contextId: id,\n ip: ip ?? '0.0.0.0',\n userAgent: req.headers.get('user-agent') ?? ''\n }),\n async () => {\n let callsByRpc = new Map<\n number,\n { id: string; name: string; payload: any }[]\n >();\n\n for (let call of body.calls) {\n let rpcIndex = handlerNameToRpcMap.get(call.name);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push(call);\n callsByRpc.set(rpcIndex, calls);\n }\n\n // let res = await runMany(request);\n\n let resRef = {\n body: {\n __typename: 'rpc.response',\n calls: [] as any[]\n },\n status: 200\n };\n\n await Promise.all(\n Array.from(callsByRpc.entries()).map(async ([rpcIndex, calls]) => {\n let rpc = rpcs[rpcIndex];\n let res = await rpc.runMany(request, {\n requestId: id,\n calls\n });\n\n resRef.status = Math.max(resRef.status, res.status);\n resRef.body.calls.push(...res.body.calls);\n })\n );\n\n headers.append('x-req-id', id);\n headers.append('content-type', 'application/rpc+json');\n headers.append('x-powered-by', 'lowerdeck RPC');\n\n await Promise.all(beforeSends.map(s => s()));\n\n return new Response(serialize.encode(resRef.body), {\n status: resRef.status,\n headers\n });\n }\n );\n } catch (e) {\n console.error(e);\n\n Sentry.captureException(e);\n\n return new Response(JSON.stringify(internalServerError().toResponse()), {\n status: 500,\n headers\n });\n }\n }\n )\n )\n );\n }\n };\n};\n","import { internalServerError, isServiceError, notFoundError } from '@lowerdeck/error';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { Controller, Handler, ServiceRequest } from './controller';\n\nlet Sentry = getSentry();\n\nexport let createServer =\n (opts: {\n onError?: (opts: {\n request: ServiceRequest;\n error: any;\n reqId: string;\n callId: string;\n callName: string;\n }) => void;\n onRequest?: (opts: {\n reqId: string;\n callId: string;\n callName: string;\n request: ServiceRequest;\n response: { status: number; body: any };\n }) => void;\n }) =>\n (controller: Controller<any>) => {\n let findHandler = (name: string): Handler<any, any, any> | null => {\n let parts = name.split(':');\n let current = controller;\n\n while (current && parts.length > 0) {\n current = current[parts.shift()!];\n if (!current) return null;\n }\n\n if (current && current instanceof Handler) return current;\n\n return null;\n };\n\n let getSupportedHandlerNames = (controller: Controller<any>): string[] =>\n Object.entries(controller).flatMap(([key, value]) => {\n if (value instanceof Handler) return [key];\n if (typeof value == 'object')\n return getSupportedHandlerNames(value).map(name => `${key}:${name}`);\n return [];\n });\n\n let handlerNames = getSupportedHandlerNames(controller);\n\n let run = async (\n req: ServiceRequest,\n call: { id: string; name: string; payload: any },\n reqId: string\n ): Promise<{\n response: any;\n status: number;\n request: ServiceRequest;\n }> => {\n let request = { ...req, body: call.payload };\n\n try {\n let handler = findHandler(call.name);\n\n if (!handler) {\n return {\n request,\n status: 404,\n response: notFoundError({ entity: 'handler' }).toResponse()\n };\n }\n\n let response = await handler.run(request, {});\n\n return {\n status: 200,\n request: req,\n response: response.response\n };\n } catch (e) {\n console.error(e);\n\n if (isServiceError(e)) {\n if (e.data.status >= 500) {\n Sentry.captureException(e, {\n tags: { reqId }\n });\n }\n\n return {\n request,\n status: e.data.status,\n response: e.toResponse()\n };\n }\n\n Sentry.captureException(e, {\n tags: { reqId }\n });\n\n opts.onError?.({\n callName: call.name,\n callId: call.id,\n request: req,\n error: e,\n reqId\n });\n\n return {\n request,\n status: 500,\n response: internalServerError().toResponse()\n };\n }\n };\n\n let runMany = async (\n req: ServiceRequest,\n body: {\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n requestId: string;\n }\n ): Promise<{\n status: number;\n body: any;\n }> => {\n let callRes = await Promise.all(\n body.calls.map(async (call, i) => {\n let res = await run(req, call as any, body.requestId);\n\n try {\n opts.onRequest?.({\n reqId: body.requestId,\n callId: call.id,\n callName: call.name,\n request: res.request,\n response: { status: res.status, body: res.response }\n });\n } catch (e) {\n Sentry.captureException(e);\n console.error(e);\n }\n\n return {\n __typename: 'rpc.response.call',\n id: call.id,\n name: call.name,\n status: res.status,\n result: res.response\n };\n })\n );\n\n return {\n status: Math.max(...callRes.map(c => c.status)),\n body: {\n __typename: 'rpc.response',\n calls: callRes\n }\n };\n };\n\n return {\n handlerNames,\n runMany\n\n // fetch,\n\n // http: async (\n // req: IncomingMessage & {\n // body: any;\n // },\n // res: ServerResponse & { send: (body: any) => void }\n // ) => {\n // let headers = new Headers(\n // Object.fromEntries(\n // Object.entries(req.headers).map(([key, value]) => [\n // key,\n // value === undefined ? '' : String(value)\n // ])\n // )\n // );\n // let url = new URL(req.url ?? '', `http://${req.headers.host}`);\n\n // let request = new Request(url.toString(), {\n // method: req.method,\n // headers,\n // body: JSON.stringify(req.body)\n // });\n\n // let response = await fetch(request);\n\n // res.statusCode = response.status;\n\n // for (let [key, value] of response.headers.entries()) {\n // res.setHeader(key, value);\n // }\n\n // res.send(response.body);\n // }\n };\n };\n","export let parseForwardedFor = (xForwardedForHeader?: string | null | undefined) => {\n if (typeof xForwardedForHeader != 'string') return undefined;\n\n let ips = xForwardedForHeader\n .split(',')\n .map(ip => ip.trim())\n .filter(Boolean);\n return ips.length > 0 ? ips[0] : undefined;\n};\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","Group","_middleware","_proto","use","handler","opts","concat","ctx","_exit","_temp2","_result","res","key","sharedMiddlewareMemo","set","Promise","resolve","getSharedMemoKey","_temp","has","get","_await$ctx$sharedMidd","reject","createMiddleware","input","_exit2","_temp4","_result2","_temp3","_await$ctx$sharedMidd2","Handler","controller","handlers","_handler","_validation","_proto2","undefined","Error","push","validation","run","req","initialContext","_temp6","_extends","body","response","valRes","validate","success","ServiceError","validationError","errors","entity","_temp5","_forOf","mw","Sentry","getSentry","object","calls","array","id","string","name","payload","any","getSupportedHandlerNames","Object","entries","flatMap","_ref","map","handlerNames","runMany","all","call","i","reqId","request","parts","split","current","length","shift","findHandler","status","notFoundError","toResponse","_catch","console","error","isServiceError","data","captureException","tags","onError","callName","callId","internalServerError","requestId","onRequest","__typename","callRes","Math","max","apply","c","rpcs","handlerNameToRpcMap","Map","rpc","path","fetch","_req$headers$get6","_opts$cors","_ref2","_ref3","_req$headers$get","sentryTraceHeaders","headers","sentryTrace","Array","isArray","join","baggage","ip","xForwardedForHeader","ips","trim","filter","Boolean","parseForwardedFor","Headers","corsOk","_i","_Object$entries","corsHeaders","_Object$entries$_i","append","withIsolationScope","continueTrace","_req$headers$get2","_req$headers$get3","startSpan","op","attributes","transport","ua","origin","_req$headers$get5","beforeSends","generateCustomId","parseCookies","memo","_req$headers$get4","Cookie","parse","url","query","searchParams","rawBody","getCookies","getCookie","setCookie","cookie","serialize","beforeSend","appendHeaders","newHeaders","_i2","_Object$entries2","_Object$entries2$_i","_iterator","_step","_createForOfIteratorHelperLoose","done","getCurrentScope","setContext","fromEntries","addAttachment","filename","contentType","provideExecutionContext","createExecutionContext","type","contextId","userAgent","_step2","callsByRpc","_iterator2","_callsByRpc$get","rpcIndex","Response","JSON","stringify","resRef","from","_ref4","_resRef$body$calls","encode","cors","rootDomain","URL","hostname","slice","domains","includes","check","additionalCorsHeaders","method","_decode","decode","text","_req$text","_Response","notAcceptableError","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/controller.ts","../src/rpcMux.ts","../src/server.ts","../src/extractIp.ts"],"sourcesContent":["import { ServiceError, validationError } from '@lowerdeck/error';\nimport { ValidationType } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\n\nexport type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nexport interface ServiceRequest {\n query: URLSearchParams;\n headers: Headers;\n url: string;\n ip?: string;\n body: any;\n rawBody: any;\n requestId: string;\n\n getCookies: () => Record<string, string | undefined>;\n getCookie: (name: string) => string | undefined;\n setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;\n\n sharedMiddlewareMemo: Map<string, Promise<any>>;\n beforeSend: (handler: () => Promise<any>) => void;\n appendHeaders: (headers: Record<string, string | string[]>) => void;\n}\n\nexport type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};\nexport type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;\n\nexport class Group<Context extends { [key: string]: any } = {}> {\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n use<T extends { [key: string]: any } | undefined | void>(\n handler: (ctx: Context & ServiceRequest) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;\n }\n ) {\n let middleware = async (ctx: Parameters<typeof handler>[0]): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n\n return new Group<Simplify<Context & T>>([...this._middleware, middleware]);\n }\n\n createMiddleware<T extends { [key: string]: any }, P = void>(\n handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>,\n opts?: {\n getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;\n }\n ) {\n return (input: P) =>\n async (ctx: Context & ServiceRequest): Promise<T> => {\n let key = opts?.getSharedMemoKey?.(ctx, input);\n if (key && ctx.sharedMiddlewareMemo.has(key)) {\n return await ctx.sharedMiddlewareMemo.get(key)!;\n }\n\n let res = handler(ctx, input);\n if (key) ctx.sharedMiddlewareMemo.set(key, res);\n\n return await res;\n };\n }\n\n handler() {\n return new Handler([...this._middleware]);\n }\n\n controller<\n HandlersAndSubControllers extends {\n [key: string]: Handler<any, any, any> | Controller<any>;\n }\n >(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers> {\n return handlers;\n }\n}\n\nexport type Controller<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = HandlersAndSubControllers;\n\nexport type InferControllerType<T> = T extends Controller<infer U> ? U : never;\n\nexport type InferClient<\n HandlersAndSubControllers extends { [key: string]: Handler<any, any, any> | Controller<any> }\n> = {\n [K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<\n infer I,\n infer O,\n infer C\n >\n ? ((\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<O>) & {\n getFull: (\n input: I,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> }\n ) => Promise<{\n data: O;\n status: number;\n headers: Record<string, string>;\n }>;\n }\n : HandlersAndSubControllers[K] extends Controller<infer U>\n ? InferClient<U>\n : never;\n};\n\nexport class Handler<Input, Output, Context extends { [key: string]: any } = {}> {\n private _handler!: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<Output>;\n private _validation: ValidationType<Input> | undefined;\n\n constructor(\n private _middleware: Array<(ctx: Context & ServiceRequest) => Promise<any>> = []\n ) {}\n\n do<HandlerOutput>(\n handler: (\n ctx: Context & Omit<ServiceRequest, 'body'> & { input: Input }\n ) => Promise<HandlerOutput>\n ) {\n if (this._handler != undefined) throw new Error('Handler already defined');\n\n // @ts-ignore\n this._handler = handler;\n\n return this as any as Handler<Input, HandlerOutput, Context>;\n }\n\n use<T extends { [key: string]: any } = {}>(\n handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>\n ) {\n this._middleware.push(handler);\n return this as any as Handler<Input, Output, ExtendContext<Context, T>>;\n }\n\n input<HandlerInput>(validation: ValidationType<HandlerInput>) {\n if (this._validation != undefined) throw new Error('Input validation already defined');\n\n // @ts-ignore\n this._validation = validation;\n\n return this as any as Handler<HandlerInput, Output, Context>;\n }\n\n async run(\n req: ServiceRequest,\n initialContext: any\n ): Promise<{\n response: Output;\n }> {\n if (!this._handler) throw new Error('Handler not defined');\n\n let input = req.body as Input;\n\n if (this._validation) {\n let valRes = this._validation.validate(req.body);\n\n if (!valRes.success) {\n throw new ServiceError(\n validationError({ errors: valRes.errors, entity: 'call_data' })\n );\n }\n\n input = valRes.value;\n }\n\n let ctx = {\n ...initialContext,\n ...req,\n\n // Always use the sanitized input\n body: input\n };\n\n for (let mw of this._middleware) {\n let res = await mw(ctx);\n if (res) ctx = { ...ctx, ...res };\n }\n\n let res = await this._handler({\n ...ctx,\n input,\n body: undefined\n });\n\n return {\n response: res\n };\n }\n}\n","import {\n internalServerError,\n notAcceptableError,\n notFoundError,\n validationError\n} from '@lowerdeck/error';\nimport { createExecutionContext, provideExecutionContext } from '@lowerdeck/execution-context';\nimport { generateCustomId } from '@lowerdeck/id';\nimport { memo } from '@lowerdeck/memo';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { serialize } from '@lowerdeck/serialize';\nimport { v } from '@lowerdeck/validation';\nimport * as Cookie from 'cookie';\nimport { ServiceRequest } from './controller';\nimport { parseForwardedFor } from './extractIp';\n\nlet Sentry = getSentry();\n\nlet validation = v.object({\n calls: v.array(\n v.object({\n id: v.string(),\n name: v.string(),\n payload: v.any()\n })\n )\n});\n\nexport let rpcMux = (\n opts: {\n path: string;\n cors?: {\n headers?: string[];\n } & ({ domains: string[] } | { check: (origin: string) => boolean });\n },\n rpcs: {\n handlerNames: string[];\n runMany: (\n req: ServiceRequest,\n body: {\n requestId: string;\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n }\n ) => Promise<{\n status: number;\n body: {\n calls: any[];\n };\n }>;\n }[]\n) => {\n let handlerNameToRpcMap = new Map<string, number>(\n rpcs.flatMap((rpc, i) => rpc.handlerNames.map(name => [name, i]))\n );\n\n return {\n path: opts.path,\n\n fetch: async (req: any): Promise<any> => {\n let origin = req.headers.get('origin') ?? '';\n let corsOk = false;\n\n if (opts.cors && 'domains' in opts.cors) {\n try {\n let url = new URL(origin);\n let rootDomain = url.hostname.split('.').slice(-2).join('.');\n corsOk = opts.cors.domains.includes(rootDomain);\n } catch (e) {\n // Ignore -> no cors\n }\n } else if (opts.cors && 'check' in opts.cors) {\n corsOk = opts.cors.check(origin);\n }\n\n let url = new URL(req.url);\n\n let additionalCorsHeaders = opts.cors?.headers?.join(', ');\n if (additionalCorsHeaders) additionalCorsHeaders = `, ${additionalCorsHeaders}`.trim();\n\n let corsHeaders: Record<string, string> = corsOk\n ? {\n 'access-control-allow-origin': origin,\n 'access-control-allow-methods': 'POST, OPTIONS',\n 'access-control-allow-headers': `Content-Type, Authorization, Baggage, Sentry-Trace${\n additionalCorsHeaders ?? ''\n }`,\n 'access-control-max-age': '604800',\n 'access-control-allow-credentials': 'true'\n }\n : {};\n\n if (req.method == 'OPTIONS') {\n if (corsOk) {\n return new Response(null, {\n status: 204,\n headers: corsHeaders\n });\n }\n\n return new Response(null, { status: 403 });\n }\n\n let body: any = null;\n\n try {\n body = serialize.decode(await req.text());\n } catch (e) {\n return new Response(\n JSON.stringify(notAcceptableError({ message: 'Invalid JSON' }).toResponse()),\n { status: 406 }\n );\n }\n\n let sentryTraceHeaders = req.headers.get('sentry-trace');\n let sentryTrace =\n (Array.isArray(sentryTraceHeaders)\n ? sentryTraceHeaders.join(',')\n : sentryTraceHeaders) ?? undefined;\n let baggage = req.headers.get('baggage');\n\n let ip = parseForwardedFor(\n req.headers.get('lowerdeck-connecting-ip') ??\n req.headers.get('cf-connecting-ip') ??\n req.headers.get('x-forwarded-for') ??\n req.headers.get('x-real-ip')\n );\n\n let headers = new Headers();\n\n if (corsOk) {\n for (let [key, value] of Object.entries(corsHeaders)) {\n headers.append(key, value);\n }\n }\n\n return await Sentry.withIsolationScope(\n async () =>\n await Sentry.continueTrace(\n { sentryTrace, baggage },\n async () =>\n await Sentry.startSpan(\n {\n name: 'rpc request',\n op: 'rpc.server',\n attributes: {\n ip,\n transport: 'http',\n ua: req.headers.get('user-agent') ?? '',\n origin: req.headers.get('origin') ?? ''\n }\n },\n async () => {\n try {\n let beforeSends: Array<() => Promise<any>> = [];\n let id = generateCustomId('req_');\n\n let parseCookies = memo(() =>\n Cookie.parse(req.headers.get('cookie') ?? '')\n );\n\n let request: ServiceRequest = {\n url: req.url,\n headers: req.headers,\n query: url.searchParams,\n body,\n rawBody: body,\n ip,\n requestId: id,\n\n getCookies: () => parseCookies(),\n getCookie: (name: string) => parseCookies()[name],\n setCookie: (name: string, value: string, opts?: any) => {\n let cookie = Cookie.serialize(name, value, opts);\n // @ts-ignore\n headers.append('Set-Cookie', cookie);\n },\n\n beforeSend: (handler: () => Promise<any>) => {\n beforeSends.push(handler);\n },\n\n sharedMiddlewareMemo: new Map<string, Promise<any>>(),\n\n appendHeaders: (newHeaders: Record<string, string | string[]>) => {\n for (let [key, value] of Object.entries(newHeaders)) {\n if (Array.isArray(value)) {\n for (let v of value) headers.append(key, v);\n } else {\n headers.append(key, value);\n }\n }\n }\n };\n\n Sentry.getCurrentScope().setContext('rpc.request', {\n url: req.url,\n query: Object.fromEntries(url.searchParams.entries())\n });\n\n Sentry.getCurrentScope().addAttachment({\n filename: 'rpc.request.body.json',\n data: body,\n contentType: 'application/json'\n });\n\n return provideExecutionContext(\n createExecutionContext({\n type: 'request',\n contextId: id,\n ip: ip ?? '0.0.0.0',\n userAgent: req.headers.get('user-agent') ?? ''\n }),\n async () => {\n let callsByRpc = new Map<\n number,\n { id: string; name: string; payload: any }[]\n >();\n\n let resRef = {\n body: {\n __typename: 'rpc.response',\n calls: [] as any[]\n },\n status: 200\n };\n\n let pathParts = url.pathname.split('/').filter(Boolean);\n let lastPart = pathParts[pathParts.length - 1];\n\n if (lastPart[0] == '$') {\n let id = lastPart.slice(1);\n let rpcIndex = handlerNameToRpcMap.get(id);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push({\n id: generateCustomId('call_'),\n name: id,\n payload: body\n });\n callsByRpc.set(rpcIndex, calls);\n } else {\n let valRes = validation.validate(body);\n if (!valRes.success) {\n return new Response(\n JSON.stringify(\n validationError({\n errors: valRes.errors,\n entity: 'request_data'\n }).toResponse()\n ),\n { status: 406, headers }\n );\n }\n\n for (let call of valRes.value.calls) {\n let rpcIndex = handlerNameToRpcMap.get(call.name);\n if (rpcIndex == undefined) {\n return new Response(\n JSON.stringify(\n notFoundError({ entity: 'handler' }).toResponse()\n ),\n { status: 404, headers }\n );\n }\n\n let calls = callsByRpc.get(rpcIndex) ?? [];\n calls.push(call as any);\n callsByRpc.set(rpcIndex, calls);\n }\n }\n\n await Promise.all(\n Array.from(callsByRpc.entries()).map(async ([rpcIndex, calls]) => {\n let rpc = rpcs[rpcIndex];\n let res = await rpc.runMany(request, {\n requestId: id,\n calls\n });\n\n resRef.status = Math.max(resRef.status, res.status);\n resRef.body.calls.push(...res.body.calls);\n })\n );\n\n headers.append('x-req-id', id);\n headers.append('content-type', 'application/rpc+json');\n headers.append('x-powered-by', 'lowerdeck RPC');\n\n await Promise.all(beforeSends.map(s => s()));\n\n return new Response(serialize.encode(resRef.body), {\n status: resRef.status,\n headers\n });\n }\n );\n } catch (e) {\n console.error(e);\n\n Sentry.captureException(e);\n\n return new Response(JSON.stringify(internalServerError().toResponse()), {\n status: 500,\n headers\n });\n }\n }\n )\n )\n );\n }\n };\n};\n","import { internalServerError, isServiceError, notFoundError } from '@lowerdeck/error';\nimport { getSentry } from '@lowerdeck/sentry';\nimport { Controller, Handler, ServiceRequest } from './controller';\n\nlet Sentry = getSentry();\n\nexport let createServer =\n (opts: {\n onError?: (opts: {\n request: ServiceRequest;\n error: any;\n reqId: string;\n callId: string;\n callName: string;\n }) => void;\n onRequest?: (opts: {\n reqId: string;\n callId: string;\n callName: string;\n request: ServiceRequest;\n response: { status: number; body: any };\n }) => void;\n }) =>\n (controller: Controller<any>) => {\n let findHandler = (name: string): Handler<any, any, any> | null => {\n let parts = name.split(':');\n let current = controller;\n\n while (current && parts.length > 0) {\n current = current[parts.shift()!];\n if (!current) return null;\n }\n\n if (current && current instanceof Handler) return current;\n\n return null;\n };\n\n let getSupportedHandlerNames = (controller: Controller<any>): string[] =>\n Object.entries(controller).flatMap(([key, value]) => {\n if (value instanceof Handler) return [key];\n if (typeof value == 'object')\n return getSupportedHandlerNames(value).map(name => `${key}:${name}`);\n return [];\n });\n\n let handlerNames = getSupportedHandlerNames(controller);\n\n let run = async (\n req: ServiceRequest,\n call: { id: string; name: string; payload: any },\n reqId: string\n ): Promise<{\n response: any;\n status: number;\n request: ServiceRequest;\n }> => {\n let request = { ...req, body: call.payload };\n\n try {\n let handler = findHandler(call.name);\n\n if (!handler) {\n return {\n request,\n status: 404,\n response: notFoundError({ entity: 'handler' }).toResponse()\n };\n }\n\n let response = await handler.run(request, {});\n\n return {\n status: 200,\n request: req,\n response: response.response\n };\n } catch (e) {\n console.error(e);\n\n if (isServiceError(e)) {\n if (e.data.status >= 500) {\n Sentry.captureException(e, {\n tags: { reqId }\n });\n }\n\n return {\n request,\n status: e.data.status,\n response: e.toResponse()\n };\n }\n\n Sentry.captureException(e, {\n tags: { reqId }\n });\n\n opts.onError?.({\n callName: call.name,\n callId: call.id,\n request: req,\n error: e,\n reqId\n });\n\n return {\n request,\n status: 500,\n response: internalServerError().toResponse()\n };\n }\n };\n\n let runMany = async (\n req: ServiceRequest,\n body: {\n calls: {\n id: string;\n name: string;\n payload: any;\n }[];\n requestId: string;\n }\n ): Promise<{\n status: number;\n body: any;\n }> => {\n let callRes = await Promise.all(\n body.calls.map(async (call, i) => {\n let res = await run(req, call as any, body.requestId);\n\n try {\n opts.onRequest?.({\n reqId: body.requestId,\n callId: call.id,\n callName: call.name,\n request: res.request,\n response: { status: res.status, body: res.response }\n });\n } catch (e) {\n Sentry.captureException(e);\n console.error(e);\n }\n\n return {\n __typename: 'rpc.response.call',\n id: call.id,\n name: call.name,\n status: res.status,\n result: res.response\n };\n })\n );\n\n return {\n status: Math.max(...callRes.map(c => c.status)),\n body: {\n __typename: 'rpc.response',\n calls: callRes\n }\n };\n };\n\n return {\n handlerNames,\n runMany\n\n // fetch,\n\n // http: async (\n // req: IncomingMessage & {\n // body: any;\n // },\n // res: ServerResponse & { send: (body: any) => void }\n // ) => {\n // let headers = new Headers(\n // Object.fromEntries(\n // Object.entries(req.headers).map(([key, value]) => [\n // key,\n // value === undefined ? '' : String(value)\n // ])\n // )\n // );\n // let url = new URL(req.url ?? '', `http://${req.headers.host}`);\n\n // let request = new Request(url.toString(), {\n // method: req.method,\n // headers,\n // body: JSON.stringify(req.body)\n // });\n\n // let response = await fetch(request);\n\n // res.statusCode = response.status;\n\n // for (let [key, value] of response.headers.entries()) {\n // res.setHeader(key, value);\n // }\n\n // res.send(response.body);\n // }\n };\n };\n","export let parseForwardedFor = (xForwardedForHeader?: string | null | undefined) => {\n if (typeof xForwardedForHeader != 'string') return undefined;\n\n let ips = xForwardedForHeader\n .split(',')\n .map(ip => ip.trim())\n .filter(Boolean);\n return ips.length > 0 ? ips[0] : undefined;\n};\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","Group","_middleware","_proto","use","handler","opts","concat","ctx","_exit","_temp2","_result","res","key","sharedMiddlewareMemo","set","Promise","resolve","getSharedMemoKey","_temp","has","get","_await$ctx$sharedMidd","reject","createMiddleware","input","_exit2","_temp4","_result2","_temp3","_await$ctx$sharedMidd2","Handler","controller","handlers","_handler","_validation","_proto2","undefined","Error","push","validation","run","req","initialContext","_temp6","_extends","body","response","valRes","validate","success","ServiceError","validationError","errors","entity","_temp5","_forOf","mw","Sentry","getSentry","object","calls","array","id","string","name","payload","any","getSupportedHandlerNames","Object","entries","flatMap","_ref","map","handlerNames","runMany","all","call","i","reqId","request","parts","split","current","length","shift","findHandler","status","notFoundError","toResponse","_catch","console","error","isServiceError","data","captureException","tags","onError","callName","callId","internalServerError","requestId","onRequest","__typename","callRes","Math","max","apply","c","rpcs","handlerNameToRpcMap","Map","rpc","path","fetch","_req$headers$get6","_opts$cors","_ref2","_ref3","_req$headers$get","sentryTraceHeaders","headers","sentryTrace","Array","isArray","join","baggage","ip","xForwardedForHeader","ips","trim","filter","Boolean","parseForwardedFor","Headers","corsOk","_i","_Object$entries","corsHeaders","_Object$entries$_i","append","withIsolationScope","continueTrace","_req$headers$get2","_req$headers$get3","startSpan","op","attributes","transport","ua","origin","_req$headers$get5","beforeSends","generateCustomId","parseCookies","memo","_req$headers$get4","Cookie","parse","url","query","searchParams","rawBody","getCookies","getCookie","setCookie","cookie","serialize","beforeSend","appendHeaders","newHeaders","_i2","_Object$entries2","_Object$entries2$_i","_step","_iterator","_createForOfIteratorHelperLoose","done","getCurrentScope","setContext","fromEntries","addAttachment","filename","contentType","provideExecutionContext","createExecutionContext","type","contextId","userAgent","callsByRpc","resRef","pathParts","pathname","lastPart","_callsByRpc$get","slice","rpcIndex","Response","JSON","stringify","_iterator2","_step2","_callsByRpc$get2","from","_ref4","_resRef$body$calls","encode","cors","rootDomain","URL","hostname","domains","includes","check","additionalCorsHeaders","method","_decode","decode","text","_req$text","_Response","notAcceptableError","message"],"mappings":"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"}
|
package/dist/rpcMux.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpcMux.d.ts","sourceRoot":"","sources":["../src/rpcMux.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAe9C,eAAO,IAAI,MAAM,GACf,MAAM;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC,CAAC;CACtE,EACD,MAAM;IACJ,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,CACP,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE;YACL,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,GAAG,CAAC;SACd,EAAE,CAAC;KACL,KACE,OAAO,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE;YACJ,KAAK,EAAE,GAAG,EAAE,CAAC;SACd,CAAC;KACH,CAAC,CAAC;CACJ,EAAE;;iBASkB,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"rpcMux.d.ts","sourceRoot":"","sources":["../src/rpcMux.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAe9C,eAAO,IAAI,MAAM,GACf,MAAM;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC,CAAC;CACtE,EACD,MAAM;IACJ,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,CACP,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE;YACL,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,GAAG,CAAC;SACd,EAAE,CAAC;KACL,KACE,OAAO,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE;YACJ,KAAK,EAAE,GAAG,EAAE,CAAC;SACd,CAAC;KACH,CAAC,CAAC;CACJ,EAAE;;iBASkB,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC;CAsQxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lowerdeck/rpc-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
+
"files": [
|
|
8
|
+
"src/**",
|
|
9
|
+
"dist/**",
|
|
10
|
+
"README.md",
|
|
11
|
+
"package.json"
|
|
12
|
+
],
|
|
7
13
|
"author": "Tobias Herber",
|
|
8
14
|
"license": "Apache 2",
|
|
9
15
|
"type": "module",
|
|
@@ -21,22 +27,22 @@
|
|
|
21
27
|
"scripts": {
|
|
22
28
|
"test": "vitest run --passWithNoTests",
|
|
23
29
|
"lint": "prettier src/**/*.ts --check",
|
|
24
|
-
"build": "microbundle"
|
|
30
|
+
"build": "rm -rf ./dist && microbundle"
|
|
25
31
|
},
|
|
26
32
|
"devDependencies": {
|
|
27
33
|
"microbundle": "^0.15.1",
|
|
28
|
-
"@lowerdeck/tsconfig": "^1.0.
|
|
34
|
+
"@lowerdeck/tsconfig": "^1.0.1",
|
|
29
35
|
"typescript": "^5.9.3",
|
|
30
36
|
"vitest": "^3.2.4"
|
|
31
37
|
},
|
|
32
38
|
"dependencies": {
|
|
33
|
-
"@lowerdeck/error": "^1.0.
|
|
34
|
-
"@lowerdeck/execution-context": "^1.0.
|
|
35
|
-
"@lowerdeck/id": "^1.0.
|
|
36
|
-
"@lowerdeck/memo": "^1.0.
|
|
37
|
-
"@lowerdeck/sentry": "^1.0.
|
|
38
|
-
"@lowerdeck/serialize": "^1.0.
|
|
39
|
-
"@lowerdeck/validation": "^1.0.
|
|
39
|
+
"@lowerdeck/error": "^1.0.8",
|
|
40
|
+
"@lowerdeck/execution-context": "^1.0.2",
|
|
41
|
+
"@lowerdeck/id": "^1.0.5",
|
|
42
|
+
"@lowerdeck/memo": "^1.0.4",
|
|
43
|
+
"@lowerdeck/sentry": "^1.0.2",
|
|
44
|
+
"@lowerdeck/serialize": "^1.0.4",
|
|
45
|
+
"@lowerdeck/validation": "^1.0.4",
|
|
40
46
|
"cookie": "^1.1.1"
|
|
41
47
|
}
|
|
42
48
|
}
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
[0m[2m[35m$[0m [2m[1mmicrobundle[0m
|
|
3
|
-
No name was provided for external module '@lowerdeck/error' in output.globals – guessing 'error'
|
|
4
|
-
No name was provided for external module '@lowerdeck/execution-context' in output.globals – guessing 'executionContext'
|
|
5
|
-
No name was provided for external module '@lowerdeck/id' in output.globals – guessing 'id'
|
|
6
|
-
No name was provided for external module '@lowerdeck/memo' in output.globals – guessing 'memo'
|
|
7
|
-
No name was provided for external module '@lowerdeck/sentry' in output.globals – guessing 'sentry'
|
|
8
|
-
No name was provided for external module '@lowerdeck/serialize' in output.globals – guessing 'serialize'
|
|
9
|
-
No name was provided for external module '@lowerdeck/validation' in output.globals – guessing 'validation$1'
|
|
10
|
-
[34mBuild "@lowerdeck/rpc-server" to dist:[39m
|
|
11
|
-
[32m4.14 kB[39m: [37mindex.cjs[39m.gz
|
|
12
|
-
[32m3.72 kB[39m: [37mindex.cjs[39m.br
|
|
13
|
-
[32m2.8 kB[39m: [37mindex.module.js[39m.gz
|
|
14
|
-
[32m2.51 kB[39m: [37mindex.module.js[39m.br
|
|
15
|
-
[32m4.06 kB[39m: [37mindex.module.js[39m.gz
|
|
16
|
-
[32m3.65 kB[39m: [37mindex.module.js[39m.br
|
|
17
|
-
[32m4.24 kB[39m: [37mindex.umd.js[39m.gz
|
|
18
|
-
[32m3.83 kB[39m: [37mindex.umd.js[39m.br
|
package/.turbo/turbo-test.log
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
[0m[2m[35m$[0m [2m[1mvitest run --passWithNoTests[0m
|
|
3
|
-
[?25l
|
|
4
|
-
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/Users/tobias/code/metorial/metorial-enterprise/oss/src/packages/shared/anonymize-ip[39m
|
|
5
|
-
|
|
6
|
-
[?2026h
|
|
7
|
-
[1m[33m ❯ [39m[22msrc/anonymizeIp.test.ts[2m [queued][22m
|
|
8
|
-
|
|
9
|
-
[2m Test Files [22m[1m[32m0 passed[39m[22m[90m (1)[39m
|
|
10
|
-
[2m Tests [22m[1m[32m0 passed[39m[22m[90m (0)[39m
|
|
11
|
-
[2m Start at [22m10:23:25
|
|
12
|
-
[2m Duration [22m101ms
|
|
13
|
-
[?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m src/anonymizeIp.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
14
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv4 with default options[32m 1[2mms[22m[39m
|
|
15
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv4 with keepGroups=1[32m 0[2mms[22m[39m
|
|
16
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv4 with keepGroups=3[32m 0[2mms[22m[39m
|
|
17
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv4 with custom maskChar[32m 0[2mms[22m[39m
|
|
18
|
-
[32m✓[39m anonymizeIP[2m > [22mthrows error for invalid IPv4 keepGroups[32m 1[2mms[22m[39m
|
|
19
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 with default options[32m 0[2mms[22m[39m
|
|
20
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 with keepGroups=2[32m 0[2mms[22m[39m
|
|
21
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 with keepGroups=7[32m 0[2mms[22m[39m
|
|
22
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 with custom maskChar[32m 0[2mms[22m[39m
|
|
23
|
-
[32m✓[39m anonymizeIP[2m > [22mthrows error for invalid IPv6 keepGroups[32m 0[2mms[22m[39m
|
|
24
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 compressed notation[32m 0[2mms[22m[39m
|
|
25
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 ::[32m 0[2mms[22m[39m
|
|
26
|
-
[32m✓[39m anonymizeIP[2m > [22manonymizes IPv6 with embedded IPv4[32m 0[2mms[22m[39m
|
|
27
|
-
[32m✓[39m anonymizeIP[2m > [22mthrows error for invalid IP address[32m 0[2mms[22m[39m
|
|
28
|
-
[32m✓[39m anonymizeIP[2m > [22mtrims whitespace from IP[32m 0[2mms[22m[39m
|
|
29
|
-
|
|
30
|
-
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
31
|
-
[2m Tests [22m [1m[32m15 passed[39m[22m[90m (15)[39m
|
|
32
|
-
[2m Start at [22m 10:23:25
|
|
33
|
-
[2m Duration [22m 230ms[2m (transform 36ms, setup 0ms, collect 35ms, tests 4ms, environment 0ms, prepare 39ms)[22m
|
|
34
|
-
|
|
35
|
-
[?25h
|
package/CHANGELOG.md
DELETED
package/dist/anonymizeIp.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
interface AnonymizationOptions {
|
|
2
|
-
maskChar?: string;
|
|
3
|
-
keepGroups?: {
|
|
4
|
-
ipv4?: number;
|
|
5
|
-
ipv6?: number;
|
|
6
|
-
} | number;
|
|
7
|
-
}
|
|
8
|
-
export declare let anonymizeIP: (ip: string, options?: AnonymizationOptions) => string;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=anonymizeIp.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anonymizeIp.d.ts","sourceRoot":"","sources":["../src/anonymizeIp.ts"],"names":[],"mappings":"AAQA,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EACP;QACE,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GACD,MAAM,CAAC;CACZ;AAuHD,eAAO,IAAI,WAAW,GAAI,IAAI,MAAM,EAAE,UAAS,oBAAyB,WAwBvE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anonymizeIp.test.d.ts","sourceRoot":"","sources":["../src/anonymizeIp.test.ts"],"names":[],"mappings":""}
|
package/dist/index.modern.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=e=>!!/^(\d{1,3}\.){3}\d{1,3}$/.test(e)&&e.split(".").every(e=>{let r=parseInt(e,10);return r>=0&&r<=255}),r=e=>{if(e.includes("::")){let r=e.split("::");if(2!==r.length)return!1;if((r[0]?r[0].split(":").length:0)+(r[1]?r[1].split(":").length:0)>7)return!1}return/^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$/.test(e)||"::"===e},t=(e,r={})=>{let{keepGroups:t=2,maskChar:s="x"}=r,n=e.split(".");if(t<1||t>3)throw new Error("keepGroups for IPv4 must be between 1 and 3");return n.map((e,r)=>r<t?e:s.repeat(e.length)).join(".")},s=(e,r,t)=>{let s=e;if(e.includes("::")){let r=e.split("::"),t=r[0]||"",n=r[1]||"",p=t?t.split(":"):[],l=n?n.split(":"):[],i=Array(8-p.length-l.length).fill("0");s=[...p,...i,...l].join(":")}return s.split(":").map((e,s)=>s<r?e:t.repeat(Math.max(1,e.length))).join(":")},n=(n,p={})=>{if(!n||"string"!=typeof n)throw new Error("IP address must be a non-empty string");let l=n.trim();var i,u;if(e(l))return t(l,{keepGroups:"number"==typeof p.keepGroups?p.keepGroups:null==(i=p.keepGroups)?void 0:i.ipv4,maskChar:p.maskChar}).replace("000","0");if((t=>{if(t.includes(".")){let s=t.split(":");if(e(s[s.length-1])){let e=t.substring(0,t.lastIndexOf(":")+1)+"0";return r(e)}}return r(t)})(l))return((r,n={})=>{let{keepGroups:p=4,maskChar:l="x"}=n;if(p<1||p>7)throw new Error("keepGroups for IPv6 must be between 1 and 7");if(r.includes(".")){let n=r.lastIndexOf(":"),i=r.substring(0,n+1),u=r.substring(n+1);if(e(u)){let e=t(u,{keepGroups:2,maskChar:l}),r=s(i+"0",p,l);return r.substring(0,r.lastIndexOf(":")+1)+e}}return s(r,p,l)})(l,{keepGroups:"number"==typeof p.keepGroups?p.keepGroups:null==(u=p.keepGroups)?void 0:u.ipv6,maskChar:p.maskChar});throw new Error("Invalid IP address format")};export{n as anonymizeIP};
|
|
2
|
-
//# sourceMappingURL=index.modern.js.map
|
package/dist/index.modern.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.js","sources":["../src/anonymizeIp.ts"],"sourcesContent":["interface AnonymizationOptionsSingle {\n // For IPv4: number of octets to keep (1-3, default: 2)\n // For IPv6: number of groups to keep (1-7, default: 4)\n keepGroups?: number;\n // Character to use for masking (default: 'x')\n maskChar?: string;\n}\n\ninterface AnonymizationOptions {\n maskChar?: string;\n keepGroups?:\n | {\n ipv4?: number;\n ipv6?: number;\n }\n | number;\n}\n\nlet isIPv4 = (ip: string) => {\n let ipv4Regex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n if (!ipv4Regex.test(ip)) return false;\n\n return ip.split('.').every(octet => {\n let num = parseInt(octet, 10);\n return num >= 0 && num <= 255;\n });\n};\n\nlet isIPv6 = (ip: string) => {\n // Handle IPv6 with embedded IPv4 (e.g., ::ffff:192.0.2.1)\n if (ip.includes('.')) {\n let parts = ip.split(':');\n let lastPart = parts[parts.length - 1];\n if (isIPv4(lastPart)) {\n // Remove the IPv4 part and validate the IPv6 part\n let ipv6Part = ip.substring(0, ip.lastIndexOf(':') + 1) + '0';\n return isIPv6Simple(ipv6Part);\n }\n }\n\n return isIPv6Simple(ip);\n};\n\nlet isIPv6Simple = (ip: string) => {\n let ipv6Regex = /^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$/;\n\n if (ip.includes('::')) {\n let parts = ip.split('::');\n if (parts.length !== 2) return false;\n\n let leftGroups = parts[0] ? parts[0].split(':').length : 0;\n let rightGroups = parts[1] ? parts[1].split(':').length : 0;\n\n // Total groups should not exceed 8\n if (leftGroups + rightGroups > 7) return false;\n }\n\n return ipv6Regex.test(ip) || ip === '::';\n};\n\nlet anonymizeIPv4 = (ip: string, options: AnonymizationOptionsSingle = {}) => {\n let { keepGroups = 2, maskChar = 'x' } = options;\n let octets = ip.split('.');\n\n if (keepGroups < 1 || keepGroups > 3) {\n throw new Error('keepGroups for IPv4 must be between 1 and 3');\n }\n\n let maskedOctets = octets.map((octet, index) => {\n if (index < keepGroups) {\n return octet;\n }\n return maskChar.repeat(octet.length);\n });\n\n return maskedOctets.join('.');\n};\n\nlet anonymizeIPv6 = (ip: string, options: AnonymizationOptionsSingle = {}) => {\n let { keepGroups = 4, maskChar = 'x' } = options;\n\n if (keepGroups < 1 || keepGroups > 7) {\n throw new Error('keepGroups for IPv6 must be between 1 and 7');\n }\n\n // Handle IPv6 with embedded IPv4\n if (ip.includes('.')) {\n let lastColonIndex = ip.lastIndexOf(':');\n let ipv6Part = ip.substring(0, lastColonIndex + 1);\n let ipv4Part = ip.substring(lastColonIndex + 1);\n\n if (isIPv4(ipv4Part)) {\n let anonymizedIPv4 = anonymizeIPv4(ipv4Part, { keepGroups: 2, maskChar });\n let anonymizedIPv6Part = anonymizeIPv6Simple(ipv6Part + '0', keepGroups, maskChar);\n return (\n anonymizedIPv6Part.substring(0, anonymizedIPv6Part.lastIndexOf(':') + 1) +\n anonymizedIPv4\n );\n }\n }\n\n return anonymizeIPv6Simple(ip, keepGroups, maskChar);\n};\n\nlet anonymizeIPv6Simple = (ip: string, keepGroups: number, maskChar: string) => {\n // Expand compressed notation for easier processing\n let expanded = ip;\n\n if (ip.includes('::')) {\n let parts = ip.split('::');\n let leftPart = parts[0] || '';\n let rightPart = parts[1] || '';\n\n let leftGroups = leftPart ? leftPart.split(':') : [];\n let rightGroups = rightPart ? rightPart.split(':') : [];\n\n let missingGroups = 8 - leftGroups.length - rightGroups.length;\n let zeroGroups = Array(missingGroups).fill('0');\n\n let allGroups = [...leftGroups, ...zeroGroups, ...rightGroups];\n expanded = allGroups.join(':');\n }\n\n let groups = expanded.split(':');\n\n let maskedGroups = groups.map((group, index) => {\n if (index < keepGroups) {\n return group;\n }\n return maskChar.repeat(Math.max(1, group.length));\n });\n\n return maskedGroups.join(':');\n};\n\nexport let anonymizeIP = (ip: string, options: AnonymizationOptions = {}) => {\n if (!ip || typeof ip !== 'string') {\n throw new Error('IP address must be a non-empty string');\n }\n\n let trimmedIP = ip.trim();\n\n if (isIPv4(trimmedIP)) {\n return anonymizeIPv4(trimmedIP, {\n keepGroups:\n typeof options.keepGroups === 'number' ? options.keepGroups : options.keepGroups?.ipv4,\n maskChar: options.maskChar\n }).replace('000', '0'); // Ensure no triple zeros in IPv4\n }\n\n if (isIPv6(trimmedIP)) {\n return anonymizeIPv6(trimmedIP, {\n keepGroups:\n typeof options.keepGroups === 'number' ? options.keepGroups : options.keepGroups?.ipv6,\n maskChar: options.maskChar\n });\n }\n\n throw new Error('Invalid IP address format');\n};\n"],"names":["isIPv4","ip","test","split","every","octet","num","parseInt","isIPv6Simple","includes","parts","length","anonymizeIPv4","options","keepGroups","maskChar","octets","Error","map","index","repeat","join","anonymizeIPv6Simple","expanded","leftPart","rightPart","leftGroups","rightGroups","zeroGroups","Array","fill","group","Math","max","anonymizeIP","trimmedIP","trim","_options$keepGroups","_options$keepGroups2","ipv4","replace","ipv6Part","substring","lastIndexOf","isIPv6","anonymizeIPv6","lastColonIndex","ipv4Part","anonymizedIPv4","anonymizedIPv6Part","ipv6"],"mappings":"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"}
|
package/tsconfig.json
DELETED