Skip to content

Commit

Permalink
Review dev (#881)
Browse files Browse the repository at this point in the history
* Task namespace with new interface (#807)

* Task namespace with new interface

* taskworker include

* extend task from applyeventlisteners

* base namespace class to handle the listen method

* topic attach to event name

* type update

* remove older Task api

* stack test update for Task

* changeset include

* refactor and e2e test case

* rename task emitter

* listen function public explicitly

* index worker file

* utility function to prefix the event

* correct type of taskworker

* PubSub and Chat namespace with new interface (#814)

* Task namespace with new interface

* taskworker include

* extend task from applyeventlisteners

* base namespace class to handle the listen method

* topic attach to event name

* type update

* remove older Task api

* refactor and e2e test case

* utility function to prefix the event

* PubSub namespace with new interface

* new interface for the Chat API

* fix stack tests

* include e2e test for PubSub API

* e2e test case for Chat interface

* test disconnected client

* unit tests for Base classes

* Unit tests for the Task class

* fix TS for the Task class unit test

* unit tests for PubSub and Chat API classes

* include changeset

* Update packages/realtime-api/src/chat/workers/chatWorker.ts

Co-authored-by: Edoardo Gallo <[email protected]>

* Update packages/realtime-api/src/chat/workers/chatWorker.ts

Co-authored-by: Edoardo Gallo <[email protected]>

* Update packages/realtime-api/src/pubSub/workers/pubSubWorker.ts

Co-authored-by: Edoardo Gallo <[email protected]>

* fix typo

* type in changeset

---------

Co-authored-by: Edoardo Gallo <[email protected]>

* Voice API with new interface (#855)

* Task namespace with new interface

* taskworker include

* extend task from applyeventlisteners

* base namespace class to handle the listen method

* topic attach to event name

* type update

* remove older Task api

* refactor and e2e test case

* Voice API with new interface

* handle call.playback listeners with all the methods

* run workers through methods

* playback events with e2e test cases

* remove old call playback class

* fix test file names

* improve playback tests

* rename voice playback tests

* voice call record events with e2e test cases

* fix playback and record types

* implement call.prompt with playback

* test utility add

* e2e test cases for call prompt

* call collect with e2e test cases

* Call tap with e2e test cases

* Call Detect API with e2e test cases

* remove old voice detect test

* voice call connect api

* update voice pass test with new interface

* improve base and listener class for instances

* include unit test cases for call apis

* voice stack test update

* call connect implement with e2e test case

* enable ws logs for task test

* update voice playground with the new interface

* minimize race condition in playback and recording e2e test cases

* minimize race condition for collect and detect e2e

* improve call state events logic

* fix voice unit test

* enable ws logs for voice test

* fix call connect bug

* remove unused voice calling worker

* enable ws logs for voice call collect

* improve collect and detect e2e test cases

* include changeset

* Update packages/realtime-api/src/BaseNamespace.ts

Co-authored-by: Edoardo Gallo <[email protected]>

* Update packages/realtime-api/src/ListenSubscriber.ts

Co-authored-by: Edoardo Gallo <[email protected]>

* Update packages/realtime-api/src/task/Task.ts

Co-authored-by: Edoardo Gallo <[email protected]>

* add addToListenerMap method for consistency

* Revert "Update packages/realtime-api/src/ListenSubscriber.ts"

This reverts commit 69df536.

* update payload set and extends base calls with EventEmitter

* protect event emitter methods

* improve call collect test

* improve voice record e2e test

---------

Co-authored-by: Edoardo Gallo <[email protected]>

* Messaging namespace with new interface (#812)

* Task namespace with new interface

* taskworker include

* extend task from applyeventlisteners

* base namespace class to handle the listen method

* topic attach to event name

* type update

* remove older Task api

* refactor and e2e test case

* Voice API with new interface

* handle call.playback listeners with all the methods

* run workers through methods

* playback events with e2e test cases

* remove old call playback class

* fix test file names

* improve playback tests

* rename voice playback tests

* voice call record events with e2e test cases

* fix playback and record types

* implement call.prompt with playback

* e2e test cases for call prompt

* Call tap with e2e test cases

* Call Detect API with e2e test cases

* improve base and listener class for instances

* call connect implement with e2e test case

* improve call state events logic

* update payload set and extends base calls with EventEmitter

* protect event emitter methods

* Messaging namespace with new interface

* message worker to handle the events

* handle events through messaging api

* fix typescript types

* e2e test case for messagin api

* fix stack test

* unit test for messaging api

* include changeset

* promisify client disconnect

* fix unit test cases

* fix disconnect emitter

* fix unit test

* rebased with the dev

* fix base name space class

* connect payload fallback

* Update internal/playground-realtime-api/src/voice/index.ts

Co-authored-by: Edoardo Gallo <[email protected]>

---------

Co-authored-by: Edoardo Gallo <[email protected]>

* fix unit tests

* fix e2e test cases

* Decorated promise for Voice Call APIs (#880)

* Decorated promise for Voice Call APIs

* decorate recording promise

* unit tests for decorated playback and recording promises

* decorate prompt promise

* generic decorate promise function

* decorated promise for detect and tap

* decorated call collect api promise

* more unit test cases

* generic decorate promise function with unit tests

* e2e test cases update

* update voice playgrounds

* include changeset

* prevent methods to be run if the action has ended

* promisify action ended properties

* Realtime Video SDK with new interface (#886)

* Realtime Video SDK with new interface

* room session with the new interface

* remove auto subscribe consumer

* fix unit tests for video and room session

* room member instance

* unit tests for room session member

* fix stack test

* room session playback realtime-api instance

* room session recording realtime-api instance

* room session stream realtime-api instance

* explicit methods for the realtime-api

* fix build issue

* separate workers for playback, recording and stream

* video playground with the new interface

* decorated promise for room session playback api

* decorated promise for room session recording api

* decorated promise for room session stream api

* fix unit test cases

* unit tests for decorated promises

* update video play ground with decorated promise

* fix e2e test case for the video

* fix unit test

* do not unsubscribe events

* fix unit test

* include changeset

* streaming getter for room session

* rename types

* fix playwright e2e test cases

* fix call fabric relay application test

* include log level debug for task e2e test

* Fix e2e test cases with v4 SDK (#916)

* fail test if error code is null

* increase timeout limit for pubsub e2e test

* unsub chat event

* update node version in github actions

* debug enable for prompt tests

* remove logs from the SDK

* send digits once prompt starts

* end the call when caller ends the prompt

* fix action onStarted promise

* update voice speech test with v4 interface

* enable logs for chat test

* kill all node process before running tests

* run only realtime tests

* debug the ci

* child.stderr.write remove

* remove process.stderr in voiceSpeechCollect

* enable all the tests

* categorize tests by action type

* voice collect speech test with continuous true and partial results false

* voice collect speech test with continuous true and partial results true

* more simplified collect speech tests

* include changeset

* increase tap timeout and fix race conditions in voice.test.ts

* increase tap timeout

* update possible results for collect

* tap setTimeout update

* Release 2023-11-23 (#913)

* Expose Chat types from the JS SDK (#919)

* Expose Chat types from the JS SDK

* include changeset

* Release 2023-12-05 (#920)

---------

Co-authored-by: Edoardo Gallo <[email protected]>
  • Loading branch information
iAmmar7 and Edoardo Gallo authored Dec 5, 2023
1 parent 301acc9 commit b39b82f
Show file tree
Hide file tree
Showing 217 changed files with 16,692 additions and 7,005 deletions.
95 changes: 95 additions & 0 deletions .changeset/cuddly-carrots-bathe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
'@signalwire/realtime-api': major
'@signalwire/core': major
---

New interface for Voice APIs

The new interface contains a single SW client with Chat and PubSub namespaces
```javascript
import { SignalWire } from '@signalwire/realtime-api'

(async () => {
const client = await SignalWire({
host: process.env.HOST,
project: process.env.PROJECT,
token: process.env.TOKEN,
})

const unsubVoiceOffice = await client.voice.listen({
topics: ['office'],
onCallReceived: async (call) => {
try {
await call.answer()

const unsubCall = await call.listen({
onStateChanged: (call) => {},
onPlaybackUpdated: (playback) => {},
onRecordingStarted: (recording) => {},
onCollectInputStarted: (collect) => {},
onDetectStarted: (detect) => {},
onTapStarted: (tap) => {},
onPromptEnded: (prompt) => {}
// ... more call listeners can be attached here
})

// ...

await unsubCall()
} catch (error) {
console.error('Error answering inbound call', error)
}
}
})

const call = await client.voice.dialPhone({
to: process.env.VOICE_DIAL_TO_NUMBER as string,
from: process.env.VOICE_DIAL_FROM_NUMBER as string,
timeout: 30,
listen: {
onStateChanged: async (call) => {
// When call ends; unsubscribe all listeners and disconnect the client
if (call.state === 'ended') {
await unsubVoiceOffice()

await unsubVoiceHome()

await unsubPlay()

client.disconnect()
}
},
onPlaybackStarted: (playback) => {},
},
})

const unsubCall = await call.listen({
onPlaybackStarted: (playback) => {},
onPlaybackEnded: (playback) => {
// This will never run since we unsubscribe this listener before the playback stops
},
})

// Play an audio
const play = await call.playAudio({
url: 'https://cdn.signalwire.com/default-music/welcome.mp3',
listen: {
onStarted: async (playback) => {
await unsubCall()

await play.stop()
},
},
})

const unsubPlay = await play.listen({
onStarted: (playback) => {
// This will never run since this listener is attached after the call.play has started
},
onEnded: async (playback) => {
await call.hangup()
},
})

})
```
33 changes: 33 additions & 0 deletions .changeset/fluffy-birds-yawn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
'@signalwire/realtime-api': major
'@signalwire/core': major
---

- New interface for the realtime-api Video SDK.
- Listen function with _video_, _room_, _playback_, _recording_, and _stream_ objects.
- Listen param with `room.play`, `room.startRecording`, and `room.startStream` functions.
- Decorated promise for `room.play`, `room.startRecording`, and `room.startStream` functions.

```js
import { SignalWire } from '@signalwire/realtime-api'

const client = await SignalWire({ project, token })

const unsub = await client.video.listen({
onRoomStarted: async (roomSession) => {
console.log('room session started', roomSession)

await roomSession.listen({
onPlaybackStarted: (playback) => {
console.log('plyaback started', playback)
}
})

// Promise resolves when playback ends.
await roomSession.play({ url: "http://.....", listen: { onEnded: () => {} } })
},
onRoomEnded: (roomSession) => {
console.log('room session ended', roomSession)
}
})
```
76 changes: 76 additions & 0 deletions .changeset/hip-bobcats-hear.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
'@signalwire/realtime-api': major
'@signalwire/core': major
---

New interface for PubSub and Chat APIs

The new interface contains a single SW client with Chat and PubSub namespaces
```javascript
import { SignalWire } from '@signalwire/realtime-api'

(async () => {
const client = await SignalWire({
host: process.env.HOST,
project: process.env.PROJECT,
token: process.env.TOKEN,
})

// Attach pubSub listeners
const unsubHomePubSubListener = await client.pubSub.listen({
channels: ['home'],
onMessageReceived: (message) => {
console.log('Message received under the "home" channel', message)
},
})

// Publish on home channel
await client.pubSub.publish({
content: 'Hello There',
channel: 'home',
meta: {
fooId: 'randomValue',
},
})

// Attach chat listeners
const unsubOfficeChatListener = await client.chat.listen({
channels: ['office'],
onMessageReceived: (message) => {
console.log('Message received on "office" channel', message)
},
onMemberJoined: (member) => {
console.log('Member joined on "office" channel', member)
},
onMemberUpdated: (member) => {
console.log('Member updated on "office" channel', member)
},
onMemberLeft: (member) => {
console.log('Member left on "office" channel', member)
},
})

// Publish a chat message on the office channel
const pubRes = await client.chat.publish({
content: 'Hello There',
channel: 'office',
})

// Get channel messages
const messagesResult = await client.chat.getMessages({
channel: 'office',
})

// Get channel members
const getMembersResult = await client.chat.getMembers({ channel: 'office' })

// Unsubscribe pubSub listener
await unsubHomePubSubListener()

// Unsubscribe chat listener
await unsubOfficeChatListener()

// Disconnect the client
client.disconnect()
})();
```
5 changes: 5 additions & 0 deletions .changeset/lovely-tigers-breathe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@signalwire/realtime-api': patch
---

Fix `onStarted` function in decorated promises
42 changes: 42 additions & 0 deletions .changeset/three-mails-think.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
'@signalwire/realtime-api': major
'@signalwire/core': major
---

New interface for the Messaging API

The new interface contains a single SW client with Messaging namespace
```javascript
const client = await SignalWire({
host: process.env.HOST || 'relay.swire.io',
project: process.env.PROJECT as string,
token: process.env.TOKEN as string,
})

const unsubOfficeListener = await client.messaging.listen({
topics: ['office'],
onMessageReceived: (payload) => {
console.log('Message received under "office" context', payload)
},
onMessageUpdated: (payload) => {
console.log('Message updated under "office" context', payload)
},
})

try {
const response = await client.messaging.send({
from: process.env.FROM_NUMBER_MSG as string,
to: process.env.TO_NUMBER_MSG as string,
body: 'Hello World!',
context: 'office',
})

await client.messaging.send({
from: process.env.FROM_NUMBER_MSG as string,
to: process.env.TO_NUMBER_MSG as string,
body: 'Hello John Doe!',
})
} catch (error) {
console.log('>> send error', error)
}
```
50 changes: 50 additions & 0 deletions .changeset/tricky-ants-talk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
'@signalwire/realtime-api': major
'@signalwire/core': major
---

Decorated promise for the following APIs:
- call.play()
- call.playAudio()
- call.playSilence()
- call.playRingtone()
- call.playTTS()
- call.record()
- call.recordAudio()
- call.prompt()
- call.promptAudio()
- call.promptRingtone()
- call.promptTTS()
- call.tap()
- call.tapAudio()
- call.detect()
- call.amd()
- call.detectFax()
- call.detectDigit
- call.collect()

Playback example 1 - **Not resolving promise**
```js
const play = call.playAudio({ url: '...' })
await play.id
```

Playback example 2 - **Resolving promise when playback starts**
```js
const play = await call.playAudio({ url: '...' }).onStarted()
play.id
```

Playback example 3 - **Resolving promise when playback ends**
```js
const play = await call.playAudio({ url: '...' }).onEnded()
play.id
```

Playback example 4 - **Resolving promise when playback ends - Default behavior**
```js
const play = await call.playAudio({ url: '...' })
play.id
```

All the other APIs work in a similar way.
6 changes: 6 additions & 0 deletions .changeset/violet-boats-count.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@signalwire/realtime-api': major
'@signalwire/core': major
---

Task namespace with new interface
2 changes: 1 addition & 1 deletion .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Unit and stack tests
name: Tests

on:
push:
Expand Down
Loading

0 comments on commit b39b82f

Please sign in to comment.