Любой ресурс о процессе сигнализации

Я использую 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.

Другие вопросы по тегам