Example #1
0
 public function onUnsubscribe(CM_Model_Stream_Subscribe $streamSubscribe)
 {
     $unsubscriber = $streamSubscribe->getUser();
     if ($unsubscriber && !$this->isSubscriber($unsubscriber, $streamSubscribe)) {
         $unsubscriber->setOfflineStamp();
     }
 }
Example #2
0
 public function onUnsubscribe(CM_Model_Stream_Subscribe $streamSubscribe)
 {
     if ($this->hasUser()) {
         $user = $streamSubscribe->getUser();
         if ($user && !$this->isSubscriber($user, $streamSubscribe)) {
             $delayedJobQueue = CM_Service_Manager::getInstance()->getDelayedJobQueue();
             $delayedJobQueue->addJob(new CM_User_OfflineJob(), ['user' => $user], CM_Model_User::OFFLINE_DELAY);
         }
     }
 }
Example #3
0
 /**
  * @param CM_Model_Stream_Subscribe $streamSubscribe
  * @return bool
  * @throws CM_Exception_Invalid
  */
 protected function _isSubscribeAllowed(CM_Model_Stream_Subscribe $streamSubscribe)
 {
     /** @var CM_Model_StreamChannel_Media|CM_StreamChannel_DisallowInterface $streamChannel */
     $streamChannel = $streamSubscribe->getStreamChannel();
     if (!$streamChannel instanceof CM_StreamChannel_DisallowInterface) {
         throw new CM_Exception_Invalid('Streamchannel does not disallow client-connections', ['streamChannel' => $streamChannel]);
     }
     if ($streamSubscribe->getAllowedUntil() < time()) {
         $canSubscribeUntil = $streamChannel->canSubscribe($streamSubscribe->getUser(), $streamSubscribe->getAllowedUntil());
         $streamSubscribe->setAllowedUntil($canSubscribeUntil);
         if ($streamSubscribe->getAllowedUntil() < time()) {
             return false;
         }
     }
     return true;
 }
Example #4
0
 public function testCheckStreams()
 {
     $mockAdapter = $this->getMockForAbstractClass('CM_Stream_Adapter_Video_Abstract', array(), 'CM_Stream_Adapter_Video_Mock', true, true, true, array('_stopStream', 'getType'));
     $mockAdapter->expects($this->exactly(2))->method('_stopStream')->will($this->returnValue(1));
     $mockAdapter->expects($this->any())->method('getType')->will($this->returnValue(1));
     CM_Config::get()->CM_Model_StreamChannel_Abstract->types[CM_Model_StreamChannel_Video_Mock::getTypeStatic()] = 'CM_Model_StreamChannel_Video_Mock';
     $wowza = $wowza = $this->getMock('CM_Stream_Video', array('getAdapter'));
     $wowza->expects($this->any())->method('getAdapter')->will($this->returnValue($mockAdapter));
     /** @var $wowza CM_Stream_Video */
     // allowedUntil will be updated, if stream has expired and its user isn't $userUnchanged, hardcoded in CM_Model_StreamChannel_Video_Mock::canSubscribe() using getOnline()
     $userUnchanged = CMTest_TH::createUser();
     $userUnchanged->setOnline();
     $streamChannel = CM_Model_StreamChannel_Video_Mock::createStatic(array('key' => 'foo1', 'serverId' => 1, 'adapterType' => 1, 'width' => 100, 'height' => 100, 'thumbnailCount' => 0));
     $streamSubscribeUnchanged1 = CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => $userUnchanged, 'key' => 'foo1_2', 'start' => time()));
     $streamSubscribeUnchanged2 = CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => CMTest_TH::createUser(), 'key' => 'foo1_4', 'start' => time()));
     $streamSubscribeChanged1 = CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => CMTest_TH::createUser(), 'key' => 'foo1_3', 'start' => time()));
     $streamPublishUnchanged1 = CM_Model_Stream_Publish::createStatic(array('streamChannel' => $streamChannel, 'user' => $userUnchanged, 'key' => 'foo1_2', 'start' => time()));
     $streamPublishChanged1 = CM_Model_Stream_Publish::createStatic(array('streamChannel' => CM_Model_StreamChannel_Video_Mock::createStatic(array('key' => 'foo2', 'serverId' => 1, 'adapterType' => 1, 'width' => 100, 'height' => 100, 'thumbnailCount' => 0)), 'user' => CMTest_TH::createUser(), 'key' => 'foo2_1', 'start' => time()));
     $this->assertSameTime($streamSubscribeUnchanged1->getAllowedUntil(), time() + 10);
     $this->assertSameTime($streamSubscribeUnchanged2->getAllowedUntil(), time() + 100);
     $this->assertSameTime($streamSubscribeChanged1->getAllowedUntil(), time() + 100);
     $this->assertSameTime($streamPublishUnchanged1->getAllowedUntil(), time() + 10);
     $this->assertSameTime($streamPublishChanged1->getAllowedUntil(), time() + 100);
     CMTest_TH::timeForward(200);
     $wowza->checkStreams();
     $this->assertEquals($streamSubscribeUnchanged1->getAllowedUntil() + 10, $streamSubscribeUnchanged1->_change()->getAllowedUntil());
     $this->assertEquals($streamSubscribeUnchanged2->getAllowedUntil() + 100, $streamSubscribeUnchanged2->_change()->getAllowedUntil());
     $this->assertEquals($streamSubscribeChanged1->getAllowedUntil() + 100, $streamSubscribeChanged1->_change()->getAllowedUntil());
     $this->assertEquals($streamPublishUnchanged1->getAllowedUntil() + 10, $streamPublishUnchanged1->_change()->getAllowedUntil());
     $this->assertEquals($streamPublishChanged1->getAllowedUntil() + 100, $streamPublishChanged1->_change()->getAllowedUntil());
 }
Example #5
0
 public function testSynchronizeMissingInWowza()
 {
     $streamChannel = CMTest_TH::createStreamChannel();
     $streamPublish = CMTest_TH::createStreamPublish(null, $streamChannel);
     $streamSubscribe = CMTest_TH::createStreamSubscribe(null, $streamChannel);
     $wowza = $this->getMock('CM_Stream_Adapter_Video_Wowza', array('_fetchStatus'));
     $json = $this->_generateWowzaData(array());
     $wowza->expects($this->any())->method('_fetchStatus')->will($this->returnValue($json));
     /** @var $wowza CM_Stream_Video */
     $wowza->synchronize();
     $this->assertEquals($streamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $wowza->getType()));
     $this->assertEquals($streamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertEquals($streamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
     CMTest_TH::timeForward(5);
     $wowza->synchronize();
     $this->assertNull(CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $wowza->getType()));
     $this->assertNull(CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertNull(CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
 }
Example #6
0
 public function testUnsetUser()
 {
     $user = CMTest_TH::createUser();
     $streamChannel = CMTest_TH::createStreamChannel();
     /** @var CM_Model_Stream_Subscribe $streamSubscribe */
     $streamSubscribe = CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => $user, 'start' => time(), 'key' => str_repeat('a', 100)));
     $this->assertEquals($user, $streamSubscribe->getUser());
     $streamSubscribe->unsetUser();
     $this->assertNull($streamSubscribe->getUser());
 }
Example #7
0
 /**
  * @expectedException CM_Exception_Invalid
  * @expectedExceptionMessage not valid
  */
 public function testCreateInvalidStreamChannel()
 {
     $user = CMTest_TH::createUser();
     $streamChannel = $this->getMockBuilder('CM_Model_StreamChannel_Video')->setMethods(array('isValid'))->getMock();
     $streamChannel->expects($this->any())->method('isValid')->will($this->returnValue(false));
     /** @var CM_Model_StreamChannel_Video $streamChannel */
     CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => $user, 'start' => time(), 'key' => 'foo'));
 }
Example #8
0
File: TH.php Project: aladin1394/CM
 /**
  * @param CM_Model_User|null                   $user
  * @param CM_Model_StreamChannel_Abstract|null $streamChannel
  * @return CM_Model_Stream_Subscribe
  */
 public static function createStreamSubscribe(CM_Model_User $user = null, CM_Model_StreamChannel_Abstract $streamChannel = null)
 {
     if (is_null($streamChannel)) {
         $streamChannel = self::createStreamChannel();
     }
     return CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => $user, 'start' => time(), 'key' => rand(1, 10000) . '_' . rand(1, 100)));
 }
Example #9
0
 /**
  * @param string             $channel
  * @param string             $clientKey
  * @param int                $start
  * @param CM_Model_User|null $user
  * @throws CM_Exception_Invalid
  */
 protected function _subscribe($channel, $clientKey, $start, CM_Model_User $user = null)
 {
     $channelData = CM_Model_StreamChannel_Message::extractStatusChannelData($channel);
     $channelKey = $channelData['key'];
     $channelType = $channelData['type'];
     $streamChannel = CM_Model_StreamChannel_Message::findByKeyAndAdapter($channelKey, $this->getType());
     if ($streamChannel && $streamChannel->getType() != $channelType) {
         throw new CM_Exception_Invalid('StreamChannel type `' . $streamChannel->getType() . '` doesn\'t match expected value `' . $channelType . '`');
     }
     if (!$streamChannel) {
         /** @var $streamChannel CM_Model_StreamChannel_Message */
         $streamChannel = CM_Model_StreamChannel_Message::createType($channelType, array('key' => $channelKey, 'adapterType' => $this->getType()));
     }
     $streamChannelSubscribes = $streamChannel->getStreamSubscribes();
     if ($streamChannelSubscribes->findKey($clientKey)) {
         return;
     }
     CM_Model_Stream_Subscribe::createStatic(array('user' => $user, 'start' => $start, 'streamChannel' => $streamChannel, 'key' => $clientKey));
 }
Example #10
0
 public function testIsSubscriberOrPublisher()
 {
     /** @var CM_Model_StreamChannel_Mock $streamChannel */
     $streamChannel = CM_Model_StreamChannel_Mock::createStatic(array('key' => 'foo', 'adapterType' => CM_MessageStream_Adapter_SocketRedis::getTypeStatic()));
     $user1 = CMTest_TH::createUser();
     $publish1 = CM_Model_Stream_Publish::createStatic(array('streamChannel' => $streamChannel, 'user' => $user1, 'start' => 123123, 'key' => '1'));
     $subscribe1 = CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => $user1, 'start' => 123123, 'key' => '2'));
     $this->assertTrue($streamChannel->isSubscriberOrPublisher($user1));
     $this->assertTrue($streamChannel->isSubscriberOrPublisher($user1, $publish1));
     $subscribe1->delete();
     $this->assertTrue($streamChannel->isSubscriberOrPublisher($user1));
     $this->assertFalse($streamChannel->isSubscriberOrPublisher($user1, $publish1));
     $publish1->delete();
     $this->assertFalse($streamChannel->isSubscriberOrPublisher($user1));
 }
Example #11
0
 /**
  * @param array $status
  */
 private function _testSynchronize($status)
 {
     $adapter = $this->getMockBuilder('CM_MessageStream_Adapter_SocketRedis')->disableOriginalConstructor()->setMethods(array('_fetchStatus'))->getMock();
     $adapter->expects($this->any())->method('_fetchStatus')->will($this->returnValue($status));
     /** @var $adapter CM_MessageStream_Adapter_SocketRedis */
     $adapter->synchronize();
     $streamChannels = new CM_Paging_StreamChannel_AdapterType($adapter->getType());
     $this->assertSame(count($status), $streamChannels->getCount());
     /** @var $streamChannel CM_Model_StreamChannel_Message */
     foreach ($streamChannels as $streamChannel) {
         $this->assertInstanceOf('CM_Model_StreamChannel_Message', $streamChannel);
         $channel = $streamChannel->getKey() . ':' . CM_Model_StreamChannel_Message::getTypeStatic();
         $this->assertSame(count($status[$channel]['subscribers']), $streamChannel->getStreamSubscribes()->getCount());
     }
     foreach ($status as $channel => $channelData) {
         list($channelKey, $channelType) = explode(':', $channel);
         $streamChannel = CM_Model_StreamChannel_Message::findByKeyAndAdapter($channelKey, $adapter->getType());
         $this->assertInstanceOf('CM_Model_StreamChannel_Message', $streamChannel);
         foreach ($channelData['subscribers'] as $clientKey => $subscriberData) {
             $subscribe = CM_Model_Stream_Subscribe::findByKeyAndChannel($clientKey, $streamChannel);
             $this->assertInstanceOf('CM_Model_Stream_Subscribe', $subscribe);
             $this->assertSameTime(time() - CM_MessageStream_Adapter_SocketRedis::SYNCHRONIZE_DELAY - 1, $subscribe->getStart());
         }
     }
 }
Example #12
0
 public function testSynchronizeMissingInJanus()
 {
     $streamChannel = CMTest_TH::createStreamChannel(null, CM_Janus_Service::getTypeStatic());
     $streamPublish = CMTest_TH::createStreamPublish(null, $streamChannel);
     $streamSubscribe = CMTest_TH::createStreamSubscribe(null, $streamChannel);
     $existingStreamChannel = CMTest_TH::createStreamChannel(null, CM_Janus_Service::getTypeStatic());
     $existingStreamPublish = CMTest_TH::createStreamPublish(null, $existingStreamChannel);
     $existingStreamSubscribe = CMTest_TH::createStreamSubscribe(null, $existingStreamChannel);
     $emptyStreamChannel = CMTest_TH::createStreamChannel(null, CM_Janus_Service::getTypeStatic());
     $location = $this->mockClass('CM_Geo_Point')->newInstanceWithoutConstructor();
     $server1 = $this->mockClass('CM_Janus_Server')->newInstance([1, 'key', 'http://mock', 'ws://mock', [], $location]);
     /** @var CM_Janus_ServerList|\Mocka\AbstractClassTrait $serverList */
     $serverList = $this->mockObject('CM_Janus_ServerList');
     $serverList->mockMethod('getAll')->set([$server1]);
     /** @var CM_Janus_HttpApiClient|\Mocka\AbstractClassTrait $httpApiClient */
     $httpApiClient = $this->mockClass('CM_Janus_HttpApiClient')->newInstanceWithoutConstructor();
     $httpApiClient->mockMethod('fetchStatus')->set([['id' => $existingStreamPublish->getKey(), 'channelName' => $existingStreamChannel->getKey(), 'isPublish' => true], ['id' => $existingStreamSubscribe->getKey(), 'channelName' => $existingStreamChannel->getKey(), 'isPublish' => false]]);
     $janus = new CM_Janus_Service($serverList, $httpApiClient);
     $janus->synchronize();
     $this->assertEquals($streamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $janus->getType()));
     $this->assertEquals($streamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertEquals($streamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
     $this->assertEquals($existingStreamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($existingStreamChannel->getKey(), $janus->getType()));
     $this->assertEquals($existingStreamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($existingStreamPublish->getKey(), $existingStreamChannel));
     $this->assertEquals($existingStreamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($existingStreamSubscribe->getKey(), $existingStreamChannel));
     $this->assertNull(CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($emptyStreamChannel->getKey(), $janus->getType()));
     CMTest_TH::timeForward(5);
     $janus->synchronize();
     $this->assertNull(CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamChannel->getKey(), $janus->getType()));
     $this->assertNull(CM_Model_Stream_Publish::findByKeyAndChannel($streamPublish->getKey(), $streamChannel));
     $this->assertNull(CM_Model_Stream_Subscribe::findByKeyAndChannel($streamSubscribe->getKey(), $streamChannel));
     $this->assertEquals($existingStreamChannel, CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($existingStreamChannel->getKey(), $janus->getType()));
     $this->assertEquals($existingStreamPublish, CM_Model_Stream_Publish::findByKeyAndChannel($existingStreamPublish->getKey(), $existingStreamChannel));
     $this->assertEquals($existingStreamSubscribe, CM_Model_Stream_Subscribe::findByKeyAndChannel($existingStreamSubscribe->getKey(), $existingStreamChannel));
 }
Example #13
0
 /**
  * @param string $streamName
  * @param string $clientKey
  * @param int    $start
  * @param string $data
  * @throws CM_Exception_NotAllowed
  */
 public function subscribe($streamName, $clientKey, $start, $data)
 {
     $streamName = (string) $streamName;
     $clientKey = (string) $clientKey;
     $start = (int) $start;
     $data = (string) $data;
     $user = null;
     $params = CM_Params::factory(CM_Params::jsonDecode($data), true);
     if ($params->has('sessionId')) {
         if ($session = CM_Session::findById($params->getString('sessionId'))) {
             $user = $session->getUser(false);
         }
     }
     /** @var CM_Model_StreamChannel_Abstract $streamChannel */
     $streamChannel = CM_Model_StreamChannel_Abstract::findByKeyAndAdapter($streamName, $this->getType());
     if (!$streamChannel) {
         throw new CM_Exception_NotAllowed();
     }
     try {
         CM_Model_Stream_Subscribe::createStatic(array('streamChannel' => $streamChannel, 'user' => $user, 'start' => $start, 'key' => $clientKey));
     } catch (CM_Exception $ex) {
         throw new CM_Exception_NotAllowed('Cannot subscribe: ' . $ex->getMessage());
     }
 }
Example #14
0
 /**
  * @param CM_Model_Stream_Subscribe $videoStreamSubscribe
  * @return bool
  */
 public function contains(CM_Model_Stream_Subscribe $videoStreamSubscribe)
 {
     return in_array($videoStreamSubscribe->getId(), $this->getItemsRaw());
 }
Example #15
0
 /**
  * @param CM_Model_StreamChannel_Abstract $streamChannel
  * @param CM_Model_User                   $user
  * @param string                          $clientKey
  * @param int                             $start
  * @return CM_Model_Stream_Subscribe
  * @throws CM_Exception_NotAllowed
  * @throws CM_Exception_Invalid
  */
 public function createStreamSubscribe(CM_Model_StreamChannel_Abstract $streamChannel, CM_Model_User $user, $clientKey, $start)
 {
     return CM_Model_Stream_Subscribe::createStatic(['streamChannel' => $streamChannel, 'user' => $user, 'start' => (int) $start, 'key' => (string) $clientKey]);
 }