diff --git a/.changeset/slow-hounds-fail.md b/.changeset/slow-hounds-fail.md new file mode 100644 index 00000000..5bc8cebc --- /dev/null +++ b/.changeset/slow-hounds-fail.md @@ -0,0 +1,5 @@ +--- +'@livekit/rtc-node': patch +--- + +add close method to AudioSource and VideoSource diff --git a/examples/agent-dispatch/index.ts b/examples/agent-dispatch/index.ts index 93998aeb..4f403c24 100644 --- a/examples/agent-dispatch/index.ts +++ b/examples/agent-dispatch/index.ts @@ -21,7 +21,7 @@ async function createExplicitDispatch() { }); console.log('created dispatch', dispatch); - const dispatches = await agentDispatchClient.listDispatches(roomName); + const dispatches = await agentDispatchClient.listDispatch(roomName); console.log(`there are ${dispatches.length} dispatches in ${roomName}`); } diff --git a/examples/agent-dispatch/package.json b/examples/agent-dispatch/package.json index 3d187c5b..4371e8ad 100644 --- a/examples/agent-dispatch/package.json +++ b/examples/agent-dispatch/package.json @@ -14,7 +14,7 @@ "dependencies": { "dotenv": "^16.4.5", "livekit-server-sdk": "workspace:*", - "@livekit/protocol": "^1.28.0" + "@livekit/protocol": "^1.30.0" }, "devDependencies": { "@types/node": "^20.10.4", diff --git a/examples/publish-wav/index.ts b/examples/publish-wav/index.ts index 56722969..8c57dc5a 100644 --- a/examples/publish-wav/index.ts +++ b/examples/publish-wav/index.ts @@ -63,6 +63,10 @@ while (written < dataSize) { written += frameSize; } await source.waitForPlayout(); +// release resources allocated for audio publishing +await source.close(); await room.disconnect(); + +// disposes all resources, only use if no more sessions are expected await dispose(); diff --git a/examples/receive-audio/index.ts b/examples/receive-audio/index.ts index 07dbf2c5..4ddf4b0d 100644 --- a/examples/receive-audio/index.ts +++ b/examples/receive-audio/index.ts @@ -77,13 +77,13 @@ const room = new Room(); let trackToProcess: string | null = null; let writer: fs.WriteStream | null = null; -room.on(RoomEvent.TrackSubscribed, (track, publication, participant) => { +room.on(RoomEvent.TrackSubscribed, async (track, publication, participant) => { console.log('subscribed to track', track.sid, publication, participant.identity); if (track.kind === TrackKind.KIND_AUDIO) { const stream = new AudioStream(track); trackToProcess = track.sid; - stream.on('frameReceived', (ev) => { + for await (const frame of stream) { if (!trackToProcess) { return; } @@ -92,14 +92,14 @@ room.on(RoomEvent.TrackSubscribed, (track, publication, participant) => { // create file on first frame // also guard when track is unsubscribed writer = fs.createWriteStream('output.wav'); - writeWavHeader(writer, ev.frame); + writeWavHeader(writer, frame); } if (writer) { - const buf = Buffer.from(ev.frame.data.buffer); + const buf = Buffer.from(frame.data.buffer); writer.write(buf); } - }); + } } }); diff --git a/packages/livekit-rtc/src/audio_source.ts b/packages/livekit-rtc/src/audio_source.ts index 4975d8e4..a1d476c3 100644 --- a/packages/livekit-rtc/src/audio_source.ts +++ b/packages/livekit-rtc/src/audio_source.ts @@ -134,4 +134,8 @@ export class AudioSource { throw new Error(cb.error); } } + + async close() { + this.ffiHandle.dispose(); + } } diff --git a/packages/livekit-rtc/src/video_source.ts b/packages/livekit-rtc/src/video_source.ts index 9ac4170d..ffffc685 100644 --- a/packages/livekit-rtc/src/video_source.ts +++ b/packages/livekit-rtc/src/video_source.ts @@ -64,4 +64,8 @@ export class VideoSource { message: { case: 'captureVideoFrame', value: req }, }); } + + async close() { + this.ffiHandle.dispose(); + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f4891c5f..f5e09ce7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 2.3.3(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-n: specifier: ^17.9.0 version: 17.15.1(eslint@8.57.1) @@ -75,8 +75,8 @@ importers: examples/agent-dispatch: dependencies: '@livekit/protocol': - specifier: ^1.28.0 - version: 1.28.0 + specifier: ^1.30.0 + version: 1.30.0 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -956,9 +956,6 @@ packages: '@livekit/mutex@1.1.0': resolution: {integrity: sha512-XRLG+z/0uoyDioupjUiskjI06Y51U/IXVPJn7qJ+R3J75XX01irYVBM9MpxeJahpVoe9QhU4moIEolX+HO9U9g==} - '@livekit/protocol@1.28.0': - resolution: {integrity: sha512-j7ifbZ1TVfrLDQEuyl4M5rOAS8mRNhpgGoSKE4z03gc012hUHThx227bD1M1BfFPTqNFHzpaGCu/HYE/l09dHw==} - '@livekit/protocol@1.30.0': resolution: {integrity: sha512-SDI9ShVKj8N3oOSinr8inaxD3FXgmgoJlqN35uU/Yx1sdoDeQbzAuBFox7bYjM+VhnZ1V22ivIDjAsKr00H+XQ==} @@ -4177,10 +4174,6 @@ snapshots: '@livekit/mutex@1.1.0': {} - '@livekit/protocol@1.28.0': - dependencies: - '@bufbuild/protobuf': 1.10.0 - '@livekit/protocol@1.30.0': dependencies: '@bufbuild/protobuf': 1.10.0 @@ -5305,8 +5298,8 @@ snapshots: '@typescript-eslint/parser': 8.18.2(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.3(eslint@8.57.1) eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) @@ -5324,7 +5317,7 @@ snapshots: eslint-config-standard@17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint-plugin-n@17.15.1(eslint@8.57.1))(eslint-plugin-promise@7.2.1(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-n: 17.15.1(eslint@8.57.1) eslint-plugin-promise: 7.2.1(eslint@8.57.1) @@ -5341,7 +5334,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 @@ -5353,18 +5346,18 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.18.2(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -5375,7 +5368,7 @@ snapshots: eslint: 8.57.1 eslint-compat-utils: 0.5.1(eslint@8.57.1) - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -5386,7 +5379,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3