kubernetes-fluent-client 3.1.1 → 3.1.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.
@@ -3,6 +3,20 @@ import { Operation } from "fast-json-patch";
3
3
  import type { PartialDeep } from "type-fest";
4
4
  import { GenericClass, GroupVersionKind } from "../types";
5
5
  import { WatchCfg, Watcher } from "./watch";
6
+ import https from "https";
7
+ import { SecureClientSessionOptions } from "http2";
8
+ /**
9
+ * Agent options for the the http2Watch
10
+ */
11
+ export type AgentOptions = Pick<SecureClientSessionOptions, "ca" | "cert" | "key" | "rejectUnauthorized">;
12
+ /**
13
+ * Options for the http2Watch
14
+ */
15
+ export interface Options {
16
+ agent?: https.Agent & {
17
+ options?: AgentOptions;
18
+ };
19
+ }
6
20
  /**
7
21
  * The Phase matched when using the K8s Watch API.
8
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fluent/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fluent/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/fluent/watch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,EAAE,YAAY,EAAwB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAI3D,oBAAY,UAAU;IACpB,sCAAsC;IACtC,OAAO,YAAY;IACnB,2BAA2B;IAC3B,aAAa,kBAAkB;IAC/B,kDAAkD;IAClD,UAAU,eAAe;IACzB,0BAA0B;IAC1B,SAAS,cAAc;IACvB,8BAA8B;IAC9B,OAAO,YAAY;IACnB,sBAAsB;IACtB,KAAK,UAAU;IACf,mCAAmC;IACnC,IAAI,SAAS;IACb,wCAAwC;IACxC,oBAAoB,yBAAyB;IAC7C,qCAAqC;IACrC,iBAAiB,sBAAsB;IACvC,kCAAkC;IAClC,IAAI,SAAS;IACb,2BAA2B;IAC3B,UAAU,eAAe;IACzB,mBAAmB;IACnB,UAAU,eAAe;IACzB,qCAAqC;IACrC,wBAAwB,6BAA6B;IACrD,iCAAiC;IACjC,eAAe,oBAAoB;CACpC;AAED,4CAA4C;AAC5C,MAAM,MAAM,QAAQ,GAAG;IACrB,+HAA+H;IAC/H,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wHAAwH;IACxH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAKF,iDAAiD;AACjD,qBAAa,OAAO,CAAC,CAAC,SAAS,YAAY;;IA0BzC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAgB9B;;;;;;;;;;;OAWG;gBACS,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAE,QAAa;IA6CzF;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAU9C,gGAAgG;IACzF,KAAK;IAOZ;;;;;OAKG;IACI,UAAU;IAWjB;;;;;;OAMG;IACH,IAAW,MAAM,IAAI,YAAY,CAEhC;CA8bF"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/fluent/watch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,EAAE,YAAY,EAAwB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAqC,MAAM,SAAS,CAAC;AAIlF,oBAAY,UAAU;IACpB,sCAAsC;IACtC,OAAO,YAAY;IACnB,2BAA2B;IAC3B,aAAa,kBAAkB;IAC/B,kDAAkD;IAClD,UAAU,eAAe;IACzB,0BAA0B;IAC1B,SAAS,cAAc;IACvB,8BAA8B;IAC9B,OAAO,YAAY;IACnB,sBAAsB;IACtB,KAAK,UAAU;IACf,mCAAmC;IACnC,IAAI,SAAS;IACb,wCAAwC;IACxC,oBAAoB,yBAAyB;IAC7C,qCAAqC;IACrC,iBAAiB,sBAAsB;IACvC,kCAAkC;IAClC,IAAI,SAAS;IACb,2BAA2B;IAC3B,UAAU,eAAe;IACzB,mBAAmB;IACnB,UAAU,eAAe;IACzB,qCAAqC;IACrC,wBAAwB,6BAA6B;IACrD,iCAAiC;IACjC,eAAe,oBAAoB;CACpC;AAED,4CAA4C;AAC5C,MAAM,MAAM,QAAQ,GAAG;IACrB,+HAA+H;IAC/H,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wHAAwH;IACxH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAKF,iDAAiD;AACjD,qBAAa,OAAO,CAAC,CAAC,SAAS,YAAY;;IA0BzC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAgB9B;;;;;;;;;;;OAWG;gBACS,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAE,QAAa;IA6CzF;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAU9C,gGAAgG;IACzF,KAAK;IAOZ;;;;;OAKG;IACI,UAAU;IAWjB;;;;;;OAMG;IACH,IAAW,MAAM,IAAI,YAAY,CAEhC;CAmfF"}
@@ -4,6 +4,7 @@
4
4
  var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  return (mod && mod.__esModule) ? mod : { "default": mod };
6
6
  };
7
+ var _a;
7
8
  Object.defineProperty(exports, "__esModule", { value: true });
8
9
  exports.Watcher = exports.WatchEvent = void 0;
9
10
  const byline_1 = __importDefault(require("byline"));
@@ -382,6 +383,41 @@ class Watcher {
382
383
  void this.#errHandler(e);
383
384
  }
384
385
  };
386
+ // Configure the agent options for the HTTP/2 client
387
+ static #getAgentOptions(opts) {
388
+ if (opts.agent && opts.agent instanceof https_1.default.Agent) {
389
+ return {
390
+ key: opts.agent.options.key,
391
+ cert: opts.agent.options.cert,
392
+ ca: opts.agent.options.ca,
393
+ rejectUnauthorized: false,
394
+ };
395
+ }
396
+ return undefined;
397
+ }
398
+ // Create an HTTP/2 client
399
+ static #createHttp2Client(origin, agentOptions) {
400
+ return http2_1.default.connect(origin, {
401
+ ca: agentOptions?.ca,
402
+ cert: agentOptions?.cert,
403
+ key: agentOptions?.key,
404
+ rejectUnauthorized: agentOptions?.rejectUnauthorized,
405
+ });
406
+ }
407
+ // Generate the request headers for the HTTP/2 request
408
+ #generateRequestHeaders = async (url) => {
409
+ const token = await this.#getToken();
410
+ const headers = {
411
+ ":method": "GET",
412
+ ":path": url.pathname + url.search,
413
+ "content-type": "application/json",
414
+ "user-agent": "kubernetes-fluent-client",
415
+ };
416
+ if (token) {
417
+ headers["Authorization"] = `Bearer ${token}`;
418
+ }
419
+ return headers;
420
+ };
385
421
  /**
386
422
  * Watch for changes to the resource.
387
423
  */
@@ -391,79 +427,25 @@ class Watcher {
391
427
  await this.#list();
392
428
  // Build the URL and request options
393
429
  const { opts, url } = await this.#buildURL(true, this.#resourceVersion);
394
- let agentOptions;
395
- if (opts.agent && opts.agent instanceof https_1.default.Agent) {
396
- agentOptions = {
397
- key: opts.agent.options.key,
398
- cert: opts.agent.options.cert,
399
- ca: opts.agent.options.ca,
400
- rejectUnauthorized: false,
401
- };
402
- }
430
+ const agentOptions = _a.#getAgentOptions(opts);
403
431
  // HTTP/2 client connection setup
404
- const client = http2_1.default.connect(url.origin, {
405
- ca: agentOptions?.ca,
406
- cert: agentOptions?.cert,
407
- key: agentOptions?.key,
408
- rejectUnauthorized: agentOptions?.rejectUnauthorized,
432
+ const client = _a.#createHttp2Client(url.origin, agentOptions);
433
+ // Handle client connection errors
434
+ client.on("error", err => {
435
+ this.#events.emit(WatchEvent.NETWORK_ERROR, err);
436
+ this.#streamCleanup(client);
437
+ this.#scheduleReconnect();
409
438
  });
410
439
  // Set up headers for the HTTP/2 request
411
- const token = await this.#getToken();
412
- const headers = {
413
- ":method": "GET",
414
- ":path": url.pathname + url.search,
415
- "content-type": "application/json",
416
- "user-agent": "kubernetes-fluent-client",
417
- };
418
- if (token) {
419
- headers["Authorization"] = `Bearer ${token}`;
420
- }
440
+ const headers = await this.#generateRequestHeaders(url);
421
441
  // Make the HTTP/2 request
422
442
  const req = client.request(headers);
423
443
  req.setEncoding("utf8");
424
- let buffer = "";
425
- // Handle response data
426
- req.on("response", headers => {
427
- const statusCode = headers[":status"];
428
- if (statusCode && statusCode >= 200 && statusCode < 300) {
429
- this.#pendingReconnect = false;
430
- this.#events.emit(WatchEvent.CONNECT, url.pathname);
431
- // Reset the retry count
432
- this.#resyncFailureCount = 0;
433
- this.#events.emit(WatchEvent.INC_RESYNC_FAILURE_COUNT, this.#resyncFailureCount);
434
- req.on("data", async (chunk) => {
435
- try {
436
- buffer += chunk;
437
- const lines = buffer.split("\n");
438
- // Avoid Watch event data_error received. Unexpected end of JSON input.
439
- buffer = lines.pop();
440
- for (const line of lines) {
441
- await this.#processLine(line, this.#process);
442
- }
443
- }
444
- catch (err) {
445
- void this.#errHandler(err);
446
- }
447
- });
448
- req.on("end", () => {
449
- client.close();
450
- this.#streamCleanup();
451
- });
452
- req.on("close", () => {
453
- client.close();
454
- this.#streamCleanup();
455
- });
456
- req.on("error", err => {
457
- void this.#errHandler(err);
458
- });
459
- }
460
- else {
461
- const statusMessage = headers[":status-text"] || "Unknown";
462
- throw new Error(`watch connect failed: ${statusCode} ${statusMessage}`);
463
- }
464
- });
465
- req.on("error", err => {
466
- void this.#errHandler(err);
444
+ // Handler events for the HTTP/2 request
445
+ this.#handleHttp2Request(req, client);
446
+ // Handle abort signal
447
+ this.#abortController.signal.addEventListener("abort", () => {
448
+ this.#streamCleanup(client);
467
449
  });
468
450
  }
469
451
  catch (e) {
@@ -518,6 +500,7 @@ class Watcher {
518
500
  clearInterval(this.$relistTimer);
519
501
  clearInterval(this.#resyncTimer);
520
502
  this.#streamCleanup();
503
+ this.#scheduleReconnect();
521
504
  this.#events.emit(WatchEvent.ABORT, err);
522
505
  return;
523
506
  case "TooOld":
@@ -532,15 +515,81 @@ class Watcher {
532
515
  // Force a resync
533
516
  this.#lastSeenTime = OVERRIDE;
534
517
  };
535
- /** Cleanup the stream and listeners. */
536
- #streamCleanup = () => {
518
+ /**
519
+ *
520
+ * @param req - the request stream
521
+ * @param client - the client session
522
+ */
523
+ #handleHttp2Request(req, client) {
524
+ let buffer = "";
525
+ req.on("response", headers => {
526
+ const statusCode = headers[":status"];
527
+ if (statusCode && statusCode >= 200 && statusCode < 300) {
528
+ this.#onWatchConnected();
529
+ }
530
+ else {
531
+ this.#cleanupAndReconnect(client, new Error(`watch connect failed: ${statusCode}`));
532
+ }
533
+ });
534
+ req.on("data", chunk => {
535
+ buffer += chunk;
536
+ const lines = buffer.split("\n");
537
+ buffer = lines.pop() || ""; // Keep any incomplete line for the next chunk
538
+ lines.forEach(line => {
539
+ void this.#processLine(line, this.#process);
540
+ });
541
+ });
542
+ req.on("end", () => this.#cleanupAndReconnect(client));
543
+ req.on("close", () => this.#cleanupAndReconnect(client));
544
+ req.on("error", error => this.#errHandler(error));
545
+ }
546
+ /** Schedules a reconnect with a delay to prevent rapid reconnections. */
547
+ #scheduleReconnect() {
548
+ const jitter = Math.floor(Math.random() * 1000);
549
+ const delay = (this.#watchCfg.resyncDelaySec ?? 5) * 1000 + jitter;
550
+ setTimeout(() => {
551
+ this.#events.emit(WatchEvent.RECONNECT, this.#resyncFailureCount);
552
+ void this.#http2Watch();
553
+ }, delay);
554
+ }
555
+ /**
556
+ * Handle a successful connection to the watch.
557
+ */
558
+ #onWatchConnected() {
559
+ this.#pendingReconnect = false;
560
+ this.#events.emit(WatchEvent.CONNECT);
561
+ // Reset the retry count
562
+ this.#resyncFailureCount = 0;
563
+ this.#events.emit(WatchEvent.INC_RESYNC_FAILURE_COUNT, this.#resyncFailureCount);
564
+ }
565
+ /**
566
+ * Cleanup the stream and listeners.
567
+ *
568
+ * @param client - the client session
569
+ */
570
+ #streamCleanup = (client) => {
537
571
  if (this.#stream) {
538
572
  this.#stream.removeAllListeners();
539
573
  this.#stream.destroy();
540
574
  }
541
- if (this.#useHTTP2) {
542
- void this.#http2Watch();
575
+ if (client) {
576
+ client.close();
543
577
  }
544
578
  };
579
+ /**
580
+ * Cleanup the stream and listeners and reconnect.
581
+ *
582
+ * @param client - the client session
583
+ * @param error - the error that occurred
584
+ */
585
+ #cleanupAndReconnect(client, error) {
586
+ this.#streamCleanup(client);
587
+ if (error) {
588
+ this.#events.emit(WatchEvent.NETWORK_ERROR, error);
589
+ void this.#errHandler(error);
590
+ }
591
+ this.#scheduleReconnect();
592
+ }
545
593
  }
546
594
  exports.Watcher = Watcher;
595
+ _a = Watcher;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kubernetes-fluent-client",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "A @kubernetes/client-node fluent API wrapper that leverages K8s Server Side Apply.",
5
5
  "bin": "./dist/cli.js",
6
6
  "main": "dist/index.js",
@@ -7,6 +7,22 @@ import type { PartialDeep } from "type-fest";
7
7
 
8
8
  import { GenericClass, GroupVersionKind } from "../types";
9
9
  import { WatchCfg, Watcher } from "./watch";
10
+ import https from "https";
11
+ import { SecureClientSessionOptions } from "http2";
12
+ /**
13
+ * Agent options for the the http2Watch
14
+ */
15
+ export type AgentOptions = Pick<
16
+ SecureClientSessionOptions,
17
+ "ca" | "cert" | "key" | "rejectUnauthorized"
18
+ >;
19
+
20
+ /**
21
+ * Options for the http2Watch
22
+ */
23
+ export interface Options {
24
+ agent?: https.Agent & { options?: AgentOptions };
25
+ }
10
26
 
11
27
  /**
12
28
  * The Phase matched when using the K8s Watch API.
@@ -9,7 +9,7 @@ import http2 from "http2";
9
9
  import fetch from "node-fetch";
10
10
  import { fetch as wrappedFetch } from "../fetch";
11
11
  import { GenericClass, KubernetesListObject } from "../types";
12
- import { Filters, WatchAction, WatchPhase } from "./types";
12
+ import { Filters, WatchAction, WatchPhase, Options, AgentOptions } from "./types";
13
13
  import { k8sCfg, pathBuilder } from "./utils";
14
14
  import fs from "fs";
15
15
 
@@ -469,6 +469,44 @@ export class Watcher<T extends GenericClass> {
469
469
  }
470
470
  };
471
471
 
472
+ // Configure the agent options for the HTTP/2 client
473
+ static #getAgentOptions(opts: Options) {
474
+ if (opts.agent && opts.agent instanceof https.Agent) {
475
+ return {
476
+ key: opts.agent.options.key,
477
+ cert: opts.agent.options.cert,
478
+ ca: opts.agent.options.ca,
479
+ rejectUnauthorized: false,
480
+ };
481
+ }
482
+ return undefined;
483
+ }
484
+
485
+ // Create an HTTP/2 client
486
+ static #createHttp2Client(origin: string, agentOptions?: AgentOptions) {
487
+ return http2.connect(origin, {
488
+ ca: agentOptions?.ca,
489
+ cert: agentOptions?.cert,
490
+ key: agentOptions?.key,
491
+ rejectUnauthorized: agentOptions?.rejectUnauthorized,
492
+ });
493
+ }
494
+
495
+ // Generate the request headers for the HTTP/2 request
496
+ #generateRequestHeaders = async (url: URL) => {
497
+ const token = await this.#getToken();
498
+ const headers: Record<string, string> = {
499
+ ":method": "GET",
500
+ ":path": url.pathname + url.search,
501
+ "content-type": "application/json",
502
+ "user-agent": "kubernetes-fluent-client",
503
+ };
504
+ if (token) {
505
+ headers["Authorization"] = `Bearer ${token}`;
506
+ }
507
+ return headers;
508
+ };
509
+
472
510
  /**
473
511
  * Watch for changes to the resource.
474
512
  */
@@ -479,92 +517,31 @@ export class Watcher<T extends GenericClass> {
479
517
 
480
518
  // Build the URL and request options
481
519
  const { opts, url } = await this.#buildURL(true, this.#resourceVersion);
482
- let agentOptions;
483
-
484
- if (opts.agent && opts.agent instanceof https.Agent) {
485
- agentOptions = {
486
- key: opts.agent.options.key,
487
- cert: opts.agent.options.cert,
488
- ca: opts.agent.options.ca,
489
- rejectUnauthorized: false,
490
- };
491
- }
520
+ const agentOptions = Watcher.#getAgentOptions(opts as Options);
492
521
 
493
522
  // HTTP/2 client connection setup
494
- const client = http2.connect(url.origin, {
495
- ca: agentOptions?.ca,
496
- cert: agentOptions?.cert,
497
- key: agentOptions?.key,
498
- rejectUnauthorized: agentOptions?.rejectUnauthorized,
523
+ const client = Watcher.#createHttp2Client(url.origin, agentOptions);
524
+
525
+ // Handle client connection errors
526
+ client.on("error", err => {
527
+ this.#events.emit(WatchEvent.NETWORK_ERROR, err);
528
+ this.#streamCleanup(client);
529
+ this.#scheduleReconnect();
499
530
  });
500
531
 
501
532
  // Set up headers for the HTTP/2 request
502
- const token = await this.#getToken();
503
- const headers: Record<string, string> = {
504
- ":method": "GET",
505
- ":path": url.pathname + url.search,
506
- "content-type": "application/json",
507
- "user-agent": "kubernetes-fluent-client",
508
- };
509
-
510
- if (token) {
511
- headers["Authorization"] = `Bearer ${token}`;
512
- }
533
+ const headers = await this.#generateRequestHeaders(url);
513
534
 
514
535
  // Make the HTTP/2 request
515
536
  const req = client.request(headers);
516
-
517
537
  req.setEncoding("utf8");
518
538
 
519
- let buffer = "";
520
-
521
- // Handle response data
522
- req.on("response", headers => {
523
- const statusCode = headers[":status"];
524
-
525
- if (statusCode && statusCode >= 200 && statusCode < 300) {
526
- this.#pendingReconnect = false;
527
- this.#events.emit(WatchEvent.CONNECT, url.pathname);
528
-
529
- // Reset the retry count
530
- this.#resyncFailureCount = 0;
531
- this.#events.emit(WatchEvent.INC_RESYNC_FAILURE_COUNT, this.#resyncFailureCount);
532
-
533
- req.on("data", async chunk => {
534
- try {
535
- buffer += chunk;
536
- const lines = buffer.split("\n");
537
- // Avoid Watch event data_error received. Unexpected end of JSON input.
538
- buffer = lines.pop()!;
539
-
540
- for (const line of lines) {
541
- await this.#processLine(line, this.#process);
542
- }
543
- } catch (err) {
544
- void this.#errHandler(err);
545
- }
546
- });
547
-
548
- req.on("end", () => {
549
- client.close();
550
- this.#streamCleanup();
551
- });
552
-
553
- req.on("close", () => {
554
- client.close();
555
- this.#streamCleanup();
556
- });
557
-
558
- req.on("error", err => {
559
- void this.#errHandler(err);
560
- });
561
- } else {
562
- const statusMessage = headers[":status-text"] || "Unknown";
563
- throw new Error(`watch connect failed: ${statusCode} ${statusMessage}`);
564
- }
565
- });
566
- req.on("error", err => {
567
- void this.#errHandler(err);
539
+ // Handler events for the HTTP/2 request
540
+ this.#handleHttp2Request(req, client);
541
+
542
+ // Handle abort signal
543
+ this.#abortController.signal.addEventListener("abort", () => {
544
+ this.#streamCleanup(client);
568
545
  });
569
546
  } catch (e) {
570
547
  void this.#errHandler(e);
@@ -628,6 +605,7 @@ export class Watcher<T extends GenericClass> {
628
605
  clearInterval(this.$relistTimer);
629
606
  clearInterval(this.#resyncTimer);
630
607
  this.#streamCleanup();
608
+ this.#scheduleReconnect();
631
609
  this.#events.emit(WatchEvent.ABORT, err);
632
610
  return;
633
611
 
@@ -645,15 +623,90 @@ export class Watcher<T extends GenericClass> {
645
623
  // Force a resync
646
624
  this.#lastSeenTime = OVERRIDE;
647
625
  };
626
+ /**
627
+ *
628
+ * @param req - the request stream
629
+ * @param client - the client session
630
+ */
631
+ #handleHttp2Request(req: http2.ClientHttp2Stream, client: http2.ClientHttp2Session) {
632
+ let buffer = "";
633
+
634
+ req.on("response", headers => {
635
+ const statusCode = headers[":status"];
636
+ if (statusCode && statusCode >= 200 && statusCode < 300) {
637
+ this.#onWatchConnected();
638
+ } else {
639
+ this.#cleanupAndReconnect(client, new Error(`watch connect failed: ${statusCode}`));
640
+ }
641
+ });
648
642
 
649
- /** Cleanup the stream and listeners. */
650
- #streamCleanup = () => {
643
+ req.on("data", chunk => {
644
+ buffer += chunk;
645
+ const lines = buffer.split("\n");
646
+ buffer = lines.pop() || ""; // Keep any incomplete line for the next chunk
647
+
648
+ lines.forEach(line => {
649
+ void this.#processLine(line, this.#process);
650
+ });
651
+ });
652
+
653
+ req.on("end", () => this.#cleanupAndReconnect(client));
654
+ req.on("close", () => this.#cleanupAndReconnect(client));
655
+ req.on("error", error => this.#errHandler(error));
656
+ }
657
+
658
+ /** Schedules a reconnect with a delay to prevent rapid reconnections. */
659
+ #scheduleReconnect() {
660
+ const jitter = Math.floor(Math.random() * 1000);
661
+ const delay = (this.#watchCfg.resyncDelaySec ?? 5) * 1000 + jitter;
662
+
663
+ setTimeout(() => {
664
+ this.#events.emit(WatchEvent.RECONNECT, this.#resyncFailureCount);
665
+ void this.#http2Watch();
666
+ }, delay);
667
+ }
668
+
669
+ /**
670
+ * Handle a successful connection to the watch.
671
+ */
672
+ #onWatchConnected() {
673
+ this.#pendingReconnect = false;
674
+ this.#events.emit(WatchEvent.CONNECT);
675
+
676
+ // Reset the retry count
677
+ this.#resyncFailureCount = 0;
678
+ this.#events.emit(WatchEvent.INC_RESYNC_FAILURE_COUNT, this.#resyncFailureCount);
679
+ }
680
+
681
+ /**
682
+ * Cleanup the stream and listeners.
683
+ *
684
+ * @param client - the client session
685
+ */
686
+ #streamCleanup = (client?: http2.ClientHttp2Session) => {
651
687
  if (this.#stream) {
652
688
  this.#stream.removeAllListeners();
653
689
  this.#stream.destroy();
654
690
  }
655
- if (this.#useHTTP2) {
656
- void this.#http2Watch();
691
+ if (client) {
692
+ client.close();
657
693
  }
658
694
  };
695
+
696
+ /**
697
+ * Cleanup the stream and listeners and reconnect.
698
+ *
699
+ * @param client - the client session
700
+ * @param error - the error that occurred
701
+ */
702
+ #cleanupAndReconnect(client: http2.ClientHttp2Session, error?: Error) {
703
+ this.#streamCleanup(client);
704
+
705
+ if (error) {
706
+ this.#events.emit(WatchEvent.NETWORK_ERROR, error);
707
+ void this.#errHandler(error);
708
+ }
709
+
710
+ this.#scheduleReconnect();
711
+ }
659
712
  }