@camstack/addon-provider-amcrest 0.2.52 → 0.2.53

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
@@ -19184,6 +19184,34 @@ var KeyEventsForDeviceSchema = object({
19184
19184
  deviceId: number(),
19185
19185
  events: array(KeyEventSchema).readonly()
19186
19186
  });
19187
+ /** One non-empty bucket of the timeline histogram. */
19188
+ var EventDensityBucketSchema = object({
19189
+ bucketStart: number(),
19190
+ motion: number().int(),
19191
+ object: number().int(),
19192
+ audio: number().int()
19193
+ });
19194
+ /**
19195
+ * One camera's row in a `getEventDensityBatch` answer.
19196
+ *
19197
+ * TWO facts, and the timeline draws them differently:
19198
+ *
19199
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19200
+ * claim: read, and nothing happened in the window.
19201
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19202
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19203
+ * not quiet.
19204
+ *
19205
+ * Fanned out per camera the difference was free — one query rejected while the
19206
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19207
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19208
+ * got eleven cannot tell which one is missing, or that any is.
19209
+ */
19210
+ var EventDensityForDeviceSchema = object({
19211
+ deviceId: number(),
19212
+ read: _enum(["read", "unreadable"]),
19213
+ buckets: array(EventDensityBucketSchema).readonly()
19214
+ });
19187
19215
  object({
19188
19216
  trackId: string(),
19189
19217
  className: string(),
@@ -19494,12 +19522,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19494
19522
  since: number(),
19495
19523
  until: number(),
19496
19524
  bucketMs: number().int().positive()
19497
- }), array(object({
19498
- bucketStart: number(),
19499
- motion: number().int(),
19500
- object: number().int(),
19501
- audio: number().int()
19502
- })).readonly()), method(object({
19525
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19526
+ deviceIds: array(number()).min(1).max(200),
19527
+ since: number(),
19528
+ until: number(),
19529
+ bucketMs: number().int().positive()
19530
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19503
19531
  deviceId: number(),
19504
19532
  cutoffMs: number()
19505
19533
  }), object({
@@ -28716,6 +28744,39 @@ var RecordingDaysSchema = object({
28716
28744
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28717
28745
  days: array(number())
28718
28746
  });
28747
+ /**
28748
+ * One camera's row in a `getAvailabilityBatch` answer.
28749
+ *
28750
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28751
+ * batch collapses the transport, not the work — plus the one thing the singular
28752
+ * method never had to say:
28753
+ *
28754
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28755
+ * no footage in the window", which is a real claim.
28756
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28757
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28758
+ * that emptiness means NOTHING.
28759
+ *
28760
+ * A timeline that renders the second as the first tells an operator there is no
28761
+ * footage when the truth is that nobody looked.
28762
+ */
28763
+ var RecordingAvailabilityForDeviceSchema = object({
28764
+ deviceId: number(),
28765
+ read: _enum(["read", "unreadable"]),
28766
+ ranges: array(RecordingRangeSchema).readonly()
28767
+ });
28768
+ /**
28769
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28770
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28771
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28772
+ * the date-picker's day dots must not spell them the same.
28773
+ */
28774
+ var RecordingDaysForDeviceSchema = object({
28775
+ deviceId: number(),
28776
+ read: _enum(["read", "unreadable"]),
28777
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28778
+ days: array(number()).readonly()
28779
+ });
28719
28780
  var RecordingManifestSchema = object({
28720
28781
  deviceId: number(),
28721
28782
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28950,6 +29011,13 @@ method(object({
28950
29011
  }), RecordingAvailabilitySchema, {
28951
29012
  kind: "query",
28952
29013
  auth: "protected"
29014
+ }), method(object({
29015
+ deviceIds: array(number()).min(1).max(200),
29016
+ fromMs: number(),
29017
+ toMs: number()
29018
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29019
+ kind: "query",
29020
+ auth: "protected"
28953
29021
  }), method(object({
28954
29022
  deviceId: number(),
28955
29023
  fromMs: number(),
@@ -28958,6 +29026,14 @@ method(object({
28958
29026
  }), RecordingDaysSchema, {
28959
29027
  kind: "query",
28960
29028
  auth: "protected"
29029
+ }), method(object({
29030
+ deviceIds: array(number()).min(1).max(200),
29031
+ fromMs: number(),
29032
+ toMs: number(),
29033
+ tzOffsetMinutes: number()
29034
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29035
+ kind: "query",
29036
+ auth: "protected"
28961
29037
  }), method(object({
28962
29038
  deviceId: number(),
28963
29039
  fromMs: number(),
@@ -36258,6 +36334,12 @@ Object.freeze({
36258
36334
  addonId: null,
36259
36335
  access: "view"
36260
36336
  },
36337
+ "pipelineAnalytics.getEventDensityBatch": {
36338
+ capName: "pipeline-analytics",
36339
+ capScope: "device",
36340
+ addonId: null,
36341
+ access: "view"
36342
+ },
36261
36343
  "pipelineAnalytics.getEventMedia": {
36262
36344
  capName: "pipeline-analytics",
36263
36345
  capScope: "device",
@@ -37380,12 +37462,24 @@ Object.freeze({
37380
37462
  addonId: null,
37381
37463
  access: "view"
37382
37464
  },
37465
+ "recording.getAvailabilityBatch": {
37466
+ capName: "recording",
37467
+ capScope: "system",
37468
+ addonId: null,
37469
+ access: "view"
37470
+ },
37383
37471
  "recording.getDaysWithRecordings": {
37384
37472
  capName: "recording",
37385
37473
  capScope: "system",
37386
37474
  addonId: null,
37387
37475
  access: "view"
37388
37476
  },
37477
+ "recording.getDaysWithRecordingsBatch": {
37478
+ capName: "recording",
37479
+ capScope: "system",
37480
+ addonId: null,
37481
+ access: "view"
37482
+ },
37389
37483
  "recording.getDeviceConfig": {
37390
37484
  capName: "recording",
37391
37485
  capScope: "system",
@@ -39990,6 +40084,11 @@ Object.freeze({
39990
40084
  form: "single",
39991
40085
  optional: false
39992
40086
  }],
40087
+ "pipelineAnalytics.getEventDensityBatch": [{
40088
+ name: "deviceIds",
40089
+ form: "array",
40090
+ optional: false
40091
+ }],
39993
40092
  "pipelineAnalytics.getEventMedia": [{
39994
40093
  name: "deviceId",
39995
40094
  form: "single",
@@ -40405,11 +40504,21 @@ Object.freeze({
40405
40504
  form: "single",
40406
40505
  optional: false
40407
40506
  }],
40507
+ "recording.getAvailabilityBatch": [{
40508
+ name: "deviceIds",
40509
+ form: "array",
40510
+ optional: false
40511
+ }],
40408
40512
  "recording.getDaysWithRecordings": [{
40409
40513
  name: "deviceId",
40410
40514
  form: "single",
40411
40515
  optional: false
40412
40516
  }],
40517
+ "recording.getDaysWithRecordingsBatch": [{
40518
+ name: "deviceIds",
40519
+ form: "array",
40520
+ optional: false
40521
+ }],
40413
40522
  "recording.getDeviceConfig": [{
40414
40523
  name: "deviceId",
40415
40524
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19185,6 +19185,34 @@ var KeyEventsForDeviceSchema = object({
19185
19185
  deviceId: number(),
19186
19186
  events: array(KeyEventSchema).readonly()
19187
19187
  });
19188
+ /** One non-empty bucket of the timeline histogram. */
19189
+ var EventDensityBucketSchema = object({
19190
+ bucketStart: number(),
19191
+ motion: number().int(),
19192
+ object: number().int(),
19193
+ audio: number().int()
19194
+ });
19195
+ /**
19196
+ * One camera's row in a `getEventDensityBatch` answer.
19197
+ *
19198
+ * TWO facts, and the timeline draws them differently:
19199
+ *
19200
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19201
+ * claim: read, and nothing happened in the window.
19202
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19203
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19204
+ * not quiet.
19205
+ *
19206
+ * Fanned out per camera the difference was free — one query rejected while the
19207
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19208
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19209
+ * got eleven cannot tell which one is missing, or that any is.
19210
+ */
19211
+ var EventDensityForDeviceSchema = object({
19212
+ deviceId: number(),
19213
+ read: _enum(["read", "unreadable"]),
19214
+ buckets: array(EventDensityBucketSchema).readonly()
19215
+ });
19188
19216
  object({
19189
19217
  trackId: string(),
19190
19218
  className: string(),
@@ -19495,12 +19523,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19495
19523
  since: number(),
19496
19524
  until: number(),
19497
19525
  bucketMs: number().int().positive()
19498
- }), array(object({
19499
- bucketStart: number(),
19500
- motion: number().int(),
19501
- object: number().int(),
19502
- audio: number().int()
19503
- })).readonly()), method(object({
19526
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19527
+ deviceIds: array(number()).min(1).max(200),
19528
+ since: number(),
19529
+ until: number(),
19530
+ bucketMs: number().int().positive()
19531
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19504
19532
  deviceId: number(),
19505
19533
  cutoffMs: number()
19506
19534
  }), object({
@@ -28717,6 +28745,39 @@ var RecordingDaysSchema = object({
28717
28745
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28718
28746
  days: array(number())
28719
28747
  });
28748
+ /**
28749
+ * One camera's row in a `getAvailabilityBatch` answer.
28750
+ *
28751
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28752
+ * batch collapses the transport, not the work — plus the one thing the singular
28753
+ * method never had to say:
28754
+ *
28755
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28756
+ * no footage in the window", which is a real claim.
28757
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28758
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28759
+ * that emptiness means NOTHING.
28760
+ *
28761
+ * A timeline that renders the second as the first tells an operator there is no
28762
+ * footage when the truth is that nobody looked.
28763
+ */
28764
+ var RecordingAvailabilityForDeviceSchema = object({
28765
+ deviceId: number(),
28766
+ read: _enum(["read", "unreadable"]),
28767
+ ranges: array(RecordingRangeSchema).readonly()
28768
+ });
28769
+ /**
28770
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28771
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28772
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28773
+ * the date-picker's day dots must not spell them the same.
28774
+ */
28775
+ var RecordingDaysForDeviceSchema = object({
28776
+ deviceId: number(),
28777
+ read: _enum(["read", "unreadable"]),
28778
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28779
+ days: array(number()).readonly()
28780
+ });
28720
28781
  var RecordingManifestSchema = object({
28721
28782
  deviceId: number(),
28722
28783
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28951,6 +29012,13 @@ method(object({
28951
29012
  }), RecordingAvailabilitySchema, {
28952
29013
  kind: "query",
28953
29014
  auth: "protected"
29015
+ }), method(object({
29016
+ deviceIds: array(number()).min(1).max(200),
29017
+ fromMs: number(),
29018
+ toMs: number()
29019
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29020
+ kind: "query",
29021
+ auth: "protected"
28954
29022
  }), method(object({
28955
29023
  deviceId: number(),
28956
29024
  fromMs: number(),
@@ -28959,6 +29027,14 @@ method(object({
28959
29027
  }), RecordingDaysSchema, {
28960
29028
  kind: "query",
28961
29029
  auth: "protected"
29030
+ }), method(object({
29031
+ deviceIds: array(number()).min(1).max(200),
29032
+ fromMs: number(),
29033
+ toMs: number(),
29034
+ tzOffsetMinutes: number()
29035
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29036
+ kind: "query",
29037
+ auth: "protected"
28962
29038
  }), method(object({
28963
29039
  deviceId: number(),
28964
29040
  fromMs: number(),
@@ -36259,6 +36335,12 @@ Object.freeze({
36259
36335
  addonId: null,
36260
36336
  access: "view"
36261
36337
  },
36338
+ "pipelineAnalytics.getEventDensityBatch": {
36339
+ capName: "pipeline-analytics",
36340
+ capScope: "device",
36341
+ addonId: null,
36342
+ access: "view"
36343
+ },
36262
36344
  "pipelineAnalytics.getEventMedia": {
36263
36345
  capName: "pipeline-analytics",
36264
36346
  capScope: "device",
@@ -37381,12 +37463,24 @@ Object.freeze({
37381
37463
  addonId: null,
37382
37464
  access: "view"
37383
37465
  },
37466
+ "recording.getAvailabilityBatch": {
37467
+ capName: "recording",
37468
+ capScope: "system",
37469
+ addonId: null,
37470
+ access: "view"
37471
+ },
37384
37472
  "recording.getDaysWithRecordings": {
37385
37473
  capName: "recording",
37386
37474
  capScope: "system",
37387
37475
  addonId: null,
37388
37476
  access: "view"
37389
37477
  },
37478
+ "recording.getDaysWithRecordingsBatch": {
37479
+ capName: "recording",
37480
+ capScope: "system",
37481
+ addonId: null,
37482
+ access: "view"
37483
+ },
37390
37484
  "recording.getDeviceConfig": {
37391
37485
  capName: "recording",
37392
37486
  capScope: "system",
@@ -39991,6 +40085,11 @@ Object.freeze({
39991
40085
  form: "single",
39992
40086
  optional: false
39993
40087
  }],
40088
+ "pipelineAnalytics.getEventDensityBatch": [{
40089
+ name: "deviceIds",
40090
+ form: "array",
40091
+ optional: false
40092
+ }],
39994
40093
  "pipelineAnalytics.getEventMedia": [{
39995
40094
  name: "deviceId",
39996
40095
  form: "single",
@@ -40406,11 +40505,21 @@ Object.freeze({
40406
40505
  form: "single",
40407
40506
  optional: false
40408
40507
  }],
40508
+ "recording.getAvailabilityBatch": [{
40509
+ name: "deviceIds",
40510
+ form: "array",
40511
+ optional: false
40512
+ }],
40409
40513
  "recording.getDaysWithRecordings": [{
40410
40514
  name: "deviceId",
40411
40515
  form: "single",
40412
40516
  optional: false
40413
40517
  }],
40518
+ "recording.getDaysWithRecordingsBatch": [{
40519
+ name: "deviceIds",
40520
+ form: "array",
40521
+ optional: false
40522
+ }],
40414
40523
  "recording.getDeviceConfig": [{
40415
40524
  name: "deviceId",
40416
40525
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.52",
3
+ "version": "0.2.53",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",