@camstack/addon-provider-hikvision 1.2.59 → 1.2.60

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/addon.js CHANGED
@@ -19498,6 +19498,34 @@ var KeyEventsForDeviceSchema = object({
19498
19498
  deviceId: number(),
19499
19499
  events: array(KeyEventSchema).readonly()
19500
19500
  });
19501
+ /** One non-empty bucket of the timeline histogram. */
19502
+ var EventDensityBucketSchema = object({
19503
+ bucketStart: number(),
19504
+ motion: number().int(),
19505
+ object: number().int(),
19506
+ audio: number().int()
19507
+ });
19508
+ /**
19509
+ * One camera's row in a `getEventDensityBatch` answer.
19510
+ *
19511
+ * TWO facts, and the timeline draws them differently:
19512
+ *
19513
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19514
+ * claim: read, and nothing happened in the window.
19515
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19516
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19517
+ * not quiet.
19518
+ *
19519
+ * Fanned out per camera the difference was free — one query rejected while the
19520
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19521
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19522
+ * got eleven cannot tell which one is missing, or that any is.
19523
+ */
19524
+ var EventDensityForDeviceSchema = object({
19525
+ deviceId: number(),
19526
+ read: _enum(["read", "unreadable"]),
19527
+ buckets: array(EventDensityBucketSchema).readonly()
19528
+ });
19501
19529
  object({
19502
19530
  trackId: string(),
19503
19531
  className: string(),
@@ -19808,12 +19836,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19808
19836
  since: number(),
19809
19837
  until: number(),
19810
19838
  bucketMs: number().int().positive()
19811
- }), array(object({
19812
- bucketStart: number(),
19813
- motion: number().int(),
19814
- object: number().int(),
19815
- audio: number().int()
19816
- })).readonly()), method(object({
19839
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19840
+ deviceIds: array(number()).min(1).max(200),
19841
+ since: number(),
19842
+ until: number(),
19843
+ bucketMs: number().int().positive()
19844
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19817
19845
  deviceId: number(),
19818
19846
  cutoffMs: number()
19819
19847
  }), object({
@@ -29075,6 +29103,39 @@ var RecordingDaysSchema = object({
29075
29103
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29076
29104
  days: array(number())
29077
29105
  });
29106
+ /**
29107
+ * One camera's row in a `getAvailabilityBatch` answer.
29108
+ *
29109
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
29110
+ * batch collapses the transport, not the work — plus the one thing the singular
29111
+ * method never had to say:
29112
+ *
29113
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
29114
+ * no footage in the window", which is a real claim.
29115
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
29116
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
29117
+ * that emptiness means NOTHING.
29118
+ *
29119
+ * A timeline that renders the second as the first tells an operator there is no
29120
+ * footage when the truth is that nobody looked.
29121
+ */
29122
+ var RecordingAvailabilityForDeviceSchema = object({
29123
+ deviceId: number(),
29124
+ read: _enum(["read", "unreadable"]),
29125
+ ranges: array(RecordingRangeSchema).readonly()
29126
+ });
29127
+ /**
29128
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
29129
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
29130
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
29131
+ * the date-picker's day dots must not spell them the same.
29132
+ */
29133
+ var RecordingDaysForDeviceSchema = object({
29134
+ deviceId: number(),
29135
+ read: _enum(["read", "unreadable"]),
29136
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29137
+ days: array(number()).readonly()
29138
+ });
29078
29139
  var RecordingManifestSchema = object({
29079
29140
  deviceId: number(),
29080
29141
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29309,6 +29370,13 @@ method(object({
29309
29370
  }), RecordingAvailabilitySchema, {
29310
29371
  kind: "query",
29311
29372
  auth: "protected"
29373
+ }), method(object({
29374
+ deviceIds: array(number()).min(1).max(200),
29375
+ fromMs: number(),
29376
+ toMs: number()
29377
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29378
+ kind: "query",
29379
+ auth: "protected"
29312
29380
  }), method(object({
29313
29381
  deviceId: number(),
29314
29382
  fromMs: number(),
@@ -29317,6 +29385,14 @@ method(object({
29317
29385
  }), RecordingDaysSchema, {
29318
29386
  kind: "query",
29319
29387
  auth: "protected"
29388
+ }), method(object({
29389
+ deviceIds: array(number()).min(1).max(200),
29390
+ fromMs: number(),
29391
+ toMs: number(),
29392
+ tzOffsetMinutes: number()
29393
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29394
+ kind: "query",
29395
+ auth: "protected"
29320
29396
  }), method(object({
29321
29397
  deviceId: number(),
29322
29398
  fromMs: number(),
@@ -36644,6 +36720,12 @@ Object.freeze({
36644
36720
  addonId: null,
36645
36721
  access: "view"
36646
36722
  },
36723
+ "pipelineAnalytics.getEventDensityBatch": {
36724
+ capName: "pipeline-analytics",
36725
+ capScope: "device",
36726
+ addonId: null,
36727
+ access: "view"
36728
+ },
36647
36729
  "pipelineAnalytics.getEventMedia": {
36648
36730
  capName: "pipeline-analytics",
36649
36731
  capScope: "device",
@@ -37766,12 +37848,24 @@ Object.freeze({
37766
37848
  addonId: null,
37767
37849
  access: "view"
37768
37850
  },
37851
+ "recording.getAvailabilityBatch": {
37852
+ capName: "recording",
37853
+ capScope: "system",
37854
+ addonId: null,
37855
+ access: "view"
37856
+ },
37769
37857
  "recording.getDaysWithRecordings": {
37770
37858
  capName: "recording",
37771
37859
  capScope: "system",
37772
37860
  addonId: null,
37773
37861
  access: "view"
37774
37862
  },
37863
+ "recording.getDaysWithRecordingsBatch": {
37864
+ capName: "recording",
37865
+ capScope: "system",
37866
+ addonId: null,
37867
+ access: "view"
37868
+ },
37775
37869
  "recording.getDeviceConfig": {
37776
37870
  capName: "recording",
37777
37871
  capScope: "system",
@@ -40376,6 +40470,11 @@ Object.freeze({
40376
40470
  form: "single",
40377
40471
  optional: false
40378
40472
  }],
40473
+ "pipelineAnalytics.getEventDensityBatch": [{
40474
+ name: "deviceIds",
40475
+ form: "array",
40476
+ optional: false
40477
+ }],
40379
40478
  "pipelineAnalytics.getEventMedia": [{
40380
40479
  name: "deviceId",
40381
40480
  form: "single",
@@ -40791,11 +40890,21 @@ Object.freeze({
40791
40890
  form: "single",
40792
40891
  optional: false
40793
40892
  }],
40893
+ "recording.getAvailabilityBatch": [{
40894
+ name: "deviceIds",
40895
+ form: "array",
40896
+ optional: false
40897
+ }],
40794
40898
  "recording.getDaysWithRecordings": [{
40795
40899
  name: "deviceId",
40796
40900
  form: "single",
40797
40901
  optional: false
40798
40902
  }],
40903
+ "recording.getDaysWithRecordingsBatch": [{
40904
+ name: "deviceIds",
40905
+ form: "array",
40906
+ optional: false
40907
+ }],
40799
40908
  "recording.getDeviceConfig": [{
40800
40909
  name: "deviceId",
40801
40910
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19499,6 +19499,34 @@ var KeyEventsForDeviceSchema = object({
19499
19499
  deviceId: number(),
19500
19500
  events: array(KeyEventSchema).readonly()
19501
19501
  });
19502
+ /** One non-empty bucket of the timeline histogram. */
19503
+ var EventDensityBucketSchema = object({
19504
+ bucketStart: number(),
19505
+ motion: number().int(),
19506
+ object: number().int(),
19507
+ audio: number().int()
19508
+ });
19509
+ /**
19510
+ * One camera's row in a `getEventDensityBatch` answer.
19511
+ *
19512
+ * TWO facts, and the timeline draws them differently:
19513
+ *
19514
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19515
+ * claim: read, and nothing happened in the window.
19516
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19517
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19518
+ * not quiet.
19519
+ *
19520
+ * Fanned out per camera the difference was free — one query rejected while the
19521
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19522
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19523
+ * got eleven cannot tell which one is missing, or that any is.
19524
+ */
19525
+ var EventDensityForDeviceSchema = object({
19526
+ deviceId: number(),
19527
+ read: _enum(["read", "unreadable"]),
19528
+ buckets: array(EventDensityBucketSchema).readonly()
19529
+ });
19502
19530
  object({
19503
19531
  trackId: string(),
19504
19532
  className: string(),
@@ -19809,12 +19837,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19809
19837
  since: number(),
19810
19838
  until: number(),
19811
19839
  bucketMs: number().int().positive()
19812
- }), array(object({
19813
- bucketStart: number(),
19814
- motion: number().int(),
19815
- object: number().int(),
19816
- audio: number().int()
19817
- })).readonly()), method(object({
19840
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19841
+ deviceIds: array(number()).min(1).max(200),
19842
+ since: number(),
19843
+ until: number(),
19844
+ bucketMs: number().int().positive()
19845
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19818
19846
  deviceId: number(),
19819
19847
  cutoffMs: number()
19820
19848
  }), object({
@@ -29076,6 +29104,39 @@ var RecordingDaysSchema = object({
29076
29104
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29077
29105
  days: array(number())
29078
29106
  });
29107
+ /**
29108
+ * One camera's row in a `getAvailabilityBatch` answer.
29109
+ *
29110
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
29111
+ * batch collapses the transport, not the work — plus the one thing the singular
29112
+ * method never had to say:
29113
+ *
29114
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
29115
+ * no footage in the window", which is a real claim.
29116
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
29117
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
29118
+ * that emptiness means NOTHING.
29119
+ *
29120
+ * A timeline that renders the second as the first tells an operator there is no
29121
+ * footage when the truth is that nobody looked.
29122
+ */
29123
+ var RecordingAvailabilityForDeviceSchema = object({
29124
+ deviceId: number(),
29125
+ read: _enum(["read", "unreadable"]),
29126
+ ranges: array(RecordingRangeSchema).readonly()
29127
+ });
29128
+ /**
29129
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
29130
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
29131
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
29132
+ * the date-picker's day dots must not spell them the same.
29133
+ */
29134
+ var RecordingDaysForDeviceSchema = object({
29135
+ deviceId: number(),
29136
+ read: _enum(["read", "unreadable"]),
29137
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29138
+ days: array(number()).readonly()
29139
+ });
29079
29140
  var RecordingManifestSchema = object({
29080
29141
  deviceId: number(),
29081
29142
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29310,6 +29371,13 @@ method(object({
29310
29371
  }), RecordingAvailabilitySchema, {
29311
29372
  kind: "query",
29312
29373
  auth: "protected"
29374
+ }), method(object({
29375
+ deviceIds: array(number()).min(1).max(200),
29376
+ fromMs: number(),
29377
+ toMs: number()
29378
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29379
+ kind: "query",
29380
+ auth: "protected"
29313
29381
  }), method(object({
29314
29382
  deviceId: number(),
29315
29383
  fromMs: number(),
@@ -29318,6 +29386,14 @@ method(object({
29318
29386
  }), RecordingDaysSchema, {
29319
29387
  kind: "query",
29320
29388
  auth: "protected"
29389
+ }), method(object({
29390
+ deviceIds: array(number()).min(1).max(200),
29391
+ fromMs: number(),
29392
+ toMs: number(),
29393
+ tzOffsetMinutes: number()
29394
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29395
+ kind: "query",
29396
+ auth: "protected"
29321
29397
  }), method(object({
29322
29398
  deviceId: number(),
29323
29399
  fromMs: number(),
@@ -36645,6 +36721,12 @@ Object.freeze({
36645
36721
  addonId: null,
36646
36722
  access: "view"
36647
36723
  },
36724
+ "pipelineAnalytics.getEventDensityBatch": {
36725
+ capName: "pipeline-analytics",
36726
+ capScope: "device",
36727
+ addonId: null,
36728
+ access: "view"
36729
+ },
36648
36730
  "pipelineAnalytics.getEventMedia": {
36649
36731
  capName: "pipeline-analytics",
36650
36732
  capScope: "device",
@@ -37767,12 +37849,24 @@ Object.freeze({
37767
37849
  addonId: null,
37768
37850
  access: "view"
37769
37851
  },
37852
+ "recording.getAvailabilityBatch": {
37853
+ capName: "recording",
37854
+ capScope: "system",
37855
+ addonId: null,
37856
+ access: "view"
37857
+ },
37770
37858
  "recording.getDaysWithRecordings": {
37771
37859
  capName: "recording",
37772
37860
  capScope: "system",
37773
37861
  addonId: null,
37774
37862
  access: "view"
37775
37863
  },
37864
+ "recording.getDaysWithRecordingsBatch": {
37865
+ capName: "recording",
37866
+ capScope: "system",
37867
+ addonId: null,
37868
+ access: "view"
37869
+ },
37776
37870
  "recording.getDeviceConfig": {
37777
37871
  capName: "recording",
37778
37872
  capScope: "system",
@@ -40377,6 +40471,11 @@ Object.freeze({
40377
40471
  form: "single",
40378
40472
  optional: false
40379
40473
  }],
40474
+ "pipelineAnalytics.getEventDensityBatch": [{
40475
+ name: "deviceIds",
40476
+ form: "array",
40477
+ optional: false
40478
+ }],
40380
40479
  "pipelineAnalytics.getEventMedia": [{
40381
40480
  name: "deviceId",
40382
40481
  form: "single",
@@ -40792,11 +40891,21 @@ Object.freeze({
40792
40891
  form: "single",
40793
40892
  optional: false
40794
40893
  }],
40894
+ "recording.getAvailabilityBatch": [{
40895
+ name: "deviceIds",
40896
+ form: "array",
40897
+ optional: false
40898
+ }],
40795
40899
  "recording.getDaysWithRecordings": [{
40796
40900
  name: "deviceId",
40797
40901
  form: "single",
40798
40902
  optional: false
40799
40903
  }],
40904
+ "recording.getDaysWithRecordingsBatch": [{
40905
+ name: "deviceIds",
40906
+ form: "array",
40907
+ optional: false
40908
+ }],
40800
40909
  "recording.getDeviceConfig": [{
40801
40910
  name: "deviceId",
40802
40911
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-hikvision",
3
- "version": "1.2.59",
3
+ "version": "1.2.60",
4
4
  "description": "Hikvision camera device provider addon for CamStack — ISAPI over HTTP(S) with digest auth (snapshot, alarm stream, RTSP discovery)",
5
5
  "keywords": [
6
6
  "camstack",