@genesislcap/foundation-comms 14.306.2-alpha-d90fa7e.0 → 14.307.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.
Files changed (38) hide show
  1. package/dist/dts/auth/auth.d.ts +2 -19
  2. package/dist/dts/auth/auth.d.ts.map +1 -1
  3. package/dist/dts/connect/connect.d.ts +2 -14
  4. package/dist/dts/connect/connect.d.ts.map +1 -1
  5. package/dist/dts/connect/message.d.ts +0 -1
  6. package/dist/dts/connect/message.d.ts.map +1 -1
  7. package/dist/dts/connect/socket.d.ts +11 -6
  8. package/dist/dts/connect/socket.d.ts.map +1 -1
  9. package/dist/dts/metadata/metadata.types.d.ts +0 -1
  10. package/dist/dts/metadata/metadata.types.d.ts.map +1 -1
  11. package/dist/dts/testing/mocks/connect/connect.d.ts +0 -1
  12. package/dist/dts/testing/mocks/connect/connect.d.ts.map +1 -1
  13. package/dist/dts/testing/mocks/connect/socket.d.ts +2 -5
  14. package/dist/dts/testing/mocks/connect/socket.d.ts.map +1 -1
  15. package/dist/esm/auth/auth.js +5 -91
  16. package/dist/esm/connect/connect.js +4 -24
  17. package/dist/esm/connect/socket.js +86 -15
  18. package/dist/esm/testing/mocks/connect/connect.js +1 -2
  19. package/dist/esm/testing/mocks/connect/socket.js +1 -8
  20. package/dist/foundation-comms.api.json +2 -257
  21. package/dist/foundation-comms.d.ts +23 -52
  22. package/docs/api/foundation-comms.connect.md +0 -21
  23. package/docs/api/foundation-comms.defaultauth._constructor_.md +1 -15
  24. package/docs/api/foundation-comms.defaultauth.md +1 -20
  25. package/docs/api/foundation-comms.defaultconnect._constructor_.md +1 -15
  26. package/docs/api/foundation-comms.defaultconnect.md +1 -41
  27. package/docs/api/foundation-comms.defaultsocket.md +0 -12
  28. package/docs/api/foundation-comms.messagedetails.loggedinsysteminfo.md +0 -1
  29. package/docs/api/foundation-comms.rawdataserverresult.md +0 -1
  30. package/docs/api/foundation-comms.socket.md +0 -11
  31. package/docs/api-report.md.api.md +13 -32
  32. package/package.json +13 -13
  33. package/docs/api/foundation-comms.connect.sessionexpired_.md +0 -13
  34. package/docs/api/foundation-comms.defaultauth.reauth_action_lock_key.md +0 -11
  35. package/docs/api/foundation-comms.defaultconnect.sessionexpired_.md +0 -13
  36. package/docs/api/foundation-comms.defaultconnect.user.md +0 -11
  37. package/docs/api/foundation-comms.defaultsocket.updatesessionandsubscriptions.md +0 -50
  38. package/docs/api/foundation-comms.socket.updatesessionandsubscriptions.md +0 -52
@@ -1,5 +1,7 @@
1
+ var DefaultSocket_1;
1
2
  import { __awaiter, __decorate, __param } from "tslib";
2
3
  import { User } from '@genesislcap/foundation-user';
4
+ import { LOGIN_DETAILS_URL, LOGIN_URL } from '@genesislcap/foundation-utils';
3
5
  import { GENESIS_SOCKET_URL, JSONSerializer, UUID } from '@genesislcap/foundation-utils';
4
6
  import { DOM, observable } from '@microsoft/fast-element';
5
7
  import { DI } from '@microsoft/fast-foundation';
@@ -83,7 +85,7 @@ export class SocketMessageHandler {
83
85
  * Default Socket implementation.
84
86
  * @public
85
87
  */
86
- let DefaultSocket = class DefaultSocket {
88
+ let DefaultSocket = DefaultSocket_1 = class DefaultSocket {
87
89
  get isConfigured() {
88
90
  return this.status.isConfigured;
89
91
  }
@@ -201,14 +203,6 @@ let DefaultSocket = class DefaultSocket {
201
203
  switch (receivedMessage.MESSAGE_TYPE) {
202
204
  case EventMessageType.EVENT_LOGIN_AUTH_ACK: {
203
205
  const systemDetails = receivedMessage.DETAILS;
204
- const MINUTES_TO_MILLISECONDS = 60 * 1000;
205
- const timeoutMs = systemDetails.SESSION_TIMEOUT_MINS * MINUTES_TO_MILLISECONDS;
206
- setTimeout(() => {
207
- var _a;
208
- const heartbeatPing = this.messageBuilder.createHeartbeatPingMessage((_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.verboseHeartbeat);
209
- this.websocket.next(heartbeatPing);
210
- logger.info(`Heartbeat ping sent after session timeout (${systemDetails.SESSION_TIMEOUT_MINS} mins)`);
211
- }, timeoutMs);
212
206
  // Reconfigures the heartbeat with system details from the login response
213
207
  if (systemDetails.HEARTBEAT_INTERVAL_SECS &&
214
208
  ((_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.heartbeatInterval) === undefined) {
@@ -274,14 +268,85 @@ let DefaultSocket = class DefaultSocket {
274
268
  this.status.isConfigured = true;
275
269
  });
276
270
  }
277
- updateSessionAndSubscriptions(refreshTokenResult) {
278
- this.wsMessageHandlers.forEach((mh) => {
279
- if (mh.isSubscription) {
280
- mh.sentMessage.SESSION_AUTH_TOKEN = refreshTokenResult;
281
- this.websocket.next(mh.sentMessage);
271
+ /**
272
+ *
273
+ * @remarks
274
+ * This is triggered after `sessionTimeoutMins` elapses and heartbeat would tell us that user is no longer authenticated
275
+ * more info here https://docs.genesis.global/docs/develop/server-capabilities/access-control/authentication/#sessiontimeoutmins
276
+ */
277
+ handleExpiredSession() {
278
+ return __awaiter(this, void 0, void 0, function* () {
279
+ // to detect which auth method is used we check if refreshToken is present in session storage
280
+ // it would not be available in cookies method as it's securely stored within cookie
281
+ // and not accessible from the client
282
+ if (this.session.getSessionStorageItem('refreshToken')) {
283
+ const refreshTokenMessage = this.messageBuilder.createRefreshTokenMessage();
284
+ const refreshTokenResult = yield this.send(refreshTokenMessage);
285
+ this.session.setAuthResult(refreshTokenResult);
286
+ this.updateSessionAndSubscriptions(refreshTokenResult);
287
+ }
288
+ else {
289
+ yield this.handleCookieBasedReauth();
290
+ }
291
+ });
292
+ }
293
+ handleCookieBasedReauth() {
294
+ return __awaiter(this, void 0, void 0, function* () {
295
+ // checking for stale locks, so we don't block reauth forever
296
+ const lockTimestamp = parseInt(localStorage.getItem(DefaultSocket_1.REAUTH_ACTION_LOCK_KEY) || '0');
297
+ const LOCK_TIMEOUT_MS = 30000;
298
+ if (Date.now() - lockTimestamp > LOCK_TIMEOUT_MS) {
299
+ localStorage.removeItem(DefaultSocket_1.REAUTH_ACTION_LOCK_KEY);
300
+ }
301
+ // this is to prevent multiple tabs from trying to reauthenticate at the same time
302
+ if (!localStorage.getItem(DefaultSocket_1.REAUTH_ACTION_LOCK_KEY)) {
303
+ localStorage.setItem(DefaultSocket_1.REAUTH_ACTION_LOCK_KEY, Date.now().toString());
304
+ // session might already be extended on another tab, so we first check if user is
305
+ // authenticated and if it is we just reconnect as cookies are shared between tabs and
306
+ // the browser uses latest one when establishing connection with ws
307
+ const loginDetailsFetch = yield fetch(LOGIN_DETAILS_URL, { credentials: 'include' });
308
+ const loginDetails = yield loginDetailsFetch.json();
309
+ if (loginDetails.MESSAGE_TYPE !== 'EVENT_LOGIN_DETAILS_ACK') {
310
+ const refreshLoginResponse = yield fetch(LOGIN_URL, {
311
+ credentials: 'include',
312
+ headers: { 'Content-type': 'application/json; charset=UTF-8' },
313
+ method: 'POST',
314
+ body: JSON.stringify({
315
+ DETAILS: {},
316
+ MESSAGE_TYPE: 'EVENT_LOGIN_AUTH',
317
+ }),
318
+ });
319
+ // if the refresh login is not successful we need to reload the page to get back to the login page
320
+ if (!refreshLoginResponse.ok) {
321
+ window.location.reload();
322
+ }
323
+ }
324
+ localStorage.removeItem(DefaultSocket_1.REAUTH_ACTION_LOCK_KEY);
325
+ // connect again to a new stream to use new session token from obtained cookie
326
+ yield this.connect();
327
+ }
328
+ else {
329
+ // session is already being reauthenticated on another tab so we just wait when it finishes and reconnect
330
+ window.addEventListener('storage', this.onStorageEvent.bind(this));
282
331
  }
283
332
  });
284
333
  }
334
+ onStorageEvent(event) {
335
+ if (event.key === DefaultSocket_1.REAUTH_ACTION_LOCK_KEY && event.newValue === null) {
336
+ this.connect();
337
+ window.removeEventListener('storage', this.onStorageEvent);
338
+ }
339
+ }
340
+ updateSessionAndSubscriptions(refreshTokenResult) {
341
+ if ((refreshTokenResult === null || refreshTokenResult === void 0 ? void 0 : refreshTokenResult.MESSAGE_TYPE) === EventMessageType.EVENT_LOGIN_AUTH_ACK) {
342
+ this.wsMessageHandlers.forEach((mh) => {
343
+ if (mh.isSubscription) {
344
+ mh.sentMessage.SESSION_AUTH_TOKEN = refreshTokenResult.SESSION_AUTH_TOKEN;
345
+ this.websocket.next(mh.sentMessage);
346
+ }
347
+ });
348
+ }
349
+ }
285
350
  prepareHeartbeat() {
286
351
  var _a, _b, _c, _d;
287
352
  if (this.heartbeatTicker) {
@@ -296,6 +361,11 @@ let DefaultSocket = class DefaultSocket {
296
361
  this.connectOptions.heartbeatPingCallback(ping);
297
362
  }
298
363
  const pong = yield this.send(ping);
364
+ // when heartbeat runs before user logs in (connected to websocket but
365
+ // not authenticated) we don't extend session as it doesn't exist yet
366
+ if (this.user.isAuthenticated && !pong.IS_AUTHENTICATED) {
367
+ this.handleExpiredSession();
368
+ }
299
369
  if ((_c = this.connectOptions) === null || _c === void 0 ? void 0 : _c.heartbeatPongCallback) {
300
370
  this.connectOptions.heartbeatPongCallback(pong);
301
371
  }
@@ -482,6 +552,7 @@ let DefaultSocket = class DefaultSocket {
482
552
  }
483
553
  }
484
554
  };
555
+ DefaultSocket.REAUTH_ACTION_LOCK_KEY = 'reauthActionLock';
485
556
  __decorate([
486
557
  observable
487
558
  ], DefaultSocket.prototype, "websocket", void 0);
@@ -497,7 +568,7 @@ __decorate([
497
568
  __decorate([
498
569
  observable
499
570
  ], DefaultSocket.prototype, "heartbeatIsEnabled", void 0);
500
- DefaultSocket = __decorate([
571
+ DefaultSocket = DefaultSocket_1 = __decorate([
501
572
  __param(0, MessageBuilder),
502
573
  __param(1, Session),
503
574
  __param(2, JSONSerializer),
@@ -1,5 +1,5 @@
1
1
  import { __awaiter } from "tslib";
2
- import { BehaviorSubject, from } from 'rxjs';
2
+ import { from } from 'rxjs';
3
3
  /**
4
4
  * @internal
5
5
  */
@@ -7,7 +7,6 @@ export class ConnectMock {
7
7
  constructor() {
8
8
  this.isConnected = true;
9
9
  this.isWorking = false;
10
- this.sessionExpired$ = new BehaviorSubject(false);
11
10
  }
12
11
  get host() {
13
12
  return this.socket.host;
@@ -8,7 +8,6 @@ export class SocketMock {
8
8
  this.isConnectedSubject = new BehaviorSubject(true);
9
9
  this.host = 'mock-host';
10
10
  this.socketMessagesSubject = new SocketSubject();
11
- this.sessionExpiredSubject = new SocketSubject();
12
11
  }
13
12
  connect(host, options, reconnectOptions) {
14
13
  this.host = host;
@@ -27,13 +26,7 @@ export class SocketMock {
27
26
  socketMessages() {
28
27
  return this.socketMessagesSubject;
29
28
  }
30
- sessionExpired() {
31
- return this.sessionExpiredSubject;
32
- }
33
- updateSessionAndSubscriptions(refreshToken) {
34
- // mock: do nothing
35
- }
36
29
  reset() {
37
- // mock: do nothing
30
+ throw new Error('Method not implemented.');
38
31
  }
39
32
  }
@@ -2108,38 +2108,6 @@
2108
2108
  ],
2109
2109
  "name": "request"
2110
2110
  },
2111
- {
2112
- "kind": "PropertySignature",
2113
- "canonicalReference": "@genesislcap/foundation-comms!Connect#sessionExpired$:member",
2114
- "docComment": "/**\n * Emits true when the session is detected as expired (e.g., IS_AUTHENTICATED is false in heartbeat pong). Consumers can subscribe to this to react to session expiration events.\n */\n",
2115
- "excerptTokens": [
2116
- {
2117
- "kind": "Content",
2118
- "text": "readonly sessionExpired$?: "
2119
- },
2120
- {
2121
- "kind": "Reference",
2122
- "text": "Subject",
2123
- "canonicalReference": "rxjs!Subject:class"
2124
- },
2125
- {
2126
- "kind": "Content",
2127
- "text": "<boolean>"
2128
- },
2129
- {
2130
- "kind": "Content",
2131
- "text": ";"
2132
- }
2133
- ],
2134
- "isReadonly": true,
2135
- "isOptional": true,
2136
- "releaseTag": "Public",
2137
- "name": "sessionExpired$",
2138
- "propertyTypeTokenRange": {
2139
- "startIndex": 1,
2140
- "endIndex": 3
2141
- }
2142
- },
2143
2111
  {
2144
2112
  "kind": "MethodSignature",
2145
2113
  "canonicalReference": "@genesislcap/foundation-comms!Connect#snapshot:member(1)",
@@ -10967,15 +10935,6 @@
10967
10935
  "text": "User",
10968
10936
  "canonicalReference": "@genesislcap/foundation-user!User:interface"
10969
10937
  },
10970
- {
10971
- "kind": "Content",
10972
- "text": ", socket: "
10973
- },
10974
- {
10975
- "kind": "Reference",
10976
- "text": "Socket",
10977
- "canonicalReference": "@genesislcap/foundation-comms!Socket:interface"
10978
- },
10979
10938
  {
10980
10939
  "kind": "Content",
10981
10940
  "text": ");"
@@ -11024,14 +10983,6 @@
11024
10983
  "endIndex": 10
11025
10984
  },
11026
10985
  "isOptional": false
11027
- },
11028
- {
11029
- "parameterName": "socket",
11030
- "parameterTypeTokenRange": {
11031
- "startIndex": 11,
11032
- "endIndex": 12
11033
- },
11034
- "isOptional": false
11035
10986
  }
11036
10987
  ]
11037
10988
  },
@@ -11300,36 +11251,6 @@
11300
11251
  "isAbstract": false,
11301
11252
  "name": "logout"
11302
11253
  },
11303
- {
11304
- "kind": "Property",
11305
- "canonicalReference": "@genesislcap/foundation-comms!DefaultAuth.REAUTH_ACTION_LOCK_KEY:member",
11306
- "docComment": "",
11307
- "excerptTokens": [
11308
- {
11309
- "kind": "Content",
11310
- "text": "static REAUTH_ACTION_LOCK_KEY: "
11311
- },
11312
- {
11313
- "kind": "Content",
11314
- "text": "string"
11315
- },
11316
- {
11317
- "kind": "Content",
11318
- "text": ";"
11319
- }
11320
- ],
11321
- "isReadonly": false,
11322
- "isOptional": false,
11323
- "releaseTag": "Public",
11324
- "name": "REAUTH_ACTION_LOCK_KEY",
11325
- "propertyTypeTokenRange": {
11326
- "startIndex": 1,
11327
- "endIndex": 2
11328
- },
11329
- "isStatic": true,
11330
- "isProtected": false,
11331
- "isAbstract": false
11332
- },
11333
11254
  {
11334
11255
  "kind": "Method",
11335
11256
  "canonicalReference": "@genesislcap/foundation-comms!DefaultAuth#reAuthFromSession:member(1)",
@@ -11449,15 +11370,6 @@
11449
11370
  "text": "ConnectConfig",
11450
11371
  "canonicalReference": "@genesislcap/foundation-comms!ConnectConfig:interface"
11451
11372
  },
11452
- {
11453
- "kind": "Content",
11454
- "text": ", user: "
11455
- },
11456
- {
11457
- "kind": "Reference",
11458
- "text": "User",
11459
- "canonicalReference": "@genesislcap/foundation-user!User:interface"
11460
- },
11461
11373
  {
11462
11374
  "kind": "Content",
11463
11375
  "text": ");"
@@ -11506,14 +11418,6 @@
11506
11418
  "endIndex": 10
11507
11419
  },
11508
11420
  "isOptional": false
11509
- },
11510
- {
11511
- "parameterName": "user",
11512
- "parameterTypeTokenRange": {
11513
- "startIndex": 11,
11514
- "endIndex": 12
11515
- },
11516
- "isOptional": false
11517
11421
  }
11518
11422
  ]
11519
11423
  },
@@ -12458,41 +12362,6 @@
12458
12362
  "isAbstract": false,
12459
12363
  "name": "send"
12460
12364
  },
12461
- {
12462
- "kind": "Property",
12463
- "canonicalReference": "@genesislcap/foundation-comms!DefaultConnect#sessionExpired$:member",
12464
- "docComment": "/**\n * Emits true when the session is detected as expired (e.g., IS_AUTHENTICATED is false in heartbeat pong). Consumers can subscribe to this to react to session expiration events.\n */\n",
12465
- "excerptTokens": [
12466
- {
12467
- "kind": "Content",
12468
- "text": "readonly sessionExpired$: "
12469
- },
12470
- {
12471
- "kind": "Reference",
12472
- "text": "BehaviorSubject",
12473
- "canonicalReference": "rxjs!BehaviorSubject:class"
12474
- },
12475
- {
12476
- "kind": "Content",
12477
- "text": "<boolean>"
12478
- },
12479
- {
12480
- "kind": "Content",
12481
- "text": ";"
12482
- }
12483
- ],
12484
- "isReadonly": true,
12485
- "isOptional": false,
12486
- "releaseTag": "Public",
12487
- "name": "sessionExpired$",
12488
- "propertyTypeTokenRange": {
12489
- "startIndex": 1,
12490
- "endIndex": 3
12491
- },
12492
- "isStatic": false,
12493
- "isProtected": false,
12494
- "isAbstract": false
12495
- },
12496
12365
  {
12497
12366
  "kind": "Method",
12498
12367
  "canonicalReference": "@genesislcap/foundation-comms!DefaultConnect#setValidSession:member(1)",
@@ -12996,37 +12865,6 @@
12996
12865
  "isOptional": false,
12997
12866
  "isAbstract": false,
12998
12867
  "name": "streamWithoutAutoTeardown"
12999
- },
13000
- {
13001
- "kind": "Property",
13002
- "canonicalReference": "@genesislcap/foundation-comms!DefaultConnect#user:member",
13003
- "docComment": "",
13004
- "excerptTokens": [
13005
- {
13006
- "kind": "Content",
13007
- "text": "protected user: "
13008
- },
13009
- {
13010
- "kind": "Reference",
13011
- "text": "User",
13012
- "canonicalReference": "@genesislcap/foundation-user!User:interface"
13013
- },
13014
- {
13015
- "kind": "Content",
13016
- "text": ";"
13017
- }
13018
- ],
13019
- "isReadonly": false,
13020
- "isOptional": false,
13021
- "releaseTag": "Public",
13022
- "name": "user",
13023
- "propertyTypeTokenRange": {
13024
- "startIndex": 1,
13025
- "endIndex": 2
13026
- },
13027
- "isStatic": false,
13028
- "isProtected": true,
13029
- "isAbstract": false
13030
12868
  }
13031
12869
  ],
13032
12870
  "implementsTokenRanges": [
@@ -23242,54 +23080,6 @@
23242
23080
  "isProtected": false,
23243
23081
  "isAbstract": false
23244
23082
  },
23245
- {
23246
- "kind": "Method",
23247
- "canonicalReference": "@genesislcap/foundation-comms!DefaultSocket#updateSessionAndSubscriptions:member(1)",
23248
- "docComment": "",
23249
- "excerptTokens": [
23250
- {
23251
- "kind": "Content",
23252
- "text": "updateSessionAndSubscriptions(refreshTokenResult: "
23253
- },
23254
- {
23255
- "kind": "Content",
23256
- "text": "string"
23257
- },
23258
- {
23259
- "kind": "Content",
23260
- "text": "): "
23261
- },
23262
- {
23263
- "kind": "Content",
23264
- "text": "void"
23265
- },
23266
- {
23267
- "kind": "Content",
23268
- "text": ";"
23269
- }
23270
- ],
23271
- "isStatic": false,
23272
- "returnTypeTokenRange": {
23273
- "startIndex": 3,
23274
- "endIndex": 4
23275
- },
23276
- "releaseTag": "Public",
23277
- "isProtected": false,
23278
- "overloadIndex": 1,
23279
- "parameters": [
23280
- {
23281
- "parameterName": "refreshTokenResult",
23282
- "parameterTypeTokenRange": {
23283
- "startIndex": 1,
23284
- "endIndex": 2
23285
- },
23286
- "isOptional": false
23287
- }
23288
- ],
23289
- "isOptional": false,
23290
- "isAbstract": false,
23291
- "name": "updateSessionAndSubscriptions"
23292
- },
23293
23083
  {
23294
23084
  "kind": "Property",
23295
23085
  "canonicalReference": "@genesislcap/foundation-comms!DefaultSocket#user:member",
@@ -29469,7 +29259,7 @@
29469
29259
  },
29470
29260
  {
29471
29261
  "kind": "Content",
29472
- "text": "{\n DAYS_TO_PASSWORD_EXPIRY: number;\n FAILED_LOGIN_ATTEMPTS: number;\n HEARTBEAT_INTERVAL_SECS: number;\n LAST_LOGIN_DATETIME: number;\n NOTIFY_EXPIRY?: boolean;\n PRODUCT?: any[];\n SYSTEM?: any;\n SESSION_TIMEOUT_MINS?: number;\n }"
29262
+ "text": "{\n DAYS_TO_PASSWORD_EXPIRY: number;\n FAILED_LOGIN_ATTEMPTS: number;\n HEARTBEAT_INTERVAL_SECS: number;\n LAST_LOGIN_DATETIME: number;\n NOTIFY_EXPIRY?: boolean;\n PRODUCT?: any[];\n SYSTEM?: any;\n }"
29473
29263
  },
29474
29264
  {
29475
29265
  "kind": "Content",
@@ -31787,7 +31577,7 @@
31787
31577
  },
31788
31578
  {
31789
31579
  "kind": "Content",
31790
- "text": "[];\n SOURCE_REF: string;\n MORE_ROWS: boolean;\n ROWS_COUNT: number;\n SEQUENCE_ID: number;\n LOGGED_OUT: boolean;\n}"
31580
+ "text": "[];\n SOURCE_REF: string;\n MORE_ROWS: boolean;\n ROWS_COUNT: number;\n SEQUENCE_ID: number;\n}"
31791
31581
  },
31792
31582
  {
31793
31583
  "kind": "Content",
@@ -34235,51 +34025,6 @@
34235
34025
  "overloadIndex": 1,
34236
34026
  "parameters": [],
34237
34027
  "name": "socketMessages"
34238
- },
34239
- {
34240
- "kind": "MethodSignature",
34241
- "canonicalReference": "@genesislcap/foundation-comms!Socket#updateSessionAndSubscriptions:member(1)",
34242
- "docComment": "/**\n * Updates the session and subscriptions with the new session token.\n *\n * @param refreshTokenResult - The refresh token result.\n */\n",
34243
- "excerptTokens": [
34244
- {
34245
- "kind": "Content",
34246
- "text": "updateSessionAndSubscriptions(refreshToken: "
34247
- },
34248
- {
34249
- "kind": "Content",
34250
- "text": "string"
34251
- },
34252
- {
34253
- "kind": "Content",
34254
- "text": "): "
34255
- },
34256
- {
34257
- "kind": "Content",
34258
- "text": "void"
34259
- },
34260
- {
34261
- "kind": "Content",
34262
- "text": ";"
34263
- }
34264
- ],
34265
- "isOptional": false,
34266
- "returnTypeTokenRange": {
34267
- "startIndex": 3,
34268
- "endIndex": 4
34269
- },
34270
- "releaseTag": "Public",
34271
- "overloadIndex": 1,
34272
- "parameters": [
34273
- {
34274
- "parameterName": "refreshToken",
34275
- "parameterTypeTokenRange": {
34276
- "startIndex": 1,
34277
- "endIndex": 2
34278
- },
34279
- "isOptional": false
34280
- }
34281
- ],
34282
- "name": "updateSessionAndSubscriptions"
34283
34028
  }
34284
34029
  ],
34285
34030
  "extendsTokenRanges": [