@camstack/addon-mqtt-broker 1.2.30 → 1.2.31
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/mqtt-broker.addon.js +77 -2
- package/dist/mqtt-broker.addon.mjs +77 -2
- package/package.json +1 -1
|
@@ -15577,7 +15577,23 @@ var NcHistoryEntrySchema = object({
|
|
|
15577
15577
|
updatedAt: number(),
|
|
15578
15578
|
/** Failure detail — present on a `dead` row. */
|
|
15579
15579
|
error: string().optional(),
|
|
15580
|
-
subject: NcHistorySubjectSchema
|
|
15580
|
+
subject: NcHistorySubjectSchema,
|
|
15581
|
+
/**
|
|
15582
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
15583
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
15584
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
15585
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
15586
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
15587
|
+
*
|
|
15588
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
15589
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
15590
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
15591
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
15592
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
15593
|
+
* Assistant export) must render as "no image right now", never as a
|
|
15594
|
+
* broken link.
|
|
15595
|
+
*/
|
|
15596
|
+
artifactIds: array(string().min(1)).optional()
|
|
15581
15597
|
});
|
|
15582
15598
|
/**
|
|
15583
15599
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -15804,7 +15820,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
15804
15820
|
}), method(object({}), object({
|
|
15805
15821
|
catalog: array(NcConditionDescriptorSchema),
|
|
15806
15822
|
taxonomy: NcTaxonomySchema.optional()
|
|
15807
|
-
})), 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 }), {
|
|
15823
|
+
})), 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 }), {
|
|
15808
15824
|
kind: "mutation",
|
|
15809
15825
|
caller: "required"
|
|
15810
15826
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -25096,6 +25112,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
25096
25112
|
/** Media ms the returned fragment covers. */
|
|
25097
25113
|
gopDurMs: number()
|
|
25098
25114
|
});
|
|
25115
|
+
/**
|
|
25116
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
25117
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
25118
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
25119
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
25120
|
+
*
|
|
25121
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
25122
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
25123
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
25124
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
25125
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
25126
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
25127
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
25128
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
25129
|
+
* bytes nothing has proven decodable.
|
|
25130
|
+
*/
|
|
25131
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
25132
|
+
kind: literal("ok"),
|
|
25133
|
+
data: _instanceof(Uint8Array),
|
|
25134
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
25135
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
25136
|
+
gopStartMs: number(),
|
|
25137
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
25138
|
+
gopDurMs: number(),
|
|
25139
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
25140
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
25141
|
+
reachesRequestedEnd: boolean()
|
|
25142
|
+
}), object({
|
|
25143
|
+
kind: literal("spans-multiple-segments"),
|
|
25144
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
25145
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
25146
|
+
segmentEndMs: number()
|
|
25147
|
+
})]);
|
|
25099
25148
|
method(object({
|
|
25100
25149
|
deviceId: number(),
|
|
25101
25150
|
fromMs: number(),
|
|
@@ -25146,6 +25195,15 @@ method(object({
|
|
|
25146
25195
|
}), ReadGopBytesResultSchema, {
|
|
25147
25196
|
kind: "query",
|
|
25148
25197
|
auth: "admin"
|
|
25198
|
+
}), method(object({
|
|
25199
|
+
deviceId: number(),
|
|
25200
|
+
profile: string(),
|
|
25201
|
+
startMs: number(),
|
|
25202
|
+
fromMs: number(),
|
|
25203
|
+
toMs: number()
|
|
25204
|
+
}), ReadWindowBytesResultSchema, {
|
|
25205
|
+
kind: "query",
|
|
25206
|
+
auth: "admin"
|
|
25149
25207
|
}), method(object({
|
|
25150
25208
|
deviceId: number(),
|
|
25151
25209
|
config: RecordingConfigSchema
|
|
@@ -29564,6 +29622,12 @@ Object.freeze({
|
|
|
29564
29622
|
addonId: null,
|
|
29565
29623
|
access: "view"
|
|
29566
29624
|
},
|
|
29625
|
+
"notificationRules.resolveArtifactUrl": {
|
|
29626
|
+
capName: "notification-rules",
|
|
29627
|
+
capScope: "system",
|
|
29628
|
+
addonId: null,
|
|
29629
|
+
access: "view"
|
|
29630
|
+
},
|
|
29567
29631
|
"notificationRules.setAlarmConfig": {
|
|
29568
29632
|
capName: "notification-rules",
|
|
29569
29633
|
capScope: "system",
|
|
@@ -30968,6 +31032,12 @@ Object.freeze({
|
|
|
30968
31032
|
addonId: null,
|
|
30969
31033
|
access: "view"
|
|
30970
31034
|
},
|
|
31035
|
+
"recording.readWindowBytes": {
|
|
31036
|
+
capName: "recording",
|
|
31037
|
+
capScope: "system",
|
|
31038
|
+
addonId: null,
|
|
31039
|
+
access: "view"
|
|
31040
|
+
},
|
|
30971
31041
|
"recording.refreshStorageLocationsForMigration": {
|
|
30972
31042
|
capName: "recording",
|
|
30973
31043
|
capScope: "system",
|
|
@@ -33798,6 +33868,11 @@ Object.freeze({
|
|
|
33798
33868
|
form: "single",
|
|
33799
33869
|
optional: false
|
|
33800
33870
|
}],
|
|
33871
|
+
"recording.readWindowBytes": [{
|
|
33872
|
+
name: "deviceId",
|
|
33873
|
+
form: "single",
|
|
33874
|
+
optional: false
|
|
33875
|
+
}],
|
|
33801
33876
|
"recording.relocateFootage": [{
|
|
33802
33877
|
name: "deviceId",
|
|
33803
33878
|
form: "single",
|
|
@@ -15572,7 +15572,23 @@ var NcHistoryEntrySchema = object({
|
|
|
15572
15572
|
updatedAt: number(),
|
|
15573
15573
|
/** Failure detail — present on a `dead` row. */
|
|
15574
15574
|
error: string().optional(),
|
|
15575
|
-
subject: NcHistorySubjectSchema
|
|
15575
|
+
subject: NcHistorySubjectSchema,
|
|
15576
|
+
/**
|
|
15577
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
15578
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
15579
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
15580
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
15581
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
15582
|
+
*
|
|
15583
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
15584
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
15585
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
15586
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
15587
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
15588
|
+
* Assistant export) must render as "no image right now", never as a
|
|
15589
|
+
* broken link.
|
|
15590
|
+
*/
|
|
15591
|
+
artifactIds: array(string().min(1)).optional()
|
|
15576
15592
|
});
|
|
15577
15593
|
/**
|
|
15578
15594
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -15799,7 +15815,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
15799
15815
|
}), method(object({}), object({
|
|
15800
15816
|
catalog: array(NcConditionDescriptorSchema),
|
|
15801
15817
|
taxonomy: NcTaxonomySchema.optional()
|
|
15802
|
-
})), 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 }), {
|
|
15818
|
+
})), 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 }), {
|
|
15803
15819
|
kind: "mutation",
|
|
15804
15820
|
caller: "required"
|
|
15805
15821
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -25091,6 +25107,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
25091
25107
|
/** Media ms the returned fragment covers. */
|
|
25092
25108
|
gopDurMs: number()
|
|
25093
25109
|
});
|
|
25110
|
+
/**
|
|
25111
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
25112
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
25113
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
25114
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
25115
|
+
*
|
|
25116
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
25117
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
25118
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
25119
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
25120
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
25121
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
25122
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
25123
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
25124
|
+
* bytes nothing has proven decodable.
|
|
25125
|
+
*/
|
|
25126
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
25127
|
+
kind: literal("ok"),
|
|
25128
|
+
data: _instanceof(Uint8Array),
|
|
25129
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
25130
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
25131
|
+
gopStartMs: number(),
|
|
25132
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
25133
|
+
gopDurMs: number(),
|
|
25134
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
25135
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
25136
|
+
reachesRequestedEnd: boolean()
|
|
25137
|
+
}), object({
|
|
25138
|
+
kind: literal("spans-multiple-segments"),
|
|
25139
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
25140
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
25141
|
+
segmentEndMs: number()
|
|
25142
|
+
})]);
|
|
25094
25143
|
method(object({
|
|
25095
25144
|
deviceId: number(),
|
|
25096
25145
|
fromMs: number(),
|
|
@@ -25141,6 +25190,15 @@ method(object({
|
|
|
25141
25190
|
}), ReadGopBytesResultSchema, {
|
|
25142
25191
|
kind: "query",
|
|
25143
25192
|
auth: "admin"
|
|
25193
|
+
}), method(object({
|
|
25194
|
+
deviceId: number(),
|
|
25195
|
+
profile: string(),
|
|
25196
|
+
startMs: number(),
|
|
25197
|
+
fromMs: number(),
|
|
25198
|
+
toMs: number()
|
|
25199
|
+
}), ReadWindowBytesResultSchema, {
|
|
25200
|
+
kind: "query",
|
|
25201
|
+
auth: "admin"
|
|
25144
25202
|
}), method(object({
|
|
25145
25203
|
deviceId: number(),
|
|
25146
25204
|
config: RecordingConfigSchema
|
|
@@ -29559,6 +29617,12 @@ Object.freeze({
|
|
|
29559
29617
|
addonId: null,
|
|
29560
29618
|
access: "view"
|
|
29561
29619
|
},
|
|
29620
|
+
"notificationRules.resolveArtifactUrl": {
|
|
29621
|
+
capName: "notification-rules",
|
|
29622
|
+
capScope: "system",
|
|
29623
|
+
addonId: null,
|
|
29624
|
+
access: "view"
|
|
29625
|
+
},
|
|
29562
29626
|
"notificationRules.setAlarmConfig": {
|
|
29563
29627
|
capName: "notification-rules",
|
|
29564
29628
|
capScope: "system",
|
|
@@ -30963,6 +31027,12 @@ Object.freeze({
|
|
|
30963
31027
|
addonId: null,
|
|
30964
31028
|
access: "view"
|
|
30965
31029
|
},
|
|
31030
|
+
"recording.readWindowBytes": {
|
|
31031
|
+
capName: "recording",
|
|
31032
|
+
capScope: "system",
|
|
31033
|
+
addonId: null,
|
|
31034
|
+
access: "view"
|
|
31035
|
+
},
|
|
30966
31036
|
"recording.refreshStorageLocationsForMigration": {
|
|
30967
31037
|
capName: "recording",
|
|
30968
31038
|
capScope: "system",
|
|
@@ -33793,6 +33863,11 @@ Object.freeze({
|
|
|
33793
33863
|
form: "single",
|
|
33794
33864
|
optional: false
|
|
33795
33865
|
}],
|
|
33866
|
+
"recording.readWindowBytes": [{
|
|
33867
|
+
name: "deviceId",
|
|
33868
|
+
form: "single",
|
|
33869
|
+
optional: false
|
|
33870
|
+
}],
|
|
33796
33871
|
"recording.relocateFootage": [{
|
|
33797
33872
|
name: "deviceId",
|
|
33798
33873
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-mqtt-broker",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.31",
|
|
4
4
|
"description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|