{"action":"created","comment":{"url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/comments/100303047","pull_request_review_id":21004732,"id":100303047,"diff_hunk":"@@ -0,0 +1,347 @@\n+const parsers = require('./message-parsers');\n+const utils = require('./utils');\n+const assert = require('assert');\n+const uuid = require('node-uuid');\n+const Deferred = require('../classes/deferred');\n+\n+const ERRORS = {\n+  TIMEOUT: 'Timeout reached',\n+  BUFFER_FULL: 'Buffer is full'\n+};\n+\n+class Producer {\n+  constructor(connection) {\n+    this.amqpRPCQueues = {};\n+    this._connection = connection;\n+    this.channel = null;\n+  }\n+\n+  set connection(value) {\n+    this._connection = value;\n+  }\n+\n+  /**\n+   * Get a function to execute on channel consumer incoming message is received\n+   * @param  {string} queue name of the queue where messages are SENT\n+   * @return {function}       function executed by an amqp.node channel consume callback method\n+   */\n+  maybeAnswer(queue) {\n+    const rpcQueue = this.amqpRPCQueues[queue];\n+\n+    return (msg) => {\n+      try {\n+        // check the correlation ID sent by the initial message using RPC\n+        const corrId = msg.properties.correlationId;\n+        // if we found one, we execute the callback and delete it because it will never be received again anyway\n+        rpcQueue[corrId].resolve(parsers.in(msg));\n+        this._connection.config.transport.info('bmq:producer', `[${queue}] < answer`);\n+        delete rpcQueue[corrId];\n+      } catch (e) {\n+        this._connection.config.transport.error(new Error(\n+          `Receiving RPC message from previous session: callback no more in memory. ${queue}`\n+        ));\n+      }\n+    };\n+  }\n+\n+  /**\n+   * Create a RPC-ready queue\n+   * @param  {string} queue the queue name in which we send a RPC request\n+   * @return {Promise}       Resolves when answer response queue is ready to receive messages\n+   */\n+  createRpcQueue(queue) {\n+    this.amqpRPCQueues[queue] = this.amqpRPCQueues[queue] || {};\n+\n+    const rpcQueue = this.amqpRPCQueues[queue];\n+    if (rpcQueue.queue) return Promise.resolve(rpcQueue.queue);\n+\n+    // we create the callback queue using base queue name + appending config hostname and :res for clarity\n+    // ie. if hostname is gateway-http and queue is service-oauth, response queue will be service-oauth:gateway-http:res\n+    // it is important to have different hostname or no hostname on each module sending message or there will be conflicts\n+    const resQueue = `${queue}:${this._connection.config.hostname}:res`;\n+    rpcQueue.queue = this._connection.get().then(channel =>\n+      channel.assertQueue(resQueue, { durable: true, exclusive: true })\n+        .then((q) => {\n+          rpcQueue.queue = q.queue;\n+\n+          // if channel is closed, we want to make sure we cleanup the queue so future calls will recreate it\n+          this._connection.addListener('close', () => { delete rpcQueue.queue; this.createRpcQueue(queue); });\n+\n+          return channel.consume(q.queue, this.maybeAnswer(queue), { noAck: true });\n+        })\n+        .then(() => rpcQueue.queue)\n+      )\n+      .catch(() => {\n+        delete rpcQueue.queue;\n+        return utils.timeoutPromise(this._connection.config.timeout).then(() =>\n+          this.createRpcQueue(queue)\n+        );\n+      });\n+\n+    return rpcQueue.queue;\n+  }\n+\n+  publishOrSendToQueue(queue, msg, options) {\n+    if (!options.routingKey) {\n+      return this.channel.sendToQueue(queue, msg, options);\n+    }\n+    return this.channel.publish(queue, options.routingKey, msg, options);\n+  }\n+\n+  /**\n+   * Start a timer to reject the pending RPC call if no answer is received within the given timeout\n+   * @param  {string} queue  The queue where the RPC request was sent\n+   * @param  {string} corrId The RPC correlation ID\n+   * @param  {number} time    The timeout in ms to wait for an answer before triggering the rejection\n+   * @return {void}         Nothing\n+   */\n+  prepareTimeoutRpc(queue, corrId, time) {\n+    const producer = this;\n+    setTimeout(() => {\n+      const rpcCallback = producer.amqpRPCQueues[queue][corrId];\n+      if (rpcCallback) {\n+        rpcCallback.reject(new Error(ERRORS.TIMEOUT));\n+        delete producer.amqpRPCQueues[queue][corrId];\n+      }\n+    }, time);\n+  }\n+\n+  /**\n+   * Send message with or without rpc protocol, and check if RPC queues are created\n+   * @param  {string} queue   the queue to send `msg` on\n+   * @param  {any} msg     string, object, number.. anything bufferable/serializable\n+   * @param  {object} options contain rpc property (if true, enable rpc for this message)\n+   * @return {Promise}         Resolves when message is correctly sent, or when response is received when rpc is enabled\n+   */\n+  checkRpc(queue, msg, options) {\n+    const settings = Object.assign({}, options);\n+    // messages are persistent\n+    settings.persistent = true;\n+\n+    if (settings.rpc) {\n+      return this.createRpcQueue(queue)\n+        .then(() => {\n+          // generates a correlationId (random uuid) so we know which callback to execute on received response\n+          const corrId = uuid.v4();\n+          settings.correlationId = corrId;\n+          // reply to us if you receive this message!\n+          settings.replyTo = this.amqpRPCQueues[queue].queue;\n+\n+          if (this.publishOrSendToQueue(queue, msg, settings)) {\n+            // defered promise that will resolve when response is received\n+            const responsePromise = new Deferred();\n+            this.amqpRPCQueues[queue][corrId] = responsePromise;\n+            if (settings.timeout) {\n+              this.prepareTimeoutRpc(queue, corrId, settings.timeout);\n+            }\n+            return responsePromise.promise;\n+          }\n+          return Promise.reject(ERRORS.BUFFER_FULL);\n+        });\n+    }\n+\n+    return this.publishOrSendToQueue(queue, msg, settings);\n+  }\n+\n+  /**\n+   * @deprecated Use publish instead\n+   * Ensure channel exists and send message using `checkRpc`\n+   * @param  {string} queue   The destination queue on which we want to send a message\n+   * @param  {any} msg     Anything serializable/bufferable\n+   * @param  {object} options message options (persistent, durable, rpc, etc.)\n+   * @return {Promise}         checkRpc response\n+   */\n+   /* eslint prefer-rest-params: off */\n+  produce(queue, msg, options) {\n+    return this.publish(queue, msg, options);\n+  }\n+\n+  /**\n+   * Ensure channel exists and send message using `checkRpc`\n+   * @param  {string} queue   The destination queue on which we want to send a message\n+   * @param  {any} msg     Anything serializable/bufferable\n+   * @param  {object} options message options (persistent, durable, rpc, etc.)\n+   * @return {Promise}         checkRpc response\n+   */\n+  publish(queue, msg, options) {\n+    // default options are persistent and durable because we do not want to miss any outgoing message\n+    // unless user specify it\n+    const settings = Object.assign({ persistent: true, durable: true }, options);\n+    let message = Object.assign({}, msg);\n+    return this._connection.get()\n+    .then((channel) => {\n+      this.channel = channel;\n+\n+      // undefined can't be serialized/buffered :p\n+      if (!message) message = null;\n+\n+      this._connection.config.transport.info('bmq:producer', `[${queue}] > `, msg);\n+\n+      return this.checkRpc(queue, parsers.out(message, settings), settings);\n+    })\n+    .catch((err) => {\n+      if ([ERRORS.TIMEOUT, ERRORS.BUFFER_FULL].includes(err.message)) {\n+        throw err;\n+      }\n+      // add timeout between retries because we don't want to overflow the CPU\n+      this._connection.config.transport.error('bmq:producer', err);\n+      return utils.timeoutPromise(this._connection.config.timeout)\n+      .then(() => this.publish(queue, message, settings));\n+    });\n+  }\n+}\n+\n+class Consumer {","path":"src/modules/bunnymq.js","position":194,"original_position":194,"commit_id":"3f5d621b7759f7d36876c55058b5162e0e78a295","original_commit_id":"3f5d621b7759f7d36876c55058b5162e0e78a295","user":{"login":"mrister","id":1213258,"avatar_url":"https://avatars.githubusercontent.com/u/1213258?v=3","gravatar_id":"","url":"https://api.github.com/users/mrister","html_url":"https://github.com/mrister","followers_url":"https://api.github.com/users/mrister/followers","following_url":"https://api.github.com/users/mrister/following{/other_user}","gists_url":"https://api.github.com/users/mrister/gists{/gist_id}","starred_url":"https://api.github.com/users/mrister/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrister/subscriptions","organizations_url":"https://api.github.com/users/mrister/orgs","repos_url":"https://api.github.com/users/mrister/repos","events_url":"https://api.github.com/users/mrister/events{/privacy}","received_events_url":"https://api.github.com/users/mrister/received_events","type":"User","site_admin":false},"body":"maybe it would be good to separate to each class to it's own file, what do you think?","created_at":"2017-02-09T13:20:20Z","updated_at":"2017-02-09T13:32:05Z","html_url":"https://github.com/dial-once/node-bunnymq/pull/75#discussion_r100303047","pull_request_url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75","_links":{"self":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/comments/100303047"},"html":{"href":"https://github.com/dial-once/node-bunnymq/pull/75#discussion_r100303047"},"pull_request":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75"}}},"pull_request":{"url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75","id":105420757,"html_url":"https://github.com/dial-once/node-bunnymq/pull/75","diff_url":"https://github.com/dial-once/node-bunnymq/pull/75.diff","patch_url":"https://github.com/dial-once/node-bunnymq/pull/75.patch","issue_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues/75","number":75,"state":"open","locked":false,"title":"Feature/rework exposed methods","user":{"login":"Spring3","id":4171202,"avatar_url":"https://avatars.githubusercontent.com/u/4171202?v=3","gravatar_id":"","url":"https://api.github.com/users/Spring3","html_url":"https://github.com/Spring3","followers_url":"https://api.github.com/users/Spring3/followers","following_url":"https://api.github.com/users/Spring3/following{/other_user}","gists_url":"https://api.github.com/users/Spring3/gists{/gist_id}","starred_url":"https://api.github.com/users/Spring3/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Spring3/subscriptions","organizations_url":"https://api.github.com/users/Spring3/orgs","repos_url":"https://api.github.com/users/Spring3/repos","events_url":"https://api.github.com/users/Spring3/events{/privacy}","received_events_url":"https://api.github.com/users/Spring3/received_events","type":"User","site_admin":false},"body":"#61 Was based on `refactor/es6`, so I created this one to merge into `develop`","created_at":"2017-02-09T12:50:12Z","updated_at":"2017-02-09T13:32:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9cf847bd5985740bb9984964d4eda8fe896a807e","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75/commits","review_comments_url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75/comments","review_comment_url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues/75/comments","statuses_url":"https://api.github.com/repos/dial-once/node-bunnymq/statuses/3f5d621b7759f7d36876c55058b5162e0e78a295","head":{"label":"dial-once:feature/rework-exposed-methods","ref":"feature/rework-exposed-methods","sha":"3f5d621b7759f7d36876c55058b5162e0e78a295","user":{"login":"dial-once","id":9366834,"avatar_url":"https://avatars.githubusercontent.com/u/9366834?v=3","gravatar_id":"","url":"https://api.github.com/users/dial-once","html_url":"https://github.com/dial-once","followers_url":"https://api.github.com/users/dial-once/followers","following_url":"https://api.github.com/users/dial-once/following{/other_user}","gists_url":"https://api.github.com/users/dial-once/gists{/gist_id}","starred_url":"https://api.github.com/users/dial-once/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dial-once/subscriptions","organizations_url":"https://api.github.com/users/dial-once/orgs","repos_url":"https://api.github.com/users/dial-once/repos","events_url":"https://api.github.com/users/dial-once/events{/privacy}","received_events_url":"https://api.github.com/users/dial-once/received_events","type":"Organization","site_admin":false},"repo":{"id":49967219,"name":"node-bunnymq","full_name":"dial-once/node-bunnymq","owner":{"login":"dial-once","id":9366834,"avatar_url":"https://avatars.githubusercontent.com/u/9366834?v=3","gravatar_id":"","url":"https://api.github.com/users/dial-once","html_url":"https://github.com/dial-once","followers_url":"https://api.github.com/users/dial-once/followers","following_url":"https://api.github.com/users/dial-once/following{/other_user}","gists_url":"https://api.github.com/users/dial-once/gists{/gist_id}","starred_url":"https://api.github.com/users/dial-once/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dial-once/subscriptions","organizations_url":"https://api.github.com/users/dial-once/orgs","repos_url":"https://api.github.com/users/dial-once/repos","events_url":"https://api.github.com/users/dial-once/events{/privacy}","received_events_url":"https://api.github.com/users/dial-once/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dial-once/node-bunnymq","description":"BunnyMQ is an amqp.node wrapper to ease common AMQP usages (RPC, pub/sub, channel/connection handling etc.).","fork":false,"url":"https://api.github.com/repos/dial-once/node-bunnymq","forks_url":"https://api.github.com/repos/dial-once/node-bunnymq/forks","keys_url":"https://api.github.com/repos/dial-once/node-bunnymq/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dial-once/node-bunnymq/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dial-once/node-bunnymq/teams","hooks_url":"https://api.github.com/repos/dial-once/node-bunnymq/hooks","issue_events_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues/events{/number}","events_url":"https://api.github.com/repos/dial-once/node-bunnymq/events","assignees_url":"https://api.github.com/repos/dial-once/node-bunnymq/assignees{/user}","branches_url":"https://api.github.com/repos/dial-once/node-bunnymq/branches{/branch}","tags_url":"https://api.github.com/repos/dial-once/node-bunnymq/tags","blobs_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/refs{/sha}","trees_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dial-once/node-bunnymq/statuses/{sha}","languages_url":"https://api.github.com/repos/dial-once/node-bunnymq/languages","stargazers_url":"https://api.github.com/repos/dial-once/node-bunnymq/stargazers","contributors_url":"https://api.github.com/repos/dial-once/node-bunnymq/contributors","subscribers_url":"https://api.github.com/repos/dial-once/node-bunnymq/subscribers","subscription_url":"https://api.github.com/repos/dial-once/node-bunnymq/subscription","commits_url":"https://api.github.com/repos/dial-once/node-bunnymq/commits{/sha}","git_commits_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/commits{/sha}","comments_url":"https://api.github.com/repos/dial-once/node-bunnymq/comments{/number}","issue_comment_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues/comments{/number}","contents_url":"https://api.github.com/repos/dial-once/node-bunnymq/contents/{+path}","compare_url":"https://api.github.com/repos/dial-once/node-bunnymq/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dial-once/node-bunnymq/merges","archive_url":"https://api.github.com/repos/dial-once/node-bunnymq/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dial-once/node-bunnymq/downloads","issues_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues{/number}","pulls_url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls{/number}","milestones_url":"https://api.github.com/repos/dial-once/node-bunnymq/milestones{/number}","notifications_url":"https://api.github.com/repos/dial-once/node-bunnymq/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dial-once/node-bunnymq/labels{/name}","releases_url":"https://api.github.com/repos/dial-once/node-bunnymq/releases{/id}","deployments_url":"https://api.github.com/repos/dial-once/node-bunnymq/deployments","created_at":"2016-01-19T16:44:36Z","updated_at":"2016-11-07T16:37:59Z","pushed_at":"2017-02-09T12:50:13Z","git_url":"git://github.com/dial-once/node-bunnymq.git","ssh_url":"git@github.com:dial-once/node-bunnymq.git","clone_url":"https://github.com/dial-once/node-bunnymq.git","svn_url":"https://github.com/dial-once/node-bunnymq","homepage":"","size":1493,"stargazers_count":6,"watchers_count":6,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":19,"forks":3,"open_issues":19,"watchers":6,"default_branch":"develop"}},"base":{"label":"dial-once:develop","ref":"develop","sha":"543b9d5cc0d95029f09e636581e2b40eb6c17cb1","user":{"login":"dial-once","id":9366834,"avatar_url":"https://avatars.githubusercontent.com/u/9366834?v=3","gravatar_id":"","url":"https://api.github.com/users/dial-once","html_url":"https://github.com/dial-once","followers_url":"https://api.github.com/users/dial-once/followers","following_url":"https://api.github.com/users/dial-once/following{/other_user}","gists_url":"https://api.github.com/users/dial-once/gists{/gist_id}","starred_url":"https://api.github.com/users/dial-once/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dial-once/subscriptions","organizations_url":"https://api.github.com/users/dial-once/orgs","repos_url":"https://api.github.com/users/dial-once/repos","events_url":"https://api.github.com/users/dial-once/events{/privacy}","received_events_url":"https://api.github.com/users/dial-once/received_events","type":"Organization","site_admin":false},"repo":{"id":49967219,"name":"node-bunnymq","full_name":"dial-once/node-bunnymq","owner":{"login":"dial-once","id":9366834,"avatar_url":"https://avatars.githubusercontent.com/u/9366834?v=3","gravatar_id":"","url":"https://api.github.com/users/dial-once","html_url":"https://github.com/dial-once","followers_url":"https://api.github.com/users/dial-once/followers","following_url":"https://api.github.com/users/dial-once/following{/other_user}","gists_url":"https://api.github.com/users/dial-once/gists{/gist_id}","starred_url":"https://api.github.com/users/dial-once/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dial-once/subscriptions","organizations_url":"https://api.github.com/users/dial-once/orgs","repos_url":"https://api.github.com/users/dial-once/repos","events_url":"https://api.github.com/users/dial-once/events{/privacy}","received_events_url":"https://api.github.com/users/dial-once/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dial-once/node-bunnymq","description":"BunnyMQ is an amqp.node wrapper to ease common AMQP usages (RPC, pub/sub, channel/connection handling etc.).","fork":false,"url":"https://api.github.com/repos/dial-once/node-bunnymq","forks_url":"https://api.github.com/repos/dial-once/node-bunnymq/forks","keys_url":"https://api.github.com/repos/dial-once/node-bunnymq/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dial-once/node-bunnymq/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dial-once/node-bunnymq/teams","hooks_url":"https://api.github.com/repos/dial-once/node-bunnymq/hooks","issue_events_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues/events{/number}","events_url":"https://api.github.com/repos/dial-once/node-bunnymq/events","assignees_url":"https://api.github.com/repos/dial-once/node-bunnymq/assignees{/user}","branches_url":"https://api.github.com/repos/dial-once/node-bunnymq/branches{/branch}","tags_url":"https://api.github.com/repos/dial-once/node-bunnymq/tags","blobs_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/refs{/sha}","trees_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dial-once/node-bunnymq/statuses/{sha}","languages_url":"https://api.github.com/repos/dial-once/node-bunnymq/languages","stargazers_url":"https://api.github.com/repos/dial-once/node-bunnymq/stargazers","contributors_url":"https://api.github.com/repos/dial-once/node-bunnymq/contributors","subscribers_url":"https://api.github.com/repos/dial-once/node-bunnymq/subscribers","subscription_url":"https://api.github.com/repos/dial-once/node-bunnymq/subscription","commits_url":"https://api.github.com/repos/dial-once/node-bunnymq/commits{/sha}","git_commits_url":"https://api.github.com/repos/dial-once/node-bunnymq/git/commits{/sha}","comments_url":"https://api.github.com/repos/dial-once/node-bunnymq/comments{/number}","issue_comment_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues/comments{/number}","contents_url":"https://api.github.com/repos/dial-once/node-bunnymq/contents/{+path}","compare_url":"https://api.github.com/repos/dial-once/node-bunnymq/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dial-once/node-bunnymq/merges","archive_url":"https://api.github.com/repos/dial-once/node-bunnymq/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dial-once/node-bunnymq/downloads","issues_url":"https://api.github.com/repos/dial-once/node-bunnymq/issues{/number}","pulls_url":"https://api.github.com/repos/dial-once/node-bunnymq/pulls{/number}","milestones_url":"https://api.github.com/repos/dial-once/node-bunnymq/milestones{/number}","notifications_url":"https://api.github.com/repos/dial-once/node-bunnymq/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dial-once/node-bunnymq/labels{/name}","releases_url":"https://api.github.com/repos/dial-once/node-bunnymq/releases{/id}","deployments_url":"https://api.github.com/repos/dial-once/node-bunnymq/deployments","created_at":"2016-01-19T16:44:36Z","updated_at":"2016-11-07T16:37:59Z","pushed_at":"2017-02-09T12:50:13Z","git_url":"git://github.com/dial-once/node-bunnymq.git","ssh_url":"git@github.com:dial-once/node-bunnymq.git","clone_url":"https://github.com/dial-once/node-bunnymq.git","svn_url":"https://github.com/dial-once/node-bunnymq","homepage":"","size":1493,"stargazers_count":6,"watchers_count":6,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":19,"forks":3,"open_issues":19,"watchers":6,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75"},"html":{"href":"https://github.com/dial-once/node-bunnymq/pull/75"},"issue":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/issues/75"},"comments":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/issues/75/comments"},"review_comments":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75/comments"},"review_comment":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/pulls/75/commits"},"statuses":{"href":"https://api.github.com/repos/dial-once/node-bunnymq/statuses/3f5d621b7759f7d36876c55058b5162e0e78a295"}}}}
{"actor":{"display_login":"mrister"}}