@observeone/cli 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.
- package/README.md +214 -0
- package/dist/README.md +214 -0
- package/dist/commands/ai-check.d.ts +9 -0
- package/dist/commands/ai-check.d.ts.map +1 -0
- package/dist/commands/ai-check.js +492 -0
- package/dist/commands/ai-check.js.map +1 -0
- package/dist/commands/apply.d.ts +6 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +290 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/check.d.ts +9 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +267 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +95 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/heartbeat.d.ts +9 -0
- package/dist/commands/heartbeat.d.ts.map +1 -0
- package/dist/commands/heartbeat.js +264 -0
- package/dist/commands/heartbeat.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +42 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +9 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +192 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/monitor.d.ts +9 -0
- package/dist/commands/monitor.d.ts.map +1 -0
- package/dist/commands/monitor.js +292 -0
- package/dist/commands/monitor.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/api-client.interface.d.ts +76 -0
- package/dist/interfaces/api-client.interface.d.ts.map +1 -0
- package/dist/interfaces/api-client.interface.js +2 -0
- package/dist/interfaces/api-client.interface.js.map +1 -0
- package/dist/interfaces/config.interface.d.ts +26 -0
- package/dist/interfaces/config.interface.d.ts.map +1 -0
- package/dist/interfaces/config.interface.js +2 -0
- package/dist/interfaces/config.interface.js.map +1 -0
- package/dist/interfaces/output.interface.d.ts +22 -0
- package/dist/interfaces/output.interface.d.ts.map +1 -0
- package/dist/interfaces/output.interface.js +2 -0
- package/dist/interfaces/output.interface.js.map +1 -0
- package/dist/interfaces/sse-client.interface.d.ts +18 -0
- package/dist/interfaces/sse-client.interface.d.ts.map +1 -0
- package/dist/interfaces/sse-client.interface.js +6 -0
- package/dist/interfaces/sse-client.interface.js.map +1 -0
- package/dist/package.json +42 -0
- package/dist/services/api-client.service.d.ts +82 -0
- package/dist/services/api-client.service.d.ts.map +1 -0
- package/dist/services/api-client.service.js +262 -0
- package/dist/services/api-client.service.js.map +1 -0
- package/dist/services/config.service.d.ts +32 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +104 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/output.service.d.ts +28 -0
- package/dist/services/output.service.d.ts.map +1 -0
- package/dist/services/output.service.js +258 -0
- package/dist/services/output.service.js.map +1 -0
- package/dist/services/sse-client.service.d.ts +16 -0
- package/dist/services/sse-client.service.d.ts.map +1 -0
- package/dist/services/sse-client.service.js +80 -0
- package/dist/services/sse-client.service.js.map +1 -0
- package/dist/types/index.d.ts +106 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/live-progress.d.ts +23 -0
- package/dist/utils/live-progress.d.ts.map +1 -0
- package/dist/utils/live-progress.js +116 -0
- package/dist/utils/live-progress.js.map +1 -0
- package/dist/utils/log-writer.d.ts +13 -0
- package/dist/utils/log-writer.d.ts.map +1 -0
- package/dist/utils/log-writer.js +97 -0
- package/dist/utils/log-writer.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import Conf from 'conf';
|
|
2
|
+
import { IConfigService } from '../interfaces/config.interface.js';
|
|
3
|
+
import { ObserveOneConfig } from '../types/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Configuration service implementation
|
|
6
|
+
* Manages CLI configuration using Conf library
|
|
7
|
+
*/
|
|
8
|
+
export declare class ConfigService implements IConfigService {
|
|
9
|
+
private config;
|
|
10
|
+
private commandLineApiUrl?;
|
|
11
|
+
constructor(config?: Conf<ObserveOneConfig>);
|
|
12
|
+
getApiUrl(): string;
|
|
13
|
+
setCommandLineApiUrl(url: string): void;
|
|
14
|
+
isDevelopment(): boolean;
|
|
15
|
+
getApiKey(): string | undefined;
|
|
16
|
+
setApiUrl(url: string): void;
|
|
17
|
+
setApiKey(key: string): void;
|
|
18
|
+
clearApiKey(): void;
|
|
19
|
+
getProjectConfig(): any;
|
|
20
|
+
setProjectConfig(projectConfig: any): void;
|
|
21
|
+
getDefaultOptions(): {
|
|
22
|
+
timeout: number;
|
|
23
|
+
retries: number;
|
|
24
|
+
verbose: boolean;
|
|
25
|
+
pollIntervalMs: number;
|
|
26
|
+
maxAttempts: number;
|
|
27
|
+
};
|
|
28
|
+
setDefaultOptions(options: any): void;
|
|
29
|
+
reset(): void;
|
|
30
|
+
getConfigPath(): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=config.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoBrD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,iBAAiB,CAAC,CAAS;gBAEvB,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC;IAmB3C,SAAS,IAAI,MAAM;IAgBnB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOvC,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5B,WAAW,IAAI,IAAI;IAInB,gBAAgB,IAAI,GAAG;IAIvB,gBAAgB,CAAC,aAAa,EAAE,GAAG,GAAG,IAAI;IAI1C,iBAAiB,IAAI;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB;IAYD,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAIrC,KAAK,IAAI,IAAI;IAIb,aAAa,IAAI,MAAM;CAGxB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import Conf from 'conf';
|
|
2
|
+
// Detect environment dynamically
|
|
3
|
+
const isDevelopment = () => {
|
|
4
|
+
const isDev = process.env.NODE_ENV === 'development' ||
|
|
5
|
+
process.env.OBS_ENV === 'development' ||
|
|
6
|
+
process.env.OBS_DEV === 'true' ||
|
|
7
|
+
process.env.OBS_DEV === '1' ||
|
|
8
|
+
process.env.NODE_ENV === 'dev';
|
|
9
|
+
return isDev;
|
|
10
|
+
};
|
|
11
|
+
const getDefaultApiUrl = () => {
|
|
12
|
+
if (isDevelopment()) {
|
|
13
|
+
return 'http://localhost:8080/api';
|
|
14
|
+
}
|
|
15
|
+
return 'https://api.observeone.com/api';
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Configuration service implementation
|
|
19
|
+
* Manages CLI configuration using Conf library
|
|
20
|
+
*/
|
|
21
|
+
export class ConfigService {
|
|
22
|
+
config;
|
|
23
|
+
commandLineApiUrl;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
// Allow injecting config for testing
|
|
26
|
+
this.config =
|
|
27
|
+
config ||
|
|
28
|
+
new Conf({
|
|
29
|
+
projectName: 'obs',
|
|
30
|
+
defaults: {
|
|
31
|
+
apiUrl: process.env.OBS_API_URL || getDefaultApiUrl(),
|
|
32
|
+
defaultOptions: {
|
|
33
|
+
timeout: 600000, // 10 minutes
|
|
34
|
+
retries: 3,
|
|
35
|
+
verbose: false,
|
|
36
|
+
pollIntervalMs: 2000,
|
|
37
|
+
maxAttempts: 300,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
getApiUrl() {
|
|
43
|
+
// Priority order: 1) command line option, 2) environment variable, 3) saved config, 4) default
|
|
44
|
+
// If explicitly running in dev mode, force the dev URL unless explicitly locally overridden
|
|
45
|
+
if (this.isDevelopment() && !this.commandLineApiUrl && !process.env.OBS_API_URL) {
|
|
46
|
+
return 'http://localhost:8080/api';
|
|
47
|
+
}
|
|
48
|
+
return (this.commandLineApiUrl ||
|
|
49
|
+
process.env.OBS_API_URL ||
|
|
50
|
+
this.config.get('apiUrl') ||
|
|
51
|
+
getDefaultApiUrl());
|
|
52
|
+
}
|
|
53
|
+
setCommandLineApiUrl(url) {
|
|
54
|
+
// Ensure URL ends with /api
|
|
55
|
+
const cleanUrl = url.endsWith('/') ? url.slice(0, -1) : url;
|
|
56
|
+
const finalUrl = cleanUrl.endsWith('/api') ? cleanUrl : `${cleanUrl}/api`;
|
|
57
|
+
this.commandLineApiUrl = finalUrl;
|
|
58
|
+
}
|
|
59
|
+
isDevelopment() {
|
|
60
|
+
return isDevelopment();
|
|
61
|
+
}
|
|
62
|
+
getApiKey() {
|
|
63
|
+
return process.env.OBS_API_KEY || this.config.get('apiKey');
|
|
64
|
+
}
|
|
65
|
+
setApiUrl(url) {
|
|
66
|
+
// Ensure URL ends with /api
|
|
67
|
+
const cleanUrl = url.endsWith('/') ? url.slice(0, -1) : url;
|
|
68
|
+
const finalUrl = cleanUrl.endsWith('/api') ? cleanUrl : `${cleanUrl}/api`;
|
|
69
|
+
this.config.set('apiUrl', finalUrl);
|
|
70
|
+
}
|
|
71
|
+
setApiKey(key) {
|
|
72
|
+
this.config.set('apiKey', key);
|
|
73
|
+
}
|
|
74
|
+
clearApiKey() {
|
|
75
|
+
this.config.delete('apiKey');
|
|
76
|
+
}
|
|
77
|
+
getProjectConfig() {
|
|
78
|
+
return this.config.get('project', {});
|
|
79
|
+
}
|
|
80
|
+
setProjectConfig(projectConfig) {
|
|
81
|
+
this.config.set('project', projectConfig);
|
|
82
|
+
}
|
|
83
|
+
getDefaultOptions() {
|
|
84
|
+
const options = this.config.get('defaultOptions');
|
|
85
|
+
// Ensure all properties have values
|
|
86
|
+
return {
|
|
87
|
+
timeout: options?.timeout ?? 600000,
|
|
88
|
+
retries: options?.retries ?? 3,
|
|
89
|
+
verbose: options?.verbose ?? false,
|
|
90
|
+
pollIntervalMs: options?.pollIntervalMs ?? 2000,
|
|
91
|
+
maxAttempts: options?.maxAttempts ?? 300,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
setDefaultOptions(options) {
|
|
95
|
+
this.config.set('defaultOptions', options);
|
|
96
|
+
}
|
|
97
|
+
reset() {
|
|
98
|
+
this.config.clear();
|
|
99
|
+
}
|
|
100
|
+
getConfigPath() {
|
|
101
|
+
return this.config.path;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { IOutputService } from '../interfaces/output.interface.js';
|
|
2
|
+
import { Test, TestExecution, TestResult, UrlMonitor, ApiCheck, Heartbeat } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Output formatting service implementation
|
|
5
|
+
* Handles console output and formatting
|
|
6
|
+
*/
|
|
7
|
+
export declare class OutputService implements IOutputService {
|
|
8
|
+
private isJsonMode;
|
|
9
|
+
enableJsonMode(): void;
|
|
10
|
+
success(message: string): void;
|
|
11
|
+
error(message: string): void;
|
|
12
|
+
warning(message: string): void;
|
|
13
|
+
info(message: string): void;
|
|
14
|
+
progress(message: string): void;
|
|
15
|
+
formatTestList(tests: Test[], verbose?: boolean): void;
|
|
16
|
+
formatMonitorList(monitors: UrlMonitor[], verbose?: boolean): void;
|
|
17
|
+
formatApiCheckList(checks: ApiCheck[], verbose?: boolean): void;
|
|
18
|
+
formatHeartbeatList(heartbeats: Heartbeat[], verbose?: boolean): void;
|
|
19
|
+
formatTestExecution(execution: TestExecution): void;
|
|
20
|
+
formatTestResult(result: TestResult): void;
|
|
21
|
+
formatJsonOutput(data: any): void;
|
|
22
|
+
private escapeXml;
|
|
23
|
+
formatJUnitReport(testSuite: any): string;
|
|
24
|
+
private getStatusColor;
|
|
25
|
+
private getStatusIcon;
|
|
26
|
+
formatError(error: any): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=output.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.service.d.ts","sourceRoot":"","sources":["../../src/services/output.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAEL,IAAI,EACJ,aAAa,EACb,UAAU,EACV,UAAU,EACV,QAAQ,EACR,SAAS,EACV,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,UAAU,CAAkB;IAEpC,cAAc,IAAI,IAAI;IAGtB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAa5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK/B,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAyB7D,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAyBzE,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAwBtE,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IA+B5E,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAwBnD,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAsB1C,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAWjC,OAAO,CAAC,SAAS;IAmBjB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,MAAM;IA0BzC,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,aAAa;IAiBrB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;CAchC"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* Output formatting service implementation
|
|
4
|
+
* Handles console output and formatting
|
|
5
|
+
*/
|
|
6
|
+
export class OutputService {
|
|
7
|
+
isJsonMode = false;
|
|
8
|
+
enableJsonMode() {
|
|
9
|
+
this.isJsonMode = true;
|
|
10
|
+
}
|
|
11
|
+
success(message) {
|
|
12
|
+
if (this.isJsonMode)
|
|
13
|
+
return;
|
|
14
|
+
console.log(chalk.green(`✅ ${message}`));
|
|
15
|
+
}
|
|
16
|
+
error(message) {
|
|
17
|
+
if (this.isJsonMode) {
|
|
18
|
+
const envelope = {
|
|
19
|
+
status: 'ERROR',
|
|
20
|
+
error: { message },
|
|
21
|
+
metadata: { timestamp: new Date().toISOString() },
|
|
22
|
+
};
|
|
23
|
+
console.log(JSON.stringify(envelope, null, 2));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.error(chalk.red(`❌ ${message}`));
|
|
27
|
+
}
|
|
28
|
+
warning(message) {
|
|
29
|
+
if (this.isJsonMode)
|
|
30
|
+
return;
|
|
31
|
+
console.log(chalk.yellow(`⚠️ ${message}`));
|
|
32
|
+
}
|
|
33
|
+
info(message) {
|
|
34
|
+
if (this.isJsonMode)
|
|
35
|
+
return;
|
|
36
|
+
console.log(chalk.blue(`ℹ️ ${message}`));
|
|
37
|
+
}
|
|
38
|
+
progress(message) {
|
|
39
|
+
if (this.isJsonMode)
|
|
40
|
+
return;
|
|
41
|
+
console.log(chalk.cyan(`🔄 ${message}`));
|
|
42
|
+
}
|
|
43
|
+
formatTestList(tests, verbose = false) {
|
|
44
|
+
if (tests.length === 0) {
|
|
45
|
+
this.info('No AI browser checks found.');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
console.log(chalk.bold('\n🤖 AI Browser Checks:'));
|
|
49
|
+
console.log(chalk.gray('─'.repeat(80)));
|
|
50
|
+
tests.forEach((test, index) => {
|
|
51
|
+
console.log(chalk.bold(`${index + 1}. ${test.name}`));
|
|
52
|
+
if (test.description) {
|
|
53
|
+
console.log(chalk.gray(` ${test.description}`));
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.gray(` URL: ${test.url}`));
|
|
56
|
+
console.log(chalk.gray(` ID: ${test.id}`));
|
|
57
|
+
if (verbose) {
|
|
58
|
+
console.log(chalk.gray(` Prompt: ${test.prompt}`));
|
|
59
|
+
console.log(chalk.gray(` Created: ${new Date(test.created_at).toLocaleString()}`));
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
formatMonitorList(monitors, verbose = false) {
|
|
65
|
+
if (monitors.length === 0) {
|
|
66
|
+
this.info('No URL monitors found.');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
console.log(chalk.bold('\n🌐 URL Monitors:'));
|
|
70
|
+
console.log(chalk.gray('─'.repeat(80)));
|
|
71
|
+
monitors.forEach((monitor, index) => {
|
|
72
|
+
const status = monitor.is_active ? chalk.green('ACTIVE') : chalk.yellow('PAUSED');
|
|
73
|
+
console.log(chalk.bold(`${index + 1}. ${monitor.name} [${status}]`));
|
|
74
|
+
console.log(chalk.gray(` URL: ${monitor.url}`));
|
|
75
|
+
console.log(chalk.gray(` ID: ${monitor.id}`));
|
|
76
|
+
if (verbose) {
|
|
77
|
+
if (monitor.description)
|
|
78
|
+
console.log(chalk.gray(` Desc: ${monitor.description}`));
|
|
79
|
+
console.log(chalk.gray(` Interval: ${monitor.cron_expression || 'Default'}`));
|
|
80
|
+
console.log(chalk.gray(` Alerts: ${monitor.alert_on_failure ? 'ON' : 'OFF'}`));
|
|
81
|
+
}
|
|
82
|
+
console.log('');
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
formatApiCheckList(checks, verbose = false) {
|
|
86
|
+
if (checks.length === 0) {
|
|
87
|
+
this.info('No API checks found.');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
console.log(chalk.bold('\n🔌 API Checks:'));
|
|
91
|
+
console.log(chalk.gray('─'.repeat(80)));
|
|
92
|
+
checks.forEach((check, index) => {
|
|
93
|
+
const status = check.is_active ? chalk.green('ACTIVE') : chalk.yellow('PAUSED');
|
|
94
|
+
console.log(chalk.bold(`${index + 1}. ${check.name} [${status}]`));
|
|
95
|
+
console.log(chalk.gray(` Endpoint: ${check.method} ${check.url}`));
|
|
96
|
+
console.log(chalk.gray(` ID: ${check.id}`));
|
|
97
|
+
if (verbose) {
|
|
98
|
+
if (check.description)
|
|
99
|
+
console.log(chalk.gray(` Desc: ${check.description}`));
|
|
100
|
+
console.log(chalk.gray(` Assertions: ${check.assertions?.length || 0}`));
|
|
101
|
+
}
|
|
102
|
+
console.log('');
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
formatHeartbeatList(heartbeats, verbose = false) {
|
|
106
|
+
if (heartbeats.length === 0) {
|
|
107
|
+
this.info('No heartbeats found.');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(chalk.bold('\n💓 Heartbeats:'));
|
|
111
|
+
console.log(chalk.gray('─'.repeat(80)));
|
|
112
|
+
heartbeats.forEach((hb, index) => {
|
|
113
|
+
const statusColor = hb.status === 'UP' ? chalk.green : hb.status === 'DOWN' ? chalk.red : chalk.yellow;
|
|
114
|
+
const status = statusColor(hb.status);
|
|
115
|
+
const activeStatus = hb.is_active ? '' : chalk.yellow(' (PAUSED)');
|
|
116
|
+
console.log(chalk.bold(`${index + 1}. ${hb.name} - ${status}${activeStatus}`));
|
|
117
|
+
console.log(chalk.gray(` Key: ${hb.ping_key}`));
|
|
118
|
+
console.log(chalk.gray(` ID: ${hb.id}`));
|
|
119
|
+
if (verbose) {
|
|
120
|
+
console.log(chalk.gray(` Period: ${hb.period}s (Grace: ${hb.grace_period}s)`));
|
|
121
|
+
console.log(chalk.gray(` Last Ping: ${hb.last_ping_at ? new Date(hb.last_ping_at).toLocaleString() : 'Never'}`));
|
|
122
|
+
}
|
|
123
|
+
console.log('');
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
formatTestExecution(execution) {
|
|
127
|
+
const statusColor = this.getStatusColor(execution.status);
|
|
128
|
+
const statusIcon = this.getStatusIcon(execution.status);
|
|
129
|
+
console.log(chalk.bold('\n📊 Test Execution Status:'));
|
|
130
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
131
|
+
console.log(`Status: ${statusColor(`${statusIcon} ${execution.status}`)}`);
|
|
132
|
+
console.log(`Execution ID: ${execution.id}`);
|
|
133
|
+
console.log(`Test ID: ${execution.test_id}`);
|
|
134
|
+
console.log(`Started: ${new Date(execution.started_at).toLocaleString()}`);
|
|
135
|
+
if (execution.completed_at) {
|
|
136
|
+
console.log(`Completed: ${new Date(execution.completed_at).toLocaleString()}`);
|
|
137
|
+
}
|
|
138
|
+
if (execution.error_message) {
|
|
139
|
+
console.log(chalk.red(`Error: ${execution.error_message}`));
|
|
140
|
+
}
|
|
141
|
+
if (execution.task_id) {
|
|
142
|
+
console.log(`Task ID: ${execution.task_id}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
formatTestResult(result) {
|
|
146
|
+
const statusColor = this.getStatusColor(result.status);
|
|
147
|
+
const statusIcon = this.getStatusIcon(result.status);
|
|
148
|
+
console.log(chalk.bold('\n🎯 Test Result:'));
|
|
149
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
150
|
+
console.log(`Status: ${statusColor(`${statusIcon} ${result.status}`)}`);
|
|
151
|
+
console.log(`Message: ${result.message}`);
|
|
152
|
+
if (result.task_id) {
|
|
153
|
+
console.log(`Task ID: ${result.task_id}`);
|
|
154
|
+
}
|
|
155
|
+
if (result.duration) {
|
|
156
|
+
console.log(`Duration: ${(result.duration / 1000).toFixed(2)}s`);
|
|
157
|
+
}
|
|
158
|
+
if (result.screenshots && result.screenshots.length > 0) {
|
|
159
|
+
console.log(chalk.blue(`\n📸 Screenshots: ${result.screenshots.length} captured`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
formatJsonOutput(data) {
|
|
163
|
+
const envelope = {
|
|
164
|
+
status: 'SUCCESS',
|
|
165
|
+
data,
|
|
166
|
+
metadata: {
|
|
167
|
+
timestamp: new Date().toISOString(),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
console.log(JSON.stringify(envelope, null, 2));
|
|
171
|
+
}
|
|
172
|
+
escapeXml(unsafe) {
|
|
173
|
+
return unsafe.replace(/[<>&'"]/g, function (c) {
|
|
174
|
+
switch (c) {
|
|
175
|
+
case '<':
|
|
176
|
+
return '<';
|
|
177
|
+
case '>':
|
|
178
|
+
return '>';
|
|
179
|
+
case '&':
|
|
180
|
+
return '&';
|
|
181
|
+
case "'":
|
|
182
|
+
return ''';
|
|
183
|
+
case '"':
|
|
184
|
+
return '"';
|
|
185
|
+
default:
|
|
186
|
+
return c;
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
formatJUnitReport(testSuite) {
|
|
191
|
+
const xml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
192
|
+
<testsuite name="${this.escapeXml(testSuite.name)}" tests="${testSuite.tests}" failures="${testSuite.failures}" errors="${testSuite.errors}" time="${testSuite.time}">
|
|
193
|
+
${testSuite.testCases
|
|
194
|
+
.map((testCase) => {
|
|
195
|
+
let xml = ` <testcase name="${this.escapeXml(testCase.name)}" classname="${this.escapeXml(testCase.classname)}" time="${testCase.time}">`;
|
|
196
|
+
if (testCase.status === 'failed' && testCase.failure) {
|
|
197
|
+
xml += `\r\n <failure message="${this.escapeXml(testCase.failure.message)}" type="${this.escapeXml(testCase.failure.type)}">\r\n${this.escapeXml(testCase.failure.stackTrace || '')}\r\n </failure>`;
|
|
198
|
+
}
|
|
199
|
+
else if (testCase.status === 'skipped') {
|
|
200
|
+
xml += `\r\n <skipped/>`;
|
|
201
|
+
}
|
|
202
|
+
xml += `\r\n </testcase>`;
|
|
203
|
+
return xml;
|
|
204
|
+
})
|
|
205
|
+
.join('\n')}
|
|
206
|
+
</testsuite>`;
|
|
207
|
+
return xml;
|
|
208
|
+
}
|
|
209
|
+
getStatusColor(status) {
|
|
210
|
+
switch (status.toUpperCase()) {
|
|
211
|
+
case 'SUCCESS':
|
|
212
|
+
return chalk.green;
|
|
213
|
+
case 'FAILED':
|
|
214
|
+
return chalk.red;
|
|
215
|
+
case 'RUNNING':
|
|
216
|
+
return chalk.blue;
|
|
217
|
+
case 'PENDING':
|
|
218
|
+
return chalk.yellow;
|
|
219
|
+
case 'CANCELLED':
|
|
220
|
+
return chalk.gray;
|
|
221
|
+
default:
|
|
222
|
+
return chalk.white;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
getStatusIcon(status) {
|
|
226
|
+
switch (status.toUpperCase()) {
|
|
227
|
+
case 'SUCCESS':
|
|
228
|
+
return '✅';
|
|
229
|
+
case 'FAILED':
|
|
230
|
+
return '❌';
|
|
231
|
+
case 'RUNNING':
|
|
232
|
+
return '🔄';
|
|
233
|
+
case 'PENDING':
|
|
234
|
+
return '⏳';
|
|
235
|
+
case 'CANCELLED':
|
|
236
|
+
return '⏹️';
|
|
237
|
+
default:
|
|
238
|
+
return '❓';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
formatError(error) {
|
|
242
|
+
if (error.response) {
|
|
243
|
+
// API error
|
|
244
|
+
const status = error.response.status;
|
|
245
|
+
const message = error.response.data?.error || error.response.data?.message || error.message;
|
|
246
|
+
return `API Error (${status}): ${message}`;
|
|
247
|
+
}
|
|
248
|
+
else if (error.request) {
|
|
249
|
+
// Network error
|
|
250
|
+
return `Network Error: Unable to connect to API. Please check your internet connection and API URL.`;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// Other error
|
|
254
|
+
return error.message || 'An unknown error occurred';
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=output.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.service.js","sourceRoot":"","sources":["../../src/services/output.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,UAAU,GAAY,KAAK,CAAC;IAEpC,cAAc;QACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,OAAe;QACrB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAiB;gBAC7B,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE,OAAO,EAAE;gBAClB,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;aAClD,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,cAAc,CAAC,KAAa,EAAE,UAAmB,KAAK;QACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE7C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,QAAsB,EAAE,UAAmB,KAAK;QAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;YAErE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAEhD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,OAAO,CAAC,WAAW;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,MAAkB,EAAE,UAAmB,KAAK;QAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;YAEnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE9C,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,KAAK,CAAC,WAAW;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,UAAuB,EAAE,UAAmB,KAAK;QACnE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,WAAW,GACf,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YACrF,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAE3C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,aAAa,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,iBAAiB,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAC1F,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,SAAwB;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAExD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,GAAG,UAAU,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAE3E,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,MAAkB;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,GAAG,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,WAAW,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,IAAS;QACxB,MAAM,QAAQ,GAAiB;YAC7B,MAAM,EAAE,SAAS;YACjB,IAAI;YACJ,QAAQ,EAAE;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;SACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAEO,SAAS,CAAC,MAAc;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;YAC3C,QAAQ,CAAC,EAAE,CAAC;gBACV,KAAK,GAAG;oBACN,OAAO,MAAM,CAAC;gBAChB,KAAK,GAAG;oBACN,OAAO,MAAM,CAAC;gBAChB,KAAK,GAAG;oBACN,OAAO,OAAO,CAAC;gBACjB,KAAK,GAAG;oBACN,OAAO,QAAQ,CAAC;gBAClB,KAAK,GAAG;oBACN,OAAO,QAAQ,CAAC;gBAClB;oBACE,OAAO,CAAC,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,SAAc;QAC9B,MAAM,GAAG,GAAG;mBACG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,KAAK,eACtE,SAAS,CAAC,QACZ,aAAa,SAAS,CAAC,MAAM,WAAW,SAAS,CAAC,IAAI;EACxD,SAAS,CAAC,SAAS;aAClB,GAAG,CAAC,CAAC,QAAa,EAAE,EAAE;YACrB,IAAI,GAAG,GAAG,qBAAqB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,QAAQ,CAAC,IAAI,IAAI,CAAC;YAE3I,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrD,GAAG,IAAI,6BAA6B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,SAAS,CACnG,QAAQ,CAAC,OAAO,CAAC,IAAI,CACtB,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,oBAAoB,CAAC;YAClF,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzC,GAAG,IAAI,oBAAoB,CAAC;YAC9B,CAAC;YAED,GAAG,IAAI,mBAAmB,CAAC;YAC3B,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC;aACA,CAAC;QAEV,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB,KAAK,QAAQ;gBACX,OAAO,KAAK,CAAC,GAAG,CAAC;YACnB,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,IAAI,CAAC;YACpB,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,KAAK,WAAW;gBACd,OAAO,KAAK,CAAC,IAAI,CAAC;YACpB;gBACE,OAAO,KAAK,CAAC,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,KAAK,SAAS;gBACZ,OAAO,GAAG,CAAC;YACb,KAAK,QAAQ;gBACX,OAAO,GAAG,CAAC;YACb,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,GAAG,CAAC;YACb,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC;YACd;gBACE,OAAO,GAAG,CAAC;QACf,CAAC;IACH,CAAC;IAED,WAAW,CAAC,KAAU;QACpB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,YAAY;YACZ,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAC5F,OAAO,cAAc,MAAM,MAAM,OAAO,EAAE,CAAC;QAC7C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACzB,gBAAgB;YAChB,OAAO,6FAA6F,CAAC;QACvG,CAAC;aAAM,CAAC;YACN,cAAc;YACd,OAAO,KAAK,CAAC,OAAO,IAAI,2BAA2B,CAAC;QACtD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IConfigService } from '../interfaces/config.interface.js';
|
|
2
|
+
import { ISSEClient, SSEMessage } from '../interfaces/sse-client.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* SSE Client implementation
|
|
5
|
+
* Handles Server-Sent Events streaming
|
|
6
|
+
*/
|
|
7
|
+
export declare class SSEClient implements ISSEClient {
|
|
8
|
+
private abortController;
|
|
9
|
+
private isConnected;
|
|
10
|
+
private configService;
|
|
11
|
+
constructor(configService: IConfigService);
|
|
12
|
+
connect(taskId: string, onMessage: (message: SSEMessage) => void, onError: (error: any) => void): void;
|
|
13
|
+
private processStream;
|
|
14
|
+
close(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=sse-client.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-client.service.d.ts","sourceRoot":"","sources":["../../src/services/sse-client.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAE/E;;;GAGG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAiB;gBAE1B,aAAa,EAAE,cAAc;IAIzC,OAAO,CACL,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,EACxC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC5B,IAAI;YAmBO,aAAa;IA2D3B,KAAK,IAAI,IAAI;CAOd"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE Client implementation
|
|
3
|
+
* Handles Server-Sent Events streaming
|
|
4
|
+
*/
|
|
5
|
+
export class SSEClient {
|
|
6
|
+
abortController = null;
|
|
7
|
+
isConnected = false;
|
|
8
|
+
configService;
|
|
9
|
+
constructor(configService) {
|
|
10
|
+
this.configService = configService;
|
|
11
|
+
}
|
|
12
|
+
connect(taskId, onMessage, onError) {
|
|
13
|
+
const apiUrl = this.configService.getApiUrl();
|
|
14
|
+
const apiKey = this.configService.getApiKey();
|
|
15
|
+
if (!apiKey) {
|
|
16
|
+
throw new Error("Cannot connect to SSE stream: No API key found. Please run 'obs login' first.");
|
|
17
|
+
}
|
|
18
|
+
const url = `${apiUrl}/browser-checks/events/${taskId}`;
|
|
19
|
+
this.abortController = new AbortController();
|
|
20
|
+
this.isConnected = true;
|
|
21
|
+
// Start the stream processing in the background (don't await)
|
|
22
|
+
this.processStream(url, apiKey, onMessage, onError);
|
|
23
|
+
}
|
|
24
|
+
async processStream(url, apiKey, onMessage, onError) {
|
|
25
|
+
try {
|
|
26
|
+
const response = await fetch(url, {
|
|
27
|
+
headers: {
|
|
28
|
+
'x-obs1-cli': apiKey,
|
|
29
|
+
Accept: 'text/event-stream',
|
|
30
|
+
},
|
|
31
|
+
signal: this.abortController.signal,
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
35
|
+
}
|
|
36
|
+
const reader = response.body?.getReader();
|
|
37
|
+
if (!reader) {
|
|
38
|
+
throw new Error('Response body is not readable');
|
|
39
|
+
}
|
|
40
|
+
const decoder = new TextDecoder();
|
|
41
|
+
let buffer = '';
|
|
42
|
+
while (this.isConnected) {
|
|
43
|
+
const { done, value } = await reader.read();
|
|
44
|
+
if (done) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
buffer += decoder.decode(value, { stream: true });
|
|
48
|
+
const lines = buffer.split('\n');
|
|
49
|
+
buffer = lines.pop() || '';
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
if (line.startsWith('data:')) {
|
|
52
|
+
const data = line.slice(5).trim();
|
|
53
|
+
if (data) {
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(data);
|
|
56
|
+
onMessage(parsed);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error('Failed to parse SSE message:', error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error.name !== 'AbortError') {
|
|
68
|
+
onError(error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
close() {
|
|
73
|
+
this.isConnected = false;
|
|
74
|
+
if (this.abortController) {
|
|
75
|
+
this.abortController.abort();
|
|
76
|
+
this.abortController = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sse-client.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-client.service.js","sourceRoot":"","sources":["../../src/services/sse-client.service.ts"],"names":[],"mappings":"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"}
|