[asterisk-app-dev] Originate/Channel Creation as a two step process

Paul Belanger paul.belanger at polybeacon.com
Wed Dec 4 14:39:18 CST 2013


On Wed, Dec 4, 2013 at 3:27 PM, Matthew Jordan <mjordan at digium.com> wrote:
>
>
>
> On Wed, Dec 4, 2013 at 2:24 PM, Paul Belanger <paul.belanger at polybeacon.com>
> wrote:
>>
>> On Wed, Dec 4, 2013 at 3:16 PM, Matthew Jordan <mjordan at digium.com> wrote:
>> >
>> > On Wed, Dec 4, 2013 at 2:09 PM, Paul Belanger
>> > <paul.belanger at polybeacon.com>
>> > wrote:
>> >>
>> >> On Wed, Dec 4, 2013 at 2:59 PM, Matthew Jordan <mjordan at digium.com>
>> >> wrote:
>> >> > Ben Langfeld asked an excellent question at AdhearsionConf about
>> >> > channel
>> >> > creation in ARI. Currently, when a channel is created via ARI, the
>> >> > response
>> >> > contains the channel that was created in the message body. Asterisk
>> >> > will
>> >> > then immediately begin running the channel (that is, dialling the
>> >> > specified
>> >> > endpoint) while the response is being sent back to the client. While
>> >> > "speedy", this creates the situation where the client can potentially
>> >> > receive events for a channel before it has received the successful
>> >> > response
>> >> > to the channel creation.
>> >> >
>> >> > That seems less than ideal.
>> >> >
>> >> > Ideally, you would create the channel and receive a response
>> >> > indicating
>> >> > what
>> >> > channel you just created. Once you've done that, you'd initiate
>> >> > another
>> >> > request to start running the channel. This is really the only way to
>> >> > keep
>> >> > events from showing up until after you've received the handle to the
>> >> > channel.
>> >> >
>> >> > Something like:
>> >> >
>> >> > POST /channels?endpoint=PJSIP/matt&app=hello-world
>> >> >   => Returns 200 OK with channel 12345
>> >> > POST /channels/12345/run
>> >> >
>> >> > Thoughts?
>> >> >
>> >> My immediate response is how do we get around the issue using AMI
>> >> Originate async? IIRC you would track the event using the ActionID
>> >> which is user generated. So why don't we do the same thing? Add the
>> >> ability for an application to tag events to transactions.
>> >
>> >
>> > The ActionID is not returned on every subsequent event, it is only
>> > returned
>> > on the AMI event response to the AMI action. So AMI Originate has the
>> > same
>> > problem. People "get around this" by doing a channel set variable to a
>> > UUID
>> > (or something similar) during the Originate, then listening for the
>> > SetVar
>> > event. It's clunky.
>> >
>> > Tagging events to a transaction in ARI could work, but feels similarly
>> > clunky. The following is possible:
>> > POST /channels?endpoint=PJSIP/matt&tag=foobar
>> >  => Receive StasisStart for channel 12345 with tag foobar
>> >  => Receive 200 OK for channel 12345
>> >
>> > This feels like a workaround, and not a solution.
>> >
>> > As far as solving this for AMI goes, I'd probably keep Originate "as
>> > is",
>> > and add a new AMI action that creates a channel only but doesn't run it.
>> > A
>> > subsequent AMI action - or else an Originate that specifies the channel
>> > name
>> > to run - could then start the execution.
>> >
>> Okay, so using your proposal, the series of events would be:
>>
>> 1) POST /channels?endpoint=PJSIP/matt&app=hello-world
>>   => Returns 200 OK with channel 12345
>>
>> 2) Setup event listener for channel 12345
>>
>> 3) POST /channels/12345/run (some result returned?)
>>
>> 4) Wait for event to be returned to listener
>>
>> Is that correct?
>
>
> Not really.
>
> You already have an event listener in the websocket connection. This is more
> about keeping sanity in clients, so that they "know" that when they service
> an event for a channel, they can feel confident that they knew about that
> channel before the event was received.
>
Okay, so that is what I thought. The client wants to know about the
channel, so that said, why don't we allow a client to create a channel
directly? Something like:

$id=uuid.generate()

POST /channels/$id/?endpoint...
  => Returns 200 OK

I don't know if that is an option or not, but I _think_ that gets
around the issue of a two step process. Obviously you return error
codes on failure.

My only other question with the two step process, is how long does the
channel live for? What happens if you don't use /run, or asterisk
dies, etc. Seems like it adds more overhead to the application to now
manage said channels.

> It's more like:
>
> POST/channels?endpoint...
>  => Returns 200 OK with channel 12345
>
> POST/channels/12345/run
>  => Returns 200 OK
>
> => Start receiving events about channel over websocket
>

-- 
Paul Belanger | PolyBeacon, Inc.
Jabber: paul.belanger at polybeacon.com | IRC: pabelanger (Freenode)
Github: https://github.com/pabelanger | Twitter: https://twitter.com/pabelanger



More information about the asterisk-app-dev mailing list