@thymian/plugin-http-analyzer 0.1.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 (34) hide show
  1. package/dist/analytics-api-context.d.ts +31 -0
  2. package/dist/analytics-api-context.d.ts.map +1 -0
  3. package/dist/analytics-api-context.js +167 -0
  4. package/dist/analytics-api-context.js.map +1 -0
  5. package/dist/db/http-filter-to-groupby-clause.d.ts +6 -0
  6. package/dist/db/http-filter-to-groupby-clause.d.ts.map +1 -0
  7. package/dist/db/http-filter-to-groupby-clause.js +64 -0
  8. package/dist/db/http-filter-to-groupby-clause.js.map +1 -0
  9. package/dist/db/http-filter-to-where-clause.d.ts +5 -0
  10. package/dist/db/http-filter-to-where-clause.d.ts.map +1 -0
  11. package/dist/db/http-filter-to-where-clause.js +188 -0
  12. package/dist/db/http-filter-to-where-clause.js.map +1 -0
  13. package/dist/db/http-transaction-repository.d.ts +15 -0
  14. package/dist/db/http-transaction-repository.d.ts.map +1 -0
  15. package/dist/db/http-transaction-repository.js +2 -0
  16. package/dist/db/http-transaction-repository.js.map +1 -0
  17. package/dist/db/init.sql +87 -0
  18. package/dist/db/sqlite-http-transaction-repository.d.ts +32 -0
  19. package/dist/db/sqlite-http-transaction-repository.d.ts.map +1 -0
  20. package/dist/db/sqlite-http-transaction-repository.js +472 -0
  21. package/dist/db/sqlite-http-transaction-repository.js.map +1 -0
  22. package/dist/db/types.d.ts +5 -0
  23. package/dist/db/types.d.ts.map +1 -0
  24. package/dist/db/types.js +2 -0
  25. package/dist/db/types.js.map +1 -0
  26. package/dist/db/utils.d.ts +6 -0
  27. package/dist/db/utils.d.ts.map +1 -0
  28. package/dist/db/utils.js +2 -0
  29. package/dist/db/utils.js.map +1 -0
  30. package/dist/index.d.ts +51 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +105 -0
  33. package/dist/index.js.map +1 -0
  34. package/package.json +33 -0
package/dist/index.js ADDED
@@ -0,0 +1,105 @@
1
+ import { isAbsolute, join } from 'node:path';
2
+ import { runRules, ThymianFormat, } from '@thymian/core';
3
+ import { AnalyticsApiContext } from './analytics-api-context.js';
4
+ import { SqliteHttpTransactionRepository } from './db/sqlite-http-transaction-repository.js';
5
+ export { AnalyticsApiContext } from './analytics-api-context.js';
6
+ export { SqliteHttpTransactionRepository } from './db/sqlite-http-transaction-repository.js';
7
+ function createAnalyzerAdapter(logger, reportFn, format, repository) {
8
+ return {
9
+ errorName: 'AnalyzeLinterError',
10
+ mode: 'analytics',
11
+ getRuleFn: (rule) => rule.analyzeRule,
12
+ createContext: (rule, options) => new AnalyticsApiContext(repository, logger, format, reportFn, rule.meta.appliesTo, (options ?? {}).skipOrigins),
13
+ };
14
+ }
15
+ export function createHttpAnalyzerPlugin(pluginName = '@thymian/plugin-http-analyzer') {
16
+ return {
17
+ name: pluginName,
18
+ version: '0.x',
19
+ actions: {
20
+ listensOn: ['core.analyze'],
21
+ },
22
+ events: {
23
+ listensOn: ['http-analyzer.transaction'],
24
+ },
25
+ async plugin(emitter, logger, options) {
26
+ let location = ':memory:';
27
+ if (options.storage?.type === 'sqlite') {
28
+ const filePath = options.storage.path;
29
+ location = filePath
30
+ ? isAbsolute(filePath)
31
+ ? filePath
32
+ : join(options.cwd, filePath)
33
+ : join(options.cwd, '.thymian', 'db', `${Date.now().toString()}.db`);
34
+ }
35
+ const initializedRepository = new SqliteHttpTransactionRepository(location, logger.child(`${pluginName}:HttpTransactionRepository`));
36
+ await initializedRepository.init();
37
+ emitter.onAction('core.close', async (_, ctx) => {
38
+ await initializedRepository.close();
39
+ ctx.reply();
40
+ });
41
+ emitter.on('http-analyzer.transaction', (transaction) => {
42
+ initializedRepository.insertHttpTransaction(transaction);
43
+ });
44
+ emitter.onAction('core.analyze', async ({ format, rules = [], rulesConfig = {}, traffic }, ctx) => {
45
+ const thymianFormat = format
46
+ ? ThymianFormat.import(format)
47
+ : new ThymianFormat();
48
+ const repo = new SqliteHttpTransactionRepository(':memory:', logger.child(`${pluginName}:HttpTransactionRepository`));
49
+ await repo.init();
50
+ for (const trace of traffic.traces ?? []) {
51
+ repo.insertHttpTrace(trace);
52
+ }
53
+ for (const transaction of traffic.transactions ?? []) {
54
+ repo.insertHttpTransaction(transaction);
55
+ }
56
+ const reportFn = (report) => emitter.emit('core.report', report);
57
+ const { violations, statistics } = await runRules(logger, rules, thymianFormat, rulesConfig, createAnalyzerAdapter(logger, reportFn, thymianFormat, repo));
58
+ await repo.close();
59
+ ctx.reply({
60
+ source: pluginName,
61
+ status: violations.length === 0 ? 'success' : 'failed',
62
+ violations,
63
+ statistics,
64
+ });
65
+ });
66
+ emitter.onAction('http-analyzer.lint-analytics-batch', async ({ format, rules = [], rulesConfig = {} }, ctx) => {
67
+ const thymianFormat = format
68
+ ? ThymianFormat.import(format)
69
+ : new ThymianFormat();
70
+ const reports = [];
71
+ const reportFn = (report) => reports.push(report);
72
+ const { violations } = await runRules(logger, rules, thymianFormat, rulesConfig, createAnalyzerAdapter(logger, reportFn, thymianFormat, initializedRepository));
73
+ ctx.reply({
74
+ reports,
75
+ violations,
76
+ valid: violations.length === 0,
77
+ });
78
+ });
79
+ emitter.onAction('http-analyzer.lint-analytics', async ({ format, traces, transactions, rules = [], rulesConfig = {} }, ctx) => {
80
+ const repo = new SqliteHttpTransactionRepository(':memory:', logger.child(`${pluginName}:HttpTransactionRepository`));
81
+ await repo.init();
82
+ for (const trace of traces ?? []) {
83
+ repo.insertHttpTrace(trace);
84
+ }
85
+ for (const transaction of transactions ?? []) {
86
+ repo.insertHttpTransaction(transaction);
87
+ }
88
+ const thymianFormat = format
89
+ ? ThymianFormat.import(format)
90
+ : new ThymianFormat();
91
+ const reports = [];
92
+ const reportFn = (report) => reports.push(report);
93
+ const { violations } = await runRules(logger, rules, thymianFormat, rulesConfig, createAnalyzerAdapter(logger, reportFn, thymianFormat, repo));
94
+ ctx.reply({
95
+ reports,
96
+ violations,
97
+ valid: violations.length === 0,
98
+ });
99
+ });
100
+ },
101
+ };
102
+ }
103
+ export const httpAnalyzerPlugin = createHttpAnalyzerPlugin();
104
+ export default httpAnalyzerPlugin;
105
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@thymian/plugin-http-analyzer",
3
+ "version": "0.1.0",
4
+ "license": "AGPL-3.0-only",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "type": "module",
12
+ "exports": {
13
+ "./package.json": "./package.json",
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "!**/*.tsbuildinfo"
23
+ ],
24
+ "dependencies": {
25
+ "@thymian/core": "0.1.0",
26
+ "better-sqlite3": "^11.8.1",
27
+ "tslib": "^2.3.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/better-sqlite3": "^7.6.12",
31
+ "@thymian/core-testing": "0.1.0"
32
+ }
33
+ }