@camstack/addon-pipeline-orchestrator 1.1.12 → 1.1.14

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,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.1.12",
6
+ version: "1.1.13",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_orchestrator_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.1.13",
21
+ version: "1.1.16",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_orchestrator_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.1.13",
36
+ version: "1.1.15",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_orchestrator_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.1.13",
39
+ version: "1.1.16",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -45,7 +45,7 @@ async function r() {
45
45
  }
46
46
  },
47
47
  "@camstack/sdk": {
48
- version: "1.1.12",
48
+ version: "1.1.13",
49
49
  scope: "default",
50
50
  shareConfig: {
51
51
  singleton: !0,
@@ -99,7 +99,7 @@ async function r() {
99
99
  }
100
100
  },
101
101
  "@camstack/ui-library": {
102
- version: "1.1.13",
102
+ version: "1.1.15",
103
103
  scope: "default",
104
104
  shareConfig: {
105
105
  singleton: !0,
package/dist/index.js CHANGED
@@ -7448,7 +7448,21 @@ var StorageLocationDeclarationSchema = object({
7448
7448
  * slots (e.g. `recordingsLow` → `recordings`) so operators only need to
7449
7449
  * configure the primary location.
7450
7450
  */
7451
- defaultsTo: string().optional()
7451
+ defaultsTo: string().optional(),
7452
+ /**
7453
+ * Which node root the seeded `<id>:default` instance is placed under on a
7454
+ * FRESH install:
7455
+ * - `'data'` (default) — the node's data dir (`CAMSTACK_DATA` / boot dir),
7456
+ * the appData volume. Right for small/durable data (backups, logs, models).
7457
+ * - `'media'` — the dedicated media volume (`CAMSTACK_MEDIA_ROOT`) when that
7458
+ * env is set, else falls back to the data root. Right for bulky, hot media
7459
+ * (recordings, event media) that should stay off the appData disk.
7460
+ *
7461
+ * Only affects the seeded default's `basePath`; operators can repoint any
7462
+ * location afterwards, and a `defaultsTo` slot inherits its parent's root
7463
+ * regardless of this field. Absent (the common case) is treated as `'data'`.
7464
+ */
7465
+ defaultRoot: _enum(["data", "media"]).optional()
7452
7466
  });
7453
7467
  var DecoderStatsSchema = object({
7454
7468
  inputFps: number(),
@@ -8326,6 +8340,10 @@ var RtspRestreamEntrySchema = object({
8326
8340
  var BrokerRtspClientSchema = object({
8327
8341
  sessionId: string(),
8328
8342
  remoteAddr: string(),
8343
+ /** Client `User-Agent` (e.g. `recorder` for the recorder's RTSP pull), or
8344
+ * null/absent when the client sent none. Lets the UI label a consumer by
8345
+ * purpose. Optional so a client built against an older schema stays valid. */
8346
+ userAgent: string().nullish(),
8329
8347
  playing: boolean(),
8330
8348
  muted: boolean(),
8331
8349
  connectedAt: number(),
@@ -14730,6 +14748,7 @@ var pipelineOrchestratorCapability = {
14730
14748
  name: "pipeline-orchestrator",
14731
14749
  scope: "system",
14732
14750
  mode: "singleton",
14751
+ nodeIdMode: "data",
14733
14752
  exposesDeviceSettings: true,
14734
14753
  methods: {
14735
14754
  /**
@@ -22825,6 +22844,18 @@ function balance(input) {
22825
22844
  };
22826
22845
  }
22827
22846
  /**
22847
+ * Decide whether a manual per-device decoder pin may be honored.
22848
+ *
22849
+ * A pin to a node OUTSIDE `enabledDecoderNodes` must NOT be honored blindly —
22850
+ * that is how video decode reaches a node that is not eligible to decode (e.g.
22851
+ * a node whose shm frame ring the broker cannot read, or one an operator
22852
+ * disabled). A pin to an ENABLED node is honored; anything else falls through
22853
+ * to the auto-balance path (which filters by `enabledDecoderNodes`).
22854
+ */
22855
+ function isDecoderPinHonored(pinnedNodeId, enabledDecoderNodes) {
22856
+ return enabledDecoderNodes.includes(pinnedNodeId);
22857
+ }
22858
+ /**
22828
22859
  * Choose decoder node. Priority: manual pin → co-located with pipeline → capacity.
22829
22860
  */
22830
22861
  function balanceDecoder(input) {
@@ -24480,8 +24511,15 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
24480
24511
  */
24481
24512
  async resolveDecoderNode(deviceId, pipelineNodeId) {
24482
24513
  const pinned = (await this.ctx.settings?.readDeviceStore(deviceId) ?? {})["decoderNodeId"];
24483
- if (typeof pinned === "string" && pinned !== "auto") return pinned;
24484
24514
  const enabledDecoderNodes = this.enabledDecoderNodes;
24515
+ if (typeof pinned === "string" && pinned !== "auto") {
24516
+ if (isDecoderPinHonored(pinned, enabledDecoderNodes)) return pinned;
24517
+ this.ctx.logger.warn("decoder pin targets a node not in enabledDecoderNodes — ignoring pin, auto-balancing instead", { tags: {
24518
+ deviceId,
24519
+ pinned,
24520
+ enabledDecoderNodes: enabledDecoderNodes.join(",")
24521
+ } });
24522
+ }
24485
24523
  return balanceDecoder({
24486
24524
  decoderNodes: (await this.collectAgentLoad()).filter((load) => enabledDecoderNodes.includes(load.nodeId)),
24487
24525
  pipelineNodeId
package/dist/index.mjs CHANGED
@@ -7444,7 +7444,21 @@ var StorageLocationDeclarationSchema = object({
7444
7444
  * slots (e.g. `recordingsLow` → `recordings`) so operators only need to
7445
7445
  * configure the primary location.
7446
7446
  */
7447
- defaultsTo: string().optional()
7447
+ defaultsTo: string().optional(),
7448
+ /**
7449
+ * Which node root the seeded `<id>:default` instance is placed under on a
7450
+ * FRESH install:
7451
+ * - `'data'` (default) — the node's data dir (`CAMSTACK_DATA` / boot dir),
7452
+ * the appData volume. Right for small/durable data (backups, logs, models).
7453
+ * - `'media'` — the dedicated media volume (`CAMSTACK_MEDIA_ROOT`) when that
7454
+ * env is set, else falls back to the data root. Right for bulky, hot media
7455
+ * (recordings, event media) that should stay off the appData disk.
7456
+ *
7457
+ * Only affects the seeded default's `basePath`; operators can repoint any
7458
+ * location afterwards, and a `defaultsTo` slot inherits its parent's root
7459
+ * regardless of this field. Absent (the common case) is treated as `'data'`.
7460
+ */
7461
+ defaultRoot: _enum(["data", "media"]).optional()
7448
7462
  });
7449
7463
  var DecoderStatsSchema = object({
7450
7464
  inputFps: number(),
@@ -8322,6 +8336,10 @@ var RtspRestreamEntrySchema = object({
8322
8336
  var BrokerRtspClientSchema = object({
8323
8337
  sessionId: string(),
8324
8338
  remoteAddr: string(),
8339
+ /** Client `User-Agent` (e.g. `recorder` for the recorder's RTSP pull), or
8340
+ * null/absent when the client sent none. Lets the UI label a consumer by
8341
+ * purpose. Optional so a client built against an older schema stays valid. */
8342
+ userAgent: string().nullish(),
8325
8343
  playing: boolean(),
8326
8344
  muted: boolean(),
8327
8345
  connectedAt: number(),
@@ -14726,6 +14744,7 @@ var pipelineOrchestratorCapability = {
14726
14744
  name: "pipeline-orchestrator",
14727
14745
  scope: "system",
14728
14746
  mode: "singleton",
14747
+ nodeIdMode: "data",
14729
14748
  exposesDeviceSettings: true,
14730
14749
  methods: {
14731
14750
  /**
@@ -22821,6 +22840,18 @@ function balance(input) {
22821
22840
  };
22822
22841
  }
22823
22842
  /**
22843
+ * Decide whether a manual per-device decoder pin may be honored.
22844
+ *
22845
+ * A pin to a node OUTSIDE `enabledDecoderNodes` must NOT be honored blindly —
22846
+ * that is how video decode reaches a node that is not eligible to decode (e.g.
22847
+ * a node whose shm frame ring the broker cannot read, or one an operator
22848
+ * disabled). A pin to an ENABLED node is honored; anything else falls through
22849
+ * to the auto-balance path (which filters by `enabledDecoderNodes`).
22850
+ */
22851
+ function isDecoderPinHonored(pinnedNodeId, enabledDecoderNodes) {
22852
+ return enabledDecoderNodes.includes(pinnedNodeId);
22853
+ }
22854
+ /**
22824
22855
  * Choose decoder node. Priority: manual pin → co-located with pipeline → capacity.
22825
22856
  */
22826
22857
  function balanceDecoder(input) {
@@ -24476,8 +24507,15 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
24476
24507
  */
24477
24508
  async resolveDecoderNode(deviceId, pipelineNodeId) {
24478
24509
  const pinned = (await this.ctx.settings?.readDeviceStore(deviceId) ?? {})["decoderNodeId"];
24479
- if (typeof pinned === "string" && pinned !== "auto") return pinned;
24480
24510
  const enabledDecoderNodes = this.enabledDecoderNodes;
24511
+ if (typeof pinned === "string" && pinned !== "auto") {
24512
+ if (isDecoderPinHonored(pinned, enabledDecoderNodes)) return pinned;
24513
+ this.ctx.logger.warn("decoder pin targets a node not in enabledDecoderNodes — ignoring pin, auto-balancing instead", { tags: {
24514
+ deviceId,
24515
+ pinned,
24516
+ enabledDecoderNodes: enabledDecoderNodes.join(",")
24517
+ } });
24518
+ }
24481
24519
  return balanceDecoder({
24482
24520
  decoderNodes: (await this.collectAgentLoad()).filter((load) => enabledDecoderNodes.includes(load.nodeId)),
24483
24521
  pipelineNodeId
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-Bll07XmJ.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-wXpruvsb.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-pipeline-orchestrator",
3
- "version": "1.1.12",
3
+ "version": "1.1.14",
4
4
  "description": "Hub-side camera-to-agent load balancer — tracks runner capacity and dispatches attachCamera calls to the optimal pipeline-runner instance",
5
5
  "keywords": [
6
6
  "camstack",