{"action":"created","comment":{"url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/comments/184073069","pull_request_review_id":115193633,"id":184073069,"diff_hunk":"@@ -629,513 +604,842 @@ class AzureIoTHub {\n \n     //------------------------------------------------------------------------------\n \n-    // Client transport class\n-    // NOTE: This class differs from the original Node.js SDK\n-    ClientAMQP = class {\n-\n-        _config = null;\n-        _connection = null;\n-        _sessions = null;\n-        _senders = null;\n-        _receivers = null;\n-        _transfers = null;\n-        _handlers = null;\n-        _msgQueue = null;\n-\n-        _connecting = false;\n-        _senderTokenError = false;\n-        _receiverTokenError = false;\n-        _debug = false;\n+    Client = class {\n \n-        constructor(config) {\n-            _config = config;\n-            _resetConnectionTables();\n-        }\n+        static DEFAULT_CLIENT_OPTIONS = {\n+            \"qos\" : 0,\n+            // Timeout for RetrieveTwin and UpdateTwin requests (sec)\n+            \"timeout\" : 10,\n+            // Maximum amount of parallel UpdateTwin requests\n+            \"twinUpdParallelReqs\" : 3,\n+            // Maximum amount of parallel SendMessage requests\n+            \"sendMsgParallelReqs\" : 3\n+        };\n \n-        // done has one param (error)\n-        // onDisconnect has one param (error)\n-        function connect(done = null, onDisconnect = null) {\n-            // set connecting flag\n-            _connecting = true;\n-\n-            // set callbacks\n-            _handlers.onConnected <- done;\n-            _handlers.onDisconnect <- onDisconnect;\n-\n-            // TODO: create a state machine to clean up tracking connection status\n-            // Don't open a connection if one is already open\n-            if( _isOpen(_connection) ) {\n-                if ( _isOpen(_sessions.auth) ) {\n-                    if ( _isOpen(_receivers.auth) ) {\n-                        if ( _isOpen(_senders.auth) ) {\n-                            if ( _isOpen(_sessions.event) ) {\n-                                if ( _isOpen(_senders.event) ) {\n-                                    _connectionCallback(null);\n-                                } else {\n-                                    _openEventSender();\n-                                }\n-                            } else {\n-                                _openEventSession();\n-                            }\n-                        } else {\n-                            _openAuthSender();\n-                        }\n-                    } else {\n-                        _openAuthReceiver();\n-                    }\n-                } else {\n-                    _openAuthSession();\n-                }\n-            } else {\n-                _connection = amqp.openconnection(\"amqps://\" + _config.host, _amqpConnectionStatusHandler.bindenv(this));\n+        static S_DISCONNECTED       = 1;\n+        static S_DISCONNECTING      = 2;\n+        static S_CONNECTED          = 4;\n+        static S_CONNECTING         = 8;\n+        static S_ENABLING_MSG       = 1024;\n+        static S_ENABLING_TWIN      = 2048;\n+        static S_ENABLING_METH      = 4096;\n+        static S_DISABLING_MSG      = 131072;\n+        static S_DISABLING_TWIN     = 262144;\n+        static S_DISABLING_METH     = 524288;\n+\n+        static E_NOT_CONNECTED      = 1000;\n+        static E_ALREADY_CONNECTED  = 1001;\n+        static E_NOT_ENABLED        = 1002;\n+        static E_ALREADY_ENABLED    = 1003;\n+        static E_OP_NOT_ALLOWED_NOW = 1004;\n+        static E_OP_TIMED_OUT       = 1005;\n+        static E_GENERAL            = 1010;\n+\n+        _debugEnabled               = false;\n+\n+        _connStrParsed              = null;\n+        _options                    = null;\n+        _mqttclient                 = null;\n+        _state                      = null;\n+        _topics                     = null;\n+\n+        // Long term user callbacks. Like onReceive, onRequest, onMethod\n+        _onConnectCb                = null;\n+        _onDisconnectCb             = null;\n+        _onMessageCb                = null;\n+        _onTwinReqCb                = null;\n+        _onMethodCb                 = null;\n+\n+        // Short term user callbacks. Like onComplete, onRetrieve\n+        // User can send several messages in parallel, so we need a map reqId -> <callback>\n+        _msgSentCbMap               = {};\n+        _msgEnabledCb               = null;\n+        _twinEnabledCb              = null;\n+        // Contains [<reqId>, <callback>, <timer>] or null\n+        _twinRetrCb                 = null;\n+        // User can update twin several times in parallel, so we need a map reqId -> [<callback>, <timer>]\n+        _twinUpdCbMap               = {};\n+        _methEnabledCb              = null;\n+\n+        _reqNum                     = 0;\n+\n+\n+        // MQTT Client class constructor.\n+        //\n+        // Parameters:\n+        //     deviceConnStr : String       Device connection string: includes the host name to connect, the device Id and the shared access string.\n+        //                                  It can be obtained from the Azure Portal.\n+        //                                  However, if the device was registered using the AzureIoTHub.Registry class,\n+        //                                  the deviceConnectionString parameter can be retrieved from the AzureIoTHub.Device instance passed\n+        //                                  to the AzureIoTHub.Registry.get() or AzureIoTHub.Registry.create() method callbacks.\n+        //                                  For more guidance, please see the AzureIoTHub.registry example (README.md).\n+        //     onConnect : Function         Callback called every time the device is connected.\n+        //                                  The callback signature:\n+        //                                  onConnect(error), where\n+        //                                      error : Integer     0 if the connection is successful, an error code otherwise.\n+        //     onDisconnect : Function      Callback called every time the device is disconnected\n+        //          (optional)              The callback signature:\n+        //                                  onDisconnect(error), where\n+        //                                      error : Integer     0 if the disconnection was caused by the disconnect() method,\n+        //                                                          an error code which explains a reason of the disconnection otherwise.\n+        //     options : Table              Key-value table with optional settings.\n+        //          (optional)\n+        //\n+        // Returns:                         AzureIoTHub.Client instance created.\n+        constructor(deviceConnStr, onConnect, onDisconnect = null, options = {}) {\n+            _state = S_DISCONNECTED;\n+            _options = DEFAULT_CLIENT_OPTIONS;\n+\n+            _onConnectCb      = onConnect;\n+            _onDisconnectCb   = onDisconnect;\n+\n+            _connStrParsed = AzureIoTHub.ConnectionString.Parse(deviceConnStr);\n+            _mqttclient = mqtt.createclient();\n+            _mqttclient.onconnect(_onConnect.bindenv(this));\n+            _mqttclient.onconnectionlost(_onDisconnect.bindenv(this));\n+            _mqttclient.onmessage(_onMessage.bindenv(this));\n+\n+            foreach (optName, optVal in options) {\n+                _options[optName] <- optVal;\n             }\n-        }\n \n-        function disconnect() {\n-            _connection.close();\n-            _resetConnectionTables();\n+            _fillTopics(_connStrParsed.DeviceId);\n         }\n \n-        // done cb params - err\n-        function sendEvent(message, done = null) {\n-            if ( !_isOpen(_sessions.event) ) {\n-                if (done) done(\"Cannot send while disconnected.\");\n-            } else {\n-                if ( !_isOpen(_senders.event) ) {\n-                    _log(\"creating event sender\");\n-                    // add message to queue\n-                    _msgQueue.push({\"msg\" : message, \"cb\" : done});\n-                    // create a new sender & send message\n-                    _openEventSender();\n-                } else {\n-                    _log(\"event sender open\")\n-                    _sendEvent(message, done);\n-                }\n-            }\n-        }\n-\n-        // done is called everytime a message is available, params - error, data\n-        function receive(done) {\n-            _handlers.onEvent <- done;\n+        // Opens a connection to Azure IoT Hub.\n+        //\n+        // Returns:                         Nothing.\n+        function connect() {\n+            if (_state == S_DISCONNECTED) {\n+                _log(\"Connecting...\");\n \n-            if (done == null) {\n-                _receivers.event.close();\n-                // clear out handlers\n-                return this;\n-            }\n+                local devPath = \"/\" + _connStrParsed.DeviceId;","path":"AzureIoTHub.agent.lib.nut","position":329,"original_position":329,"commit_id":"a60d99bfd2c787e0f1752c7622bcdd0489fa09d3","original_commit_id":"641d4e4f452e445fd8ebfda5be9126f6e32fb1b2","user":{"login":"ragrus-nbl","id":38075410,"avatar_url":"https://avatars2.githubusercontent.com/u/38075410?v=4","gravatar_id":"","url":"https://api.github.com/users/ragrus-nbl","html_url":"https://github.com/ragrus-nbl","followers_url":"https://api.github.com/users/ragrus-nbl/followers","following_url":"https://api.github.com/users/ragrus-nbl/following{/other_user}","gists_url":"https://api.github.com/users/ragrus-nbl/gists{/gist_id}","starred_url":"https://api.github.com/users/ragrus-nbl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ragrus-nbl/subscriptions","organizations_url":"https://api.github.com/users/ragrus-nbl/orgs","repos_url":"https://api.github.com/users/ragrus-nbl/repos","events_url":"https://api.github.com/users/ragrus-nbl/events{/privacy}","received_events_url":"https://api.github.com/users/ragrus-nbl/received_events","type":"User","site_admin":false},"body":"`DeviceId` is a field of the table created after parsing a string containing `HostName=xxx;DeviceId=xxx;SharedAccessKey=xxx`","created_at":"2018-04-25T14:10:10Z","updated_at":"2018-04-25T14:10:10Z","html_url":"https://github.com/nobitlost/AzureIoTHub/pull/1#discussion_r184073069","pull_request_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/comments/184073069"},"html":{"href":"https://github.com/nobitlost/AzureIoTHub/pull/1#discussion_r184073069"},"pull_request":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1"}},"in_reply_to_id":183942164},"pull_request":{"url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1","id":183329860,"html_url":"https://github.com/nobitlost/AzureIoTHub/pull/1","diff_url":"https://github.com/nobitlost/AzureIoTHub/pull/1.diff","patch_url":"https://github.com/nobitlost/AzureIoTHub/pull/1.patch","issue_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/1","number":1,"state":"open","locked":false,"title":"MQTT Client Implementation","user":{"login":"ragrus-nbl","id":38075410,"avatar_url":"https://avatars2.githubusercontent.com/u/38075410?v=4","gravatar_id":"","url":"https://api.github.com/users/ragrus-nbl","html_url":"https://github.com/ragrus-nbl","followers_url":"https://api.github.com/users/ragrus-nbl/followers","following_url":"https://api.github.com/users/ragrus-nbl/following{/other_user}","gists_url":"https://api.github.com/users/ragrus-nbl/gists{/gist_id}","starred_url":"https://api.github.com/users/ragrus-nbl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ragrus-nbl/subscriptions","organizations_url":"https://api.github.com/users/ragrus-nbl/orgs","repos_url":"https://api.github.com/users/ragrus-nbl/repos","events_url":"https://api.github.com/users/ragrus-nbl/events{/privacy}","received_events_url":"https://api.github.com/users/ragrus-nbl/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-23T05:36:15Z","updated_at":"2018-04-25T14:10:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"87769adeb01fa585dd7b06b09e3eb6617b4d3b3e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1/commits","review_comments_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1/comments","review_comment_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/1/comments","statuses_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/statuses/a60d99bfd2c787e0f1752c7622bcdd0489fa09d3","head":{"label":"nobitlost:develop","ref":"develop","sha":"a60d99bfd2c787e0f1752c7622bcdd0489fa09d3","user":{"login":"nobitlost","id":25421182,"avatar_url":"https://avatars2.githubusercontent.com/u/25421182?v=4","gravatar_id":"","url":"https://api.github.com/users/nobitlost","html_url":"https://github.com/nobitlost","followers_url":"https://api.github.com/users/nobitlost/followers","following_url":"https://api.github.com/users/nobitlost/following{/other_user}","gists_url":"https://api.github.com/users/nobitlost/gists{/gist_id}","starred_url":"https://api.github.com/users/nobitlost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nobitlost/subscriptions","organizations_url":"https://api.github.com/users/nobitlost/orgs","repos_url":"https://api.github.com/users/nobitlost/repos","events_url":"https://api.github.com/users/nobitlost/events{/privacy}","received_events_url":"https://api.github.com/users/nobitlost/received_events","type":"Organization","site_admin":false},"repo":{"id":129041981,"name":"AzureIoTHub","full_name":"nobitlost/AzureIoTHub","owner":{"login":"nobitlost","id":25421182,"avatar_url":"https://avatars2.githubusercontent.com/u/25421182?v=4","gravatar_id":"","url":"https://api.github.com/users/nobitlost","html_url":"https://github.com/nobitlost","followers_url":"https://api.github.com/users/nobitlost/followers","following_url":"https://api.github.com/users/nobitlost/following{/other_user}","gists_url":"https://api.github.com/users/nobitlost/gists{/gist_id}","starred_url":"https://api.github.com/users/nobitlost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nobitlost/subscriptions","organizations_url":"https://api.github.com/users/nobitlost/orgs","repos_url":"https://api.github.com/users/nobitlost/repos","events_url":"https://api.github.com/users/nobitlost/events{/privacy}","received_events_url":"https://api.github.com/users/nobitlost/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nobitlost/AzureIoTHub","description":"Microsoft Azure IoT Hub client","fork":true,"url":"https://api.github.com/repos/nobitlost/AzureIoTHub","forks_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/forks","keys_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/teams","hooks_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/hooks","issue_events_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/events{/number}","events_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/events","assignees_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/assignees{/user}","branches_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/branches{/branch}","tags_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/tags","blobs_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/refs{/sha}","trees_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/statuses/{sha}","languages_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/languages","stargazers_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/stargazers","contributors_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/contributors","subscribers_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/subscribers","subscription_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/subscription","commits_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/commits{/sha}","git_commits_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/commits{/sha}","comments_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/comments{/number}","issue_comment_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/comments{/number}","contents_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/contents/{+path}","compare_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/merges","archive_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/downloads","issues_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues{/number}","pulls_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls{/number}","milestones_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/milestones{/number}","notifications_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/labels{/name}","releases_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/releases{/id}","deployments_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/deployments","created_at":"2018-04-11T06:00:33Z","updated_at":"2018-04-11T06:00:35Z","pushed_at":"2018-04-25T08:26:00Z","git_url":"git://github.com/nobitlost/AzureIoTHub.git","ssh_url":"git@github.com:nobitlost/AzureIoTHub.git","clone_url":"https://github.com/nobitlost/AzureIoTHub.git","svn_url":"https://github.com/nobitlost/AzureIoTHub","homepage":"","size":10177,"stargazers_count":0,"watchers_count":0,"language":"Squirrel","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"nobitlost:master","ref":"master","sha":"ad919c4ad4cd2df21904fb55f42cc34eaa2a2d1b","user":{"login":"nobitlost","id":25421182,"avatar_url":"https://avatars2.githubusercontent.com/u/25421182?v=4","gravatar_id":"","url":"https://api.github.com/users/nobitlost","html_url":"https://github.com/nobitlost","followers_url":"https://api.github.com/users/nobitlost/followers","following_url":"https://api.github.com/users/nobitlost/following{/other_user}","gists_url":"https://api.github.com/users/nobitlost/gists{/gist_id}","starred_url":"https://api.github.com/users/nobitlost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nobitlost/subscriptions","organizations_url":"https://api.github.com/users/nobitlost/orgs","repos_url":"https://api.github.com/users/nobitlost/repos","events_url":"https://api.github.com/users/nobitlost/events{/privacy}","received_events_url":"https://api.github.com/users/nobitlost/received_events","type":"Organization","site_admin":false},"repo":{"id":129041981,"name":"AzureIoTHub","full_name":"nobitlost/AzureIoTHub","owner":{"login":"nobitlost","id":25421182,"avatar_url":"https://avatars2.githubusercontent.com/u/25421182?v=4","gravatar_id":"","url":"https://api.github.com/users/nobitlost","html_url":"https://github.com/nobitlost","followers_url":"https://api.github.com/users/nobitlost/followers","following_url":"https://api.github.com/users/nobitlost/following{/other_user}","gists_url":"https://api.github.com/users/nobitlost/gists{/gist_id}","starred_url":"https://api.github.com/users/nobitlost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nobitlost/subscriptions","organizations_url":"https://api.github.com/users/nobitlost/orgs","repos_url":"https://api.github.com/users/nobitlost/repos","events_url":"https://api.github.com/users/nobitlost/events{/privacy}","received_events_url":"https://api.github.com/users/nobitlost/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nobitlost/AzureIoTHub","description":"Microsoft Azure IoT Hub client","fork":true,"url":"https://api.github.com/repos/nobitlost/AzureIoTHub","forks_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/forks","keys_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/teams","hooks_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/hooks","issue_events_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/events{/number}","events_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/events","assignees_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/assignees{/user}","branches_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/branches{/branch}","tags_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/tags","blobs_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/refs{/sha}","trees_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/statuses/{sha}","languages_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/languages","stargazers_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/stargazers","contributors_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/contributors","subscribers_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/subscribers","subscription_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/subscription","commits_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/commits{/sha}","git_commits_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/git/commits{/sha}","comments_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/comments{/number}","issue_comment_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/comments{/number}","contents_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/contents/{+path}","compare_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/merges","archive_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/downloads","issues_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues{/number}","pulls_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls{/number}","milestones_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/milestones{/number}","notifications_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/labels{/name}","releases_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/releases{/id}","deployments_url":"https://api.github.com/repos/nobitlost/AzureIoTHub/deployments","created_at":"2018-04-11T06:00:33Z","updated_at":"2018-04-11T06:00:35Z","pushed_at":"2018-04-25T08:26:00Z","git_url":"git://github.com/nobitlost/AzureIoTHub.git","ssh_url":"git@github.com:nobitlost/AzureIoTHub.git","clone_url":"https://github.com/nobitlost/AzureIoTHub.git","svn_url":"https://github.com/nobitlost/AzureIoTHub","homepage":"","size":10177,"stargazers_count":0,"watchers_count":0,"language":"Squirrel","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1"},"html":{"href":"https://github.com/nobitlost/AzureIoTHub/pull/1"},"issue":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/1"},"comments":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/nobitlost/AzureIoTHub/statuses/a60d99bfd2c787e0f1752c7622bcdd0489fa09d3"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"ragrus-nbl"}}