@lunora/runtime 1.0.0-alpha.66 → 1.0.0-alpha.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BACKUP_KEY_PREFIX as t,backupManifestKey as a,backupObjectKey as s,backupObjectKeyOfManifest as i,isBackupManifestEntry as n,isBackupManifestKey as p,normalizeBackupPrefix as c}from"./packem_shared/BACKUP_KEY_PREFIX-BOtSu-_3.mjs";import{toAirbyteMessages as f,toFivetranResponse as E}from"./packem_shared/toAirbyteMessages-Cy3uaySU.mjs";import{composeWorker as S,createLunoraHandler as x,createWorker as _,defineRpcEnvelope as d,resolveLunoraOptions as l,withFrameworkWorker as u}from"./packem_shared/composeWorker-CTKu1qZV.mjs";import{createCrossShardRelationCapabilities as k}from"./packem_shared/createCrossShardRelationCapabilities-DgQYQzd1.mjs";import{DEFAULT_REGISTRY_CACHE_TTL_MS as A,SHARD_REGISTRY_DO_NAME as C,createDynamicShardRegistry as L}from"./packem_shared/DEFAULT_REGISTRY_CACHE_TTL_MS-D5O7elXI.mjs";import{LunoraError as b,toErrorResponse as g}from"./packem_shared/LunoraError-DksAgIpa.mjs";import{createKvCursorStore as H,createMemoryCursorStore as I,defineExportSink as P,r2Sink as v,runExportTap as D,sanitizeChange as F,webhookExportSink as M}from"./packem_shared/createKvCursorStore-VOd1DFsf.mjs";import{HEALTH_PATH as K,HEALTH_READY_PATH as N,buildHealthRoutes as U,d1Probe as B,durableObjectProbe as Y,presenceProbe as w}from"./packem_shared/HEALTH_PATH-jZsuCmSs.mjs";import{LOG_ARCHIVE_PATH as X,resolveLogArchiveFromEnv as j}from"./packem_shared/LOG_ARCHIVE_PATH-jgHjdsz2.mjs";import{memoizeIdentity as W,memoizeIdentityPerRequest as q}from"./packem_shared/memoizeIdentity-DnOj3QRi.mjs";import{e as J,a as Z}from"./packem_shared/observability-vDK-rMbs.mjs";import{analyticsEngineSink as ee,combineSinks as re,consoleSink as oe,otlpSink as te,pipelineLogSink as ae,sentrySink as se,webhookSink as ie}from"./packem_shared/analyticsEngineSink-
|
|
1
|
+
import{BACKUP_KEY_PREFIX as t,backupManifestKey as a,backupObjectKey as s,backupObjectKeyOfManifest as i,isBackupManifestEntry as n,isBackupManifestKey as p,normalizeBackupPrefix as c}from"./packem_shared/BACKUP_KEY_PREFIX-BOtSu-_3.mjs";import{toAirbyteMessages as f,toFivetranResponse as E}from"./packem_shared/toAirbyteMessages-Cy3uaySU.mjs";import{composeWorker as S,createLunoraHandler as x,createWorker as _,defineRpcEnvelope as d,resolveLunoraOptions as l,withFrameworkWorker as u}from"./packem_shared/composeWorker-CTKu1qZV.mjs";import{createCrossShardRelationCapabilities as k}from"./packem_shared/createCrossShardRelationCapabilities-DgQYQzd1.mjs";import{DEFAULT_REGISTRY_CACHE_TTL_MS as A,SHARD_REGISTRY_DO_NAME as C,createDynamicShardRegistry as L}from"./packem_shared/DEFAULT_REGISTRY_CACHE_TTL_MS-D5O7elXI.mjs";import{LunoraError as b,toErrorResponse as g}from"./packem_shared/LunoraError-DksAgIpa.mjs";import{createKvCursorStore as H,createMemoryCursorStore as I,defineExportSink as P,r2Sink as v,runExportTap as D,sanitizeChange as F,webhookExportSink as M}from"./packem_shared/createKvCursorStore-VOd1DFsf.mjs";import{HEALTH_PATH as K,HEALTH_READY_PATH as N,buildHealthRoutes as U,d1Probe as B,durableObjectProbe as Y,presenceProbe as w}from"./packem_shared/HEALTH_PATH-jZsuCmSs.mjs";import{LOG_ARCHIVE_PATH as X,resolveLogArchiveFromEnv as j}from"./packem_shared/LOG_ARCHIVE_PATH-jgHjdsz2.mjs";import{memoizeIdentity as W,memoizeIdentityPerRequest as q}from"./packem_shared/memoizeIdentity-DnOj3QRi.mjs";import{e as J,a as Z}from"./packem_shared/observability-vDK-rMbs.mjs";import{analyticsEngineSink as ee,combineSinks as re,consoleSink as oe,otlpSink as te,pipelineLogSink as ae,sentrySink as se,webhookSink as ie}from"./packem_shared/analyticsEngineSink-BgmqAmTM.mjs";import{D as pe,a as ce,c as me}from"./packem_shared/pipeline-log-reader-BGrl66P5.mjs";import{createQueryCoordinator as Ee,createStaticShardRegistry as Re,mergeStrategyForAggregate as Se}from"./packem_shared/createQueryCoordinator-CnNyazLX.mjs";import{applyJurisdiction as _e,resolveShard as de}from"./packem_shared/applyJurisdiction-C0ddU7Tg.mjs";import{a as ue,r as ye,b as ke}from"./packem_shared/rest-cache-BnMq2hbO.mjs";import{a as Ae,b as Ce,c as Le,r as Te,d as be}from"./packem_shared/rest-routes-D2b3HXA9.mjs";import{decorateResponse as he,enforceOrigin as He,handleCorsPreflight as Ie,resolveSecurity as Pe}from"./packem_shared/decorateResponse-D3NzOIvB.mjs";import{createShardClient as De}from"./packem_shared/createShardClient-Yb6_Mzd6.mjs";import{STORAGE_UPLOAD_MAX_BODY_BYTES as Me}from"./packem_shared/STORAGE_UPLOAD_MAX_BODY_BYTES-BqyO-1l6.mjs";import{LOG_ARCHIVE_NOT_CONFIGURED as Ke}from"./packem_shared/LOG_ARCHIVE_NOT_CONFIGURED-CDpi4yFD.mjs";import{NOOP_EXECUTION_CONTEXT as Ue}from"./packem_shared/NOOP_EXECUTION_CONTEXT-YmXqH-jH.mjs";import{composeIdentityResolvers as Ye,routeIdentityResolvers as we}from"./packem_shared/composeIdentityResolvers-BHZ4jH8o.mjs";const e="0.0.0";export{t as BACKUP_KEY_PREFIX,pe as DEFAULT_LOG_COLUMNS,ce as DEFAULT_LOG_LIMIT,A as DEFAULT_REGISTRY_CACHE_TTL_MS,K as HEALTH_PATH,N as HEALTH_READY_PATH,Ke as LOG_ARCHIVE_NOT_CONFIGURED,X as LOG_ARCHIVE_PATH,b as LunoraError,Ue as NOOP_EXECUTION_CONTEXT,C as SHARD_REGISTRY_DO_NAME,Me as STORAGE_UPLOAD_MAX_BODY_BYTES,e as VERSION,ee as analyticsEngineSink,_e as applyJurisdiction,ue as applyRestCache,Ae as argsFromQuery,a as backupManifestKey,s as backupObjectKey,i as backupObjectKeyOfManifest,U as buildHealthRoutes,Ce as buildRestRoutes,re as combineSinks,Ye as composeIdentityResolvers,S as composeWorker,oe as consoleSink,k as createCrossShardRelationCapabilities,L as createDynamicShardRegistry,H as createKvCursorStore,x as createLunoraHandler,I as createMemoryCursorStore,me as createPipelineLogReader,Ee as createQueryCoordinator,Le as createRestRateLimit,De as createShardClient,Re as createStaticShardRegistry,_ as createWorker,B as d1Probe,he as decorateResponse,P as defineExportSink,d as defineRpcEnvelope,Y as durableObjectProbe,J as emitLogEvent,Z as emitRpcEvent,He as enforceOrigin,Ie as handleCorsPreflight,n as isBackupManifestEntry,p as isBackupManifestKey,W as memoizeIdentity,q as memoizeIdentityPerRequest,Se as mergeStrategyForAggregate,c as normalizeBackupPrefix,te as otlpSink,ae as pipelineLogSink,w as presenceProbe,v as r2Sink,Te as readShardKey,ye as requestCarriesCredentials,j as resolveLogArchiveFromEnv,l as resolveLunoraOptions,Pe as resolveSecurity,de as resolveShard,ke as restCacheHeaders,be as restSurfaceFromRegistry,we as routeIdentityResolvers,D as runExportTap,F as sanitizeChange,se as sentrySink,f as toAirbyteMessages,g as toErrorResponse,E as toFivetranResponse,M as webhookExportSink,ie as webhookSink,u as withFrameworkWorker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as d,L as y,o as j,c as S,O as $,f as C,g as X,h as B,w as Y,i as q,j as G,m as Z}from"./otlp-resource-B4Yylr0V.mjs";const Q=r=>{if(typeof r=="string")return r;try{return JSON.stringify(r)??String(r)}catch{return String(r)}},J=r=>typeof r=="boolean"||typeof r=="number"||typeof r=="string"?r:Q(r),v=512,rr=200,tr=r=>{const s=r.maxItems??v,t=r.maxDelayMs??rr;let o=[],e,i,l;const f=()=>{e!==void 0&&(clearTimeout(e),e=void 0)},h=async()=>{f();const u=o;o=[];const a=l;i=void 0,l=void 0;try{u.length>0&&await r.export(u)}catch{}finally{a?.()}},m=u=>{i===void 0&&(i=new Promise(a=>{l=a}),e=setTimeout(()=>{h()},t)),u?.(i)};return{add:(u,a)=>{for(o.push(u);o.length>s;)o.shift();m(a),o.length>=s&&h()},flush:async u=>{if(o.length===0){f();return}const a=h();return u?.(a),a},get size(){return o.length}}},or=(r,s)=>r<s?-1:r>s?1:0,L=r=>{if(r===void 0)return"null";if(typeof r=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(typeof r=="number"){if(Number.isNaN(r))return"nan";if(r===1/0)return"inf";if(r===-1/0)return"-inf";if(Object.is(r,-0))return"-0"}if(r===null||typeof r!="object")return JSON.stringify(r);if(Array.isArray(r))return`[${r.map(i=>L(i)).join(",")}]`;const s=Object.getPrototypeOf(r);if(s!==null&&s!==Object.prototype){const i=r.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${i} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const t=r,o=Object.keys(t).toSorted(or),e=[];for(const i of o){const l=t[i];l!==void 0&&e.push(`${JSON.stringify(i)}:${L(l)}`)}return`{${e.join(",")}}`},sr=(r,s)=>{const t=[d(y.functionPath,r.functionPath),d(y.ok,r.ok)];r.method!==void 0&&t.push(d("http.request.method",r.method)),r.path!==void 0&&t.push(d("url.path",r.path)),t.push(d("http.route",r.functionPath)),r.scheme!==void 0&&t.push(d("url.scheme",r.scheme)),r.host!==void 0&&t.push(d("server.address",r.host)),r.port!==void 0&&t.push(d("server.port",r.port)),r.userAgent!==void 0&&t.push(d("user_agent.original",r.userAgent)),r.shardKey!==void 0&&t.push(d(y.shardKey,r.shardKey)),t.push(d("http.response.status_code",r.error?.status??200)),r.error&&t.push(d(y.errorType,r.error.code),d("lunora.error_status",r.error.status)),r.fanOut&&t.push(d("lunora.fanout.table",r.fanOut.table),d("lunora.fanout.shards",r.fanOut.shards),d("lunora.fanout.failed",r.fanOut.failed));const o={attributes:t,endTimeUnixNano:S(s),kind:$.server,name:r.functionPath,...r.parentSpanId===void 0?{}:{parentSpanId:r.parentSpanId},spanId:r.spanId??j(8),startTimeUnixNano:S(s-r.durationMs),status:r.ok?{code:1}:{code:2,message:r.error?.message??""},traceId:r.traceId??j(16)};return r.traceFlags!==void 0&&(o.flags=r.traceFlags),r.error&&(o.events=[{attributes:[d("exception.type",r.error.code),d("exception.message",r.error.message)],name:"exception",timeUnixNano:S(s)}]),o},R=(r,s)=>{const t=new Map([[y.functionPath,d(y.functionPath,r.functionPath)]]);r.shardKey!==void 0&&t.set(y.shardKey,d(y.shardKey,r.shardKey)),r.userId!==void 0&&t.set(y.userId,d(y.userId,r.userId)),r.errorType!==void 0&&t.set(y.errorType,d(y.errorType,r.errorType));for(const[o,e]of Object.entries(s??{}))t.set(o,d(o,J(e)));return[...t.values()]},er=r=>{const s={attributes:R({errorType:r.error?.type,functionPath:r.functionPath,shardKey:r.shardKey,userId:r.userId},r.attributes),endTimeUnixNano:S(r.startTs+r.durationMs),kind:$[r.kind??"internal"],name:r.name,parentSpanId:r.parentSpanId,spanId:r.spanId,startTimeUnixNano:S(r.startTs),status:r.ok?{code:1}:{code:2,message:r.error?.message??""},traceId:r.traceId},t=o=>X(Object.fromEntries(Object.entries(o??{}).map(([e,i])=>[e,J(i)])));return r.events!==void 0&&r.events.length>0&&(s.events=r.events.map(o=>({attributes:t(o.attributes),name:o.name,timeUnixNano:S(o.ts)}))),r.links!==void 0&&r.links.length>0&&(s.links=r.links.map(o=>({attributes:t(o.attributes),spanId:o.spanId,traceId:o.traceId}))),s},nr=r=>{const s=S(r.ts),t=R({functionPath:r.functionPath,shardKey:r.shardKey},r.attributes),o={asDouble:r.value,attributes:t,timeUnixNano:s};return r.kind==="gauge"?{gauge:{dataPoints:[o]},name:r.name}:r.kind==="histogram"?{histogram:{aggregationTemporality:1,dataPoints:[{attributes:t,bucketCounts:["1"],count:"1",explicitBounds:[],max:r.value,min:r.value,sum:r.value,timeUnixNano:s}]},name:r.name}:{name:r.name,sum:{aggregationTemporality:1,dataPoints:[o],isMonotonic:!0}}},ir=r=>{const s={attributes:R({functionPath:r.functionPath,shardKey:r.shardKey,userId:r.userId},r.fields),body:{stringValue:r.message},severityNumber:C[r.level],severityText:r.level.toUpperCase(),timeUnixNano:S(r.ts)};return r.traceId!==void 0&&(s.traceId=r.traceId),r.spanId!==void 0&&(s.spanId=r.spanId),r.eventName!==void 0&&(s.eventName=r.eventName,s.attributes.push(d("event.name",r.eventName))),s},ar=1024,cr=async r=>{const s=new Blob([r]).stream().pipeThrough(new CompressionStream("gzip"));return new Response(s).arrayBuffer()},z=async(r,s,t,o)=>{try{const e=JSON.stringify(s),{byteLength:i}=new TextEncoder().encode(e),l=(i<ar?fetch(r,{body:e,headers:t,method:"POST"}):cr(e).then(f=>fetch(r,{body:f,headers:{...t,"content-encoding":"gzip"},method:"POST"}))).then(()=>{},()=>{});o?.(l),await l}catch{}},dr=(r,s,t,o)=>{z(r,s,t,o?.waitUntil).catch(()=>{})},O=(r,s)=>s===!0&&r.ok,ur=r=>r.kind==="metric"?void 0:r.event.traceId,pr=r=>{const s=Map.groupBy(r,o=>ur(o)),t=s.get(void 0)??[];return s.delete(void 0),{byTrace:s,untraced:t}},D=5,lr=(r,s,t)=>{if(s===void 0)return r;const{byTrace:o,untraced:e}=pr(r),i=[...e];let l=0,f;for(const[h,m]of o){let u;try{u=s({logs:m.filter(a=>a.kind==="log").map(a=>a.event),rpc:m.filter(a=>a.kind==="rpc").map(a=>a.event),spans:m.filter(a=>a.kind==="span").map(a=>a.event),traceId:h})}catch(a){l+=1,l===1&&(f=a),u=!0}u&&i.push(...m)}return l>0&&t(f,l),i},P=(r,s)=>{if(s===void 0)return r;try{return s(r)??void 0}catch{return}},F=(r,s)=>{if(r.kind==="rpc"){const o=P(r.event,s?.rpc);return o===void 0?void 0:{bucket:"spans",encoded:sr(o,r.endMs)}}if(r.kind==="span"){const o=P(r.event,s?.span);return o===void 0?void 0:{bucket:"spans",encoded:er(o)}}if(r.kind==="log"){const o=P(r.event,s?.log);return o===void 0?void 0:{bucket:"logs",encoded:ir(o)}}const t=P(r.event,s?.metric);return t===void 0?void 0:{bucket:"metrics",encoded:nr(t)}},mr=(r={})=>{const{onlyErrors:s}=r;return{onLog:t=>{t.level==="error"||t.level==="fatal"?console.error("[lunora:log]",t.functionPath,t.message):console.log("[lunora:log]",t.functionPath,t.message)},onMetric:t=>{console.log("[lunora:metric]",`${t.name}=${String(t.value)}`,t.kind,t.functionPath)},onRpc:t=>{O(t,s)||(t.ok?console.log("[lunora:rpc]",t):console.error("[lunora:rpc]",t))},onSpan:t=>{const o=t.ok?"ok":`error ${t.error?.type??""}`.trim();console.log("[lunora:span]",t.name,`${String(t.durationMs)}ms`,o,t.functionPath)}}},hr=r=>{const{headers:s,onlyErrors:t,transform:o,transformLog:e,url:i}=r,l=B({"content-type":"application/json"},s),f=(h,m)=>{try{const u=fetch(i,{body:JSON.stringify(h),headers:l,method:"POST"}).catch(()=>{});m?.waitUntil&&m.waitUntil(u)}catch{}};return{onLog:(h,m)=>{const u=P(h,e);u!==void 0&&f(u,m)},onRpc:(h,m)=>{if(O(h,t))return;const u=P(h,o);u!==void 0&&f(u,m)}}},yr=r=>{const{capture:s,captureLog:t}=r,o=r.onlyErrors??!0;return{onLog:t?e=>{try{t(e)}catch{}}:void 0,onRpc:e=>{if(!O(e,o))try{s(e)}catch{}}}},gr=r=>{const{dataset:s,onlyErrors:t}=r;return{onRpc:o=>{if(!O(o,t))try{s.writeDataPoint({blobs:[o.functionPath,o.ok?"ok":"error",o.shardKey??"",o.error?.code??"",o.fanOut?.table??""],doubles:[o.durationMs,o.ok?0:1,o.fanOut?.shards??0,o.fanOut?.failed??0],indexes:[o.functionPath]})}catch{}}}},br=r=>{const{pipeline:s,serializeFields:t}=r;return{onLog:(o,e)=>{try{const i={functionPath:o.functionPath,level:o.level,message:o.message,ts:o.ts};o.fields&&(i.fields=t===!0?JSON.stringify(o.fields):o.fields);for(const f of["shardKey","userId","traceId","spanId"])o[f]!==void 0&&(i[f]=o[f]);const l=s.send([i]).catch(()=>{});e?.waitUntil&&e.waitUntil(l)}catch{}}}},kr=r=>{const{batch:s,deploymentEnvironment:t,detectResources:o,endpoint:e,headers:i,onlyErrors:l,postProcessor:f,resourceAttributes:h,serviceNamespace:m,serviceVersion:u,tailSampler:a,token:H}=r,U=r.serviceName??"lunora",E={...u===void 0?{}:{"service.version":u},...m===void 0?{}:{"service.namespace":m},...t===void 0?{}:{"deployment.environment":t},...h},x=new WeakMap,k=c=>{if(o!==!0||c?.resourceAttributes===void 0)return E;const n=x.get(c);if(n!==void 0)return n;const p=Z(c.resourceAttributes(),E);return x.set(c,p),p};let I=e;for(;I.endsWith("/");)I=I.slice(0,-1);const K={logs:{url:`${I}/v1/logs`,wrap:G},metrics:{url:`${I}/v1/metrics`,wrap:q},spans:{url:`${I}/v1/traces`,wrap:Y}},_=B({"content-type":"application/json"},i,H);let A=0;const V=(c,n)=>{if(A>=D)return;A+=1;const p=A===D?" Further tailSampler failures from this sink are silenced until the isolate restarts.":"";console.error(`[lunora:otlp] tailSampler threw for ${String(n)} trace(s) in this flush window; keeping them (fail-open), so the sampling policy did NOT apply.${p}`,c)},W=async c=>{const n=lr(c,a,V),p=new Map;for(const g of n){const b=F(g,f);if(b===void 0)continue;const M=L(g.resource);let T=p.get(M);T===void 0&&(T={logs:[],metrics:[],resource:g.resource,spans:[]},p.set(M,T)),T[b.bucket].push(b.encoded)}const w=[];for(const[,g]of p)for(const b of["spans","logs","metrics"])if(g[b].length>0){const{url:M,wrap:T}=K[b];w.push(z(M,T(g[b],"@lunora/runtime",U,g.resource),_))}await Promise.all(w)};if(s===!1){const c=(n,p)=>{const w=F(n,f);if(w!==void 0){const{url:g,wrap:b}=K[w.bucket];dr(g,b(w.encoded,"@lunora/runtime",U,n.resource),_,p)}};return{onLog:(n,p)=>{c({event:n,kind:"log",resource:k(p)},p)},onMetric:(n,p)=>{c({event:n,kind:"metric",resource:k(p)},p)},onRpc:(n,p)=>{O(n,l)||c({endMs:Date.now(),event:n,kind:"rpc",resource:k(p)},p)},onSpan:(n,p)=>{c({event:n,kind:"span",resource:k(p)},p)}}}const N=tr({export:W,...s?.maxDelayMs===void 0?{}:{maxDelayMs:s.maxDelayMs},...s?.maxItems===void 0?{}:{maxItems:s.maxItems}});return{flush:c=>{N.flush(c?.waitUntil).catch(()=>{})},onLog:(c,n)=>{N.add({event:c,kind:"log",resource:k(n)},n?.waitUntil)},onMetric:(c,n)=>{N.add({event:c,kind:"metric",resource:k(n)},n?.waitUntil)},onRpc:(c,n)=>{O(c,l)||N.add({endMs:Date.now(),event:c,kind:"rpc",resource:k(n)},n?.waitUntil)},onSpan:(c,n)=>{N.add({event:c,kind:"span",resource:k(n)},n?.waitUntil)}}},Sr=(...r)=>{const s=(t,o)=>{for(const e of r){const i=e[t];if(i)try{i.apply(e,o)}catch{}}};return{flush:t=>{s("flush",[t])},onLog:(t,o)=>{s("onLog",[t,o])},onMetric:(t,o)=>{s("onMetric",[t,o])},onRpc:(t,o)=>{s("onRpc",[t,o])},onSpan:(t,o)=>{s("onSpan",[t,o])}}};export{gr as analyticsEngineSink,Sr as combineSinks,mr as consoleSink,kr as otlpSink,br as pipelineLogSink,yr as sentrySink,hr as webhookSink};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/runtime",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.67",
|
|
4
4
|
"description": "Lunora Worker runtime: the RPC router, shard resolver, and query coordinator",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudflare",
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@lunora/bindings": "1.0.0-alpha.
|
|
49
|
+
"@lunora/bindings": "1.0.0-alpha.32",
|
|
50
50
|
"@lunora/errors": "1.0.0-alpha.22",
|
|
51
|
-
"@lunora/platform": "1.0.0-alpha.
|
|
51
|
+
"@lunora/platform": "1.0.0-alpha.14"
|
|
52
52
|
},
|
|
53
53
|
"engines": {
|
|
54
54
|
"node": "^22.15.0 || >=24.11.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{e as d,L as y,o as j,c as S,O as $,f as C,g as X,h as B,w as Y,i as q,j as G,m as Z}from"./otlp-resource-B4Yylr0V.mjs";const Q=r=>{if(typeof r=="string")return r;try{return JSON.stringify(r)??String(r)}catch{return String(r)}},J=r=>typeof r=="boolean"||typeof r=="number"||typeof r=="string"?r:Q(r),v=512,rr=200,tr=r=>{const s=r.maxItems??v,t=r.maxDelayMs??rr;let o=[],e,i,l;const f=()=>{e!==void 0&&(clearTimeout(e),e=void 0)},h=async()=>{f();const u=o;o=[];const a=l;i=void 0,l=void 0;try{u.length>0&&await r.export(u)}catch{}finally{a?.()}},m=u=>{i===void 0&&(i=new Promise(a=>{l=a}),e=setTimeout(()=>{h()},t)),u?.(i)};return{add:(u,a)=>{for(o.push(u);o.length>s;)o.shift();m(a),o.length>=s&&h()},flush:async u=>{if(o.length===0){f();return}const a=h();return u?.(a),a},get size(){return o.length}}},or=(r,s)=>r<s?-1:r>s?1:0,L=r=>{if(r===void 0)return"null";if(typeof r=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(r===null||typeof r!="object")return JSON.stringify(r);if(Array.isArray(r))return`[${r.map(i=>L(i)).join(",")}]`;const s=Object.getPrototypeOf(r);if(s!==null&&s!==Object.prototype){const i=r.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${i} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const t=r,o=Object.keys(t).toSorted(or),e=[];for(const i of o){const l=t[i];l!==void 0&&e.push(`${JSON.stringify(i)}:${L(l)}`)}return`{${e.join(",")}}`},sr=(r,s)=>{const t=[d(y.functionPath,r.functionPath),d(y.ok,r.ok)];r.method!==void 0&&t.push(d("http.request.method",r.method)),r.path!==void 0&&t.push(d("url.path",r.path)),t.push(d("http.route",r.functionPath)),r.scheme!==void 0&&t.push(d("url.scheme",r.scheme)),r.host!==void 0&&t.push(d("server.address",r.host)),r.port!==void 0&&t.push(d("server.port",r.port)),r.userAgent!==void 0&&t.push(d("user_agent.original",r.userAgent)),r.shardKey!==void 0&&t.push(d(y.shardKey,r.shardKey)),t.push(d("http.response.status_code",r.error?.status??200)),r.error&&t.push(d(y.errorType,r.error.code),d("lunora.error_status",r.error.status)),r.fanOut&&t.push(d("lunora.fanout.table",r.fanOut.table),d("lunora.fanout.shards",r.fanOut.shards),d("lunora.fanout.failed",r.fanOut.failed));const o={attributes:t,endTimeUnixNano:S(s),kind:$.server,name:r.functionPath,...r.parentSpanId===void 0?{}:{parentSpanId:r.parentSpanId},spanId:r.spanId??j(8),startTimeUnixNano:S(s-r.durationMs),status:r.ok?{code:1}:{code:2,message:r.error?.message??""},traceId:r.traceId??j(16)};return r.traceFlags!==void 0&&(o.flags=r.traceFlags),r.error&&(o.events=[{attributes:[d("exception.type",r.error.code),d("exception.message",r.error.message)],name:"exception",timeUnixNano:S(s)}]),o},R=(r,s)=>{const t=new Map([[y.functionPath,d(y.functionPath,r.functionPath)]]);r.shardKey!==void 0&&t.set(y.shardKey,d(y.shardKey,r.shardKey)),r.userId!==void 0&&t.set(y.userId,d(y.userId,r.userId)),r.errorType!==void 0&&t.set(y.errorType,d(y.errorType,r.errorType));for(const[o,e]of Object.entries(s??{}))t.set(o,d(o,J(e)));return[...t.values()]},er=r=>{const s={attributes:R({errorType:r.error?.type,functionPath:r.functionPath,shardKey:r.shardKey,userId:r.userId},r.attributes),endTimeUnixNano:S(r.startTs+r.durationMs),kind:$[r.kind??"internal"],name:r.name,parentSpanId:r.parentSpanId,spanId:r.spanId,startTimeUnixNano:S(r.startTs),status:r.ok?{code:1}:{code:2,message:r.error?.message??""},traceId:r.traceId},t=o=>X(Object.fromEntries(Object.entries(o??{}).map(([e,i])=>[e,J(i)])));return r.events!==void 0&&r.events.length>0&&(s.events=r.events.map(o=>({attributes:t(o.attributes),name:o.name,timeUnixNano:S(o.ts)}))),r.links!==void 0&&r.links.length>0&&(s.links=r.links.map(o=>({attributes:t(o.attributes),spanId:o.spanId,traceId:o.traceId}))),s},nr=r=>{const s=S(r.ts),t=R({functionPath:r.functionPath,shardKey:r.shardKey},r.attributes),o={asDouble:r.value,attributes:t,timeUnixNano:s};return r.kind==="gauge"?{gauge:{dataPoints:[o]},name:r.name}:r.kind==="histogram"?{histogram:{aggregationTemporality:1,dataPoints:[{attributes:t,bucketCounts:["1"],count:"1",explicitBounds:[],max:r.value,min:r.value,sum:r.value,timeUnixNano:s}]},name:r.name}:{name:r.name,sum:{aggregationTemporality:1,dataPoints:[o],isMonotonic:!0}}},ir=r=>{const s={attributes:R({functionPath:r.functionPath,shardKey:r.shardKey,userId:r.userId},r.fields),body:{stringValue:r.message},severityNumber:C[r.level],severityText:r.level.toUpperCase(),timeUnixNano:S(r.ts)};return r.traceId!==void 0&&(s.traceId=r.traceId),r.spanId!==void 0&&(s.spanId=r.spanId),r.eventName!==void 0&&(s.eventName=r.eventName,s.attributes.push(d("event.name",r.eventName))),s},ar=1024,cr=async r=>{const s=new Blob([r]).stream().pipeThrough(new CompressionStream("gzip"));return new Response(s).arrayBuffer()},z=async(r,s,t,o)=>{try{const e=JSON.stringify(s),{byteLength:i}=new TextEncoder().encode(e),l=(i<ar?fetch(r,{body:e,headers:t,method:"POST"}):cr(e).then(f=>fetch(r,{body:f,headers:{...t,"content-encoding":"gzip"},method:"POST"}))).then(()=>{},()=>{});o?.(l),await l}catch{}},dr=(r,s,t,o)=>{z(r,s,t,o?.waitUntil).catch(()=>{})},O=(r,s)=>s===!0&&r.ok,ur=r=>r.kind==="metric"?void 0:r.event.traceId,pr=r=>{const s=Map.groupBy(r,o=>ur(o)),t=s.get(void 0)??[];return s.delete(void 0),{byTrace:s,untraced:t}},D=5,lr=(r,s,t)=>{if(s===void 0)return r;const{byTrace:o,untraced:e}=pr(r),i=[...e];let l=0,f;for(const[h,m]of o){let u;try{u=s({logs:m.filter(a=>a.kind==="log").map(a=>a.event),rpc:m.filter(a=>a.kind==="rpc").map(a=>a.event),spans:m.filter(a=>a.kind==="span").map(a=>a.event),traceId:h})}catch(a){l+=1,l===1&&(f=a),u=!0}u&&i.push(...m)}return l>0&&t(f,l),i},P=(r,s)=>{if(s===void 0)return r;try{return s(r)??void 0}catch{return}},F=(r,s)=>{if(r.kind==="rpc"){const o=P(r.event,s?.rpc);return o===void 0?void 0:{bucket:"spans",encoded:sr(o,r.endMs)}}if(r.kind==="span"){const o=P(r.event,s?.span);return o===void 0?void 0:{bucket:"spans",encoded:er(o)}}if(r.kind==="log"){const o=P(r.event,s?.log);return o===void 0?void 0:{bucket:"logs",encoded:ir(o)}}const t=P(r.event,s?.metric);return t===void 0?void 0:{bucket:"metrics",encoded:nr(t)}},mr=(r={})=>{const{onlyErrors:s}=r;return{onLog:t=>{t.level==="error"||t.level==="fatal"?console.error("[lunora:log]",t.functionPath,t.message):console.log("[lunora:log]",t.functionPath,t.message)},onMetric:t=>{console.log("[lunora:metric]",`${t.name}=${String(t.value)}`,t.kind,t.functionPath)},onRpc:t=>{O(t,s)||(t.ok?console.log("[lunora:rpc]",t):console.error("[lunora:rpc]",t))},onSpan:t=>{const o=t.ok?"ok":`error ${t.error?.type??""}`.trim();console.log("[lunora:span]",t.name,`${String(t.durationMs)}ms`,o,t.functionPath)}}},hr=r=>{const{headers:s,onlyErrors:t,transform:o,transformLog:e,url:i}=r,l=B({"content-type":"application/json"},s),f=(h,m)=>{try{const u=fetch(i,{body:JSON.stringify(h),headers:l,method:"POST"}).catch(()=>{});m?.waitUntil&&m.waitUntil(u)}catch{}};return{onLog:(h,m)=>{const u=P(h,e);u!==void 0&&f(u,m)},onRpc:(h,m)=>{if(O(h,t))return;const u=P(h,o);u!==void 0&&f(u,m)}}},yr=r=>{const{capture:s,captureLog:t}=r,o=r.onlyErrors??!0;return{onLog:t?e=>{try{t(e)}catch{}}:void 0,onRpc:e=>{if(!O(e,o))try{s(e)}catch{}}}},gr=r=>{const{dataset:s,onlyErrors:t}=r;return{onRpc:o=>{if(!O(o,t))try{s.writeDataPoint({blobs:[o.functionPath,o.ok?"ok":"error",o.shardKey??"",o.error?.code??"",o.fanOut?.table??""],doubles:[o.durationMs,o.ok?0:1,o.fanOut?.shards??0,o.fanOut?.failed??0],indexes:[o.functionPath]})}catch{}}}},br=r=>{const{pipeline:s,serializeFields:t}=r;return{onLog:(o,e)=>{try{const i={functionPath:o.functionPath,level:o.level,message:o.message,ts:o.ts};o.fields&&(i.fields=t===!0?JSON.stringify(o.fields):o.fields);for(const f of["shardKey","userId","traceId","spanId"])o[f]!==void 0&&(i[f]=o[f]);const l=s.send([i]).catch(()=>{});e?.waitUntil&&e.waitUntil(l)}catch{}}}},kr=r=>{const{batch:s,deploymentEnvironment:t,detectResources:o,endpoint:e,headers:i,onlyErrors:l,postProcessor:f,resourceAttributes:h,serviceNamespace:m,serviceVersion:u,tailSampler:a,token:H}=r,U=r.serviceName??"lunora",E={...u===void 0?{}:{"service.version":u},...m===void 0?{}:{"service.namespace":m},...t===void 0?{}:{"deployment.environment":t},...h},x=new WeakMap,k=c=>{if(o!==!0||c?.resourceAttributes===void 0)return E;const n=x.get(c);if(n!==void 0)return n;const p=Z(c.resourceAttributes(),E);return x.set(c,p),p};let I=e;for(;I.endsWith("/");)I=I.slice(0,-1);const K={logs:{url:`${I}/v1/logs`,wrap:G},metrics:{url:`${I}/v1/metrics`,wrap:q},spans:{url:`${I}/v1/traces`,wrap:Y}},_=B({"content-type":"application/json"},i,H);let A=0;const V=(c,n)=>{if(A>=D)return;A+=1;const p=A===D?" Further tailSampler failures from this sink are silenced until the isolate restarts.":"";console.error(`[lunora:otlp] tailSampler threw for ${String(n)} trace(s) in this flush window; keeping them (fail-open), so the sampling policy did NOT apply.${p}`,c)},W=async c=>{const n=lr(c,a,V),p=new Map;for(const g of n){const b=F(g,f);if(b===void 0)continue;const M=L(g.resource);let T=p.get(M);T===void 0&&(T={logs:[],metrics:[],resource:g.resource,spans:[]},p.set(M,T)),T[b.bucket].push(b.encoded)}const w=[];for(const[,g]of p)for(const b of["spans","logs","metrics"])if(g[b].length>0){const{url:M,wrap:T}=K[b];w.push(z(M,T(g[b],"@lunora/runtime",U,g.resource),_))}await Promise.all(w)};if(s===!1){const c=(n,p)=>{const w=F(n,f);if(w!==void 0){const{url:g,wrap:b}=K[w.bucket];dr(g,b(w.encoded,"@lunora/runtime",U,n.resource),_,p)}};return{onLog:(n,p)=>{c({event:n,kind:"log",resource:k(p)},p)},onMetric:(n,p)=>{c({event:n,kind:"metric",resource:k(p)},p)},onRpc:(n,p)=>{O(n,l)||c({endMs:Date.now(),event:n,kind:"rpc",resource:k(p)},p)},onSpan:(n,p)=>{c({event:n,kind:"span",resource:k(p)},p)}}}const N=tr({export:W,...s?.maxDelayMs===void 0?{}:{maxDelayMs:s.maxDelayMs},...s?.maxItems===void 0?{}:{maxItems:s.maxItems}});return{flush:c=>{N.flush(c?.waitUntil).catch(()=>{})},onLog:(c,n)=>{N.add({event:c,kind:"log",resource:k(n)},n?.waitUntil)},onMetric:(c,n)=>{N.add({event:c,kind:"metric",resource:k(n)},n?.waitUntil)},onRpc:(c,n)=>{O(c,l)||N.add({endMs:Date.now(),event:c,kind:"rpc",resource:k(n)},n?.waitUntil)},onSpan:(c,n)=>{N.add({event:c,kind:"span",resource:k(n)},n?.waitUntil)}}},Sr=(...r)=>{const s=(t,o)=>{for(const e of r){const i=e[t];if(i)try{i.apply(e,o)}catch{}}};return{flush:t=>{s("flush",[t])},onLog:(t,o)=>{s("onLog",[t,o])},onMetric:(t,o)=>{s("onMetric",[t,o])},onRpc:(t,o)=>{s("onRpc",[t,o])},onSpan:(t,o)=>{s("onSpan",[t,o])}}};export{gr as analyticsEngineSink,Sr as combineSinks,mr as consoleSink,kr as otlpSink,br as pipelineLogSink,yr as sentrySink,hr as webhookSink};
|