UNPKG

hc-sdk

Version:

hc-sdk is a library for working with the HuaChain Horizon server.

101 lines (94 loc) 3.41 kB
import { CallBuilder } from './call_builder'; import { BadRequestError } from './errors'; const allowedResolutions = [ 60000, 300000, 900000, 3600000, 86400000, 604800000 ]; /** * Trade Aggregations facilitate efficient gathering of historical trade data. * Do not create this object directly, use {@link Server#tradeAggregation}. * * @class TradeAggregationCallBuilder * @extends CallBuilder * @constructor * @param {string} serverUrl serverUrl Horizon server URL. * @param {Asset} base base asset * @param {Asset} counter counter asset * @param {long} start_time lower time boundary represented as millis since epoch * @param {long} end_time upper time boundary represented as millis since epoch * @param {long} 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). * @param {long} 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. */ export class TradeAggregationCallBuilder extends CallBuilder { constructor( serverUrl, base, counter, start_time, end_time, resolution, offset ) { super(serverUrl); this.url.segment('trade_aggregations'); if (!base.isNative()) { this.url.setQuery('base_asset_type', base.getAssetType()); this.url.setQuery('base_asset_code', base.getCode()); this.url.setQuery('base_asset_issuer', base.getIssuer()); } else { this.url.setQuery('base_asset_type', 'native'); } if (!counter.isNative()) { this.url.setQuery('counter_asset_type', counter.getAssetType()); this.url.setQuery('counter_asset_code', counter.getCode()); this.url.setQuery('counter_asset_issuer', counter.getIssuer()); } else { this.url.setQuery('counter_asset_type', 'native'); } if (typeof start_time === 'undefined' || typeof end_time === 'undefined') { throw new BadRequestError('Invalid time bounds', [start_time, end_time]); } else { this.url.setQuery('start_time', start_time); this.url.setQuery('end_time', end_time); } if (!this.isValidResolution(resolution)) { throw new BadRequestError('Invalid resolution', resolution); } else { this.url.setQuery('resolution', resolution); } if (!this.isValidOffset(offset, resolution)) { throw new BadRequestError('Invalid offset', offset); } else { this.url.setQuery('offset', offset); } } /** * @private * @param {long} resolution Trade data resolution in milliseconds * @returns {boolean} true if the resolution is allowed */ isValidResolution(resolution) { let found = false; for (let i = 0; i < allowedResolutions.length; i += 1) { if (allowedResolutions[i] === resolution) { found = true; break; } } return found; } /** * @private * @param {long} offset Time offset in milliseconds * @param {long} resolution Trade data resolution in milliseconds * @returns {boolean} true if the offset is valid */ isValidOffset(offset, resolution) { const hour = 3600000; return !(offset > resolution || offset >= 24 * hour || offset % hour !== 0); } }