@replay-kit/core 0.0.1
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/LICENSE +21 -0
- package/README.md +2 -0
- package/dist/app_event.cjs +4 -0
- package/dist/app_event.d.cts +7 -0
- package/dist/app_event.d.ts +7 -0
- package/dist/app_event.js +4 -0
- package/dist/cli.cjs +46 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +46 -0
- package/dist/enum/index.cjs +1 -0
- package/dist/enum/index.d.cts +1 -0
- package/dist/enum/index.d.ts +1 -0
- package/dist/enum/index.js +1 -0
- package/dist/enum/log_level.enum.cjs +1 -0
- package/dist/enum/log_level.enum.d.cts +7 -0
- package/dist/enum/log_level.enum.d.ts +7 -0
- package/dist/enum/log_level.enum.js +1 -0
- package/dist/error_handle.helper-CQsPSbuz.d.cts +75 -0
- package/dist/error_handle.helper-CQsPSbuz.d.ts +75 -0
- package/dist/helper/crypto.helper.cjs +1 -0
- package/dist/helper/crypto.helper.d.cts +3 -0
- package/dist/helper/crypto.helper.d.ts +3 -0
- package/dist/helper/crypto.helper.js +1 -0
- package/dist/helper/error_handle.helper.cjs +3 -0
- package/dist/helper/error_handle.helper.d.cts +2 -0
- package/dist/helper/error_handle.helper.d.ts +2 -0
- package/dist/helper/error_handle.helper.js +3 -0
- package/dist/helper/index.cjs +4 -0
- package/dist/helper/index.d.cts +4 -0
- package/dist/helper/index.d.ts +4 -0
- package/dist/helper/index.js +4 -0
- package/dist/helper/stack.helper.cjs +2 -0
- package/dist/helper/stack.helper.d.cts +9 -0
- package/dist/helper/stack.helper.d.ts +9 -0
- package/dist/helper/stack.helper.js +2 -0
- package/dist/index-8u1_ya-u.d.ts +36 -0
- package/dist/index-MBKv_hsI.d.cts +36 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +4 -0
- package/dist/logger/actions/index.cjs +3 -0
- package/dist/logger/actions/index.d.cts +4 -0
- package/dist/logger/actions/index.d.ts +4 -0
- package/dist/logger/actions/index.js +3 -0
- package/dist/logger/actions/record.action.cjs +2 -0
- package/dist/logger/actions/record.action.d.cts +4 -0
- package/dist/logger/actions/record.action.d.ts +4 -0
- package/dist/logger/actions/record.action.js +2 -0
- package/dist/logger/actions/view_many.action.cjs +2 -0
- package/dist/logger/actions/view_many.action.d.cts +4 -0
- package/dist/logger/actions/view_many.action.d.ts +4 -0
- package/dist/logger/actions/view_many.action.js +2 -0
- package/dist/logger/handler.cjs +3 -0
- package/dist/logger/handler.d.cts +4 -0
- package/dist/logger/handler.d.ts +4 -0
- package/dist/logger/handler.js +3 -0
- package/dist/logger/index.cjs +3 -0
- package/dist/logger/index.d.cts +4 -0
- package/dist/logger/index.d.ts +4 -0
- package/dist/logger/index.js +3 -0
- package/dist/replay/base.cjs +1 -0
- package/dist/replay/base.d.cts +18 -0
- package/dist/replay/base.d.ts +18 -0
- package/dist/replay/base.js +1 -0
- package/dist/replay/handler.cjs +25 -0
- package/dist/replay/handler.d.cts +24 -0
- package/dist/replay/handler.d.ts +24 -0
- package/dist/replay/handler.js +25 -0
- package/dist/replay/helper.cjs +1 -0
- package/dist/replay/helper.d.cts +34 -0
- package/dist/replay/helper.d.ts +34 -0
- package/dist/replay/helper.js +1 -0
- package/dist/replay/index.cjs +25 -0
- package/dist/replay/index.d.cts +6 -0
- package/dist/replay/index.d.ts +6 -0
- package/dist/replay/index.js +25 -0
- package/dist/replay/mode/advance/index.cjs +22 -0
- package/dist/replay/mode/advance/index.d.cts +11 -0
- package/dist/replay/mode/advance/index.d.ts +11 -0
- package/dist/replay/mode/advance/index.js +22 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/base.cjs +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/base.d.cts +137 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/base.d.ts +137 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/base.js +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.cjs +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.d.cts +19 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.d.ts +19 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/business_logic_rejection_case/index.js +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/index.cjs +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/index.d.cts +15 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/index.d.ts +15 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/index.js +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.cjs +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.d.cts +18 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.d.ts +18 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/post_trace_response_mutation_case/index.js +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.cjs +14 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.d.cts +18 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.d.ts +18 -0
- package/dist/replay/mode/advance/reasons/assigner_cases/trace_divergence_case/index.js +14 -0
- package/dist/replay/mode/advance/reasons/index.cjs +21 -0
- package/dist/replay/mode/advance/reasons/index.d.cts +17 -0
- package/dist/replay/mode/advance/reasons/index.d.ts +17 -0
- package/dist/replay/mode/advance/reasons/index.js +21 -0
- package/dist/replay/mode/advance/reasons/reason_assigner.cjs +14 -0
- package/dist/replay/mode/advance/reasons/reason_assigner.d.cts +25 -0
- package/dist/replay/mode/advance/reasons/reason_assigner.d.ts +25 -0
- package/dist/replay/mode/advance/reasons/reason_assigner.js +14 -0
- package/dist/replay/mode/advance/reasons/reason_printer.cjs +8 -0
- package/dist/replay/mode/advance/reasons/reason_printer.d.cts +25 -0
- package/dist/replay/mode/advance/reasons/reason_printer.d.ts +25 -0
- package/dist/replay/mode/advance/reasons/reason_printer.js +8 -0
- package/dist/replay/mode/advance/reasons/reason_signal.cjs +1 -0
- package/dist/replay/mode/advance/reasons/reason_signal.d.cts +87 -0
- package/dist/replay/mode/advance/reasons/reason_signal.d.ts +87 -0
- package/dist/replay/mode/advance/reasons/reason_signal.js +1 -0
- package/dist/replay/mode/advance/replay.cjs +22 -0
- package/dist/replay/mode/advance/replay.d.cts +57 -0
- package/dist/replay/mode/advance/replay.d.ts +57 -0
- package/dist/replay/mode/advance/replay.js +22 -0
- package/dist/replay/mode/index.cjs +25 -0
- package/dist/replay/mode/index.d.cts +12 -0
- package/dist/replay/mode/index.d.ts +12 -0
- package/dist/replay/mode/index.js +25 -0
- package/dist/replay/mode/smart.replay.cjs +4 -0
- package/dist/replay/mode/smart.replay.d.cts +18 -0
- package/dist/replay/mode/smart.replay.d.ts +18 -0
- package/dist/replay/mode/smart.replay.js +4 -0
- package/dist/setup.cjs +7 -0
- package/dist/setup.d.cts +27 -0
- package/dist/setup.d.ts +27 -0
- package/dist/setup.js +7 -0
- package/dist/trace/builder.cjs +1 -0
- package/dist/trace/builder.d.cts +6 -0
- package/dist/trace/builder.d.ts +6 -0
- package/dist/trace/builder.js +1 -0
- package/dist/trace/context.cjs +2 -0
- package/dist/trace/context.d.cts +2 -0
- package/dist/trace/context.d.ts +2 -0
- package/dist/trace/context.js +2 -0
- package/dist/trace/filter.cjs +1 -0
- package/dist/trace/filter.d.cts +21 -0
- package/dist/trace/filter.d.ts +21 -0
- package/dist/trace/filter.js +1 -0
- package/dist/trace/index.cjs +2 -0
- package/dist/trace/index.d.cts +7 -0
- package/dist/trace/index.d.ts +7 -0
- package/dist/trace/index.js +2 -0
- package/package.json +81 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { SmartReplay } from './smart.replay.js';
|
|
2
|
+
export { AdvanceReplay, PrintParams, RootCauseParams, RootCauseReason } from './advance/replay.js';
|
|
3
|
+
import '../../error_handle.helper-CQsPSbuz.js';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
import '../../setup.js';
|
|
6
|
+
import '../../index-8u1_ya-u.js';
|
|
7
|
+
import '../../enum/log_level.enum.js';
|
|
8
|
+
import '../base.js';
|
|
9
|
+
import '../../trace/filter.js';
|
|
10
|
+
import '../helper.js';
|
|
11
|
+
import '../handler.js';
|
|
12
|
+
import './advance/reasons/reason_signal.js';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var J=Object.defineProperty;var a=(s,e)=>J(s,"name",{value:e,configurable:!0});import w from"chalk";import{ulid as fe}from"ulid";import{AsyncLocalStorage as z}from"async_hooks";import X from"fs";import ee from"chalk";import re from"path";import{bundleRequire as ne}from"bundle-require";var he=new z;import U from"crypto";function O(s){try{return U.createHash("md5").update(s).digest("hex")}catch(e){throw e}}a(O,"cryptoHash");var L="__root__";function W(s){let e=new Map;for(let t of s){let r=t.parentId||L;e.has(r)||e.set(r,[]),e.get(r).push(t)}return e}a(W,"buildTraceTree");function G(s,e,t){return`${t}->${s.name}#${e}`}a(G,"buildSignature");function R(s){try{let n=function(o,l){(t.get(o)||[]).sort((c,p)=>c.start-p.start).forEach((c,p)=>{let f=G(c,p,l),h=O(f);r.push({...c,signature:h,rawSignature:f}),n(c.id,h)})};var e=n;a(n,"walk");let t=W(s),r=[];return n(L,L),r}catch(t){throw t}}a(R,"flattenTrace");var S=class{constructor(e){this.config=e}config;static{a(this,"ReplayFilterManager")}matchPattern(e,t){try{return e instanceof RegExp?e.test(t):e.includes("*")?new RegExp("^"+e.replace(/\*/g,".*")+"$").test(t):e===t}catch(r){throw r}}async filterTrace(e){try{if(!this.config.filters||!e||e.length===0)return e;let t=this.config.filters;return e.filter(r=>{let n=r.name;return!t.ignoreSteps?.some(l=>this.matchPattern(l,n))})}catch(t){throw t}}async filterNonOptionalTrace(e){try{if(!this.config.filters||!e||e.length===0)return e;let t=this.config.filters;return e.filter(r=>{let n=r.name;return!t.optionalSteps?.some(l=>this.matchPattern(l,n))})}catch(t){throw t}}isOptionalStep(e){try{return this.config.filters?.optionalSteps?.some(t=>this.matchPattern(t,e))}catch(t){throw t}}async filterResponse(e){try{if(!this.config.filters||!e)return e;let t=Object.keys(e.error);if(t.length===0)return e;let r=this.config.filters;for(let n of t)r.ignoreFields?.includes(n)&&delete e.error[n];return{...e,error:e.error}}catch(t){throw t}}};import"dotenv/config.js";var x=class{constructor(e){this.config=e}config;static{a(this,"ReplayHelper")}get filterManager(){return new S(this.config)}setConfig(e){this.config=e}normalize(e){if(!e)return e;if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return e}stableStringify(e){return JSON.stringify(this.sortKeys(e))}sortKeys(e){return Array.isArray(e)?e.map(t=>this.sortKeys(t)):e&&typeof e=="object"?Object.keys(e).sort().reduce((t,r)=>(t[r]=this.sortKeys(e[r]),t),{}):e}compareTrace(e,t){try{let r=[],n=new Map(e.map(i=>[i.signature,i])),o=new Map(t.map(i=>[i.signature,i])),l={};for(let[i,c]of n)l[c.name]={id:c.id,parentId:c.parentId,original:c.returnData,replay:null},o.has(c.signature)||this.filterManager.isOptionalStep(c.name)||r.push({type:"missing_step",name:c.name,message:`Missing step: ${i}`});for(let[i,c]of o)l[c.name].replay=c.returnData,n.has(c.signature)||i&&this.filterManager.isOptionalStep(c.name)||r.push({type:"extra_step",name:c.name,message:`Extra step: ${i}`});for(let i in l){let c=l[i].original,p=l[i].replay;c!==p&&r.push({type:"trace_return_data_mismatch",name:i,message:"Trace return data mismatch",not_matched:{original:c,replay:p}})}return{isDifferent:r.length>0,issues:r}}catch(r){throw r}}compareResponse(e,t){try{let r=[];e.status!==t.status&&r.push({type:"status_mismatch",message:"Status code mismatch",not_matched:{original:e.status,replay:t.status}});let n=this.normalize(e.error),o=this.normalize(t.error),l=this.stableStringify(n),i=this.stableStringify(o);return l!==i&&r.push({type:"body_mismatch",message:"Response mismatch",not_matched:{original:n,replay:o}}),{isDifferent:r.length>0,issues:r}}catch(r){throw r}}fullUrl(e){return`${process.env.SERVER_URL}${e}`}async sendRequest(e){try{return await fetch(this.fullUrl(e.request.url),{method:e.request.method,headers:{"Content-Type":"application/json","x-is-replay":"true"},body:JSON.stringify(e.request.body)})}catch(t){throw t}}};var _=class{constructor(e){this.config=e}config;static{a(this,"BaseReplay")}get filterManager(){return new S(this.config)}get replayHelper(){return new x(this.config)}};var F=class extends _{constructor(t){super(t);this.config=t}config;static{a(this,"SmartReplay")}print(t){try{let{log:r,replay:n,responseDiff:o,traceDiff:l}=t;if(console.log(w.yellow.bold(`\u25B6 ${r.request.method} ${r.request.url}`)),!o.isDifferent&&!l.isDifferent){console.log(w.green(`[OK] Reponse & Trace match
|
|
2
|
+
`));return}if(o.isDifferent&&console.log(w.red(`[!] Response DIFF
|
|
3
|
+
`)),l.isDifferent){console.log(w.red(`[!] Trace DIFF
|
|
4
|
+
`));for(let i of l.issues)console.log(` - [${i.type}] ${i.name}`)}}catch(r){throw r}}async replay(t){try{t.request.headers["x-replay-id"]=t.meta.id;let r=await this.replayHelper.sendRequest(t),n=await r.json(),o=n.__replay;delete n.__replay;let l=this.replayHelper.compareResponse({error:t.response.error,status:t.response.status},{error:n,status:r.status}),i=R(t.trace||[]),c=R(o.trace||[]),p=this.replayHelper.compareTrace(i,c);this.print({log:t,replay:r,responseDiff:l,traceDiff:p})}catch(r){throw r}}};import d from"chalk";import V from"http";var $={trace_step_match:a((s=.1)=>({weight:s,serverity:u(s),message:`trace_match (+${s}) \u2192 trace fully matches replay`}),"trace_step_match"),trace_step_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`trace_step_not_match (+${s}) \u2192 trace partially matches replay`}),"trace_step_not_match"),trace_return_data_match:a((s=.1)=>({weight:s,serverity:u(s),message:`trace_return_data_match (+${s}) \u2192 trace return data is consistent`}),"trace_return_data_match"),trace_return_data_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`trace_return_data_not_match (+${s}) \u2192 trace return data is inconsistent`}),"trace_return_data_not_match"),response_match:a((s=.1)=>({weight:s,serverity:u(s),message:`response_match (+${s}) \u2192 response is consistent`}),"response_match"),response_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`response_not_match (+${s}) \u2192 response is inconsistent`}),"response_not_match"),response_status_match:a((s=.1)=>({weight:s,serverity:u(s),message:`response_status_match (+${s}) \u2192 response status is consistent`}),"response_status_match"),response_status_not_match:a((s=.25)=>({weight:s,serverity:u(s),message:`response_status_not_match (+${s}) \u2192 response status is inconsistent`}),"response_status_not_match"),logic_error_indicator:a((s=.6)=>({weight:s,serverity:u(s),message:`logic_error_indicator (+${s}) \u2192 original response status >= 400 triggered logic flag`}),"logic_error_indicator")},I={trace_match:{value:!0,message:"flow is clean"},trace_not_match:{value:!1,message:"flow is not clean"},trace_step_match:{value:!0,message:"no mismatch"},trace_step_not_match:{value:!1,message:"mismatch"},trace_return_data_match:{value:!0,message:"no mismatch"},trace_return_data_not_match:{value:!1,message:"mismatch"},response_match:{value:!0,message:"no mismatch"},response_not_match:{value:!1,message:"mismatch"}};function u(s){return s>.75?"high":s>.55?"medium":"low"}a(u,"getSignalLevel");var P=class{static{a(this,"ReasonSignalCls")}findSignalByType(e){try{return $[e]}catch(t){throw t}}sumSignalWeights(e){try{return Object.values(e).reduce((t,r)=>t+r.weight,0)}catch(t){throw t}}};import m from"chalk";var y=class{static{a(this,"BaseAssignerCase")}get evidenceSource(){return I}get signalSource(){return $}getTraceDivergenceSection(e){let t=e.traceDiff.issues;if(t.length===0)return"No divergence";let r=`
|
|
5
|
+
`;for(let n of t)n.type==="missing_step"&&(r+=m.yellow(`
|
|
6
|
+
* ${n.name}(missing_step):
|
|
7
|
+
`),r+=m.green(` \u2192 original: exists
|
|
8
|
+
`),r+=m.red(" \u2192 replay: missing"),r+=`
|
|
9
|
+
`),n.type==="extra_step"&&(r+=m.yellow(`
|
|
10
|
+
* ${n.name}(extra_step):
|
|
11
|
+
`),r+=m.green(` \u2192 original: none
|
|
12
|
+
`),r+=m.red(" \u2192 replay: exists"),r+=`
|
|
13
|
+
`);return r.trim()}getMessageEdvidence(e){return`${this.evidenceSource[e].value} (${this.evidenceSource[e].message})`}getStatusEdvidence(e){let t=V.STATUS_CODES[e]||"Unknown";return`${e} (${t})`}isTraceMatch(e){return!e.traceDiff.isDifferent}isTraceStepMatch(e){return e.traceDiff.issues.length>0?!e.traceDiff.issues.some(t=>t.type==="missing_step"||t.type==="extra_step"):!0}isTraceReturnDataMatch(e){return e.traceDiff.issues.length>0?!e.traceDiff.issues.some(t=>t.type==="trace_return_data_mismatch"):!0}isResponseMatch(e){return!e.responseDiff.isDifferent}isResponseStatusMatch(e){let{originalStatus:t,replayStatus:r}=this.resolveStatus(e);return t===r}resolveStatus(e){return{originalStatus:Number(e.log.response.status),replayStatus:e.replayResultStatus}}getResponseDiffSection(e){let t=e.responseDiff.issues;if(t.length===0)return"No diff";let r=t.length>1?1:0,n=e.responseDiff.issues[r].not_matched;if(!n)return"No diff";let o=n.original||{},l=n.replay||{},i=new Set([...Object.keys(o),...Object.keys(l)]),c=`
|
|
14
|
+
`;for(let p of i){let f=o[p],h=l[p];f!==h&&(c+=m.yellow(` * ${p}:
|
|
15
|
+
`),c+=m.green(` \u2192 original: ${JSON.stringify(f)}
|
|
16
|
+
`),c+=m.red(` \u2192 replay: ${JSON.stringify(h)}
|
|
17
|
+
`))}return c}};var T=class extends y{static{a(this,"BusinessLogicRejectionCase")}condition(e,t){return this.isTraceMatch(e)&&this.isResponseMatch(e)&&t.originalStatus>=400&&t.replayStatus>=400}assign(e){try{let t=this.resolveStatus(e);if(this.condition(e,t)){let r=e.log.trace?.find(o=>o.parentId===null);return{type:"Business Logic Rejection Case (logic_suspicious)",message:"Response indicates error, but execution original and replay result match expected behavior",possibleCauses:["Business rule might not align with actual execution flow","Or validation logic is too strict / misaligned"],evidence:{traceMatch:this.getMessageEdvidence("trace_match"),responseMatch:this.getMessageEdvidence("response_match"),originalStatus:this.getStatusEdvidence(t.originalStatus),finalResponse:typeof r?.returnData=="object"?JSON.stringify(r.returnData,null,2):r?.returnData},confidence:{signals:{trace_match:this.signalSource.trace_step_match(.3),response_match:this.signalSource.response_match(.3),logic_error_indicator:this.signalSource.logic_error_indicator(.2)},result:0},finalMessage:["This is NOT a runtime bug","This is likely a business logic issue"],references:e.log.stack}}}catch(t){throw t}}};var b=class extends y{static{a(this,"PostTraceResponseMutationCase")}assign(e){try{let t=this.resolveStatus(e);if(this.isTraceStepMatch(e)&&!this.isResponseMatch(e)&&this.isTraceReturnDataMatch(e))return{type:"Response Mismatch Case (post_processing_suspicious)",message:"Execution flow is identical, but response output differs",possibleCauses:["Post-processing logic may be inconsistent","Response mapping or transformation may be incorrect","Data changes may affect the final result.","Non-deterministic behavior (e.g. random, time-based, shared state)"],evidence:{traceMatch:this.getMessageEdvidence("trace_match"),responseMatch:this.getMessageEdvidence("response_not_match"),originalStatus:this.getStatusEdvidence(t.originalStatus),responseDiff:this.getResponseDiffSection(e)},confidence:{signals:{trace_step_match:this.signalSource.trace_step_match(.3),response_mismatch:this.signalSource.response_not_match(.2),trace_return_data_match:this.signalSource.trace_return_data_match(.3)},result:0},finalMessage:["Execution logic is stable, but output is inconsistent","This may indicate issues in response transformation or side effects","This may occur after the business logic is execute complete."],references:e.log.stack}}catch(t){throw t}}};var C=class extends y{static{a(this,"TraceDivergenceCase")}assign(e){try{let t=this.resolveStatus(e);if(!this.isTraceStepMatch(e)&&!this.isResponseMatch(e)&&!this.isTraceReturnDataMatch(e)&&!this.isResponseStatusMatch(e))return{type:"Trace Divergence Case (execution_path_mismatch)",message:"Execution path diverged between original and replay",possibleCauses:["Conditional branch logic may behave differently","Environment or shared state may affect execution flow","Request context may not be deterministic","Replay execution may enter different logic branches","Hidden dependencies or side effects may exist"],evidence:{traceMatch:this.getMessageEdvidence("trace_not_match"),originalStatus:this.getStatusEdvidence(t.originalStatus),traceDivergence:this.getTraceDivergenceSection(e),responseDiff:this.getResponseDiffSection(e)},confidence:{signals:{trace_step_not_match:this.signalSource.trace_step_not_match(.45),trace_return_data_not_match:this.signalSource.trace_return_data_not_match(.25),response_not_match:this.signalSource.response_not_match(.15),response_status_not_match:this.signalSource.response_status_not_match(.1)},result:0},finalMessage:["Replay execution diverged from the original execution flow","This may indicate unstable conditions or branch inconsistency","Root cause likely exists before response generation"],references:e.log.stack}}catch(t){throw t}}};var k=class{static{a(this,"ReasonAssigner")}get case(){return{business_logic_rejection:new T,post_trace_response_mutation:new b,trace_divergence:new C}}};import g from"chalk";var E=class{static{a(this,"ReasonPrinter")}get reasonSignal(){return new P}title(e){console.log(g.yellowBright("** Reason Title:")),console.log(`[!] ${e}`)}description(e){console.log(g.yellowBright("** Description:")),console.log(e)}possibleCauses(e){console.log(g.yellowBright("** What I think happened:")),e.forEach(t=>{console.log(` \u2192 ${t}`)})}evidence(e){let t=Object.keys(e);console.log(g.yellowBright("** Evidence I saw:")),t.forEach(r=>{console.log(` \u2192 ${r}: ${e[r]}`)})}confidence(e){console.log(g.yellowBright("** Confidence Reason (why I think this): ")),e.signals&&Object.keys(e.signals).forEach(n=>{console.log(` \u2192 ${e.signals[n].message}`)}),e.result=this.reasonSignal.sumSignalWeights(e.signals);let t=Math.round(e.result*100);console.log(`
|
|
18
|
+
`),console.log(g.yellowBright("** Confidence Result: ")),console.log(g.green.italic.bold(` * score: ${e.result.toFixed(2)} / 1 `)),console.log(g.green.italic.bold(` * percent: ${t} / 100 (%) `))}finalMessage(e){e.length!=0&&(console.log(g.yellowBright("** Final Call:")),e.forEach(t=>{console.log(` \u2192 ${t}`)}))}referencePosition(e){if(e&&(console.log(g.yellowBright("* Reference Position: ")),console.log(" \u2192 Suspected position:",g.red.underline(e.primary?.full_path)),e.context&&e.context.length>0)){let t=e.context.length-1;e.context.forEach((r,n)=>{console.log(` \u2192 (Context ${t-n}): ${r.full_path}`)})}}printReason(e){try{if(!e)return;console.log(g.red.italic.bold(`
|
|
19
|
+
Aeeaeae yohh BUT...`)),this.title(e.type),console.log(`
|
|
20
|
+
`),this.description(e.message),console.log(`
|
|
21
|
+
`),this.possibleCauses(e.possibleCauses),console.log(`
|
|
22
|
+
`),this.evidence(e.evidence),console.log(`
|
|
23
|
+
`),this.confidence(e.confidence),console.log(`
|
|
24
|
+
`),this.finalMessage(e.finalMessage||[]),this.referencePosition(e.references)}catch(t){throw t}}};var N=class extends _{constructor(t){super(t);this.config=t}config;static{a(this,"AdvanceReplay")}get reasonPrinter(){return new E}get reasonAssigner(){return new k}printResponseDiff(t){if(t.isDifferent){console.log(d.red("[!] Response DIFF"));for(let r of t.issues)console.log(` - [${r.type}] ${r.message}`)}else console.log(d.green("[OK] Response MATCH"))}printTraceDiff(t){if(t.isDifferent){console.log(d.red("[!] Trace DIFF"));for(let r of t.issues)console.log(` - [${r.type}] ${r.name}`)}else console.log(d.green("[OK] Trace MATCH"))}printRootCauseIssue(t){if(t.length>0){let r=["performance_issue","performance_warning","performance_regression"];if(!t.every(o=>r.includes(o.type))){console.log(d.red("\u26A0 Root Cause Analysis"));for(let o of t)console.log(` - [${o.type}] ${o.message}`)}}else console.log(d.green("[OK] No root cause issues detected"))}printPerformanceIssue(t){let r=t.filter(n=>n.type==="performance_regression");if(r.length>0){console.log(d.yellow(`
|
|
25
|
+
\u26A0 Performance Regression Detected`));for(let n of r)console.log(`- ${n.step}: ${n.message}`)}}print(t){try{let{log:r,responseDiff:n,traceDiff:o,analysis:l}=t;console.log(d.bgYellowBright.bold(` \u25B6 ${r.request.method} ${r.request.url} `)),this.printResponseDiff(n),this.printTraceDiff(o),this.printRootCauseIssue(l),this.printPerformanceIssue(l),this.printReason(t)}catch(r){throw r}}printReason(t){try{let r=this.reasonAssigner.case.business_logic_rejection.assign(t);this.reasonPrinter.printReason(r);let n=this.reasonAssigner.case.post_trace_response_mutation.assign(t);this.reasonPrinter.printReason(n);let o=this.reasonAssigner.case.trace_divergence.assign(t);this.reasonPrinter.printReason(o)}catch(r){throw r}}analyzeRootCause(t){try{let{responseDiff:r,traceDiff:n,logTrace:o,replayData:l}=t,i=[],c=this.config.filters;r.isDifferent&&n.isDifferent&&i.push({type:"flow_break",message:"Response mismatch caused by trace difference"});let p=c?.expectedPerformance;if(!p)return i;for(let f of o){let h=l?.trace?.find(H=>H.name===f.name);if(!h)continue;let v=(h.duration_ms||0)-(f.duration_ms||0),B=Math.max(f.duration_ms||1,20),A=v/B*100,K=f.name.split("."),M=f.name;K.length==2?M=K[1]:M=K[0];let D=p.steps?.[M]??0;if(D===0)continue;let q=D/2;v>D?i.push({type:"performance_regression",step:f.name,severity:"high",message:`Slow step: +${v}ms > ${D}ms (+${A.toFixed(1)}%)`}):v>q&&i.push({type:"performance_warning",step:f.name,severity:"low",message:`Slight delay: +${v}ms`})}return i}catch(r){throw r}}async getTraceResult(t,r){try{let n=R(t.trace||[]),o=R(r.trace||[]),l=await this.filterManager.filterTrace(n),i=await this.filterManager.filterTrace(o),c=this.replayHelper.compareTrace(l,i);return{logTraceFiltered:l,replayTraceFiltered:i,traceDiff:c}}catch(n){throw n}}async getResponseResult(t,r,n){try{let o=await this.filterManager.filterResponse({error:JSON.parse(t.response.error),status:t.response.status}),l=await this.filterManager.filterResponse({error:r,status:n.status});return{responseDiff:this.replayHelper.compareResponse(o,l)}}catch(o){throw o}}async replay(t){try{let r=await this.replayHelper.sendRequest(t),n=await r.json(),o=n.__replay;delete n.__replay;let l=await this.getResponseResult(t,n,r),i=await this.getTraceResult(t,o),c=this.analyzeRootCause({replayData:o,traceDiff:i.traceDiff,logTrace:i.logTraceFiltered,responseDiff:l.responseDiff});r.status<=400&&c.length==0?this.print({log:t,replayResultStatus:r.status,analysis:[],traceDiff:{isDifferent:!1,issues:[]},responseDiff:{isDifferent:!1,issues:[]}}):this.print({log:t,replayResultStatus:r.status,analysis:c,traceDiff:i.traceDiff,responseDiff:l.responseDiff})}catch(r){throw r}}};export{N as AdvanceReplay,F as SmartReplay};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";var k=Object.create;var g=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var s=(n,t)=>g(n,"name",{value:t,configurable:!0});var _=(n,t)=>{for(var e in t)g(n,e,{get:t[e],enumerable:!0})},v=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of P(t))!E.call(n,o)&&o!==e&&g(n,o,{get:()=>t[o],enumerable:!(r=K(t,o))||r.enumerable});return n};var u=(n,t,e)=>(e=n!=null?k(C(n)):{},v(t||!n||!n.__esModule?g(e,"default",{value:n,enumerable:!0}):e,n)),O=n=>v(g({},"__esModule",{value:!0}),n);var H={};_(H,{SmartReplay:()=>S});module.exports=O(H);var m=u(require("chalk"),1);var N=require("ulid"),D=require("async_hooks");var F=u(require("fs"),1),b=u(require("chalk"),1),I=u(require("path"),1),M=require("bundle-require");var X=new D.AsyncLocalStorage;var T=u(require("crypto"),1);function L(n){try{return T.default.createHash("md5").update(n).digest("hex")}catch(t){throw t}}s(L,"cryptoHash");var d="__root__";function q(n){let t=new Map;for(let e of n){let r=e.parentId||d;t.has(r)||t.set(r,[]),t.get(r).push(e)}return t}s(q,"buildTraceTree");function A(n,t,e){return`${e}->${n.name}#${t}`}s(A,"buildSignature");function R(n){try{let o=function(p,c){(e.get(p)||[]).sort((a,f)=>a.start-f.start).forEach((a,f)=>{let x=A(a,f,c),w=L(x);r.push({...a,signature:w,rawSignature:x}),o(a.id,w)})};var t=o;s(o,"walk");let e=q(n),r=[];return o(d,d),r}catch(e){throw e}}s(R,"flattenTrace");var l=class{constructor(t){this.config=t}config;static{s(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(r){throw r}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let o=r.name;return!e.ignoreSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let o=r.name;return!e.optionalSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let r=this.config.filters;for(let o of e)r.ignoreFields?.includes(o)&&delete t.error[o];return{...t,error:t.error}}catch(e){throw e}}};var Mt=require("dotenv/config.js");var y=class{constructor(t){this.config=t}config;static{s(this,"ReplayHelper")}get filterManager(){return new l(this.config)}setConfig(t){this.config=t}normalize(t){if(!t)return t;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}stableStringify(t){return JSON.stringify(this.sortKeys(t))}sortKeys(t){return Array.isArray(t)?t.map(e=>this.sortKeys(e)):t&&typeof t=="object"?Object.keys(t).sort().reduce((e,r)=>(e[r]=this.sortKeys(t[r]),e),{}):t}compareTrace(t,e){try{let r=[],o=new Map(t.map(i=>[i.signature,i])),p=new Map(e.map(i=>[i.signature,i])),c={};for(let[i,a]of o)c[a.name]={id:a.id,parentId:a.parentId,original:a.returnData,replay:null},p.has(a.signature)||this.filterManager.isOptionalStep(a.name)||r.push({type:"missing_step",name:a.name,message:`Missing step: ${i}`});for(let[i,a]of p)c[a.name].replay=a.returnData,o.has(a.signature)||i&&this.filterManager.isOptionalStep(a.name)||r.push({type:"extra_step",name:a.name,message:`Extra step: ${i}`});for(let i in c){let a=c[i].original,f=c[i].replay;a!==f&&r.push({type:"trace_return_data_mismatch",name:i,message:"Trace return data mismatch",not_matched:{original:a,replay:f}})}return{isDifferent:r.length>0,issues:r}}catch(r){throw r}}compareResponse(t,e){try{let r=[];t.status!==e.status&&r.push({type:"status_mismatch",message:"Status code mismatch",not_matched:{original:t.status,replay:e.status}});let o=this.normalize(t.error),p=this.normalize(e.error),c=this.stableStringify(o),i=this.stableStringify(p);return c!==i&&r.push({type:"body_mismatch",message:"Response mismatch",not_matched:{original:o,replay:p}}),{isDifferent:r.length>0,issues:r}}catch(r){throw r}}fullUrl(t){return`${process.env.SERVER_URL}${t}`}async sendRequest(t){try{return await fetch(this.fullUrl(t.request.url),{method:t.request.method,headers:{"Content-Type":"application/json","x-is-replay":"true"},body:JSON.stringify(t.request.body)})}catch(e){throw e}}};var h=class{constructor(t){this.config=t}config;static{s(this,"BaseReplay")}get filterManager(){return new l(this.config)}get replayHelper(){return new y(this.config)}};var S=class extends h{constructor(e){super(e);this.config=e}config;static{s(this,"SmartReplay")}print(e){try{let{log:r,replay:o,responseDiff:p,traceDiff:c}=e;if(console.log(m.default.yellow.bold(`\u25B6 ${r.request.method} ${r.request.url}`)),!p.isDifferent&&!c.isDifferent){console.log(m.default.green(`[OK] Reponse & Trace match
|
|
2
|
+
`));return}if(p.isDifferent&&console.log(m.default.red(`[!] Response DIFF
|
|
3
|
+
`)),c.isDifferent){console.log(m.default.red(`[!] Trace DIFF
|
|
4
|
+
`));for(let i of c.issues)console.log(` - [${i.type}] ${i.name}`)}}catch(r){throw r}}async replay(e){try{e.request.headers["x-replay-id"]=e.meta.id;let r=await this.replayHelper.sendRequest(e),o=await r.json(),p=o.__replay;delete o.__replay;let c=this.replayHelper.compareResponse({error:e.response.error,status:e.response.status},{error:o,status:r.status}),i=R(e.trace||[]),a=R(p.trace||[]),f=this.replayHelper.compareTrace(i,a);this.print({log:e,replay:r,responseDiff:c,traceDiff:f})}catch(r){throw r}}};0&&(module.exports={SmartReplay});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { R as ReplayKitLogData } from '../../error_handle.helper-CQsPSbuz.cjs';
|
|
2
|
+
import { ConfigSetup } from '../../setup.cjs';
|
|
3
|
+
import { BaseReplay } from '../base.cjs';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
import '../../index-MBKv_hsI.cjs';
|
|
6
|
+
import '../../enum/log_level.enum.cjs';
|
|
7
|
+
import '../../trace/filter.cjs';
|
|
8
|
+
import '../helper.cjs';
|
|
9
|
+
import '../handler.cjs';
|
|
10
|
+
|
|
11
|
+
declare class SmartReplay extends BaseReplay {
|
|
12
|
+
protected config: ConfigSetup;
|
|
13
|
+
constructor(config: ConfigSetup);
|
|
14
|
+
private print;
|
|
15
|
+
replay(log: ReplayKitLogData): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { SmartReplay };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { R as ReplayKitLogData } from '../../error_handle.helper-CQsPSbuz.js';
|
|
2
|
+
import { ConfigSetup } from '../../setup.js';
|
|
3
|
+
import { BaseReplay } from '../base.js';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
import '../../index-8u1_ya-u.js';
|
|
6
|
+
import '../../enum/log_level.enum.js';
|
|
7
|
+
import '../../trace/filter.js';
|
|
8
|
+
import '../helper.js';
|
|
9
|
+
import '../handler.js';
|
|
10
|
+
|
|
11
|
+
declare class SmartReplay extends BaseReplay {
|
|
12
|
+
protected config: ConfigSetup;
|
|
13
|
+
constructor(config: ConfigSetup);
|
|
14
|
+
private print;
|
|
15
|
+
replay(log: ReplayKitLogData): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { SmartReplay };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var w=Object.defineProperty;var a=(p,t)=>w(p,"name",{value:t,configurable:!0});import m from"chalk";import{ulid as J}from"ulid";import{AsyncLocalStorage as D}from"async_hooks";import C from"fs";import _ from"chalk";import F from"path";import{bundleRequire as I}from"bundle-require";var G=new D;import T from"crypto";function S(p){try{return T.createHash("md5").update(p).digest("hex")}catch(t){throw t}}a(S,"cryptoHash");var y="__root__";function L(p){let t=new Map;for(let e of p){let r=e.parentId||y;t.has(r)||t.set(r,[]),t.get(r).push(e)}return t}a(L,"buildTraceTree");function k(p,t,e){return`${e}->${p.name}#${t}`}a(k,"buildSignature");function h(p){try{let i=function(c,s){(e.get(c)||[]).sort((n,f)=>n.start-f.start).forEach((n,f)=>{let d=k(n,f,s),R=S(d);r.push({...n,signature:R,rawSignature:d}),i(n.id,R)})};var t=i;a(i,"walk");let e=L(p),r=[];return i(y,y),r}catch(e){throw e}}a(h,"flattenTrace");var l=class{constructor(t){this.config=t}config;static{a(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(r){throw r}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let i=r.name;return!e.ignoreSteps?.some(s=>this.matchPattern(s,i))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(r=>{let i=r.name;return!e.optionalSteps?.some(s=>this.matchPattern(s,i))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let r=this.config.filters;for(let i of e)r.ignoreFields?.includes(i)&&delete t.error[i];return{...t,error:t.error}}catch(e){throw e}}};import"dotenv/config.js";var g=class{constructor(t){this.config=t}config;static{a(this,"ReplayHelper")}get filterManager(){return new l(this.config)}setConfig(t){this.config=t}normalize(t){if(!t)return t;if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}stableStringify(t){return JSON.stringify(this.sortKeys(t))}sortKeys(t){return Array.isArray(t)?t.map(e=>this.sortKeys(e)):t&&typeof t=="object"?Object.keys(t).sort().reduce((e,r)=>(e[r]=this.sortKeys(t[r]),e),{}):t}compareTrace(t,e){try{let r=[],i=new Map(t.map(o=>[o.signature,o])),c=new Map(e.map(o=>[o.signature,o])),s={};for(let[o,n]of i)s[n.name]={id:n.id,parentId:n.parentId,original:n.returnData,replay:null},c.has(n.signature)||this.filterManager.isOptionalStep(n.name)||r.push({type:"missing_step",name:n.name,message:`Missing step: ${o}`});for(let[o,n]of c)s[n.name].replay=n.returnData,i.has(n.signature)||o&&this.filterManager.isOptionalStep(n.name)||r.push({type:"extra_step",name:n.name,message:`Extra step: ${o}`});for(let o in s){let n=s[o].original,f=s[o].replay;n!==f&&r.push({type:"trace_return_data_mismatch",name:o,message:"Trace return data mismatch",not_matched:{original:n,replay:f}})}return{isDifferent:r.length>0,issues:r}}catch(r){throw r}}compareResponse(t,e){try{let r=[];t.status!==e.status&&r.push({type:"status_mismatch",message:"Status code mismatch",not_matched:{original:t.status,replay:e.status}});let i=this.normalize(t.error),c=this.normalize(e.error),s=this.stableStringify(i),o=this.stableStringify(c);return s!==o&&r.push({type:"body_mismatch",message:"Response mismatch",not_matched:{original:i,replay:c}}),{isDifferent:r.length>0,issues:r}}catch(r){throw r}}fullUrl(t){return`${process.env.SERVER_URL}${t}`}async sendRequest(t){try{return await fetch(this.fullUrl(t.request.url),{method:t.request.method,headers:{"Content-Type":"application/json","x-is-replay":"true"},body:JSON.stringify(t.request.body)})}catch(e){throw e}}};var u=class{constructor(t){this.config=t}config;static{a(this,"BaseReplay")}get filterManager(){return new l(this.config)}get replayHelper(){return new g(this.config)}};var x=class extends u{constructor(e){super(e);this.config=e}config;static{a(this,"SmartReplay")}print(e){try{let{log:r,replay:i,responseDiff:c,traceDiff:s}=e;if(console.log(m.yellow.bold(`\u25B6 ${r.request.method} ${r.request.url}`)),!c.isDifferent&&!s.isDifferent){console.log(m.green(`[OK] Reponse & Trace match
|
|
2
|
+
`));return}if(c.isDifferent&&console.log(m.red(`[!] Response DIFF
|
|
3
|
+
`)),s.isDifferent){console.log(m.red(`[!] Trace DIFF
|
|
4
|
+
`));for(let o of s.issues)console.log(` - [${o.type}] ${o.name}`)}}catch(r){throw r}}async replay(e){try{e.request.headers["x-replay-id"]=e.meta.id;let r=await this.replayHelper.sendRequest(e),i=await r.json(),c=i.__replay;delete i.__replay;let s=this.replayHelper.compareResponse({error:e.response.error,status:e.response.status},{error:i,status:r.status}),o=h(e.trace||[]),n=h(c.trace||[]),f=this.replayHelper.compareTrace(o,n);this.print({log:e,replay:r,responseDiff:s,traceDiff:f})}catch(r){throw r}}};export{x as SmartReplay};
|
package/dist/setup.cjs
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";var S=Object.create;var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var i=(e,t)=>f(e,"name",{value:t,configurable:!0});var E=(e,t)=>{for(var o in t)f(e,o,{get:t[o],enumerable:!0})},u=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of P(t))!w.call(e,n)&&n!==o&&f(e,n,{get:()=>t[n],enumerable:!(r=y(t,n))||r.enumerable});return e};var a=(e,t,o)=>(o=e!=null?S(h(e)):{},u(t||!e||!e.__esModule?f(o,"default",{value:e,enumerable:!0}):o,e)),k=e=>u(f({},"__esModule",{value:!0}),e);var L={};E(L,{configContent:()=>R,defineConfig:()=>F,defineExpectedPerformance:()=>b,getConfig:()=>v,loadConfig:()=>C});module.exports=k(L);var g=a(require("fs"),1),m=a(require("chalk"),1),s=a(require("path"),1),l=require("bundle-require");var x="storage/logs",d={logSetup:{path:x}};function R(){return`import { defineConfig } from 'replay-kit';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
logSetup: {
|
|
5
|
+
path: '${x}',
|
|
6
|
+
}
|
|
7
|
+
});`}i(R,"configContent");var p,c,F=i(e=>e,"defineConfig"),b=i(e=>e,"defineExpectedPerformance"),v=i(async()=>{try{return p||await C(),p}catch(e){throw e}},"getConfig"),C=i(async()=>{try{let e=s.default.resolve("replay-kit.config.ts");if(!g.default.existsSync(e)){console.warn(m.default.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),p=d;return}let t=s.default.resolve("replay-kit.performance.config.ts");g.default.existsSync(t)&&(c=await(await(0,l.bundleRequire)({filepath:t})).mod.default);let r=await(await(0,l.bundleRequire)({filepath:e})).mod.default;c&&r.filters&&(r.filters.expectedPerformance=c),p=r}catch(e){throw p=d,e}},"loadConfig");0&&(module.exports={configContent,defineConfig,defineExpectedPerformance,getConfig,loadConfig});
|
package/dist/setup.d.cts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { L as LoggerSetup } from './index-MBKv_hsI.cjs';
|
|
2
|
+
import './enum/log_level.enum.cjs';
|
|
3
|
+
import './error_handle.helper-CQsPSbuz.cjs';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
|
|
6
|
+
type ExpectedPerformanceConfig = {
|
|
7
|
+
steps?: Record<string, number>;
|
|
8
|
+
endpoints?: Record<string, number>;
|
|
9
|
+
};
|
|
10
|
+
type FilterConfig = {
|
|
11
|
+
ignoreSteps?: string[];
|
|
12
|
+
ignoreFields?: string[];
|
|
13
|
+
optionalSteps?: string[];
|
|
14
|
+
sensitiveFields?: string[];
|
|
15
|
+
expectedPerformance?: ExpectedPerformanceConfig;
|
|
16
|
+
};
|
|
17
|
+
type ConfigSetup = {
|
|
18
|
+
logSetup: LoggerSetup;
|
|
19
|
+
filters?: FilterConfig;
|
|
20
|
+
};
|
|
21
|
+
declare function configContent(): string;
|
|
22
|
+
declare const defineConfig: (setup: ConfigSetup) => ConfigSetup;
|
|
23
|
+
declare const defineExpectedPerformance: (expected: ExpectedPerformanceConfig) => ExpectedPerformanceConfig;
|
|
24
|
+
declare const getConfig: () => Promise<ConfigSetup>;
|
|
25
|
+
declare const loadConfig: () => Promise<void>;
|
|
26
|
+
|
|
27
|
+
export { type ConfigSetup, type ExpectedPerformanceConfig, type FilterConfig, configContent, defineConfig, defineExpectedPerformance, getConfig, loadConfig };
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { L as LoggerSetup } from './index-8u1_ya-u.js';
|
|
2
|
+
import './enum/log_level.enum.js';
|
|
3
|
+
import './error_handle.helper-CQsPSbuz.js';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
|
|
6
|
+
type ExpectedPerformanceConfig = {
|
|
7
|
+
steps?: Record<string, number>;
|
|
8
|
+
endpoints?: Record<string, number>;
|
|
9
|
+
};
|
|
10
|
+
type FilterConfig = {
|
|
11
|
+
ignoreSteps?: string[];
|
|
12
|
+
ignoreFields?: string[];
|
|
13
|
+
optionalSteps?: string[];
|
|
14
|
+
sensitiveFields?: string[];
|
|
15
|
+
expectedPerformance?: ExpectedPerformanceConfig;
|
|
16
|
+
};
|
|
17
|
+
type ConfigSetup = {
|
|
18
|
+
logSetup: LoggerSetup;
|
|
19
|
+
filters?: FilterConfig;
|
|
20
|
+
};
|
|
21
|
+
declare function configContent(): string;
|
|
22
|
+
declare const defineConfig: (setup: ConfigSetup) => ConfigSetup;
|
|
23
|
+
declare const defineExpectedPerformance: (expected: ExpectedPerformanceConfig) => ExpectedPerformanceConfig;
|
|
24
|
+
declare const getConfig: () => Promise<ConfigSetup>;
|
|
25
|
+
declare const loadConfig: () => Promise<void>;
|
|
26
|
+
|
|
27
|
+
export { type ConfigSetup, type ExpectedPerformanceConfig, type FilterConfig, configContent, defineConfig, defineExpectedPerformance, getConfig, loadConfig };
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var s=Object.defineProperty;var t=(e,r)=>s(e,"name",{value:r,configurable:!0});import f from"fs";import l from"chalk";import p from"path";import{bundleRequire as a}from"bundle-require";var g="storage/logs",c={logSetup:{path:g}};function w(){return`import { defineConfig } from 'replay-kit';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
logSetup: {
|
|
5
|
+
path: '${g}',
|
|
6
|
+
}
|
|
7
|
+
});`}t(w,"configContent");var o,i,E=t(e=>e,"defineConfig"),k=t(e=>e,"defineExpectedPerformance"),R=t(async()=>{try{return o||await u(),o}catch(e){throw e}},"getConfig"),u=t(async()=>{try{let e=p.resolve("replay-kit.config.ts");if(!f.existsSync(e)){console.warn(l.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),o=c;return}let r=p.resolve("replay-kit.performance.config.ts");f.existsSync(r)&&(i=await(await a({filepath:r})).mod.default);let n=await(await a({filepath:e})).mod.default;i&&n.filters&&(n.filters.expectedPerformance=i),o=n}catch(e){throw o=c,e}},"loadConfig");export{w as configContent,E as defineConfig,k as defineExpectedPerformance,R as getConfig,u as loadConfig};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var S=Object.create;var s=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var o=(t,e)=>s(t,"name",{value:e,configurable:!0});var v=(t,e)=>{for(var r in e)s(t,r,{get:e[r],enumerable:!0})},u=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of x(e))!w.call(t,i)&&i!==r&&s(t,i,{get:()=>e[i],enumerable:!(n=R(e,i))||n.enumerable});return t};var c=(t,e,r)=>(r=t!=null?S(L(t)):{},u(e||!t||!t.__esModule?s(r,"default",{value:t,enumerable:!0}):r,t)),P=t=>u(s({},"__esModule",{value:!0}),t);var _={};v(_,{flattenTrace:()=>T});module.exports=P(_);var k=c(require("fs"),1),D=c(require("chalk"),1),C=c(require("path"),1),K=require("bundle-require");var m=c(require("crypto"),1);function h(t){try{return m.default.createHash("md5").update(t).digest("hex")}catch(e){throw e}}o(h,"cryptoHash");var f="__root__";function E(t){let e=new Map;for(let r of t){let n=r.parentId||f;e.has(n)||e.set(n,[]),e.get(n).push(r)}return e}o(E,"buildTraceTree");function b(t,e,r){return`${r}->${t.name}#${e}`}o(b,"buildSignature");function T(t){try{let i=function(d,y){(r.get(d)||[]).sort((a,p)=>a.start-p.start).forEach((a,p)=>{let g=b(a,p,y),l=h(g);n.push({...a,signature:l,rawSignature:g}),i(a.id,l)})};var e=i;o(i,"walk");let r=E(t),n=[];return i(f,f),n}catch(r){throw r}}o(T,"flattenTrace");0&&(module.exports={flattenTrace});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=Object.defineProperty;var t=(r,e)=>m(r,"name",{value:e,configurable:!0});import I from"fs";import A from"chalk";import J from"path";import{bundleRequire as B}from"bundle-require";import h from"crypto";function g(r){try{return h.createHash("md5").update(r).digest("hex")}catch(e){throw e}}t(g,"cryptoHash");var c="__root__";function d(r){let e=new Map;for(let o of r){let n=o.parentId||c;e.has(n)||e.set(n,[]),e.get(n).push(o)}return e}t(d,"buildTraceTree");function y(r,e,o){return`${o}->${r.name}#${e}`}t(y,"buildSignature");function pt(r){try{let a=function(l,u){(o.get(l)||[]).sort((i,s)=>i.start-s.start).forEach((i,s)=>{let p=y(i,s,u),f=g(p);n.push({...i,signature:f,rawSignature:p}),a(i.id,f)})};var e=a;t(a,"walk");let o=d(r),n=[];return a(c,c),n}catch(o){throw o}}t(pt,"flattenTrace");export{pt as flattenTrace};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var D=Object.create;var i=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var _=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var o=(e,t)=>i(e,"name",{value:t,configurable:!0});var L=(e,t)=>{for(var r in t)i(e,r,{get:t[r],enumerable:!0})},C=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of A(t))!K.call(e,a)&&a!==r&&i(e,a,{get:()=>t[a],enumerable:!(n=F(t,a))||n.enumerable});return e};var g=(e,t,r)=>(r=e!=null?D(_(e)):{},C(t||!e||!e.__esModule?i(r,"default",{value:e,enumerable:!0}):r,e)),O=e=>C(i({},"__esModule",{value:!0}),e);var q={};L(q,{addTrace:()=>S,als:()=>x,traceStep:()=>j});module.exports=O(q);var v=require("ulid"),E=require("async_hooks");var m=g(require("fs"),1),R=g(require("chalk"),1),d=g(require("path"),1),y=require("bundle-require");var $="storage/logs",P={logSetup:{path:$}};var f,u;var T=o(async()=>{try{return f||await G(),f}catch(e){throw e}},"getConfig"),G=o(async()=>{try{let e=d.default.resolve("replay-kit.config.ts");if(!m.default.existsSync(e)){console.warn(R.default.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),f=P;return}let t=d.default.resolve("replay-kit.performance.config.ts");m.default.existsSync(t)&&(u=await(await(0,y.bundleRequire)({filepath:t})).mod.default);let n=await(await(0,y.bundleRequire)({filepath:e})).mod.default;u&&n.filters&&(n.filters.expectedPerformance=u),f=n}catch(e){throw f=P,e}},"loadConfig");var p=class{static{o(this,"StackHelper")}static convertStackToReference(t){try{let r=t.split("/"),n=r[r.length-1],a=n.split(":")[0],s=parseInt(n.split(":")[1]),l=parseInt(n.split(":")[2]);return{file:a,position:[s,l],full_path:t}}catch(r){throw r}}static convertStackToGetOne(t,r){try{return t?`src/${t?.split(`
|
|
2
|
+
`)[r]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(n){throw n}}};var x=new E.AsyncLocalStorage;function S(e){try{let t=x.getStore();if(!t)return;t.trace.push(e)}catch(t){throw t}}o(S,"addTrace");async function N(e){try{let r=(await T()).filters?.sensitiveFields;if(!r)return e;for(let n in e)r.includes(n)&&(e[n]="***");return e}catch(t){throw t}}o(N,"deleteSensitiveField");async function j(e){try{let t=x.getStore(),r=e.args??[];if(!t)return await e.fn(...r);let n=Date.now(),a=(0,v.ulid)(),s=t.spanStack[t.spanStack.length-1];t.spanStack.push({id:a,name:e.name});let l=`${e.type}.${e.name}`,h=new Error("err")?.stack,I=p.convertStackToGetOne(h,2),k=p.convertStackToReference(I);k.function=e.fn.name,t.stack.context||(t.stack.context=[]),t.stack.context?.push(k);let w={id:a,traceId:t.traceId,parentId:s?.id??null,type:e.type,name:l,meta:e.meta,payload:e.args,start:n};try{let c=await e.fn(...r),b=typeof c=="object"&&c!==null?await N(c):c;return S({...w,duration_ms:Date.now()-n,returnData:b,status:"success"}),c}catch(c){throw S({...w,duration_ms:Date.now()-n,returnData:c,status:"error"}),c}finally{t.spanStack.pop()}}catch(t){throw t}}o(j,"traceStep");0&&(module.exports={addTrace,als,traceStep});
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var R=Object.defineProperty;var a=(t,e)=>R(t,"name",{value:e,configurable:!0});import{ulid as I}from"ulid";import{AsyncLocalStorage as b}from"async_hooks";import d from"fs";import T from"chalk";import y from"path";import{bundleRequire as S}from"bundle-require";var v="storage/logs",x={logSetup:{path:v}};var i,l;var h=a(async()=>{try{return i||await E(),i}catch(t){throw t}},"getConfig"),E=a(async()=>{try{let t=y.resolve("replay-kit.config.ts");if(!d.existsSync(t)){console.warn(T.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),i=x;return}let e=y.resolve("replay-kit.performance.config.ts");d.existsSync(e)&&(l=await(await S({filepath:e})).mod.default);let r=await(await S({filepath:t})).mod.default;l&&r.filters&&(r.filters.expectedPerformance=l),i=r}catch(t){throw i=x,t}},"loadConfig");var f=class{static{a(this,"StackHelper")}static convertStackToReference(e){try{let n=e.split("/"),r=n[n.length-1],c=r.split(":")[0],s=parseInt(r.split(":")[1]),p=parseInt(r.split(":")[2]);return{file:c,position:[s,p],full_path:e}}catch(n){throw n}}static convertStackToGetOne(e,n){try{return e?`src/${e?.split(`
|
|
2
|
+
`)[n]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(r){throw r}}};var w=new b;function k(t){try{let e=w.getStore();if(!e)return;e.trace.push(t)}catch(e){throw e}}a(k,"addTrace");async function D(t){try{let n=(await h()).filters?.sensitiveFields;if(!n)return t;for(let r in t)n.includes(r)&&(t[r]="***");return t}catch(e){throw e}}a(D,"deleteSensitiveField");async function H(t){try{let e=w.getStore(),n=t.args??[];if(!e)return await t.fn(...n);let r=Date.now(),c=I(),s=e.spanStack[e.spanStack.length-1];e.spanStack.push({id:c,name:t.name});let p=`${t.type}.${t.name}`,g=new Error("err")?.stack,C=f.convertStackToGetOne(g,2),u=f.convertStackToReference(C);u.function=t.fn.name,e.stack.context||(e.stack.context=[]),e.stack.context?.push(u);let m={id:c,traceId:e.traceId,parentId:s?.id??null,type:t.type,name:p,meta:t.meta,payload:t.args,start:r};try{let o=await t.fn(...n),P=typeof o=="object"&&o!==null?await D(o):o;return k({...m,duration_ms:Date.now()-r,returnData:P,status:"success"}),o}catch(o){throw k({...m,duration_ms:Date.now()-r,returnData:o,status:"error"}),o}finally{e.spanStack.pop()}}catch(e){throw e}}a(H,"traceStep");export{k as addTrace,w as als,H as traceStep};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var f=(n,t)=>o(n,"name",{value:t,configurable:!0});var p=(n,t)=>{for(var r in t)o(n,r,{get:t[r],enumerable:!0})},a=(n,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of g(t))!u.call(n,e)&&e!==r&&o(n,e,{get:()=>t[e],enumerable:!(i=h(t,e))||i.enumerable});return n};var m=n=>a(o({},"__esModule",{value:!0}),n);var y={};p(y,{ReplayFilterManager:()=>c});module.exports=m(y);var c=class{constructor(t){this.config=t}config;static{f(this,"ReplayFilterManager")}matchPattern(t,r){try{return t instanceof RegExp?t.test(r):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(r):t===r}catch(i){throw i}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(i=>{let e=i.name;return!r.ignoreSteps?.some(s=>this.matchPattern(s,e))})}catch(r){throw r}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(i=>{let e=i.name;return!r.optionalSteps?.some(s=>this.matchPattern(s,e))})}catch(r){throw r}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(r=>this.matchPattern(r,t))}catch(r){throw r}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let r=Object.keys(t.error);if(r.length===0)return t;let i=this.config.filters;for(let e of r)i.ignoreFields?.includes(e)&&delete t.error[e];return{...t,error:t.error}}catch(r){throw r}}};0&&(module.exports={ReplayFilterManager});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ConfigSetup } from '../setup.cjs';
|
|
2
|
+
import { a as ReplayKitTraceEvent } from '../error_handle.helper-CQsPSbuz.cjs';
|
|
3
|
+
import '../index-MBKv_hsI.cjs';
|
|
4
|
+
import '../enum/log_level.enum.cjs';
|
|
5
|
+
import 'async_hooks';
|
|
6
|
+
|
|
7
|
+
type FilterResponseField = {
|
|
8
|
+
error: Record<string, any>;
|
|
9
|
+
status: number | string;
|
|
10
|
+
};
|
|
11
|
+
declare class ReplayFilterManager {
|
|
12
|
+
protected config: ConfigSetup;
|
|
13
|
+
constructor(config: ConfigSetup);
|
|
14
|
+
private matchPattern;
|
|
15
|
+
filterTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
|
|
16
|
+
filterNonOptionalTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
|
|
17
|
+
isOptionalStep(name: string): boolean | undefined;
|
|
18
|
+
filterResponse(responseData: FilterResponseField): Promise<FilterResponseField>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { ReplayFilterManager };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ConfigSetup } from '../setup.js';
|
|
2
|
+
import { a as ReplayKitTraceEvent } from '../error_handle.helper-CQsPSbuz.js';
|
|
3
|
+
import '../index-8u1_ya-u.js';
|
|
4
|
+
import '../enum/log_level.enum.js';
|
|
5
|
+
import 'async_hooks';
|
|
6
|
+
|
|
7
|
+
type FilterResponseField = {
|
|
8
|
+
error: Record<string, any>;
|
|
9
|
+
status: number | string;
|
|
10
|
+
};
|
|
11
|
+
declare class ReplayFilterManager {
|
|
12
|
+
protected config: ConfigSetup;
|
|
13
|
+
constructor(config: ConfigSetup);
|
|
14
|
+
private matchPattern;
|
|
15
|
+
filterTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
|
|
16
|
+
filterNonOptionalTrace(trace: ReplayKitTraceEvent[]): Promise<ReplayKitTraceEvent[]>;
|
|
17
|
+
isOptionalStep(name: string): boolean | undefined;
|
|
18
|
+
filterResponse(responseData: FilterResponseField): Promise<FilterResponseField>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { ReplayFilterManager };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var l=Object.defineProperty;var s=(o,t)=>l(o,"name",{value:t,configurable:!0});var c=class{constructor(t){this.config=t}config;static{s(this,"ReplayFilterManager")}matchPattern(t,r){try{return t instanceof RegExp?t.test(r):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(r):t===r}catch(e){throw e}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(e=>{let i=e.name;return!r.ignoreSteps?.some(n=>this.matchPattern(n,i))})}catch(r){throw r}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let r=this.config.filters;return t.filter(e=>{let i=e.name;return!r.optionalSteps?.some(n=>this.matchPattern(n,i))})}catch(r){throw r}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(r=>this.matchPattern(r,t))}catch(r){throw r}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let r=Object.keys(t.error);if(r.length===0)return t;let e=this.config.filters;for(let i of r)e.ignoreFields?.includes(i)&&delete t.error[i];return{...t,error:t.error}}catch(r){throw r}}};export{c as ReplayFilterManager};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var _=Object.create;var g=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var a=(r,t)=>g(r,"name",{value:t,configurable:!0});var M=(r,t)=>{for(var e in t)g(r,e,{get:t[e],enumerable:!0})},P=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of N(t))!A.call(r,o)&&o!==e&&g(r,o,{get:()=>t[o],enumerable:!(n=I(t,o))||n.enumerable});return r};var y=(r,t,e)=>(e=r!=null?_($(r)):{},P(t||!r||!r.__esModule?g(e,"default",{value:r,enumerable:!0}):e,r)),J=r=>P(g({},"__esModule",{value:!0}),r);var Q={};M(Q,{ReplayFilterManager:()=>T,addTrace:()=>v,als:()=>k,flattenTrace:()=>W,traceStep:()=>B});module.exports=J(Q);var C=require("ulid"),O=require("async_hooks");var S=y(require("fs"),1),K=y(require("chalk"),1),R=y(require("path"),1),x=require("bundle-require");var j="storage/logs",E={logSetup:{path:j}};var u,d;var w=a(async()=>{try{return u||await q(),u}catch(r){throw r}},"getConfig"),q=a(async()=>{try{let r=R.default.resolve("replay-kit.config.ts");if(!S.default.existsSync(r)){console.warn(K.default.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),u=E;return}let t=R.default.resolve("replay-kit.performance.config.ts");S.default.existsSync(t)&&(d=await(await(0,x.bundleRequire)({filepath:t})).mod.default);let n=await(await(0,x.bundleRequire)({filepath:r})).mod.default;d&&n.filters&&(n.filters.expectedPerformance=d),u=n}catch(r){throw u=E,r}},"loadConfig");var m=class{static{a(this,"StackHelper")}static convertStackToReference(t){try{let e=t.split("/"),n=e[e.length-1],o=n.split(":")[0],s=parseInt(n.split(":")[1]),c=parseInt(n.split(":")[2]);return{file:o,position:[s,c],full_path:t}}catch(e){throw e}}static convertStackToGetOne(t,e){try{return t?`src/${t?.split(`
|
|
2
|
+
`)[e]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(n){throw n}}};var k=new O.AsyncLocalStorage;function v(r){try{let t=k.getStore();if(!t)return;t.trace.push(r)}catch(t){throw t}}a(v,"addTrace");async function H(r){try{let e=(await w()).filters?.sensitiveFields;if(!e)return r;for(let n in r)e.includes(n)&&(r[n]="***");return r}catch(t){throw t}}a(H,"deleteSensitiveField");async function B(r){try{let t=k.getStore(),e=r.args??[];if(!t)return await r.fn(...e);let n=Date.now(),o=(0,C.ulid)(),s=t.spanStack[t.spanStack.length-1];t.spanStack.push({id:o,name:r.name});let c=`${r.type}.${r.name}`,h=new Error("err")?.stack,p=m.convertStackToGetOne(h,2),f=m.convertStackToReference(p);f.function=r.fn.name,t.stack.context||(t.stack.context=[]),t.stack.context?.push(f);let l={id:o,traceId:t.traceId,parentId:s?.id??null,type:r.type,name:c,meta:r.meta,payload:r.args,start:n};try{let i=await r.fn(...e),F=typeof i=="object"&&i!==null?await H(i):i;return v({...l,duration_ms:Date.now()-n,returnData:F,status:"success"}),i}catch(i){throw v({...l,duration_ms:Date.now()-n,returnData:i,status:"error"}),i}finally{t.spanStack.pop()}}catch(t){throw t}}a(B,"traceStep");var b=y(require("crypto"),1);function D(r){try{return b.default.createHash("md5").update(r).digest("hex")}catch(t){throw t}}a(D,"cryptoHash");var L="__root__";function G(r){let t=new Map;for(let e of r){let n=e.parentId||L;t.has(n)||t.set(n,[]),t.get(n).push(e)}return t}a(G,"buildTraceTree");function z(r,t,e){return`${e}->${r.name}#${t}`}a(z,"buildSignature");function W(r){try{let o=function(s,c){(e.get(s)||[]).sort((p,f)=>p.start-f.start).forEach((p,f)=>{let l=z(p,f,c),i=D(l);n.push({...p,signature:i,rawSignature:l}),o(p.id,i)})};var t=o;a(o,"walk");let e=G(r),n=[];return o(L,L),n}catch(e){throw e}}a(W,"flattenTrace");var T=class{constructor(t){this.config=t}config;static{a(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(n){throw n}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let o=n.name;return!e.ignoreSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let o=n.name;return!e.optionalSteps?.some(c=>this.matchPattern(c,o))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let n=this.config.filters;for(let o of e)n.ignoreFields?.includes(o)&&delete t.error[o];return{...t,error:t.error}}catch(e){throw e}}};0&&(module.exports={ReplayFilterManager,addTrace,als,flattenTrace,traceStep});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { a as ReplayKitTraceEvent, e as TraceContext, T as TraceOptions, c as addTrace, f as als, t as traceStep } from '../error_handle.helper-CQsPSbuz.cjs';
|
|
2
|
+
export { flattenTrace } from './builder.cjs';
|
|
3
|
+
export { ReplayFilterManager } from './filter.cjs';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
import '../setup.cjs';
|
|
6
|
+
import '../index-MBKv_hsI.cjs';
|
|
7
|
+
import '../enum/log_level.enum.cjs';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { a as ReplayKitTraceEvent, e as TraceContext, T as TraceOptions, c as addTrace, f as als, t as traceStep } from '../error_handle.helper-CQsPSbuz.js';
|
|
2
|
+
export { flattenTrace } from './builder.js';
|
|
3
|
+
export { ReplayFilterManager } from './filter.js';
|
|
4
|
+
import 'async_hooks';
|
|
5
|
+
import '../setup.js';
|
|
6
|
+
import '../index-8u1_ya-u.js';
|
|
7
|
+
import '../enum/log_level.enum.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var E=Object.defineProperty;var o=(r,t)=>E(r,"name",{value:t,configurable:!0});import{ulid as b}from"ulid";import{AsyncLocalStorage as D}from"async_hooks";import S from"fs";import K from"chalk";import R from"path";import{bundleRequire as x}from"bundle-require";var C="storage/logs",w={logSetup:{path:C}};var g,y;var h=o(async()=>{try{return g||await O(),g}catch(r){throw r}},"getConfig"),O=o(async()=>{try{let r=R.resolve("replay-kit.config.ts");if(!S.existsSync(r)){console.warn(K.yellowBright('\u26A0 "replay-kit.config.ts" not found, using default config')),g=w;return}let t=R.resolve("replay-kit.performance.config.ts");S.existsSync(t)&&(y=await(await x({filepath:t})).mod.default);let n=await(await x({filepath:r})).mod.default;y&&n.filters&&(n.filters.expectedPerformance=y),g=n}catch(r){throw g=w,r}},"loadConfig");var u=class{static{o(this,"StackHelper")}static convertStackToReference(t){try{let e=t.split("/"),n=e[e.length-1],a=n.split(":")[0],s=parseInt(n.split(":")[1]),c=parseInt(n.split(":")[2]);return{file:a,position:[s,c],full_path:t}}catch(e){throw e}}static convertStackToGetOne(t,e){try{return t?`src/${t?.split(`
|
|
2
|
+
`)[e]?.replace(")","").split("src/")[1]}`:"invalid_stack"}catch(n){throw n}}};var k=new D;function v(r){try{let t=k.getStore();if(!t)return;t.trace.push(r)}catch(t){throw t}}o(v,"addTrace");async function F(r){try{let e=(await h()).filters?.sensitiveFields;if(!e)return r;for(let n in r)e.includes(n)&&(r[n]="***");return r}catch(t){throw t}}o(F,"deleteSensitiveField");async function V(r){try{let t=k.getStore(),e=r.args??[];if(!t)return await r.fn(...e);let n=Date.now(),a=b(),s=t.spanStack[t.spanStack.length-1];t.spanStack.push({id:a,name:r.name});let c=`${r.type}.${r.name}`,m=new Error("err")?.stack,p=u.convertStackToGetOne(m,2),f=u.convertStackToReference(p);f.function=r.fn.name,t.stack.context||(t.stack.context=[]),t.stack.context?.push(f);let l={id:a,traceId:t.traceId,parentId:s?.id??null,type:r.type,name:c,meta:r.meta,payload:r.args,start:n};try{let i=await r.fn(...e),P=typeof i=="object"&&i!==null?await F(i):i;return v({...l,duration_ms:Date.now()-n,returnData:P,status:"success"}),i}catch(i){throw v({...l,duration_ms:Date.now()-n,returnData:i,status:"error"}),i}finally{t.spanStack.pop()}}catch(t){throw t}}o(V,"traceStep");import _ from"crypto";function L(r){try{return _.createHash("md5").update(r).digest("hex")}catch(t){throw t}}o(L,"cryptoHash");var d="__root__";function I(r){let t=new Map;for(let e of r){let n=e.parentId||d;t.has(n)||t.set(n,[]),t.get(n).push(e)}return t}o(I,"buildTraceTree");function N(r,t,e){return`${e}->${r.name}#${t}`}o(N,"buildSignature");function Ct(r){try{let a=function(s,c){(e.get(s)||[]).sort((p,f)=>p.start-f.start).forEach((p,f)=>{let l=N(p,f,c),i=L(l);n.push({...p,signature:i,rawSignature:l}),a(p.id,i)})};var t=a;o(a,"walk");let e=I(r),n=[];return a(d,d),n}catch(e){throw e}}o(Ct,"flattenTrace");var T=class{constructor(t){this.config=t}config;static{o(this,"ReplayFilterManager")}matchPattern(t,e){try{return t instanceof RegExp?t.test(e):t.includes("*")?new RegExp("^"+t.replace(/\*/g,".*")+"$").test(e):t===e}catch(n){throw n}}async filterTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let a=n.name;return!e.ignoreSteps?.some(c=>this.matchPattern(c,a))})}catch(e){throw e}}async filterNonOptionalTrace(t){try{if(!this.config.filters||!t||t.length===0)return t;let e=this.config.filters;return t.filter(n=>{let a=n.name;return!e.optionalSteps?.some(c=>this.matchPattern(c,a))})}catch(e){throw e}}isOptionalStep(t){try{return this.config.filters?.optionalSteps?.some(e=>this.matchPattern(e,t))}catch(e){throw e}}async filterResponse(t){try{if(!this.config.filters||!t)return t;let e=Object.keys(t.error);if(e.length===0)return t;let n=this.config.filters;for(let a of e)n.ignoreFields?.includes(a)&&delete t.error[a];return{...t,error:t.error}}catch(e){throw e}}};export{T as ReplayFilterManager,v as addTrace,k as als,Ct as flattenTrace,V as traceStep};
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@replay-kit/core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"private": false,
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"description": "Replay real production requests with full context to reproduce, trace, and fix bugs instantly.",
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"module": "dist/index.mjs",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"LICENSE",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"require": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"bin": {
|
|
25
|
+
"replay-kit": "./dist/cli.js"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build:2": "rimraf dist && tsup && chmod +x dist/cli.js",
|
|
29
|
+
"build": "rimraf dist && tsup",
|
|
30
|
+
"dev": "nodemon --watch src --exec \"tsx\" src/server/index.ts",
|
|
31
|
+
"build:library": "tsc && cpx \"dist/**/*\" \"node_modules/replay-kit\"",
|
|
32
|
+
"test": "vitest",
|
|
33
|
+
"publish-patch": "npm version patch && npm publish --access public",
|
|
34
|
+
"publish-minor": "npm version minor && npm publish --access public",
|
|
35
|
+
"publish-major": "npm version major && npm publish --access public",
|
|
36
|
+
"git-commit-dirty": "git add . && git commit -m 'Update to prepare publish'"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/Poppyyddod/ReplayKit.git"
|
|
41
|
+
},
|
|
42
|
+
"keywords": [
|
|
43
|
+
"typescript",
|
|
44
|
+
"backend",
|
|
45
|
+
"request",
|
|
46
|
+
"log",
|
|
47
|
+
"replay",
|
|
48
|
+
"debug"
|
|
49
|
+
],
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@types/express": "^5.0.6",
|
|
53
|
+
"bundle-require": "^5.1.0",
|
|
54
|
+
"chalk": "^5.6.2",
|
|
55
|
+
"crypto": "^1.0.1",
|
|
56
|
+
"dotenv": "^17.2.3",
|
|
57
|
+
"express": "^5.2.1",
|
|
58
|
+
"qrcode-terminal": "^0.12.0",
|
|
59
|
+
"ulid": "^3.0.2"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/dotenv": "^6.1.1",
|
|
63
|
+
"@types/node": "^24.10.1",
|
|
64
|
+
"@types/qrcode-terminal": "^0.12.2",
|
|
65
|
+
"cpx": "^1.5.0",
|
|
66
|
+
"nodemon": "^3.1.11",
|
|
67
|
+
"rimraf": "^6.0.1",
|
|
68
|
+
"tsconfig-paths": "^4.2.0",
|
|
69
|
+
"tsup": "^8.5.1",
|
|
70
|
+
"tsx": "^4.21.0",
|
|
71
|
+
"typescript": "^5.9.3",
|
|
72
|
+
"vitest": "^4.1.2"
|
|
73
|
+
},
|
|
74
|
+
"directories": {
|
|
75
|
+
"test": "test"
|
|
76
|
+
},
|
|
77
|
+
"bugs": {
|
|
78
|
+
"url": "https://github.com/Poppyyddod/ReplayKit/issues"
|
|
79
|
+
},
|
|
80
|
+
"homepage": "https://github.com/Poppyyddod/ReplayKit"
|
|
81
|
+
}
|