@camstack/addon-smtp-nodemailer 1.2.100 → 1.2.101
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 +173 -8
- package/dist/smtp.addon.mjs +173 -8
- package/package.json +1 -1
package/dist/smtp.addon.js
CHANGED
|
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
36
36
|
}) : target, mod));
|
|
37
37
|
var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
38
38
|
//#endregion
|
|
39
|
-
//#region ../types/dist/event-category-
|
|
39
|
+
//#region ../types/dist/event-category-BVDXG4tB.mjs
|
|
40
40
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
41
41
|
EventCategory["SystemBoot"] = "system.boot";
|
|
42
42
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -653,6 +653,20 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
653
653
|
* pull-reconcile from the provider's `getStatus` on reconnect. */
|
|
654
654
|
EventCategory["MeshNetworkChanged"] = "network.mesh.changed";
|
|
655
655
|
EventCategory["BackupCompleted"] = "backup.completed";
|
|
656
|
+
/**
|
|
657
|
+
* A whole backup RUN finished — every destination attempted, win or lose.
|
|
658
|
+
*
|
|
659
|
+
* `backup.completed` fires once per DESTINATION, which is the right grain for
|
|
660
|
+
* a progress UI and the wrong one for a notification: an operator with three
|
|
661
|
+
* destinations would be told three times. And a run where two of three
|
|
662
|
+
* destinations succeeded is not a clean success — a single "backup
|
|
663
|
+
* completed" that hid the failed one would be a lie, so the count of each is
|
|
664
|
+
* carried here and the message says both.
|
|
665
|
+
*
|
|
666
|
+
* Emitted by the backup orchestrator only after the destination loop, so a
|
|
667
|
+
* run that dies during the BUILD phase produces no completion at all.
|
|
668
|
+
*/
|
|
669
|
+
EventCategory["BackupRunCompleted"] = "backup.run-completed";
|
|
656
670
|
EventCategory["BackupRestored"] = "backup.restored";
|
|
657
671
|
EventCategory["NotificationDispatched"] = "notification.dispatched";
|
|
658
672
|
EventCategory["NotificationFailed"] = "notification.failed";
|
|
@@ -5383,7 +5397,7 @@ var ZodIssueCode = {
|
|
|
5383
5397
|
var ZodFirstPartyTypeKind;
|
|
5384
5398
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5385
5399
|
//#endregion
|
|
5386
|
-
//#region ../types/dist/sleep-
|
|
5400
|
+
//#region ../types/dist/sleep-DEuj7E3j.mjs
|
|
5387
5401
|
/**
|
|
5388
5402
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5389
5403
|
* window to float samples (D455).
|
|
@@ -11511,6 +11525,58 @@ method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, Broke
|
|
|
11511
11525
|
auth: "admin"
|
|
11512
11526
|
}), method(GetStateInputSchema, unknown().nullable()), method(_void(), RegistryStatusSchema);
|
|
11513
11527
|
DeviceType.Camera;
|
|
11528
|
+
/**
|
|
11529
|
+
* The signals a device can emit to WAKE its own stream.
|
|
11530
|
+
*
|
|
11531
|
+
* A camera whose stream is built on demand sleeps until something asks for it,
|
|
11532
|
+
* and "something" cannot be a consumer that is merely attached — a Frigate-style
|
|
11533
|
+
* puller holds a session open for ever, and treating that as demand would keep
|
|
11534
|
+
* a battery camera awake for ever, which is the whole thing the battery is for
|
|
11535
|
+
* (D173). So the wake has to come from the CAMERA: an event it noticed by
|
|
11536
|
+
* itself, with no stream running.
|
|
11537
|
+
*
|
|
11538
|
+
* ## The vocabulary is the PROVIDER'S, not ours
|
|
11539
|
+
*
|
|
11540
|
+
* Like `consumables`, this cap declares no vocabulary of its own. A provider
|
|
11541
|
+
* names each signal with a `code` it chooses and a `label` an operator reads.
|
|
11542
|
+
* Reolink offers motion and camera-native detection; another provider may offer
|
|
11543
|
+
* a tamper, a doorbell press, a PIR, or something no camera in this fleet has
|
|
11544
|
+
* yet. A fixed enum here would mean every new signal is a framework release.
|
|
11545
|
+
*
|
|
11546
|
+
* It is deliberately NOT derived from the caps a device already binds. Whether
|
|
11547
|
+
* a camera CAN push firmware motion is expressed by `motionSources` containing
|
|
11548
|
+
* `'onboard'`, and whether it does AI on-camera by the `native-object-detection`
|
|
11549
|
+
* binding — but both answer "what drives the detection pipeline", which is a
|
|
11550
|
+
* different question from "what may wake a sleeping stream". A camera can do
|
|
11551
|
+
* the first and not be trusted with the second, and the operator picks per
|
|
11552
|
+
* camera. Two questions, two authorities.
|
|
11553
|
+
*
|
|
11554
|
+
* ## Availability is not permission
|
|
11555
|
+
*
|
|
11556
|
+
* `listSignals` says what the device CAN emit. Whether a given signal actually
|
|
11557
|
+
* wakes the stream is the operator's per-camera choice, held by the broker
|
|
11558
|
+
* alongside the cooldown — see the stream-broker cap's wake settings. A
|
|
11559
|
+
* provider declaring a signal is not a provider enabling it.
|
|
11560
|
+
*/
|
|
11561
|
+
/** One signal a device can emit. */
|
|
11562
|
+
var StreamSignalSchema = object({
|
|
11563
|
+
/** Stable id chosen by the provider, e.g. `'motion'`, `'person'`, `'tamper'`. */
|
|
11564
|
+
code: string().min(1),
|
|
11565
|
+
/** What an operator reads in the picker. The provider's own wording. */
|
|
11566
|
+
label: string().min(1),
|
|
11567
|
+
/**
|
|
11568
|
+
* Whether the provider recommends this signal ON when a camera is first set
|
|
11569
|
+
* up. A provider knows which of its signals are cheap and reliable; an
|
|
11570
|
+
* operator should not have to discover that by trial. Reolink recommends
|
|
11571
|
+
* both of its own.
|
|
11572
|
+
*/
|
|
11573
|
+
recommended: boolean()
|
|
11574
|
+
});
|
|
11575
|
+
object({
|
|
11576
|
+
signals: array(StreamSignalSchema),
|
|
11577
|
+
lastFetchedAt: number()
|
|
11578
|
+
});
|
|
11579
|
+
Object.values(DeviceType), method(_void(), array(StreamSignalSchema).readonly());
|
|
11514
11580
|
/** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
|
|
11515
11581
|
var StreamFormatSchema = _enum([
|
|
11516
11582
|
"webrtc",
|
|
@@ -11907,6 +11973,22 @@ var EgressTranscodeSchema = object({
|
|
|
11907
11973
|
camStreamId: string().nullable()
|
|
11908
11974
|
});
|
|
11909
11975
|
method(object({
|
|
11976
|
+
deviceId: number().int().nonnegative(),
|
|
11977
|
+
/** The provider's signal code. */
|
|
11978
|
+
code: string().min(1),
|
|
11979
|
+
/** Ms epoch. Absent ⇒ now. */
|
|
11980
|
+
at: number().optional()
|
|
11981
|
+
}), object({
|
|
11982
|
+
/** Whether the broker acted on it, and if not, why. */
|
|
11983
|
+
accepted: boolean(),
|
|
11984
|
+
reason: _enum([
|
|
11985
|
+
"woke",
|
|
11986
|
+
"hold-extended",
|
|
11987
|
+
"not-enabled",
|
|
11988
|
+
"no-consumer",
|
|
11989
|
+
"unknown-code"
|
|
11990
|
+
])
|
|
11991
|
+
}), { kind: "mutation" }), method(object({
|
|
11910
11992
|
deviceId: number().int().nonnegative(),
|
|
11911
11993
|
camStreamId: string().min(1),
|
|
11912
11994
|
kind: CamStreamKindSchema,
|
|
@@ -12161,6 +12243,16 @@ var PickStreamRequirementsSchema = object({
|
|
|
12161
12243
|
acceptCodecs: array(StreamCodecSchema).readonly().optional(),
|
|
12162
12244
|
/** Minimum vertical resolution. Streams shorter than this are dropped. */
|
|
12163
12245
|
minHeight: number().int().positive().optional(),
|
|
12246
|
+
/**
|
|
12247
|
+
* Maximum vertical resolution. Streams TALLER than this are dropped.
|
|
12248
|
+
*
|
|
12249
|
+
* A consumer can have a ceiling as real as its floor: Alexa documents
|
|
12250
|
+
* 480p to 1080p, and a 4K stream is as unusable to an Echo as a 360p one.
|
|
12251
|
+
* Without this the ceiling had to be re-implemented by every caller — and
|
|
12252
|
+
* one caller implementing it privately is how a second scoring authority
|
|
12253
|
+
* gets born.
|
|
12254
|
+
*/
|
|
12255
|
+
maxHeight: number().int().positive().optional(),
|
|
12164
12256
|
/** Minimum horizontal resolution. */
|
|
12165
12257
|
minWidth: number().int().positive().optional(),
|
|
12166
12258
|
/**
|
|
@@ -12177,7 +12269,22 @@ var PickStreamRequirementsSchema = object({
|
|
|
12177
12269
|
* transcoded" guard: if the device is already serving the consumer's
|
|
12178
12270
|
* codec end-to-end, there's nothing to optimise.
|
|
12179
12271
|
*/
|
|
12180
|
-
requireSiblingCodec: array(StreamCodecSchema).readonly().optional()
|
|
12272
|
+
requireSiblingCodec: array(StreamCodecSchema).readonly().optional(),
|
|
12273
|
+
/**
|
|
12274
|
+
* Whether a stream the consumer CANNOT decode may still be picked, on the
|
|
12275
|
+
* understanding that it will be transcoded.
|
|
12276
|
+
*
|
|
12277
|
+
* Default `false` — today's behaviour, and the right one for a bypass
|
|
12278
|
+
* question ("is there a stream I can forward untouched?"). Set `true` to
|
|
12279
|
+
* ask the larger question: "what is the best stream for me, transcoding if
|
|
12280
|
+
* I must?" A stream that satisfies `acceptCodecs` always outranks one that
|
|
12281
|
+
* does not, so a passthrough is never lost to a transcode; the answer says
|
|
12282
|
+
* which it is in {@link PickedCamStreamSchema.transcodes}.
|
|
12283
|
+
*
|
|
12284
|
+
* This is what lets one picker serve both the bypass and the full source
|
|
12285
|
+
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
12286
|
+
*/
|
|
12287
|
+
allowTranscode: boolean().optional()
|
|
12181
12288
|
}).readonly();
|
|
12182
12289
|
var PickStreamPreferencesSchema = object({
|
|
12183
12290
|
/**
|
|
@@ -12191,12 +12298,32 @@ var PickStreamPreferencesSchema = object({
|
|
|
12191
12298
|
* picks the tallest stream; `'lowest'` picks the shortest (used by
|
|
12192
12299
|
* memory-constrained consumers / Apple Home guest sessions).
|
|
12193
12300
|
*/
|
|
12194
|
-
resolutionPreference: _enum(["highest", "lowest"]).optional()
|
|
12301
|
+
resolutionPreference: _enum(["highest", "lowest"]).optional(),
|
|
12302
|
+
/**
|
|
12303
|
+
* The height the consumer actually wants to DELIVER.
|
|
12304
|
+
*
|
|
12305
|
+
* Not a constraint — an ordering. With it set, the SMALLEST stream at or
|
|
12306
|
+
* above the target wins, and only if nothing reaches it does the tallest
|
|
12307
|
+
* take over. Pulling 1296 lines to draw 720 on a 1280x800 Echo panel costs
|
|
12308
|
+
* a decode and buys nothing, and `resolutionPreference: 'highest'` cannot
|
|
12309
|
+
* express that: it says "as big as possible", which is a different wish.
|
|
12310
|
+
*
|
|
12311
|
+
* Ignored when absent, so every existing caller keeps its ordering.
|
|
12312
|
+
*/
|
|
12313
|
+
targetHeight: number().int().positive().optional()
|
|
12195
12314
|
}).readonly();
|
|
12196
12315
|
var PickedCamStreamSchema = object({
|
|
12197
12316
|
camStreamId: string(),
|
|
12198
12317
|
codec: string().optional(),
|
|
12199
12318
|
resolution: CamStreamResolutionSchema.optional(),
|
|
12319
|
+
/**
|
|
12320
|
+
* Whether serving this stream requires a decode + re-encode.
|
|
12321
|
+
*
|
|
12322
|
+
* `false` is a stream the consumer can take as it stands. Only ever `true`
|
|
12323
|
+
* when the caller asked for it with `allowTranscode`, so a caller that did
|
|
12324
|
+
* not ask cannot be handed a cost it never agreed to pay.
|
|
12325
|
+
*/
|
|
12326
|
+
transcodes: boolean(),
|
|
12200
12327
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
12201
12328
|
reason: string()
|
|
12202
12329
|
});
|
|
@@ -16385,6 +16512,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16385
16512
|
"device-enabled",
|
|
16386
16513
|
"device-battery-low",
|
|
16387
16514
|
"device-battery-normal",
|
|
16515
|
+
"device-consumable-low",
|
|
16516
|
+
"device-consumable-normal",
|
|
16388
16517
|
"stream-online",
|
|
16389
16518
|
"stream-offline",
|
|
16390
16519
|
"node-online",
|
|
@@ -16403,6 +16532,7 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16403
16532
|
"addon-updated",
|
|
16404
16533
|
"server-updated",
|
|
16405
16534
|
"export-completed",
|
|
16535
|
+
"backup-completed",
|
|
16406
16536
|
"camera-online",
|
|
16407
16537
|
"camera-offline",
|
|
16408
16538
|
"camera-disabled",
|
|
@@ -23657,10 +23787,28 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
23657
23787
|
}), boolean()), method(object({
|
|
23658
23788
|
deviceId: number().int().nonnegative(),
|
|
23659
23789
|
sessionId: string()
|
|
23660
|
-
}), object({
|
|
23661
|
-
|
|
23662
|
-
|
|
23663
|
-
|
|
23790
|
+
}), object({
|
|
23791
|
+
pendingRenegotiation: object({
|
|
23792
|
+
target: WebrtcStreamTargetSchema,
|
|
23793
|
+
epoch: number()
|
|
23794
|
+
}).nullable(),
|
|
23795
|
+
/**
|
|
23796
|
+
* Whether the session still EXISTS.
|
|
23797
|
+
*
|
|
23798
|
+
* A consumer that holds a resource for the life of a session needs to
|
|
23799
|
+
* be able to ask, because a session does not always end the way it
|
|
23800
|
+
* began. Measured on this hub 2026-09-13: an Echo that got stuck never
|
|
23801
|
+
* sent `SessionDisconnected`, so the Alexa exporter's
|
|
23802
|
+
* `releaseEgressTranscode` never ran, and a 2304x1296 HEVC to 720p
|
|
23803
|
+
* H.264 transcode kept running for NOBODY for more than twenty
|
|
23804
|
+
* minutes. The WebRTC session had logged `WebRTC session closed`
|
|
23805
|
+
* minutes earlier — the broker knew; the holder had no way to ask.
|
|
23806
|
+
*
|
|
23807
|
+
* `false` for a session id the provider has never heard of, which is
|
|
23808
|
+
* the same answer as "it ended": either way nothing is holding it up.
|
|
23809
|
+
*/
|
|
23810
|
+
alive: boolean()
|
|
23811
|
+
}));
|
|
23664
23812
|
object({
|
|
23665
23813
|
/** All accessory children of the parent. */
|
|
23666
23814
|
childDeviceIds: array(number()).readonly(),
|
|
@@ -36164,6 +36312,12 @@ Object.freeze({
|
|
|
36164
36312
|
addonId: null,
|
|
36165
36313
|
access: "create"
|
|
36166
36314
|
},
|
|
36315
|
+
"streamBroker.reportStreamSignal": {
|
|
36316
|
+
capName: "stream-broker",
|
|
36317
|
+
capScope: "system",
|
|
36318
|
+
addonId: null,
|
|
36319
|
+
access: "create"
|
|
36320
|
+
},
|
|
36167
36321
|
"streamBroker.restartProfile": {
|
|
36168
36322
|
capName: "stream-broker",
|
|
36169
36323
|
capScope: "system",
|
|
@@ -36248,6 +36402,12 @@ Object.freeze({
|
|
|
36248
36402
|
addonId: null,
|
|
36249
36403
|
access: "create"
|
|
36250
36404
|
},
|
|
36405
|
+
"streamSignals.listSignals": {
|
|
36406
|
+
capName: "stream-signals",
|
|
36407
|
+
capScope: "device",
|
|
36408
|
+
addonId: null,
|
|
36409
|
+
access: "view"
|
|
36410
|
+
},
|
|
36251
36411
|
"switch.setState": {
|
|
36252
36412
|
capName: "switch",
|
|
36253
36413
|
capScope: "device",
|
|
@@ -38620,6 +38780,11 @@ Object.freeze({
|
|
|
38620
38780
|
form: "single",
|
|
38621
38781
|
optional: false
|
|
38622
38782
|
}],
|
|
38783
|
+
"streamBroker.reportStreamSignal": [{
|
|
38784
|
+
name: "deviceId",
|
|
38785
|
+
form: "single",
|
|
38786
|
+
optional: false
|
|
38787
|
+
}],
|
|
38623
38788
|
"streamBroker.restartProfile": [{
|
|
38624
38789
|
name: "deviceId",
|
|
38625
38790
|
form: "single",
|
package/dist/smtp.addon.mjs
CHANGED
|
@@ -34,7 +34,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
34
34
|
var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
35
35
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
36
36
|
//#endregion
|
|
37
|
-
//#region ../types/dist/event-category-
|
|
37
|
+
//#region ../types/dist/event-category-BVDXG4tB.mjs
|
|
38
38
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
39
39
|
EventCategory["SystemBoot"] = "system.boot";
|
|
40
40
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -651,6 +651,20 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
651
651
|
* pull-reconcile from the provider's `getStatus` on reconnect. */
|
|
652
652
|
EventCategory["MeshNetworkChanged"] = "network.mesh.changed";
|
|
653
653
|
EventCategory["BackupCompleted"] = "backup.completed";
|
|
654
|
+
/**
|
|
655
|
+
* A whole backup RUN finished — every destination attempted, win or lose.
|
|
656
|
+
*
|
|
657
|
+
* `backup.completed` fires once per DESTINATION, which is the right grain for
|
|
658
|
+
* a progress UI and the wrong one for a notification: an operator with three
|
|
659
|
+
* destinations would be told three times. And a run where two of three
|
|
660
|
+
* destinations succeeded is not a clean success — a single "backup
|
|
661
|
+
* completed" that hid the failed one would be a lie, so the count of each is
|
|
662
|
+
* carried here and the message says both.
|
|
663
|
+
*
|
|
664
|
+
* Emitted by the backup orchestrator only after the destination loop, so a
|
|
665
|
+
* run that dies during the BUILD phase produces no completion at all.
|
|
666
|
+
*/
|
|
667
|
+
EventCategory["BackupRunCompleted"] = "backup.run-completed";
|
|
654
668
|
EventCategory["BackupRestored"] = "backup.restored";
|
|
655
669
|
EventCategory["NotificationDispatched"] = "notification.dispatched";
|
|
656
670
|
EventCategory["NotificationFailed"] = "notification.failed";
|
|
@@ -5381,7 +5395,7 @@ var ZodIssueCode = {
|
|
|
5381
5395
|
var ZodFirstPartyTypeKind;
|
|
5382
5396
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5383
5397
|
//#endregion
|
|
5384
|
-
//#region ../types/dist/sleep-
|
|
5398
|
+
//#region ../types/dist/sleep-DEuj7E3j.mjs
|
|
5385
5399
|
/**
|
|
5386
5400
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5387
5401
|
* window to float samples (D455).
|
|
@@ -11509,6 +11523,58 @@ method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, Broke
|
|
|
11509
11523
|
auth: "admin"
|
|
11510
11524
|
}), method(GetStateInputSchema, unknown().nullable()), method(_void(), RegistryStatusSchema);
|
|
11511
11525
|
DeviceType.Camera;
|
|
11526
|
+
/**
|
|
11527
|
+
* The signals a device can emit to WAKE its own stream.
|
|
11528
|
+
*
|
|
11529
|
+
* A camera whose stream is built on demand sleeps until something asks for it,
|
|
11530
|
+
* and "something" cannot be a consumer that is merely attached — a Frigate-style
|
|
11531
|
+
* puller holds a session open for ever, and treating that as demand would keep
|
|
11532
|
+
* a battery camera awake for ever, which is the whole thing the battery is for
|
|
11533
|
+
* (D173). So the wake has to come from the CAMERA: an event it noticed by
|
|
11534
|
+
* itself, with no stream running.
|
|
11535
|
+
*
|
|
11536
|
+
* ## The vocabulary is the PROVIDER'S, not ours
|
|
11537
|
+
*
|
|
11538
|
+
* Like `consumables`, this cap declares no vocabulary of its own. A provider
|
|
11539
|
+
* names each signal with a `code` it chooses and a `label` an operator reads.
|
|
11540
|
+
* Reolink offers motion and camera-native detection; another provider may offer
|
|
11541
|
+
* a tamper, a doorbell press, a PIR, or something no camera in this fleet has
|
|
11542
|
+
* yet. A fixed enum here would mean every new signal is a framework release.
|
|
11543
|
+
*
|
|
11544
|
+
* It is deliberately NOT derived from the caps a device already binds. Whether
|
|
11545
|
+
* a camera CAN push firmware motion is expressed by `motionSources` containing
|
|
11546
|
+
* `'onboard'`, and whether it does AI on-camera by the `native-object-detection`
|
|
11547
|
+
* binding — but both answer "what drives the detection pipeline", which is a
|
|
11548
|
+
* different question from "what may wake a sleeping stream". A camera can do
|
|
11549
|
+
* the first and not be trusted with the second, and the operator picks per
|
|
11550
|
+
* camera. Two questions, two authorities.
|
|
11551
|
+
*
|
|
11552
|
+
* ## Availability is not permission
|
|
11553
|
+
*
|
|
11554
|
+
* `listSignals` says what the device CAN emit. Whether a given signal actually
|
|
11555
|
+
* wakes the stream is the operator's per-camera choice, held by the broker
|
|
11556
|
+
* alongside the cooldown — see the stream-broker cap's wake settings. A
|
|
11557
|
+
* provider declaring a signal is not a provider enabling it.
|
|
11558
|
+
*/
|
|
11559
|
+
/** One signal a device can emit. */
|
|
11560
|
+
var StreamSignalSchema = object({
|
|
11561
|
+
/** Stable id chosen by the provider, e.g. `'motion'`, `'person'`, `'tamper'`. */
|
|
11562
|
+
code: string().min(1),
|
|
11563
|
+
/** What an operator reads in the picker. The provider's own wording. */
|
|
11564
|
+
label: string().min(1),
|
|
11565
|
+
/**
|
|
11566
|
+
* Whether the provider recommends this signal ON when a camera is first set
|
|
11567
|
+
* up. A provider knows which of its signals are cheap and reliable; an
|
|
11568
|
+
* operator should not have to discover that by trial. Reolink recommends
|
|
11569
|
+
* both of its own.
|
|
11570
|
+
*/
|
|
11571
|
+
recommended: boolean()
|
|
11572
|
+
});
|
|
11573
|
+
object({
|
|
11574
|
+
signals: array(StreamSignalSchema),
|
|
11575
|
+
lastFetchedAt: number()
|
|
11576
|
+
});
|
|
11577
|
+
Object.values(DeviceType), method(_void(), array(StreamSignalSchema).readonly());
|
|
11512
11578
|
/** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
|
|
11513
11579
|
var StreamFormatSchema = _enum([
|
|
11514
11580
|
"webrtc",
|
|
@@ -11905,6 +11971,22 @@ var EgressTranscodeSchema = object({
|
|
|
11905
11971
|
camStreamId: string().nullable()
|
|
11906
11972
|
});
|
|
11907
11973
|
method(object({
|
|
11974
|
+
deviceId: number().int().nonnegative(),
|
|
11975
|
+
/** The provider's signal code. */
|
|
11976
|
+
code: string().min(1),
|
|
11977
|
+
/** Ms epoch. Absent ⇒ now. */
|
|
11978
|
+
at: number().optional()
|
|
11979
|
+
}), object({
|
|
11980
|
+
/** Whether the broker acted on it, and if not, why. */
|
|
11981
|
+
accepted: boolean(),
|
|
11982
|
+
reason: _enum([
|
|
11983
|
+
"woke",
|
|
11984
|
+
"hold-extended",
|
|
11985
|
+
"not-enabled",
|
|
11986
|
+
"no-consumer",
|
|
11987
|
+
"unknown-code"
|
|
11988
|
+
])
|
|
11989
|
+
}), { kind: "mutation" }), method(object({
|
|
11908
11990
|
deviceId: number().int().nonnegative(),
|
|
11909
11991
|
camStreamId: string().min(1),
|
|
11910
11992
|
kind: CamStreamKindSchema,
|
|
@@ -12159,6 +12241,16 @@ var PickStreamRequirementsSchema = object({
|
|
|
12159
12241
|
acceptCodecs: array(StreamCodecSchema).readonly().optional(),
|
|
12160
12242
|
/** Minimum vertical resolution. Streams shorter than this are dropped. */
|
|
12161
12243
|
minHeight: number().int().positive().optional(),
|
|
12244
|
+
/**
|
|
12245
|
+
* Maximum vertical resolution. Streams TALLER than this are dropped.
|
|
12246
|
+
*
|
|
12247
|
+
* A consumer can have a ceiling as real as its floor: Alexa documents
|
|
12248
|
+
* 480p to 1080p, and a 4K stream is as unusable to an Echo as a 360p one.
|
|
12249
|
+
* Without this the ceiling had to be re-implemented by every caller — and
|
|
12250
|
+
* one caller implementing it privately is how a second scoring authority
|
|
12251
|
+
* gets born.
|
|
12252
|
+
*/
|
|
12253
|
+
maxHeight: number().int().positive().optional(),
|
|
12162
12254
|
/** Minimum horizontal resolution. */
|
|
12163
12255
|
minWidth: number().int().positive().optional(),
|
|
12164
12256
|
/**
|
|
@@ -12175,7 +12267,22 @@ var PickStreamRequirementsSchema = object({
|
|
|
12175
12267
|
* transcoded" guard: if the device is already serving the consumer's
|
|
12176
12268
|
* codec end-to-end, there's nothing to optimise.
|
|
12177
12269
|
*/
|
|
12178
|
-
requireSiblingCodec: array(StreamCodecSchema).readonly().optional()
|
|
12270
|
+
requireSiblingCodec: array(StreamCodecSchema).readonly().optional(),
|
|
12271
|
+
/**
|
|
12272
|
+
* Whether a stream the consumer CANNOT decode may still be picked, on the
|
|
12273
|
+
* understanding that it will be transcoded.
|
|
12274
|
+
*
|
|
12275
|
+
* Default `false` — today's behaviour, and the right one for a bypass
|
|
12276
|
+
* question ("is there a stream I can forward untouched?"). Set `true` to
|
|
12277
|
+
* ask the larger question: "what is the best stream for me, transcoding if
|
|
12278
|
+
* I must?" A stream that satisfies `acceptCodecs` always outranks one that
|
|
12279
|
+
* does not, so a passthrough is never lost to a transcode; the answer says
|
|
12280
|
+
* which it is in {@link PickedCamStreamSchema.transcodes}.
|
|
12281
|
+
*
|
|
12282
|
+
* This is what lets one picker serve both the bypass and the full source
|
|
12283
|
+
* choice, instead of a consumer scoring privately when the bypass misses.
|
|
12284
|
+
*/
|
|
12285
|
+
allowTranscode: boolean().optional()
|
|
12179
12286
|
}).readonly();
|
|
12180
12287
|
var PickStreamPreferencesSchema = object({
|
|
12181
12288
|
/**
|
|
@@ -12189,12 +12296,32 @@ var PickStreamPreferencesSchema = object({
|
|
|
12189
12296
|
* picks the tallest stream; `'lowest'` picks the shortest (used by
|
|
12190
12297
|
* memory-constrained consumers / Apple Home guest sessions).
|
|
12191
12298
|
*/
|
|
12192
|
-
resolutionPreference: _enum(["highest", "lowest"]).optional()
|
|
12299
|
+
resolutionPreference: _enum(["highest", "lowest"]).optional(),
|
|
12300
|
+
/**
|
|
12301
|
+
* The height the consumer actually wants to DELIVER.
|
|
12302
|
+
*
|
|
12303
|
+
* Not a constraint — an ordering. With it set, the SMALLEST stream at or
|
|
12304
|
+
* above the target wins, and only if nothing reaches it does the tallest
|
|
12305
|
+
* take over. Pulling 1296 lines to draw 720 on a 1280x800 Echo panel costs
|
|
12306
|
+
* a decode and buys nothing, and `resolutionPreference: 'highest'` cannot
|
|
12307
|
+
* express that: it says "as big as possible", which is a different wish.
|
|
12308
|
+
*
|
|
12309
|
+
* Ignored when absent, so every existing caller keeps its ordering.
|
|
12310
|
+
*/
|
|
12311
|
+
targetHeight: number().int().positive().optional()
|
|
12193
12312
|
}).readonly();
|
|
12194
12313
|
var PickedCamStreamSchema = object({
|
|
12195
12314
|
camStreamId: string(),
|
|
12196
12315
|
codec: string().optional(),
|
|
12197
12316
|
resolution: CamStreamResolutionSchema.optional(),
|
|
12317
|
+
/**
|
|
12318
|
+
* Whether serving this stream requires a decode + re-encode.
|
|
12319
|
+
*
|
|
12320
|
+
* `false` is a stream the consumer can take as it stands. Only ever `true`
|
|
12321
|
+
* when the caller asked for it with `allowTranscode`, so a caller that did
|
|
12322
|
+
* not ask cannot be handed a cost it never agreed to pay.
|
|
12323
|
+
*/
|
|
12324
|
+
transcodes: boolean(),
|
|
12198
12325
|
/** One-line explanation of why this stream won — for logs / debug UI. */
|
|
12199
12326
|
reason: string()
|
|
12200
12327
|
});
|
|
@@ -16383,6 +16510,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16383
16510
|
"device-enabled",
|
|
16384
16511
|
"device-battery-low",
|
|
16385
16512
|
"device-battery-normal",
|
|
16513
|
+
"device-consumable-low",
|
|
16514
|
+
"device-consumable-normal",
|
|
16386
16515
|
"stream-online",
|
|
16387
16516
|
"stream-offline",
|
|
16388
16517
|
"node-online",
|
|
@@ -16401,6 +16530,7 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16401
16530
|
"addon-updated",
|
|
16402
16531
|
"server-updated",
|
|
16403
16532
|
"export-completed",
|
|
16533
|
+
"backup-completed",
|
|
16404
16534
|
"camera-online",
|
|
16405
16535
|
"camera-offline",
|
|
16406
16536
|
"camera-disabled",
|
|
@@ -23655,10 +23785,28 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
23655
23785
|
}), boolean()), method(object({
|
|
23656
23786
|
deviceId: number().int().nonnegative(),
|
|
23657
23787
|
sessionId: string()
|
|
23658
|
-
}), object({
|
|
23659
|
-
|
|
23660
|
-
|
|
23661
|
-
|
|
23788
|
+
}), object({
|
|
23789
|
+
pendingRenegotiation: object({
|
|
23790
|
+
target: WebrtcStreamTargetSchema,
|
|
23791
|
+
epoch: number()
|
|
23792
|
+
}).nullable(),
|
|
23793
|
+
/**
|
|
23794
|
+
* Whether the session still EXISTS.
|
|
23795
|
+
*
|
|
23796
|
+
* A consumer that holds a resource for the life of a session needs to
|
|
23797
|
+
* be able to ask, because a session does not always end the way it
|
|
23798
|
+
* began. Measured on this hub 2026-09-13: an Echo that got stuck never
|
|
23799
|
+
* sent `SessionDisconnected`, so the Alexa exporter's
|
|
23800
|
+
* `releaseEgressTranscode` never ran, and a 2304x1296 HEVC to 720p
|
|
23801
|
+
* H.264 transcode kept running for NOBODY for more than twenty
|
|
23802
|
+
* minutes. The WebRTC session had logged `WebRTC session closed`
|
|
23803
|
+
* minutes earlier — the broker knew; the holder had no way to ask.
|
|
23804
|
+
*
|
|
23805
|
+
* `false` for a session id the provider has never heard of, which is
|
|
23806
|
+
* the same answer as "it ended": either way nothing is holding it up.
|
|
23807
|
+
*/
|
|
23808
|
+
alive: boolean()
|
|
23809
|
+
}));
|
|
23662
23810
|
object({
|
|
23663
23811
|
/** All accessory children of the parent. */
|
|
23664
23812
|
childDeviceIds: array(number()).readonly(),
|
|
@@ -36162,6 +36310,12 @@ Object.freeze({
|
|
|
36162
36310
|
addonId: null,
|
|
36163
36311
|
access: "create"
|
|
36164
36312
|
},
|
|
36313
|
+
"streamBroker.reportStreamSignal": {
|
|
36314
|
+
capName: "stream-broker",
|
|
36315
|
+
capScope: "system",
|
|
36316
|
+
addonId: null,
|
|
36317
|
+
access: "create"
|
|
36318
|
+
},
|
|
36165
36319
|
"streamBroker.restartProfile": {
|
|
36166
36320
|
capName: "stream-broker",
|
|
36167
36321
|
capScope: "system",
|
|
@@ -36246,6 +36400,12 @@ Object.freeze({
|
|
|
36246
36400
|
addonId: null,
|
|
36247
36401
|
access: "create"
|
|
36248
36402
|
},
|
|
36403
|
+
"streamSignals.listSignals": {
|
|
36404
|
+
capName: "stream-signals",
|
|
36405
|
+
capScope: "device",
|
|
36406
|
+
addonId: null,
|
|
36407
|
+
access: "view"
|
|
36408
|
+
},
|
|
36249
36409
|
"switch.setState": {
|
|
36250
36410
|
capName: "switch",
|
|
36251
36411
|
capScope: "device",
|
|
@@ -38618,6 +38778,11 @@ Object.freeze({
|
|
|
38618
38778
|
form: "single",
|
|
38619
38779
|
optional: false
|
|
38620
38780
|
}],
|
|
38781
|
+
"streamBroker.reportStreamSignal": [{
|
|
38782
|
+
name: "deviceId",
|
|
38783
|
+
form: "single",
|
|
38784
|
+
optional: false
|
|
38785
|
+
}],
|
|
38621
38786
|
"streamBroker.restartProfile": [{
|
|
38622
38787
|
name: "deviceId",
|
|
38623
38788
|
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.101",
|
|
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",
|