@whereby.com/assistant-sdk 0.0.0-canary-20250916072551 → 0.0.0-canary-20250916140846

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/index.cjs CHANGED
@@ -33,6 +33,8 @@ var dotenv__namespace = /*#__PURE__*/_interopNamespaceDefault(dotenv);
33
33
  const TRIGGER_EVENT_SUCCESS = "trigger_event_success";
34
34
 
35
35
  const AUDIO_STREAM_READY = "AUDIO_STREAM_READY";
36
+ const ASSISTANT_JOINED_ROOM = "ASSISTANT_JOINED_ROOM";
37
+ const ASSISTANT_LEFT_ROOM = "ASSISTANT_LEFT_ROOM";
36
38
 
37
39
  /******************************************************************************
38
40
  Copyright (c) Microsoft Corporation.
@@ -516,6 +518,15 @@ class Assistant extends EventEmitter {
516
518
  this.mediaStream = null;
517
519
  this.audioSource = null;
518
520
  this.combinedStream = null;
521
+ this.roomUrl = null;
522
+ this.handleConnectionStatusChange = (status) => {
523
+ if (status === "connected") {
524
+ this.emit(ASSISTANT_JOINED_ROOM, { roomUrl: this.roomUrl || "" });
525
+ }
526
+ if (["left", "kicked"].includes(status)) {
527
+ this.emit(ASSISTANT_LEFT_ROOM, { roomUrl: this.roomUrl || "" });
528
+ }
529
+ };
519
530
  this.assistantKey = assistantKey;
520
531
  this.client = new core.WherebyClient();
521
532
  this.roomConnection = this.client.getRoomConnection();
@@ -540,6 +551,7 @@ class Assistant extends EventEmitter {
540
551
  const audioMixer = new AudioMixer(handleStreamReady);
541
552
  this.combinedStream = audioMixer.getCombinedAudioStream();
542
553
  this.roomConnection.subscribeToRemoteParticipants(audioMixer.handleRemoteParticipants.bind(audioMixer));
554
+ this.roomConnection.subscribeToConnectionStatus(this.handleConnectionStatusChange);
543
555
  }
544
556
  }
545
557
  joinRoom(roomUrl) {
@@ -547,6 +559,7 @@ class Assistant extends EventEmitter {
547
559
  if (this.mediaStream) {
548
560
  yield this.localMedia.startMedia(this.mediaStream);
549
561
  }
562
+ this.roomUrl = roomUrl;
550
563
  this.roomConnection.initialize({
551
564
  localMediaOptions: {
552
565
  audio: false,
@@ -657,10 +670,28 @@ const webhookRouter = (webhookTriggers, emitter) => {
657
670
  res.end();
658
671
  });
659
672
  router.post("/", jsonParser, (req, res) => {
660
- var _a;
673
+ var _a, _b, _c, _d, _e, _f, _g, _h;
661
674
  assert(req.body, "message body is required");
662
675
  assert("type" in req.body, "webhook type is required");
663
- const shouldTriggerOnReceivedWebhook = (_a = webhookTriggers[req.body.type]) === null || _a === void 0 ? void 0 : _a.call(webhookTriggers, req.body);
676
+ let shouldTriggerOnReceivedWebhook = false;
677
+ switch (req.body.type) {
678
+ case "room.client.joined":
679
+ shouldTriggerOnReceivedWebhook =
680
+ (_b = (_a = webhookTriggers["room.client.joined"]) === null || _a === void 0 ? void 0 : _a.call(webhookTriggers, req.body)) !== null && _b !== void 0 ? _b : false;
681
+ break;
682
+ case "room.client.left":
683
+ shouldTriggerOnReceivedWebhook =
684
+ (_d = (_c = webhookTriggers["room.client.left"]) === null || _c === void 0 ? void 0 : _c.call(webhookTriggers, req.body)) !== null && _d !== void 0 ? _d : false;
685
+ break;
686
+ case "room.session.started":
687
+ shouldTriggerOnReceivedWebhook =
688
+ (_f = (_e = webhookTriggers["room.session.started"]) === null || _e === void 0 ? void 0 : _e.call(webhookTriggers, req.body)) !== null && _f !== void 0 ? _f : false;
689
+ break;
690
+ case "room.session.ended":
691
+ shouldTriggerOnReceivedWebhook =
692
+ (_h = (_g = webhookTriggers["room.session.ended"]) === null || _g === void 0 ? void 0 : _g.call(webhookTriggers, req.body)) !== null && _h !== void 0 ? _h : false;
693
+ break;
694
+ }
664
695
  if (shouldTriggerOnReceivedWebhook) {
665
696
  const roomUrl = buildRoomUrl(req.body.data.roomName, req.body.data.subdomain);
666
697
  emitter.emit(TRIGGER_EVENT_SUCCESS, { roomUrl, triggerWebhook: req.body });
@@ -689,6 +720,8 @@ class Trigger extends EventEmitter.EventEmitter {
689
720
  }
690
721
  }
691
722
 
723
+ exports.ASSISTANT_JOINED_ROOM = ASSISTANT_JOINED_ROOM;
724
+ exports.ASSISTANT_LEFT_ROOM = ASSISTANT_LEFT_ROOM;
692
725
  exports.AUDIO_STREAM_READY = AUDIO_STREAM_READY;
693
726
  exports.Assistant = Assistant;
694
727
  exports.AudioSink = AudioSink;
package/dist/index.d.cts CHANGED
@@ -82,17 +82,25 @@ type TriggerEvents = {
82
82
  };
83
83
  type WherebyWebhookType = WherebyWebhookRoomClientJoined | WherebyWebhookRoomClientLeft | WherebyWebhookRoomSessionStarted | WherebyWebhookRoomSessionEnded;
84
84
  type WherebyWebhookTriggerTypes = {
85
- "room.client.joined": WherebyWebhookBase;
86
- "room.client.left": WherebyWebhookBase;
85
+ "room.client.joined": WherebyWebhookRoomClientJoined;
86
+ "room.client.left": WherebyWebhookRoomClientLeft;
87
87
  "room.session.started": WherebyWebhookRoomSessionStarted;
88
- "room.session.ended": WherebyWebhookBase;
88
+ "room.session.ended": WherebyWebhookRoomSessionEnded;
89
89
  };
90
90
  type WherebyWebhookTriggers = Partial<{
91
91
  [Type in keyof WherebyWebhookTriggerTypes]: (data: WherebyWebhookTriggerTypes[Type]) => boolean;
92
92
  }>;
93
93
 
94
94
  declare const AUDIO_STREAM_READY = "AUDIO_STREAM_READY";
95
+ declare const ASSISTANT_JOINED_ROOM = "ASSISTANT_JOINED_ROOM";
96
+ declare const ASSISTANT_LEFT_ROOM = "ASSISTANT_LEFT_ROOM";
95
97
  type AssistantEvents = {
98
+ [ASSISTANT_JOINED_ROOM]: [{
99
+ roomUrl: string;
100
+ }];
101
+ [ASSISTANT_LEFT_ROOM]: [{
102
+ roomUrl: string;
103
+ }];
96
104
  [AUDIO_STREAM_READY]: [{
97
105
  stream: MediaStream;
98
106
  track: MediaStreamTrack;
@@ -112,7 +120,9 @@ declare class Assistant extends EventEmitter<AssistantEvents> {
112
120
  private mediaStream;
113
121
  private audioSource;
114
122
  private combinedStream;
123
+ private roomUrl;
115
124
  constructor({ assistantKey, startCombinedAudioStream, startLocalMedia }: AssistantOptions);
125
+ private handleConnectionStatusChange;
116
126
  joinRoom(roomUrl: string): Promise<void>;
117
127
  startLocalMedia(): void;
118
128
  getLocalMediaStream(): MediaStream | null;
@@ -159,4 +169,5 @@ declare class AudioSink extends wrtc__default.nonstandard.RTCAudioSink {
159
169
  }) => void): () => void;
160
170
  }
161
171
 
162
- export { AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
172
+ export { ASSISTANT_JOINED_ROOM, ASSISTANT_LEFT_ROOM, AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
173
+ export type { AssistantEvents };
package/dist/index.d.mts CHANGED
@@ -82,17 +82,25 @@ type TriggerEvents = {
82
82
  };
83
83
  type WherebyWebhookType = WherebyWebhookRoomClientJoined | WherebyWebhookRoomClientLeft | WherebyWebhookRoomSessionStarted | WherebyWebhookRoomSessionEnded;
84
84
  type WherebyWebhookTriggerTypes = {
85
- "room.client.joined": WherebyWebhookBase;
86
- "room.client.left": WherebyWebhookBase;
85
+ "room.client.joined": WherebyWebhookRoomClientJoined;
86
+ "room.client.left": WherebyWebhookRoomClientLeft;
87
87
  "room.session.started": WherebyWebhookRoomSessionStarted;
88
- "room.session.ended": WherebyWebhookBase;
88
+ "room.session.ended": WherebyWebhookRoomSessionEnded;
89
89
  };
90
90
  type WherebyWebhookTriggers = Partial<{
91
91
  [Type in keyof WherebyWebhookTriggerTypes]: (data: WherebyWebhookTriggerTypes[Type]) => boolean;
92
92
  }>;
93
93
 
94
94
  declare const AUDIO_STREAM_READY = "AUDIO_STREAM_READY";
95
+ declare const ASSISTANT_JOINED_ROOM = "ASSISTANT_JOINED_ROOM";
96
+ declare const ASSISTANT_LEFT_ROOM = "ASSISTANT_LEFT_ROOM";
95
97
  type AssistantEvents = {
98
+ [ASSISTANT_JOINED_ROOM]: [{
99
+ roomUrl: string;
100
+ }];
101
+ [ASSISTANT_LEFT_ROOM]: [{
102
+ roomUrl: string;
103
+ }];
96
104
  [AUDIO_STREAM_READY]: [{
97
105
  stream: MediaStream;
98
106
  track: MediaStreamTrack;
@@ -112,7 +120,9 @@ declare class Assistant extends EventEmitter<AssistantEvents> {
112
120
  private mediaStream;
113
121
  private audioSource;
114
122
  private combinedStream;
123
+ private roomUrl;
115
124
  constructor({ assistantKey, startCombinedAudioStream, startLocalMedia }: AssistantOptions);
125
+ private handleConnectionStatusChange;
116
126
  joinRoom(roomUrl: string): Promise<void>;
117
127
  startLocalMedia(): void;
118
128
  getLocalMediaStream(): MediaStream | null;
@@ -159,4 +169,5 @@ declare class AudioSink extends wrtc__default.nonstandard.RTCAudioSink {
159
169
  }) => void): () => void;
160
170
  }
161
171
 
162
- export { AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
172
+ export { ASSISTANT_JOINED_ROOM, ASSISTANT_LEFT_ROOM, AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
173
+ export type { AssistantEvents };
package/dist/index.d.ts CHANGED
@@ -82,17 +82,25 @@ type TriggerEvents = {
82
82
  };
83
83
  type WherebyWebhookType = WherebyWebhookRoomClientJoined | WherebyWebhookRoomClientLeft | WherebyWebhookRoomSessionStarted | WherebyWebhookRoomSessionEnded;
84
84
  type WherebyWebhookTriggerTypes = {
85
- "room.client.joined": WherebyWebhookBase;
86
- "room.client.left": WherebyWebhookBase;
85
+ "room.client.joined": WherebyWebhookRoomClientJoined;
86
+ "room.client.left": WherebyWebhookRoomClientLeft;
87
87
  "room.session.started": WherebyWebhookRoomSessionStarted;
88
- "room.session.ended": WherebyWebhookBase;
88
+ "room.session.ended": WherebyWebhookRoomSessionEnded;
89
89
  };
90
90
  type WherebyWebhookTriggers = Partial<{
91
91
  [Type in keyof WherebyWebhookTriggerTypes]: (data: WherebyWebhookTriggerTypes[Type]) => boolean;
92
92
  }>;
93
93
 
94
94
  declare const AUDIO_STREAM_READY = "AUDIO_STREAM_READY";
95
+ declare const ASSISTANT_JOINED_ROOM = "ASSISTANT_JOINED_ROOM";
96
+ declare const ASSISTANT_LEFT_ROOM = "ASSISTANT_LEFT_ROOM";
95
97
  type AssistantEvents = {
98
+ [ASSISTANT_JOINED_ROOM]: [{
99
+ roomUrl: string;
100
+ }];
101
+ [ASSISTANT_LEFT_ROOM]: [{
102
+ roomUrl: string;
103
+ }];
96
104
  [AUDIO_STREAM_READY]: [{
97
105
  stream: MediaStream;
98
106
  track: MediaStreamTrack;
@@ -112,7 +120,9 @@ declare class Assistant extends EventEmitter<AssistantEvents> {
112
120
  private mediaStream;
113
121
  private audioSource;
114
122
  private combinedStream;
123
+ private roomUrl;
115
124
  constructor({ assistantKey, startCombinedAudioStream, startLocalMedia }: AssistantOptions);
125
+ private handleConnectionStatusChange;
116
126
  joinRoom(roomUrl: string): Promise<void>;
117
127
  startLocalMedia(): void;
118
128
  getLocalMediaStream(): MediaStream | null;
@@ -159,4 +169,5 @@ declare class AudioSink extends wrtc__default.nonstandard.RTCAudioSink {
159
169
  }) => void): () => void;
160
170
  }
161
171
 
162
- export { AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
172
+ export { ASSISTANT_JOINED_ROOM, ASSISTANT_LEFT_ROOM, AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
173
+ export type { AssistantEvents };
package/dist/index.mjs CHANGED
@@ -12,6 +12,8 @@ import * as dotenv from 'dotenv';
12
12
  const TRIGGER_EVENT_SUCCESS = "trigger_event_success";
13
13
 
14
14
  const AUDIO_STREAM_READY = "AUDIO_STREAM_READY";
15
+ const ASSISTANT_JOINED_ROOM = "ASSISTANT_JOINED_ROOM";
16
+ const ASSISTANT_LEFT_ROOM = "ASSISTANT_LEFT_ROOM";
15
17
 
16
18
  /******************************************************************************
17
19
  Copyright (c) Microsoft Corporation.
@@ -495,6 +497,15 @@ class Assistant extends EventEmitter$1 {
495
497
  this.mediaStream = null;
496
498
  this.audioSource = null;
497
499
  this.combinedStream = null;
500
+ this.roomUrl = null;
501
+ this.handleConnectionStatusChange = (status) => {
502
+ if (status === "connected") {
503
+ this.emit(ASSISTANT_JOINED_ROOM, { roomUrl: this.roomUrl || "" });
504
+ }
505
+ if (["left", "kicked"].includes(status)) {
506
+ this.emit(ASSISTANT_LEFT_ROOM, { roomUrl: this.roomUrl || "" });
507
+ }
508
+ };
498
509
  this.assistantKey = assistantKey;
499
510
  this.client = new WherebyClient();
500
511
  this.roomConnection = this.client.getRoomConnection();
@@ -519,6 +530,7 @@ class Assistant extends EventEmitter$1 {
519
530
  const audioMixer = new AudioMixer(handleStreamReady);
520
531
  this.combinedStream = audioMixer.getCombinedAudioStream();
521
532
  this.roomConnection.subscribeToRemoteParticipants(audioMixer.handleRemoteParticipants.bind(audioMixer));
533
+ this.roomConnection.subscribeToConnectionStatus(this.handleConnectionStatusChange);
522
534
  }
523
535
  }
524
536
  joinRoom(roomUrl) {
@@ -526,6 +538,7 @@ class Assistant extends EventEmitter$1 {
526
538
  if (this.mediaStream) {
527
539
  yield this.localMedia.startMedia(this.mediaStream);
528
540
  }
541
+ this.roomUrl = roomUrl;
529
542
  this.roomConnection.initialize({
530
543
  localMediaOptions: {
531
544
  audio: false,
@@ -636,10 +649,28 @@ const webhookRouter = (webhookTriggers, emitter) => {
636
649
  res.end();
637
650
  });
638
651
  router.post("/", jsonParser, (req, res) => {
639
- var _a;
652
+ var _a, _b, _c, _d, _e, _f, _g, _h;
640
653
  assert(req.body, "message body is required");
641
654
  assert("type" in req.body, "webhook type is required");
642
- const shouldTriggerOnReceivedWebhook = (_a = webhookTriggers[req.body.type]) === null || _a === void 0 ? void 0 : _a.call(webhookTriggers, req.body);
655
+ let shouldTriggerOnReceivedWebhook = false;
656
+ switch (req.body.type) {
657
+ case "room.client.joined":
658
+ shouldTriggerOnReceivedWebhook =
659
+ (_b = (_a = webhookTriggers["room.client.joined"]) === null || _a === void 0 ? void 0 : _a.call(webhookTriggers, req.body)) !== null && _b !== void 0 ? _b : false;
660
+ break;
661
+ case "room.client.left":
662
+ shouldTriggerOnReceivedWebhook =
663
+ (_d = (_c = webhookTriggers["room.client.left"]) === null || _c === void 0 ? void 0 : _c.call(webhookTriggers, req.body)) !== null && _d !== void 0 ? _d : false;
664
+ break;
665
+ case "room.session.started":
666
+ shouldTriggerOnReceivedWebhook =
667
+ (_f = (_e = webhookTriggers["room.session.started"]) === null || _e === void 0 ? void 0 : _e.call(webhookTriggers, req.body)) !== null && _f !== void 0 ? _f : false;
668
+ break;
669
+ case "room.session.ended":
670
+ shouldTriggerOnReceivedWebhook =
671
+ (_h = (_g = webhookTriggers["room.session.ended"]) === null || _g === void 0 ? void 0 : _g.call(webhookTriggers, req.body)) !== null && _h !== void 0 ? _h : false;
672
+ break;
673
+ }
643
674
  if (shouldTriggerOnReceivedWebhook) {
644
675
  const roomUrl = buildRoomUrl(req.body.data.roomName, req.body.data.subdomain);
645
676
  emitter.emit(TRIGGER_EVENT_SUCCESS, { roomUrl, triggerWebhook: req.body });
@@ -668,4 +699,4 @@ class Trigger extends EventEmitter {
668
699
  }
669
700
  }
670
701
 
671
- export { AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
702
+ export { ASSISTANT_JOINED_ROOM, ASSISTANT_LEFT_ROOM, AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
@@ -12,6 +12,8 @@ import * as dotenv from 'dotenv';
12
12
  const TRIGGER_EVENT_SUCCESS = "trigger_event_success";
13
13
 
14
14
  const AUDIO_STREAM_READY = "AUDIO_STREAM_READY";
15
+ const ASSISTANT_JOINED_ROOM = "ASSISTANT_JOINED_ROOM";
16
+ const ASSISTANT_LEFT_ROOM = "ASSISTANT_LEFT_ROOM";
15
17
 
16
18
  /******************************************************************************
17
19
  Copyright (c) Microsoft Corporation.
@@ -495,6 +497,15 @@ class Assistant extends EventEmitter$1 {
495
497
  this.mediaStream = null;
496
498
  this.audioSource = null;
497
499
  this.combinedStream = null;
500
+ this.roomUrl = null;
501
+ this.handleConnectionStatusChange = (status) => {
502
+ if (status === "connected") {
503
+ this.emit(ASSISTANT_JOINED_ROOM, { roomUrl: this.roomUrl || "" });
504
+ }
505
+ if (["left", "kicked"].includes(status)) {
506
+ this.emit(ASSISTANT_LEFT_ROOM, { roomUrl: this.roomUrl || "" });
507
+ }
508
+ };
498
509
  this.assistantKey = assistantKey;
499
510
  this.client = new WherebyClient();
500
511
  this.roomConnection = this.client.getRoomConnection();
@@ -519,6 +530,7 @@ class Assistant extends EventEmitter$1 {
519
530
  const audioMixer = new AudioMixer(handleStreamReady);
520
531
  this.combinedStream = audioMixer.getCombinedAudioStream();
521
532
  this.roomConnection.subscribeToRemoteParticipants(audioMixer.handleRemoteParticipants.bind(audioMixer));
533
+ this.roomConnection.subscribeToConnectionStatus(this.handleConnectionStatusChange);
522
534
  }
523
535
  }
524
536
  joinRoom(roomUrl) {
@@ -526,6 +538,7 @@ class Assistant extends EventEmitter$1 {
526
538
  if (this.mediaStream) {
527
539
  yield this.localMedia.startMedia(this.mediaStream);
528
540
  }
541
+ this.roomUrl = roomUrl;
529
542
  this.roomConnection.initialize({
530
543
  localMediaOptions: {
531
544
  audio: false,
@@ -636,10 +649,28 @@ const webhookRouter = (webhookTriggers, emitter) => {
636
649
  res.end();
637
650
  });
638
651
  router.post("/", jsonParser, (req, res) => {
639
- var _a;
652
+ var _a, _b, _c, _d, _e, _f, _g, _h;
640
653
  assert(req.body, "message body is required");
641
654
  assert("type" in req.body, "webhook type is required");
642
- const shouldTriggerOnReceivedWebhook = (_a = webhookTriggers[req.body.type]) === null || _a === void 0 ? void 0 : _a.call(webhookTriggers, req.body);
655
+ let shouldTriggerOnReceivedWebhook = false;
656
+ switch (req.body.type) {
657
+ case "room.client.joined":
658
+ shouldTriggerOnReceivedWebhook =
659
+ (_b = (_a = webhookTriggers["room.client.joined"]) === null || _a === void 0 ? void 0 : _a.call(webhookTriggers, req.body)) !== null && _b !== void 0 ? _b : false;
660
+ break;
661
+ case "room.client.left":
662
+ shouldTriggerOnReceivedWebhook =
663
+ (_d = (_c = webhookTriggers["room.client.left"]) === null || _c === void 0 ? void 0 : _c.call(webhookTriggers, req.body)) !== null && _d !== void 0 ? _d : false;
664
+ break;
665
+ case "room.session.started":
666
+ shouldTriggerOnReceivedWebhook =
667
+ (_f = (_e = webhookTriggers["room.session.started"]) === null || _e === void 0 ? void 0 : _e.call(webhookTriggers, req.body)) !== null && _f !== void 0 ? _f : false;
668
+ break;
669
+ case "room.session.ended":
670
+ shouldTriggerOnReceivedWebhook =
671
+ (_h = (_g = webhookTriggers["room.session.ended"]) === null || _g === void 0 ? void 0 : _g.call(webhookTriggers, req.body)) !== null && _h !== void 0 ? _h : false;
672
+ break;
673
+ }
643
674
  if (shouldTriggerOnReceivedWebhook) {
644
675
  const roomUrl = buildRoomUrl(req.body.data.roomName, req.body.data.subdomain);
645
676
  emitter.emit(TRIGGER_EVENT_SUCCESS, { roomUrl, triggerWebhook: req.body });
@@ -668,4 +699,4 @@ class Trigger extends EventEmitter {
668
699
  }
669
700
  }
670
701
 
671
- export { AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
702
+ export { ASSISTANT_JOINED_ROOM, ASSISTANT_LEFT_ROOM, AUDIO_STREAM_READY, Assistant, AudioSink, AudioSource, TRIGGER_EVENT_SUCCESS, Trigger };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@whereby.com/assistant-sdk",
3
3
  "description": "Assistant SDK for whereby.com",
4
4
  "author": "Whereby AS",
5
- "version": "0.0.0-canary-20250916072551",
5
+ "version": "0.0.0-canary-20250916140846",
6
6
  "license": "MIT",
7
7
  "files": [
8
8
  "dist",
@@ -47,8 +47,6 @@
47
47
  }
48
48
  },
49
49
  "devDependencies": {
50
- "body-parser": "2.2.0",
51
- "express": "5.1.0",
52
50
  "eslint": "^9.29.0",
53
51
  "prettier": "^3.5.3",
54
52
  "typescript": "^5.8.3",
@@ -60,10 +58,13 @@
60
58
  },
61
59
  "dependencies": {
62
60
  "@roamhq/wrtc": "github:whereby/node-webrtc#patch/rtc_audio_source",
61
+ "@types/web": "^0.0.267",
62
+ "body-parser": "2.2.0",
63
63
  "dotenv": "^16.4.5",
64
+ "express": "5.1.0",
64
65
  "uuid": "^11.0.3",
65
66
  "ws": "^8.18.0",
66
- "@whereby.com/core": "0.0.0-canary-20250916072551"
67
+ "@whereby.com/core": "0.0.0-canary-20250916140846"
67
68
  },
68
69
  "prettier": "@whereby.com/prettier-config",
69
70
  "scripts": {