Любой ресурс о процессе сигнализации
Я использую Socket.io для реализации процесса сигнализации, такого как соединение, вызов, ответ, отклонение и т. Д., А также onUserCalling, onUserRejected и т. Д.
Я не знаю, как лучше всего обрабатывать все состояния, например, если A вызывает B, в это время статус A будет установлен как "вызывающий", а статус B будет "onUserCalling". Таким образом, в то время как C не может ни позвонить, ни A, ни B, потому что их статус недоступен.
Но когда все усложняется, очень сложно контролировать статус.
Так кто-нибудь знает хороший материал / сообщение в блоге / шаблон по этой проблеме?
Заранее спасибо.
1 ответ
Похоже, вы ищете конечный автомат. Вы можете много читать на конечных автоматах, но в основном они представляют собой то, что может находиться в одном из множества состояний; состояние машины можно изменить, вызвав соответствующие события на машине.
В твоем случае, calling
а также onUserCalling
являются государствами, и call
, answer
, reject
и т. д. являются событиями. Представляя это как конечный автомат, вы можете отслеживать, в каком состоянии находится пользователь и в какие состояния он может переходить, основываясь на событиях.
В качестве примера, вот некоторый код на Plunker, который демонстрирует такой конечный автомат. (Не обращайте внимания на тот факт, что взаимодействие с пользовательским интерфейсом было построено с помощью AngularJS.) Конечный автомат определяется с помощью библиотеки с именем JavaScript State Machine и определяется так:
StateMachine.create({
initial: 'ready',
events: [
{ name: 'placeCall', from: 'ready', to: 'calling' },
{ name: 'receiveCall', from: 'ready', to: 'callWaiting' },
{ name: 'callAnswered', from: 'calling', to: 'inCall' },
{ name: 'callRejected', from: 'calling', to: 'ready' },
{ name: 'answerCall', from: 'callWaiting', to: 'inCall' },
{ name: 'rejectCall', from: 'callWaiting', to: 'ready' },
{ name: 'hangUp', from: ['calling', 'inCall'], to: 'ready' }
]
});
Это говорит о том, что когда машина находится в ready
состояние, мы можем вызвать placeCall
событие, чтобы изменить состояние calling
или мы можем вызвать receiveCall
событие, чтобы изменить состояние на callWaiting
, После того, как состояние было изменено на calling
мы можем перейти к inCall
состояние или обратно ready
запуская callAnswered
или же callRejected
события соответственно.
Библиотека конечного автомата может просмотреть определение событий и сообщить, какие события разрешено запускать, основываясь на текущем состоянии компьютера. В этом примере я использовал это только для включения кнопок, которые будут запускать разрешенные события.
Большинство библиотек конечных автоматов, включая библиотеку JavaScript, которую я здесь использовал, позволяют вам предоставлять обратные вызовы, когда вы входите или выходите из определенных событий; эта конкретная библиотека также допускает асинхронные переходы событий, которые могут помочь при использовании библиотеки с асинхронным кодом Node.js. Вы можете найти больше информации в readme.