- Bugfix: Return correct recording uri for wav49 format with Asterisk.
- Change: Remove support for FreeSWITCH translator on Inbound EventSocket
- Bugfix: Return the correct error when the call is down when stopping an output rather than crashing the translator (#256)
- Bugfix: Handle more AMI error responses which mean the channel is not found
- Bugfix: Alternative fix for "Avoid race conditions in processing calls with interactions between them". The original fix in 2.7.4 introduced crashes relating to creating call actors at high call volume.
- YANKED
- Bugfix: Avoid race conditions in processing calls with interactions between them
- Bugfix: Handle correct event for confirming that a component stop was completed on Asterisk 13
- Bugfix: Process joined events on Asterisk 13 in any order, avoiding Join command timeouts
- Bugfix: Ensure components are deregistered from asterisk translator once the call is ended (#250)
- Feature: Support for Asterisk 13 (AMI v2)
- Feature: Pass all possible MRCP recognition headers through Asterisk #244
- Bugfix: Handle an illegal AMI response by Asterisk as a failure with code -1
- Bugfix: Ensure a useful error is raised when attempting to join to a call which doesn't exist #529
- Bugfix: Support SSML in MRCPRecog case on Asterisk. This is the case where a prompt component wants to render using Asterisk and recognise using UniMRCP. This worked fine with a uri-list which already has test coverage, but threw (and silently swallowed) an exception for an SSML doc (as provided by Adhearsion) resulting in a hung call with no audio, and then a timeout exception in Adhearsion. #241
- Feature: Support recognition-timeout settings on UniMRCP-based ASR on Asterisk (#228)
- Feature: Implement redirect command on Asterisk (#219)
- Feature: Allow arbitrary media headers (#237)
- Bugfix: Complete 1-to-1 mapping of UniMRCP RECOG_COMPLETION_CAUSE values to Punchblock::Complete events
- Bugfix: Prevent Asterisk translator death due to dead DTMF recognizers (#221, adhearsion/adhearsion#479)
- Bugfix: Be more intelligent about only stripping true file extensions off filenames for playback on Asterisk (adhearsion/adhearsion#482)
- Bugfix: Handle a corner case crash where a recognition request is interrupted directly after a successful recognition has completed
- Bugfix: Avoid cases where executing AGI commands (reported as sending SIP messages) might block indefinitely due to a race condition in fetching their response value
- Bugfix: No longer confound start and stop beeps on record commands (#220)
- Bugfix: Ensure DTMF recognisers get shut down when finishing
- Bugfix: Hangup reason on Asterisk was
:hangup
, should be:hungup
. See the Rayo spec.
- Feature: Support language, sensitivity and minimum confidence on UniMRCP-based ASR on Asterisk
- Feature: Support sending messages to calls (eg SIP MESSAGE) on Asterisk
- Bugfix: Rayo events should not include their timestamp in comparison. This is not useful in applications, and makes testing more difficult.
Note: 2.4.1 was not released due to a tagging mishap. Its contents was released as 2.4.2.
- Feature: Add support for requesting calls with a specific URI
- Feature: Allow generation of a random call URI for a client
- Feature: Rayo events should be timestamped with dispatch or receipt time (#213)
- Bugfix: Ensure commands can be associated on the wire even before they're executed
- Bugfix: Ensure a command is always transitioned to is requested state prior to receiving a response
- Feature: Add input-timers-started event
- Feature: Allow client to send XMPP messages through Blather
- Bugfix: Ensure that max duration expiration of Asterisk recordings does not crash the translator when it extends past the call's destruction
- Bugfix: Delay sending Answered event on call until AsyncAGI is invoked
- Bugfix:
Punchblock::Event::Complete::Reason
is now aPunchblock::Event
- Feature: Support Rayo CPA and Fax specifications
- Feature: Implement a simple filter for AMI events -> Rayo events in
Punchblock::Translator::Asterisk.event_filter=
- Feature: Output on Asterisk supports a new
:native_or_unimrcp
renderer which allows for fallback of output rendering from Asterisk native when possible, to a TTS engine when it's not. - Feature: Support output
repeat-times
on Asterisk. - Bugfix: Remove per-call/component actors from Asterisk translator for performance/stability super-charge
- Bugfix: Allow sending string SSML docs via Rayo
- Bugfix: Ensure that joined calls on Asterisk do not have implicitly linked lifecycles. Previously, joinees would be hungup when the joiner exited the bridge.
- Feature: Support RubySpeech builtin grammars on Asterisk and FreeSWITCH
- Update: Update to stable release of Virtus
- Bugfix: Reject commands against components which have finished on Asterisk, and garbage collect them
- Bugfix: Register/lookup components by their full URI rather than component ID since the component ID may only be unique per call
- Bugfix: Hold back Virtus dependency to avoid API-breaking changes
- Bugfix: Allow audio file URIs with file extensions on Asterisk
- Bugfix: Input timers were being started before output finished on Asterisk composed prompts
- Bugfix: Input initial timers were being started on Asterisk composed prompts even if the prompt was barged
- Bugfix: Output was being interrupted on Asterisk composed prompts at every DTMF keypress, even if the output was already finished
- Feature: Compliance with v0.2 of the published Rayo spec (http://xmpp.org/extensions/xep-0327.html)
- Feature: Add support for Rayo Prompt component
- Feature: Added FS support for initial timeout and final timeout on Record
- Change: Models are now plain ruby objects, not XML nodes, and are imported from/exported to XML when necessary for communicating over XMPP.
- Change:
#headers
and AMI#attributes
now do not have their names modified. A header of'Call-ID'
will no longer be modified to:call_id
. - Change: AMI Events/Actions now have
#headers(=)
rather than#attributes(=)
- Change: Remove event queue
- Change: Removed
media_engine
anddefault_voice
settings - Bugfix: Reconnect dead Asterisk streams correctly
- Bugfix: Include AMI response text_body in AMI component complete events
- Bugfix: Avoid crashing translators (Asterisk or FreeSWITCH) by instructing them to call back to terminated Call objects
- Bugfix: Detect MRCPSynth failure in output component
- Bugfix: Handle AMI errors indicating dead channels correctly
- Bugfix: Finish more setup before sending output ref on Asterisk
- Bugfix: Allow early media TTS on Asterisk in addition to audio playback
- Bugfix: Correctly mark Asterisk calls as answered after successfully executing an answer command
- Bugfix: Improve error messages when trying to execute stop commands on components in an invalid state
- Bugfix: We were raising an exception on connection shutdown due to waiting for the connection to end incorrectly.
- Bugfix/Perf: FreeSWITCH Call actors were being kept alive after hangup for no reason
- Bugfix/Perf: FreeSWITCH component complete events were looping out of the actor
- Perf: We were wasting CPU cycles listening to all ES events when we really don't need to
- Bugfix: AMI errors indicating dead channels were not being handled correctly
- Bugfix: We were broken on Celluloid 0.14 due to changes in block execution semantics between actors
- Feature: Use RubyAMI 2.0 with a single AMI connection.
- Feature: Cache channel variables on Asterisk calls.
- Feature: Allow optional sending of end event when breaking from AsyncAGI on Asterisk. This enables dialplan handback. Only triggers if the channel variable 'PUNCHBLOCK_END_ON_ASYNCAGI_BREAK' is set.
- Bugfix: Avoid DTMF recognizer failures and race conditions by bringing DTMFRecognizer back into the Input component actor.
- Bugfix: Catch Asterisk AMI errors in all cases and fail accordingly, instead of ploughing ahead in the face of adversity.
- Bugfix: Improve performance of Asterisk implementation by no longer spinning up a component actor for AGI command execution.
- Bugfix: Input initial timeout was being set as a float rather than an integer
- Bugfix: Input initial timeout was being set as a float rather than an integer
- Bugfix: FreeSWITCH was requiring a from attribute on a dial command
- Bugfix: Asterisk translator now properly checks for existence of the recordings directory
- Bugfix: Components should transition state before unblocking
- Bugfix: Asterisk joins are now more robustly responded to when the join begins
- Bugfix: On FreeSWITCH, only events relating to bridge start/end should be delivered to bridged calls
- Bugfix: On FreeSWITCH, a voice value on an audio-only output component should not prevent execution
- Bugfix: XMPP Ping should be an IQ get, not set
- Bugfix: Stop command should be in Rayo ext namespace
- Bugfix: XMPP specs were mistakenly resetting the logger object for other tests.
- CS: Avoid Celluloid deprecation warnings
- Feature: Join command now enforces a list of valid direction attribute values
- Feature: Added support for media direction to the Record component
- Feature: Record direction support on FS
- Bugfix: Fixed answering during early media on FS
- Bugfix: Doing multiple recordings on Asterisk during the lifetime of a call was crashing Punchblock
- Bugfix: Deal with nil media engines on FS/* properly
- Feature: Support for the renderer attribute added to the Output component.
- Feature: FreeSWITCH and Asterisk translators now use the :renderer attribute on Output
- Bugfix: Fixed scenario where executing the ANSWER application on FreeSWITCH on an already answered call caused FS to stop accepting commands.
- Bugfix: Plug a severe memory leak
- Bugfix: Raise an error immediately if trying to execute an invalid media engine on Asterisk
- Bugfix: Handle a wider variety of types when configuring media engines on Asterisk and FreeSWITCH, such as Strings instead of Symbols
- Bugfix: Safer component attribute writer conversion
- Feature: Set dial headers on FreeSWITCH originate command (SIP only)
- Feature: Set dial headers on Asterisk originate command (SIP only)
- Bugfix: Headers were being re-written downcased and with underscores
- Bugfix: Ensure all numeric component attributes are written as the correct type
- Doc: Add link to docs for unrenderable doc error
- Bugfix: Use correct GRXML content type
- Bugfix: Fix UniMRCP for documents containing commas
- Bugfix: Bump Celluloid dependency to avoid issues with serialising AMI
- Update: Bump Celluloid dependency
- Bugfix: Input grammars referenced by URL now no longer specify a content type
- Bugfix: FreeSWITCH
Dial#from
values now parsed more flexibly
- Feature: Input component now supports grammar URLs
- Bugfix: Hanging up Asterisk calls now correctly specifies normal clearing cause
- Doc: Fix a bunch of API documentation
- Bugfix: Cleaning up DTMF handlers for input components with a dead call should not crash on FreeSWITCH
- Bugfix: Reduced a race condition on FreeSWITCH when dispatching events from calls to dead components
- Bugfix: Events relevant to bridged channels were not being routed to the call
- Bugfix: Components using #stop_by_redirect now return an error response if stopped when they are complete
- Bugfix: Hold back ruby_ami and ruby_fs dependencies pending fixes for Celluloid 0.12.0
- Feature: FreeSWITCH support (mostly complete, experimental, proceed with caution)
- Bugfix: Report the correct caller ID in offers from Asterisk
- Bugfix: Strip out caller ID name from dial commands on Asterisk
- Change: Asterisk output now uses Playback rather than STREAM FILE
- Feature: The recordings dir is now checked for existence on startup, and logs an error if it is not there. Asterisk only.
- Feature: Punchblock now logs an error if it was unable to add the redirect context on Asterisk on startup.
- Feature: Output component now exposes #recording and #recording_uri for easy access to record results.
- Feature: Early media support for Asterisk, using Progress to start an early media session
- Feature: Output component on Asterisk now supports early media. If the line is not answered, it runs Progress followed by Playback with noanswer.
- Feature: Record component on Asterisk now raises if called on an unanswered call
- Feature: Input component on Asterisk works the same whether the call is answered or unanswered
- Feature: AMI events are emitted to the relevant calls
- Feature: Simpler method of getting hold of a new client/connection
- Bugfix: AMI events are processed in order by the translator
- Bugfix: Asterisk calls and components are removed from registries when they die
- Bugfix: Commands for unknown calls/components respond with the correct
:item_not_found
name - Bugfix: AMI events relevant to a particular call are emitted by that call to the client
- Bugfix: Asterisk calls send an error complete event for their dying components
- Bugfix: Asterisk translator sends an error end event for its dying calls
- Bugfix: Use the primitive version of AGI ANSWER, rather than an app
- Bugfix: Outbound calls which never begin progress on Asterisk end with an error
- Bugfix: Asterisk now responds correctly to unjoin commands
- Bugfix: Allow nil reject reasons
- Bugfix: Asterisk translator now does NOT answer the call automatically when Output, Input or Record are used.
- Feature: Basic support for record component on Asterisk, using MixMonitor. Currently unsupported options include: start_paused, initial_timeout, final_timeout. Hints are additionally not supported, and recordings are stored on the * machine's local filesystem.
- Feature: Implement Reject on Asterisk
- Bugfix: No longer generate warnings
- Bugfix: Set 'to' attribute on an offer from Asterisk to something useful if the dnid is 'unknown'
- Bugfix: Include caller ID name in 'from' attribute on an offer from Asterisk
- Bugfix: Removed media engine switching on Asterisk Input component - fixes broken input when using app_swift or unimrcp for output
- Update: Better dependency version fixing
- Stable release :D
- Bugfix: Any issue in compiling an output document into executable elements on Asterisk should return an unrenderable doc error
- API Change:
#call_id
and#mixer_name
attributes changed to#target_call_id
and#target_mixer_name
- API Change:
#other_call_id
attributes changed to#call_id
to better align with Rayo
- Feature: Input & Output components on Asterisk now responds to a Stop command
- Feature: started/stopped-speaking events are now handled
- Bugfix: Asterisk output component considers an SSML doc w/ a string node w/o spaces to be a filename
- Bugfix:
ProtocolError
should behave like a normal exception, just with extra attributes
- Feature: app_swift is now supported on Asterisk with a media_engine type of :swift
- Feature: Asterisk calls now support the Join API
- Feature: On Asterisk, Punchblock creates a context and extension to redirect calls to
- Bugfix: Unjoining calls now redirects both legs
- Bugfix: Unlink events on Asterisk correctly send Unjoin Punchblock events
- Bugfix: The Asterisk translator now ignores calls to 'h' or of type 'Kill'
- Bugfix: Handle more XMPP connection errors gracefully
- Bugfix: The XMPP connection ready event is now available to external handlers
- Bugfix: The Asterisk connection now passes the
:media_engine
option down to the translator - Bugfix: Connections now always respond to
#connected?
- Bugfix: Connection termination handled gracefully on Asterisk
- Feature: Asterisk calls receiving media commands are implicitly answered
- Bugfix: Unrenderable output documents on Asterisk should return a sensible error
- Bugfix: Log the target of commands correctly
- Bugfix: Do not wrap exceptions in ProtocolError
- Bugfix: Closing an disconnected XMPP connection is a no-op
- Bugfix: Remove the rest of the deprecated Tropo components (conference)
- Feature: Outbound dials on Asterisk now respect the dial timeout
- Bugfix: Registering stanza handlers on an XMPP connection now sets them in the correct order such that they do not override the internally defined handlers
- Bugfix: End, Ringing & Answered events are allowed to have headers
- Feature: Dial commands may have an optional timeout
- Feature: Return an error when trying to execute a command for unknown calls/components or when not understood
- Feature: Log calls/translator shutting down
- Feature: Calls and components should log their IDs
- Feature: Components marked as internal should send events directly to the component node
- Bugfix: Fix Asterisk Call and Component logger IDs
- Bugfix: Fix a stupidly high log level
- Bugfix: AGI commands executed by a call/component that are a translation of a Rayo command should be marked internal
- Bugfix: Asterisk components should sent events via the connection
- Bugfix: Shutting down an asterisk connection should do a cascading shutdown of the translator and all of its calls
- Bugfix: Component actors should be terminated once they've sent a complete event
- Bugfix: Component events should be sent with the call ID
- Bugfix: AMIAction components do not have a call
- Bugfix: Add test coverage for comparison of complete events
- Bugfix: A call being hung up should terminate the call actor
- Bugfix: Fix a mock expectation error in a test
- Feature: Support outbound dial on Asterisk
- Bugfix: Asterisk hangup causes should map to correct Rayo End reason
- Feature: Support DTMF Input components on Asterisk
- Feature: Expose Blather's connection timeout config when creating a Connection::XMPP
- Bugfix: Remove some deprecated Tropo extension components
- Bugfix: Remove reconnection logic since it really belongs in the consumer
- Feature: Raise a DisconnectedError when a disconnection is detected
- Feature: Allow sending commands to mixers easily
- Feature: Allow configuration of Rayo XMPP domains (root, call and mixer)
- Feature: Log Blather messages to the trace log level
- Feature: Return an error when trying to execute an Output on Asterisk with unsupported options set
- Feature: Add basic support for media output via MRCPSynth on Asterisk
- API change: Rename mixer_id to mixer_name to align with change to Rayo
- Bugfix: Handle and expose RubySpeech GRXML documents on Input/Ask properly
- Bugfix: Compare ProtocolErrors correctly
- Bugfix: Asterisk media output should default to Asterisk native output (STREAM FILE)
- Bugfix: An Output node's default max_time value should be nil rather than zero
- [FEATURE] Add
Connection#not_ready!
, to instruct the server not to send any more offers. - [BUGFIX] Translate all exceptions raised by the XMPP connection into a ProtocolError
- [UPDATE] Blather dependency to >= 0.5.9
- Bugfix: Some spec mistakes
- Feature: Allow execution of actions against global components on Asterisk
- API change: The console has been removed
- API change: Components no longer expose a FutureResource at #complete_event, and instead wrap its API in the same way as #response and #response=. Any consumer code which does some_component.complete_event.resource or some_component.complete_event.resource= should now use some_component.complete_event and some_component.complete_event=
- Feature: Added the max-silence attribute to the Input component
- Bugfix: Bump the Celluloid dependency to avoid spec failures on JRuby and monkey-patching for mockability
- API change: Event handlers registered on components are no longer triggered by incoming events internally to Punchblock. These events must be consumed via a Client's event handlers or event queue and manually triggered on a component using ComponentNode#trigger_event_handler
Feature: Added basic support for running Punchblock apps on Asterisk. Calls coming in to AsyncAGI result in the client receiving an Offer, hangup events are sent, and accept/answer/hangup commands work.
API change: The logger is now set using Punchblock.logger= rather than as a hash key to Connection.new
- Feature: Allow instructing the connection we are ready. An XMPP connection will send initial presence with a status of 'chat' to the rayo domain
- Bugfix: When running on Asterisk, two FullyBooted events will now trigger a connected event
- Bugfix: No longer ignore offers from the specified rayo domain on XMPP connections
- Feature: Tag all event objects with the XMPP domain they came from
- API change: Punchblock consumers now need to instantiate both a Connection and a Client (see the punchblock-console gem for an example)
- Feature: Added a Connection for Asterisk, utilising RubyAMI to open an AMI connection to Asterisk, and allowing AMI actions to be executed. AMI events are handled by the client event handler.
- Deprecation: The punchblock-console and the associated DSL are now deprecated and the punchblock-console gem should be used instead
API change: Connections now raise a Punchblock::Connection::Connected instance as an event, rather than the class itself
- Refactoring/API change: Client and connection level concerns are now separated, and one must create a Connection to be passed to a Client on creation. Client now has the choice between an event queue and guarded event handlers.
- Feature: Support for meta-data on recordings (size & duration)
- Feature: Allow specifying all of Blather's setup options (required to use PB as an XMPP component)
- Bugfix: Rayo events are discarded if they don't come from the specified domain
- Bugfix: Component execution in the sample DSL now doesn't expect events on the main queue
- Bugfix: Conference complete event was not being handled
- Feature/API change: Components no longer have an event queue, but instead it is possible to define guarded event handlers via #register_event_handler
- First public release