{"action":"created","comment":{"url":"https://api.github.com/repos/juju/juju-gui/pulls/comments/75644428","id":75644428,"diff_hunk":"@@ -669,6 +662,112 @@ YUI.add('juju-gui', function(Y) {\n     },\n \n     /**\n+      Creates a sandbox connection backend for use with the GoJujuAPI\n+\n+      @method createSandboxConnection\n+      @param {Object} cfg The configuration object to use and modify with the\n+        sandbox connection instance.\n+      @return {Object} cfg A modified version of the passed in cfg which\n+        constains the sandbox connection.\n+    */\n+    createSandboxConnection: function(cfg) {\n+      cfg.socket_url = this.get('sandboxSocketURL');\n+      let environments = juju.environments;\n+      let sandboxModule = environments.sandbox;\n+      const fakebackend = new environments.FakeBackend({\n+        charmstore: this.get('charmstore')\n+      });\n+      if (cfg.user && cfg.password) {\n+        let credentials = fakebackend.get('authorizedUsers');\n+        credentials['user-' + cfg.user] = cfg.password;\n+        fakebackend.set('authorizedUsers', credentials);\n+      }\n+      cfg.conn = new sandboxModule.ClientConnection({\n+        juju: new sandboxModule.GoJujuAPI({\n+          state: fakebackend,\n+          socket_url: cfg.socket_url\n+        })\n+      });\n+      // Instantiate a fake Web handler, which simulates the\n+      // request/response communication between the GUI and the juju-core\n+      // HTTPS API.\n+      cfg.webHandler =\n+        new environments.web.WebSandbox({state: fakebackend});\n+      return cfg;\n+    },\n+\n+    /**\n+      Creates the second instance of the websocket for communication with","path":"jujugui/static/gui/src/app/app.js","position":200,"original_position":200,"commit_id":"5b4ed607c78d4f4edae9c7c4d83c32c51b22d389","original_commit_id":"5b4ed607c78d4f4edae9c7c4d83c32c51b22d389","user":{"login":"frankban","id":1408172,"avatar_url":"https://avatars.githubusercontent.com/u/1408172?v=3","gravatar_id":"","url":"https://api.github.com/users/frankban","html_url":"https://github.com/frankban","followers_url":"https://api.github.com/users/frankban/followers","following_url":"https://api.github.com/users/frankban/following{/other_user}","gists_url":"https://api.github.com/users/frankban/gists{/gist_id}","starred_url":"https://api.github.com/users/frankban/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/frankban/subscriptions","organizations_url":"https://api.github.com/users/frankban/orgs","repos_url":"https://api.github.com/users/frankban/repos","events_url":"https://api.github.com/users/frankban/events{/privacy}","received_events_url":"https://api.github.com/users/frankban/received_events","type":"User","site_admin":false},"body":"WebSocket","created_at":"2016-08-22T09:24:07Z","updated_at":"2016-08-22T09:24:07Z","html_url":"https://github.com/juju/juju-gui/pull/1942#discussion_r75644428","pull_request_url":"https://api.github.com/repos/juju/juju-gui/pulls/1942","_links":{"self":{"href":"https://api.github.com/repos/juju/juju-gui/pulls/comments/75644428"},"html":{"href":"https://github.com/juju/juju-gui/pull/1942#discussion_r75644428"},"pull_request":{"href":"https://api.github.com/repos/juju/juju-gui/pulls/1942"}}},"pull_request":{"url":"https://api.github.com/repos/juju/juju-gui/pulls/1942","id":82129632,"html_url":"https://github.com/juju/juju-gui/pull/1942","diff_url":"https://github.com/juju/juju-gui/pull/1942.diff","patch_url":"https://github.com/juju/juju-gui/pull/1942.patch","issue_url":"https://api.github.com/repos/juju/juju-gui/issues/1942","number":1942,"state":"open","locked":false,"title":"Add multi-websocket support","user":{"login":"hatched","id":532033,"avatar_url":"https://avatars.githubusercontent.com/u/532033?v=3","gravatar_id":"","url":"https://api.github.com/users/hatched","html_url":"https://github.com/hatched","followers_url":"https://api.github.com/users/hatched/followers","following_url":"https://api.github.com/users/hatched/following{/other_user}","gists_url":"https://api.github.com/users/hatched/gists{/gist_id}","starred_url":"https://api.github.com/users/hatched/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hatched/subscriptions","organizations_url":"https://api.github.com/users/hatched/orgs","repos_url":"https://api.github.com/users/hatched/repos","events_url":"https://api.github.com/users/hatched/events{/privacy}","received_events_url":"https://api.github.com/users/hatched/received_events","type":"User","site_admin":false},"body":"With the new Controller API endpoint on Juju this adds multi-websocket support to the GUI as well as a few nice refactorings to help clean up app.js execution flow.","created_at":"2016-08-22T03:21:07Z","updated_at":"2016-08-22T09:24:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1ff398fbb4d843e9ec5d2e6250964bf5b9534ba9","assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/juju/juju-gui/milestones/12","html_url":"https://github.com/juju/juju-gui/milestones/2.1.11","labels_url":"https://api.github.com/repos/juju/juju-gui/milestones/12/labels","id":1939301,"number":12,"title":"2.1.11","description":"","creator":{"login":"hatched","id":532033,"avatar_url":"https://avatars.githubusercontent.com/u/532033?v=3","gravatar_id":"","url":"https://api.github.com/users/hatched","html_url":"https://github.com/hatched","followers_url":"https://api.github.com/users/hatched/followers","following_url":"https://api.github.com/users/hatched/following{/other_user}","gists_url":"https://api.github.com/users/hatched/gists{/gist_id}","starred_url":"https://api.github.com/users/hatched/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hatched/subscriptions","organizations_url":"https://api.github.com/users/hatched/orgs","repos_url":"https://api.github.com/users/hatched/repos","events_url":"https://api.github.com/users/hatched/events{/privacy}","received_events_url":"https://api.github.com/users/hatched/received_events","type":"User","site_admin":false},"open_issues":7,"closed_issues":14,"state":"open","created_at":"2016-08-12T16:28:52Z","updated_at":"2016-08-22T03:21:07Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/juju/juju-gui/pulls/1942/commits","review_comments_url":"https://api.github.com/repos/juju/juju-gui/pulls/1942/comments","review_comment_url":"https://api.github.com/repos/juju/juju-gui/pulls/comments{/number}","comments_url":"https://api.github.com/repos/juju/juju-gui/issues/1942/comments","statuses_url":"https://api.github.com/repos/juju/juju-gui/statuses/5b4ed607c78d4f4edae9c7c4d83c32c51b22d389","head":{"label":"hatched:multi-websocket-support","ref":"multi-websocket-support","sha":"5b4ed607c78d4f4edae9c7c4d83c32c51b22d389","user":{"login":"hatched","id":532033,"avatar_url":"https://avatars.githubusercontent.com/u/532033?v=3","gravatar_id":"","url":"https://api.github.com/users/hatched","html_url":"https://github.com/hatched","followers_url":"https://api.github.com/users/hatched/followers","following_url":"https://api.github.com/users/hatched/following{/other_user}","gists_url":"https://api.github.com/users/hatched/gists{/gist_id}","starred_url":"https://api.github.com/users/hatched/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hatched/subscriptions","organizations_url":"https://api.github.com/users/hatched/orgs","repos_url":"https://api.github.com/users/hatched/repos","events_url":"https://api.github.com/users/hatched/events{/privacy}","received_events_url":"https://api.github.com/users/hatched/received_events","type":"User","site_admin":false},"repo":{"id":14962756,"name":"juju-gui","full_name":"hatched/juju-gui","owner":{"login":"hatched","id":532033,"avatar_url":"https://avatars.githubusercontent.com/u/532033?v=3","gravatar_id":"","url":"https://api.github.com/users/hatched","html_url":"https://github.com/hatched","followers_url":"https://api.github.com/users/hatched/followers","following_url":"https://api.github.com/users/hatched/following{/other_user}","gists_url":"https://api.github.com/users/hatched/gists{/gist_id}","starred_url":"https://api.github.com/users/hatched/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hatched/subscriptions","organizations_url":"https://api.github.com/users/hatched/orgs","repos_url":"https://api.github.com/users/hatched/repos","events_url":"https://api.github.com/users/hatched/events{/privacy}","received_events_url":"https://api.github.com/users/hatched/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hatched/juju-gui","description":"Juju-GUI is a web-based GUI for Juju <https://juju.ubuntu.com/>.","fork":true,"url":"https://api.github.com/repos/hatched/juju-gui","forks_url":"https://api.github.com/repos/hatched/juju-gui/forks","keys_url":"https://api.github.com/repos/hatched/juju-gui/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hatched/juju-gui/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hatched/juju-gui/teams","hooks_url":"https://api.github.com/repos/hatched/juju-gui/hooks","issue_events_url":"https://api.github.com/repos/hatched/juju-gui/issues/events{/number}","events_url":"https://api.github.com/repos/hatched/juju-gui/events","assignees_url":"https://api.github.com/repos/hatched/juju-gui/assignees{/user}","branches_url":"https://api.github.com/repos/hatched/juju-gui/branches{/branch}","tags_url":"https://api.github.com/repos/hatched/juju-gui/tags","blobs_url":"https://api.github.com/repos/hatched/juju-gui/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hatched/juju-gui/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hatched/juju-gui/git/refs{/sha}","trees_url":"https://api.github.com/repos/hatched/juju-gui/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hatched/juju-gui/statuses/{sha}","languages_url":"https://api.github.com/repos/hatched/juju-gui/languages","stargazers_url":"https://api.github.com/repos/hatched/juju-gui/stargazers","contributors_url":"https://api.github.com/repos/hatched/juju-gui/contributors","subscribers_url":"https://api.github.com/repos/hatched/juju-gui/subscribers","subscription_url":"https://api.github.com/repos/hatched/juju-gui/subscription","commits_url":"https://api.github.com/repos/hatched/juju-gui/commits{/sha}","git_commits_url":"https://api.github.com/repos/hatched/juju-gui/git/commits{/sha}","comments_url":"https://api.github.com/repos/hatched/juju-gui/comments{/number}","issue_comment_url":"https://api.github.com/repos/hatched/juju-gui/issues/comments{/number}","contents_url":"https://api.github.com/repos/hatched/juju-gui/contents/{+path}","compare_url":"https://api.github.com/repos/hatched/juju-gui/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hatched/juju-gui/merges","archive_url":"https://api.github.com/repos/hatched/juju-gui/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hatched/juju-gui/downloads","issues_url":"https://api.github.com/repos/hatched/juju-gui/issues{/number}","pulls_url":"https://api.github.com/repos/hatched/juju-gui/pulls{/number}","milestones_url":"https://api.github.com/repos/hatched/juju-gui/milestones{/number}","notifications_url":"https://api.github.com/repos/hatched/juju-gui/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hatched/juju-gui/labels{/name}","releases_url":"https://api.github.com/repos/hatched/juju-gui/releases{/id}","deployments_url":"https://api.github.com/repos/hatched/juju-gui/deployments","created_at":"2013-12-05T18:57:16Z","updated_at":"2015-03-19T15:41:36Z","pushed_at":"2016-08-22T03:19:08Z","git_url":"git://github.com/hatched/juju-gui.git","ssh_url":"git@github.com:hatched/juju-gui.git","clone_url":"https://github.com/hatched/juju-gui.git","svn_url":"https://github.com/hatched/juju-gui","homepage":null,"size":118144,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","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":"juju:develop","ref":"develop","sha":"0a98e26bdafb6873fd7e50fcad347dbe3adbbf0d","user":{"login":"juju","id":4604548,"avatar_url":"https://avatars.githubusercontent.com/u/4604548?v=3","gravatar_id":"","url":"https://api.github.com/users/juju","html_url":"https://github.com/juju","followers_url":"https://api.github.com/users/juju/followers","following_url":"https://api.github.com/users/juju/following{/other_user}","gists_url":"https://api.github.com/users/juju/gists{/gist_id}","starred_url":"https://api.github.com/users/juju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juju/subscriptions","organizations_url":"https://api.github.com/users/juju/orgs","repos_url":"https://api.github.com/users/juju/repos","events_url":"https://api.github.com/users/juju/events{/privacy}","received_events_url":"https://api.github.com/users/juju/received_events","type":"Organization","site_admin":false},"repo":{"id":14960387,"name":"juju-gui","full_name":"juju/juju-gui","owner":{"login":"juju","id":4604548,"avatar_url":"https://avatars.githubusercontent.com/u/4604548?v=3","gravatar_id":"","url":"https://api.github.com/users/juju","html_url":"https://github.com/juju","followers_url":"https://api.github.com/users/juju/followers","following_url":"https://api.github.com/users/juju/following{/other_user}","gists_url":"https://api.github.com/users/juju/gists{/gist_id}","starred_url":"https://api.github.com/users/juju/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juju/subscriptions","organizations_url":"https://api.github.com/users/juju/orgs","repos_url":"https://api.github.com/users/juju/repos","events_url":"https://api.github.com/users/juju/events{/privacy}","received_events_url":"https://api.github.com/users/juju/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/juju/juju-gui","description":"Juju-GUI is a web-based GUI for Juju <https://jujucharms.com/>.","fork":false,"url":"https://api.github.com/repos/juju/juju-gui","forks_url":"https://api.github.com/repos/juju/juju-gui/forks","keys_url":"https://api.github.com/repos/juju/juju-gui/keys{/key_id}","collaborators_url":"https://api.github.com/repos/juju/juju-gui/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/juju/juju-gui/teams","hooks_url":"https://api.github.com/repos/juju/juju-gui/hooks","issue_events_url":"https://api.github.com/repos/juju/juju-gui/issues/events{/number}","events_url":"https://api.github.com/repos/juju/juju-gui/events","assignees_url":"https://api.github.com/repos/juju/juju-gui/assignees{/user}","branches_url":"https://api.github.com/repos/juju/juju-gui/branches{/branch}","tags_url":"https://api.github.com/repos/juju/juju-gui/tags","blobs_url":"https://api.github.com/repos/juju/juju-gui/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/juju/juju-gui/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/juju/juju-gui/git/refs{/sha}","trees_url":"https://api.github.com/repos/juju/juju-gui/git/trees{/sha}","statuses_url":"https://api.github.com/repos/juju/juju-gui/statuses/{sha}","languages_url":"https://api.github.com/repos/juju/juju-gui/languages","stargazers_url":"https://api.github.com/repos/juju/juju-gui/stargazers","contributors_url":"https://api.github.com/repos/juju/juju-gui/contributors","subscribers_url":"https://api.github.com/repos/juju/juju-gui/subscribers","subscription_url":"https://api.github.com/repos/juju/juju-gui/subscription","commits_url":"https://api.github.com/repos/juju/juju-gui/commits{/sha}","git_commits_url":"https://api.github.com/repos/juju/juju-gui/git/commits{/sha}","comments_url":"https://api.github.com/repos/juju/juju-gui/comments{/number}","issue_comment_url":"https://api.github.com/repos/juju/juju-gui/issues/comments{/number}","contents_url":"https://api.github.com/repos/juju/juju-gui/contents/{+path}","compare_url":"https://api.github.com/repos/juju/juju-gui/compare/{base}...{head}","merges_url":"https://api.github.com/repos/juju/juju-gui/merges","archive_url":"https://api.github.com/repos/juju/juju-gui/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/juju/juju-gui/downloads","issues_url":"https://api.github.com/repos/juju/juju-gui/issues{/number}","pulls_url":"https://api.github.com/repos/juju/juju-gui/pulls{/number}","milestones_url":"https://api.github.com/repos/juju/juju-gui/milestones{/number}","notifications_url":"https://api.github.com/repos/juju/juju-gui/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/juju/juju-gui/labels{/name}","releases_url":"https://api.github.com/repos/juju/juju-gui/releases{/id}","deployments_url":"https://api.github.com/repos/juju/juju-gui/deployments","created_at":"2013-12-05T17:15:48Z","updated_at":"2016-08-18T08:20:17Z","pushed_at":"2016-08-22T03:21:07Z","git_url":"git://github.com/juju/juju-gui.git","ssh_url":"git@github.com:juju/juju-gui.git","clone_url":"https://github.com/juju/juju-gui.git","svn_url":"https://github.com/juju/juju-gui","homepage":"","size":121924,"stargazers_count":96,"watchers_count":96,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":58,"mirror_url":null,"open_issues_count":103,"forks":58,"open_issues":103,"watchers":96,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/juju/juju-gui/pulls/1942"},"html":{"href":"https://github.com/juju/juju-gui/pull/1942"},"issue":{"href":"https://api.github.com/repos/juju/juju-gui/issues/1942"},"comments":{"href":"https://api.github.com/repos/juju/juju-gui/issues/1942/comments"},"review_comments":{"href":"https://api.github.com/repos/juju/juju-gui/pulls/1942/comments"},"review_comment":{"href":"https://api.github.com/repos/juju/juju-gui/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/juju/juju-gui/pulls/1942/commits"},"statuses":{"href":"https://api.github.com/repos/juju/juju-gui/statuses/5b4ed607c78d4f4edae9c7c4d83c32c51b22d389"}}}}
{"actor":{"display_login":"frankban"}}