@auxilium/datalynk-client 1.5.0 → 1.5.1

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.
package/README.md CHANGED
@@ -555,7 +555,7 @@ session.disconnect();
555
555
 
556
556
  </details>
557
557
 
558
- ## Request-owned API recovery (1.5.0)
558
+ ## Request-owned API recovery (1.5.1)
559
559
 
560
560
  When a request receives a server-side response failure (HTTP 5xx, malformed/non-JSON API response, or SQLSTATE error), the client now:
561
561
 
package/dist/api.d.ts CHANGED
@@ -47,6 +47,8 @@ export type ApiOptions = {
47
47
  origin?: string;
48
48
  /** Save session token to localStorage to persist logins */
49
49
  saveSession?: boolean;
50
+ /** Watch JWT expiry. This is always disabled on development hosts. */
51
+ watchTokenExpiry?: boolean;
50
52
  /** Service worker URL */
51
53
  serviceWorker?: string;
52
54
  /** Disable sockets with false or override socket URL */
@@ -149,6 +151,7 @@ export declare class Api {
149
151
  private readonly recoveryImmediateRetries;
150
152
  /** LocalStorage key for persisting logins */
151
153
  private localStorageKey;
154
+ private tokenStorageListener;
152
155
  /** Pending requests cache */
153
156
  private pending;
154
157
  /** Helpers */
@@ -260,6 +263,10 @@ export declare class Api {
260
263
  private cancelRecovery;
261
264
  private checkConnection;
262
265
  private isTokenExpired;
266
+ private isDevelopmentEnvironment;
267
+ private canAdoptToken;
268
+ /** Adopt a newer canonical token written by another auth path before expiring this session. */
269
+ private adoptStoredToken;
263
270
  private scheduleTokenExpiry;
264
271
  private markUnauthorized;
265
272
  private setConnectionStatus;
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -3229,7 +3229,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3229
3229
  } });
3230
3230
  }
3231
3231
  }
3232
- const version = "1.5.0";
3232
+ const version = "1.5.1";
3233
3233
  class WebRtc {
3234
3234
  constructor(api) {
3235
3235
  __publicField(this, "ice");
@@ -3784,6 +3784,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3784
3784
  __publicField(this, "recoveryImmediateRetries", 2);
3785
3785
  /** LocalStorage key for persisting logins */
3786
3786
  __publicField(this, "localStorageKey", "datalynk-token");
3787
+ __publicField(this, "tokenStorageListener", null);
3787
3788
  /** Pending requests cache */
3788
3789
  __publicField(this, "pending", {});
3789
3790
  /** Helpers */
@@ -3833,12 +3834,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3833
3834
  var _a, _b;
3834
3835
  this.origin = origin;
3835
3836
  this.url = `${new URL(origin).origin}/api/`;
3837
+ const development = this.isDevelopmentEnvironment(origin);
3836
3838
  this.options = {
3837
3839
  manifest: {},
3838
3840
  name: typeof document != "undefined" ? document.title : "Datalynk",
3839
3841
  offline: [],
3840
3842
  origin: typeof location !== "undefined" ? location.host : "Unknown",
3841
3843
  saveSession: true,
3844
+ watchTokenExpiry: true,
3842
3845
  serviceWorker: "/service.worker.mjs",
3843
3846
  ...options,
3844
3847
  webrtc: {
@@ -3848,14 +3851,28 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3848
3851
  ...options.webrtc || {}
3849
3852
  }
3850
3853
  };
3854
+ if (development) this.options.watchTokenExpiry = false;
3851
3855
  if (this.options.saveSession && typeof localStorage != "undefined") {
3852
3856
  this.token = localStorage.getItem(this.localStorageKey) || null;
3853
3857
  this.token$.pipe(distinctUntilChanged()).subscribe((token) => {
3854
3858
  if (token) localStorage.setItem(this.localStorageKey, token);
3855
3859
  else localStorage.removeItem(this.localStorageKey);
3856
3860
  });
3861
+ if (typeof window != "undefined") {
3862
+ this.tokenStorageListener = (event) => {
3863
+ if (event.storageArea === localStorage && event.key == null) {
3864
+ this.token = null;
3865
+ return;
3866
+ }
3867
+ if (event.key !== this.localStorageKey || event.newValue === this.token) return;
3868
+ if (event.newValue && this.canAdoptToken(event.newValue, this.token)) this.token = event.newValue;
3869
+ else if (event.newValue == null) this.token = null;
3870
+ };
3871
+ window.addEventListener("storage", this.tokenStorageListener);
3872
+ }
3857
3873
  }
3858
- this.token$.pipe(distinctUntilChanged()).subscribe((token) => this.scheduleTokenExpiry(token));
3874
+ if (this.options.watchTokenExpiry)
3875
+ this.token$.pipe(distinctUntilChanged()).subscribe((token) => this.scheduleTokenExpiry(token));
3859
3876
  this.socket = new Socket(this, { url: options.socket });
3860
3877
  this.gps = new Gps(this, options.gps);
3861
3878
  this.auth = new Auth(this);
@@ -3972,6 +3989,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3972
3989
  if (this.recovery && token !== this.recovery.token)
3973
3990
  this.cancelRecovery(errorFromCode(401, "Session changed during API recovery"));
3974
3991
  if (token && this.isTokenExpired(token)) {
3992
+ if (this.adoptStoredToken(token)) return;
3975
3993
  this.authenticationInvalid = true;
3976
3994
  this.token$.next(null);
3977
3995
  this.setConnectionStatus("unauthorized");
@@ -3980,7 +3998,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
3980
3998
  this.authenticationInvalid = false;
3981
3999
  this.token$.next(token);
3982
4000
  if (token && !this.online && !this.recovery) {
3983
- this.setConnectionStatus(typeof navigator == "undefined" || navigator.onLine ? "online" : "offline");
4001
+ const browserOnline = typeof navigator == "undefined" || typeof navigator.onLine == "undefined" || navigator.onLine;
4002
+ this.setConnectionStatus(browserOnline ? "online" : "offline");
3984
4003
  }
3985
4004
  }
3986
4005
  async _request(req, options = {}) {
@@ -4171,6 +4190,38 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
4171
4190
  return true;
4172
4191
  }
4173
4192
  }
4193
+ isDevelopmentEnvironment(origin) {
4194
+ var _a;
4195
+ const isDevHost = (hostname) => {
4196
+ hostname = hostname.toLowerCase();
4197
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]" || hostname.endsWith(".datalynk") || hostname.endsWith(".test");
4198
+ };
4199
+ const configuredDev = typeof window != "undefined" && ((_a = window.dojoConfig) == null ? void 0 : _a.isDev) === true;
4200
+ const pageHost = typeof location == "undefined" ? "" : location.hostname;
4201
+ return configuredDev || isDevHost(new URL(origin).hostname) || !!pageHost && isDevHost(pageHost);
4202
+ }
4203
+ canAdoptToken(candidate, rejected) {
4204
+ if (!candidate || candidate === rejected || this.isTokenExpired(candidate)) return false;
4205
+ try {
4206
+ const next = decodeJwt(candidate);
4207
+ const previous = rejected ? decodeJwt(rejected) : null;
4208
+ if ((previous == null ? void 0 : previous.realm) && (next == null ? void 0 : next.realm) && previous.realm !== next.realm) return false;
4209
+ const previousUser = (previous == null ? void 0 : previous.uid) ?? (previous == null ? void 0 : previous.sub);
4210
+ const nextUser = (next == null ? void 0 : next.uid) ?? (next == null ? void 0 : next.sub);
4211
+ return previousUser == null || String(previousUser) === String(nextUser);
4212
+ } catch {
4213
+ return false;
4214
+ }
4215
+ }
4216
+ /** Adopt a newer canonical token written by another auth path before expiring this session. */
4217
+ adoptStoredToken(rejected) {
4218
+ var _a;
4219
+ if (!((_a = this.options) == null ? void 0 : _a.saveSession) || typeof localStorage == "undefined") return false;
4220
+ const stored = localStorage.getItem(this.localStorageKey);
4221
+ if (!stored || !this.canAdoptToken(stored, rejected)) return false;
4222
+ this.token = stored;
4223
+ return true;
4224
+ }
4174
4225
  scheduleTokenExpiry(token) {
4175
4226
  var _a, _b, _c;
4176
4227
  if (this.tokenExpiryTimeout) clearTimeout(this.tokenExpiryTimeout);
@@ -4180,18 +4231,23 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
4180
4231
  try {
4181
4232
  expiresAt = (((_a = decodeJwt(token)) == null ? void 0 : _a.exp) ?? 0) * 1e3;
4182
4233
  } catch {
4183
- return this.markUnauthorized(token);
4234
+ if (!this.adoptStoredToken(token)) this.markUnauthorized(token);
4235
+ return;
4184
4236
  }
4185
4237
  const delay = expiresAt - Date.now();
4186
- if (delay <= 0) return this.markUnauthorized(token);
4238
+ if (delay <= 0) {
4239
+ if (!this.adoptStoredToken(token)) this.markUnauthorized(token);
4240
+ return;
4241
+ }
4187
4242
  this.tokenExpiryTimeout = setTimeout(() => {
4188
4243
  if (delay > 2147e6) this.scheduleTokenExpiry(token);
4189
- else this.markUnauthorized(token);
4244
+ else if (!this.adoptStoredToken(token)) this.markUnauthorized(token);
4190
4245
  }, Math.min(delay, 2147e6));
4191
4246
  (_c = (_b = this.tokenExpiryTimeout) == null ? void 0 : _b.unref) == null ? void 0 : _c.call(_b);
4192
4247
  }
4193
4248
  markUnauthorized(token) {
4194
4249
  if (token && token !== this.token) return;
4250
+ if (this.adoptStoredToken(token)) return;
4195
4251
  this.authenticationInvalid = true;
4196
4252
  this.cancelRecovery(errorFromCode(401, "Session expired"));
4197
4253
  if (this.token != null) this.token$.next(null);
package/dist/index.mjs CHANGED
@@ -3225,7 +3225,7 @@ class Superuser {
3225
3225
  } });
3226
3226
  }
3227
3227
  }
3228
- const version = "1.5.0";
3228
+ const version = "1.5.1";
3229
3229
  class WebRtc {
3230
3230
  constructor(api) {
3231
3231
  __publicField(this, "ice");
@@ -3780,6 +3780,7 @@ const _Api = class _Api {
3780
3780
  __publicField(this, "recoveryImmediateRetries", 2);
3781
3781
  /** LocalStorage key for persisting logins */
3782
3782
  __publicField(this, "localStorageKey", "datalynk-token");
3783
+ __publicField(this, "tokenStorageListener", null);
3783
3784
  /** Pending requests cache */
3784
3785
  __publicField(this, "pending", {});
3785
3786
  /** Helpers */
@@ -3829,12 +3830,14 @@ const _Api = class _Api {
3829
3830
  var _a, _b;
3830
3831
  this.origin = origin;
3831
3832
  this.url = `${new URL(origin).origin}/api/`;
3833
+ const development = this.isDevelopmentEnvironment(origin);
3832
3834
  this.options = {
3833
3835
  manifest: {},
3834
3836
  name: typeof document != "undefined" ? document.title : "Datalynk",
3835
3837
  offline: [],
3836
3838
  origin: typeof location !== "undefined" ? location.host : "Unknown",
3837
3839
  saveSession: true,
3840
+ watchTokenExpiry: true,
3838
3841
  serviceWorker: "/service.worker.mjs",
3839
3842
  ...options,
3840
3843
  webrtc: {
@@ -3844,14 +3847,28 @@ const _Api = class _Api {
3844
3847
  ...options.webrtc || {}
3845
3848
  }
3846
3849
  };
3850
+ if (development) this.options.watchTokenExpiry = false;
3847
3851
  if (this.options.saveSession && typeof localStorage != "undefined") {
3848
3852
  this.token = localStorage.getItem(this.localStorageKey) || null;
3849
3853
  this.token$.pipe(distinctUntilChanged()).subscribe((token) => {
3850
3854
  if (token) localStorage.setItem(this.localStorageKey, token);
3851
3855
  else localStorage.removeItem(this.localStorageKey);
3852
3856
  });
3857
+ if (typeof window != "undefined") {
3858
+ this.tokenStorageListener = (event) => {
3859
+ if (event.storageArea === localStorage && event.key == null) {
3860
+ this.token = null;
3861
+ return;
3862
+ }
3863
+ if (event.key !== this.localStorageKey || event.newValue === this.token) return;
3864
+ if (event.newValue && this.canAdoptToken(event.newValue, this.token)) this.token = event.newValue;
3865
+ else if (event.newValue == null) this.token = null;
3866
+ };
3867
+ window.addEventListener("storage", this.tokenStorageListener);
3868
+ }
3853
3869
  }
3854
- this.token$.pipe(distinctUntilChanged()).subscribe((token) => this.scheduleTokenExpiry(token));
3870
+ if (this.options.watchTokenExpiry)
3871
+ this.token$.pipe(distinctUntilChanged()).subscribe((token) => this.scheduleTokenExpiry(token));
3855
3872
  this.socket = new Socket(this, { url: options.socket });
3856
3873
  this.gps = new Gps(this, options.gps);
3857
3874
  this.auth = new Auth(this);
@@ -3968,6 +3985,7 @@ const _Api = class _Api {
3968
3985
  if (this.recovery && token !== this.recovery.token)
3969
3986
  this.cancelRecovery(errorFromCode(401, "Session changed during API recovery"));
3970
3987
  if (token && this.isTokenExpired(token)) {
3988
+ if (this.adoptStoredToken(token)) return;
3971
3989
  this.authenticationInvalid = true;
3972
3990
  this.token$.next(null);
3973
3991
  this.setConnectionStatus("unauthorized");
@@ -3976,7 +3994,8 @@ const _Api = class _Api {
3976
3994
  this.authenticationInvalid = false;
3977
3995
  this.token$.next(token);
3978
3996
  if (token && !this.online && !this.recovery) {
3979
- this.setConnectionStatus(typeof navigator == "undefined" || navigator.onLine ? "online" : "offline");
3997
+ const browserOnline = typeof navigator == "undefined" || typeof navigator.onLine == "undefined" || navigator.onLine;
3998
+ this.setConnectionStatus(browserOnline ? "online" : "offline");
3980
3999
  }
3981
4000
  }
3982
4001
  async _request(req, options = {}) {
@@ -4167,6 +4186,38 @@ const _Api = class _Api {
4167
4186
  return true;
4168
4187
  }
4169
4188
  }
4189
+ isDevelopmentEnvironment(origin) {
4190
+ var _a;
4191
+ const isDevHost = (hostname) => {
4192
+ hostname = hostname.toLowerCase();
4193
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]" || hostname.endsWith(".datalynk") || hostname.endsWith(".test");
4194
+ };
4195
+ const configuredDev = typeof window != "undefined" && ((_a = window.dojoConfig) == null ? void 0 : _a.isDev) === true;
4196
+ const pageHost = typeof location == "undefined" ? "" : location.hostname;
4197
+ return configuredDev || isDevHost(new URL(origin).hostname) || !!pageHost && isDevHost(pageHost);
4198
+ }
4199
+ canAdoptToken(candidate, rejected) {
4200
+ if (!candidate || candidate === rejected || this.isTokenExpired(candidate)) return false;
4201
+ try {
4202
+ const next = decodeJwt(candidate);
4203
+ const previous = rejected ? decodeJwt(rejected) : null;
4204
+ if ((previous == null ? void 0 : previous.realm) && (next == null ? void 0 : next.realm) && previous.realm !== next.realm) return false;
4205
+ const previousUser = (previous == null ? void 0 : previous.uid) ?? (previous == null ? void 0 : previous.sub);
4206
+ const nextUser = (next == null ? void 0 : next.uid) ?? (next == null ? void 0 : next.sub);
4207
+ return previousUser == null || String(previousUser) === String(nextUser);
4208
+ } catch {
4209
+ return false;
4210
+ }
4211
+ }
4212
+ /** Adopt a newer canonical token written by another auth path before expiring this session. */
4213
+ adoptStoredToken(rejected) {
4214
+ var _a;
4215
+ if (!((_a = this.options) == null ? void 0 : _a.saveSession) || typeof localStorage == "undefined") return false;
4216
+ const stored = localStorage.getItem(this.localStorageKey);
4217
+ if (!stored || !this.canAdoptToken(stored, rejected)) return false;
4218
+ this.token = stored;
4219
+ return true;
4220
+ }
4170
4221
  scheduleTokenExpiry(token) {
4171
4222
  var _a, _b, _c;
4172
4223
  if (this.tokenExpiryTimeout) clearTimeout(this.tokenExpiryTimeout);
@@ -4176,18 +4227,23 @@ const _Api = class _Api {
4176
4227
  try {
4177
4228
  expiresAt = (((_a = decodeJwt(token)) == null ? void 0 : _a.exp) ?? 0) * 1e3;
4178
4229
  } catch {
4179
- return this.markUnauthorized(token);
4230
+ if (!this.adoptStoredToken(token)) this.markUnauthorized(token);
4231
+ return;
4180
4232
  }
4181
4233
  const delay = expiresAt - Date.now();
4182
- if (delay <= 0) return this.markUnauthorized(token);
4234
+ if (delay <= 0) {
4235
+ if (!this.adoptStoredToken(token)) this.markUnauthorized(token);
4236
+ return;
4237
+ }
4183
4238
  this.tokenExpiryTimeout = setTimeout(() => {
4184
4239
  if (delay > 2147e6) this.scheduleTokenExpiry(token);
4185
- else this.markUnauthorized(token);
4240
+ else if (!this.adoptStoredToken(token)) this.markUnauthorized(token);
4186
4241
  }, Math.min(delay, 2147e6));
4187
4242
  (_c = (_b = this.tokenExpiryTimeout) == null ? void 0 : _b.unref) == null ? void 0 : _c.call(_b);
4188
4243
  }
4189
4244
  markUnauthorized(token) {
4190
4245
  if (token && token !== this.token) return;
4246
+ if (this.adoptStoredToken(token)) return;
4191
4247
  this.authenticationInvalid = true;
4192
4248
  this.cancelRecovery(errorFromCode(401, "Session expired"));
4193
4249
  if (this.token != null) this.token$.next(null);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@auxilium/datalynk-client",
3
3
  "description": "Datalynk client library",
4
4
  "repository": "https://gitlab.auxiliumgroup.com/auxilium/datalynk/datalynk-client",
5
- "version": "1.5.0",
5
+ "version": "1.5.1",
6
6
  "author": "Auxilium Group <devops@auxiliumgroup.com>",
7
7
  "private": false,
8
8
  "main": "./dist/index.cjs",