-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalc.js
63 lines (56 loc) · 2.03 KB
/
calc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// https://qiita.com/ara_tack/items/3386c59b59789f76b1e8#%E3%82%AF%E3%83%AC%E3%82%B8%E3%83%83%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E8%AA%B2%E9%87%91
// ram is GB unit
const ResourceClasses = {
"small": { cpu: 1, ram: 2, credit: 5 },
"medium": { cpu: 2, ram: 4, credit: 10 }, // default
"medium+": { cpu: 3, ram: 6, credit: 15 },
"large": { cpu: 4, ram: 8, credit: 20 },
"xlarge": { cpu: 8, ram: 16, credit: 40 },
"macos-large": { cpu: 4, ram: 8, credit: 50 },
};
const usDollerPerCredit = 0.0006; // $0.006 per 10 credits.
const usDollerPerAdditionalUser = 15;
const creditPerDLC = 200; // Docker layer caching
/**
* @typedef {Object} MinAndResClass
* @property {string} resClass
* @property {number} min
*/
/**
* @param {number} userSeats
* @param {number} dlc
* @param {Array.<MinAndResClass>} minAndResClasses
*/
function calc(userSeats, dlc, ...minAndResClasses) {
const ret = {
priceForUsers: 15, // $15/month for the first 3 users.
priceForDLC: 0,
pricesForUsage: [],
};
// Additional users times $15/month.
const additionalUsers = userSeats < 3 ? 0 : (userSeats - 3);
ret.priceForUsers += additionalUsers * usDollerPerAdditionalUser;
ret.priceForDLC += dlc * creditPerDLC * usDollerPerCredit;
for (let data of minAndResClasses) {
const credit = ResourceClasses[data.resClass].credit;
const usageBasedPrice = data.min * credit * usDollerPerCredit;
ret.pricesForUsage.push({ resClass: data.resClass, min: data.min, price: usageBasedPrice });
}
return ret;
}
/**
* @param {number} userSeats
* @param {number} dlc
* @param {Array.<MinAndResClass>} minAndResClasses
*/
function calcSum(userSeats, dlc, ...minAndResClasses) {
const ret = calc(userSeats, dlc, ...minAndResClasses);
let price = ret.priceForUsers + ret.priceForDLC;
price += ret.pricesForUsage.reduce((prev, current) => {
return prev += current.price;
}, 0);
return price;
}
module.exports = calcSum;
module.exports.calcSum = calcSum;
module.exports.calc = calc;