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