Source

lib/horizon/trade_aggregation_call_builder.js

  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.TradeAggregationCallBuilder = void 0;
  6. var _call_builder = require("./call_builder");
  7. var _errors = require("../errors");
  8. /* tslint:disable: variable-name */
  9. const allowedResolutions = [60000, 300000, 900000, 3600000, 86400000, 604800000];
  10. /**
  11. * Trade Aggregations facilitate efficient gathering of historical trade data.
  12. *
  13. * Do not create this object directly, use {@link Horizon.Server#tradeAggregation}.
  14. *
  15. * @augments CallBuilder
  16. * @private
  17. * @class
  18. *
  19. * @param {string} serverUrl serverUrl Horizon server URL.
  20. * @param {Asset} base base asset
  21. * @param {Asset} counter counter asset
  22. * @param {number} start_time lower time boundary represented as millis since epoch
  23. * @param {number} end_time upper time boundary represented as millis since epoch
  24. * @param {number} resolution segment duration as millis since epoch. *Supported values are 1 minute (60000), 5 minutes (300000), 15 minutes (900000), 1 hour (3600000), 1 day (86400000) and 1 week (604800000).
  25. * @param {number} offset segments can be offset using this parameter. Expressed in milliseconds. *Can only be used if the resolution is greater than 1 hour. Value must be in whole hours, less than the provided resolution, and less than 24 hours.
  26. */
  27. class TradeAggregationCallBuilder extends _call_builder.CallBuilder {
  28. constructor(serverUrl, base, counter, start_time, end_time, resolution, offset) {
  29. super(serverUrl);
  30. this.url.segment("trade_aggregations");
  31. if (!base.isNative()) {
  32. this.url.setQuery("base_asset_type", base.getAssetType());
  33. this.url.setQuery("base_asset_code", base.getCode());
  34. this.url.setQuery("base_asset_issuer", base.getIssuer());
  35. } else {
  36. this.url.setQuery("base_asset_type", "native");
  37. }
  38. if (!counter.isNative()) {
  39. this.url.setQuery("counter_asset_type", counter.getAssetType());
  40. this.url.setQuery("counter_asset_code", counter.getCode());
  41. this.url.setQuery("counter_asset_issuer", counter.getIssuer());
  42. } else {
  43. this.url.setQuery("counter_asset_type", "native");
  44. }
  45. if (typeof start_time !== "number" || typeof end_time !== "number") {
  46. throw new _errors.BadRequestError("Invalid time bounds", [start_time, end_time]);
  47. } else {
  48. this.url.setQuery("start_time", start_time.toString());
  49. this.url.setQuery("end_time", end_time.toString());
  50. }
  51. if (!this.isValidResolution(resolution)) {
  52. throw new _errors.BadRequestError("Invalid resolution", resolution);
  53. } else {
  54. this.url.setQuery("resolution", resolution.toString());
  55. }
  56. if (!this.isValidOffset(offset, resolution)) {
  57. throw new _errors.BadRequestError("Invalid offset", offset);
  58. } else {
  59. this.url.setQuery("offset", offset.toString());
  60. }
  61. }
  62. /**
  63. * @private
  64. * @param {number} resolution Trade data resolution in milliseconds
  65. * @returns {boolean} true if the resolution is allowed
  66. */
  67. isValidResolution(resolution) {
  68. return allowedResolutions.some(allowed => allowed === resolution);
  69. }
  70. /**
  71. * @private
  72. * @param {number} offset Time offset in milliseconds
  73. * @param {number} resolution Trade data resolution in milliseconds
  74. * @returns {boolean} true if the offset is valid
  75. */
  76. isValidOffset(offset, resolution) {
  77. const hour = 3600000;
  78. return !(offset > resolution || offset >= 24 * hour || offset % hour !== 0);
  79. }
  80. }
  81. exports.TradeAggregationCallBuilder = TradeAggregationCallBuilder;