server-devtools 0.1.5 → 0.1.8

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 (102) hide show
  1. package/README.md +150 -6
  2. package/dist/dashboard/assets/alert-dialog-DOm6Ua9Q.js +1 -0
  3. package/dist/dashboard/assets/button-CXALLF_v.js +1 -0
  4. package/dist/dashboard/assets/index-9FEJIlQV.css +2 -0
  5. package/dist/dashboard/assets/index-B9G80X8M.js +10 -0
  6. package/dist/dashboard/assets/overview-page-CZhNooRx.js +53 -0
  7. package/dist/dashboard/assets/requests-page-DvONd75O.js +1 -0
  8. package/dist/dashboard/assets/rolldown-runtime-hePW80VL.js +1 -0
  9. package/dist/dashboard/assets/trace-details-page-Dze7uRsF.js +1 -0
  10. package/dist/dashboard/assets/with-selector-B8m4Ky1i.js +1 -0
  11. package/dist/dashboard/index.html +22 -2
  12. package/dist/src/config/index.d.ts +16 -0
  13. package/dist/src/config/index.d.ts.map +1 -1
  14. package/dist/src/config/index.js +31 -2
  15. package/dist/src/config/index.js.map +1 -1
  16. package/dist/src/core/repeated-database-queries/index.d.ts +32 -0
  17. package/dist/src/core/repeated-database-queries/index.d.ts.map +1 -0
  18. package/dist/src/core/repeated-database-queries/index.js +130 -0
  19. package/dist/src/core/repeated-database-queries/index.js.map +1 -0
  20. package/dist/src/core/repeated-database-queries/mongodb.d.ts +2 -0
  21. package/dist/src/core/repeated-database-queries/mongodb.d.ts.map +1 -0
  22. package/dist/src/core/repeated-database-queries/mongodb.js +43 -0
  23. package/dist/src/core/repeated-database-queries/mongodb.js.map +1 -0
  24. package/dist/src/core/repeated-database-queries/mysql.d.ts +2 -0
  25. package/dist/src/core/repeated-database-queries/mysql.d.ts.map +1 -0
  26. package/dist/src/core/repeated-database-queries/mysql.js +16 -0
  27. package/dist/src/core/repeated-database-queries/mysql.js.map +1 -0
  28. package/dist/src/core/repeated-database-queries/postgres.d.ts +2 -0
  29. package/dist/src/core/repeated-database-queries/postgres.d.ts.map +1 -0
  30. package/dist/src/core/repeated-database-queries/postgres.js +15 -0
  31. package/dist/src/core/repeated-database-queries/postgres.js.map +1 -0
  32. package/dist/src/core/repeated-database-queries/redis.d.ts +8 -0
  33. package/dist/src/core/repeated-database-queries/redis.d.ts.map +1 -0
  34. package/dist/src/core/repeated-database-queries/redis.js +91 -0
  35. package/dist/src/core/repeated-database-queries/redis.js.map +1 -0
  36. package/dist/src/core/repeated-database-queries/sql-template.d.ts +2 -0
  37. package/dist/src/core/repeated-database-queries/sql-template.d.ts.map +1 -0
  38. package/dist/src/core/repeated-database-queries/sql-template.js +12 -0
  39. package/dist/src/core/repeated-database-queries/sql-template.js.map +1 -0
  40. package/dist/src/core/slow-span.d.ts +5 -0
  41. package/dist/src/core/slow-span.d.ts.map +1 -0
  42. package/dist/src/core/slow-span.js +37 -0
  43. package/dist/src/core/slow-span.js.map +1 -0
  44. package/dist/src/dashboard/dashboard-server.d.ts +12 -1
  45. package/dist/src/dashboard/dashboard-server.d.ts.map +1 -1
  46. package/dist/src/dashboard/dashboard-server.js +344 -27
  47. package/dist/src/dashboard/dashboard-server.js.map +1 -1
  48. package/dist/src/index.d.ts +2 -1
  49. package/dist/src/index.d.ts.map +1 -1
  50. package/dist/src/index.js +35 -5
  51. package/dist/src/index.js.map +1 -1
  52. package/dist/src/instrumentation/exporter.d.ts +2 -1
  53. package/dist/src/instrumentation/exporter.d.ts.map +1 -1
  54. package/dist/src/instrumentation/exporter.js +3 -2
  55. package/dist/src/instrumentation/exporter.js.map +1 -1
  56. package/dist/src/instrumentation/instrumentation.d.ts +2 -1
  57. package/dist/src/instrumentation/instrumentation.d.ts.map +1 -1
  58. package/dist/src/instrumentation/instrumentation.js +4 -3
  59. package/dist/src/instrumentation/instrumentation.js.map +1 -1
  60. package/dist/src/instrumentation/outbound-http/outbound-http-capture.d.ts +8 -1
  61. package/dist/src/instrumentation/outbound-http/outbound-http-capture.d.ts.map +1 -1
  62. package/dist/src/instrumentation/outbound-http/outbound-http-capture.js +158 -32
  63. package/dist/src/instrumentation/outbound-http/outbound-http-capture.js.map +1 -1
  64. package/dist/src/instrumentation/span-mapper.d.ts +4 -0
  65. package/dist/src/instrumentation/span-mapper.d.ts.map +1 -1
  66. package/dist/src/instrumentation/span-mapper.js +25 -3
  67. package/dist/src/instrumentation/span-mapper.js.map +1 -1
  68. package/dist/src/security/auth.service.d.ts +6 -0
  69. package/dist/src/security/auth.service.d.ts.map +1 -1
  70. package/dist/src/security/auth.service.js +62 -4
  71. package/dist/src/security/auth.service.js.map +1 -1
  72. package/dist/src/security/redaction.service.d.ts +8 -0
  73. package/dist/src/security/redaction.service.d.ts.map +1 -0
  74. package/dist/src/security/redaction.service.js +35 -0
  75. package/dist/src/security/redaction.service.js.map +1 -0
  76. package/dist/src/storage/sqlite-storage.d.ts +11 -2
  77. package/dist/src/storage/sqlite-storage.d.ts.map +1 -1
  78. package/dist/src/storage/sqlite-storage.js +194 -13
  79. package/dist/src/storage/sqlite-storage.js.map +1 -1
  80. package/dist/src/types/dashboard.d.ts +25 -0
  81. package/dist/src/types/dashboard.d.ts.map +1 -1
  82. package/dist/src/types/index.d.ts +1 -0
  83. package/dist/src/types/index.d.ts.map +1 -1
  84. package/dist/src/types/index.js +1 -0
  85. package/dist/src/types/index.js.map +1 -1
  86. package/dist/src/types/misc.d.ts +5 -0
  87. package/dist/src/types/misc.d.ts.map +1 -1
  88. package/dist/src/types/outbound-http.d.ts +9 -0
  89. package/dist/src/types/outbound-http.d.ts.map +1 -0
  90. package/dist/src/types/outbound-http.js +3 -0
  91. package/dist/src/types/outbound-http.js.map +1 -0
  92. package/dist/src/utils/allowed-ips.d.ts +4 -0
  93. package/dist/src/utils/allowed-ips.d.ts.map +1 -0
  94. package/dist/src/utils/allowed-ips.js +34 -0
  95. package/dist/src/utils/allowed-ips.js.map +1 -0
  96. package/dist/src/utils/helpers.d.ts +2 -0
  97. package/dist/src/utils/helpers.d.ts.map +1 -0
  98. package/dist/src/utils/helpers.js +13 -0
  99. package/dist/src/utils/helpers.js.map +1 -0
  100. package/package.json +3 -2
  101. package/dist/dashboard/assets/index-BXbomG5W.js +0 -9
  102. package/dist/dashboard/assets/index-DYvJ5RTl.css +0 -2
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mysqlDatabaseGroupKey = mysqlDatabaseGroupKey;
4
+ const sql_template_1 = require("./sql-template");
5
+ function mysqlDatabaseGroupKey(attributes) {
6
+ const system = attributes["db.system.name"];
7
+ if (system !== "mysql" && system !== "mysql2") {
8
+ return undefined;
9
+ }
10
+ const query = attributes["db.query.text"];
11
+ if (typeof query !== "string" || query.trim() === "") {
12
+ return undefined;
13
+ }
14
+ return `mysql:${(0, sql_template_1.normalizeSqlTemplate)(query)}`;
15
+ }
16
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/mysql.ts"],"names":[],"mappings":";;;AAAA,iDAAsD;AAEtD,+BACI,UAAmC;IAEnC,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,SAAS,IAAA,mCAAoB,EAAC,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function postgresDatabaseGroupKey(attributes: Record<string, unknown>): string | undefined;
2
+ //# sourceMappingURL=postgres.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/postgres.ts"],"names":[],"mappings":"AAEA,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,GAAG,SAAS,CAWpB"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.postgresDatabaseGroupKey = postgresDatabaseGroupKey;
4
+ const sql_template_1 = require("./sql-template");
5
+ function postgresDatabaseGroupKey(attributes) {
6
+ if (attributes["db.system.name"] !== "postgresql") {
7
+ return undefined;
8
+ }
9
+ const query = attributes["db.query.text"];
10
+ if (typeof query !== "string" || query.trim() === "") {
11
+ return undefined;
12
+ }
13
+ return `postgresql:${(0, sql_template_1.normalizeSqlTemplate)(query)}`;
14
+ }
15
+ //# sourceMappingURL=postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/postgres.ts"],"names":[],"mappings":";;;AAAA,iDAAsD;AAEtD,kCACI,UAAmC;IAEnC,IAAI,UAAU,CAAC,gBAAgB,CAAC,KAAK,YAAY,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,cAAc,IAAA,mCAAoB,EAAC,KAAK,CAAC,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function parseRedisCommandText(queryText: string): {
2
+ command: string;
3
+ args: string[];
4
+ } | undefined;
5
+ export declare function normalizeRedisCommandPattern(command: string, args: string[]): string;
6
+ export declare function redisDatabaseGroupKey(attributes: Record<string, unknown>): string | undefined;
7
+ export declare function formatRedisCommandPattern(groupKey: string): string;
8
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/redis.ts"],"names":[],"mappings":"AAwDA,wBAAgB,qBAAqB,CACjC,SAAS,EAAE,MAAM,GAClB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAgBjD;AAED,wBAAgB,4BAA4B,CACxC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GACf,MAAM,CAMR;AAED,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,GAAG,SAAS,CAoBpB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRedisCommandText = parseRedisCommandText;
4
+ exports.normalizeRedisCommandPattern = normalizeRedisCommandPattern;
5
+ exports.redisDatabaseGroupKey = redisDatabaseGroupKey;
6
+ exports.formatRedisCommandPattern = formatRedisCommandPattern;
7
+ const REDIS_COMMANDS_MASKING_ALL_ARGS = new Set([
8
+ "SET",
9
+ "SETEX",
10
+ "SETNX",
11
+ "PSETEX",
12
+ "GETSET",
13
+ "MSET",
14
+ "LPUSH",
15
+ "RPUSH",
16
+ ]);
17
+ const REDIS_COMMANDS_WITH_FIELD_ARG = new Set([
18
+ "HGET",
19
+ "HDEL",
20
+ "HEXISTS",
21
+ "HSET",
22
+ ]);
23
+ function normalizeRedisArgument(command, argIndex, arg) {
24
+ const cmd = command.toUpperCase();
25
+ if (REDIS_COMMANDS_MASKING_ALL_ARGS.has(cmd)) {
26
+ return "?";
27
+ }
28
+ if (cmd === "HSET") {
29
+ if (argIndex === 0) {
30
+ return "?";
31
+ }
32
+ if (argIndex === 1) {
33
+ return arg.toLowerCase();
34
+ }
35
+ return "?";
36
+ }
37
+ if (REDIS_COMMANDS_WITH_FIELD_ARG.has(cmd)) {
38
+ if (argIndex === 0) {
39
+ return "?";
40
+ }
41
+ if (argIndex === 1) {
42
+ return arg.toLowerCase();
43
+ }
44
+ return "?";
45
+ }
46
+ if (argIndex === 0) {
47
+ return "?";
48
+ }
49
+ return "?";
50
+ }
51
+ function parseRedisCommandText(queryText) {
52
+ const trimmed = queryText.trim();
53
+ if (trimmed === "") {
54
+ return undefined;
55
+ }
56
+ const parts = trimmed.split(/\s+/);
57
+ const command = parts[0]?.toUpperCase();
58
+ if (!command) {
59
+ return undefined;
60
+ }
61
+ return {
62
+ command,
63
+ args: parts.slice(1),
64
+ };
65
+ }
66
+ function normalizeRedisCommandPattern(command, args) {
67
+ const normalizedArgs = args.map((arg, index) => normalizeRedisArgument(command, index, arg));
68
+ return [command.toUpperCase(), ...normalizedArgs].join(" ").trim();
69
+ }
70
+ function redisDatabaseGroupKey(attributes) {
71
+ if (attributes["db.system.name"] !== "redis") {
72
+ return undefined;
73
+ }
74
+ const queryText = attributes["db.query.text"];
75
+ if (typeof queryText === "string" && queryText.trim() !== "") {
76
+ const parsed = parseRedisCommandText(queryText);
77
+ if (parsed) {
78
+ const pattern = normalizeRedisCommandPattern(parsed.command, parsed.args);
79
+ return `redis:${pattern}`;
80
+ }
81
+ }
82
+ const operation = attributes["db.operation.name"];
83
+ if (typeof operation === "string" && operation.trim() !== "") {
84
+ return `redis:${operation.trim().toUpperCase()}`;
85
+ }
86
+ return undefined;
87
+ }
88
+ function formatRedisCommandPattern(groupKey) {
89
+ return groupKey.startsWith("redis:") ? groupKey.slice("redis:".length) : groupKey;
90
+ }
91
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/redis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function normalizeSqlTemplate(query: string): string;
2
+ //# sourceMappingURL=sql-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-template.d.ts","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/sql-template.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeSqlTemplate = normalizeSqlTemplate;
4
+ function normalizeSqlTemplate(query) {
5
+ let normalized = query.trim().replace(/\s+/g, " ");
6
+ normalized = normalized.replace(/\$\d+/g, "?");
7
+ normalized = normalized.replace(/'(?:''|[^'])*'/g, "?");
8
+ normalized = normalized.replace(/=\s*-?\d+(?:\.\d+)?/g, "= ?");
9
+ normalized = normalized.replace(/,\s*-?\d+(?:\.\d+)?(?=\s*[),])/g, ", ?");
10
+ return normalized.toLowerCase();
11
+ }
12
+ //# sourceMappingURL=sql-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-template.js","sourceRoot":"","sources":["../../../../src/core/repeated-database-queries/sql-template.ts"],"names":[],"mappings":";;;AAAA,8BAAqC,KAAa;IAC9C,IAAI,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/C,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACxD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAC/D,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;IAC1E,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const DEFAULT_SLOW_SPAN_THRESHOLD_MS: number;
2
+ export declare function parseSlowSpanThresholdMs(value: unknown, fallback?: number): number;
3
+ export declare function resolveSlowSpanThresholdMs(option?: number): number;
4
+ export declare function isSlowSpan(durationMs: unknown, thresholdMs?: number): boolean;
5
+ //# sourceMappingURL=slow-span.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slow-span.d.ts","sourceRoot":"","sources":["../../../src/core/slow-span.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,8BAA8B,QAAwC,CAAC;AAEpF,wBAAgB,wBAAwB,CACpC,KAAK,EAAE,OAAO,EACd,QAAQ,SAAiC,GAC1C,MAAM,CAaR;AAED,wBAAgB,0BAA0B,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlE;AAED,wBAAgB,UAAU,CACtB,UAAU,EAAE,OAAO,EACnB,WAAW,SAAiC,GAC7C,OAAO,CAOT"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_SLOW_SPAN_THRESHOLD_MS = void 0;
7
+ exports.parseSlowSpanThresholdMs = parseSlowSpanThresholdMs;
8
+ exports.resolveSlowSpanThresholdMs = resolveSlowSpanThresholdMs;
9
+ exports.isSlowSpan = isSlowSpan;
10
+ const config_1 = __importDefault(require("../config"));
11
+ exports.DEFAULT_SLOW_SPAN_THRESHOLD_MS = config_1.default.DEFAULT_SLOW_SPAN_THRESHOLD_MS;
12
+ function parseSlowSpanThresholdMs(value, fallback = exports.DEFAULT_SLOW_SPAN_THRESHOLD_MS) {
13
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
14
+ return value;
15
+ }
16
+ if (typeof value === "string" && value.trim() !== "") {
17
+ const parsed = Number(value);
18
+ if (Number.isFinite(parsed) && parsed >= 0) {
19
+ return parsed;
20
+ }
21
+ }
22
+ return fallback;
23
+ }
24
+ function resolveSlowSpanThresholdMs(option) {
25
+ if (option !== undefined) {
26
+ return parseSlowSpanThresholdMs(option);
27
+ }
28
+ return parseSlowSpanThresholdMs(process.env.SERVER_DEVTOOLS_SLOW_SPAN_THRESHOLD_MS);
29
+ }
30
+ function isSlowSpan(durationMs, thresholdMs = exports.DEFAULT_SLOW_SPAN_THRESHOLD_MS) {
31
+ if (typeof durationMs !== "number" || !Number.isFinite(durationMs) || durationMs < 0) {
32
+ return false;
33
+ }
34
+ const threshold = parseSlowSpanThresholdMs(thresholdMs);
35
+ return durationMs >= threshold;
36
+ }
37
+ //# sourceMappingURL=slow-span.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slow-span.js","sourceRoot":"","sources":["../../../src/core/slow-span.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uDAA+B;AAElB,QAAA,8BAA8B,GAAG,gBAAM,CAAC,8BAA8B,CAAC;AAEpF,kCACI,KAAc,EACd,QAAQ,GAAG,QAAA,8BAA8B;IAEzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAClB,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,oCAA2C,MAAe;IACtD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,wBAAwB,CAC3B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CACrD,CAAC;AACN,CAAC;AAED,oBACI,UAAmB,EACnB,WAAW,GAAG,QAAA,8BAA8B;IAE5C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnF,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IACxD,OAAO,UAAU,IAAI,SAAS,CAAC;AACnC,CAAC"}
@@ -4,15 +4,26 @@ import AuthService from "../security/auth.service";
4
4
  export default class DashboardServer {
5
5
  private readonly storage;
6
6
  private readonly authService;
7
+ private readonly slowSpanThresholdMs;
8
+ private readonly allowedIPs?;
7
9
  private readonly executionTreeBuilder;
8
10
  private readonly requestDetailMapper;
9
11
  private readonly responseDetailMapper;
10
12
  private readonly errorMapper;
11
- constructor(storage: SQLiteStorage, authService: AuthService);
13
+ private readonly loginRateLimiter;
14
+ private readonly trackedLoginRateLimitKeys;
15
+ private maxTrackedLoginRateLimitKeys;
16
+ private loginBodyReadTimeoutMs;
17
+ constructor(storage: SQLiteStorage, authService: AuthService, slowSpanThresholdMs?: number, allowedIPs?: Set<string> | undefined);
18
+ private sendIpForbidden;
12
19
  private readJsonBody;
13
20
  private getCookie;
14
21
  private authenticateRequest;
15
22
  private sendUnauthorized;
23
+ private reclaimExpiredLoginRateLimitKeys;
24
+ private getLoginRateLimitCapacityRetryAfterMs;
25
+ private trackLoginRateLimitKey;
26
+ private sendLoginRateLimitResponse;
16
27
  private handleLogin;
17
28
  private handleLogout;
18
29
  private handleProfile;
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-server.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAK5D,OAAO,aAAa,MAAM,2BAA2B,CAAC;AAItD,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAkBnD,MAAM,CAAC,OAAO,OAAO,eAAe;IAS5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAThC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IACnE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAC1E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsC;IAC3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAIzD,YACqB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,EAE5C;IAED,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,gBAAgB;YAWV,WAAW;IA0DzB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,aAAa;IAmCrB,MAAM,CAAC,GAAG,EAAE,eAAe,EACvB,GAAG,EAAE,cAAc,wBAomBtB;CAGJ"}
1
+ {"version":3,"file":"dashboard-server.d.ts","sourceRoot":"","sources":["../../../src/dashboard/dashboard-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAK5D,OAAO,aAGN,MAAM,2BAA2B,CAAC;AAInC,OAAO,WAAW,MAAM,0BAA0B,CAAC;AA2CnD,MAAM,CAAC,OAAO,OAAO,eAAe;IAkB5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IApBhC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IACnE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;IAC1E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsC;IAC3E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAK9B;IACH,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAA6B;IACvE,OAAO,CAAC,4BAA4B,CAAsD;IAC1F,OAAO,CAAC,sBAAsB,CAA+C;IAI7E,YACqB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,EACxB,mBAAmB,SAAwC,EAC3D,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,YAAA,EAE5C;IAED,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,YAAY;IA8FpB,OAAO,CAAC,SAAS;IAyBjB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,gCAAgC;IAQxC,OAAO,CAAC,qCAAqC;IAc7C,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,0BAA0B;YAgBpB,WAAW;IA+KzB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,aAAa;IAmCrB,MAAM,CAAC,GAAG,EAAE,eAAe,EACvB,GAAG,EAAE,cAAc,wBAgtBtB;CAGJ"}