@camstack/addon-smtp-nodemailer 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/smtp.addon.js +77 -2
- package/dist/smtp.addon.mjs +77 -2
- package/package.json +1 -1
package/dist/smtp.addon.js
CHANGED
|
@@ -15501,7 +15501,23 @@ var NcHistoryEntrySchema = object({
|
|
|
15501
15501
|
updatedAt: number(),
|
|
15502
15502
|
/** Failure detail — present on a `dead` row. */
|
|
15503
15503
|
error: string().optional(),
|
|
15504
|
-
subject: NcHistorySubjectSchema
|
|
15504
|
+
subject: NcHistorySubjectSchema,
|
|
15505
|
+
/**
|
|
15506
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
15507
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
15508
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
15509
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
15510
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
15511
|
+
*
|
|
15512
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
15513
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
15514
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
15515
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
15516
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
15517
|
+
* Assistant export) must render as "no image right now", never as a
|
|
15518
|
+
* broken link.
|
|
15519
|
+
*/
|
|
15520
|
+
artifactIds: array(string().min(1)).optional()
|
|
15505
15521
|
});
|
|
15506
15522
|
/**
|
|
15507
15523
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -15728,7 +15744,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
15728
15744
|
}), method(object({}), object({
|
|
15729
15745
|
catalog: array(NcConditionDescriptorSchema),
|
|
15730
15746
|
taxonomy: NcTaxonomySchema.optional()
|
|
15731
|
-
})), 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 }), {
|
|
15747
|
+
})), 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 }), {
|
|
15732
15748
|
kind: "mutation",
|
|
15733
15749
|
caller: "required"
|
|
15734
15750
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -25033,6 +25049,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
25033
25049
|
/** Media ms the returned fragment covers. */
|
|
25034
25050
|
gopDurMs: number()
|
|
25035
25051
|
});
|
|
25052
|
+
/**
|
|
25053
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
25054
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
25055
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
25056
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
25057
|
+
*
|
|
25058
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
25059
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
25060
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
25061
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
25062
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
25063
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
25064
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
25065
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
25066
|
+
* bytes nothing has proven decodable.
|
|
25067
|
+
*/
|
|
25068
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
25069
|
+
kind: literal("ok"),
|
|
25070
|
+
data: _instanceof(Uint8Array),
|
|
25071
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
25072
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
25073
|
+
gopStartMs: number(),
|
|
25074
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
25075
|
+
gopDurMs: number(),
|
|
25076
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
25077
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
25078
|
+
reachesRequestedEnd: boolean()
|
|
25079
|
+
}), object({
|
|
25080
|
+
kind: literal("spans-multiple-segments"),
|
|
25081
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
25082
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
25083
|
+
segmentEndMs: number()
|
|
25084
|
+
})]);
|
|
25036
25085
|
method(object({
|
|
25037
25086
|
deviceId: number(),
|
|
25038
25087
|
fromMs: number(),
|
|
@@ -25083,6 +25132,15 @@ method(object({
|
|
|
25083
25132
|
}), ReadGopBytesResultSchema, {
|
|
25084
25133
|
kind: "query",
|
|
25085
25134
|
auth: "admin"
|
|
25135
|
+
}), method(object({
|
|
25136
|
+
deviceId: number(),
|
|
25137
|
+
profile: string(),
|
|
25138
|
+
startMs: number(),
|
|
25139
|
+
fromMs: number(),
|
|
25140
|
+
toMs: number()
|
|
25141
|
+
}), ReadWindowBytesResultSchema, {
|
|
25142
|
+
kind: "query",
|
|
25143
|
+
auth: "admin"
|
|
25086
25144
|
}), method(object({
|
|
25087
25145
|
deviceId: number(),
|
|
25088
25146
|
config: RecordingConfigSchema
|
|
@@ -29501,6 +29559,12 @@ Object.freeze({
|
|
|
29501
29559
|
addonId: null,
|
|
29502
29560
|
access: "view"
|
|
29503
29561
|
},
|
|
29562
|
+
"notificationRules.resolveArtifactUrl": {
|
|
29563
|
+
capName: "notification-rules",
|
|
29564
|
+
capScope: "system",
|
|
29565
|
+
addonId: null,
|
|
29566
|
+
access: "view"
|
|
29567
|
+
},
|
|
29504
29568
|
"notificationRules.setAlarmConfig": {
|
|
29505
29569
|
capName: "notification-rules",
|
|
29506
29570
|
capScope: "system",
|
|
@@ -30905,6 +30969,12 @@ Object.freeze({
|
|
|
30905
30969
|
addonId: null,
|
|
30906
30970
|
access: "view"
|
|
30907
30971
|
},
|
|
30972
|
+
"recording.readWindowBytes": {
|
|
30973
|
+
capName: "recording",
|
|
30974
|
+
capScope: "system",
|
|
30975
|
+
addonId: null,
|
|
30976
|
+
access: "view"
|
|
30977
|
+
},
|
|
30908
30978
|
"recording.refreshStorageLocationsForMigration": {
|
|
30909
30979
|
capName: "recording",
|
|
30910
30980
|
capScope: "system",
|
|
@@ -33735,6 +33805,11 @@ Object.freeze({
|
|
|
33735
33805
|
form: "single",
|
|
33736
33806
|
optional: false
|
|
33737
33807
|
}],
|
|
33808
|
+
"recording.readWindowBytes": [{
|
|
33809
|
+
name: "deviceId",
|
|
33810
|
+
form: "single",
|
|
33811
|
+
optional: false
|
|
33812
|
+
}],
|
|
33738
33813
|
"recording.relocateFootage": [{
|
|
33739
33814
|
name: "deviceId",
|
|
33740
33815
|
form: "single",
|
package/dist/smtp.addon.mjs
CHANGED
|
@@ -15499,7 +15499,23 @@ var NcHistoryEntrySchema = object({
|
|
|
15499
15499
|
updatedAt: number(),
|
|
15500
15500
|
/** Failure detail — present on a `dead` row. */
|
|
15501
15501
|
error: string().optional(),
|
|
15502
|
-
subject: NcHistorySubjectSchema
|
|
15502
|
+
subject: NcHistorySubjectSchema,
|
|
15503
|
+
/**
|
|
15504
|
+
* Ids of the artefacts (still, then gif, then clip) this row's successful
|
|
15505
|
+
* delivery indexed in the artefact library — a REFERENCE, never the bytes
|
|
15506
|
+
* (an artefact is often megabytes; this row is durable JSON rewritten on
|
|
15507
|
+
* every delivery attempt). Absent on a row still pending/dead, a row
|
|
15508
|
+
* delivered before this field shipped, or a wiring with no artefact index.
|
|
15509
|
+
*
|
|
15510
|
+
* Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
|
|
15511
|
+
* outlives any one URL's TTL, so a caller mints a fresh link on demand
|
|
15512
|
+
* rather than trusting one frozen at delivery time. `resolveArtifactUrl`
|
|
15513
|
+
* also answers `null` for an id whose artefact has since expired past the
|
|
15514
|
+
* retained shelf's own age bound — the degrade a caller (the Home
|
|
15515
|
+
* Assistant export) must render as "no image right now", never as a
|
|
15516
|
+
* broken link.
|
|
15517
|
+
*/
|
|
15518
|
+
artifactIds: array(string().min(1)).optional()
|
|
15503
15519
|
});
|
|
15504
15520
|
/**
|
|
15505
15521
|
* Query filter for `getHistory` (spec §4.2). Every field is a narrowing
|
|
@@ -15726,7 +15742,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
15726
15742
|
}), method(object({}), object({
|
|
15727
15743
|
catalog: array(NcConditionDescriptorSchema),
|
|
15728
15744
|
taxonomy: NcTaxonomySchema.optional()
|
|
15729
|
-
})), 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 }), {
|
|
15745
|
+
})), 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 }), {
|
|
15730
15746
|
kind: "mutation",
|
|
15731
15747
|
caller: "required"
|
|
15732
15748
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -25031,6 +25047,39 @@ var ReadGopBytesResultSchema = object({
|
|
|
25031
25047
|
/** Media ms the returned fragment covers. */
|
|
25032
25048
|
gopDurMs: number()
|
|
25033
25049
|
});
|
|
25050
|
+
/**
|
|
25051
|
+
* A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
|
|
25052
|
+
* twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
|
|
25053
|
+
* replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
|
|
25054
|
+
* a replay needs several seconds of native pixels, not one frame.
|
|
25055
|
+
*
|
|
25056
|
+
* `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
|
|
25057
|
+
* is `false` when the returned bytes were cut short by the read's own safety
|
|
25058
|
+
* byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
|
|
25059
|
+
* silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
|
|
25060
|
+
* degradation: a window whose end falls past the covering segment would need
|
|
25061
|
+
* bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
|
|
25062
|
+
* not one standalone-demuxable stream — the caller's answer is to request a
|
|
25063
|
+
* shorter window or one aligned to a single segment, not to receive spliced
|
|
25064
|
+
* bytes nothing has proven decodable.
|
|
25065
|
+
*/
|
|
25066
|
+
var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
|
|
25067
|
+
kind: literal("ok"),
|
|
25068
|
+
data: _instanceof(Uint8Array),
|
|
25069
|
+
/** Absolute epoch ms of the returned bytes' first sample — at or before
|
|
25070
|
+
* the requested `fromMs` (anchored on the nearest keyframe). */
|
|
25071
|
+
gopStartMs: number(),
|
|
25072
|
+
/** Media ms the returned bytes cover, from `gopStartMs`. */
|
|
25073
|
+
gopDurMs: number(),
|
|
25074
|
+
/** `false` ⇒ the safety byte cap cut the read short before it reached
|
|
25075
|
+
* the requested `toMs`; the caller got fewer frames than asked for. */
|
|
25076
|
+
reachesRequestedEnd: boolean()
|
|
25077
|
+
}), object({
|
|
25078
|
+
kind: literal("spans-multiple-segments"),
|
|
25079
|
+
/** Where the covering segment's own footage runs out — informational,
|
|
25080
|
+
* not a retry hint (retrying the same window would refuse again). */
|
|
25081
|
+
segmentEndMs: number()
|
|
25082
|
+
})]);
|
|
25034
25083
|
method(object({
|
|
25035
25084
|
deviceId: number(),
|
|
25036
25085
|
fromMs: number(),
|
|
@@ -25081,6 +25130,15 @@ method(object({
|
|
|
25081
25130
|
}), ReadGopBytesResultSchema, {
|
|
25082
25131
|
kind: "query",
|
|
25083
25132
|
auth: "admin"
|
|
25133
|
+
}), method(object({
|
|
25134
|
+
deviceId: number(),
|
|
25135
|
+
profile: string(),
|
|
25136
|
+
startMs: number(),
|
|
25137
|
+
fromMs: number(),
|
|
25138
|
+
toMs: number()
|
|
25139
|
+
}), ReadWindowBytesResultSchema, {
|
|
25140
|
+
kind: "query",
|
|
25141
|
+
auth: "admin"
|
|
25084
25142
|
}), method(object({
|
|
25085
25143
|
deviceId: number(),
|
|
25086
25144
|
config: RecordingConfigSchema
|
|
@@ -29499,6 +29557,12 @@ Object.freeze({
|
|
|
29499
29557
|
addonId: null,
|
|
29500
29558
|
access: "view"
|
|
29501
29559
|
},
|
|
29560
|
+
"notificationRules.resolveArtifactUrl": {
|
|
29561
|
+
capName: "notification-rules",
|
|
29562
|
+
capScope: "system",
|
|
29563
|
+
addonId: null,
|
|
29564
|
+
access: "view"
|
|
29565
|
+
},
|
|
29502
29566
|
"notificationRules.setAlarmConfig": {
|
|
29503
29567
|
capName: "notification-rules",
|
|
29504
29568
|
capScope: "system",
|
|
@@ -30903,6 +30967,12 @@ Object.freeze({
|
|
|
30903
30967
|
addonId: null,
|
|
30904
30968
|
access: "view"
|
|
30905
30969
|
},
|
|
30970
|
+
"recording.readWindowBytes": {
|
|
30971
|
+
capName: "recording",
|
|
30972
|
+
capScope: "system",
|
|
30973
|
+
addonId: null,
|
|
30974
|
+
access: "view"
|
|
30975
|
+
},
|
|
30906
30976
|
"recording.refreshStorageLocationsForMigration": {
|
|
30907
30977
|
capName: "recording",
|
|
30908
30978
|
capScope: "system",
|
|
@@ -33733,6 +33803,11 @@ Object.freeze({
|
|
|
33733
33803
|
form: "single",
|
|
33734
33804
|
optional: false
|
|
33735
33805
|
}],
|
|
33806
|
+
"recording.readWindowBytes": [{
|
|
33807
|
+
name: "deviceId",
|
|
33808
|
+
form: "single",
|
|
33809
|
+
optional: false
|
|
33810
|
+
}],
|
|
33736
33811
|
"recording.relocateFootage": [{
|
|
33737
33812
|
name: "deviceId",
|
|
33738
33813
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-smtp-nodemailer",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.30",
|
|
4
4
|
"description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|