@barchart/portfolio-client-js 1.3.17 → 1.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2000,7 +2000,8 @@ module.exports = (() => {
2000
2000
  this._started = false;
2001
2001
  this._startPromise = null;
2002
2002
  this._endpoint = endpoint;
2003
- this._refreshInterval = refreshInterval || null;
2003
+ this._refreshInterval = refreshInterval || 0;
2004
+ this._refreshJitter = Math.floor(this._refreshInterval / 10);
2004
2005
  }
2005
2006
  /**
2006
2007
  * Initializes the connection to the remote server and returns a promise
@@ -2055,42 +2056,26 @@ module.exports = (() => {
2055
2056
 
2056
2057
  toRequestInterceptor() {
2057
2058
  const scheduler = new Scheduler();
2058
- let cachePromise = null;
2059
- let cacheDisposable = null;
2059
+ let refreshPromise = null;
2060
+ let refreshTime = null;
2060
2061
 
2061
2062
  const refreshToken = () => {
2062
- const refreshPromise = scheduler.backoff(() => this.readToken(), 750, 'Read JWT token', 3).then(token => {
2063
- if (this._refreshInterval) {
2064
- cachePromise = refreshPromise;
2065
-
2066
- if (cacheDisposable === null) {
2067
- cacheDisposable = scheduler.repeat(() => refreshToken(), this._refreshInterval, 'Refresh JWT token');
2068
- }
2069
- }
2070
-
2071
- return token;
2072
- }).catch(e => {
2073
- if (cacheDisposable !== null) {
2074
- cacheDisposable.dispose();
2075
- cacheDisposable = null;
2076
- cachePromise = null;
2077
- }
2063
+ if (refreshPromise === null || this._refreshInterval > 0 && refreshTime !== null && getTime() > refreshTime + this._refreshInterval + this._refreshJitter) {
2064
+ refreshPromise = scheduler.backoff(() => this.readToken(), 750, 'Read JWT token', 3).then(token => {
2065
+ refreshTime = getTime();
2066
+ return token;
2067
+ }).catch(e => {
2068
+ refreshPromise = null;
2069
+ refreshTime = null;
2070
+ return Promise.reject(e);
2071
+ });
2072
+ }
2078
2073
 
2079
- return Promise.reject(e);
2080
- });
2081
2074
  return refreshPromise;
2082
2075
  };
2083
2076
 
2084
2077
  const delegate = (options, endpoint) => {
2085
- let tokenPromise;
2086
-
2087
- if (cachePromise !== null) {
2088
- tokenPromise = cachePromise;
2089
- } else {
2090
- tokenPromise = refreshToken();
2091
- }
2092
-
2093
- return tokenPromise.then(token => {
2078
+ return refreshToken().then(token => {
2094
2079
  options.headers = options.headers || {};
2095
2080
  options.headers.Authorization = `Bearer ${token}`;
2096
2081
  return options;
@@ -2277,6 +2262,10 @@ module.exports = (() => {
2277
2262
  }
2278
2263
  }
2279
2264
 
2265
+ function getTime() {
2266
+ return new Date().getTime();
2267
+ }
2268
+
2280
2269
  function forDevelopment(userId, legacyUserId) {
2281
2270
  return EndpointBuilder.for('read-jwt-token-for-development', 'lookup user identity').withVerb(VerbType.GET).withProtocol(ProtocolType.HTTPS).withHost(Configuration.developmentHost).withPathBuilder(pb => {
2282
2271
  pb.withLiteralParameter('token', 'token').withLiteralParameter('barchart', 'barchart').withLiteralParameter('generator', 'generator');
@@ -2334,7 +2323,7 @@ module.exports = (() => {
2334
2323
  return {
2335
2324
  JwtGateway: JwtGateway,
2336
2325
  PortfolioGateway: PortfolioGateway,
2337
- version: '1.3.17'
2326
+ version: '1.3.18'
2338
2327
  };
2339
2328
  })();
2340
2329
 
@@ -37,7 +37,9 @@ module.exports = (() => {
37
37
  this._startPromise = null;
38
38
 
39
39
  this._endpoint = endpoint;
40
- this._refreshInterval = refreshInterval || null;
40
+
41
+ this._refreshInterval = refreshInterval || 0;
42
+ this._refreshJitter = Math.floor(this._refreshInterval / 10);
41
43
  }
42
44
 
43
45
  /**
@@ -97,56 +99,41 @@ module.exports = (() => {
97
99
  toRequestInterceptor() {
98
100
  const scheduler = new Scheduler();
99
101
 
100
- let cachePromise = null;
101
- let cacheDisposable = null;
102
+ let refreshPromise = null;
103
+ let refreshTime = null;
102
104
 
103
105
  const refreshToken = () => {
104
- const refreshPromise = scheduler.backoff(() => this.readToken(), 750, 'Read JWT token', 3)
105
- .then((token) => {
106
- if (this._refreshInterval) {
107
- cachePromise = refreshPromise;
108
-
109
- if (cacheDisposable === null) {
110
- cacheDisposable = scheduler.repeat(() => refreshToken(), this._refreshInterval, 'Refresh JWT token');
111
- }
112
- }
113
-
114
- return token;
115
- }).catch((e) => {
116
- if (cacheDisposable !== null) {
117
- cacheDisposable.dispose();
118
-
119
- cacheDisposable = null;
120
- cachePromise = null;
121
- }
122
-
123
- return Promise.reject(e);
124
- });
106
+ if (refreshPromise === null || (this._refreshInterval > 0 && refreshTime !== null && getTime() > (refreshTime + this._refreshInterval + this._refreshJitter))) {
107
+ refreshPromise = scheduler.backoff(() => this.readToken(), 750, 'Read JWT token', 3)
108
+ .then((token) => {
109
+ refreshTime = getTime();
110
+
111
+ return token;
112
+ }).catch((e) => {
113
+ refreshPromise = null;
114
+ refreshTime = null;
115
+
116
+ return Promise.reject(e);
117
+ });
118
+ }
125
119
 
126
120
  return refreshPromise;
127
121
  };
128
122
 
129
123
  const delegate = (options, endpoint) => {
130
- let tokenPromise;
131
-
132
- if (cachePromise !== null) {
133
- tokenPromise = cachePromise;
134
- } else {
135
- tokenPromise = refreshToken();
136
- }
137
-
138
- return tokenPromise.then((token) => {
139
- options.headers = options.headers || { };
140
- options.headers.Authorization = `Bearer ${token}`;
124
+ return refreshToken()
125
+ .then((token) => {
126
+ options.headers = options.headers || { };
127
+ options.headers.Authorization = `Bearer ${token}`;
141
128
 
142
- return options;
143
- }).catch((e) => {
144
- const failure = FailureReason.forRequest({ endpoint: endpoint })
129
+ return options;
130
+ }).catch((e) => {
131
+ const failure = FailureReason.forRequest({ endpoint: endpoint })
145
132
  .addItem(FailureType.REQUEST_IDENTITY_FAILURE)
146
133
  .format();
147
134
 
148
- return Promise.reject(failure);
149
- });
135
+ return Promise.reject(failure);
136
+ });
150
137
  };
151
138
 
152
139
  return RequestInterceptor.fromDelegate(delegate);
@@ -319,6 +306,10 @@ module.exports = (() => {
319
306
  }
320
307
  }
321
308
 
309
+ function getTime() {
310
+ return (new Date()).getTime();
311
+ }
312
+
322
313
  function forDevelopment(userId, legacyUserId) {
323
314
  return EndpointBuilder.for('read-jwt-token-for-development', 'lookup user identity')
324
315
  .withVerb(VerbType.GET)
@@ -366,9 +357,9 @@ module.exports = (() => {
366
357
  })
367
358
  .withQueryBuilder((qb) => {
368
359
  qb.withLiteralParameter('user', 'userId', userId)
369
- .withLiteralParameter('legacy user', 'userLegacyId', userId)
370
- .withLiteralParameter('user context', 'userContext', 'Barchart')
371
- .withLiteralParameter('user permission level', 'userPermissions', 'registered');
360
+ .withLiteralParameter('legacy user', 'userLegacyId', userId)
361
+ .withLiteralParameter('user context', 'userContext', 'Barchart')
362
+ .withLiteralParameter('user permission level', 'userPermissions', 'registered');
372
363
  })
373
364
  .withResponseInterceptor(ResponseInterceptor.DATA)
374
365
  .endpoint;
package/lib/index.js CHANGED
@@ -7,6 +7,6 @@ module.exports = (() => {
7
7
  return {
8
8
  JwtGateway: JwtGateway,
9
9
  PortfolioGateway: PortfolioGateway,
10
- version: '1.3.17'
10
+ version: '1.3.18'
11
11
  };
12
12
  })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barchart/portfolio-client-js",
3
- "version": "1.3.17",
3
+ "version": "1.3.18",
4
4
  "description": "JavaScript library for interfacing with Barchart's Portfolio API",
5
5
  "author": {
6
6
  "name": "Bryan Ingle",