@kraki/head 0.20.0 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +16 -0
  2. package/dist/account-api.d.ts +10 -0
  3. package/dist/account-api.js +67 -15
  4. package/dist/account-api.js.map +1 -1
  5. package/dist/auth-backend.d.ts +16 -5
  6. package/dist/auth.d.ts +0 -1
  7. package/dist/auth.js +32 -20
  8. package/dist/auth.js.map +1 -1
  9. package/dist/cli.js +25 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/lease-issuer.js +1 -1
  12. package/dist/lease-issuer.js.map +1 -1
  13. package/dist/local-auth-backend.d.ts +5 -1
  14. package/dist/local-auth-backend.js +30 -17
  15. package/dist/local-auth-backend.js.map +1 -1
  16. package/dist/metrics.d.ts +50 -0
  17. package/dist/metrics.js +117 -0
  18. package/dist/metrics.js.map +1 -0
  19. package/dist/observability.d.ts +40 -0
  20. package/dist/observability.js +58 -0
  21. package/dist/observability.js.map +1 -0
  22. package/dist/pulse-hub.d.ts +9 -0
  23. package/dist/pulse-hub.js +67 -5
  24. package/dist/pulse-hub.js.map +1 -1
  25. package/dist/push/apns.js +21 -2
  26. package/dist/push/apns.js.map +1 -1
  27. package/dist/push/index.d.ts +2 -0
  28. package/dist/push/index.js +16 -0
  29. package/dist/push/index.js.map +1 -1
  30. package/dist/remote-auth-backend.d.ts +2 -1
  31. package/dist/remote-auth-backend.js +10 -2
  32. package/dist/remote-auth-backend.js.map +1 -1
  33. package/dist/server/account-control.d.ts +28 -0
  34. package/dist/server/account-control.js +288 -0
  35. package/dist/server/account-control.js.map +1 -0
  36. package/dist/server/auth-flow.d.ts +82 -0
  37. package/dist/server/auth-flow.js +315 -0
  38. package/dist/server/auth-flow.js.map +1 -0
  39. package/dist/server/presence.d.ts +8 -0
  40. package/dist/server/presence.js +103 -0
  41. package/dist/server/presence.js.map +1 -0
  42. package/dist/server/shared.d.ts +106 -0
  43. package/dist/server/shared.js +49 -0
  44. package/dist/server/shared.js.map +1 -0
  45. package/dist/server/voice-lease.d.ts +5 -0
  46. package/dist/server/voice-lease.js +111 -0
  47. package/dist/server/voice-lease.js.map +1 -0
  48. package/dist/server.d.ts +20 -125
  49. package/dist/server.js +114 -1072
  50. package/dist/server.js.map +1 -1
  51. package/dist/storage.d.ts +21 -1
  52. package/dist/storage.js +88 -12
  53. package/dist/storage.js.map +1 -1
  54. package/dist/trace.d.ts +0 -1
  55. package/dist/trace.js +0 -3
  56. package/dist/trace.js.map +1 -1
  57. package/package.json +3 -4
@@ -1 +1 @@
1
- {"version":3,"file":"lease-issuer.js","sourceRoot":"","sources":["../src/lease-issuer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lease-issuer.js","sourceRoot":"","sources":["../src/lease-issuer.ts"],"names":[],"mappings":"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"}
@@ -65,13 +65,15 @@ export declare class LocalAuthBackend implements AuthBackend {
65
65
  private regionUrls;
66
66
  private pairingTokens;
67
67
  constructor(options: LocalAuthBackendOptions);
68
- authenticate(auth: AuthMethod, device: DeviceInfo, headRegion?: string): Promise<AuthOutcome>;
68
+ authenticate(auth: AuthMethod, device: DeviceInfo, headRegion?: string, clientIp?: string): Promise<AuthOutcome>;
69
69
  startChallenge(deviceId: string, _encryptionKey?: string, headRegion?: string): Promise<ChallengeOutcome>;
70
70
  verifyChallenge(deviceId: string, nonce: string, signature: string, encryptionKey?: string, headRegion?: string): Promise<AuthOutcome>;
71
71
  createPairingToken(userId: string): {
72
72
  token: string;
73
73
  expiresIn: number;
74
74
  };
75
+ /** Delete the account and everything stored for it. Returns its device ids. */
76
+ deleteAccount(userId: string): Promise<string[]>;
75
77
  removeDevice(userId: string, deviceId: string): Promise<boolean>;
76
78
  requestPairingToken(token: string, ip?: string): Promise<{
77
79
  ok: true;
@@ -88,6 +90,8 @@ export declare class LocalAuthBackend implements AuthBackend {
88
90
  getRegions(): RegionDirectoryEntry[];
89
91
  getRegionVersion(): number;
90
92
  completeEdgeJoin(token: string, region: string, relayUrl: string, displayName?: string): EdgeJoinOutcome;
93
+ /** Region the user's account is assigned to, if any. */
94
+ getUserRegion(userId: string): string | undefined;
91
95
  validateServiceKey(serviceKey: string): {
92
96
  valid: boolean;
93
97
  region?: string;
@@ -2,20 +2,19 @@
2
2
  * Local auth backend — validates credentials using local auth providers and Storage.
3
3
  * Used when head runs in standalone mode (no remote account service).
4
4
  */
5
- import { randomBytes, createVerify } from 'crypto';
5
+ import { randomBytes } from 'crypto';
6
+ import { importPublicKey, verifyChallenge as verifyChallengeSignature } from '@kraki/crypto';
6
7
  import { v4 as uuid } from 'uuid';
7
8
  import { GitHubAuthProvider } from './auth.js';
8
9
  import { getLogger } from './logger.js';
9
10
  import { suggestRegionForIp } from './ip-geo.js';
10
- function importPublicKey(compactKey) {
11
- const lines = compactKey.match(/.{1,64}/g) ?? [];
12
- return `-----BEGIN PUBLIC KEY-----\n${lines.join('\n')}\n-----END PUBLIC KEY-----\n`;
13
- }
14
- function verifySignature(nonce, signature, publicKeyPem) {
15
- const verify = createVerify('SHA256');
16
- verify.update(nonce);
17
- return verify.verify(publicKeyPem, signature, 'base64');
18
- }
11
+ /** Auth answer for a device of a deleted account: clients sign out and stop
12
+ * reconnecting instead of re-creating the account. */
13
+ const ACCOUNT_DELETED = {
14
+ ok: false,
15
+ code: 'account_deleted',
16
+ message: 'This Kraki account was deleted.',
17
+ };
19
18
  export class LocalAuthBackend {
20
19
  storage;
21
20
  authProviders;
@@ -34,22 +33,26 @@ export class LocalAuthBackend {
34
33
  this.region = options.region;
35
34
  this.regionUrls = options.regionUrls ?? {};
36
35
  }
37
- async authenticate(auth, device, headRegion) {
36
+ async authenticate(auth, device, headRegion, clientIp) {
38
37
  const logger = getLogger();
38
+ if (device.deviceId && this.storage.isDeletedDevice(device.deviceId))
39
+ return ACCOUNT_DELETED;
39
40
  if (auth.method === 'pairing') {
40
41
  return this.handlePairingAuth(auth.token, device, headRegion);
41
42
  }
42
43
  if (auth.method === 'challenge') {
43
44
  return { ok: false, code: 'unknown_auth_method', message: 'Use startChallenge/verifyChallenge for challenge auth' };
44
45
  }
45
- const resolved = await this.resolveAuthUser(auth);
46
+ const resolved = await this.resolveAuthUser(auth, clientIp);
46
47
  if (this.isAuthError(resolved)) {
47
- logger.warn('Auth rejected', { method: auth.method, reason: resolved.message });
48
+ logger.warn('Auth rejected', { method: auth.method, ip: clientIp, reason: resolved.message });
48
49
  return resolved;
49
50
  }
50
51
  return this.completeAuth(resolved, device, auth.method, headRegion);
51
52
  }
52
53
  async startChallenge(deviceId, _encryptionKey, headRegion) {
54
+ if (this.storage.isDeletedDevice(deviceId))
55
+ return ACCOUNT_DELETED;
53
56
  const device = this.storage.getDevice(deviceId);
54
57
  if (!device || !device.publicKey) {
55
58
  return { ok: false, code: 'unknown_device', message: 'Unknown device' };
@@ -63,12 +66,14 @@ export class LocalAuthBackend {
63
66
  }
64
67
  async verifyChallenge(deviceId, nonce, signature, encryptionKey, headRegion) {
65
68
  const logger = getLogger();
69
+ if (this.storage.isDeletedDevice(deviceId))
70
+ return ACCOUNT_DELETED;
66
71
  const device = this.storage.getDevice(deviceId);
67
72
  if (!device || !device.publicKey) {
68
73
  return { ok: false, code: 'device_not_found', message: 'Device not found' };
69
74
  }
70
75
  const publicKeyPem = importPublicKey(device.publicKey);
71
- const valid = verifySignature(nonce, signature, publicKeyPem);
76
+ const valid = verifyChallengeSignature(nonce, signature, publicKeyPem);
72
77
  if (!valid) {
73
78
  logger.warn('Challenge-response auth failed', { deviceId });
74
79
  return { ok: false, code: 'invalid_signature', message: 'Invalid signature' };
@@ -110,6 +115,10 @@ export class LocalAuthBackend {
110
115
  });
111
116
  return { token, expiresIn: this.pairingTtl };
112
117
  }
118
+ /** Delete the account and everything stored for it. Returns its device ids. */
119
+ async deleteAccount(userId) {
120
+ return this.storage.deleteUser(userId);
121
+ }
113
122
  async removeDevice(userId, deviceId) {
114
123
  const device = this.storage.getDevice(deviceId);
115
124
  if (!device || device.userId !== userId)
@@ -160,7 +169,7 @@ export class LocalAuthBackend {
160
169
  if (auth.method === 'pairing' || auth.method === 'challenge') {
161
170
  return { ok: false, code: 'unsupported_auth_method', message: `${auth.method} cannot be used for login-first routing` };
162
171
  }
163
- const resolved = await this.resolveAuthUser(auth);
172
+ const resolved = await this.resolveAuthUser(auth, clientIp);
164
173
  if (this.isAuthError(resolved))
165
174
  return resolved;
166
175
  const regions = this.getRegions();
@@ -238,6 +247,10 @@ export class LocalAuthBackend {
238
247
  serviceKey,
239
248
  };
240
249
  }
250
+ /** Region the user's account is assigned to, if any. */
251
+ getUserRegion(userId) {
252
+ return this.storage.getUser(userId)?.region ?? undefined;
253
+ }
241
254
  validateServiceKey(serviceKey) {
242
255
  const result = this.storage.validateServiceKey(serviceKey);
243
256
  return result.valid ? { valid: true, region: result.region } : { valid: false };
@@ -365,7 +378,7 @@ export class LocalAuthBackend {
365
378
  : `User is assigned to region '${user.region}'`,
366
379
  };
367
380
  }
368
- async resolveAuthUser(auth) {
381
+ async resolveAuthUser(auth, clientIp) {
369
382
  let provider;
370
383
  let credentials = {};
371
384
  switch (auth.method) {
@@ -397,7 +410,7 @@ export class LocalAuthBackend {
397
410
  if (!provider) {
398
411
  return { ok: false, code: 'auth_rejected', message: `Auth method ${auth.method} not configured` };
399
412
  }
400
- const result = await provider.authenticate(credentials);
413
+ const result = await provider.authenticate({ ...credentials, ip: clientIp });
401
414
  if (!result.ok) {
402
415
  return { ok: false, code: result.retryable ? 'service_unavailable' : 'auth_rejected', message: result.message };
403
416
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-auth-backend.js","sourceRoot":"","sources":["../src/local-auth-backend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAIlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,SAAS,eAAe,CAAC,UAAkB;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,+BAA+B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,SAAiB,EAAE,YAAoB;IAC7E,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AA4CD,MAAM,OAAO,gBAAgB;IACnB,OAAO,CAAU;IACjB,aAAa,CAA4B;IACzC,cAAc,CAAU;IACxB,UAAU,CAAS;IACnB,WAAW,CAAe;IAC1B,MAAM,CAAU;IAChB,UAAU,CAAyB;IACnC,aAAa,GAAG,IAAI,GAAG,EAAiD,CAAC;IAEjF,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAgB,EAChB,MAAkB,EAClB,UAAmB;QAEnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC;QACtH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAChF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAgB,EAChB,cAAuB,EACvB,UAAmB;QAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC1E,CAAC;QAED,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAChE,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;QAEpC,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAgB,EAChB,KAAa,EACb,SAAiB,EACjB,aAAsB,EACtB,UAAmB;QAEnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9E,CAAC;QAED,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAChF,CAAC;QAED,oCAAoC;QACpC,MAAM,UAAU,GAAG,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,YAAY,CACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EACjD,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS,EAAE,UAAU,CACpE,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC1E,CAAC;QAED,eAAe;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;QAEpC,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ;YACR,UAAU,EAAE,WAAW;YACvB,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,MAAM;gBACf,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB;YACD,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7C,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;YACxC,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAc;QAC/B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE;YAC5B,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;SAC/C,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,QAAgB;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,KAAa,EACb,EAAW;QAEX,oBAAoB;QACpB,IAAI,WAA+B,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS;gBAAE,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;YACjE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpG,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;YACzG,CAAC;QACH,CAAC;QACD,IAAI,WAAW;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACzF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC;IAC9F,CAAC;IAED,WAAW;QACT,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7C,IAAI,UAAU,EAAE,eAAe;gBAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO;YACL,OAAO;YACP,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;YACxC,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAgB,EAAE,eAAwB,EAAE,QAAiB;QAC9E,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,yCAAyC,EAAE,CAAC;QAC1H,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEhD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,UAAU,EAAE,MAAM,CAAC;QAE1C,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,UAAU,EAAE,IAAI;gBAChB,oBAAoB,EAAE,KAAK;gBAC3B,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC;gBAC9E,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;gBACnD,OAAO;aACR,CAAC;QACJ,CAAC;QAED,2EAA2E;QAC3E,IAAI,YAAY,GAAG,eAAe,CAAC;QAEnC,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;gBACzD,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QACjD,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACxD,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;gBACzG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,UAAU,EAAE,IAAI;oBAChB,oBAAoB,EAAE,KAAK;oBAC3B,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC;oBAC/E,MAAM,EAAE,UAAU,CAAC,IAAI;oBACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,OAAO;iBACR,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,IAAI;YAChB,oBAAoB,EAAE,KAAK;YAC3B,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC;YAC9D,OAAO;SACR,CAAC;IACJ,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,KAAa,EAAE,MAAc,EAAE,QAAgB,EAAE,WAAoB;QACpF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3F,IAAI,CAAC,UAAU,CAAC,EAAE;YAAE,OAAO,UAAU,CAAC;QAEtC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChG,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE7E,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,UAAU;SACX,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,UAAkB;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC;IAED;;;;;;;;;OASG;IACH,kBAAkB,CAChB,UAAkB,EAClB,MAAc,EACd,QAAgB,EAChB,WAAoB;QAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,UAAU,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAC3C,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,yCAAyC,UAAU,CAAC,MAAM,WAAW,gBAAgB,GAAG;aAClG,CAAC;QACJ,CAAC;QACD,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,WAAW,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,WAAW,IAAI,gBAAgB,CAAC;QACtF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;QAEtG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC3E,CAAC;IAED,uEAAuE;IACvE,kBAAkB;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,yDAAyD;IAEjD,iBAAiB,CACvB,YAAoB,EACpB,MAAkB,EAClB,UAAmB;QAEnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;QAClF,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnD,IAAI,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;QACnG,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACjH,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IAEO,YAAY,CAClB,QAAkB,EAClB,MAAkB,EAClB,UAAgC,EAChC,UAAmB;QAEnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,2DAA2D;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,YAAY,EAAE,MAAM,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAEpG,gEAAgE;QAChE,IAAI,UAAU,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACtD,CAAC;QAED,mEAAmE;QACnE,mDAAmD;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,YAAY,CACvB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CACpD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QAC5F,CAAC;QAED,kFAAkF;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,WAAW;YAAE,OAAO,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,CAAC;QAErD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEnD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,QAAQ,CAAC,EAAE;YACnB,QAAQ;YACR,UAAU;YACV,IAAI,EAAE;gBACJ,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,WAAW,EAAE,QAAQ,EAAE,WAAW;gBAClC,MAAM,EAAE,QAAQ,EAAE,MAAM;aACzB;YACD,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;YACxC,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;SACzC,CAAC;IACJ,CAAC;IAEO,WAAW,CACjB,MAAc,EACd,UAAmB;QAEnB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;QAEvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;QAEzD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,CAAC,iBAAiB;QAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE3D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,cAAc;YACpB,GAAG,CAAC,WAAW,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;YAC7C,OAAO,EAAE,WAAW;gBAClB,CAAC,CAAC,+BAA+B,IAAI,CAAC,MAAM,iBAAiB,WAAW,EAAE;gBAC1E,CAAC,CAAC,+BAA+B,IAAI,CAAC,MAAM,GAAG;SAClD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,IAAgB;QAC5C,IAAI,QAAkC,CAAC;QACvC,IAAI,WAAW,GAAsG,EAAE,CAAC;QAExH,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,cAAc;gBACjB,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpC,MAAM;YACR,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,IAA6F,CAAC;gBAChH,WAAW,GAAG;oBACZ,UAAU,EAAE,SAAS,CAAC,IAAI;oBAC1B,YAAY,EAAE,OAAO,SAAS,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;oBAC7F,WAAW,EAAE,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;iBAC3F,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,QAAQ;gBACX,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;gBAClC,MAAM;YACR,KAAK,MAAM;gBACT,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC3C,WAAW,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxC,MAAM;YACR;gBACE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,wBAAyB,IAA2B,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9H,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,CAAC,MAAM,iBAAiB,EAAE,CAAC;QACpG,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAClH,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAEO,WAAW,CAAC,MAA+D;QACjF,OAAO,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC;IAC/C,CAAC;IAEO,gBAAgB,CACtB,QAAkB,EAClB,WAAqC,EACrC,MAAe;QAEf,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW;YACX,MAAM;SACP,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAAC,MAAc;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7E,CAAC;IAEO,kBAAkB,CAAC,IAAY;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CACtB,IAAY,EACZ,IAAmD;QAEnD,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,EAAE,eAAe;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAC;QAC3G,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,kBAAkB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,QAAQ,YAAY,kBAAkB;YAAE,OAAO,QAAQ,CAAC;QAC5D,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,MAAM,KAAK,GAAI,QAA0C,CAAC,KAAK,CAAC;YAChE,IAAI,KAAK,YAAY,kBAAkB;gBAAE,OAAO,KAAK,CAAC;QACxD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,iBAAiB;QACvB,OAAO,IAAI,CAAC,kBAAkB,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3G,CAAC;IAEO,iBAAiB;QACvB,OAAO,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAC/C,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAkB;YAC1B,IAAI,EAAG,CAAC,CAAC,IAAmB,IAAI,SAAS;YACzC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS;YACnC,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,SAAS;YAC3C,MAAM,EAAE,KAAK,EAAE,4CAA4C;YAC3D,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
1
+ {"version":3,"file":"local-auth-backend.js","sourceRoot":"","sources":["../src/local-auth-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /** Upper bounds (ms) of the latency buckets; the last bucket is open-ended. */
2
+ export declare const LATENCY_BUCKETS_MS: readonly [1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500];
3
+ export declare class LatencyHistogram {
4
+ readonly counts: number[];
5
+ total: number;
6
+ sumMs: number;
7
+ maxMs: number;
8
+ observe(ms: number): void;
9
+ /** Upper bound of the bucket holding quantile `q` (0–1); null when empty. */
10
+ quantile(q: number): number | null;
11
+ snapshot(): {
12
+ count: number;
13
+ meanMs: number | null;
14
+ p50Ms: number | null;
15
+ p95Ms: number | null;
16
+ p99Ms: number | null;
17
+ maxMs: number;
18
+ buckets: number[];
19
+ };
20
+ }
21
+ /** Every counter the relay keeps. A fixed list: a typo fails to compile. */
22
+ export declare const COUNTERS: readonly ["auth.ok", "auth.fail", "conn.opened", "conn.closed", "conn.stalledClosed", "conn.pongTimeout", "pulse.frames.in", "pulse.bytes.in", "pulse.frames.out", "pulse.bytes.out", "pulse.forwarded", "pulse.deliveredToHead", "push.attempted", "push.sent", "push.failed", "push.gone", "push.threw", "push.authError"];
23
+ export type CounterName = typeof COUNTERS[number];
24
+ export declare class RelayMetrics {
25
+ readonly startedAt: number;
26
+ private readonly counters;
27
+ /** Time the relay spends handling one inbound pulse frame (decode, route,
28
+ * hand to the destination socket): the relay's own share of message latency. */
29
+ readonly frameHandling: LatencyHistogram;
30
+ /** Auth failures by error code (`invalid_token`, `wrong_region`, …). */
31
+ readonly authFailures: Map<string, number>;
32
+ private loopDelay;
33
+ lastHealthAt: number | null;
34
+ inc(name: CounterName, by?: number): void;
35
+ get(name: CounterName): number;
36
+ authFailed(code: string): void;
37
+ /** Start sampling event-loop delay (call once; cheap, 20 ms resolution). */
38
+ startLoopMonitor(): void;
39
+ stopLoopMonitor(): void;
40
+ /** Event-loop delay since the previous call (then reset), in ms. */
41
+ takeLoopDelay(): {
42
+ p50Ms: number;
43
+ p99Ms: number;
44
+ maxMs: number;
45
+ } | null;
46
+ snapshot(): Record<string, unknown>;
47
+ }
48
+ export declare function metrics(): RelayMetrics;
49
+ /** Tests only: a fresh set of counters. */
50
+ export declare function resetMetricsForTests(): RelayMetrics;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Relay health numbers for operations (kraki-watch alerting, daily summary).
3
+ *
4
+ * Counts and timings only: never device ids, user ids, IPs or payload data.
5
+ * Read from `/internal/metrics`, which answers loopback requests only (see
6
+ * `observability.ts`); the public relay exposes nothing beyond `/health/ready`.
7
+ */
8
+ import { monitorEventLoopDelay } from 'node:perf_hooks';
9
+ /** Upper bounds (ms) of the latency buckets; the last bucket is open-ended. */
10
+ export const LATENCY_BUCKETS_MS = [1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500];
11
+ export class LatencyHistogram {
12
+ counts = new Array(LATENCY_BUCKETS_MS.length + 1).fill(0);
13
+ total = 0;
14
+ sumMs = 0;
15
+ maxMs = 0;
16
+ observe(ms) {
17
+ if (!Number.isFinite(ms) || ms < 0)
18
+ return;
19
+ let i = LATENCY_BUCKETS_MS.findIndex((bound) => ms <= bound);
20
+ if (i < 0)
21
+ i = LATENCY_BUCKETS_MS.length;
22
+ this.counts[i]++;
23
+ this.total++;
24
+ this.sumMs += ms;
25
+ if (ms > this.maxMs)
26
+ this.maxMs = ms;
27
+ }
28
+ /** Upper bound of the bucket holding quantile `q` (0–1); null when empty. */
29
+ quantile(q) {
30
+ if (this.total === 0)
31
+ return null;
32
+ const rank = Math.ceil(q * this.total);
33
+ let seen = 0;
34
+ for (let i = 0; i < this.counts.length; i++) {
35
+ seen += this.counts[i];
36
+ if (seen >= rank)
37
+ return i < LATENCY_BUCKETS_MS.length ? LATENCY_BUCKETS_MS[i] : this.maxMs;
38
+ }
39
+ return this.maxMs;
40
+ }
41
+ snapshot() {
42
+ return {
43
+ count: this.total,
44
+ meanMs: this.total ? Math.round((this.sumMs / this.total) * 100) / 100 : null,
45
+ p50Ms: this.quantile(0.5),
46
+ p95Ms: this.quantile(0.95),
47
+ p99Ms: this.quantile(0.99),
48
+ maxMs: Math.round(this.maxMs * 100) / 100,
49
+ buckets: [...this.counts],
50
+ };
51
+ }
52
+ }
53
+ /** Every counter the relay keeps. A fixed list: a typo fails to compile. */
54
+ export const COUNTERS = [
55
+ 'auth.ok', 'auth.fail',
56
+ 'conn.opened', 'conn.closed', 'conn.stalledClosed', 'conn.pongTimeout',
57
+ 'pulse.frames.in', 'pulse.bytes.in', 'pulse.frames.out', 'pulse.bytes.out',
58
+ 'pulse.forwarded', 'pulse.deliveredToHead',
59
+ 'push.attempted', 'push.sent', 'push.failed', 'push.gone', 'push.threw', 'push.authError',
60
+ ];
61
+ export class RelayMetrics {
62
+ startedAt = Date.now();
63
+ counters = new Map(COUNTERS.map((name) => [name, 0]));
64
+ /** Time the relay spends handling one inbound pulse frame (decode, route,
65
+ * hand to the destination socket): the relay's own share of message latency. */
66
+ frameHandling = new LatencyHistogram();
67
+ /** Auth failures by error code (`invalid_token`, `wrong_region`, …). */
68
+ authFailures = new Map();
69
+ loopDelay = null;
70
+ lastHealthAt = null;
71
+ inc(name, by = 1) {
72
+ this.counters.set(name, (this.counters.get(name) ?? 0) + by);
73
+ }
74
+ get(name) {
75
+ return this.counters.get(name) ?? 0;
76
+ }
77
+ authFailed(code) {
78
+ this.inc('auth.fail');
79
+ this.authFailures.set(code, (this.authFailures.get(code) ?? 0) + 1);
80
+ }
81
+ /** Start sampling event-loop delay (call once; cheap, 20 ms resolution). */
82
+ startLoopMonitor() {
83
+ if (this.loopDelay)
84
+ return;
85
+ this.loopDelay = monitorEventLoopDelay({ resolution: 20 });
86
+ this.loopDelay.enable();
87
+ }
88
+ stopLoopMonitor() {
89
+ this.loopDelay?.disable();
90
+ this.loopDelay = null;
91
+ }
92
+ /** Event-loop delay since the previous call (then reset), in ms. */
93
+ takeLoopDelay() {
94
+ const h = this.loopDelay;
95
+ if (!h || h.count === 0)
96
+ return null;
97
+ const ms = (ns) => Math.round(ns / 1e4) / 100;
98
+ const out = { p50Ms: ms(h.percentile(50)), p99Ms: ms(h.percentile(99)), maxMs: ms(h.max) };
99
+ h.reset();
100
+ return out;
101
+ }
102
+ snapshot() {
103
+ return {
104
+ uptimeSec: Math.floor((Date.now() - this.startedAt) / 1000),
105
+ counters: Object.fromEntries(this.counters),
106
+ authFailures: Object.fromEntries(this.authFailures),
107
+ frameHandling: this.frameHandling.snapshot(),
108
+ lastHealthAgoSec: this.lastHealthAt === null ? null : Math.floor((Date.now() - this.lastHealthAt) / 1000),
109
+ };
110
+ }
111
+ }
112
+ /** The relay process's metrics (one per process, like the logger). */
113
+ let current = new RelayMetrics();
114
+ export function metrics() { return current; }
115
+ /** Tests only: a fresh set of counters. */
116
+ export function resetMetricsForTests() { current.stopLoopMonitor(); current = new RelayMetrics(); return current; }
117
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Operational HTTP endpoints of the relay.
3
+ *
4
+ * - `GET /health/ready` (public): ready to serve, not just running. Checks the
5
+ * database answers, the 30 s health tick is alive (event loop not stuck),
6
+ * and the configured push providers are loaded. 200 when ready, 503 when
7
+ * not; the body names the failed check, never any user data.
8
+ * - `GET /internal/metrics` (loopback only): counters and timings for
9
+ * kraki-watch. Refused when the request came through a reverse proxy
10
+ * (any forwarding header) or from a non-loopback address.
11
+ */
12
+ import type { IncomingMessage, ServerResponse } from 'node:http';
13
+ export interface ReadinessContext {
14
+ version: string;
15
+ startedAt: number;
16
+ /** Runs a trivial query; throws when the database is unusable. */
17
+ pingDatabase: () => void;
18
+ /** Push providers the relay was configured with (env PUSH_PROVIDERS). */
19
+ expectedPushProviders: string[];
20
+ /** Push providers actually loaded. */
21
+ loadedPushProviders: () => string[];
22
+ /** Live gauges for the metrics endpoint. */
23
+ gauges: () => Record<string, number>;
24
+ /** The health tick runs every 30 s; older than this means the loop is stuck. */
25
+ maxHealthAgeMs?: number;
26
+ }
27
+ /** Reads a real table page (SELECT 1 alone never touches the file). Throws
28
+ * when the database is unusable. */
29
+ export declare function pingRelayDatabase(db: {
30
+ prepare: (sql: string) => {
31
+ get: () => unknown;
32
+ };
33
+ }): void;
34
+ export declare function readiness(ctx: ReadinessContext, now?: number): {
35
+ ok: boolean;
36
+ checks: Record<string, string>;
37
+ };
38
+ export declare function isDirectLoopback(req: IncomingMessage): boolean;
39
+ /** Handles the two endpoints; returns false for any other path. */
40
+ export declare function handleObservability(req: IncomingMessage, res: ServerResponse, ctx: ReadinessContext): boolean;
@@ -0,0 +1,58 @@
1
+ import { metrics } from './metrics.js';
2
+ /** Reads a real table page (SELECT 1 alone never touches the file). Throws
3
+ * when the database is unusable. */
4
+ export function pingRelayDatabase(db) {
5
+ db.prepare('SELECT user_id FROM users LIMIT 1').get();
6
+ }
7
+ export function readiness(ctx, now = Date.now()) {
8
+ const checks = {};
9
+ try {
10
+ ctx.pingDatabase();
11
+ checks.database = 'ok';
12
+ }
13
+ catch {
14
+ checks.database = 'fail';
15
+ }
16
+ const last = metrics().lastHealthAt;
17
+ const maxAge = ctx.maxHealthAgeMs ?? 90_000;
18
+ // Before the first tick (first 30 s after start) the loop is judged by uptime.
19
+ checks.eventLoop = (last ?? ctx.startedAt) >= now - maxAge ? 'ok' : 'fail';
20
+ const loaded = new Set(ctx.loadedPushProviders());
21
+ const missing = ctx.expectedPushProviders.filter((p) => !loaded.has(p));
22
+ checks.push = missing.length === 0 ? 'ok' : `fail:${missing.join(',')}`;
23
+ return { ok: Object.values(checks).every((v) => v === 'ok'), checks };
24
+ }
25
+ const FORWARDING_HEADERS = ['x-forwarded-for', 'x-real-ip', 'forwarded', 'x-forwarded-host', 'cf-connecting-ip'];
26
+ export function isDirectLoopback(req) {
27
+ if (FORWARDING_HEADERS.some((h) => req.headers[h] !== undefined))
28
+ return false;
29
+ const addr = req.socket.remoteAddress ?? '';
30
+ return addr === '127.0.0.1' || addr === '::1' || addr === '::ffff:127.0.0.1';
31
+ }
32
+ /** Handles the two endpoints; returns false for any other path. */
33
+ export function handleObservability(req, res, ctx) {
34
+ const path = (req.url ?? '/').split('?')[0];
35
+ if (path === '/health/ready') {
36
+ const result = readiness(ctx);
37
+ res.writeHead(result.ok ? 200 : 503, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });
38
+ res.end(JSON.stringify({
39
+ status: result.ok ? 'ready' : 'not_ready',
40
+ version: ctx.version,
41
+ uptimeSec: Math.floor((Date.now() - ctx.startedAt) / 1000),
42
+ checks: result.checks,
43
+ }));
44
+ return true;
45
+ }
46
+ if (path === '/internal/metrics') {
47
+ if (!isDirectLoopback(req)) {
48
+ res.writeHead(404, { 'Content-Type': 'application/json' });
49
+ res.end(JSON.stringify({ error: 'not_found' }));
50
+ return true;
51
+ }
52
+ res.writeHead(200, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });
53
+ res.end(JSON.stringify({ version: ctx.version, ...metrics().snapshot(), gauges: ctx.gauges(), ready: readiness(ctx) }));
54
+ return true;
55
+ }
56
+ return false;
57
+ }
58
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../src/observability.ts"],"names":[],"mappings":"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"}
@@ -82,6 +82,14 @@ export interface PulseHubHost {
82
82
  onDeliverToSelf(fromDevice: string, payload: Uint8Array): void;
83
83
  now(): number;
84
84
  }
85
+ /**
86
+ * Stamp a device-originated pulse payload with its authenticated sender
87
+ * (`src`) before the head forwards it. Returns null when the payload already
88
+ * names a sender (`from` or `src`): only the head may set those, so such a
89
+ * payload is a forgery and must be dropped. Payloads that are not a JSON object
90
+ * are forwarded unchanged — no receiver can parse a sender out of them.
91
+ */
92
+ export declare function stampPulseSender(deviceId: string, payload: Uint8Array): Uint8Array | null;
85
93
  /** Inbound DATA bytes after which the hub acknowledges without waiting for
86
94
  * outbound traffic or the idle heartbeat (advertised in auth_ok). */
87
95
  export declare const PULSE_ACK_EVERY_BYTES: number;
@@ -144,6 +152,7 @@ export declare class PulseHub {
144
152
  onPulseEnvelope(fromDevice: string, env: PulseFrameField & {
145
153
  to?: string | string[];
146
154
  }): void;
155
+ private handlePulseEnvelope;
147
156
  /**
148
157
  * Pulse acknowledges in-order DATA only when the receiver next transmits or
149
158
  * idles into a heartbeat (15 s). A client pacing a large upload by acks would