added sixpack to server side

This commit is contained in:
Henry Oswald 2015-11-11 23:18:25 +00:00
parent 3a61f48068
commit 377cc11c3b
3 changed files with 102 additions and 0 deletions

View file

@ -0,0 +1,99 @@
settings = require("settings-sharelatex")
request = require("request")
logger = require("logger-sharelatex")
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
timeout:1000
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

View file

@ -104,6 +104,8 @@ module.exports =
url: "http://localhost:3026"
contacts:
url: "http://localhost:3036"
sixpack:
url: ""
templates:
user_id: process.env.TEMPLATES_USER_ID or "5395eb7aad1f29a88756c7f2"

View file

@ -47,6 +47,7 @@
"sanitizer": "0.1.1",
"session.socket.io": "0.1.4",
"settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0",
"sixpack-client": "^1.0.0",
"socket.io": "0.9.16",
"translations-sharelatex": "git+https://github.com/sharelatex/translations-sharelatex.git#master",
"underscore": "1.6.0",