diff --git a/Access Control with AWS S3/README.md b/Access Control with AWS S3/README.md index 3a6736f..4c08dbb 100644 --- a/Access Control with AWS S3/README.md +++ b/Access Control with AWS S3/README.md @@ -1,16 +1,3 @@ -# Using the ClearBlade Platform to enhance AWS S3 access control +# Note -## Overview - -Add a layer of security on top of existing AWS S3 Access control. - -## Usage - ->1. Store AWS key and secret in a Collection ->2. Replace `` with your collection name. ->3. Choose to give access to credentials via a Code Service only to the users/devices that are authenticated with the ClearBlade Platform. ->4. Place getAWSAccess.js code into a Code Service. - -## Further Documentation - -http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Access Control with AWS S3/getAWSAccess.js b/Access Control with AWS S3/getAWSAccess.js deleted file mode 100644 index 68c054b..0000000 --- a/Access Control with AWS S3/getAWSAccess.js +++ /dev/null @@ -1,16 +0,0 @@ -function getAWSAccess(req, resp){ - function getAccess() { - var callback = function(err, data) { - if (err) { - resp.error(data); - } else { - resp.success(data); - } - } - var query = ClearBlade.Query({'collectionName': }); - query.fetch(callback); - } - - ClearBlade.init({request:req}); - getAccess(); -} \ No newline at end of file diff --git a/Access Control with Dropbox/README.md b/Access Control with Dropbox/README.md index 834b024..4c08dbb 100644 --- a/Access Control with Dropbox/README.md +++ b/Access Control with Dropbox/README.md @@ -1,16 +1,3 @@ -# Using the ClearBlade Platform to enhance Dropbox access control +# Note -## Overview - -Add a layer of security on top of existing DropBox Access control. - -## Usage - ->1. Store Dropbox authorization credentials in a Collection ->2. Replace `` with your collection name. ->3. Choose to give access to his Dropbox credentials via a Code Service only to the users/devices that are authenticated with the ClearBlade Platform. ->4. Place getDropboxAccess.js code into a Code Service. - -## Further Documentation - -https://www.dropbox.com/developers-v1/core/ +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Access Control with Dropbox/getDropboxAccess.js b/Access Control with Dropbox/getDropboxAccess.js deleted file mode 100644 index 6c8487f..0000000 --- a/Access Control with Dropbox/getDropboxAccess.js +++ /dev/null @@ -1,16 +0,0 @@ -function getDropboxAccess(req, resp){ - function getAccess() { - var callback = function(err, data) { - if (err) { - resp.error(data); - } else { - resp.success(data); - } - } - var query = ClearBlade.Query({'collectionName': }); - query.fetch(callback); - } - - ClearBlade.init({request:req}); - getAccess(); -} \ No newline at end of file diff --git a/Angular Service/README.md b/Angular Service/README.md index 996bf44..4c08dbb 100644 --- a/Angular Service/README.md +++ b/Angular Service/README.md @@ -1,8 +1,3 @@ -# Overview -Angular Service for clearblade platform +# Note -# Usage -Create an app and use this service - -# Further Documentation -https://github.com/ClearBlade/Angular-SDK \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Angular Service/cbService.js b/Angular Service/cbService.js deleted file mode 100644 index 106e25a..0000000 --- a/Angular Service/cbService.js +++ /dev/null @@ -1,104 +0,0 @@ -angular.module(app_name) -.service('cb', ['$q', function ($q) { - - var cbObj = new ClearBlade(); - - var init = function (email, password) { - var deferred = $q.defer(); - - var initOptions = { - systemKey: "KEY", - systemSecret: "SECRET", - URI: "https://platform.clearblade.com", - - callback: function (err, body) { - if (err) { - deferred.reject(body); - } else { - deferred.resolve(body); - } - } - } - if (typeof email != undefined){ - initOptions.email = email - } - if (typeof password != undefined){ - initOptions.password = password - } - - cbObj.init(initOptions); - - return deferred.promise; - } - - var runCode = function (funcName, params, retryCounter) { - var deferred = $q.defer(); - if(typeof retryCounter == 'undefined'){ - retryCounter = 0; - } - var retryMax = 4; - - function go() { - cbObj.Code().execute(funcName, params, function (err, body) { - if (err) { - if(retryCounter=0 || body.success === false) - body.code = '6'; - else if(body.success === true) - body.code = '1'; - console.log(body); - deferred.resolve(body); - } - } - }); -} -if (!cbObj.user) { - init().then(function () { - go(); - }, function (err) { - if(retryCounter Devices__ +- Click __+ Device__ +- Enter the following information in the __New Device__ dialog: + - __Name__: The name of the device + - __Type__: A description of the type of device being added (for example: Raspberry Pi 3 model B) + - __Enabled__: _ _YES_ _ + - __Allow Key Authorization__: _ _YES_ _ +- Click __Create__ +- In the newly inserted row, double click within the __active_key__ cell and enter an authentication key (ex. 1234567890) ## Starting the Gateway -- Edit __main.py__ and fill the __credentials__ dictionary with your own credentials -- Run ```python main.py``` to start the gateway - -## Add a new Bluetooth Low Energy device to the gateway -- To add a new device to the gateway, go to the __AddNewBLEDevice__ Code Service and change the deviceAddress, gatewayAddress, uuid and deviceType to that of the device you want to add and hit __Save and Test__ -- This will add the new device and start reading data from the specified uuid -- You can check for errors in the __BLEErrors__collection -- The new device, if added successfully will appear in the __BLEDevice__ collection and the data read from that device will be visible in the __BLEReadValues__ collection \ No newline at end of file +- Open a terminal session on the device where the gateway will run and enter the following command: + - sudo python main.py --systemKey --systemSecret --deviceName --activeKey [--platformUrl ] [--scanInterval ] + - Alternatively, you can also use the shorter versions of the flags: + - sudo python main.py -k -s -n -a -u +- Once the gateway has started, it will automatically: + 1. Start scanning for BLE devices + 2. Add any found devices to the platform + 3. Read any available information from the device + 4. Store data read from the device in the BLEReadValues collection \ No newline at end of file diff --git a/Bluetooth Low Energy Gateway/main.py b/Bluetooth Low Energy Gateway/main.py index 24b3626..2acea93 100644 --- a/Bluetooth Low Energy Gateway/main.py +++ b/Bluetooth Low Energy Gateway/main.py @@ -1,6 +1,23 @@ from BluetoothGateway import BluetoothGateway +import sys, getopt, argparse -credentials = {'systemKey': 'SYSTEMKEY', 'systemSecret': 'SYSTEMSECRET', 'username': 'test@clearblade.com', 'password': 'clearblade', 'platformURL': 'PLATFORM_URL', 'gwBTMac': 'GATEWAY_BLUETOOTH_MAC'} +credentials = {} -gateway = BluetoothGateway() -gateway.StartGateway(credentials) \ No newline at end of file +def _parseArgs(argv): + #TODO - Add a flag to specify mac address filters + parser = argparse.ArgumentParser(description='Start BLE Adapter') + parser.add_argument('--systemKey', required=True, help='The System Key of the ClearBlade platform the BLE adapter will connect to.') + parser.add_argument('--systemSecret', required=True, help='The System Secret of the ClearBlade platform the BLE adapter will connect to.') + parser.add_argument('--deviceName', required=True, \ + help='The name of the device, defined within the devices table of the ClearBlade platform, representing the BLE Adapter.') + parser.add_argument('--activeKey', required=True, \ + help='The Active Key, defined within the devices table of the ClearBlade platform, corresponding to the BLE Adapter.') + parser.add_argument('--scanInterval', dest="scanInterval", default=120, type=int, \ + help='The amount of time to wait between each successive scan for BLE devices. The default is 120 (2 minutes)') + parser.add_argument('--platformUrl', dest="platformURL", default="https://localhost:9000", \ + help='The url of the ClearBlade platform the BLE adapter will connect to. The default is https://localhost:9000') + + return vars(parser.parse_args(args=argv[1:])) + +credentials = _parseArgs(sys.argv) +gateway = BluetoothGateway(credentials) diff --git a/CoAP Integration/README.md b/CoAP Integration/README.md index ced0fe7..bd03605 100644 --- a/CoAP Integration/README.md +++ b/CoAP Integration/README.md @@ -1,7 +1,3 @@ -# CoAP integration for ClearBlade +Moved to IPM [ipm.clearblade.com](https://ipm.clearblade.com) -## Importing project in Eclipse -- Open Eclipse and go to File->Import and select __Existing Maven Project__ and import the __cb-coap__ project -- You will need to change the credentials in App.java -- Replace ```YOUR_SYSTEM_KEY, YOUR_SYSTEM_SECRET, YOUR_PLATFORM_URL, YOUR_MESSAGING_URL, YOUR_EMAIL, YOUR_PASSWORD``` with your own -- All messages are sent and received on the ___coap-test__ topic. \ No newline at end of file +Source: https://github.com/ClearBlade/coap-adapter diff --git a/CoAP Integration/cb-coap/.classpath b/CoAP Integration/cb-coap/.classpath deleted file mode 100644 index 3dfa708..0000000 --- a/CoAP Integration/cb-coap/.classpath +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CoAP Integration/cb-coap/.project b/CoAP Integration/cb-coap/.project deleted file mode 100644 index 10d968e..0000000 --- a/CoAP Integration/cb-coap/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - cb-coap - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs b/CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f9fe345..0000000 --- a/CoAP Integration/cb-coap/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs b/CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index abec6ca..0000000 --- a/CoAP Integration/cb-coap/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs b/CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/CoAP Integration/cb-coap/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/CoAP Integration/cb-coap/Californium.properties b/CoAP Integration/cb-coap/Californium.properties deleted file mode 100644 index 6caa557..0000000 --- a/CoAP Integration/cb-coap/Californium.properties +++ /dev/null @@ -1,41 +0,0 @@ -#Californium CoAP Properties file -#Tue Jun 28 08:19:08 EDT 2016 -HTTP_SERVER_SOCKET_BUFFER_SIZE=8192 -UDP_CONNECTOR_OUT_CAPACITY=2147483647 -CONGESTION_CONTROL_ALGORITHM=Cocoa -USE_CONGESTION_CONTROL=false -ACK_TIMEOUT=2000 -NOTIFICATION_CHECK_INTERVAL_COUNT=100 -MAX_MESSAGE_SIZE=1024 -DEDUPLICATOR=DEDUPLICATOR_MARK_AND_SWEEP -COAP_PORT=5683 -ACK_TIMEOUT_SCALE=2.0 -PREFERRED_BLOCK_SIZE=512 -NETWORK_STAGE_RECEIVER_THREAD_COUNT=1 -PROTOCOL_STAGE_THREAD_COUNT=8 -MAX_TRANSMIT_WAIT=93000 -UDP_CONNECTOR_RECEIVE_BUFFER=0 -EXCHANGE_LIFETIME=247000 -HTTP_SERVER_SOCKET_TIMEOUT=100000 -CROP_ROTATION_PERIOD=2000 -UDP_CONNECTOR_DATAGRAM_SIZE=2048 -MAX_RETRANSMIT=4 -NOTIFICATION_CHECK_INTERVAL=86400000 -LEISURE=5000 -HTTP_CACHE_RESPONSE_MAX_AGE=86400 -BLOCKWISE_STATUS_LIFETIME=600000 -UDP_CONNECTOR_SEND_BUFFER=0 -HEALTH_STATUS_PRINT_LEVEL=FINEST -NETWORK_STAGE_SENDER_THREAD_COUNT=1 -NON_LIFETIME=145000 -TOKEN_SIZE_LIMIT=8 -HTTP_PORT=8080 -MARK_AND_SWEEP_INTERVAL=10000 -HEALTH_STATUS_INTERVAL=60 -ACK_RANDOM_FACTOR=1.5 -NSTART=1 -USE_RANDOM_MID_START=true -HTTP_CACHE_SIZE=32 -PROBING_RATE=1.0 -NOTIFICATION_REREGISTRATION_BACKOFF=2000 -COAP_SECURE_PORT=5684 diff --git a/CoAP Integration/cb-coap/libs/CB.jar b/CoAP Integration/cb-coap/libs/CB.jar deleted file mode 100644 index 8af4027..0000000 Binary files a/CoAP Integration/cb-coap/libs/CB.jar and /dev/null differ diff --git a/CoAP Integration/cb-coap/libs/gson-2.3.jar b/CoAP Integration/cb-coap/libs/gson-2.3.jar deleted file mode 100644 index a7f7ce5..0000000 Binary files a/CoAP Integration/cb-coap/libs/gson-2.3.jar and /dev/null differ diff --git a/CoAP Integration/cb-coap/libs/mqtt-client-0.4.0.jar b/CoAP Integration/cb-coap/libs/mqtt-client-0.4.0.jar deleted file mode 100644 index 8f1d92f..0000000 Binary files a/CoAP Integration/cb-coap/libs/mqtt-client-0.4.0.jar and /dev/null differ diff --git a/CoAP Integration/cb-coap/pom.xml b/CoAP Integration/cb-coap/pom.xml deleted file mode 100644 index 88a62a3..0000000 --- a/CoAP Integration/cb-coap/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - 4.0.0 - - com.clearblade.coap - cb-coap - 0.0.1-SNAPSHOT - jar - - cb-coap - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 3.8.1 - test - - - org.eclipse.californium - californium-core - 1.0.4 - - - - - repo.eclipse.org - Californium Repository - https://repo.eclipse.org/content/repositories/californium/ - - - diff --git a/CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java b/CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java deleted file mode 100644 index b2bf25c..0000000 --- a/CoAP Integration/cb-coap/src/main/java/com/clearblade/coap/cb_coap/App.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.clearblade.coap.cb_coap; - -import java.util.HashMap; - -import org.eclipse.californium.core.CoapClient; -import org.eclipse.californium.core.CoapResponse; -import org.eclipse.californium.core.Utils; - -import com.clearblade.java.api.ClearBlade; -import com.clearblade.java.api.ClearBladeException; -import com.clearblade.java.api.InitCallback; -import com.clearblade.java.api.Message; - -/** - * Hello world! - * - */ -public class App -{ - private static String SYSTEM_KEY = "YOUR_SYSTEM_KEY"; - private static String SYSTEM_SECRET = "YOUR_SYSTEM_SECRET"; - private static String PLATFORM_URL = "YOUR_PLATFORM_URL"; - private static String MESSAGING_URL = "YOUR_MESSAGING_URL"; - private static String EMAIL = "YOUR_EMAIL"; - private static String PASSWORD = "YOUR_PASSWORD"; - private static HashMap initOptions = new HashMap(); - private static Message message = null; - private static boolean initFlag = false; - - public static void main( String[] args ) - { - boolean initStatus = initializeCB(); - if(!initStatus) { - return; - } - - String clientID = "ClearBladeCOAPTest"; - message = new Message(clientID); - - CoapClient client = new CoapClient("coap://californium.eclipse.org:5683/obs"); - - System.out.println("SYNCHRONOUS"); - - CoapResponse response = client.get(); - - if (response!=null) { - System.out.println(Utils.prettyPrint(response)); - String messagePayload = Utils.prettyPrint(response); - message.publish("coap-test", messagePayload); - - } else { - System.out.println("No response received."); - } - } - - private static boolean initializeCB() { - InitCallback initCallback = new InitCallback(){ - @Override - public void done(boolean results){ - initFlag = true; - } - @Override - public void error(ClearBladeException exception){ - //initialization failed, given a ClearBladeException with the cause - System.out.println("CB init error: " + exception.getMessage()); - } - }; - initOptions.put("platformURL", PLATFORM_URL); - initOptions.put("messagingURL", MESSAGING_URL); - initOptions.put("email", EMAIL); - initOptions.put("password", PASSWORD); - - ClearBlade.initialize(SYSTEM_KEY, SYSTEM_SECRET, initOptions, initCallback); - - return initFlag; - } -} diff --git a/CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java b/CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java deleted file mode 100644 index fa75769..0000000 --- a/CoAP Integration/cb-coap/src/test/java/com/clearblade/coap/cb_coap/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.clearblade.coap.cb_coap; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App$1.class b/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App$1.class deleted file mode 100644 index 90e1cd5..0000000 Binary files a/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App$1.class and /dev/null differ diff --git a/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App.class b/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App.class deleted file mode 100644 index 20682c4..0000000 Binary files a/CoAP Integration/cb-coap/target/classes/com/clearblade/coap/cb_coap/App.class and /dev/null differ diff --git a/CoAP Integration/cb-coap/target/test-classes/com/clearblade/coap/cb_coap/AppTest.class b/CoAP Integration/cb-coap/target/test-classes/com/clearblade/coap/cb_coap/AppTest.class deleted file mode 100644 index 1433f4a..0000000 Binary files a/CoAP Integration/cb-coap/target/test-classes/com/clearblade/coap/cb_coap/AppTest.class and /dev/null differ diff --git a/CoAP Lib/README.md b/CoAP Lib/README.md new file mode 100644 index 0000000..79fed04 --- /dev/null +++ b/CoAP Lib/README.md @@ -0,0 +1,3 @@ +# Note + +Pattern has moved: https://ipm.clearblade.com diff --git a/Integration with Google Maps Reverse Geocoding/readme.md b/Integration with Google Maps Reverse Geocoding/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/Integration with Google Maps Reverse Geocoding/service.js b/Integration with Google Maps Reverse Geocoding/service.js new file mode 100644 index 0000000..e69de29 diff --git a/Integration with Google Maps Reverse Geocoding/snippet.js b/Integration with Google Maps Reverse Geocoding/snippet.js new file mode 100644 index 0000000..e69de29 diff --git a/Integration with Open Movie Database/README.md b/Integration with Open Movie Database/README.md new file mode 100644 index 0000000..cb784f1 --- /dev/null +++ b/Integration with Open Movie Database/README.md @@ -0,0 +1,16 @@ +# Integrate with Open Movie Database, OMDb + +## Overview + +This pattern shows how to fetch detailed movie info by searching with a movie title. + +## Usage + +>1. Replace the value of `movieTitle` with your requested movie title. +>2. Add 'clearblade' and 'http' to list of Required libraries (Settings > Requires > Add) + +Note: An API key is not required. + +## Further Documentation + +http://www.omdbapi.com/ diff --git a/Integration with Open Movie Database/service.js b/Integration with Open Movie Database/service.js new file mode 100644 index 0000000..4439a02 --- /dev/null +++ b/Integration with Open Movie Database/service.js @@ -0,0 +1,69 @@ +function fetchMovieData(req, resp){ + // This is an example movie title + var movieTitle = "Reservoir Dogs"; + + // You can also pass a movie title into this Code Service. as part of the request + // As part of the request, pass in a JSON object like this: {movieTitle: "Reservoir Dogs"} + // then retrieve it with the following line + // var movieTitle = req.params.movieTitle; + + callOmdb(movieTitle) + + function callOmdb(title){ + + // Make an XHR Request to OMDB's API + var options = { + uri : "http://www.omdbapi.com/?t="+encodeURIComponent(title)+"&y=&plot=full&r=json" + }; + + var requestObject = ClearBlade.http().Request(); + requestObject.get(options,function(err,result){ + + result = JSON.parse(result) + + if(err){ + resp.error("Error encountered making HTTP Request: " + result); + } + + movieIsFound = result.Response == "True" ? true : false + + if(! movieIsFound ){ + resp.error("Movie not found in database.") + } + + resp.success(result) + + }); + } + + /* + Output: + + { + "Actors": "Harvey Keitel, Tim Roth, Michael Madsen, Chris Penn", + "Awards": "9 wins & 15 nominations.", + "Country": "USA", + "Director": "Quentin Tarantino", + "Genre": "Crime, Drama, Thriller", + "Language": "English", + "Metascore": "78", + "Plot": "Six criminals, who are strangers to each other, are hired by a crime boss, Joe Cabot, to carry out a diamond robbery. Right at the outset, they are given false names with the intention that they won't get too close and will concentrate on the job instead. They are completely sure that the robbery is going to be a success. But, when the police show up right at the time and the site of the robbery, panic spreads amongst the group members, and two of them are killed in the subsequent shootout, along with a few policemen and civilians. When the remaining people assemble at the premeditated rendezvous point (a warehouse), they begin to suspect that one of them is an undercover cop.", + "Poster": "http://ia.media-imdb.com/images/M/MV5BNWVhMzQ5MWUtNjZkNC00MGQwLTkzNmEtNjcyZDE2ZWYxNzc2XkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_SX300.jpg", + "Rated": "R", + "Released": "02 Sep 1992", + "Response": "True", + "Runtime": "99 min", + "Title": "Reservoir Dogs", + "Type": "movie", + "Writer": "Quentin Tarantino, Roger Avary (background radio dialog), Quentin Tarantino (background radio dialog)", + "Year": "1992", + "imdbID": "tt0105236", + "imdbRating": "8.4", + "imdbVotes": "668,196" + } + */ + + +} + + diff --git a/Integration with Twilio SMS/README.md b/Integration with Twilio SMS/README.md index d86a0f9..79fed04 100644 --- a/Integration with Twilio SMS/README.md +++ b/Integration with Twilio SMS/README.md @@ -1,10 +1,3 @@ -# Send sms using Twilio and ClearBlade +# Note --The twilio api allows to send sms using http. --For free trial, we can send sms only to numbers that have been verified. --Sample code to send mail is given in twilioSMS.js - --Go to https://www.twilio.com/try-twilio and signup for free twilio account --Get your free phone no that is used for sending sms --Replace user key with your Account Sid --Replace pass with your auth token \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com diff --git a/Integration with Twilio SMS/twilioSms.js b/Integration with Twilio SMS/twilioSms.js deleted file mode 100644 index 045726a..0000000 --- a/Integration with Twilio SMS/twilioSms.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - -1. Go To Settings > Requires > Add `http` and `ClearBlade` -2. Change `TwilioSMS` below to the name of your particular service - -*/ - -function TwilioSMS(req, resp){ - - ClearBlade.init({request:req}); - sendSMS(); - - function sendSMS(){ - var options = { - "auth":{ - user: , - pass : - }, - uri : "https://api.twilio.com/2010-04-01/Accounts//SMS/Messages.json", - "body":{ - "Body" : , - "To" : , - "From": - }, - "form":true - }; - - /* - Example - function sendSMS(){ - var options = { - "auth":{ - user: "fffffffffffffffffffffffff477ddf", - pass : "fffffffffffffffffffffffed2ef55de" - }, - uri : "https://api.twilio.com/2010-04-01/Accounts/fffffffffffffffffffffffff477ddf/SMS/Messages.json", - "body":{ - "Body" : "Your friend says hi!", - "To" : "(+1 555-555-5555)", - "From": "(+1 777-777-7777)" - }, - "form":true - }; - */ - - var requestObject = ClearBlade.http().Request(); - requestObject.post(options,function(err,result){ - if(err){ - resp.error("Failed"); - }else{ - resp.success(result); - } - }); - } -} \ No newline at end of file diff --git a/Library q for promises/Readme.md b/Library q for promises/Readme.md new file mode 100644 index 0000000..79fed04 --- /dev/null +++ b/Library q for promises/Readme.md @@ -0,0 +1,3 @@ +# Note + +Pattern has moved: https://ipm.clearblade.com diff --git a/Library q for promises/lib/qLib.js b/Library q for promises/lib/qLib.js deleted file mode 100644 index fde41b5..0000000 --- a/Library q for promises/lib/qLib.js +++ /dev/null @@ -1,1984 +0,0 @@ - - -(function (definition) { - - Q = definition(); - -})(function () { -"use strict"; - -var hasStacks = false; -try { - throw new Error(); -} catch (e) { - hasStacks = !!e.stack; -} - -// All code after this point will be filtered from stack traces reported -// by Q. -var qStartingLine = captureLine(); -var qFileName; - -// shims - -// used for fallback in "allResolved" -var noop = function () {}; - -// Use the fastest possible means to execute a task in a future turn -// of the event loop. -var nextTick =(function () { - // linked list of tasks (single, with head node) - var head = {task: void 0, next: null}; - var tail = head; - var flushing = false; - var requestTick = void 0; - var isNodeJS = false; - // queue for late tasks, used by unhandled rejection tracking - var laterQueue = []; - - function flush() { - /* jshint loopfunc: true */ - var task, domain; - - while (head.next) { - head = head.next; - task = head.task; - head.task = void 0; - domain = head.domain; - - if (domain) { - head.domain = void 0; - domain.enter(); - } - runSingle(task, domain); - - } - while (laterQueue.length) { - task = laterQueue.pop(); - runSingle(task); - } - flushing = false; - } - // runs a single function in the async queue - function runSingle(task, domain) { - try { - task(); - - } catch (e) { - if (isNodeJS) { - // In node, uncaught exceptions are considered fatal errors. - // Re-throw them synchronously to interrupt flushing! - - // Ensure continuation if the uncaught exception is suppressed - // listening "uncaughtException" events (as domains does). - // Continue in next event to avoid tick recursion. - if (domain) { - domain.exit(); - } - //setTimeout(flush, 0); - flush(); - if (domain) { - domain.enter(); - } - - throw e; - - } else { - // In browsers, uncaught exceptions are not fatal. - // Re-throw them asynchronously to avoid slow-downs. - //setTimeout(function () { - throw e; - //}, 0); - } - } - - if (domain) { - domain.exit(); - } - } - - nextTick = function (task) { - tail = tail.next = { - task: task, - domain: isNodeJS && process.domain, - next: null - }; - - if (!flushing) { - flushing = true; - requestTick(); - } - }; - - if (typeof process === "object" && - process.toString() === "[object process]" && process.nextTick) { - // Ensure Q is in a real Node environment, with a `process.nextTick`. - // To see through fake Node environments: - // * Mocha test runner - exposes a `process` global without a `nextTick` - // * Browserify - exposes a `process.nexTick` function that uses - // `setTimeout`. In this case `setImmediate` is preferred because - // it is faster. Browserify's `process.toString()` yields - // "[object Object]", while in a real Node environment - // `process.nextTick()` yields "[object process]". - isNodeJS = true; - - requestTick = function () { - process.nextTick(flush); - }; - - } else if (typeof setImmediate === "function") { - // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate - if (typeof window !== "undefined") { - requestTick = setImmediate.bind(window, flush); - } else { - requestTick = function () { - setImmediate(flush); - }; - } - - } else if (typeof MessageChannel !== "undefined") { - // modern browsers - // http://www.nonblocking.io/2011/06/windownexttick.html - var channel = new MessageChannel(); - // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create - // working message ports the first time a page loads. - channel.port1.onmessage = function () { - requestTick = requestPortTick; - channel.port1.onmessage = flush; - flush(); - }; - var requestPortTick = function () { - // Opera requires us to provide a message payload, regardless of - // whether we use it. - channel.port2.postMessage(0); - }; - requestTick = function () { - //setTimeout(flush, 0); - flush(); - requestPortTick(); - }; - - } else { - // old browsers - requestTick = function () { - // setTimeout(flush, 0); - flush(); - }; - } - // runs a task after all other tasks have been run - // this is useful for unhandled rejection tracking that needs to happen - // after all `then`d tasks have been run. - nextTick.runAfter = function (task) { - laterQueue.push(task); - if (!flushing) { - flushing = true; - requestTick(); - } - }; - return nextTick; -})(); - -// Attempt to make generics safe in the face of downstream -// modifications. -// There is no situation where this is necessary. -// If you need a security guarantee, these primordials need to be -// deeply frozen anyway, and if you don’t need a security guarantee, -// this is just plain paranoid. -// However, this **might** have the nice side-effect of reducing the size of -// the minified code by reducing x.call() to merely x() -// See Mark Miller’s explanation of what this does. -// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming -var call = Function.call; -function uncurryThis(f) { - return function () { - return call.apply(f, arguments); - }; -} -// This is equivalent, but slower: -// uncurryThis = Function_bind.bind(Function_bind.call); -// http://jsperf.com/uncurrythis - -var array_slice = uncurryThis(Array.prototype.slice); - -var array_reduce = uncurryThis( - Array.prototype.reduce || function (callback, basis) { - var index = 0, - length = this.length; - // concerning the initial value, if one is not provided - if (arguments.length === 1) { - // seek to the first value in the array, accounting - // for the possibility that is is a sparse array - do { - if (index in this) { - basis = this[index++]; - break; - } - if (++index >= length) { - throw new TypeError(); - } - } while (1); - } - // reduce - for (; index < length; index++) { - // account for the possibility that the array is sparse - if (index in this) { - basis = callback(basis, this[index], index); - } - } - return basis; - } -); - -var array_indexOf = uncurryThis( - Array.prototype.indexOf || function (value) { - // not a very good shim, but good enough for our one use of it - for (var i = 0; i < this.length; i++) { - if (this[i] === value) { - return i; - } - } - return -1; - } -); - -var array_map = uncurryThis( - Array.prototype.map || function (callback, thisp) { - var self = this; - var collect = []; - array_reduce(self, function (undefined, value, index) { - collect.push(callback.call(thisp, value, index, self)); - }, void 0); - return collect; - } -); - -var object_create = Object.create || function (prototype) { - function Type() { } - Type.prototype = prototype; - return new Type(); -}; - -var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty); - -var object_keys = Object.keys || function (object) { - var keys = []; - for (var key in object) { - if (object_hasOwnProperty(object, key)) { - keys.push(key); - } - } - return keys; -}; - -var object_toString = uncurryThis(Object.prototype.toString); - -function isObject(value) { - return value === Object(value); -} - -// generator related shims - -// FIXME: Remove this function once ES6 generators are in SpiderMonkey. -function isStopIteration(exception) { - return ( - object_toString(exception) === "[object StopIteration]" || - exception instanceof QReturnValue - ); -} - -// FIXME: Remove this helper and Q.return once ES6 generators are in -// SpiderMonkey. -var QReturnValue; -if (typeof ReturnValue !== "undefined") { - QReturnValue = ReturnValue; -} else { - QReturnValue = function (value) { - this.value = value; - }; -} - -// long stack traces - -var STACK_JUMP_SEPARATOR = "From previous event:"; - -function makeStackTraceLong(error, promise) { - // If possible, transform the error stack trace by removing Node and Q - // cruft, then concatenating with the stack trace of `promise`. See #57. - if (hasStacks && - promise.stack && - typeof error === "object" && - error !== null && - error.stack && - error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1 - ) { - var stacks = []; - for (var p = promise; !!p; p = p.source) { - if (p.stack) { - stacks.unshift(p.stack); - } - } - stacks.unshift(error.stack); - - var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n"); - error.stack = filterStackString(concatedStacks); - } -} - -function filterStackString(stackString) { - var lines = stackString.split("\n"); - var desiredLines = []; - for (var i = 0; i < lines.length; ++i) { - var line = lines[i]; - - if (!isInternalFrame(line) && !isNodeFrame(line) && line) { - desiredLines.push(line); - } - } - return desiredLines.join("\n"); -} - -function isNodeFrame(stackLine) { - return stackLine.indexOf("(module.js:") !== -1 || - stackLine.indexOf("(node.js:") !== -1; -} - -function getFileNameAndLineNumber(stackLine) { - // Named functions: "at functionName (filename:lineNumber:columnNumber)" - // In IE10 function name can have spaces ("Anonymous function") O_o - var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine); - if (attempt1) { - return [attempt1[1], Number(attempt1[2])]; - } - - // Anonymous functions: "at filename:lineNumber:columnNumber" - var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine); - if (attempt2) { - return [attempt2[1], Number(attempt2[2])]; - } - - // Firefox style: "function@filename:lineNumber or @filename:lineNumber" - var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine); - if (attempt3) { - return [attempt3[1], Number(attempt3[2])]; - } -} - -function isInternalFrame(stackLine) { - var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine); - - if (!fileNameAndLineNumber) { - return false; - } - - var fileName = fileNameAndLineNumber[0]; - var lineNumber = fileNameAndLineNumber[1]; - - return fileName === qFileName && - lineNumber >= qStartingLine && - lineNumber <= qEndingLine; -} - -// discover own file name and line number range for filtering stack -// traces -function captureLine() { - if (!hasStacks) { - return; - } - - try { - throw new Error(); - } catch (e) { - var lines = e.stack.split("\n"); - var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2]; - var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine); - if (!fileNameAndLineNumber) { - return; - } - - qFileName = fileNameAndLineNumber[0]; - return fileNameAndLineNumber[1]; - } -} - -function deprecate(callback, name, alternative) { - return function () { - if (typeof console !== "undefined" && - typeof console.warn === "function") { - console.warn(name + " is deprecated, use " + alternative + - " instead.", new Error("").stack); - } - return callback.apply(callback, arguments); - }; -} - -// end of shims -// beginning of real work - -/** - * Constructs a promise for an immediate reference, passes promises through, or - * coerces promises from different systems. - * @param value immediate reference or promise - */ -function Q(value) { - // If the object is already a Promise, return it directly. This enables - // the resolve function to both be used to created references from objects, - // but to tolerably coerce non-promises to promises. - if (value instanceof Promise) { - return value; - } - - // assimilate thenables - if (isPromiseAlike(value)) { - return coerce(value); - } else { - return fulfill(value); - } -} -Q.resolve = Q; - -/** - * Performs a task in a future turn of the event loop. - * @param {Function} task - */ -Q.nextTick = nextTick; - -/** - * Controls whether or not long stack traces will be on - */ -Q.longStackSupport = false; - -// enable long stacks if Q_DEBUG is set -if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) { - Q.longStackSupport = true; -} - -/** - * Constructs a {promise, resolve, reject} object. - * - * `resolve` is a callback to invoke with a more resolved value for the - * promise. To fulfill the promise, invoke `resolve` with any value that is - * not a thenable. To reject the promise, invoke `resolve` with a rejected - * thenable, or invoke `reject` with the reason directly. To resolve the - * promise to another thenable, thus putting it in the same state, invoke - * `resolve` with that other thenable. - */ -Q.defer = defer; -function defer() { - // if "messages" is an "Array", that indicates that the promise has not yet - // been resolved. If it is "undefined", it has been resolved. Each - // element of the messages array is itself an array of complete arguments to - // forward to the resolved promise. We coerce the resolution value to a - // promise using the `resolve` function because it handles both fully - // non-thenable values and other thenables gracefully. - var messages = [], progressListeners = [], resolvedPromise; - - var deferred = object_create(defer.prototype); - var promise = object_create(Promise.prototype); - - promise.promiseDispatch = function (resolve, op, operands) { - var args = array_slice(arguments); - if (messages) { - messages.push(args); - if (op === "when" && operands[1]) { // progress operand - progressListeners.push(operands[1]); - } - } else { - Q.nextTick(function () { - resolvedPromise.promiseDispatch.apply(resolvedPromise, args); - }); - } - }; - - // XXX deprecated - promise.valueOf = function () { - if (messages) { - return promise; - } - var nearerValue = nearer(resolvedPromise); - if (isPromise(nearerValue)) { - resolvedPromise = nearerValue; // shorten chain - } - return nearerValue; - }; - - promise.inspect = function () { - if (!resolvedPromise) { - return { state: "pending" }; - } - return resolvedPromise.inspect(); - }; - - if (Q.longStackSupport && hasStacks) { - try { - throw new Error(); - } catch (e) { - // NOTE: don't try to use `Error.captureStackTrace` or transfer the - // accessor around; that causes memory leaks as per GH-111. Just - // reify the stack trace as a string ASAP. - // - // At the same time, cut off the first line; it's always just - // "[object Promise]\n", as per the `toString`. - promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1); - } - } - - // NOTE: we do the checks for `resolvedPromise` in each method, instead of - // consolidating them into `become`, since otherwise we'd create new - // promises with the lines `become(whatever(value))`. See e.g. GH-252. - - function become(newPromise) { - resolvedPromise = newPromise; - promise.source = newPromise; - - array_reduce(messages, function (undefined, message) { - Q.nextTick(function () { - newPromise.promiseDispatch.apply(newPromise, message); - }); - }, void 0); - - messages = void 0; - progressListeners = void 0; - } - - deferred.promise = promise; - deferred.resolve = function (value) { - if (resolvedPromise) { - return; - } - - become(Q(value)); - }; - - deferred.fulfill = function (value) { - if (resolvedPromise) { - return; - } - - become(fulfill(value)); - }; - deferred.reject = function (reason) { - if (resolvedPromise) { - return; - } - - become(reject(reason)); - }; - deferred.notify = function (progress) { - if (resolvedPromise) { - return; - } - - array_reduce(progressListeners, function (undefined, progressListener) { - Q.nextTick(function () { - progressListener(progress); - }); - }, void 0); - }; - - return deferred; -} - -/** - * Creates a Node-style callback that will resolve or reject the deferred - * promise. - * @returns a nodeback - */ -defer.prototype.makeNodeResolver = function () { - var self = this; - return function (error, value) { - if (error) { - self.reject(error); - } else if (arguments.length > 2) { - self.resolve(array_slice(arguments, 1)); - } else { - self.resolve(value); - } - }; -}; - -/** - * @param resolver {Function} a function that returns nothing and accepts - * the resolve, reject, and notify functions for a deferred. - * @returns a promise that may be resolved with the given resolve and reject - * functions, or rejected by a thrown exception in resolver - */ -Q.Promise = promise; // ES6 -Q.promise = promise; -function promise(resolver) { - if (typeof resolver !== "function") { - throw new TypeError("resolver must be a function."); - } - var deferred = defer(); - try { - resolver(deferred.resolve, deferred.reject, deferred.notify); - } catch (reason) { - deferred.reject(reason); - } - return deferred.promise; -} - -promise.race = race; // ES6 -promise.all = all; // ES6 -promise.reject = reject; // ES6 -promise.resolve = Q; // ES6 - -// XXX experimental. This method is a way to denote that a local value is -// serializable and should be immediately dispatched to a remote upon request, -// instead of passing a reference. -Q.passByCopy = function (object) { - //freeze(object); - //passByCopies.set(object, true); - return object; -}; - -Promise.prototype.passByCopy = function () { - //freeze(object); - //passByCopies.set(object, true); - return this; -}; - -/** - * If two promises eventually fulfill to the same value, promises that value, - * but otherwise rejects. - * @param x {Any*} - * @param y {Any*} - * @returns {Any*} a promise for x and y if they are the same, but a rejection - * otherwise. - * - */ -Q.join = function (x, y) { - return Q(x).join(y); -}; - -Promise.prototype.join = function (that) { - return Q([this, that]).spread(function (x, y) { - if (x === y) { - // TODO: "===" should be Object.is or equiv - return x; - } else { - throw new Error("Q can't join: not the same: " + x + " " + y); - } - }); -}; - -/** - * Returns a promise for the first of an array of promises to become settled. - * @param answers {Array[Any*]} promises to race - * @returns {Any*} the first promise to be settled - */ -Q.race = race; -function race(answerPs) { - return promise(function (resolve, reject) { - // Switch to this once we can assume at least ES5 - // answerPs.forEach(function (answerP) { - // Q(answerP).then(resolve, reject); - // }); - // Use this in the meantime - for (var i = 0, len = answerPs.length; i < len; i++) { - Q(answerPs[i]).then(resolve, reject); - } - }); -} - -Promise.prototype.race = function () { - return this.then(Q.race); -}; - -/** - * Constructs a Promise with a promise descriptor object and optional fallback - * function. The descriptor contains methods like when(rejected), get(name), - * set(name, value), post(name, args), and delete(name), which all - * return either a value, a promise for a value, or a rejection. The fallback - * accepts the operation name, a resolver, and any further arguments that would - * have been forwarded to the appropriate method above had a method been - * provided with the proper name. The API makes no guarantees about the nature - * of the returned object, apart from that it is usable whereever promises are - * bought and sold. - */ -Q.makePromise = Promise; -function Promise(descriptor, fallback, inspect) { - if (fallback === void 0) { - fallback = function (op) { - return reject(new Error( - "Promise does not support operation: " + op - )); - }; - } - if (inspect === void 0) { - inspect = function () { - return {state: "unknown"}; - }; - } - - var promise = object_create(Promise.prototype); - - promise.promiseDispatch = function (resolve, op, args) { - var result; - try { - if (descriptor[op]) { - result = descriptor[op].apply(promise, args); - } else { - result = fallback.call(promise, op, args); - } - } catch (exception) { - result = reject(exception); - } - if (resolve) { - resolve(result); - } - }; - - promise.inspect = inspect; - - // XXX deprecated `valueOf` and `exception` support - if (inspect) { - var inspected = inspect(); - if (inspected.state === "rejected") { - promise.exception = inspected.reason; - } - - promise.valueOf = function () { - var inspected = inspect(); - if (inspected.state === "pending" || - inspected.state === "rejected") { - return promise; - } - return inspected.value; - }; - } - - return promise; -} - -Promise.prototype.toString = function () { - return "[object Promise]"; -}; - -Promise.prototype.then = function (fulfilled, rejected, progressed) { - var self = this; - var deferred = defer(); - var done = false; // ensure the untrusted promise makes at most a - // single call to one of the callbacks - - function _fulfilled(value) { - try { - return typeof fulfilled === "function" ? fulfilled(value) : value; - } catch (exception) { - return reject(exception); - } - } - - function _rejected(exception) { - if (typeof rejected === "function") { - makeStackTraceLong(exception, self); - try { - return rejected(exception); - } catch (newException) { - return reject(newException); - } - } - return reject(exception); - } - - function _progressed(value) { - return typeof progressed === "function" ? progressed(value) : value; - } - - Q.nextTick(function () { - self.promiseDispatch(function (value) { - if (done) { - return; - } - done = true; - - deferred.resolve(_fulfilled(value)); - }, "when", [function (exception) { - if (done) { - return; - } - done = true; - - deferred.resolve(_rejected(exception)); - }]); - }); - - // Progress propagator need to be attached in the current tick. - self.promiseDispatch(void 0, "when", [void 0, function (value) { - var newValue; - var threw = false; - try { - newValue = _progressed(value); - } catch (e) { - threw = true; - if (Q.onerror) { - Q.onerror(e); - } else { - throw e; - } - } - - if (!threw) { - deferred.notify(newValue); - } - }]); - - return deferred.promise; -}; - -Q.tap = function (promise, callback) { - return Q(promise).tap(callback); -}; - -/** - * Works almost like "finally", but not called for rejections. - * Original resolution value is passed through callback unaffected. - * Callback may return a promise that will be awaited for. - * @param {Function} callback - * @returns {Q.Promise} - * @example - * doSomething() - * .then(...) - * .tap(console.log) - * .then(...); - */ -Promise.prototype.tap = function (callback) { - callback = Q(callback); - - return this.then(function (value) { - return callback.fcall(value).thenResolve(value); - }); -}; - -/** - * Registers an observer on a promise. - * - * Guarantees: - * - * 1. that fulfilled and rejected will be called only once. - * 2. that either the fulfilled callback or the rejected callback will be - * called, but not both. - * 3. that fulfilled and rejected will not be called in this turn. - * - * @param value promise or immediate reference to observe - * @param fulfilled function to be called with the fulfilled value - * @param rejected function to be called with the rejection exception - * @param progressed function to be called on any progress notifications - * @return promise for the return value from the invoked callback - */ -Q.when = when; -function when(value, fulfilled, rejected, progressed) { - return Q(value).then(fulfilled, rejected, progressed); -} - -Promise.prototype.thenResolve = function (value) { - return this.then(function () { return value; }); -}; - -Q.thenResolve = function (promise, value) { - return Q(promise).thenResolve(value); -}; - -Promise.prototype.thenReject = function (reason) { - return this.then(function () { throw reason; }); -}; - -Q.thenReject = function (promise, reason) { - return Q(promise).thenReject(reason); -}; - -/** - * If an object is not a promise, it is as "near" as possible. - * If a promise is rejected, it is as "near" as possible too. - * If it’s a fulfilled promise, the fulfillment value is nearer. - * If it’s a deferred promise and the deferred has been resolved, the - * resolution is "nearer". - * @param object - * @returns most resolved (nearest) form of the object - */ - -// XXX should we re-do this? -Q.nearer = nearer; -function nearer(value) { - if (isPromise(value)) { - var inspected = value.inspect(); - if (inspected.state === "fulfilled") { - return inspected.value; - } - } - return value; -} - -/** - * @returns whether the given object is a promise. - * Otherwise it is a fulfilled value. - */ -Q.isPromise = isPromise; -function isPromise(object) { - return object instanceof Promise; -} - -Q.isPromiseAlike = isPromiseAlike; -function isPromiseAlike(object) { - return isObject(object) && typeof object.then === "function"; -} - -/** - * @returns whether the given object is a pending promise, meaning not - * fulfilled or rejected. - */ -Q.isPending = isPending; -function isPending(object) { - return isPromise(object) && object.inspect().state === "pending"; -} - -Promise.prototype.isPending = function () { - return this.inspect().state === "pending"; -}; - -/** - * @returns whether the given object is a value or fulfilled - * promise. - */ -Q.isFulfilled = isFulfilled; -function isFulfilled(object) { - return !isPromise(object) || object.inspect().state === "fulfilled"; -} - -Promise.prototype.isFulfilled = function () { - return this.inspect().state === "fulfilled"; -}; - -/** - * @returns whether the given object is a rejected promise. - */ -Q.isRejected = isRejected; -function isRejected(object) { - return isPromise(object) && object.inspect().state === "rejected"; -} - -Promise.prototype.isRejected = function () { - return this.inspect().state === "rejected"; -}; - -//// BEGIN UNHANDLED REJECTION TRACKING - -// This promise library consumes exceptions thrown in handlers so they can be -// handled by a subsequent promise. The exceptions get added to this array when -// they are created, and removed when they are handled. Note that in ES6 or -// shimmed environments, this would naturally be a `Set`. -var unhandledReasons = []; -var unhandledRejections = []; -var reportedUnhandledRejections = []; -var trackUnhandledRejections = true; - -function resetUnhandledRejections() { - unhandledReasons.length = 0; - unhandledRejections.length = 0; - - if (!trackUnhandledRejections) { - trackUnhandledRejections = true; - } -} - -function trackRejection(promise, reason) { - if (!trackUnhandledRejections) { - return; - } - if (typeof process === "object" && typeof process.emit === "function") { - Q.nextTick.runAfter(function () { - if (array_indexOf(unhandledRejections, promise) !== -1) { - process.emit("unhandledRejection", reason, promise); - reportedUnhandledRejections.push(promise); - } - }); - } - - unhandledRejections.push(promise); - if (reason && typeof reason.stack !== "undefined") { - unhandledReasons.push(reason.stack); - } else { - unhandledReasons.push("(no stack) " + reason); - } -} - -function untrackRejection(promise) { - if (!trackUnhandledRejections) { - return; - } - - var at = array_indexOf(unhandledRejections, promise); - if (at !== -1) { - if (typeof process === "object" && typeof process.emit === "function") { - Q.nextTick.runAfter(function () { - var atReport = array_indexOf(reportedUnhandledRejections, promise); - if (atReport !== -1) { - process.emit("rejectionHandled", unhandledReasons[at], promise); - reportedUnhandledRejections.splice(atReport, 1); - } - }); - } - unhandledRejections.splice(at, 1); - unhandledReasons.splice(at, 1); - } -} - -Q.resetUnhandledRejections = resetUnhandledRejections; - -Q.getUnhandledReasons = function () { - // Make a copy so that consumers can't interfere with our internal state. - return unhandledReasons.slice(); -}; - -Q.stopUnhandledRejectionTracking = function () { - resetUnhandledRejections(); - trackUnhandledRejections = false; -}; - -resetUnhandledRejections(); - -//// END UNHANDLED REJECTION TRACKING - -/** - * Constructs a rejected promise. - * @param reason value describing the failure - */ -Q.reject = reject; -function reject(reason) { - var rejection = Promise({ - "when": function (rejected) { - // note that the error has been handled - if (rejected) { - untrackRejection(this); - } - return rejected ? rejected(reason) : this; - } - }, function fallback() { - return this; - }, function inspect() { - return { state: "rejected", reason: reason }; - }); - - // Note that the reason has not been handled. - trackRejection(rejection, reason); - - return rejection; -} - -/** - * Constructs a fulfilled promise for an immediate reference. - * @param value immediate reference - */ -Q.fulfill = fulfill; -function fulfill(value) { - return Promise({ - "when": function () { - return value; - }, - "get": function (name) { - return value[name]; - }, - "set": function (name, rhs) { - value[name] = rhs; - }, - "delete": function (name) { - delete value[name]; - }, - "post": function (name, args) { - // Mark Miller proposes that post with no name should apply a - // promised function. - if (name === null || name === void 0) { - return value.apply(void 0, args); - } else { - return value[name].apply(value, args); - } - }, - "apply": function (thisp, args) { - return value.apply(thisp, args); - }, - "keys": function () { - return object_keys(value); - } - }, void 0, function inspect() { - return { state: "fulfilled", value: value }; - }); -} - -/** - * Converts thenables to Q promises. - * @param promise thenable promise - * @returns a Q promise - */ -function coerce(promise) { - var deferred = defer(); - Q.nextTick(function () { - try { - promise.then(deferred.resolve, deferred.reject, deferred.notify); - } catch (exception) { - deferred.reject(exception); - } - }); - return deferred.promise; -} - -/** - * Annotates an object such that it will never be - * transferred away from this process over any promise - * communication channel. - * @param object - * @returns promise a wrapping of that object that - * additionally responds to the "isDef" message - * without a rejection. - */ -Q.master = master; -function master(object) { - return Promise({ - "isDef": function () {} - }, function fallback(op, args) { - return dispatch(object, op, args); - }, function () { - return Q(object).inspect(); - }); -} - -/** - * Spreads the values of a promised array of arguments into the - * fulfillment callback. - * @param fulfilled callback that receives variadic arguments from the - * promised array - * @param rejected callback that receives the exception if the promise - * is rejected. - * @returns a promise for the return value or thrown exception of - * either callback. - */ -Q.spread = spread; -function spread(value, fulfilled, rejected) { - return Q(value).spread(fulfilled, rejected); -} - -Promise.prototype.spread = function (fulfilled, rejected) { - return this.all().then(function (array) { - return fulfilled.apply(void 0, array); - }, rejected); -}; - -/** - * The async function is a decorator for generator functions, turning - * them into asynchronous generators. Although generators are only part - * of the newest ECMAScript 6 drafts, this code does not cause syntax - * errors in older engines. This code should continue to work and will - * in fact improve over time as the language improves. - * - * ES6 generators are currently part of V8 version 3.19 with the - * --harmony-generators runtime flag enabled. SpiderMonkey has had them - * for longer, but under an older Python-inspired form. This function - * works on both kinds of generators. - * - * Decorates a generator function such that: - * - it may yield promises - * - execution will continue when that promise is fulfilled - * - the value of the yield expression will be the fulfilled value - * - it returns a promise for the return value (when the generator - * stops iterating) - * - the decorated function returns a promise for the return value - * of the generator or the first rejected promise among those - * yielded. - * - if an error is thrown in the generator, it propagates through - * every following yield until it is caught, or until it escapes - * the generator function altogether, and is translated into a - * rejection for the promise returned by the decorated generator. - */ -Q.async = async; -function async(makeGenerator) { - return function () { - // when verb is "send", arg is a value - // when verb is "throw", arg is an exception - function continuer(verb, arg) { - var result; - - // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only - // engine that has a deployed base of browsers that support generators. - // However, SM's generators use the Python-inspired semantics of - // outdated ES6 drafts. We would like to support ES6, but we'd also - // like to make it possible to use generators in deployed browsers, so - // we also support Python-style generators. At some point we can remove - // this block. - - if (typeof StopIteration === "undefined") { - // ES6 Generators - try { - result = generator[verb](arg); - } catch (exception) { - return reject(exception); - } - if (result.done) { - return Q(result.value); - } else { - return when(result.value, callback, errback); - } - } else { - // SpiderMonkey Generators - // FIXME: Remove this case when SM does ES6 generators. - try { - result = generator[verb](arg); - } catch (exception) { - if (isStopIteration(exception)) { - return Q(exception.value); - } else { - return reject(exception); - } - } - return when(result, callback, errback); - } - } - var generator = makeGenerator.apply(this, arguments); - var callback = continuer.bind(continuer, "next"); - var errback = continuer.bind(continuer, "throw"); - return callback(); - }; -} - -/** - * The spawn function is a small wrapper around async that immediately - * calls the generator and also ends the promise chain, so that any - * unhandled errors are thrown instead of forwarded to the error - * handler. This is useful because it's extremely common to run - * generators at the top-level to work with libraries. - */ -Q.spawn = spawn; -function spawn(makeGenerator) { - Q.done(Q.async(makeGenerator)()); -} - -// FIXME: Remove this interface once ES6 generators are in SpiderMonkey. -/** - * Throws a ReturnValue exception to stop an asynchronous generator. - * - * This interface is a stop-gap measure to support generator return - * values in older Firefox/SpiderMonkey. In browsers that support ES6 - * generators like Chromium 29, just use "return" in your generator - * functions. - * - * @param value the return value for the surrounding generator - * @throws ReturnValue exception with the value. - * @example - * // ES6 style - * Q.async(function* () { - * var foo = yield getFooPromise(); - * var bar = yield getBarPromise(); - * return foo + bar; - * }) - * // Older SpiderMonkey style - * Q.async(function () { - * var foo = yield getFooPromise(); - * var bar = yield getBarPromise(); - * Q.return(foo + bar); - * }) - */ -Q["return"] = _return; -function _return(value) { - throw new QReturnValue(value); -} - -/** - * The promised function decorator ensures that any promise arguments - * are settled and passed as values (`this` is also settled and passed - * as a value). It will also ensure that the result of a function is - * always a promise. - * - * @example - * var add = Q.promised(function (a, b) { - * return a + b; - * }); - * add(Q(a), Q(B)); - * - * @param {function} callback The function to decorate - * @returns {function} a function that has been decorated. - */ -Q.promised = promised; -function promised(callback) { - return function () { - return spread([this, all(arguments)], function (self, args) { - return callback.apply(self, args); - }); - }; -} - -/** - * sends a message to a value in a future turn - * @param object* the recipient - * @param op the name of the message operation, e.g., "when", - * @param args further arguments to be forwarded to the operation - * @returns result {Promise} a promise for the result of the operation - */ -Q.dispatch = dispatch; -function dispatch(object, op, args) { - return Q(object).dispatch(op, args); -} - -Promise.prototype.dispatch = function (op, args) { - var self = this; - var deferred = defer(); - Q.nextTick(function () { - self.promiseDispatch(deferred.resolve, op, args); - }); - return deferred.promise; -}; - -/** - * Gets the value of a property in a future turn. - * @param object promise or immediate reference for target object - * @param name name of property to get - * @return promise for the property value - */ -Q.get = function (object, key) { - return Q(object).dispatch("get", [key]); -}; - -Promise.prototype.get = function (key) { - return this.dispatch("get", [key]); -}; - -/** - * Sets the value of a property in a future turn. - * @param object promise or immediate reference for object object - * @param name name of property to set - * @param value new value of property - * @return promise for the return value - */ -Q.set = function (object, key, value) { - return Q(object).dispatch("set", [key, value]); -}; - -Promise.prototype.set = function (key, value) { - return this.dispatch("set", [key, value]); -}; - -/** - * Deletes a property in a future turn. - * @param object promise or immediate reference for target object - * @param name name of property to delete - * @return promise for the return value - */ -Q.del = // XXX legacy -Q["delete"] = function (object, key) { - return Q(object).dispatch("delete", [key]); -}; - -Promise.prototype.del = // XXX legacy -Promise.prototype["delete"] = function (key) { - return this.dispatch("delete", [key]); -}; - -/** - * Invokes a method in a future turn. - * @param object promise or immediate reference for target object - * @param name name of method to invoke - * @param value a value to post, typically an array of - * invocation arguments for promises that - * are ultimately backed with `resolve` values, - * as opposed to those backed with URLs - * wherein the posted value can be any - * JSON serializable object. - * @return promise for the return value - */ -// bound locally because it is used by other methods -Q.mapply = // XXX As proposed by "Redsandro" -Q.post = function (object, name, args) { - return Q(object).dispatch("post", [name, args]); -}; - -Promise.prototype.mapply = // XXX As proposed by "Redsandro" -Promise.prototype.post = function (name, args) { - return this.dispatch("post", [name, args]); -}; - -/** - * Invokes a method in a future turn. - * @param object promise or immediate reference for target object - * @param name name of method to invoke - * @param ...args array of invocation arguments - * @return promise for the return value - */ -Q.send = // XXX Mark Miller's proposed parlance -Q.mcall = // XXX As proposed by "Redsandro" -Q.invoke = function (object, name /*...args*/) { - return Q(object).dispatch("post", [name, array_slice(arguments, 2)]); -}; - -Promise.prototype.send = // XXX Mark Miller's proposed parlance -Promise.prototype.mcall = // XXX As proposed by "Redsandro" -Promise.prototype.invoke = function (name /*...args*/) { - return this.dispatch("post", [name, array_slice(arguments, 1)]); -}; - -/** - * Applies the promised function in a future turn. - * @param object promise or immediate reference for target function - * @param args array of application arguments - */ -Q.fapply = function (object, args) { - return Q(object).dispatch("apply", [void 0, args]); -}; - -Promise.prototype.fapply = function (args) { - return this.dispatch("apply", [void 0, args]); -}; - -/** - * Calls the promised function in a future turn. - * @param object promise or immediate reference for target function - * @param ...args array of application arguments - */ -Q["try"] = -Q.fcall = function (object /* ...args*/) { - return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]); -}; - -Promise.prototype.fcall = function (/*...args*/) { - return this.dispatch("apply", [void 0, array_slice(arguments)]); -}; - -/** - * Binds the promised function, transforming return values into a fulfilled - * promise and thrown errors into a rejected one. - * @param object promise or immediate reference for target function - * @param ...args array of application arguments - */ -Q.fbind = function (object /*...args*/) { - var promise = Q(object); - var args = array_slice(arguments, 1); - return function fbound() { - return promise.dispatch("apply", [ - this, - args.concat(array_slice(arguments)) - ]); - }; -}; -Promise.prototype.fbind = function (/*...args*/) { - var promise = this; - var args = array_slice(arguments); - return function fbound() { - return promise.dispatch("apply", [ - this, - args.concat(array_slice(arguments)) - ]); - }; -}; - -/** - * Requests the names of the owned properties of a promised - * object in a future turn. - * @param object promise or immediate reference for target object - * @return promise for the keys of the eventually settled object - */ -Q.keys = function (object) { - return Q(object).dispatch("keys", []); -}; - -Promise.prototype.keys = function () { - return this.dispatch("keys", []); -}; - -/** - * Turns an array of promises into a promise for an array. If any of - * the promises gets rejected, the whole array is rejected immediately. - * @param {Array*} an array (or promise for an array) of values (or - * promises for values) - * @returns a promise for an array of the corresponding values - */ -// By Mark Miller -// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled -Q.all = all; -function all(promises) { - return when(promises, function (promises) { - var pendingCount = 0; - var deferred = defer(); - array_reduce(promises, function (undefined, promise, index) { - var snapshot; - if ( - isPromise(promise) && - (snapshot = promise.inspect()).state === "fulfilled" - ) { - promises[index] = snapshot.value; - } else { - ++pendingCount; - when( - promise, - function (value) { - promises[index] = value; - if (--pendingCount === 0) { - deferred.resolve(promises); - } - }, - deferred.reject, - function (progress) { - deferred.notify({ index: index, value: progress }); - } - ); - } - }, void 0); - if (pendingCount === 0) { - deferred.resolve(promises); - } - return deferred.promise; - }); -} - -Promise.prototype.all = function () { - return all(this); -}; - -/** - * Returns the first resolved promise of an array. Prior rejected promises are - * ignored. Rejects only if all promises are rejected. - * @param {Array*} an array containing values or promises for values - * @returns a promise fulfilled with the value of the first resolved promise, - * or a rejected promise if all promises are rejected. - */ -Q.any = any; - -function any(promises) { - if (promises.length === 0) { - return Q.resolve(); - } - - var deferred = Q.defer(); - var pendingCount = 0; - array_reduce(promises, function (prev, current, index) { - var promise = promises[index]; - - pendingCount++; - - when(promise, onFulfilled, onRejected, onProgress); - function onFulfilled(result) { - deferred.resolve(result); - } - function onRejected(err) { - pendingCount--; - if (pendingCount === 0) { - err.message = ("Q can't get fulfillment value from any promise, all " + - "promises were rejected. Last error message: " + err.message); - deferred.reject(err); - } - } - function onProgress(progress) { - deferred.notify({ - index: index, - value: progress - }); - } - }, undefined); - - return deferred.promise; -} - -Promise.prototype.any = function () { - return any(this); -}; - -/** - * Waits for all promises to be settled, either fulfilled or - * rejected. This is distinct from `all` since that would stop - * waiting at the first rejection. The promise returned by - * `allResolved` will never be rejected. - * @param promises a promise for an array (or an array) of promises - * (or values) - * @return a promise for an array of promises - */ -Q.allResolved = deprecate(allResolved, "allResolved", "allSettled"); -function allResolved(promises) { - return when(promises, function (promises) { - promises = array_map(promises, Q); - return when(all(array_map(promises, function (promise) { - return when(promise, noop, noop); - })), function () { - return promises; - }); - }); -} - -Promise.prototype.allResolved = function () { - return allResolved(this); -}; - -/** - * @see Promise#allSettled - */ -Q.allSettled = allSettled; -function allSettled(promises) { - return Q(promises).allSettled(); -} - -/** - * Turns an array of promises into a promise for an array of their states (as - * returned by `inspect`) when they have all settled. - * @param {Array[Any*]} values an array (or promise for an array) of values (or - * promises for values) - * @returns {Array[State]} an array of states for the respective values. - */ -Promise.prototype.allSettled = function () { - return this.then(function (promises) { - return all(array_map(promises, function (promise) { - promise = Q(promise); - function regardless() { - return promise.inspect(); - } - return promise.then(regardless, regardless); - })); - }); -}; - -/** - * Captures the failure of a promise, giving an oportunity to recover - * with a callback. If the given promise is fulfilled, the returned - * promise is fulfilled. - * @param {Any*} promise for something - * @param {Function} callback to fulfill the returned promise if the - * given promise is rejected - * @returns a promise for the return value of the callback - */ -Q.fail = // XXX legacy -Q["catch"] = function (object, rejected) { - return Q(object).then(void 0, rejected); -}; - -Promise.prototype.fail = // XXX legacy -Promise.prototype["catch"] = function (rejected) { - return this.then(void 0, rejected); -}; - -/** - * Attaches a listener that can respond to progress notifications from a - * promise's originating deferred. This listener receives the exact arguments - * passed to ``deferred.notify``. - * @param {Any*} promise for something - * @param {Function} callback to receive any progress notifications - * @returns the given promise, unchanged - */ -Q.progress = progress; -function progress(object, progressed) { - return Q(object).then(void 0, void 0, progressed); -} - -Promise.prototype.progress = function (progressed) { - return this.then(void 0, void 0, progressed); -}; - -/** - * Provides an opportunity to observe the settling of a promise, - * regardless of whether the promise is fulfilled or rejected. Forwards - * the resolution to the returned promise when the callback is done. - * The callback can return a promise to defer completion. - * @param {Any*} promise - * @param {Function} callback to observe the resolution of the given - * promise, takes no arguments. - * @returns a promise for the resolution of the given promise when - * ``fin`` is done. - */ -Q.fin = // XXX legacy -Q["finally"] = function (object, callback) { - return Q(object)["finally"](callback); -}; - -Promise.prototype.fin = // XXX legacy -Promise.prototype["finally"] = function (callback) { - if (!callback || typeof callback.apply !== "function") { - throw new Error("Q can't apply finally callback"); - } - callback = Q(callback); - return this.then(function (value) { - return callback.fcall().then(function () { - return value; - }); - }, function (reason) { - // TODO attempt to recycle the rejection with "this". - return callback.fcall().then(function () { - throw reason; - }); - }); -}; - -/** - * Terminates a chain of promises, forcing rejections to be - * thrown as exceptions. - * @param {Any*} promise at the end of a chain of promises - * @returns nothing - */ -Q.done = function (object, fulfilled, rejected, progress) { - return Q(object).done(fulfilled, rejected, progress); -}; - -Promise.prototype.done = function (fulfilled, rejected, progress) { - var onUnhandledError = function (error) { - // forward to a future turn so that ``when`` - // does not catch it and turn it into a rejection. - Q.nextTick(function () { - makeStackTraceLong(error, promise); - if (Q.onerror) { - Q.onerror(error); - } else { - throw error; - } - }); - }; - - // Avoid unnecessary `nextTick`ing via an unnecessary `when`. - var promise = fulfilled || rejected || progress ? - this.then(fulfilled, rejected, progress) : - this; - - if (typeof process === "object" && process && process.domain) { - onUnhandledError = process.domain.bind(onUnhandledError); - } - - promise.then(void 0, onUnhandledError); -}; - -/** - * Causes a promise to be rejected if it does not get fulfilled before - * some milliseconds time out. - * @param {Any*} promise - * @param {Number} milliseconds timeout - * @param {Any*} custom error message or Error object (optional) - * @returns a promise for the resolution of the given promise if it is - * fulfilled before the timeout, otherwise rejected. - */ -Q.timeout = function (object, ms, error) { - return Q(object).timeout(ms, error); -}; - -Promise.prototype.timeout = function (ms, error) { - var deferred = defer(); - var timeoutId = setTimeout(function () { - if (!error || "string" === typeof error) { - error = new Error(error || "Timed out after " + ms + " ms"); - error.code = "ETIMEDOUT"; - } - deferred.reject(error); - }, ms); - - this.then(function (value) { - clearTimeout(timeoutId); - deferred.resolve(value); - }, function (exception) { - clearTimeout(timeoutId); - deferred.reject(exception); - }, deferred.notify); - - return deferred.promise; -}; - -/** - * Returns a promise for the given value (or promised value), some - * milliseconds after it resolved. Passes rejections immediately. - * @param {Any*} promise - * @param {Number} milliseconds - * @returns a promise for the resolution of the given promise after milliseconds - * time has elapsed since the resolution of the given promise. - * If the given promise rejects, that is passed immediately. - */ -Q.delay = function (object, timeout) { - if (timeout === void 0) { - timeout = object; - object = void 0; - } - return Q(object).delay(timeout); -}; - -Promise.prototype.delay = function (timeout) { - return this.then(function (value) { - var deferred = defer(); - setTimeout(function () { - deferred.resolve(value); - }, timeout); - return deferred.promise; - }); -}; - -/** - * Passes a continuation to a Node function, which is called with the given - * arguments provided as an array, and returns a promise. - * - * Q.nfapply(FS.readFile, [__filename]) - * .then(function (content) { - * }) - * - */ -Q.nfapply = function (callback, args) { - return Q(callback).nfapply(args); -}; - -Promise.prototype.nfapply = function (args) { - var deferred = defer(); - var nodeArgs = array_slice(args); - nodeArgs.push(deferred.makeNodeResolver()); - this.fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; -}; - -/** - * Passes a continuation to a Node function, which is called with the given - * arguments provided individually, and returns a promise. - * @example - * Q.nfcall(FS.readFile, __filename) - * .then(function (content) { - * }) - * - */ -Q.nfcall = function (callback /*...args*/) { - var args = array_slice(arguments, 1); - return Q(callback).nfapply(args); -}; - -Promise.prototype.nfcall = function (/*...args*/) { - var nodeArgs = array_slice(arguments); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - this.fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; -}; - -/** - * Wraps a NodeJS continuation passing function and returns an equivalent - * version that returns a promise. - * @example - * Q.nfbind(FS.readFile, __filename)("utf-8") - * .then(console.log) - * .done() - */ -Q.nfbind = -Q.denodeify = function (callback /*...args*/) { - if (callback === undefined) { - throw new Error("Q can't wrap an undefined function"); - } - var baseArgs = array_slice(arguments, 1); - return function () { - var nodeArgs = baseArgs.concat(array_slice(arguments)); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - Q(callback).fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; - }; -}; - -Promise.prototype.nfbind = -Promise.prototype.denodeify = function (/*...args*/) { - var args = array_slice(arguments); - args.unshift(this); - return Q.denodeify.apply(void 0, args); -}; - -Q.nbind = function (callback, thisp /*...args*/) { - var baseArgs = array_slice(arguments, 2); - return function () { - var nodeArgs = baseArgs.concat(array_slice(arguments)); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - function bound() { - return callback.apply(thisp, arguments); - } - Q(bound).fapply(nodeArgs).fail(deferred.reject); - return deferred.promise; - }; -}; - -Promise.prototype.nbind = function (/*thisp, ...args*/) { - var args = array_slice(arguments, 0); - args.unshift(this); - return Q.nbind.apply(void 0, args); -}; - -/** - * Calls a method of a Node-style object that accepts a Node-style - * callback with a given array of arguments, plus a provided callback. - * @param object an object that has the named method - * @param {String} name name of the method of object - * @param {Array} args arguments to pass to the method; the callback - * will be provided by Q and appended to these arguments. - * @returns a promise for the value or error - */ -Q.nmapply = // XXX As proposed by "Redsandro" -Q.npost = function (object, name, args) { - return Q(object).npost(name, args); -}; - -Promise.prototype.nmapply = // XXX As proposed by "Redsandro" -Promise.prototype.npost = function (name, args) { - var nodeArgs = array_slice(args || []); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - this.dispatch("post", [name, nodeArgs]).fail(deferred.reject); - return deferred.promise; -}; - -/** - * Calls a method of a Node-style object that accepts a Node-style - * callback, forwarding the given variadic arguments, plus a provided - * callback argument. - * @param object an object that has the named method - * @param {String} name name of the method of object - * @param ...args arguments to pass to the method; the callback will - * be provided by Q and appended to these arguments. - * @returns a promise for the value or error - */ -Q.nsend = // XXX Based on Mark Miller's proposed "send" -Q.nmcall = // XXX Based on "Redsandro's" proposal -Q.ninvoke = function (object, name /*...args*/) { - var nodeArgs = array_slice(arguments, 2); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject); - return deferred.promise; -}; - -Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send" -Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal -Promise.prototype.ninvoke = function (name /*...args*/) { - var nodeArgs = array_slice(arguments, 1); - var deferred = defer(); - nodeArgs.push(deferred.makeNodeResolver()); - this.dispatch("post", [name, nodeArgs]).fail(deferred.reject); - return deferred.promise; -}; - -/** - * If a function would like to support both Node continuation-passing-style and - * promise-returning-style, it can end its internal promise chain with - * `nodeify(nodeback)`, forwarding the optional nodeback argument. If the user - * elects to use a nodeback, the result will be sent there. If they do not - * pass a nodeback, they will receive the result promise. - * @param object a result (or a promise for a result) - * @param {Function} nodeback a Node.js-style callback - * @returns either the promise or nothing - */ -Q.nodeify = nodeify; -function nodeify(object, nodeback) { - return Q(object).nodeify(nodeback); -} - -Promise.prototype.nodeify = function (nodeback) { - if (nodeback) { - this.then(function (value) { - Q.nextTick(function () { - nodeback(null, value); - }); - }, function (error) { - Q.nextTick(function () { - nodeback(error); - }); - }); - } else { - return this; - } -}; - -Q.noConflict = function() { - throw new Error("Q.noConflict only works when Q is used as a global"); -}; - -// All code before this point will be filtered from stack traces. -var qEndingLine = captureLine(); - -return Q; - -}); \ No newline at end of file diff --git a/Library q for promises/readme.md b/Library q for promises/readme.md deleted file mode 100644 index cb5d24a..0000000 --- a/Library q for promises/readme.md +++ /dev/null @@ -1,27 +0,0 @@ -This qLib is a modified version of the nodeJS package https://www.npmjs.com/package/q - -Simply import this as a library into your Novi system -Require the qLib in the service of your choice -Begin using q as normal - -Ex: - -``` - var deferred = Q.defer(); - - request.get(options, function(err,resp){ - if(err){ - //the error is a JSON value of the error in question, shaped like {"error":"message"} - deferred.reject(new Error("Status code was " + JSON.stringify(err))); - }else{ - //resp is JSON of the response - deferred.resolve(resp); - } - } ); - - return deferred.promise; -``` - -Note: only modifications from original library include - removal of unneeded environment recongition code during entry - removal of calls to setTimeouts (not honored in Novi). These calls are unnecessary in Novi as they are only hacks to help performance in NodeJS \ No newline at end of file diff --git a/Library q for promises/service/qExample.js b/Library q for promises/service/qExample.js deleted file mode 100644 index 325ea7e..0000000 --- a/Library q for promises/service/qExample.js +++ /dev/null @@ -1,31 +0,0 @@ -function qTest(req, resp){ - - function requestAPage() { - var request = Requests(); - var options = { - "uri":"https://www.google.com", - } - var deferred = Q.defer(); - - request.get(options, function(err,resp){ - if(err){ - //the error is a JSON value of the error in question, shaped like {"error":"message"} - deferred.reject(new Error("Status code was " + JSON.stringify(err))); - }else{ - //resp is JSON of the response - deferred.resolve(resp); - } - } ); - - return deferred.promise; - } - - - requestAPage() - .then(function (value) { - resp.success("promise was successful with value:"+value); - }, function (reason) { - resp.failure("promside failed because: "+reason); - } - ); -} \ No newline at end of file diff --git a/Sending Emails with Mailgun/README.md b/Sending Emails with Mailgun/README.md index 3ae88a4..4c08dbb 100644 --- a/Sending Emails with Mailgun/README.md +++ b/Sending Emails with Mailgun/README.md @@ -1,12 +1,3 @@ -#Sending Emails Using MailGun +# Note -## Overview -This repository allows you to send e-mails with ClearBlade via the Mailgun API, which uses the HTTP Protocol. You can choose to create a new domain for your outgoing e-mails, or use the mailgun domain. Sample code to send an e-mail is given in **SendMail.js**. - -## Usage -Log into your Mailgun account, and view the Domain tabs to find the following values: ->1. Replace **** with Mailgun API key ->2. Replace **** with your Mailgun Domain - -## Further Documentation -https://documentation.mailgun.com/quickstart.html \ No newline at end of file +Pattern has moved: https://ipm.clearblade.com \ No newline at end of file diff --git a/Sending Emails with Mailgun/SendMail.js b/Sending Emails with Mailgun/SendMail.js deleted file mode 100644 index b190ff8..0000000 --- a/Sending Emails with Mailgun/SendMail.js +++ /dev/null @@ -1,49 +0,0 @@ -function SendMail(req, resp){ - - function sendMail(){ - var options = { - auth: { - // Drop in YOUR_API_KEY - user: "api", - pass : "YOUR_API_KEY" - }, - // Drop in YOUR_DOMAIN - uri : "https://api.mailgun.net/v3/YOUR_DOMAIN/messages", - qs: { - "from": "Mailgun Sandbox ", - "to": "foo ", - "subject": "Test message using mailgun", - "text": "Hi xyz. This is a test message from code service using mailgun http api!" - }, - strictSSL: false - }; - - var requestObject = ClearBlade.http().Request(); - requestObject.post(options,function(err,result){ - if(err){ - resp.error("Failed"); - }else{ - resp.success(result); - } - }); - } - - function initClearBlade() { - var initCallback = function(err, response) { - if (err) { - resp.error(response); - } - }; - var initOptions = { - systemKey: req.systemKey, - systemSecret: req.systemSecret, - email: "your_user", - password: "your_password", - callback: initCallback - }; - ClearBlade.init(initOptions); - } - - initClearBlade(); - sendMail(); -} diff --git a/Sending Emails with SendGrid/README.md b/Sending Emails with SendGrid/README.md new file mode 100644 index 0000000..79fed04 --- /dev/null +++ b/Sending Emails with SendGrid/README.md @@ -0,0 +1,3 @@ +# Note + +Pattern has moved: https://ipm.clearblade.com