You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					78 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					78 lines
				
				1.9 KiB
			| 
											3 years ago
										 | var jwt = require('jsonwebtoken'), | ||
|  |     qs = require('querystring'), | ||
|  |     utils = require('./utils'); | ||
|  | 
 | ||
|  | function Capability(sid, tkn) { | ||
|  |     if(!(this instanceof Capability)) { | ||
|  |       return new Capability(sid, tkn); | ||
|  |     } | ||
|  | 
 | ||
|  |     utils.initializeTokens(this, 'Capability', sid, tkn); | ||
|  |     this.capabilities = []; | ||
|  | } | ||
|  | 
 | ||
|  | function scopeUriFor(service, privilege, params) { | ||
|  |     var scopeUri = 'scope:'+service+':'+privilege; | ||
|  |     if (params) { | ||
|  |         scopeUri = scopeUri+'?'+qs.stringify(params); | ||
|  |     } | ||
|  |     return scopeUri; | ||
|  | } | ||
|  | 
 | ||
|  | Capability.prototype.allowClientIncoming = function(clientName) { | ||
|  |     this.clientName = clientName; | ||
|  |     this.capabilities.push(scopeUriFor('client', 'incoming', { | ||
|  |         clientName:clientName | ||
|  |     })); | ||
|  | 
 | ||
|  |     return this; | ||
|  | }; | ||
|  | 
 | ||
|  | Capability.prototype.allowClientOutgoing = function(appSid, params) { | ||
|  |     this.outgoingScopeParams = { | ||
|  |         appSid:appSid | ||
|  |     }; | ||
|  | 
 | ||
|  |     if (params) { | ||
|  |         this.outgoingScopeParams.appParams = qs.stringify(params); | ||
|  |     } | ||
|  | 
 | ||
|  |     return this; | ||
|  | }; | ||
|  | 
 | ||
|  | Capability.prototype.allowEventStream = function(filters) { | ||
|  |     var scopeParams = { | ||
|  |         path:'/2010-04-01/Events' | ||
|  |     }; | ||
|  | 
 | ||
|  |     if (filters) { | ||
|  |         scopeParams.params = filters; | ||
|  |     } | ||
|  | 
 | ||
|  |     this.capabilities.push(scopeUriFor('stream', 'subscribe', scopeParams)); | ||
|  |     return this; | ||
|  | }; | ||
|  | 
 | ||
|  | Capability.prototype.generate = function(timeout) { | ||
|  |     var capabilities = this.capabilities.slice(0), | ||
|  |         expires = timeout||3600; | ||
|  | 
 | ||
|  |     //Build outgoing scope params lazily to use clientName (if it exists)
 | ||
|  |     if (this.outgoingScopeParams) { | ||
|  |         if (this.clientName) { | ||
|  |             this.outgoingScopeParams.clientName = this.clientName; | ||
|  |         } | ||
|  |         capabilities.push(scopeUriFor('client', 'outgoing', this.outgoingScopeParams)); | ||
|  |     } | ||
|  | 
 | ||
|  |     var payload = { | ||
|  |         scope: capabilities.join(' '), | ||
|  |         iss: this.accountSid, | ||
|  |         exp: Math.floor(new Date() / 1000) + expires | ||
|  |     }; | ||
|  | 
 | ||
|  |     return jwt.sign(payload, this.authToken); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = Capability; |