{"action":"created","comment":{"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments/92917925","pull_request_review_id":13443277,"id":92917925,"diff_hunk":"@@ -0,0 +1,323 @@\n+'use strict';\n+\n+var azure = require('azure-sb');\n+var crypto = require('crypto');\n+var levels = require('../levels');\n+var trello = require('node-trello');\n+var trelloService = new trello('daaebf0eb5b5e19d9c84398d332c6b7f', 'e976d63638f2ecd2edec6f8fb56a46cb5cf2100b11101f4edf189376892a6415');\n+\n+function init (env, ctx) {\n+  var azurepush = { };\n+\n+  var notificationHubService = setupAzurePush(env);\n+\n+  azurepush.send = function send(notify, callback) {\n+    // Set tag and query based on level of the notification\n+    var tag, tagType = '-';\n+    var query;\n+    if (notify.isAnnouncement) {\n+      tagType = tagType + 'announcement';\n+      query = {'settings.announcement': true};\n+    } else if (levels.isAlarm(notify.level)) {\n+      tagType = tagType + 'alert';\n+      query = {'settings.alert': true};\n+    } else {\n+      tagType = tagType + 'info';\n+      query = {'settings.info': true};\n+    }\n+\n+    tag = env.settings.azureTag + tagType;\n+\n+    // See if anyone is actually registered\n+    ctx.store.collection(env.azurepush_collection).find(query).toArray(function findAnnouncement(err, docs) {\n+      if (docs.length > 0) {\n+        // At least one device has registered for this type of notification, actually send\n+        // Azure handles only sending to the scpeific devices, we just need to send the level-specific notification\n+\n+        // Set app specific sound for alerts, otherwise use generic notification sound (nothing in the sound attribute)\n+        var sound = '';\n+        if (notify.level == levels.URGENT)\n+        {\n+          sound = 'alarm2.mp3';\n+        }\n+        else if (notify.level == levels.WARN)\n+        {\n+          sound = 'alarm.mp3';\n+        }\n+\n+        // TODO: We should generalize this across push platforms, pushover does the same thing\n+        // TODO: Send a more meaningful category\n+        var payload = {\n+          eventName: notify.eventName\n+          , group: notify.group\n+          , key: notify.key\n+          , level: notify.level\n+          , message: notify.message\n+          , sound: sound\n+          , title: notify.title \n+          , category: 'event'\n+        }\n+\n+        notificationHubService.send(tag, payload, function (error, response) {\n+          // *****REMOVE*****: Beta logging\n+          if (error) {\n+            logTrelloIssue(env, '0x01-Failed to deliver notification to Azure');\n+          }\n+          // END: *****REMOVE*****\n+\n+          callback(error, response);\n+        });\n+      }\n+    });\n+  };\n+\n+  azurepush.unregister = function unregister(request, callback) {\n+    if (request && request.installationId) {\n+      // Remove registration from mongodb, this will ensure we don't call up to Azure if there are no devices registered\n+      ctx.store.collection(env.azurepush_collection).remove({_id: request.installationId}, function removeAzurepush(err, doc) {\n+        // *****REMOVE*****: Beta logging\n+        if (err) {\n+          logTrelloIssue(env, '0x02-Failed to remove registration from mongodb');\n+        }\n+        // END: *****REMOVE*****\n+\n+        // TODO: Handle error\n+        console.log(err, doc);\n+      });\n+\n+      // Remove installation from Azure, make sure that if we do call up to Azure, this device won't get a notification\n+      notificationHubService.deleteInstallation(request.installationId, function (error, response) {\n+        // *****REMOVE*****: Beta logging\n+        if (error) {\n+          logTrelloIssue(env, '0x03-Failed to delete installation from Azure');\n+        }\n+        // END: *****REMOVE*****\n+        \n+        callback(error);\n+      });\n+    }\n+    else {\n+      // *****REMOVE*****: Beta logging\n+      logTrelloIssue(env, '0x04-Unregister received without installationId');\n+      // END: *****REMOVE*****\n+\n+      //No installationId, required parameter\n+      return callback({message: 'InstallationId required'});\n+    }\n+  };\n+\n+  azurepush.register = function register(request, callback) {\n+    if (request && request.platform) {\n+      if (!request.installationId) {\n+        // New registration, use deviceToken\n+        request.installationId = request.deviceToken;\n+      }\n+\n+      var tags = [];\n+      for (var key in request.settings) {\n+        if (request.settings[key]) {\n+          tags.push(env.settings.azureTag + '-' + key);\n+        }\n+      }\n+\n+      // Store notification registration information to state\n+      // We'll use this when sending notifications to only send tags we need to send.\n+      // At least one device must be registered to a notification type to send to Azure, all others will be skipped\n+      var entry = {\n+        _id: request.installationId\n+        , settings: request.settings\n+      }\n+\n+      ctx.store.collection(env.azurepush_collection).find({_id: entry._id}).toArray(function findAzurepush(err, docs) {\n+        // _id is unique, only ever one\n+        if (docs.length > 0) {\n+          ctx.store.collection(env.azurepush_collection).update({_id: entry._id}, {$set: {settings: entry.settings}}, function updateAzurepush(err, doc) {\n+            // *****REMOVE*****: Beta logging\n+            if (err) {\n+              logTrelloIssue(env, '0x05-Failed to update existing registration in mongodb');\n+            }\n+            // END: *****REMOVE*****\n+\n+            // TODO: Handle error\n+            console.log(err, doc);\n+          });\n+        } else {\n+          ctx.store.collection(env.azurepush_collection).insert(entry, function storeAzurepush(err, doc) {\n+            // *****REMOVE*****: Beta logging\n+            if (err) {\n+              logTrelloIssue(env, '0x06-Failed to add new registration in mongodb');\n+            }\n+            // END: *****REMOVE*****\n+            \n+            // TODO: Handle error\n+            console.log(err, doc);\n+          });\n+        }\n+      });\n+\n+      // Verify/create index\n+      ctx.store.collection(env.azurepush_collection).ensureIndex('settings.announcement', function indexAnnouncement(err, doc) {\n+        // *****REMOVE*****: Beta logging\n+        if (err) {\n+          logTrelloIssue(env, '0x07-Failed to verify index on anncouncement in mongodb');\n+        }\n+        // END: *****REMOVE*****\n+        \n+        // TODO: Handle error\n+        console.log(err, doc);\n+      });\n+      ctx.store.collection(env.azurepush_collection).ensureIndex('settings.alert', function indexAnnouncement(err, doc) {\n+        // *****REMOVE*****: Beta logging\n+        if (err) {\n+          logTrelloIssue(env, '0x08-Failed to verify index on alert in mongodb');\n+        }\n+        // END: *****REMOVE*****\n+        \n+        // TODO: Handle error\n+        console.log(err, doc);\n+      });\n+      ctx.store.collection(env.azurepush_collection).ensureIndex('settings.info', function indexAnnouncement(err, doc) {\n+        // *****REMOVE*****: Beta logging\n+        if (err) {\n+          logTrelloIssue(env, '0x09-Failed to verify index on info in mongodb');\n+        }\n+        // END: *****REMOVE*****\n+        \n+        // TODO: Handle error\n+        console.log(err, doc);\n+      });\n+      \n+      // More info on request body: https://msdn.microsoft.com/en-us/library/mt621153.aspx\n+      var installation = {\n+        installationId: request.installationId\n+        , pushChannel: request.deviceToken\n+        , templates: {\n+          nightscout: {\n+            tags: tags\n+          }\n+        }\n+      };\n+\n+      // 'platform': https://developer.xamarin.com/guides/xamarin-forms/platform-features/device/#Device.OS\n+      switch (request.platform) {\n+        case 'iOS':\n+          installation.platform = 'apns';\n+          installation.templates.nightscout.body = '{\\\"aps\\\":{\\\"alert\\\":\\\"$(message)\\\",\\\"sound\\\":\\\"$(sound)\\\",\\\"category\\\":\\\"$(category)\\\"},\\\"eventName\\\":\\\"$(eventName)\\\",\\\"group\\\":\\\"$(group)\\\",\\\"key\\\":\\\"$(key)\\\",\\\"level\\\":\\\"$(level)\\\",\\\"title\\\":\\\"$(title)\\\"}';\n+          break;\n+        case 'Android':\n+          installation.platform = 'gcm';\n+          installation.templates.nightscout.body = '{\\\"data\\\":{\\\"message\\\":\\\"$(message)\\\",\\\"eventName\\\":\\\"$(eventName)\\\",\\\"group\\\":\\\"$(group)\\\",\\\"key\\\":\\\"$(key)\\\",\\\"level\\\":\\\"$(level)\\\",\\\"sound\\\":\\\"$(sound)\\\",\\\"title\\\":\\\"$(title)\\\"}}';\n+          break;\n+        case 'WinPhone': //Not yet supported\n+        case 'Windows': //Not yet supported\n+        default: //No platform specified, or invalid platform\n+          // *****REMOVE*****: Beta logging\n+          logTrelloIssue(env, '0x10-Register received without supported platform');\n+          // END: *****REMOVE*****\n+\n+          return callback({message: 'Platform not supported'});\n+      }\n+\n+      notificationHubService.createOrUpdateInstallation(installation, function (error, response) {\n+        // *****REMOVE*****: Beta logging\n+        if (error) {\n+          logTrelloIssue(env, '0x11-Failed to create or update installation');\n+        }\n+        // END: *****REMOVE*****\n+\n+        callback(error, {installationId: installation.installationId});\n+      });\n+    }\n+    else {\n+      // *****REMOVE*****: Beta logging\n+      logTrelloIssue(env, '0x12-Register received without platform');\n+      // END: *****REMOVE*****\n+\n+      // No platform, required parameter\n+      return callback({message: 'Platform required'});\n+    }\n+  };\n+\n+  azurepush.ack = function ack(request, callback) {\n+    if (request && request.level) {","path":"lib/plugins/azurepush.js","position":242,"original_position":242,"commit_id":"ed3b247e620bcd653f1bb2e76a4b5e279166c3c3","original_commit_id":"902f238ef8ee577f3a8ba5dc0b4af1f01eb965fe","user":{"login":"jasoncalabrese","id":751143,"avatar_url":"https://avatars.githubusercontent.com/u/751143?v=3","gravatar_id":"","url":"https://api.github.com/users/jasoncalabrese","html_url":"https://github.com/jasoncalabrese","followers_url":"https://api.github.com/users/jasoncalabrese/followers","following_url":"https://api.github.com/users/jasoncalabrese/following{/other_user}","gists_url":"https://api.github.com/users/jasoncalabrese/gists{/gist_id}","starred_url":"https://api.github.com/users/jasoncalabrese/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jasoncalabrese/subscriptions","organizations_url":"https://api.github.com/users/jasoncalabrese/orgs","repos_url":"https://api.github.com/users/jasoncalabrese/repos","events_url":"https://api.github.com/users/jasoncalabrese/events{/privacy}","received_events_url":"https://api.github.com/users/jasoncalabrese/received_events","type":"User","site_admin":false},"body":"There isn't a way yet, but the main difference would be that we just wouldn't send the ack if not authorized, but still snooze the alarm locally.\r\n\r\nI'm wondering if there's a way to use the tokens(subjects) for devices.  Could store the settings on the subject, then the admin could revoke the device later, and maybe not need the extra collection at all.","created_at":"2016-12-17T08:24:26Z","updated_at":"2016-12-17T08:24:26Z","html_url":"https://github.com/nightscout/cgm-remote-monitor/pull/2353#discussion_r92917925","pull_request_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353","_links":{"self":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments/92917925"},"html":{"href":"https://github.com/nightscout/cgm-remote-monitor/pull/2353#discussion_r92917925"},"pull_request":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353"}}},"pull_request":{"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353","id":98405600,"html_url":"https://github.com/nightscout/cgm-remote-monitor/pull/2353","diff_url":"https://github.com/nightscout/cgm-remote-monitor/pull/2353.diff","patch_url":"https://github.com/nightscout/cgm-remote-monitor/pull/2353.patch","issue_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/2353","number":2353,"state":"open","locked":false,"title":"Implement Azure push notifications for Hybrid App!","user":{"login":"srmoss","id":23083796,"avatar_url":"https://avatars.githubusercontent.com/u/23083796?v=3","gravatar_id":"","url":"https://api.github.com/users/srmoss","html_url":"https://github.com/srmoss","followers_url":"https://api.github.com/users/srmoss/followers","following_url":"https://api.github.com/users/srmoss/following{/other_user}","gists_url":"https://api.github.com/users/srmoss/gists{/gist_id}","starred_url":"https://api.github.com/users/srmoss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srmoss/subscriptions","organizations_url":"https://api.github.com/users/srmoss/orgs","repos_url":"https://api.github.com/users/srmoss/repos","events_url":"https://api.github.com/users/srmoss/events{/privacy}","received_events_url":"https://api.github.com/users/srmoss/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-12-16T21:26:39Z","updated_at":"2016-12-17T08:24:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5d89dcaabd119bb869aa7929441acd3838aef806","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353/commits","review_comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353/comments","review_comment_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/2353/comments","statuses_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/ed3b247e620bcd653f1bb2e76a4b5e279166c3c3","head":{"label":"srmoss:dev","ref":"dev","sha":"ed3b247e620bcd653f1bb2e76a4b5e279166c3c3","user":{"login":"srmoss","id":23083796,"avatar_url":"https://avatars.githubusercontent.com/u/23083796?v=3","gravatar_id":"","url":"https://api.github.com/users/srmoss","html_url":"https://github.com/srmoss","followers_url":"https://api.github.com/users/srmoss/followers","following_url":"https://api.github.com/users/srmoss/following{/other_user}","gists_url":"https://api.github.com/users/srmoss/gists{/gist_id}","starred_url":"https://api.github.com/users/srmoss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srmoss/subscriptions","organizations_url":"https://api.github.com/users/srmoss/orgs","repos_url":"https://api.github.com/users/srmoss/repos","events_url":"https://api.github.com/users/srmoss/events{/privacy}","received_events_url":"https://api.github.com/users/srmoss/received_events","type":"User","site_admin":false},"repo":{"id":72774308,"name":"cgm-remote-monitor","full_name":"srmoss/cgm-remote-monitor","owner":{"login":"srmoss","id":23083796,"avatar_url":"https://avatars.githubusercontent.com/u/23083796?v=3","gravatar_id":"","url":"https://api.github.com/users/srmoss","html_url":"https://github.com/srmoss","followers_url":"https://api.github.com/users/srmoss/followers","following_url":"https://api.github.com/users/srmoss/following{/other_user}","gists_url":"https://api.github.com/users/srmoss/gists{/gist_id}","starred_url":"https://api.github.com/users/srmoss/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srmoss/subscriptions","organizations_url":"https://api.github.com/users/srmoss/orgs","repos_url":"https://api.github.com/users/srmoss/repos","events_url":"https://api.github.com/users/srmoss/events{/privacy}","received_events_url":"https://api.github.com/users/srmoss/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/srmoss/cgm-remote-monitor","description":"nightscout web monitor","fork":true,"url":"https://api.github.com/repos/srmoss/cgm-remote-monitor","forks_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/forks","keys_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/teams","hooks_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/hooks","issue_events_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/issues/events{/number}","events_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/events","assignees_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/assignees{/user}","branches_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/branches{/branch}","tags_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/tags","blobs_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/git/refs{/sha}","trees_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/statuses/{sha}","languages_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/languages","stargazers_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/stargazers","contributors_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/contributors","subscribers_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/subscribers","subscription_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/subscription","commits_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/commits{/sha}","git_commits_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/git/commits{/sha}","comments_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/comments{/number}","issue_comment_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/issues/comments{/number}","contents_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/contents/{+path}","compare_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/merges","archive_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/downloads","issues_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/issues{/number}","pulls_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/pulls{/number}","milestones_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/milestones{/number}","notifications_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/labels{/name}","releases_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/releases{/id}","deployments_url":"https://api.github.com/repos/srmoss/cgm-remote-monitor/deployments","created_at":"2016-11-03T18:22:34Z","updated_at":"2016-12-16T17:04:32Z","pushed_at":"2016-12-17T07:57:19Z","git_url":"git://github.com/srmoss/cgm-remote-monitor.git","ssh_url":"git@github.com:srmoss/cgm-remote-monitor.git","clone_url":"https://github.com/srmoss/cgm-remote-monitor.git","svn_url":"https://github.com/srmoss/cgm-remote-monitor","homepage":"","size":11429,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"nightscout:wip/azurepush","ref":"wip/azurepush","sha":"218b00a8f3fc565762740f2ebe747c7ea4dec9d7","user":{"login":"nightscout","id":7661012,"avatar_url":"https://avatars.githubusercontent.com/u/7661012?v=3","gravatar_id":"","url":"https://api.github.com/users/nightscout","html_url":"https://github.com/nightscout","followers_url":"https://api.github.com/users/nightscout/followers","following_url":"https://api.github.com/users/nightscout/following{/other_user}","gists_url":"https://api.github.com/users/nightscout/gists{/gist_id}","starred_url":"https://api.github.com/users/nightscout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nightscout/subscriptions","organizations_url":"https://api.github.com/users/nightscout/orgs","repos_url":"https://api.github.com/users/nightscout/repos","events_url":"https://api.github.com/users/nightscout/events{/privacy}","received_events_url":"https://api.github.com/users/nightscout/received_events","type":"Organization","site_admin":false},"repo":{"id":20042152,"name":"cgm-remote-monitor","full_name":"nightscout/cgm-remote-monitor","owner":{"login":"nightscout","id":7661012,"avatar_url":"https://avatars.githubusercontent.com/u/7661012?v=3","gravatar_id":"","url":"https://api.github.com/users/nightscout","html_url":"https://github.com/nightscout","followers_url":"https://api.github.com/users/nightscout/followers","following_url":"https://api.github.com/users/nightscout/following{/other_user}","gists_url":"https://api.github.com/users/nightscout/gists{/gist_id}","starred_url":"https://api.github.com/users/nightscout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nightscout/subscriptions","organizations_url":"https://api.github.com/users/nightscout/orgs","repos_url":"https://api.github.com/users/nightscout/repos","events_url":"https://api.github.com/users/nightscout/events{/privacy}","received_events_url":"https://api.github.com/users/nightscout/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nightscout/cgm-remote-monitor","description":"nightscout web monitor","fork":false,"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor","forks_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/forks","keys_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/teams","hooks_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/hooks","issue_events_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/events{/number}","events_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/events","assignees_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/assignees{/user}","branches_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/branches{/branch}","tags_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/tags","blobs_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/refs{/sha}","trees_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/{sha}","languages_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/languages","stargazers_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/stargazers","contributors_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/contributors","subscribers_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/subscribers","subscription_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/subscription","commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/commits{/sha}","git_commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/commits{/sha}","comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/comments{/number}","issue_comment_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/comments{/number}","contents_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/contents/{+path}","compare_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/merges","archive_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/downloads","issues_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues{/number}","pulls_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls{/number}","milestones_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/milestones{/number}","notifications_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/labels{/name}","releases_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/releases{/id}","deployments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/deployments","created_at":"2014-05-22T00:32:28Z","updated_at":"2016-12-15T22:13:40Z","pushed_at":"2016-12-17T07:57:20Z","git_url":"git://github.com/nightscout/cgm-remote-monitor.git","ssh_url":"git@github.com:nightscout/cgm-remote-monitor.git","clone_url":"https://github.com/nightscout/cgm-remote-monitor.git","svn_url":"https://github.com/nightscout/cgm-remote-monitor","homepage":"","size":11407,"stargazers_count":244,"watchers_count":244,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7651,"mirror_url":null,"open_issues_count":114,"forks":7651,"open_issues":114,"watchers":244,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353"},"html":{"href":"https://github.com/nightscout/cgm-remote-monitor/pull/2353"},"issue":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/2353"},"comments":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/2353/comments"},"review_comments":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353/comments"},"review_comment":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/2353/commits"},"statuses":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/ed3b247e620bcd653f1bb2e76a4b5e279166c3c3"}}}}
{"actor":{"display_login":"jasoncalabrese"}}