@camstack/addon-provider-hikvision 1.2.58 → 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
@@ -16182,6 +16182,8 @@ var NcSystemEventKindSchema = _enum([
16182
16182
  "device-offline",
16183
16183
  "device-disabled",
16184
16184
  "device-enabled",
16185
+ "device-battery-low",
16186
+ "device-battery-normal",
16185
16187
  "stream-online",
16186
16188
  "stream-offline",
16187
16189
  "node-online",
@@ -19496,6 +19498,34 @@ var KeyEventsForDeviceSchema = object({
19496
19498
  deviceId: number(),
19497
19499
  events: array(KeyEventSchema).readonly()
19498
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
+ });
19499
19529
  object({
19500
19530
  trackId: string(),
19501
19531
  className: string(),
@@ -19806,12 +19836,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19806
19836
  since: number(),
19807
19837
  until: number(),
19808
19838
  bucketMs: number().int().positive()
19809
- }), array(object({
19810
- bucketStart: number(),
19811
- motion: number().int(),
19812
- object: number().int(),
19813
- audio: number().int()
19814
- })).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({
19815
19845
  deviceId: number(),
19816
19846
  cutoffMs: number()
19817
19847
  }), object({
@@ -29073,6 +29103,39 @@ var RecordingDaysSchema = object({
29073
29103
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29074
29104
  days: array(number())
29075
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
+ });
29076
29139
  var RecordingManifestSchema = object({
29077
29140
  deviceId: number(),
29078
29141
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29307,6 +29370,13 @@ method(object({
29307
29370
  }), RecordingAvailabilitySchema, {
29308
29371
  kind: "query",
29309
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"
29310
29380
  }), method(object({
29311
29381
  deviceId: number(),
29312
29382
  fromMs: number(),
@@ -29315,6 +29385,14 @@ method(object({
29315
29385
  }), RecordingDaysSchema, {
29316
29386
  kind: "query",
29317
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"
29318
29396
  }), method(object({
29319
29397
  deviceId: number(),
29320
29398
  fromMs: number(),
@@ -36642,6 +36720,12 @@ Object.freeze({
36642
36720
  addonId: null,
36643
36721
  access: "view"
36644
36722
  },
36723
+ "pipelineAnalytics.getEventDensityBatch": {
36724
+ capName: "pipeline-analytics",
36725
+ capScope: "device",
36726
+ addonId: null,
36727
+ access: "view"
36728
+ },
36645
36729
  "pipelineAnalytics.getEventMedia": {
36646
36730
  capName: "pipeline-analytics",
36647
36731
  capScope: "device",
@@ -37764,12 +37848,24 @@ Object.freeze({
37764
37848
  addonId: null,
37765
37849
  access: "view"
37766
37850
  },
37851
+ "recording.getAvailabilityBatch": {
37852
+ capName: "recording",
37853
+ capScope: "system",
37854
+ addonId: null,
37855
+ access: "view"
37856
+ },
37767
37857
  "recording.getDaysWithRecordings": {
37768
37858
  capName: "recording",
37769
37859
  capScope: "system",
37770
37860
  addonId: null,
37771
37861
  access: "view"
37772
37862
  },
37863
+ "recording.getDaysWithRecordingsBatch": {
37864
+ capName: "recording",
37865
+ capScope: "system",
37866
+ addonId: null,
37867
+ access: "view"
37868
+ },
37773
37869
  "recording.getDeviceConfig": {
37774
37870
  capName: "recording",
37775
37871
  capScope: "system",
@@ -40374,6 +40470,11 @@ Object.freeze({
40374
40470
  form: "single",
40375
40471
  optional: false
40376
40472
  }],
40473
+ "pipelineAnalytics.getEventDensityBatch": [{
40474
+ name: "deviceIds",
40475
+ form: "array",
40476
+ optional: false
40477
+ }],
40377
40478
  "pipelineAnalytics.getEventMedia": [{
40378
40479
  name: "deviceId",
40379
40480
  form: "single",
@@ -40789,11 +40890,21 @@ Object.freeze({
40789
40890
  form: "single",
40790
40891
  optional: false
40791
40892
  }],
40893
+ "recording.getAvailabilityBatch": [{
40894
+ name: "deviceIds",
40895
+ form: "array",
40896
+ optional: false
40897
+ }],
40792
40898
  "recording.getDaysWithRecordings": [{
40793
40899
  name: "deviceId",
40794
40900
  form: "single",
40795
40901
  optional: false
40796
40902
  }],
40903
+ "recording.getDaysWithRecordingsBatch": [{
40904
+ name: "deviceIds",
40905
+ form: "array",
40906
+ optional: false
40907
+ }],
40797
40908
  "recording.getDeviceConfig": [{
40798
40909
  name: "deviceId",
40799
40910
  form: "single",
package/dist/addon.mjs CHANGED
@@ -16183,6 +16183,8 @@ var NcSystemEventKindSchema = _enum([
16183
16183
  "device-offline",
16184
16184
  "device-disabled",
16185
16185
  "device-enabled",
16186
+ "device-battery-low",
16187
+ "device-battery-normal",
16186
16188
  "stream-online",
16187
16189
  "stream-offline",
16188
16190
  "node-online",
@@ -19497,6 +19499,34 @@ var KeyEventsForDeviceSchema = object({
19497
19499
  deviceId: number(),
19498
19500
  events: array(KeyEventSchema).readonly()
19499
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
+ });
19500
19530
  object({
19501
19531
  trackId: string(),
19502
19532
  className: string(),
@@ -19807,12 +19837,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19807
19837
  since: number(),
19808
19838
  until: number(),
19809
19839
  bucketMs: number().int().positive()
19810
- }), array(object({
19811
- bucketStart: number(),
19812
- motion: number().int(),
19813
- object: number().int(),
19814
- audio: number().int()
19815
- })).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({
19816
19846
  deviceId: number(),
19817
19847
  cutoffMs: number()
19818
19848
  }), object({
@@ -29074,6 +29104,39 @@ var RecordingDaysSchema = object({
29074
29104
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29075
29105
  days: array(number())
29076
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
+ });
29077
29140
  var RecordingManifestSchema = object({
29078
29141
  deviceId: number(),
29079
29142
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29308,6 +29371,13 @@ method(object({
29308
29371
  }), RecordingAvailabilitySchema, {
29309
29372
  kind: "query",
29310
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"
29311
29381
  }), method(object({
29312
29382
  deviceId: number(),
29313
29383
  fromMs: number(),
@@ -29316,6 +29386,14 @@ method(object({
29316
29386
  }), RecordingDaysSchema, {
29317
29387
  kind: "query",
29318
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"
29319
29397
  }), method(object({
29320
29398
  deviceId: number(),
29321
29399
  fromMs: number(),
@@ -36643,6 +36721,12 @@ Object.freeze({
36643
36721
  addonId: null,
36644
36722
  access: "view"
36645
36723
  },
36724
+ "pipelineAnalytics.getEventDensityBatch": {
36725
+ capName: "pipeline-analytics",
36726
+ capScope: "device",
36727
+ addonId: null,
36728
+ access: "view"
36729
+ },
36646
36730
  "pipelineAnalytics.getEventMedia": {
36647
36731
  capName: "pipeline-analytics",
36648
36732
  capScope: "device",
@@ -37765,12 +37849,24 @@ Object.freeze({
37765
37849
  addonId: null,
37766
37850
  access: "view"
37767
37851
  },
37852
+ "recording.getAvailabilityBatch": {
37853
+ capName: "recording",
37854
+ capScope: "system",
37855
+ addonId: null,
37856
+ access: "view"
37857
+ },
37768
37858
  "recording.getDaysWithRecordings": {
37769
37859
  capName: "recording",
37770
37860
  capScope: "system",
37771
37861
  addonId: null,
37772
37862
  access: "view"
37773
37863
  },
37864
+ "recording.getDaysWithRecordingsBatch": {
37865
+ capName: "recording",
37866
+ capScope: "system",
37867
+ addonId: null,
37868
+ access: "view"
37869
+ },
37774
37870
  "recording.getDeviceConfig": {
37775
37871
  capName: "recording",
37776
37872
  capScope: "system",
@@ -40375,6 +40471,11 @@ Object.freeze({
40375
40471
  form: "single",
40376
40472
  optional: false
40377
40473
  }],
40474
+ "pipelineAnalytics.getEventDensityBatch": [{
40475
+ name: "deviceIds",
40476
+ form: "array",
40477
+ optional: false
40478
+ }],
40378
40479
  "pipelineAnalytics.getEventMedia": [{
40379
40480
  name: "deviceId",
40380
40481
  form: "single",
@@ -40790,11 +40891,21 @@ Object.freeze({
40790
40891
  form: "single",
40791
40892
  optional: false
40792
40893
  }],
40894
+ "recording.getAvailabilityBatch": [{
40895
+ name: "deviceIds",
40896
+ form: "array",
40897
+ optional: false
40898
+ }],
40793
40899
  "recording.getDaysWithRecordings": [{
40794
40900
  name: "deviceId",
40795
40901
  form: "single",
40796
40902
  optional: false
40797
40903
  }],
40904
+ "recording.getDaysWithRecordingsBatch": [{
40905
+ name: "deviceIds",
40906
+ form: "array",
40907
+ optional: false
40908
+ }],
40798
40909
  "recording.getDeviceConfig": [{
40799
40910
  name: "deviceId",
40800
40911
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-hikvision",
3
- "version": "1.2.58",
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",