{"action":"created","comment":{"url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/comments/243694445","pull_request_review_id":187541569,"id":243694445,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MzY5NDQ0NQ==","diff_hunk":"@@ -14,497 +14,351 @@\n  * limitations under the License.\n  */\n \n-import * as arrify from 'arrify';\n-const chunk = require('lodash.chunk');\n-import * as util from './util';\n-import {promisify, promisifyAll} from '@google-cloud/promisify';\n-const delay = require('delay');\n+import {replaceProjectIdToken} from '@google-cloud/projectify';\n+import {promisify} from '@google-cloud/promisify';\n import {EventEmitter} from 'events';\n-import * as is from 'is';\n-import * as os from 'os';\n+import {ClientStub} from 'google-gax';\n+import {common as protobuf} from 'protobufjs';\n \n-import {ConnectionPool} from './connection-pool';\n import {Histogram} from './histogram';\n-import {Subscription} from '.';\n+import {FlowControlOptions, LeaseManager} from './lease-manager';\n+import {AckQueue, BatchOptions, ModAckQueue} from './message-queues';\n+import {MessageStream, MessageStreamOptions} from './message-stream';\n+import {Subscription} from './subscription';\n \n /**\n- * @type {number} - The maximum number of ackIds to be sent in acknowledge/modifyAckDeadline\n- *     requests. There is an API limit of 524288 bytes (512KiB) per\n- * acknowledge/modifyAckDeadline request. ackIds have a maximum size of 164\n- * bytes, so 524288/164 ~= 3197. Accounting for some overhead, a maximum of 3000\n- * ackIds per request should be safe.\n- * @private\n+ * @see https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/pull#ReceivedMessage\n  */\n-const MAX_ACK_IDS_PER_REQUEST = 3000;\n+interface ReceivedMessage {\n+  ackId: string;\n+  message: {\n+    attributes: {},\n+    data: Buffer,\n+    messageId: string,\n+    publishTime: protobuf.ITimestamp\n+  };\n+}\n \n /**\n- * Subscriber class is used to manage all message related functionality.\n+ * @see https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/pull#body.PullResponse\n+ */\n+interface PullResponse {\n+  receivedMessages: ReceivedMessage[];\n+}\n+\n+/**\n+ * Message objects provide a simple interface for users to get message data and\n+ * acknowledge the message.\n+ *\n  * @private\n+ * @class\n  *\n- * @param {object} options Configuration object.\n+ * @param {Subscriber} sub The parent subscriber.\n+ * @param {object} message The raw message response.\n  */\n-export class Subscriber extends EventEmitter {\n-  histogram: Histogram;\n-  latency_: Histogram;\n-  connectionPool: ConnectionPool|null;\n-  ackDeadline: number;\n-  maxConnections: number;\n-  inventory_;\n-  flowControl;\n-  batching;\n-  flushTimeoutHandle_;\n-  leaseTimeoutHandle_;\n-  userClosed_: boolean;\n-  isOpen: boolean;\n-  messageListeners;\n-  writeToStreams_;\n-  request;\n-  name?: string;\n-\n-  constructor(options) {\n-    super();\n-    options = options || {};\n-    this.histogram = new Histogram();\n-    this.latency_ = new Histogram({min: 0});\n-    this.connectionPool = null;\n-    this.ackDeadline = 10000;\n-    this.maxConnections = options.maxConnections || 5;\n-    this.inventory_ = {\n-      lease: [],\n-      ack: [],\n-      nack: [],\n-      bytes: 0,\n-    };\n-    this.flowControl = Object.assign(\n-        {\n-          maxBytes: os.freemem() * 0.2,\n-          maxMessages: 100,\n-        },\n-        options.flowControl);\n-    this.batching = Object.assign(\n-        {\n-          maxMilliseconds: 100,\n-        },\n-        options.batching);\n-    this.flushTimeoutHandle_ = null;\n-    this.leaseTimeoutHandle_ = null;\n-    this.userClosed_ = false;\n-    this.isOpen = false;\n-    this.messageListeners = 0;\n-    // As of right now we do not write any acks/modacks to the pull streams.\n-    // But with allowing users to opt out of using streaming pulls altogether on\n-    // the horizon, we may need to support this feature again in the near\n-    // future.\n-    this.writeToStreams_ = false;\n-    this.listenForEvents_();\n-  }\n-  /*!\n-   * Acks the provided message. If the connection pool is absent, it will be\n-   * placed in an internal queue and sent out after 1 second or if the pool is\n-   * re-opened before the timeout hits.\n-   *\n-   * @private\n-   *\n-   * @param {object} message The message object.\n-   */\n-  ack_(message) {\n-    const breakLease = this.breakLease_.bind(this, message);\n-    this.histogram.add(Date.now() - message.received);\n-    if (this.writeToStreams_ && this.isConnected_()) {\n-      this.acknowledge_(message.ackId, message.connectionId).then(breakLease);\n-      return;\n-    }\n-    this.inventory_.ack.push(message.ackId);\n-    this.setFlushTimeout_().then(breakLease);\n+export class Message {\n+  ackId: string;\n+  attributes: {};\n+  data: Buffer;\n+  id: string;\n+  publishTime: Date;\n+  received: number;\n+  private _length: number;\n+  private _subscriber: Subscriber;\n+  constructor(sub: Subscriber, {ackId, message}: ReceivedMessage) {\n+    this.ackId = ackId;\n+    this.attributes = message.attributes || {};\n+    this.data = message.data;\n+    this.id = message.messageId;\n+    this.publishTime = Message.formatTimestamp(message.publishTime);\n+    this.received = Date.now();\n+    this._length = this.data.length;\n+    this._subscriber = sub;\n   }\n-  /*!\n-   * Sends an acknowledge request for the provided ack ids.\n-   *\n-   * @private\n+  /**\n+   * The length of the message data.\n    *\n-   * @param {string|string[]} ackIds The ack IDs to acknowledge.\n-   * @param {string} [connId] Connection ID to send request on.\n-   * @return {Promise}\n+   * @type {number}\n    */\n-  acknowledge_(ackIds: string|string[], connId?: string) {\n-    ackIds = arrify(ackIds);\n-    const promises = chunk(ackIds, MAX_ACK_IDS_PER_REQUEST).map(ackIdChunk => {\n-      if (this.writeToStreams_ && this.isConnected_()) {\n-        return this.writeTo_(connId, {ackIds: ackIdChunk});\n-      }\n-      return promisify(this.request).call(this, {\n-        client: 'SubscriberClient',\n-        method: 'acknowledge',\n-        reqOpts: {\n-          subscription: this.name,\n-          ackIds: ackIdChunk,\n-        },\n-      });\n-    });\n-    return Promise.all(promises).catch(err => {\n-      this.emit('error', err);\n-    });\n+  get length() {","path":"src/subscriber.ts","position":186,"original_position":186,"commit_id":"a8db7fadd14ca17fc332118d67c7ffca65bb75cb","original_commit_id":"a8db7fadd14ca17fc332118d67c7ffca65bb75cb","user":{"login":"callmehiphop","id":1707267,"node_id":"MDQ6VXNlcjE3MDcyNjc=","avatar_url":"https://avatars3.githubusercontent.com/u/1707267?v=4","gravatar_id":"","url":"https://api.github.com/users/callmehiphop","html_url":"https://github.com/callmehiphop","followers_url":"https://api.github.com/users/callmehiphop/followers","following_url":"https://api.github.com/users/callmehiphop/following{/other_user}","gists_url":"https://api.github.com/users/callmehiphop/gists{/gist_id}","starred_url":"https://api.github.com/users/callmehiphop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/callmehiphop/subscriptions","organizations_url":"https://api.github.com/users/callmehiphop/orgs","repos_url":"https://api.github.com/users/callmehiphop/repos","events_url":"https://api.github.com/users/callmehiphop/events{/privacy}","received_events_url":"https://api.github.com/users/callmehiphop/received_events","type":"User","site_admin":false},"body":"The discussion is probably buried somewhere, but it is really important for us to preserve the original length of the message since we use it in combination with our `maxBytes` flow control option. This is just a precaution in case the user stomps on it for whatever reason.","created_at":"2018-12-21T21:19:03Z","updated_at":"2018-12-21T21:19:03Z","html_url":"https://github.com/googleapis/nodejs-pubsub/pull/388#discussion_r243694445","pull_request_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/comments/243694445"},"html":{"href":"https://github.com/googleapis/nodejs-pubsub/pull/388#discussion_r243694445"},"pull_request":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388"}},"in_reply_to_id":243661980},"pull_request":{"url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388","id":236268090,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM2MjY4MDkw","html_url":"https://github.com/googleapis/nodejs-pubsub/pull/388","diff_url":"https://github.com/googleapis/nodejs-pubsub/pull/388.diff","patch_url":"https://github.com/googleapis/nodejs-pubsub/pull/388.patch","issue_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues/388","number":388,"state":"open","locked":false,"title":"refactor(subscriber): remove unneeded code & utilize typescript","user":{"login":"callmehiphop","id":1707267,"node_id":"MDQ6VXNlcjE3MDcyNjc=","avatar_url":"https://avatars3.githubusercontent.com/u/1707267?v=4","gravatar_id":"","url":"https://api.github.com/users/callmehiphop","html_url":"https://github.com/callmehiphop","followers_url":"https://api.github.com/users/callmehiphop/followers","following_url":"https://api.github.com/users/callmehiphop/following{/other_user}","gists_url":"https://api.github.com/users/callmehiphop/gists{/gist_id}","starred_url":"https://api.github.com/users/callmehiphop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/callmehiphop/subscriptions","organizations_url":"https://api.github.com/users/callmehiphop/orgs","repos_url":"https://api.github.com/users/callmehiphop/repos","events_url":"https://api.github.com/users/callmehiphop/events{/privacy}","received_events_url":"https://api.github.com/users/callmehiphop/received_events","type":"User","site_admin":false},"body":"Fixes #6\r\nFixes #12 \r\nFixes #115 \r\nFixes #119 \r\n\r\n\r\n- [ ] Tests and linter pass\r\n- [ ] Code coverage does not decrease (if any source code was changed)\r\n- [ ] Appropriate docs were updated (if necessary)\r\n","created_at":"2018-12-05T17:55:06Z","updated_at":"2018-12-21T21:19:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":977115753,"node_id":"MDU6TGFiZWw5NzcxMTU3NTM=","url":"https://api.github.com/repos/googleapis/nodejs-pubsub/labels/cla:%20yes","name":"cla: yes","color":"0B7601","default":false},{"id":784901722,"node_id":"MDU6TGFiZWw3ODQ5MDE3MjI=","url":"https://api.github.com/repos/googleapis/nodejs-pubsub/labels/do%20not%20merge","name":"do not merge","color":"d93f0b","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388/commits","review_comments_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388/comments","review_comment_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/comments{/number}","comments_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues/388/comments","statuses_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/statuses/a8db7fadd14ca17fc332118d67c7ffca65bb75cb","head":{"label":"callmehiphop:dg--subscriber-refactor","ref":"dg--subscriber-refactor","sha":"a8db7fadd14ca17fc332118d67c7ffca65bb75cb","user":{"login":"callmehiphop","id":1707267,"node_id":"MDQ6VXNlcjE3MDcyNjc=","avatar_url":"https://avatars3.githubusercontent.com/u/1707267?v=4","gravatar_id":"","url":"https://api.github.com/users/callmehiphop","html_url":"https://github.com/callmehiphop","followers_url":"https://api.github.com/users/callmehiphop/followers","following_url":"https://api.github.com/users/callmehiphop/following{/other_user}","gists_url":"https://api.github.com/users/callmehiphop/gists{/gist_id}","starred_url":"https://api.github.com/users/callmehiphop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/callmehiphop/subscriptions","organizations_url":"https://api.github.com/users/callmehiphop/orgs","repos_url":"https://api.github.com/users/callmehiphop/repos","events_url":"https://api.github.com/users/callmehiphop/events{/privacy}","received_events_url":"https://api.github.com/users/callmehiphop/received_events","type":"User","site_admin":false},"repo":{"id":113098752,"node_id":"MDEwOlJlcG9zaXRvcnkxMTMwOTg3NTI=","name":"nodejs-pubsub","full_name":"callmehiphop/nodejs-pubsub","private":false,"owner":{"login":"callmehiphop","id":1707267,"node_id":"MDQ6VXNlcjE3MDcyNjc=","avatar_url":"https://avatars3.githubusercontent.com/u/1707267?v=4","gravatar_id":"","url":"https://api.github.com/users/callmehiphop","html_url":"https://github.com/callmehiphop","followers_url":"https://api.github.com/users/callmehiphop/followers","following_url":"https://api.github.com/users/callmehiphop/following{/other_user}","gists_url":"https://api.github.com/users/callmehiphop/gists{/gist_id}","starred_url":"https://api.github.com/users/callmehiphop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/callmehiphop/subscriptions","organizations_url":"https://api.github.com/users/callmehiphop/orgs","repos_url":"https://api.github.com/users/callmehiphop/repos","events_url":"https://api.github.com/users/callmehiphop/events{/privacy}","received_events_url":"https://api.github.com/users/callmehiphop/received_events","type":"User","site_admin":false},"html_url":"https://github.com/callmehiphop/nodejs-pubsub","description":"Node.js client for Google Cloud Pub/Sub: Ingest event streams from anywhere, at any scale, for simple, reliable, real-time stream analytics.","fork":true,"url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub","forks_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/forks","keys_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/keys{/key_id}","collaborators_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/teams","hooks_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/hooks","issue_events_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/issues/events{/number}","events_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/events","assignees_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/assignees{/user}","branches_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/branches{/branch}","tags_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/tags","blobs_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/git/refs{/sha}","trees_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/git/trees{/sha}","statuses_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/statuses/{sha}","languages_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/languages","stargazers_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/stargazers","contributors_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/contributors","subscribers_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/subscribers","subscription_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/subscription","commits_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/commits{/sha}","git_commits_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/git/commits{/sha}","comments_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/comments{/number}","issue_comment_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/issues/comments{/number}","contents_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/contents/{+path}","compare_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/compare/{base}...{head}","merges_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/merges","archive_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/downloads","issues_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/issues{/number}","pulls_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/pulls{/number}","milestones_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/milestones{/number}","notifications_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/labels{/name}","releases_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/releases{/id}","deployments_url":"https://api.github.com/repos/callmehiphop/nodejs-pubsub/deployments","created_at":"2017-12-04T21:46:37Z","updated_at":"2017-12-04T21:46:38Z","pushed_at":"2018-12-07T21:18:35Z","git_url":"git://github.com/callmehiphop/nodejs-pubsub.git","ssh_url":"git@github.com:callmehiphop/nodejs-pubsub.git","clone_url":"https://github.com/callmehiphop/nodejs-pubsub.git","svn_url":"https://github.com/callmehiphop/nodejs-pubsub","homepage":"https://cloud.google.com/pubsub/","size":2295,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"googleapis:master","ref":"master","sha":"fef1b5d174f90ef0177226d734e8dc167d520335","user":{"login":"googleapis","id":16785467,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2Nzg1NDY3","avatar_url":"https://avatars3.githubusercontent.com/u/16785467?v=4","gravatar_id":"","url":"https://api.github.com/users/googleapis","html_url":"https://github.com/googleapis","followers_url":"https://api.github.com/users/googleapis/followers","following_url":"https://api.github.com/users/googleapis/following{/other_user}","gists_url":"https://api.github.com/users/googleapis/gists{/gist_id}","starred_url":"https://api.github.com/users/googleapis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/googleapis/subscriptions","organizations_url":"https://api.github.com/users/googleapis/orgs","repos_url":"https://api.github.com/users/googleapis/repos","events_url":"https://api.github.com/users/googleapis/events{/privacy}","received_events_url":"https://api.github.com/users/googleapis/received_events","type":"Organization","site_admin":false},"repo":{"id":98464783,"node_id":"MDEwOlJlcG9zaXRvcnk5ODQ2NDc4Mw==","name":"nodejs-pubsub","full_name":"googleapis/nodejs-pubsub","private":false,"owner":{"login":"googleapis","id":16785467,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2Nzg1NDY3","avatar_url":"https://avatars3.githubusercontent.com/u/16785467?v=4","gravatar_id":"","url":"https://api.github.com/users/googleapis","html_url":"https://github.com/googleapis","followers_url":"https://api.github.com/users/googleapis/followers","following_url":"https://api.github.com/users/googleapis/following{/other_user}","gists_url":"https://api.github.com/users/googleapis/gists{/gist_id}","starred_url":"https://api.github.com/users/googleapis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/googleapis/subscriptions","organizations_url":"https://api.github.com/users/googleapis/orgs","repos_url":"https://api.github.com/users/googleapis/repos","events_url":"https://api.github.com/users/googleapis/events{/privacy}","received_events_url":"https://api.github.com/users/googleapis/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/googleapis/nodejs-pubsub","description":"Node.js client for Google Cloud Pub/Sub: Ingest event streams from anywhere, at any scale, for simple, reliable, real-time stream analytics.","fork":false,"url":"https://api.github.com/repos/googleapis/nodejs-pubsub","forks_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/forks","keys_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/keys{/key_id}","collaborators_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/teams","hooks_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/hooks","issue_events_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues/events{/number}","events_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/events","assignees_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/assignees{/user}","branches_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/branches{/branch}","tags_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/tags","blobs_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/git/refs{/sha}","trees_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/git/trees{/sha}","statuses_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/statuses/{sha}","languages_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/languages","stargazers_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/stargazers","contributors_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/contributors","subscribers_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/subscribers","subscription_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/subscription","commits_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/commits{/sha}","git_commits_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/git/commits{/sha}","comments_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/comments{/number}","issue_comment_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues/comments{/number}","contents_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/contents/{+path}","compare_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/compare/{base}...{head}","merges_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/merges","archive_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/downloads","issues_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues{/number}","pulls_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls{/number}","milestones_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/milestones{/number}","notifications_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/labels{/name}","releases_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/releases{/id}","deployments_url":"https://api.github.com/repos/googleapis/nodejs-pubsub/deployments","created_at":"2017-07-26T20:50:19Z","updated_at":"2018-12-21T04:56:54Z","pushed_at":"2018-12-21T04:56:52Z","git_url":"git://github.com/googleapis/nodejs-pubsub.git","ssh_url":"git@github.com:googleapis/nodejs-pubsub.git","clone_url":"https://github.com/googleapis/nodejs-pubsub.git","svn_url":"https://github.com/googleapis/nodejs-pubsub","homepage":"https://cloud.google.com/pubsub/","size":2324,"stargazers_count":87,"watchers_count":87,"language":"TypeScript","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":77,"mirror_url":null,"archived":false,"open_issues_count":33,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":77,"open_issues":33,"watchers":87,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388"},"html":{"href":"https://github.com/googleapis/nodejs-pubsub/pull/388"},"issue":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues/388"},"comments":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/issues/388/comments"},"review_comments":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388/comments"},"review_comment":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/pulls/388/commits"},"statuses":{"href":"https://api.github.com/repos/googleapis/nodejs-pubsub/statuses/a8db7fadd14ca17fc332118d67c7ffca65bb75cb"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"callmehiphop"}}