@lensmcp/node-instrumentation 1.23.6 → 1.23.7

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.
@@ -1 +1,3 @@
1
1
  export declare function bullmqTap(exportsObject: unknown): boolean;
2
+ /** Test seam: stop every publisher and forget what they read from. */
3
+ export declare function resetQueueStatePublishersForTests(): void;
package/lib/tap-bullmq.js CHANGED
@@ -1 +1 @@
1
- "use strict";var b=Object.defineProperty;var f=(n,e)=>b(n,"name",{value:e,configurable:!0});var w=Object.defineProperty,l=f((n,e)=>w(n,"name",{value:e,configurable:!0}),"l");Object.defineProperty(exports,"__esModule",{value:!0}),exports.bullmqTap=bullmqTap;const active_work_1=require("./active-work"),workerGeneration=new WeakMap,emit_1=require("./emit"),flow_context_1=require("./flow-context");function jobFlow(n){const e=n?.opts?.__lensmcpFlow;return e&&typeof e=="object"?e:void 0}f(jobFlow,"jobFlow"),l(jobFlow,"jobFlow");const jobLegId=l((n,e)=>`job:${n}#${e?.id??"?"}`,"jobLegId"),publishers=new Map;function bullmqTap(n){const e=n;if(typeof e?.Queue!="function"||typeof e?.Worker!="function")return!1;try{tapQueueAdd(e)}catch{}try{tapWorkerEmit(e)}catch{}try{tapWorkerProcess(e)}catch{}try{tapWorkerConstruct(e)}catch{}return!0}f(bullmqTap,"bullmqTap"),l(bullmqTap,"bullmqTap");function tapWorkerConstruct(n){const e=n.Worker;if(typeof e!="function"||e.__lensmcpGen)return;const u=new Proxy(e,{construct(r,t,s){const a=Reflect.construct(r,t,s);try{workerGeneration.set(a,(0,active_work_1.activeWorkGeneration)())}catch{}return a}});Object.defineProperty(e,"__lensmcpGen",{value:!0,enumerable:!1}),n.Worker=u}f(tapWorkerConstruct,"tapWorkerConstruct"),l(tapWorkerConstruct,"tapWorkerConstruct");function tapWorkerProcess(n){const e=n.Worker?.prototype,u=e?.callProcessJob;if(!e||typeof u!="function"||u.__lensmcp)return;const r=l(async function(t,...s){const a=workerGeneration.get(this),i=(0,active_work_1.beginActiveWork)(a),c=jobFlow(t);if(!c?.flowId)return u.call(this,t,...s).finally(i);const o=String(this?.name??t?.queueName??"queue"),m=jobLegId(o,t),d=Date.now(),p={flowId:c.flowId,requestId:m};return(0,flow_context_1.runInFlowContext)(p,async()=>{try{const q=await u.call(this,t,...s);return(0,emit_1.lensEmit)("queue","info",`process ${t?.name}#${t?.id} (${Date.now()-d}ms)`,{queue:o,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:d,durationMs:Date.now()-d,status:"ok"},`queue:${o}`,p),q}catch(q){throw(0,emit_1.lensEmit)("queue","error",`process ${t?.name}#${t?.id} failed (${Date.now()-d}ms)`,{queue:o,kind:"queue-process",job:t?.name,jobId:t?.id,startedAt:d,durationMs:Date.now()-d,status:"error",error:String(q?.message??q)},`queue:${o}`,p),q}finally{i()}})},"wrapped");r.__lensmcp=!0,e.callProcessJob=r}f(tapWorkerProcess,"tapWorkerProcess"),l(tapWorkerProcess,"tapWorkerProcess");function tapQueueAdd(n){const e=n.Queue?.prototype,u=e?.add;if(!e||typeof u!="function"||u.__lensmcp)return;const r=l(async function(t,...s){const a=Date.now(),i=(0,flow_context_1.flowContext)();if(i?.flowId){const o=s[1]??{};s[1]={...o,__lensmcpFlow:{flowId:i.flowId,...i.requestId?{originRequestId:i.requestId}:{}}}}const c=await u.call(this,t,...s);try{const o=String(this?.name??"queue"),m=s[0];let d;try{const p=JSON.stringify(m);d=p&&p!=="undefined"?p.length>300?p.slice(0,299)+"\u2026":p:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`enqueued ${t}#${c?.id} \u2192 ${o}`,{queue:o,kind:"queue-enqueued",job:t,jobId:c?.id,...d?{data:d}:{},startedAt:a,durationMs:Date.now()-a},`queue:${o}`,i),ensureStatePublisher(o,this)}catch{}return c},"wrapped");r.__lensmcp=!0,e.add=r}f(tapQueueAdd,"tapQueueAdd"),l(tapQueueAdd,"tapQueueAdd");function tapWorkerEmit(n){const e=n.Worker?.prototype,u=e?.emit;if(!e||typeof u!="function"||u.__lensmcp)return;const r=l(function(t,...s){try{observeWorkerEvent(this,String(t),s)}catch{}return u.call(this,t,...s)},"wrapped");r.__lensmcp=!0,e.emit=r}f(tapWorkerEmit,"tapWorkerEmit"),l(tapWorkerEmit,"tapWorkerEmit");function observeWorkerEvent(n,e,u){if(e!=="active"&&e!=="completed"&&e!=="failed")return;const r=String(n.name??"queue"),t=u[0],s=jobFlow(t),a=s?.flowId?{flowId:s.flowId,requestId:jobLegId(r,t)}:void 0;if(e==="active")(0,emit_1.lensEmit)("queue","info",`processing ${t?.name}#${t?.id}`,{queue:r,kind:"queue-active",jobId:t?.id},`queue:${r}`,a);else if(e==="completed"){let i;try{const c=t?.returnvalue??u[1],o=JSON.stringify(c);i=o&&o!=="undefined"?o.length>160?o.slice(0,159)+"\u2026":o:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`completed ${t?.name}#${t?.id}`,{queue:r,kind:"queue-completed",jobId:t?.id,...i?{returned:i}:{}},`queue:${r}`,a)}else{const i=u[1];(0,emit_1.lensEmit)("queue","error",`job ${t?.id} failed: ${i?.message}`,{queue:r,kind:"queue-failed",jobId:t?.id,error:String(i?.message??i)},`queue:${r}`,a)}if(!publishers.has(r))try{const i=n.opts,c=require("bullmq").Queue;ensureStatePublisher(r,new c(r,{connection:i?.connection}))}catch{}}f(observeWorkerEvent,"observeWorkerEvent"),l(observeWorkerEvent,"observeWorkerEvent");function ensureStatePublisher(n,e){if(publishers.has(n))return;let u="";const r=setInterval(()=>{(async()=>{try{const t=await e.getJobCounts(),s=[];for(const c of["active","waiting","failed","completed","delayed"])for(const o of await e.getJobs([c],0,7)){const m=o?.data?.to;s.push({id:String(o.id),name:o.name,state:c,timestamp:o.timestamp??0,...typeof m=="string"?{to:m}:{}})}s.sort((c,o)=>Number(o.timestamp)-Number(c.timestamp));const a=s.slice(0,8),i=JSON.stringify([t,a.map(c=>`${c.id}${c.state}`)]);if(i===u)return;u=i,(0,emit_1.lensEmit)("queue","info",`queue state: ${t.active??0} active \xB7 ${t.waiting??0} waiting \xB7 ${t.failed??0} failed`,{queue:n,kind:"queue-state",counts:t,recent:a},`queue:${n}`)}catch{}})()},2e3);r.unref?.(),publishers.set(n,r)}f(ensureStatePublisher,"ensureStatePublisher"),l(ensureStatePublisher,"ensureStatePublisher");
1
+ "use strict";var b=Object.defineProperty;var d=(t,e)=>b(t,"name",{value:e,configurable:!0});var w=Object.defineProperty,a=d((t,e)=>w(t,"name",{value:e,configurable:!0}),"a");Object.defineProperty(exports,"__esModule",{value:!0}),exports.bullmqTap=bullmqTap,exports.resetQueueStatePublishersForTests=resetQueueStatePublishersForTests;const active_work_1=require("./active-work"),workerGeneration=new WeakMap,emit_1=require("./emit"),flow_context_1=require("./flow-context");function jobFlow(t){const e=t?.opts?.__lensmcpFlow;return e&&typeof e=="object"?e:void 0}d(jobFlow,"jobFlow"),a(jobFlow,"jobFlow");const jobLegId=a((t,e)=>`job:${t}#${e?.id??"?"}`,"jobLegId"),publishers=new Map,sources=new Map,sourceFor=a(t=>{let e=sources.get(t);return e||sources.set(t,e={}),e},"sourceFor"),usable=a(t=>!!t&&t.closing===void 0,"usable"),currentQueue=a(t=>{const e=sources.get(t),o=e?.app?.deref();return usable(o)?o:e?.own},"currentQueue");function ownConnection(t){if(!t||typeof t!="object")return;const e=t;if(typeof e.duplicate=="function")try{return e.duplicate()}catch{return}return Object.fromEntries(Object.entries(e).filter(([,o])=>typeof o!="function"))}d(ownConnection,"ownConnection"),a(ownConnection,"ownConnection");function bullmqTap(t){const e=t;if(typeof e?.Queue!="function"||typeof e?.Worker!="function")return!1;tappedQueue=e.Queue;try{tapQueueAdd(e)}catch{}try{tapWorkerEmit(e)}catch{}try{tapWorkerProcess(e)}catch{}try{tapWorkerConstruct(e)}catch{}return!0}d(bullmqTap,"bullmqTap"),a(bullmqTap,"bullmqTap");function tapWorkerConstruct(t){const e=t.Worker;if(typeof e!="function"||e.__lensmcpGen)return;const o=new Proxy(e,{construct(u,n,i){const l=Reflect.construct(u,n,i);try{workerGeneration.set(l,(0,active_work_1.activeWorkGeneration)())}catch{}return l}});Object.defineProperty(e,"__lensmcpGen",{value:!0,enumerable:!1}),t.Worker=o}d(tapWorkerConstruct,"tapWorkerConstruct"),a(tapWorkerConstruct,"tapWorkerConstruct");function tapWorkerProcess(t){const e=t.Worker?.prototype,o=e?.callProcessJob;if(!e||typeof o!="function"||o.__lensmcp)return;const u=a(async function(n,...i){const l=workerGeneration.get(this),s=(0,active_work_1.beginActiveWork)(l),c=jobFlow(n);if(!c?.flowId)return o.call(this,n,...i).finally(s);const r=String(this?.name??n?.queueName??"queue"),m=jobLegId(r,n),p=Date.now(),q={flowId:c.flowId,requestId:m};return(0,flow_context_1.runInFlowContext)(q,async()=>{try{const f=await o.call(this,n,...i);return(0,emit_1.lensEmit)("queue","info",`process ${n?.name}#${n?.id} (${Date.now()-p}ms)`,{queue:r,kind:"queue-process",job:n?.name,jobId:n?.id,startedAt:p,durationMs:Date.now()-p,status:"ok"},`queue:${r}`,q),f}catch(f){throw(0,emit_1.lensEmit)("queue","error",`process ${n?.name}#${n?.id} failed (${Date.now()-p}ms)`,{queue:r,kind:"queue-process",job:n?.name,jobId:n?.id,startedAt:p,durationMs:Date.now()-p,status:"error",error:String(f?.message??f)},`queue:${r}`,q),f}finally{s()}})},"wrapped");u.__lensmcp=!0,e.callProcessJob=u}d(tapWorkerProcess,"tapWorkerProcess"),a(tapWorkerProcess,"tapWorkerProcess");function tapQueueAdd(t){const e=t.Queue?.prototype,o=e?.add;if(!e||typeof o!="function"||o.__lensmcp)return;const u=a(async function(n,...i){const l=Date.now(),s=(0,flow_context_1.flowContext)();if(s?.flowId){const r=i[1]??{};i[1]={...r,__lensmcpFlow:{flowId:s.flowId,...s.requestId?{originRequestId:s.requestId}:{}}}}const c=await o.call(this,n,...i);try{const r=String(this?.name??"queue"),m=i[0];let p;try{const f=JSON.stringify(m);p=f&&f!=="undefined"?f.length>300?f.slice(0,299)+"\u2026":f:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`enqueued ${n}#${c?.id} \u2192 ${r}`,{queue:r,kind:"queue-enqueued",job:n,jobId:c?.id,...p?{data:p}:{},startedAt:l,durationMs:Date.now()-l},`queue:${r}`,s);const q=sourceFor(r);q.app?.deref()!==this&&(q.app=new WeakRef(this)),ensureStatePublisher(r)}catch{}return c},"wrapped");u.__lensmcp=!0,e.add=u}d(tapQueueAdd,"tapQueueAdd"),a(tapQueueAdd,"tapQueueAdd");function tapWorkerEmit(t){const e=t.Worker?.prototype,o=e?.emit;if(!e||typeof o!="function"||o.__lensmcp)return;const u=a(function(n,...i){try{observeWorkerEvent(this,String(n),i)}catch{}return o.call(this,n,...i)},"wrapped");u.__lensmcp=!0,e.emit=u}d(tapWorkerEmit,"tapWorkerEmit"),a(tapWorkerEmit,"tapWorkerEmit");function observeWorkerEvent(t,e,o){if(e!=="active"&&e!=="completed"&&e!=="failed")return;const u=String(t.name??"queue"),n=o[0],i=jobFlow(n),l=i?.flowId?{flowId:i.flowId,requestId:jobLegId(u,n)}:void 0;if(e==="active")(0,emit_1.lensEmit)("queue","info",`processing ${n?.name}#${n?.id}`,{queue:u,kind:"queue-active",jobId:n?.id},`queue:${u}`,l);else if(e==="completed"){let s;try{const c=n?.returnvalue??o[1],r=JSON.stringify(c);s=r&&r!=="undefined"?r.length>160?r.slice(0,159)+"\u2026":r:void 0}catch{}(0,emit_1.lensEmit)("queue","info",`completed ${n?.name}#${n?.id}`,{queue:u,kind:"queue-completed",jobId:n?.id,...s?{returned:s}:{}},`queue:${u}`,l)}else{const s=o[1];(0,emit_1.lensEmit)("queue","error",`job ${n?.id} failed: ${s?.message}`,{queue:u,kind:"queue-failed",jobId:n?.id,error:String(s?.message??s)},`queue:${u}`,l)}if(!currentQueue(u))try{const s=t.opts,c=ownConnection(s?.connection);if(c){const r=snapshotQueueClass();r&&(sourceFor(u).own=new r(u,{connection:c}))}}catch{}ensureStatePublisher(u)}d(observeWorkerEvent,"observeWorkerEvent"),a(observeWorkerEvent,"observeWorkerEvent");let tappedQueue;function snapshotQueueClass(){if(tappedQueue)return tappedQueue;try{return require("bullmq").Queue}catch{return}}d(snapshotQueueClass,"snapshotQueueClass"),a(snapshotQueueClass,"snapshotQueueClass");function ensureStatePublisher(t){if(publishers.has(t))return;let e="";const o=setInterval(()=>{(async()=>{try{const u=currentQueue(t);if(!u)return;const n=await u.getJobCounts(),i=[];for(const c of["active","waiting","failed","completed","delayed"])for(const r of await u.getJobs([c],0,7)){const m=r?.data?.to;i.push({id:String(r.id),name:r.name,state:c,timestamp:r.timestamp??0,...typeof m=="string"?{to:m}:{}})}i.sort((c,r)=>Number(r.timestamp)-Number(c.timestamp));const l=i.slice(0,8),s=JSON.stringify([n,l.map(c=>`${c.id}${c.state}`)]);if(s===e)return;e=s,(0,emit_1.lensEmit)("queue","info",`queue state: ${n.active??0} active \xB7 ${n.waiting??0} waiting \xB7 ${n.failed??0} failed`,{queue:t,kind:"queue-state",counts:n,recent:l},`queue:${t}`)}catch{}})()},2e3);o.unref?.(),publishers.set(t,o)}d(ensureStatePublisher,"ensureStatePublisher"),a(ensureStatePublisher,"ensureStatePublisher");function resetQueueStatePublishersForTests(){for(const t of publishers.values())clearInterval(t);publishers.clear(),sources.clear()}d(resetQueueStatePublishersForTests,"resetQueueStatePublishersForTests"),a(resetQueueStatePublishersForTests,"resetQueueStatePublishersForTests");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lensmcp/node-instrumentation",
3
- "version": "1.23.6",
3
+ "version": "1.23.7",
4
4
  "main": "./index.js",
5
5
  "types": "./index.d.ts",
6
6
  "exports": {
@@ -15,9 +15,9 @@
15
15
  }
16
16
  },
17
17
  "dependencies": {
18
- "@lensmcp/core": "1.23.6",
19
- "@lensmcp/nest-instrumentation": "1.23.6",
20
- "@lensmcp/protocol-types": "1.23.6",
18
+ "@lensmcp/core": "1.23.7",
19
+ "@lensmcp/nest-instrumentation": "1.23.7",
20
+ "@lensmcp/protocol-types": "1.23.7",
21
21
  "tslib": "^2.3.0"
22
22
  },
23
23
  "optionalDependencies": {