@kraki/head 0.19.1 → 0.19.3

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/dist/push/apns.js CHANGED
@@ -15,6 +15,13 @@ export function isConnectionError(error) {
15
15
  return false;
16
16
  return /ECONNRESET|ECONNREFUSED|ETIMEDOUT|EPIPE|GOAWAY|socket hang up/i.test(error);
17
17
  }
18
+ /** APNs reasons meaning this token will never work for this topic again.
19
+ * Retrying them on every push only burns requests; drop the token and let
20
+ * the device re-register on its next connection. */
21
+ const PERMANENT_TOKEN_REASONS = new Set(['BadDeviceToken', 'Unregistered', 'DeviceTokenNotForTopic']);
22
+ export function isPermanentTokenFailure(reason) {
23
+ return !!reason && PERMANENT_TOKEN_REASONS.has(reason);
24
+ }
18
25
  export function buildApnsPayload(payload) {
19
26
  return JSON.stringify({
20
27
  aps: {
@@ -110,6 +117,11 @@ export class ApnsProvider {
110
117
  errorReason = parsed.reason;
111
118
  }
112
119
  catch { /* ignore parse errors */ }
120
+ if (isPermanentTokenFailure(errorReason)) {
121
+ logger.info('APNs token rejected, marking for removal', { status: statusCode, reason: errorReason, tokenSuffix: token.slice(-8) });
122
+ resolve({ success: false, gone: true, error: errorReason });
123
+ return;
124
+ }
113
125
  logger.warn('APNs send failed', { status: statusCode, reason: errorReason, tokenSuffix: token.slice(-8) });
114
126
  resolve({ success: false, error: errorReason });
115
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apns.js","sourceRoot":"","sources":["../../src/push/apns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apns.js","sourceRoot":"","sources":["../../src/push/apns.ts"],"names":[],"mappings":"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"}
@@ -13,5 +13,5 @@ export declare class PushManager {
13
13
  getVapidPublicKey(): string | undefined;
14
14
  }
15
15
  export { type PushProvider, type PushPayload, type PushResult } from './provider.js';
16
- export { ApnsProvider, type ApnsConfig } from './apns.js';
16
+ export { ApnsProvider, buildApnsPayload, type ApnsConfig } from './apns.js';
17
17
  export { WebPushProvider, type WebPushConfig } from './web-push.js';
@@ -62,6 +62,6 @@ export class PushManager {
62
62
  return wp?.vapidPublicKey;
63
63
  }
64
64
  }
65
- export { ApnsProvider } from './apns.js';
65
+ export { ApnsProvider, buildApnsPayload } from './apns.js';
66
66
  export { WebPushProvider } from './web-push.js';
67
67
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/push/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/push/index.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ export declare class RemoteAuthBackend implements AuthBackend {
30
30
  token: string;
31
31
  expiresIn: number;
32
32
  }>;
33
+ removeDevice(userId: string, deviceId: string): Promise<boolean>;
33
34
  requestPairingToken(token: string, ip?: string): Promise<{
34
35
  ok: true;
35
36
  userId: string;
@@ -33,6 +33,10 @@ export class RemoteAuthBackend {
33
33
  const result = await this.post('/api/pairing/create', { userId });
34
34
  return result;
35
35
  }
36
+ async removeDevice(userId, deviceId) {
37
+ const result = await this.post('/api/devices/remove', { userId, deviceId });
38
+ return result.ok === true;
39
+ }
36
40
  async requestPairingToken(token, ip) {
37
41
  return this.post('/api/pairing/request', { token, ip });
38
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remote-auth-backend.js","sourceRoot":"","sources":["../src/remote-auth-backend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWxC,MAAM,OAAO,iBAAiB;IACpB,UAAU,CAAS;IACnB,UAAU,CAAS;IACnB,OAAO,CAAS;IAChB,YAAY,GAA0B,IAAI,CAAC;IAEnD,YAAY,OAAiC;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAgB,EAChB,MAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAgB,EAChB,aAAsB,EACtB,UAAmB;QAEnB,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAgB,EAChB,KAAa,EACb,SAAiB,EACjB,aAAsB,EACtB,UAAmB;QAEnB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC/B,4DAA4D;QAC5D,wDAAwD;QACxD,yDAAyD;QACzD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,uBAAuB,CAAC,MAAc;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAuC,qBAAqB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,KAAa,EACb,EAAW;QAEX,OAAO,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAChD,6CAA6C;QAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;IACpC,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAiB,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAClB,MAAc,EACd,QAAgB,EAChB,WAAoB;QAEpB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAC5B,oBAAoB,EACpB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAC1D,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1G,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;IAED,yDAAyD;IAEjD,KAAK,CAAC,IAAI,CAAkB,IAAY,EAAE,IAAa;QAC7D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,UAAU,EAAE;iBAC7C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAS,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,6BAA6B,EAAO,CAAC;QACjG,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAG,CAAI,IAAY;QAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,IAAI,CAAC,UAAU,EAAE,EAAE;YACzD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SAC1C,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;CACF"}
1
+ {"version":3,"file":"remote-auth-backend.js","sourceRoot":"","sources":["../src/remote-auth-backend.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -37,6 +37,14 @@ export interface HeadServerOptions {
37
37
  * to actually use the leases they're being issued.
38
38
  */
39
39
  voiceBrokerUrl?: string;
40
+ /**
41
+ * Close sockets that have not authenticated within this time (ms).
42
+ * Default 15s. A socket that asked for `auth_info` (an app on its login
43
+ * screen, waiting for the user to finish signing in) gets
44
+ * `loginScreenAuthTimeoutMs` instead (default 10 min).
45
+ */
46
+ authTimeoutMs?: number;
47
+ loginScreenAuthTimeoutMs?: number;
40
48
  }
41
49
  export declare class HeadServer {
42
50
  private wss;
@@ -86,6 +94,8 @@ export declare class HeadServer {
86
94
  private findGitHubProvider;
87
95
  attach(server: Server): void;
88
96
  acceptConnection(ws: WebSocket): void;
97
+ /** (Re)start the deadline for this socket to authenticate (G1). */
98
+ private armAuthTimer;
89
99
  private onConnection;
90
100
  private onMessage;
91
101
  private handleRequestVoiceLease;
package/dist/server.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { RemoteAuthBackend } from './remote-auth-backend.js';
1
2
  import { WebSocketServer, WebSocket } from 'ws';
2
3
  import { randomBytes, createVerify } from 'crypto';
3
4
  import { v4 as uuid } from 'uuid';
@@ -6,6 +7,7 @@ import { PulseHub, PULSE_ACK_EVERY_BYTES } from './pulse-hub.js';
6
7
  import { GitHubAuthProvider } from './auth.js';
7
8
  import { getLogger } from './logger.js';
8
9
  import { trace, fp } from './trace.js';
10
+ import { clientIp } from './client-ip.js';
9
11
  function importPublicKey(compactKey) {
10
12
  const lines = compactKey.match(/.{1,64}/g) ?? [];
11
13
  return `-----BEGIN PUBLIC KEY-----\n${lines.join('\n')}\n-----END PUBLIC KEY-----\n`;
@@ -20,6 +22,8 @@ const DEFAULT_VOICE_DAILY_QUOTA_SEC = 7_200;
20
22
  const MIN_VOICE_LEASE_GRANT_SEC = 1;
21
23
  const VALID_VOICE_RESOURCES = new Set(['voice/doubao']);
22
24
  const DEFAULT_MAX_PAYLOAD = 10 * 1024 * 1024;
25
+ const DEFAULT_AUTH_TIMEOUT_MS = 15_000;
26
+ const DEFAULT_LOGIN_SCREEN_AUTH_TIMEOUT_MS = 10 * 60_000;
23
27
  const MAX_MULTICAST_TARGETS = 64;
24
28
  /** How often the liveness sweep runs (ms). Faster than the 30s ping timer so
25
29
  * device_pending detection latency tracks the recipient's ping cadence
@@ -271,8 +275,21 @@ export class HeadServer {
271
275
  acceptConnection(ws) {
272
276
  this.onConnection(ws);
273
277
  }
278
+ /** (Re)start the deadline for this socket to authenticate (G1). */
279
+ armAuthTimer(ws, state, ms) {
280
+ if (state.authTimer)
281
+ clearTimeout(state.authTimer);
282
+ state.authTimer = setTimeout(() => {
283
+ state.authTimer = undefined;
284
+ if (state.authenticated)
285
+ return;
286
+ getLogger().debug('Closing unauthenticated socket', { ip: state.ip, afterMs: ms });
287
+ ws.close(4008, 'Authentication timeout');
288
+ }, ms);
289
+ state.authTimer.unref?.();
290
+ }
274
291
  onConnection(ws, req) {
275
- const ip = req?.socket?.remoteAddress ?? req?.headers['x-forwarded-for']?.toString() ?? 'unknown';
292
+ const ip = clientIp(req);
276
293
  const state = {
277
294
  authenticated: false,
278
295
  isAlive: true,
@@ -282,6 +299,7 @@ export class HeadServer {
282
299
  };
283
300
  const logger = getLogger();
284
301
  this.clients.set(ws, state);
302
+ this.armAuthTimer(ws, state, this.options.authTimeoutMs ?? DEFAULT_AUTH_TIMEOUT_MS);
285
303
  logger.debug('WebSocket connected', { ip });
286
304
  ws.on('pong', () => { this.onPongReceived(state); });
287
305
  ws.on('message', (data) => {
@@ -302,6 +320,8 @@ export class HeadServer {
302
320
  }
303
321
  });
304
322
  ws.on('close', (code, reason) => {
323
+ if (state.authTimer)
324
+ clearTimeout(state.authTimer);
305
325
  const reasonStr = reason?.toString?.() || '';
306
326
  if (state.deviceId) {
307
327
  const disconnectedDeviceId = state.deviceId;
@@ -358,6 +378,7 @@ export class HeadServer {
358
378
  // Pre-auth: auth_info, auth, auth_response
359
379
  if (!state.authenticated) {
360
380
  if (msg.type === 'auth_info') {
381
+ this.armAuthTimer(ws, state, this.options.loginScreenAuthTimeoutMs ?? DEFAULT_LOGIN_SCREEN_AUTH_TIMEOUT_MS);
361
382
  if (this.options.authBackend) {
362
383
  const info = this.options.authBackend.getAuthInfo();
363
384
  ws.send(JSON.stringify({
@@ -781,8 +802,25 @@ export class HeadServer {
781
802
  firePushPreview(state, pushPreview) {
782
803
  const senderUserId = state.userId;
783
804
  const senderDeviceId = state.deviceId;
784
- if (!senderUserId || !senderDeviceId || !pushPreview || !this.options.pushManager) {
785
- trace('PUSH-SKIP', { reason: !senderUserId ? 'no-user' : !senderDeviceId ? 'no-device' : !pushPreview ? 'no-preview' : 'no-pushmgr' });
805
+ if (!senderUserId || !senderDeviceId || !pushPreview) {
806
+ trace('PUSH-SKIP', { reason: !senderUserId ? 'no-user' : !senderDeviceId ? 'no-device' : 'no-preview' });
807
+ return;
808
+ }
809
+ // Online native clients that post their own notifications (macOS) get the
810
+ // same encrypted preview over their live connection.
811
+ for (const token of this.storage.getPushTokensForOfflineDevices(senderUserId, [])) {
812
+ if (token.provider !== 'local' || token.deviceId === senderDeviceId)
813
+ continue;
814
+ if (!this.connections.has(token.deviceId))
815
+ continue;
816
+ const key = pushPreview.keys[token.deviceId];
817
+ if (!key)
818
+ continue;
819
+ this.sendControlToDevice(token.deviceId, { type: 'notification_preview', payload: { blob: pushPreview.blob, key } });
820
+ trace('PUSH-LOCAL', { deviceId: token.deviceId });
821
+ }
822
+ if (!this.options.pushManager) {
823
+ trace('PUSH-SKIP', { reason: 'no-pushmgr' });
786
824
  return;
787
825
  }
788
826
  const onlineDeviceIds = [senderDeviceId];
@@ -891,7 +929,8 @@ export class HeadServer {
891
929
  const result = await provider.authenticate({ token: auth.token, ip: state.ip });
892
930
  if (!result.ok) {
893
931
  logger.warn('Auth rejected', { method: 'github_token', ip: state.ip, reason: result.message });
894
- this.sendAuthError(ws, 'auth_rejected', result.message);
932
+ // A GitHub outage or network error is not a bad credential (G4).
933
+ this.sendAuthError(ws, result.retryable ? 'service_unavailable' : 'auth_rejected', result.message);
895
934
  return;
896
935
  }
897
936
  this.completeAuth(ws, state, result.user, msg, 'github_token');
@@ -908,7 +947,8 @@ export class HeadServer {
908
947
  });
909
948
  if (!result.ok) {
910
949
  logger.warn('Auth rejected', { method: 'github_oauth', ip: state.ip, reason: result.message });
911
- this.sendAuthError(ws, 'auth_rejected', result.message);
950
+ // A GitHub outage or network error is not a bad credential (G4).
951
+ this.sendAuthError(ws, result.retryable ? 'service_unavailable' : 'auth_rejected', result.message);
912
952
  return;
913
953
  }
914
954
  this.completeAuth(ws, state, result.user, msg, 'github_oauth');
@@ -919,7 +959,8 @@ export class HeadServer {
919
959
  const result = await provider.authenticate({ token: auth.key, ip: state.ip });
920
960
  if (!result.ok) {
921
961
  logger.warn('Auth rejected', { method: 'apikey', ip: state.ip, reason: result.message });
922
- this.sendAuthError(ws, 'auth_rejected', result.message);
962
+ // A GitHub outage or network error is not a bad credential (G4).
963
+ this.sendAuthError(ws, result.retryable ? 'service_unavailable' : 'auth_rejected', result.message);
923
964
  return;
924
965
  }
925
966
  this.completeAuth(ws, state, result.user, msg, 'apikey');
@@ -930,7 +971,8 @@ export class HeadServer {
930
971
  const result = await provider.authenticate({ token: auth.sharedKey, ip: state.ip });
931
972
  if (!result.ok) {
932
973
  logger.warn('Auth rejected', { method: 'open', ip: state.ip, reason: result.message });
933
- this.sendAuthError(ws, 'auth_rejected', result.message);
974
+ // A GitHub outage or network error is not a bad credential (G4).
975
+ this.sendAuthError(ws, result.retryable ? 'service_unavailable' : 'auth_rejected', result.message);
934
976
  return;
935
977
  }
936
978
  this.completeAuth(ws, state, result.user, msg, 'open');
@@ -1019,6 +1061,10 @@ export class HeadServer {
1019
1061
  // Register connection
1020
1062
  state.authenticated = true;
1021
1063
  state.authenticatedAt = Date.now();
1064
+ if (state.authTimer) {
1065
+ clearTimeout(state.authTimer);
1066
+ state.authTimer = undefined;
1067
+ }
1022
1068
  state.deviceId = deviceId;
1023
1069
  state.userId = user.userId;
1024
1070
  this.evictPreviousConnection(deviceId, ws);
@@ -1053,6 +1099,10 @@ export class HeadServer {
1053
1099
  // Register connection
1054
1100
  state.authenticated = true;
1055
1101
  state.authenticatedAt = Date.now();
1102
+ if (state.authTimer) {
1103
+ clearTimeout(state.authTimer);
1104
+ state.authTimer = undefined;
1105
+ }
1056
1106
  state.deviceId = result.deviceId;
1057
1107
  state.userId = result.userId;
1058
1108
  this.evictPreviousConnection(result.deviceId, ws);
@@ -1203,6 +1253,10 @@ export class HeadServer {
1203
1253
  }
1204
1254
  state.authenticated = true;
1205
1255
  state.authenticatedAt = Date.now();
1256
+ if (state.authTimer) {
1257
+ clearTimeout(state.authTimer);
1258
+ state.authTimer = undefined;
1259
+ }
1206
1260
  state.deviceId = deviceId;
1207
1261
  state.userId = user.id;
1208
1262
  this.evictPreviousConnection(deviceId, ws);
@@ -1346,6 +1400,19 @@ export class HeadServer {
1346
1400
  // never authenticate again.
1347
1401
  this.pulseHub.forgetDevice(targetDeviceId);
1348
1402
  logger.info('Device removed', { deviceId: targetDeviceId, byDevice: state.deviceId });
1403
+ // Edge mode: the account service owns the device list and every auth
1404
+ // mirrors it back here, so the removal must reach it too (otherwise the
1405
+ // device reappears after the next reconnect).
1406
+ const remote = this.options.authBackend;
1407
+ if (remote instanceof RemoteAuthBackend) {
1408
+ const userId = state.userId;
1409
+ remote.removeDevice(userId, targetDeviceId).then((ok) => {
1410
+ if (!ok)
1411
+ logger.warn('Account service did not remove device', { deviceId: targetDeviceId });
1412
+ }).catch((err) => {
1413
+ logger.warn('Failed to remove device at account service', { deviceId: targetDeviceId, error: err.message });
1414
+ });
1415
+ }
1349
1416
  // Broadcast removal to all remaining user devices
1350
1417
  this.broadcastDeviceRemoved(state.userId, targetDeviceId);
1351
1418
  }