@camstack/addon-provider-amcrest 0.2.31 → 0.2.32
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 +77 -2
- package/dist/addon.mjs +77 -2
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -15775,7 +15775,23 @@ var NcHistoryEntrySchema = object({
|
|
|
15775
15775
|
updatedAt: number(),
|
|
15776
15776
|
/** Failure detail — present on a `dead` row. */
|
|
15777
15777
|
error: string().optional(),
|
|
15778
|
-
subject: NcHistorySubjectSchema
|
|
15778
|
+
subject: NcHistorySubjectSchema,
|
|
15779
|
+
/**
|
|
15780
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
15781
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
15782
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
15783
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
15784
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
15785
|
+
*
|
|
15786
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
15787
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
15788
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
15789
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
15790
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
15791
|
+
* Assistant export) must render as "no image right now", never as a
|
|
15792
|
+
* broken link.
|
|
15793
|
+
*/
|
|
15794
|
+
artifactIds: array(string().min(1)).optional()
|
|
15779
15795
|
});
|
|
15780
15796
|
/**
|
|
15781
15797
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -16002,7 +16018,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
16002
16018
|
}), method(object({}), object({
|
|
16003
16019
|
catalog: array(NcConditionDescriptorSchema),
|
|
16004
16020
|
taxonomy: NcTaxonomySchema.optional()
|
|
16005
|
-
})), 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 }), {
|
|
16021
|
+
})), 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 }), {
|
|
16006
16022
|
kind: "mutation",
|
|
16007
16023
|
caller: "required"
|
|
16008
16024
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -27214,6 +27230,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
27214
27230
|
/** Media ms the returned fragment covers. */
|
|
27215
27231
|
gopDurMs: number()
|
|
27216
27232
|
});
|
|
27233
|
+
/**
|
|
27234
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
27235
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
27236
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
27237
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
27238
|
+
*
|
|
27239
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
27240
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
27241
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
27242
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
27243
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
27244
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
27245
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
27246
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
27247
|
+
* bytes nothing has proven decodable.
|
|
27248
|
+
*/
|
|
27249
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
27250
|
+
kind: literal("ok"),
|
|
27251
|
+
data: _instanceof(Uint8Array),
|
|
27252
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
27253
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
27254
|
+
gopStartMs: number(),
|
|
27255
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
27256
|
+
gopDurMs: number(),
|
|
27257
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
27258
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
27259
|
+
reachesRequestedEnd: boolean()
|
|
27260
|
+
}), object({
|
|
27261
|
+
kind: literal("spans-multiple-segments"),
|
|
27262
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
27263
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
27264
|
+
segmentEndMs: number()
|
|
27265
|
+
})]);
|
|
27217
27266
|
method(object({
|
|
27218
27267
|
deviceId: number(),
|
|
27219
27268
|
fromMs: number(),
|
|
@@ -27264,6 +27313,15 @@ method(object({
|
|
|
27264
27313
|
}), ReadGopBytesResultSchema, {
|
|
27265
27314
|
kind: "query",
|
|
27266
27315
|
auth: "admin"
|
|
27316
|
+
}), method(object({
|
|
27317
|
+
deviceId: number(),
|
|
27318
|
+
profile: string(),
|
|
27319
|
+
startMs: number(),
|
|
27320
|
+
fromMs: number(),
|
|
27321
|
+
toMs: number()
|
|
27322
|
+
}), ReadWindowBytesResultSchema, {
|
|
27323
|
+
kind: "query",
|
|
27324
|
+
auth: "admin"
|
|
27267
27325
|
}), method(object({
|
|
27268
27326
|
deviceId: number(),
|
|
27269
27327
|
config: RecordingConfigSchema
|
|
@@ -33755,6 +33813,12 @@ Object.freeze({
|
|
|
33755
33813
|
addonId: null,
|
|
33756
33814
|
access: "view"
|
|
33757
33815
|
},
|
|
33816
|
+
"notificationRules.resolveArtifactUrl": {
|
|
33817
|
+
capName: "notification-rules",
|
|
33818
|
+
capScope: "system",
|
|
33819
|
+
addonId: null,
|
|
33820
|
+
access: "view"
|
|
33821
|
+
},
|
|
33758
33822
|
"notificationRules.setAlarmConfig": {
|
|
33759
33823
|
capName: "notification-rules",
|
|
33760
33824
|
capScope: "system",
|
|
@@ -35159,6 +35223,12 @@ Object.freeze({
|
|
|
35159
35223
|
addonId: null,
|
|
35160
35224
|
access: "view"
|
|
35161
35225
|
},
|
|
35226
|
+
"recording.readWindowBytes": {
|
|
35227
|
+
capName: "recording",
|
|
35228
|
+
capScope: "system",
|
|
35229
|
+
addonId: null,
|
|
35230
|
+
access: "view"
|
|
35231
|
+
},
|
|
35162
35232
|
"recording.refreshStorageLocationsForMigration": {
|
|
35163
35233
|
capName: "recording",
|
|
35164
35234
|
capScope: "system",
|
|
@@ -37989,6 +38059,11 @@ Object.freeze({
|
|
|
37989
38059
|
form: "single",
|
|
37990
38060
|
optional: false
|
|
37991
38061
|
}],
|
|
38062
|
+
"recording.readWindowBytes": [{
|
|
38063
|
+
name: "deviceId",
|
|
38064
|
+
form: "single",
|
|
38065
|
+
optional: false
|
|
38066
|
+
}],
|
|
37992
38067
|
"recording.relocateFootage": [{
|
|
37993
38068
|
name: "deviceId",
|
|
37994
38069
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -15776,7 +15776,23 @@ var NcHistoryEntrySchema = object({
|
|
|
15776
15776
|
updatedAt: number(),
|
|
15777
15777
|
/** Failure detail — present on a `dead` row. */
|
|
15778
15778
|
error: string().optional(),
|
|
15779
|
-
subject: NcHistorySubjectSchema
|
|
15779
|
+
subject: NcHistorySubjectSchema,
|
|
15780
|
+
/**
|
|
15781
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
15782
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
15783
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
15784
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
15785
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
15786
|
+
*
|
|
15787
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
15788
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
15789
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
15790
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
15791
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
15792
|
+
* Assistant export) must render as "no image right now", never as a
|
|
15793
|
+
* broken link.
|
|
15794
|
+
*/
|
|
15795
|
+
artifactIds: array(string().min(1)).optional()
|
|
15780
15796
|
});
|
|
15781
15797
|
/**
|
|
15782
15798
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -16003,7 +16019,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
16003
16019
|
}), method(object({}), object({
|
|
16004
16020
|
catalog: array(NcConditionDescriptorSchema),
|
|
16005
16021
|
taxonomy: NcTaxonomySchema.optional()
|
|
16006
|
-
})), 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 }), {
|
|
16022
|
+
})), 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 }), {
|
|
16007
16023
|
kind: "mutation",
|
|
16008
16024
|
caller: "required"
|
|
16009
16025
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -27215,6 +27231,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
27215
27231
|
/** Media ms the returned fragment covers. */
|
|
27216
27232
|
gopDurMs: number()
|
|
27217
27233
|
});
|
|
27234
|
+
/**
|
|
27235
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
27236
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
27237
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
27238
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
27239
|
+
*
|
|
27240
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
27241
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
27242
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
27243
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
27244
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
27245
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
27246
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
27247
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
27248
|
+
* bytes nothing has proven decodable.
|
|
27249
|
+
*/
|
|
27250
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
27251
|
+
kind: literal("ok"),
|
|
27252
|
+
data: _instanceof(Uint8Array),
|
|
27253
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
27254
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
27255
|
+
gopStartMs: number(),
|
|
27256
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
27257
|
+
gopDurMs: number(),
|
|
27258
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
27259
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
27260
|
+
reachesRequestedEnd: boolean()
|
|
27261
|
+
}), object({
|
|
27262
|
+
kind: literal("spans-multiple-segments"),
|
|
27263
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
27264
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
27265
|
+
segmentEndMs: number()
|
|
27266
|
+
})]);
|
|
27218
27267
|
method(object({
|
|
27219
27268
|
deviceId: number(),
|
|
27220
27269
|
fromMs: number(),
|
|
@@ -27265,6 +27314,15 @@ method(object({
|
|
|
27265
27314
|
}), ReadGopBytesResultSchema, {
|
|
27266
27315
|
kind: "query",
|
|
27267
27316
|
auth: "admin"
|
|
27317
|
+
}), method(object({
|
|
27318
|
+
deviceId: number(),
|
|
27319
|
+
profile: string(),
|
|
27320
|
+
startMs: number(),
|
|
27321
|
+
fromMs: number(),
|
|
27322
|
+
toMs: number()
|
|
27323
|
+
}), ReadWindowBytesResultSchema, {
|
|
27324
|
+
kind: "query",
|
|
27325
|
+
auth: "admin"
|
|
27268
27326
|
}), method(object({
|
|
27269
27327
|
deviceId: number(),
|
|
27270
27328
|
config: RecordingConfigSchema
|
|
@@ -33756,6 +33814,12 @@ Object.freeze({
|
|
|
33756
33814
|
addonId: null,
|
|
33757
33815
|
access: "view"
|
|
33758
33816
|
},
|
|
33817
|
+
"notificationRules.resolveArtifactUrl": {
|
|
33818
|
+
capName: "notification-rules",
|
|
33819
|
+
capScope: "system",
|
|
33820
|
+
addonId: null,
|
|
33821
|
+
access: "view"
|
|
33822
|
+
},
|
|
33759
33823
|
"notificationRules.setAlarmConfig": {
|
|
33760
33824
|
capName: "notification-rules",
|
|
33761
33825
|
capScope: "system",
|
|
@@ -35160,6 +35224,12 @@ Object.freeze({
|
|
|
35160
35224
|
addonId: null,
|
|
35161
35225
|
access: "view"
|
|
35162
35226
|
},
|
|
35227
|
+
"recording.readWindowBytes": {
|
|
35228
|
+
capName: "recording",
|
|
35229
|
+
capScope: "system",
|
|
35230
|
+
addonId: null,
|
|
35231
|
+
access: "view"
|
|
35232
|
+
},
|
|
35163
35233
|
"recording.refreshStorageLocationsForMigration": {
|
|
35164
35234
|
capName: "recording",
|
|
35165
35235
|
capScope: "system",
|
|
@@ -37990,6 +38060,11 @@ Object.freeze({
|
|
|
37990
38060
|
form: "single",
|
|
37991
38061
|
optional: false
|
|
37992
38062
|
}],
|
|
38063
|
+
"recording.readWindowBytes": [{
|
|
38064
|
+
name: "deviceId",
|
|
38065
|
+
form: "single",
|
|
38066
|
+
optional: false
|
|
38067
|
+
}],
|
|
37993
38068
|
"recording.relocateFootage": [{
|
|
37994
38069
|
name: "deviceId",
|
|
37995
38070
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-amcrest",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.32",
|
|
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",
|