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

Я использую Socket.io для реализации процесса сигнализации, такого как подключение, вызов, ответ, отклонение и т. д., а также onUserCalling, onUserRejected и т. д.

Я не знаю, как лучше всего обрабатывать все статусы, например, если A звонит B, в это время статус A будет установлен как «вызов», а статус B будет «onUserCalling». Таким образом, в то время как C не может позвонить ни A, ни B, потому что их статус недоступен.

Но когда все усложняется, очень сложно контролировать статус.

Итак, кто-нибудь знает хороший материал/сообщение в блоге/шаблон по этой проблеме?

Заранее спасибо.


person Kos    schedule 02.07.2013    source источник


Ответы (1)


Похоже, вы ищете машину состояний. О конечных автоматах можно много чего прочитать, но в основном они представляют вещь, которая может находиться в одном из любого количества состояний; состояние машины можно изменить, инициировав соответствующие события на машине.

В вашем случае calling и onUserCalling — это состояния, а call, answer, reject и т. д. — события. Представляя это как конечный автомат, вы можете отслеживать, в каком состоянии находится пользователь и в какие состояния он может перейти в зависимости от событий.

В качестве примера вот код на Plunker, демонстрирующий такой конечный автомат. (Игнорируйте тот факт, что взаимодействие с пользовательским интерфейсом было построено с помощью AngularJS.) Конечный автомат определяется через библиотеку с именем Конечный автомат JavaScript и определяется следующим образом:

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.

person Michelle Tilley    schedule 02.07.2013
comment
Спасибо за ваш ответ. Это действительно помогает! Я попытаюсь использовать вашу библиотеку для реализации того, что я хочу. - person Kos; 02.07.2013
comment
Я рад, что вы нашли это полезным. Стоит отметить, что существует множество реализаций конечного автомата; поиск Google найдет вам несколько, я уверен. Тот, который я упомянул, не мой, но я использую его для своих собственных вещей на JavaScript. - person Michelle Tilley; 02.07.2013