@camstack/addon-decoder-nodeav 1.2.29 → 1.2.30

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/index.js CHANGED
@@ -15610,7 +15610,23 @@ var NcHistoryEntrySchema = object({
15610
15610
  updatedAt: number(),
15611
15611
  /** Failure detail — present on a `dead` row. */
15612
15612
  error: string().optional(),
15613
- subject: NcHistorySubjectSchema
15613
+ subject: NcHistorySubjectSchema,
15614
+ /**
15615
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15616
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15617
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15618
+ * every delivery attempt). Absent on a row still pending/dead, a row
15619
+ * delivered before this field shipped, or a wiring with no artefact index.
15620
+ *
15621
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15622
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15623
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15624
+ * also answers `null` for an id whose artefact has since expired past the
15625
+ * retained shelf's own age bound — the degrade a caller (the Home
15626
+ * Assistant export) must render as "no image right now", never as a
15627
+ * broken link.
15628
+ */
15629
+ artifactIds: array(string().min(1)).optional()
15614
15630
  });
15615
15631
  /**
15616
15632
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15837,7 +15853,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15837
15853
  }), method(object({}), object({
15838
15854
  catalog: array(NcConditionDescriptorSchema),
15839
15855
  taxonomy: NcTaxonomySchema.optional()
15840
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15856
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15841
15857
  kind: "mutation",
15842
15858
  caller: "required"
15843
15859
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25129,6 +25145,39 @@ var ReadGopBytesResultSchema = object({
25129
25145
  /** Media ms the returned fragment covers. */
25130
25146
  gopDurMs: number()
25131
25147
  });
25148
+ /**
25149
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25150
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25151
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25152
+ * a replay needs several seconds of native pixels, not one frame.
25153
+ *
25154
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25155
+ * is `false` when the returned bytes were cut short by the read's own safety
25156
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25157
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25158
+ * degradation: a window whose end falls past the covering segment would need
25159
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25160
+ * not one standalone-demuxable stream — the caller's answer is to request a
25161
+ * shorter window or one aligned to a single segment, not to receive spliced
25162
+ * bytes nothing has proven decodable.
25163
+ */
25164
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25165
+ kind: literal("ok"),
25166
+ data: _instanceof(Uint8Array),
25167
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25168
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25169
+ gopStartMs: number(),
25170
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25171
+ gopDurMs: number(),
25172
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25173
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25174
+ reachesRequestedEnd: boolean()
25175
+ }), object({
25176
+ kind: literal("spans-multiple-segments"),
25177
+ /** Where the covering segment's own footage runs out — informational,
25178
+ * not a retry hint (retrying the same window would refuse again). */
25179
+ segmentEndMs: number()
25180
+ })]);
25132
25181
  method(object({
25133
25182
  deviceId: number(),
25134
25183
  fromMs: number(),
@@ -25179,6 +25228,15 @@ method(object({
25179
25228
  }), ReadGopBytesResultSchema, {
25180
25229
  kind: "query",
25181
25230
  auth: "admin"
25231
+ }), method(object({
25232
+ deviceId: number(),
25233
+ profile: string(),
25234
+ startMs: number(),
25235
+ fromMs: number(),
25236
+ toMs: number()
25237
+ }), ReadWindowBytesResultSchema, {
25238
+ kind: "query",
25239
+ auth: "admin"
25182
25240
  }), method(object({
25183
25241
  deviceId: number(),
25184
25242
  config: RecordingConfigSchema
@@ -29597,6 +29655,12 @@ Object.freeze({
29597
29655
  addonId: null,
29598
29656
  access: "view"
29599
29657
  },
29658
+ "notificationRules.resolveArtifactUrl": {
29659
+ capName: "notification-rules",
29660
+ capScope: "system",
29661
+ addonId: null,
29662
+ access: "view"
29663
+ },
29600
29664
  "notificationRules.setAlarmConfig": {
29601
29665
  capName: "notification-rules",
29602
29666
  capScope: "system",
@@ -31001,6 +31065,12 @@ Object.freeze({
31001
31065
  addonId: null,
31002
31066
  access: "view"
31003
31067
  },
31068
+ "recording.readWindowBytes": {
31069
+ capName: "recording",
31070
+ capScope: "system",
31071
+ addonId: null,
31072
+ access: "view"
31073
+ },
31004
31074
  "recording.refreshStorageLocationsForMigration": {
31005
31075
  capName: "recording",
31006
31076
  capScope: "system",
@@ -33831,6 +33901,11 @@ Object.freeze({
33831
33901
  form: "single",
33832
33902
  optional: false
33833
33903
  }],
33904
+ "recording.readWindowBytes": [{
33905
+ name: "deviceId",
33906
+ form: "single",
33907
+ optional: false
33908
+ }],
33834
33909
  "recording.relocateFootage": [{
33835
33910
  name: "deviceId",
33836
33911
  form: "single",
package/dist/index.mjs CHANGED
@@ -15606,7 +15606,23 @@ var NcHistoryEntrySchema = object({
15606
15606
  updatedAt: number(),
15607
15607
  /** Failure detail — present on a `dead` row. */
15608
15608
  error: string().optional(),
15609
- subject: NcHistorySubjectSchema
15609
+ subject: NcHistorySubjectSchema,
15610
+ /**
15611
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15612
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15613
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15614
+ * every delivery attempt). Absent on a row still pending/dead, a row
15615
+ * delivered before this field shipped, or a wiring with no artefact index.
15616
+ *
15617
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15618
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15619
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15620
+ * also answers `null` for an id whose artefact has since expired past the
15621
+ * retained shelf's own age bound — the degrade a caller (the Home
15622
+ * Assistant export) must render as "no image right now", never as a
15623
+ * broken link.
15624
+ */
15625
+ artifactIds: array(string().min(1)).optional()
15610
15626
  });
15611
15627
  /**
15612
15628
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15833,7 +15849,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15833
15849
  }), method(object({}), object({
15834
15850
  catalog: array(NcConditionDescriptorSchema),
15835
15851
  taxonomy: NcTaxonomySchema.optional()
15836
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15852
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15837
15853
  kind: "mutation",
15838
15854
  caller: "required"
15839
15855
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25125,6 +25141,39 @@ var ReadGopBytesResultSchema = object({
25125
25141
  /** Media ms the returned fragment covers. */
25126
25142
  gopDurMs: number()
25127
25143
  });
25144
+ /**
25145
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25146
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25147
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25148
+ * a replay needs several seconds of native pixels, not one frame.
25149
+ *
25150
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25151
+ * is `false` when the returned bytes were cut short by the read's own safety
25152
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25153
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25154
+ * degradation: a window whose end falls past the covering segment would need
25155
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25156
+ * not one standalone-demuxable stream — the caller's answer is to request a
25157
+ * shorter window or one aligned to a single segment, not to receive spliced
25158
+ * bytes nothing has proven decodable.
25159
+ */
25160
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25161
+ kind: literal("ok"),
25162
+ data: _instanceof(Uint8Array),
25163
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25164
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25165
+ gopStartMs: number(),
25166
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25167
+ gopDurMs: number(),
25168
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25169
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25170
+ reachesRequestedEnd: boolean()
25171
+ }), object({
25172
+ kind: literal("spans-multiple-segments"),
25173
+ /** Where the covering segment's own footage runs out — informational,
25174
+ * not a retry hint (retrying the same window would refuse again). */
25175
+ segmentEndMs: number()
25176
+ })]);
25128
25177
  method(object({
25129
25178
  deviceId: number(),
25130
25179
  fromMs: number(),
@@ -25175,6 +25224,15 @@ method(object({
25175
25224
  }), ReadGopBytesResultSchema, {
25176
25225
  kind: "query",
25177
25226
  auth: "admin"
25227
+ }), method(object({
25228
+ deviceId: number(),
25229
+ profile: string(),
25230
+ startMs: number(),
25231
+ fromMs: number(),
25232
+ toMs: number()
25233
+ }), ReadWindowBytesResultSchema, {
25234
+ kind: "query",
25235
+ auth: "admin"
25178
25236
  }), method(object({
25179
25237
  deviceId: number(),
25180
25238
  config: RecordingConfigSchema
@@ -29593,6 +29651,12 @@ Object.freeze({
29593
29651
  addonId: null,
29594
29652
  access: "view"
29595
29653
  },
29654
+ "notificationRules.resolveArtifactUrl": {
29655
+ capName: "notification-rules",
29656
+ capScope: "system",
29657
+ addonId: null,
29658
+ access: "view"
29659
+ },
29596
29660
  "notificationRules.setAlarmConfig": {
29597
29661
  capName: "notification-rules",
29598
29662
  capScope: "system",
@@ -30997,6 +31061,12 @@ Object.freeze({
30997
31061
  addonId: null,
30998
31062
  access: "view"
30999
31063
  },
31064
+ "recording.readWindowBytes": {
31065
+ capName: "recording",
31066
+ capScope: "system",
31067
+ addonId: null,
31068
+ access: "view"
31069
+ },
31000
31070
  "recording.refreshStorageLocationsForMigration": {
31001
31071
  capName: "recording",
31002
31072
  capScope: "system",
@@ -33827,6 +33897,11 @@ Object.freeze({
33827
33897
  form: "single",
33828
33898
  optional: false
33829
33899
  }],
33900
+ "recording.readWindowBytes": [{
33901
+ name: "deviceId",
33902
+ form: "single",
33903
+ optional: false
33904
+ }],
33830
33905
  "recording.relocateFootage": [{
33831
33906
  name: "deviceId",
33832
33907
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-decoder-nodeav",
3
- "version": "1.2.29",
3
+ "version": "1.2.30",
4
4
  "description": "Standalone in-process node-av decoder addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",