@idp.global/sdk 5.0.1 → 6.0.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.
@@ -14,30 +14,138 @@ export class IdpGlobalServerClient {
14
14
  optionsArg;
15
15
  typedrouter = new plugins.typedrequest.TypedRouter();
16
16
  typedsocket;
17
- typedsocketDeferred = plugins.smartpromise.defer();
17
+ typedsocketDeferred = this.createConnectionDeferred();
18
+ publicKeyPushHandlers = [];
19
+ blocklistPushHandlers = [];
20
+ connectionGeneration = 0;
21
+ pendingSocketPromise;
22
+ connectionAbortController;
23
+ stopWaiters = new Set();
24
+ stopping = false;
18
25
  constructor(optionsArg = {}) {
19
26
  this.optionsArg = optionsArg;
27
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('pushPublicKeyForValidation', async (requestArg) => {
28
+ await Promise.all(this.publicKeyPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeyPem)));
29
+ return {};
30
+ }));
31
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('pushOrGetJwtIdBlocklist', async (requestArg) => {
32
+ if (requestArg.blockedJwtIds) {
33
+ await Promise.all(this.blocklistPushHandlers.map((handlerArg) => handlerArg(requestArg.blockedJwtIds)));
34
+ }
35
+ return {};
36
+ }));
20
37
  }
21
38
  async connect() {
39
+ if (this.stopping) {
40
+ throw new Error('IdpGlobalServerClient is stopping');
41
+ }
22
42
  if (this.typedsocketDeferred.claimed) {
23
43
  return this.typedsocketDeferred.promise;
24
44
  }
25
- this.typedsocketDeferred.claim();
26
- this.typedsocket = await plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl());
27
- this.typedsocketDeferred.resolve(this.typedsocket);
28
- return this.typedsocketDeferred.promise;
45
+ const deferred = this.typedsocketDeferred;
46
+ const generation = this.connectionGeneration;
47
+ deferred.claim();
48
+ let createdSocket;
49
+ let socketPromise;
50
+ const connectionAbortController = new AbortController();
51
+ try {
52
+ this.connectionAbortController = connectionAbortController;
53
+ socketPromise = plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl(), { autoReconnect: true, abortSignal: connectionAbortController.signal });
54
+ this.pendingSocketPromise = socketPromise;
55
+ createdSocket = await this.raceWithStop(socketPromise);
56
+ if (generation !== this.connectionGeneration) {
57
+ await createdSocket.stop();
58
+ if (deferred.status === 'pending') {
59
+ deferred.reject(new Error('IdpGlobalServerClient stopped while connecting'));
60
+ }
61
+ return deferred.promise;
62
+ }
63
+ this.typedsocket = createdSocket;
64
+ deferred.resolve(createdSocket);
65
+ }
66
+ catch (error) {
67
+ if (generation === this.connectionGeneration && (!createdSocket || this.typedsocket === createdSocket)) {
68
+ this.typedsocket = undefined;
69
+ }
70
+ await createdSocket?.stop().catch(() => undefined);
71
+ if (deferred.status === 'pending') {
72
+ deferred.reject(error);
73
+ }
74
+ if (this.typedsocketDeferred === deferred) {
75
+ this.typedsocketDeferred = this.createConnectionDeferred();
76
+ }
77
+ throw error;
78
+ }
79
+ finally {
80
+ if (socketPromise && this.pendingSocketPromise === socketPromise) {
81
+ this.pendingSocketPromise = undefined;
82
+ }
83
+ if (this.connectionAbortController === connectionAbortController) {
84
+ this.connectionAbortController = undefined;
85
+ }
86
+ }
87
+ return deferred.promise;
29
88
  }
30
89
  async stop() {
31
- await this.typedsocket?.stop();
90
+ this.stopping = true;
91
+ this.connectionGeneration++;
92
+ const stopError = new Error('IdpGlobalServerClient stopped');
93
+ this.rejectStopWaiters(stopError);
94
+ const socket = this.typedsocket;
95
+ const pendingSocketPromise = this.pendingSocketPromise;
96
+ this.connectionAbortController?.abort();
97
+ this.connectionAbortController = undefined;
32
98
  this.typedsocket = undefined;
99
+ if (this.typedsocketDeferred.status === 'pending' && this.typedsocketDeferred.claimed) {
100
+ this.typedsocketDeferred.reject(stopError);
101
+ }
102
+ await socket?.stop();
103
+ const pendingSocket = await pendingSocketPromise?.catch(() => undefined);
104
+ if (pendingSocket && pendingSocket !== socket) {
105
+ await pendingSocket.stop().catch(() => undefined);
106
+ }
107
+ this.typedsocketDeferred = this.createConnectionDeferred();
108
+ this.pendingSocketPromise = undefined;
109
+ this.stopping = false;
110
+ }
111
+ onPublicKeyPush(handlerArg) {
112
+ this.publicKeyPushHandlers.push(handlerArg);
113
+ return () => {
114
+ this.publicKeyPushHandlers = this.publicKeyPushHandlers.filter((handler) => handler !== handlerArg);
115
+ };
116
+ }
117
+ onBlocklistPush(handlerArg) {
118
+ this.blocklistPushHandlers.push(handlerArg);
119
+ return () => {
120
+ this.blocklistPushHandlers = this.blocklistPushHandlers.filter((handler) => handler !== handlerArg);
121
+ };
122
+ }
123
+ async registerBackendService(backendTokenArg = this.optionsArg.backendToken) {
124
+ const backendToken = this.requireBackendToken(backendTokenArg);
125
+ const socket = await this.connect();
126
+ await this.applyBackendServiceTag(socket, backendToken);
127
+ }
128
+ async getPublicKeyForValidation(backendTokenArg = this.optionsArg.backendToken) {
129
+ const backendToken = this.requireBackendToken(backendTokenArg);
130
+ const socket = await this.connect();
131
+ const request = socket.createTypedRequest('getPublicKeyForValidation');
132
+ const response = await this.raceWithStop(request.fire({ backendToken }));
133
+ return response.publicKeyPem;
134
+ }
135
+ async getJwtIdBlocklist(backendTokenArg = this.optionsArg.backendToken) {
136
+ const backendToken = this.requireBackendToken(backendTokenArg);
137
+ const socket = await this.connect();
138
+ const request = socket.createTypedRequest('pushOrGetJwtIdBlocklist');
139
+ const response = await this.raceWithStop(request.fire({ backendToken }));
140
+ return response.blockedJwtIds || [];
33
141
  }
34
142
  async loginWithEmailAndPassword(optionsArg) {
35
143
  const socket = await this.connect();
36
144
  const loginRequest = socket.createTypedRequest('loginWithEmailOrUsernameAndPassword');
37
- const loginResponse = await loginRequest.fire({
145
+ const loginResponse = await this.raceWithStop(loginRequest.fire({
38
146
  username: optionsArg.email,
39
147
  password: optionsArg.password,
40
- });
148
+ }));
41
149
  if (loginResponse.twoFaNeeded) {
42
150
  throw new IdpMfaRequiredError({
43
151
  mfaChallengeToken: loginResponse.mfaChallengeToken,
@@ -48,12 +156,12 @@ export class IdpGlobalServerClient {
48
156
  throw new Error('IdP login failed');
49
157
  }
50
158
  const refreshRequest = socket.createTypedRequest('refreshJwt');
51
- const refreshResponse = await refreshRequest.fire({ refreshToken: loginResponse.refreshToken });
159
+ const refreshResponse = await this.raceWithStop(refreshRequest.fire({ refreshToken: loginResponse.refreshToken }));
52
160
  if (!refreshResponse.jwt) {
53
161
  throw new Error('IdP did not return a JWT');
54
162
  }
55
163
  const whoIsRequest = socket.createTypedRequest('whoIs');
56
- const whoIsResponse = await whoIsRequest.fire({ jwt: refreshResponse.jwt });
164
+ const whoIsResponse = await this.raceWithStop(whoIsRequest.fire({ jwt: refreshResponse.jwt }));
57
165
  return {
58
166
  user: whoIsResponse.user,
59
167
  jwt: refreshResponse.jwt,
@@ -70,5 +178,40 @@ export class IdpGlobalServerClient {
70
178
  }
71
179
  return baseUrl;
72
180
  }
181
+ requireBackendToken(backendTokenArg) {
182
+ if (!backendTokenArg) {
183
+ throw new Error('backendToken is required for backend JWT validation APIs');
184
+ }
185
+ return backendTokenArg;
186
+ }
187
+ async applyBackendServiceTag(socketArg, backendTokenArg) {
188
+ await this.raceWithStop(socketArg.setTag('backend-service', {
189
+ backendToken: backendTokenArg,
190
+ }));
191
+ }
192
+ createConnectionDeferred() {
193
+ const deferred = plugins.smartpromise.defer();
194
+ deferred.promise.catch(() => undefined);
195
+ return deferred;
196
+ }
197
+ raceWithStop(promiseArg) {
198
+ promiseArg.catch(() => undefined);
199
+ if (this.stopping) {
200
+ return Promise.reject(new Error('IdpGlobalServerClient stopped'));
201
+ }
202
+ return new Promise((resolve, reject) => {
203
+ const stopReject = (errorArg) => reject(errorArg);
204
+ this.stopWaiters.add(stopReject);
205
+ promiseArg.then(resolve, reject).finally(() => {
206
+ this.stopWaiters.delete(stopReject);
207
+ });
208
+ });
209
+ }
210
+ rejectStopWaiters(errorArg) {
211
+ for (const stopWaiter of this.stopWaiters) {
212
+ stopWaiter(errorArg);
213
+ }
214
+ this.stopWaiters.clear();
215
+ }
73
216
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFNeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFBeUc7UUFDbkgsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXFCO0lBS1o7SUFKWixXQUFXLEdBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQW1DLENBQUM7SUFFNUYsWUFBb0IsYUFBNEMsRUFBRTtRQUE5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQztJQUFHLENBQUM7SUFFL0QsS0FBSyxDQUFDLE9BQU87UUFDbEIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FB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
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFBeUc7UUFDbkgsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXFCO0lBWVo7SUFYWixXQUFXLEdBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdEQscUJBQXFCLEdBQTZELEVBQUUsQ0FBQztJQUNyRixxQkFBcUIsR0FBZ0UsRUFBRSxDQUFDO0lBQ3hGLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN6QixvQkFBb0IsQ0FBNEM7SUFDaEUseUJBQXlCLENBQW1CO0lBQzVDLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztJQUNuRCxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRXpCLFlBQW9CLGFBQTRDLEVBQUU7UUFBOUMsZUFBVSxHQUFWLFVBQVUsQ0FBb0M7UUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLDRCQUE0QixFQUM1QixLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDbkIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZHLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUNGLENBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUM5QixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNuQyx5QkFBeUIsRUFDekIsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQ25CLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0csQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQztRQUMxQyxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUM3QyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxhQUEwRCxDQUFDO1FBQy9ELElBQUksYUFBbUUsQ0FBQztRQUN4RSxNQUFNLHlCQUF5QixHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO1lBQzNELGFBQWEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQzFELElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUN6QixFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxDQUN2RSxDQUFDO1lBQ0YsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztZQUMxQyxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELElBQUksVUFBVSxLQUFLLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNsQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUMsQ0FBQztnQkFDL0UsQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDMUIsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZHLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQy9CLENBQUM7WUFDRCxNQUFNLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQzdELENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMseUJBQXlCLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFNBQVMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2hDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3ZELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JCLE1BQU0sYUFBYSxHQUFHLE1BQU0sb0JBQW9CLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksYUFBYSxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM5QyxNQUFNLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxlQUFlLENBQUMsVUFBNkQ7UUFDbEYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLGVBQWUsQ0FBQyxVQUFnRTtRQUNyRixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQztRQUN0RyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7UUFDaEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7UUFDbkYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBK0QsMkJBQTJCLENBQUMsQ0FBQztRQUNySSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZO1FBQzNFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQTZELHlCQUF5QixDQUFDLENBQUM7UUFDakksTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsT0FBTyxRQUFRLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLFVBQStDO1FBQ3BGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBeUUscUNBQXFDLENBQUMsQ0FBQztRQUM5SixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUM5RCxRQUFRLEVBQUUsVUFBVSxDQUFDLEtBQUs7WUFDMUIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1NBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLG1CQUFtQixDQUFDO2dCQUM1QixpQkFBaUIsRUFBRyxhQUFxQixDQUFDLGlCQUFpQjtnQkFDM0QsbUJBQW1CLEVBQUcsYUFBcUIsQ0FBQyxtQkFBbUI7YUFDaEUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQWdELFlBQVksQ0FBQyxDQUFDO1FBQzlHLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBMkMsT0FBTyxDQUFDLENBQUM7UUFDbEcsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRixPQUFPO1lBQ0wsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQ3hCLEdBQUcsRUFBRSxlQUFlLENBQUMsR0FBRztZQUN4QixZQUFZLEVBQUUsZUFBZSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsWUFBWTtTQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLHVCQUF1QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxHQUFHLEdBQUcsT0FBTyxlQUFlLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxlQUF3QjtRQUNsRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUNsQyxTQUEwQyxFQUMxQyxlQUF1QjtRQUV2QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBaUQsaUJBQWlCLEVBQUU7WUFDMUcsWUFBWSxFQUFFLGVBQWU7U0FDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFtQyxDQUFDO1FBQy9FLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxZQUFZLENBQUksVUFBc0I7UUFDNUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBZSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFlO1FBQ3ZDLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idp.global/sdk",
3
- "version": "5.0.1",
3
+ "version": "6.0.1",
4
4
  "private": false,
5
5
  "description": "Reusable browser and server SDK for idp.global authentication.",
6
6
  "type": "module",
@@ -15,8 +15,8 @@
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
17
  "@api.global/typedrequest": "^3.3.0",
18
- "@api.global/typedsocket": "^4.1.2",
19
- "@idp.global/interfaces": "^5.0.0",
18
+ "@api.global/typedsocket": "^4.2.2",
19
+ "@idp.global/interfaces": "^7.0.0",
20
20
  "@push.rocks/smartdata": "^7.1.7",
21
21
  "@push.rocks/smartjson": "^6.0.1",
22
22
  "@push.rocks/smartpromise": "^4.2.4",
package/readme.md CHANGED
@@ -137,10 +137,11 @@ await idp.logout();
137
137
  | --- | --- |
138
138
  | Registration and login | `firstRegistration`, `afterRegistrationEmailClicked`, `setData`, `mobileNumberVerification`, `finishRegistration`, `loginWithUserNameAndPassword`, `loginWithEmail`, `loginWithEmailAfterToken`, `loginWithApiToken`, `resetPassword`, `setNewPassword`, `obtainDeviceId`, `attachDeviceId` |
139
139
  | Tokens and OIDC | `obtainJwt`, `obtainOneTimeToken`, `prepareOidcAuthorization`, `completeOidcAuthorization` |
140
- | User profile and sessions | `getUserData`, `setUserData`, `getUserSessions`, `revokeSession`, `getUserActivity` |
141
- | Organizations and members | `getOrganizationById`, `updateOrganization`, `deleteOrganization`, `getOrgRoleDefinitions`, `upsertOrgRoleDefinition`, `deleteOrgRoleDefinition`, `createInvitation`, `getOrgInvitations`, `getOrgMembers`, `cancelInvitation`, `resendInvitation`, `removeMember`, `updateMemberRoles`, `transferOwnership`, `getInvitationByToken`, `acceptInvitation`, `bulkCreateInvitations`, `updateAppRoleMappings` |
142
- | Billing and validation | `getBillingPlan`, `getPaddleConfig`, `getPublicKeyForValidation`, `pushPublicKeyForValidation`, `pushOrGetJwtIdBlocklist` |
143
- | Global administration | `suspendUser`, `deleteSuspendedUser`, `checkGlobalAdmin`, `getGlobalAppStats`, `createGlobalApp`, `updateGlobalApp`, `deleteGlobalApp`, `regenerateAppCredentials` |
140
+ | User profile and sessions | `getUserSessions`, `revokeSession`, `getUserActivity` |
141
+ | Organizations, members, and apps | `getOrganizationById`, `updateOrganization`, `deleteOrganization`, `getOrgRoleDefinitions`, `upsertOrgRoleDefinition`, `deleteOrgRoleDefinition`, `createInvitation`, `getOrgInvitations`, `getOrgMembers`, `cancelInvitation`, `resendInvitation`, `removeMember`, `updateMemberRoles`, `transferOwnership`, `getInvitationByToken`, `acceptInvitation`, `bulkCreateInvitations`, `getGlobalApps`, `getAppConnections`, `toggleAppConnection`, `updateAppRoleMappings` |
142
+ | Billing | `getBillingPlan`, `getBillingPlansForOrganizationId`, `getPaddleConfig` |
143
+ | Passport and alerts | `createPassportEnrollmentChallenge`, `completePassportEnrollment`, `getPassportDevices`, `revokePassportDevice`, `createPassportChallenge`, `approvePassportChallenge`, `rejectPassportChallenge`, `registerPassportPushToken`, `listPendingPassportChallenges`, `getPassportChallengeByHint`, `markPassportChallengeSeen`, `getPassportDashboard`, `listPassportAlerts`, `getPassportAlertByHint`, `markPassportAlertSeen`, `dismissPassportAlert`, `upsertAlertRule`, `getAlertRules`, `deleteAlertRule` |
144
+ | Global administration | `suspendUser`, `checkGlobalAdmin`, `getGlobalAppStats`, `createGlobalApp`, `updateGlobalApp`, `deleteGlobalApp`, `regenerateAppCredentials` |
144
145
 
145
146
  ## Server SDK
146
147
 
@@ -228,7 +229,28 @@ if (!authResult) {
228
229
  console.log(authResult.account.role, authResult.authSource);
229
230
  ```
230
231
 
231
- In `auto` mode, the service tries local auth first when the account allows `local`; if that fails and the account allows `idp.global`, it uses the configured `IdpGlobalServerClient`. `IdpGlobalServerClient` defaults to the hosted `https://idp.global` endpoint; pass `{ baseUrl }` only for self-hosted or staging IdP instances. idp.global authentication is accepted only when the returned user email matches the local account email and the returned user ID matches the stored `idpSubject` when one is already set.
232
+ In `auto` mode, the service tries local auth first when the account allows `local`; if that fails and the account allows `idp.global`, it uses the configured `IdpGlobalServerClient`. `IdpGlobalServerClient` defaults to the hosted `https://idp.global` endpoint; pass `{ baseUrl }` only for self-hosted or staging IdP instances. Pass `{ backendToken }` when a backend service should fetch JWT validation data or subscribe to key/blocklist pushes. idp.global authentication is accepted only when the returned user email matches the local account email and the returned user ID matches the stored `idpSubject` when one is already set.
233
+
234
+ Backend services can register for JWT validation updates after constructing a server client with a backend token:
235
+
236
+ ```ts
237
+ const idpClient = new IdpGlobalServerClient({
238
+ baseUrl: process.env.IDP_URL,
239
+ backendToken: process.env.IDP_BACKEND_TOKEN,
240
+ });
241
+
242
+ idpClient.onPublicKeyPush((publicKeyPem) => {
243
+ // update the local JWT verifier key cache
244
+ });
245
+
246
+ idpClient.onBlocklistPush((blockedJwtIds) => {
247
+ // update the local JWT ID blocklist
248
+ });
249
+
250
+ await idpClient.registerBackendService();
251
+ const publicKeyPem = await idpClient.getPublicKeyForValidation();
252
+ const blockedJwtIds = await idpClient.getJwtIdBlocklist();
253
+ ```
232
254
 
233
255
  ### Server API Surface
234
256
 
@@ -236,7 +258,7 @@ In `auto` mode, the service tries local auth first when the account allows `loca
236
258
  | --- | --- |
237
259
  | `SmartdataAccountStore` | Smartdata-backed account persistence and local password verification. |
238
260
  | `AccountAuthService` | Existing-account authentication orchestration for `local`, `idp.global`, and `auto`. |
239
- | `IdpGlobalServerClient` | Typed-socket client for idp.global password login, JWT refresh, and `whoIs` lookup. |
261
+ | `IdpGlobalServerClient` | Typed-socket client for idp.global password login, JWT refresh, `whoIs` lookup, backend JWT validation fetches, and JWT key/blocklist pushes. |
240
262
  | `PasswordHasher` | Static `hashPassword()` and `verifyPassword()` helpers using `scrypt:v1`. |
241
263
  | `IdpSdkAccountDoc` | Smartdata document class backing persisted SDK accounts. |
242
264
  | `setAccountDocSmartdataDb()` | Configure the active Smartdata DB for `IdpSdkAccountDoc`. Usually handled by `SmartdataAccountStore`. |
@@ -254,7 +276,7 @@ The server export includes these TypeScript types:
254
276
  | `ICreateIdpSdkAccountOptions` | Input for account creation. |
255
277
  | `IAuthenticateAccountOptions` | Input for `AccountAuthService.authenticate()`. |
256
278
  | `IAuthenticatedAccountResult` | Successful auth result with account, auth source, and optional idp.global tokens. |
257
- | `IIdpGlobalServerClientOptions` | Server client configuration with optional `baseUrl`; defaults to `https://idp.global`. |
279
+ | `IIdpGlobalServerClientOptions` | Server client configuration with optional `baseUrl` and `backendToken`; defaults to `https://idp.global`. |
258
280
  | `IIdpPasswordAuthResult` | idp.global user, JWT, and refresh-token result. |
259
281
 
260
282
  ## Runtime Notes
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@idp.global/sdk',
6
- version: '5.0.1',
6
+ version: '6.0.1',
7
7
  description: 'Reusable browser and server SDK for idp.global authentication.'
8
8
  }
@@ -126,14 +126,15 @@ export class IdpClient {
126
126
  return null;
127
127
  }
128
128
 
129
- await this.typedsocketDeferred.promise;
129
+ await this.enableTypedSocket();
130
130
  const refreshJwtReq = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RefreshJwt>('refreshJwt');
131
- const response = await refreshJwtReq
132
- .fire({ refreshToken })
133
- .catch(async () => {
131
+ const response = await refreshJwtReq.fire({ refreshToken }).catch(async (error) => {
132
+ if (this.isAuthInvalidResponse(error)) {
134
133
  await this.clearAuthState();
135
134
  return null;
136
- });
135
+ }
136
+ throw error;
137
+ });
137
138
 
138
139
  if (!response?.jwt) {
139
140
  await this.clearAuthState();
@@ -149,13 +150,37 @@ export class IdpClient {
149
150
  return response.jwt;
150
151
  }
151
152
 
153
+ private isAuthInvalidResponse(errorArg: unknown): boolean {
154
+ if (!errorArg || typeof errorArg !== 'object') {
155
+ return false;
156
+ }
157
+ const errorText = (errorArg as { errorText?: unknown }).errorText;
158
+ return errorText === 'Invalid JWT' || errorText === 'User not found';
159
+ }
160
+
161
+ private async validateJwtWithServer(jwtStringArg: string): Promise<boolean> {
162
+ await this.enableTypedSocket();
163
+ const whoIs = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_WhoIs>('whoIs');
164
+ try {
165
+ await whoIs.fire({ jwt: jwtStringArg });
166
+ return true;
167
+ } catch (error) {
168
+ if (this.isAuthInvalidResponse(error)) {
169
+ await this.clearAuthState();
170
+ this.statusObservable.next('loggedOut');
171
+ return false;
172
+ }
173
+ throw error;
174
+ }
175
+ }
176
+
152
177
  public async getTransferToken(appDataArg?: plugins.idpInterfaces.data.IAppLegacy): Promise<string | null> {
153
178
  await this.performJwtHousekeeping();
154
179
  const refreshToken = await this.getRefreshToken();
155
180
  if (!refreshToken) {
156
181
  return null;
157
182
  }
158
- await this.typedsocketDeferred.promise;
183
+ await this.enableTypedSocket();
159
184
  const getTransferToken = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ExchangeRefreshTokenAndTransferToken>('exchangeRefreshTokenAndTransferToken');
160
185
  const response = await getTransferToken.fire({
161
186
  refreshToken,
@@ -193,7 +218,7 @@ export class IdpClient {
193
218
  const transferToken = url.searchParams['transfertoken'];
194
219
  if (transferToken) {
195
220
  this.scrubTransferTokenFromCurrentUrl();
196
- await this.typedsocketDeferred.promise;
221
+ await this.enableTypedSocket();
197
222
  const getTransferToken = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ExchangeRefreshTokenAndTransferToken>('exchangeRefreshTokenAndTransferToken');
198
223
  const response = await getTransferToken.fire({
199
224
  transferToken,
@@ -212,14 +237,16 @@ export class IdpClient {
212
237
 
213
238
  public async checkJwtPresent() {
214
239
  const jwt = await this.performJwtHousekeeping();
215
- return !!jwt;
240
+ if (!jwt) {
241
+ return false;
242
+ }
243
+ return this.validateJwtWithServer(jwt);
216
244
  }
217
245
 
218
246
  public async determineLoginStatus(requireLoginArg: boolean = false): Promise<boolean> {
219
247
  const jwtPresent = await this.checkJwtPresent();
220
248
  if (jwtPresent) {
221
- const jwt = await this.performJwtHousekeeping();
222
- return !!jwt;
249
+ return true;
223
250
  }
224
251
  const refreshToken = await this.getRefreshToken();
225
252
  if (refreshToken) {
@@ -273,27 +300,53 @@ export class IdpClient {
273
300
  }
274
301
  }
275
302
 
303
+ private typedsocketStopRequested = false;
304
+ private typedsocketAbortController?: AbortController;
276
305
  public typedsocketDeferred = plugins.smartpromise.defer<plugins.typedsocket.TypedSocket>();
277
306
 
278
307
  public async enableTypedSocket() {
279
308
  if (this.typedsocketDeferred.claimed) {
280
309
  return this.typedsocketDeferred.promise;
281
310
  }
311
+ this.typedsocketStopRequested = false;
312
+ const abortController = new AbortController();
313
+ this.typedsocketAbortController = abortController;
282
314
  this.typedsocketDeferred.claim();
283
- this.typedsocket = await plugins.typedsocket.TypedSocket.createClient(
284
- this.typedrouter,
285
- this.parsedReceptionUrl.toString(),
286
- );
287
- this.typedsocketDeferred.resolve(this.typedsocket);
288
- return this.typedsocketDeferred.promise;
315
+ try {
316
+ const typedsocket = await plugins.typedsocket.TypedSocket.createClient(
317
+ this.typedrouter,
318
+ this.parsedReceptionUrl.toString(),
319
+ { abortSignal: abortController.signal },
320
+ );
321
+ if (this.typedsocketStopRequested) {
322
+ await typedsocket.stop();
323
+ throw new Error('TypedSocket start was stopped');
324
+ }
325
+ this.typedsocket = typedsocket;
326
+ this.typedsocketDeferred.resolve(this.typedsocket);
327
+ return this.typedsocket;
328
+ } catch (error) {
329
+ if (this.typedsocketAbortController === abortController) {
330
+ this.typedsocketAbortController = undefined;
331
+ }
332
+ void this.typedsocketDeferred.promise.catch(() => {});
333
+ this.typedsocketDeferred.reject(error);
334
+ this.typedsocketDeferred = plugins.smartpromise.defer<plugins.typedsocket.TypedSocket>();
335
+ throw error;
336
+ }
289
337
  }
290
338
 
291
339
  public async stop() {
340
+ this.typedsocketStopRequested = true;
341
+ this.typedsocketAbortController?.abort();
292
342
  await this.typedsocket?.stop();
343
+ if (this.typedsocketDeferred.status === 'fulfilled') {
344
+ this.typedsocketDeferred = plugins.smartpromise.defer<plugins.typedsocket.TypedSocket>();
345
+ }
293
346
  }
294
347
 
295
348
  public async createOrganization(orgNameArg: string, orgSlugArg: string, modeArg: 'checkAvailability' | 'manifest') {
296
- await this.typedsocketDeferred.promise;
349
+ await this.enableTypedSocket();
297
350
  const validateOrg = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CreateOrganization>('createOrganization');
298
351
  return validateOrg.fire({
299
352
  jwt: await this.getJwt(),
@@ -305,7 +358,7 @@ export class IdpClient {
305
358
  }
306
359
 
307
360
  public async getRolesAndOrganizations() {
308
- await this.typedsocketDeferred.promise;
361
+ await this.enableTypedSocket();
309
362
  const rolesAndOrganizationsForUserId = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetRolesAndOrganizationsForUserId>('getRolesAndOrganizationsForUserId');
310
363
  return rolesAndOrganizationsForUserId.fire({
311
364
  jwt: await this.getJwt(),
@@ -314,7 +367,7 @@ export class IdpClient {
314
367
  }
315
368
 
316
369
  public async updatePaddleCheckoutId(orgIdArg: string, checkoutIdArg: string) {
317
- await this.typedsocketDeferred.promise;
370
+ await this.enableTypedSocket();
318
371
  const updateBillingPlan = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_UpdatePaymentMethod>('updatePaymentMethod');
319
372
  return updateBillingPlan.fire({
320
373
  jwtString: await this.getJwt(),
@@ -324,7 +377,7 @@ export class IdpClient {
324
377
  }
325
378
 
326
379
  public async whoIs() {
327
- await this.typedsocketDeferred.promise;
380
+ await this.enableTypedSocket();
328
381
  const whoIs = this.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_WhoIs>('whoIs');
329
382
  return whoIs.fire({ jwt: await this.getJwt() });
330
383
  }
@@ -72,14 +72,6 @@ export class IdpRequests {
72
72
  return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_FirstRegistration>('firstRegistrationRequest');
73
73
  }
74
74
 
75
- public get getUserData() {
76
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetUserData>('getUserData');
77
- }
78
-
79
- public get setUserData() {
80
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_SetUserData>('setUserData');
81
- }
82
-
83
75
  public get getUserSessions() {
84
76
  return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetUserSessions>('getUserSessions');
85
77
  }
@@ -216,32 +208,108 @@ export class IdpRequests {
216
208
  return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_UpdateAppRoleMappings>('updateAppRoleMappings');
217
209
  }
218
210
 
219
- public get getBillingPlan() {
220
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetBillingPlan>('getBillingPlan');
211
+ public get getGlobalApps() {
212
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetGlobalApps>('getGlobalApps');
221
213
  }
222
214
 
223
- public get getPaddleConfig() {
224
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPaddleConfig>('getPaddleConfig');
215
+ public get getAppConnections() {
216
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetAppConnections>('getAppConnections');
225
217
  }
226
218
 
227
- public get getPublicKeyForValidation() {
228
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPublicKeyForValidation>('getPublicKeyForValidation');
219
+ public get toggleAppConnection() {
220
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ToggleAppConnection>('toggleAppConnection');
229
221
  }
230
222
 
231
- public get pushPublicKeyForValidation() {
232
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_PushPublicKeyForValidation>('pushPublicKeyForValidation');
223
+ public get createPassportEnrollmentChallenge() {
224
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CreatePassportEnrollmentChallenge>('createPassportEnrollmentChallenge');
233
225
  }
234
226
 
235
- public get pushOrGetJwtIdBlocklist() {
236
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist>('pushOrGetJwtIdBlocklist');
227
+ public get completePassportEnrollment() {
228
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CompletePassportEnrollment>('completePassportEnrollment');
237
229
  }
238
230
 
239
- public get suspendUser() {
240
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_SuspendUser>('suspendUser');
231
+ public get getPassportDevices() {
232
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportDevices>('getPassportDevices');
233
+ }
234
+
235
+ public get revokePassportDevice() {
236
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RevokePassportDevice>('revokePassportDevice');
237
+ }
238
+
239
+ public get createPassportChallenge() {
240
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_CreatePassportChallenge>('createPassportChallenge');
241
+ }
242
+
243
+ public get approvePassportChallenge() {
244
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ApprovePassportChallenge>('approvePassportChallenge');
245
+ }
246
+
247
+ public get rejectPassportChallenge() {
248
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RejectPassportChallenge>('rejectPassportChallenge');
249
+ }
250
+
251
+ public get registerPassportPushToken() {
252
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_RegisterPassportPushToken>('registerPassportPushToken');
253
+ }
254
+
255
+ public get listPendingPassportChallenges() {
256
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ListPendingPassportChallenges>('listPendingPassportChallenges');
257
+ }
258
+
259
+ public get getPassportChallengeByHint() {
260
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportChallengeByHint>('getPassportChallengeByHint');
261
+ }
262
+
263
+ public get markPassportChallengeSeen() {
264
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_MarkPassportChallengeSeen>('markPassportChallengeSeen');
265
+ }
266
+
267
+ public get getPassportDashboard() {
268
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportDashboard>('getPassportDashboard');
269
+ }
270
+
271
+ public get listPassportAlerts() {
272
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_ListPassportAlerts>('listPassportAlerts');
273
+ }
274
+
275
+ public get getPassportAlertByHint() {
276
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPassportAlertByHint>('getPassportAlertByHint');
277
+ }
278
+
279
+ public get markPassportAlertSeen() {
280
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_MarkPassportAlertSeen>('markPassportAlertSeen');
241
281
  }
242
282
 
243
- public get deleteSuspendedUser() {
244
- return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IDeleteSuspendedUser>('deleteSuspendedUser');
283
+ public get dismissPassportAlert() {
284
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_DismissPassportAlert>('dismissPassportAlert');
285
+ }
286
+
287
+ public get upsertAlertRule() {
288
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_UpsertAlertRule>('upsertAlertRule');
289
+ }
290
+
291
+ public get getAlertRules() {
292
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetAlertRules>('getAlertRules');
293
+ }
294
+
295
+ public get deleteAlertRule() {
296
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_DeleteAlertRule>('deleteAlertRule');
297
+ }
298
+
299
+ public get getBillingPlan() {
300
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetBillingPlan>('getBillingPlan');
301
+ }
302
+
303
+ public get getBillingPlansForOrganizationId() {
304
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPlansForOrganizationId>('getBillingPlansForOrganizationId');
305
+ }
306
+
307
+ public get getPaddleConfig() {
308
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPaddleConfig>('getPaddleConfig');
309
+ }
310
+
311
+ public get suspendUser() {
312
+ return this.idpClientArg.typedsocket.createTypedRequest<plugins.idpInterfaces.request.IReq_SuspendUser>('suspendUser');
245
313
  }
246
314
 
247
315
  public get checkGlobalAdmin() {