Comparing version 0.0.29 to 1.0.0
@@ -123,9 +123,3 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.autotune = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ | ||
var html_1 = require("./html"); | ||
function uuidv4() { | ||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { | ||
var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; | ||
return v.toString(16); | ||
}); | ||
} | ||
var DEBUG = true; | ||
var util_1 = require("./util"); | ||
function api(path) { | ||
@@ -144,19 +138,2 @@ return "https://2vyiuehl9j.execute-api.us-east-2.amazonaws.com/prod/" + path; | ||
}; | ||
function log() { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
} | ||
if (DEBUG) { | ||
console.log.apply(console, ["AUTOTUNE"].concat(args)); | ||
} | ||
} | ||
function getOwnPropertyValues(x) { | ||
return Object.getOwnPropertyNames(x).map(function (n) { return x[n]; }); | ||
} | ||
function mapObject(x, f) { | ||
var result = {}; | ||
Object.getOwnPropertyNames(x).forEach(function (n) { return (result[n] = f(x[n], n)); }); | ||
return result; | ||
} | ||
function startExperiment(experiment) { | ||
@@ -172,3 +149,3 @@ var _this = this; | ||
return __generator(this, function (_a) { | ||
experiments = mapObject(state.queuedStartedExperiments, function (e) { return ({ | ||
experiments = util_1.mapObject(state.queuedStartedExperiments, function (e) { return ({ | ||
instanceKey: e.key, | ||
@@ -178,7 +155,7 @@ options: e.options, | ||
}); }); | ||
log("Starting experiments", experiments); | ||
util_1.log("Starting experiments", experiments); | ||
state.queuedStartedExperiments = {}; | ||
state.startExperimentsTimer = undefined; | ||
try { | ||
http("POST", api("/startExperiments"), { | ||
util_1.http("POST", api("/startExperiments"), { | ||
appKey: state.appKey, | ||
@@ -189,3 +166,3 @@ experiments: experiments | ||
catch (e) { | ||
log("Failed to start experiments", e); | ||
util_1.log("Failed to start experiments", e); | ||
return [2]; | ||
@@ -209,3 +186,3 @@ } | ||
case 0: | ||
experiments = getOwnPropertyValues(state.queuedCompletedExperiments); | ||
experiments = util_1.getOwnPropertyValues(state.queuedCompletedExperiments); | ||
state.queuedCompletedExperiments = {}; | ||
@@ -215,7 +192,7 @@ state.completeExperimentsTimer = undefined; | ||
experiments.forEach(function (e) { return (experimentsByKey[e.key] = { pick: e.pick, payoff: e.payoff }); }); | ||
log("Completing experiments", experimentsByKey); | ||
util_1.log("Completing experiments", experimentsByKey); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, 4, 5]); | ||
return [4, http("POST", api("/completeExperiments"), { | ||
return [4, util_1.http("POST", api("/completeExperiments"), { | ||
appKey: state.appKey, | ||
@@ -229,3 +206,3 @@ experiments: experimentsByKey | ||
e_1 = _a.sent(); | ||
log("Failed to complete experiments", e_1); | ||
util_1.log("Failed to complete experiments", e_1); | ||
return [3, 5]; | ||
@@ -242,29 +219,2 @@ case 4: | ||
} | ||
function http(method, url, data) { | ||
if (data === void 0) { data = undefined; } | ||
return new Promise(function (resolve, reject) { | ||
if (typeof XMLHttpRequest === "undefined") { | ||
return reject("Not running in browser"); | ||
} | ||
var request = new XMLHttpRequest(); | ||
request.open(method, url, true); | ||
request.setRequestHeader("Content-Type", "application/json"); | ||
request.onerror = function () { return reject(request.statusText); }; | ||
request.onreadystatechange = function () { | ||
if (request.readyState == 4) | ||
if (request.status == 200) { | ||
resolve(JSON.parse(request.responseText)); | ||
} | ||
else { | ||
reject("Request failed with status " + request.status); | ||
} | ||
}; | ||
if (data !== undefined) { | ||
request.send(JSON.stringify(data)); | ||
} | ||
else { | ||
request.send(); | ||
} | ||
}); | ||
} | ||
function initialize(appKey) { | ||
@@ -276,3 +226,3 @@ return __awaiter(this, void 0, void 0, function () { | ||
case 0: | ||
log("Initialize", appKey); | ||
util_1.log("Initialize", appKey); | ||
state.appKey = appKey; | ||
@@ -283,3 +233,3 @@ outcomes = {}; | ||
_a.trys.push([1, 3, , 4]); | ||
return [4, http("GET", outcomesUrl(appKey))]; | ||
return [4, util_1.http("GET", outcomesUrl(appKey))]; | ||
case 2: | ||
@@ -290,6 +240,6 @@ outcomes = _a.sent(); | ||
e_2 = _a.sent(); | ||
log("ERROR getting outcomes", e_2); | ||
util_1.log("ERROR getting outcomes", e_2); | ||
return [3, 4]; | ||
case 4: | ||
log("Got outcomes", outcomes); | ||
util_1.log("Got outcomes", outcomes); | ||
Object.getOwnPropertyNames(outcomes).forEach(function (name) { | ||
@@ -323,3 +273,3 @@ if (state.experiments[name] !== undefined) | ||
this.epsilon = epsilon; | ||
this.key = uuidv4(); | ||
this.key = util_1.uuidv4(); | ||
} | ||
@@ -398,3 +348,64 @@ Experiment.prototype.setValueAndStartExperiment = function (value) { | ||
},{"./html":1}]},{},[1,2])(2) | ||
},{"./html":1,"./util":3}],3:[function(require,module,exports){ | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var DEBUG = true; | ||
function uuidv4() { | ||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { | ||
var r = (Math.random() * 16) | 0; | ||
var v = c == "x" ? r : (r & 0x3) | 0x8; | ||
return v.toString(16); | ||
}); | ||
} | ||
exports.uuidv4 = uuidv4; | ||
function log() { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
} | ||
if (DEBUG) { | ||
console.log.apply(console, ["AUTOTUNE"].concat(args)); | ||
} | ||
} | ||
exports.log = log; | ||
function getOwnPropertyValues(x) { | ||
return Object.getOwnPropertyNames(x).map(function (n) { return x[n]; }); | ||
} | ||
exports.getOwnPropertyValues = getOwnPropertyValues; | ||
function mapObject(x, f) { | ||
var result = {}; | ||
Object.getOwnPropertyNames(x).forEach(function (n) { return (result[n] = f(x[n], n)); }); | ||
return result; | ||
} | ||
exports.mapObject = mapObject; | ||
function http(method, url, data) { | ||
if (data === void 0) { data = undefined; } | ||
return new Promise(function (resolve, reject) { | ||
if (typeof XMLHttpRequest === "undefined") { | ||
return reject("Not running in browser"); | ||
} | ||
var request = new XMLHttpRequest(); | ||
request.open(method, url, true); | ||
request.setRequestHeader("Content-Type", "application/json"); | ||
request.onerror = function () { return reject(request.statusText); }; | ||
request.onreadystatechange = function () { | ||
if (request.readyState == 4) | ||
if (request.status == 200) { | ||
resolve(JSON.parse(request.responseText)); | ||
} | ||
else { | ||
reject("Request failed with status " + request.status); | ||
} | ||
}; | ||
if (data !== undefined) { | ||
request.send(JSON.stringify(data)); | ||
} | ||
else { | ||
request.send(); | ||
} | ||
}); | ||
} | ||
exports.http = http; | ||
},{}]},{},[1,2,3])(3) | ||
}); |
@@ -1,1 +0,1 @@ | ||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).autotune=e()}}(function(){return function i(u,a,s){function p(t,e){if(!a[t]){if(!u[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=a[t]={exports:{}};u[t][0].call(o.exports,function(e){return p(u[t][1][e]||e)},o,o.exports,i,u,a,s)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e<s.length;e++)p(s[e]);return p}({1:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var u=e(".");function p(e){for(var t=0,n=0;n<e.length;n++){t=(t<<5)-t+e.charCodeAt(n),t&=t}return t}function c(e){return e.getAttribute("option")||p(e.outerHTML).toString()}n.startHTMLExperiments=function(){var i=function(){for(var e={},t=document.querySelectorAll("[data-experiment]"),n=0;n<t.length;n++){var r=t.item(n),o=r.getAttribute("data-experiment"),i=r.getAttribute("data-option"),u=e[o];void 0===u&&(u=e[o]={options:[],nodes:[]}),-1===u.options.indexOf(i)&&u.options.push(i),u.nodes.push(r)}return e}(),n=function(){for(var e={},t=document.getElementsByTagName("autotune"),n=0;n<t.length;n++){for(var r=t.item(n),o=r.getAttribute("experiment")||p(r.innerHTML).toString(),i={node:r,options:[]},u=0;u<r.children.length;u++){var a=r.children.item(u);i.options.push(c(a))}var s=e[o]||[];s.push(i),e[o]=s}return e}();Object.getOwnPropertyNames(i).forEach(function(e){var t=i[e],n=t.options,r=t.nodes,o=u.oneOf(e,n);r.forEach(function(e){e.getAttribute("data-option")!==o&&e.remove()})}),Object.getOwnPropertyNames(n).forEach(function(e){var t={};n[e].forEach(function(e){e.options.forEach(function(e){return t[e]=null})});var o=u.oneOf(e,Object.getOwnPropertyNames(t));n[e].forEach(function(e){for(var t=e.node.children,n=0;n<t.length;n++){var r=t.item(n);c(r)!==o&&r.remove()}})})}},{".":2}],2:[function(e,t,n){"use strict";var r=this&&this.__awaiter||function(i,u,a,s){return new(a||(a=Promise))(function(e,t){function n(e){try{o(s.next(e))}catch(e){t(e)}}function r(e){try{o(s.throw(e))}catch(e){t(e)}}function o(t){t.done?e(t.value):new a(function(e){e(t.value)}).then(n,r)}o((s=s.apply(i,u||[])).next())})},i=this&&this.__generator||function(n,r){var o,i,u,e,a={label:0,sent:function(){if(1&u[0])throw u[1];return u[1]},trys:[],ops:[]};return e={next:t(0),throw:t(1),return:t(2)},"function"==typeof Symbol&&(e[Symbol.iterator]=function(){return this}),e;function t(t){return function(e){return function(t){if(o)throw new TypeError("Generator is already executing.");for(;a;)try{if(o=1,i&&(u=i[2&t[0]?"return":t[0]?"throw":"next"])&&!(u=u.call(i,t[1])).done)return u;switch(i=0,u&&(t=[0,u.value]),t[0]){case 0:case 1:u=t;break;case 4:return a.label++,{value:t[1],done:!1};case 5:a.label++,i=t[1],t=[0];continue;case 7:t=a.ops.pop(),a.trys.pop();continue;default:if(!(u=0<(u=a.trys).length&&u[u.length-1])&&(6===t[0]||2===t[0])){a=0;continue}if(3===t[0]&&(!u||t[1]>u[0]&&t[1]<u[3])){a.label=t[1];break}if(6===t[0]&&a.label<u[1]){a.label=u[1],u=t;break}if(u&&a.label<u[2]){a.label=u[2],a.ops.push(t);break}u[2]&&a.ops.pop(),a.trys.pop();continue}t=r.call(n,a)}catch(e){t=[6,e],i=0}finally{o=u=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}([t,e])}}};Object.defineProperty(n,"__esModule",{value:!0});var u=e("./html");var o=!0;function a(e){return"https://2vyiuehl9j.execute-api.us-east-2.amazonaws.com/prod/"+e}var s={appKey:"",experiments:{},defaultCompletions:{},queuedCompletedExperiments:{},queuedStartedExperiments:{}};function p(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o&&console.log.apply(console,["AUTOTUNE"].concat(e))}function c(e){var t=this;void 0!==s.startExperimentsTimer&&(clearTimeout(s.startExperimentsTimer),s.startExperimentsTimer=void 0),s.queuedStartedExperiments[e.name]=e,s.startExperimentsTimer=setTimeout(function(){return r(t,void 0,void 0,function(){var o;return i(this,function(e){var t,n,r;t=s.queuedStartedExperiments,n=function(e){return{instanceKey:e.key,options:e.options,pick:e.pick}},r={},Object.getOwnPropertyNames(t).forEach(function(e){return r[e]=n(t[e],e)}),p("Starting experiments",o=r),s.queuedStartedExperiments={},s.startExperimentsTimer=void 0;try{l("POST",a("/startExperiments"),{appKey:s.appKey,experiments:o})}catch(e){return p("Failed to start experiments",e),[2]}return[2]})})},100)}function f(e,o){var t=this;void 0!==s.completeExperimentsTimer&&(clearTimeout(s.completeExperimentsTimer),s.completeExperimentsTimer=void 0),s.queuedCompletedExperiments[e.name]=e,s.completeExperimentsTimer=setTimeout(function(){return r(t,void 0,void 0,function(){var n,r;return i(this,function(e){switch(e.label){case 0:t=s.queuedCompletedExperiments,n=Object.getOwnPropertyNames(t).map(function(e){return t[e]}),s.queuedCompletedExperiments={},s.completeExperimentsTimer=void 0,r={},n.forEach(function(e){return r[e.key]={pick:e.pick,payoff:e.payoff}}),p("Completing experiments",r),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,l("POST",a("/completeExperiments"),{appKey:s.appKey,experiments:r})];case 2:return e.sent(),[3,5];case 3:return p("Failed to complete experiments",e.sent()),[3,5];case 4:return void 0!==o&&o(),[7];case 5:return[2]}var t})})},10)}function l(r,o,i){return void 0===i&&(i=void 0),new Promise(function(e,t){if("undefined"==typeof XMLHttpRequest)return t("Not running in browser");var n=new XMLHttpRequest;n.open(r,o,!0),n.setRequestHeader("Content-Type","application/json"),n.onerror=function(){return t(n.statusText)},n.onreadystatechange=function(){4==n.readyState&&(200==n.status?e(JSON.parse(n.responseText)):t("Request failed with status "+n.status))},void 0!==i?n.send(JSON.stringify(i)):n.send()})}function m(e){var t=s.experiments[e];return void 0===t&&(t=s.experiments[e]=new d(e)),t}n.initialize=function(n){return r(this,void 0,void 0,function(){var o;return i(this,function(e){switch(e.label){case 0:p("Initialize",n),s.appKey=n,o={},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,l("GET",(t=n,"https://s3.us-east-2.amazonaws.com/autotune-outcomes/"+t+".json"))];case 2:return o=e.sent(),[3,4];case 3:return p("ERROR getting outcomes",e.sent()),[3,4];case 4:return p("Got outcomes",o),Object.getOwnPropertyNames(o).forEach(function(e){if(void 0===s.experiments[e]){var t=o[e],n=t.bestOption,r=t.epsilon;s.experiments[e]=new d(e,n,r)}}),u.startHTMLExperiments(),[2,{}]}var t})})},n.experiment=m;var d=function(){function e(e,t,n){void 0===t&&(t=void 0),void 0===n&&(n=1),this.name=e,this.bestOption=t,this.epsilon=n,this.key="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)})}return e.prototype.setValueAndStartExperiment=function(e){return void 0===this.pick&&(this.pick=e,c(this)),this.pick},e.prototype.complete=function(t,n){return void 0===t&&(t=1),r(this,void 0,void 0,function(){return i(this,function(e){return this.payoff=t,f(this,n),[2]})})},e.prototype.flipCoin=function(){return"true"===this.oneOf("true","false")},e.prototype.oneOf=function(){for(var e,t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return this.options=t,e=void 0===this.bestOption||Math.random()<this.epsilon?t[Math.floor(Math.random()*t.length)]:this.bestOption,this.setValueAndStartExperiment(e)},e}();n.Experiment=d,n.flipCoin=function(e){var t=m(e);return(s.defaultCompletions[e]=t).flipCoin()},n.oneOf=function(e,t){var n=m(e);return(s.defaultCompletions[e]=n).oneOf.apply(n,t)},n.complete=function(e,t){var n,r;n="number"==typeof e?e:1,r="function"==typeof e?e:t;var o=s.defaultCompletions;Object.getOwnPropertyNames(o).forEach(function(e){return o[e].complete(n,r)})}},{"./html":1}]},{},[1,2])(2)}); | ||
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).autotune=e()}}(function(){return function i(u,a,s){function p(t,e){if(!a[t]){if(!u[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var o=a[t]={exports:{}};u[t][0].call(o.exports,function(e){return p(u[t][1][e]||e)},o,o.exports,i,u,a,s)}return a[t].exports}for(var c="function"==typeof require&&require,e=0;e<s.length;e++)p(s[e]);return p}({1:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var u=e(".");function p(e){for(var t=0,n=0;n<e.length;n++){t=(t<<5)-t+e.charCodeAt(n),t&=t}return t}function c(e){return e.getAttribute("option")||p(e.outerHTML).toString()}n.startHTMLExperiments=function(){var i=function(){for(var e={},t=document.querySelectorAll("[data-experiment]"),n=0;n<t.length;n++){var r=t.item(n),o=r.getAttribute("data-experiment"),i=r.getAttribute("data-option"),u=e[o];void 0===u&&(u=e[o]={options:[],nodes:[]}),-1===u.options.indexOf(i)&&u.options.push(i),u.nodes.push(r)}return e}(),n=function(){for(var e={},t=document.getElementsByTagName("autotune"),n=0;n<t.length;n++){for(var r=t.item(n),o=r.getAttribute("experiment")||p(r.innerHTML).toString(),i={node:r,options:[]},u=0;u<r.children.length;u++){var a=r.children.item(u);i.options.push(c(a))}var s=e[o]||[];s.push(i),e[o]=s}return e}();Object.getOwnPropertyNames(i).forEach(function(e){var t=i[e],n=t.options,r=t.nodes,o=u.oneOf(e,n);r.forEach(function(e){e.getAttribute("data-option")!==o&&e.remove()})}),Object.getOwnPropertyNames(n).forEach(function(e){var t={};n[e].forEach(function(e){e.options.forEach(function(e){return t[e]=null})});var o=u.oneOf(e,Object.getOwnPropertyNames(t));n[e].forEach(function(e){for(var t=e.node.children,n=0;n<t.length;n++){var r=t.item(n);c(r)!==o&&r.remove()}})})}},{".":2}],2:[function(e,t,n){"use strict";var i=this&&this.__awaiter||function(i,u,a,s){return new(a||(a=Promise))(function(e,t){function n(e){try{o(s.next(e))}catch(e){t(e)}}function r(e){try{o(s.throw(e))}catch(e){t(e)}}function o(t){t.done?e(t.value):new a(function(e){e(t.value)}).then(n,r)}o((s=s.apply(i,u||[])).next())})},u=this&&this.__generator||function(n,r){var o,i,u,e,a={label:0,sent:function(){if(1&u[0])throw u[1];return u[1]},trys:[],ops:[]};return e={next:t(0),throw:t(1),return:t(2)},"function"==typeof Symbol&&(e[Symbol.iterator]=function(){return this}),e;function t(t){return function(e){return function(t){if(o)throw new TypeError("Generator is already executing.");for(;a;)try{if(o=1,i&&(u=i[2&t[0]?"return":t[0]?"throw":"next"])&&!(u=u.call(i,t[1])).done)return u;switch(i=0,u&&(t=[0,u.value]),t[0]){case 0:case 1:u=t;break;case 4:return a.label++,{value:t[1],done:!1};case 5:a.label++,i=t[1],t=[0];continue;case 7:t=a.ops.pop(),a.trys.pop();continue;default:if(!(u=0<(u=a.trys).length&&u[u.length-1])&&(6===t[0]||2===t[0])){a=0;continue}if(3===t[0]&&(!u||t[1]>u[0]&&t[1]<u[3])){a.label=t[1];break}if(6===t[0]&&a.label<u[1]){a.label=u[1],u=t;break}if(u&&a.label<u[2]){a.label=u[2],a.ops.push(t);break}u[2]&&a.ops.pop(),a.trys.pop();continue}t=r.call(n,a)}catch(e){t=[6,e],i=0}finally{o=u=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}([t,e])}}};Object.defineProperty(n,"__esModule",{value:!0});var a=e("./html"),s=e("./util");function p(e){return"https://2vyiuehl9j.execute-api.us-east-2.amazonaws.com/prod/"+e}var c={appKey:"",experiments:{},defaultCompletions:{},queuedCompletedExperiments:{},queuedStartedExperiments:{}};function r(e){var t=c.experiments[e];return void 0===t&&(t=c.experiments[e]=new f(e)),t}n.initialize=function(r){return i(this,void 0,void 0,function(){var o,n;return u(this,function(e){switch(e.label){case 0:s.log("Initialize",r),c.appKey=r,o={},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.http("GET",(t=r,"https://s3.us-east-2.amazonaws.com/autotune-outcomes/"+t+".json"))];case 2:return o=e.sent(),[3,4];case 3:return n=e.sent(),s.log("ERROR getting outcomes",n),[3,4];case 4:return s.log("Got outcomes",o),Object.getOwnPropertyNames(o).forEach(function(e){if(void 0===c.experiments[e]){var t=o[e],n=t.bestOption,r=t.epsilon;c.experiments[e]=new f(e,n,r)}}),a.startHTMLExperiments(),[2,{}]}var t})})},n.experiment=r;var f=function(){function e(e,t,n){void 0===t&&(t=void 0),void 0===n&&(n=1),this.name=e,this.bestOption=t,this.epsilon=n,this.key=s.uuidv4()}return e.prototype.setValueAndStartExperiment=function(e){return void 0===this.pick&&(this.pick=e,function(e){var t=this;void 0!==c.startExperimentsTimer&&(clearTimeout(c.startExperimentsTimer),c.startExperimentsTimer=void 0),c.queuedStartedExperiments[e.name]=e,c.startExperimentsTimer=setTimeout(function(){return i(t,void 0,void 0,function(){var t;return u(this,function(e){t=s.mapObject(c.queuedStartedExperiments,function(e){return{instanceKey:e.key,options:e.options,pick:e.pick}}),s.log("Starting experiments",t),c.queuedStartedExperiments={},c.startExperimentsTimer=void 0;try{s.http("POST",p("/startExperiments"),{appKey:c.appKey,experiments:t})}catch(e){return s.log("Failed to start experiments",e),[2]}return[2]})})},100)}(this)),this.pick},e.prototype.complete=function(t,n){return void 0===t&&(t=1),i(this,void 0,void 0,function(){return u(this,function(e){return this.payoff=t,function(e,o){var t=this;void 0!==c.completeExperimentsTimer&&(clearTimeout(c.completeExperimentsTimer),c.completeExperimentsTimer=void 0),c.queuedCompletedExperiments[e.name]=e,c.completeExperimentsTimer=setTimeout(function(){return i(t,void 0,void 0,function(){var t,n,r;return u(this,function(e){switch(e.label){case 0:t=s.getOwnPropertyValues(c.queuedCompletedExperiments),c.queuedCompletedExperiments={},c.completeExperimentsTimer=void 0,n={},t.forEach(function(e){return n[e.key]={pick:e.pick,payoff:e.payoff}}),s.log("Completing experiments",n),e.label=1;case 1:return e.trys.push([1,3,4,5]),[4,s.http("POST",p("/completeExperiments"),{appKey:c.appKey,experiments:n})];case 2:return e.sent(),[3,5];case 3:return r=e.sent(),s.log("Failed to complete experiments",r),[3,5];case 4:return void 0!==o&&o(),[7];case 5:return[2]}})})},10)}(this,n),[2]})})},e.prototype.flipCoin=function(){return"true"===this.oneOf("true","false")},e.prototype.oneOf=function(){for(var e,t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return this.options=t,e=void 0===this.bestOption||Math.random()<this.epsilon?t[Math.floor(Math.random()*t.length)]:this.bestOption,this.setValueAndStartExperiment(e)},e}();n.Experiment=f,n.flipCoin=function(e){var t=r(e);return(c.defaultCompletions[e]=t).flipCoin()},n.oneOf=function(e,t){var n=r(e);return(c.defaultCompletions[e]=n).oneOf.apply(n,t)},n.complete=function(e,t){var n,r;n="number"==typeof e?e:1,r="function"==typeof e?e:t;var o=c.defaultCompletions;Object.getOwnPropertyNames(o).forEach(function(e){return o[e].complete(n,r)})}},{"./html":1,"./util":3}],3:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});n.uuidv4=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)})},n.log=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];console.log.apply(console,["AUTOTUNE"].concat(e))},n.getOwnPropertyValues=function(t){return Object.getOwnPropertyNames(t).map(function(e){return t[e]})},n.mapObject=function(t,n){var r={};return Object.getOwnPropertyNames(t).forEach(function(e){return r[e]=n(t[e],e)}),r},n.http=function(r,o,i){return void 0===i&&(i=void 0),new Promise(function(e,t){if("undefined"==typeof XMLHttpRequest)return t("Not running in browser");var n=new XMLHttpRequest;n.open(r,o,!0),n.setRequestHeader("Content-Type","application/json"),n.onerror=function(){return t(n.statusText)},n.onreadystatechange=function(){4==n.readyState&&(200==n.status?e(JSON.parse(n.responseText)):t("Request failed with status "+n.status))},void 0!==i?n.send(JSON.stringify(i)):n.send()})}},{}]},{},[1,2,3])(3)}); |
@@ -39,9 +39,3 @@ "use strict"; | ||
var html_1 = require("./html"); | ||
function uuidv4() { | ||
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { | ||
var r = (Math.random() * 16) | 0, v = c == "x" ? r : (r & 0x3) | 0x8; | ||
return v.toString(16); | ||
}); | ||
} | ||
var DEBUG = true; | ||
var util_1 = require("./util"); | ||
function api(path) { | ||
@@ -60,19 +54,2 @@ return "https://2vyiuehl9j.execute-api.us-east-2.amazonaws.com/prod/" + path; | ||
}; | ||
function log() { | ||
var args = []; | ||
for (var _i = 0; _i < arguments.length; _i++) { | ||
args[_i] = arguments[_i]; | ||
} | ||
if (DEBUG) { | ||
console.log.apply(console, ["AUTOTUNE"].concat(args)); | ||
} | ||
} | ||
function getOwnPropertyValues(x) { | ||
return Object.getOwnPropertyNames(x).map(function (n) { return x[n]; }); | ||
} | ||
function mapObject(x, f) { | ||
var result = {}; | ||
Object.getOwnPropertyNames(x).forEach(function (n) { return (result[n] = f(x[n], n)); }); | ||
return result; | ||
} | ||
function startExperiment(experiment) { | ||
@@ -88,3 +65,3 @@ var _this = this; | ||
return __generator(this, function (_a) { | ||
experiments = mapObject(state.queuedStartedExperiments, function (e) { return ({ | ||
experiments = util_1.mapObject(state.queuedStartedExperiments, function (e) { return ({ | ||
instanceKey: e.key, | ||
@@ -94,7 +71,7 @@ options: e.options, | ||
}); }); | ||
log("Starting experiments", experiments); | ||
util_1.log("Starting experiments", experiments); | ||
state.queuedStartedExperiments = {}; | ||
state.startExperimentsTimer = undefined; | ||
try { | ||
http("POST", api("/startExperiments"), { | ||
util_1.http("POST", api("/startExperiments"), { | ||
appKey: state.appKey, | ||
@@ -105,3 +82,3 @@ experiments: experiments | ||
catch (e) { | ||
log("Failed to start experiments", e); | ||
util_1.log("Failed to start experiments", e); | ||
return [2]; | ||
@@ -125,3 +102,3 @@ } | ||
case 0: | ||
experiments = getOwnPropertyValues(state.queuedCompletedExperiments); | ||
experiments = util_1.getOwnPropertyValues(state.queuedCompletedExperiments); | ||
state.queuedCompletedExperiments = {}; | ||
@@ -131,7 +108,7 @@ state.completeExperimentsTimer = undefined; | ||
experiments.forEach(function (e) { return (experimentsByKey[e.key] = { pick: e.pick, payoff: e.payoff }); }); | ||
log("Completing experiments", experimentsByKey); | ||
util_1.log("Completing experiments", experimentsByKey); | ||
_a.label = 1; | ||
case 1: | ||
_a.trys.push([1, 3, 4, 5]); | ||
return [4, http("POST", api("/completeExperiments"), { | ||
return [4, util_1.http("POST", api("/completeExperiments"), { | ||
appKey: state.appKey, | ||
@@ -145,3 +122,3 @@ experiments: experimentsByKey | ||
e_1 = _a.sent(); | ||
log("Failed to complete experiments", e_1); | ||
util_1.log("Failed to complete experiments", e_1); | ||
return [3, 5]; | ||
@@ -158,29 +135,2 @@ case 4: | ||
} | ||
function http(method, url, data) { | ||
if (data === void 0) { data = undefined; } | ||
return new Promise(function (resolve, reject) { | ||
if (typeof XMLHttpRequest === "undefined") { | ||
return reject("Not running in browser"); | ||
} | ||
var request = new XMLHttpRequest(); | ||
request.open(method, url, true); | ||
request.setRequestHeader("Content-Type", "application/json"); | ||
request.onerror = function () { return reject(request.statusText); }; | ||
request.onreadystatechange = function () { | ||
if (request.readyState == 4) | ||
if (request.status == 200) { | ||
resolve(JSON.parse(request.responseText)); | ||
} | ||
else { | ||
reject("Request failed with status " + request.status); | ||
} | ||
}; | ||
if (data !== undefined) { | ||
request.send(JSON.stringify(data)); | ||
} | ||
else { | ||
request.send(); | ||
} | ||
}); | ||
} | ||
function initialize(appKey) { | ||
@@ -192,3 +142,3 @@ return __awaiter(this, void 0, void 0, function () { | ||
case 0: | ||
log("Initialize", appKey); | ||
util_1.log("Initialize", appKey); | ||
state.appKey = appKey; | ||
@@ -199,3 +149,3 @@ outcomes = {}; | ||
_a.trys.push([1, 3, , 4]); | ||
return [4, http("GET", outcomesUrl(appKey))]; | ||
return [4, util_1.http("GET", outcomesUrl(appKey))]; | ||
case 2: | ||
@@ -206,6 +156,6 @@ outcomes = _a.sent(); | ||
e_2 = _a.sent(); | ||
log("ERROR getting outcomes", e_2); | ||
util_1.log("ERROR getting outcomes", e_2); | ||
return [3, 4]; | ||
case 4: | ||
log("Got outcomes", outcomes); | ||
util_1.log("Got outcomes", outcomes); | ||
Object.getOwnPropertyNames(outcomes).forEach(function (name) { | ||
@@ -239,3 +189,3 @@ if (state.experiments[name] !== undefined) | ||
this.epsilon = epsilon; | ||
this.key = uuidv4(); | ||
this.key = util_1.uuidv4(); | ||
} | ||
@@ -242,0 +192,0 @@ Experiment.prototype.setValueAndStartExperiment = function (value) { |
{ | ||
"name": "autotune", | ||
"version": "0.0.29", | ||
"version": "1.0.0", | ||
"description": "Automatically tune JavaScript apps", | ||
@@ -9,3 +9,4 @@ "main": "dist/index.js", | ||
"scripts": { | ||
"browserify": "browserify dist/*.js --standalone autotune -o dist/index.browser.js && uglifyjs dist/index.browser.js --compress --mangle -o dist/index.browser.min.js", | ||
"browserify": | ||
"browserify dist/*.js --standalone autotune -o dist/index.browser.js && uglifyjs dist/index.browser.js --compress --mangle -o dist/index.browser.min.js", | ||
"build": "rm -rf dist && tsc -p tsconfig.json && npm run browserify", | ||
@@ -40,2 +41,2 @@ "bump-version": "ts-node scripts/patch-npm-version.ts", | ||
} | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
68417
13
820
2