hunter-mate 0.1.6 → 0.1.7
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/dist/assets/extension/background/service-worker.js +193 -16
- package/dist/assets/extension/manifest.json +1 -1
- package/dist/assets/extension/package.json +4 -3
- package/dist/assets/server/app.module.js +2 -1
- package/dist/assets/server/app.module.js.map +1 -1
- package/dist/assets/server/auth/auth.controller.d.ts +7 -0
- package/dist/assets/server/auth/auth.controller.js +20 -0
- package/dist/assets/server/auth/auth.controller.js.map +1 -1
- package/dist/assets/server/auth/auth.service.d.ts +11 -0
- package/dist/assets/server/auth/auth.service.js +58 -1
- package/dist/assets/server/auth/auth.service.js.map +1 -1
- package/dist/assets/server/build-info.json +1 -1
- package/dist/assets/server/extension/extension-control.controller.d.ts +3 -0
- package/dist/assets/server/extension/extension-control.controller.js +1 -1
- package/dist/assets/server/extension/extension-control.controller.js.map +1 -1
- package/dist/assets/server/extension/extension-control.service.d.ts +8 -0
- package/dist/assets/server/extension/extension-control.service.js +38 -1
- package/dist/assets/server/extension/extension-control.service.js.map +1 -1
- package/dist/assets/server/package.json +4 -3
- package/dist/assets/server/recording/recording-event-queue.service.d.ts +26 -0
- package/dist/assets/server/recording/recording-event-queue.service.js +115 -0
- package/dist/assets/server/recording/recording-event-queue.service.js.map +1 -0
- package/dist/assets/server/recording/recording-retention.service.d.ts +21 -0
- package/dist/assets/server/recording/recording-retention.service.js +85 -0
- package/dist/assets/server/recording/recording-retention.service.js.map +1 -0
- package/dist/assets/server/recording/recording.controller.d.ts +11 -1
- package/dist/assets/server/recording/recording.controller.js +18 -2
- package/dist/assets/server/recording/recording.controller.js.map +1 -1
- package/dist/assets/server/recording/recording.module.js +10 -1
- package/dist/assets/server/recording/recording.module.js.map +1 -1
- package/dist/assets/server/recording/recording.service.d.ts +5 -1
- package/dist/assets/server/recording/recording.service.js +21 -6
- package/dist/assets/server/recording/recording.service.js.map +1 -1
- package/dist/commands/cache.js +3 -4
- package/dist/commands/doctor.js +94 -12
- package/dist/commands/extension.js +14 -23
- package/dist/commands/extras.js +2 -2
- package/dist/commands/job.d.ts +4 -1
- package/dist/commands/job.js +51 -16
- package/dist/commands/login.d.ts +15 -0
- package/dist/commands/login.js +57 -12
- package/dist/commands/ops.js +18 -2
- package/dist/commands/record.js +2 -4
- package/dist/commands/report.js +2 -4
- package/dist/commands/search.js +9 -2
- package/dist/commands/server.d.ts +2 -2
- package/dist/commands/server.js +78 -17
- package/dist/commands/update.js +1 -1
- package/dist/i18n/locales/en-US.json +3 -1
- package/dist/i18n/locales/zh-CN.json +3 -1
- package/dist/index.js +38 -2
- package/dist/updater.d.ts +1 -1
- package/dist/updater.js +22 -5
- package/dist/utils/command-error.d.ts +9 -0
- package/dist/utils/command-error.js +31 -0
- package/dist/utils/proxy-detect.d.ts +20 -0
- package/dist/utils/proxy-detect.js +96 -0
- package/dist/utils/script-path.d.ts +5 -0
- package/dist/utils/script-path.js +27 -0
- package/dist/version.js +1 -1
- package/dist/watchdog.d.ts +23 -1
- package/dist/watchdog.js +95 -4
- package/dist/web/dist/404.html +1 -0
- package/dist/web/dist/_next/static/chunks/166.f30be223f694f8ee.js +1 -0
- package/dist/web/dist/_next/static/chunks/1e6d5a0c.0488932e17ecdf24.js +15 -0
- package/dist/web/dist/_next/static/chunks/539-5d0e8c5c238c56f8.js +1 -0
- package/dist/web/dist/_next/static/chunks/589-d632233641f35681.js +1 -0
- package/dist/web/dist/_next/static/chunks/671.3b8e9cc96b25b6ea.js +1 -0
- package/dist/web/dist/_next/static/chunks/935-99f57b7d4151d9e7.js +5 -0
- package/dist/web/dist/_next/static/chunks/a7067448-96dd4b8457c447e8.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/_not-found/page-fdf1a13a7656886a.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/auth/verify/page-8e5cff53d6f7d8e1.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/companies/page-e38a69e1929d0953.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/entity/page-250f8a9b6d91ab19.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/jobs/page-6a281776fec065f6.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/layout-83e623e973c1693f.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/logs/page-9f41d44fa1add723.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/matching/jobs/[id]/talents/page-f57f4b7529823601.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/matching/portraits/[id]/jobs/page-614d1e62d7b9d215.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/page-e3392de08ae81fba.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/parselog/page-58d3acece95b4089.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/recordings/page-e2e2e3c3a64083fb.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/snapshots/[id]/agent-prompt/page-fd3b7d7373b8f8b7.js +1 -0
- package/dist/web/dist/_next/static/chunks/app/talents/page-30748338da20d7e0.js +1 -0
- package/dist/web/dist/_next/static/chunks/framework-b3a558b17a070965.js +1 -0
- package/dist/web/dist/_next/static/chunks/main-5a4e0cd75dd7f04b.js +1 -0
- package/dist/web/dist/_next/static/chunks/main-app-80b038a312917d90.js +1 -0
- package/dist/web/dist/_next/static/chunks/pages/_app-da7d628f49271ece.js +4 -0
- package/dist/web/dist/_next/static/chunks/pages/_error-17756f67e0a11350.js +1 -0
- package/dist/web/dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/web/dist/_next/static/chunks/webpack-1784baecc6fdcf0b.js +1 -0
- package/dist/web/dist/_next/static/css/db881c5b3072b88a.css +3 -0
- package/dist/web/dist/_next/static/css/f60d210841fab76b.css +1 -0
- package/dist/web/dist/_next/static/hqJ-7vr4X71DNfzZugHJ-/_buildManifest.js +1 -0
- package/dist/web/dist/_next/static/hqJ-7vr4X71DNfzZugHJ-/_ssgManifest.js +1 -0
- package/dist/web/dist/auth/verify.html +1 -0
- package/dist/web/dist/auth/verify.txt +8 -0
- package/dist/web/dist/companies.html +1 -0
- package/dist/web/dist/companies.txt +7 -0
- package/dist/web/dist/entity.html +1 -0
- package/dist/web/dist/entity.txt +8 -0
- package/dist/web/dist/index.html +1 -0
- package/dist/web/dist/index.txt +8 -0
- package/dist/web/dist/jobs.html +1 -0
- package/dist/web/dist/jobs.txt +7 -0
- package/dist/web/dist/logs.html +1 -0
- package/dist/web/dist/logs.txt +8 -0
- package/dist/web/dist/matching/jobs/placeholder/talents.html +1 -0
- package/dist/web/dist/matching/jobs/placeholder/talents.txt +8 -0
- package/dist/web/dist/matching/portraits/placeholder/jobs.html +1 -0
- package/dist/web/dist/matching/portraits/placeholder/jobs.txt +8 -0
- package/dist/web/dist/parselog.html +1 -0
- package/dist/web/dist/parselog.txt +8 -0
- package/dist/web/dist/recordings.html +1 -0
- package/dist/web/dist/recordings.txt +8 -0
- package/dist/web/dist/snapshots/placeholder/agent-prompt.html +1 -0
- package/dist/web/dist/snapshots/placeholder/agent-prompt.txt +8 -0
- package/dist/web/dist/talents.html +1 -0
- package/dist/web/dist/talents.txt +7 -0
- package/package.json +25 -5
|
@@ -52,6 +52,7 @@ let ExtensionControlService = ExtensionControlService_1 = class ExtensionControl
|
|
|
52
52
|
const enriched = { ...resp, durationMs };
|
|
53
53
|
if (resp.status === 'ok' || resp.status === 'cancelled') {
|
|
54
54
|
this.logger.log(`command succeeded`, { requestId: resp.requestId, status: resp.status, durationMs });
|
|
55
|
+
this.clearDegraded(this.clients.get(pending.extensionId));
|
|
55
56
|
pending.resolve(enriched);
|
|
56
57
|
}
|
|
57
58
|
else if (resp.status === 'timeout') {
|
|
@@ -73,6 +74,9 @@ let ExtensionControlService = ExtensionControlService_1 = class ExtensionControl
|
|
|
73
74
|
capabilities: c.capabilities,
|
|
74
75
|
connectedAt: c.connectedAt,
|
|
75
76
|
readyState: c.ws.readyState,
|
|
77
|
+
degraded: c.degradedSince !== undefined,
|
|
78
|
+
degradedReason: c.degradedReason,
|
|
79
|
+
degradedSince: c.degradedSince,
|
|
76
80
|
}));
|
|
77
81
|
}
|
|
78
82
|
async sendCommand(params) {
|
|
@@ -104,7 +108,9 @@ let ExtensionControlService = ExtensionControlService_1 = class ExtensionControl
|
|
|
104
108
|
const p = this.pending.get(requestId);
|
|
105
109
|
if (p) {
|
|
106
110
|
this.pending.delete(requestId);
|
|
107
|
-
this.logger.warn(`command timed out`, { command: params.command, requestId, timeoutMs });
|
|
111
|
+
this.logger.warn(`command timed out`, { command: params.command, requestId, timeoutMs, extensionId: client.extensionId });
|
|
112
|
+
this.sendCancel(client, requestId, params.command);
|
|
113
|
+
this.markDegraded(client, `command ${params.command} timed out after ${timeoutMs}ms`);
|
|
108
114
|
reject(new common_1.RequestTimeoutException(`Extension command ${params.command} timed out after ${timeoutMs}ms`));
|
|
109
115
|
}
|
|
110
116
|
}, timeoutMs + 500);
|
|
@@ -113,6 +119,7 @@ let ExtensionControlService = ExtensionControlService_1 = class ExtensionControl
|
|
|
113
119
|
reject,
|
|
114
120
|
timer,
|
|
115
121
|
startedAt: Date.now(),
|
|
122
|
+
extensionId: client.extensionId,
|
|
116
123
|
});
|
|
117
124
|
try {
|
|
118
125
|
client.ws.send(JSON.stringify(cmd));
|
|
@@ -145,6 +152,36 @@ let ExtensionControlService = ExtensionControlService_1 = class ExtensionControl
|
|
|
145
152
|
throw err;
|
|
146
153
|
}
|
|
147
154
|
}
|
|
155
|
+
sendCancel(client, requestId, command) {
|
|
156
|
+
if (client.ws.readyState !== ws_1.WebSocket.OPEN)
|
|
157
|
+
return;
|
|
158
|
+
try {
|
|
159
|
+
const cancelCmd = {
|
|
160
|
+
type: 'cmd',
|
|
161
|
+
requestId: (0, crypto_1.randomUUID)(),
|
|
162
|
+
command: 'cancel',
|
|
163
|
+
params: { requestId, command },
|
|
164
|
+
timeoutMs: 5000,
|
|
165
|
+
};
|
|
166
|
+
client.ws.send(JSON.stringify(cancelCmd));
|
|
167
|
+
this.logger.log(`cancel dispatched after timeout`, { originalRequestId: requestId, command, extensionId: client.extensionId });
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
this.logger.warn(`failed to dispatch cancel`, { requestId, error: err.message });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
markDegraded(client, reason) {
|
|
174
|
+
client.degradedSince = Date.now();
|
|
175
|
+
client.degradedReason = reason;
|
|
176
|
+
this.logger.warn(`extension marked degraded`, { extensionId: client.extensionId, reason });
|
|
177
|
+
}
|
|
178
|
+
clearDegraded(client) {
|
|
179
|
+
if (client && client.degradedSince !== undefined) {
|
|
180
|
+
this.logger.log(`extension recovered from degraded`, { extensionId: client.extensionId });
|
|
181
|
+
client.degradedSince = undefined;
|
|
182
|
+
client.degradedReason = undefined;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
148
185
|
async pickClientWithRetry(extensionId) {
|
|
149
186
|
const MAX_WAIT_MS = 35000;
|
|
150
187
|
const PROBE_INTERVAL_MS = 2000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-control.service.js","sourceRoot":"","sources":["../../src/extension/extension-control.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA6H;AAC7H,2BAA+B;AAC/B,mCAAoC;AAOpC,6DAAyD;
|
|
1
|
+
{"version":3,"file":"extension-control.service.js","sourceRoot":"","sources":["../../src/extension/extension-control.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@chromepilot/kit": "^0.1.1",
|
|
15
15
|
"@chromepilot/logger-kit": "^0.1.4",
|
|
16
|
-
"@hunter-mate/shared": "
|
|
16
|
+
"@hunter-mate/shared": "0.1.5",
|
|
17
17
|
"@nestjs/axios": "^3.1.3",
|
|
18
18
|
"@nestjs/common": "^10.3.0",
|
|
19
19
|
"@nestjs/config": "^3.1.0",
|
|
@@ -53,5 +53,6 @@
|
|
|
53
53
|
"ts-jest": "^29.1.0",
|
|
54
54
|
"typescript": "^5.4.0",
|
|
55
55
|
"vitest": "^1.6.1"
|
|
56
|
-
}
|
|
57
|
-
|
|
56
|
+
},
|
|
57
|
+
"description": " [bundled asset: runtime deps are provided by the parent hunter-mate package]"
|
|
58
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { HbrEvent } from '@hunter-mate/shared';
|
|
3
|
+
export interface QueuedRecordingEvent {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
event: HbrEvent;
|
|
6
|
+
}
|
|
7
|
+
export type RecordingFlushHandler = (items: QueuedRecordingEvent[]) => Promise<Record<string, number>>;
|
|
8
|
+
export declare class RecordingEventQueue implements OnModuleDestroy {
|
|
9
|
+
private readonly logger;
|
|
10
|
+
private queue;
|
|
11
|
+
private timer;
|
|
12
|
+
private flushing;
|
|
13
|
+
private flushHandler;
|
|
14
|
+
private readonly flushIntervalMs;
|
|
15
|
+
private readonly batchSize;
|
|
16
|
+
private readonly maxEventBytes;
|
|
17
|
+
setFlushHandler(handler: RecordingFlushHandler): void;
|
|
18
|
+
enqueue(sessionId: string, events: HbrEvent[]): Promise<{
|
|
19
|
+
sessionId: string;
|
|
20
|
+
eventCount: number;
|
|
21
|
+
}>;
|
|
22
|
+
flushNow(): Promise<void>;
|
|
23
|
+
onModuleDestroy(): void;
|
|
24
|
+
private scheduleFlush;
|
|
25
|
+
private flush;
|
|
26
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var RecordingEventQueue_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.RecordingEventQueue = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const DEFAULT_FLUSH_INTERVAL_MS = 100;
|
|
13
|
+
const DEFAULT_BATCH_SIZE = 100;
|
|
14
|
+
const DEFAULT_MAX_EVENT_BYTES = 512 * 1024;
|
|
15
|
+
function estimatePayloadBytes(payload) {
|
|
16
|
+
if (payload === undefined || payload === null)
|
|
17
|
+
return 0;
|
|
18
|
+
try {
|
|
19
|
+
return Buffer.byteLength(JSON.stringify(payload));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return Number.MAX_SAFE_INTEGER;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
let RecordingEventQueue = RecordingEventQueue_1 = class RecordingEventQueue {
|
|
26
|
+
logger = new common_1.Logger(RecordingEventQueue_1.name);
|
|
27
|
+
queue = [];
|
|
28
|
+
timer = null;
|
|
29
|
+
flushing = null;
|
|
30
|
+
flushHandler = null;
|
|
31
|
+
flushIntervalMs = Number(process.env.RECORDING_FLUSH_INTERVAL_MS || DEFAULT_FLUSH_INTERVAL_MS);
|
|
32
|
+
batchSize = Number(process.env.RECORDING_FLUSH_BATCH_SIZE || DEFAULT_BATCH_SIZE);
|
|
33
|
+
maxEventBytes = Number(process.env.RECORDING_MAX_EVENT_BYTES || DEFAULT_MAX_EVENT_BYTES);
|
|
34
|
+
setFlushHandler(handler) {
|
|
35
|
+
this.flushHandler = handler;
|
|
36
|
+
}
|
|
37
|
+
enqueue(sessionId, events) {
|
|
38
|
+
const accepted = [];
|
|
39
|
+
for (const event of events) {
|
|
40
|
+
const size = estimatePayloadBytes(event.payload);
|
|
41
|
+
if (size > this.maxEventBytes) {
|
|
42
|
+
this.logger.warn(`录制事件 payload 超过 ${this.maxEventBytes}B 上限,已丢弃`, { sessionId, eventType: event.type, size });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
accepted.push(event);
|
|
46
|
+
}
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
this.queue.push({ sessionId, events: accepted, resolve, reject });
|
|
49
|
+
this.scheduleFlush();
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async flushNow() {
|
|
53
|
+
await this.flush();
|
|
54
|
+
}
|
|
55
|
+
onModuleDestroy() {
|
|
56
|
+
if (this.timer) {
|
|
57
|
+
clearTimeout(this.timer);
|
|
58
|
+
this.timer = null;
|
|
59
|
+
}
|
|
60
|
+
this.flush().catch(() => undefined);
|
|
61
|
+
}
|
|
62
|
+
scheduleFlush() {
|
|
63
|
+
if (this.timer || this.flushing)
|
|
64
|
+
return;
|
|
65
|
+
if (this.queue.length >= this.batchSize) {
|
|
66
|
+
void this.flush();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.timer = setTimeout(() => {
|
|
70
|
+
this.timer = null;
|
|
71
|
+
void this.flush();
|
|
72
|
+
}, this.flushIntervalMs);
|
|
73
|
+
this.timer.unref?.();
|
|
74
|
+
}
|
|
75
|
+
flush() {
|
|
76
|
+
if (this.flushing)
|
|
77
|
+
return this.flushing;
|
|
78
|
+
if (!this.queue.length)
|
|
79
|
+
return Promise.resolve();
|
|
80
|
+
if (!this.flushHandler) {
|
|
81
|
+
return Promise.reject(new Error('RecordingEventQueue.flushHandler 未注册'));
|
|
82
|
+
}
|
|
83
|
+
const batch = this.queue;
|
|
84
|
+
this.queue = [];
|
|
85
|
+
this.flushing = (async () => {
|
|
86
|
+
try {
|
|
87
|
+
const items = batch.flatMap((entry) => entry.events.map((event) => ({ sessionId: entry.sessionId, event })));
|
|
88
|
+
const counts = await this.flushHandler(items);
|
|
89
|
+
for (const entry of batch) {
|
|
90
|
+
entry.resolve({
|
|
91
|
+
sessionId: entry.sessionId,
|
|
92
|
+
eventCount: counts[entry.sessionId] ?? 0,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
for (const entry of batch) {
|
|
98
|
+
entry.reject(err);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
this.flushing = null;
|
|
103
|
+
if (this.queue.length) {
|
|
104
|
+
this.scheduleFlush();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
return this.flushing;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
exports.RecordingEventQueue = RecordingEventQueue;
|
|
112
|
+
exports.RecordingEventQueue = RecordingEventQueue = RecordingEventQueue_1 = __decorate([
|
|
113
|
+
(0, common_1.Injectable)()
|
|
114
|
+
], RecordingEventQueue);
|
|
115
|
+
//# sourceMappingURL=recording-event-queue.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-event-queue.service.js","sourceRoot":"","sources":["../../src/recording/recording-event-queue.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { Repository } from 'typeorm';
|
|
3
|
+
import { RecordingEvent } from './entities/recording-event.entity';
|
|
4
|
+
import { RecordingSnapshot } from './entities/recording-snapshot.entity';
|
|
5
|
+
export declare class RecordingRetentionService implements OnModuleInit, OnModuleDestroy {
|
|
6
|
+
private readonly eventRepo;
|
|
7
|
+
private readonly snapshotRepo;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private timer;
|
|
10
|
+
constructor(eventRepo: Repository<RecordingEvent>, snapshotRepo: Repository<RecordingSnapshot>);
|
|
11
|
+
private get retentionDays();
|
|
12
|
+
private get intervalMs();
|
|
13
|
+
onModuleInit(): void;
|
|
14
|
+
onModuleDestroy(): void;
|
|
15
|
+
prune(days?: number): Promise<{
|
|
16
|
+
days: number;
|
|
17
|
+
cutoff: string;
|
|
18
|
+
eventsDeleted: number;
|
|
19
|
+
snapshotsDeleted: number;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var RecordingRetentionService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.RecordingRetentionService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
19
|
+
const typeorm_2 = require("typeorm");
|
|
20
|
+
const recording_event_entity_1 = require("./entities/recording-event.entity");
|
|
21
|
+
const recording_snapshot_entity_1 = require("./entities/recording-snapshot.entity");
|
|
22
|
+
let RecordingRetentionService = RecordingRetentionService_1 = class RecordingRetentionService {
|
|
23
|
+
eventRepo;
|
|
24
|
+
snapshotRepo;
|
|
25
|
+
logger = new common_1.Logger(RecordingRetentionService_1.name);
|
|
26
|
+
timer = null;
|
|
27
|
+
constructor(eventRepo, snapshotRepo) {
|
|
28
|
+
this.eventRepo = eventRepo;
|
|
29
|
+
this.snapshotRepo = snapshotRepo;
|
|
30
|
+
}
|
|
31
|
+
get retentionDays() {
|
|
32
|
+
return Number(process.env.RECORDING_RETENTION_DAYS || 30);
|
|
33
|
+
}
|
|
34
|
+
get intervalMs() {
|
|
35
|
+
return Number(process.env.RECORDING_RETENTION_INTERVAL_MS || 24 * 60 * 60 * 1000);
|
|
36
|
+
}
|
|
37
|
+
onModuleInit() {
|
|
38
|
+
if (this.retentionDays <= 0) {
|
|
39
|
+
this.logger.log('录制保留期清理已关闭(RECORDING_RETENTION_DAYS <= 0)');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
void this.prune().catch((err) => this.logger.warn(`录制保留期清理失败: ${err.message}`));
|
|
43
|
+
this.timer = setInterval(() => {
|
|
44
|
+
void this.prune().catch((err) => this.logger.warn(`录制保留期清理失败: ${err.message}`));
|
|
45
|
+
}, this.intervalMs);
|
|
46
|
+
this.timer.unref?.();
|
|
47
|
+
}
|
|
48
|
+
onModuleDestroy() {
|
|
49
|
+
if (this.timer) {
|
|
50
|
+
clearInterval(this.timer);
|
|
51
|
+
this.timer = null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async prune(days = this.retentionDays) {
|
|
55
|
+
if (days <= 0) {
|
|
56
|
+
return { days, cutoff: '', eventsDeleted: 0, snapshotsDeleted: 0 };
|
|
57
|
+
}
|
|
58
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
|
59
|
+
const snapshotRes = await this.snapshotRepo
|
|
60
|
+
.createQueryBuilder()
|
|
61
|
+
.delete()
|
|
62
|
+
.where('createdAt < :cutoff', { cutoff })
|
|
63
|
+
.execute();
|
|
64
|
+
const eventRes = await this.eventRepo
|
|
65
|
+
.createQueryBuilder()
|
|
66
|
+
.delete()
|
|
67
|
+
.where('createdAt < :cutoff', { cutoff })
|
|
68
|
+
.execute();
|
|
69
|
+
const snapshotsDeleted = snapshotRes.affected ?? 0;
|
|
70
|
+
const eventsDeleted = eventRes.affected ?? 0;
|
|
71
|
+
if (eventsDeleted || snapshotsDeleted) {
|
|
72
|
+
this.logger.log(`录制保留期清理: 删除事件 ${eventsDeleted} 条、快照 ${snapshotsDeleted} 条(早于 ${days} 天)`);
|
|
73
|
+
}
|
|
74
|
+
return { days, cutoff: cutoff.toISOString(), eventsDeleted, snapshotsDeleted };
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.RecordingRetentionService = RecordingRetentionService;
|
|
78
|
+
exports.RecordingRetentionService = RecordingRetentionService = RecordingRetentionService_1 = __decorate([
|
|
79
|
+
(0, common_1.Injectable)(),
|
|
80
|
+
__param(0, (0, typeorm_1.InjectRepository)(recording_event_entity_1.RecordingEvent)),
|
|
81
|
+
__param(1, (0, typeorm_1.InjectRepository)(recording_snapshot_entity_1.RecordingSnapshot)),
|
|
82
|
+
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
83
|
+
typeorm_2.Repository])
|
|
84
|
+
], RecordingRetentionService);
|
|
85
|
+
//# sourceMappingURL=recording-retention.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-retention.service.js","sourceRoot":"","sources":["../../src/recording/recording-retention.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { RecordingService } from './recording.service';
|
|
2
|
+
import { RecordingRetentionService } from './recording-retention.service';
|
|
2
3
|
import { ExtractionService } from '../extraction/extraction.service';
|
|
3
4
|
import { HbrEvent } from '@hunter-mate/shared';
|
|
4
5
|
export declare class RecordingController {
|
|
5
6
|
private readonly recordingService;
|
|
6
7
|
private readonly extractionService;
|
|
7
|
-
|
|
8
|
+
private readonly retentionService;
|
|
9
|
+
constructor(recordingService: RecordingService, extractionService: ExtractionService, retentionService: RecordingRetentionService);
|
|
8
10
|
listRecordings(limit?: string, q?: string, from?: string, to?: string): Promise<{
|
|
9
11
|
sessions: {
|
|
10
12
|
sessionId: string;
|
|
@@ -51,4 +53,12 @@ export declare class RecordingController {
|
|
|
51
53
|
isNew: boolean;
|
|
52
54
|
} | null;
|
|
53
55
|
}>;
|
|
56
|
+
pruneRecordings(body?: {
|
|
57
|
+
days?: number;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
days: number;
|
|
60
|
+
cutoff: string;
|
|
61
|
+
eventsDeleted: number;
|
|
62
|
+
snapshotsDeleted: number;
|
|
63
|
+
}>;
|
|
54
64
|
}
|
|
@@ -15,13 +15,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.RecordingController = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const recording_service_1 = require("./recording.service");
|
|
18
|
+
const recording_retention_service_1 = require("./recording-retention.service");
|
|
18
19
|
const extraction_service_1 = require("../extraction/extraction.service");
|
|
19
20
|
let RecordingController = class RecordingController {
|
|
20
21
|
recordingService;
|
|
21
22
|
extractionService;
|
|
22
|
-
|
|
23
|
+
retentionService;
|
|
24
|
+
constructor(recordingService, extractionService, retentionService) {
|
|
23
25
|
this.recordingService = recordingService;
|
|
24
26
|
this.extractionService = extractionService;
|
|
27
|
+
this.retentionService = retentionService;
|
|
25
28
|
}
|
|
26
29
|
listRecordings(limit, q, from, to) {
|
|
27
30
|
return this.recordingService.listRecordings(limit ? Math.min(Number(limit) || 50, 500) : 50, { q, from, to });
|
|
@@ -35,6 +38,11 @@ let RecordingController = class RecordingController {
|
|
|
35
38
|
parseRecording(sessionId) {
|
|
36
39
|
return this.extractionService.parseSession(sessionId);
|
|
37
40
|
}
|
|
41
|
+
pruneRecordings(body) {
|
|
42
|
+
const raw = body?.days;
|
|
43
|
+
const days = raw !== undefined && Number.isFinite(Number(raw)) ? Number(raw) : undefined;
|
|
44
|
+
return this.retentionService.prune(days);
|
|
45
|
+
}
|
|
38
46
|
};
|
|
39
47
|
exports.RecordingController = RecordingController;
|
|
40
48
|
__decorate([
|
|
@@ -69,9 +77,17 @@ __decorate([
|
|
|
69
77
|
__metadata("design:paramtypes", [String]),
|
|
70
78
|
__metadata("design:returntype", void 0)
|
|
71
79
|
], RecordingController.prototype, "parseRecording", null);
|
|
80
|
+
__decorate([
|
|
81
|
+
(0, common_1.Post)('prune'),
|
|
82
|
+
__param(0, (0, common_1.Body)()),
|
|
83
|
+
__metadata("design:type", Function),
|
|
84
|
+
__metadata("design:paramtypes", [Object]),
|
|
85
|
+
__metadata("design:returntype", void 0)
|
|
86
|
+
], RecordingController.prototype, "pruneRecordings", null);
|
|
72
87
|
exports.RecordingController = RecordingController = __decorate([
|
|
73
88
|
(0, common_1.Controller)('api/recordings'),
|
|
74
89
|
__metadata("design:paramtypes", [recording_service_1.RecordingService,
|
|
75
|
-
extraction_service_1.ExtractionService
|
|
90
|
+
extraction_service_1.ExtractionService,
|
|
91
|
+
recording_retention_service_1.RecordingRetentionService])
|
|
76
92
|
], RecordingController);
|
|
77
93
|
//# sourceMappingURL=recording.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.controller.js","sourceRoot":"","sources":["../../src/recording/recording.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA2E;AAC3E,2DAAuD;AACvD,yEAAqE;AAI9D,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAEX;IACA;
|
|
1
|
+
{"version":3,"file":"recording.controller.js","sourceRoot":"","sources":["../../src/recording/recording.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA2E;AAC3E,2DAAuD;AACvD,+EAA0E;AAC1E,yEAAqE;AAI9D,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAEX;IACA;IACA;IAHnB,YACmB,gBAAkC,EAClC,iBAAoC,EACpC,gBAA2C;QAF3C,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,qBAAgB,GAAhB,gBAAgB,CAA2B;IAC3D,CAAC;IAGJ,cAAc,CACI,KAAc,EAClB,CAAU,EACP,IAAa,EACf,EAAW;QAExB,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CACzC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAC/C,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAChB,CAAC;IACJ,CAAC;IAGD,aAAa,CACS,SAAiB,EAC7B,MAAkB;QAE1B,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAGD,YAAY,CAAqB,SAAiB;QAChD,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAGD,cAAc,CAAqB,SAAiB;QAClD,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAID,eAAe,CAAS,IAAwB;QAC9C,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF,CAAA;AA7CY,kDAAmB;AAQ9B;IADC,IAAA,YAAG,GAAE;IAEH,WAAA,IAAA,cAAK,EAAC,OAAO,CAAC,CAAA;IACd,WAAA,IAAA,cAAK,EAAC,GAAG,CAAC,CAAA;IACV,WAAA,IAAA,cAAK,EAAC,MAAM,CAAC,CAAA;IACb,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;yDAMb;AAGD;IADC,IAAA,aAAI,EAAC,mBAAmB,CAAC;IAEvB,WAAA,IAAA,cAAK,EAAC,WAAW,CAAC,CAAA;IAClB,WAAA,IAAA,aAAI,GAAE,CAAA;;;;wDAGR;AAGD;IADC,IAAA,YAAG,EAAC,YAAY,CAAC;IACJ,WAAA,IAAA,cAAK,EAAC,WAAW,CAAC,CAAA;;;;uDAE/B;AAGD;IADC,IAAA,aAAI,EAAC,kBAAkB,CAAC;IACT,WAAA,IAAA,cAAK,EAAC,WAAW,CAAC,CAAA;;;;yDAEjC;AAID;IADC,IAAA,aAAI,EAAC,OAAO,CAAC;IACG,WAAA,IAAA,aAAI,GAAE,CAAA;;;;0DAItB;8BA5CU,mBAAmB;IAD/B,IAAA,mBAAU,EAAC,gBAAgB,CAAC;qCAGU,oCAAgB;QACf,sCAAiB;QAClB,uDAAyB;GAJnD,mBAAmB,CA6C/B"}
|
|
@@ -16,6 +16,8 @@ const recording_event_entity_1 = require("./entities/recording-event.entity");
|
|
|
16
16
|
const recording_snapshot_entity_1 = require("./entities/recording-snapshot.entity");
|
|
17
17
|
const recording_snapshot_service_1 = require("./recording-snapshot.service");
|
|
18
18
|
const recording_event_bus_service_1 = require("./recording-event-bus.service");
|
|
19
|
+
const recording_event_queue_service_1 = require("./recording-event-queue.service");
|
|
20
|
+
const recording_retention_service_1 = require("./recording-retention.service");
|
|
19
21
|
const extension_module_1 = require("../extension/extension.module");
|
|
20
22
|
const extraction_module_1 = require("../extraction/extraction.module");
|
|
21
23
|
let RecordingModule = class RecordingModule {
|
|
@@ -29,7 +31,14 @@ exports.RecordingModule = RecordingModule = __decorate([
|
|
|
29
31
|
(0, common_1.forwardRef)(() => extraction_module_1.ExtractionModule),
|
|
30
32
|
],
|
|
31
33
|
controllers: [recording_controller_1.RecordingController],
|
|
32
|
-
providers: [
|
|
34
|
+
providers: [
|
|
35
|
+
recording_service_1.RecordingService,
|
|
36
|
+
recording_gateway_1.RecordingGateway,
|
|
37
|
+
recording_snapshot_service_1.RecordingSnapshotService,
|
|
38
|
+
recording_event_bus_service_1.RecordingEventBus,
|
|
39
|
+
recording_event_queue_service_1.RecordingEventQueue,
|
|
40
|
+
recording_retention_service_1.RecordingRetentionService,
|
|
41
|
+
],
|
|
33
42
|
exports: [recording_service_1.RecordingService, recording_gateway_1.RecordingGateway, recording_snapshot_service_1.RecordingSnapshotService, recording_event_bus_service_1.RecordingEventBus],
|
|
34
43
|
})
|
|
35
44
|
], RecordingModule);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.module.js","sourceRoot":"","sources":["../../src/recording/recording.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAoD;AACpD,6CAAgD;AAChD,iEAA6D;AAC7D,2DAAuD;AACvD,2DAAuD;AACvD,8EAAmE;AACnE,oFAAyE;AACzE,6EAAwE;AACxE,+EAAkE;AAClE,oEAAgE;AAChE,uEAAmE;
|
|
1
|
+
{"version":3,"file":"recording.module.js","sourceRoot":"","sources":["../../src/recording/recording.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAoD;AACpD,6CAAgD;AAChD,iEAA6D;AAC7D,2DAAuD;AACvD,2DAAuD;AACvD,8EAAmE;AACnE,oFAAyE;AACzE,6EAAwE;AACxE,+EAAkE;AAClE,mFAAsE;AACtE,+EAA0E;AAC1E,oEAAgE;AAChE,uEAAmE;AAmB5D,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAjB3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,uBAAa,CAAC,UAAU,CAAC,CAAC,uCAAc,EAAE,6CAAiB,CAAC,CAAC;YAC7D,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,kCAAe,CAAC;YACjC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,oCAAgB,CAAC;SACnC;QACD,WAAW,EAAE,CAAC,0CAAmB,CAAC;QAClC,SAAS,EAAE;YACT,oCAAgB;YAChB,oCAAgB;YAChB,qDAAwB;YACxB,+CAAiB;YACjB,mDAAmB;YACnB,uDAAyB;SAC1B;QACD,OAAO,EAAE,CAAC,oCAAgB,EAAE,oCAAgB,EAAE,qDAAwB,EAAE,+CAAiB,CAAC;KAC3F,CAAC;GACW,eAAe,CAAG"}
|
|
@@ -3,15 +3,19 @@ import { HbrEvent } from '@hunter-mate/shared';
|
|
|
3
3
|
import { RecordingEvent } from './entities/recording-event.entity';
|
|
4
4
|
import { RecordingSnapshotService } from './recording-snapshot.service';
|
|
5
5
|
import { RecordingEventBus } from './recording-event-bus.service';
|
|
6
|
+
import { RecordingEventQueue } from './recording-event-queue.service';
|
|
6
7
|
export declare class RecordingService {
|
|
7
8
|
private readonly eventRepo;
|
|
8
9
|
private readonly snapshotService;
|
|
9
10
|
private readonly eventBus;
|
|
10
|
-
|
|
11
|
+
private readonly writeQueue;
|
|
12
|
+
constructor(eventRepo: Repository<RecordingEvent>, snapshotService: RecordingSnapshotService, eventBus: RecordingEventBus, writeQueue: RecordingEventQueue);
|
|
11
13
|
storeEvents(sessionId: string, events: HbrEvent[]): Promise<{
|
|
12
14
|
sessionId: string;
|
|
13
15
|
eventCount: number;
|
|
14
16
|
}>;
|
|
17
|
+
flushPendingWrites(): Promise<void>;
|
|
18
|
+
private persistBatch;
|
|
15
19
|
getRecording(sessionId: string): Promise<{
|
|
16
20
|
sessionId: string;
|
|
17
21
|
eventCount: number;
|
|
@@ -19,18 +19,28 @@ const typeorm_2 = require("typeorm");
|
|
|
19
19
|
const recording_event_entity_1 = require("./entities/recording-event.entity");
|
|
20
20
|
const recording_snapshot_service_1 = require("./recording-snapshot.service");
|
|
21
21
|
const recording_event_bus_service_1 = require("./recording-event-bus.service");
|
|
22
|
+
const recording_event_queue_service_1 = require("./recording-event-queue.service");
|
|
22
23
|
const rrweb_snapshot_utils_1 = require("../extraction/rrweb-snapshot.utils");
|
|
23
24
|
let RecordingService = class RecordingService {
|
|
24
25
|
eventRepo;
|
|
25
26
|
snapshotService;
|
|
26
27
|
eventBus;
|
|
27
|
-
|
|
28
|
+
writeQueue;
|
|
29
|
+
constructor(eventRepo, snapshotService, eventBus, writeQueue) {
|
|
28
30
|
this.eventRepo = eventRepo;
|
|
29
31
|
this.snapshotService = snapshotService;
|
|
30
32
|
this.eventBus = eventBus;
|
|
33
|
+
this.writeQueue = writeQueue;
|
|
34
|
+
this.writeQueue.setFlushHandler((items) => this.persistBatch(items));
|
|
31
35
|
}
|
|
32
36
|
async storeEvents(sessionId, events) {
|
|
33
|
-
|
|
37
|
+
return this.writeQueue.enqueue(sessionId, events);
|
|
38
|
+
}
|
|
39
|
+
async flushPendingWrites() {
|
|
40
|
+
await this.writeQueue.flushNow();
|
|
41
|
+
}
|
|
42
|
+
async persistBatch(items) {
|
|
43
|
+
const entities = items.map(({ sessionId, event }) => this.eventRepo.create({
|
|
34
44
|
sessionId,
|
|
35
45
|
eventType: event.type,
|
|
36
46
|
payload: event.payload,
|
|
@@ -43,14 +53,18 @@ let RecordingService = class RecordingService {
|
|
|
43
53
|
const snapshot = await this.snapshotService.createFromEvent(entity);
|
|
44
54
|
if (snapshot) {
|
|
45
55
|
this.eventBus.emit('recording.snapshot.created', {
|
|
46
|
-
sessionId,
|
|
56
|
+
sessionId: entity.sessionId,
|
|
47
57
|
snapshotId: snapshot.id,
|
|
48
58
|
});
|
|
49
59
|
}
|
|
50
60
|
}
|
|
51
61
|
}
|
|
52
|
-
const
|
|
53
|
-
|
|
62
|
+
const counts = {};
|
|
63
|
+
const sessionIds = Array.from(new Set(items.map((i) => i.sessionId)));
|
|
64
|
+
for (const sid of sessionIds) {
|
|
65
|
+
counts[sid] = await this.eventRepo.count({ where: { sessionId: sid } });
|
|
66
|
+
}
|
|
67
|
+
return counts;
|
|
54
68
|
}
|
|
55
69
|
async getRecording(sessionId) {
|
|
56
70
|
const events = await this.eventRepo.find({
|
|
@@ -119,6 +133,7 @@ exports.RecordingService = RecordingService = __decorate([
|
|
|
119
133
|
__param(0, (0, typeorm_1.InjectRepository)(recording_event_entity_1.RecordingEvent)),
|
|
120
134
|
__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
121
135
|
recording_snapshot_service_1.RecordingSnapshotService,
|
|
122
|
-
recording_event_bus_service_1.RecordingEventBus
|
|
136
|
+
recording_event_bus_service_1.RecordingEventBus,
|
|
137
|
+
recording_event_queue_service_1.RecordingEventQueue])
|
|
123
138
|
], RecordingService);
|
|
124
139
|
//# sourceMappingURL=recording.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.service.js","sourceRoot":"","sources":["../../src/recording/recording.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA+D;AAC/D,6CAAmD;AACnD,qCAAqC;AAErC,8EAAmE;AACnE,6EAAwE;AACxE,+EAAkE;AAClE,6EAAoE;AAG7D,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAGR;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"recording.service.js","sourceRoot":"","sources":["../../src/recording/recording.service.ts"],"names":[],"mappings":"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"}
|