@camstack/addon-provider-wyze 0.2.55 → 0.2.56

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
@@ -19240,6 +19240,34 @@ var KeyEventsForDeviceSchema = object({
19240
19240
  deviceId: number(),
19241
19241
  events: array(KeyEventSchema).readonly()
19242
19242
  });
19243
+ /** One non-empty bucket of the timeline histogram. */
19244
+ var EventDensityBucketSchema = object({
19245
+ bucketStart: number(),
19246
+ motion: number().int(),
19247
+ object: number().int(),
19248
+ audio: number().int()
19249
+ });
19250
+ /**
19251
+ * One camera's row in a `getEventDensityBatch` answer.
19252
+ *
19253
+ * TWO facts, and the timeline draws them differently:
19254
+ *
19255
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19256
+ * claim: read, and nothing happened in the window.
19257
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19258
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19259
+ * not quiet.
19260
+ *
19261
+ * Fanned out per camera the difference was free — one query rejected while the
19262
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19263
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19264
+ * got eleven cannot tell which one is missing, or that any is.
19265
+ */
19266
+ var EventDensityForDeviceSchema = object({
19267
+ deviceId: number(),
19268
+ read: _enum(["read", "unreadable"]),
19269
+ buckets: array(EventDensityBucketSchema).readonly()
19270
+ });
19243
19271
  object({
19244
19272
  trackId: string(),
19245
19273
  className: string(),
@@ -19550,12 +19578,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19550
19578
  since: number(),
19551
19579
  until: number(),
19552
19580
  bucketMs: number().int().positive()
19553
- }), array(object({
19554
- bucketStart: number(),
19555
- motion: number().int(),
19556
- object: number().int(),
19557
- audio: number().int()
19558
- })).readonly()), method(object({
19581
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19582
+ deviceIds: array(number()).min(1).max(200),
19583
+ since: number(),
19584
+ until: number(),
19585
+ bucketMs: number().int().positive()
19586
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19559
19587
  deviceId: number(),
19560
19588
  cutoffMs: number()
19561
19589
  }), object({
@@ -28692,6 +28720,39 @@ var RecordingDaysSchema = object({
28692
28720
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28693
28721
  days: array(number())
28694
28722
  });
28723
+ /**
28724
+ * One camera's row in a `getAvailabilityBatch` answer.
28725
+ *
28726
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28727
+ * batch collapses the transport, not the work — plus the one thing the singular
28728
+ * method never had to say:
28729
+ *
28730
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28731
+ * no footage in the window", which is a real claim.
28732
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28733
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28734
+ * that emptiness means NOTHING.
28735
+ *
28736
+ * A timeline that renders the second as the first tells an operator there is no
28737
+ * footage when the truth is that nobody looked.
28738
+ */
28739
+ var RecordingAvailabilityForDeviceSchema = object({
28740
+ deviceId: number(),
28741
+ read: _enum(["read", "unreadable"]),
28742
+ ranges: array(RecordingRangeSchema).readonly()
28743
+ });
28744
+ /**
28745
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28746
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28747
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28748
+ * the date-picker's day dots must not spell them the same.
28749
+ */
28750
+ var RecordingDaysForDeviceSchema = object({
28751
+ deviceId: number(),
28752
+ read: _enum(["read", "unreadable"]),
28753
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28754
+ days: array(number()).readonly()
28755
+ });
28695
28756
  var RecordingManifestSchema = object({
28696
28757
  deviceId: number(),
28697
28758
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28926,6 +28987,13 @@ method(object({
28926
28987
  }), RecordingAvailabilitySchema, {
28927
28988
  kind: "query",
28928
28989
  auth: "protected"
28990
+ }), method(object({
28991
+ deviceIds: array(number()).min(1).max(200),
28992
+ fromMs: number(),
28993
+ toMs: number()
28994
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28995
+ kind: "query",
28996
+ auth: "protected"
28929
28997
  }), method(object({
28930
28998
  deviceId: number(),
28931
28999
  fromMs: number(),
@@ -28934,6 +29002,14 @@ method(object({
28934
29002
  }), RecordingDaysSchema, {
28935
29003
  kind: "query",
28936
29004
  auth: "protected"
29005
+ }), method(object({
29006
+ deviceIds: array(number()).min(1).max(200),
29007
+ fromMs: number(),
29008
+ toMs: number(),
29009
+ tzOffsetMinutes: number()
29010
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29011
+ kind: "query",
29012
+ auth: "protected"
28937
29013
  }), method(object({
28938
29014
  deviceId: number(),
28939
29015
  fromMs: number(),
@@ -35830,6 +35906,12 @@ Object.freeze({
35830
35906
  addonId: null,
35831
35907
  access: "view"
35832
35908
  },
35909
+ "pipelineAnalytics.getEventDensityBatch": {
35910
+ capName: "pipeline-analytics",
35911
+ capScope: "device",
35912
+ addonId: null,
35913
+ access: "view"
35914
+ },
35833
35915
  "pipelineAnalytics.getEventMedia": {
35834
35916
  capName: "pipeline-analytics",
35835
35917
  capScope: "device",
@@ -36952,12 +37034,24 @@ Object.freeze({
36952
37034
  addonId: null,
36953
37035
  access: "view"
36954
37036
  },
37037
+ "recording.getAvailabilityBatch": {
37038
+ capName: "recording",
37039
+ capScope: "system",
37040
+ addonId: null,
37041
+ access: "view"
37042
+ },
36955
37043
  "recording.getDaysWithRecordings": {
36956
37044
  capName: "recording",
36957
37045
  capScope: "system",
36958
37046
  addonId: null,
36959
37047
  access: "view"
36960
37048
  },
37049
+ "recording.getDaysWithRecordingsBatch": {
37050
+ capName: "recording",
37051
+ capScope: "system",
37052
+ addonId: null,
37053
+ access: "view"
37054
+ },
36961
37055
  "recording.getDeviceConfig": {
36962
37056
  capName: "recording",
36963
37057
  capScope: "system",
@@ -39562,6 +39656,11 @@ Object.freeze({
39562
39656
  form: "single",
39563
39657
  optional: false
39564
39658
  }],
39659
+ "pipelineAnalytics.getEventDensityBatch": [{
39660
+ name: "deviceIds",
39661
+ form: "array",
39662
+ optional: false
39663
+ }],
39565
39664
  "pipelineAnalytics.getEventMedia": [{
39566
39665
  name: "deviceId",
39567
39666
  form: "single",
@@ -39977,11 +40076,21 @@ Object.freeze({
39977
40076
  form: "single",
39978
40077
  optional: false
39979
40078
  }],
40079
+ "recording.getAvailabilityBatch": [{
40080
+ name: "deviceIds",
40081
+ form: "array",
40082
+ optional: false
40083
+ }],
39980
40084
  "recording.getDaysWithRecordings": [{
39981
40085
  name: "deviceId",
39982
40086
  form: "single",
39983
40087
  optional: false
39984
40088
  }],
40089
+ "recording.getDaysWithRecordingsBatch": [{
40090
+ name: "deviceIds",
40091
+ form: "array",
40092
+ optional: false
40093
+ }],
39985
40094
  "recording.getDeviceConfig": [{
39986
40095
  name: "deviceId",
39987
40096
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19219,6 +19219,34 @@ var KeyEventsForDeviceSchema = object({
19219
19219
  deviceId: number(),
19220
19220
  events: array(KeyEventSchema).readonly()
19221
19221
  });
19222
+ /** One non-empty bucket of the timeline histogram. */
19223
+ var EventDensityBucketSchema = object({
19224
+ bucketStart: number(),
19225
+ motion: number().int(),
19226
+ object: number().int(),
19227
+ audio: number().int()
19228
+ });
19229
+ /**
19230
+ * One camera's row in a `getEventDensityBatch` answer.
19231
+ *
19232
+ * TWO facts, and the timeline draws them differently:
19233
+ *
19234
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19235
+ * claim: read, and nothing happened in the window.
19236
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19237
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19238
+ * not quiet.
19239
+ *
19240
+ * Fanned out per camera the difference was free — one query rejected while the
19241
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19242
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19243
+ * got eleven cannot tell which one is missing, or that any is.
19244
+ */
19245
+ var EventDensityForDeviceSchema = object({
19246
+ deviceId: number(),
19247
+ read: _enum(["read", "unreadable"]),
19248
+ buckets: array(EventDensityBucketSchema).readonly()
19249
+ });
19222
19250
  object({
19223
19251
  trackId: string(),
19224
19252
  className: string(),
@@ -19529,12 +19557,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19529
19557
  since: number(),
19530
19558
  until: number(),
19531
19559
  bucketMs: number().int().positive()
19532
- }), array(object({
19533
- bucketStart: number(),
19534
- motion: number().int(),
19535
- object: number().int(),
19536
- audio: number().int()
19537
- })).readonly()), method(object({
19560
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19561
+ deviceIds: array(number()).min(1).max(200),
19562
+ since: number(),
19563
+ until: number(),
19564
+ bucketMs: number().int().positive()
19565
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19538
19566
  deviceId: number(),
19539
19567
  cutoffMs: number()
19540
19568
  }), object({
@@ -28671,6 +28699,39 @@ var RecordingDaysSchema = object({
28671
28699
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28672
28700
  days: array(number())
28673
28701
  });
28702
+ /**
28703
+ * One camera's row in a `getAvailabilityBatch` answer.
28704
+ *
28705
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
28706
+ * batch collapses the transport, not the work — plus the one thing the singular
28707
+ * method never had to say:
28708
+ *
28709
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
28710
+ * no footage in the window", which is a real claim.
28711
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
28712
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
28713
+ * that emptiness means NOTHING.
28714
+ *
28715
+ * A timeline that renders the second as the first tells an operator there is no
28716
+ * footage when the truth is that nobody looked.
28717
+ */
28718
+ var RecordingAvailabilityForDeviceSchema = object({
28719
+ deviceId: number(),
28720
+ read: _enum(["read", "unreadable"]),
28721
+ ranges: array(RecordingRangeSchema).readonly()
28722
+ });
28723
+ /**
28724
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
28725
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
28726
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
28727
+ * the date-picker's day dots must not spell them the same.
28728
+ */
28729
+ var RecordingDaysForDeviceSchema = object({
28730
+ deviceId: number(),
28731
+ read: _enum(["read", "unreadable"]),
28732
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
28733
+ days: array(number()).readonly()
28734
+ });
28674
28735
  var RecordingManifestSchema = object({
28675
28736
  deviceId: number(),
28676
28737
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -28905,6 +28966,13 @@ method(object({
28905
28966
  }), RecordingAvailabilitySchema, {
28906
28967
  kind: "query",
28907
28968
  auth: "protected"
28969
+ }), method(object({
28970
+ deviceIds: array(number()).min(1).max(200),
28971
+ fromMs: number(),
28972
+ toMs: number()
28973
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
28974
+ kind: "query",
28975
+ auth: "protected"
28908
28976
  }), method(object({
28909
28977
  deviceId: number(),
28910
28978
  fromMs: number(),
@@ -28913,6 +28981,14 @@ method(object({
28913
28981
  }), RecordingDaysSchema, {
28914
28982
  kind: "query",
28915
28983
  auth: "protected"
28984
+ }), method(object({
28985
+ deviceIds: array(number()).min(1).max(200),
28986
+ fromMs: number(),
28987
+ toMs: number(),
28988
+ tzOffsetMinutes: number()
28989
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
28990
+ kind: "query",
28991
+ auth: "protected"
28916
28992
  }), method(object({
28917
28993
  deviceId: number(),
28918
28994
  fromMs: number(),
@@ -35809,6 +35885,12 @@ Object.freeze({
35809
35885
  addonId: null,
35810
35886
  access: "view"
35811
35887
  },
35888
+ "pipelineAnalytics.getEventDensityBatch": {
35889
+ capName: "pipeline-analytics",
35890
+ capScope: "device",
35891
+ addonId: null,
35892
+ access: "view"
35893
+ },
35812
35894
  "pipelineAnalytics.getEventMedia": {
35813
35895
  capName: "pipeline-analytics",
35814
35896
  capScope: "device",
@@ -36931,12 +37013,24 @@ Object.freeze({
36931
37013
  addonId: null,
36932
37014
  access: "view"
36933
37015
  },
37016
+ "recording.getAvailabilityBatch": {
37017
+ capName: "recording",
37018
+ capScope: "system",
37019
+ addonId: null,
37020
+ access: "view"
37021
+ },
36934
37022
  "recording.getDaysWithRecordings": {
36935
37023
  capName: "recording",
36936
37024
  capScope: "system",
36937
37025
  addonId: null,
36938
37026
  access: "view"
36939
37027
  },
37028
+ "recording.getDaysWithRecordingsBatch": {
37029
+ capName: "recording",
37030
+ capScope: "system",
37031
+ addonId: null,
37032
+ access: "view"
37033
+ },
36940
37034
  "recording.getDeviceConfig": {
36941
37035
  capName: "recording",
36942
37036
  capScope: "system",
@@ -39541,6 +39635,11 @@ Object.freeze({
39541
39635
  form: "single",
39542
39636
  optional: false
39543
39637
  }],
39638
+ "pipelineAnalytics.getEventDensityBatch": [{
39639
+ name: "deviceIds",
39640
+ form: "array",
39641
+ optional: false
39642
+ }],
39544
39643
  "pipelineAnalytics.getEventMedia": [{
39545
39644
  name: "deviceId",
39546
39645
  form: "single",
@@ -39956,11 +40055,21 @@ Object.freeze({
39956
40055
  form: "single",
39957
40056
  optional: false
39958
40057
  }],
40058
+ "recording.getAvailabilityBatch": [{
40059
+ name: "deviceIds",
40060
+ form: "array",
40061
+ optional: false
40062
+ }],
39959
40063
  "recording.getDaysWithRecordings": [{
39960
40064
  name: "deviceId",
39961
40065
  form: "single",
39962
40066
  optional: false
39963
40067
  }],
40068
+ "recording.getDaysWithRecordingsBatch": [{
40069
+ name: "deviceIds",
40070
+ form: "array",
40071
+ optional: false
40072
+ }],
39964
40073
  "recording.getDeviceConfig": [{
39965
40074
  name: "deviceId",
39966
40075
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-wyze",
3
- "version": "0.2.55",
3
+ "version": "0.2.56",
4
4
  "description": "Wyze camera device-provider addon for CamStack — wraps the @apocaliss92/wyze-bridge-js P2P/DTLS client, feeding the stream-broker via the pull-rfc4571 lazy-publish path (a structural twin of addon-provider-reolink)",
5
5
  "keywords": [
6
6
  "camstack",