@idp.global/sdk 14.4.1 → 15.0.0

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/changelog.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-08-02 - 15.0.0
4
+
5
+ ### Breaking Changes
6
+
7
+ - adopt explicit backend connection registration (server-client)
8
+ - Replace client-owned backend-service tag assignment with registerBackendServiceConnection requests.
9
+ - Authenticate backend physical connections and reconnects through TypedSocket restoration before they become available.
10
+ - Persist successful explicit backend token registration as reconnect restoration state.
11
+ - Upgrade TypedRequest, TypedSocket, idp.global interfaces, and add SmartServe for the updated RPC contract.
12
+
3
13
  ## 2026-07-27 - 14.4.1
4
14
 
5
15
  ### Fixes
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@idp.global/sdk',
6
- version: '14.4.1',
6
+ version: '15.0.0',
7
7
  description: 'Reusable browser and server SDK for idp.global authentication.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLGdFQUFnRTtDQUM5RSxDQUFBIn0=
@@ -29,6 +29,7 @@ export declare class IdpGlobalServerClient {
29
29
  private connectionAbortController?;
30
30
  private stopWaiters;
31
31
  private stopping;
32
+ private backendToken?;
32
33
  constructor(optionsArg?: IIdpGlobalServerClientOptions);
33
34
  connect(): Promise<plugins.typedsocket.TypedSocket>;
34
35
  stop(): Promise<void>;
@@ -43,7 +44,6 @@ export declare class IdpGlobalServerClient {
43
44
  }): Promise<IIdpPasswordAuthResult>;
44
45
  private getTypedRequestUrl;
45
46
  private requireBackendToken;
46
- private applyBackendServiceTag;
47
47
  private createConnectionDeferred;
48
48
  private raceWithStop;
49
49
  private rejectStopWaiters;
@@ -22,8 +22,10 @@ export class IdpGlobalServerClient {
22
22
  connectionAbortController;
23
23
  stopWaiters = new Set();
24
24
  stopping = false;
25
+ backendToken;
25
26
  constructor(optionsArg = {}) {
26
27
  this.optionsArg = optionsArg;
28
+ this.backendToken = optionsArg.backendToken;
27
29
  this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('pushPublicKeysForValidation', async (requestArg) => {
28
30
  await Promise.all(this.publicKeysPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeys)));
29
31
  return {};
@@ -50,7 +52,20 @@ export class IdpGlobalServerClient {
50
52
  const connectionAbortController = new AbortController();
51
53
  try {
52
54
  this.connectionAbortController = connectionAbortController;
53
- socketPromise = plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl(), { autoReconnect: true, abortSignal: connectionAbortController.signal });
55
+ socketPromise = plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.getTypedRequestUrl(), {
56
+ autoReconnect: true,
57
+ abortSignal: connectionAbortController.signal,
58
+ restoreConnection: async ({ createTypedRequest }) => {
59
+ const backendToken = this.backendToken;
60
+ if (!backendToken) {
61
+ return;
62
+ }
63
+ const response = await createTypedRequest('registerBackendServiceConnection').fire({ backendToken });
64
+ if (response.registered !== true) {
65
+ throw new Error('IdP rejected backend-service connection registration.');
66
+ }
67
+ },
68
+ });
54
69
  this.pendingSocketPromise = socketPromise;
55
70
  createdSocket = await this.raceWithStop(socketPromise);
56
71
  if (generation !== this.connectionGeneration) {
@@ -64,7 +79,8 @@ export class IdpGlobalServerClient {
64
79
  deferred.resolve(createdSocket);
65
80
  }
66
81
  catch (error) {
67
- if (generation === this.connectionGeneration && (!createdSocket || this.typedsocket === createdSocket)) {
82
+ if (generation === this.connectionGeneration &&
83
+ (!createdSocket || this.typedsocket === createdSocket)) {
68
84
  this.typedsocket = undefined;
69
85
  }
70
86
  await createdSocket?.stop().catch(() => undefined);
@@ -120,12 +136,17 @@ export class IdpGlobalServerClient {
120
136
  this.blocklistPushHandlers = this.blocklistPushHandlers.filter((handler) => handler !== handlerArg);
121
137
  };
122
138
  }
123
- async registerBackendService(backendTokenArg = this.optionsArg.backendToken) {
139
+ async registerBackendService(backendTokenArg = this.backendToken) {
124
140
  const backendToken = this.requireBackendToken(backendTokenArg);
125
141
  const socket = await this.connect();
126
- await this.applyBackendServiceTag(socket, backendToken);
142
+ const request = socket.createTypedRequest('registerBackendServiceConnection');
143
+ const response = await this.raceWithStop(request.fire({ backendToken }));
144
+ if (response.registered !== true) {
145
+ throw new Error('IdP rejected backend-service connection registration.');
146
+ }
147
+ this.backendToken = backendToken;
127
148
  }
128
- async getPublicKeysForValidation(backendTokenArg = this.optionsArg.backendToken) {
149
+ async getPublicKeysForValidation(backendTokenArg = this.backendToken) {
129
150
  const backendToken = this.requireBackendToken(backendTokenArg);
130
151
  const socket = await this.connect();
131
152
  const request = socket.createTypedRequest('getPublicKeysForValidation');
@@ -135,7 +156,7 @@ export class IdpGlobalServerClient {
135
156
  }
136
157
  return response.publicKeys;
137
158
  }
138
- async getJwtIdBlocklist(backendTokenArg = this.optionsArg.backendToken) {
159
+ async getJwtIdBlocklist(backendTokenArg = this.backendToken) {
139
160
  const backendToken = this.requireBackendToken(backendTokenArg);
140
161
  const socket = await this.connect();
141
162
  const request = socket.createTypedRequest('pushOrGetJwtIdBlocklist');
@@ -187,11 +208,6 @@ export class IdpGlobalServerClient {
187
208
  }
188
209
  return backendTokenArg;
189
210
  }
190
- async applyBackendServiceTag(socketArg, backendTokenArg) {
191
- await this.raceWithStop(socketArg.setTag('backend-service', {
192
- backendToken: backendTokenArg,
193
- }));
194
- }
195
211
  createConnectionDeferred() {
196
212
  const deferred = plugins.smartpromise.defer();
197
213
  deferred.promise.catch(() => undefined);
@@ -217,4 +233,4 @@ export class IdpGlobalServerClient {
217
233
  this.stopWaiters.clear();
218
234
  }
219
235
  }
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFBeUc7UUFDbkgsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztRQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8scUJBQXFCO0lBY1o7SUFiWixXQUFXLEdBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdEQsc0JBQXNCLEdBRUQsRUFBRSxDQUFDO0lBQ3hCLHFCQUFxQixHQUFnRSxFQUFFLENBQUM7SUFDeEYsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLG9CQUFvQixDQUE0QztJQUNoRSx5QkFBeUIsQ0FBbUI7SUFDNUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBQ25ELFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFekIsWUFBb0IsYUFBNEMsRUFBRTtRQUE5QyxlQUFVLEdB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
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zZXJ2ZXIvY2xhc3Nlcy5pZHAtZ2xvYmFsLXNlcnZlci1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFPeEMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsb0JBQW9CLENBQUM7QUFRNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDckMsaUJBQWlCLENBQVM7SUFDMUIsbUJBQW1CLENBQTBDO0lBRXBFLFlBQVksVUFHWDtRQUNDLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFDbEUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHFCQUFxQjtJQWlCWjtJQWhCWixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JELFdBQVcsQ0FBbUM7SUFDOUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDdEQsc0JBQXNCLEdBRUQsRUFBRSxDQUFDO0lBQ3hCLHFCQUFxQixHQUV6QixFQUFFLENBQUM7SUFDQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsb0JBQW9CLENBQTRDO0lBQ2hFLHlCQUF5QixDQUFtQjtJQUM1QyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFDbkQsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixZQUFZLENBQVU7SUFFOUIsWUFBb0IsYUFBNEMsRUFBRTtRQUE5QyxlQUFVLEdBQVYsVUFBVSxDQUFvQztRQUNoRSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBRW5DLDZCQUE2QixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUNwRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUNuRixDQUFDO1lBQ0YsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQzlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBRW5DLHlCQUF5QixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUNoRCxJQUFJLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUM1QyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWMsQ0FBQyxDQUN0QyxDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBQzFDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQzdDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixJQUFJLGFBQTBELENBQUM7UUFDL0QsSUFBSSxhQUFtRSxDQUFDO1FBQ3hFLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7WUFDM0QsYUFBYSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDMUQsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQ3pCO2dCQUNFLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixXQUFXLEVBQUUseUJBQXlCLENBQUMsTUFBTTtnQkFDN0MsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFO29CQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUN2QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ2xCLE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGtCQUFrQixDQUV2QyxrQ0FBa0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7b0JBQzdELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO29CQUMzRSxDQUFDO2dCQUNILENBQUM7YUFDRixDQUNGLENBQUM7WUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO1lBQzFDLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzdDLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2xDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxDQUFDO2dCQUMvRSxDQUFDO2dCQUNELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUMxQixDQUFDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7WUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQ0UsVUFBVSxLQUFLLElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3hDLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxhQUFhLENBQUMsRUFDdEQsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUMvQixDQUFDO1lBQ0QsTUFBTSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7WUFDeEMsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLHlCQUF5QixFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxTQUFTLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNoQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUN2RCxJQUFJLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0RixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNyQixNQUFNLGFBQWEsR0FBRyxNQUFNLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RSxJQUFJLGFBQWEsSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDOUMsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRU0sZ0JBQWdCLENBQ3JCLFVBRXlCO1FBRXpCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FDOUQsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQ3BDLENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU0sZUFBZSxDQUNwQixVQUFnRTtRQUVoRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQzVELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUNwQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxzQkFBc0IsQ0FDakMsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZO1FBRW5DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBRXZDLGtDQUFrQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVNLEtBQUssQ0FBQywwQkFBMEIsQ0FDckMsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZO1FBRW5DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBRXZDLDRCQUE0QixDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQzVCLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWTtRQUVuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUV2Qyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sUUFBUSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxVQUd0QztRQUNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FFNUMscUNBQXFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQzNDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDaEIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQzFCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtTQUM5QixDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQztnQkFDNUIsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjtnQkFDbEQsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLG1CQUFtQjthQUN2RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FFOUMsWUFBWSxDQUFDLENBQUM7UUFDaEIsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUM3QyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUNsRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FFNUMsT0FBTyxDQUFDLENBQUM7UUFDWCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQzNDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQ2hELENBQUM7UUFDRixPQUFPO1lBQ0wsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQ3hCLEdBQUcsRUFBRSxlQUFlLENBQUMsR0FBRztZQUN4QixZQUFZLEVBQUUsZUFBZSxDQUFDLFlBQVksSUFBSSxhQUFhLENBQUMsWUFBWTtTQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLHVCQUF1QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxHQUFHLEdBQUcsT0FBTyxlQUFlLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxlQUF3QjtRQUNsRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFtQyxDQUFDO1FBQy9FLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxZQUFZLENBQUksVUFBc0I7UUFDNUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBZSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFlO1FBQ3ZDLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idp.global/sdk",
3
- "version": "14.4.1",
3
+ "version": "15.0.0",
4
4
  "private": false,
5
5
  "description": "Reusable browser and server SDK for idp.global authentication.",
6
6
  "type": "module",
@@ -14,14 +14,15 @@
14
14
  "author": "Task Venture Capital GmbH",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@api.global/typedrequest": "^3.4.0",
18
- "@api.global/typedrequest-interfaces": "^3.0.19",
19
- "@api.global/typedsocket": "^4.2.5",
20
- "@idp.global/interfaces": "^26.2.0",
17
+ "@api.global/typedrequest": "^5.2.1",
18
+ "@api.global/typedrequest-interfaces": "^5.1.1",
19
+ "@api.global/typedsocket": "^6.0.0",
20
+ "@idp.global/interfaces": "^29.0.0",
21
21
  "@push.rocks/smartdata": "^7.2.1",
22
22
  "@push.rocks/smartjson": "^6.0.1",
23
23
  "@push.rocks/smartpromise": "^4.2.4",
24
24
  "@push.rocks/smartrx": "^3.0.12",
25
+ "@push.rocks/smartserve": "^4.3.0",
25
26
  "@push.rocks/smarttime": "^4.2.3",
26
27
  "@push.rocks/smarturl": "^3.1.0",
27
28
  "@push.rocks/webjwt": "^1.0.10",
package/readme.md CHANGED
@@ -253,7 +253,10 @@ console.log(authResult.account.role, authResult.authSource);
253
253
 
254
254
  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.
255
255
 
256
- Backend services can register for JWT validation updates after constructing a server client with a backend token:
256
+ Backend services register for JWT validation updates by constructing a server
257
+ client with a backend token. The SDK authenticates every physical connection
258
+ and reconnect through TypedSocket's bounded restoration callback before the
259
+ connection becomes available:
257
260
 
258
261
  ```ts
259
262
  const idpClient = new IdpGlobalServerClient({
@@ -269,11 +272,17 @@ idpClient.onBlocklistPush((blockedJwtIds) => {
269
272
  // replace the local JWT ID blocklist with this complete persisted snapshot
270
273
  });
271
274
 
272
- await idpClient.registerBackendService();
273
275
  const publicKeys = await idpClient.getPublicKeysForValidation();
274
276
  const blockedJwtIds = await idpClient.getJwtIdBlocklist();
275
277
  ```
276
278
 
279
+ `registerBackendService()` remains available for an explicit registration. A
280
+ successful explicit token becomes the client's restoration state, so every
281
+ later physical reconnect authenticates with that token before the connection
282
+ becomes available. Both paths fire the exact `registerBackendServiceConnection`
283
+ request; clients never assign the protected backend-service role tag
284
+ themselves.
285
+
277
286
  Verification is keyset-only. Replace the cached snapshot on every push, select
278
287
  the verification key by the JWT header `kid`, and reject unknown key IDs.
279
288
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@idp.global/sdk',
6
- version: '14.4.1',
6
+ version: '15.0.0',
7
7
  description: 'Reusable browser and server SDK for idp.global authentication.'
8
8
  }
@@ -17,7 +17,10 @@ export class IdpMfaRequiredError extends Error {
17
17
  public mfaChallengeToken: string;
18
18
  public availableMfaMethods: plugins.idpInterfaces.data.TMfaMethod[];
19
19
 
20
- constructor(optionsArg: { mfaChallengeToken?: string; availableMfaMethods?: plugins.idpInterfaces.data.TMfaMethod[] }) {
20
+ constructor(optionsArg: {
21
+ mfaChallengeToken?: string;
22
+ availableMfaMethods?: plugins.idpInterfaces.data.TMfaMethod[];
23
+ }) {
21
24
  super('Two-factor authentication is required');
22
25
  this.name = 'IdpMfaRequiredError';
23
26
  this.mfaChallengeToken = optionsArg.mfaChallengeToken || '';
@@ -26,41 +29,47 @@ export class IdpMfaRequiredError extends Error {
26
29
  }
27
30
 
28
31
  export class IdpGlobalServerClient {
29
- private typedrouter: any = new plugins.typedrequest.TypedRouter();
32
+ private typedrouter = new plugins.typedrequest.TypedRouter();
30
33
  private typedsocket?: plugins.typedsocket.TypedSocket;
31
34
  private typedsocketDeferred = this.createConnectionDeferred();
32
35
  private publicKeysPushHandlers: Array<(
33
36
  publicKeysArg: plugins.idpInterfaces.data.IJwtVerificationKey[]
34
37
  ) => void | Promise<void>> = [];
35
- private blocklistPushHandlers: Array<(blockedJwtIdsArg: string[]) => void | Promise<void>> = [];
38
+ private blocklistPushHandlers: Array<
39
+ (blockedJwtIdsArg: string[]) => void | Promise<void>
40
+ > = [];
36
41
  private connectionGeneration = 0;
37
42
  private pendingSocketPromise?: Promise<plugins.typedsocket.TypedSocket>;
38
43
  private connectionAbortController?: AbortController;
39
44
  private stopWaiters = new Set<(errorArg: Error) => void>();
40
45
  private stopping = false;
46
+ private backendToken?: string;
41
47
 
42
48
  constructor(private optionsArg: IIdpGlobalServerClientOptions = {}) {
49
+ this.backendToken = optionsArg.backendToken;
43
50
  this.typedrouter.addTypedHandler(
44
- new plugins.typedrequest.TypedHandler<plugins.idpInterfaces.request.IReq_PushPublicKeysForValidation>(
45
- 'pushPublicKeysForValidation',
46
- async (requestArg) => {
47
- await Promise.all(
48
- this.publicKeysPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeys))
49
- );
50
- return {};
51
- }
52
- )
51
+ new plugins.typedrequest.TypedHandler<
52
+ plugins.idpInterfaces.request.IReq_PushPublicKeysForValidation
53
+ >('pushPublicKeysForValidation', async (requestArg) => {
54
+ await Promise.all(
55
+ this.publicKeysPushHandlers.map((handlerArg) => handlerArg(requestArg.publicKeys))
56
+ );
57
+ return {};
58
+ })
53
59
  );
54
60
  this.typedrouter.addTypedHandler(
55
- new plugins.typedrequest.TypedHandler<plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist>(
56
- 'pushOrGetJwtIdBlocklist',
57
- async (requestArg) => {
58
- if (requestArg.blockedJwtIds) {
59
- await Promise.all(this.blocklistPushHandlers.map((handlerArg) => handlerArg(requestArg.blockedJwtIds!)));
60
- }
61
- return {};
61
+ new plugins.typedrequest.TypedHandler<
62
+ plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist
63
+ >('pushOrGetJwtIdBlocklist', async (requestArg) => {
64
+ if (requestArg.blockedJwtIds) {
65
+ await Promise.all(
66
+ this.blocklistPushHandlers.map((handlerArg) =>
67
+ handlerArg(requestArg.blockedJwtIds!)
68
+ )
69
+ );
62
70
  }
63
- )
71
+ return {};
72
+ })
64
73
  );
65
74
  }
66
75
 
@@ -82,7 +91,22 @@ export class IdpGlobalServerClient {
82
91
  socketPromise = plugins.typedsocket.TypedSocket.createClient(
83
92
  this.typedrouter,
84
93
  this.getTypedRequestUrl(),
85
- { autoReconnect: true, abortSignal: connectionAbortController.signal },
94
+ {
95
+ autoReconnect: true,
96
+ abortSignal: connectionAbortController.signal,
97
+ restoreConnection: async ({ createTypedRequest }) => {
98
+ const backendToken = this.backendToken;
99
+ if (!backendToken) {
100
+ return;
101
+ }
102
+ const response = await createTypedRequest<
103
+ plugins.idpInterfaces.request.IReq_RegisterBackendServiceConnection
104
+ >('registerBackendServiceConnection').fire({ backendToken });
105
+ if (response.registered !== true) {
106
+ throw new Error('IdP rejected backend-service connection registration.');
107
+ }
108
+ },
109
+ }
86
110
  );
87
111
  this.pendingSocketPromise = socketPromise;
88
112
  createdSocket = await this.raceWithStop(socketPromise);
@@ -96,7 +120,10 @@ export class IdpGlobalServerClient {
96
120
  this.typedsocket = createdSocket;
97
121
  deferred.resolve(createdSocket);
98
122
  } catch (error) {
99
- if (generation === this.connectionGeneration && (!createdSocket || this.typedsocket === createdSocket)) {
123
+ if (
124
+ generation === this.connectionGeneration &&
125
+ (!createdSocket || this.typedsocket === createdSocket)
126
+ ) {
100
127
  this.typedsocket = undefined;
101
128
  }
102
129
  await createdSocket?.stop().catch(() => undefined);
@@ -148,29 +175,46 @@ export class IdpGlobalServerClient {
148
175
  ): () => void {
149
176
  this.publicKeysPushHandlers.push(handlerArg);
150
177
  return () => {
151
- this.publicKeysPushHandlers = this.publicKeysPushHandlers.filter((handler) => handler !== handlerArg);
178
+ this.publicKeysPushHandlers = this.publicKeysPushHandlers.filter(
179
+ (handler) => handler !== handlerArg
180
+ );
152
181
  };
153
182
  }
154
183
 
155
- public onBlocklistPush(handlerArg: (blockedJwtIdsArg: string[]) => void | Promise<void>): () => void {
184
+ public onBlocklistPush(
185
+ handlerArg: (blockedJwtIdsArg: string[]) => void | Promise<void>
186
+ ): () => void {
156
187
  this.blocklistPushHandlers.push(handlerArg);
157
188
  return () => {
158
- this.blocklistPushHandlers = this.blocklistPushHandlers.filter((handler) => handler !== handlerArg);
189
+ this.blocklistPushHandlers = this.blocklistPushHandlers.filter(
190
+ (handler) => handler !== handlerArg
191
+ );
159
192
  };
160
193
  }
161
194
 
162
- public async registerBackendService(backendTokenArg = this.optionsArg.backendToken): Promise<void> {
195
+ public async registerBackendService(
196
+ backendTokenArg = this.backendToken
197
+ ): Promise<void> {
163
198
  const backendToken = this.requireBackendToken(backendTokenArg);
164
199
  const socket = await this.connect();
165
- await this.applyBackendServiceTag(socket, backendToken);
200
+ const request = socket.createTypedRequest<
201
+ plugins.idpInterfaces.request.IReq_RegisterBackendServiceConnection
202
+ >('registerBackendServiceConnection');
203
+ const response = await this.raceWithStop(request.fire({ backendToken }));
204
+ if (response.registered !== true) {
205
+ throw new Error('IdP rejected backend-service connection registration.');
206
+ }
207
+ this.backendToken = backendToken;
166
208
  }
167
209
 
168
210
  public async getPublicKeysForValidation(
169
- backendTokenArg = this.optionsArg.backendToken
211
+ backendTokenArg = this.backendToken
170
212
  ): Promise<plugins.idpInterfaces.data.IJwtVerificationKey[]> {
171
213
  const backendToken = this.requireBackendToken(backendTokenArg);
172
214
  const socket = await this.connect();
173
- const request = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_GetPublicKeysForValidation>('getPublicKeysForValidation');
215
+ const request = socket.createTypedRequest<
216
+ plugins.idpInterfaces.request.IReq_GetPublicKeysForValidation
217
+ >('getPublicKeysForValidation');
174
218
  const response = await this.raceWithStop(request.fire({ backendToken }));
175
219
  if (!Array.isArray(response.publicKeys) || response.publicKeys.length === 0) {
176
220
  throw new Error('IdP returned an invalid JWT verification key set.');
@@ -178,39 +222,58 @@ export class IdpGlobalServerClient {
178
222
  return response.publicKeys;
179
223
  }
180
224
 
181
- public async getJwtIdBlocklist(backendTokenArg = this.optionsArg.backendToken): Promise<string[]> {
225
+ public async getJwtIdBlocklist(
226
+ backendTokenArg = this.backendToken
227
+ ): Promise<string[]> {
182
228
  const backendToken = this.requireBackendToken(backendTokenArg);
183
229
  const socket = await this.connect();
184
- const request = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist>('pushOrGetJwtIdBlocklist');
230
+ const request = socket.createTypedRequest<
231
+ plugins.idpInterfaces.request.IReq_PushOrGetJwtIdBlocklist
232
+ >('pushOrGetJwtIdBlocklist');
185
233
  const response = await this.raceWithStop(request.fire({ backendToken }));
186
234
  return response.blockedJwtIds || [];
187
235
  }
188
236
 
189
- public async loginWithEmailAndPassword(optionsArg: { email: string; password: string }): Promise<IIdpPasswordAuthResult> {
237
+ public async loginWithEmailAndPassword(optionsArg: {
238
+ email: string;
239
+ password: string;
240
+ }): Promise<IIdpPasswordAuthResult> {
190
241
  const socket = await this.connect();
191
- const loginRequest = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_LoginWithEmailOrUsernameAndPassword>('loginWithEmailOrUsernameAndPassword');
192
- const loginResponse = await this.raceWithStop(loginRequest.fire({
193
- username: optionsArg.email,
194
- password: optionsArg.password,
195
- }));
242
+ const loginRequest = socket.createTypedRequest<
243
+ plugins.idpInterfaces.request.IReq_LoginWithEmailOrUsernameAndPassword
244
+ >('loginWithEmailOrUsernameAndPassword');
245
+ const loginResponse = await this.raceWithStop(
246
+ loginRequest.fire({
247
+ username: optionsArg.email,
248
+ password: optionsArg.password,
249
+ })
250
+ );
196
251
  if (loginResponse.twoFaNeeded) {
197
252
  throw new IdpMfaRequiredError({
198
- mfaChallengeToken: (loginResponse as any).mfaChallengeToken,
199
- availableMfaMethods: (loginResponse as any).availableMfaMethods,
253
+ mfaChallengeToken: loginResponse.mfaChallengeToken,
254
+ availableMfaMethods: loginResponse.availableMfaMethods,
200
255
  });
201
256
  }
202
257
  if (!loginResponse.refreshToken) {
203
258
  throw new Error('IdP login failed');
204
259
  }
205
260
 
206
- const refreshRequest = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_RefreshJwt>('refreshJwt');
207
- const refreshResponse = await this.raceWithStop(refreshRequest.fire({ refreshToken: loginResponse.refreshToken }));
261
+ const refreshRequest = socket.createTypedRequest<
262
+ plugins.idpInterfaces.request.IReq_RefreshJwt
263
+ >('refreshJwt');
264
+ const refreshResponse = await this.raceWithStop(
265
+ refreshRequest.fire({ refreshToken: loginResponse.refreshToken })
266
+ );
208
267
  if (!refreshResponse.jwt) {
209
268
  throw new Error('IdP did not return a JWT');
210
269
  }
211
270
 
212
- const whoIsRequest = socket.createTypedRequest<plugins.idpInterfaces.request.IReq_WhoIs>('whoIs');
213
- const whoIsResponse = await this.raceWithStop(whoIsRequest.fire({ jwt: refreshResponse.jwt }));
271
+ const whoIsRequest = socket.createTypedRequest<
272
+ plugins.idpInterfaces.request.IReq_WhoIs
273
+ >('whoIs');
274
+ const whoIsResponse = await this.raceWithStop(
275
+ whoIsRequest.fire({ jwt: refreshResponse.jwt })
276
+ );
214
277
  return {
215
278
  user: whoIsResponse.user,
216
279
  jwt: refreshResponse.jwt,
@@ -236,15 +299,6 @@ export class IdpGlobalServerClient {
236
299
  return backendTokenArg;
237
300
  }
238
301
 
239
- private async applyBackendServiceTag(
240
- socketArg: plugins.typedsocket.TypedSocket,
241
- backendTokenArg: string
242
- ): Promise<void> {
243
- await this.raceWithStop(socketArg.setTag<plugins.idpInterfaces.tags.ITag_BackendService>('backend-service', {
244
- backendToken: backendTokenArg,
245
- }));
246
- }
247
-
248
302
  private createConnectionDeferred() {
249
303
  const deferred = plugins.smartpromise.defer<plugins.typedsocket.TypedSocket>();
250
304
  deferred.promise.catch(() => undefined);