2015-11-11 18:18:25 -05:00
|
|
|
settings = require("settings-sharelatex")
|
|
|
|
request = require("request")
|
|
|
|
logger = require("logger-sharelatex")
|
|
|
|
|
2015-11-12 07:43:40 -05:00
|
|
|
|
|
|
|
|
|
|
|
timeout = if process.env.NODE_ENV == "production" then 500 else 5000
|
|
|
|
logger.log "using timeout of #{timeout}ms for sixpack server calls"
|
|
|
|
|
2015-11-11 18:18:25 -05:00
|
|
|
generate_client_id = ->
|
|
|
|
# from http://stackoverflow.com/questions/105034
|
|
|
|
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace /[xy]/g, (c) ->
|
|
|
|
r = Math.random() * 16 | 0
|
|
|
|
v = if c == 'x' then r else r & 0x3 | 0x8
|
|
|
|
v.toString 16
|
|
|
|
|
|
|
|
_request_uri = (endpoint, params) ->
|
|
|
|
query_string = []
|
|
|
|
e = encodeURIComponent
|
|
|
|
for key of params
|
|
|
|
if params.hasOwnProperty(key)
|
|
|
|
vals = params[key]
|
|
|
|
if Object::toString.call(vals) != '[object Array]'
|
|
|
|
vals = [ vals ]
|
|
|
|
i = 0
|
|
|
|
while i < vals.length
|
|
|
|
query_string.push e(key) + '=' + e(vals[i])
|
|
|
|
i += 1
|
|
|
|
if query_string.length
|
|
|
|
endpoint += '?' + query_string.join('&')
|
|
|
|
endpoint
|
|
|
|
|
|
|
|
_request = (uri, params, callback)->
|
|
|
|
opts =
|
|
|
|
uri:_request_uri(uri, params)
|
|
|
|
json:true
|
2015-11-12 07:43:40 -05:00
|
|
|
timeout:timeout
|
2015-11-11 18:18:25 -05:00
|
|
|
request.get opts, (err, res, body)->
|
|
|
|
callback err, body
|
|
|
|
|
|
|
|
module.exports = sixpack =
|
|
|
|
|
|
|
|
client: (user_id)->
|
|
|
|
client = new sixpack.Session(user_id, settings.apis.sixpack.url)
|
|
|
|
return client
|
|
|
|
|
|
|
|
Session : (client_id, base_url, ip_address, user_agent) ->
|
|
|
|
|
|
|
|
@client_id = client_id or sixpack.generate_client_id()
|
|
|
|
@base_url = base_url or sixpack.base_url
|
|
|
|
|
|
|
|
participate: (experiment_name, alternatives, force, callback) =>
|
|
|
|
if typeof force == 'function'
|
|
|
|
callback = force
|
|
|
|
force = null
|
|
|
|
if !/^[a-z0-9][a-z0-9\-_ ]*$/.test(experiment_name)
|
|
|
|
return callback(new Error('Bad experiment_name'))
|
|
|
|
if alternatives.length < 2
|
|
|
|
return callback(new Error('Must specify at least 2 alternatives'))
|
|
|
|
i = 0
|
|
|
|
while i < alternatives.length
|
|
|
|
if !/^[a-z0-9][a-z0-9\-_ ]*$/.test(alternatives[i])
|
|
|
|
return callback(new Error('Bad alternative name: ' + alternatives[i]))
|
|
|
|
i += 1
|
|
|
|
params =
|
|
|
|
client_id: @client_id
|
|
|
|
experiment: experiment_name
|
|
|
|
alternatives: alternatives
|
|
|
|
|
|
|
|
if force != null and _in_array(alternatives, force)
|
|
|
|
return callback(null,
|
|
|
|
'status': 'ok'
|
|
|
|
'alternative': 'name': force
|
|
|
|
'experiment':
|
|
|
|
'version': 0
|
|
|
|
'name': experiment_name
|
|
|
|
'client_id': @client_id)
|
|
|
|
|
|
|
|
_request @base_url + '/participate', params, (err, res) ->
|
|
|
|
if err?
|
|
|
|
res =
|
|
|
|
status: 'failed'
|
|
|
|
error: err
|
|
|
|
alternative: name: alternatives[0]
|
|
|
|
callback null, res
|
|
|
|
|
|
|
|
convert: (experiment_name, callback)=>
|
|
|
|
if !/^[a-z0-9][a-z0-9\-_ ]*$/.test(experiment_name)
|
|
|
|
return callback(new Error('Bad experiment_name'))
|
|
|
|
params =
|
|
|
|
client_id: @client_id
|
|
|
|
experiment: experiment_name
|
|
|
|
if @ip_address
|
|
|
|
params.ip_address = @ip_address
|
|
|
|
if @user_agent
|
|
|
|
params.user_agent = @user_agent
|
|
|
|
_request @base_url + '/convert', params, (err, res) ->
|
|
|
|
if err?
|
|
|
|
res =
|
|
|
|
status: 'failed'
|
|
|
|
error: err
|
|
|
|
callback null, res
|
|
|
|
|
|
|
|
|