@blyp/core 0.1.2 → 0.1.22
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/README.md +273 -14
- package/STABILITY.md +56 -0
- package/dist/ai/anthropic/index.d.ts +3 -0
- package/dist/ai/anthropic/normalize.d.ts +9 -0
- package/dist/ai/anthropic/stream.d.ts +3 -0
- package/dist/ai/anthropic/wrap.d.ts +13 -0
- package/dist/ai/anthropic.js +701 -0
- package/dist/ai/anthropic.mjs +701 -0
- package/dist/ai/fetch.js +701 -0
- package/dist/ai/fetch.mjs +701 -0
- package/dist/ai/openai/index.d.ts +3 -0
- package/dist/ai/openai/normalize.d.ts +10 -0
- package/dist/ai/openai/stream.d.ts +3 -0
- package/dist/ai/openai/wrap.d.ts +24 -0
- package/dist/ai/openai.js +701 -0
- package/dist/ai/openai.mjs +701 -0
- package/dist/ai/shared/fetch.d.ts +5 -0
- package/dist/ai/shared/index.d.ts +2 -0
- package/dist/ai/shared/normalize.d.ts +17 -0
- package/dist/ai/shared/redaction.d.ts +6 -0
- package/dist/ai/shared/stream.d.ts +7 -0
- package/dist/ai/shared/trace.d.ts +116 -0
- package/dist/ai/shared/types.d.ts +161 -0
- package/dist/ai/shared.js +701 -0
- package/dist/ai/shared.mjs +701 -0
- package/dist/ai/vercel/index.d.ts +3 -0
- package/dist/ai/vercel/middleware.d.ts +3 -0
- package/dist/ai/vercel/model.d.ts +3 -0
- package/dist/ai/vercel.js +701 -0
- package/dist/ai/vercel.mjs +701 -0
- package/dist/astro.js +701 -0
- package/dist/astro.mjs +701 -0
- package/dist/client.js +1 -1132
- package/dist/client.mjs +1 -1125
- package/dist/connectors/betterstack.js +9 -1508
- package/dist/connectors/betterstack.mjs +9 -1483
- package/dist/connectors/databuddy/index.d.ts +7 -0
- package/dist/connectors/databuddy/sender.d.ts +5 -0
- package/dist/connectors/databuddy.js +9 -0
- package/dist/connectors/databuddy.mjs +9 -0
- package/dist/connectors/delivery/backoff.d.ts +2 -0
- package/dist/connectors/delivery/manager.d.ts +44 -0
- package/dist/connectors/delivery/queue-path.d.ts +1 -0
- package/dist/connectors/delivery/sqlite-adapter-bun.d.ts +1 -0
- package/dist/connectors/delivery/sqlite-adapter-node.d.ts +1 -0
- package/dist/connectors/delivery/sqlite-client.d.ts +37 -0
- package/dist/connectors/delivery/sqlite-worker.d.ts +1 -0
- package/dist/connectors/delivery/studio-queue.d.ts +12 -0
- package/dist/connectors/delivery/types.d.ts +98 -0
- package/dist/connectors/otlp/index.d.ts +1 -0
- package/dist/connectors/otlp.js +9 -1347
- package/dist/connectors/otlp.mjs +9 -1344
- package/dist/connectors/posthog/properties.d.ts +4 -0
- package/dist/connectors/posthog/sender.d.ts +0 -1
- package/dist/connectors/posthog.js +10 -1503
- package/dist/connectors/posthog.mjs +10 -1498
- package/dist/connectors/sentry.js +9 -1356
- package/dist/connectors/sentry.mjs +9 -1333
- package/dist/core/config.d.ts +7 -2
- package/dist/core/log-record.d.ts +5 -4
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/optional-module.d.ts +1 -0
- package/dist/core/pino-pretty-loader.d.ts +4 -0
- package/dist/database.js +1 -24
- package/dist/database.mjs +1 -21
- package/dist/elysia.js +621 -4100
- package/dist/elysia.mjs +622 -4073
- package/dist/expo.js +1 -719
- package/dist/expo.mjs +1 -717
- package/dist/express.js +616 -4085
- package/dist/express.mjs +616 -4056
- package/dist/fastify.js +618 -4104
- package/dist/fastify.mjs +618 -4075
- package/dist/frameworks/astro/index.d.ts +2 -0
- package/dist/frameworks/astro/logger.d.ts +3 -0
- package/dist/frameworks/elysia/index.d.ts +1 -1
- package/dist/frameworks/elysia/logger.d.ts +2 -35
- package/dist/frameworks/nestjs/helpers.d.ts +2 -0
- package/dist/frameworks/nitro/index.d.ts +2 -0
- package/dist/frameworks/nitro/logger.d.ts +6 -0
- package/dist/frameworks/nuxt/index.d.ts +2 -0
- package/dist/frameworks/nuxt/logger.d.ts +3 -0
- package/dist/frameworks/react-router/index.d.ts +2 -0
- package/dist/frameworks/react-router/logger.d.ts +3 -0
- package/dist/frameworks/shared/h3.d.ts +19 -0
- package/dist/frameworks/shared/http.d.ts +3 -2
- package/dist/frameworks/shared/index.d.ts +2 -1
- package/dist/frameworks/shared/logger.d.ts +2 -0
- package/dist/frameworks/shared/request-context.d.ts +2 -0
- package/dist/frameworks/shared/trace.d.ts +6 -0
- package/dist/hono.js +624 -4079
- package/dist/hono.mjs +626 -4053
- package/dist/index.d.ts +57 -17
- package/dist/index.js +616 -6494
- package/dist/index.mjs +619 -6410
- package/dist/nestjs.js +626 -4574
- package/dist/nestjs.mjs +622 -4542
- package/dist/nextjs.js +625 -4107
- package/dist/nextjs.mjs +627 -4081
- package/dist/nitro.js +701 -0
- package/dist/nitro.mjs +701 -0
- package/dist/nuxt.js +701 -0
- package/dist/nuxt.mjs +701 -0
- package/dist/react-router.js +701 -0
- package/dist/react-router.mjs +701 -0
- package/dist/shared/redaction.d.ts +17 -0
- package/dist/standalone.js +606 -3258
- package/dist/standalone.mjs +611 -3234
- package/dist/sveltekit.js +625 -4106
- package/dist/sveltekit.mjs +626 -4079
- package/dist/tanstack-start.js +624 -4105
- package/dist/tanstack-start.mjs +626 -4079
- package/dist/types/connectors/databuddy.d.ts +52 -0
- package/dist/types/core/config.d.ts +89 -0
- package/dist/types/core/logger.d.ts +5 -0
- package/dist/types/core/structured-log.d.ts +2 -0
- package/dist/types/database.d.ts +1 -0
- package/dist/types/frameworks/astro.d.ts +33 -0
- package/dist/types/frameworks/client.d.ts +2 -0
- package/dist/types/frameworks/elysia.d.ts +2 -0
- package/dist/types/frameworks/express.d.ts +1 -0
- package/dist/types/frameworks/fastify.d.ts +1 -0
- package/dist/types/frameworks/hono.d.ts +1 -0
- package/dist/types/frameworks/http.d.ts +1 -0
- package/dist/types/frameworks/nestjs.d.ts +2 -0
- package/dist/types/frameworks/nextjs.d.ts +1 -0
- package/dist/types/frameworks/nitro.d.ts +63 -0
- package/dist/types/frameworks/nuxt.d.ts +12 -0
- package/dist/types/frameworks/react-router.d.ts +35 -0
- package/dist/types/frameworks/request-context.d.ts +1 -0
- package/dist/types/frameworks/shared.d.ts +28 -1
- package/dist/types/frameworks/standalone.d.ts +3 -2
- package/dist/types/frameworks/sveltekit.d.ts +1 -0
- package/dist/types/frameworks/tanstack-start.d.ts +9 -3
- package/dist/types/frameworks/workers.d.ts +3 -0
- package/dist/types/shared/client-log.d.ts +2 -1
- package/dist/workers.js +2 -626
- package/dist/workers.mjs +2 -623
- package/package.json +273 -143
- package/dist/client.js.map +0 -1
- package/dist/client.mjs.map +0 -1
- package/dist/connectors/betterstack.js.map +0 -1
- package/dist/connectors/betterstack.mjs.map +0 -1
- package/dist/connectors/otlp.js.map +0 -1
- package/dist/connectors/otlp.mjs.map +0 -1
- package/dist/connectors/posthog.js.map +0 -1
- package/dist/connectors/posthog.mjs.map +0 -1
- package/dist/connectors/sentry.js.map +0 -1
- package/dist/connectors/sentry.mjs.map +0 -1
- package/dist/database.js.map +0 -1
- package/dist/database.mjs.map +0 -1
- package/dist/elysia.js.map +0 -1
- package/dist/elysia.mjs.map +0 -1
- package/dist/expo.js.map +0 -1
- package/dist/expo.mjs.map +0 -1
- package/dist/express.js.map +0 -1
- package/dist/express.mjs.map +0 -1
- package/dist/fastify.js.map +0 -1
- package/dist/fastify.mjs.map +0 -1
- package/dist/hono.js.map +0 -1
- package/dist/hono.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/nestjs.js.map +0 -1
- package/dist/nestjs.mjs.map +0 -1
- package/dist/nextjs.js.map +0 -1
- package/dist/nextjs.mjs.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/standalone.mjs.map +0 -1
- package/dist/sveltekit.js.map +0 -1
- package/dist/sveltekit.mjs.map +0 -1
- package/dist/tanstack-start.js.map +0 -1
- package/dist/tanstack-start.mjs.map +0 -1
- package/dist/workers.js.map +0 -1
- package/dist/workers.mjs.map +0 -1
- package/exports/client.js +0 -3
- package/exports/client.mjs +0 -3
- package/exports/connectors/betterstack.js +0 -1
- package/exports/connectors/betterstack.mjs +0 -1
- package/exports/connectors/otlp.js +0 -1
- package/exports/connectors/otlp.mjs +0 -1
- package/exports/connectors/posthog.js +0 -1
- package/exports/connectors/posthog.mjs +0 -1
- package/exports/connectors/sentry.js +0 -1
- package/exports/connectors/sentry.mjs +0 -1
- package/exports/database.js +0 -1
- package/exports/database.mjs +0 -1
- package/exports/expo.js +0 -1
- package/exports/expo.mjs +0 -1
- package/exports/frameworks/elysia.js +0 -1
- package/exports/frameworks/elysia.mjs +0 -1
- package/exports/frameworks/express.js +0 -1
- package/exports/frameworks/express.mjs +0 -1
- package/exports/frameworks/fastify.js +0 -1
- package/exports/frameworks/fastify.mjs +0 -1
- package/exports/frameworks/hono.js +0 -1
- package/exports/frameworks/hono.mjs +0 -1
- package/exports/frameworks/nestjs.js +0 -1
- package/exports/frameworks/nestjs.mjs +0 -1
- package/exports/frameworks/nextjs.js +0 -1
- package/exports/frameworks/nextjs.mjs +0 -1
- package/exports/frameworks/standalone.js +0 -1
- package/exports/frameworks/standalone.mjs +0 -1
- package/exports/frameworks/sveltekit.js +0 -1
- package/exports/frameworks/sveltekit.mjs +0 -1
- package/exports/frameworks/tanstack-start.js +0 -1
- package/exports/frameworks/tanstack-start.mjs +0 -1
- package/exports/workers.js +0 -1
- package/exports/workers.mjs +0 -1
- package/types/client.d.ts +0 -34
- package/types/connectors/betterstack.d.ts +0 -1
- package/types/connectors/otlp.d.ts +0 -1
- package/types/connectors/posthog.d.ts +0 -1
- package/types/connectors/sentry.d.ts +0 -1
- package/types/database.d.ts +0 -1
- package/types/expo.d.ts +0 -17
- package/types/frameworks/client.d.ts +0 -160
- package/types/frameworks/elysia.d.ts +0 -1
- package/types/frameworks/expo.d.ts +0 -50
- package/types/frameworks/express.d.ts +0 -1
- package/types/frameworks/fastify.d.ts +0 -1
- package/types/frameworks/hono.d.ts +0 -1
- package/types/frameworks/nestjs.d.ts +0 -1
- package/types/frameworks/nextjs.d.ts +0 -1
- package/types/frameworks/standalone.d.ts +0 -1
- package/types/frameworks/sveltekit.d.ts +0 -1
- package/types/frameworks/tanstack-start.d.ts +0 -1
- package/types/frameworks/workers.d.ts +0 -115
- package/types/index.d.ts +0 -1
- package/types/workers.d.ts +0 -13
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
'use strict';var zod=require('zod'),S=require('fs'),jiti=require('jiti'),U=require('path'),sn=require('os'),fflate=require('fflate'),dr=require('pino'),module$1=require('module'),async_hooks=require('async_hooks'),crypto=require('crypto'),worker_threads=require('worker_threads');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var S__default=/*#__PURE__*/_interopDefault(S);var U__default=/*#__PURE__*/_interopDefault(U);var sn__default=/*#__PURE__*/_interopDefault(sn);var dr__default=/*#__PURE__*/_interopDefault(dr);var Br=Object.defineProperty;var Ir=(e,t,r)=>t in e?Br(e,t,{enumerable:true,configurable:true,writable:true,value:r}):e[t]=r;var d=(e,t,r)=>Ir(e,typeof t!="symbol"?t+"":t,r);function ie(e){return `${{GET:"\x1B[32m",POST:"\x1B[36m",PUT:"\x1B[33m",PATCH:"\x1B[34m",DELETE:"\x1B[31m"}[e.toUpperCase()]||""}${e}\x1B[0m`}function ae(e){let t="\x1B[0m";return e>=500?`\x1B[31m${e}${t}`:e>=400?`\x1B[33m${e}${t}`:e>=300?`\x1B[36m${e}${t}`:e>=200?`\x1B[32m${e}${t}`:`\x1B[37m${e}${t}`}function Rt(e){return {GET:"\u2192",POST:"\u2191",PUT:"\u21D1",PATCH:"\u2197",DELETE:"\u2715"}[e.toUpperCase()]||"\u2022"}function se(e){let t="\x1B[0m";return e<100?`\x1B[32m${e}ms${t}`:e<300?`\x1B[33m${e}ms${t}`:e<1e3?`\x1B[31m${e}ms${t}`:`\x1B[41m\x1B[37m${e}ms${t}`}function ce(e){let t={name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let r=e;return r.cause!==void 0&&(t.cause=x(r.cause)),t}function x(e,t=new WeakSet){if(e instanceof Error)return ce(e);if(typeof e=="function")return `[Function: ${e.name||"anonymous"}]`;if(typeof e=="symbol")return e.toString();if(e==null)return e;if(Array.isArray(e))return e.map(r=>x(r,t));if(typeof e=="object"){if(t.has(e))return "[Circular]";t.add(e);let r={};for(let[o,n]of Object.entries(e))r[o]=x(n,t);return t.delete(e),r}return e}function Ae(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message||e.name;let t=x(e);if(typeof t=="string")return t;try{return JSON.stringify(t,null,2)??String(t)}catch{return String(t)}}var Lt="[REDACTED]",Or=["password","passwd","pwd","secret","token","api_key","apikey","api_secret","authorization","auth","x-api-key","private_key","privatekey","access_token","refresh_token","client_secret","session","cookie","set-cookie","ssn","credit_card","card_number","cvv","cvc","otp","pin"],Nr=["authorization","cookie","set-cookie","x-api-key","x-auth-token"],Mr=[{type:"bearer",pattern:/\bBearer\s+(?:sk-[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{16,}|eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+|[A-Za-z0-9._~+/-]{20,})\b/g},{type:"jwt",pattern:/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g},{type:"api_key",pattern:/\b(?:sk-[A-Za-z0-9]{20,}|pk_(?:live|test)_[A-Za-z0-9]{16,})\b/g}],Fr=/\b(?:\d[ -]*?){16}\b/g;function wt(e){let t=new Set,r=[];for(let o of e)typeof o!="string"||o.length===0||t.has(o)||(t.add(o),r.push(o));return r}function zr(e){let t=e.flags.includes("g")?e.flags:`${e.flags}g`;return new RegExp(e.source,t)}function qr(e){if(!e||typeof e!="object"||Array.isArray(e))return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function jr(e){return new Set(e.keys.map(t=>t.toLowerCase()))}function $r(e){return new Set([...Nr,...e.keys.map(t=>t.toLowerCase())])}function Ur(e){return e.split(".").filter(Boolean)}function Be(e,t,r=0,o=0){if(r===e.length)return o===t.length;let n=e[r];if(n==="**"){if(r===e.length-1)return true;for(let a=o;a<=t.length;a+=1)if(Be(e,t,r+1,a))return true;return false}return o>=t.length||n!=="*"&&n!==t[o]?false:Be(e,t,r+1,o+1)}function Wr(e,t){return e.length===0||t.paths.length===0?false:t.paths.some(r=>Be(Ur(r),e))}function Hr(e){let t=e.replace(/\D/g,"");if(t.length!==16)return false;let r=0,o=false;for(let n=t.length-1;n>=0;n-=1){let a=Number(t[n]);o&&(a*=2,a>9&&(a-=9)),r+=a,o=!o;}return r%10===0}function le(e,t,r){if(r||t.disablePatternScanning)return e;let o=e;for(let{type:n,pattern:a}of Mr)o=o.replace(a,`[REDACTED:${n}]`);o=o.replace(Fr,n=>Hr(n)?"[REDACTED:card]":n);for(let n of t.patterns)o=o.replace(zr(n),"[REDACTED:pattern]");return o}function ue(e,t,r,o){if(typeof e=="string")return le(e,t,!!o.skipPatternScanning);if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map((a,i)=>ue(a,t,r,{path:[...o.path,String(i)],skipPatternScanning:o.skipPatternScanning}));if(!qr(e))return e;let n={};for(let[a,i]of Object.entries(e)){let s=[...o.path,a];if(r.has(a.toLowerCase())||Wr(s,t)){if(i==null||typeof i=="string"||typeof i=="number"||typeof i=="boolean"){n[a]=Lt;continue}n[a]=ue(i,t,r,{path:s,skipPatternScanning:o.skipPatternScanning});continue}n[a]=ue(i,t,r,{path:s,skipPatternScanning:o.skipPatternScanning});}return n}function T(e,t){return {keys:wt([...Or,...e?.keys??[],...t?.keys??[]]),paths:wt([...e?.paths??[],...t?.paths??[]]),patterns:[...e?.patterns??[],...t?.patterns??[]].filter(r=>r instanceof RegExp),disablePatternScanning:t?.disablePatternScanning??e?.disablePatternScanning??false}}function R(e,t,r={path:[]}){let o=x(e);return ue(o,t,jr(t),r)}function B(e,t){return typeof e=="string"?le(e,t,false):Ae(R(e,t))}function Qr(e){if(!e)return {};if(e instanceof Headers){let t={};return e.forEach((r,o)=>{t[o]=r;}),t}if(typeof e.entries=="function"){let t={};for(let[r,o]of e.entries())t[r]=o;return t}return typeof e.get=="function"?{}:{...e}}function St(e,t){let r=Qr(e),o=$r(t),n={};for(let[a,i]of Object.entries(r)){if(o.has(a.toLowerCase())){n[a]=Lt;continue}if(Array.isArray(i)){n[a]=i.map(s=>le(s,t,false));continue}n[a]=typeof i=="string"?le(i,t,false):i;}return n}function w(e,t){if(!e)return;if(e instanceof Headers||typeof e.get=="function")return e.get(t)??e.get(t.toLowerCase())??void 0;let r=e,o=r[t]??r[t.toLowerCase()];return Array.isArray(o)?o[0]:o}function Gr(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean).map(t=>t.match(/for="?(\[[^\]]+\]|[^;,\s"]+)/i)?.[1]?.replace(/^"|"$/g,"")??"").map(t=>t.replace(/^\[|\]$/g,"")).filter(Boolean):[]}function Jr(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function Kr(e){if(e.startsWith("[")){let t=e.indexOf("]");return t>=0?e.slice(1,t):e}return e.replace(/:\d+$/,"")}function Vr(e){return /edg\//i.test(e)?"Edge":/opr\//i.test(e)||/opera/i.test(e)?"Opera":/chrome\//i.test(e)&&!/edg\//i.test(e)?"Chrome":/firefox\//i.test(e)?"Firefox":/safari\//i.test(e)&&!/chrome\//i.test(e)?"Safari":/curl\//i.test(e)?"curl":/postmanruntime/i.test(e)?"Postman":"Unknown"}function Xr(e){return /windows/i.test(e)?"Windows":/android/i.test(e)?"Android":/iphone|ipad|ipod/i.test(e)?"iOS":/mac os x|macintosh/i.test(e)?"macOS":/linux/i.test(e)?"Linux":"Unknown"}function Yr(e){return e?/bot|crawler|spider|curl|wget|postmanruntime/i.test(e)?"bot":/ipad|tablet/i.test(e)?"tablet":/mobi|iphone|android/i.test(e)?"mobile":"desktop":"unknown"}function I(e,t="/"){if(!e)return t;if(e.startsWith("http://")||e.startsWith("https://"))try{return new URL(e).pathname||t}catch{return t}if(e.startsWith("/")){let r=e.indexOf("?");return r>=0?e.slice(0,r):e}try{return new URL(e,"http://localhost").pathname||t}catch{return t}}function de(e,t,r){return {method:e,url:t,headers:r}}function Ie(e,t,r=T()){let o=t??I(e.url),n=(()=>{try{return new URL(e.url)}catch{try{return new URL(o,"http://localhost")}catch{return null}}})(),a=w(e.headers,"x-forwarded-host")??w(e.headers,"host")??n?.host??void 0,i=a?Kr(a):n?.hostname,s=a?.match(/:(\d+)$/)?.[1]??(n?.port||void 0),l=Jr(w(e.headers,"x-forwarded-for")),u=Gr(w(e.headers,"forwarded")),c=[w(e.headers,"cf-connecting-ip"),w(e.headers,"true-client-ip"),w(e.headers,"fly-client-ip"),w(e.headers,"x-real-ip"),w(e.headers,"x-client-ip"),l[0],u[0]].filter(h=>!!h),p=w(e.headers,"user-agent"),m=w(e.headers,"sec-ch-ua-platform")?.replace(/^"|"$/g,"")??void 0,y=Yr(p??"");return {hostname:i,ip:c[0],forwardedFor:[...l,...u].filter((h,f,g)=>g.indexOf(h)===f),protocol:w(e.headers,"x-forwarded-proto")??(n?.protocol?n.protocol.replace(/:$/,""):void 0),port:s,userAgent:p,origin:w(e.headers,"origin"),referer:w(e.headers,"referer"),acceptLanguage:w(e.headers,"accept-language"),headers:St(e.headers,r),client:{ip:c[0],hostname:i,browser:p?Vr(p):void 0,os:p?Xr(p):void 0,deviceType:y,platform:m,isMobile:y==="mobile"}}}function ge(e,t,r,o,n,a={},i=T()){return {type:t,method:e.method,url:r,statusCode:o,responseTime:n,...Ie(e,r,i),...a}}function pe(e,t,r,o){let n=ie(e),a=ae(t),i=se(o),s=Rt(e);return `${n} ${s} ${a} ${r} ${i}`}function J(e,t){if(e==null)return t===void 0?void 0:{statusCode:t,message:`HTTP ${t}`};if(e instanceof Error){let r=e;return {status:r.status,statusCode:r.statusCode??t,code:r.code,message:e.message,stack:e.stack,why:r.why,fix:r.fix,link:r.link,details:r.details,cause:r.cause}}if(typeof e=="object"){let r=e;return {status:typeof r.status=="number"?r.status:void 0,statusCode:typeof r.statusCode=="number"?r.statusCode:t,code:typeof r.code=="string"||typeof r.code=="number"?r.code:void 0,message:typeof r.message=="string"?r.message:`HTTP ${t??500}`,stack:typeof r.stack=="string"?r.stack:void 0,why:typeof r.why=="string"?r.why:void 0,fix:typeof r.fix=="string"?r.fix:void 0,link:typeof r.link=="string"?r.link:void 0,details:r.details!==null&&typeof r.details=="object"&&!Array.isArray(r.details)?r.details:void 0,cause:r.cause}}return {statusCode:t,message:typeof e=="string"?e:`HTTP ${t??500}`}}function Oe(e){return e>=400}var Zr=zod.z.string().url().refine(e=>{try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return false}},{message:"Expected an absolute http(s) URL"}),K=zod.z.custom(e=>e!==null&&typeof e=="object"&&!Array.isArray(e),{message:"Expected a plain object"}),Me=zod.z.string().trim().min(1);function Fe(e){return Zr.safeParse(e).success}function z(e){return K.safeParse(e).success}function O(e){return Me.safeParse(e).success}var N="/inngest";var en=["debug","info","warning","error","critical","success","table"],tn=zod.z.union([zod.z.literal("betterstack"),zod.z.literal("databuddy"),zod.z.literal("posthog"),zod.z.literal("sentry"),zod.z.undefined(),zod.z.object({type:zod.z.literal("otlp"),name:Me})]);function rn(e){return typeof e=="string"&&en.includes(e)}function nn(e){return tn.safeParse(e).success}function on(e){try{return e()}catch{return}}function an(){return Math.random().toString(36).slice(2,10)}function fe(){let e=on(()=>globalThis.crypto),t=e&&typeof e.randomUUID=="function"?e.randomUUID.bind(e):void 0;return t?t():`${Date.now().toString(36)}-${an()}`}function vt(e){if(!z(e)||e.type!=="client_log"||e.source!=="client"||!rn(e.level)||typeof e.id!="string"||typeof e.message!="string"||typeof e.clientTimestamp!="string")return false;let t=K.safeParse(e.page),r=K.safeParse(e.browser),o=K.safeParse(e.session);return !t.success||!r.success||!o.success||!nn(e.connector)?false:typeof o.data.pageId=="string"&&typeof o.data.sessionId=="string"}function ze(e){return e?e.startsWith("/")?e:`/${e}`:N}function Tt(){return U__default.default.join(sn__default.default.homedir(),".blyp","queue.db")}function un(e,t=new Set){return (r,o,n)=>{if(t.has(r)||typeof console>"u")return;let a=console[e];if(typeof a=="function"){if(t.add(r),n===void 0){a.call(console,o);return}a.call(console,o,n);}}}function k(e){return un("warn",e)}var pn="@blyp/core",fn=".gitignore",kt=["blyp.config.ts","blyp.config.mts","blyp.config.cts","blyp.config.js","blyp.config.mjs","blyp.config.cjs","blyp.config.json"],mn="blyp.config.json",yn="https://us.i.posthog.com",hn="blyp-app",bn=hn,Cn=new Set,_=k(Cn),_t={enabled:true,maxSizeBytes:10*1024*1024,maxArchives:5,compress:true},Pt={enabled:true,dir:"",archiveDir:"",format:"ndjson",rotation:_t},qe={enabled:true,path:N},At=T(),q={maxAttempts:8,initialBackoffMs:500,maxBackoffMs:3e4,multiplier:2,jitter:true},v={enabled:false,memoryBufferSize:500,durableQueuePath:Tt(),durableSpillStrategy:"after-first-failure",memoryBatchSize:25,sqliteWriteBatchSize:100,sqliteReadBatchSize:50,dispatchConcurrency:4,pollIntervalMs:1e3,overflowStrategy:"drop-oldest",retry:q},Bt={maxRetries:1,backoffMs:100},Rn={strategy:"immediate",batchSize:1,flushIntervalMs:250,maxQueueSize:1e3,overflowStrategy:"drop-oldest",flushTimeoutMs:5e3,retry:Bt},xt={pretty:true,level:"info",destination:"file",file:Pt,clientLogging:qe,redact:At,connectors:{delivery:v}},V=null;function wn(e){let t=e;for(;;){let r=U.resolve(t,"package.json");if(S.existsSync(r))try{let n=JSON.parse(S.readFileSync(r,"utf-8"));if(O(n.name))return n.name}catch{}let o=U.dirname(t);if(o===t)return;t=o;}}function $e(e=process.cwd()){return wn(e)??bn}function Ln(){return {pretty:true,level:"info",destination:"file",file:{enabled:true,format:"ndjson",rotation:{enabled:true,maxSizeBytes:10*1024*1024,maxArchives:5,compress:true}},clientLogging:{enabled:true,path:N},redact:At,connectors:{delivery:v}}}function Sn(e){let t=U.resolve(e,"package.json");if(!S.existsSync(t))return true;try{return JSON.parse(S.readFileSync(t,"utf-8")).name!==pn}catch{return true}}function vn(e){if(kt.some(r=>S.existsSync(U.resolve(e,r))))return;let t=U.resolve(e,mn);if(!S.existsSync(t))try{S.writeFileSync(t,`${JSON.stringify(Ln(),null,2)}
|
|
2
|
+
`);}catch(r){console.error("[Blyp] Warning: Failed to create blyp.config.json:",r);}}function Tn(e){let t=U.resolve(e,fn);if(!S.existsSync(t)){try{S.writeFileSync(t,`logs
|
|
3
|
+
.blyp
|
|
4
|
+
`);}catch(r){console.error("[Blyp] Warning: Failed to create .gitignore:",r);}return}try{let r=S.readFileSync(t,"utf-8"),o=["logs",".blyp"].filter(a=>{let i=a.replace(".","\\.");return !new RegExp(`^(?:/?${i}/?)\\s*$`,"m").test(r)});if(o.length===0)return;let n=r.endsWith(`
|
|
5
|
+
`)?"":`
|
|
6
|
+
`;S.appendFileSync(t,`${n}${o.join(`
|
|
7
|
+
`)}
|
|
8
|
+
`);}catch(r){console.error("[Blyp] Warning: Failed to update .gitignore:",r);}}function xn(){let e=process.cwd();Sn(e)&&(vn(e),Tn(e));}function En(){let e=process.cwd(),t=kt.map(o=>U.resolve(e,o)).filter(o=>S.existsSync(o));if(t.length===0)return null;if(t.length>1){let o=t[0];_(`config-multiple:${o}`,`[Blyp] Warning: Multiple config files found. Using ${o} and ignoring ${t.slice(1).join(", ")}.`);}let r=t[0];return {path:r,type:r.endsWith(".json")?"json":"jiti"}}function It(e,t){let r=e&&typeof e=="object"&&"default"in e&&e.default!==void 0?e.default:e;return !r||typeof r!="object"||Array.isArray(r)?(_(`config-invalid:${t}`,`[Blyp] Warning: Config file ${t} did not export an object. Falling back to defaults.`),{}):r}function Dn(e){try{let t=S.readFileSync(e,"utf-8");return It(JSON.parse(t),e)}catch(t){return console.error("[Blyp] Warning: Failed to parse blyp.config.json:",t),{}}}function kn(e){try{let t=jiti.createJiti(process.cwd(),{interopDefault:!0,moduleCache:!1,fsCache:!1});return It(t(e),e)}catch(t){return console.error(`[Blyp] Warning: Failed to load ${e}:`,t),{}}}function _n(e){return e.type==="json"?Dn(e.path):kn(e.path)}function Et(e){return !!e&&typeof e=="object"&&e.type==="prisma"}function Pn(e){return !!e&&typeof e=="object"&&e.type==="drizzle"}function An(e,t){return {...Bt,...e,...t}}function Bn(e,t){return {...Rn,...e,...t,retry:An(e?.retry,t?.retry)}}function In(e){let t=e.model??"blypLog",o=e.client?.[t];return !!o&&typeof o.create=="function"}function On(e){let t=e.db;return !!t&&typeof t.insert=="function"&&e.table!==void 0}function Nn(e,t){if(!e)return;let r=e.adapter,o=false;t==="json"?_("database-json-config","[Blyp] Warning: Database logging requires an executable blyp config file. Database destination remains disabled until you move this config to blyp.config.ts/js."):e.dialect!=="postgres"&&e.dialect!=="mysql"?_(`database-dialect:${String(e.dialect)}`,`[Blyp] Warning: Unsupported database dialect "${String(e.dialect)}". Database logging is disabled.`):r?Et(r)?(o=In({...r,model:r.model??"blypLog"}),o||_("database-prisma-missing",`[Blyp] Warning: Prisma database adapter is missing the "${r.model??"blypLog"}" delegate or its create method. Database logging is disabled.`)):Pn(r)&&(o=On(r),o||_("database-drizzle-missing","[Blyp] Warning: Drizzle database adapter is missing a db.insert function or table reference. Database logging is disabled.")):_("database-adapter-missing","[Blyp] Warning: Database logging is enabled without an adapter. Database logging is disabled.");let n=Et(r)?{...r,model:r.model??"blypLog"}:r;return {dialect:e.dialect,adapter:n,delivery:Bn(void 0,e.delivery),ready:o,status:o?"enabled":"missing"}}function Mn(e,t){return {..._t,...e,...t}}function Fn(e,t){return {...Pt,...e,...t,rotation:Mn(e?.rotation,t?.rotation)}}function zn(e,t){return {...qe,...e,...t,path:t?.path??e?.path??qe.path}}function qn(e,t){return T(e,t)}function jn(e,t){return {maxAttempts:Math.max(1,Math.floor(t?.maxAttempts??e?.maxAttempts??q.maxAttempts)),initialBackoffMs:Math.max(0,Math.floor(t?.initialBackoffMs??e?.initialBackoffMs??q.initialBackoffMs)),maxBackoffMs:Math.max(0,Math.floor(t?.maxBackoffMs??e?.maxBackoffMs??q.maxBackoffMs)),multiplier:Math.max(1,t?.multiplier??e?.multiplier??q.multiplier),jitter:t?.jitter??e?.jitter??q.jitter}}function $n(e,t){let r=t?.durableQueuePath??e?.durableQueuePath??v.durableQueuePath;return {enabled:t?.enabled??e?.enabled??v.enabled,memoryBufferSize:Math.max(1,Math.floor(t?.memoryBufferSize??e?.memoryBufferSize??v.memoryBufferSize)),durableQueuePath:O(r)?r:v.durableQueuePath,durableSpillStrategy:t?.durableSpillStrategy??e?.durableSpillStrategy??v.durableSpillStrategy,memoryBatchSize:Math.max(1,Math.floor(t?.memoryBatchSize??e?.memoryBatchSize??v.memoryBatchSize)),sqliteWriteBatchSize:Math.max(1,Math.floor(t?.sqliteWriteBatchSize??e?.sqliteWriteBatchSize??v.sqliteWriteBatchSize)),sqliteReadBatchSize:Math.max(1,Math.floor(t?.sqliteReadBatchSize??e?.sqliteReadBatchSize??v.sqliteReadBatchSize)),dispatchConcurrency:Math.max(1,Math.floor(t?.dispatchConcurrency??e?.dispatchConcurrency??v.dispatchConcurrency)),pollIntervalMs:Math.max(50,Math.floor(t?.pollIntervalMs??e?.pollIntervalMs??v.pollIntervalMs)),overflowStrategy:t?.overflowStrategy??e?.overflowStrategy??v.overflowStrategy,retry:jn(e?.retry,t?.retry),durableReady:false}}function Un(e,t,r){if(!(!e&&!t))return Nn({dialect:t?.dialect??e?.dialect,adapter:t?.adapter??e?.adapter,delivery:{...e?.delivery??{},...t?.delivery??{},retry:{...e?.delivery?.retry??{},...t?.delivery?.retry??{}}}},r)}function Wn(e,t){let r=t?.enabled??e?.enabled??false,o=t?.projectKey??e?.projectKey,n=e?.enabled===true?e?.errorTracking:void 0,a=t?.errorTracking?.mode??n?.mode??"auto",i=t?.errorTracking?.enabled??n?.enabled??r,s=r&&i&&typeof o=="string"&&o.trim().length>0;return {enabled:r,mode:t?.mode??e?.mode??"auto",projectKey:o,host:t?.host??e?.host??yn,serviceName:t?.serviceName??e?.serviceName??$e(),errorTracking:{enabled:i,mode:a,enableExceptionAutocapture:t?.errorTracking?.enableExceptionAutocapture??n?.enableExceptionAutocapture??a==="auto",ready:s,status:s?"enabled":"missing"}}}function Hn(e,t){let r=t?.enabled??e?.enabled??false,o=t?.apiKey??e?.apiKey,n=t?.websiteId??e?.websiteId,a=r&&O(o)&&O(n);return {enabled:r,mode:t?.mode??e?.mode??"auto",apiKey:o,websiteId:n,namespace:t?.namespace??e?.namespace,source:t?.source??e?.source,apiUrl:t?.apiUrl??e?.apiUrl,debug:t?.debug??e?.debug??false,enableBatching:t?.enableBatching??e?.enableBatching??true,batchSize:t?.batchSize??e?.batchSize,batchTimeout:t?.batchTimeout??e?.batchTimeout,maxQueueSize:t?.maxQueueSize??e?.maxQueueSize,ready:a,status:a?"enabled":"missing"}}function Qn(e,t){let r=t?.sourceToken??e?.sourceToken,o=t?.ingestingHost??e?.ingestingHost,n=t?.enabled??e?.enabled??false,a=e?.enabled===true?e?.errorTracking:void 0,i=Gn(n,a,t?.errorTracking),s=n&&O(r)&&Fe(o);return {enabled:n,mode:t?.mode??e?.mode??"auto",sourceToken:r,ingestingHost:o,serviceName:t?.serviceName??e?.serviceName??$e(),errorTracking:i,ready:s,status:s?"enabled":"missing"}}function Gn(e,t,r){let o=r?.dsn??t?.dsn,n=r?.enabled??t?.enabled??e,a=n&&O(o);return {enabled:n,dsn:o,tracesSampleRate:r?.tracesSampleRate??t?.tracesSampleRate??1,environment:r?.environment??t?.environment,release:r?.release??t?.release,ready:a,status:a?"enabled":"missing"}}function Jn(e,t){let r=t?.dsn??e?.dsn,o=t?.enabled??e?.enabled??false,n=o&&typeof r=="string"&&r.trim().length>0;return {enabled:o,mode:t?.mode??e?.mode??"auto",dsn:r,environment:t?.environment??e?.environment,release:t?.release??e?.release,ready:n,status:n?"enabled":"missing"}}function Kn(e,t){let r=t?.endpoint??e?.endpoint,o=t?.enabled??e?.enabled??false,n={...{},...t?.headers??{}},a=o&&Fe(r);return {name:t?.name??e?.name??"",enabled:o,mode:t?.mode??e?.mode??"auto",endpoint:r,headers:n,auth:t?.auth??e?.auth,serviceName:t?.serviceName??e?.serviceName??$e(),ready:a,status:a?"enabled":"missing"}}function Vn(e,t){let r=t??e??[],o=new Map;for(let n of r)!n||typeof n.name!="string"||n.name.length===0||(o.has(n.name)&&_(`otlp-duplicate:${n.name}`,`[Blyp] Warning: Duplicate OTLP connector name "${n.name}" found. Using the last definition.`),o.set(n.name,Kn(void 0,n)));return Array.from(o.values())}function Xn(e,t){return {betterstack:Qn(e?.betterstack,t?.betterstack),databuddy:Hn(e?.databuddy,t?.databuddy),posthog:Wn(e?.posthog,t?.posthog),sentry:Jn(e?.sentry,t?.sentry),otlp:Vn(e?.otlp,t?.otlp),delivery:$n(e?.delivery,t?.delivery)}}function je(e,t={},r={}){return {...e,...t,destination:t.destination??e.destination??"file",file:Fn(e.file,t.file),database:Un(e.database,t.database,r.configFileType),clientLogging:zn(e.clientLogging,t.clientLogging),redact:qn(e.redact,t.redact),connectors:Xn(e.connectors,t.connectors)}}function Yn(){if(V!==null)return V;xn();let e=En();if(e){let t=_n(e);V=je(xt,t,{configFileType:e.type});}else V=je(xt);return V}function X(e={}){return je(Yn(),e)}function Zn(e){let t=e.indexOf("?"),r=t>=0?e.substring(0,t):e;return r.endsWith("/")&&r.length>1&&(r=r.slice(0,-1)),r.startsWith("/")||(r="/"+r),r}function eo(e){let t=e.indexOf("?"),r=t>=0?e.substring(0,t):e;return r.endsWith("/")&&r.length>1&&(r=r.slice(0,-1)),r.startsWith("/")||(r="/"+r),r}function Ue(e,t){if(!t||t.length===0)return false;let r=Zn(e);return t.some(o=>{let n=eo(o);if(n===r||n==="/**"||n==="**")return true;if(n==="/*")return r.split("/").filter(i=>i.length>0).length===1;if(n.endsWith("/*")&&!n.includes("**")){let a=n.slice(0,-1);return r.startsWith(a)?r.slice(a.length).split("/").filter(l=>l.length>0).length===1:false}if(n.includes("**")){if(n==="/**")return true;if(n.startsWith("/")&&n.endsWith("**")){let l=n.slice(0,-2);return l.endsWith("/")&&l.length>1&&(l=l.slice(0,-1)),l===r?true:r.startsWith(l+"/")}let a=n.indexOf("**"),i=n.substring(0,a),s=n.substring(a+2);return i.endsWith("/")&&i.length>1&&(i=i.slice(0,-1)),i===""&&s===""?true:i!==""&&s===""?r.startsWith(i+"/"):i===""&&s!==""?r.endsWith(s)||r.includes(s+"/"):i!==""&&s!==""?r.startsWith(i)&&(r.endsWith(s)||r.includes(s+"/")):false}if(n.includes("*")){let a=n.lastIndexOf("."),i=n.lastIndexOf("*");if(a>i&&i>0&&n[i-1]==="/"){let c=n.slice(i),p=r.slice(r.lastIndexOf("/")+1),m=p.lastIndexOf(".");if(m>0)return p.slice(m)===c}let s=n.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*");return new RegExp("^"+s+"$").test(r)}return false})}function ro(e){return Buffer.from(fflate.gzipSync(e))}function no(e,t){console.warn(`[Blyp] Warning: ${e}`,t);}function ye(e){S__default.default.mkdirSync(e,{recursive:true});}function oo(e){try{return S__default.default.statSync(e).size}catch{return 0}}function io(e){let t=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0"),o=String(e.getUTCDate()).padStart(2,"0"),n=String(e.getUTCHours()).padStart(2,"0"),a=String(e.getUTCMinutes()).padStart(2,"0"),i=String(e.getUTCSeconds()).padStart(2,"0");return `${t}${r}${o}T${n}${a}${i}Z`}function ao(e,t){let r=`${e}${t}`,o=1;for(;S__default.default.existsSync(r);)r=`${e}-${o}${t}`,o+=1;return r}function so(e,t,r,o){let n=`${t}.`;try{let a=S__default.default.readdirSync(e).filter(s=>s.startsWith(n)&&(s.endsWith(".ndjson")||s.endsWith(".ndjson.gz"))).map(s=>U__default.default.join(e,s)).sort((s,l)=>S__default.default.statSync(s).mtimeMs-S__default.default.statSync(l).mtimeMs),i=Math.max(a.length-r,0);for(let s=0;s<i;s+=1)S__default.default.rmSync(a[s]);}catch(a){o(`Failed to prune archives for ${t}`,a);}}function co(){let e=new WeakSet;return (t,r)=>{if(typeof r=="function")return `[Function: ${r.name||"anonymous"}]`;if(r===void 0)return "[undefined]";if(typeof r=="symbol")return r.toString();if(r!==null&&typeof r=="object"){if(e.has(r))return "[Circular]";e.add(r);}return r}}function He(e){return JSON.stringify(e,co())}function uo(e){let t=e.file,r=t?.dir||e.logDir||U__default.default.join(process.cwd(),"logs"),o=t?.archiveDir||U__default.default.join(r,"archive"),n=t?.rotation;return {enabled:t?.enabled??true,dir:r,archiveDir:o,rotationEnabled:n?.enabled??true,maxSizeBytes:n?.maxSizeBytes??10*1024*1024,maxArchives:n?.maxArchives??5,compress:n?.compress??true}}var We=class{constructor(t,r={}){d(this,"config");d(this,"gzip");d(this,"warn");d(this,"combined");d(this,"error");this.config=uo(t),this.gzip=r.gzip??ro,this.warn=r.warn??no,this.combined={activePath:U__default.default.join(this.config.dir,"log.ndjson"),archivePrefix:"log",bytes:0,queue:[],processing:false},this.error={activePath:U__default.default.join(this.config.dir,"log.error.ndjson"),archivePrefix:"log.error",bytes:0,queue:[],processing:false},this.config.enabled&&(ye(this.config.dir),ye(this.config.archiveDir),this.seedStream(this.combined),this.seedStream(this.error));}write(t){if(!this.config.enabled)return;let r=`${He(t)}
|
|
9
|
+
`;this.enqueue(this.combined,r),(t.level==="error"||t.level==="critical")&&this.enqueue(this.error,r);}enqueue(t,r){t.queue.push(r),this.processQueue(t);}processQueue(t){if(!t.processing){t.processing=true;try{for(;t.queue.length>0;){let r=t.queue.shift();if(r!==void 0)try{this.append(t,r);}catch(o){this.warn(`Failed writing log line for ${t.archivePrefix}`,o);}}}finally{t.processing=false;}}}seedStream(t){t.bytes=oo(t.activePath),this.config.rotationEnabled&&t.bytes>this.config.maxSizeBytes&&t.bytes>0&&(this.rotate(t),S__default.default.closeSync(S__default.default.openSync(t.activePath,"a")),t.bytes=0);}append(t,r){ye(this.config.dir);let o=Buffer.byteLength(r,"utf8");this.config.rotationEnabled&&t.bytes>0&&t.bytes+o>this.config.maxSizeBytes&&this.rotate(t),S__default.default.appendFileSync(t.activePath,r,"utf8"),t.bytes+=o;}rotate(t){if(ye(this.config.archiveDir),!S__default.default.existsSync(t.activePath)||t.bytes===0){t.bytes=0;return}let r=io(new Date),o=U__default.default.join(this.config.archiveDir,`${t.archivePrefix}.${r}`),n=ao(o,".ndjson");if(S__default.default.renameSync(t.activePath,n),this.config.compress)try{let a=`${n}.gz`,i=this.gzip(S__default.default.readFileSync(n));S__default.default.writeFileSync(a,i),S__default.default.rmSync(n);}catch(a){this.warn(`Failed to gzip archive ${n}`,a);}t.bytes=0,so(this.config.archiveDir,t.archivePrefix,this.config.maxArchives,this.warn);}};function Ot(e){return new We(e)}function Qe(e){return z(e.data)?e.data:e}function P(e,t){if(t in e){let n=e[t];if(typeof n=="string"||typeof n=="number")return n}let o=Qe(e)[t];if(typeof o=="string"||typeof o=="number")return o}function Ge(e,t){let r=Qe(e),n=(z(r.page)?r.page:void 0)?.[t];return typeof n=="string"?n:void 0}function Je(e,t){let r=Qe(e),n=(z(r.session)?r.session:void 0)?.[t];return typeof n=="string"?n:void 0}function he(e){return P(e,"type")}function lo(e,t){let r=he(e),o=typeof e.caller=="string"?e.caller:void 0,n=P(e,"groupId"),a=P(e,"traceId"),i=P(e,"method"),s=P(e,"path"),l=P(e,"status"),u=P(e,"duration"),c=Ge(e,"pathname"),p=Ge(e,"url"),m=Je(e,"sessionId"),y=Je(e,"pageId"),h={"blyp.level":e.level,"blyp.source":t,"blyp.payload":He(e)},f=[["blyp.type",r],["blyp.caller",o],["blyp.group_id",n],["blyp.trace_id",a],["http.method",i],["url.path",s],["client.page_path",c],["client.page_url",p],["client.session_id",m],["client.page_id",y]],g=[["http.status_code",l],["blyp.duration_ms",u]];for(let[b,L]of f)L&&(h[b]=L);for(let[b,L]of g)L!==void 0&&(h[b]=L);return h}function Ke(e,t,r={}){return {...lo(e,t),...r}}var po=jiti.createJiti(typeof __filename=="string"?__filename:(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('react-router.js', document.baseURI).href)),{interopDefault:false,moduleCache:true,fsCache:false}),Nt=new Map;function fo(e){if(!e||typeof e!="object")return false;let t="code"in e?e.code:void 0,r="message"in e?e.message:void 0;return t==="MODULE_NOT_FOUND"||t==="ERR_MODULE_NOT_FOUND"||typeof r=="string"&&(r.includes("Cannot find module")||r.includes("Cannot find package"))}function W(e,t,r=`@blyp/core/${e}`){let o=`@blyp/core/${e}`,n=`${o}::${r}`,a=Nt.get(n);if(a)return a;try{let i=po(r);return Nt.set(n,i),i}catch(i){if(!fo(i))throw i;let s=t.map(u=>`"${u}"`).join(", "),l=t.join(" ");throw new Error(`[Blyp] Optional connector dependencies missing for "${o}". Install ${s} to use this API. Example: bun add ${l}. You can also import directly from "${o}".`,{cause:i instanceof Error?i:void 0})}}var yo=module$1.createRequire(typeof __filename=="string"?__filename:(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('react-router.js', document.baseURI).href))),Ve=null;function ho(e){if(!e||typeof e!="object")return false;let t="code"in e?e.code:void 0,r="message"in e?e.message:void 0;return t==="MODULE_NOT_FOUND"||t==="ERR_MODULE_NOT_FOUND"||typeof r=="string"&&(r.includes("Cannot find module")||r.includes("Cannot find package"))}function bo(e){if(typeof e=="function")return e;if(!e||typeof e!="object")return null;let t="default"in e?e.default:void 0;return typeof t=="function"?t:null}function Mt(){if(Ve)return Ve;let e;try{e=yo("pino-pretty");}catch(r){throw ho(r)?new Error('[Blyp] Failed to initialize the pretty logger transport because pretty: true requires "pino-pretty" to be installed.',{cause:r instanceof Error?r:void 0}):new Error('[Blyp] Failed to initialize the pretty logger transport with "pino-pretty".',{cause:r instanceof Error?r:void 0})}let t=bo(e);if(!t)throw new Error('[Blyp] Failed to initialize the pretty logger transport because "pino-pretty" did not expose a callable factory.');return Ve=t,t}var Ft=new async_hooks.AsyncLocalStorage;function Ro(){return {requestScopedLoggerActive:true,structuredCollectorActive:false,structuredLogEmitted:false,mixedLoggerWarningShown:false}}function be(e){return Ft.run(Ro(),e)}function M(){return Ft.getStore()}function Xe(e){let t=M();t&&(t.activeLogger=e);}function Y(e){let t=M();t&&(t.traceId=e);}function A(){return M()?.traceId}function Ye(){let e=M();e&&(e.structuredCollectorActive=true);}function Ze(){let e=M();e&&(e.structuredLogEmitted=true);}function Ce(){let e=M();return !e||!e.requestScopedLoggerActive||!e.structuredCollectorActive?false:(e.mixedLoggerWarningShown||(e.mixedLoggerWarningShown=true,console.warn("[Blyp] Warning: Mixed logger usage detected for this request. The root logger call was ignored because a request-scoped structured logger is active.")),true)}var zt={success:"success",critical:"critical",warning:"warning",info:"info",debug:"debug",error:"error",warn:"warning",table:"table"};function Re(e){return e.replace(/\\/g,"/")}function wo(e){let t=Re(e);return t.startsWith("node:")||t.includes("/node_modules/pino")||t.includes("/node_modules/pino-pretty")||t.includes("/node_modules/@blyp/core/")||t.includes("/blyp/src/core/")||t.includes("/blyp/src/frameworks/")||t.includes("/blyp/src/posthog/")||t.includes("/blyp/dist/")}function Lo(e){let t=Re(e),r=Re(process.cwd());return t.startsWith(`${r}/`)?t.slice(r.length+1):t}function qt(){try{let e=new Error().stack;if(!e)return {file:null,line:null};let t=e.split(`
|
|
10
|
+
`),r=null;for(let o=2;o<t.length;o+=1){let n=t[o];if(!n)continue;let a=n.match(/\((.*):(\d+):\d+\)/)||n.match(/at\s+(.*):(\d+):(\d+)/);if(!a)continue;let i=a[1]||"",s=parseInt(a[2]||"0",10)||null;if(i&&!i.includes("node_modules")&&!wo(i)){let l=Lo(i);if(!Re(l).startsWith("dist/"))return {file:l,line:s};r??(r={file:l,line:s});}}if(r)return r}catch{return {file:null,line:null}}return {file:null,line:null}}var jt=B;function $t(e){return e.replace(/\u001b\[[0-9;]*m/g,"")}function Ut(e,t,r,o,n=T()){let{file:a,line:i}=qt(),s=jt(t,n),l={timestamp:new Date().toISOString(),level:zt[e],message:$t(s)},u=A();return t instanceof Error&&(l.error=R(ce(t),n)),a&&(l.caller=i!==null?`${a}:${i}`:a),r.length===1?l.data=R(r[0],n):r.length>1&&(l.data=R(r,n)),Object.keys(o).length>0&&(l.bindings=R(o,n)),u&&(l.traceId=u),l}function Wt(e,t,r,o,n=T()){let{file:a,line:i}=qt(),s=R(r,n),l=A(),u={message:$t(jt(t,n)),...s};return a&&(u.caller=i!==null?`${a}:${i}`:a),Object.keys(o).length>0&&(u.bindings=R(o,n)),l&&u.traceId===void 0&&(u.traceId=l),u.level=typeof s.level=="string"&&s.level.length>0?s.level:zt[e],u.timestamp=typeof s.timestamp=="string"&&s.timestamp.length>0?s.timestamp:new Date().toISOString(),u}function Ht(e){switch(e){case "debug":return "debug";case "warning":return "warning";case "warn":return "warn";case "error":return "error";case "success":return "success";case "critical":return "critical";case "table":return "table";default:return "info"}}var et=class{constructor(t){this.logger=t;d(this,"isAsync",false);d(this,"isReady",true);}write(t){this.logger.write(t);}async flush(){}async shutdown(){}};function Qt(e){return new et(Ot(e))}function Gt(e){let t=e.db;if(typeof t?.insert!="function"||e.table===void 0)throw new Error("[Blyp] Drizzle database adapter is missing a db.insert function or table reference.");return {async insert(r){r.length!==0&&await t.insert(e.table).values(r);}}}function So(e){let t=String(e??"");return t.includes("createMany")||t.includes("Unknown argument")||t.includes("not supported")||t.includes("is not a function")}function Jt(e){let t=e.client,r=e.model??"blypLog",o=t[r];if(!o||typeof o.create!="function")throw new Error(`[Blyp] Prisma database adapter is missing the "${r}" delegate or its create method.`);let n=o,a=typeof n.createMany=="function";async function i(s){if(typeof t.$transaction=="function"){await t.$transaction(s.map(l=>n.create({data:l})));return}for(let l of s)await n.create({data:l});}return {async insert(s){if(s.length!==0){if(s.length===1){await n.create({data:s[0]});return}if(!a||typeof n.createMany!="function"){await i(s);return}try{await n.createMany({data:s});}catch(l){if(!So(l))throw l;a=false,await i(s);}}}}}function Kt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function H(e){return typeof e=="string"&&e.length>0?e:null}function To(e){if(typeof e=="string"){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t}return new Date}function Vt(e){let t=x(e);return {id:crypto.randomUUID(),timestamp:To(e.timestamp),level:e.level,message:e.message,caller:H(e.caller),type:H(e.type),traceId:H(e.traceId),groupId:H(e.groupId),method:H(e.method),path:H(e.path),status:Kt(e.status),duration:Kt(e.duration),hasError:t.error!=null,data:t.data??null,bindings:t.bindings??null,error:t.error??null,events:t.events??null,record:t,createdAt:new Date}}function xo(e){return !!e&&e.type==="prisma"}function Eo(e){return !!e&&e.type==="drizzle"}function Xt(e){if(xo(e.adapter))return Jt(e.adapter);if(Eo(e.adapter))return Gt(e.adapter);throw new Error("[Blyp] Unsupported database adapter configuration.")}function Do(e){return new Promise(t=>{setTimeout(t,e);})}var we=class{constructor(t){this.config=t;d(this,"isAsync",true);d(this,"isReady",true);d(this,"warnOnce",k(new Set));d(this,"queue",[]);d(this,"writer");d(this,"timer",null);d(this,"processing",false);d(this,"closed",false);d(this,"terminalError",null);d(this,"activeDispatch",null);this.writer=Xt(t);}write(t){this.closed||(this.enqueue(Vt(t)),this.scheduleDispatch());}async flush(){this.timer&&(clearTimeout(this.timer),this.timer=null);let t=(async()=>{if(await this.drain(),this.terminalError)throw this.terminalError})(),r=null;try{await Promise.race([t,new Promise((o,n)=>{r=setTimeout(()=>{this.warnOnce("database-flush-timeout",`[Blyp] Warning: Timed out flushing database logs after ${this.config.delivery.flushTimeoutMs}ms.`),n(new Error("[Blyp] Timed out flushing database logs."));},this.config.delivery.flushTimeoutMs);})]);}finally{r&&clearTimeout(r);}}async shutdown(){this.closed=true,await this.flush();}enqueue(t){this.queue.push(t);let r=this.queue.length-this.config.delivery.maxQueueSize;if(!(r<=0)){if(this.warnOnce("database-overflow",`[Blyp] Warning: Database log queue exceeded ${this.config.delivery.maxQueueSize} entries. Applying ${this.config.delivery.overflowStrategy} overflow handling.`),this.config.delivery.overflowStrategy==="drop-new"){this.queue.splice(this.config.delivery.maxQueueSize);return}this.queue.splice(0,r);}}scheduleDispatch(){if(!this.processing){if(this.config.delivery.strategy==="immediate"){this.drain();return}if(this.queue.length>=this.config.delivery.batchSize){this.drain();return}this.timer||(this.timer=setTimeout(()=>{this.timer=null,this.drain();},this.config.delivery.flushIntervalMs));}}async drain(){if(this.processing){this.activeDispatch&&await this.activeDispatch;return}this.processing=true,this.activeDispatch=this.processQueue();try{await this.activeDispatch;}finally{this.processing=false,this.activeDispatch=null;}}async processQueue(){for(;this.queue.length>0;){let t=this.config.delivery.strategy==="batch"?Math.max(1,this.config.delivery.batchSize):1,r=this.queue.splice(0,t);try{await this.insertWithRetry(r);}catch(o){let n=o instanceof Error?o:new Error(String(o??"Unknown database logging failure"));throw this.terminalError=n,this.warnOnce("database-insert-failure",`[Blyp] Warning: Failed to persist logs to the ${this.config.dialect??"database"} database.`,n),n}}}async insertWithRetry(t){let r=Math.max(1,this.config.delivery.retry.maxRetries+1),o=0;for(;o<r;){o+=1;try{await this.writer.insert(t);return}catch(n){if(o>=r)throw n;await Do(this.config.delivery.retry.backoffMs);}}}};var tt=class{constructor(){d(this,"isAsync",false);d(this,"isReady",false);}write(t){}async flush(){}async shutdown(){}},ko=k(new Set);function Yt(e){if(e.destination!=="database")return Qt(e);let t=e.database;return t?.ready?new we(t):(ko("database-sink-disabled","[Blyp] Warning: Database destination is configured but not ready. Falling back to a no-op primary sink."),new tt)}function Zt(e,t){let r=Math.max(1,Math.floor(e)),o=Math.pow(t.multiplier,r-1),n=Math.min(Math.max(0,Math.floor(t.initialBackoffMs*o)),Math.max(0,t.maxBackoffMs));return t.jitter?Math.floor(Math.random()*(n+1)):n}var er="bun:sqlite";var tr="node:sqlite";function rr(){return `
|
|
11
|
+
const { parentPort } = require('node:worker_threads');
|
|
12
|
+
const fs = require('node:fs');
|
|
13
|
+
const path = require('node:path');
|
|
14
|
+
|
|
15
|
+
const NODE_SQLITE_MODULE = ${JSON.stringify(tr)};
|
|
16
|
+
const BUN_SQLITE_MODULE = ${JSON.stringify(er)};
|
|
17
|
+
const CLAIM_LEASE_MS = 30000;
|
|
18
|
+
|
|
19
|
+
let db;
|
|
20
|
+
let runtime = 'unsupported';
|
|
21
|
+
|
|
22
|
+
async function loadDatabase() {
|
|
23
|
+
try {
|
|
24
|
+
const mod = await import(BUN_SQLITE_MODULE);
|
|
25
|
+
const Database = mod.default;
|
|
26
|
+
runtime = 'bun';
|
|
27
|
+
return {
|
|
28
|
+
create(filePath) {
|
|
29
|
+
return new Database(filePath);
|
|
30
|
+
},
|
|
31
|
+
exec(instance, sql) {
|
|
32
|
+
instance.exec(sql);
|
|
33
|
+
},
|
|
34
|
+
prepare(instance, sql) {
|
|
35
|
+
return instance.prepare(sql);
|
|
36
|
+
},
|
|
37
|
+
close(instance) {
|
|
38
|
+
instance.close();
|
|
39
|
+
},
|
|
40
|
+
run(statement, params) {
|
|
41
|
+
statement.run(...params);
|
|
42
|
+
},
|
|
43
|
+
all(statement, params) {
|
|
44
|
+
return statement.all(...params);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
} catch {}
|
|
48
|
+
|
|
49
|
+
try {
|
|
50
|
+
const mod = await import(NODE_SQLITE_MODULE);
|
|
51
|
+
runtime = 'node';
|
|
52
|
+
return {
|
|
53
|
+
create(filePath) {
|
|
54
|
+
return new mod.DatabaseSync(filePath);
|
|
55
|
+
},
|
|
56
|
+
exec(instance, sql) {
|
|
57
|
+
instance.exec(sql);
|
|
58
|
+
},
|
|
59
|
+
prepare(instance, sql) {
|
|
60
|
+
return instance.prepare(sql);
|
|
61
|
+
},
|
|
62
|
+
close(instance) {
|
|
63
|
+
instance.close();
|
|
64
|
+
},
|
|
65
|
+
run(statement, params) {
|
|
66
|
+
statement.run(...params);
|
|
67
|
+
},
|
|
68
|
+
all(statement, params) {
|
|
69
|
+
return statement.all(...params);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
} catch {}
|
|
73
|
+
|
|
74
|
+
throw new Error('No built-in SQLite runtime is available in this worker.');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let adapter;
|
|
78
|
+
|
|
79
|
+
function ensureReady() {
|
|
80
|
+
if (!db || !adapter) {
|
|
81
|
+
throw new Error('SQLite durable queue is not initialized.');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function normalizeConnectorTarget(value) {
|
|
86
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function createConnectorCondition() {
|
|
90
|
+
return '(connector_type = ? AND ((connector_target IS NULL AND ? IS NULL) OR connector_target = ?))';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function updateConnectorDeliveryStatus(item, success) {
|
|
94
|
+
const connectorTarget = normalizeConnectorTarget(item.connectorTarget);
|
|
95
|
+
const select = adapter.prepare(
|
|
96
|
+
db,
|
|
97
|
+
'SELECT rowid FROM connector_delivery_status WHERE ' + createConnectorCondition() + ' LIMIT 1'
|
|
98
|
+
);
|
|
99
|
+
const existing = adapter.all(select, [item.connectorType, connectorTarget, connectorTarget])[0];
|
|
100
|
+
|
|
101
|
+
if (existing) {
|
|
102
|
+
const update = adapter.prepare(
|
|
103
|
+
db,
|
|
104
|
+
success
|
|
105
|
+
? 'UPDATE connector_delivery_status SET last_success_at = ?, last_error = NULL, updated_at = ? WHERE rowid = ?'
|
|
106
|
+
: 'UPDATE connector_delivery_status SET last_failure_at = ?, last_error = ?, updated_at = ? WHERE rowid = ?'
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
adapter.run(
|
|
110
|
+
update,
|
|
111
|
+
success
|
|
112
|
+
? [item.timestamp, item.timestamp, existing.rowid]
|
|
113
|
+
: [item.timestamp, item.lastError ?? null, item.timestamp, existing.rowid]
|
|
114
|
+
);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const insert = adapter.prepare(
|
|
119
|
+
db,
|
|
120
|
+
'INSERT INTO connector_delivery_status (connector_type, connector_target, last_success_at, last_failure_at, last_error, updated_at) VALUES (?, ?, ?, ?, ?, ?)'
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
adapter.run(insert, [
|
|
124
|
+
item.connectorType,
|
|
125
|
+
connectorTarget,
|
|
126
|
+
success ? item.timestamp : null,
|
|
127
|
+
success ? null : item.timestamp,
|
|
128
|
+
success ? null : item.lastError ?? null,
|
|
129
|
+
item.timestamp,
|
|
130
|
+
]);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function initializeSchema() {
|
|
134
|
+
ensureReady();
|
|
135
|
+
adapter.exec(db, [
|
|
136
|
+
'PRAGMA journal_mode = WAL;',
|
|
137
|
+
'PRAGMA busy_timeout = 5000;',
|
|
138
|
+
'CREATE TABLE IF NOT EXISTS connector_queue_meta (schema_version INTEGER NOT NULL);',
|
|
139
|
+
'DELETE FROM connector_queue_meta;',
|
|
140
|
+
'INSERT INTO connector_queue_meta (schema_version) VALUES (2);',
|
|
141
|
+
'CREATE TABLE IF NOT EXISTS connector_jobs (',
|
|
142
|
+
' id TEXT PRIMARY KEY,',
|
|
143
|
+
' connector_type TEXT NOT NULL,',
|
|
144
|
+
' connector_target TEXT NULL,',
|
|
145
|
+
' operation TEXT NOT NULL,',
|
|
146
|
+
' payload_json TEXT NOT NULL,',
|
|
147
|
+
' attempt_count INTEGER NOT NULL,',
|
|
148
|
+
' max_attempts INTEGER NOT NULL,',
|
|
149
|
+
' next_attempt_at INTEGER NOT NULL,',
|
|
150
|
+
' state TEXT NOT NULL,',
|
|
151
|
+
' last_error TEXT NULL,',
|
|
152
|
+
' created_at INTEGER NOT NULL,',
|
|
153
|
+
' updated_at INTEGER NOT NULL,',
|
|
154
|
+
' claimed_at INTEGER NULL',
|
|
155
|
+
');',
|
|
156
|
+
'CREATE TABLE IF NOT EXISTS connector_dead_letters (',
|
|
157
|
+
' id TEXT PRIMARY KEY,',
|
|
158
|
+
' connector_type TEXT NOT NULL,',
|
|
159
|
+
' connector_target TEXT NULL,',
|
|
160
|
+
' operation TEXT NOT NULL,',
|
|
161
|
+
' payload_json TEXT NOT NULL,',
|
|
162
|
+
' attempt_count INTEGER NOT NULL,',
|
|
163
|
+
' max_attempts INTEGER NOT NULL,',
|
|
164
|
+
' last_error TEXT NULL,',
|
|
165
|
+
' first_enqueued_at INTEGER NOT NULL,',
|
|
166
|
+
' dead_lettered_at INTEGER NOT NULL,',
|
|
167
|
+
' last_attempt_at INTEGER NOT NULL',
|
|
168
|
+
');',
|
|
169
|
+
'CREATE TABLE IF NOT EXISTS connector_delivery_status (',
|
|
170
|
+
' connector_type TEXT NOT NULL,',
|
|
171
|
+
' connector_target TEXT NULL,',
|
|
172
|
+
' last_success_at INTEGER NULL,',
|
|
173
|
+
' last_failure_at INTEGER NULL,',
|
|
174
|
+
' last_error TEXT NULL,',
|
|
175
|
+
' updated_at INTEGER NOT NULL',
|
|
176
|
+
');',
|
|
177
|
+
'CREATE INDEX IF NOT EXISTS idx_connector_jobs_state_due ON connector_jobs(state, next_attempt_at);',
|
|
178
|
+
'CREATE INDEX IF NOT EXISTS idx_connector_jobs_connector_state_due ON connector_jobs(connector_type, connector_target, state, next_attempt_at);',
|
|
179
|
+
'CREATE INDEX IF NOT EXISTS idx_connector_dead_letters_connector_dead_lettered ON connector_dead_letters(connector_type, connector_target, dead_lettered_at);',
|
|
180
|
+
'CREATE INDEX IF NOT EXISTS idx_connector_delivery_status_connector ON connector_delivery_status(connector_type, connector_target);'
|
|
181
|
+
].join('\\n'));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function reclaimExpired(now) {
|
|
185
|
+
ensureReady();
|
|
186
|
+
const statement = adapter.prepare(
|
|
187
|
+
db,
|
|
188
|
+
'UPDATE connector_jobs SET state = ?, claimed_at = NULL, updated_at = ? WHERE state = ? AND claimed_at IS NOT NULL AND claimed_at <= ?'
|
|
189
|
+
);
|
|
190
|
+
adapter.run(statement, ['pending', now, 'claimed', now - CLAIM_LEASE_MS]);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function insertJobs(jobs) {
|
|
194
|
+
ensureReady();
|
|
195
|
+
if (!Array.isArray(jobs) || jobs.length === 0) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
adapter.exec(db, 'BEGIN');
|
|
200
|
+
try {
|
|
201
|
+
const statement = adapter.prepare(
|
|
202
|
+
db,
|
|
203
|
+
'INSERT OR REPLACE INTO connector_jobs (id, connector_type, connector_target, operation, payload_json, attempt_count, max_attempts, next_attempt_at, state, last_error, created_at, updated_at, claimed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
for (const job of jobs) {
|
|
207
|
+
adapter.run(statement, [
|
|
208
|
+
job.id,
|
|
209
|
+
job.connectorType,
|
|
210
|
+
normalizeConnectorTarget(job.connectorTarget),
|
|
211
|
+
job.operation,
|
|
212
|
+
job.payloadJson,
|
|
213
|
+
job.attemptCount,
|
|
214
|
+
job.maxAttempts,
|
|
215
|
+
job.nextAttemptAt,
|
|
216
|
+
job.state,
|
|
217
|
+
job.lastError ?? null,
|
|
218
|
+
job.createdAt,
|
|
219
|
+
job.updatedAt,
|
|
220
|
+
job.claimedAt ?? null,
|
|
221
|
+
]);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
adapter.exec(db, 'COMMIT');
|
|
225
|
+
} catch (error) {
|
|
226
|
+
adapter.exec(db, 'ROLLBACK');
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function claimDue(limit, now) {
|
|
232
|
+
ensureReady();
|
|
233
|
+
reclaimExpired(now);
|
|
234
|
+
|
|
235
|
+
const select = adapter.prepare(
|
|
236
|
+
db,
|
|
237
|
+
'SELECT * FROM connector_jobs WHERE state = ? AND next_attempt_at <= ? ORDER BY next_attempt_at ASC LIMIT ?'
|
|
238
|
+
);
|
|
239
|
+
const rows = adapter.all(select, ['pending', now, limit]);
|
|
240
|
+
|
|
241
|
+
if (!Array.isArray(rows) || rows.length === 0) {
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
adapter.exec(db, 'BEGIN');
|
|
246
|
+
try {
|
|
247
|
+
const update = adapter.prepare(
|
|
248
|
+
db,
|
|
249
|
+
'UPDATE connector_jobs SET state = ?, claimed_at = ?, updated_at = ? WHERE id = ?'
|
|
250
|
+
);
|
|
251
|
+
for (const row of rows) {
|
|
252
|
+
adapter.run(update, ['claimed', now, now, row.id]);
|
|
253
|
+
row.state = 'claimed';
|
|
254
|
+
row.claimed_at = now;
|
|
255
|
+
row.updated_at = now;
|
|
256
|
+
}
|
|
257
|
+
adapter.exec(db, 'COMMIT');
|
|
258
|
+
} catch (error) {
|
|
259
|
+
adapter.exec(db, 'ROLLBACK');
|
|
260
|
+
throw error;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return rows.map((row) => ({
|
|
264
|
+
id: row.id,
|
|
265
|
+
connectorType: row.connector_type,
|
|
266
|
+
connectorTarget: row.connector_target ?? undefined,
|
|
267
|
+
operation: row.operation,
|
|
268
|
+
payloadJson: row.payload_json,
|
|
269
|
+
attemptCount: row.attempt_count,
|
|
270
|
+
maxAttempts: row.max_attempts,
|
|
271
|
+
nextAttemptAt: row.next_attempt_at,
|
|
272
|
+
state: row.state,
|
|
273
|
+
lastError: row.last_error ?? undefined,
|
|
274
|
+
createdAt: row.created_at,
|
|
275
|
+
updatedAt: row.updated_at,
|
|
276
|
+
claimedAt: row.claimed_at ?? undefined,
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function ack(ids) {
|
|
281
|
+
ensureReady();
|
|
282
|
+
if (!Array.isArray(ids) || ids.length === 0) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
adapter.exec(db, 'BEGIN');
|
|
287
|
+
try {
|
|
288
|
+
const statement = adapter.prepare(db, 'DELETE FROM connector_jobs WHERE id = ?');
|
|
289
|
+
for (const id of ids) {
|
|
290
|
+
adapter.run(statement, [id]);
|
|
291
|
+
}
|
|
292
|
+
adapter.exec(db, 'COMMIT');
|
|
293
|
+
} catch (error) {
|
|
294
|
+
adapter.exec(db, 'ROLLBACK');
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function reschedule(items, now) {
|
|
300
|
+
ensureReady();
|
|
301
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
adapter.exec(db, 'BEGIN');
|
|
306
|
+
try {
|
|
307
|
+
const statement = adapter.prepare(
|
|
308
|
+
db,
|
|
309
|
+
'UPDATE connector_jobs SET state = ?, attempt_count = ?, next_attempt_at = ?, last_error = ?, claimed_at = NULL, updated_at = ? WHERE id = ?'
|
|
310
|
+
);
|
|
311
|
+
for (const item of items) {
|
|
312
|
+
adapter.run(statement, [
|
|
313
|
+
'pending',
|
|
314
|
+
item.attemptCount,
|
|
315
|
+
item.nextAttemptAt,
|
|
316
|
+
item.lastError ?? null,
|
|
317
|
+
now,
|
|
318
|
+
item.id,
|
|
319
|
+
]);
|
|
320
|
+
}
|
|
321
|
+
adapter.exec(db, 'COMMIT');
|
|
322
|
+
} catch (error) {
|
|
323
|
+
adapter.exec(db, 'ROLLBACK');
|
|
324
|
+
throw error;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function deadLetter(items) {
|
|
329
|
+
ensureReady();
|
|
330
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
adapter.exec(db, 'BEGIN');
|
|
335
|
+
try {
|
|
336
|
+
const insert = adapter.prepare(
|
|
337
|
+
db,
|
|
338
|
+
'INSERT OR REPLACE INTO connector_dead_letters (id, connector_type, connector_target, operation, payload_json, attempt_count, max_attempts, last_error, first_enqueued_at, dead_lettered_at, last_attempt_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
|
339
|
+
);
|
|
340
|
+
const remove = adapter.prepare(db, 'DELETE FROM connector_jobs WHERE id = ?');
|
|
341
|
+
|
|
342
|
+
for (const item of items) {
|
|
343
|
+
adapter.run(insert, [
|
|
344
|
+
item.id,
|
|
345
|
+
item.connectorType,
|
|
346
|
+
normalizeConnectorTarget(item.connectorTarget),
|
|
347
|
+
item.operation,
|
|
348
|
+
item.payloadJson,
|
|
349
|
+
item.attemptCount,
|
|
350
|
+
item.maxAttempts,
|
|
351
|
+
item.lastError ?? null,
|
|
352
|
+
item.firstEnqueuedAt,
|
|
353
|
+
item.deadLetteredAt,
|
|
354
|
+
item.lastAttemptAt,
|
|
355
|
+
]);
|
|
356
|
+
adapter.run(remove, [item.id]);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
adapter.exec(db, 'COMMIT');
|
|
360
|
+
} catch (error) {
|
|
361
|
+
adapter.exec(db, 'ROLLBACK');
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function markSuccess(items) {
|
|
367
|
+
ensureReady();
|
|
368
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
adapter.exec(db, 'BEGIN');
|
|
373
|
+
try {
|
|
374
|
+
for (const item of items) {
|
|
375
|
+
updateConnectorDeliveryStatus(item, true);
|
|
376
|
+
}
|
|
377
|
+
adapter.exec(db, 'COMMIT');
|
|
378
|
+
} catch (error) {
|
|
379
|
+
adapter.exec(db, 'ROLLBACK');
|
|
380
|
+
throw error;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function markFailure(items) {
|
|
385
|
+
ensureReady();
|
|
386
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
adapter.exec(db, 'BEGIN');
|
|
391
|
+
try {
|
|
392
|
+
for (const item of items) {
|
|
393
|
+
updateConnectorDeliveryStatus(item, false);
|
|
394
|
+
}
|
|
395
|
+
adapter.exec(db, 'COMMIT');
|
|
396
|
+
} catch (error) {
|
|
397
|
+
adapter.exec(db, 'ROLLBACK');
|
|
398
|
+
throw error;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function getStatusSummary() {
|
|
403
|
+
ensureReady();
|
|
404
|
+
const rows = [];
|
|
405
|
+
const byKey = new Map();
|
|
406
|
+
|
|
407
|
+
const statusRows = adapter.all(
|
|
408
|
+
adapter.prepare(
|
|
409
|
+
db,
|
|
410
|
+
'SELECT connector_type, connector_target, last_success_at, last_failure_at, last_error, updated_at FROM connector_delivery_status'
|
|
411
|
+
),
|
|
412
|
+
[]
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
for (const row of statusRows) {
|
|
416
|
+
const key = row.connector_type + ':' + (row.connector_target ?? '');
|
|
417
|
+
const item = {
|
|
418
|
+
connectorType: row.connector_type,
|
|
419
|
+
connectorTarget: row.connector_target ?? undefined,
|
|
420
|
+
pendingCount: 0,
|
|
421
|
+
deadLetterCount: 0,
|
|
422
|
+
lastSuccessAt: row.last_success_at ?? undefined,
|
|
423
|
+
lastFailureAt: row.last_failure_at ?? undefined,
|
|
424
|
+
lastError: row.last_error ?? undefined,
|
|
425
|
+
updatedAt: row.updated_at ?? undefined,
|
|
426
|
+
};
|
|
427
|
+
byKey.set(key, item);
|
|
428
|
+
rows.push(item);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const pendingRows = adapter.all(
|
|
432
|
+
adapter.prepare(
|
|
433
|
+
db,
|
|
434
|
+
'SELECT connector_type, connector_target, COUNT(*) AS count FROM connector_jobs WHERE state = ? GROUP BY connector_type, connector_target'
|
|
435
|
+
),
|
|
436
|
+
['pending']
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
for (const row of pendingRows) {
|
|
440
|
+
const key = row.connector_type + ':' + (row.connector_target ?? '');
|
|
441
|
+
const item = byKey.get(key) ?? {
|
|
442
|
+
connectorType: row.connector_type,
|
|
443
|
+
connectorTarget: row.connector_target ?? undefined,
|
|
444
|
+
pendingCount: 0,
|
|
445
|
+
deadLetterCount: 0,
|
|
446
|
+
};
|
|
447
|
+
item.pendingCount = Number(row.count ?? 0);
|
|
448
|
+
if (!byKey.has(key)) {
|
|
449
|
+
byKey.set(key, item);
|
|
450
|
+
rows.push(item);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const deadLetterRows = adapter.all(
|
|
455
|
+
adapter.prepare(
|
|
456
|
+
db,
|
|
457
|
+
'SELECT connector_type, connector_target, COUNT(*) AS count FROM connector_dead_letters GROUP BY connector_type, connector_target'
|
|
458
|
+
),
|
|
459
|
+
[]
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
for (const row of deadLetterRows) {
|
|
463
|
+
const key = row.connector_type + ':' + (row.connector_target ?? '');
|
|
464
|
+
const item = byKey.get(key) ?? {
|
|
465
|
+
connectorType: row.connector_type,
|
|
466
|
+
connectorTarget: row.connector_target ?? undefined,
|
|
467
|
+
pendingCount: 0,
|
|
468
|
+
deadLetterCount: 0,
|
|
469
|
+
};
|
|
470
|
+
item.deadLetterCount = Number(row.count ?? 0);
|
|
471
|
+
if (!byKey.has(key)) {
|
|
472
|
+
byKey.set(key, item);
|
|
473
|
+
rows.push(item);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return rows.sort((left, right) => {
|
|
478
|
+
const leftKey = left.connectorType + ':' + (left.connectorTarget ?? '');
|
|
479
|
+
const rightKey = right.connectorType + ':' + (right.connectorTarget ?? '');
|
|
480
|
+
return leftKey.localeCompare(rightKey);
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function listDeadLetters(limit, offset, connectorType, connectorTarget) {
|
|
485
|
+
ensureReady();
|
|
486
|
+
const clauses = [];
|
|
487
|
+
const params = [];
|
|
488
|
+
|
|
489
|
+
if (typeof connectorType === 'string' && connectorType.length > 0) {
|
|
490
|
+
clauses.push('connector_type = ?');
|
|
491
|
+
params.push(connectorType);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (connectorTarget !== undefined) {
|
|
495
|
+
if (connectorTarget === null || connectorTarget === '') {
|
|
496
|
+
clauses.push('connector_target IS NULL');
|
|
497
|
+
} else {
|
|
498
|
+
clauses.push('connector_target = ?');
|
|
499
|
+
params.push(connectorTarget);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const whereSql = clauses.length > 0 ? ' WHERE ' + clauses.join(' AND ') : '';
|
|
504
|
+
const countRow = adapter.all(
|
|
505
|
+
adapter.prepare(db, 'SELECT COUNT(*) AS count FROM connector_dead_letters' + whereSql),
|
|
506
|
+
params
|
|
507
|
+
)[0];
|
|
508
|
+
const rows = adapter.all(
|
|
509
|
+
adapter.prepare(
|
|
510
|
+
db,
|
|
511
|
+
'SELECT * FROM connector_dead_letters' + whereSql + ' ORDER BY dead_lettered_at DESC LIMIT ? OFFSET ?'
|
|
512
|
+
),
|
|
513
|
+
[...params, limit, offset]
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
return {
|
|
517
|
+
items: rows.map((row) => ({
|
|
518
|
+
id: row.id,
|
|
519
|
+
connectorType: row.connector_type,
|
|
520
|
+
connectorTarget: row.connector_target ?? undefined,
|
|
521
|
+
operation: row.operation,
|
|
522
|
+
payloadJson: row.payload_json,
|
|
523
|
+
attemptCount: row.attempt_count,
|
|
524
|
+
maxAttempts: row.max_attempts,
|
|
525
|
+
lastError: row.last_error ?? undefined,
|
|
526
|
+
firstEnqueuedAt: row.first_enqueued_at,
|
|
527
|
+
deadLetteredAt: row.dead_lettered_at,
|
|
528
|
+
lastAttemptAt: row.last_attempt_at,
|
|
529
|
+
})),
|
|
530
|
+
total: Number(countRow?.count ?? 0),
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
function retryDeadLetters(ids, now) {
|
|
535
|
+
ensureReady();
|
|
536
|
+
if (!Array.isArray(ids) || ids.length === 0) {
|
|
537
|
+
return 0;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
adapter.exec(db, 'BEGIN');
|
|
541
|
+
try {
|
|
542
|
+
const select = adapter.prepare(db, 'SELECT * FROM connector_dead_letters WHERE id = ?');
|
|
543
|
+
const insert = adapter.prepare(
|
|
544
|
+
db,
|
|
545
|
+
'INSERT OR REPLACE INTO connector_jobs (id, connector_type, connector_target, operation, payload_json, attempt_count, max_attempts, next_attempt_at, state, last_error, created_at, updated_at, claimed_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
|
546
|
+
);
|
|
547
|
+
const remove = adapter.prepare(db, 'DELETE FROM connector_dead_letters WHERE id = ?');
|
|
548
|
+
let count = 0;
|
|
549
|
+
|
|
550
|
+
for (const id of ids) {
|
|
551
|
+
const row = adapter.all(select, [id])[0];
|
|
552
|
+
if (!row) {
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
adapter.run(insert, [
|
|
557
|
+
row.id,
|
|
558
|
+
row.connector_type,
|
|
559
|
+
row.connector_target ?? null,
|
|
560
|
+
row.operation,
|
|
561
|
+
row.payload_json,
|
|
562
|
+
0,
|
|
563
|
+
row.max_attempts,
|
|
564
|
+
now,
|
|
565
|
+
'pending',
|
|
566
|
+
null,
|
|
567
|
+
row.first_enqueued_at,
|
|
568
|
+
now,
|
|
569
|
+
null,
|
|
570
|
+
]);
|
|
571
|
+
adapter.run(remove, [id]);
|
|
572
|
+
count += 1;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
adapter.exec(db, 'COMMIT');
|
|
576
|
+
return count;
|
|
577
|
+
} catch (error) {
|
|
578
|
+
adapter.exec(db, 'ROLLBACK');
|
|
579
|
+
throw error;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
function clearDeadLetters(ids) {
|
|
584
|
+
ensureReady();
|
|
585
|
+
if (!Array.isArray(ids) || ids.length === 0) {
|
|
586
|
+
return 0;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
adapter.exec(db, 'BEGIN');
|
|
590
|
+
try {
|
|
591
|
+
const select = adapter.prepare(db, 'SELECT id FROM connector_dead_letters WHERE id = ?');
|
|
592
|
+
const remove = adapter.prepare(db, 'DELETE FROM connector_dead_letters WHERE id = ?');
|
|
593
|
+
let count = 0;
|
|
594
|
+
for (const id of ids) {
|
|
595
|
+
const row = adapter.all(select, [id])[0];
|
|
596
|
+
if (!row) {
|
|
597
|
+
continue;
|
|
598
|
+
}
|
|
599
|
+
adapter.run(remove, [id]);
|
|
600
|
+
count += 1;
|
|
601
|
+
}
|
|
602
|
+
adapter.exec(db, 'COMMIT');
|
|
603
|
+
return count;
|
|
604
|
+
} catch (error) {
|
|
605
|
+
adapter.exec(db, 'ROLLBACK');
|
|
606
|
+
throw error;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
function count() {
|
|
611
|
+
ensureReady();
|
|
612
|
+
const statement = adapter.prepare(db, 'SELECT COUNT(*) as count FROM connector_jobs');
|
|
613
|
+
const rows = adapter.all(statement, []);
|
|
614
|
+
return Number(rows[0]?.count ?? 0);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
parentPort.on('message', async (message) => {
|
|
618
|
+
const { id, type, payload } = message;
|
|
619
|
+
try {
|
|
620
|
+
switch (type) {
|
|
621
|
+
case 'init': {
|
|
622
|
+
adapter = await loadDatabase();
|
|
623
|
+
const filePath = payload.path;
|
|
624
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
625
|
+
db = adapter.create(filePath);
|
|
626
|
+
initializeSchema();
|
|
627
|
+
reclaimExpired(Date.now());
|
|
628
|
+
parentPort.postMessage({ id, ok: true, result: { runtime } });
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
case 'insert':
|
|
632
|
+
insertJobs(payload.jobs);
|
|
633
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
634
|
+
return;
|
|
635
|
+
case 'claimDue':
|
|
636
|
+
parentPort.postMessage({ id, ok: true, result: claimDue(payload.limit, payload.now) });
|
|
637
|
+
return;
|
|
638
|
+
case 'ack':
|
|
639
|
+
ack(payload.ids);
|
|
640
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
641
|
+
return;
|
|
642
|
+
case 'reschedule':
|
|
643
|
+
reschedule(payload.items, payload.now);
|
|
644
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
645
|
+
return;
|
|
646
|
+
case 'deadLetter':
|
|
647
|
+
deadLetter(payload.items);
|
|
648
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
649
|
+
return;
|
|
650
|
+
case 'markSuccess':
|
|
651
|
+
markSuccess(payload.items);
|
|
652
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
653
|
+
return;
|
|
654
|
+
case 'markFailure':
|
|
655
|
+
markFailure(payload.items);
|
|
656
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
657
|
+
return;
|
|
658
|
+
case 'getStatusSummary':
|
|
659
|
+
parentPort.postMessage({ id, ok: true, result: getStatusSummary() });
|
|
660
|
+
return;
|
|
661
|
+
case 'listDeadLetters':
|
|
662
|
+
parentPort.postMessage({
|
|
663
|
+
id,
|
|
664
|
+
ok: true,
|
|
665
|
+
result: listDeadLetters(
|
|
666
|
+
payload.limit,
|
|
667
|
+
payload.offset,
|
|
668
|
+
payload.connectorType,
|
|
669
|
+
payload.connectorTarget
|
|
670
|
+
),
|
|
671
|
+
});
|
|
672
|
+
return;
|
|
673
|
+
case 'retryDeadLetters':
|
|
674
|
+
parentPort.postMessage({ id, ok: true, result: retryDeadLetters(payload.ids, payload.now) });
|
|
675
|
+
return;
|
|
676
|
+
case 'clearDeadLetters':
|
|
677
|
+
parentPort.postMessage({ id, ok: true, result: clearDeadLetters(payload.ids) });
|
|
678
|
+
return;
|
|
679
|
+
case 'count':
|
|
680
|
+
parentPort.postMessage({ id, ok: true, result: count() });
|
|
681
|
+
return;
|
|
682
|
+
case 'shutdown':
|
|
683
|
+
if (db && adapter) {
|
|
684
|
+
adapter.close(db);
|
|
685
|
+
db = undefined;
|
|
686
|
+
}
|
|
687
|
+
parentPort.postMessage({ id, ok: true, result: true });
|
|
688
|
+
return;
|
|
689
|
+
default:
|
|
690
|
+
throw new Error('Unknown SQLite worker command: ' + type);
|
|
691
|
+
}
|
|
692
|
+
} catch (error) {
|
|
693
|
+
parentPort.postMessage({
|
|
694
|
+
id,
|
|
695
|
+
ok: false,
|
|
696
|
+
error: error instanceof Error ? error.message : String(error),
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
});
|
|
700
|
+
`}var Le=class{constructor(t){this.path=t;d(this,"worker");d(this,"pending",new Map);d(this,"nextId",1);this.worker=new worker_threads.Worker(rr(),{eval:true}),this.worker.on("message",r=>{let o=this.pending.get(r.id);if(o){if(this.pending.delete(r.id),r.ok){o.resolve(r.result);return}o.reject(new Error(r.error??"SQLite worker request failed."));}}),this.worker.on("error",r=>{for(let o of this.pending.values())o.reject(r instanceof Error?r:new Error(String(r)));this.pending.clear();});}request(t,r={}){let o=this.nextId++;return new Promise((n,a)=>{this.pending.set(o,{resolve:n,reject:a}),this.worker.postMessage({id:o,type:t,payload:r});})}async init(){await this.request("init",{path:this.path});}async insert(t){await this.request("insert",{jobs:t});}async claimDue(t,r){return this.request("claimDue",{limit:t,now:r})}async ack(t){await this.request("ack",{ids:t});}async reschedule(t,r){await this.request("reschedule",{items:t,now:r});}async deadLetter(t){await this.request("deadLetter",{items:t});}async markSuccess(t){await this.request("markSuccess",{items:t});}async markFailure(t){await this.request("markFailure",{items:t});}async getStatusSummary(){return this.request("getStatusSummary")}async listDeadLetters(t){return this.request("listDeadLetters",t)}async retryDeadLetters(t,r){return this.request("retryDeadLetters",{ids:t,now:r})}async clearDeadLetters(t){return this.request("clearDeadLetters",{ids:t})}async count(){return this.request("count")}async shutdown(){try{await this.request("shutdown");}finally{await this.worker.terminate();}}};var nr=Symbol("blyp.connector.batch-dispatch"),Z=Symbol("blyp.connector.delivery-binder");function ee(e){return new Promise(t=>{setTimeout(t,e);})}function Po(e){return e.data===void 0||typeof e.data!="object"||e.data===null||e.data.type!=="client_log"}function or(e){return JSON.stringify(e)}function Ao(e){try{let t=JSON.parse(e);return !t||typeof t!="object"||typeof t.jobId!="string"?null:t}catch{return null}}function ir(e){let t=new Map;for(let r of e){let o=`${r.connectorType}:${r.connectorTarget??""}`;t.has(o)||t.set(o,{connectorType:r.connectorType,connectorTarget:r.connectorTarget});}return [...t.values()]}var Se=class{constructor(t){this.config=t;d(this,"warnOnce",k(new Set));d(this,"memoryQueue",[]);d(this,"durableStaging",[]);d(this,"dispatchers",new Map);d(this,"activeDispatches",0);d(this,"flushPromise",null);d(this,"durableFlushPromise",null);d(this,"pollTimer",null);d(this,"durablePollRunning",false);d(this,"closed",false);d(this,"durableClient",null);d(this,"durableReady",false);d(this,"durableInitPromise",null);t.enabled&&(this.durableInitPromise=this.initializeDurableQueue());}bindTarget(t){typeof t[Z]=="function"&&t[Z](this);let r=t[nr];r&&this.dispatchers.set(r.dispatchKey,r);}unbindTarget(t){typeof t[Z]=="function"&&t[Z](null);}enqueue(t,r,o,n){this.closed||!Po(r)||(this.dispatchers.set(o.dispatchKey,o),this.memoryQueue.push({id:fe(),connectorType:t,connectorTarget:n,source:"server",record:r,attemptCount:0,maxAttempts:this.config.retry.maxAttempts,nextAttemptAt:Date.now(),createdAt:Date.now(),dispatchKey:o.dispatchKey,dispatcher:o}),this.enforceMemoryCapacity(),this.scheduleDispatch());}async flush(){await this.durableInitPromise?.catch(()=>{}),await this.processUntilIdle(),await this.flushDurableStaging(),await this.drainDurableQueueForFlush(),await this.flushDurableStaging(),await this.processUntilIdle();}async shutdown(){if(this.closed=true,this.pollTimer&&(clearTimeout(this.pollTimer),this.pollTimer=null),await this.durableInitPromise?.catch(()=>{}),this.durableReady){let t=this.memoryQueue.splice(0,this.memoryQueue.length);for(let r of t)this.stageDurableJob(r,r.attemptCount,Math.max(r.nextAttemptAt,Date.now()));await this.flushDurableStaging();}await this.processUntilIdle(),this.durableClient&&(await this.durableClient.shutdown().catch(()=>{}),this.durableClient=null);}async getDurableCountForTests(){return await this.durableInitPromise?.catch(()=>{}),!this.durableReady||!this.durableClient?0:this.durableClient.count()}async getStatusSummaryForTests(){return await this.durableInitPromise?.catch(()=>{}),!this.durableReady||!this.durableClient?[]:this.durableClient.getStatusSummary()}async listDeadLettersForTests(){return await this.durableInitPromise?.catch(()=>{}),!this.durableReady||!this.durableClient?[]:(await this.durableClient.listDeadLetters({limit:1e3,offset:0})).items}async initializeDurableQueue(){try{let t=new Le(this.config.durableQueuePath);await t.init(),this.durableClient=t,this.durableReady=!0,this.scheduleDurablePoll();}catch(t){this.durableReady=false,this.durableClient=null,this.warnOnce("connector-durable-disabled",`[Blyp] Warning: Failed to initialize the connector SQLite queue at ${this.config.durableQueuePath}. Falling back to in-memory retries.`,t);}}scheduleDispatch(){this.flushPromise||(this.flushPromise=(async()=>{try{await this.pumpMemoryQueue();}finally{this.flushPromise=null,!this.closed&&this.hasReadyMemoryJobs()&&this.scheduleDispatch();}})());}async pumpMemoryQueue(){for(;!this.closed;){for(;this.activeDispatches<this.config.dispatchConcurrency;){let t=this.takeNextMemoryBatch();if(t.length===0)break;this.activeDispatches+=1,this.dispatchMemoryBatch(t).finally(()=>{this.activeDispatches-=1,this.closed||this.scheduleDispatch();});}if(this.activeDispatches===0||!this.hasReadyMemoryJobs())break;await ee(10);}}takeNextMemoryBatch(){let t=Date.now(),r=this.memoryQueue.findIndex(a=>a.nextAttemptAt<=t);if(r===-1)return [];let o=this.memoryQueue[r],n=[o];this.memoryQueue.splice(r,1);for(let a=this.memoryQueue.length-1;a>=0;a-=1){let i=this.memoryQueue[a];i.dispatchKey===o.dispatchKey&&i.connectorTarget===o.connectorTarget&&i.nextAttemptAt<=t&&n.length<this.config.memoryBatchSize&&(n.push(i),this.memoryQueue.splice(a,1));}return n}async dispatchMemoryBatch(t){let r=t[0].dispatcher,o=Date.now(),n=await r.dispatch(t.map(a=>a.record),{source:"server",target:t[0].connectorTarget}).catch(a=>({ok:false,retryable:true,error:a instanceof Error?a.message:String(a)}));if(n.ok){await this.recordSuccessfulDispatch(t,o);return}await this.handleRetryableFailure(t,n,false,o);}async handleRetryableFailure(t,r,o,n){o||await this.durableInitPromise?.catch(()=>{});let a=[],i=[];await this.recordFailedDispatch(t,r,n);for(let s of t){let l=s.attemptCount+1;if(!r.retryable||l>=s.maxAttempts){i.push({id:s.id,connectorType:s.connectorType,connectorTarget:s.connectorTarget,operation:"send",payloadJson:or({jobId:s.id,connectorType:s.connectorType,connectorTarget:s.connectorTarget,source:s.source,record:s.record,createdAt:s.createdAt}),attemptCount:l,maxAttempts:s.maxAttempts,lastError:r.error,firstEnqueuedAt:s.createdAt,deadLetteredAt:n,lastAttemptAt:n}),this.warnOnce(`connector-drop:${s.connectorType}:${s.connectorTarget??"default"}:${s.id}`,o&&this.durableReady?`[Blyp] Warning: Dead-lettered ${s.connectorType} connector job after ${l} failed attempt(s). ${r.error??"Connector delivery failed."}`:`[Blyp] Warning: Dropped ${s.connectorType} connector job after ${l} failed attempt(s). ${r.error??"Connector delivery failed."}`);continue}let u=n+Zt(l,this.config.retry);if(o){a.push({id:s.id,attemptCount:l,nextAttemptAt:u,lastError:r.error});continue}if(this.durableReady&&this.config.durableSpillStrategy==="after-first-failure"){this.stageDurableJob(s,l,u,r.error);continue}this.memoryQueue.push({...s,attemptCount:l,nextAttemptAt:u});}i.length>0&&await this.durableClient?.deadLetter(i).catch(s=>{this.warnOnce("connector-dead-letter-failure","[Blyp] Warning: Failed to persist dead-lettered connector queue jobs.",s);}),a.length>0&&await this.durableClient?.reschedule(a,n).catch(s=>{this.warnOnce("connector-reschedule-failure","[Blyp] Warning: Failed to reschedule durable connector queue jobs.",s);});}async recordSuccessfulDispatch(t,r){if(!this.durableReady||!this.durableClient||t.length===0)return;let o=ir(t).map(n=>({connectorType:n.connectorType,connectorTarget:n.connectorTarget,timestamp:r}));await this.durableClient.markSuccess(o).catch(n=>{this.warnOnce("connector-status-success-failure","[Blyp] Warning: Failed to record connector delivery success state.",n);});}async recordFailedDispatch(t,r,o){if(!this.durableReady||!this.durableClient||t.length===0)return;let n=ir(t).map(a=>({connectorType:a.connectorType,connectorTarget:a.connectorTarget,timestamp:o,lastError:r.error}));await this.durableClient.markFailure(n).catch(a=>{this.warnOnce("connector-status-failure-failure","[Blyp] Warning: Failed to record connector delivery failure state.",a);});}stageDurableJob(t,r,o,n){let a=or({jobId:t.id,connectorType:t.connectorType,connectorTarget:t.connectorTarget,source:t.source,record:t.record,createdAt:t.createdAt});this.durableStaging.push({id:t.id,connectorType:t.connectorType,connectorTarget:t.connectorTarget,operation:"send",payloadJson:a,attemptCount:r,maxAttempts:t.maxAttempts,nextAttemptAt:o,state:"pending",lastError:n,createdAt:t.createdAt,updatedAt:Date.now()}),this.flushDurableStaging();}async flushDurableStaging(){if(!(!this.durableReady||!this.durableClient||this.durableStaging.length===0)){if(this.durableFlushPromise){await this.durableFlushPromise;return}this.durableFlushPromise=(async()=>{for(;this.durableStaging.length>0;){let t=this.durableStaging.splice(0,this.config.sqliteWriteBatchSize);try{await this.durableClient.insert(t);}catch(r){this.warnOnce("connector-durable-insert-failure","[Blyp] Warning: Failed to persist connector jobs into the durable SQLite queue.",r),this.durableStaging.unshift(...t);break}}})();try{await this.durableFlushPromise;}finally{this.durableFlushPromise=null;}}}async processDurableQueueOnce(){if(!(!this.durableReady||!this.durableClient||this.durablePollRunning)){this.durablePollRunning=true;try{for(;!this.closed;){let t=await this.durableClient.claimDue(this.config.sqliteReadBatchSize,Date.now());if(t.length===0)break;let r=new Map,o=[];for(let n of t){let a=Ao(n.payloadJson);if(!a){o.push(n.id);continue}let i=n.connectorType==="otlp"?`otlp:${n.connectorTarget??""}`:n.connectorType,s=this.dispatchers.get(i);if(!s){o.push(n.id);continue}let l={id:n.id,connectorType:n.connectorType,connectorTarget:n.connectorTarget,source:a.source,record:a.record,attemptCount:n.attemptCount,maxAttempts:n.maxAttempts,nextAttemptAt:n.nextAttemptAt,createdAt:n.createdAt,dispatchKey:i,dispatcher:s},u=r.get(i)??[];u.push(l),r.set(i,u);}o.length>0&&await this.durableClient.ack(o);for(let n of r.values()){let i=await n[0].dispatcher.dispatch(n.map(s=>s.record),{source:"server",target:n[0].connectorTarget}).catch(s=>({ok:!1,retryable:!0,error:s instanceof Error?s.message:String(s)}));if(i.ok){await this.recordSuccessfulDispatch(n,Date.now()),await this.durableClient.ack(n.map(s=>s.id));continue}await this.handleRetryableFailure(n,i,!0,Date.now());}}}finally{this.durablePollRunning=false;}}}async drainDurableQueueForFlush(){if(!(!this.durableReady||!this.durableClient)){this.pollTimer&&(clearTimeout(this.pollTimer),this.pollTimer=null);try{for(;!this.closed;){for(;this.durablePollRunning;)await ee(10);if(await this.processDurableQueueOnce(),await this.flushDurableStaging(),await this.durableClient.count().catch(()=>0)===0&&!this.durablePollRunning&&this.durableStaging.length===0)break;await ee(10);}}finally{this.closed||this.scheduleDurablePoll();}}}scheduleDurablePoll(){this.closed||!this.durableReady||this.pollTimer||(this.pollTimer=setTimeout(async()=>{this.pollTimer=null,await this.flushDurableStaging(),await this.processDurableQueueOnce(),this.scheduleDurablePoll();},this.config.pollIntervalMs));}enforceMemoryCapacity(){for(;this.memoryQueue.length>this.config.memoryBufferSize;){let t=this.config.overflowStrategy==="drop-new"?this.memoryQueue.length-1:0,[r]=this.memoryQueue.splice(t,1);if(!r)break;if(this.durableReady){this.stageDurableJob(r,r.attemptCount,Math.max(Date.now(),r.nextAttemptAt),"spilled from in-memory buffer");continue}this.warnOnce(`connector-overflow:${r.connectorType}:${r.connectorTarget??"default"}:${t}`,`[Blyp] Warning: Connector queue overflow reached ${this.config.memoryBufferSize}. Dropping queued ${r.connectorType} job.`);}}hasReadyMemoryJobs(){let t=Date.now();return this.memoryQueue.some(r=>r.nextAttemptAt<=t)}async processUntilIdle(){for(;this.activeDispatches>0||this.memoryQueue.length>0||this.durableStaging.length>0||this.flushPromise!==null||this.durableFlushPromise!==null;){if(this.scheduleDispatch(),await this.flushPromise?.catch(()=>{}),await this.flushDurableStaging(),this.memoryQueue.some(t=>t.nextAttemptAt>Date.now())||await this.processDurableQueueOnce(),this.activeDispatches===0&&this.memoryQueue.length>0&&!this.hasReadyMemoryJobs()){let t=Math.min(...this.memoryQueue.map(r=>r.nextAttemptAt));await ee(Math.max(t-Date.now(),0));}else await ee(10);if(this.activeDispatches===0&&this.memoryQueue.length===0&&this.durableStaging.length===0)break}}};var F=class F{constructor(){d(this,"_type",null);}static getInstance(){return F.instance||(F.instance=new F),F.instance}get type(){return this._type===null&&(this._type=this.detectRuntime()),this._type}get isBun(){return this.type==="bun"}get isNode(){return this.type==="node"}detectRuntime(){return typeof Bun<"u"&&typeof Bun.file=="function"?"bun":"node"}};d(F,"instance");var rt=F,nt=class{constructor(){d(this,"type","bun");d(this,"isBun",true);d(this,"isNode",false);d(this,"file",{existsSync:t=>{try{let r=Bun.file(t);return r.size>0||r.name!==""}catch{return false}},mkdirSync:(t,r)=>{try{S__default.default.mkdirSync(t,r);}catch{}},writeFileSync:(t,r)=>{Bun.write(t,r);}});d(this,"path",{join:(...t)=>U__default.default.join(...t)});d(this,"env",{get:t=>Bun.env[t]});d(this,"cwd",()=>process.cwd());}},ot=class{constructor(){d(this,"type","node");d(this,"isBun",false);d(this,"isNode",true);d(this,"file",{existsSync:t=>S__default.default.existsSync(t),mkdirSync:(t,r)=>{S__default.default.mkdirSync(t,r);},writeFileSync:(t,r)=>{S__default.default.writeFileSync(t,r);}});d(this,"path",{join:(...t)=>U__default.default.join(...t)});d(this,"env",{get:t=>process.env[t]});d(this,"cwd",()=>process.cwd());}};function Bo(){return rt.getInstance().isBun?new nt:new ot}var sr=Bo();function cr(e,t){if(typeof e=="string")return t.length===0?void 0:t.length===1?t[0]:t;let r=[e,...t];return r.length===1?r[0]:r}function ur(e){if(!(!e||typeof e!="object"||Array.isArray(e)))return e}function Io(e,t){if(e==null)return t===void 0||t<400?void 0:{message:`HTTP ${t}`,code:t,type:"HttpError"};if(e instanceof Error){let r=e;return {message:e.message,code:r.code,type:r.type??e.name??e.constructor?.name,stack:e.stack,why:r.why,fix:r.fix,link:r.link,details:ur(r.details),cause:r.cause}}if(typeof e=="object"){let r=e,o=typeof r.statusCode=="number"?r.statusCode:typeof r.status=="number"?r.status:t;return {message:typeof r.message=="string"?r.message:`HTTP ${o??500}`,code:typeof r.code=="string"||typeof r.code=="number"?r.code:o,type:typeof r.type=="string"?r.type:typeof r.name=="string"?r.name:"Error",stack:typeof r.stack=="string"?r.stack:void 0,why:typeof r.why=="string"?r.why:void 0,fix:typeof r.fix=="string"?r.fix:void 0,link:typeof r.link=="string"?r.link:void 0,details:ur(r.details),cause:r.cause}}return {message:String(e),code:t,type:typeof e}}function Oo(e){return e.response&&typeof e.response.status=="number"?e.response.status:typeof e.status=="number"?e.status:e.error&&typeof e.error=="object"&&e.error!==null&&typeof e.error.statusCode=="number"?e.error.statusCode:e.error&&typeof e.error=="object"&&e.error!==null&&typeof e.error.status=="number"?e.error.status:e.error?500:void 0}function lr(e,t){let r=t.redact??T(),o=performance.now(),n=R(t.initialFields??{},r),a=[],i;t.onCreate?.();let s=(u,c,p)=>(a.push({level:u,message:B(c,r),timestamp:new Date().toISOString(),...cr(c,p)===void 0?{}:{data:R(cr(c,p),r)}}),l),l={set(u){return Object.assign(n,R(u,r)),l},debug(u,...c){return s("debug",u,c)},info(u,...c){return s("info",u,c)},warn(u,...c){return s("warn",u,c)},warning(u,...c){return s("warning",u,c)},error(u,...c){return s("error",u,c)},success(u,...c){return s("success",u,c)},critical(u,...c){return s("critical",u,c)},table(u,c){return s("table",u,c===void 0?[]:[c])},emit(u={}){if(i)return i;let c=R(t.resolveDefaultFields?.()??{},r),p=Oo(u),m=R(Io(u.error,p),r),y=u.level??(m?"error":"info"),h=R({...c,...n,groupId:e,timestamp:new Date().toISOString(),level:y,duration:Math.round(performance.now()-o),...typeof p=="number"?{status:p}:{},...a.length>0?{events:[...a]}:{},...m?{error:m}:{}},r);return t.write(h,B(u.message??"structured_log",r)),i=h,t.onEmit?.(h),h}};return l}var st=Symbol("blyp.logger.factory"),gr={success:25,info:30,debug:35,table:37,warning:40,error:50,critical:60},pr={success:"success",critical:"critical",warning:"warning",info:"info",debug:"debug",error:"error",warn:"warn",table:"debug"},No="\x1B[35m",Mo="\x1B[0m";function te(e){return he(e)==="client_log"}function Fo(){return {enabled:false,ready:false,mode:"auto",serviceName:"blyp-app",ingestingHost:void 0,status:"missing",errorTracking:{enabled:false,ready:false,status:"missing",dsn:void 0,tracesSampleRate:1,environment:void 0,release:void 0},shouldAutoForwardServerLogs:()=>false,shouldAutoCaptureExceptions:()=>false,send:()=>{},captureException:()=>{},flush:async()=>{}}}function zo(){return {enabled:false,ready:false,mode:"auto",status:"missing",shouldAutoForwardServerLogs:()=>false,shouldAutoCaptureExceptions:()=>false,send:()=>{},captureException:()=>{},flush:async()=>{}}}function qo(){return {enabled:false,ready:false,mode:"auto",serviceName:"blyp-app",host:"https://us.i.posthog.com",status:"missing",errorTracking:{enabled:false,ready:false,mode:"auto",status:"missing",enableExceptionAutocapture:false},shouldAutoForwardServerLogs:()=>false,shouldAutoCaptureExceptions:()=>false,send:()=>{},captureException:()=>{},flush:async()=>{}}}function jo(){return {enabled:false,ready:false,mode:"auto",status:"missing",shouldAutoForwardServerLogs:()=>false,send:()=>{},flush:async()=>{}}}function $o(e){return {name:e,enabled:false,ready:false,mode:"auto",serviceName:"blyp-app",endpoint:void 0,status:"missing",send:()=>{},flush:async()=>{}}}function Uo(){return {get:e=>$o(e),getAutoForwardTargets:()=>[],send:()=>{},flush:async()=>{}}}function Wo(e){return e.connectors?.betterstack?.enabled?W("betterstack",["@logtail/node","@sentry/node"],"../connectors/betterstack/sender").createBetterStackSender(e):Fo()}function Ho(e){return e.connectors?.databuddy?.enabled?W("databuddy",["@databuddy/sdk"],"../connectors/databuddy/sender").createDatabuddySender(e):zo()}function Qo(e){return e.connectors?.posthog?.enabled?W("posthog",["posthog-node","@opentelemetry/api-logs","@opentelemetry/exporter-logs-otlp-http","@opentelemetry/resources","@opentelemetry/sdk-logs"],"../connectors/posthog/sender").createPostHogSender(e):qo()}function Go(e){return e.connectors?.sentry?.enabled?W("sentry",["@sentry/node"],"../connectors/sentry/sender").createSentrySender(e):jo()}function Jo(e){return e.connectors?.otlp?.some(t=>t.enabled)?W("otlp",["@opentelemetry/api-logs","@opentelemetry/exporter-logs-otlp-http","@opentelemetry/resources","@opentelemetry/sdk-logs"],"../connectors/otlp/sender").createOTLPRegistry(e):Uo()}function Ko(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r={};t.data!==void 0&&(r.data=t.data);let o=typeof t.page?.pathname=="string"?t.page.pathname:void 0,n=typeof t.page?.url=="string"?t.page.url:void 0;return (o||n)&&(r.page=o??n),t.metadata!==void 0&&(r.metadata=t.metadata),Object.keys(r).length>0?r:null}function Vo(e){if(!e||typeof e!="object"||Array.isArray(e))return {hidden:false,value:e};let t=e;if(t.type==="http_request"||t.type==="http_error")return {hidden:true};if(t.type==="client_log"){let r=Ko(e);return r?{hidden:false,value:r}:{hidden:true}}return {hidden:false,value:e}}function Xo(e){if(e.pretty){let r=Mt()({colorize:true,translateTime:"SYS:HH:MM:ss",ignore:"pid,hostname,caller",customColors:{success:"green",critical:"red bold",info:"blue",warning:"yellow",error:"red",debug:"cyan",table:"cyan"},messageFormat:(o,n)=>{let a=String(o[n]??""),i=typeof o.caller=="string"?o.caller.trim():"";return i?`${a} ${No}${i}${Mo}`:a}});return dr__default.default({level:e.level,customLevels:gr},r)}return dr__default.default({level:e.level,customLevels:gr})}function E(e){let t=e[st];if(!t)throw new Error("Unsupported Blyp logger instance");return t}function ct(e){return E(e).posthog}function ut(e){return E(e).betterstack}function lt(e){return E(e).databuddy}function Cr(e){try{return ct(e)}catch{return null}}function Rr(e){try{return ut(e)}catch{return null}}function wr(e){try{return lt(e)}catch{return null}}function Lr(e){return E(e).sentry}function Sr(e){return E(e).otlp}function Te(e){try{return E(e).redact}catch{return X().redact}}function vr(e,t){let r=E(t);return Object.defineProperty(e,st,{value:r,enumerable:false,configurable:false,writable:false}),e}function Tr(e,t){let r=E(e);return r.create(t,r.bindings)}function dt(e,t,r={}){let o=E(e);return lr(t,{initialFields:r.initialFields,resolveDefaultFields:()=>({...o.bindings,...r.resolveDefaultFields?.()??{}}),write:(n,a)=>{o.writeStructured(n,a,"structured-flush");},onCreate:r.onCreate,onEmit:r.onEmit,redact:r.redact??o.redact})}function fr(e,t){if(!te(t)){if(!e.shouldAutoForwardServerLogs()){e.enabled&&!e.ready&&e.send(t,{source:"server",warnIfUnavailable:true});return}e.send(t,{source:"server",warnIfUnavailable:true});}}function mr(e,t){if(!te(t)){if(!e.shouldAutoForwardServerLogs()){e.enabled&&!e.ready&&e.send(t,{source:"server",warnIfUnavailable:true});return}e.send(t,{source:"server",warnIfUnavailable:true});}}function yr(e,t){if(!te(t)){if(!e.shouldAutoForwardServerLogs()){e.enabled&&!e.ready&&e.send(t,{source:"server",warnIfUnavailable:true});return}e.send(t,{source:"server",warnIfUnavailable:true});}}function hr(e,t){if(!te(t)){if(!e.shouldAutoForwardServerLogs()){e.enabled&&!e.ready&&e.send(t,{source:"server",warnIfUnavailable:true});return}e.send(t,{source:"server",warnIfUnavailable:true});}}function br(e,t){if(!te(t))for(let r of e.getAutoForwardTargets())r.send(t,{source:"server",warnIfUnavailable:true});}function at(e,t,r,o,n,a,i,s,l,u={},c="root"){let p=Object.keys(u).length>0?e.child(u):e,m=(f,g,b,L=c)=>{if(L==="root"&&Ce())return;let C=Ut(f,g,b,u,l),Q=C.message,G={caller:C.caller},oe=Vo(C.data);!oe.hidden&&oe.value!==void 0&&(G.data=oe.value);let Ct=pr[f],Pe=p;(Pe[Ct]??Pe.info??((gi,pi)=>{})).call(p,G,Q),t.write(C),mr(o,C),yr(n,C),fr(a,C),hr(i,C),br(s,C);},y=(f,g,b="structured-flush")=>{let L=Ht(f.level),C=Wt(L,g,f,u,l),Q=pr[L],G=p;(G[Q]??G.info??((Ct,Pe)=>{})).call(p,{caller:C.caller,...C},C.message),(b!=="root"||!Ce())&&t.write(C),mr(o,C),yr(n,C),fr(a,C),hr(i,C),br(s,C);},h={success:(f,...g)=>{m("success",f,g);},critical:(f,...g)=>{m("critical",f,g);},warning:(f,...g)=>{m("warning",f,g);},info:(f,...g)=>{m("info",f,g);},debug:(f,...g)=>{m("debug",f,g);},error:(f,...g)=>{m("error",f,g);},warn:(f,...g)=>{m("warn",f,g);},table:(f,g)=>{g&&typeof g=="object"&&sr.env.get("NODE_ENV")!=="production"&&(console.log("TABLE:",f),console.table(R(g,l))),m("table",f,g===void 0?[]:[g]);},flush:async()=>{await t.flush(),r&&await r.flush(),await Promise.allSettled([o.flush(),n.flush(),a.flush(),i.flush(),s.flush()]);},shutdown:async()=>{await t.shutdown(),r&&await r.shutdown(),await Promise.allSettled([o.flush(),n.flush(),a.flush(),i.flush(),s.flush()]);},createStructuredLog:(f,g)=>dt(h,f,{initialFields:g}),child:f=>{let g={...u,...f};return at(e,t,r,o,n,a,i,s,l,g,c)},[st]:{bindings:u,betterstack:o,databuddy:n,posthog:a,sentry:i,otlp:s,redact:l,sink:t,create:(f,g=u)=>at(e,t,r,o,n,a,i,s,l,g,f),writeStructured:(f,g,b="structured-flush")=>{y(f,g,b);}}};return h}var it=null;function gt(e){if(e===void 0&&it)return it;let t=X(e),r=Xo(t),o=Yt(t),n=Wo(t),a=Ho(t),i=Qo(t),s=Go(t),l=Jo(t),u=t.connectors.delivery.enabled?new Se(t.connectors.delivery):null;if(u){u.bindTarget(n),u.bindTarget(a),u.bindTarget(i),u.bindTarget(s);for(let p of l.getAutoForwardTargets())u.bindTarget(p);}let c=at(r,o,u,n,a,i,s,l,t.redact);return e===void 0&&(it=c),c}gt();function xr(e,t,r,o){let n=ie(e),a=ae(t),i=se(o);return `${n} ${r} ${a} ${i}`}function Yo(e,t){let r=ze(t?.path??N),o=t?.enabled===false?null:{path:r};return e===false?null:e===void 0?o:e===true?{path:r}:{...o,...e,path:ze(e.path??r)}}function Er(e={},t){let r=X({...e.level!==void 0?{level:e.level}:{},...e.pretty!==void 0?{pretty:e.pretty}:{},...e.destination!==void 0?{destination:e.destination}:{},...e.logDir!==void 0?{logDir:e.logDir}:{},...e.file!==void 0?{file:e.file}:{},...e.database!==void 0?{database:e.database}:{},...e.redact!==void 0?{redact:e.redact}:{},...e.connectors!==void 0?{connectors:e.connectors}:{}}),{level:o=r.level,pretty:n=r.pretty,destination:a=r.destination,logDir:i=r.logDir,file:s=r.file,database:l=r.database,autoLogging:u=true,customProps:c,logErrors:p=true,includePaths:m,ignorePaths:y,clientLogging:h,connectors:f}=e,g=t??gt({level:o,pretty:n,destination:a,logDir:i,file:s,database:l,connectors:f}),b=Yo(h,r.clientLogging),L=b?.path??N,C=m,Q=b?Array.from(new Set([...y??[],L])):y;return {logger:g,betterstack:ut(g),databuddy:lt(g),posthog:ct(g),sentry:Lr(g),otlp:Sr(g),resolvedConfig:r,level:o,pretty:n,logDir:i,file:s,autoLogging:u,customProps:c,logErrors:p,resolvedIncludePaths:C,resolvedIgnorePaths:Q,resolvedClientLogging:b,ingestionPath:L}}function Zo(e,t){return !t||t.length===0?true:Ue(e,t)}function Dr(e,t,r){return Zo(e,t)?Ue(e,r):true}function kr(e,t,r){return e.autoLogging===false||typeof e.autoLogging=="object"&&e.autoLogging.ignore?.(t)?true:Dr(r,e.resolvedIncludePaths,e.resolvedIgnorePaths)}function pt(e,t){return e.logErrors?Dr(t,e.resolvedIncludePaths,e.resolvedIgnorePaths):true}function re(e,t){return e.customProps?e.customProps(t):{}}function _r(e,t,r,o,n,a,i={}){let s=ge(r,"http_request",o,n,a,i,Te(e));return t==="info"?e.info(pe(r.method,n,o,a),s):(e.info(xr(r.method,n,o,a),s),Object.keys(i).length>0&&e.debug("Request context",i)),s}function ft(e,t,r,o,n,a,i,s={},l={}){let u=ge(r,"http_error",o,n,a,{error:i?.message??`HTTP ${n}`,stack:i?.stack,code:i?.code,why:i?.why,fix:i?.fix,link:i?.link,details:i?.details,...s},Te(e)),c=t==="info"?pe(r.method,n,o,a):xr(r.method,n,o,a);e.error(c,u);let p=Cr(e);p?.shouldAutoCaptureExceptions()&&p.captureException(l.error??i??c,{source:"server",warnIfUnavailable:true,distinctId:l.distinctId??w(r.headers,"x-posthog-distinct-id"),properties:Ke({timestamp:new Date().toISOString(),level:"error",message:c,data:u},"server",{$request_method:r.method,$request_path:o,$current_url:r.url,$response_status_code:n,...w(r.headers,"user-agent")?{$user_agent:w(r.headers,"user-agent")}:{},...u.ip?{$ip:u.ip}:{}})});let m=Rr(e);m?.shouldAutoCaptureExceptions()&&m.captureException(l.error??i??c,{source:"server",warnIfUnavailable:true,context:{timestamp:new Date().toISOString(),level:"error",message:c,status:n,path:o,data:u}});let y=wr(e);return y?.shouldAutoCaptureExceptions()&&y.captureException(l.error??i??c,{source:"server",warnIfUnavailable:true,properties:{method:r.method,path:o,status_code:n,...r.url?{current_url:r.url}:{},...w(r.headers,"user-agent")?{user_agent:w(r.headers,"user-agent")}:{},...u.ip?{ip:u.ip}:{},payload:u}}),u}async function ei(e,t){if(t!==void 0)return typeof t=="string"?JSON.parse(t):t;if(typeof e.json=="function")return await e.json();throw new Error("Unable to parse client log payload")}function ti(e,t){switch(t){case "debug":return e.debug;case "info":return e.info;case "warning":return e.warning;case "error":return e.error;case "critical":return e.critical;case "success":return e.success}}async function Pr(e){let{config:t,ctx:r,request:o,body:n,deliveryPath:a}=e;if(!t.resolvedClientLogging)return {status:404};let i;try{i=await ei(o,n);}catch{return {status:400}}if(!vt(i))return {status:400};if(!(t.resolvedClientLogging.validate?await t.resolvedClientLogging.validate(r,i):true))return {status:403};let l=t.resolvedClientLogging.enrich?await t.resolvedClientLogging.enrich(r,i):void 0,u=Te(t.logger),c=R(i,u),p=R({...c,receivedAt:new Date().toISOString(),delivery:Ie(o,a??I(o.url),u)},u);l!==void 0&&(p.serverContext=R(l,u));let m=B(`[client] ${c.message}`,u),y=A(),h=typeof c.traceId=="string"&&c.traceId.length>0?c.traceId:y;try{h&&Y(h),c.level==="table"?t.logger.table(m,p):ti(t.logger,c.level)(m,p);}finally{Y(y);}let f={};if(c.connector==="betterstack"){if(f["x-blyp-betterstack-status"]=t.betterstack.ready?"enabled":"missing",t.betterstack.ready){let g={timestamp:p.receivedAt,level:c.level,message:m,data:p};if(t.betterstack.send(g,{source:"client"}),(c.level==="error"||c.level==="critical")&&t.betterstack.shouldAutoCaptureExceptions()){let b=c.data&&typeof c.data=="object"&&!Array.isArray(c.data)&&typeof c.data.message=="string"?c.data:c.message;t.betterstack.captureException(b,{source:"client",warnIfUnavailable:true,context:{sessionId:c.session.sessionId,pageUrl:c.page.url,pagePath:c.page.pathname,metadata:c.metadata,payload:p}});}}}else if(c.connector==="databuddy"){if(f["x-blyp-databuddy-status"]=t.databuddy.ready?"enabled":"missing",t.databuddy.ready){let g={timestamp:p.receivedAt,level:c.level,message:m,data:p};if(t.databuddy.send(g,{source:"client"}),(c.level==="error"||c.level==="critical")&&t.databuddy.shouldAutoCaptureExceptions()){let b=c.data&&typeof c.data=="object"&&!Array.isArray(c.data)&&typeof c.data.message=="string"?c.data:c.message;t.databuddy.captureException(b,{source:"client",warnIfUnavailable:true,sessionId:c.session.sessionId,properties:{page_url:c.page.url,page_path:c.page.pathname,client_runtime:c.device?.runtime,metadata:c.metadata,payload:p}});}}}else if(c.connector==="posthog"){if(f["x-blyp-posthog-status"]=t.posthog.ready?"enabled":"missing",t.posthog.ready){let g={timestamp:p.receivedAt,level:c.level,message:m,data:p};if(t.posthog.send(g,{source:"client"}),(c.level==="error"||c.level==="critical")&&t.posthog.shouldAutoCaptureExceptions()){let b=p.metadata,L=b&&typeof b=="object"&&!Array.isArray(b)&&typeof b.posthogDistinctId=="string"&&b.posthogDistinctId?String(b.posthogDistinctId):void 0,C=c.data&&typeof c.data=="object"&&!Array.isArray(c.data)&&typeof c.data.message=="string"?c.data:c.message;t.posthog.captureException(C,{source:"client",warnIfUnavailable:true,distinctId:L,properties:Ke(g,"client",{$session_id:c.session.sessionId,$current_url:c.page.url,$request_path:c.page.pathname,"client.runtime":c.device?.runtime,"client.metadata":c.metadata})});}}}else if(c.connector==="sentry")f["x-blyp-sentry-status"]=t.sentry.ready?"enabled":"missing",t.sentry.ready&&t.sentry.send({timestamp:p.receivedAt,level:c.level,message:m,data:p},{source:"client"});else if(c.connector?.type==="otlp"){let g=t.otlp.get(c.connector.name);f["x-blyp-otlp-status"]=g.ready?"enabled":"missing",g.ready&&g.send({timestamp:p.receivedAt,level:c.level,message:m,data:p},{source:"client"});}return Object.keys(f).length>0?{status:204,headers:f}:{status:204}}function ri(e){return e.resolvedConfig.destination==="database"}async function ne(e){if(ri(e))try{await e.logger.flush();}catch(t){console.warn("[Blyp] Warning: Failed to flush database logs.",t);}}function mt(e,t={}){let r=Tr(e,"request-scoped"),o=vr({...r,createStructuredLog:(n,a)=>dt(o,n,{initialFields:a,resolveDefaultFields:()=>{let i=A();return {...t.resolveStructuredFields?.()??{},...i?{traceId:i}:{}}},onCreate:()=>{Ye();},onEmit:()=>{Ze(),t.onStructuredEmit?.();}}),child(n){return mt(r.child(n),t)}},r);return Xe(o),o}var ni="x-blyp-trace-id",oi="trace_";function yt(){return `${oi}${fe().replace(/[^a-z0-9]/gi,"").toLowerCase().slice(0,12)}`}function ht(e){Y(e);}function bt(e,t){let r=new Headers(e.headers);return r.set(ni,t),new Response(e.body,{status:e.status,statusText:e.statusText,headers:r})}var Ee=Symbol.for("blyp.react-router.logger"),De="__blypLog",ke=Symbol.for("blyp.react-router.trace-id"),_e="__blypTraceId";function xe(e,t,r){return {request:e.request,params:e.params,context:e.context,response:t,error:r}}function ii(e){if(typeof e.get=="function"){let t=e.get(Ee);return t||e.get(De)}return e[Ee]??e[De]}function ai(e,t){if(typeof e.set=="function"){e.set(Ee,t),e.set(De,t);return}e[Ee]=t,e[De]=t;}function si(e){if(typeof e.get=="function"){let t=e.get(ke);return t||e.get(_e)}return e[ke]??e[_e]}function ci(e,t){if(typeof e.set=="function"){e.set(ke,t),e.set(_e,t);return}e[ke]=t,e[_e]=t;}function ui(e){let t=J(e);return t?.status??t?.statusCode??500}function Ar(e={}){let t=Er(e),r=(i,s)=>{ai(i,s);},o=i=>{let s=ii(i);return s&&typeof s=="object"?s:t.logger},n=(i,s)=>{ci(i,s);},a=i=>{let s=si(i);return typeof s=="string"?s:void 0};return {logger:t.logger,setLogger:r,getLogger:o,setTraceId:n,getTraceId:a,middleware:async(i,s)=>be(async()=>{let l=performance.now(),u=I(i.request.url),c=yt(),p=false;ht(c);let m=mt(t.logger,{resolveStructuredFields:()=>({method:i.request.method,path:u,...re(t,xe(i))}),onStructuredEmit:()=>{p=true;}});r(i.context,m),n(i.context,c);try{let y=await s();if(p)return await ne(t),bt(y,c);let h=y.status,f=xe(i,y),g=Math.round(performance.now()-l),b=de(i.request.method,i.request.url,i.request.headers);return Oe(h)?pt(t,u)||ft(t.logger,t.level,b,u,h,g,J(void 0,h),re(t,f)):kr(t,f,u)||_r(t.logger,t.level,b,u,h,g,re(t,f)),await ne(t),bt(y,c)}catch(y){if(!p&&!pt(t,u)){let h=ui(y);ft(t.logger,t.level,de(i.request.method,i.request.url,i.request.headers),u,h,Math.round(performance.now()-l),J(y,h),re(t,xe(i,void 0,y)),{error:y});}throw await ne(t),y}}),clientLogHandler:async i=>be(async()=>{let s=yt();ht(s);let l=I(i.url);if(l!==t.ingestionPath)return new Response(JSON.stringify({error:`Mounted route path ${l} does not match configured client logging path ${t.ingestionPath}`}),{status:500,headers:{"content-type":"application/json","x-blyp-trace-id":s}});let c=await Pr({config:t,ctx:xe({request:i,context:{}}),request:i,deliveryPath:l});return await ne(t),new Response(null,{status:c.status,headers:{...c.headers,"x-blyp-trace-id":s}})})}}var li=Ar;
|
|
701
|
+
exports.createLogger=li;exports.createReactRouterLogger=Ar;
|