GitHub PullRequestReviewCommentEvent at 2014-07-16 14:47:30
Repository: docs
Actor: Natim
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/mozilla-services/docs/pulls/comments/15001568","id":15001568,"diff_hunk":"@@ -505,3 +670,254 @@ Also the associated errno can be one of:\n - **111 EXPIRED**: This come with a 410 and define a EXPIRE ressource;\n - **113 REQUEST_TOO_LARGE**: This come with a 400 and define a too large request;\n - **201 BACKEND**: This come with a 503 when a third party is not available at the moment.\n+\n+\n+Websockets APIs\n+===============\n+\n+During the setup phase of a call, the websocket protocol is used to let clients broadcast their state to other clients and to listen to changes.\n+\n+The client will establish a WebSockets connection to the resource indicated in the \"progressURL\" when it receives it. The client never closes this connection; that is the responsibility of the server. The times at which the server closes the connection are detailed below. If the server sees the client close the connection, it assumes that the client has failed, and informs the other party of such call failure.\n+\n+For forward compatibility purposes:\n+\n+* Unknown fields in messages are ignored\n+* Unknown message types received by the client (indicating an earlier release)\n+  result in the client sending an \"error\" message ({\"messageType\": \"error\",\n+  \"reason\": \"unknown message\"}). The call setup should continue.\n+* Unknown message types received by the server result in the server sending an\n+  \"error\" message (as above); however, since this situation can only arise due to\n+  a misimplemented client or an out-of-date server, it results in call setup\n+  failure. The server closes the connection.\n+\n+Call Setup States\n+-----------------\n+\n+Call setup goes through the following states:\n+\n+.. image:: /images/loop-call-setup-state.png\n+\n+Call Progress Protocol\n+----------------------\n+\n+Initial Connection (hello)\n+~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Upon connecting to the server, the client sends an immediate \"hello\" message,\n+which serves two purposes: it identifies the call that the progress channel\n+corresponds to (using the \"callId\"), as well as authenticating the connecting\n+user, so that they can be verified to be authorized to view/impact the call\n+setup state.\n+\n+Note that the callId with which this connection is to be associated is encoded\n+as a component of the WSS URL.\n+\n+UA -> Server::\n+\n+   {\n+     \"messageType\": \"hello\",\n+     \"auth\": \"''<authentication information>''\"\n+   }\n+\n+\n+* `auth`: Information to authenticate the user, so that they can be verified to\n+  be authorized to access call setup information. This is the `websocketToken`\n+  returned by a POST to /calls/{token}, POST /calls and GET /calls.\n+\n+If the hello is valid (the callId is known, the auth information is valid, and\n+the authenticated user is a party to the call), then the server responds with a\n+\"hello.\" This \"hello\" includes the current call setup state.\n+\n+Server -> UA::\n+\n+   {\n+     \"messageType\": \"hello\",\n+     \"state\": \"alerting\"\n+     // may contain \"reason\" field for certain states.\n+   }\n+\n+* `state`: See states in \"progress\", below.\n+\n+If the hello is invalid for any reason, then the server sends an \"error\"\n+message, as follows. It then closes the connection.\n+\n+Server -> UA::\n+\n+   {\n+     \"messageType\": \"error\",\n+     \"reason\": \"unknown callId\"\n+   }\n+\n+`reason`: The reason the hello was rejected:\n+\n+* `unknown callId`\n+* `invalid authentication` - The auth information was not valid\n+* `unauthorized` - The auth information was valid, but did not match the\n+   indicated callId\n+\n+Call Progress State Change (progress)\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+The server informs users of the current state of call setup. The state sent to\n+both parties ''is always the same state''. So, for example, when a user rejects\n+a call, he will receive a \"progress\" message with a state of \"terminated\" and a\n+reason of \"rejected.\"\n+\n+Server -> UA::\n+\n+   {\n+     \"messageType\": \"progress\",\n+     \"state\": \"alerting\"\n+     // may contain optional \"reason\" field for certain events.\n+   }\n+\n+Defined states are:\n+\n+* `init`: The call is starting, and the remote party is not yet being alerted.\n+* `alerting`: The called party is being alerted (triggered by remote party\n+   sending a \"hello\" message).\n+* `terminated`: The call is no longer being set up. After sending a\n+  \"terminated\" message, the server closes the WebSockets connection. This message\n+  will include a \"reason\" field with one of the reason values described below.\n+* `connecting`: The called party has indicated that he has answered the call,\n+  but the media is not yet confirmed\n+* `half-connected`: One of the two parties has indicated successful media set\n+  up, but the other has not yet.\n+* `connected`: Both endpoints have reported successfully establishing media.\n+  After sending a \"connected\" message, the server closes the WebSockets\n+  connection.\n+\n+Client Action (action)\n+~~~~~~~~~~~~~~~~~~~~~~\n+\n+During call setup, clients send progress information about their own state so\n+that it can be reflected in the call state.\n+\n+UA -> Server::\n+\n+   {\n+     \"messageType\": \"action\",\n+     \"event\": \"accept\"\n+     // May contain \"reason\" field for certain events\n+   }\n+\n+Defined event types are:\n+\n+* `accept`: Only sent by called party. The user has answered this call. This is\n+  sent before the called party attempts to set up the media.\n+* `media-up`: Sent by both parties. Communications have been successfully\n+  established.\n+* `terminate`: Sent by both parties. Ends attempt to set up call. Includes a\n+  \"reason\" field with one of values detailed below.\n+\n+Termination Reasons\n+-------------------\n+\n+The following reasons appear in \"action\"/\"terminate\" and \"progress\" /\n+\"terminated\" messages. The \"√\" columns indicate whether the indicated element\n+is permitted to generate the reason. When generated a \"terminated\" message as\n+the result of receiving a \"terminate\" action from either client, the server\n+will copy the reason code from the \"terminate\" action message into all\n+resulting \"terminated\" progress messages, ''even if it does not recognize the\n+reason code''.\n+\n+To provide for forwards compatibility, clients must be prepared to process\n+\"terminated\" progress messages with unknown reason codes. The reaction to this\n+situation should be the display of a generic \"call setup failed\" message.\n+\n+If the server receives an action of \"terminate\" with a reason it does not\n+recognize, it copies that reason into the resulting \"terminated\" message.\n+\n+==================   ======    ======    ======    ========================================\n+    Reason           Caller    Callee    Server                    Note\n+==================   ======    ======    ======    ========================================\n+reject                         √                   The called user has declined the call.\n+busy                           √                   The user is logged in, but cannot answer\n+                                                   the call due to some current state\n+                                                   (e.g., DND, in another call).\n+timeout                        √         √         The call setup has timed out (The\n+                                                   called party's client has exceeded the\n+                                                   amount of time it is willing to alert\n+                                                   the user, or one of the server's timers\n+                                                   expired)\n+cancel                √                            The calling party has cancelled a pending\n+                                                   call.\n+media-fail                     √                   The called user has declined the call.\n+unregistered                             √         The called user does not have any\n+                                                   registered push server endpoints.\n+user-unknown                             √         The indicated user id does not exist.\n+connection-failure                       √         The other user's WSS connection closed\n+                                                   unexpectedly.\n+answered-elsewhere                       √         When the called user has more than one\n+                                                   device alerting at the same time and\n+                                                   accepts on one device, a \"terminated\"\n+                                                   with this reason code is sent to all\n+                                                   other devices that had been alerting.\n+==================   ======    ======    ======    ========================================\n+\n+Timer Supervision\n+-----------------\n+\n+Server Timers\n+~~~~~~~~~~~~~\n+\n+The server uses three timers to ensure that the call created by a setup attempt\n+is cleaned up in a timely fashion.\n+\n+Supervisory Timer\n+\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n+\n+After responding to a <tt>POST /call/{token}</tt> or <tt>POST /call/user</tt>\n+message, the server starts a supervisory timer of 10 seconds.\n+\n+* If the calling user does not connect and send a \"hello\" in this time period,\n+  the server considers the call to be failed. The called user, if connected,\n+  will receive a \"progress\"/\"terminated\" message with a reason of \"timeout\".\n+* If the called user does not connect and send a \"hello\" in this time period,\n+  the server considers the call to be failed. The calling user, if connected,\n+  will receive a \"progress\"/\"terminated\" message with a reason of \"timeout\".\n+\n+Ringing Timer\n+\"\"\"\"\"\"\"\"\"\"\"\"\"\n+\n+Upon receiving a \"hello\" from the called user, the server starts a ringing\n+timer of 30 seconds. If the called user does not send an \"accept\" message in\n+this time period, then both parties will receive a \"progress\"/\"terminated\"\n+message with a reason of \"timeout\".\n+\n+Connection Timer\n+\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n+\n+Upon receiving an \"accept\" from the called user, the server starts a connection\n+timer of 10 seconds. If the call setup state does not reach \"connected\" in this\n+time period, then both parties will receive a \"progress\"/\"terminated\" message\n+with a reason of \"timeout\".\n+\n+Client Timers\n+~~~~~~~~~~~~~\n+\n+Response Timer\n+\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n+\n+Every client message triggers a response from the server: \"hello\" results in\n+\"hello\" or \"error\"; and \"action\" will always cause a corresponding \"progress\"\n+message to be sent. When the client sends a message, it sets a timer for 5","path":"source/loop/apis.rst","position":961,"original_position":961,"commit_id":"12a006890b12de81375799584e3fbd1b96820d5f","original_commit_id":"12a006890b12de81375799584e3fbd1b96820d5f","user":{"login":"Natim","id":229453,"avatar_url":"https://avatars.githubusercontent.com/u/229453?","gravatar_id":"48e87ebebf7bee2a0ca10aa2362795a6","url":"https://api.github.com/users/Natim","html_url":"https://github.com/Natim","followers_url":"https://api.github.com/users/Natim/followers","following_url":"https://api.github.com/users/Natim/following{/other_user}","gists_url":"https://api.github.com/users/Natim/gists{/gist_id}","starred_url":"https://api.github.com/users/Natim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Natim/subscriptions","organizations_url":"https://api.github.com/users/Natim/orgs","repos_url":"https://api.github.com/users/Natim/repos","events_url":"https://api.github.com/users/Natim/events{/privacy}","received_events_url":"https://api.github.com/users/Natim/received_events","type":"User","site_admin":false},"body":"I think this can be handled on the on(\"close\") of the websocket since the server is already providing this timers.","created_at":"2014-07-16T14:47:30Z","updated_at":"2014-07-16T14:47:30Z","html_url":"https://github.com/mozilla-services/docs/pull/23#discussion_r15001568","pull_request_url":"https://api.github.com/repos/mozilla-services/docs/pulls/23","_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/docs/pulls/comments/15001568"},"html":{"href":"https://github.com/mozilla-services/docs/pull/23#discussion_r15001568"},"pull_request":{"href":"https://api.github.com/repos/mozilla-services/docs/pulls/23"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla-services/docs/pulls/23","id":18471338,"html_url":"https://github.com/mozilla-services/docs/pull/23","diff_url":"https://github.com/mozilla-services/docs/pull/23.diff","patch_url":"https://github.com/mozilla-services/docs/pull/23.patch","issue_url":"https://api.github.com/repos/mozilla-services/docs/issues/23","number":23,"state":"open","title":"Update loop doc","user":{"login":"ametaireau","id":67073,"avatar_url":"https://avatars.githubusercontent.com/u/67073?","gravatar_id":"1b3ec4d4db1722e0459151ff9fd054f2","url":"https://api.github.com/users/ametaireau","html_url":"https://github.com/ametaireau","followers_url":"https://api.github.com/users/ametaireau/followers","following_url":"https://api.github.com/users/ametaireau/following{/other_user}","gists_url":"https://api.github.com/users/ametaireau/gists{/gist_id}","starred_url":"https://api.github.com/users/ametaireau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ametaireau/subscriptions","organizations_url":"https://api.github.com/users/ametaireau/orgs","repos_url":"https://api.github.com/users/ametaireau/repos","events_url":"https://api.github.com/users/ametaireau/events{/privacy}","received_events_url":"https://api.github.com/users/ametaireau/received_events","type":"User","site_admin":false},"body":"@tarekziade @Natim r?","created_at":"2014-07-16T14:32:53Z","updated_at":"2014-07-16T14:47:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fa9d265501c07be1c73c0883bc2592e1a973811a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla-services/docs/pulls/23/commits","review_comments_url":"https://api.github.com/repos/mozilla-services/docs/pulls/23/comments","review_comment_url":"https://api.github.com/repos/mozilla-services/docs/pulls/comments/{number}","comments_url":"https://api.github.com/repos/mozilla-services/docs/issues/23/comments","statuses_url":"https://api.github.com/repos/mozilla-services/docs/statuses/12a006890b12de81375799584e3fbd1b96820d5f","head":{"label":"mozilla-services:update-loop-doc","ref":"update-loop-doc","sha":"12a006890b12de81375799584e3fbd1b96820d5f","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?","gravatar_id":"a41a81f9188770933a4b54382c29cae4","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":3320203,"name":"docs","full_name":"mozilla-services/docs","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?","gravatar_id":"a41a81f9188770933a4b54382c29cae4","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/docs","description":"Documentation for Mozilla Services Services","fork":false,"url":"https://api.github.com/repos/mozilla-services/docs","forks_url":"https://api.github.com/repos/mozilla-services/docs/forks","keys_url":"https://api.github.com/repos/mozilla-services/docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/docs/teams","hooks_url":"https://api.github.com/repos/mozilla-services/docs/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/docs/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/docs/events","assignees_url":"https://api.github.com/repos/mozilla-services/docs/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/docs/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/docs/tags","blobs_url":"https://api.github.com/repos/mozilla-services/docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/docs/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/docs/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/docs/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/docs/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/docs/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/docs/subscription","commits_url":"https://api.github.com/repos/mozilla-services/docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/docs/issues/comments/{number}","contents_url":"https://api.github.com/repos/mozilla-services/docs/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/docs/merges","archive_url":"https://api.github.com/repos/mozilla-services/docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/docs/downloads","issues_url":"https://api.github.com/repos/mozilla-services/docs/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/docs/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/docs/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/docs/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/docs/releases{/id}","created_at":"2012-01-31T23:51:00Z","updated_at":"2014-06-30T09:34:12Z","pushed_at":"2014-07-16T14:32:30Z","git_url":"git://github.com/mozilla-services/docs.git","ssh_url":"git@github.com:mozilla-services/docs.git","clone_url":"https://github.com/mozilla-services/docs.git","svn_url":"https://github.com/mozilla-services/docs","homepage":"","size":56323,"stargazers_count":7,"watchers_count":7,"language":"Shell","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":9,"mirror_url":null,"open_issues_count":1,"forks":9,"open_issues":1,"watchers":7,"default_branch":"master"}},"base":{"label":"mozilla-services:master","ref":"master","sha":"e00b99f9ccd948e8fc5ce62afe0c13a6f6ad1eb0","user":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?","gravatar_id":"a41a81f9188770933a4b54382c29cae4","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"repo":{"id":3320203,"name":"docs","full_name":"mozilla-services/docs","owner":{"login":"mozilla-services","id":1066228,"avatar_url":"https://avatars.githubusercontent.com/u/1066228?","gravatar_id":"a41a81f9188770933a4b54382c29cae4","url":"https://api.github.com/users/mozilla-services","html_url":"https://github.com/mozilla-services","followers_url":"https://api.github.com/users/mozilla-services/followers","following_url":"https://api.github.com/users/mozilla-services/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-services/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-services/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-services/subscriptions","organizations_url":"https://api.github.com/users/mozilla-services/orgs","repos_url":"https://api.github.com/users/mozilla-services/repos","events_url":"https://api.github.com/users/mozilla-services/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-services/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-services/docs","description":"Documentation for Mozilla Services Services","fork":false,"url":"https://api.github.com/repos/mozilla-services/docs","forks_url":"https://api.github.com/repos/mozilla-services/docs/forks","keys_url":"https://api.github.com/repos/mozilla-services/docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-services/docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-services/docs/teams","hooks_url":"https://api.github.com/repos/mozilla-services/docs/hooks","issue_events_url":"https://api.github.com/repos/mozilla-services/docs/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-services/docs/events","assignees_url":"https://api.github.com/repos/mozilla-services/docs/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-services/docs/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-services/docs/tags","blobs_url":"https://api.github.com/repos/mozilla-services/docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-services/docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-services/docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-services/docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-services/docs/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-services/docs/languages","stargazers_url":"https://api.github.com/repos/mozilla-services/docs/stargazers","contributors_url":"https://api.github.com/repos/mozilla-services/docs/contributors","subscribers_url":"https://api.github.com/repos/mozilla-services/docs/subscribers","subscription_url":"https://api.github.com/repos/mozilla-services/docs/subscription","commits_url":"https://api.github.com/repos/mozilla-services/docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-services/docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-services/docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-services/docs/issues/comments/{number}","contents_url":"https://api.github.com/repos/mozilla-services/docs/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-services/docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-services/docs/merges","archive_url":"https://api.github.com/repos/mozilla-services/docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-services/docs/downloads","issues_url":"https://api.github.com/repos/mozilla-services/docs/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-services/docs/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-services/docs/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-services/docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-services/docs/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-services/docs/releases{/id}","created_at":"2012-01-31T23:51:00Z","updated_at":"2014-06-30T09:34:12Z","pushed_at":"2014-07-16T14:32:30Z","git_url":"git://github.com/mozilla-services/docs.git","ssh_url":"git@github.com:mozilla-services/docs.git","clone_url":"https://github.com/mozilla-services/docs.git","svn_url":"https://github.com/mozilla-services/docs","homepage":"","size":56323,"stargazers_count":7,"watchers_count":7,"language":"Shell","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":9,"mirror_url":null,"open_issues_count":1,"forks":9,"open_issues":1,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla-services/docs/pulls/23"},"html":{"href":"https://github.com/mozilla-services/docs/pull/23"},"issue":{"href":"https://api.github.com/repos/mozilla-services/docs/issues/23"},"comments":{"href":"https://api.github.com/repos/mozilla-services/docs/issues/23/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla-services/docs/pulls/23/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla-services/docs/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/mozilla-services/docs/pulls/23/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla-services/docs/statuses/12a006890b12de81375799584e3fbd1b96820d5f"}}}}