@lowerdeck/rpc-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +11 -0
- package/.turbo/turbo-test.log +35 -0
- package/dist/anonymizeIp.d.ts +10 -0
- package/dist/anonymizeIp.d.ts.map +1 -0
- package/dist/anonymizeIp.test.d.ts +2 -0
- package/dist/anonymizeIp.test.d.ts.map +1 -0
- package/dist/controller.d.ts +82 -0
- package/dist/controller.d.ts.map +1 -0
- package/dist/controller.test.d.ts +2 -0
- package/dist/controller.test.d.ts.map +1 -0
- package/dist/extractIp.d.ts +2 -0
- package/dist/extractIp.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.modern.js +2 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/index.module.js +2 -0
- package/dist/index.module.js.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/rpcMux.d.ts +30 -0
- package/dist/rpcMux.d.ts.map +1 -0
- package/dist/server.d.ts +34 -0
- package/dist/server.d.ts.map +1 -0
- package/package.json +42 -0
- package/src/controller.test.ts +251 -0
- package/src/controller.ts +203 -0
- package/src/extractIp.ts +9 -0
- package/src/index.ts +3 -0
- package/src/rpcMux.ts +303 -0
- package/src/server.ts +204 -0
- package/tsconfig.json +13 -0
- package/tsup.config.js +11 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
[0m[2m[35m$[0m [2m[1mmicrobundle[0m
|
|
3
|
+
[34mBuild "@lowerdeck/anonymize-ip" to dist:[39m
|
|
4
|
+
[32m857 B[39m: [37mindex.cjs[39m.gz
|
|
5
|
+
[32m760 B[39m: [37mindex.cjs[39m.br
|
|
6
|
+
[32m798 B[39m: [37mindex.module.js[39m.gz
|
|
7
|
+
[32m713 B[39m: [37mindex.module.js[39m.br
|
|
8
|
+
[32m863 B[39m: [37mindex.module.js[39m.gz
|
|
9
|
+
[32m759 B[39m: [37mindex.module.js[39m.br
|
|
10
|
+
[32m917 B[39m: [37mindex.umd.js[39m.gz
|
|
11
|
+
[32m805 B[39m: [37mindex.umd.js[39m.br
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymizeIp.test.d.ts","sourceRoot":"","sources":["../src/anonymizeIp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ValidationType } from '@lowerdeck/validation';
|
|
2
|
+
import * as Cookie from 'cookie';
|
|
3
|
+
export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
4
|
+
export interface ServiceRequest {
|
|
5
|
+
query: URLSearchParams;
|
|
6
|
+
headers: Headers;
|
|
7
|
+
url: string;
|
|
8
|
+
ip?: string;
|
|
9
|
+
body: any;
|
|
10
|
+
rawBody: any;
|
|
11
|
+
requestId: string;
|
|
12
|
+
getCookies: () => Record<string, string | undefined>;
|
|
13
|
+
getCookie: (name: string) => string | undefined;
|
|
14
|
+
setCookie: (name: string, value: string, opts?: Cookie.SerializeOptions) => void;
|
|
15
|
+
sharedMiddlewareMemo: Map<string, Promise<any>>;
|
|
16
|
+
beforeSend: (handler: () => Promise<any>) => void;
|
|
17
|
+
appendHeaders: (headers: Record<string, string | string[]>) => void;
|
|
18
|
+
}
|
|
19
|
+
export type Simplify<T> = {
|
|
20
|
+
[KeyType in keyof T]: T[KeyType];
|
|
21
|
+
} & {};
|
|
22
|
+
export type ExtendContext<C extends object, E> = E extends object ? Simplify<C & E> : C;
|
|
23
|
+
export declare class Group<Context extends {
|
|
24
|
+
[key: string]: any;
|
|
25
|
+
} = {}> {
|
|
26
|
+
private _middleware;
|
|
27
|
+
constructor(_middleware?: Array<(ctx: Context & ServiceRequest) => Promise<any>>);
|
|
28
|
+
use<T extends {
|
|
29
|
+
[key: string]: any;
|
|
30
|
+
} | undefined | void>(handler: (ctx: Context & ServiceRequest) => Promise<T>, opts?: {
|
|
31
|
+
getSharedMemoKey?: (ctx: Context & ServiceRequest) => string;
|
|
32
|
+
}): Group<Context & T extends infer T_1 ? { [KeyType in keyof T_1]: T_1[KeyType]; } : never>;
|
|
33
|
+
createMiddleware<T extends {
|
|
34
|
+
[key: string]: any;
|
|
35
|
+
}, P = void>(handler: (ctx: Context & ServiceRequest, input: P) => Promise<T>, opts?: {
|
|
36
|
+
getSharedMemoKey?: (ctx: Context & ServiceRequest, input: P) => string;
|
|
37
|
+
}): (input: P) => (ctx: Context & ServiceRequest) => Promise<T>;
|
|
38
|
+
handler(): Handler<unknown, unknown, Context>;
|
|
39
|
+
controller<HandlersAndSubControllers extends {
|
|
40
|
+
[key: string]: Handler<any, any, any> | Controller<any>;
|
|
41
|
+
}>(handlers: HandlersAndSubControllers): Controller<HandlersAndSubControllers>;
|
|
42
|
+
}
|
|
43
|
+
export type Controller<HandlersAndSubControllers extends {
|
|
44
|
+
[key: string]: Handler<any, any, any> | Controller<any>;
|
|
45
|
+
}> = HandlersAndSubControllers;
|
|
46
|
+
export type InferControllerType<T> = T extends Controller<infer U> ? U : never;
|
|
47
|
+
export type InferClient<HandlersAndSubControllers extends {
|
|
48
|
+
[key: string]: Handler<any, any, any> | Controller<any>;
|
|
49
|
+
}> = {
|
|
50
|
+
[K in keyof HandlersAndSubControllers]: HandlersAndSubControllers[K] extends Handler<infer I, infer O, infer C> ? ((input: I, opts?: {
|
|
51
|
+
headers?: Record<string, string>;
|
|
52
|
+
query?: Record<string, string>;
|
|
53
|
+
}) => Promise<O>) & {
|
|
54
|
+
getFull: (input: I, opts?: {
|
|
55
|
+
headers?: Record<string, string>;
|
|
56
|
+
query?: Record<string, string>;
|
|
57
|
+
}) => Promise<{
|
|
58
|
+
data: O;
|
|
59
|
+
status: number;
|
|
60
|
+
headers: Record<string, string>;
|
|
61
|
+
}>;
|
|
62
|
+
} : HandlersAndSubControllers[K] extends Controller<infer U> ? InferClient<U> : never;
|
|
63
|
+
};
|
|
64
|
+
export declare class Handler<Input, Output, Context extends {
|
|
65
|
+
[key: string]: any;
|
|
66
|
+
} = {}> {
|
|
67
|
+
private _middleware;
|
|
68
|
+
private _handler;
|
|
69
|
+
private _validation;
|
|
70
|
+
constructor(_middleware?: Array<(ctx: Context & ServiceRequest) => Promise<any>>);
|
|
71
|
+
do<HandlerOutput>(handler: (ctx: Context & Omit<ServiceRequest, 'body'> & {
|
|
72
|
+
input: Input;
|
|
73
|
+
}) => Promise<HandlerOutput>): Handler<Input, HandlerOutput, Context>;
|
|
74
|
+
use<T extends {
|
|
75
|
+
[key: string]: any;
|
|
76
|
+
} = {}>(handler: (ctx: Context & ServiceRequest) => Promise<T | undefined | void>): Handler<Input, Output, ExtendContext<Context, T>>;
|
|
77
|
+
input<HandlerInput>(validation: ValidationType<HandlerInput>): Handler<HandlerInput, Output, Context>;
|
|
78
|
+
run(req: ServiceRequest, initialContext: any): Promise<{
|
|
79
|
+
response: Output;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../src/controller.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractIp.d.ts","sourceRoot":"","sources":["../src/extractIp.ts"],"names":[],"mappings":"AAAA,eAAO,IAAI,iBAAiB,GAAI,sBAAsB,MAAM,GAAG,IAAI,GAAG,SAAS,uBAQ9E,CAAC"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +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)}}}};
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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":"uoDA6HY,SAAAA,EAAAC,EAAAC,EAAAC,GANF,IAAAF,EAAAG,EAEa,CACb,GAAAD,aAAAE,EAA+C,CAEvD,IAAAF,EAAAC,EAYE,cADaE,EAAAN,EAAAO,KAAA,KAAAN,EAAAC,IAVM,EAAXA,IACNA,EAAAC,EAAAC,GAOFD,EAAIA,EAAaK,EAQnB,GAAAL,GAC2EA,EAAAM,KAGzE,YADAN,EAAAM,KAAgBT,EAAAO,UAAMN,EAASC,GAAAF,EAAAO,KAAA,KAAAN,EAAA,IAIjCA,EAAAG,EAA4DF,EAC1DD,EAAAO,EAAAL,EAAmC,IAAAO,EAAUT,EAAAK,KAG7CI,EAAIT,GAKN,KAlIWI,eAAK,WAEN,SAAAA,IAAA,CAqDR,OAtDFA,EAAAM,wBACkFC,EAAAC,OAAxEC,EAAW,IAAAT,EACjBH,EAAAa,KAAAX,KAEDF,EACqD,CAKtD,IAAAc,EAAiB,IAAOJ,EAAkDC,OACpE,SAEK,EAAAG,EAAUD,KAAAP,UAClBS,GAEDjB,EAAAc,EAAU,EAAAG,EACV,UAGF,OAAEF,iBAKYT,EAAA,SAAAY,aAQNA,EAAMV,EACN,IAAAJ,MACK,EAAAQ,EAAUA,EAAAT,GAA4BA,GAC9CU,IAEGC,IAAaD,EAAMV,YAIzB,CAAA,MAAEc,GACNjB,EAACc,EAAA,EAAAG,KAIAH,CAED,EAKET,EAvDc,GAwIM,SAAAc,EAAgBC,GAEpC,OAAAA,aAASf,GAAqB,EAAAe,EAAAhB,CAE9B,CA5IS,IAAAiB,0BACX,SAAAA,EACUC,QAAAA,IAAAA,IAAAA,EAAsE,IAAEP,KAAxEO,iBAAA,EAAAP,KAAWO,YAAXA,CACP,CAAC,IAAAC,EAAAF,EAAAV,UAqDHU,OArDGE,EAEJC,IAAA,SACEC,EACAC,GAgBA,WAAWL,KAAKM,OAA4BZ,KAAKO,aAZnC,SAAUM,GAAkD,IAAA,IASxDC,EATwDC,EAAAA,SAAAC,GAAAF,GAAAA,SAAAE,EAMxE,IAAIC,EAAMP,EAAQG,GAC8B,OAA5CK,GAAKL,EAAIM,qBAAqBC,IAAIF,EAAKD,GAAKI,QAAAC,QAEnCL,EAAGH,EARZI,EAAU,MAAJP,SAAAA,EAAMY,wBAANZ,EAAMY,iBAAmBV,GAAKW,EACpCN,WAAAA,GAAAA,GAAOL,EAAIM,qBAAqBM,IAAIP,GAAI,OAAAG,QAAAC,QAC7BT,EAAIM,qBAAqBO,IAAIR,IAAKxB,KAAA,SAAAiC,UAAAb,IAAAa,CAAA,EAAA,CAD7CT,GAC6C,OAAAG,QAAAC,QAAAE,GAAAA,EAAA9B,KAAA8B,EAAA9B,KAAAqB,GAAAA,EAAAS,GAOnD,CAAC,MAAAtB,GAAA,OAAAmB,QAAAO,OAAA1B,EAED,CAAA,IACF,EAACM,EAEDqB,iBAAA,SACEnB,EACAC,GAIA,gBAAQmB,GAAQ,OAAA,SACPjB,GAA6C,IAAA,IASlCkB,EATkCC,EAAAA,SAAAC,GAAAF,GAAAA,SAAAE,EAMlD,IAAIhB,EAAMP,EAAQG,EAAKiB,GACyB,OAA5CZ,GAAKL,EAAIM,qBAAqBC,IAAIF,EAAKD,GAAKI,QAAAC,QAEnCL,EAAG,EARZC,EAAMP,MAAAA,GAAsB,MAAtBA,EAAMY,sBAAgB,EAAtBZ,EAAMY,iBAAmBV,EAAKiB,GAAOI,EAC3ChB,WAAAA,GAAAA,GAAOL,EAAIM,qBAAqBM,IAAIP,UAAIG,QAAAC,QAC7BT,EAAIM,qBAAqBO,IAAIR,IAAKxB,KAAA,SAAAyC,UAAAJ,IAAAI,CAAA,EAAA,CAD7CjB,GAC6C,OAAAG,QAAAC,QAAAY,GAAAA,EAAAxC,KAAAwC,EAAAxC,KAAAsC,GAAAA,EAAAE,GAOnD,CAAC,MAAAhC,GAAAmB,OAAAA,QAAAO,OAAA1B,EACL,CAAA,CAAA,CAAA,EAACM,EAEDE,QAAA,WACE,OAAO,IAAI0B,EAAO,GAAAxB,OAAKZ,KAAKO,aAC9B,EAACC,EAED6B,WAAA,SAIEC,GACA,OAAOA,CACT,EAAChC,CAAA,IAmCU8B,eAMX,WAAA,SAAAA,EACU7B,YAAAA,IAAAA,EAAsE,IAAtEA,KAAAA,iBANFgC,EAAAA,KAAAA,qBAGAC,iBAAW,EAGTxC,KAAWO,YAAXA,CACP,CAAC,IAAAkC,EAAAL,EAAAxC,UA2EH,OA3EG6C,EAAA,GAEJ,SACE/B,GAIA,GAAqBgC,MAAjB1C,KAAKuC,SAAuB,MAAU,IAAAI,MAAM,2BAKhD,OAFA3C,KAAKuC,SAAW7B,MAGlB,EAAC+B,EAEDhC,IAAA,SACEC,GAGA,OADAV,KAAKO,YAAYqC,KAAKlC,GACfV,IACT,EAACyC,EAEDX,MAAA,SAAoBe,GAClB,GAAwBH,MAApB1C,KAAKwC,YAA0B,MAAU,IAAAG,MAAM,oCAKnD,OAFA3C,KAAKwC,YAAcK,EAEZ7C,IACT,EAACyC,EAEKK,IAAG,SACPC,EACAC,OAAmBC,IAAAA,EAAAA,WAAA5B,OAAAA,QAAAC,QAiCHnB,EAAKoC,SAAQW,EAAA,CAAA,EACxBrC,EACHiB,CAAAA,MAAAA,EACAqB,UAAMT,MACNhD,KAJEuB,SAAAA,GAMJ,MAAO,CACLmC,SAAUnC,EACV,EAAAd,EAAAA,EArCGH,KAAL,IAAKG,EAAKoC,SAAU,MAAU,IAAAI,MAAM,uBAEpC,IAAIb,EAAQiB,EAAII,KAEhB,GAAIhD,EAAKqC,YAAa,CACpB,IAAIa,EAASlD,EAAKqC,YAAYc,SAASP,EAAII,MAE3C,IAAKE,EAAOE,QACV,MAAU,IAAAC,EAAAA,aACRC,EAAeA,gBAAC,CAAEC,OAAQL,EAAOK,OAAQC,OAAQ,eAIrD7B,EAAQuB,EAAOjE,KACjB,CAEA,IAAIyB,EAAGqC,EACFF,CAAAA,EAAAA,EACAD,EAGHI,CAAAA,KAAMrB,IACN8B,6uBAAAC,CAEa1D,EAAKI,qBAAXuD,UAAwBzC,QAAAC,QACfwC,EAAGjD,IAAInB,KAAnBuB,SAAAA,GACAA,IAAKJ,EAAGqC,EAAQrC,CAAAA,EAAAA,EAAQI,GAAM,EACpC,GAAC,OAAAI,QAAAC,QAAAsC,GAAAA,EAAAlE,KAAAkE,EAAAlE,KAAAuD,GAAAA,IAWH,CAAC,MAAA/C,GAAAmB,OAAAA,QAAAO,OAAA1B,EAAA,CAAA,EAAAkC,CAAA,CA7ED,GC5GE2B,EAASC,EAAAA,YAETnB,EAAapD,EAACA,EAACwE,OAAO,CACxBC,MAAOzE,EAACA,EAAC0E,MACP1E,EAACA,EAACwE,OAAO,CACPG,GAAI3E,EAACA,EAAC4E,SACNC,KAAM7E,EAAAA,EAAE4E,SACRE,QAAS9E,EAAAA,EAAE+E,WCnBbT,EAASC,qEAGX,SAACrD,GAeA,OACA0B,SAAAA,GACC,IAcIoC,EAA2B,SAACpC,GAC9B,OAAAqC,OAAOC,QAAQtC,GAAYuC,QAAQ,SAAAC,GAAE,IAAA3D,EAAG2D,KAAEzF,EAAKyF,EAC7C,GAAA,OAAIzF,aAAiBgD,EAAgB,CAAClB,GAClB,iBAAT9B,EACFqF,EAAyBrF,GAAO0F,IAAI,SAAAR,GAAI,OAAOpD,MAAOoD,CAAI,GAC5D,EACT,EAAE,EAwHJ,MAAO,CACLS,aAvHiBN,EAAyBpC,GAwH1C2C,iBAnDAjC,EACAI,GAWG,IAAA,OAAA9B,QAAAC,QACiBD,QAAQ4D,IAC1B9B,EAAKe,MAAMY,IAAWI,SAAAA,EAAMC,GAAC,WAAI9D,QAAAC,QAjFjC,SACFyB,EACAmC,EACAE,GAKG,IACH,IAAIC,EAAOnC,EAAA,CAAA,EAAQH,EAAKI,CAAAA,KAAM+B,EAAKX,UAAU,OAAAlD,QAAAC,iCAGvCZ,EApCU,SAAC4D,GAIjB,IAHA,IAAIgB,EAAQhB,EAAKiB,MAAM,KACnBC,EAAUnD,EAEPmD,GAAWF,EAAMG,OAAS,GAE/B,KADAD,EAAUA,EAAQF,EAAMI,UACV,OAChB,KAEA,OAAIF,GAAWA,aAAmBpD,EAAgBoD,EAGpD,IAAA,CAwBkBG,CAAYT,EAAKZ,OAEnBjD,QAAAC,QAQSZ,EAAQoC,IAAIuC,EAAS,KAAG3F,cAAzC0D,GAEJ,MAAO,CACLwC,OAAQ,IACRP,QAAStC,EACTK,SAAUA,EAASA,SACnB,GAbO,CACLiC,QAAAA,EACAO,OAAQ,IACRxC,SAAUyC,EAAaA,cAAC,CAAElC,OAAQ,YAAamC,mCAPjD,IACEpF,sCAHuCqF,CAEzC,EAkBK7F,SAAAA,GAGP,OAFA8F,QAAQC,MAAM/F,GAEVgG,iBAAehG,IACbA,EAAEiG,KAAKP,QAAU,KACnB7B,EAAOqC,iBAAiBlG,EAAG,CACzBmG,KAAM,CAAEjB,MAAAA,KAIL,CACLC,QAAAA,EACAO,OAAQ1F,EAAEiG,KAAKP,OACfxC,SAAUlD,EAAE4F,gBAIhB/B,EAAOqC,iBAAiBlG,EAAG,CACzBmG,KAAM,CAAEjB,MAAAA,KAGE,MAAZzE,EAAK2F,SAAL3F,EAAK2F,QAAU,CACbC,SAAUrB,EAAKZ,KACfkC,OAAQtB,EAAKd,GACbiB,QAAStC,EACTkD,MAAO/F,EACPkF,MAAAA,IAGK,CACLC,QAAAA,EACAO,OAAQ,IACRxC,SAAUqD,EAAmBA,sBAAGX,cAEpC,GACF,CAAC,MAAA5F,GAAAmB,OAAAA,QAAAO,OAAA1B,EAAA,CAAA,CAkBqB4C,CAAIC,EAAKmC,EAAa/B,EAAKuD,YAAUhH,cAAjDuB,GAEJ,IACgB,MAAdN,EAAKgG,WAALhG,EAAKgG,UAAY,CACfvB,MAAOjC,EAAKuD,UACZF,OAAQtB,EAAKd,GACbmC,SAAUrB,EAAKZ,KACfe,QAASpE,EAAIoE,QACbjC,SAAU,CAAEwC,OAAQ3E,EAAI2E,OAAQzC,KAAMlC,EAAImC,WAE9C,CAAE,MAAOlD,GACP6D,EAAOqC,iBAAiBlG,GACxB8F,QAAQC,MAAM/F,EAChB,CAEA,MAAO,CACL0G,WAAY,oBACZxC,GAAIc,EAAKd,GACTE,KAAMY,EAAKZ,KACXsB,OAAQ3E,EAAI2E,OACZ7F,OAAQkB,EAAImC,SACZ,EACJ,CAAC,MAAAlD,UAAAmB,QAAAO,OAAA1B,QACFR,KAzBGmH,SAAAA,GA2BJ,MAAO,CACLjB,OAAQkB,KAAKC,IAAGC,MAARF,KAAYD,EAAQ/B,IAAI,SAAAmC,GAAC,OAAIA,EAAErB,MAAM,IAC7CzC,KAAM,CACJyD,WAAY,eACZ1C,MAAO2C,GAET,EACJ,CAAC,MAAA3G,GAAA,OAAAmB,QAAAO,OAAA1B,EAAA,CAAA,EAyCH,CAAC,iBD/KiB,SAClBS,EAMAuG,GAoBA,IAAIC,EAAsB,IAAIC,IAC5BF,EAAKtC,QAAQ,SAACyC,EAAKlC,GAAM,OAAAkC,EAAItC,aAAaD,IAAI,SAAAR,GAAI,MAAI,CAACA,EAAMa,EAAE,EAAC,IAGlE,MAAO,CACLmC,KAAM3G,EAAK2G,KAEXC,MAAKA,SAASxE,GAA0B,IAAA,IAAAyE,EAAAC,EA6OrC3G,EA7OqCC,EAAAA,SAAAC,GAAA,IAAA6D,EAAA6C,EAAAC,EAAAC,EAAA9G,GAAAA,SAAAE,EAuDtC,IAAI6G,EAAqB9E,EAAI+E,QAAQpG,IAAI,gBACrCqG,EAGoB,OAHTlD,EACZmD,MAAMC,QAAQJ,GACXA,EAAmBK,KAAK,KACxBL,GAAkBhD,OAAKnC,EACzByF,EAAUpF,EAAI+E,QAAQpG,IAAI,WAE1B0G,EE5HqB,SAACC,GAC9B,GAAkC,iBAAvBA,EAAX,CAEA,IAAIC,EAAMD,EACP9C,MAAM,KACNT,IAAI,SAAAsD,GAAE,OAAIA,EAAGG,MAAM,GACnBC,OAAOC,SACV,OAAOH,EAAI7C,OAAS,EAAI6C,EAAI,QAAK5F,CAN2B,CAO9D,CFoHegG,QAAiBhB,EAEa,OAFbC,EACkBC,OADlBA,EACxB7E,EAAI+E,QAAQpG,IAAI,4BAA0BkG,EACxC7E,EAAI+E,QAAQpG,IAAI,qBAAmBiG,EACnC5E,EAAI+E,QAAQpG,IAAI,oBAAkBgG,EAClC3E,EAAI+E,QAAQpG,IAAI,cAGhBoG,EAAU,IAAIa,QAElB,GAAIC,EACF,IAAA,IAAAC,EAAA,EAAAC,EAAyBpE,OAAOC,QAAQoE,GAAYF,EAAAC,EAAArD,OAAAoD,IAAE,CAAjD,IAAAG,EAAAF,EAAAD,GACHf,EAAQmB,OADGD,KAAOA,EAAA,GAEpB,CACD,OAAA3H,QAAAC,QAEYyC,EAAOmF,mBAAkB,WAAA,IAAA,OAAA7H,QAAAC,QAE5ByC,EAAOoF,cACX,CAAEpB,YAAAA,EAAaI,QAAAA,GAAS,WAAA,IAAA,IAAAiB,EAAAC,SAAAhI,QAAAC,QAEhByC,EAAOuF,UACX,CACEhF,KAAM,cACNiF,GAAI,aACJC,WAAY,CACVpB,GAAAA,EACAqB,UAAW,OACXC,GAAiCN,OAA/BA,EAAErG,EAAI+E,QAAQpG,IAAI,eAAa0H,EAAI,GACrCO,OAAiC,OAA3BN,EAAEtG,EAAI+E,QAAQpG,IAAI,WAAS2H,EAAI,KAG9B,WAAA,IACT,IAAIO,IAAAA,EACEC,EAAyC,GACzCzF,EAAK0F,EAAAA,iBAAiB,QAEtBC,EAAeC,EAAAA,KAAK,WAAA,IAAAC,EAAA,OACtBC,EAAOC,MAA+BF,OAA1BA,EAAClH,EAAI+E,QAAQpG,IAAI,WAASuI,EAAI,GAAG,GAG3C5E,EAA0B,CAC5B+E,IAAKrH,EAAIqH,IACTtC,QAAS/E,EAAI+E,QACbuC,MAAOD,EAAIE,aACXnH,KAAAA,EACAoH,QAASpH,EACTiF,GAAAA,EACA1B,UAAWtC,EAEXoG,WAAY,WAAM,OAAAT,GAAc,EAChCU,UAAW,SAACnG,GAAY,OAAKyF,IAAezF,EAAK,EACjDoG,UAAW,SAACpG,EAAclF,EAAeuB,GACvC,IAAIgK,EAAST,EAAOU,UAAUtG,EAAMlF,EAAOuB,GAE3CmH,EAAQmB,OAAO,aAAc0B,EAC/B,EAEAE,WAAY,SAACnK,GACXmJ,EAAYjH,KAAKlC,EACnB,EAEAS,qBAAsB,IAAIiG,IAE1B0D,cAAe,SAACC,GACd,QAAAC,EAAA,EAAAC,EAAyBvG,OAAOC,QAAQoG,GAAWC,EAAAC,EAAAxF,OAAAuF,IAAE,CAAhD,IAAAE,EAAAD,EAAAD,GAAK9J,EAAGgK,EAAE9L,GAAAA,EAAK8L,KAClB,GAAIlD,MAAMC,QAAQ7I,GAChB,IAAA+L,IAAmBC,EAAnBD,EAAAE,EAAcjM,KAAKgM,EAAAD,KAAAG,MAAExD,EAAQmB,OAAO/H,EAA1BkK,EAAAhM,YAEV0I,EAAQmB,OAAO/H,EAAK9B,EAExB,CACF,GAGF2E,EAAOwH,kBAAkBC,WAAW,cAAe,CACjDpB,IAAKrH,EAAIqH,IACTC,MAAO3F,OAAO+G,YAAYrB,EAAIE,aAAa3F,aAG7CZ,EAAOwH,kBAAkBG,cAAc,CACrCC,SAAU,wBACVxF,KAAMhD,EACNyI,YAAa,qBAGf,IAAIvI,EAASR,EAAWS,SAASH,GACjC,OAYA9B,QAAAC,QAZK+B,EAAOE,QAYLsI,0BACLC,EAAAA,uBAAuB,CACrBC,KAAM,UACNC,UAAW5H,EACXgE,GAAIA,MAAAA,EAAAA,EAAM,UACV6D,UAAwCrC,OAA/BA,EAAE7G,EAAI+E,QAAQpG,IAAI,eAAakI,EAAI,oBAQ5C,IALA,IAK2BsC,EALvBC,EAAa,IAAI/E,IAKrBgF,EAAAf,EAAiBlI,EAAKe,SAAKgI,EAAAE,KAAAd,MAAE,CAAA,IAAAe,EAApBnH,EAAIgH,EAAA9M,MACPkN,EAAWnF,EAAoBzF,IAAIwD,EAAKZ,MAC5C,GAAgB5B,MAAZ4J,EACF,OAAAjL,QAAAC,QAAO,IAAIiL,SACTC,KAAKC,UACH5G,EAAaA,cAAC,CAAElC,OAAQ,YAAamC,cAEvC,CAAEF,OAAQ,IAAKkC,QAAAA,KAInB,IAAI5D,EAAgCmI,OAA3BA,EAAGF,EAAWzK,IAAI4K,IAASD,EAAI,GACxCnI,EAAMtB,KAAKsC,GACXiH,EAAW/K,IAAIkL,EAAUpI,EAC3B,CAIA,IAAIwI,EAAS,CACXvJ,KAAM,CACJyD,WAAY,eACZ1C,MAAO,IAET0B,OAAQ,KACR,OAAAvE,QAAAC,QAEID,QAAQ4D,IACZ+C,MAAM2E,KAAKR,EAAWxH,WAAWG,IAAG8H,SAAAA,OAASN,EAAQM,EAAE1I,GAAAA,EAAK0I,EAAA,GAAA,IACjC,OAAAvL,QAAAC,QAAf4F,EAAKoF,GACKtH,QAAQK,EAAS,CACnCqB,UAAWtC,EACXF,MAAAA,KACAxE,KAHEuB,SAAAA,GAAG4L,IAAAA,EAKPH,EAAO9G,OAASkB,KAAKC,IAAI2F,EAAO9G,OAAQ3E,EAAI2E,SAC5CiH,EAAAH,EAAOvJ,KAAKe,OAAMtB,KAAIoE,MAAA6F,EAAI5L,EAAIkC,KAAKe,MAAO,EAC5C,CAAC,MAAAhE,GAAA,OAAAmB,QAAAO,OAAA1B,EAAA,CAAA,KACFR,KAEDoI,WAEgD,OAFhDA,EAAQmB,OAAO,WAAY7E,GAC3B0D,EAAQmB,OAAO,eAAgB,wBAC/BnB,EAAQmB,OAAO,eAAgB,iBAAiB5H,QAAAC,QAE1CD,QAAQ4D,IAAI4E,EAAY/E,IAAI,SAAAzF,GAAC,OAAIA,GAAG,KAAEK,KAAA,WAE5C,OAAW,IAAA6M,SAAS3B,EAASA,UAACkC,OAAOJ,EAAOvJ,MAAO,CACjDyC,OAAQ8G,EAAO9G,OACfkC,QAAAA,GACC,EACL,EAAA,CAAC,MAAA5H,GAAA,OAAAmB,QAAAO,OAAA1B,EACF,CAAA,GA1EQ,IAAIqM,SACTC,KAAKC,UACHhJ,kBAAgB,CACdC,OAAQL,EAAOK,OACfC,OAAQ,iBACPmC,cAEL,CAAEF,OAAQ,IAAKkC,QAAAA,IAoErB,CAAE,MAAO5H,GAKP,OAJA8F,QAAQC,MAAM/F,GAEd6D,EAAOqC,iBAAiBlG,GAExBmB,QAAAC,QAAO,IAAIiL,SAASC,KAAKC,UAAUhG,wBAAsBX,cAAe,CACtEF,OAAQ,IACRkC,QAAAA,IAEJ,CACF,CAAC,MAAA5H,GAAA,OAAAmB,QAAAO,OAAA1B,EACF,CAAA,GAAA,CAAA,MAAAA,GAAA,OAAAmB,QAAAO,OAAA1B,EACJ,CAAA,GAAA,CAAA,MAAAA,GAAAmB,OAAAA,QAAAO,OAAA1B,MACJY,EA5OG6I,EAAkC,OAA5BnC,EAAGzE,EAAI+E,QAAQpG,IAAI,WAAS8F,EAAI,GACtCoB,GAAS,EAEb,GAAIjI,EAAKoM,MAAQ,YAAapM,EAAKoM,KACjC,IACE,IACIC,EADM,IAAIC,IAAItD,GACGuD,SAAS3H,MAAM,KAAK4H,OAAO,GAAGjF,KAAK,KACxDU,EAASjI,EAAKoM,KAAKK,QAAQC,SAASL,EACtC,CAAE,MAAO9M,GAGX,MAAWS,EAAKoM,MAAQ,UAAWpM,EAAKoM,OACtCnE,EAASjI,EAAKoM,KAAKO,MAAM3D,IAG3B,IAAIS,EAAM,IAAI6C,IAAIlK,EAAIqH,KAElBmD,EAAiC,OAAZ9F,EAAG9G,EAAKoM,OAALtF,OAASA,EAATA,EAAWK,cAAXL,EAAAA,EAAoBS,KAAK,MACjDqF,IAAuBA,GAA6BA,KAAAA,GAAwBhF,QAEhF,IAAIQ,EAAsCH,EACtC,CACE,8BAA+Be,EAC/B,+BAAgC,gBAChC,qFACuB,MAArB4D,EAAAA,EAAyB,IAE3B,yBAA0B,SAC1B,mCAAoC,QAEtC,CAAE,EAEN,GAAkB,WAAdxK,EAAIyK,OACN,OACEnM,QAAAC,QADEsH,EACK,IAAI2D,SAAS,KAAM,CACxB3G,OAAQ,IACRkC,QAASiB,IAIN,IAAIwD,SAAS,KAAM,CAAE3G,OAAQ,OAGtC,IAAIzC,EAAY,KAAK3B,sFAAAuE,YAEjB0H,IAAAA,EACK7C,EAASA,UAAC8C,cAAMrM,QAAAC,QAAOyB,EAAI4K,QAAMjO,KAAAkO,SAAAA,GAAxCzK,EAAIsK,EAAAvI,KAAG0F,EAAAA,UAASgD,EAA0B,EAC5C,EAAC,eAAWC,EACH,IAAItB,SACTC,KAAKC,UAAUqB,EAAkBA,mBAAC,CAAEC,QAAS,iBAAkBjI,cAC/D,CAAEF,OAAQ,MACXiI,OAAA/M,EAAA+M,EAAAA,CACH,GAACxM,OAAAA,QAAAC,QAAAE,GAAAA,EAAA9B,KAAA8B,EAAA9B,KAAAqB,GAAAA,EAAAS,GAyLH,CAAC,MAAAtB,GAAA,OAAAmB,QAAAO,OAAA1B,KAEL"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=index.module.js.map
|
|
@@ -0,0 +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":"mmDA6HY,SAAAA,EAAAC,EAAAC,EAAAC,GANF,IAAAF,EAAAG,EAEa,CACb,GAAAD,aAAAE,EAA+C,CAEvD,IAAAF,EAAAC,EAYE,cADaE,EAAAN,EAAAO,KAAA,KAAAN,EAAAC,IAVM,EAAXA,IACNA,EAAAC,EAAAC,GAOFD,EAAIA,EAAaK,EAQnB,GAAAL,GAC2EA,EAAAM,KAGzE,YADAN,EAAAM,KAAgBT,EAAAO,UAAMN,EAASC,GAAAF,EAAAO,KAAA,KAAAN,EAAA,IAIjCA,EAAAG,EAA4DF,EAC1DD,EAAAO,EAAAL,EAAmC,IAAAO,EAAUT,EAAAK,KAG7CI,EAAIT,GAKN,KAlIWI,eAAK,WAEN,SAAAA,IAAA,CAqDR,OAtDFA,EAAAM,wBACkFC,EAAAC,OAAxEC,EAAW,IAAAT,EACjBH,EAAAa,KAAAX,KAEDF,EACqD,CAKtD,IAAAc,EAAiB,IAAOJ,EAAkDC,OACpE,SAEK,EAAAG,EAAUD,KAAAP,UAClBS,GAEDjB,EAAAc,EAAU,EAAAG,EACV,UAGF,OAAEF,iBAKYT,EAAA,SAAAY,aAQNA,EAAMV,EACN,IAAAJ,MACK,EAAAQ,EAAUA,EAAAT,GAA4BA,GAC9CU,IAEGC,IAAaD,EAAMV,YAIzB,CAAA,MAAEc,GACNjB,EAACc,EAAA,EAAAG,KAIAH,CAED,EAKET,EAvDc,GAwIM,SAAAc,EAAgBC,GAEpC,OAAAA,aAASf,GAAqB,EAAAe,EAAAhB,CAE9B,CA5IS,IAAAiB,0BACX,SAAAA,EACUC,QAAAA,IAAAA,IAAAA,EAAsE,IAAEP,KAAxEO,iBAAA,EAAAP,KAAWO,YAAXA,CACP,CAAC,IAAAC,EAAAF,EAAAV,UAqDHU,OArDGE,EAEJC,IAAA,SACEC,EACAC,GAgBA,WAAWL,KAAKM,OAA4BZ,KAAKO,aAZnC,SAAUM,GAAkD,IAAA,IASxDC,EATwDC,EAAAA,SAAAC,GAAAF,GAAAA,SAAAE,EAMxE,IAAIC,EAAMP,EAAQG,GAC8B,OAA5CK,GAAKL,EAAIM,qBAAqBC,IAAIF,EAAKD,GAAKI,QAAAC,QAEnCL,EAAGH,EARZI,EAAU,MAAJP,SAAAA,EAAMY,wBAANZ,EAAMY,iBAAmBV,GAAKW,EACpCN,WAAAA,GAAAA,GAAOL,EAAIM,qBAAqBM,IAAIP,GAAI,OAAAG,QAAAC,QAC7BT,EAAIM,qBAAqBO,IAAIR,IAAKxB,KAAA,SAAAiC,UAAAb,IAAAa,CAAA,EAAA,CAD7CT,GAC6C,OAAAG,QAAAC,QAAAE,GAAAA,EAAA9B,KAAA8B,EAAA9B,KAAAqB,GAAAA,EAAAS,GAOnD,CAAC,MAAAtB,GAAA,OAAAmB,QAAAO,OAAA1B,EAED,CAAA,IACF,EAACM,EAEDqB,iBAAA,SACEnB,EACAC,GAIA,gBAAQmB,GAAQ,OAAA,SACPjB,GAA6C,IAAA,IASlCkB,EATkCC,EAAAA,SAAAC,GAAAF,GAAAA,SAAAE,EAMlD,IAAIhB,EAAMP,EAAQG,EAAKiB,GACyB,OAA5CZ,GAAKL,EAAIM,qBAAqBC,IAAIF,EAAKD,GAAKI,QAAAC,QAEnCL,EAAG,EARZC,EAAMP,MAAAA,GAAsB,MAAtBA,EAAMY,sBAAgB,EAAtBZ,EAAMY,iBAAmBV,EAAKiB,GAAOI,EAC3ChB,WAAAA,GAAAA,GAAOL,EAAIM,qBAAqBM,IAAIP,UAAIG,QAAAC,QAC7BT,EAAIM,qBAAqBO,IAAIR,IAAKxB,KAAA,SAAAyC,UAAAJ,IAAAI,CAAA,EAAA,CAD7CjB,GAC6C,OAAAG,QAAAC,QAAAY,GAAAA,EAAAxC,KAAAwC,EAAAxC,KAAAsC,GAAAA,EAAAE,GAOnD,CAAC,MAAAhC,GAAAmB,OAAAA,QAAAO,OAAA1B,EACL,CAAA,CAAA,CAAA,EAACM,EAEDE,QAAA,WACE,OAAO,IAAI0B,EAAO,GAAAxB,OAAKZ,KAAKO,aAC9B,EAACC,EAED6B,WAAA,SAIEC,GACA,OAAOA,CACT,EAAChC,CAAA,IAmCU8B,eAMX,WAAA,SAAAA,EACU7B,YAAAA,IAAAA,EAAsE,IAAtEA,KAAAA,iBANFgC,EAAAA,KAAAA,qBAGAC,iBAAW,EAGTxC,KAAWO,YAAXA,CACP,CAAC,IAAAkC,EAAAL,EAAAxC,UA2EH,OA3EG6C,EAAA,GAEJ,SACE/B,GAIA,GAAqBgC,MAAjB1C,KAAKuC,SAAuB,MAAU,IAAAI,MAAM,2BAKhD,OAFA3C,KAAKuC,SAAW7B,MAGlB,EAAC+B,EAEDhC,IAAA,SACEC,GAGA,OADAV,KAAKO,YAAYqC,KAAKlC,GACfV,IACT,EAACyC,EAEDX,MAAA,SAAoBe,GAClB,GAAwBH,MAApB1C,KAAKwC,YAA0B,MAAU,IAAAG,MAAM,oCAKnD,OAFA3C,KAAKwC,YAAcK,EAEZ7C,IACT,EAACyC,EAEKK,IAAG,SACPC,EACAC,OAAmBC,IAAAA,EAAAA,WAAA5B,OAAAA,QAAAC,QAiCHnB,EAAKoC,SAAQW,EAAA,CAAA,EACxBrC,EACHiB,CAAAA,MAAAA,EACAqB,UAAMT,MACNhD,KAJEuB,SAAAA,GAMJ,MAAO,CACLmC,SAAUnC,EACV,EAAAd,EAAAA,EArCGH,KAAL,IAAKG,EAAKoC,SAAU,MAAU,IAAAI,MAAM,uBAEpC,IAAIb,EAAQiB,EAAII,KAEhB,GAAIhD,EAAKqC,YAAa,CACpB,IAAIa,EAASlD,EAAKqC,YAAYc,SAASP,EAAII,MAE3C,IAAKE,EAAOE,QACV,MAAU,IAAAC,EACRC,EAAgB,CAAEC,OAAQL,EAAOK,OAAQC,OAAQ,eAIrD7B,EAAQuB,EAAOjE,KACjB,CAEA,IAAIyB,EAAGqC,EACFF,CAAAA,EAAAA,EACAD,EAGHI,CAAAA,KAAMrB,IACN8B,6uBAAAC,CAEa1D,EAAKI,qBAAXuD,UAAwBzC,QAAAC,QACfwC,EAAGjD,IAAInB,KAAnBuB,SAAAA,GACAA,IAAKJ,EAAGqC,EAAQrC,CAAAA,EAAAA,EAAQI,GAAM,EACpC,GAAC,OAAAI,QAAAC,QAAAsC,GAAAA,EAAAlE,KAAAkE,EAAAlE,KAAAuD,GAAAA,IAWH,CAAC,MAAA/C,GAAAmB,OAAAA,QAAAO,OAAA1B,EAAA,CAAA,EAAAkC,CAAA,CA7ED,GC5GE2B,EAASC,IAETnB,EAAapD,EAAEwE,OAAO,CACxBC,MAAOzE,EAAE0E,MACP1E,EAAEwE,OAAO,CACPG,GAAI3E,EAAE4E,SACNC,KAAM7E,EAAE4E,SACRE,QAAS9E,EAAE+E,WAKNC,EAAS,SAClB9D,EAMA+D,GAoBA,IAAIC,EAAsB,IAAIC,IAC5BF,EAAKG,QAAQ,SAACC,EAAKC,GAAM,OAAAD,EAAIE,aAAaC,IAAI,SAAAX,GAAI,MAAI,CAACA,EAAMS,EAAE,EAAC,IAGlE,MAAO,CACLG,KAAMvE,EAAKuE,KAEXC,MAAKA,SAASpC,GAA0B,IAAA,IAAAqC,EAAAC,EA6OrCvE,EA7OqCC,EAAAA,SAAAC,GAAA,IAAAsE,EAAAC,EAAAC,EAAAC,EAAA3E,GAAAA,SAAAE,EAuDtC,IAAI0E,EAAqB3C,EAAI4C,QAAQjE,IAAI,gBACrCkE,EAGoB,OAHTN,EACZO,MAAMC,QAAQJ,GACXA,EAAmBK,KAAK,KACxBL,GAAkBJ,OAAK5C,EACzBsD,EAAUjD,EAAI4C,QAAQjE,IAAI,WAE1BuE,EC5HqB,SAACC,GAC9B,GAAkC,iBAAvBA,EAAX,CAEA,IAAIC,EAAMD,EACPE,MAAM,KACNnB,IAAI,SAAAgB,GAAE,OAAIA,EAAGI,MAAM,GACnBC,OAAOC,SACV,OAAOJ,EAAIK,OAAS,EAAIL,EAAI,QAAKzD,CAN2B,CAO9D,CDoHe+D,QAAiBlB,EAEa,OAFbC,EACkBC,OADlBA,EACxB1C,EAAI4C,QAAQjE,IAAI,4BAA0B+D,EACxC1C,EAAI4C,QAAQjE,IAAI,qBAAmB8D,EACnCzC,EAAI4C,QAAQjE,IAAI,oBAAkB6D,EAClCxC,EAAI4C,QAAQjE,IAAI,cAGhBiE,EAAU,IAAIe,QAElB,GAAIC,EACF,IAAA,IAAAC,EAAA,EAAAC,EAAyBC,OAAOC,QAAQC,GAAYJ,EAAAC,EAAAL,OAAAI,IAAE,CAAjD,IAAAK,EAAAJ,EAAAD,GACHjB,EAAQuB,OADGD,KAAOA,EAAA,GAEpB,CACD,OAAA5F,QAAAC,QAEYyC,EAAOoD,mBAAkB,WAAA,IAAA,OAAA9F,QAAAC,QAE5ByC,EAAOqD,cACX,CAAExB,YAAAA,EAAaI,QAAAA,GAAS,WAAA,IAAA,IAAAqB,EAAAC,SAAAjG,QAAAC,QAEhByC,EAAOwD,UACX,CACEjD,KAAM,cACNkD,GAAI,aACJC,WAAY,CACVxB,GAAAA,EACAyB,UAAW,OACXC,GAAiCN,OAA/BA,EAAEtE,EAAI4C,QAAQjE,IAAI,eAAa2F,EAAI,GACrCO,OAAiC,OAA3BN,EAAEvE,EAAI4C,QAAQjE,IAAI,WAAS4F,EAAI,KAG9B,WAAA,IACT,IAAIO,IAAAA,EACEC,EAAyC,GACzC1D,EAAK2D,EAAiB,QAEtBC,EAAeC,EAAK,WAAA,IAAAC,EAAA,OACtBC,EAAOC,MAA+BF,OAA1BA,EAACnF,EAAI4C,QAAQjE,IAAI,WAASwG,EAAI,GAAG,GAG3CG,EAA0B,CAC5BC,IAAKvF,EAAIuF,IACT3C,QAAS5C,EAAI4C,QACb4C,MAAOD,EAAIE,aACXrF,KAAAA,EACAsF,QAAStF,EACT8C,GAAAA,EACAyC,UAAWtE,EAEXuE,WAAY,WAAM,OAAAX,GAAc,EAChCY,UAAW,SAACtE,GAAY,OAAK0D,IAAe1D,EAAK,EACjDuE,UAAW,SAACvE,EAAclF,EAAeuB,GACvC,IAAImI,EAASX,EAAOY,UAAUzE,EAAMlF,EAAOuB,GAE3CgF,EAAQuB,OAAO,aAAc4B,EAC/B,EAEAE,WAAY,SAACtI,GACXoH,EAAYlF,KAAKlC,EACnB,EAEAS,qBAAsB,IAAIyD,IAE1BqE,cAAe,SAACC,GACd,QAAAC,EAAA,EAAAC,EAAyBtC,OAAOC,QAAQmC,GAAWC,EAAAC,EAAA5C,OAAA2C,IAAE,CAAhD,IAAAE,EAAAD,EAAAD,GAAKjI,EAAGmI,EAAEjK,GAAAA,EAAKiK,KAClB,GAAIxD,MAAMC,QAAQ1G,GAChB,IAAAkK,IAAmBC,EAAnBD,EAAAE,EAAcpK,KAAKmK,EAAAD,KAAAG,MAAE9D,EAAQuB,OAAOhG,EAA1BqI,EAAAnK,YAEVuG,EAAQuB,OAAOhG,EAAK9B,EAExB,CACF,GAGF2E,EAAO2F,kBAAkBC,WAAW,cAAe,CACjDrB,IAAKvF,EAAIuF,IACTC,MAAOzB,OAAO8C,YAAYtB,EAAIE,aAAazB,aAG7ChD,EAAO2F,kBAAkBG,cAAc,CACrCC,SAAU,wBACVC,KAAM5G,EACN6G,YAAa,qBAGf,IAAI3G,EAASR,EAAWS,SAASH,GACjC,OAYA9B,QAAAC,QAZK+B,EAAOE,QAYL0G,EACLC,EAAuB,CACrBC,KAAM,UACNC,UAAWhG,EACX6B,GAAIA,MAAAA,EAAAA,EAAM,UACVoE,UAAwCxC,OAA/BA,EAAE9E,EAAI4C,QAAQjE,IAAI,eAAamG,EAAI,oBAQ5C,IALA,IAK2ByC,EALvBC,EAAa,IAAI3F,IAKrB4F,EAAAhB,EAAiBrG,EAAKe,SAAKoG,EAAAE,KAAAf,MAAE,CAAA,IAAAgB,EAApBC,EAAIJ,EAAAlL,MACPuL,EAAWhG,EAAoBjD,IAAIgJ,EAAKpG,MAC5C,GAAgB5B,MAAZiI,EACF,OAAAtJ,QAAAC,QAAO,IAAIsJ,SACTC,KAAKC,UACHC,EAAc,CAAEpH,OAAQ,YAAaqH,cAEvC,CAAEC,OAAQ,IAAKtF,QAAAA,KAInB,IAAIzB,EAAgCuG,OAA3BA,EAAGF,EAAW7I,IAAIiJ,IAASF,EAAI,GACxCvG,EAAMtB,KAAK8H,GACXH,EAAWnJ,IAAIuJ,EAAUzG,EAC3B,CAIA,IAAIgH,EAAS,CACX/H,KAAM,CACJgI,WAAY,eACZjH,MAAO,IAET+G,OAAQ,KACR,OAAA5J,QAAAC,QAEID,QAAQ+J,IACZvF,MAAMwF,KAAKd,EAAWxD,WAAW9B,IAAGqG,SAAAA,OAASX,EAAQW,EAAEpH,GAAAA,EAAKoH,EAAA,GAAA,IACjC,OAAAjK,QAAAC,QAAfoD,EAAKiG,GACKY,QAAQlD,EAAS,CACnCK,UAAWtE,EACXF,MAAAA,KACAxE,KAHEuB,SAAAA,GAAGuK,IAAAA,EAKPN,EAAOD,OAASQ,KAAKC,IAAIR,EAAOD,OAAQhK,EAAIgK,SAC5CO,EAAAN,EAAO/H,KAAKe,OAAMtB,KAAI+I,MAAAH,EAAIvK,EAAIkC,KAAKe,MAAO,EAC5C,CAAC,MAAAhE,GAAA,OAAAmB,QAAAO,OAAA1B,EAAA,CAAA,KACFR,KAEDiG,WAEgD,OAFhDA,EAAQuB,OAAO,WAAY9C,GAC3BuB,EAAQuB,OAAO,eAAgB,wBAC/BvB,EAAQuB,OAAO,eAAgB,iBAAiB7F,QAAAC,QAE1CD,QAAQ+J,IAAItD,EAAY7C,IAAI,SAAA5F,GAAC,OAAIA,GAAG,KAAEK,KAAA,WAE5C,OAAW,IAAAkL,SAAS7B,EAAU6C,OAAOV,EAAO/H,MAAO,CACjD8H,OAAQC,EAAOD,OACftF,QAAAA,GACC,EACL,EAAA,CAAC,MAAAzF,GAAA,OAAAmB,QAAAO,OAAA1B,EACF,CAAA,GA1EQ,IAAI0K,SACTC,KAAKC,UACHrH,EAAgB,CACdC,OAAQL,EAAOK,OACfC,OAAQ,iBACPqH,cAEL,CAAEC,OAAQ,IAAKtF,QAAAA,IAoErB,CAAE,MAAOzF,GAKP,OAJA2L,QAAQC,MAAM5L,GAEd6D,EAAOgI,iBAAiB7L,GAExBmB,QAAAC,QAAO,IAAIsJ,SAASC,KAAKC,UAAUkB,IAAsBhB,cAAe,CACtEC,OAAQ,IACRtF,QAAAA,IAEJ,CACF,CAAC,MAAAzF,GAAA,OAAAmB,QAAAO,OAAA1B,EACF,CAAA,GAAA,CAAA,MAAAA,GAAA,OAAAmB,QAAAO,OAAA1B,EACJ,CAAA,GAAA,CAAA,MAAAA,GAAAmB,OAAAA,QAAAO,OAAA1B,MACJY,EA5OG8G,EAAkC,OAA5BxC,EAAGrC,EAAI4C,QAAQjE,IAAI,WAAS0D,EAAI,GACtCuB,GAAS,EAEb,GAAIhG,EAAKsL,MAAQ,YAAatL,EAAKsL,KACjC,IACE,IACIC,EADM,IAAIC,IAAIvE,GACGwE,SAAShG,MAAM,KAAKiG,OAAO,GAAGtG,KAAK,KACxDY,EAAShG,EAAKsL,KAAKK,QAAQC,SAASL,EACtC,CAAE,MAAOhM,GAGX,MAAWS,EAAKsL,MAAQ,UAAWtL,EAAKsL,OACtCtF,EAAShG,EAAKsL,KAAKO,MAAM5E,IAG3B,IAAIU,EAAM,IAAI6D,IAAIpJ,EAAIuF,KAElBmE,EAAiC,OAAZpH,EAAG1E,EAAKsL,OAAL5G,OAASA,EAATA,EAAWM,cAAXN,EAAAA,EAAoBU,KAAK,MACjD0G,IAAuBA,GAA6BA,KAAAA,GAAwBpG,QAEhF,IAAIW,EAAsCL,EACtC,CACE,8BAA+BiB,EAC/B,+BAAgC,gBAChC,qFACuB,MAArB6E,EAAAA,EAAyB,IAE3B,yBAA0B,SAC1B,mCAAoC,QAEtC,CAAE,EAEN,GAAkB,WAAd1J,EAAI2J,OACN,OACErL,QAAAC,QADEqF,EACK,IAAIiE,SAAS,KAAM,CACxBK,OAAQ,IACRtF,QAASqB,IAIN,IAAI4D,SAAS,KAAM,CAAEK,OAAQ,OAGtC,IAAI9H,EAAY,KAAK3B,sFAAAmL,YAEjBC,IAAAA,EACK7D,EAAU8D,cAAMxL,QAAAC,QAAOyB,EAAI+J,QAAMpN,KAAAqN,SAAAA,GAAxC5J,EAAIyJ,EAAAlC,KAAG3B,EAASgE,EAA0B,EAC5C,EAAC,eAAWC,EACH,IAAIpC,SACTC,KAAKC,UAAUmC,EAAmB,CAAEC,QAAS,iBAAkBlC,cAC/D,CAAEC,OAAQ,MACX+B,OAAAlM,EAAAkM,EAAAA,CACH,GAAC3L,OAAAA,QAAAC,QAAAE,GAAAA,EAAA9B,KAAA8B,EAAA9B,KAAAqB,GAAAA,EAAAS,GAyLH,CAAC,MAAAtB,GAAA,OAAAmB,QAAAO,OAAA1B,KAEL,EE1SI6D,EAASC,IAEFmJ,EACT,SAACxM,GAeA,OACA0B,SAAAA,GACC,IAcI+K,EAA2B,SAAC/K,GAC9B,OAAAyE,OAAOC,QAAQ1E,GAAYwC,QAAQ,SAAAS,GAAE,IAAApE,EAAGoE,KAAElG,EAAKkG,EAC7C,GAAA,OAAIlG,aAAiBgD,EAAgB,CAAClB,GAClB,iBAAT9B,EACFgO,EAAyBhO,GAAO6F,IAAI,SAAAX,GAAI,OAAOpD,MAAOoD,CAAI,GAC5D,EACT,EAAE,EAwHJ,MAAO,CACLU,aAvHiBoI,EAAyB/K,GAwH1CkJ,iBAnDAxI,EACAI,GAWG,IAAA,OAAA9B,QAAAC,QACiBD,QAAQ+J,IAC1BjI,EAAKe,MAAMe,IAAWyF,SAAAA,EAAM3F,GAAC,WAAI1D,QAAAC,QAjFjC,SACFyB,EACA2H,EACA2C,GAKG,IACH,IAAIhF,EAAOnF,EAAA,CAAA,EAAQH,EAAKI,CAAAA,KAAMuH,EAAKnG,UAAU,OAAAlD,QAAAC,iCAGvCZ,EApCU,SAAC4D,GAIjB,IAHA,IAAIgJ,EAAQhJ,EAAK8B,MAAM,KACnBmH,EAAUlL,EAEPkL,GAAWD,EAAM9G,OAAS,GAE/B,KADA+G,EAAUA,EAAQD,EAAME,UACV,OAChB,KAEA,OAAID,GAAWA,aAAmBnL,EAAgBmL,EAGpD,IAAA,CAwBkBE,CAAY/C,EAAKpG,OAEnBjD,QAAAC,QAQSZ,EAAQoC,IAAIuF,EAAS,KAAG3I,cAAzC0D,GAEJ,MAAO,CACL6H,OAAQ,IACR5C,QAAStF,EACTK,SAAUA,EAASA,SACnB,GAbO,CACLiF,QAAAA,EACA4C,OAAQ,IACR7H,SAAU2H,EAAc,CAAEpH,OAAQ,YAAaqH,mCAPjD,IACEtK,sCAHuCiM,CAEzC,EAkBKzM,SAAAA,GAGP,OAFA2L,QAAQC,MAAM5L,GAEVwN,EAAexN,IACbA,EAAE6J,KAAKkB,QAAU,KACnBlH,EAAOgI,iBAAiB7L,EAAG,CACzByN,KAAM,CAAEN,MAAAA,KAIL,CACLhF,QAAAA,EACA4C,OAAQ/K,EAAE6J,KAAKkB,OACf7H,SAAUlD,EAAE8K,gBAIhBjH,EAAOgI,iBAAiB7L,EAAG,CACzByN,KAAM,CAAEN,MAAAA,KAGE,MAAZ1M,EAAKiN,SAALjN,EAAKiN,QAAU,CACbC,SAAUnD,EAAKpG,KACfwJ,OAAQpD,EAAKtG,GACbiE,QAAStF,EACT+I,MAAO5L,EACPmN,MAAAA,IAGK,CACLhF,QAAAA,EACA4C,OAAQ,IACR7H,SAAU4I,IAAsBhB,cAEpC,GACF,CAAC,MAAA9K,GAAAmB,OAAAA,QAAAO,OAAA1B,EAAA,CAAA,CAkBqB4C,CAAIC,EAAK2H,EAAavH,EAAKuF,YAAUhJ,cAAjDuB,GAEJ,IACgB,MAAdN,EAAKoN,WAALpN,EAAKoN,UAAY,CACfV,MAAOlK,EAAKuF,UACZoF,OAAQpD,EAAKtG,GACbyJ,SAAUnD,EAAKpG,KACf+D,QAASpH,EAAIoH,QACbjF,SAAU,CAAE6H,OAAQhK,EAAIgK,OAAQ9H,KAAMlC,EAAImC,WAE9C,CAAE,MAAOlD,GACP6D,EAAOgI,iBAAiB7L,GACxB2L,QAAQC,MAAM5L,EAChB,CAEA,MAAO,CACLiL,WAAY,oBACZ/G,GAAIsG,EAAKtG,GACTE,KAAMoG,EAAKpG,KACX2G,OAAQhK,EAAIgK,OACZlL,OAAQkB,EAAImC,SACZ,EACJ,CAAC,MAAAlD,UAAAmB,QAAAO,OAAA1B,QACFR,KAzBGsO,SAAAA,GA2BJ,MAAO,CACL/C,OAAQQ,KAAKC,IAAGC,MAARF,KAAYuC,EAAQ/I,IAAI,SAAAgJ,GAAC,OAAIA,EAAEhD,MAAM,IAC7C9H,KAAM,CACJgI,WAAY,eACZjH,MAAO8J,GAET,EACJ,CAAC,MAAA9N,GAAA,OAAAmB,QAAAO,OAAA1B,EAAA,CAAA,EAyCH,CAAC"}
|
|
@@ -0,0 +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)}}}}});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|