flow-debugger 1.0.0

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.
Files changed (131) hide show
  1. package/PORTFOLIO_README_SECTION.md +177 -0
  2. package/README.md +251 -0
  3. package/dashboard/app.js +339 -0
  4. package/dashboard/index.html +168 -0
  5. package/dashboard/style.css +846 -0
  6. package/dist/cjs/core/Analytics.js +174 -0
  7. package/dist/cjs/core/Analytics.js.map +1 -0
  8. package/dist/cjs/core/Classifier.js +66 -0
  9. package/dist/cjs/core/Classifier.js.map +1 -0
  10. package/dist/cjs/core/HealthMonitor.js +79 -0
  11. package/dist/cjs/core/HealthMonitor.js.map +1 -0
  12. package/dist/cjs/core/RootCause.js +89 -0
  13. package/dist/cjs/core/RootCause.js.map +1 -0
  14. package/dist/cjs/core/Sampler.js +34 -0
  15. package/dist/cjs/core/Sampler.js.map +1 -0
  16. package/dist/cjs/core/Timeline.js +90 -0
  17. package/dist/cjs/core/Timeline.js.map +1 -0
  18. package/dist/cjs/core/TraceEngine.js +222 -0
  19. package/dist/cjs/core/TraceEngine.js.map +1 -0
  20. package/dist/cjs/core/types.js +21 -0
  21. package/dist/cjs/core/types.js.map +1 -0
  22. package/dist/cjs/index.js +46 -0
  23. package/dist/cjs/index.js.map +1 -0
  24. package/dist/cjs/integrations/axios.js +136 -0
  25. package/dist/cjs/integrations/axios.js.map +1 -0
  26. package/dist/cjs/integrations/fetch.js +153 -0
  27. package/dist/cjs/integrations/fetch.js.map +1 -0
  28. package/dist/cjs/integrations/mongo.js +111 -0
  29. package/dist/cjs/integrations/mongo.js.map +1 -0
  30. package/dist/cjs/integrations/mysql.js +212 -0
  31. package/dist/cjs/integrations/mysql.js.map +1 -0
  32. package/dist/cjs/integrations/postgres.js +182 -0
  33. package/dist/cjs/integrations/postgres.js.map +1 -0
  34. package/dist/cjs/integrations/redis.js +105 -0
  35. package/dist/cjs/integrations/redis.js.map +1 -0
  36. package/dist/cjs/middleware/express.js +255 -0
  37. package/dist/cjs/middleware/express.js.map +1 -0
  38. package/dist/esm/core/Analytics.js +170 -0
  39. package/dist/esm/core/Analytics.js.map +1 -0
  40. package/dist/esm/core/Classifier.js +61 -0
  41. package/dist/esm/core/Classifier.js.map +1 -0
  42. package/dist/esm/core/HealthMonitor.js +75 -0
  43. package/dist/esm/core/HealthMonitor.js.map +1 -0
  44. package/dist/esm/core/RootCause.js +86 -0
  45. package/dist/esm/core/RootCause.js.map +1 -0
  46. package/dist/esm/core/Sampler.js +30 -0
  47. package/dist/esm/core/Sampler.js.map +1 -0
  48. package/dist/esm/core/Timeline.js +86 -0
  49. package/dist/esm/core/Timeline.js.map +1 -0
  50. package/dist/esm/core/TraceEngine.js +217 -0
  51. package/dist/esm/core/TraceEngine.js.map +1 -0
  52. package/dist/esm/core/types.js +18 -0
  53. package/dist/esm/core/types.js.map +1 -0
  54. package/dist/esm/index.js +22 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/integrations/axios.js +133 -0
  57. package/dist/esm/integrations/axios.js.map +1 -0
  58. package/dist/esm/integrations/fetch.js +149 -0
  59. package/dist/esm/integrations/fetch.js.map +1 -0
  60. package/dist/esm/integrations/mongo.js +107 -0
  61. package/dist/esm/integrations/mongo.js.map +1 -0
  62. package/dist/esm/integrations/mysql.js +209 -0
  63. package/dist/esm/integrations/mysql.js.map +1 -0
  64. package/dist/esm/integrations/postgres.js +179 -0
  65. package/dist/esm/integrations/postgres.js.map +1 -0
  66. package/dist/esm/integrations/redis.js +102 -0
  67. package/dist/esm/integrations/redis.js.map +1 -0
  68. package/dist/esm/middleware/express.js +219 -0
  69. package/dist/esm/middleware/express.js.map +1 -0
  70. package/dist/types/core/Analytics.d.ts +35 -0
  71. package/dist/types/core/Analytics.d.ts.map +1 -0
  72. package/dist/types/core/Classifier.d.ts +21 -0
  73. package/dist/types/core/Classifier.d.ts.map +1 -0
  74. package/dist/types/core/HealthMonitor.d.ts +14 -0
  75. package/dist/types/core/HealthMonitor.d.ts.map +1 -0
  76. package/dist/types/core/RootCause.d.ts +12 -0
  77. package/dist/types/core/RootCause.d.ts.map +1 -0
  78. package/dist/types/core/Sampler.d.ts +13 -0
  79. package/dist/types/core/Sampler.d.ts.map +1 -0
  80. package/dist/types/core/Timeline.d.ts +22 -0
  81. package/dist/types/core/Timeline.d.ts.map +1 -0
  82. package/dist/types/core/TraceEngine.d.ts +47 -0
  83. package/dist/types/core/TraceEngine.d.ts.map +1 -0
  84. package/dist/types/core/types.d.ts +118 -0
  85. package/dist/types/core/types.d.ts.map +1 -0
  86. package/dist/types/index.d.ts +18 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/integrations/axios.d.ts +22 -0
  89. package/dist/types/integrations/axios.d.ts.map +1 -0
  90. package/dist/types/integrations/fetch.d.ts +25 -0
  91. package/dist/types/integrations/fetch.d.ts.map +1 -0
  92. package/dist/types/integrations/mongo.d.ts +26 -0
  93. package/dist/types/integrations/mongo.d.ts.map +1 -0
  94. package/dist/types/integrations/mysql.d.ts +20 -0
  95. package/dist/types/integrations/mysql.d.ts.map +1 -0
  96. package/dist/types/integrations/postgres.d.ts +20 -0
  97. package/dist/types/integrations/postgres.d.ts.map +1 -0
  98. package/dist/types/integrations/redis.d.ts +20 -0
  99. package/dist/types/integrations/redis.d.ts.map +1 -0
  100. package/dist/types/middleware/express.d.ts +39 -0
  101. package/dist/types/middleware/express.d.ts.map +1 -0
  102. package/example/server.ts +234 -0
  103. package/jest.config.js +8 -0
  104. package/package.json +110 -0
  105. package/portfolio-repo/APIRESPONSE DASH.png +0 -0
  106. package/portfolio-repo/PAYLOAD.png +0 -0
  107. package/portfolio-repo/README.md +182 -0
  108. package/src/core/Analytics.ts +209 -0
  109. package/src/core/Classifier.ts +82 -0
  110. package/src/core/HealthMonitor.ts +92 -0
  111. package/src/core/RootCause.ts +105 -0
  112. package/src/core/Sampler.ts +35 -0
  113. package/src/core/Timeline.ts +108 -0
  114. package/src/core/TraceEngine.ts +266 -0
  115. package/src/core/types.ts +170 -0
  116. package/src/index.ts +42 -0
  117. package/src/integrations/axios.ts +164 -0
  118. package/src/integrations/fetch.ts +172 -0
  119. package/src/integrations/mongo.ts +130 -0
  120. package/src/integrations/mysql.ts +239 -0
  121. package/src/integrations/postgres.ts +217 -0
  122. package/src/integrations/redis.ts +122 -0
  123. package/src/middleware/express.ts +264 -0
  124. package/tests/Analytics.test.ts +136 -0
  125. package/tests/Classifier.test.ts +57 -0
  126. package/tests/RootCause.test.ts +69 -0
  127. package/tests/TraceEngine.test.ts +110 -0
  128. package/tsconfig.cjs.json +9 -0
  129. package/tsconfig.esm.json +9 -0
  130. package/tsconfig.json +31 -0
  131. package/tsconfig.types.json +8 -0
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Trace Engine
4
+ // Manages trace lifecycle: create → add steps → end
5
+ // ─────────────────────────────────────────────────────────────
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RequestTracer = exports.TraceEngine = void 0;
8
+ const events_1 = require("events");
9
+ const types_1 = require("./types");
10
+ const Classifier_1 = require("./Classifier");
11
+ const RootCause_1 = require("./RootCause");
12
+ const Timeline_1 = require("./Timeline");
13
+ let idCounter = 0;
14
+ /** Generate a unique trace ID */
15
+ function generateTraceId() {
16
+ const ts = Date.now().toString(36);
17
+ const rand = Math.random().toString(36).substring(2, 8);
18
+ idCounter++;
19
+ return `req_${ts}_${rand}_${idCounter}`;
20
+ }
21
+ /**
22
+ * Extract file and line number from stack trace for dashboard preview.
23
+ * Example: "at Object.<anonymous> (d:\\project\\auth.service.ts:42:15)"
24
+ * Returns: { file: "auth.service.ts", line: 42 }
25
+ */
26
+ function extractErrorLocation(stackTrace) {
27
+ if (!stackTrace)
28
+ return {};
29
+ try {
30
+ // Match patterns like:
31
+ // at functionName (file.ts:42:15)
32
+ // at file.ts:42:15
33
+ const match = stackTrace.match(/\(([^)]+):(\d+):\d+\)/) || stackTrace.match(/at\s+([^:]+):(\d+):\d+/);
34
+ if (match) {
35
+ const fullPath = match[1];
36
+ const lineNum = parseInt(match[2], 10);
37
+ // Extract just the filename from full path
38
+ const fileName = fullPath.split(/[/\\]/).pop() || fullPath;
39
+ return { file: fileName, line: lineNum };
40
+ }
41
+ }
42
+ catch (_) {
43
+ // ignore parse errors
44
+ }
45
+ return {};
46
+ }
47
+ /**
48
+ * TraceEngine — manages the lifecycle of a single request trace.
49
+ *
50
+ * Usage:
51
+ * const engine = new TraceEngine(config);
52
+ * const tracer = engine.startTrace('/login', 'POST');
53
+ * await tracer.step('DB find user', async () => User.findOne(), { service: 'mongo' });
54
+ * tracer.end(200);
55
+ */
56
+ class TraceEngine extends events_1.EventEmitter {
57
+ constructor(config) {
58
+ super();
59
+ this.config = { ...types_1.DEFAULT_CONFIG, ...config };
60
+ }
61
+ /** Update config at runtime */
62
+ updateConfig(patch) {
63
+ Object.assign(this.config, patch);
64
+ }
65
+ getConfig() {
66
+ return { ...this.config };
67
+ }
68
+ /** Start a new request trace */
69
+ startTrace(endpoint, method) {
70
+ const tracer = new RequestTracer(endpoint, method, this.config, this);
71
+ this.safeEmit('trace:start', { traceId: tracer.getTraceId(), endpoint, method });
72
+ return tracer;
73
+ }
74
+ /** Safe emit — never throws */
75
+ safeEmit(event, data) {
76
+ try {
77
+ this.emit(event, data);
78
+ }
79
+ catch (_) {
80
+ // debugger never crashes the app
81
+ }
82
+ }
83
+ }
84
+ exports.TraceEngine = TraceEngine;
85
+ /**
86
+ * RequestTracer — the object attached to a single request.
87
+ * Provides `step()` for manual instrumentation and `addStep()` for auto-instrumentation.
88
+ */
89
+ class RequestTracer {
90
+ constructor(endpoint, method, config, engine) {
91
+ this.steps = [];
92
+ this.ended = false;
93
+ this.traceId = generateTraceId();
94
+ this.endpoint = endpoint;
95
+ this.method = method;
96
+ this.startTime = performance.now();
97
+ this.config = config;
98
+ this.engine = engine;
99
+ }
100
+ getTraceId() {
101
+ return this.traceId;
102
+ }
103
+ getSteps() {
104
+ return [...this.steps];
105
+ }
106
+ /** Manually run & trace an async step */
107
+ async step(name, fn, options) {
108
+ const service = options?.service ?? 'internal';
109
+ const timeout = options?.timeout ?? this.config.defaultTimeout;
110
+ const stepStart = performance.now();
111
+ let status = 'success';
112
+ let error;
113
+ let stackTrace;
114
+ let result;
115
+ try {
116
+ // Race the function against a timeout
117
+ result = await Promise.race([
118
+ Promise.resolve(fn()),
119
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Step "${name}" timed out after ${timeout}ms`)), timeout)),
120
+ ]);
121
+ }
122
+ catch (err) {
123
+ const e = err instanceof Error ? err : new Error(String(err));
124
+ if (e.message.includes('timed out')) {
125
+ status = 'timeout';
126
+ }
127
+ else {
128
+ status = 'error';
129
+ }
130
+ error = e.message;
131
+ stackTrace = e.stack;
132
+ const { file: errorFile, line: errorLine } = extractErrorLocation(stackTrace);
133
+ // Re-throw so the caller can handle the error
134
+ const stepEnd = performance.now();
135
+ const duration = stepEnd - stepStart;
136
+ const classification = (0, Classifier_1.classify)(duration, status, this.config);
137
+ this.steps.push({
138
+ name,
139
+ service,
140
+ status,
141
+ classification,
142
+ startTime: stepStart - this.startTime,
143
+ endTime: stepEnd - this.startTime,
144
+ duration,
145
+ error,
146
+ stackTrace,
147
+ errorFile,
148
+ errorLine,
149
+ metadata: options?.metadata,
150
+ });
151
+ throw err;
152
+ }
153
+ const stepEnd = performance.now();
154
+ const duration = stepEnd - stepStart;
155
+ const classification = (0, Classifier_1.classify)(duration, status, this.config);
156
+ const { file: errorFile, line: errorLine } = error ? extractErrorLocation(stackTrace) : {};
157
+ this.steps.push({
158
+ name,
159
+ service,
160
+ status,
161
+ classification,
162
+ startTime: stepStart - this.startTime,
163
+ endTime: stepEnd - this.startTime,
164
+ duration,
165
+ error,
166
+ stackTrace,
167
+ errorFile,
168
+ errorLine,
169
+ metadata: options?.metadata,
170
+ });
171
+ return result;
172
+ }
173
+ /** Add a pre-recorded step (used by auto-integrations) */
174
+ addStep(step) {
175
+ try {
176
+ this.steps.push(step);
177
+ }
178
+ catch (_) {
179
+ // never crash
180
+ }
181
+ }
182
+ /** End the trace and produce the final result */
183
+ end(statusCode) {
184
+ if (this.ended) {
185
+ return this.buildTrace(statusCode);
186
+ }
187
+ this.ended = true;
188
+ const trace = this.buildTrace(statusCode);
189
+ // Render timeline to console
190
+ if (this.config.enableTimeline) {
191
+ try {
192
+ (0, Timeline_1.renderTimeline)(trace, this.config.logger);
193
+ }
194
+ catch (_) {
195
+ // never crash
196
+ }
197
+ }
198
+ this.engine.safeEmit('trace:end', trace);
199
+ return trace;
200
+ }
201
+ buildTrace(statusCode) {
202
+ const endTime = performance.now();
203
+ const totalDuration = endTime - this.startTime;
204
+ const traceClassification = (0, Classifier_1.classifyTrace)(this.steps, totalDuration, this.config);
205
+ const rootCause = (0, RootCause_1.detectRootCause)(this.steps, statusCode, this.config);
206
+ return {
207
+ traceId: this.traceId,
208
+ endpoint: this.endpoint,
209
+ method: this.method,
210
+ statusCode,
211
+ steps: [...this.steps],
212
+ totalDuration,
213
+ classification: traceClassification,
214
+ rootCause,
215
+ startTime: 0,
216
+ endTime: totalDuration,
217
+ timestamp: new Date(),
218
+ };
219
+ }
220
+ }
221
+ exports.RequestTracer = RequestTracer;
222
+ //# sourceMappingURL=TraceEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TraceEngine.js","sourceRoot":"","sources":["../../../src/core/TraceEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Core Type Definitions
4
+ // ─────────────────────────────────────────────────────────────
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CONFIG = void 0;
7
+ exports.DEFAULT_CONFIG = {
8
+ enabled: true,
9
+ environment: process.env.NODE_ENV || 'development',
10
+ slowThreshold: 300,
11
+ slowQueryThreshold: 300,
12
+ defaultTimeout: 30000,
13
+ samplingRate: 1,
14
+ alwaysSampleErrors: true,
15
+ maxTraces: 1000,
16
+ enableTimeline: true,
17
+ enableDashboard: true,
18
+ largePayloadThreshold: 1024 * 1024, // 1MB
19
+ logger: console.log,
20
+ };
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,wCAAwC;AACxC,gEAAgE;;;AA0JnD,QAAA,cAAc,GAA6B;IACpD,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;IAClD,aAAa,EAAE,GAAG;IAClB,kBAAkB,EAAE,GAAG;IACvB,cAAc,EAAE,KAAK;IACrB,YAAY,EAAE,CAAC;IACf,kBAAkB,EAAE,IAAI;IACxB,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,IAAI;IACrB,qBAAqB,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM;IAC1C,MAAM,EAAE,OAAO,CAAC,GAAG;CACtB,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Main Entry Point
4
+ // ─────────────────────────────────────────────────────────────
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.flowDebugger = exports.axiosTracer = exports.removeFetchTracer = exports.fetchTracer = exports.redisTracer = exports.pgTracer = exports.mysqlTracer = exports.removeMongoTracer = exports.mongoTracer = exports.DEFAULT_CONFIG = exports.renderCompact = exports.renderTimeline = exports.Sampler = exports.HealthMonitor = exports.Analytics = exports.detectRootCause = exports.classifyQuery = exports.classifyTrace = exports.classify = exports.RequestTracer = exports.TraceEngine = void 0;
7
+ // Core
8
+ var TraceEngine_1 = require("./core/TraceEngine");
9
+ Object.defineProperty(exports, "TraceEngine", { enumerable: true, get: function () { return TraceEngine_1.TraceEngine; } });
10
+ Object.defineProperty(exports, "RequestTracer", { enumerable: true, get: function () { return TraceEngine_1.RequestTracer; } });
11
+ var Classifier_1 = require("./core/Classifier");
12
+ Object.defineProperty(exports, "classify", { enumerable: true, get: function () { return Classifier_1.classify; } });
13
+ Object.defineProperty(exports, "classifyTrace", { enumerable: true, get: function () { return Classifier_1.classifyTrace; } });
14
+ Object.defineProperty(exports, "classifyQuery", { enumerable: true, get: function () { return Classifier_1.classifyQuery; } });
15
+ var RootCause_1 = require("./core/RootCause");
16
+ Object.defineProperty(exports, "detectRootCause", { enumerable: true, get: function () { return RootCause_1.detectRootCause; } });
17
+ var Analytics_1 = require("./core/Analytics");
18
+ Object.defineProperty(exports, "Analytics", { enumerable: true, get: function () { return Analytics_1.Analytics; } });
19
+ var HealthMonitor_1 = require("./core/HealthMonitor");
20
+ Object.defineProperty(exports, "HealthMonitor", { enumerable: true, get: function () { return HealthMonitor_1.HealthMonitor; } });
21
+ var Sampler_1 = require("./core/Sampler");
22
+ Object.defineProperty(exports, "Sampler", { enumerable: true, get: function () { return Sampler_1.Sampler; } });
23
+ var Timeline_1 = require("./core/Timeline");
24
+ Object.defineProperty(exports, "renderTimeline", { enumerable: true, get: function () { return Timeline_1.renderTimeline; } });
25
+ Object.defineProperty(exports, "renderCompact", { enumerable: true, get: function () { return Timeline_1.renderCompact; } });
26
+ var types_1 = require("./core/types");
27
+ Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_CONFIG; } });
28
+ // Integrations
29
+ var mongo_1 = require("./integrations/mongo");
30
+ Object.defineProperty(exports, "mongoTracer", { enumerable: true, get: function () { return mongo_1.mongoTracer; } });
31
+ Object.defineProperty(exports, "removeMongoTracer", { enumerable: true, get: function () { return mongo_1.removeMongoTracer; } });
32
+ var mysql_1 = require("./integrations/mysql");
33
+ Object.defineProperty(exports, "mysqlTracer", { enumerable: true, get: function () { return mysql_1.mysqlTracer; } });
34
+ var postgres_1 = require("./integrations/postgres");
35
+ Object.defineProperty(exports, "pgTracer", { enumerable: true, get: function () { return postgres_1.pgTracer; } });
36
+ var redis_1 = require("./integrations/redis");
37
+ Object.defineProperty(exports, "redisTracer", { enumerable: true, get: function () { return redis_1.redisTracer; } });
38
+ var fetch_1 = require("./integrations/fetch");
39
+ Object.defineProperty(exports, "fetchTracer", { enumerable: true, get: function () { return fetch_1.fetchTracer; } });
40
+ Object.defineProperty(exports, "removeFetchTracer", { enumerable: true, get: function () { return fetch_1.removeFetchTracer; } });
41
+ var axios_1 = require("./integrations/axios");
42
+ Object.defineProperty(exports, "axiosTracer", { enumerable: true, get: function () { return axios_1.axiosTracer; } });
43
+ // Middleware
44
+ var express_1 = require("./middleware/express");
45
+ Object.defineProperty(exports, "flowDebugger", { enumerable: true, get: function () { return express_1.flowDebugger; } });
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,mCAAmC;AACnC,gEAAgE;;;AAEhE,OAAO;AACP,kDAAgE;AAAvD,0GAAA,WAAW,OAAA;AAAE,4GAAA,aAAa,OAAA;AACnC,gDAA2E;AAAlE,sGAAA,QAAQ,OAAA;AAAE,2GAAA,aAAa,OAAA;AAAE,2GAAA,aAAa,OAAA;AAC/C,8CAAmD;AAA1C,4GAAA,eAAe,OAAA;AACxB,8CAA6C;AAApC,sGAAA,SAAS,OAAA;AAClB,sDAAqD;AAA5C,8GAAA,aAAa,OAAA;AACtB,0CAAyC;AAAhC,kGAAA,OAAO,OAAA;AAChB,4CAAgE;AAAvD,0GAAA,cAAc,OAAA;AAAE,yGAAA,aAAa,OAAA;AAkBtC,sCAA8C;AAArC,uGAAA,cAAc,OAAA;AAEvB,eAAe;AACf,8CAAsE;AAA7D,oGAAA,WAAW,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AACvC,8CAAmD;AAA1C,oGAAA,WAAW,OAAA;AACpB,oDAAmD;AAA1C,oGAAA,QAAQ,OAAA;AACjB,8CAAmD;AAA1C,oGAAA,WAAW,OAAA;AACpB,8CAAsE;AAA7D,oGAAA,WAAW,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AACvC,8CAAmD;AAA1C,oGAAA,WAAW,OAAA;AAEpB,aAAa;AACb,gDAAoD;AAA3C,uGAAA,YAAY,OAAA"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Axios Auto-Instrument
4
+ // Uses interceptors to trace all Axios requests
5
+ // ─────────────────────────────────────────────────────────────
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.axiosTracer = axiosTracer;
8
+ const types_1 = require("../core/types");
9
+ const Classifier_1 = require("../core/Classifier");
10
+ const DEFAULT_SERVICE_MAP = {
11
+ 'stripe.com': 'stripe',
12
+ 'api.stripe.com': 'stripe',
13
+ 'razorpay.com': 'razorpay',
14
+ 'api.razorpay.com': 'razorpay',
15
+ 'sendgrid.com': 'sendgrid',
16
+ 'api.sendgrid.com': 'sendgrid',
17
+ 'twilio.com': 'twilio',
18
+ 'api.twilio.com': 'twilio',
19
+ };
20
+ /**
21
+ * Auto-instrument Axios instance to trace all HTTP requests.
22
+ *
23
+ * Usage:
24
+ * axiosTracer(axios, { getTracer: () => currentTracer })
25
+ *
26
+ * Output:
27
+ * Axios POST https://api.stripe.com/v1/charges → 234ms ✔ [stripe]
28
+ * Axios GET https://api.razorpay.com/orders → 502 error ❌ [razorpay]
29
+ */
30
+ function axiosTracer(axiosInstance, options) {
31
+ try {
32
+ if (axiosInstance.__flowDebuggerPatched)
33
+ return;
34
+ axiosInstance.__flowDebuggerPatched = true;
35
+ const config = { ...types_1.DEFAULT_CONFIG, ...options?.config };
36
+ const serviceMap = { ...DEFAULT_SERVICE_MAP, ...options?.serviceMap };
37
+ // Request interceptor — attach start time
38
+ axiosInstance.interceptors.request.use((reqConfig) => {
39
+ reqConfig.__flowDebuggerStartTime = performance.now();
40
+ return reqConfig;
41
+ }, (error) => Promise.reject(error));
42
+ // Response interceptor — record success
43
+ axiosInstance.interceptors.response.use((response) => {
44
+ const tracer = options?.getTracer?.();
45
+ if (!tracer)
46
+ return response;
47
+ const reqConfig = response.config;
48
+ const startTime = reqConfig.__flowDebuggerStartTime || performance.now();
49
+ const endTime = performance.now();
50
+ const duration = endTime - startTime;
51
+ const url = reqConfig.url || 'unknown';
52
+ const method = (reqConfig.method || 'GET').toUpperCase();
53
+ const service = getServiceFromUrl(url, serviceMap);
54
+ const stepName = `Axios ${method} ${getDomain(url)}`;
55
+ const classification = (0, Classifier_1.classifyQuery)(duration, 'success', config);
56
+ tracer.addStep({
57
+ name: stepName,
58
+ service,
59
+ status: 'success',
60
+ classification,
61
+ startTime,
62
+ endTime,
63
+ duration,
64
+ metadata: { url, method, statusCode: response.status },
65
+ });
66
+ return response;
67
+ }, (error) => {
68
+ const tracer = options?.getTracer?.();
69
+ if (!tracer)
70
+ return Promise.reject(error);
71
+ const reqConfig = error.config || {};
72
+ const startTime = reqConfig.__flowDebuggerStartTime || performance.now();
73
+ const endTime = performance.now();
74
+ const duration = endTime - startTime;
75
+ const url = reqConfig.url || 'unknown';
76
+ const method = (reqConfig.method || 'GET').toUpperCase();
77
+ const service = getServiceFromUrl(url, serviceMap);
78
+ const stepName = `Axios ${method} ${getDomain(url)}`;
79
+ let status = 'error';
80
+ let errorMsg = error.message || 'Request failed';
81
+ // Detect timeouts
82
+ if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT' || errorMsg.includes('timeout')) {
83
+ status = 'timeout';
84
+ }
85
+ // HTTP error status
86
+ if (error.response) {
87
+ errorMsg = `HTTP ${error.response.status} ${error.response.statusText || ''}`;
88
+ }
89
+ const classification = (0, Classifier_1.classifyQuery)(duration, status, config);
90
+ tracer.addStep({
91
+ name: stepName,
92
+ service,
93
+ status,
94
+ classification,
95
+ startTime,
96
+ endTime,
97
+ duration,
98
+ error: errorMsg,
99
+ stackTrace: error.stack,
100
+ metadata: { url, method, statusCode: error.response?.status },
101
+ });
102
+ return Promise.reject(error);
103
+ });
104
+ }
105
+ catch (_) {
106
+ // Production-safe: never crash
107
+ }
108
+ }
109
+ /** Extract service tag from URL */
110
+ function getServiceFromUrl(url, serviceMap) {
111
+ try {
112
+ const urlObj = new URL(url);
113
+ const hostname = urlObj.hostname;
114
+ if (serviceMap[hostname])
115
+ return serviceMap[hostname];
116
+ for (const [pattern, service] of Object.entries(serviceMap)) {
117
+ if (hostname.includes(pattern))
118
+ return service;
119
+ }
120
+ return 'axios';
121
+ }
122
+ catch {
123
+ return 'axios';
124
+ }
125
+ }
126
+ /** Extract domain from URL for display */
127
+ function getDomain(url) {
128
+ try {
129
+ const urlObj = new URL(url);
130
+ return urlObj.hostname + urlObj.pathname.substring(0, 30);
131
+ }
132
+ catch {
133
+ return url.substring(0, 50);
134
+ }
135
+ }
136
+ //# sourceMappingURL=axios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axios.js","sourceRoot":"","sources":["../../../src/integrations/axios.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────
3
+ // flow-debugger — Fetch API Auto-Instrument
4
+ // Wraps global fetch to trace all HTTP requests
5
+ // ─────────────────────────────────────────────────────────────
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.fetchTracer = fetchTracer;
8
+ exports.removeFetchTracer = removeFetchTracer;
9
+ const types_1 = require("../core/types");
10
+ const Classifier_1 = require("../core/Classifier");
11
+ const DEFAULT_SERVICE_MAP = {
12
+ 'stripe.com': 'stripe',
13
+ 'api.stripe.com': 'stripe',
14
+ 'razorpay.com': 'razorpay',
15
+ 'api.razorpay.com': 'razorpay',
16
+ 'sendgrid.com': 'sendgrid',
17
+ 'api.sendgrid.com': 'sendgrid',
18
+ 'twilio.com': 'twilio',
19
+ 'api.twilio.com': 'twilio',
20
+ };
21
+ let originalFetch;
22
+ /**
23
+ * Auto-instrument global fetch to trace all HTTP requests.
24
+ *
25
+ * Usage:
26
+ * fetchTracer({ getTracer: () => currentTracer, serviceMap: { 'myapi.com': 'external' } })
27
+ *
28
+ * Output:
29
+ * Fetch POST https://api.stripe.com/v1/charges → 234ms ✔ [stripe]
30
+ * Fetch GET https://api.razorpay.com/orders → timeout ❌ [razorpay]
31
+ */
32
+ function fetchTracer(options) {
33
+ try {
34
+ if (typeof globalThis.fetch === 'undefined')
35
+ return;
36
+ if (globalThis.fetch.__flowDebuggerPatched)
37
+ return;
38
+ const config = { ...types_1.DEFAULT_CONFIG, ...options?.config };
39
+ const serviceMap = { ...DEFAULT_SERVICE_MAP, ...options?.serviceMap };
40
+ originalFetch = globalThis.fetch;
41
+ globalThis.fetch = async function tracedFetch(input, init) {
42
+ const tracer = options?.getTracer?.();
43
+ if (!tracer) {
44
+ return originalFetch(input, init);
45
+ }
46
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
47
+ const method = init?.method || 'GET';
48
+ const service = getServiceFromUrl(url, serviceMap);
49
+ const stepName = `Fetch ${method} ${getDomain(url)}`;
50
+ const startTime = performance.now();
51
+ let status = 'success';
52
+ let error;
53
+ let stackTrace;
54
+ let response;
55
+ try {
56
+ response = await originalFetch(input, init);
57
+ // HTTP errors (4xx, 5xx) are not thrown by fetch, but we should mark them
58
+ if (!response.ok) {
59
+ status = 'error';
60
+ error = `HTTP ${response.status} ${response.statusText}`;
61
+ }
62
+ }
63
+ catch (err) {
64
+ status = 'error';
65
+ const e = err instanceof Error ? err : new Error(String(err));
66
+ error = e.message;
67
+ stackTrace = e.stack;
68
+ // Detect network errors as timeouts
69
+ if (error.includes('fetch failed') || error.includes('network') || error.includes('ECONNREFUSED')) {
70
+ status = 'timeout';
71
+ }
72
+ const endTime = performance.now();
73
+ const duration = endTime - startTime;
74
+ const classification = (0, Classifier_1.classifyQuery)(duration, status, config);
75
+ tracer.addStep({
76
+ name: stepName,
77
+ service,
78
+ status,
79
+ classification,
80
+ startTime,
81
+ endTime,
82
+ duration,
83
+ error,
84
+ stackTrace,
85
+ metadata: { url, method, service },
86
+ });
87
+ throw err;
88
+ }
89
+ const endTime = performance.now();
90
+ const duration = endTime - startTime;
91
+ const classification = (0, Classifier_1.classifyQuery)(duration, status, config);
92
+ tracer.addStep({
93
+ name: stepName,
94
+ service,
95
+ status,
96
+ classification,
97
+ startTime,
98
+ endTime,
99
+ duration,
100
+ error,
101
+ metadata: { url, method, statusCode: response.status },
102
+ });
103
+ return response;
104
+ };
105
+ globalThis.fetch.__flowDebuggerPatched = true;
106
+ }
107
+ catch (_) {
108
+ // Production-safe: never crash
109
+ }
110
+ }
111
+ /**
112
+ * Remove fetch tracer (for testing/cleanup)
113
+ */
114
+ function removeFetchTracer() {
115
+ try {
116
+ if (originalFetch) {
117
+ globalThis.fetch = originalFetch;
118
+ delete globalThis.fetch.__flowDebuggerPatched;
119
+ }
120
+ }
121
+ catch (_) { }
122
+ }
123
+ /** Extract service tag from URL */
124
+ function getServiceFromUrl(url, serviceMap) {
125
+ try {
126
+ const urlObj = new URL(url);
127
+ const hostname = urlObj.hostname;
128
+ // Check exact match
129
+ if (serviceMap[hostname])
130
+ return serviceMap[hostname];
131
+ // Check partial match
132
+ for (const [pattern, service] of Object.entries(serviceMap)) {
133
+ if (hostname.includes(pattern))
134
+ return service;
135
+ }
136
+ // Default to fetch
137
+ return 'fetch';
138
+ }
139
+ catch {
140
+ return 'fetch';
141
+ }
142
+ }
143
+ /** Extract domain from URL for display */
144
+ function getDomain(url) {
145
+ try {
146
+ const urlObj = new URL(url);
147
+ return urlObj.hostname + urlObj.pathname.substring(0, 30);
148
+ }
149
+ catch {
150
+ return url.substring(0, 50);
151
+ }
152
+ }
153
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/integrations/fetch.ts"],"names":[],"mappings":"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"}