From dc0c7d8abd806799a125c68e483cddef26b9cddd Mon Sep 17 00:00:00 2001 From: DuckerMan Date: Thu, 8 Feb 2018 20:42:58 +0300 Subject: [PATCH 1/5] Request supports Promise --- README.md | 49 ++++++++++++------------------------------------- sdk.js | 48 ++++++++++++++++++++---------------------------- 2 files changed, 32 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index b73a135..554ce6f 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -nodejs-vksdk +promise-vksdk ============ Small SDK for vk.com API. # Installation - npm install vksdk + npm install promise-vksdk # Example ```js // Setup -var VK = require('vksdk'); +var VK = require('promise-vksdk'); var vk = new VK({ 'appId' : 2807970, 'appSecret' : 'L14ZKpgQPalJdumI6vFK', @@ -29,10 +29,15 @@ vk.on('serverTokenReady', function(_o) { vk.setSecureRequests(true); // Request server API method -vk.request('secure.getSMSHistory', {}, function(_dd) { - console.log(_dd); +let vksdk = require('promise-vksdk'); +const vk = new vksdk({ + 'appId' : 2807970, + 'appSecret' : 'L14ZKpgQPalJdumI6vFK', + 'lang' : 'ru' }); +vk.request("users.get", {user_id:1}).then(o=>console.log(o)); + /** * Request client methods */ @@ -40,14 +45,12 @@ vk.request('secure.getSMSHistory', {}, function(_dd) { vk.setToken(access_token); // Request 'users.get' method -vk.request('users.get', {'user_id' : 1}, function(_o) { - console.log(_o); -}); +vk.request("users.get", {user_id:1}).then(o=>console.log(o)); ``` # Setup ```js -var VK = require('vksdk'); +var VK = require('promise-vksdk'); var vk = new VK({ 'appId' : [Your application ID here], @@ -83,40 +86,12 @@ For vk.com API requests you have to use method *request(_method, _requestParams, * **[string] _method** — name of vk.com API method, * **[mixed] _requestParams** - object with values of params for api method. This param is not required. You also can pass empty object *{}* -* **[mixed] _response** — special response handler (not required), function or event name. Request method gets data from API and returns result. There are 3 ways to get data from API -## Callback -```js -vk.setSecureRequests(false); -vk.request('users.get', {'user_id' : 1}, function(_o) { -console.log(_o); -}); -``` -## Event -After success API call SDK emits the event named 'done:' + _method; -So if you call method *users.get*, you have to wait event *done:users.get* -```js -vk.setSecureRequests(false); -vk.request('users.get', {'user_id' : 1}); -vk.on('done:users.get', function(_o) { - console.log(_o); -}); -``` - -## Custom event -Result of request will be returned with your custom event -```js -vk.setSecureRequests(false); -vk.request('users.get', {'user_id' : 1}, 'myCustomEvent'); -vk.on('myCustomEvent', function(_o) { - console.log(_o); -}); -``` # Server access token For some api methods you need server access token diff --git a/sdk.js b/sdk.js index 1d0be59..7f19e23 100644 --- a/sdk.js +++ b/sdk.js @@ -230,41 +230,38 @@ VK.prototype.oldRequest = function(_method, _requestParams, _response) { * Request API method * @param {string} _method * @param {mixed} _params - * @param {mixed} _response * @returns {mixed} * * @see https://vk.com/pages?oid=-17680044&p=Application_Interaction_with_API */ -VK.prototype.request = function(_method, _requestParams, _response) { - var responseType = 'event'; - - if ( typeof(_response) === 'function') { - responseType = 'callback'; - } - +VK.prototype.request = function(_method, _requestParams) { + let thats = this; var self = this; + return new Promise(function(resolve,reject){ + var responseType = 'event'; + var params = { - 'lang' : this.options.lang, - 'v' : this.options.version, - 'https' : (this.options.https) ? 1 : 0 + 'lang' : thats.options.lang, + 'v' : thats.options.version, + 'https' : (thats.options.https) ? 1 : 0 }; - if (this.isEmpty(_requestParams) === false) { + if (thats.isEmpty(_requestParams) === false) { for (var i in _requestParams) { params[i] = _requestParams[i]; } } - var requestString = this.buildQuery(params); + var requestString = thats.buildQuery(params); - if (this.options.secure) { - if (this.token) { - requestString = requestString + '&access_token=' + this.token; + if (thats.options.secure) { + if (thats.token) { + requestString = requestString + '&access_token=' + thats.token; } - if (this.options.appSecret) { - requestString = requestString + '&client_secret=' + this.options.appSecret; + if (thats.options.appSecret) { + requestString = requestString + '&client_secret=' + thats.options.appSecret; } } @@ -279,7 +276,7 @@ VK.prototype.request = function(_method, _requestParams, _response) { } }; - this.waitForNextRequest(function () { + thats.waitForNextRequest(function () { self.requestingNow = true; var post_req = https.request(options, function(res) { var apiResponse = ""; @@ -295,17 +292,10 @@ VK.prototype.request = function(_method, _requestParams, _response) { try { var o = JSON.parse(apiResponse); } catch(e) { - return self.emit('parse-error', apiResponse); + self.emit('parse-error', apiResponse); } - if (responseType === 'callback' && typeof _response === 'function') { - _response(o); - } else { - if (responseType === 'event' && !!_response) { - return self.emit(_response, o); - } - return self.emit('done:' + _method, o); - } + resolve(o); }); }).on('error', function (e) { self.requestingNow = false; @@ -315,6 +305,8 @@ VK.prototype.request = function(_method, _requestParams, _response) { post_req.write(requestString); post_req.end(); }) + }); + }; /** From aefaa59d4bac23c6245d429f615eb73a47183f89 Mon Sep 17 00:00:00 2001 From: DuckerMan Date: Thu, 8 Feb 2018 20:48:12 +0300 Subject: [PATCH 2/5] Some fixes --- README.md | 31 ++++++++++++++++++++++++++++++- sdk.js | 15 ++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 554ce6f..2402977 100644 --- a/README.md +++ b/README.md @@ -86,11 +86,40 @@ For vk.com API requests you have to use method *request(_method, _requestParams, * **[string] _method** — name of vk.com API method, * **[mixed] _requestParams** - object with values of params for api method. This param is not required. You also can pass empty object *{}* - +* **[mixed] _response** — special response handler (not required), function or event name. Request method gets data from API and returns result. There are 3 ways to get data from API +## Callback +```js +vk.setSecureRequests(false); +vk.request('users.get', {'user_id' : 1}, function(_o) { +console.log(_o); +}); +``` + +## Event +After success API call SDK emits the event named 'done:' + _method; +So if you call method *users.get*, you have to wait event *done:users.get* +```js +vk.setSecureRequests(false); +vk.request('users.get', {'user_id' : 1}); +vk.on('done:users.get', function(_o) { + console.log(_o); +}); +``` + +## Custom event +Result of request will be returned with your custom event + +```js +vk.setSecureRequests(false); +vk.request('users.get', {'user_id' : 1}, 'myCustomEvent'); +vk.on('myCustomEvent', function(_o) { + console.log(_o); +}); +``` # Server access token diff --git a/sdk.js b/sdk.js index 7f19e23..8b3369e 100644 --- a/sdk.js +++ b/sdk.js @@ -234,12 +234,16 @@ VK.prototype.oldRequest = function(_method, _requestParams, _response) { * * @see https://vk.com/pages?oid=-17680044&p=Application_Interaction_with_API */ -VK.prototype.request = function(_method, _requestParams) { +VK.prototype.request = function(_method, _requestParams, _response) { let thats = this; var self = this; return new Promise(function(resolve,reject){ var responseType = 'event'; + if ( typeof(_response) === 'function') { + responseType = 'callback'; + } + var params = { 'lang' : thats.options.lang, @@ -295,6 +299,15 @@ VK.prototype.request = function(_method, _requestParams) { self.emit('parse-error', apiResponse); } + if (responseType === 'callback' && typeof _response === 'function') { + _response(o); + } else { + if (responseType === 'event' && !!_response) { + return self.emit(_response, o); + } + return self.emit('done:' + _method, o); + } + resolve(o); }); }).on('error', function (e) { From 8ca01ac49ea2a11b6e065bb846ab2b54913e7682 Mon Sep 17 00:00:00 2001 From: DuckerMan Date: Thu, 8 Feb 2018 20:57:01 +0300 Subject: [PATCH 3/5] Readme fix --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2402977..2c26f4c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ promise-vksdk ============ Small SDK for vk.com API. +This is form of vksdk, with Promise + # Installation npm install promise-vksdk From 3c6e884a1d8f6089e9b8c899897a32f77726df8e Mon Sep 17 00:00:00 2001 From: DuckerMan Date: Thu, 8 Feb 2018 21:04:35 +0300 Subject: [PATCH 4/5] Readme addiction --- README.md | 7 ++++++- sdk.js | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c26f4c..8fb4427 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,12 @@ vk.on('serverTokenReady', function(_o) { }); ``` -You also can get tokeb with callback or custom event +You also can get token with callback or custom event +#Errors: + +```js +vk.request("users.get", {user_id:1}).then(o=>console.log(o)).catch(err=>console.error(err)); +``` # HTTP errors SDK emits 'http-error' event in case of http errors. diff --git a/sdk.js b/sdk.js index 8b3369e..d9efa82 100644 --- a/sdk.js +++ b/sdk.js @@ -297,6 +297,7 @@ VK.prototype.request = function(_method, _requestParams, _response) { var o = JSON.parse(apiResponse); } catch(e) { self.emit('parse-error', apiResponse); + reject('parse-error', apiResponse); } if (responseType === 'callback' && typeof _response === 'function') { @@ -313,6 +314,7 @@ VK.prototype.request = function(_method, _requestParams, _response) { }).on('error', function (e) { self.requestingNow = false; self.emit('http-error', e); + reject('http-error', e); }); post_req.write(requestString); From 9c15ead8365e794738da8af2c301433c5e5c9329 Mon Sep 17 00:00:00 2001 From: DuckerMan Date: Tue, 3 Apr 2018 20:27:59 +0300 Subject: [PATCH 5/5] Fix --- package.json | 12 ++++++------ sdk.js | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 80ffcc7..399058e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "vksdk", - "description": "SDK for API of vk.com", + "name": "promise-vksdk", + "description": "SDK for API of vk.com with Promise", "version": "5.3.2", - "homepage": "https://github.com/57uff3r/nodejs-vksdk", + "homepage": "https://github.com/DuckerMan/promise-vksdk", "email": "57uff3r@gmail.com", "license": "BSD-3-Clause", "main": "sdk.js", @@ -11,16 +11,16 @@ }, "repository": { "type": "git", - "url": "https://github.com/57uff3r/nodejs-vksdk.git" + "url": "https://github.com/DuckerMan/promise-vksdk.git" }, "keywords": [ "vk", "vkontakte", "sdk" ], - "author": "Andrey Korchak <57uff3r@gmail.com> (http://57uff3r.ru/)", + "author": "DuckerMan | Andrey Korchak", "bugs": { - "url": "https://github.com/57uff3r/nodejs-vksdk/issues" + "url": "https://github.com/DuckerMan/promise-vksdk/issues" }, "devDependencies": { "chai": "^3.4.0", diff --git a/sdk.js b/sdk.js index d9efa82..879eb14 100644 --- a/sdk.js +++ b/sdk.js @@ -302,6 +302,7 @@ VK.prototype.request = function(_method, _requestParams, _response) { if (responseType === 'callback' && typeof _response === 'function') { _response(o); + resolve(o) } else { if (responseType === 'event' && !!_response) { return self.emit(_response, o);