Sixpack.coffee 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. settings = require("settings-sharelatex")
  2. request = require("request")
  3. logger = require("logger-sharelatex")
  4. timeout = if process.env.NODE_ENV == "production" then 500 else 5000
  5. logger.log "using timeout of #{timeout}ms for sixpack server calls"
  6. generate_client_id = ->
  7. # from http://stackoverflow.com/questions/105034
  8. 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace /[xy]/g, (c) ->
  9. r = Math.random() * 16 | 0
  10. v = if c == 'x' then r else r & 0x3 | 0x8
  11. v.toString 16
  12. _request_uri = (endpoint, params) ->
  13. query_string = []
  14. e = encodeURIComponent
  15. for key of params
  16. if params.hasOwnProperty(key)
  17. vals = params[key]
  18. if Object::toString.call(vals) != '[object Array]'
  19. vals = [ vals ]
  20. i = 0
  21. while i < vals.length
  22. query_string.push e(key) + '=' + e(vals[i])
  23. i += 1
  24. if query_string.length
  25. endpoint += '?' + query_string.join('&')
  26. endpoint
  27. _request = (uri, params, callback)->
  28. opts =
  29. uri:_request_uri(uri, params)
  30. json:true
  31. timeout:timeout
  32. request.get opts, (err, res, body)->
  33. callback err, body
  34. module.exports = sixpack =
  35. client: (user_id)->
  36. client = new sixpack.Session(user_id, settings.apis.sixpack.url)
  37. return client
  38. Session : (client_id, base_url, ip_address, user_agent) ->
  39. @client_id = client_id or sixpack.generate_client_id()
  40. @base_url = base_url or sixpack.base_url
  41. participate: (experiment_name, alternatives, force, callback) =>
  42. if typeof force == 'function'
  43. callback = force
  44. force = null
  45. if !/^[a-z0-9][a-z0-9\-_ ]*$/.test(experiment_name)
  46. return callback(new Error('Bad experiment_name'))
  47. if alternatives.length < 2
  48. return callback(new Error('Must specify at least 2 alternatives'))
  49. i = 0
  50. while i < alternatives.length
  51. if !/^[a-z0-9][a-z0-9\-_ ]*$/.test(alternatives[i])
  52. return callback(new Error('Bad alternative name: ' + alternatives[i]))
  53. i += 1
  54. params =
  55. client_id: @client_id
  56. experiment: experiment_name
  57. alternatives: alternatives
  58. if force != null and _in_array(alternatives, force)
  59. return callback(null,
  60. 'status': 'ok'
  61. 'alternative': 'name': force
  62. 'experiment':
  63. 'version': 0
  64. 'name': experiment_name
  65. 'client_id': @client_id)
  66. _request @base_url + '/participate', params, (err, res) ->
  67. if err?
  68. res =
  69. status: 'failed'
  70. error: err
  71. alternative: name: alternatives[0]
  72. callback null, res
  73. convert: (experiment_name, callback)=>
  74. if !/^[a-z0-9][a-z0-9\-_ ]*$/.test(experiment_name)
  75. return callback(new Error('Bad experiment_name'))
  76. params =
  77. client_id: @client_id
  78. experiment: experiment_name
  79. if @ip_address
  80. params.ip_address = @ip_address
  81. if @user_agent
  82. params.user_agent = @user_agent
  83. _request @base_url + '/convert', params, (err, res) ->
  84. if err?
  85. res =
  86. status: 'failed'
  87. error: err
  88. callback null, res