{"action":"closed","number":5359,"pull_request":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/5359","id":40279546,"html_url":"https://github.com/highfidelity/hifi/pull/5359","diff_url":"https://github.com/highfidelity/hifi/pull/5359.diff","patch_url":"https://github.com/highfidelity/hifi/pull/5359.patch","issue_url":"https://api.github.com/repos/highfidelity/hifi/issues/5359","number":5359,"state":"closed","locked":false,"title":"Network Protocol Refactor","user":{"login":"birarda","id":724069,"avatar_url":"https://avatars.githubusercontent.com/u/724069?v=3","gravatar_id":"","url":"https://api.github.com/users/birarda","html_url":"https://github.com/birarda","followers_url":"https://api.github.com/users/birarda/followers","following_url":"https://api.github.com/users/birarda/following{/other_user}","gists_url":"https://api.github.com/users/birarda/gists{/gist_id}","starred_url":"https://api.github.com/users/birarda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/birarda/subscriptions","organizations_url":"https://api.github.com/users/birarda/orgs","repos_url":"https://api.github.com/users/birarda/repos","events_url":"https://api.github.com/users/birarda/events{/privacy}","received_events_url":"https://api.github.com/users/birarda/received_events","type":"User","site_admin":false},"body":"This pull request contains many changes to the networking library and its callers. We do not expect any performance gains from these changes (other than fewer packet copies) - these were foundational changes that lay the groundwork for the UDT protocol we will implement next. The new classes/APIs are breifly summarized below.\r\n\r\n### NLPacket / Packet\r\n\r\nPackets are now written to and read from via the NLPacket class (a subclass of Packet). NLPacket does the following:\r\n\r\n* writes the header of the packet for you on send\r\n* reads header data on receive\r\n* allocates memory up to `MAX_PACKET_SIZE` (or enough based on the payload size you ask for)\r\n* offers easy reading and writing via `QIODevice` methods and some additional custom methods\r\n* uses move semantics (`std::unique_ptr`) to reduce memory copying \r\n\r\nOnce you've used the NLPacket static methods to get an `std::unique_ptr` to an `NLPacket`, you'll call one of the various `LimitedNodeList` `sendPacket` methods to send off the packet to a `Node&` or `HifiSockAddr&`. Most callers will be able to construct a packet and use `std::move` to transfer ownership of that packet to the `LimitedNodeList`. In some cases where an unreliable packet is reused, you can call `sendUnreliablePacket` to maintain ownership of the packet after sending it.\r\n\r\n### NLPacketList / PacketList\r\n\r\n`NLPacketList` is another `QIODevice` subclass that helps callers fill multiple packets with segments of data up to the MTU size. It will automatically break the segments of data you call it with into seperate packets, each with the correct header for that packet type. For example, the domain-server uses an `NLPacketList` to quickly create the packets it needs to send a DomainList packet.\r\n\r\n### PacketReceiver\r\n\r\nThere is now one place across assignment-client, domain-server and Interface that packets are received: the `PacketReceiver`. \r\n\r\nThe `NodeList` and the `PacketReceiver` are together on their own thread, and the `PacketReceiver` will rip packets off the wire and use `QMetaMethod::invoke` to dispatch them to its registered listeners. Classes that want to receive packets of a particular type call `registerPacketListener` or `registerPacketListenerForTypes` so that a slot of theirs will be called with a verified packet (and optionally the `SharedNodePointer` for the sending node).\r\n\r\n### PacketListener\r\n\r\nThe `PacketListener` is an amazing class that @huffman never believed in from the start. I am sad to say that it will never make it to master. We would appreciate a moment of silence at this time.\r\n\r\n![pic](https://cloud.githubusercontent.com/assets/724069/8758791/6ca2c7b4-2c9d-11e5-9ca3-625665044152.jpg)\r\n\r\nI recommend this track to go along with your moment of silence: https://www.youtube.com/watch?v=tcrfvP11Hbo.","created_at":"2015-07-17T23:08:43Z","updated_at":"2015-07-20T21:30:58Z","closed_at":"2015-07-20T21:30:58Z","merged_at":"2015-07-20T21:30:58Z","merge_commit_sha":"f1f9870f5496495195d5bcf84e51d89c273b099f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/highfidelity/hifi/pulls/5359/commits","review_comments_url":"https://api.github.com/repos/highfidelity/hifi/pulls/5359/comments","review_comment_url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/highfidelity/hifi/issues/5359/comments","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/462ff9772289a03ded491796dfb9d64553fc8b62","head":{"label":"birarda:protocol","ref":"protocol","sha":"462ff9772289a03ded491796dfb9d64553fc8b62","user":{"login":"birarda","id":724069,"avatar_url":"https://avatars.githubusercontent.com/u/724069?v=3","gravatar_id":"","url":"https://api.github.com/users/birarda","html_url":"https://github.com/birarda","followers_url":"https://api.github.com/users/birarda/followers","following_url":"https://api.github.com/users/birarda/following{/other_user}","gists_url":"https://api.github.com/users/birarda/gists{/gist_id}","starred_url":"https://api.github.com/users/birarda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/birarda/subscriptions","organizations_url":"https://api.github.com/users/birarda/orgs","repos_url":"https://api.github.com/users/birarda/repos","events_url":"https://api.github.com/users/birarda/events{/privacy}","received_events_url":"https://api.github.com/users/birarda/received_events","type":"User","site_admin":false},"repo":{"id":9376753,"name":"hifi","full_name":"birarda/hifi","owner":{"login":"birarda","id":724069,"avatar_url":"https://avatars.githubusercontent.com/u/724069?v=3","gravatar_id":"","url":"https://api.github.com/users/birarda","html_url":"https://github.com/birarda","followers_url":"https://api.github.com/users/birarda/followers","following_url":"https://api.github.com/users/birarda/following{/other_user}","gists_url":"https://api.github.com/users/birarda/gists{/gist_id}","starred_url":"https://api.github.com/users/birarda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/birarda/subscriptions","organizations_url":"https://api.github.com/users/birarda/orgs","repos_url":"https://api.github.com/users/birarda/repos","events_url":"https://api.github.com/users/birarda/events{/privacy}","received_events_url":"https://api.github.com/users/birarda/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/birarda/hifi","description":"Test platform for various render and interface tests for next-gen VR system","fork":true,"url":"https://api.github.com/repos/birarda/hifi","forks_url":"https://api.github.com/repos/birarda/hifi/forks","keys_url":"https://api.github.com/repos/birarda/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/birarda/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/birarda/hifi/teams","hooks_url":"https://api.github.com/repos/birarda/hifi/hooks","issue_events_url":"https://api.github.com/repos/birarda/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/birarda/hifi/events","assignees_url":"https://api.github.com/repos/birarda/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/birarda/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/birarda/hifi/tags","blobs_url":"https://api.github.com/repos/birarda/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/birarda/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/birarda/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/birarda/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/birarda/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/birarda/hifi/languages","stargazers_url":"https://api.github.com/repos/birarda/hifi/stargazers","contributors_url":"https://api.github.com/repos/birarda/hifi/contributors","subscribers_url":"https://api.github.com/repos/birarda/hifi/subscribers","subscription_url":"https://api.github.com/repos/birarda/hifi/subscription","commits_url":"https://api.github.com/repos/birarda/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/birarda/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/birarda/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/birarda/hifi/issues/comments{/number}","contents_url":"https://api.github.com/repos/birarda/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/birarda/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/birarda/hifi/merges","archive_url":"https://api.github.com/repos/birarda/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/birarda/hifi/downloads","issues_url":"https://api.github.com/repos/birarda/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/birarda/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/birarda/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/birarda/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/birarda/hifi/labels{/name}","releases_url":"https://api.github.com/repos/birarda/hifi/releases{/id}","created_at":"2013-04-11T17:58:46Z","updated_at":"2015-05-08T19:10:20Z","pushed_at":"2015-07-20T20:06:35Z","git_url":"git://github.com/birarda/hifi.git","ssh_url":"git@github.com:birarda/hifi.git","clone_url":"https://github.com/birarda/hifi.git","svn_url":"https://github.com/birarda/hifi","homepage":null,"size":171296,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"highfidelity:master","ref":"master","sha":"c41e20b90f86f4f3f6556c5bdf5d117b5af99797","user":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"repo":{"id":5372872,"name":"hifi","full_name":"highfidelity/hifi","owner":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/highfidelity/hifi","description":"Open source software for shared virtual worlds using HMDs and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.com/jobs  Documentation at http://docs.highfidelity.com  Contribute by reporting bugs & doing jobs on http://worklist.net","fork":false,"url":"https://api.github.com/repos/highfidelity/hifi","forks_url":"https://api.github.com/repos/highfidelity/hifi/forks","keys_url":"https://api.github.com/repos/highfidelity/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/highfidelity/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/highfidelity/hifi/teams","hooks_url":"https://api.github.com/repos/highfidelity/hifi/hooks","issue_events_url":"https://api.github.com/repos/highfidelity/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/highfidelity/hifi/events","assignees_url":"https://api.github.com/repos/highfidelity/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/highfidelity/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/highfidelity/hifi/tags","blobs_url":"https://api.github.com/repos/highfidelity/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/highfidelity/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/highfidelity/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/highfidelity/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/highfidelity/hifi/languages","stargazers_url":"https://api.github.com/repos/highfidelity/hifi/stargazers","contributors_url":"https://api.github.com/repos/highfidelity/hifi/contributors","subscribers_url":"https://api.github.com/repos/highfidelity/hifi/subscribers","subscription_url":"https://api.github.com/repos/highfidelity/hifi/subscription","commits_url":"https://api.github.com/repos/highfidelity/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/highfidelity/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/highfidelity/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/highfidelity/hifi/issues/comments{/number}","contents_url":"https://api.github.com/repos/highfidelity/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/highfidelity/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/highfidelity/hifi/merges","archive_url":"https://api.github.com/repos/highfidelity/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/highfidelity/hifi/downloads","issues_url":"https://api.github.com/repos/highfidelity/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/highfidelity/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/highfidelity/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/highfidelity/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/highfidelity/hifi/labels{/name}","releases_url":"https://api.github.com/repos/highfidelity/hifi/releases{/id}","created_at":"2012-08-10T18:26:22Z","updated_at":"2015-07-14T07:31:45Z","pushed_at":"2015-07-20T21:30:58Z","git_url":"git://github.com/highfidelity/hifi.git","ssh_url":"git@github.com:highfidelity/hifi.git","clone_url":"https://github.com/highfidelity/hifi.git","svn_url":"https://github.com/highfidelity/hifi","homepage":"","size":222468,"stargazers_count":285,"watchers_count":285,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":163,"mirror_url":null,"open_issues_count":59,"forks":163,"open_issues":59,"watchers":285,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5359"},"html":{"href":"https://github.com/highfidelity/hifi/pull/5359"},"issue":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/5359"},"comments":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/5359/comments"},"review_comments":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5359/comments"},"review_comment":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/5359/commits"},"statuses":{"href":"https://api.github.com/repos/highfidelity/hifi/statuses/462ff9772289a03ded491796dfb9d64553fc8b62"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"AndrewMeadows","id":2186405,"avatar_url":"https://avatars.githubusercontent.com/u/2186405?v=3","gravatar_id":"","url":"https://api.github.com/users/AndrewMeadows","html_url":"https://github.com/AndrewMeadows","followers_url":"https://api.github.com/users/AndrewMeadows/followers","following_url":"https://api.github.com/users/AndrewMeadows/following{/other_user}","gists_url":"https://api.github.com/users/AndrewMeadows/gists{/gist_id}","starred_url":"https://api.github.com/users/AndrewMeadows/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndrewMeadows/subscriptions","organizations_url":"https://api.github.com/users/AndrewMeadows/orgs","repos_url":"https://api.github.com/users/AndrewMeadows/repos","events_url":"https://api.github.com/users/AndrewMeadows/events{/privacy}","received_events_url":"https://api.github.com/users/AndrewMeadows/received_events","type":"User","site_admin":false},"comments":12,"review_comments":16,"commits":730,"additions":5302,"deletions":7439,"changed_files":175}}