{"action":"created","comment":{"url":"https://api.github.com/repos/poetapp/node/pulls/comments/195517857","pull_request_review_id":128903774,"id":195517857,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NTUxNzg1Nw==","diff_hunk":"@@ -0,0 +1,19 @@\n+import { FetchError } from 'node-fetch'\n+\n+// TODO: make PR to node-fetch with this enum\n+export enum FetchErrorType {\n+  RequestTimeout = 'request-timeout',\n+  BodyTimeout = 'body-timeout',\n+  System = 'system',\n+  NoRedirect = 'no-redirect',\n+  MaxRedirect = 'max-redirect',\n+  UnsupportedRedirect = 'unsupported-redirect',\n+  MaxSize = 'max-size',\n+  InvalidJson = 'invalid-json',\n+}\n+\n+const TimeoutFetchErrorTypes: ReadonlyArray<string> = [FetchErrorType.RequestTimeout, FetchErrorType.BodyTimeout]\n+\n+export const isFetchError = (error: any): error is FetchError => error instanceof Error && error.name === 'FetchError'","path":"src/Helpers/FetchError.ts","position":17,"original_position":17,"commit_id":"3f44de09eba6056b3ecceedb4438757c66178ec0","original_commit_id":"3f44de09eba6056b3ecceedb4438757c66178ec0","user":{"login":"lautarodragan","id":2279687,"node_id":"MDQ6VXNlcjIyNzk2ODc=","avatar_url":"https://avatars2.githubusercontent.com/u/2279687?v=4","gravatar_id":"","url":"https://api.github.com/users/lautarodragan","html_url":"https://github.com/lautarodragan","followers_url":"https://api.github.com/users/lautarodragan/followers","following_url":"https://api.github.com/users/lautarodragan/following{/other_user}","gists_url":"https://api.github.com/users/lautarodragan/gists{/gist_id}","starred_url":"https://api.github.com/users/lautarodragan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lautarodragan/subscriptions","organizations_url":"https://api.github.com/users/lautarodragan/orgs","repos_url":"https://api.github.com/users/lautarodragan/repos","events_url":"https://api.github.com/users/lautarodragan/events{/privacy}","received_events_url":"https://api.github.com/users/lautarodragan/received_events","type":"User","site_admin":false},"body":"Yeah! Good catch. I'll add that test.","created_at":"2018-06-14T18:01:10Z","updated_at":"2018-06-14T18:01:11Z","html_url":"https://github.com/poetapp/node/pull/145#discussion_r195517857","pull_request_url":"https://api.github.com/repos/poetapp/node/pulls/145","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/poetapp/node/pulls/comments/195517857"},"html":{"href":"https://github.com/poetapp/node/pull/145#discussion_r195517857"},"pull_request":{"href":"https://api.github.com/repos/poetapp/node/pulls/145"}},"in_reply_to_id":195493169},"pull_request":{"url":"https://api.github.com/repos/poetapp/node/pulls/145","id":194197452,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk0MTk3NDUy","html_url":"https://github.com/poetapp/node/pull/145","diff_url":"https://github.com/poetapp/node/pull/145.diff","patch_url":"https://github.com/poetapp/node/pull/145.patch","issue_url":"https://api.github.com/repos/poetapp/node/issues/145","number":145,"state":"open","locked":false,"title":"IPFS failure detail","user":{"login":"lautarodragan","id":2279687,"node_id":"MDQ6VXNlcjIyNzk2ODc=","avatar_url":"https://avatars2.githubusercontent.com/u/2279687?v=4","gravatar_id":"","url":"https://api.github.com/users/lautarodragan","html_url":"https://github.com/lautarodragan","followers_url":"https://api.github.com/users/lautarodragan/followers","following_url":"https://api.github.com/users/lautarodragan/following{/other_user}","gists_url":"https://api.github.com/users/lautarodragan/gists{/gist_id}","starred_url":"https://api.github.com/users/lautarodragan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lautarodragan/subscriptions","organizations_url":"https://api.github.com/users/lautarodragan/orgs","repos_url":"https://api.github.com/users/lautarodragan/repos","events_url":"https://api.github.com/users/lautarodragan/events{/privacy}","received_events_url":"https://api.github.com/users/lautarodragan/received_events","type":"User","site_admin":false},"body":"Fixes #121 \r\nFixes #144 \r\n\r\n## Description of Changes\r\n\r\nThis PR introduces finer-grained information logging of error types in the Storage module. In particular, it introduces the `failureReason` and `failureType` properties in the database, and a modification to the ipfs download retry system, not to retry `HARD` failures.\r\n\r\n### New DB properties\r\n\r\n#### `failureReason`\r\n\r\nThis field is informative. Can be any of the following: `INVALID_JSON`, `INVALID_CLAIM`, `IPFSGeneric`, `IPFSTimeout`. These values are defined in the string enum `FailureReason`.\r\n\r\n#### `failureType`\r\n\r\nThis field affects the retry system. If can be `SOFT` or `HARD`. `HARD` failure types won't be retried.\r\n\r\n### Function Modifications\r\n\r\nAll modified functions are in the Storage module.\r\n\r\n#### `ClaimController.findEntryToDownload`\r\n\r\nThis function's query to mongodb was now adapted to ignore ipfsHashes marked with a `HARD` failure.\r\n\r\n#### `ClaimController.download`\r\n\r\nThis function has been fixed. It will now ignore `Duplicate key` MongoDB errors.\r\n\r\n#### `ClaimController.downloadClaim` \r\n\r\nThis function was removed. Its code was adapted into `downloadEntryClaim`, which previously merely acted as a wrapper for `downloadClaim`. \r\n\r\n`downloadClaim` was only being called from `downloadEntryClaim`.\r\n\r\n#### `Router.onPoetTimestampsDownloaded`\r\n\r\nThis function now properly catches all errors thrown by the call to `claimController.download`, logging them at `error` level.\r\n\r\nPreviously, it would let any error bubble up, which would wind up as an unhandled promise rejection, which are deprecated and will terminate the process in new versions of NodeJS.\r\n\r\n### New Make Commands\r\n\r\nFour new make commands were introduced to help manual debugging of Storage issues: `ipfs-unpin-all` and `ipfs-gc`, which delete all files in the IPFS container, `reset-storage`, which removes all information of all entries of the storage collection but the ipfsHash itself and `print-storage-errors`, which prints the count by `failureReason`.\r\n\r\n### New Fetch Error Helper and node-fetch typings\r\n\r\nGot all this data from reading [node-fetch's source code](https://github.com/bitinn/node-fetch).\r\n\r\nI'll try and make a couple of PRs to node-fetch and @types/node-fetch this Friday or the next, but we'll need to keep this code in our code base for now.\r\n\r\nExample run of `print-storage-errors`:\r\n```\r\n$ sudo make print-storage-errors \r\ndocker exec -i poet-mongo mongo poet < ./queries/storage-errors.mongo\r\nMongoDB shell version v3.4.10\r\nconnecting to: mongodb://127.0.0.1:27017/poet\r\nMongoDB server version: 3.4.10\r\n{ \"_id\" : \"INVALID_JSON\", \"count\" : 339 }\r\n{ \"_id\" : \"IPFSTimeout\", \"count\" : 1400 }\r\n{ \"_id\" : null, \"count\" : 8551 }\r\nbye\r\n```\r\n\r\n## Test\r\n\r\n```\r\n> db.blockchainReader.find({}, {blockHeight: 1, _id:0}).sort({blockHeight: 1}).limit(1)\r\n{ \"blockHeight\" : 1282538 }\r\n> db.blockchainReader.find({}, {blockHeight: 1, _id:0}).sort({blockHeight: -1}).limit(1)\r\n{ \"blockHeight\" : 1325267 }\r\n> db.storage.count()\r\n10750\r\n> db.storage.find({claimId: {$ne: null}}).count()\r\n8672\r\n> db.storage.find({claimId: null, failureReason: null}).count()\r\n0\r\n> db.storage.find({claimId: null, failureReason: {$ne: null}}).count()\r\n2078\r\n> db.storage.aggregate([   { $match: {claimId: null} } ,   { $group: {_id: \"$failureReason\", count: { $sum: 1 } } } ])\r\n{ \"_id\" : \"IPFS_TIMEOUT\", \"count\" : 1 }\r\n{ \"_id\" : \"INVALID_JSON\", \"count\" : 2077 }\r\n> db.storage.find({claimId: null, failureReason: 'IPFS_TIMEOUT'}, {_id: 0, ipfsHash: 1})\r\n{ \"ipfsHash\" : \"QmeYHwNLoCQUQ82FzFRsJ9vRK8GSiFEBW3ycwTV8x7GYFS\" }\r\n```\r\n\r\n### Configuration used\r\n\r\n```\r\n{\r\n    \"minimumBlockHeight\": 1282537,\r\n    \"downloadIntervalInSeconds\": 0.1,\r\n    \"downloadRetryDelayInMinutes\": 1,\r\n    \"downloadTimeoutInSeconds\": 30,\r\n}\r\n```\r\n\r\n## TODO\r\n\r\n- The error-checking logic in `downloadEntryClaim.download` could be moved to the IPFS client\r\n- `downloadNextHash.handleErrors` could be made into an async pipe of middlewares\r\n- `download` is checking the error code against the [magic number 11000](https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.err#L272).\r\n\r\n<!-- For the PR reviewer: -->\r\n\r\n### PR Review Checklist\r\n\r\n* [ ] **Have you tested the changes?**\r\n* [ ] **Is QE review required? If so, has this been reviewed by QE?** (For all new features, review by QE is required. Minor changes which already have passing functional tests may not need a new QE review -- when in doubt, loop in a QE reviewer).\r\n* [ ] **Are there code changes that require new unit tests? If so, are those tests included?** (A separate PR for tests is not appropriate).\r\n* [ ] **Are documentation updates required? If so, does this PR include it?** (Separate documentation PR is generally not appropriate).\r\n* [ ] **Are the added/edited files named appropriately and located correctly in the project directory structure?**\r\n\r\n","created_at":"2018-06-12T08:07:00Z","updated_at":"2018-06-14T18:01:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8c0ee745dc2c3215dc8cd005ca74402c0b825371","assignee":null,"assignees":[],"requested_reviewers":[{"login":"kennylavender","id":5175120,"node_id":"MDQ6VXNlcjUxNzUxMjA=","avatar_url":"https://avatars1.githubusercontent.com/u/5175120?v=4","gravatar_id":"","url":"https://api.github.com/users/kennylavender","html_url":"https://github.com/kennylavender","followers_url":"https://api.github.com/users/kennylavender/followers","following_url":"https://api.github.com/users/kennylavender/following{/other_user}","gists_url":"https://api.github.com/users/kennylavender/gists{/gist_id}","starred_url":"https://api.github.com/users/kennylavender/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kennylavender/subscriptions","organizations_url":"https://api.github.com/users/kennylavender/orgs","repos_url":"https://api.github.com/users/kennylavender/repos","events_url":"https://api.github.com/users/kennylavender/events{/privacy}","received_events_url":"https://api.github.com/users/kennylavender/received_events","type":"User","site_admin":false},{"login":"wzalazar","id":5795257,"node_id":"MDQ6VXNlcjU3OTUyNTc=","avatar_url":"https://avatars1.githubusercontent.com/u/5795257?v=4","gravatar_id":"","url":"https://api.github.com/users/wzalazar","html_url":"https://github.com/wzalazar","followers_url":"https://api.github.com/users/wzalazar/followers","following_url":"https://api.github.com/users/wzalazar/following{/other_user}","gists_url":"https://api.github.com/users/wzalazar/gists{/gist_id}","starred_url":"https://api.github.com/users/wzalazar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wzalazar/subscriptions","organizations_url":"https://api.github.com/users/wzalazar/orgs","repos_url":"https://api.github.com/users/wzalazar/repos","events_url":"https://api.github.com/users/wzalazar/events{/privacy}","received_events_url":"https://api.github.com/users/wzalazar/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/poetapp/node/pulls/145/commits","review_comments_url":"https://api.github.com/repos/poetapp/node/pulls/145/comments","review_comment_url":"https://api.github.com/repos/poetapp/node/pulls/comments{/number}","comments_url":"https://api.github.com/repos/poetapp/node/issues/145/comments","statuses_url":"https://api.github.com/repos/poetapp/node/statuses/3f44de09eba6056b3ecceedb4438757c66178ec0","head":{"label":"poetapp:ipfs-add-failure-detail","ref":"ipfs-add-failure-detail","sha":"3f44de09eba6056b3ecceedb4438757c66178ec0","user":{"login":"poetapp","id":24881331,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI0ODgxMzMx","avatar_url":"https://avatars0.githubusercontent.com/u/24881331?v=4","gravatar_id":"","url":"https://api.github.com/users/poetapp","html_url":"https://github.com/poetapp","followers_url":"https://api.github.com/users/poetapp/followers","following_url":"https://api.github.com/users/poetapp/following{/other_user}","gists_url":"https://api.github.com/users/poetapp/gists{/gist_id}","starred_url":"https://api.github.com/users/poetapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/poetapp/subscriptions","organizations_url":"https://api.github.com/users/poetapp/orgs","repos_url":"https://api.github.com/users/poetapp/repos","events_url":"https://api.github.com/users/poetapp/events{/privacy}","received_events_url":"https://api.github.com/users/poetapp/received_events","type":"Organization","site_admin":false},"repo":{"id":108142666,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgxNDI2NjY=","name":"node","full_name":"poetapp/node","owner":{"login":"poetapp","id":24881331,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI0ODgxMzMx","avatar_url":"https://avatars0.githubusercontent.com/u/24881331?v=4","gravatar_id":"","url":"https://api.github.com/users/poetapp","html_url":"https://github.com/poetapp","followers_url":"https://api.github.com/users/poetapp/followers","following_url":"https://api.github.com/users/poetapp/following{/other_user}","gists_url":"https://api.github.com/users/poetapp/gists{/gist_id}","starred_url":"https://api.github.com/users/poetapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/poetapp/subscriptions","organizations_url":"https://api.github.com/users/poetapp/orgs","repos_url":"https://api.github.com/users/poetapp/repos","events_url":"https://api.github.com/users/poetapp/events{/privacy}","received_events_url":"https://api.github.com/users/poetapp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/poetapp/node","description":"Po.et is a decentralized platform for managing creative assets","fork":false,"url":"https://api.github.com/repos/poetapp/node","forks_url":"https://api.github.com/repos/poetapp/node/forks","keys_url":"https://api.github.com/repos/poetapp/node/keys{/key_id}","collaborators_url":"https://api.github.com/repos/poetapp/node/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/poetapp/node/teams","hooks_url":"https://api.github.com/repos/poetapp/node/hooks","issue_events_url":"https://api.github.com/repos/poetapp/node/issues/events{/number}","events_url":"https://api.github.com/repos/poetapp/node/events","assignees_url":"https://api.github.com/repos/poetapp/node/assignees{/user}","branches_url":"https://api.github.com/repos/poetapp/node/branches{/branch}","tags_url":"https://api.github.com/repos/poetapp/node/tags","blobs_url":"https://api.github.com/repos/poetapp/node/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/poetapp/node/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/poetapp/node/git/refs{/sha}","trees_url":"https://api.github.com/repos/poetapp/node/git/trees{/sha}","statuses_url":"https://api.github.com/repos/poetapp/node/statuses/{sha}","languages_url":"https://api.github.com/repos/poetapp/node/languages","stargazers_url":"https://api.github.com/repos/poetapp/node/stargazers","contributors_url":"https://api.github.com/repos/poetapp/node/contributors","subscribers_url":"https://api.github.com/repos/poetapp/node/subscribers","subscription_url":"https://api.github.com/repos/poetapp/node/subscription","commits_url":"https://api.github.com/repos/poetapp/node/commits{/sha}","git_commits_url":"https://api.github.com/repos/poetapp/node/git/commits{/sha}","comments_url":"https://api.github.com/repos/poetapp/node/comments{/number}","issue_comment_url":"https://api.github.com/repos/poetapp/node/issues/comments{/number}","contents_url":"https://api.github.com/repos/poetapp/node/contents/{+path}","compare_url":"https://api.github.com/repos/poetapp/node/compare/{base}...{head}","merges_url":"https://api.github.com/repos/poetapp/node/merges","archive_url":"https://api.github.com/repos/poetapp/node/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/poetapp/node/downloads","issues_url":"https://api.github.com/repos/poetapp/node/issues{/number}","pulls_url":"https://api.github.com/repos/poetapp/node/pulls{/number}","milestones_url":"https://api.github.com/repos/poetapp/node/milestones{/number}","notifications_url":"https://api.github.com/repos/poetapp/node/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/poetapp/node/labels{/name}","releases_url":"https://api.github.com/repos/poetapp/node/releases{/id}","deployments_url":"https://api.github.com/repos/poetapp/node/deployments","created_at":"2017-10-24T14:58:14Z","updated_at":"2018-06-13T21:42:34Z","pushed_at":"2018-06-14T15:21:42Z","git_url":"git://github.com/poetapp/node.git","ssh_url":"git@github.com:poetapp/node.git","clone_url":"https://github.com/poetapp/node.git","svn_url":"https://github.com/poetapp/node","homepage":"https://po.et","size":494,"stargazers_count":115,"watchers_count":115,"language":"TypeScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":32,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":18,"open_issues":32,"watchers":115,"default_branch":"master"}},"base":{"label":"poetapp:master","ref":"master","sha":"2ec2345174c207d4b755ae6f568f834e41ce53d6","user":{"login":"poetapp","id":24881331,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI0ODgxMzMx","avatar_url":"https://avatars0.githubusercontent.com/u/24881331?v=4","gravatar_id":"","url":"https://api.github.com/users/poetapp","html_url":"https://github.com/poetapp","followers_url":"https://api.github.com/users/poetapp/followers","following_url":"https://api.github.com/users/poetapp/following{/other_user}","gists_url":"https://api.github.com/users/poetapp/gists{/gist_id}","starred_url":"https://api.github.com/users/poetapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/poetapp/subscriptions","organizations_url":"https://api.github.com/users/poetapp/orgs","repos_url":"https://api.github.com/users/poetapp/repos","events_url":"https://api.github.com/users/poetapp/events{/privacy}","received_events_url":"https://api.github.com/users/poetapp/received_events","type":"Organization","site_admin":false},"repo":{"id":108142666,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgxNDI2NjY=","name":"node","full_name":"poetapp/node","owner":{"login":"poetapp","id":24881331,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI0ODgxMzMx","avatar_url":"https://avatars0.githubusercontent.com/u/24881331?v=4","gravatar_id":"","url":"https://api.github.com/users/poetapp","html_url":"https://github.com/poetapp","followers_url":"https://api.github.com/users/poetapp/followers","following_url":"https://api.github.com/users/poetapp/following{/other_user}","gists_url":"https://api.github.com/users/poetapp/gists{/gist_id}","starred_url":"https://api.github.com/users/poetapp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/poetapp/subscriptions","organizations_url":"https://api.github.com/users/poetapp/orgs","repos_url":"https://api.github.com/users/poetapp/repos","events_url":"https://api.github.com/users/poetapp/events{/privacy}","received_events_url":"https://api.github.com/users/poetapp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/poetapp/node","description":"Po.et is a decentralized platform for managing creative assets","fork":false,"url":"https://api.github.com/repos/poetapp/node","forks_url":"https://api.github.com/repos/poetapp/node/forks","keys_url":"https://api.github.com/repos/poetapp/node/keys{/key_id}","collaborators_url":"https://api.github.com/repos/poetapp/node/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/poetapp/node/teams","hooks_url":"https://api.github.com/repos/poetapp/node/hooks","issue_events_url":"https://api.github.com/repos/poetapp/node/issues/events{/number}","events_url":"https://api.github.com/repos/poetapp/node/events","assignees_url":"https://api.github.com/repos/poetapp/node/assignees{/user}","branches_url":"https://api.github.com/repos/poetapp/node/branches{/branch}","tags_url":"https://api.github.com/repos/poetapp/node/tags","blobs_url":"https://api.github.com/repos/poetapp/node/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/poetapp/node/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/poetapp/node/git/refs{/sha}","trees_url":"https://api.github.com/repos/poetapp/node/git/trees{/sha}","statuses_url":"https://api.github.com/repos/poetapp/node/statuses/{sha}","languages_url":"https://api.github.com/repos/poetapp/node/languages","stargazers_url":"https://api.github.com/repos/poetapp/node/stargazers","contributors_url":"https://api.github.com/repos/poetapp/node/contributors","subscribers_url":"https://api.github.com/repos/poetapp/node/subscribers","subscription_url":"https://api.github.com/repos/poetapp/node/subscription","commits_url":"https://api.github.com/repos/poetapp/node/commits{/sha}","git_commits_url":"https://api.github.com/repos/poetapp/node/git/commits{/sha}","comments_url":"https://api.github.com/repos/poetapp/node/comments{/number}","issue_comment_url":"https://api.github.com/repos/poetapp/node/issues/comments{/number}","contents_url":"https://api.github.com/repos/poetapp/node/contents/{+path}","compare_url":"https://api.github.com/repos/poetapp/node/compare/{base}...{head}","merges_url":"https://api.github.com/repos/poetapp/node/merges","archive_url":"https://api.github.com/repos/poetapp/node/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/poetapp/node/downloads","issues_url":"https://api.github.com/repos/poetapp/node/issues{/number}","pulls_url":"https://api.github.com/repos/poetapp/node/pulls{/number}","milestones_url":"https://api.github.com/repos/poetapp/node/milestones{/number}","notifications_url":"https://api.github.com/repos/poetapp/node/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/poetapp/node/labels{/name}","releases_url":"https://api.github.com/repos/poetapp/node/releases{/id}","deployments_url":"https://api.github.com/repos/poetapp/node/deployments","created_at":"2017-10-24T14:58:14Z","updated_at":"2018-06-13T21:42:34Z","pushed_at":"2018-06-14T15:21:42Z","git_url":"git://github.com/poetapp/node.git","ssh_url":"git@github.com:poetapp/node.git","clone_url":"https://github.com/poetapp/node.git","svn_url":"https://github.com/poetapp/node","homepage":"https://po.et","size":494,"stargazers_count":115,"watchers_count":115,"language":"TypeScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":32,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":18,"open_issues":32,"watchers":115,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/poetapp/node/pulls/145"},"html":{"href":"https://github.com/poetapp/node/pull/145"},"issue":{"href":"https://api.github.com/repos/poetapp/node/issues/145"},"comments":{"href":"https://api.github.com/repos/poetapp/node/issues/145/comments"},"review_comments":{"href":"https://api.github.com/repos/poetapp/node/pulls/145/comments"},"review_comment":{"href":"https://api.github.com/repos/poetapp/node/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/poetapp/node/pulls/145/commits"},"statuses":{"href":"https://api.github.com/repos/poetapp/node/statuses/3f44de09eba6056b3ecceedb4438757c66178ec0"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"lautarodragan"}}