@lensmcp/cluster 1.23.8 → 1.23.10
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/basic-ssl.js +1 -1
- package/build-scope-patterns.js +1 -1
- package/create-webpack-dev.js +1 -1
- package/create-webpack-prod.js +1 -1
- package/error-stack-release.js +1 -1
- package/executors/build/build.impl.js +1 -1
- package/executors/gateway/body-stall.js +1 -1
- package/executors/gateway/canonical-path.js +1 -1
- package/executors/gateway/client-ip.js +1 -1
- package/executors/gateway/gateway-errors.js +1 -1
- package/executors/gateway/gateway.impl.js +1 -1
- package/executors/gateway/gateway.lib.js +1 -1
- package/executors/gateway/health-check.js +1 -1
- package/executors/gateway/jwks-verify.js +1 -1
- package/executors/gateway/jwt-claims.js +1 -1
- package/executors/gateway/main.prod-gateway.js +2 -2
- package/executors/gateway/main.rollout.js +4 -4
- package/executors/gateway/manifest.js +1 -1
- package/executors/gateway/metrics.js +1 -1
- package/executors/gateway/otel-tracing.js +1 -1
- package/executors/gateway/prod-config.js +1 -1
- package/executors/gateway/prod-gateway.lib.js +1 -1
- package/executors/gateway/prod-runtime/access-log.js +1 -1
- package/executors/gateway/prod-runtime/app.js +1 -1
- package/executors/gateway/prod-runtime/auth.js +1 -1
- package/executors/gateway/prod-runtime/body-stall.js +1 -1
- package/executors/gateway/prod-runtime/cors.js +1 -1
- package/executors/gateway/prod-runtime/edge.js +1 -1
- package/executors/gateway/prod-runtime/handler.js +1 -1
- package/executors/gateway/prod-runtime/hooks.js +1 -1
- package/executors/gateway/prod-runtime/observability.js +1 -1
- package/executors/gateway/prod-runtime/rollout.js +1 -1
- package/executors/gateway/prod-runtime/routing.js +1 -1
- package/executors/gateway/prod-runtime/server.js +1 -1
- package/executors/gateway/prod-runtime/trust.js +1 -1
- package/executors/gateway/prod-runtime/upgrade.js +7 -7
- package/executors/gateway/prod-runtime/upstream.js +1 -1
- package/executors/gateway/providers-prod.js +1 -1
- package/executors/gateway/rate-limit.js +2 -2
- package/executors/gateway/registry-source.js +1 -1
- package/executors/gateway/rollout-ops.js +2 -2
- package/executors/gateway/runtime/auth.js +1 -1
- package/executors/gateway/runtime/chooser.js +9 -9
- package/executors/gateway/runtime/control.js +2 -2
- package/executors/gateway/runtime/dev-auth.js +1 -1
- package/executors/gateway/runtime/discovery.js +1 -1
- package/executors/gateway/runtime/edge.js +1 -1
- package/executors/gateway/runtime/handler.js +1 -1
- package/executors/gateway/runtime/hmr-reload.js +1 -1
- package/executors/gateway/runtime/hooks.js +1 -1
- package/executors/gateway/runtime/lens-children.js +1 -1
- package/executors/gateway/runtime/lifecycle.js +3 -3
- package/executors/gateway/runtime/observability.js +2 -2
- package/executors/gateway/runtime/pod-env.js +2 -2
- package/executors/gateway/runtime/pod-output.d.ts +41 -1
- package/executors/gateway/runtime/pod-output.js +1 -1
- package/executors/gateway/runtime/pod-probe.js +1 -1
- package/executors/gateway/runtime/proxy.js +1 -1
- package/executors/gateway/runtime/route-registry.js +1 -1
- package/executors/gateway/runtime/scope.js +1 -1
- package/executors/gateway/runtime/server.js +2 -2
- package/executors/gateway/runtime/service-keys.js +1 -1
- package/executors/gateway/runtime/types.d.ts +4 -0
- package/executors/gateway/runtime/types.js +1 -1
- package/executors/gateway/runtime/upgrade.js +1 -1
- package/executors/gateway/runtime/workspace-log.js +1 -1
- package/executors/gateway/runtime/workspace-registry.js +1 -1
- package/executors/gateway/ssrf-guard.js +1 -1
- package/executors/serve/serve.impl.js +1 -1
- package/executors/trust/hostname.js +1 -1
- package/executors/trust/trust.impl.js +3 -3
- package/exit-reason.js +2 -2
- package/fork-ts-check-reporter.js +1 -1
- package/gateway.js +1 -1
- package/hot-swap-registries.js +1 -1
- package/index.js +1 -1
- package/main.devserver.js +8 -8
- package/package.json +4 -4
- package/process-name.js +1 -1
- package/redis-disconnect-fix.js +1 -1
- package/schema-first-instance.js +1 -1
- package/stdio-guard.js +1 -1
- package/swap-recycle.js +1 -1
- package/tsgo-check-plugin.d.ts +3 -0
- package/tsgo-check-plugin.js +4 -4
- package/typecheck-bus.js +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var l=Object.defineProperty;var c=(e,t)=>l(e,"name",{value:t,configurable:!0});var u=Object.defineProperty,s=c((e,t)=>u(e,"name",{value:t,configurable:!0}),"s"),a=Object.defineProperty,o=s((e,t)=>a(e,"name",{value:t,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.baseDomainOf=baseDomainOf,exports.readLensScope=readLensScope,exports.deriveMcpHttpPort=deriveMcpHttpPort,exports.readSourceSetExclude=readSourceSetExclude,exports.readSourceSetOptions=readSourceSetOptions,exports.lensKeyFrom=lensKeyFrom,exports.lensSlug=lensSlug;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function baseDomainOf(e){const t=e.filter(n=>!!n&&!n.startsWith("*."));if(t.length===0)return"local";const r=t.reduce((n,p)=>p.length<n.length?p:n);if(t.every(n=>n===r||n.endsWith("."+r)))return r;const i=r.split(".");return i.slice(-Math.min(i.length,3)).join(".")}c(baseDomainOf,"baseDomainOf"),s(baseDomainOf,"baseDomainOf"),o(baseDomainOf,"baseDomainOf");const BASE_PORTS={dashboard:4321,mcpHttp:4500};function hashToRange(e,t){let r=2166136261;for(let i=0;i<e.length;i++)r^=e.charCodeAt(i),r=Math.imul(r,16777619);return Math.abs(r|0)%t}c(hashToRange,"hashToRange"),s(hashToRange,"hashToRange"),o(hashToRange,"hashToRange");function readLensScope(e){try{const r=JSON.parse(fs.readFileSync(path.join(e,".lensmcp","config.json"),"utf8"));if(r&&typeof r.key=="string")return{key:r.key,dashboardPort:r.ports?.dashboard??BASE_PORTS.dashboard,mcpHttpPort:r.ports?.mcpHttp??deriveMcpHttpPort(r.key),basePath:r.dashboardBasePath??"/"+r.key}}catch{}const t=lensKeyFrom(e);return{key:t,dashboardPort:BASE_PORTS.dashboard,mcpHttpPort:deriveMcpHttpPort(t),basePath:"/"+t}}c(readLensScope,"readLensScope"),s(readLensScope,"readLensScope"),o(readLensScope,"readLensScope");function deriveMcpHttpPort(e){return BASE_PORTS.mcpHttp+hashToRange(e,200)}c(deriveMcpHttpPort,"deriveMcpHttpPort"),s(deriveMcpHttpPort,"deriveMcpHttpPort"),o(deriveMcpHttpPort,"deriveMcpHttpPort");function readSourceSetExclude(e){return readSourceSetOptions(e).exclude}c(readSourceSetExclude,"readSourceSetExclude"),s(readSourceSetExclude,"readSourceSetExclude"),o(readSourceSetExclude,"readSourceSetExclude");function readSourceSetOptions(e){const t={exclude:new Set,ignoreTests:!0};try{const r=JSON.parse(fs.readFileSync(path.join(e,".lensmcp","config.json"),"utf8")),i=r?.sourceSet?.exclude;Array.isArray(i)&&(t.exclude=new Set(i.filter(n=>typeof n=="string"&&n.length>0&&!n.includes("/")))),r?.sourceSet?.ignoreTests===!1&&(t.ignoreTests=!1)}catch{}return t}c(readSourceSetOptions,"readSourceSetOptions"),s(readSourceSetOptions,"readSourceSetOptions"),o(readSourceSetOptions,"readSourceSetOptions");function lensKeyFrom(e){try{const t=JSON.parse(fs.readFileSync(path.join(e,"package.json"),"utf8"));if(t?.name)return lensSlug(t.name)}catch{}return lensSlug(path.basename(e))}c(lensKeyFrom,"lensKeyFrom"),s(lensKeyFrom,"lensKeyFrom"),o(lensKeyFrom,"lensKeyFrom");function lensSlug(e){return e.toLowerCase().replace(/^@[^/]+\//,"").replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"workspace"}c(lensSlug,"lensSlug"),s(lensSlug,"lensSlug"),o(lensSlug,"lensSlug");
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var ue=Object.defineProperty;var m=(e,r)=>ue(e,"name",{value:r,configurable:!0});var le=Object.defineProperty,n=m((e,r)=>le(e,"name",{value:r,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GATEWAY_H2_IDLE_SESSION_MS_DEFAULT=exports.GATEWAY_MAX_H2_STREAMS_DEFAULT=exports.GATEWAY_MAX_H2_SESSIONS_DEFAULT=exports.GATEWAY_MAX_CONNECTIONS_DEFAULT=exports.BENIGN_SOCKET_ERRNOS=void 0,exports.buildEdgeVerifierPool=buildEdgeVerifierPool,exports.classifyClientError=classifyClientError,exports.createClientErrorLogGate=createClientErrorLogGate,exports.retirePreviousWorkspace=retirePreviousWorkspace,exports.resolveMaxConnections=resolveMaxConnections,exports.h2BudgetFromEnv=h2BudgetFromEnv,exports.createH2Governor=createH2Governor,exports.startGateway=startGateway;const tslib_1=require("tslib"),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),discovery_1=require("./discovery"),scope_1=require("./scope"),route_registry_1=require("./route-registry"),control_1=require("./control"),workspace_registry_1=require("./workspace-registry"),service_keys_1=require("./service-keys"),client_ip_1=require("../client-ip"),workspace_log_1=require("./workspace-log"),observability_1=require("./observability"),lifecycle_1=require("./lifecycle"),lens_children_1=require("./lens-children"),proxy_1=require("./proxy"),auth_1=require("./auth"),hooks_1=require("./hooks"),handler_1=require("./handler"),upgrade_1=require("./upgrade"),jwks_verify_1=require("../jwks-verify"),types_1=require("./types");function insecureLocalFetch(e,r){return new Promise((u,S)=>{const a=(e.startsWith("https:")?require("node:https"):require("node:http")).request(e,{method:"GET",headers:r?.headers,rejectUnauthorized:!1},g=>{const d=[];g.on("data",p=>d.push(p)),g.on("end",()=>{const p=g.statusCode??0,l=Buffer.concat(d).toString("utf8");u({ok:p>=200&&p<300,status:p,json:n(async()=>JSON.parse(l),"json")})})});a.on("error",S),a.end()})}m(insecureLocalFetch,"insecureLocalFetch"),n(insecureLocalFetch,"insecureLocalFetch");function buildEdgeVerifierPool(e){const r=process.env.LENSMCP_GW_JWKS_URL,u=process.env.LENSMCP_GW_JWT_ISS,S=new Map;let a;const g=n((d,p)=>{console.log(`[gateway] edge JWT: verifying via JWKS ${d}${p}`);const l=(0,jwks_verify_1.createJwksVerifier)({jwksUrl:d,...u?{issuer:u}:{},fetchImpl:insecureLocalFetch});return l.refresh().catch(s=>console.warn("[gateway] edge JWKS warm failed (will retry):",s.message)),l},"make");return{for(d){if(r)return a??=g(r,"");const p=d.split(":")[0].toLowerCase();let l;for(const i of e()){const h=i.host;if(typeof h!="string"||!/^auth\./.test(h)||h.startsWith("internal."))continue;const C=h.slice(5);(p===C||p.endsWith(`.${C}`))&&(!l||C.length>l.length)&&(l=C)}if(!l)return;let s=S.get(l);return s||(s=g(`https://auth.${l}/jwks.json`,` (auto-derived for apex ${l})`),S.set(l,s)),s},stop(){a?.stop();for(const d of S.values())d.stop()}}}m(buildEdgeVerifierPool,"buildEdgeVerifierPool"),n(buildEdgeVerifierPool,"buildEdgeVerifierPool"),exports.BENIGN_SOCKET_ERRNOS=new Set(["ECONNRESET","EPIPE","ETIMEDOUT","ECONNABORTED","ECANCELED"]);function classifyClientError(e,r){return e&&exports.BENIGN_SOCKET_ERRNOS.has(e)?{status:null,report:!1,cause:"client-abort"}:e==="HPE_INVALID_EOF_STATE"?{status:null,report:!1,cause:"truncated-at-eof"}:e==="ERR_HTTP_REQUEST_TIMEOUT"?{status:408,report:!0,cause:"request-timeout"}:e==="HPE_HEADER_OVERFLOW"?{status:431,report:!0,cause:"header-overflow"}:e?.startsWith("HPE_")?{status:400,report:!0,cause:"parse-error"}:{status:400,report:!0,cause:e??r??"unknown"}}m(classifyClientError,"classifyClientError"),n(classifyClientError,"classifyClientError");const CLIENT_ERROR_REASON={400:"Bad Request",408:"Request Timeout",431:"Request Header Fields Too Large"};function createClientErrorLogGate(e=1e4){const r=new Map;return u=>{const S=Date.now(),a=r.get(u)??0;return S-a<e?!1:(r.set(u,S),!0)}}m(createClientErrorLogGate,"createClientErrorLogGate"),n(createClientErrorLogGate,"createClientErrorLogGate");function guardInboundSocket(e){e.on("error",r=>{exports.BENIGN_SOCKET_ERRNOS.has(r.code??"")||console.warn(`[gateway] inbound socket error (${r.code??r.message}) \u2014 dropping this connection only`),e.destroy()})}m(guardInboundSocket,"guardInboundSocket"),n(guardInboundSocket,"guardInboundSocket");function retirePreviousWorkspace(e,r,u){const S=e.get(r);if(!S)return!1;e.delete(r),u==="re-registered"&&console.log(`[gateway] workspace '${r}' re-registered \u2014 retiring the children of its previous registration first.`);try{S()}catch(a){console.warn(`[gateway] could not fully retire the previous registration of '${r}' (${u}): ${a.message}`)}return!0}m(retirePreviousWorkspace,"retirePreviousWorkspace"),n(retirePreviousWorkspace,"retirePreviousWorkspace"),exports.GATEWAY_MAX_CONNECTIONS_DEFAULT=512,exports.GATEWAY_MAX_H2_SESSIONS_DEFAULT=64,exports.GATEWAY_MAX_H2_STREAMS_DEFAULT=4096,exports.GATEWAY_H2_IDLE_SESSION_MS_DEFAULT=3e5;function parseBudget(e,r){if(e===void 0||e.trim()==="")return r;const u=Number(e);return!Number.isFinite(u)||u<0?r:Math.floor(u)}m(parseBudget,"parseBudget"),n(parseBudget,"parseBudget");function resolveMaxConnections(e){return parseBudget(e,exports.GATEWAY_MAX_CONNECTIONS_DEFAULT)}m(resolveMaxConnections,"resolveMaxConnections"),n(resolveMaxConnections,"resolveMaxConnections");function h2BudgetFromEnv(e=process.env){return{maxSessions:parseBudget(e.LENSMCP_MAX_H2_SESSIONS,exports.GATEWAY_MAX_H2_SESSIONS_DEFAULT),maxStreams:parseBudget(e.LENSMCP_MAX_H2_STREAMS,exports.GATEWAY_MAX_H2_STREAMS_DEFAULT),idleSessionMs:parseBudget(e.LENSMCP_H2_IDLE_MS,exports.GATEWAY_H2_IDLE_SESSION_MS_DEFAULT)}}m(h2BudgetFromEnv,"h2BudgetFromEnv"),n(h2BudgetFromEnv,"h2BudgetFromEnv");function createH2Governor(e,r){const{NGHTTP2_ENHANCE_YOUR_CALM:u,NGHTTP2_REFUSED_STREAM:S}=require("node:http2").constants,a=new Map;let g=0;const d=n(s=>{s.idle&&(clearTimeout(s.idle),s.idle=void 0)},"disarm"),p=n((s,i)=>{d(i),!(e.idleSessionMs<=0||i.open>0)&&(i.idle=setTimeout(()=>{s.destroyed||s.closed||(r("session-reclaimed",{idleMs:e.idleSessionMs,sessions:a.size}),a.delete(s),s.close())},e.idleSessionMs),i.idle.unref?.())},"arm"),l=n(()=>{for(const[s,i]of a)if(!(i.open>0||s.destroyed))return d(i),a.delete(s),r("session-reclaimed",{reason:"cap",sessions:a.size+1,maxSessions:e.maxSessions}),s.close(),!0;return!1},"reclaimOldestIdle");return{admitSession(s){if(e.maxSessions>0&&a.size>=e.maxSessions&&!l()){r("session-refused",{sessions:a.size,maxSessions:e.maxSessions,streams:g});try{s.goaway(u)}catch{}try{s.close()}catch{}return!1}const i={open:0};return a.set(s,i),p(s,i),s.once("close",()=>{d(i),a.delete(s)}),!0},admitStream(s,i){const h=a.get(s);if(!h)return!0;if(e.maxStreams>0&&g>=e.maxStreams){r("stream-refused",{streams:g,maxStreams:e.maxStreams,sessions:a.size});try{i.close(S)}catch{}return!1}return g+=1,h.open+=1,d(h),i.once("close",()=>{g=Math.max(0,g-1),h.open=Math.max(0,h.open-1),h.open===0&&a.has(s)&&p(s,h)}),!0},dispose(){for(const s of a.values())d(s);a.clear()}}}m(createH2Governor,"createH2Governor"),n(createH2Governor,"createH2Governor");async function startGateway(e,r){const u=e.https!==!1,S=e.ports?.length?e.ports:[443],a=e.scanTtlMs??1500,g=e.startupTimeoutMs??12e4,d=e.sweepMs??1e4,p=e.trafficFlushMs??5e3;let l=!1;const s=process.env.LENSMCP_EVENT_FILE??path.join(r.root,".lensmcp","events.jsonl"),i=(0,scope_1.readLensScope)(r.root).key,h=r.projectsConfigurations?.projects??{},C=(0,discovery_1.projectSourceRoots)(r.root,h,r.projectDependencies),{routes:F,services:v}=(0,discovery_1.discoverRoutes)(r.root,h,void 0,i,C);if(F.length===0)throw new Error("[gateway] no project declares a `cluster` field \u2014 nothing to route.");const b=new route_registry_1.RouteRegistry;b.register({wsKey:i,root:r.root,routes:F,services:v});const N=[];let U=n(()=>{},"refreshCert");const Y=n(()=>{(0,route_registry_1.rebuildRoutesInPlace)(N,b),U()},"rebuildRoutes");Y();const{serviceKeys:Q,keyToProject:Z,keyToWorkspace:ee}=(0,service_keys_1.loadServiceKeys)(r.root,v,i),te=(0,client_ip_1.createClientIpResolver)({...(0,client_ip_1.clientIpOptionsFromEnv)(),...e.trustProxyHops!==void 0?{trustProxyHops:e.trustProxyHops}:{},...e.clientIpHeader?{clientIpHeader:e.clientIpHeader}:{},...e.clientIpTrustedProxies?{clientIpTrustedProxies:e.clientIpTrustedProxies}:{}}),T={root:r.root,wsKey:i,eventFile:s,routes:N,registry:b,rebuildRoutes:Y,services:v,serviceKeys:Q,keyToProject:Z,keyToWorkspace:ee,clientIp:te,bodyStallMs:e.bodyStallMs??types_1.BODY_STALL_MS,scanTtlMs:a,startupTimeoutMs:g,sweepMs:d,trafficFlushMs:p,https:u,projectRoots:Object.fromEntries(Object.entries(r.projectsConfigurations?.projects??{}).map(([t,o])=>[t,path.resolve(r.root,o.root)])),projectSourceRoots:C,stopped:n(()=>l,"stopped")},f=(0,observability_1.createObservability)(s,{trafficFlushMs:p}),re=createClientErrorLogGate(),x=h2BudgetFromEnv(),se=createClientErrorLogGate(3e4),$=createH2Governor(x,(t,o)=>{se(t)&&console.warn(`[gateway] h2 aggregate budget: ${t} (${JSON.stringify(o)}). These are the FRONT DOOR's ceilings, not an upstream's \u2014 raise/disable with LENSMCP_MAX_H2_SESSIONS / LENSMCP_MAX_H2_STREAMS / LENSMCP_H2_IDLE_MS / LENSMCP_MAX_CONNECTIONS (0 = unbounded).`),f.emit(t==="session-reclaimed"?"info":"warning",`h2 aggregate budget: ${t}`,`gateway-h2-budget:${t}`,{kind:"h2-aggregate-budget",event:t,project:"gateway",...o})}),P=(0,lifecycle_1.createServiceLayer)(T,f),O=(0,lens_children_1.createLensChildren)(T,f,e),H=new Map;let B;try{B=(0,control_1.startControlServer)({rt:T,killService:n((t,o)=>P.killSpawned(t,o),"killService"),onRegister:n(async t=>{retirePreviousWorkspace(H,t.wsKey,"re-registered");const o=await O.hostWorkspaceDashboard(t),w=await O.hostWorkspaceApps(t);H.set(t.wsKey,()=>{try{o?.()}finally{w()}})},"onRegister"),onUnregister:n(t=>{retirePreviousWorkspace(H,t.wsKey,"unregistered")},"onUnregister")})}catch(t){console.warn("[gateway] control plane failed to start (multi-workspace register disabled):",t.message)}const L=(0,proxy_1.createProxy)(T,f,P),X=buildEdgeVerifierPool(()=>T.routes),K=(0,auth_1.createEdgeAuth)(T,f,X);let G;if(e.middleware){const t=require(path.resolve(r.root,e.middleware));G=t.default??t}const oe=n(t=>{if(G)try{G(t.req)}catch(o){f.traceStep(t.trace,"auth",{mode:"middleware",ok:!1,reason:o.message}),t.route&&f.finishTrace(t.trace,t.route.project,401),t.sendError(401,"unauthorized",`Gateway middleware rejected the request: ${o.message}`)}},"builtinMiddleware"),J=e.hooks??{},V=(0,hooks_1.createHooks)({...J,afterAuth:[oe,...J.afterAuth??[]]}),z=(0,handler_1.createHandler)({rt:T,obs:f,auth:K,proxy:L,hooks:V}),ne=(0,upgrade_1.createUpgrade)({rt:T,auth:K,proxy:L,hooks:V}),ae=f.startEdgeFlusher(),ie=P.startSweeper();await O.bootSingletonsAndApps();for(const t of v)t.decl.eager&&P.ensureUp(t);let R,W,k;if(u){const t=require("../../../basic-ssl"),o=(0,service_keys_1.gatewayCacheDir)(r.root);k=n(()=>t.getCertificateSync(o,"gateway",T.routes.map(w=>w.host).filter(w=>!!w)),"mintCert"),R=k(),W=t.caCertPath()}const j=[],I=[],q=e.maxConnections??resolveMaxConnections(process.env.LENSMCP_MAX_CONNECTIONS);for(const t of S){const o=R?require("node:http2").createSecureServer({key:R,cert:R,allowHTTP1:!0,maxSessionMemory:512,settings:{maxConcurrentStreams:512},peerMaxConcurrentStreams:512,streamResetBurst:e.h2ResetBurst??types_1.GATEWAY_H2_RESET_BURST,streamResetRate:e.h2ResetRate??types_1.GATEWAY_H2_RESET_RATE},(y,_)=>z(y,_)):http.createServer(z);o.on("upgrade",ne),o.on("error",y=>console.error(`[gateway] port ${t}: ${y.code}`)),o.on("connection",guardInboundSocket),o.on("secureConnection",guardInboundSocket),o.on("tlsClientError",(y,_)=>_.destroy()),o.on("clientError",(y,_)=>{const c=y,E=classifyClientError(c.code,c.message);if(E.report&&re(E.cause)){const M=_.remoteAddress??"unknown",A=E.status===null?"dropped":String(E.status);console.warn(`[gateway] inbound H1 clientError from ${M}: ${E.cause} (${c.code??c.message}${c.bytesParsed!==void 0?`, bytesParsed=${c.bytesParsed}`:""}) \u2192 ${A}. This status is the GATEWAY's, not the upstream service's.`),f.emit("warning",`inbound clientError: ${E.cause} \u2192 ${A}`,`gateway-client-error:${E.cause}`,{kind:"gateway-client-error",cause:E.cause,code:c.code??null,status:E.status,peer:M,bytesParsed:c.bytesParsed??null})}E.status!==null&&_.writable&&_.end(`HTTP/1.1 ${E.status} ${CLIENT_ERROR_REASON[E.status]}\r
|
|
1
|
+
"use strict";var pe=Object.defineProperty;var w=(e,r)=>pe(e,"name",{value:r,configurable:!0});var ue=Object.defineProperty,m=w((e,r)=>ue(e,"name",{value:r,configurable:!0}),"m"),le=Object.defineProperty,n=m((e,r)=>le(e,"name",{value:r,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GATEWAY_H2_IDLE_SESSION_MS_DEFAULT=exports.GATEWAY_MAX_H2_STREAMS_DEFAULT=exports.GATEWAY_MAX_H2_SESSIONS_DEFAULT=exports.GATEWAY_MAX_CONNECTIONS_DEFAULT=exports.BENIGN_SOCKET_ERRNOS=void 0,exports.buildEdgeVerifierPool=buildEdgeVerifierPool,exports.classifyClientError=classifyClientError,exports.createClientErrorLogGate=createClientErrorLogGate,exports.retirePreviousWorkspace=retirePreviousWorkspace,exports.resolveMaxConnections=resolveMaxConnections,exports.h2BudgetFromEnv=h2BudgetFromEnv,exports.createH2Governor=createH2Governor,exports.startGateway=startGateway;const tslib_1=require("tslib"),http=tslib_1.__importStar(require("node:http")),path=tslib_1.__importStar(require("node:path")),discovery_1=require("./discovery"),scope_1=require("./scope"),route_registry_1=require("./route-registry"),control_1=require("./control"),workspace_registry_1=require("./workspace-registry"),service_keys_1=require("./service-keys"),client_ip_1=require("../client-ip"),workspace_log_1=require("./workspace-log"),observability_1=require("./observability"),lifecycle_1=require("./lifecycle"),lens_children_1=require("./lens-children"),proxy_1=require("./proxy"),auth_1=require("./auth"),hooks_1=require("./hooks"),handler_1=require("./handler"),upgrade_1=require("./upgrade"),jwks_verify_1=require("../jwks-verify"),types_1=require("./types");function insecureLocalFetch(e,r){return new Promise((l,S)=>{const a=(e.startsWith("https:")?require("node:https"):require("node:http")).request(e,{method:"GET",headers:r?.headers,rejectUnauthorized:!1},g=>{const d=[];g.on("data",p=>d.push(p)),g.on("end",()=>{const p=g.statusCode??0,u=Buffer.concat(d).toString("utf8");l({ok:p>=200&&p<300,status:p,json:n(async()=>JSON.parse(u),"json")})})});a.on("error",S),a.end()})}w(insecureLocalFetch,"insecureLocalFetch"),m(insecureLocalFetch,"insecureLocalFetch"),n(insecureLocalFetch,"insecureLocalFetch");function buildEdgeVerifierPool(e){const r=process.env.LENSMCP_GW_JWKS_URL,l=process.env.LENSMCP_GW_JWT_ISS,S=new Map;let a;const g=n((d,p)=>{console.log(`[gateway] edge JWT: verifying via JWKS ${d}${p}`);const u=(0,jwks_verify_1.createJwksVerifier)({jwksUrl:d,...l?{issuer:l}:{},fetchImpl:insecureLocalFetch});return u.refresh().catch(s=>console.warn("[gateway] edge JWKS warm failed (will retry):",s.message)),u},"make");return{for(d){if(r)return a??=g(r,"");const p=d.split(":")[0].toLowerCase();let u;for(const i of e()){const h=i.host;if(typeof h!="string"||!/^auth\./.test(h)||h.startsWith("internal."))continue;const v=h.slice(5);(p===v||p.endsWith(`.${v}`))&&(!u||v.length>u.length)&&(u=v)}if(!u)return;let s=S.get(u);return s||(s=g(`https://auth.${u}/jwks.json`,` (auto-derived for apex ${u})`),S.set(u,s)),s},stop(){a?.stop();for(const d of S.values())d.stop()}}}w(buildEdgeVerifierPool,"buildEdgeVerifierPool"),m(buildEdgeVerifierPool,"buildEdgeVerifierPool"),n(buildEdgeVerifierPool,"buildEdgeVerifierPool"),exports.BENIGN_SOCKET_ERRNOS=new Set(["ECONNRESET","EPIPE","ETIMEDOUT","ECONNABORTED","ECANCELED"]);function classifyClientError(e,r){return e&&exports.BENIGN_SOCKET_ERRNOS.has(e)?{status:null,report:!1,cause:"client-abort"}:e==="HPE_INVALID_EOF_STATE"?{status:null,report:!1,cause:"truncated-at-eof"}:e==="ERR_HTTP_REQUEST_TIMEOUT"?{status:408,report:!0,cause:"request-timeout"}:e==="HPE_HEADER_OVERFLOW"?{status:431,report:!0,cause:"header-overflow"}:e?.startsWith("HPE_")?{status:400,report:!0,cause:"parse-error"}:{status:400,report:!0,cause:e??r??"unknown"}}w(classifyClientError,"classifyClientError"),m(classifyClientError,"classifyClientError"),n(classifyClientError,"classifyClientError");const CLIENT_ERROR_REASON={400:"Bad Request",408:"Request Timeout",431:"Request Header Fields Too Large"};function createClientErrorLogGate(e=1e4){const r=new Map;return l=>{const S=Date.now(),a=r.get(l)??0;return S-a<e?!1:(r.set(l,S),!0)}}w(createClientErrorLogGate,"createClientErrorLogGate"),m(createClientErrorLogGate,"createClientErrorLogGate"),n(createClientErrorLogGate,"createClientErrorLogGate");function guardInboundSocket(e){e.on("error",r=>{exports.BENIGN_SOCKET_ERRNOS.has(r.code??"")||console.warn(`[gateway] inbound socket error (${r.code??r.message}) \u2014 dropping this connection only`),e.destroy()})}w(guardInboundSocket,"guardInboundSocket"),m(guardInboundSocket,"guardInboundSocket"),n(guardInboundSocket,"guardInboundSocket");function retirePreviousWorkspace(e,r,l){const S=e.get(r);if(!S)return!1;e.delete(r),l==="re-registered"&&console.log(`[gateway] workspace '${r}' re-registered \u2014 retiring the children of its previous registration first.`);try{S()}catch(a){console.warn(`[gateway] could not fully retire the previous registration of '${r}' (${l}): ${a.message}`)}return!0}w(retirePreviousWorkspace,"retirePreviousWorkspace"),m(retirePreviousWorkspace,"retirePreviousWorkspace"),n(retirePreviousWorkspace,"retirePreviousWorkspace"),exports.GATEWAY_MAX_CONNECTIONS_DEFAULT=512,exports.GATEWAY_MAX_H2_SESSIONS_DEFAULT=64,exports.GATEWAY_MAX_H2_STREAMS_DEFAULT=4096,exports.GATEWAY_H2_IDLE_SESSION_MS_DEFAULT=3e5;function parseBudget(e,r){if(e===void 0||e.trim()==="")return r;const l=Number(e);return!Number.isFinite(l)||l<0?r:Math.floor(l)}w(parseBudget,"parseBudget"),m(parseBudget,"parseBudget"),n(parseBudget,"parseBudget");function resolveMaxConnections(e){return parseBudget(e,exports.GATEWAY_MAX_CONNECTIONS_DEFAULT)}w(resolveMaxConnections,"resolveMaxConnections"),m(resolveMaxConnections,"resolveMaxConnections"),n(resolveMaxConnections,"resolveMaxConnections");function h2BudgetFromEnv(e=process.env){return{maxSessions:parseBudget(e.LENSMCP_MAX_H2_SESSIONS,exports.GATEWAY_MAX_H2_SESSIONS_DEFAULT),maxStreams:parseBudget(e.LENSMCP_MAX_H2_STREAMS,exports.GATEWAY_MAX_H2_STREAMS_DEFAULT),idleSessionMs:parseBudget(e.LENSMCP_H2_IDLE_MS,exports.GATEWAY_H2_IDLE_SESSION_MS_DEFAULT)}}w(h2BudgetFromEnv,"h2BudgetFromEnv"),m(h2BudgetFromEnv,"h2BudgetFromEnv"),n(h2BudgetFromEnv,"h2BudgetFromEnv");function createH2Governor(e,r){const{NGHTTP2_ENHANCE_YOUR_CALM:l,NGHTTP2_REFUSED_STREAM:S}=require("node:http2").constants,a=new Map;let g=0;const d=n(s=>{s.idle&&(clearTimeout(s.idle),s.idle=void 0)},"disarm"),p=n((s,i)=>{d(i),!(e.idleSessionMs<=0||i.open>0)&&(i.idle=setTimeout(()=>{s.destroyed||s.closed||(r("session-reclaimed",{idleMs:e.idleSessionMs,sessions:a.size}),a.delete(s),s.close())},e.idleSessionMs),i.idle.unref?.())},"arm"),u=n(()=>{for(const[s,i]of a)if(!(i.open>0||s.destroyed))return d(i),a.delete(s),r("session-reclaimed",{reason:"cap",sessions:a.size+1,maxSessions:e.maxSessions}),s.close(),!0;return!1},"reclaimOldestIdle");return{admitSession(s){if(e.maxSessions>0&&a.size>=e.maxSessions&&!u()){r("session-refused",{sessions:a.size,maxSessions:e.maxSessions,streams:g});try{s.goaway(l)}catch{}try{s.close()}catch{}return!1}const i={open:0};return a.set(s,i),p(s,i),s.once("close",()=>{d(i),a.delete(s)}),!0},admitStream(s,i){const h=a.get(s);if(!h)return!0;if(e.maxStreams>0&&g>=e.maxStreams){r("stream-refused",{streams:g,maxStreams:e.maxStreams,sessions:a.size});try{i.close(S)}catch{}return!1}return g+=1,h.open+=1,d(h),i.once("close",()=>{g=Math.max(0,g-1),h.open=Math.max(0,h.open-1),h.open===0&&a.has(s)&&p(s,h)}),!0},dispose(){for(const s of a.values())d(s);a.clear()}}}w(createH2Governor,"createH2Governor"),m(createH2Governor,"createH2Governor"),n(createH2Governor,"createH2Governor");async function startGateway(e,r){const l=e.https!==!1,S=e.ports?.length?e.ports:[443],a=e.scanTtlMs??1500,g=e.startupTimeoutMs??12e4,d=e.sweepMs??1e4,p=e.trafficFlushMs??5e3;let u=!1;const s=process.env.LENSMCP_EVENT_FILE??path.join(r.root,".lensmcp","events.jsonl"),i=(0,scope_1.readLensScope)(r.root).key,h=r.projectsConfigurations?.projects??{},v=(0,discovery_1.projectSourceRoots)(r.root,h,r.projectDependencies),{routes:U,services:N}=(0,discovery_1.discoverRoutes)(r.root,h,void 0,i,v);if(U.length===0)throw new Error("[gateway] no project declares a `cluster` field \u2014 nothing to route.");const H=new route_registry_1.RouteRegistry;H.register({wsKey:i,root:r.root,routes:U,services:N});const R=[];let Y=n(()=>{},"refreshCert");const B=n(()=>{(0,route_registry_1.rebuildRoutesInPlace)(R,H),Y()},"rebuildRoutes");B();const{serviceKeys:Z,keyToProject:ee,keyToWorkspace:te}=(0,service_keys_1.loadServiceKeys)(r.root,N,i),re=(0,client_ip_1.createClientIpResolver)({...(0,client_ip_1.clientIpOptionsFromEnv)(),...e.trustProxyHops!==void 0?{trustProxyHops:e.trustProxyHops}:{},...e.clientIpHeader?{clientIpHeader:e.clientIpHeader}:{},...e.clientIpTrustedProxies?{clientIpTrustedProxies:e.clientIpTrustedProxies}:{}}),T={root:r.root,wsKey:i,eventFile:s,routes:R,registry:H,rebuildRoutes:B,services:N,serviceKeys:Z,keyToProject:ee,keyToWorkspace:te,clientIp:re,bodyStallMs:e.bodyStallMs??types_1.BODY_STALL_MS,scanTtlMs:a,startupTimeoutMs:g,sweepMs:d,trafficFlushMs:p,https:l,projectRoots:Object.fromEntries(Object.entries(r.projectsConfigurations?.projects??{}).map(([t,o])=>[t,path.resolve(r.root,o.root)])),projectSourceRoots:v,stopped:n(()=>u,"stopped")},f=(0,observability_1.createObservability)(s,{trafficFlushMs:p}),se=createClientErrorLogGate(),P=h2BudgetFromEnv(),oe=createClientErrorLogGate(3e4),$=createH2Governor(P,(t,o)=>{oe(t)&&console.warn(`[gateway] h2 aggregate budget: ${t} (${JSON.stringify(o)}). These are the FRONT DOOR's ceilings, not an upstream's \u2014 raise/disable with LENSMCP_MAX_H2_SESSIONS / LENSMCP_MAX_H2_STREAMS / LENSMCP_H2_IDLE_MS / LENSMCP_MAX_CONNECTIONS (0 = unbounded).`),f.emit(t==="session-reclaimed"?"info":"warning",`h2 aggregate budget: ${t}`,`gateway-h2-budget:${t}`,{kind:"h2-aggregate-budget",event:t,project:"gateway",...o})}),O=(0,lifecycle_1.createServiceLayer)(T,f),L=(0,lens_children_1.createLensChildren)(T,f,e),G=new Map;let X;try{X=(0,control_1.startControlServer)({rt:T,killService:n((t,o)=>O.killSpawned(t,o),"killService"),onRegister:n(async t=>{retirePreviousWorkspace(G,t.wsKey,"re-registered");const o=await L.hostWorkspaceDashboard(t),A=await L.hostWorkspaceApps(t);G.set(t.wsKey,()=>{try{o?.()}finally{A()}})},"onRegister"),onUnregister:n(t=>{retirePreviousWorkspace(G,t.wsKey,"unregistered")},"onUnregister")})}catch(t){console.warn("[gateway] control plane failed to start (multi-workspace register disabled):",t.message)}const b=(0,proxy_1.createProxy)(T,f,O),K=buildEdgeVerifierPool(()=>T.routes),V=(0,auth_1.createEdgeAuth)(T,f,K);let W;if(e.middleware){const t=require(path.resolve(r.root,e.middleware));W=t.default??t}const ne=n(t=>{if(W)try{W(t.req)}catch(o){f.traceStep(t.trace,"auth",{mode:"middleware",ok:!1,reason:o.message}),t.route&&f.finishTrace(t.trace,t.route.project,401),t.sendError(401,"unauthorized",`Gateway middleware rejected the request: ${o.message}`)}},"builtinMiddleware"),J=e.hooks??{},z=(0,hooks_1.createHooks)({...J,afterAuth:[ne,...J.afterAuth??[]]}),Q=(0,handler_1.createHandler)({rt:T,obs:f,auth:V,proxy:b,hooks:z}),ae=(0,upgrade_1.createUpgrade)({rt:T,auth:V,proxy:b,hooks:z}),ie=f.startEdgeFlusher(),ce=O.startSweeper();await L.bootSingletonsAndApps();for(const t of N)t.decl.eager&&O.ensureUp(t);let x,j,k;if(l){const t=require("../../../basic-ssl"),o=(0,service_keys_1.gatewayCacheDir)(r.root);k=n(()=>t.getCertificateSync(o,"gateway",T.routes.map(A=>A.host).filter(A=>!!A)),"mintCert"),x=k(),j=t.caCertPath()}const q=[],I=[],F=e.maxConnections??resolveMaxConnections(process.env.LENSMCP_MAX_CONNECTIONS);for(const t of S){const o=x?require("node:http2").createSecureServer({key:x,cert:x,allowHTTP1:!0,maxSessionMemory:512,settings:{maxConcurrentStreams:512},peerMaxConcurrentStreams:512,streamResetBurst:e.h2ResetBurst??types_1.GATEWAY_H2_RESET_BURST,streamResetRate:e.h2ResetRate??types_1.GATEWAY_H2_RESET_RATE},(y,E)=>Q(y,E)):http.createServer(Q);o.on("upgrade",ae),o.on("error",y=>console.error(`[gateway] port ${t}: ${y.code}`)),o.on("connection",guardInboundSocket),o.on("secureConnection",guardInboundSocket),o.on("tlsClientError",(y,E)=>E.destroy()),o.on("clientError",(y,E)=>{const c=y,_=classifyClientError(c.code,c.message);if(_.report&&se(_.cause)){const C=E.remoteAddress??"unknown",M=_.status===null?"dropped":String(_.status);console.warn(`[gateway] inbound H1 clientError from ${C}: ${_.cause} (${c.code??c.message}${c.bytesParsed!==void 0?`, bytesParsed=${c.bytesParsed}`:""}) \u2192 ${M}. This status is the GATEWAY's, not the upstream service's.`),f.emit("warning",`inbound clientError: ${_.cause} \u2192 ${M}`,`gateway-client-error:${_.cause}`,{kind:"gateway-client-error",cause:_.cause,code:c.code??null,status:_.status,peer:C,bytesParsed:c.bytesParsed??null})}_.status!==null&&E.writable&&E.end(`HTTP/1.1 ${_.status} ${CLIENT_ERROR_REASON[_.status]}\r
|
|
2
2
|
\r
|
|
3
|
-
`),
|
|
3
|
+
`),E.destroy()}),o.keepAliveTimeout=types_1.GATEWAY_KEEPALIVE_TIMEOUT_MS,o.headersTimeout=e.headersTimeoutMs??types_1.GATEWAY_HEADERS_TIMEOUT_MS,F>0&&(o.maxConnections=F);const A=e.connectionsCheckingIntervalMs??types_1.GATEWAY_CONN_CHECK_MS;if(A>0&&(o.connectionsCheckingInterval=A),x!=null){const y=o,{NGHTTP2_CANCEL:E}=require("node:http2").constants;y.on("session",c=>{if(!$.admitSession(c)){c.on("error",()=>{});return}let _=0,C=0;c.on("stream",M=>{$.admitStream(c,M)&&M.once("close",()=>{c.destroyed?C+=1:M.rstCode===E&&(_+=1)})}),c.once("close",()=>{C!==0&&(console.warn(`[gateway] h2 session closed with ${C} stream(s) in flight after ${_} client reset(s) \u2014 every in-flight fetch on that connection failed at once (ERR_HTTP2_PROTOCOL_ERROR in the browser). Reset budget: LENSMCP_H2_RESET_BURST/LENSMCP_H2_RESET_RATE (issues/foodguard/14).`),f.emit("warning",`h2 session lost with ${C} stream(s) in flight`,"gateway-h2-session-lost",{kind:"h2-session-lost",project:"gateway",inflight:C,clientResets:_}))}),c.on("error",M=>{const de=M.code??M.message;console.warn(`[gateway] h2 session error (${de}) \u2014 dropping this session only`),c.destroyed||c.destroy()})}),y.on("sessionError",c=>{console.warn(`[gateway] h2 sessionError: ${c.code??c.message}`)})}await new Promise(y=>{o.listen(t,()=>{const E=o.address()?.port??t;I.push(E),console.log(`[gateway] Listening on ${x?"https":"http"}://localhost:${E}`),y()})}),q.push(o)}k&&(Y=n(()=>{const t=k();for(const o of q)o.setSecureContext?.({key:t,cert:t})},"refreshCert")),console.log("[gateway] Routes:");for(const t of R){const o=t.pool?`pods@${t.pool.dir}`:t.target;console.log(`[gateway] ${t.host??"(default)"} \u2192 ${o}${t.prependPrefix?` (+${t.prependPrefix})`:""}${t.internal?" [internal: no middleware]":""} [${t.project}]`)}j&&console.log(`[gateway] CA: ${j} \u2014 one-time setup via the trust executor.`);const D=n(t=>t>0?String(t):"unbounded","unbounded");return console.log(`[gateway] front-door budget: \u2264${D(F)} connections, \u2264${D(P.maxSessions)} h2 sessions (each \u2264512 MB session memory, \u2264512 streams), \u2264${D(P.maxStreams)} open streams in total, idle h2 session reclaimed after ${P.idleSessionMs>0?`${Math.round(P.idleSessionMs/1e3)}s`:"never"}. Override: LENSMCP_MAX_CONNECTIONS / LENSMCP_MAX_H2_SESSIONS / LENSMCP_MAX_H2_STREAMS / LENSMCP_H2_IDLE_MS (0 = unbounded).`),f.emit("info",`gateway up: ${R.length} routes on ${I.join("/")}`,"cluster-gateway",{kind:"gateway-up",project:"gateway",ports:I,routes:R.map(t=>({host:t.host??"(default)",project:t.project,mode:t.pool?"pods":"tcp",internal:!!t.internal,prependPrefix:t.prependPrefix}))}),{ports:I,routes:R,services:N,stop:n(async()=>{if(!u){u=!0,clearInterval(ie),clearInterval(ce),f.emit("info","gateway down","cluster-gateway",{kind:"gateway-down",project:"gateway"}),K.stop(),X?.close(),(0,workspace_registry_1.unregisterWorkspace)(i);for(const t of N)O.killSpawned(t,"gateway shutdown");await L.reapAll(),await Promise.all(q.map(t=>new Promise(o=>{let A=!1;const y=n(()=>{A||(A=!0,o())},"done"),E=t;t.close(()=>y());try{E.closeIdleConnections?.()}catch{}setTimeout(()=>{try{E.closeAllConnections?.()}catch{}y()},types_1.GATEWAY_STOP_GRACE_MS).unref?.()}))),b.closeProxy(),b.destroyAgents(),$.dispose(),(0,workspace_log_1.closeWorkspaceLogs)()}},"stop"),...T.lensSupervisor?{lensSupervisor:T.lensSupervisor}:{}}}w(startGateway,"startGateway"),m(startGateway,"startGateway"),n(startGateway,"startGateway");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var S=Object.defineProperty;var a=(e,r)=>S(e,"name",{value:r,configurable:!0});var l=Object.defineProperty,i=a((e,r)=>l(e,"name",{value:r,configurable:!0}),"i"),j=Object.defineProperty,p=i((e,r)=>j(e,"name",{value:r,configurable:!0}),"p");Object.defineProperty(exports,"__esModule",{value:!0}),exports.gatewayCacheDir=gatewayCacheDir,exports.serviceKeyId=serviceKeyId,exports.loadServiceKeys=loadServiceKeys,exports.adoptServiceKeys=adoptServiceKeys;const tslib_1=require("tslib"),node_crypto_1=require("node:crypto"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path"));function gatewayCacheDir(e){return path.join(e,"node_modules",".cache","davnx-webpack")}a(gatewayCacheDir,"gatewayCacheDir"),i(gatewayCacheDir,"gatewayCacheDir"),p(gatewayCacheDir,"gatewayCacheDir");function serviceKeyId(e,r){return`${e??""} ${r}`}a(serviceKeyId,"serviceKeyId"),i(serviceKeyId,"serviceKeyId"),p(serviceKeyId,"serviceKeyId");function loadServiceKeys(e,r,y){const v=gatewayCacheDir(e),n=path.join(v,"service-keys.json");let t={};try{t=JSON.parse(fs.readFileSync(n,"utf8"))}catch{}let d=!1;for(const c of r)t[c.project]||(t[c.project]=(0,node_crypto_1.randomBytes)(16).toString("hex"),d=!0);if(d)try{fs.mkdirSync(v,{recursive:!0}),fs.writeFileSync(n,JSON.stringify(t,null,2))}catch{}const o=y??r[0]?.wsKey,u={};for(const[c,K]of Object.entries(t))u[serviceKeyId(o,c)]=K;const s=new Map(Object.entries(t).map(([c,K])=>[K,c])),f=new Map(o?Object.values(t).map(c=>[c,o]):[]);return{serviceKeys:u,keyToProject:s,keyToWorkspace:f,byProject:t}}a(loadServiceKeys,"loadServiceKeys"),i(loadServiceKeys,"loadServiceKeys"),p(loadServiceKeys,"loadServiceKeys");function adoptServiceKeys(e,r,y,v){const n=v??y[0]?.wsKey,{byProject:t}=loadServiceKeys(r,y,n),d=[];for(const o of y){const u=serviceKeyId(o.wsKey??n,o.project),s=t[o.project];if(!s||e.serviceKeys[u]===s)continue;e.serviceKeys[u]=s,e.keyToProject.set(s,o.project);const f=o.wsKey??n;f&&e.keyToWorkspace?.set(s,f),d.push(o.project)}return{added:d}}a(adoptServiceKeys,"adoptServiceKeys"),i(adoptServiceKeys,"adoptServiceKeys"),p(adoptServiceKeys,"adoptServiceKeys");
|
|
@@ -13,6 +13,7 @@ import type { GatewayExecutorSchema } from '../schema';
|
|
|
13
13
|
import type { AuthPolicy, Attrs } from '../manifest';
|
|
14
14
|
import type { GatewayErrorReason } from '../gateway-errors';
|
|
15
15
|
import type { RouteRegistry } from './route-registry';
|
|
16
|
+
import type { PodFaults } from './pod-output';
|
|
16
17
|
export type { Attrs };
|
|
17
18
|
export interface GatewayContext {
|
|
18
19
|
root: string;
|
|
@@ -230,6 +231,9 @@ export interface ServiceCtl {
|
|
|
230
231
|
spawnAt?: number;
|
|
231
232
|
lastErrors?: string[];
|
|
232
233
|
buildFailed?: boolean;
|
|
234
|
+
/** The faults REPORTED to the lens and not yet taken back — what decides when `service-recovered` is
|
|
235
|
+
* announced. Not `buildFailed`, which is the gateway's own control flag (pod-output.ts). */
|
|
236
|
+
faults?: PodFaults;
|
|
233
237
|
/** Throttle state for the 'service error' event: the last-emitted error signature + when. Stops a
|
|
234
238
|
* crash-looping pod (re-printing the same error line every restart) from flooding the event bus —
|
|
235
239
|
* we re-emit only when the error line CHANGES or after {@link SERVICE_ERROR_THROTTLE_MS}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var A=Object.defineProperty;var L=(_,E)=>A(_,"name",{value:E,configurable:!0});var M=Object.defineProperty,e=L((_,E)=>M(_,"name",{value:E,configurable:!0}),"e"),T=Object.defineProperty,R=e((_,E)=>T(_,"name",{value:E,configurable:!0}),"R");Object.defineProperty(exports,"__esModule",{value:!0}),exports.GATEWAY_H2_RESET_RATE=exports.GATEWAY_H2_RESET_BURST=exports.BODY_STALL_MS=exports.GATEWAY_CONN_CHECK_MS=exports.GATEWAY_MAX_CONNECTIONS=exports.GATEWAY_STOP_GRACE_MS=exports.GATEWAY_HEADERS_TIMEOUT_MS=exports.GATEWAY_KEEPALIVE_TIMEOUT_MS=exports.LENS_REQUEST_RECOVERY_WAIT_MS=exports.LENS_REPLACEMENT_DRAIN_MS=exports.LENS_REPLACEMENT_READY_MS=exports.LENS_RESTART_MODE=exports.LENS_RECYCLE_KILL_GRACE_MS=exports.LENS_PARKED_PORT_REPROBE_MS=exports.MAX_PORT_CONFLICT_RETRIES=exports.CHILD_START_FAIL_MS=exports.PORT_FREE_POLL_MS=exports.PORT_FREE_WAIT_MS=exports.LENS_PROBE_BOOT_GRACE_MS=exports.LENS_PROBE_COOLDOWN_MS=exports.LENS_PROBE_TIMEOUT_MS=exports.LENS_PROBE_FAILS=exports.LENS_PROBE_GRACE_MS=exports.POD_ROLL_READY_MS=exports.POD_RECYCLE_MODE=exports.POD_WATCHER_SILENT=exports.POD_WATCHER_UNVERIFIED=exports.LENS_WATCH_SCOPE_ENABLED=exports.LENS_WATCHER_UNVERIFIED=exports.LENS_WATCHER_PROBE_ENABLED=exports.LENS_PROBE_ENABLED=exports.POD_STALE_RECYCLE_COOLDOWN_MS=exports.POD_STALE_SCAN_MS=exports.POD_RECYCLE_SETTLE_MS=exports.POD_STALE_GRACE_MS=exports.POD_MAX_AGE_MS=exports.POD_RECYCLE_ENABLED=exports.WEDGE_RECYCLE_GRACE_MS=exports.POD_ALIVE_PATH=exports.POD_ALIVE_PROBE_TIMEOUT_MS=exports.POD_SLOW_FIRST_BYTE_MS=exports.POD_RESPONSE_TIMEOUT_MS=exports.UPSTREAM_HEAL_STEP_MS=exports.UPSTREAM_HEAL_WINDOW_MS=exports.SERVICE_RESTART_WINDOW_MS=exports.SERVICE_MAX_RESTARTS=exports.SERVICE_ERROR_THROTTLE_MS=void 0;function envInt(_,E,O=!1){const S=Number(process.env[_]);return!Number.isFinite(S)||S<0?E:S===0?O?0:E:S}L(envInt,"envInt"),e(envInt,"envInt"),R(envInt,"envInt"),exports.SERVICE_ERROR_THROTTLE_MS=5e3,exports.SERVICE_MAX_RESTARTS=5,exports.SERVICE_RESTART_WINDOW_MS=6e4,exports.UPSTREAM_HEAL_WINDOW_MS=8e3,exports.UPSTREAM_HEAL_STEP_MS=300,exports.POD_RESPONSE_TIMEOUT_MS=(()=>{const _=Number(process.env.LENSMCP_POD_RESPONSE_TIMEOUT_MS);return Number.isFinite(_)&&_>0?_:3e4})(),exports.POD_SLOW_FIRST_BYTE_MS=envInt("LENSMCP_POD_SLOW_FIRST_BYTE_MS",10*6e4,!0),exports.POD_ALIVE_PROBE_TIMEOUT_MS=envInt("LENSMCP_POD_ALIVE_PROBE_TIMEOUT_MS",1e3),exports.POD_ALIVE_PATH="/__lensmcp/alive",exports.WEDGE_RECYCLE_GRACE_MS=(()=>{const _=Number(process.env.LENSMCP_WEDGE_RECYCLE_GRACE_MS);return Number.isFinite(_)&&_>0?_:15e3})(),exports.POD_RECYCLE_ENABLED=process.env.LENSMCP_POD_RECYCLE!=="0",exports.POD_MAX_AGE_MS=envInt("LENSMCP_POD_MAX_AGE_MS",240*6e4,!0),exports.POD_STALE_GRACE_MS=envInt("LENSMCP_POD_STALE_GRACE_MS",1e4),exports.POD_RECYCLE_SETTLE_MS=envInt("LENSMCP_POD_RECYCLE_SETTLE_MS",8e3),exports.POD_STALE_SCAN_MS=envInt("LENSMCP_POD_STALE_SCAN_MS",3e4),exports.POD_STALE_RECYCLE_COOLDOWN_MS=envInt("LENSMCP_POD_STALE_RECYCLE_COOLDOWN_MS",6e4),exports.LENS_PROBE_ENABLED=process.env.LENSMCP_LENS_PROBE!=="0",exports.LENS_WATCHER_PROBE_ENABLED=process.env.LENSMCP_LENS_WATCHER_PROBE!=="0",exports.LENS_WATCHER_UNVERIFIED=process.env.LENSMCP_LENS_WATCHER_UNVERIFIED==="keep"?"keep":"recycle",exports.LENS_WATCH_SCOPE_ENABLED=process.env.LENSMCP_LENS_WATCH_SCOPE!=="0",exports.POD_WATCHER_UNVERIFIED=process.env.LENSMCP_POD_WATCHER_UNVERIFIED==="keep"?"keep":"recycle",exports.POD_WATCHER_SILENT=process.env.LENSMCP_POD_WATCHER_SILENT==="recycle"?"recycle":"keep",exports.POD_RECYCLE_MODE=process.env.LENSMCP_POD_RECYCLE_MODE==="in-place"?"in-place":"rolling",exports.POD_ROLL_READY_MS=envInt("LENSMCP_POD_ROLL_READY_MS",18e4),exports.LENS_PROBE_GRACE_MS=envInt("LENSMCP_LENS_PROBE_GRACE_MS",45e3),exports.LENS_PROBE_FAILS=envInt("LENSMCP_LENS_PROBE_FAILS",2),exports.LENS_PROBE_TIMEOUT_MS=envInt("LENSMCP_LENS_PROBE_TIMEOUT_MS",1e3),exports.LENS_PROBE_COOLDOWN_MS=envInt("LENSMCP_LENS_PROBE_COOLDOWN_MS",3e4),exports.LENS_PROBE_BOOT_GRACE_MS=envInt("LENSMCP_LENS_PROBE_BOOT_GRACE_MS",24e4),exports.PORT_FREE_WAIT_MS=envInt("LENSMCP_PORT_FREE_WAIT_MS",1e4),exports.PORT_FREE_POLL_MS=envInt("LENSMCP_PORT_FREE_POLL_MS",250),exports.CHILD_START_FAIL_MS=envInt("LENSMCP_CHILD_START_FAIL_MS",1e4),exports.MAX_PORT_CONFLICT_RETRIES=envInt("LENSMCP_MAX_PORT_CONFLICT_RETRIES",5),exports.LENS_PARKED_PORT_REPROBE_MS=envInt("LENSMCP_PARKED_PORT_REPROBE_MS",3e5),exports.LENS_RECYCLE_KILL_GRACE_MS=envInt("LENSMCP_RECYCLE_KILL_GRACE_MS",5e3),exports.LENS_RESTART_MODE=process.env.LENSMCP_LENS_RESTART_MODE==="in-place"?"in-place":"rolling",exports.LENS_REPLACEMENT_READY_MS=envInt("LENSMCP_LENS_REPLACEMENT_READY_MS",3e4),exports.LENS_REPLACEMENT_DRAIN_MS=envInt("LENSMCP_LENS_REPLACEMENT_DRAIN_MS",2e3,!0),exports.LENS_REQUEST_RECOVERY_WAIT_MS=envInt("LENSMCP_LENS_REQUEST_RECOVERY_WAIT_MS",15e3),exports.GATEWAY_KEEPALIVE_TIMEOUT_MS=envInt("LENSMCP_KEEPALIVE_TIMEOUT_MS",76e3),exports.GATEWAY_HEADERS_TIMEOUT_MS=envInt("LENSMCP_HEADERS_TIMEOUT_MS",6e4),exports.GATEWAY_STOP_GRACE_MS=envInt("LENSMCP_STOP_GRACE_MS",3e3),exports.GATEWAY_MAX_CONNECTIONS=envInt("LENSMCP_MAX_CONNECTIONS",0,!0),exports.GATEWAY_CONN_CHECK_MS=envInt("LENSMCP_CONN_CHECK_MS",0,!0),exports.BODY_STALL_MS=envInt("LENSMCP_BODY_STALL_MS",6e4,!0),exports.GATEWAY_H2_RESET_BURST=envInt("LENSMCP_H2_RESET_BURST",1e5),exports.GATEWAY_H2_RESET_RATE=envInt("LENSMCP_H2_RESET_RATE",1e4);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var U=Object.defineProperty;var y=(n,t)=>U(n,"name",{value:t,configurable:!0});var k=Object.defineProperty,p=y((n,t)=>k(n,"name",{value:t,configurable:!0}),"p"),m=Object.defineProperty,l=p((n,t)=>m(n,"name",{value:t,configurable:!0}),"l");Object.defineProperty(exports,"__esModule",{value:!0}),exports.createUpgrade=createUpgrade;const manifest_1=require("../manifest"),discovery_1=require("./discovery"),edge_1=require("./edge"),hmr_reload_1=require("./hmr-reload"),service_keys_1=require("./service-keys");function accountUpgrade(n,t){const a=n.svc;if(!a||t.destroyed)return;a.inflight+=1,a.lastUsed=Date.now();let d=!1;t.once("close",()=>{d||(d=!0,a.inflight-=1,a.lastUsed=Date.now())})}y(accountUpgrade,"accountUpgrade"),p(accountUpgrade,"accountUpgrade"),l(accountUpgrade,"accountUpgrade");function createUpgrade(n){const{rt:t,auth:a,proxy:d,hooks:u}=n,h=l(async(r,o,f)=>{(0,edge_1.stripOwnedHeaders)(r);const c=(0,edge_1.canonicalize)(r.url??"/");if(c===void 0){o.destroy();return}r.url=c.path+c.query;const w=(r.headers.host||"").split(":")[0],e=(0,manifest_1.matchRoute)(t.routes,w,c.policy+c.query);if(!e){o.destroy();return}(0,edge_1.resolveClientIp)(t,r);const i=u.upgradeContext(r,o,void 0);if(i.route=e,e.internal){const s=a.internal(r,e,void 0);if(!s.ok){o.destroy();return}i.caller=s.caller}else{const s=a.public(r,e,void 0,c.policy);if(!s.ok){o.destroy();return}if(i.claims=s.claims,u.has("afterAuth")&&(await u.run("afterAuth",i),i.responded()))return}const v=e.pool?t.serviceKeys[(0,service_keys_1.serviceKeyId)(e.svc?.wsKey,e.project)]:void 0;if(v&&(r.headers["x-internal-token"]=v),e.prependPrefix&&!r.url?.startsWith(e.prependPrefix)&&(r.url=e.prependPrefix+(r.url??"/")),(0,edge_1.stampForwardingHeaders)(t,r),u.has("onUpgrade")&&(await u.run("onUpgrade",i),i.responded()))return;const g=e.pool?(()=>{const s=(0,discovery_1.pickSock)(e.pool,t.scanTtlMs);return s?{socketPath:s}:void 0})():e.target;if(!g){o.destroy();return}if(e.lens&&String(r.headers["sec-websocket-protocol"]??"").split(",").map(s=>s.trim()).includes("vite-hmr")){const s=e.lens.workspaceKey?`${e.lens.workspaceKey}:${e.lens.project}`:e.lens.project;(0,hmr_reload_1.registerHmrClient)(t,s,o)}accountUpgrade(e,o),d.proxy.ws(r,o,f,{target:g,changeOrigin:!e.pool,agent:d.agentForTarget(g)},()=>o.destroy())},"run");return(r,o,f)=>{o.on("error",()=>o.destroy()),h(r,o,f).catch(()=>o.destroy())}}y(createUpgrade,"createUpgrade"),p(createUpgrade,"createUpgrade"),l(createUpgrade,"createUpgrade");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var f=Object.defineProperty;var o=(e,t)=>f(e,"name",{value:t,configurable:!0});var a=Object.defineProperty,r=o((e,t)=>a(e,"name",{value:t,configurable:!0}),"r"),c=Object.defineProperty,n=r((e,t)=>c(e,"name",{value:t,configurable:!0}),"n");Object.defineProperty(exports,"__esModule",{value:!0}),exports.workspaceLogWriter=workspaceLogWriter,exports.closeWorkspaceLogs=closeWorkspaceLogs;const tslib_1=require("tslib"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),fds=new Map,written=new Map,MAX_BYTES=50*1024*1024,CHECK_EVERY=1024*1024;function ensureFd(e){const t=fds.get(e);if(t!==void 0)return t;try{fs.mkdirSync(path.dirname(e),{recursive:!0});const s=fs.openSync(e,"a");return fds.set(e,s),written.set(e,0),s}catch{return}}o(ensureFd,"ensureFd"),r(ensureFd,"ensureFd"),n(ensureFd,"ensureFd");function closeFd(e){const t=fds.get(e);if(fds.delete(e),written.delete(e),t!==void 0)try{fs.closeSync(t)}catch{}}o(closeFd,"closeFd"),r(closeFd,"closeFd"),n(closeFd,"closeFd");function rotateIfHuge(e){try{if(fs.statSync(e).size<=MAX_BYTES)return}catch{return}closeFd(e);try{fs.renameSync(e,`${e}.1`)}catch{}}o(rotateIfHuge,"rotateIfHuge"),r(rotateIfHuge,"rotateIfHuge"),n(rotateIfHuge,"rotateIfHuge");function workspaceLogWriter(e){const t=path.join(e,".lensmcp","gateway.log");if(ensureFd(t)!==void 0)return s=>{const i=ensureFd(t);if(i===void 0)return;try{fs.writeSync(i,s)}catch{closeFd(t);return}const u=(written.get(t)??0)+s.length;u>=CHECK_EVERY?(written.set(t,0),rotateIfHuge(t)):written.set(t,u)}}o(workspaceLogWriter,"workspaceLogWriter"),r(workspaceLogWriter,"workspaceLogWriter"),n(workspaceLogWriter,"workspaceLogWriter");function closeWorkspaceLogs(){for(const e of[...fds.keys()])closeFd(e)}o(closeWorkspaceLogs,"closeWorkspaceLogs"),r(closeWorkspaceLogs,"closeWorkspaceLogs"),n(closeWorkspaceLogs,"closeWorkspaceLogs");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var o=(r,e)=>u(r,"name",{value:e,configurable:!0});var p=Object.defineProperty,i=o((r,e)=>p(r,"name",{value:e,configurable:!0}),"i"),c=Object.defineProperty,s=i((r,e)=>c(r,"name",{value:e,configurable:!0}),"s");Object.defineProperty(exports,"__esModule",{value:!0}),exports.processStamp=processStamp,exports.registryPath=registryPath,exports.readWorkspaces=readWorkspaces,exports.registerWorkspace=registerWorkspace,exports.unregisterWorkspace=unregisterWorkspace,exports.isWorkspaceLive=isWorkspaceLive;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),os=tslib_1.__importStar(require("node:os")),path=tslib_1.__importStar(require("node:path"));function processStamp(r){if(!r||r<=0||process.platform==="win32")return"";try{return(0,node_child_process_1.execFileSync)("ps",["-p",String(r),"-o","lstart="],{encoding:"utf8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}catch{return""}}o(processStamp,"processStamp"),i(processStamp,"processStamp"),s(processStamp,"processStamp");function registryPath(){const r=process.env.LENSMCP_HOME||os.homedir();return path.join(r,".lensmcp","workspaces.json")}o(registryPath,"registryPath"),i(registryPath,"registryPath"),s(registryPath,"registryPath");function readWorkspaces(r=registryPath()){try{const e=JSON.parse(fs.readFileSync(r,"utf8"));return Array.isArray(e)?e.filter(t=>!!t&&typeof t.key=="string"&&typeof t.base=="string"):[]}catch{return[]}}o(readWorkspaces,"readWorkspaces"),i(readWorkspaces,"readWorkspaces"),s(readWorkspaces,"readWorkspaces");function writeWorkspaces(r,e=registryPath()){try{fs.mkdirSync(path.dirname(e),{recursive:!0}),fs.writeFileSync(e,JSON.stringify(r,null,2))}catch{}}o(writeWorkspaces,"writeWorkspaces"),i(writeWorkspaces,"writeWorkspaces"),s(writeWorkspaces,"writeWorkspaces");function registerWorkspace(r,e=registryPath()){const t=readWorkspaces(e).filter(n=>n.key!==r.key);t.push(r),t.sort((n,a)=>n.key.localeCompare(a.key)),writeWorkspaces(t,e)}o(registerWorkspace,"registerWorkspace"),i(registerWorkspace,"registerWorkspace"),s(registerWorkspace,"registerWorkspace");function unregisterWorkspace(r,e=registryPath()){writeWorkspaces(readWorkspaces(e).filter(t=>t.key!==r),e)}o(unregisterWorkspace,"unregisterWorkspace"),i(unregisterWorkspace,"unregisterWorkspace"),s(unregisterWorkspace,"unregisterWorkspace");function isWorkspaceLive(r){if(!r.pid||r.pid<=0)return!1;try{process.kill(r.pid,0)}catch(t){if(t.code!=="EPERM")return!1}if(!r.procStamp)return!0;const e=processStamp(r.pid);return e===""?!0:e===r.procStamp}o(isWorkspaceLive,"isWorkspaceLive"),i(isWorkspaceLive,"isWorkspaceLive"),s(isWorkspaceLive,"isWorkspaceLive");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var b=Object.defineProperty;var c=(e,t)=>b(e,"name",{value:t,configurable:!0});var h=Object.defineProperty,l=c((e,t)=>h(e,"name",{value:t,configurable:!0}),"l"),u=Object.defineProperty,i=l((e,t)=>u(e,"name",{value:t,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.SsrfBlockedError=void 0,exports.isBlockedAddress=isBlockedAddress,exports.assertFetchableUrl=assertFetchableUrl,exports.safeFetch=safeFetch,exports.pinnedLookup=pinnedLookup;const node_net_1=require("node:net"),promises_1=require("node:dns/promises");class SsrfBlockedError extends Error{static{c(this,"SsrfBlockedError")}static{l(this,"SsrfBlockedError")}static{i(this,"SsrfBlockedError")}constructor(t,o,r,s){super(`SSRF guard blocked ${o??"request"}: ${t}${r?` (${r})`:""}`,s!==void 0?{cause:s}:void 0),this.name="SsrfBlockedError",this.reason=t,this.url=o,this.address=r}}exports.SsrfBlockedError=SsrfBlockedError;function buildDefaultBlockList(){const e=new node_net_1.BlockList;return e.addSubnet("0.0.0.0",8,"ipv4"),e.addSubnet("10.0.0.0",8,"ipv4"),e.addSubnet("100.64.0.0",10,"ipv4"),e.addSubnet("127.0.0.0",8,"ipv4"),e.addSubnet("169.254.0.0",16,"ipv4"),e.addSubnet("172.16.0.0",12,"ipv4"),e.addSubnet("192.0.0.0",24,"ipv4"),e.addSubnet("192.168.0.0",16,"ipv4"),e.addSubnet("198.18.0.0",15,"ipv4"),e.addSubnet("240.0.0.0",4,"ipv4"),e.addAddress("::","ipv6"),e.addAddress("::1","ipv6"),e.addSubnet("fc00::",7,"ipv6"),e.addSubnet("fe80::",10,"ipv6"),e}c(buildDefaultBlockList,"buildDefaultBlockList"),l(buildDefaultBlockList,"buildDefaultBlockList"),i(buildDefaultBlockList,"buildDefaultBlockList");const DEFAULT_BLOCK_LIST=buildDefaultBlockList();function isBlockedAddress(e,t=DEFAULT_BLOCK_LIST){const o=(0,node_net_1.isIP)(e);return o===0?!0:t.check(e,o===6?"ipv6":"ipv4")}c(isBlockedAddress,"isBlockedAddress"),l(isBlockedAddress,"isBlockedAddress"),i(isBlockedAddress,"isBlockedAddress");const stripBrackets=i(e=>e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e,"stripBrackets"),defaultResolve=i(async e=>(await(0,promises_1.lookup)(e,{all:!0,verbatim:!0})).map(t=>t.address),"defaultResolve");async function assertFetchableUrl(e,t={}){const o=t.allowedProtocols??["http:","https:"];let r;try{r=new URL(e)}catch{throw new SsrfBlockedError("malformed-url",String(e))}if(!o.includes(r.protocol))throw new SsrfBlockedError(`scheme-not-allowed:${r.protocol}`,r.href);if(r.username!==""||r.password!=="")throw new SsrfBlockedError("embedded-credentials",r.href);const s=stripBrackets(r.hostname);if(s==="")throw new SsrfBlockedError("missing-host",r.href);if(t.allowPrivate)return{url:r,hostname:s,addresses:(0,node_net_1.isIP)(s)?[s]:[]};const d=t.blockList??DEFAULT_BLOCK_LIST;if((0,node_net_1.isIP)(s)!==0){if(isBlockedAddress(s,d))throw new SsrfBlockedError("blocked-address",r.href,s);return{url:r,hostname:s,addresses:[s]}}const f=t.resolve??defaultResolve;let a;try{a=await f(s)}catch(n){throw new SsrfBlockedError("dns-resolution-failed",r.href,void 0,n)}if(a.length===0)throw new SsrfBlockedError("dns-no-records",r.href);for(const n of a)if(isBlockedAddress(n,d))throw new SsrfBlockedError("blocked-resolved-address",r.href,n);return{url:r,hostname:s,addresses:a}}c(assertFetchableUrl,"assertFetchableUrl"),l(assertFetchableUrl,"assertFetchableUrl"),i(assertFetchableUrl,"assertFetchableUrl");async function safeFetch(e,t={},o={}){const r=o.fetchImpl??globalThis.fetch,s=o.maxRedirects??5;let d=e;for(let f=0;;f++){const{url:a}=await assertFetchableUrl(d,o),n=await r(a,{...t,redirect:"manual"}),p=n.headers.get("location");if(n.status>=300&&n.status<400&&p){if(f>=s)throw new SsrfBlockedError("too-many-redirects",a.href);d=new URL(p,a).href;continue}return n}}c(safeFetch,"safeFetch"),l(safeFetch,"safeFetch"),i(safeFetch,"safeFetch");function pinnedLookup(e){const t=e.map(o=>({address:o,family:(0,node_net_1.isIP)(o)===6?6:4}));return(o,r,s)=>{const d=typeof r=="function"?r:s,f=typeof r=="object"&&r!==null&&r.all===!0;if(t.length===0){d(new Error(`SSRF guard: no pinned address for ${o}`));return}f?d(null,t):d(null,t[0].address,t[0].family)}}c(pinnedLookup,"pinnedLookup"),l(pinnedLookup,"pinnedLookup"),i(pinnedLookup,"pinnedLookup");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var K=Object.defineProperty;var p=(e,o)=>K(e,"name",{value:o,configurable:!0});var V=Object.defineProperty,l=p((e,o)=>V(e,"name",{value:o,configurable:!0}),"l"),J=Object.defineProperty,a=l((e,o)=>J(e,"name",{value:o,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0});const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),fs=tslib_1.__importStar(require("node:fs")),node_child_process_1=require("node:child_process"),yaml=tslib_1.__importStar(require("js-yaml")),create_webpack_dev_1=require("../../create-webpack-dev"),process_name_1=require("../../process-name"),webpack=require("webpack");async function*serveExecutor(e,o){process.env.NODE_ENV="development";const T=o.projectsConfigurations.projects[o.projectName],i=o.root,h=path.join(i,T.root),C=e.outputPath?path.join(i,e.outputPath):path.join(i,"dist",T.root),O=e.configEnv||"development",S=path.join(i,"config",`config.${O}.yaml`),y=3050;let u=y,s=o.projectName,E={};fs.existsSync(S)?(E=yaml.load(fs.readFileSync(S,"utf8")),u=Number(E.port)||u,s=E.serviceName||s):console.warn(`[serve] ${o.projectName}: no config file at ${S} \u2014 public devserver port defaults to ${y}. If another service also lacks its config, both bind ${y} \u2192 EADDRINUSE. Add config/config.${O}.yaml with a distinct \`port:\` (matching this project's cluster.port).`),e.serviceName&&(s=e.serviceName);const P=e.servePrefix??"",d=e.debugPort??(Number(process.env.LENSMCP_DEBUG_PORT)||void 0),$=/^(1|true|yes|on)$/i.test((process.env.LENSMCP_DEBUG_FIXED_PORTS??"").trim()),c=e.logFile?path.resolve(i,e.logFile):process.env.LENSMCP_LOG_FILE||void 0;if(c){fs.mkdirSync(path.dirname(c),{recursive:!0}),fs.writeFileSync(c,"",{mode:384});try{fs.chmodSync(c,384)}catch{}}let N,b;e.gateway?.middleware&&(N=path.resolve(h,e.gateway.middleware),b=JSON.stringify(E));const G=e.entryFile||"./src/deployments/service/main.ts",F=e.tsConfigFile||"./tsconfig.app.json",M=path.resolve(h,G),U=path.resolve(h,F),W=(e.workers||[]).map(t=>({entryName:t.name,entryPath:path.resolve(h,t.entryPath)})),j=(0,create_webpack_dev_1.createDevWebpackConfig)({appName:o.projectName,appRoot:h,outputDir:C,main:M,tsConfig:U,assets:e.assets||[],additionalEntryPoints:W,port:u,serviceName:s,memoryLimit:e.memoryLimit||8192,buildLibsFromSource:e.buildLibsFromSource!==!1,workspaceRoot:i,orgScopes:e.orgScopes||[],bundlePackages:e.bundlePackages||[],nodeExternalsConfig:e.nodeExternalsConfig,webpackConfigPath:e.webpackConfigPath,httpsReload:e.gateway?.https===!0});let n=null,w=!1;const k=path.join(__dirname,"../../main.devserver.js"),x=path.join(__dirname,"../../main.devserver.ts"),I=!fs.existsSync(k)&&fs.existsSync(x),L=I?x:k,B=path.join(C,"main.js");function v(){n&&!n.killed&&(n.kill("SIGTERM"),n=null)}p(v,"v"),l(v,"g"),a(v,"cleanup");const q=["SIGINT","SIGTERM","SIGHUP","SIGQUIT"].map(t=>{const r=a(()=>v(),"handler");return process.on(t,r),{sig:t,handler:r}});process.on("exit",v);function g(){if(!fs.existsSync(L)){console.error(`[serve] devserver script not found at ${L}`);return}const t=["--enable-source-maps"];I&&t.unshift("--require","@swc-node/register"),n=(0,node_child_process_1.fork)(L,{cwd:i,env:{...process.env,PORT:String(u),SERVICE_NAME:s,SERVE_PREFIX:P,LENSMCP_PROJECT:process.env.LENSMCP_PROJECT||o.projectName||s,LENSMCP_EVENT_FILE:process.env.LENSMCP_EVENT_FILE||path.join(i,".lensmcp","events.jsonl"),CHILD_COUNT:String(e.childCount||process.env.CHILD_COUNT||1),BUNDLE_PATH:B,...N&&{GATEWAY_MIDDLEWARE:N},...b&&{GATEWAY_CONFIG:b},...e.gateway?.routes?.length&&{GATEWAY_ROUTES:JSON.stringify(e.gateway.routes)},...e.gateway?.https&&{GATEWAY_HTTPS:"1"},...e.gateway?.extraPorts?.length&&{GATEWAY_EXTRA_PORTS:JSON.stringify(e.gateway.extraPorts)},...e.internalPort&&{INTERNAL_PORT:String(e.internalPort)},...d&&{LENSMCP_DEBUG_PORT:String(d)},...c&&{LENSMCP_LOG_FILE:c},...e.workers?.length&&{WORKERS:JSON.stringify(e.workers.map(r=>r.name))}},stdio:["inherit","inherit","inherit","ipc"],execArgv:t,execPath:(0,process_name_1.namedExecPath)((0,process_name_1.processName)(process.env.LENSMCP_WS_KEY||path.basename(i),s,"dev"))}),n.on("exit",(r,_)=>{n=null,!_&&(console.error(`[serve] devserver exited unexpectedly (code=${r}, signal=${_}) \u2014 respawning in 1.5s`),setTimeout(()=>{!n&&w&&g()},1500).unref?.())}),console.log(`[serve] Devserver started on port ${u} (service: ${s}${P?`, prefix: /${P}`:""})`),d?(console.warn(`[serve] DEBUGGER ENABLED for ${s}. Node's inspector has NO authentication \u2014 the ws:// UUID is the whole credential, and any account on this host that obtains it runs code as you. Do not enable this on a shared machine.`),$?console.warn(`[serve] LENSMCP_DEBUG_FIXED_PORTS=1 \u2014 pod inspectors bind PREDICTABLE ports 127.0.0.1:${d}+slot (workers ${d}+20+i), reachable by any account on this host. Attach WebStorm (Attach to Node.js/Chrome) to ${d}. Unset it to bind ephemeral ports instead.`):console.log(`[serve] Debug: pod inspectors bind an EPHEMERAL 127.0.0.1 port \u2014 click the "Debugger listening" link in this console, or run \`lensmcp debug ${s}\` to get the ws:// URLs over the owner-only control socket. Set LENSMCP_DEBUG_FIXED_PORTS=1 if your IDE needs a fixed attach port.`)):console.log(`[serve] Debug on demand: \`lensmcp debug ${s}\` opens pod inspectors without a restart`),c&&console.log(`[serve] Logs teed to ${c} \u2014 tail it in WebStorm via Run/Debug configuration \u2192 Logs tab`)}p(g,"h"),l(g,"v"),a(g,"startDevServer");function A(){if(!n||n.killed){console.log("[serve] Devserver not running, restarting..."),g();return}fetch(`http://localhost:${u}/webpack/reload`,{method:"POST",headers:{"content-type":"application/json"},body:"{}"}).then(()=>console.log("[serve] Notified devserver to reload")).catch(t=>{console.warn("[serve] Failed to notify devserver, restarting...",t.message),v(),g()})}p(A,"q"),l(A,"Y"),a(A,"_notifyDevServerReload");const{watch:Q,...Y}=j,H=webpack(Y);let f=null;const D=[];function m(t){if(f){const r=f;f=null,r(t)}else D.push(t)}p(m,"E"),l(m,"w"),a(m,"pushResult");function R(){return D.length>0?Promise.resolve(D.shift()):new Promise(t=>{f=t})}p(R,"j"),l(R,"B"),a(R,"waitForNext");const X=H.watch(j.watchOptions||{},(t,r)=>{if(t){console.error("[serve] Webpack error:",t),m({success:!1});return}const _=r.hasErrors();if(console.info(r.toString({colors:!0,chunks:!1,assets:!0})),_){m({success:!1});return}(!w||!n)&&(w=!0,g()),m({success:!0,baseUrl:`http://localhost:${u}`})});try{for(;;)yield await R()}finally{X.close(()=>{}),v(),q.forEach(({sig:t,handler:r})=>process.removeListener(t,r))}}p(serveExecutor,"serveExecutor"),l(serveExecutor,"serveExecutor"),a(serveExecutor,"serveExecutor"),exports.default=serveExecutor,module.exports=serveExecutor,module.exports.default=serveExecutor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var i=(e,t)=>o(e,"name",{value:t,configurable:!0});var s=Object.defineProperty,a=i((e,t)=>s(e,"name",{value:t,configurable:!0}),"a"),n=Object.defineProperty,r=a((e,t)=>n(e,"name",{value:t,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.isValidHostname=isValidHostname;const LABEL=/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/,MAX_HOSTNAME_LENGTH=253;function isValidHostname(e){return typeof e!="string"||e.length===0||e.length>MAX_HOSTNAME_LENGTH?!1:e.split(".").every(t=>LABEL.test(t))}i(isValidHostname,"isValidHostname"),a(isValidHostname,"isValidHostname"),r(isValidHostname,"isValidHostname");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`).some(
|
|
1
|
+
"use strict";var b=Object.defineProperty;var h=(s,t)=>b(s,"name",{value:t,configurable:!0});var v=Object.defineProperty,p=h((s,t)=>v(s,"name",{value:t,configurable:!0}),"p"),m=Object.defineProperty,d=p((s,t)=>m(s,"name",{value:t,configurable:!0}),"d");Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=trustExecutor,exports.collectHosts=collectHosts;const tslib_1=require("tslib"),node_child_process_1=require("node:child_process"),fs=tslib_1.__importStar(require("node:fs")),path=tslib_1.__importStar(require("node:path")),basic_ssl_1=require("../../basic-ssl"),hostname_1=require("./hostname");async function trustExecutor(s,t){const r=path.join(t.root,"node_modules",".cache","davnx-webpack"),i=(0,basic_ssl_1.ensureCaSync)(r),a=process.env.LENSMCP_TRUST_HOSTS_ONLY==="1",u=collectHosts(s,t);if(u.length===0&&console.log("[trust] no concrete hostnames found (only wildcards?) \u2014 keychain step only."),process.platform!=="darwin"){console.log("[trust] non-macOS platform \u2014 do these manually:"),console.log(` \u2022 trust ${i} in your OS/browser store (Linux: update-ca-certificates / certutil)`);for(const e of u)console.log(` \u2022 /etc/hosts: "127.0.0.1 ${e}" and "::1 ${e}"`);return{success:!0}}const o=caSha256Fingerprint(i),f=a||o!==void 0&&(0,node_child_process_1.spawnSync)("security",["find-certificate","-a","-c","lensmcp local dev CA","-Z","/Library/Keychains/System.keychain"],{encoding:"utf8"}).stdout?.includes(o)===!0;if(a)console.log("[trust] hosts-only: a shared daemon serves TLS with its own CA \u2014 skipping the keychain step.");else if(f)console.log("[trust] CA already in the System keychain \u2014 skipping.");else{if(console.log(`[trust] adding CA to the System keychain (sudo will prompt): ${i}`),(0,node_child_process_1.spawnSync)("sudo",["security","add-trusted-cert","-d","-r","trustRoot","-k","/Library/Keychains/System.keychain",i],{stdio:"inherit"}).status!==0)return console.error("[trust] add-trusted-cert failed \u2014 rerun in a terminal so sudo can prompt."),{success:!1};console.log("[trust] CA trusted. Restart your browser once (it caches certificate verdicts).")}const c=fs.readFileSync("/etc/hosts","utf8"),n=d((e,S)=>c.split(`
|
|
2
|
+
`).some(w=>{const y=w.trim();if(y.startsWith("#"))return!1;const g=y.split(/\s+/);return g[0]===e&&g.slice(1).includes(S)}),"hasEntry"),l=[];for(const e of u)n("127.0.0.1",e)||l.push(`127.0.0.1 ${e}`),n("::1",e)||l.push(`::1 ${e}`);if(l.length===0)console.log("[trust] /etc/hosts already complete (both families for every hostname).");else{if(console.log(`[trust] appending to /etc/hosts (sudo):
|
|
3
3
|
${l.join(`
|
|
4
4
|
`)}`),(0,node_child_process_1.spawnSync)("sudo",["tee","-a","/etc/hosts"],{input:l.join(`
|
|
5
5
|
`)+`
|
|
6
|
-
`,stdio:["pipe","ignore","inherit"]}).status!==0)return console.error("[trust] /etc/hosts update failed."),{success:!1};(0,node_child_process_1.spawnSync)("sudo",["dscacheutil","-flushcache"],{stdio:"inherit"}),(0,node_child_process_1.spawnSync)("sudo",["killall","-HUP","mDNSResponder"],{stdio:"inherit"})}if(!a){const
|
|
6
|
+
`,stdio:["pipe","ignore","inherit"]}).status!==0)return console.error("[trust] /etc/hosts update failed."),{success:!1};(0,node_child_process_1.spawnSync)("sudo",["dscacheutil","-flushcache"],{stdio:"inherit"}),(0,node_child_process_1.spawnSync)("sudo",["killall","-HUP","mDNSResponder"],{stdio:"inherit"})}if(!a){const e=(0,node_child_process_1.spawnSync)("security",["verify-cert","-c",i,"-p","basic"],{stdio:"ignore"});console.log(`[trust] CA trust check: ${e.status===0?"OK":"NOT TRUSTED YET (browser restart may be needed)"}`)}for(const e of u)console.log(`[trust] ${e} \u2192 https ready (hosts + cert SAN ride the gateway config)`);return{success:!0}}h(trustExecutor,"trustExecutor"),p(trustExecutor,"trustExecutor"),d(trustExecutor,"trustExecutor");function caSha256Fingerprint(s){const t=(0,node_child_process_1.spawnSync)("openssl",["x509","-in",s,"-noout","-fingerprint","-sha256"],{encoding:"utf8"});if(t.status!==0||!t.stdout)return;const r=t.stdout.split("=")[1]?.replaceAll(":","").trim().toUpperCase();return r&&/^[0-9A-F]{64}$/.test(r)?r:void 0}h(caSha256Fingerprint,"caSha256Fingerprint"),p(caSha256Fingerprint,"caSha256Fingerprint"),d(caSha256Fingerprint,"caSha256Fingerprint");function collectHosts(s,t){const r=[],i=t.projectName?t.projectsConfigurations?.projects[t.projectName]:void 0,a=s.serveTarget??"serve-hmr",u=i?.targets?.[a]?.options?.gateway?.routes??[];for(const o of u)o.host&&(0,hostname_1.isValidHostname)(o.host)?r.push(o.host):o.host&&console.warn(`[trust] ignoring invalid hostname in ${a} routes: ${JSON.stringify(o.host)}`);for(const o of Object.values(t.projectsConfigurations?.projects??{}))try{const f=JSON.parse(fs.readFileSync(path.join(t.root,o.root,"project.json"),"utf8")),c=f.cluster??f.davnx,n=c?.host;n&&!(0,hostname_1.isValidHostname)(n)&&console.warn(`[trust] ignoring invalid hostname in ${o.root}/project.json: ${JSON.stringify(n)}`),n&&(0,hostname_1.isValidHostname)(n)&&(r.push(n),c?.service&&c.internalHost!==!1&&r.push(typeof c.internalHost=="string"?c.internalHost:`internal.${n}`))}catch{}return[...new Set([...r,"lensmcp.local",...s.hosts??[]])]}h(collectHosts,"collectHosts"),p(collectHosts,"collectHosts"),d(collectHosts,"collectHosts");
|
package/exit-reason.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`)}s(crashReport,"crashReport"),i(crashReport,"crashReport");
|
|
1
|
+
"use strict";var p=Object.defineProperty;var r=(t,e)=>p(t,"name",{value:e,configurable:!0});var l=Object.defineProperty,s=r((t,e)=>l(t,"name",{value:e,configurable:!0}),"s"),h=Object.defineProperty,i=s((t,e)=>h(t,"name",{value:e,configurable:!0}),"i");Object.defineProperty(exports,"__esModule",{value:!0}),exports.TailBuffer=void 0,exports.describeExit=describeExit,exports.crashReport=crashReport;class TailBuffer{static{r(this,"TailBuffer")}static{s(this,"TailBuffer")}static{i(this,"TailBuffer")}constructor(e=20,a=500){this.max=e,this.maxLineChars=a,this.lines=[]}push(e){e&&(this.lines.push(e.length>this.maxLineChars?`${e.slice(0,this.maxLineChars)}\u2026`:e),this.lines.length>this.max&&this.lines.shift())}snapshot(){return[...this.lines]}}exports.TailBuffer=TailBuffer;function describeExit(t,e){return e==="SIGKILL"||t===137?"killed with SIGKILL \u2014 the kernel OOM killer, or something outside the dev cluster (`kill -9`, a container memory limit); not a crash in the app":e==="SIGSEGV"||e==="SIGBUS"||e==="SIGABRT"?`died on ${e} \u2014 a native crash or a V8 abort (a heap out-of-memory prints "FATAL ERROR" on stderr first)`:e==="SIGPIPE"?"died on SIGPIPE \u2014 it wrote to a closed pipe":e==="SIGHUP"?"received SIGHUP \u2014 its terminal or parent session went away":e==="SIGINT"||e==="SIGTERM"||t===0?null:t===134?"aborted (exit 134, SIGABRT) \u2014 usually a V8 heap out-of-memory":t===1?"exited 1 \u2014 an uncaught exception or an explicit process.exit(1)":t!==null?`exited ${t}`:null}r(describeExit,"describeExit"),s(describeExit,"describeExit"),i(describeExit,"describeExit");function crashReport(t,e,a,n){const u=describeExit(e,a),o=[t+(u?` \u2014 ${u}`:"")];if(n.length){o.push(` last ${n.length} line(s) of output before it died:`);for(const c of n)o.push(` | ${c}`)}else o.push(" (it wrote nothing to stdout/stderr before it died)");return o.join(`
|
|
2
|
+
`)}r(crashReport,"crashReport"),s(crashReport,"crashReport"),i(crashReport,"crashReport");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var h=Object.defineProperty;var o=(t,e)=>h(t,"name",{value:e,configurable:!0});var p=Object.defineProperty,s=o((t,e)=>p(t,"name",{value:e,configurable:!0}),"s"),a=Object.defineProperty,r=s((t,e)=>a(t,"name",{value:e,configurable:!0}),"r");Object.defineProperty(exports,"__esModule",{value:!0}),exports.ForkTsCheckReporterPlugin=void 0;const tslib_1=require("tslib"),path=tslib_1.__importStar(require("node:path")),typecheck_bus_1=require("./typecheck-bus");function loadForkTsChecker(t){const e=[];try{e.push(path.dirname(require.resolve("@nx/webpack/package.json",{paths:[t]})))}catch{}e.push(t,__dirname);for(const i of e)try{return require(require.resolve("fork-ts-checker-webpack-plugin",{paths:[i]}))}catch{}return null}o(loadForkTsChecker,"loadForkTsChecker"),s(loadForkTsChecker,"loadForkTsChecker"),r(loadForkTsChecker,"loadForkTsChecker");function toDiagnostic(t,e){return{file:t.file?path.relative(e,t.file)||t.file:"<unknown>",line:t.location?.start?.line??0,column:t.location?.start?.column??0,severity:t.severity==="warning"?"warning":"error",code:/^TS\d+$/.test(t.code)?t.code:`TS${t.code}`,message:t.message}}o(toDiagnostic,"toDiagnostic"),s(toDiagnostic,"toDiagnostic"),r(toDiagnostic,"toDiagnostic");class ForkTsCheckReporterPlugin{static{o(this,"ForkTsCheckReporterPlugin")}static{s(this,"ForkTsCheckReporterPlugin")}static{r(this,"ForkTsCheckReporterPlugin")}constructor(e){this.startedAt=0,this.opts=e}apply(e){const i=loadForkTsChecker(this.opts.workspaceRoot)?.getCompilerHooks;if(typeof i!="function")return;let n;try{n=i(e)}catch{return}n.start?.tapPromise("LensmcpForkTsCheckReporter",async c=>(this.startedAt=Date.now(),c)),n.issues?.tap("LensmcpForkTsCheckReporter",c=>{try{(0,typecheck_bus_1.publishTypecheckDiagnostics)({workspaceRoot:this.opts.workspaceRoot,project:this.opts.appName,tool:"fork-ts-checker",tsConfig:this.opts.tsConfig,diagnostics:(c??[]).map(l=>toDiagnostic(l,this.opts.workspaceRoot)),durationMs:this.startedAt?Date.now()-this.startedAt:0,...this.opts.eventFile?{eventFile:this.opts.eventFile}:{}})}catch{}return c})}}exports.ForkTsCheckReporterPlugin=ForkTsCheckReporterPlugin;
|
package/gateway.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var n=Object.defineProperty;var a=(r,t)=>n(r,"name",{value:t,configurable:!0});var s=Object.defineProperty,i=a((r,t)=>s(r,"name",{value:t,configurable:!0}),"i"),o=Object.defineProperty,e=i((r,t)=>o(r,"name",{value:t,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.manifestFromClusterDecl=exports.DEFAULT_REGISTRY_PREFIX=exports.redisRegistrySource=exports.createRegistryProviders=exports.endpointsPodProvider=exports.staticManifestProvider=exports.startProdGateway=void 0;var prod_gateway_lib_1=require("./executors/gateway/prod-gateway.lib");Object.defineProperty(exports,"startProdGateway",{enumerable:!0,get:e(function(){return prod_gateway_lib_1.startProdGateway},"get")});var providers_prod_1=require("./executors/gateway/providers-prod");Object.defineProperty(exports,"staticManifestProvider",{enumerable:!0,get:e(function(){return providers_prod_1.staticManifestProvider},"get")}),Object.defineProperty(exports,"endpointsPodProvider",{enumerable:!0,get:e(function(){return providers_prod_1.endpointsPodProvider},"get")});var registry_source_1=require("./executors/gateway/registry-source");Object.defineProperty(exports,"createRegistryProviders",{enumerable:!0,get:e(function(){return registry_source_1.createRegistryProviders},"get")}),Object.defineProperty(exports,"redisRegistrySource",{enumerable:!0,get:e(function(){return registry_source_1.redisRegistrySource},"get")}),Object.defineProperty(exports,"DEFAULT_REGISTRY_PREFIX",{enumerable:!0,get:e(function(){return registry_source_1.DEFAULT_REGISTRY_PREFIX},"get")});var manifest_1=require("./executors/gateway/manifest");Object.defineProperty(exports,"manifestFromClusterDecl",{enumerable:!0,get:e(function(){return manifest_1.manifestFromClusterDecl},"get")});
|
package/hot-swap-registries.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var S=Object.defineProperty;var d=(s,e)=>S(s,"name",{value:e,configurable:!0});var m=Object.defineProperty,l=d((s,e)=>m(s,"name",{value:e,configurable:!0}),"l"),g=Object.defineProperty,o=l((s,e)=>g(s,"name",{value:e,configurable:!0}),"o");Object.defineProperty(exports,"__esModule",{value:!0}),exports.nestTypeormEntityRegistries=nestTypeormEntityRegistries,exports.typeormArgsRegistries=typeormArgsRegistries,exports.classValidatorRegistries=classValidatorRegistries,exports.classTransformerRegistries=classTransformerRegistries,exports.defaultRegistries=defaultRegistries,exports.captureRegistries=captureRegistries,exports.supersededSince=supersededSince,exports.pruneRegistries=pruneRegistries,exports.registryPruningEnabled=registryPruningEnabled,exports.describePrune=describePrune;const isClass=o(s=>typeof s=="function","isClass");function filterInPlace(s,e){const n=s.filter(e),a=s.length-n.length;return a>0&&s.splice(0,s.length,...n),a}d(filterInPlace,"filterInPlace"),l(filterInPlace,"filterInPlace"),o(filterInPlace,"filterInPlace");const NEST_TYPEORM_STORAGE=/[\\/]@nestjs[\\/]typeorm[\\/]dist[\\/]entities-metadata\.storage\.js$/;function nestTypeormEntityRegistries(s){const e=[];for(const[n,a]of Object.entries(s)){if(!a||!NEST_TYPEORM_STORAGE.test(n))continue;const t=a.exports?.EntitiesMetadataStorage?.storage;if(!(t instanceof Map))continue;const c=o(()=>[...t.values()].filter(f=>Array.isArray(f)),"lists");e.push({id:"@nestjs/typeorm entities",phase:"build",classes:o(()=>c().flat().filter(isClass),"classes"),prune:o(f=>c().reduce((r,p)=>r+filterInPlace(p,u=>!(isClass(u)&&f.has(u))),0),"prune")})}return e}d(nestTypeormEntityRegistries,"nestTypeormEntityRegistries"),l(nestTypeormEntityRegistries,"nestTypeormEntityRegistries"),o(nestTypeormEntityRegistries,"nestTypeormEntityRegistries");function typeormArgsRegistries(s){const e=s.typeormMetadataArgsStorage;if(!e||typeof e!="object")return[];const n=o(()=>Object.values(e).filter(t=>Array.isArray(t)),"lists"),a=o(t=>t&&typeof t=="object"?t.target:void 0,"targetOf");return[{id:"typeorm metadata",phase:"serve",classes:o(()=>n().flat().map(a).filter(isClass),"classes"),prune:o(t=>n().reduce((c,f)=>c+filterInPlace(f,r=>{const p=a(r);return!(isClass(p)&&t.has(p))}),0),"prune")}]}d(typeormArgsRegistries,"typeormArgsRegistries"),l(typeormArgsRegistries,"typeormArgsRegistries"),o(typeormArgsRegistries,"typeormArgsRegistries");const GENERIC_CONSTRAINT="CustomConstraint";function classValidatorRegistries(s){const e=s.classValidatorMetadataStorage;if(!e||typeof e!="object")return[];const{validationMetadatas:n,constraintMetadatas:a}=e;if(!(n instanceof Map))return[];const t=a instanceof Map?a:new Map,c=o(()=>[...t.keys()].filter(isClass).filter(r=>r.name!==GENERIC_CONSTRAINT),"namedConstraints"),f=o(r=>r&&typeof r=="object"?r.constraintCls:void 0,"constraintOf");return[{id:"class-validator metadata",phase:"serve",classes:o(()=>[...[...n.keys()].filter(isClass),...c()],"classes"),prune:o(r=>{let p=0;const u=new Set;for(const i of[...n.keys()]){if(!isClass(i)||!r.has(i))continue;const y=n.get(i);if(Array.isArray(y))for(const R of y)u.add(f(R));n.delete(i),p++}for(const i of c())r.has(i)&&t.delete(i)&&p++;if(u.size>0){for(const i of n.values())if(Array.isArray(i))for(const y of i)u.delete(f(y));for(const i of u)isClass(i)&&i.name===GENERIC_CONSTRAINT&&t.delete(i)&&p++}return p},"prune")}]}d(classValidatorRegistries,"classValidatorRegistries"),l(classValidatorRegistries,"classValidatorRegistries"),o(classValidatorRegistries,"classValidatorRegistries");const CLASS_TRANSFORMER_STORAGE=/[\\/]class-transformer[\\/]cjs[\\/]storage\.js$/,CLASS_TRANSFORMER_MAPS=["_typeMetadatas","_transformMetadatas","_exposeMetadatas","_excludeMetadatas"];function classTransformerRegistries(s){const e=[];for(const[n,a]of Object.entries(s)){if(!a||!CLASS_TRANSFORMER_STORAGE.test(n))continue;const t=a.exports?.defaultMetadataStorage;if(!t||typeof t!="object")continue;const c=CLASS_TRANSFORMER_MAPS.map(r=>t[r]).filter(r=>r instanceof Map);if(c.length===0)continue;const f=t._ancestorsMap;e.push({id:"class-transformer metadata",phase:"serve",classes:o(()=>c.flatMap(r=>[...r.keys()]).filter(isClass),"classes"),prune:o(r=>{let p=0;for(const u of c)for(const i of[...u.keys()])isClass(i)&&r.has(i)&&u.delete(i)&&p++;if(f instanceof Map)for(const[u,i]of[...f.entries()])(isClass(u)&&r.has(u)||Array.isArray(i)&&i.some(y=>isClass(y)&&r.has(y)))&&f.delete(u);return p},"prune")})}return e}d(classTransformerRegistries,"classTransformerRegistries"),l(classTransformerRegistries,"classTransformerRegistries"),o(classTransformerRegistries,"classTransformerRegistries");function defaultRegistries(s=require.cache,e=globalThis){return[...nestTypeormEntityRegistries(s),...typeormArgsRegistries(e),...classValidatorRegistries(e),...classTransformerRegistries(s)]}d(defaultRegistries,"defaultRegistries"),l(defaultRegistries,"defaultRegistries"),o(defaultRegistries,"defaultRegistries");function captureRegistries(s=defaultRegistries()){const e=new Map;for(const n of s){const a=e.get(n.id)??new Set;for(const t of n.classes())a.add(t);e.set(n.id,a)}return e}d(captureRegistries,"captureRegistries"),l(captureRegistries,"captureRegistries"),o(captureRegistries,"captureRegistries");function supersededSince(s,e=defaultRegistries()){const n=new Set;for(const[a,t]of captureRegistries(e)){const c=s.get(a)??new Set,f=new Set;for(const r of t)!c.has(r)&&r.name&&f.add(r.name);for(const r of c)r.name&&f.has(r.name)&&n.add(r)}return n}d(supersededSince,"supersededSince"),l(supersededSince,"supersededSince"),o(supersededSince,"supersededSince");function pruneRegistries(s,e,n=defaultRegistries()){if(s.size===0)return[];const a=[];for(const t of n){if(t.phase!==e)continue;const c=t.prune(s);c>0&&a.push({registry:t.id,removed:c})}return a}d(pruneRegistries,"pruneRegistries"),l(pruneRegistries,"pruneRegistries"),o(pruneRegistries,"pruneRegistries");function registryPruningEnabled(s=process.env){const e=(s.LENSMCP_SWAP_PRUNE_REGISTRIES??"").trim().toLowerCase();return!(e==="0"||e==="false"||e==="no"||e==="off")}d(registryPruningEnabled,"registryPruningEnabled"),l(registryPruningEnabled,"registryPruningEnabled"),o(registryPruningEnabled,"registryPruningEnabled");function describePrune(s,e){const n=s.reduce((t,c)=>t+c.removed,0);if(n===0)return null;const a=s.map(t=>`${t.registry} ${t.removed}`).join(", ");return`[child] released ${n} superseded class registration(s) ${e} (${a})`}d(describePrune,"describePrune"),l(describePrune,"describePrune"),o(describePrune,"describePrune");
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var s=Object.defineProperty;var o=(r,t)=>s(r,"name",{value:t,configurable:!0});var p=Object.defineProperty,c=o((r,t)=>p(r,"name",{value:t,configurable:!0}),"c"),n=Object.defineProperty,e=c((r,t)=>n(r,"name",{value:t,configurable:!0}),"e");Object.defineProperty(exports,"__esModule",{value:!0}),exports.ForkTsCheckReporterPlugin=exports.resolveEventFile=exports.publishTypecheckRun=exports.publishTypecheckDiagnostics=exports.parseTscOutput=exports.parseTscDiagnosticLine=exports.buildTypecheckRunEvents=exports.appendTypecheckEvents=exports.createProdWebpackConfig=exports.createDevWebpackConfig=exports.buildScopePatterns=void 0;var build_scope_patterns_1=require("./build-scope-patterns");Object.defineProperty(exports,"buildScopePatterns",{enumerable:!0,get:e(function(){return build_scope_patterns_1.buildScopePatterns},"get")});var create_webpack_dev_1=require("./create-webpack-dev");Object.defineProperty(exports,"createDevWebpackConfig",{enumerable:!0,get:e(function(){return create_webpack_dev_1.createDevWebpackConfig},"get")});var create_webpack_prod_1=require("./create-webpack-prod");Object.defineProperty(exports,"createProdWebpackConfig",{enumerable:!0,get:e(function(){return create_webpack_prod_1.createProdWebpackConfig},"get")});var typecheck_bus_1=require("./typecheck-bus");Object.defineProperty(exports,"appendTypecheckEvents",{enumerable:!0,get:e(function(){return typecheck_bus_1.appendTypecheckEvents},"get")}),Object.defineProperty(exports,"buildTypecheckRunEvents",{enumerable:!0,get:e(function(){return typecheck_bus_1.buildTypecheckRunEvents},"get")}),Object.defineProperty(exports,"parseTscDiagnosticLine",{enumerable:!0,get:e(function(){return typecheck_bus_1.parseTscDiagnosticLine},"get")}),Object.defineProperty(exports,"parseTscOutput",{enumerable:!0,get:e(function(){return typecheck_bus_1.parseTscOutput},"get")}),Object.defineProperty(exports,"publishTypecheckDiagnostics",{enumerable:!0,get:e(function(){return typecheck_bus_1.publishTypecheckDiagnostics},"get")}),Object.defineProperty(exports,"publishTypecheckRun",{enumerable:!0,get:e(function(){return typecheck_bus_1.publishTypecheckRun},"get")}),Object.defineProperty(exports,"resolveEventFile",{enumerable:!0,get:e(function(){return typecheck_bus_1.resolveEventFile},"get")});var fork_ts_check_reporter_1=require("./fork-ts-check-reporter");Object.defineProperty(exports,"ForkTsCheckReporterPlugin",{enumerable:!0,get:e(function(){return fork_ts_check_reporter_1.ForkTsCheckReporterPlugin},"get")});
|