Skip to content

Commit 886f009

Browse files
[IMP] wip
1 parent e855f75 commit 886f009

File tree

2 files changed

+38
-21
lines changed

2 files changed

+38
-21
lines changed

src/models/recorder.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ export class Recorder extends EventEmitter {
2525

2626
async start() {
2727
if (this.state === RECORDER_STATE.STOPPED) {
28-
const { path, sealFolder } = getFolder();
29-
this.destPath = path;
30-
this.once("stopped", sealFolder);
28+
const folder = getFolder();
29+
this.destPath = folder.path;
30+
this.once("stopped", ({ name }) => {
31+
folder.seal(name);
32+
});
3133
this.state = RECORDER_STATE.STARTED;
3234
logger.trace("TO IMPLEMENT");
3335
// TODO ffmpeg instance creation for recording to destPath with proper name, start, build timestamps object
@@ -39,7 +41,7 @@ export class Recorder extends EventEmitter {
3941
async stop() {
4042
if (this.state === RECORDER_STATE.STARTED) {
4143
logger.trace("TO IMPLEMENT");
42-
this.emit("stopped");
44+
this.emit("stopped", { name: "test" });
4345
// TODO ffmpeg instance stop, cleanup,
4446
// only resolve promise and switch state when completely ready to start a new recording.
4547
this.state = RECORDER_STATE.STOPPED;

src/services/resources.ts

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ import { PortLimitReachedError } from "#src/utils/errors.ts";
77
import os from "node:os";
88

99
const availablePorts: Set<number> = new Set();
10+
let unique = 1;
1011

1112
export interface RtcWorker extends mediasoup.types.Worker {
1213
appData: {
1314
webRtcServer?: mediasoup.types.WebRtcServer;
1415
};
1516
}
1617

18+
// TODO maybe write some docstring, file used to manage resources such as folders, workers, ports
19+
1720
const logger = new Logger("RESOURCES");
1821
const workers = new Set<RtcWorker>();
1922
const tempDir = os.tmpdir() + "/ongoing_recordings";
@@ -86,27 +89,39 @@ export async function getWorker(): Promise<mediasoup.types.Worker> {
8689
return leastUsedWorker;
8790
}
8891

89-
export function getFolder() {
90-
const tempName = `${Date.now()}`;
91-
const path = `${tempDir}/${tempName}`;
92-
// TODO we may want to track these temp folders to remove them periodically (although os.tempDir() has already such a mechanism)
93-
return {
94-
path,
95-
sealFolder: (name: string = tempName) => {
96-
// TODO move whatever is in path to
97-
console.log(`${config.recording.directory}/${name}`);
98-
},
92+
class Folder {
93+
path: string;
94+
95+
constructor(path: string) {
96+
this.path = path;
97+
}
98+
99+
seal(name: string) {
100+
console.trace(`TO IMPLEMENT, MOVING TO ${config.recording.directory}/${name}`);
99101
}
100102
}
101103

102-
export function getPort(): number {
103-
const port = availablePorts.values().next().value;
104-
if (!port) {
105-
throw new PortLimitReachedError();
104+
export function getFolder(): Folder {
105+
return new Folder(`${tempDir}/${Date.now()}-${unique++}`);
106+
}
107+
108+
class DynamicPort {
109+
number: number;
110+
111+
constructor(number: number) {
112+
availablePorts.delete(number);
113+
this.number = number;
114+
}
115+
116+
release() {
117+
availablePorts.add(this.number);
106118
}
107-
return port;
108119
}
109120

110-
export function releasePort(port: number) {
111-
availablePorts.add(port);
121+
export function getPort(): DynamicPort {
122+
const number = availablePorts.values().next().value;
123+
if (!number) {
124+
throw new PortLimitReachedError();
125+
}
126+
return new DynamicPort(number);
112127
}

0 commit comments

Comments
 (0)