mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws
Code change summary:
* Added an ast_vector_string_join() function,
* Added ApplicationRegistered and ApplicationUnregistered ARI events.
* Converted res/ari/config.c to use sorcery to process ari.conf.
* Added the "outbound-websocket" ARI config object.
* Refactored res/ari/ari_websockets.c to handle outbound websockets.
* Refactored res/ari/cli.c for the sorcery changeover.
* Updated res/res_stasis.c for the sorcery changeover.
* Updated apps/app_stasis.c to allow initiating per-call outbound websockets.
* Added CLI commands to manage ARI websockets.
* Added the new "outbound-websocket" object to ari.conf.sample.
* Moved the ARI XML documentation out of res_ari.c into res/ari/ari_doc.xml
UserNote: Asterisk can now establish websocket sessions _to_ your ARI applications
as well as accepting websocket sessions _from_ them.
Full details: http://s.asterisk.net/ari-outbound-ws
(cherry picked from commit 1c0d552155)
		
	
		
			
				
	
	
		
			1165 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
			
		
		
	
	
			1165 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
| {
 | |
| 	"_copyright": "Copyright (C) 2012 - 2013, Digium, Inc.",
 | |
| 	"_author": "David M. Lee, II <dlee@digium.com>",
 | |
| 	"_svn_revision": "$Revision$",
 | |
| 	"apiVersion": "2.0.0",
 | |
| 	"swaggerVersion": "1.2",
 | |
| 	"basePath": "http://localhost:8088/ari",
 | |
| 	"resourcePath": "/api-docs/events.{format}",
 | |
| 	"since": [
 | |
| 		"12.0.0"
 | |
| 	],
 | |
| 	"requiresModules": [
 | |
| 		"res_http_websocket"
 | |
| 	],
 | |
| 	"apis": [
 | |
| 		{
 | |
| 			"path": "/events",
 | |
| 			"description": "Events from Asterisk to applications",
 | |
| 			"operations": [
 | |
| 				{
 | |
| 					"httpMethod": "GET",
 | |
| 					"since": [
 | |
| 						"12.0.0"
 | |
| 					],
 | |
| 					"upgrade": "websocket",
 | |
| 					"websocketProtocol": "ari",
 | |
| 					"summary": "WebSocket connection for events.",
 | |
| 					"nickname": "eventWebsocket",
 | |
| 					"responseClass": "Message",
 | |
| 					"parameters": [
 | |
| 						{
 | |
| 							"name": "app",
 | |
| 							"description": "Applications to subscribe to.",
 | |
| 							"paramType": "query",
 | |
| 							"required": true,
 | |
| 							"allowMultiple": true,
 | |
| 							"dataType": "string"
 | |
| 						},
 | |
| 						{
 | |
| 							"name": "subscribeAll",
 | |
| 							"description": "Subscribe to all Asterisk events. If provided, the applications listed will be subscribed to all events, effectively disabling the application specific subscriptions. Default is 'false'.",
 | |
| 							"paramType": "query",
 | |
| 							"required": false,
 | |
| 							"allowMultiple": false,
 | |
| 							"dataType": "boolean"
 | |
| 						}
 | |
| 					]
 | |
| 				}
 | |
| 			]
 | |
| 		},
 | |
| 		{
 | |
| 			"path": "/events/user/{eventName}",
 | |
| 			"description": "Stasis application user events",
 | |
| 			"operations": [
 | |
| 				{
 | |
| 					"httpMethod": "POST",
 | |
| 					"since": [
 | |
| 						"12.3.0"
 | |
| 					],
 | |
| 					"summary": "Generate a user event.",
 | |
| 					"nickname": "userEvent",
 | |
| 					"responseClass": "void",
 | |
| 					"parameters": [
 | |
| 						{
 | |
| 							"name": "eventName",
 | |
| 							"description": "Event name",
 | |
| 							"paramType": "path",
 | |
| 							"required": true,
 | |
| 							"allowMultiple": false,
 | |
| 							"dataType": "string"
 | |
| 						},
 | |
| 						{
 | |
| 							"name": "application",
 | |
| 							"description": "The name of the application that will receive this event",
 | |
| 							"paramType": "query",
 | |
| 							"required": true,
 | |
| 							"allowMultiple": false,
 | |
| 							"dataType": "string"
 | |
| 						},
 | |
| 						{
 | |
| 							"name": "source",
 | |
| 							"description": "URI for event source (channel:{channelId}, bridge:{bridgeId}, endpoint:{tech}/{resource}, deviceState:{deviceName}",
 | |
| 							"paramType": "query",
 | |
| 							"required": false,
 | |
| 							"allowMultiple": true,
 | |
| 							"dataType": "string"
 | |
| 						},
 | |
| 						{
 | |
| 							"name": "variables",
 | |
| 							"description": "The \"variables\" key in the body object holds custom key/value pairs to add to the user event. Ex. { \"variables\": { \"key\": \"value\" } }",
 | |
| 							"paramType": "body",
 | |
| 							"required": false,
 | |
| 							"allowMultiple": false,
 | |
| 							"dataType": "containers"
 | |
| 						}
 | |
| 					],
 | |
| 					"errorResponses": [
 | |
| 						{
 | |
| 							"code": 404,
 | |
| 							"reason": "Application does not exist."
 | |
| 						},
 | |
| 						{
 | |
| 							"code": 422,
 | |
| 							"reason": "Event source not found."
 | |
| 						},
 | |
| 						{
 | |
| 							"code": 400,
 | |
| 							"reason": "Invalid even tsource URI or userevent data."
 | |
| 						}
 | |
| 					]
 | |
| 				}
 | |
| 			]
 | |
| 		}
 | |
| 	],
 | |
| 	"models": {
 | |
| 		"Message": {
 | |
| 			"id": "Message",
 | |
| 			"description": "Base type for errors and events",
 | |
| 			"discriminator": "type",
 | |
| 			"properties": {
 | |
| 				"type": {
 | |
| 					"type": "string",
 | |
| 					"required": true,
 | |
| 					"description": "Indicates the type of this message."
 | |
| 				},
 | |
| 				"asterisk_id": {
 | |
| 					"type": "string",
 | |
| 					"required": false,
 | |
| 					"description": "The unique ID for the Asterisk instance that raised this event."
 | |
| 				}
 | |
| 			},
 | |
| 			"subTypes": [
 | |
| 				"MissingParams",
 | |
| 				"Event"
 | |
| 			]
 | |
| 		},
 | |
| 		"MissingParams": {
 | |
| 			"id": "MissingParams",
 | |
| 			"description": "Error event sent when required params are missing.",
 | |
| 			"properties": {
 | |
| 				"params": {
 | |
| 					"required": true,
 | |
| 					"type": "List[string]",
 | |
| 					"description": "A list of the missing parameters"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"Event": {
 | |
| 			"id": "Event",
 | |
| 			"description": "Base type for asynchronous events from Asterisk.",
 | |
| 			"properties": {
 | |
| 				"application": {
 | |
| 					"type": "string",
 | |
| 					"description": "Name of the application receiving the event.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"timestamp": {
 | |
| 					"type": "Date",
 | |
| 					"description": "Time at which this event was created.",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			},
 | |
| 			"subTypes": [
 | |
| 				"DeviceStateChanged",
 | |
| 				"PlaybackStarted",
 | |
| 				"PlaybackContinuing",
 | |
| 				"PlaybackFinished",
 | |
| 				"RecordingStarted",
 | |
| 				"RecordingFinished",
 | |
| 				"RecordingFailed",
 | |
| 				"ApplicationMoveFailed",
 | |
| 				"ApplicationRegistered",
 | |
| 				"ApplicationUnregistered",
 | |
| 				"ApplicationReplaced",
 | |
| 				"BridgeCreated",
 | |
| 				"BridgeDestroyed",
 | |
| 				"BridgeMerged",
 | |
| 				"BridgeBlindTransfer",
 | |
| 				"BridgeAttendedTransfer",
 | |
| 				"BridgeVideoSourceChanged",
 | |
| 				"ChannelCreated",
 | |
| 				"ChannelDestroyed",
 | |
| 				"ChannelEnteredBridge",
 | |
| 				"ChannelLeftBridge",
 | |
| 				"ChannelStateChange",
 | |
| 				"ChannelDtmfReceived",
 | |
| 				"ChannelDialplan",
 | |
| 				"ChannelCallerId",
 | |
| 				"ChannelUserevent",
 | |
| 				"ChannelHangupRequest",
 | |
| 				"ChannelVarset",
 | |
| 				"ChannelTalkingStarted",
 | |
| 				"ChannelTalkingFinished",
 | |
| 				"ChannelHold",
 | |
| 				"ChannelUnhold",
 | |
| 				"ContactStatusChange",
 | |
| 				"EndpointStateChange",
 | |
| 				"Dial",
 | |
| 				"StasisEnd",
 | |
| 				"StasisStart",
 | |
| 				"TextMessageReceived",
 | |
| 				"ChannelConnectedLine",
 | |
| 				"PeerStatusChange",
 | |
| 				"ChannelTransfer",
 | |
| 				"RESTResponse"
 | |
| 			]
 | |
| 		},
 | |
| 		"ContactInfo": {
 | |
| 			"id": "ContactInfo",
 | |
| 			"description": "Detailed information about a contact on an endpoint.",
 | |
| 			"properties": {
 | |
| 				"uri": {
 | |
| 					"type": "string",
 | |
| 					"description": "The location of the contact.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"contact_status": {
 | |
| 					"type": "string",
 | |
| 					"description": "The current status of the contact.",
 | |
| 					"required": true,
 | |
| 					"allowableValues": {
 | |
| 						"valueType": "LIST",
 | |
| 						"values": [
 | |
| 							"Unreachable",
 | |
| 							"Reachable",
 | |
| 							"Unknown",
 | |
| 							"NonQualified",
 | |
| 							"Removed"
 | |
| 						]
 | |
| 					}
 | |
| 				},
 | |
| 				"aor": {
 | |
| 					"type": "string",
 | |
| 					"description": "The Address of Record this contact belongs to.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"roundtrip_usec": {
 | |
| 					"type": "string",
 | |
| 					"description": "Current round trip time, in microseconds, for the contact.",
 | |
| 					"required": false
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"Peer": {
 | |
| 			"id": "Peer",
 | |
| 			"description": "Detailed information about a remote peer that communicates with Asterisk.",
 | |
| 			"properties": {
 | |
| 				"peer_status": {
 | |
| 					"type": "string",
 | |
| 					"description": "The current state of the peer. Note that the values of the status are dependent on the underlying peer technology.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"cause": {
 | |
| 					"type": "string",
 | |
| 					"description": "An optional reason associated with the change in peer_status.",
 | |
| 					"required": false
 | |
| 				},
 | |
| 				"address": {
 | |
| 					"type": "string",
 | |
| 					"description": "The IP address of the peer.",
 | |
| 					"required": false
 | |
| 				},
 | |
| 				"port": {
 | |
| 					"type": "string",
 | |
| 					"description": "The port of the peer.",
 | |
| 					"required": false
 | |
| 				},
 | |
| 				"time": {
 | |
| 					"type": "string",
 | |
| 					"description": "The last known time the peer was contacted.",
 | |
| 					"required": false
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"DeviceStateChanged": {
 | |
| 			"id": "DeviceStateChanged",
 | |
| 			"description": "Notification that a device state has changed.",
 | |
| 			"properties": {
 | |
| 				"device_state": {
 | |
| 					"type": "DeviceState",
 | |
| 					"description": "Device state object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"PlaybackStarted": {
 | |
| 			"id": "PlaybackStarted",
 | |
| 			"description": "Event showing the start of a media playback operation.",
 | |
| 			"properties": {
 | |
| 				"playback": {
 | |
| 					"type": "Playback",
 | |
| 					"description": "Playback control object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"PlaybackContinuing": {
 | |
| 			"id": "PlaybackContinuing",
 | |
| 			"description": "Event showing the continuation of a media playback operation from one media URI to the next in the list.",
 | |
| 			"properties": {
 | |
| 				"playback": {
 | |
| 					"type": "Playback",
 | |
| 					"description": "Playback control object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"PlaybackFinished": {
 | |
| 			"id": "PlaybackFinished",
 | |
| 			"description": "Event showing the completion of a media playback operation.",
 | |
| 			"properties": {
 | |
| 				"playback": {
 | |
| 					"type": "Playback",
 | |
| 					"description": "Playback control object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RecordingStarted": {
 | |
| 			"id": "RecordingStarted",
 | |
| 			"description": "Event showing the start of a recording operation.",
 | |
| 			"properties": {
 | |
| 				"recording": {
 | |
| 					"type": "LiveRecording",
 | |
| 					"description": "Recording control object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RecordingFinished": {
 | |
| 			"id": "RecordingFinished",
 | |
| 			"description": "Event showing the completion of a recording operation.",
 | |
| 			"properties": {
 | |
| 				"recording": {
 | |
| 					"type": "LiveRecording",
 | |
| 					"description": "Recording control object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RecordingFailed": {
 | |
| 			"id": "RecordingFailed",
 | |
| 			"description": "Event showing failure of a recording operation.",
 | |
| 			"properties": {
 | |
| 				"recording": {
 | |
| 					"type": "LiveRecording",
 | |
| 					"description": "Recording control object",
 | |
| 					"required": true
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ApplicationMoveFailed": {
 | |
| 			"id": "ApplicationMoveFailed",
 | |
| 			"description": "Notification that trying to move a channel to another Stasis application failed.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"destination": {
 | |
| 					"required": true,
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"args": {
 | |
| 					"required": true,
 | |
| 					"type": "List[string]",
 | |
| 					"description": "Arguments to the application"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ApplicationRegistered": {
 | |
| 			"id": "ApplicationRegistered",
 | |
| 			"description": "Notification that a Stasis app has been registered.",
 | |
| 			"properties": {}
 | |
| 		},
 | |
| 		"ApplicationUnregistered": {
 | |
| 			"id": "ApplicationUnregistered",
 | |
| 			"description": "Notification that a Stasis app has been unregistered.",
 | |
| 			"properties": {}
 | |
| 		},
 | |
| 		"ApplicationReplaced": {
 | |
| 			"id": "ApplicationReplaced",
 | |
| 			"description": "Notification that another WebSocket has taken over for an application.\n\nAn application may only be subscribed to by a single WebSocket at a time. If multiple WebSockets attempt to subscribe to the same application, the newer WebSocket wins, and the older one receives this event.",
 | |
| 			"properties": {}
 | |
| 		},
 | |
| 		"BridgeCreated": {
 | |
| 			"id": "BridgeCreated",
 | |
| 			"description": "Notification that a bridge has been created.",
 | |
| 			"properties": {
 | |
| 				"bridge": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"BridgeDestroyed": {
 | |
| 			"id": "BridgeDestroyed",
 | |
| 			"description": "Notification that a bridge has been destroyed.",
 | |
| 			"properties": {
 | |
| 				"bridge": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"BridgeMerged": {
 | |
| 			"id": "BridgeMerged",
 | |
| 			"description": "Notification that one bridge has merged into another.",
 | |
| 			"properties": {
 | |
| 				"bridge": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				},
 | |
| 				"bridge_from": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"BridgeVideoSourceChanged": {
 | |
| 			"id": "BridgeVideoSourceChanged",
 | |
| 			"description": "Notification that the source of video in a bridge has changed.",
 | |
| 			"properties": {
 | |
| 				"bridge": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				},
 | |
| 				"old_video_source_id": {
 | |
| 					"required": false,
 | |
| 					"type": "string"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"BridgeBlindTransfer": {
 | |
| 			"id": "BridgeBlindTransfer",
 | |
| 			"description": "Notification that a blind transfer has occurred.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"description": "The channel performing the blind transfer",
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"replace_channel": {
 | |
| 					"description": "The channel that is replacing transferer when the transferee(s) can not be transferred directly",
 | |
| 					"required": false,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"transferee": {
 | |
| 					"description": "The channel that is being transferred",
 | |
| 					"required": false,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"exten": {
 | |
| 					"description": "The extension transferred to",
 | |
| 					"required": true,
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"context": {
 | |
| 					"description": "The context transferred to",
 | |
| 					"required": true,
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"result": {
 | |
| 					"description": "The result of the transfer attempt",
 | |
| 					"required": true,
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"is_external": {
 | |
| 					"description": "Whether the transfer was externally initiated or not",
 | |
| 					"required": true,
 | |
| 					"type": "boolean"
 | |
| 				},
 | |
| 				"bridge": {
 | |
| 					"description": "The bridge being transferred",
 | |
| 					"type": "Bridge"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"BridgeAttendedTransfer": {
 | |
| 			"id": "BridgeAttendedTransfer",
 | |
| 			"description": "Notification that an attended transfer has occurred.",
 | |
| 			"properties": {
 | |
| 				"transferer_first_leg": {
 | |
| 					"description": "First leg of the transferer",
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"transferer_second_leg": {
 | |
| 					"description": "Second leg of the transferer",
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"replace_channel": {
 | |
| 					"description": "The channel that is replacing transferer_first_leg in the swap",
 | |
| 					"required": false,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"transferee": {
 | |
| 					"description": "The channel that is being transferred",
 | |
| 					"required": false,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"transfer_target": {
 | |
| 					"description": "The channel that is being transferred to",
 | |
| 					"required": false,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"result": {
 | |
| 					"description": "The result of the transfer attempt",
 | |
| 					"required": true,
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"is_external": {
 | |
| 					"description": "Whether the transfer was externally initiated or not",
 | |
| 					"required": true,
 | |
| 					"type": "boolean"
 | |
| 				},
 | |
| 				"transferer_first_leg_bridge": {
 | |
| 					"description": "Bridge the transferer first leg is in",
 | |
| 					"type": "Bridge"
 | |
| 				},
 | |
| 				"transferer_second_leg_bridge": {
 | |
| 					"description": "Bridge the transferer second leg is in",
 | |
| 					"type": "Bridge"
 | |
| 				},
 | |
| 				"destination_type": {
 | |
| 					"description": "How the transfer was accomplished",
 | |
| 					"required": true,
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"destination_bridge": {
 | |
| 					"description": "Bridge that survived the merge result",
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"destination_application": {
 | |
| 					"description": "Application that has been transferred into",
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"destination_link_first_leg": {
 | |
| 					"description": "First leg of a link transfer result",
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"destination_link_second_leg": {
 | |
| 					"description": "Second leg of a link transfer result",
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"destination_threeway_channel": {
 | |
| 					"description": "Transferer channel that survived the threeway result",
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"destination_threeway_bridge": {
 | |
| 					"description": "Bridge that survived the threeway result",
 | |
| 					"type": "Bridge"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelCreated": {
 | |
| 			"id": "ChannelCreated",
 | |
| 			"description": "Notification that a channel has been created.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelDestroyed": {
 | |
| 			"id": "ChannelDestroyed",
 | |
| 			"description": "Notification that a channel has been destroyed.",
 | |
| 			"properties": {
 | |
| 				"cause": {
 | |
| 					"required": true,
 | |
| 					"description": "Integer representation of the cause of the hangup",
 | |
| 					"type": "int"
 | |
| 				},
 | |
| 				"cause_txt": {
 | |
| 					"required": true,
 | |
| 					"description": "Text representation of the cause of the hangup",
 | |
| 					"type": "string"
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelEnteredBridge": {
 | |
| 			"id": "ChannelEnteredBridge",
 | |
| 			"description": "Notification that a channel has entered a bridge.",
 | |
| 			"properties": {
 | |
| 				"bridge": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelLeftBridge": {
 | |
| 			"id": "ChannelLeftBridge",
 | |
| 			"description": "Notification that a channel has left a bridge.",
 | |
| 			"properties": {
 | |
| 				"bridge": {
 | |
| 					"required": true,
 | |
| 					"type": "Bridge"
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelStateChange": {
 | |
| 			"id": "ChannelStateChange",
 | |
| 			"description": "Notification of a channel's state change.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelDtmfReceived": {
 | |
| 			"id": "ChannelDtmfReceived",
 | |
| 			"description": "DTMF received on a channel.\n\nThis event is sent when the DTMF ends. There is no notification about the start of DTMF",
 | |
| 			"properties": {
 | |
| 				"digit": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "DTMF digit received (0-9, A-E, # or *)"
 | |
| 				},
 | |
| 				"duration_ms": {
 | |
| 					"required": true,
 | |
| 					"type": "int",
 | |
| 					"description": "Number of milliseconds DTMF was received"
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel on which DTMF was received"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelDialplan": {
 | |
| 			"id": "ChannelDialplan",
 | |
| 			"description": "Channel changed location in the dialplan.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel that changed dialplan location."
 | |
| 				},
 | |
| 				"dialplan_app": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "The application about to be executed."
 | |
| 				},
 | |
| 				"dialplan_app_data": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "The data to be passed to the application."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelCallerId": {
 | |
| 			"id": "ChannelCallerId",
 | |
| 			"description": "Channel changed Caller ID.",
 | |
| 			"properties": {
 | |
| 				"caller_presentation": {
 | |
| 					"required": true,
 | |
| 					"type": "int",
 | |
| 					"description": "The integer representation of the Caller Presentation value."
 | |
| 				},
 | |
| 				"caller_presentation_txt": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "The text representation of the Caller Presentation value."
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel that changed Caller ID."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelUserevent": {
 | |
| 			"id": "ChannelUserevent",
 | |
| 			"description": "User-generated event with additional user-defined fields in the object.",
 | |
| 			"properties": {
 | |
| 				"eventname": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "The name of the user event."
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "A channel that is signaled with the user event."
 | |
| 				},
 | |
| 				"bridge": {
 | |
| 					"required": false,
 | |
| 					"type": "Bridge",
 | |
| 					"description": "A bridge that is signaled with the user event."
 | |
| 				},
 | |
| 				"endpoint": {
 | |
| 					"required": false,
 | |
| 					"type": "Endpoint",
 | |
| 					"description": "A endpoint that is signaled with the user event."
 | |
| 				},
 | |
| 				"userevent": {
 | |
| 					"required": true,
 | |
| 					"type": "object",
 | |
| 					"description": "Custom Userevent data"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelHangupRequest": {
 | |
| 			"id": "ChannelHangupRequest",
 | |
| 			"description": "A hangup was requested on the channel.",
 | |
| 			"properties": {
 | |
| 				"cause": {
 | |
| 					"type": "int",
 | |
| 					"description": "Integer representation of the cause of the hangup."
 | |
| 				},
 | |
| 				"soft": {
 | |
| 					"type": "boolean",
 | |
| 					"description": "Whether the hangup request was a soft hangup request."
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel on which the hangup was requested."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelVarset": {
 | |
| 			"id": "ChannelVarset",
 | |
| 			"description": "Channel variable changed.",
 | |
| 			"properties": {
 | |
| 				"variable": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "The variable that changed."
 | |
| 				},
 | |
| 				"value": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "The new value of the variable."
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel on which the variable was set.\n\nIf missing, the variable is a global variable."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelHold": {
 | |
| 			"id": "ChannelHold",
 | |
| 			"description": "A channel initiated a media hold.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel that initiated the hold event."
 | |
| 				},
 | |
| 				"musicclass": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "The music on hold class that the initiator requested."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelUnhold": {
 | |
| 			"id": "ChannelUnhold",
 | |
| 			"description": "A channel initiated a media unhold.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel that initiated the unhold event."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelTalkingStarted": {
 | |
| 			"id": "ChannelTalkingStarted",
 | |
| 			"description": "Talking was detected on the channel.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel on which talking started."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelTalkingFinished": {
 | |
| 			"id": "ChannelTalkingFinished",
 | |
| 			"description": "Talking is no longer detected on the channel.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel on which talking completed."
 | |
| 				},
 | |
| 				"duration": {
 | |
| 					"required": true,
 | |
| 					"type": "int",
 | |
| 					"description": "The length of time, in milliseconds, that talking was detected on the channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ContactStatusChange": {
 | |
| 			"id": "ContactStatusChange",
 | |
| 			"description": "The state of a contact on an endpoint has changed.",
 | |
| 			"properties": {
 | |
| 				"endpoint": {
 | |
| 					"required": true,
 | |
| 					"type": "Endpoint"
 | |
| 				},
 | |
| 				"contact_info": {
 | |
| 					"required": true,
 | |
| 					"type": "ContactInfo"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"PeerStatusChange": {
 | |
| 			"id": "PeerStatusChange",
 | |
| 			"description": "The state of a peer associated with an endpoint has changed.",
 | |
| 			"properties": {
 | |
| 				"endpoint": {
 | |
| 					"required": true,
 | |
| 					"type": "Endpoint"
 | |
| 				},
 | |
| 				"peer": {
 | |
| 					"required": true,
 | |
| 					"type": "Peer"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"EndpointStateChange": {
 | |
| 			"id": "EndpointStateChange",
 | |
| 			"description": "Endpoint state changed.",
 | |
| 			"properties": {
 | |
| 				"endpoint": {
 | |
| 					"required": true,
 | |
| 					"type": "Endpoint"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"Dial": {
 | |
| 			"id": "Dial",
 | |
| 			"description": "Dialing state has changed.",
 | |
| 			"properties": {
 | |
| 				"caller": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The calling channel."
 | |
| 				},
 | |
| 				"peer": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The dialed channel."
 | |
| 				},
 | |
| 				"forward": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "Forwarding target requested by the original dialed channel."
 | |
| 				},
 | |
| 				"forwarded": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "Channel that the caller has been forwarded to."
 | |
| 				},
 | |
| 				"dialstring": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "The dial string for calling the peer channel."
 | |
| 				},
 | |
| 				"dialstatus": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Current status of the dialing attempt to the peer."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"StasisEnd": {
 | |
| 			"id": "StasisEnd",
 | |
| 			"description": "Notification that a channel has left a Stasis application.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"StasisStart": {
 | |
| 			"id": "StasisStart",
 | |
| 			"description": "Notification that a channel has entered a Stasis application.",
 | |
| 			"properties": {
 | |
| 				"args": {
 | |
| 					"required": true,
 | |
| 					"type": "List[string]",
 | |
| 					"description": "Arguments to the application"
 | |
| 				},
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel"
 | |
| 				},
 | |
| 				"replace_channel": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"TextMessageReceived": {
 | |
| 			"id": "TextMessageReceived",
 | |
| 			"description": "A text message was received from an endpoint.",
 | |
| 			"properties": {
 | |
| 				"message": {
 | |
| 					"required": true,
 | |
| 					"type": "TextMessage"
 | |
| 				},
 | |
| 				"endpoint": {
 | |
| 					"required": false,
 | |
| 					"type": "Endpoint"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelConnectedLine": {
 | |
| 			"id": "ChannelConnectedLine",
 | |
| 			"description": "Channel changed Connected Line.",
 | |
| 			"properties": {
 | |
| 				"channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel whose connected line has changed."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ChannelTransfer": {
 | |
| 			"id": "ChannelTransfer",
 | |
| 			"description": "transfer on a channel.",
 | |
| 			"properties": {
 | |
| 				"state": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "Transfer State"
 | |
| 				},
 | |
| 				"refer_to": {
 | |
| 					"required": true,
 | |
| 					"type": "ReferTo",
 | |
| 					"description": "Refer-To information with optionally both affected channels"
 | |
| 				},
 | |
| 				"referred_by": {
 | |
| 					"required": true,
 | |
| 					"type": "ReferredBy",
 | |
| 					"description": "Referred-By SIP Header according rfc3892"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ReferTo": {
 | |
| 			"id": "ReferTo",
 | |
| 			"description": "transfer destination requested by transferee",
 | |
| 			"properties": {
 | |
| 				"requested_destination": {
 | |
| 					"required": true,
 | |
| 					"type": "RequiredDestination"
 | |
| 				},
 | |
| 				"destination_channel": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The Channel Object, that is to be replaced"
 | |
| 				},
 | |
| 				"connected_channel": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "Channel, connected to the to be replaced channel"
 | |
| 				},
 | |
| 				"bridge": {
 | |
| 					"required": false,
 | |
| 					"type": "Bridge",
 | |
| 					"description": "Bridge connecting both destination channels"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"ReferredBy": {
 | |
| 			"id": "ReferredBy",
 | |
| 			"description": "transfer destination requested by transferee",
 | |
| 			"properties": {
 | |
| 				"source_channel": {
 | |
| 					"required": true,
 | |
| 					"type": "Channel",
 | |
| 					"description": "The channel on which the refer was received"
 | |
| 				},
 | |
| 				"connected_channel": {
 | |
| 					"required": false,
 | |
| 					"type": "Channel",
 | |
| 					"description": "Channel, Connected to the channel, receiving the transfer request on."
 | |
| 				},
 | |
| 				"bridge": {
 | |
| 					"required": false,
 | |
| 					"type": "Bridge",
 | |
| 					"description": "Bridge connecting both Channels"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RequiredDestination": {
 | |
| 			"id": "RequiredDestination",
 | |
| 			"description": "Information about the requested destination",
 | |
| 			"properties": {
 | |
| 				"protocol_id": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "the requested protocol-id by the referee in case of SIP channel, this is a SIP Call ID, Mutually exclusive to destination"
 | |
| 				},
 | |
| 				"destination": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "Destination User Part. Only for Blind transfer. Mutually exclusive to protocol_id"
 | |
| 				},
 | |
| 				"additional_protocol_params": {
 | |
| 					"required": false,
 | |
| 					"type": "List[AdditionalParam]",
 | |
| 					"description": "List of additional protocol specific information"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"AdditionalParam": {
 | |
| 			"id": "AdditionalParam",
 | |
| 			"description": "Protocol specific additional parameter",
 | |
| 			"properties": {
 | |
| 				"parameter_name": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Name of the parameter"
 | |
| 				},
 | |
| 				"parameter_value": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Value of the parameter"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RESTHeader": {
 | |
| 			"id": "RESTHeader",
 | |
| 			"description": "REST over Websocket header",
 | |
| 			"properties": {
 | |
| 				"name": {
 | |
| 					"type": "string",
 | |
| 					"description": "Header name",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"value": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Header value"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RESTQueryStringParameter": {
 | |
| 			"id": "RESTQueryStringParameter",
 | |
| 			"description": "REST over Websocket Query String Parameter",
 | |
| 			"properties": {
 | |
| 				"name": {
 | |
| 					"type": "string",
 | |
| 					"description": "Parameter name",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"value": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Parameter value"
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RESTRequest": {
 | |
| 			"id": "RESTRequest",
 | |
| 			"description": "REST over Websocket Request.",
 | |
| 			"properties": {
 | |
| 				"type": {
 | |
| 					"type": "string",
 | |
| 					"description": "Message type.  Must be 'RESTRequest'",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"transaction_id": {
 | |
| 					"type": "string",
 | |
| 					"description": "Opaque transaction id.  Can be any valid string.  Will be returned in any response to this request.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"request_id": {
 | |
| 					"type": "string",
 | |
| 					"description": "Opaque request id.  Can be any valid string.  Will be returned in any response to this request.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"method": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "HTTP method (GET, PUT, POST, DELETE, etc.)"
 | |
| 				},
 | |
| 				"uri": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Resource URI with optional query string parameters."
 | |
| 				},
 | |
| 				"content_type": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "The Content-Type of the message body."
 | |
| 				},
 | |
| 				"query_strings": {
 | |
| 					"required": false,
 | |
| 					"type": "List[RESTQueryStringParameter]",
 | |
| 					"description": "Request query string parameters."
 | |
| 				},
 | |
| 				"message_body": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "Request message body. Only content types application/json and application/x-www-form-urlencoded are supported."
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		"RESTResponse": {
 | |
| 			"id": "RESTResponse",
 | |
| 			"description": "REST over Websocket Response.",
 | |
| 			"properties": {
 | |
| 				"transaction_id": {
 | |
| 					"type": "string",
 | |
| 					"description": "Opaque transaction id.  Will be whatever was specified on the original request.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"request_id": {
 | |
| 					"type": "string",
 | |
| 					"description": "Opaque request id.  Will be whatever was specified on the original request.",
 | |
| 					"required": true
 | |
| 				},
 | |
| 				"status_code": {
 | |
| 					"required": true,
 | |
| 					"type": "int",
 | |
| 					"description": "HTTP status code"
 | |
| 				},
 | |
| 				"reason_phrase": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "HTTP reason phrase"
 | |
| 				},
 | |
| 				"uri": {
 | |
| 					"required": true,
 | |
| 					"type": "string",
 | |
| 					"description": "Original request resource URI"
 | |
| 				},
 | |
| 				"content_type": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "The Content-Type of the message body."
 | |
| 				},
 | |
| 				"message_body": {
 | |
| 					"required": false,
 | |
| 					"type": "string",
 | |
| 					"description": "Response message body"
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |