@camstack/addon-provider-rtsp 1.2.51 → 1.2.52

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
@@ -19247,6 +19247,34 @@ var KeyEventsForDeviceSchema = object({
19247
19247
  deviceId: number(),
19248
19248
  events: array(KeyEventSchema).readonly()
19249
19249
  });
19250
+ /** One non-empty bucket of the timeline histogram. */
19251
+ var EventDensityBucketSchema = object({
19252
+ bucketStart: number(),
19253
+ motion: number().int(),
19254
+ object: number().int(),
19255
+ audio: number().int()
19256
+ });
19257
+ /**
19258
+ * One camera's row in a `getEventDensityBatch` answer.
19259
+ *
19260
+ * TWO facts, and the timeline draws them differently:
19261
+ *
19262
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19263
+ * claim: read, and nothing happened in the window.
19264
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19265
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19266
+ * not quiet.
19267
+ *
19268
+ * Fanned out per camera the difference was free — one query rejected while the
19269
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19270
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19271
+ * got eleven cannot tell which one is missing, or that any is.
19272
+ */
19273
+ var EventDensityForDeviceSchema = object({
19274
+ deviceId: number(),
19275
+ read: _enum(["read", "unreadable"]),
19276
+ buckets: array(EventDensityBucketSchema).readonly()
19277
+ });
19250
19278
  object({
19251
19279
  trackId: string(),
19252
19280
  className: string(),
@@ -19557,12 +19585,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19557
19585
  since: number(),
19558
19586
  until: number(),
19559
19587
  bucketMs: number().int().positive()
19560
- }), array(object({
19561
- bucketStart: number(),
19562
- motion: number().int(),
19563
- object: number().int(),
19564
- audio: number().int()
19565
- })).readonly()), method(object({
19588
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19589
+ deviceIds: array(number()).min(1).max(200),
19590
+ since: number(),
19591
+ until: number(),
19592
+ bucketMs: number().int().positive()
19593
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19566
19594
  deviceId: number(),
19567
19595
  cutoffMs: number()
19568
19596
  }), object({
@@ -28699,6 +28727,39 @@ var RecordingDaysSchema = object({
28699
28727
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28700
28728
  days: array(number())
28701
28729
  });
28730
+ /**
28731
+ * One camera's row in a `getAvailabilityBatch` answer.
28732
+ *
28733
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28734
+ * batch collapses the transport, not the work — plus the one thing the singular
28735
+ * method never had to say:
28736
+ *
28737
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28738
+ * no footage in the window", which is a real claim.
28739
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28740
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28741
+ * that emptiness means NOTHING.
28742
+ *
28743
+ * A timeline that renders the second as the first tells an operator there is no
28744
+ * footage when the truth is that nobody looked.
28745
+ */
28746
+ var RecordingAvailabilityForDeviceSchema = object({
28747
+ deviceId: number(),
28748
+ read: _enum(["read", "unreadable"]),
28749
+ ranges: array(RecordingRangeSchema).readonly()
28750
+ });
28751
+ /**
28752
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28753
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28754
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28755
+ * the date-picker's day dots must not spell them the same.
28756
+ */
28757
+ var RecordingDaysForDeviceSchema = object({
28758
+ deviceId: number(),
28759
+ read: _enum(["read", "unreadable"]),
28760
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28761
+ days: array(number()).readonly()
28762
+ });
28702
28763
  var RecordingManifestSchema = object({
28703
28764
  deviceId: number(),
28704
28765
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28933,6 +28994,13 @@ method(object({
28933
28994
  }), RecordingAvailabilitySchema, {
28934
28995
  kind: "query",
28935
28996
  auth: "protected"
28997
+ }), method(object({
28998
+ deviceIds: array(number()).min(1).max(200),
28999
+ fromMs: number(),
29000
+ toMs: number()
29001
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29002
+ kind: "query",
29003
+ auth: "protected"
28936
29004
  }), method(object({
28937
29005
  deviceId: number(),
28938
29006
  fromMs: number(),
@@ -28941,6 +29009,14 @@ method(object({
28941
29009
  }), RecordingDaysSchema, {
28942
29010
  kind: "query",
28943
29011
  auth: "protected"
29012
+ }), method(object({
29013
+ deviceIds: array(number()).min(1).max(200),
29014
+ fromMs: number(),
29015
+ toMs: number(),
29016
+ tzOffsetMinutes: number()
29017
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29018
+ kind: "query",
29019
+ auth: "protected"
28944
29020
  }), method(object({
28945
29021
  deviceId: number(),
28946
29022
  fromMs: number(),
@@ -35903,6 +35979,12 @@ Object.freeze({
35903
35979
  addonId: null,
35904
35980
  access: "view"
35905
35981
  },
35982
+ "pipelineAnalytics.getEventDensityBatch": {
35983
+ capName: "pipeline-analytics",
35984
+ capScope: "device",
35985
+ addonId: null,
35986
+ access: "view"
35987
+ },
35906
35988
  "pipelineAnalytics.getEventMedia": {
35907
35989
  capName: "pipeline-analytics",
35908
35990
  capScope: "device",
@@ -37025,12 +37107,24 @@ Object.freeze({
37025
37107
  addonId: null,
37026
37108
  access: "view"
37027
37109
  },
37110
+ "recording.getAvailabilityBatch": {
37111
+ capName: "recording",
37112
+ capScope: "system",
37113
+ addonId: null,
37114
+ access: "view"
37115
+ },
37028
37116
  "recording.getDaysWithRecordings": {
37029
37117
  capName: "recording",
37030
37118
  capScope: "system",
37031
37119
  addonId: null,
37032
37120
  access: "view"
37033
37121
  },
37122
+ "recording.getDaysWithRecordingsBatch": {
37123
+ capName: "recording",
37124
+ capScope: "system",
37125
+ addonId: null,
37126
+ access: "view"
37127
+ },
37034
37128
  "recording.getDeviceConfig": {
37035
37129
  capName: "recording",
37036
37130
  capScope: "system",
@@ -39635,6 +39729,11 @@ Object.freeze({
39635
39729
  form: "single",
39636
39730
  optional: false
39637
39731
  }],
39732
+ "pipelineAnalytics.getEventDensityBatch": [{
39733
+ name: "deviceIds",
39734
+ form: "array",
39735
+ optional: false
39736
+ }],
39638
39737
  "pipelineAnalytics.getEventMedia": [{
39639
39738
  name: "deviceId",
39640
39739
  form: "single",
@@ -40050,11 +40149,21 @@ Object.freeze({
40050
40149
  form: "single",
40051
40150
  optional: false
40052
40151
  }],
40152
+ "recording.getAvailabilityBatch": [{
40153
+ name: "deviceIds",
40154
+ form: "array",
40155
+ optional: false
40156
+ }],
40053
40157
  "recording.getDaysWithRecordings": [{
40054
40158
  name: "deviceId",
40055
40159
  form: "single",
40056
40160
  optional: false
40057
40161
  }],
40162
+ "recording.getDaysWithRecordingsBatch": [{
40163
+ name: "deviceIds",
40164
+ form: "array",
40165
+ optional: false
40166
+ }],
40058
40167
  "recording.getDeviceConfig": [{
40059
40168
  name: "deviceId",
40060
40169
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19223,6 +19223,34 @@ var KeyEventsForDeviceSchema = object({
19223
19223
  deviceId: number(),
19224
19224
  events: array(KeyEventSchema).readonly()
19225
19225
  });
19226
+ /** One non-empty bucket of the timeline histogram. */
19227
+ var EventDensityBucketSchema = object({
19228
+ bucketStart: number(),
19229
+ motion: number().int(),
19230
+ object: number().int(),
19231
+ audio: number().int()
19232
+ });
19233
+ /**
19234
+ * One camera's row in a `getEventDensityBatch` answer.
19235
+ *
19236
+ * TWO facts, and the timeline draws them differently:
19237
+ *
19238
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19239
+ * claim: read, and nothing happened in the window.
19240
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19241
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19242
+ * not quiet.
19243
+ *
19244
+ * Fanned out per camera the difference was free — one query rejected while the
19245
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19246
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19247
+ * got eleven cannot tell which one is missing, or that any is.
19248
+ */
19249
+ var EventDensityForDeviceSchema = object({
19250
+ deviceId: number(),
19251
+ read: _enum(["read", "unreadable"]),
19252
+ buckets: array(EventDensityBucketSchema).readonly()
19253
+ });
19226
19254
  object({
19227
19255
  trackId: string(),
19228
19256
  className: string(),
@@ -19533,12 +19561,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19533
19561
  since: number(),
19534
19562
  until: number(),
19535
19563
  bucketMs: number().int().positive()
19536
- }), array(object({
19537
- bucketStart: number(),
19538
- motion: number().int(),
19539
- object: number().int(),
19540
- audio: number().int()
19541
- })).readonly()), method(object({
19564
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19565
+ deviceIds: array(number()).min(1).max(200),
19566
+ since: number(),
19567
+ until: number(),
19568
+ bucketMs: number().int().positive()
19569
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19542
19570
  deviceId: number(),
19543
19571
  cutoffMs: number()
19544
19572
  }), object({
@@ -28675,6 +28703,39 @@ var RecordingDaysSchema = object({
28675
28703
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28676
28704
  days: array(number())
28677
28705
  });
28706
+ /**
28707
+ * One camera's row in a `getAvailabilityBatch` answer.
28708
+ *
28709
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28710
+ * batch collapses the transport, not the work — plus the one thing the singular
28711
+ * method never had to say:
28712
+ *
28713
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28714
+ * no footage in the window", which is a real claim.
28715
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28716
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28717
+ * that emptiness means NOTHING.
28718
+ *
28719
+ * A timeline that renders the second as the first tells an operator there is no
28720
+ * footage when the truth is that nobody looked.
28721
+ */
28722
+ var RecordingAvailabilityForDeviceSchema = object({
28723
+ deviceId: number(),
28724
+ read: _enum(["read", "unreadable"]),
28725
+ ranges: array(RecordingRangeSchema).readonly()
28726
+ });
28727
+ /**
28728
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28729
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28730
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28731
+ * the date-picker's day dots must not spell them the same.
28732
+ */
28733
+ var RecordingDaysForDeviceSchema = object({
28734
+ deviceId: number(),
28735
+ read: _enum(["read", "unreadable"]),
28736
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28737
+ days: array(number()).readonly()
28738
+ });
28678
28739
  var RecordingManifestSchema = object({
28679
28740
  deviceId: number(),
28680
28741
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28909,6 +28970,13 @@ method(object({
28909
28970
  }), RecordingAvailabilitySchema, {
28910
28971
  kind: "query",
28911
28972
  auth: "protected"
28973
+ }), method(object({
28974
+ deviceIds: array(number()).min(1).max(200),
28975
+ fromMs: number(),
28976
+ toMs: number()
28977
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28978
+ kind: "query",
28979
+ auth: "protected"
28912
28980
  }), method(object({
28913
28981
  deviceId: number(),
28914
28982
  fromMs: number(),
@@ -28917,6 +28985,14 @@ method(object({
28917
28985
  }), RecordingDaysSchema, {
28918
28986
  kind: "query",
28919
28987
  auth: "protected"
28988
+ }), method(object({
28989
+ deviceIds: array(number()).min(1).max(200),
28990
+ fromMs: number(),
28991
+ toMs: number(),
28992
+ tzOffsetMinutes: number()
28993
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28994
+ kind: "query",
28995
+ auth: "protected"
28920
28996
  }), method(object({
28921
28997
  deviceId: number(),
28922
28998
  fromMs: number(),
@@ -35879,6 +35955,12 @@ Object.freeze({
35879
35955
  addonId: null,
35880
35956
  access: "view"
35881
35957
  },
35958
+ "pipelineAnalytics.getEventDensityBatch": {
35959
+ capName: "pipeline-analytics",
35960
+ capScope: "device",
35961
+ addonId: null,
35962
+ access: "view"
35963
+ },
35882
35964
  "pipelineAnalytics.getEventMedia": {
35883
35965
  capName: "pipeline-analytics",
35884
35966
  capScope: "device",
@@ -37001,12 +37083,24 @@ Object.freeze({
37001
37083
  addonId: null,
37002
37084
  access: "view"
37003
37085
  },
37086
+ "recording.getAvailabilityBatch": {
37087
+ capName: "recording",
37088
+ capScope: "system",
37089
+ addonId: null,
37090
+ access: "view"
37091
+ },
37004
37092
  "recording.getDaysWithRecordings": {
37005
37093
  capName: "recording",
37006
37094
  capScope: "system",
37007
37095
  addonId: null,
37008
37096
  access: "view"
37009
37097
  },
37098
+ "recording.getDaysWithRecordingsBatch": {
37099
+ capName: "recording",
37100
+ capScope: "system",
37101
+ addonId: null,
37102
+ access: "view"
37103
+ },
37010
37104
  "recording.getDeviceConfig": {
37011
37105
  capName: "recording",
37012
37106
  capScope: "system",
@@ -39611,6 +39705,11 @@ Object.freeze({
39611
39705
  form: "single",
39612
39706
  optional: false
39613
39707
  }],
39708
+ "pipelineAnalytics.getEventDensityBatch": [{
39709
+ name: "deviceIds",
39710
+ form: "array",
39711
+ optional: false
39712
+ }],
39614
39713
  "pipelineAnalytics.getEventMedia": [{
39615
39714
  name: "deviceId",
39616
39715
  form: "single",
@@ -40026,11 +40125,21 @@ Object.freeze({
40026
40125
  form: "single",
40027
40126
  optional: false
40028
40127
  }],
40128
+ "recording.getAvailabilityBatch": [{
40129
+ name: "deviceIds",
40130
+ form: "array",
40131
+ optional: false
40132
+ }],
40029
40133
  "recording.getDaysWithRecordings": [{
40030
40134
  name: "deviceId",
40031
40135
  form: "single",
40032
40136
  optional: false
40033
40137
  }],
40138
+ "recording.getDaysWithRecordingsBatch": [{
40139
+ name: "deviceIds",
40140
+ form: "array",
40141
+ optional: false
40142
+ }],
40034
40143
  "recording.getDeviceConfig": [{
40035
40144
  name: "deviceId",
40036
40145
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.51",
3
+ "version": "1.2.52",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",