{"action":"created","comment":{"url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/comments/89382838","pull_request_review_id":9928931,"id":89382838,"diff_hunk":"@@ -0,0 +1,256 @@\n+\"use strict\";\n+\n+describe(\"SignedTokenRequest\", () => {\n+    var bluebird, container, fsMock, privateSigned, publicSigned, requestAsyncMock, requestHandler, requestMock, responseMock, SignedTokenRequest, signer, StreamReadable, url;\n+\n+    // Just some test data that is constant.\n+    const account = {\n+            code: \"code\",\n+            secret: \"secret\",\n+            id: \"accountId\"\n+        },\n+        host = \"api.opentoken.io\",\n+        token = \"token\";\n+\n+    beforeEach(() => {\n+        container = require(\"../../lib/container\")(host, \"info\");\n+        bluebird = container.resolve(\"bluebird\");\n+        requestMock = require(\"../mock/request-mock\")();\n+        container.register(\"request\", requestMock);\n+        responseMock = require(\"../mock/response-mock\")();\n+        container.register(\"logger\", require(\"../mock/logger-mock\")());\n+        fsMock = jasmine.createSpyObj(\"fs\", [\n+            \"createWriteStream\"\n+        ]);\n+        container.register(\"fs\", fsMock);\n+        requestAsyncMock = jasmine.createSpy(\"requestAsync\");\n+        container.register(\"requestAsync\", requestAsyncMock);\n+        signer = container.resolve(\"signer\");\n+        requestHandler = container.resolve(\"requestHandler\");\n+        SignedTokenRequest = container.resolve(\"SignedTokenRequest\");\n+        StreamReadable = container.resolve(\"StreamReadable\");\n+        url = `https://${host}/account/${account.id}/token`;\n+        privateSigned = new SignedTokenRequest(account.id, false, account.code, account.secret);\n+        publicSigned = new SignedTokenRequest(account.id, true, account.code, account.secret);\n+        spyOn(signer, \"sign\").andCallThrough();\n+        spyOn(requestHandler, \"createUrl\").andCallThrough();\n+        spyOn(requestHandler, \"checkResponse\").andCallThrough();\n+        spyOn(requestHandler, \"buildRequestOptions\").andCallThrough();\n+        requestMock.get.andReturn(requestMock);\n+        requestMock.post.andReturn(requestMock);\n+    });\n+\n+\n+    /**\n+     * @param {string} content\n+     * @return {stream~Readable}\n+     */\n+    function createStream(content) {\n+        var stream;\n+\n+        stream = new StreamReadable();\n+        stream.push(content);\n+        stream.push(null);\n+\n+        return stream;\n+    }\n+\n+\n+    /**\n+     * Assert Authorization header.\n+     *\n+     * @param {string} authHeader\n+     */\n+    function assertAuthHeader(authHeader) {\n+        var authList;\n+\n+        authList = authHeader.split(\";\");\n+        expect(authList[0]).toEqual(\"OT1-HMAC-SHA256-HEX\");\n+        expect(authList[1].trim()).toEqual(`access-code=${account.code}`);\n+        expect(authList[2].trim()).toEqual(\"signed-headers=content-type x-opentoken-date host\");\n+        expect(authList[3].trim()).toMatch(\"signature=[a-z0-9].*\");\n+    }\n+    describe(\".download\", () => {\n+        var method;\n+\n+        method = \"GET\";\n+        it(\"successfuly downloads\", () => {\n+            var actualRequestOpts, resp;\n+\n+            resp = {\n+                body: \"test\",\n+                statusCode: 200\n+            };\n+            url = `${url}/${token}`;\n+            requestAsyncMock.andReturn(bluebird.resolve(resp));\n+\n+            return privateSigned.download(token).then((body) => {\n+                expect(requestHandler.createUrl).toHaveBeenCalledWith(account.id, false, token);\n+                expect(requestHandler.buildRequestOptions).toHaveBeenCalledWith(url, method);\n+                expect(body).toEqual(resp.body);\n+                expect(requestAsyncMock).toHaveBeenCalled();\n+                expect(signer.sign).toHaveBeenCalled();\n+                actualRequestOpts = requestAsyncMock.argsForCall[0][0];\n+                expect(actualRequestOpts.method).toEqual(method);\n+                expect(actualRequestOpts.url).toEqual(url);\n+                assertAuthHeader(actualRequestOpts.headers.Authorization);\n+            });\n+        });\n+        it(\"fails to download due to generic error response\", () => {\n+            var resp;\n+\n+            resp = {\n+                statusCode: 401\n+            };\n+            requestAsyncMock.andReturn(bluebird.resolve(resp));\n+\n+            return privateSigned.download(token).then(jasmine.fail, (err) => {\n+                expect(err.message).toEqual(`Error occurred: unauthorized, HTTP status code: ${resp.statusCode}.`);\n+                expect(requestAsyncMock).toHaveBeenCalled();\n+                expect(signer.sign).toHaveBeenCalled();\n+            });\n+        });\n+        it(\"fails to download due to unknown error response\", () => {\n+            var resp;\n+\n+            resp = {\n+                statusCode: 491\n+            };\n+            requestAsyncMock.andReturn(bluebird.resolve(resp));\n+\n+            return privateSigned.download(token).then(jasmine.fail, (err) => {\n+                expect(err.message).toEqual(`Error occurred: unknown, HTTP status code: ${resp.statusCode}.`);\n+                expect(requestAsyncMock).toHaveBeenCalled();\n+                expect(signer.sign).toHaveBeenCalled();\n+            });\n+        });\n+        it(\"fails to download due to OpenToken error response\", () => {\n+            var body, resp;\n+\n+            body = {\n+                message: \"Failed to verify signature\",\n+                code: \"Abcdefg\"\n+            };\n+            resp = {\n+                body: JSON.stringify(body),\n+                statusCode: 401\n+            };\n+            requestAsyncMock.andReturn(bluebird.resolve(resp));\n+\n+            return privateSigned.download(token).then(jasmine.fail, (err) => {\n+                expect(err.message).toEqual(`Error occurred: Failed to verify signature, HTTP status code: ${resp.statusCode}.`);\n+                expect(requestAsyncMock).toHaveBeenCalled();\n+                expect(signer.sign).toHaveBeenCalled();\n+            });\n+        });\n+    });\n+    describe(\".upload\", () => {\n+        it(\"successfuly uploads\", () => {\n+            var actualRequestOpts, contents, method, resp;\n+\n+            method = \"POST\";\n+            contents = \"body\";\n+            resp = {\n+                body: \"test\",\n+                statusCode: 201,\n+                headers: {\n+                    location: `${url}/${token}?public=true`\n+                }\n+            };\n+            requestAsyncMock.andReturn(bluebird.resolve(resp));\n+\n+            return publicSigned.upload(contents).then((actualToken) => {\n+                expect(requestHandler.createUrl).toHaveBeenCalledWith(account.id, true);\n+                expect(requestHandler.buildRequestOptions).toHaveBeenCalledWith(`${url}?public=true`, method);\n+                expect(actualToken).toEqual(token);\n+                expect(signer.sign).toHaveBeenCalled();\n+                actualRequestOpts = requestAsyncMock.argsForCall[0][0];\n+                expect(actualRequestOpts.method).toEqual(method);\n+                expect(actualRequestOpts.url).toEqual(`${url}?public=true`);\n+                assertAuthHeader(actualRequestOpts.headers.Authorization);\n+            });\n+        });\n+    });\n+    describe(\".downloadToFile\", () => {\n+        it(\"successfuly downloads to a \\\"file\\\" from public endpoint\", () => {\n+            var file, promise, stream;\n+\n+            file = \"fakeFile\";\n+            stream = createStream(\"test\");\n+            responseMock.pipe.andReturn(stream);\n+            fsMock.createWriteStream.andReturn({\n+                path: file\n+            });\n+            url = `${url}/${token}`;\n+            promise = privateSigned.downloadToFile(token, file).then((actualFile) => {\n+                expect(requestHandler.createUrl).toHaveBeenCalledWith(account.id, false, token);\n+                expect(requestHandler.buildRequestOptions).toHaveBeenCalledWith(url, \"GET\");\n+                expect(actualFile).toEqual(file);\n+                expect(signer.sign).toHaveBeenCalled();\n+            });\n+\n+            // This is horrible but I could not find a better solution to it.\n+            // Have to wait for the signer.sign promise to resolve before emitting\n+            // the appropriate events to complete the response.","path":"spec/lib/signed-token-request.spec.js","position":194,"original_position":194,"commit_id":"f5731215919d3358b29714d6afdf3a4e87164f0d","original_commit_id":"f5731215919d3358b29714d6afdf3a4e87164f0d","user":{"login":"quantumew","id":14934291,"avatar_url":"https://avatars.githubusercontent.com/u/14934291?v=3","gravatar_id":"","url":"https://api.github.com/users/quantumew","html_url":"https://github.com/quantumew","followers_url":"https://api.github.com/users/quantumew/followers","following_url":"https://api.github.com/users/quantumew/following{/other_user}","gists_url":"https://api.github.com/users/quantumew/gists{/gist_id}","starred_url":"https://api.github.com/users/quantumew/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quantumew/subscriptions","organizations_url":"https://api.github.com/users/quantumew/orgs","repos_url":"https://api.github.com/users/quantumew/repos","events_url":"https://api.github.com/users/quantumew/events{/privacy}","received_events_url":"https://api.github.com/users/quantumew/received_events","type":"User","site_admin":false},"body":"Not needed anymore due to the removal of streaming.","created_at":"2016-11-23T19:17:21Z","updated_at":"2016-11-23T19:17:22Z","html_url":"https://github.com/opentoken-io/opentoken-lib-js/pull/1#discussion_r89382838","pull_request_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/comments/89382838"},"html":{"href":"https://github.com/opentoken-io/opentoken-lib-js/pull/1#discussion_r89382838"},"pull_request":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1","id":94041615,"html_url":"https://github.com/opentoken-io/opentoken-lib-js/pull/1","diff_url":"https://github.com/opentoken-io/opentoken-lib-js/pull/1.diff","patch_url":"https://github.com/opentoken-io/opentoken-lib-js/pull/1.patch","issue_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/1","number":1,"state":"open","locked":false,"title":"OpenToken Library - token requests","user":{"login":"quantumew","id":14934291,"avatar_url":"https://avatars.githubusercontent.com/u/14934291?v=3","gravatar_id":"","url":"https://api.github.com/users/quantumew","html_url":"https://github.com/quantumew","followers_url":"https://api.github.com/users/quantumew/followers","following_url":"https://api.github.com/users/quantumew/following{/other_user}","gists_url":"https://api.github.com/users/quantumew/gists{/gist_id}","starred_url":"https://api.github.com/users/quantumew/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quantumew/subscriptions","organizations_url":"https://api.github.com/users/quantumew/orgs","repos_url":"https://api.github.com/users/quantumew/repos","events_url":"https://api.github.com/users/quantumew/events{/privacy}","received_events_url":"https://api.github.com/users/quantumew/received_events","type":"User","site_admin":false},"body":"OpenToken library with an interface for public and private token uploading and downloading. This also supports uploading from and downloading to files. This library currently does not follow self discovery links. That is on the TODO list.","created_at":"2016-11-16T20:16:55Z","updated_at":"2016-11-23T19:17:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f6154b093652bfdf3d9eed5f942bf75804b36da7","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1/commits","review_comments_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1/comments","review_comment_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/1/comments","statuses_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/statuses/f5731215919d3358b29714d6afdf3a4e87164f0d","head":{"label":"opentoken-io:develop","ref":"develop","sha":"f5731215919d3358b29714d6afdf3a4e87164f0d","user":{"login":"opentoken-io","id":17858137,"avatar_url":"https://avatars.githubusercontent.com/u/17858137?v=3","gravatar_id":"","url":"https://api.github.com/users/opentoken-io","html_url":"https://github.com/opentoken-io","followers_url":"https://api.github.com/users/opentoken-io/followers","following_url":"https://api.github.com/users/opentoken-io/following{/other_user}","gists_url":"https://api.github.com/users/opentoken-io/gists{/gist_id}","starred_url":"https://api.github.com/users/opentoken-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opentoken-io/subscriptions","organizations_url":"https://api.github.com/users/opentoken-io/orgs","repos_url":"https://api.github.com/users/opentoken-io/repos","events_url":"https://api.github.com/users/opentoken-io/events{/privacy}","received_events_url":"https://api.github.com/users/opentoken-io/received_events","type":"Organization","site_admin":false},"repo":{"id":73216464,"name":"opentoken-lib-js","full_name":"opentoken-io/opentoken-lib-js","owner":{"login":"opentoken-io","id":17858137,"avatar_url":"https://avatars.githubusercontent.com/u/17858137?v=3","gravatar_id":"","url":"https://api.github.com/users/opentoken-io","html_url":"https://github.com/opentoken-io","followers_url":"https://api.github.com/users/opentoken-io/followers","following_url":"https://api.github.com/users/opentoken-io/following{/other_user}","gists_url":"https://api.github.com/users/opentoken-io/gists{/gist_id}","starred_url":"https://api.github.com/users/opentoken-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opentoken-io/subscriptions","organizations_url":"https://api.github.com/users/opentoken-io/orgs","repos_url":"https://api.github.com/users/opentoken-io/repos","events_url":"https://api.github.com/users/opentoken-io/events{/privacy}","received_events_url":"https://api.github.com/users/opentoken-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opentoken-io/opentoken-lib-js","description":"A library to interact with the opentoken API.","fork":false,"url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js","forks_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/forks","keys_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/teams","hooks_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/hooks","issue_events_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/events{/number}","events_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/events","assignees_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/assignees{/user}","branches_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/branches{/branch}","tags_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/tags","blobs_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/statuses/{sha}","languages_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/languages","stargazers_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/stargazers","contributors_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/contributors","subscribers_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/subscribers","subscription_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/subscription","commits_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/contents/{+path}","compare_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/merges","archive_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/downloads","issues_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues{/number}","pulls_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls{/number}","milestones_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/milestones{/number}","notifications_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/labels{/name}","releases_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/releases{/id}","deployments_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/deployments","created_at":"2016-11-08T18:46:40Z","updated_at":"2016-11-08T18:46:40Z","pushed_at":"2016-11-21T13:39:34Z","git_url":"git://github.com/opentoken-io/opentoken-lib-js.git","ssh_url":"git@github.com:opentoken-io/opentoken-lib-js.git","clone_url":"https://github.com/opentoken-io/opentoken-lib-js.git","svn_url":"https://github.com/opentoken-io/opentoken-lib-js","homepage":null,"size":76,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"opentoken-io:master","ref":"master","sha":"b103122ed15140212fe63000b9bc05f0c05d1ce5","user":{"login":"opentoken-io","id":17858137,"avatar_url":"https://avatars.githubusercontent.com/u/17858137?v=3","gravatar_id":"","url":"https://api.github.com/users/opentoken-io","html_url":"https://github.com/opentoken-io","followers_url":"https://api.github.com/users/opentoken-io/followers","following_url":"https://api.github.com/users/opentoken-io/following{/other_user}","gists_url":"https://api.github.com/users/opentoken-io/gists{/gist_id}","starred_url":"https://api.github.com/users/opentoken-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opentoken-io/subscriptions","organizations_url":"https://api.github.com/users/opentoken-io/orgs","repos_url":"https://api.github.com/users/opentoken-io/repos","events_url":"https://api.github.com/users/opentoken-io/events{/privacy}","received_events_url":"https://api.github.com/users/opentoken-io/received_events","type":"Organization","site_admin":false},"repo":{"id":73216464,"name":"opentoken-lib-js","full_name":"opentoken-io/opentoken-lib-js","owner":{"login":"opentoken-io","id":17858137,"avatar_url":"https://avatars.githubusercontent.com/u/17858137?v=3","gravatar_id":"","url":"https://api.github.com/users/opentoken-io","html_url":"https://github.com/opentoken-io","followers_url":"https://api.github.com/users/opentoken-io/followers","following_url":"https://api.github.com/users/opentoken-io/following{/other_user}","gists_url":"https://api.github.com/users/opentoken-io/gists{/gist_id}","starred_url":"https://api.github.com/users/opentoken-io/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opentoken-io/subscriptions","organizations_url":"https://api.github.com/users/opentoken-io/orgs","repos_url":"https://api.github.com/users/opentoken-io/repos","events_url":"https://api.github.com/users/opentoken-io/events{/privacy}","received_events_url":"https://api.github.com/users/opentoken-io/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opentoken-io/opentoken-lib-js","description":"A library to interact with the opentoken API.","fork":false,"url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js","forks_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/forks","keys_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/teams","hooks_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/hooks","issue_events_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/events{/number}","events_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/events","assignees_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/assignees{/user}","branches_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/branches{/branch}","tags_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/tags","blobs_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/statuses/{sha}","languages_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/languages","stargazers_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/stargazers","contributors_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/contributors","subscribers_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/subscribers","subscription_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/subscription","commits_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/contents/{+path}","compare_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/merges","archive_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/downloads","issues_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues{/number}","pulls_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls{/number}","milestones_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/milestones{/number}","notifications_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/labels{/name}","releases_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/releases{/id}","deployments_url":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/deployments","created_at":"2016-11-08T18:46:40Z","updated_at":"2016-11-08T18:46:40Z","pushed_at":"2016-11-21T13:39:34Z","git_url":"git://github.com/opentoken-io/opentoken-lib-js.git","ssh_url":"git@github.com:opentoken-io/opentoken-lib-js.git","clone_url":"https://github.com/opentoken-io/opentoken-lib-js.git","svn_url":"https://github.com/opentoken-io/opentoken-lib-js","homepage":null,"size":76,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1"},"html":{"href":"https://github.com/opentoken-io/opentoken-lib-js/pull/1"},"issue":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/1"},"comments":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/opentoken-io/opentoken-lib-js/statuses/f5731215919d3358b29714d6afdf3a4e87164f0d"}}}}
{"actor":{"display_login":"quantumew"}}